refactor(ods): unify launchers and protect shared infrastructure

Merged
RO
3d ago
+6152-999

Description

Make ODS reuse shared development infrastructure by default, with --isolated for separate datasets.

  • Use the same service specifications and launchers for stack, web dev, and backend commands. Remove the duplicate stack --frontend-only option.
  • Enforce project ownership across checkouts and resolve database commands to the actual managed database.
  • Stop services before pending migrations, preserve them when already at head, and reject manual migrations beneath managed services.
  • Harden startup cancellation, shutdown grace, descendant cleanup, terminal input, and frontend API validation. Preserve Windows foreground commands.
  • Consolidate environment helpers, protect symlinked environment files, propagate restore errors, and update help and documentation.

This PR contains only ODS and its development-stack skill. It does not include the plugins implementation.

How Has This Been Tested?

  • Targeted command and regression tests using fake tools and disposable Git repositories.
  • Race tests for runtime targeting, ownership, migration ordering, process cleanup, and terminal input.
  • go vet ./..., pre-commit checks, native builds, and Windows cross-builds.
  • The full Go suite was run. Its remaining failures are the existing macOS devcontainer SSH-mount fixture expectations in TestDevcontainerCommands and TestRunDevRebuild.

No real database migrations, restores, or development-stack restarts ran. Native Windows execution remains untested.

Additional Options

  • [Optional] Please cherry-pick this PR to the latest release version.
  • [Optional] Override Linear Check

Summary by cubic

ODS now shares development infrastructure across worktrees by default, with --isolated for separate datasets. stack, web dev, and backend use the same service specs and launchers, and the duplicate stack --frontend-only option is removed.

  • Direct launches run the same dependency-prepare step as stack startup, so backend and web dev work with fresh or stale Python environments.
  • A stopped preview discards its former project state before retargeting to another API owner.
  • Enforces project ownership across checkouts and resolves database commands to the managed database. New tests reject conflicting targets before any mutation.
  • Stops services before pending migrations, preserves them when already at head, and rejects manual migrations beneath managed services. Migration probe failures fail closed.
  • Hardens startup cancellation, shutdown grace, and descendant cleanup; ODS keeps the terminal foreground group so Ctrl-C still honors shutdown timeouts, and tmux pane identifiers no longer change service identity.
  • Database passwords reach tools through the child environment only, never in process arguments; Windows foreground commands are preserved.
  • Consolidates environment helpers, protects symlinked env files, propagates restore errors, and refreshes help and documentation. Test commits exercise the new migration-target and preview-launch paths.

Summary by CodeRabbit

  • New Features
    • Added the global --isolated option for separate development stacks; shared infrastructure is the default, with clearer project ownership and status information.
    • Added ods web dev previews that can use a healthy managed API on macOS and Linux, plus foreground startup on Windows.
    • Expanded command guidance for development workflows, database targeting, and dump formats.
  • Bug Fixes
    • Pending migrations now stop managed application services first; healthy services remain running when no migrations are needed.
    • Database operations verify project ownership and target selection before making changes. Restore errors now fail the command, SQL restores stop on errors, and temporary files are cleaned up after failures.