16 KiB
Agent Orchestrator Setup Guide
Comprehensive guide to installing, configuring, and troubleshooting Agent Orchestrator.
Prerequisites
Required
-
Node.js 20+ - Runtime for the orchestrator and CLI
node --version # Should be v20.0.0 or higher -
Git 2.25+ - For repository management and worktrees
git --version -
tmux (for tmux runtime) - Terminal multiplexer for session management
tmux -V # Install on macOS brew install tmux # Install on Ubuntu/Debian sudo apt install tmux # Install on Fedora/RHEL sudo dnf install tmux -
GitHub CLI (for GitHub integration) - Required for PR creation, issue management
gh --version # Install on macOS brew install gh # Install on Linux # See: https://github.com/cli/cli/blob/trunk/docs/install_linux.md
Optional
-
Linear API Key - If using Linear for issue tracking
- Get it from: https://linear.app/settings/api
- Set environment variable:
export LINEAR_API_KEY="lin_api_..."
-
Slack Webhook - If using Slack notifications
- Create incoming webhook: https://api.slack.com/messaging/webhooks
- Set environment variable:
export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/..."
Installation
Build from Source (Current Method)
The package is not yet published to npm. Install by building from source:
# Clone the repository
git clone https://github.com/ComposioHQ/agent-orchestrator
cd agent-orchestrator
# Install dependencies (requires pnpm)
pnpm install
# Build all packages
pnpm build
# Link CLI globally
npm link -g packages/cli
# Verify
ao --version
Coming soon:
npm install -g @composio/ao-clionce published to npm.
If you don't have pnpm:
npm install -g pnpm
First-Time Configuration
Quick Setup with ao init
The easiest way to get started:
cd ~/your-repo
ao init
The wizard will prompt you for:
- Data directory - Where to store session metadata (default:
~/.agent-orchestrator) - Worktree directory - Where to create isolated workspaces (default:
~/.worktrees) - Dashboard port - Web interface port (default:
9847) - Runtime plugin - Session runtime (default:
tmux) - Agent plugin - AI coding assistant (default:
claude-code) - Workspace plugin - Workspace isolation method (default:
worktree) - Notifiers - Notification channels (default:
desktop) - Project ID - Short name for your project
- GitHub repo - Repository in
owner/repoformat - Local path - Path to your repository
- Default branch - Main branch name (usually
mainormaster)
What ao init Detects Automatically
The wizard is smart and tries to help:
- Git repository - Detects if you're in a git repo
- GitHub remote - Parses
owner/repofrom git remote - Current branch - Suggests default branch from git
- API keys - Checks for
LINEAR_API_KEYin environment - GitHub auth - Verifies
ghCLI authentication status - tmux availability - Warns if tmux is not installed
Manual Configuration
If you prefer to write the config manually:
cp agent-orchestrator.yaml.example agent-orchestrator.yaml
nano agent-orchestrator.yaml
Or start from an example:
cp examples/simple-github.yaml agent-orchestrator.yaml
nano agent-orchestrator.yaml
Configuration Reference
Minimal Configuration
The absolute minimum needed:
dataDir: ~/.agent-orchestrator
worktreeDir: ~/.worktrees
port: 9847
projects:
my-app:
repo: owner/my-app
path: ~/my-app
defaultBranch: main
Full Configuration Schema
See agent-orchestrator.yaml.example for a fully commented example with all options.
Plugin Slots
Agent Orchestrator has 8 plugin slots. All are swappable:
| Slot | Purpose | Default | Alternatives |
|---|---|---|---|
| Runtime | How sessions run | tmux |
process, docker, kubernetes, ssh, e2b |
| Agent | AI coding assistant | claude-code |
codex, aider, goose, custom |
| Workspace | Workspace isolation | worktree |
clone, copy |
| Tracker | Issue tracking | github |
linear, jira, custom |
| SCM | Source control | github |
GitLab, Bitbucket (future) |
| Notifier | Notifications | desktop |
slack, discord, webhook, email |
| Terminal | Terminal integration | iterm2 |
web, custom |
| Lifecycle | Session lifecycle | (core) | Non-pluggable |
Reactions
Reactions are auto-responses to events. Configure how the orchestrator handles common scenarios:
CI Failed
reactions:
ci-failed:
auto: true # Enable auto-handling
action: send-to-agent # Send failure logs to agent
retries: 2 # Retry up to 2 times
escalateAfter: 2 # Notify human after 2 failures
Changes Requested (Review Comments)
reactions:
changes-requested:
auto: true
action: send-to-agent
escalateAfter: 30m # Notify human if not resolved in 30 minutes
Approved and Green (Auto-merge)
reactions:
approved-and-green:
auto: true # Enable auto-merge
action: auto-merge # Merge when approved + CI passes
priority: action # Notification priority
Warning: Only enable auto-merge if you trust your CI pipeline and agents!
Agent Stuck
reactions:
agent-stuck:
threshold: 10m # Consider stuck after 10 minutes of inactivity
action: notify
priority: urgent
Notification Routing
Route notifications by priority:
notificationRouting:
urgent: [desktop, slack] # Agent stuck, needs input, errored
action: [desktop, slack] # PR ready to merge
warning: [slack] # Auto-fix failed
info: [slack] # Summary, all done
Agent Rules
Inline rules included in every agent prompt:
projects:
my-app:
agentRules: |
Always run tests before pushing.
Use conventional commits (feat:, fix:, chore:).
Link issue numbers in commit messages.
Or reference an external file:
projects:
my-app:
agentRulesFile: .agent-rules.md
Per-Project Overrides
Override defaults per project:
projects:
frontend:
runtime: tmux
agent: claude-code
workspace: worktree
backend:
runtime: docker # Use Docker for backend
agent: codex # Use Codex instead of Claude
Integration Guides
GitHub Issues
Authentication:
gh auth login
Required scopes:
repo- Full repository accessread:org- Read organization membership (for team mentions)
Verification:
gh auth status
Linear
Setup:
-
Get your API key: https://linear.app/settings/api
-
Add to environment:
echo 'export LINEAR_API_KEY="lin_api_..."' >> ~/.zshrc source ~/.zshrc -
Find your team ID:
- Go to https://linear.app/settings/api
- Click "Create new key" or use existing key
- Team ID is visible in your Linear workspace URL or via API
-
Configure in
agent-orchestrator.yaml:projects: my-app: tracker: plugin: linear teamId: "your-team-id"
Verification:
echo $LINEAR_API_KEY # Should print your key
Slack
Setup:
-
Create incoming webhook: https://api.slack.com/messaging/webhooks
-
Add to environment:
echo 'export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/..."' >> ~/.zshrc source ~/.zshrc -
Configure in
agent-orchestrator.yaml:notifiers: slack: plugin: slack webhook: ${SLACK_WEBHOOK_URL} channel: "#agent-updates"
Verification:
# Send test message
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"Agent Orchestrator test"}' \
$SLACK_WEBHOOK_URL
Custom Trackers
To add a custom tracker (Jira, Asana, etc.), create a plugin:
- See plugin examples in
packages/plugins/tracker-*/ - Implement the
Trackerinterface from@composio/ao-core - Register your plugin in the config
See CLAUDE.md for plugin development guidelines.
Troubleshooting
"No agent-orchestrator.yaml found"
Problem: The orchestrator can't find your config file.
Solution:
# Run init wizard
ao init
# Or copy an example
cp examples/simple-github.yaml agent-orchestrator.yaml
"tmux not found"
Problem: tmux is not installed (required for tmux runtime).
Solution:
# macOS
brew install tmux
# Ubuntu/Debian
sudo apt install tmux
# Fedora/RHEL
sudo dnf install tmux
"gh auth failed"
Problem: GitHub CLI is not authenticated.
Solution:
gh auth login
# Select:
# - GitHub.com (not Enterprise)
# - HTTPS (recommended)
# - Authenticate with browser
# - Include repo scope
Verify:
gh auth status
"LINEAR_API_KEY not found"
Problem: Linear API key is not set in environment.
Solution:
# Get your key from: https://linear.app/settings/api
# Add to shell profile
echo 'export LINEAR_API_KEY="lin_api_..."' >> ~/.zshrc
source ~/.zshrc
# Verify
echo $LINEAR_API_KEY
"Port 3000 already in use"
Problem: Another service is using port 9847.
Solution:
# Change port in agent-orchestrator.yaml
port: 3001
# Or find and kill the process using port 9847
lsof -ti:3000 | xargs kill
"Workspace creation failed"
Problem: Orchestrator can't create worktrees or clones.
Solution:
# Check worktreeDir permissions
ls -la ~/.worktrees
# Create directory if missing
mkdir -p ~/.worktrees
# Check disk space
df -h
"Session not found"
Problem: Session ID doesn't exist or was already destroyed.
Solution:
# List active sessions
ao session ls
# Check status dashboard
ao status
"Agent not responding"
Problem: Agent session is stuck or frozen.
Solution:
# Check session status
ao status
# Attach to session to investigate
ao open <session-name>
# Send message to agent
ao send <session-name> "Please report your current status"
# Kill and respawn if necessary
ao session kill <session-name>
ao spawn <project-id> <issue-id>
"Permission denied" when spawning
Problem: Agent doesn't have permissions for git operations.
Solution:
# Check SSH keys are added
ssh -T git@github.com
# Add SSH key if needed
ssh-add ~/.ssh/id_ed25519
# Or use HTTPS and authenticate gh CLI
gh auth login
"YAML parse error"
Problem: Syntax error in agent-orchestrator.yaml.
Solution:
# Validate YAML syntax online: https://www.yamllint.com/
# Common issues:
# - Incorrect indentation (use 2 spaces, not tabs)
# - Missing quotes around strings with special characters
# - Typo in field names
"Node version too old"
Problem: Node.js version is below 20.
Solution:
# Check version
node --version
# Upgrade with nvm (recommended)
nvm install 20
nvm use 20
nvm alias default 20
# Or download from: https://nodejs.org/
Advanced Configuration
Multi-Project Setup
Manage multiple repositories:
projects:
frontend:
repo: org/frontend
path: ~/frontend
sessionPrefix: fe
backend:
repo: org/backend
path: ~/backend
sessionPrefix: api
mobile:
repo: org/mobile
path: ~/mobile
sessionPrefix: mob
See examples/multi-project.yaml for full example.
Custom Plugin Development
Create custom plugins for:
- Different runtimes (Docker, Kubernetes, SSH, cloud VMs)
- Different agents (custom AI assistants)
- Different trackers (Jira, Asana, custom systems)
- Different notifiers (email, webhooks, custom integrations)
See CLAUDE.md for plugin development guidelines.
Docker Runtime
Run agents in Docker containers:
defaults:
runtime: docker
# Plugin will use official images or build from Dockerfile
Kubernetes Runtime
Run agents in Kubernetes pods:
defaults:
runtime: kubernetes
# Requires kubectl configured with cluster access
Custom Notifiers
Send notifications to custom webhooks:
notifiers:
webhook:
plugin: webhook
url: https://your-service.com/webhook
method: POST
headers:
Authorization: "Bearer ${WEBHOOK_TOKEN}"
FAQ
What's a session?
A session is an isolated workspace where an agent works on a single issue. Each session has:
- Its own git worktree or clone
- Its own tmux session (or Docker container, etc.)
- Its own metadata (branch, PR, status)
- Its own event log
Sessions are ephemeral — they're created for an issue and destroyed when merged.
What's a worktree vs clone?
Worktree (default):
- Shares
.gitdirectory with main repo - Fast to create (no cloning)
- Efficient disk usage
- Best for local development
Clone:
- Full independent repository clone
- Slower to create
- More disk space
- Better for isolation, remote work
How do reactions work?
Reactions are event handlers that run automatically:
- Event occurs (CI fails, review comment added, PR approved)
- Orchestrator checks reaction config
- If
auto: true, performs the action automatically - If escalation threshold reached, notifies human
Actions can be:
send-to-agent- Forward event to agent to handleauto-merge- Merge PR automaticallynotify- Send notification to human
When should I enable auto-merge?
Enable auto-merge if:
- ✅ You have comprehensive CI/CD tests
- ✅ You require code review approval
- ✅ You trust your agents to write correct code
- ✅ You want maximum automation
Don't enable auto-merge if:
- ❌ You have incomplete test coverage
- ❌ You want manual review of every change
- ❌ You're still evaluating agent quality
- ❌ You work on critical systems (finance, healthcare, etc.)
Start with auto: false and enable after building confidence.
How do I add custom agent rules?
Inline:
projects:
my-app:
agentRules: |
Always run tests before pushing.
Use conventional commits.
External file:
projects:
my-app:
agentRulesFile: .agent-rules.md
Rules are included in every agent prompt for that project.
Can I use multiple trackers?
Yes! Different projects can use different trackers:
projects:
frontend:
tracker:
plugin: github
backend:
tracker:
plugin: linear
teamId: "..."
How do I monitor agent progress?
Three ways:
- Dashboard -
ao startthen visit http://localhost:9847 - CLI status -
ao status(text-based dashboard) - Attach to session -
ao open <session-name>(live terminal)
What if an agent gets stuck?
# Check status
ao status
# Send message
ao send <session-name> "What's your current status?"
# Attach to investigate
ao open <session-name>
# Kill and respawn if necessary
ao session kill <session-name>
ao spawn <project-id> <issue-id>
Agents also send "stuck" notifications automatically after inactivity threshold.
How do I clean up old sessions?
# List all sessions
ao session ls
# Kill specific session
ao session kill <session-name>
# Cleanup script (example)
ao session ls --json | jq -r '.[] | select(.status == "merged") | .id' | xargs -I{} ao session kill {}
Can I run multiple orchestrators?
Yes! Each orchestrator instance should have:
- Different data directory (
dataDir) - Different port (
port) - Different config file
Useful for:
- Separating projects
- Different teams
- Testing new configs
Next Steps
- Run
ao init- Create your first config - Spawn an agent -
ao spawn my-app ISSUE-123 - Monitor progress -
ao statusor dashboard - Read CLAUDE.md - Code conventions and architecture
- Explore examples - See examples/ for more configs
- Join the community - Report issues, share configs, contribute plugins
Need help? Open an issue at: https://github.com/ComposioHQ/agent-orchestrator/issues