refactor(ods): unify launchers and protect shared infrastructure
Merged
RO
3d ago+6152+6152+0123456789012345678901234567890123456789-999-999-012345678901234567890123456789
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, andbackendcommands. Remove the duplicatestack --frontend-onlyoption. - 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
TestDevcontainerCommandsandTestRunDevRebuild.
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
backendandweb devwork 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
--isolatedoption for separate development stacks; shared infrastructure is the default, with clearer project ownership and status information. - Added
ods web devpreviews 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.
- Added the global
- 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.