symphony-github
v0.1.2
Published
AI agent orchestrator that listens to GitHub issues and manages parallel agent work in tmux panes with git worktrees
Maintainers
Readme
Symphony GitHub
Symphony GitHub is a tmux-based GitHub issue runner for coding agents. It watches one or more GitHub repositories, starts agent work in isolated git worktrees, pushes branches, opens PRs, and can optionally merge them automatically.
It is the GitHub-native successor to dmux: same multi-agent / tmux workflow, but with issue polling, PR automation, progress comments, startup recovery, and swarm orchestration.
What It Does
- watches GitHub issues and comments using configurable trigger rules
- runs Claude, Codex, OpenCode, Gemini, Cline, Qwen, Amp, Pi, Cursor, Copilot, or Crush in isolated worktrees
- opens a tmux TUI showing active runs, review-needed runs, and completed runs
- pushes branches and creates PRs automatically
- supports three run modes:
auto: auto-resolve conflicts when possible and auto-mergeauto_manual_conflicts: auto-merge unless GitHub reports conflictsauto_manual_merge: stop once the PR is ready for human review/merge
- keeps swarm/autoevolve separate from run mode; enable it with
swarm.enabled - mirrors progress back to GitHub issue / PR comments if enabled
- recovers claimed issues on startup and lets you resume or skip them
- optionally runs a swarm Director that creates follow-up issues, manages blockers, and tracks dependencies
Install
npm install -g symphony-githubContributor and release notes live in CONTRIBUTING.md.
Or run from a local checkout:
npm install
npm run build
npm startPrerequisites
- Node.js 18+
tmuxgitghauthenticated against GitHub- at least one supported agent CLI installed
Sanity checks:
gh auth status
tmux -V
codex --versionStart
Inside a local checkout of the repo you want to work on:
symphony configure
symphonyUseful variants:
# Re-run onboarding against the current config
symphony configure
# Start or reuse the tmux session without attaching immediately
symphony --no-attach
# Use an explicit config path
symphony --config ./config.yamlIf you start detached, Symphony prints the tmux session name and attach command.
TUI
The current TUI has three main areas:
- header: watched repo(s), run mode, counts for running / review / done, and last poll time
- table: issue number, title, status, agent, diff stats, last update time, and an activity sparkline
- preview pane: live tmux output for the selected run, or the startup-recovery / action-menu view
Special states:
- startup recovery view: appears when Symphony finds previously claimed issues on boot
- action menu: opened from the selected run to pause, kill, or label-and-kill it
Keyboard Shortcuts
Normal mode:
↑/↓: move selectionEnter: jump to the selected tmux panea: same asEnterd: open the action menu for the selected runr: resume a run inawaiting_revieworneeds_attentionf: finalize a run inawaiting_reviewx: close the selected pane from the local listc: reopen onboarding / reconfigure the current project configq: quit SymphonyCtrl-b 0: return to the Symphony control pane after jumping into an agent pane
Action menu:
↑/↓: choose actionEnter: confirmEsc: cancel
Startup recovery:
↑/↓: move selectionSpace: toggle one issuea: select alln: select noneEnter: resume selected issuess: skip all pending recovery itemsq: quit
Run Modes
Symphony currently supports three run modes:
mode: auto # auto-resolve conflicts when possible and merge automatically
mode: auto_manual_conflicts # stop only when conflict resolution needs a human
mode: auto_manual_merge # stop when the PR is ready for manual mergeLegacy automerge normalizes to auto.
These are the only valid values for mode. Swarm/autoevolve is not a fourth run mode; it is a separate optional orchestration layer configured under swarm.
Swarm Mode
If you want the Director agent / agent-swarm behavior, enable swarm in the YAML config. This can create follow-up issues, pause blocked work, resume unblocked work, and keep evolving the backlog while the normal run mode still controls how worker PRs are merged.
mode: auto
swarm:
enabled: true
director:
agent: claude
scope: session
analyze_interval_min: 30
max_proposed_issues: 5
proposals:
approval_mode: autoProposal approval behavior:
auto: automatically approve proposals and create the follow-up issuesdirector_review: workers can propose issues, but the Director must approve them firsthuman_approval: workers can propose issues, but a human must approve them
symphony configure currently asks only for the three run modes above. Swarm is configured manually in the generated YAML for now.
Configuration
The easiest path is still symphony configure, but the generated YAML is straightforward.
Minimal example:
version: 1
default_agent: codex
mode: auto_manual_merge
github_comments:
verbosity: key_updates
poll_interval_sec: 2
max_concurrent_runs: 4
agents:
codex:
provider: codex
timeout_min: 30
create_pr: ready
push: true
routing:
mention_map:
"@agent": codex
"@codex": codex
repos:
- owner/repo
trigger:
mode: label_only
labels:
- agent
mentions:
- "@agent"
- "@codex"
claim_label: agent:running
done_label: agent:done
failed_label: agent:failed
include_existing_open_issues: trueSee config.example.yaml for the full schema, including swarm settings.
Try It
Two public repos are meant for trying Symphony quickly:
mireklzicar/symphony-fixture-todo: deterministic canonical harnessmireklzicar/symphony-demo-snake: more visual showcase demo
TODO App
Use this when you want the cleanest reproducible demo.
git clone https://github.com/<you>/symphony-fixture-todo.git
cd symphony-fixture-todo
npm installSeed the canonical conflict demo:
./scripts/create_issues.sh \
--fixture conflicts \
--group readme-demo-conflict \
--label agentThen start Symphony in that checkout:
symphony configure
symphonyRecommended config choices for this demo:
- agent:
codexorclaude - run mode:
auto - trigger mode:
label_only - startup scan: enabled
- GitHub comments:
key_updatesorsilent
Expected result:
- two conflicting README issues are picked up
- Symphony opens and merges two PRs
- the final README sentence ends with the second issue's requested exact text
Snake App
Use this when you want a more fun public demo backlog.
git clone https://github.com/<you>/symphony-demo-snake.git
cd symphony-demo-snake
npm installSeed the curated demo issues:
./scripts/create_issues.sh --label agentThen run Symphony in the same repo:
symphony configure
symphonyThe snake repo includes demo issues for:
- food spawn correctness
- pause / resume controls
- WASD controls
- responsive layout
- localStorage high score
- extracting gameplay constants into a config module
How Runs Work
- Symphony polls the configured GitHub repos.
- It evaluates trigger rules against new / updated issues and comments.
- Matching issues are claimed with a running label.
- A dedicated git worktree is created for the run.
- The selected agent launches in its own tmux pane with issue context.
- On completion, Symphony inspects the worktree, pushes the branch, and creates or finds the PR.
- Depending on run mode, Symphony either merges automatically or leaves the run in review.
- Final labels, comments, and runtime manifests are updated.
Runtime Layout
By default Symphony stores state under ~/.symphony/:
~/.symphony/
cache/
repos/
runs/
state.json
swarm/
version.json
worktrees/Important per-run files:
~/.symphony/runs/
r_<timestamp>-owner__repo-issue-random/
manifest.json
events.jsonlAgent Environment
Before each run, Symphony exports:
SYMPHONY_REPOSYMPHONY_ISSUE_NUMBERSYMPHONY_ISSUE_URLSYMPHONY_WORKTREESYMPHONY_BRANCHSYMPHONY_CONTEXT_FILESYMPHONY_RUN_IDSYMPHONY_RUN_DIRSYMPHONY_AGENTSYMPHONY_AGENT_PROVIDER
It also writes .symphony/issue.json and .symphony/context.md into the worktree.
License
MIT
