Quickstart
Install the harness, register a project, and run one feature through the SDLC pipeline. For operators setting up ai-conductor for the first time.
Prerequisites
bin/install checks none of these before it starts. It fails late, partially, or silently if one is missing, so install them first.
| Requirement | Needed for | Verify |
|---|---|---|
curl — or use the manual clone path below | downloading the one-line installer | curl --version |
git | cloning the harness; every worktree operation | git --version |
gh, authenticated | opening spec and implementation PRs | gh auth status |
tmux | ai-conductor daemon start/stop/restart/connect/debug | tmux -V |
python3 | writing permissions and hooks into ~/.claude/settings.json | python3 --version |
| Node >= 26.0.0 (repo pins 26.7.0) | building and running the engine, and reading/writing the markdown-viewer and mermaid-renderer config | node --version |
npm | npm ci + npm run build for the engine | npm --version |
claude, codex, and/or pi | executing steps — at least one is required | claude --version / codex --version / pi --version |
rg (ripgrep) — optional | full shell test coverage; several tests skip themselves without it. bin/install --check warns, never fails | rg --version |
Node is pinned to 26.7.0 in .tool-versions and src/conductor/.tool-versions. Install it with asdf install nodejs 26.7.0 or any equivalent version manager. bin/ai-conductor exports ASDF_NODEJS_VERSION from that pin only when asdf is on PATH — without asdf, whatever node resolves first runs the engine.
Pick your provider now: claude, codex, pi, or a fallback ladder. See multiprovider for what each one changes.
One-line install
curl -fsSL https://jstoup111.github.io/ai-conductor/install.sh | sh
This clones the stable channel into ~/.ai-conductor/harness and runs ./bin/install there, so you can skip the next two sections. Choose a channel or providers with ... | sh -s -- --channel tagged --providers claude. Running it again updates the existing install.
Clone the harness
To install from a manual clone instead:
git clone --branch stable --single-branch https://github.com/jstoup111/ai-conductor.git
cd ai-conductor
Clone to a normal directory. A checkout whose physical path contains /.worktrees/ is refused by the installer — see Refusing to install from a build worktree. The stable branch advances only after release CI has published its matching tag and GitHub Release; it therefore excludes work still in flight on main.
Install
./bin/install
On a TTY with no --providers flag, the installer prompts for four things: the built-in host (Claude, Codex, Pi, or a comma-separated combination), the update channel, a markdown viewer, and a mermaid renderer. Pass the selection up front to skip the first prompt:
./bin/install --providers=claude,codex
--providers gates only the install-time readiness report. Both skill catalogs (~/.claude/skills and ~/.agents/skills) are written regardless of the value, and the flag never writes a host into any config.
You should see Installation complete. followed by a quick-start banner.
Put ~/.local/bin on PATH
The installer symlinks ai-conductor into ~/.local/bin but never edits your shell profile. If that directory is not already on PATH it prints:
⚠ ~/.local/bin is NOT on PATH
→ Add to your shell profile: export PATH="$HOME/.local/bin:$PATH"
Add it yourself, then reload your shell:
export PATH="$HOME/.local/bin:$PATH"
Verify the install
./bin/install --check
ai-conductor --help
--check mutates nothing. Its exit code is the signal:
| Exit code | Meaning |
|---|---|
0 | All checks passed. Prints All checks passed. |
1 | Drift: missing, stale, or duplicated skill links, or a failed host-CLI or bin-symlink check. Prints a per-category count and Run ./bin/install to fix. |
2 | Everything else is clean but ai-conductor build-auth-status failed |
Exit 2 prints Build authentication check failed. instead of the All checks passed. summary — read the build-auth-status: line in the body for the underlying reason. The engine treats both 0 and 2 as passing; any other code blocks ai-conductor daemon start on a stale install.
Register a project
The target must already be a git repository.
cd /path/to/your-project
ai-conductor register
You should see Registered <name> (<absolute-path>). The record lands in ~/.ai-conductor/registry.json with status: registered; nothing is written into the project.
To scaffold a new repository instead, ai-conductor create <name> runs git init and writes a skeleton CLAUDE.md, a .gitignore, and a project-safe .ai-conductor/config.yml before registering it. Both commands are detailed in reference/cli.md.
Bootstrap the project
register writes no project artifacts. create writes the minimal scaffold described above. bootstrap detects the stack and generates the remaining project instruction files, .docs/ tree, and memory store. It is a skill, not a CLI command, so run it inside a host session:
claude
Then, in-session:
/bootstrap
Under Codex the same skill is invoked as $bootstrap. You should end with CLAUDE.md (and/or AGENTS.md) referencing the harness, plus a populated .docs/ directory.
For an existing Git repository, bootstrap runs the idempotent ai-conductor config init primitive. You can also run that command directly before bootstrap. It creates .ai-conductor/config.yml from the project-safe template and preserves an existing file byte-for-byte. See reference/configuration.md.
Run your first feature with the daemon
ai-conductor compose --idea "add a CSV export to the reporting page"
The composer authors the DECIDE artifacts in an isolated worktree and opens a spec PR. Review and merge that PR, then start the daemon:
ai-conductor daemon start
The daemon drains merged specs, builds each feature in an isolated worktree, retains its logs, and opens an implementation PR. Watch it with ai-conductor daemon logs --follow or check it with ai-conductor daemon status.
Continue with first feature for the complete idea → spec PR → daemon build → implementation PR walkthrough.
For a supervised foreground run, use ai-conductor inline --interactive "add a CSV export to the reporting page". The foreground --auto mode is deprecated; use the daemon for unattended work. Inline flags are enumerated in reference/cli.md.
First-run blockers
Each of these is a real guard in the code, with the text it emits.
Missing engine bundle
The engine is gitignored, so a fresh clone has no dist until bin/install (or npm run build) runs.
ai-conductor: missing <harness>/src/conductor/dist/index.js
ai-conductor: run 'npm run build' in src/conductor/
A half-finished publish leaves a dangling symlink instead:
ai-conductor: dist symlink is broken (<harness>/src/conductor/dist)
ai-conductor: run 'npm run build' to rebuild, or republish the engine, to fix it
Both exit 1. Fix by re-running ./bin/install, or npm run build inside src/conductor/. Never run tsup directly — the publish guard refuses it.
Wrong Node version
The installer still links the skills, permissions and hooks — those work on any Node — but it cannot build the engine, so the run fails:
✗ ai-conductor requires Node >=26 — found v20.11.0
→ This repo pins nodejs 26.7.0 via .tool-versions; install it (e.g. 'asdf install nodejs
26.7.0'), then re-run bin/install
and the run ends with the reason restated:
Installation incomplete — ai-conductor was not installed.
✗ ai-conductor requires Node >=26 but found v20.11.0. Install the pinned nodejs 26.7.0
(.tool-versions), then re-run ./bin/install.
./bin/install exits 1, and so does ./bin/install --check while the bundle is missing or ai-conductor is off PATH. A missing npm, or a failing npm ci/npm run build, fails the same way. Install Node 26.7.0 and re-run ./bin/install.
Missing gh authentication
Nothing checks gh at install time. It surfaces when a spec is landed:
Cannot land spec: identity unresolved. Resolve one of:
1. Set spec_owner in ~/.ai-conductor/config.yml
2. Authenticate via: gh auth login
Exit 1. Run gh auth login, or set spec_owner in the user config. The daemon’s backlog scan fails closed on the same identity — an unidentified daemon builds nothing and logs daemon identity unresolved: … building NOTHING (fail-closed). See running the daemon.
Refusing to install from a build worktree
bin/install matches its own resolved physical path against */.worktrees/*:
✗ Refusing to install from a build worktree.
Resolved harness root: <physical_root>
Installing from a worktree would repoint your global bins, skills, and
settings.json hooks at a directory that is deleted when the build ships.
Fix: run bin/install from the main checkout, or pass --allow-worktree-root
if you really mean to install from this worktree.
Exit 1. The guard applies to the default and --update modes only; --check, --uninstall, and --help are unaffected. Install from the main checkout.
Missing or broken ai-conductor at viewer/renderer configuration time
The markdown-viewer and mermaid-renderer prompts write their selection through ai-conductor config write, not Python/YAML. If ai-conductor is not yet on PATH (for example the engine build failed — see Missing engine bundle above), the prompts are skipped:
⚠ ai-conductor is required to save the markdown viewer; install or restore it, then re-run bin/install
and if the write itself fails (e.g. the target directory is unwritable), the installer warns and the step fails rather than silently reporting success:
⚠ Could not save markdown viewer configuration
Either way, ~/.ai-conductor/config.yml gets no viewer or renderer block, and install continues with a warning rather than aborting. Fix the underlying ai-conductor problem and re-run ./bin/install. ./bin/install --check reports the configured viewer and renderer, or ai-conductor not on PATH / configuration unreadable when it cannot read them back.
Missing tmux
The daemon builds without tmux but cannot be hosted by it:
tmux is not installed or not found on PATH. Please install tmux to use daemon hosting.
Install tmux before ai-conductor daemon start. Recovery for a daemon that started and then broke is in runbooks/daemon-recovery.md.
Updates
The installer writes conductor.update_channel — stable (default), tagged, or main — to ~/.ai-conductor/config.yml; it does not create the legacy JSON configuration file. stable fast-forwards a branch only to fully published releases, tagged uses semver tag checkouts, and main follows every merge. Existing tag-pinned installations are not switched automatically.
ai-conductor spawns bin/update --auto on startup and swallows every failure. Force an attended check, or update a stable checkout manually:
cd /path/to/ai-conductor
bin/update
# or:
git pull --ff-only origin stable && bin/migrate
A major version crossing — v0.104.0 → v1.0.0, or any change to the leading semver component — is held to a stricter approval than an ordinary update, because a major is by definition a breaking change to skill contracts, the CLI, or the settings.json schema:
- The startup
--autocheck reports that one is available and stops there. It never applies a major update, so a breaking upgrade cannot be accepted by reflex at the start of a session. - An attended
bin/updaterequires typing the target version (v1.0.0) to confirm. A bareydoes not apply it. - With no TTY, the command to run is printed and nothing is applied, as with any other update.
Ordinary patch and minor updates keep the single [y/n] prompt. The main channel has no semver identity to compare, so it is unaffected.
If a stable checkout ends up in detached HEAD — a pre-v1 updater moved stable installs with git checkout vX.Y.Z — bin/update offers to re-attach the stable branch instead of stopping. Answer the prompt, or run the git checkout -B stable <sha> && bin/migrate command it prints when there is no TTY. A detached checkout you made yourself, off the stable lineage, is left alone.
Choose the first-run channel during installation with bin/install --channel tagged (or main or stable), or set AI_CONDUCTOR_CHANNEL when passing a flag is inconvenient. The flag takes precedence over the environment variable; an unattended install with neither uses stable.
Choose a different channel explicitly with bin/update --set-channel tagged or bin/update --set-channel main. Changing the configured channel does not move the current checkout. To move an existing branch-based installation to stable deliberately:
git fetch origin stable:refs/remotes/origin/stable
git switch --track origin/stable
bin/update --set-channel stable
bin/migrate
Removing the harness
./bin/install --uninstall
--uninstall removes harness-owned skill and reference links, the conduct, conduct-ts, and ai-conductor launchers, the harness’s entries in ~/.claude/settings.json, and the global rate-card link when it points at this checkout. It preserves operator-authored settings, links, and rate cards.
The command keeps ~/.ai-conductor/, including operator configuration and runtime data such as the project registry and memory. Remove that state only when you want a clean slate:
./bin/install --uninstall --purge
--purge is valid only with --uninstall. It removes ~/.ai-conductor/; if that path is a symlink, it removes only the symlink. Legacy ~/.claude/ai-conductor.config.json and ~/.claude/ai-conductor.config.json.migrated files are not installer-owned and remain unchanged. See settings and hooks for the global settings surface.