diff --git a/docs/design-npm-global-install-fixes.html b/docs/design-npm-global-install-fixes.html index 29f3b0b4c..cfb8b9680 100644 --- a/docs/design-npm-global-install-fixes.html +++ b/docs/design-npm-global-install-fixes.html @@ -717,27 +717,106 @@ async function ensureTmux(): Promise<void> {
- For human/TTY runs, ao start asks before attempting installs via askYesNo().
- Non-interactive callers keep deterministic behavior (no prompts, defaults apply).
- All install helpers follow the same pattern: tryInstallWithAttempts() logs each
- command before running it, so the user knows exactly what's happening.
+ When ao start detects a missing prerequisite on a fresh machine, it prompts
+ the user before attempting any install. This ensures no surprises — no silent
+ sudo, no unexpected package manager invocations.
| Prerequisite | +Required? | +Prompt | +Install methods (by platform) | +On failure | +
|---|---|---|---|---|
| tmux | +Yes (for runtime: "tmux") |
+ Install tmux now? [Y/n] |
+
+ macOS: brew install tmux+ Linux: apt-get → dnf
+ |
+ blocks — prints platform hints + exit 1 | +
| git | +Yes (for URL clone & add-project) | +Install Git now? [Y/n] |
+
+ macOS: brew install git+ Linux: apt-get → dnf+ Windows: winget install Git.Git
+ |
+ blocks — prints platform hints + exit 1 | +
| Agent runtime (Claude Code, Codex, Aider, OpenCode) |
+ Yes (at least one) | +Numbered menu:Choose runtime to install [1-5] |
+
+ 1. Claude Code (npm i -g @anthropic-ai/claude-code)+ 2. Codex ( npm i -g @openai/codex)+ 3. Aider ( pipx install aider-chat)+ 4. OpenCode ( go install ...)+ 5. Skip + |
+ Config generation continues — user can install later | +
| GitHub CLI (gh) | +No (optional) | +Install GitHub CLI now? [y/N](defaults to no) |
+
+ macOS: brew install gh+ Linux: apt-get → dnf+ Windows: winget install GitHub.cli
+ |
+ Skipped silently — optional dependency | +
| Docker | +No | +Not prompted | +— | +— (no runtime-docker plugin registered) |
+
runtime-docker plugin currently registered)askYesNo() before running any install command. No silent sudo or background package manager invocations."Running: brew install tmux" (via tryInstallWithAttempts()) so the user knows exactly what's executing.canPromptForInstall() returns false and askYesNo() returns its default without prompting. Required tools default to true (attempt install), optional tools default to false (skip).ensureTmux(), ensureGit(), promptInstallAgentRuntime()) follow the same structure: detect → prompt → install → verify → block or skip.
- If install is declined or fails, ao start exits with a clear, actionable message
- instead of silently degrading to a limited runtime:
-
$ ao start
+ Detecting environment...
+ ✓ Agent runtime: claude-code
+ ✓ Config created: agent-orchestrator.yaml
+ ⚠ tmux not found — will prompt to install at startup
- ✗ tmux is required but is not installed.
+ ⚠ tmux is required for runtime "tmux".
+ Install tmux now? [Y/n]: y
+ Running: brew install tmux
+ ✓ tmux installed successfully
+
+ Starting dashboard on port 3000...
+ ✓ Dashboard: http://localhost:3000
+
+ If the user declines or install fails:
+ Install tmux now? [Y/n]: n
+
+ ✗ tmux is required but is not installed.
Install tmux manually, then re-run ao start: