76f488a5a5
`cli.py start` was interactive-only: TUI selectors (agent / bottle /
name+color) plus a y/N preflight, then a blocking PTY attached to the
controlling terminal. That shape can't be driven by an orchestrator
(Paseo), CI, or webhook dispatch, and made spinning up a known
agent+bottle more friction than necessary.
Add a `--headless` path on `start`:
- agent / bottles / label / color come from flags + manifest defaults;
no TUI selectors, no y/N (auto-confirmed via a new `assume_yes` param
threaded into the shared `_launch_bottle` core).
- `--bottle` (repeatable) defaults to the agent's own `bottle:` when
omitted; `--label` defaults to the agent name and auto-uniquifies on
slug collision (orchestrators fire-and-forget many bottles);
`--color` defaults to none.
- the agent still execs on inherited stdio/PTY, so whatever allocates
the PTY drives the live session — only the launch chrome went
non-interactive.
- `--headless --dry-run` previews the resolved plan without launching.
Prerequisite for orchestrator integration, webhook dispatch, and remote
spin-up. New unit coverage in tests/unit/test_cli_start_headless.py
(11 tests); start/cli/launch sweep green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NkwFXLFff9PYPy4wgVBJp9