Skip to content

feat(cli): complete the command surface — shell, workspace list, up flags, tunnel up/down (spec 26) - #85

Merged
gustavobertoi merged 1 commit into
mainfrom
feat/spec26-cli-completeness
Jul 1, 2026
Merged

feat(cli): complete the command surface — shell, workspace list, up flags, tunnel up/down (spec 26)#85
gustavobertoi merged 1 commit into
mainfrom
feat/spec26-cli-completeness

Conversation

@gustavobertoi

Copy link
Copy Markdown
Contributor

Spec 26 (code) — finishes the CLI surface. Built in a worktree, verified locally (make ci + determinism green, smoke-tested).

  • shell <service> — real interactive exec via a new docker.InteractiveRunner (wires os.Stdin + a real -it TTY, no stderr capture, propagates the child exit code verbatim); service resolution + completion; errors on non-TTY instead of hanging. Graduated out of stubs.go.
  • workspace list + a machine-wide registry: additive schemaV3 workspace pointer table (PK includes Docker context), CRUD under the flock, upserted on up; list re-derives from each root's workspace.yaml (flags stale/unparseable roots), --prune-only removal, --json.
  • up --rebuild (build --no-cache), --skip-clone, and the exposed --health-timeout.
  • self update --force (re-installs when up-to-date; keeps the package-manager refusal).
  • tunnel up/down (default down; refuses non-local secret://-bearing services, --allow-secrets override).
  • Reserved post-1.0 stubs (db/dashboard/ide/telemetry/template push); logs re-tagged v2 (spec 16).

make ci + determinism green; CGO-free; no new deps. Note: --skip-clone is wired ahead of the (deliberately deferred) saga clone phase; tunnel up's cloudflared credential-UUID/caddy-upstream are spec-05 placeholders (the secret-guard + lifecycle + JSON contract are complete + tested).

🤖 Generated with Claude Code

…lags, tunnel up/down (spec 26)

Land the spec-26 code deliverables (README already reconciled):

- shell <service>: real interactive exec via a NEW docker seam
  (docker.InteractiveRunner + Compose.Exec) that wires Stdin + a -it TTY,
  captures no stderr, and propagates the child exit code. Resolves
  project/service (single-default, else required), ValidArgsFunction
  completion, bash→sh default, clear non-TTY error.
- workspace list + registry: additive schemaV3 `workspace` pointer table
  (keyed by ctx, CASCADE on docker_context) + RecordWorkspace/ListWorkspaces/
  RemoveWorkspace CRUD; `up` upserts the row under the flock. `list`
  re-derives projects/shared refs from each workspace.yaml at list time,
  flags stale/unparseable roots, --prune drops vanished roots, --json.
- up flags: --rebuild (new UpDeps.Rebuild → build --no-cache), --skip-clone
  (new UpDeps.SkipClone), --health-timeout (exposes existing HealthTimeout).
- self update --force: new selfupdate.Options.Force re-installs over an
  up-to-date binary; the package-manager CanSelfReplace refusal still holds.
- tunnel up/down: standalone commands managing the cloudflared container;
  default-DOWN; refuses services carrying non-local secret:// values
  (--allow-secrets override); {tunnel,state} JSON.
- reserved post-1.0 stubs (dashboard/ide/telemetry, db + template v2
  children); shell graduated out of stubs.go; logs re-tagged v2 (spec 16).

Tests: registry CRUD + context isolation + CASCADE, interactive Exec arg
construction, up rebuild threading, self --force semantics, tunnel secret
refusal + container up/down, workspace list projection/prune/degrade.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@gustavobertoi
gustavobertoi merged commit f0bb3e2 into main Jul 1, 2026
4 checks passed
@gustavobertoi
gustavobertoi deleted the feat/spec26-cli-completeness branch July 1, 2026 00:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant