* feat: session title fallback chain — PR title → summary → issue title → branch
Sessions without PRs now always show a meaningful title on the dashboard
instead of just the status text. The fallback chain is:
1. PR title (already worked)
2. Agent summary (now fetched from JSONL via getSessionInfo())
3. Issue title (now fetched via tracker.getIssue())
4. Humanized branch name (e.g., "feat/infer-project-id" → "Infer Project ID")
Key changes:
- Enrich agent summaries by calling getSessionInfo() for sessions
without summaries (local file I/O, not API calls)
- Enrich issue titles via tracker.getIssue() with 5-min TTL cache
- Add humanizeBranch() utility for last-resort branch name display
- Add issueTitle field to DashboardSession type
- Show issue title in expanded detail panel
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: extract humanizeBranch to separate module to avoid client-side timer leaks
Moves humanizeBranch() from serialize.ts to format.ts — a pure utility
module with no side effects. This prevents the client bundle from pulling
in TTLCache instantiations (which create setInterval timers) when
SessionCard.tsx imports the function.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: remove dead re-export of humanizeBranch from serialize.ts
No consumer imports humanizeBranch from serialize — SessionCard imports
directly from format.ts. The re-export was unused surface area.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: add missing first-project fallback in summary enrichment block
Matches the pattern used by all other enrichment blocks in page.tsx
(issue labels, issue titles, PR enrichment) which fall back to the
first configured project when projectId and sessionPrefix both miss.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: smarter title heuristic — skip prompt excerpts, prefer issue titles
The agent summary fallback from extractSummary() often returns truncated
spawn prompts ("You are working on GitHub issue #42: Add auth...") which
make poor titles. The new heuristic detects these prompt excerpts and
prefers the issue title when available.
Updated fallback chain:
PR title → quality summary → issue title → any summary → humanized branch → status
Changes:
- Add looksLikePromptExcerpt() to detect spawn prompt patterns
- Add getSessionTitle() to encapsulate the smart fallback logic
- Expand humanizeBranch() with more prefix patterns (release, hotfix, etc.)
- SessionCard now uses getSessionTitle() instead of inline ?? chain
- Add 25 unit tests covering all functions and edge cases
- Fix missing issueTitle field in serialize.test.ts fixture
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: extract shared resolveProject() to eliminate duplication
Moves resolveProject() from route.ts into serialize.ts as a shared
export. Both page.tsx and route.ts now use the same function instead
of duplicating the 3-step project resolution logic (projectId →
sessionPrefix → first project fallback) inline.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: replace looksLikePromptExcerpt heuristic with summaryIsFallback metadata
Instead of fragile string matching to detect truncated spawn prompts,
the agent plugin now sets summaryIsFallback: true when the summary is
a first-message fallback rather than a real agent-generated summary.
- Add summaryIsFallback to AgentSessionInfo (core/types.ts)
- extractSummary() returns { summary, isFallback } in claude-code plugin
- Add summaryIsFallback to DashboardSession, propagate in serialize.ts
- Replace looksLikePromptExcerpt() with !session.summaryIsFallback
- Fix .js extension in format.ts import (review feedback)
- Add thorough tests for all layers of propagation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* test: add resolveProject and enrichSessionIssueTitle coverage
- resolveProject: 5 tests covering direct match, prefix fallback,
first-project fallback, empty projects, and priority ordering
- enrichSessionIssueTitle: 7 tests covering enrichment, # prefix
stripping, Linear-style labels, skip conditions, error handling,
and cross-call caching
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor: extract shared enrichSessionsMetadata, fix session detail route
- Extract duplicated enrichment orchestration (issue labels, agent
summaries, issue titles) from page.tsx and route.ts into a single
enrichSessionsMetadata() function in serialize.ts
- Fix /api/sessions/[id] route: was missing agent summary and issue
title enrichment, and had hand-rolled project resolution instead of
using resolveProject() (also missing the first-project fallback)
- Optimize: resolve projects once per session instead of 3x
- Add 8 tests for enrichSessionsMetadata covering full pipeline, skip
conditions, missing plugins, no-tracker config, multiple sessions,
and default agent fallback
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: remove dead getAgent and getTracker exports from services.ts
These helpers became unused when enrichSessionsMetadata was extracted
to serialize.ts with inline registry.get() calls (to avoid coupling
serialize.ts to services.ts and pulling plugin packages into webpack).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
|
||
|---|---|---|
| .changeset | ||
| .cursor | ||
| .github/workflows | ||
| .husky | ||
| artifacts | ||
| changelog | ||
| docs | ||
| examples | ||
| packages | ||
| scripts | ||
| tests/integration | ||
| .gitignore | ||
| .gitleaks.toml | ||
| .npmrc | ||
| .prettierignore | ||
| .prettierrc | ||
| ARCHITECTURE.md | ||
| CLAUDE.md | ||
| CLAUDE.orchestrator.md | ||
| DASHBOARD_FIXES_SUMMARY.md | ||
| LICENSE | ||
| README.md | ||
| SECURITY.md | ||
| SETUP.md | ||
| TROUBLESHOOTING.md | ||
| agent-orchestrator.yaml | ||
| agent-orchestrator.yaml.example | ||
| eslint.config.js | ||
| package.json | ||
| pnpm-lock.yaml | ||
| pnpm-workspace.yaml | ||
| test-ao-config.yaml | ||
| test-ao-config2.yaml | ||
| tsconfig.base.json | ||
README.md
Agent Orchestrator
Orchestrate parallel AI coding agents across any runtime, any repository, any issue tracker.
Quick Start
git clone https://github.com/ComposioHQ/agent-orchestrator.git
cd agent-orchestrator && bash scripts/setup.sh
cd ~/your-project && ao init --auto && ao start
Dashboard opens at http://localhost:3000 (port configurable via port: in config)
Overview
Agent Orchestrator manages multiple AI coding agents working in parallel on your repository. Each agent operates in isolation using separate git worktrees, handles its own pull request lifecycle, and automatically responds to CI failures and review comments.
Key features:
- Parallel execution - Work on multiple issues simultaneously
- Human-in-the-loop - Agents escalate to you only when judgment is needed
- Fully pluggable - Swap any component (runtime, agent, tracker, SCM)
- Real-time dashboard - Monitor all agents from a unified interface
Features
- Agent-agnostic: Claude Code, Codex, Aider, or bring your own
- Runtime-agnostic: tmux, Docker, Kubernetes, or custom
- Tracker-agnostic: GitHub Issues, Linear, Jira, or custom
- Auto-reactions: CI failures, review comments, merge conflicts handled automatically
- Notifications: Desktop, Slack, Composio, or webhook - only when needed
- Live terminal: Watch agents work in real-time through the browser
Architecture
Eight plugin slots - every abstraction is swappable:
| Slot | Interface | Default | Alternatives |
|---|---|---|---|
| Runtime | Runtime |
tmux | docker, k8s, process |
| Agent | Agent |
claude-code | codex, aider, opencode |
| Workspace | Workspace |
worktree | clone |
| Tracker | Tracker |
github | linear, jira |
| SCM | SCM |
github | (gitlab, bitbucket) |
| Notifier | Notifier |
desktop | slack, composio, webhook |
| Terminal | Terminal |
iterm2 | web |
| Lifecycle | core | — | — |
All interfaces are defined in packages/core/src/types.ts.
Installation
Prerequisites
- Node 20+
- Git 2.25+
- tmux (for tmux runtime)
- gh CLI (for GitHub integration)
Setup
git clone https://github.com/ComposioHQ/agent-orchestrator.git
cd agent-orchestrator
bash scripts/setup.sh
The setup script installs dependencies with pnpm, builds all packages, rebuilds node-pty from source, and links the ao CLI globally.
Initialize Your Project
cd ~/your-project
ao init --auto # Auto-detects project type, generates config
ao start # Launches orchestrator and dashboard
Auto-detection recognizes your git repository, remote, project type (languages, frameworks, test runners), and generates custom agent rules based on your stack.
Usage
Spawn Agents
# Spawn agent for a GitHub issue
ao spawn my-project 123
# Spawn for a Linear issue
ao spawn my-project INT-1234
# Spawn without issue (ad-hoc work)
ao spawn my-project
Monitor Progress
# Command-line dashboard
ao status
# Web dashboard (default port 3000, configurable in agent-orchestrator.yaml)
open http://localhost:3000
Manage Sessions
# List all sessions
ao session ls
# Send message to agent
ao send <session-id> "Fix the linting errors"
# Kill session
ao session kill <session-id>
Auto-Reactions
Configure automatic responses to common scenarios:
reactions:
ci-failed:
auto: true
action: send-to-agent
retries: 3
changes-requested:
auto: true
action: send-to-agent
escalateAfter: 1h
approved-and-green:
auto: true
action: auto-merge
Configuration
Basic configuration in agent-orchestrator.yaml:
port: 3000 # Dashboard port (each project needs a unique port if running multiple)
defaults:
runtime: tmux
agent: claude-code
workspace: worktree
notifiers: [desktop]
projects:
my-app:
repo: owner/my-app
path: ~/my-app
defaultBranch: main
sessionPrefix: app
agentRules: |
Always run tests before pushing.
Use conventional commits.
Write clear commit messages.
See agent-orchestrator.yaml.example for complete reference documentation.
Examples
The examples/ directory contains configuration templates:
simple-github.yaml- Minimal GitHub Issues setuplinear-team.yaml- Linear integrationmulti-project.yaml- Multiple repositoriesauto-merge.yaml- Aggressive automation
Development
pnpm install
pnpm build
pnpm dev # Start web dev server
Project Structure
packages/
core/ - Core types and services
cli/ - ao command-line tool
web/ - Next.js dashboard
plugins/
runtime-*/ - Runtime plugins
agent-*/ - Agent plugins
workspace-*/ - Workspace plugins
tracker-*/ - Tracker plugins
scm-*/ - SCM plugins
notifier-*/ - Notifier plugins
terminal-*/ - Terminal plugins
Design Philosophy
Push, not pull: Spawn agents, step away, get notified only when your judgment is needed.
- Stateless orchestrator (filesystem over database)
- Plugin everything (no vendor lock-in)
- Amplify human judgment, don't bypass it
- Auto-handle routine work, escalate complex decisions
Troubleshooting
See TROUBLESHOOTING.md for common issues and solutions.
Common issues:
- Terminal not working → node-pty rebuild (automatic via postinstall hook)
- Port in use → Change
port:in config or kill existing server (lsof -ti:3000 | xargs kill) - Config not found → Run
ao initfrom your project directory
Contributing
Contributions welcome. See CLAUDE.md for code conventions and architecture details.
License
MIT
Documentation
- Setup Guide - Detailed setup and configuration
- Examples - Config templates for common use cases
- CLAUDE.md - Code conventions and architecture
- TROUBLESHOOTING.md - Common issues and fixes