Skip to content

Releases: noahhyden/ataegina-cli

v0.7.0

Choose a tag to compare

@github-actions github-actions released this 19 Jul 12:59

Added

  • Foreign port-holder awareness in up and down. A new ownership check
    maps a slot's port to its holding pid(s) and classifies them against ataegina's
    own start-time-verified launch record (ours / foreign / unknown). up no
    longer claims a slot it never launched is "already up"/"ready" — it names the
    foreign holder and declines to launch on top of it. down leaves a
    positively-foreign holder alone (previously it killed whatever held the port);
    down --force (or ATE_DOWN_FORCE=1) still clears the slot on demand.
    Ambiguous holders — unmappable pids, or a daemonize-style server of ours that
    reparented to init — stay unknown and behave exactly as before, so nothing we
    own is spared teardown or falsely accused.
  • More stacks detected by init. Backends: Go now emits a runnable
    go run . default (with a PORT env) instead of a bare TODO; Rust
    (Cargo.tomlcargo run) and PHP/Laravel (artisanartisan serve)
    added. Frontends: Nuxt, Astro, and SvelteKit added (matched before the
    bare-vite fallback they build on).
  • Man page. Ship ataegina.1 (man ataegina); install.sh installs it
    best-effort alongside the script.
  • Automated release + Git Bash CI. A release.yml workflow publishes the
    GitHub Release (and optionally bumps the Homebrew tap) on a version tag, and a
    Windows runner now exercises the Git Bash support the README claims.

v0.6.0

Choose a tag to compare

@noahhyden noahhyden released this 18 Jul 16:51

Runtime isolation for git worktrees — collision-free ports, processes, and databases for every worktree, from one zero-dependency bash file.

This release is the "dogfooding hardening" cut: a batch of correctness fixes found by running ataegina against real repos, a new move command, and a much larger test suite that now starts real processes and real databases.

Added

  • ataegina move N — relocate the current worktree to index N (and its derived port pair), rewriting the per-repo registry. Refuses an index another live worktree holds, rejects index 0 (reserved for the primary), frees the old slot for reuse, and warns if either new port is already in use. Motivated by dogfooding: when an auto-assigned slot's derived port is permanently held by a process ataegina doesn't manage, the only previous fix was to hand-edit the registry.

Fixed

  • down no longer leaks worker/child processes. Teardown now enumerates the full process tree under each launched root from a single portable ps snapshot, SIGTERMs it, then SIGKILLs survivors — independent of any port tool. Previously a dev server's workers (uvicorn --reload, vite/esbuild, webpack/turbopack) were orphaned each up/down cycle, and on hosts without lsof/ss/fuser nothing but the wrapper was killed.
  • Concurrent first-up no longer races two worktrees onto the same index (which meant identical ports and the same per-worktree database). Index assignment is now serialized with an atomic mkdir lock plus a double-checked re-read.
  • A repo path containing a space no longer costs the primary its index 0 (and, with a DB configured, a suffixed DB instead of the shared one).
  • Linked worktrees inherit the primary checkout's config, so a fresh git worktree add tree no longer fails up/db with "no backend/database configured".
  • up exits 0 on a successful start with no frontend (scope backend/none) instead of returning 1 under set -e.
  • up distinguishes a dead server from a slow one, reporting "FAILED to start — see " for a pid that already died instead of "still starting".
  • move/up refuse an index whose derived port exceeds 65535.
  • down won't kill a recycled pid (start-time guard on the recorded pid).
  • move frees the old slot's servers itself instead of orphaning them on the old ports.
  • down now reports <label>: stopped on :<port> when it actually stops something, instead of being silent on success.

Testing

  • The suite grew from 44 to 99 tests, adding the first coverage that starts real processes and runs concurrently: real up/down lifecycle across python, node, Go, and Ruby backends, a full two-worktree end-to-end (distinct ports + own databases, simultaneously), real frontend-scope borrow of the shared backend, real logs, and docker-gated integration against live postgres, mysql, and mariadb engines (per-worktree create/drop/isolation) that skip cleanly where docker is absent.

Full details in the CHANGELOG.


Install / upgrade: brew upgrade ataegina · ataegina update · or curl -fsSL https://raw.githubusercontent.com/noahhyden/ataegina-cli/main/install.sh | sh

v0.5.0

Choose a tag to compare

@noahhyden noahhyden released this 29 Jun 11:07

Pure worktree-aware dev launcher: collision-free ports, processes, and per-worktree databases.

Removed

  • The agent-fleet dispatcher (ataegina run / ataegina status) and its config keys. ataegina is now solely the worktree dev launcher; orchestration is left to whatever tool you already use.

Fixed

  • ataegina init no longer aborts under set -e during stack detection (two cases: a package.json with no dev script, and emit_config ending on a falsy test). Covered by tests/init.bats.

Changed

  • A bare ataegina now prints usage instead of silently running up.

Added

  • bats-core test suite and GitHub Actions CI (shellcheck + bats on macOS bash 3.2 and Linux + release-verify).
  • Release-hygiene docs: CHANGELOG, SECURITY, CODE_OF_CONDUCT, issue/PR templates.

See CHANGELOG.md for full details.