* docs: design for dashboard legacy-migration popup + app-state marker Spec for the app-side migration trigger (Approach A): projects-only import daemon API + a migration marker in ~/.ao/app-state.json, with a launch-time popup (Proceed / Skip / Don't Migrate). Settings redo path deferred to #2205. Includes the projects-only import-offer backend plan it consumes. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * docs: implementation plan for legacy-migration popup + marker Part A reuses the projects-only import API (import-offer plan) with an availability-only Status; Part B adds the app-state migration marker (schema v2), IPC, the useMigrationOffer gate, and the MigrationPopup (Proceed/Skip/Don't Migrate). Settings redo path deferred to #2205. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * refactor(legacyimport): scope import to projects + settings only Remove orchestrator/transcript import code (orchestrator.go, claude.go, session_import_store.go and their tests). Trim Store, Options, Report to projects-only fields. Drop defaultClaudeProjectsDir and projectSessionsDir from paths.go. Add yaml.TypeError robustness in config.go. Update cli/import.go confirm prompt and summary. Update importer_test.go to projects-only assertions. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(importer): availability probe + projects-only run Create service/importer.Manager with Status (physical availability check only, no DB heuristic) and Run (delegates to legacyimport.Run). The app-state.json marker governs whether to prompt; this service only answers whether legacy data is physically present. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(httpd): import controller + DTOs (GET/POST /api/v1/import) Add ImportStatusResponse/ImportRunResponse DTOs to dto.go. Create ImportController with GET (status probe) and POST (run) handlers, both returning 501 when Svc is nil. Wire APIDeps.Import + API.imports in api.go. Add controller tests (status, status error, run, run error). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(apispec): describe /api/v1/import; regenerate openapi + schema.ts Add import tag, importOperations() (GET + POST /api/v1/import), and schema name mappings (ImportStatusResponse, ImportRunResponse, ImportReport) to build.go. Regenerate openapi.yaml and frontend/src/api/schema.ts. Route-spec parity test passes. Restore the nil-svc-501 import controller test now that the spec includes the operation. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(daemon): mount import service on the API Wire importsvc.New(importsvc.Deps{Store: store}) into APIDeps.Import in daemon.go so the daemon serves GET/POST /api/v1/import backed by the live sqlite store. Projects-only; no DataDir. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore(cli): drop resolved §6.4 first-boot-import TODO The legacy import is now a daemon API (GET/POST /api/v1/import) served by the importer service and the desktop app handles the popup prompt via the app-state.json migration marker. The TODO comment is resolved. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore(legacyimport): remove dead isDir helper isDir was only used by the deleted projectSessionsDir function. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore: update package-lock.json after npm install for api:ts openapi-typescript was missing from root node_modules; npm install populated it so npm run api:ts could regenerate schema.ts. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(httpd): drop em-dash comment + unused ImportStatusResult alias Review findings M1/M2 from G1 task review. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(app-state): migration marker (schema v2) + updateMigration Bump SCHEMA_VERSION to 2, add MigrationStatus/MigrationState types and migration? field to AppStateMarker. Extract atomicWriteMarker helper and reuse it. writeAppStateMarker now preserves an existing migration block across launch writes. Add updateMigration (IPC setter) and readMigrationState (IPC getter) exports. TDD: tests added first (red), then implementation (green). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(ipc): expose app-state migration getter/setter to the renderer Add appState:getMigration / appState:setMigration IPC handlers in main.ts. Add ao.appState.getMigration / setMigration to preload.ts (typed via AoBridge). Add appState preview fallback in bridge.ts and test setup so AoBridge stays satisfied in both browser preview and test environments. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * test(app-state): cover corrupt-marker case + clean up temp dirs G2 review findings I2 (corrupt-JSON branch untested) and m1 (temp dirs not cleaned). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(renderer): useMigrationOffer gate (marker + availability) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(renderer): MigrationPopup (Proceed / Skip / Don't Migrate) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(renderer): surface MigrationPopup on the dashboard Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore: format with prettier [skip ci] --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> |
||
|---|---|---|
| .github/workflows | ||
| backend | ||
| docs | ||
| frontend | ||
| packages | ||
| screenshots | ||
| scripts | ||
| skills/bug-triage | ||
| test/cli | ||
| .envrc | ||
| .gitignore | ||
| .prettierignore | ||
| .prettierrc | ||
| AGENTS.md | ||
| CLAUDE.md | ||
| DESIGN.md | ||
| README.md | ||
| ao-dashboard-preview.png | ||
| ao-logo.svg | ||
| flake.lock | ||
| flake.nix | ||
| package-lock.json | ||
| package.json | ||
README.md
Agent Orchestrator
The orchestration layer for parallel AI coding agents
An Agentic IDE that supervises parallel AI coding agents in isolated workspaces, with complete control and automatic feedback loops from CI failures, review comments, and merge conflicts.
See AO in Action (before the re-write)
![]() Visit |
![]() Visit |
![]() Visit |
![]() Visit |
Features • Quick Start • Architecture • Documentation • Contributing
Features
| Feature | Description |
|---|---|
| Agent-Agnostic Platform | 23+ agent adapters including Claude Code, OpenAI Codex, Cursor, OpenCode, Aider, Amp, Goose, GitHub Copilot, Grok, Qwen Code, Kimi Code, Cline, Continue, Kiro, and more |
| Isolated Workspaces | Each session spawns into its own git worktree with dedicated runtime |
| Platform-Native Runtimes | tmux on Darwin/Linux, conpty on Windows for optimal performance |
| Live PR Observation | Provider-neutral SCM observer with automatic feedback routing |
| Automatic Feedback Routing | CI failures, review comments, and merge conflicts routed to the owning agent |
| Durable Facts Storage | SQLite persists immutable facts with display status derived at read time |
| CDC Broadcasting | DB triggers append changes to change_log, broadcasted via SSE |
| Desktop Experience | Native Electron app with React UI and live terminal streaming |
| Loopback-Only Daemon | HTTP control over 127.0.0.1 with no auth, CORS, or TLS by design |
Supported Agents
Works with 23+ CLI-based coding agents including Claude Code, OpenAI Codex, Cursor, OpenCode, Aider, Amp, Goose, GitHub Copilot, Grok, Qwen Code, Kimi Code, Crush, Cline, Droid, Devin, Auggie, Continue, Kiro, and Kilo Code.
If it runs in a terminal, it runs on Agent Orchestrator.
Quick Start
Prerequisites
| Requirement | Minimum | Recommended |
|---|---|---|
| Go | 1.25+ | Latest |
| Node.js | 20+ | Latest LTS |
| Git | Any | Latest |
| pnpm | Any | Latest |
Optional:
tmux(Darwin/Linux) - For Unix runtimegh(GitHub CLI) - For authenticated GitHub API calls
Installation
Download the latest release for your platform:
| Platform | Download |
|---|---|
| Windows | Setup.exe |
| macOS | Agent Orchestrator.dmg |
| Linux | Agent Orchestrator.AppImage |
Direct Download: Latest Release
Telemetry
Agent Orchestrator collects minimal telemetry for reliability and product understanding. Data is stored locally by default; remote transmission is opt-in via environment variables. Read the full telemetry policy.
Architecture
Agent Orchestrator is a long-running Go daemon built around inbound/outbound port contracts with swappable adapters.
Core mental model: OBSERVE external facts → UPDATE durable facts → DERIVE display status / ACT
Key components:
- Frontend - Electron + React UI with TanStack Router/Query and shadcn/ui
- Backend Daemon - Go-based HTTP server with controllers, services, and adapters
- Runtime - Platform-specific:
tmuxon Darwin/Linux,conptyon Windows - Storage - SQLite with change-data-capture (CDC) for real-time updates
- Adapters - 23+ agent adapters, git worktree workspace, GitHub SCM integration
For detailed architecture diagrams, data flows, and load-bearing rules, see architecture.md.
Documentation
| Document | Description |
|---|---|
| Architecture | System architecture, data flows, and load-bearing rules |
| Backend Code Structure | Package-by-package ownership and dependency rules |
| AGENTS.md | Contributor and worker-agent contract |
| Agent Adapter Contract | Agent adapter interface and hook behavior |
Testing
# Backend tests
cd backend
go test -race ./...
# Frontend tests
cd frontend
pnpm test
# Full CI validation locally
npx @redwoodjs/agent-ci run --all
Configuration
All configuration is environment-driven. The daemon takes no config file.
| Variable | Default | Purpose |
|---|---|---|
AO_PORT |
3001 |
HTTP bind port |
AO_REQUEST_TIMEOUT |
60s |
Per-request timeout |
AO_SHUTDOWN_TIMEOUT |
10s |
Graceful shutdown cap |
AO_RUN_FILE |
~/.ao/running.json |
PID/port handshake |
AO_DATA_DIR |
~/.ao/data |
SQLite data directory |
AO_AGENT |
claude-code |
Compatibility agent adapter |
GITHUB_TOKEN |
- | GitHub auth token |
Health Checks
curl localhost:3001/healthz # Liveness probe
curl localhost:3001/readyz # Readiness probe
Contributing
We love contributions! Join our community on Discord to get started.
Join us on Discord
Daily contributor sync: Every day at 10:00 PM IST
Get your issues verified by core contributors, ask questions, share progress, and learn from the community. New contributors are always welcome!
Why join Discord?
- Get your issues and PRs verified by core contributors before investing time
- Learn from experienced contributors in daily sync calls
- Share your progress and get feedback
- Get help troubleshooting in real-time
- Stay updated on the latest developments and roadmap
Quick Start
- Join the Discord - Connect with the community and get guidance
- Read the contributor contract - See AGENTS.md for repo layout, daemon/API boundaries, and coding conventions
- Pick a focused problem - Browse open issues and choose one small enough for a focused PR
- Open a clear PR - Keep changes narrow, explain user-visible impact, link issues, include tests
- Iterate with contributors - Use review feedback to tighten the PR until verified
License
Apache License 2.0 - see LICENSE for details.
Star us on GitHub • Report Issues • Discussions
Made with love by the Agent Orchestrator community



