Multi-project
Run AO against several repos from one dashboard, with per-project plugins and configs.
One agent-orchestrator.yaml can drive many projects. Each project gets its own repo, tracker, plugin overrides, and — most importantly — its own dashboard lane.
Config shape
runtime: tmux # global default
agent: claude-code
projects:
web:
repo: ComposioHQ/agent-orchestrator
agent: claude-code
api:
repo: myorg/api
agent: codex # per-project override
tracker: linear
trackerConfig:
teamId: TEAM-123
marketing:
repo: myorg/site
agent: cursor
workspace: clone # full clone instead of worktreeProject IDs (web, api, marketing) are what you pass to --project / -p.
Adding a project
Two ways:
- By path:
ao start ~/code/new-repo— AO infers a project ID from the directory name and appends it. - By URL:
ao start https://github.com/owner/repo— AO clones it under~/.agent-orchestrator/and registers it.
Both update agent-orchestrator.yaml in place. Diff it if you're curious.
Spawning in the right project
ao spawn auto-detects the project when you're in a worktree belonging to it. Otherwise name it:
ao spawn 42 -p api
ao batch-spawn 10 11 12 -p webOr pass no project and AO will prompt.
Per-project plugin overrides
Anything defined at the top level is a default. Override per project:
tracker: github # default
notifier:
- type: slack
webhookUrl: ${SLACK_GLOBAL}
projects:
internal:
repo: myorg/internal
tracker: linear
notifier:
- type: discord
webhookUrl: ${DISCORD_INTERNAL}The internal project uses Linear + Discord. Every other project uses GitHub + Slack.
Status across projects
ao status # all projects
ao status -p api # one project
ao status --json | jq # scripted
ao status --watch # live-updating tableThe dashboard shows all projects as swim lanes.
Stopping selectively
ao stop api # stop one project's orchestrator + dashboard
ao stop --all # stop everythingEach project can have a different agent, tracker, notifier, and workspace — that's the whole point of the plugin system. Don't force uniformity; let teams use what fits.