A terminal-based multi-agent orchestrator that runs AI coding agents (Claude Code, OpenCode) in parallel, each in its own git worktree, with a live dashboard and per-task watcher TUI.
Built with Bun, OpenTUI React, and cmux.
Each task gets its own git worktree and cmux workspace. The agent runs in one pane, a watcher TUI runs alongside it showing live diffs, file status, and shortcuts for common actions.
┌─────────────────────────────────┬──────────────────────────────┐
│ Claude Code (agent) │ Watcher TUI │
│ │ ⠸ Agent running │
│ > working on fix... │ watcher · fn-fix-bug │
│ │ │
│ │ FILE ADDED REMOVED│
│ │ M src/index.ts +12 -3 │
│ │ A lib/utils.ts +45 │
│ │ ? test.txt │
│ │ ─────────────────────────────│
│ │ ↑↓ select d diff e edit │
│ │ f picker g git t term │
│ │ r review x run q quit │
└─────────────────────────────────┴──────────────────────────────┘
A global dashboard lets you spawn tasks, monitor all running agents, and jump between workspaces.
# Prerequisites
brew tap oven-sh/bun
brew install bun git cmux
# Clone and install
git clone git@github.com:fneves/workbench.git
cd workbench
bun install
# Symlink the CLI
mkdir -p ~/.local/bin
ln -sf "$(pwd)/bin/workbench" ~/.local/bin/workbench# Start the dashboard (must be inside cmux)
workbench start
# Spawn a task
workbench spawn -b fix-auth-bug -p "Fix the authentication timeout issue"
# Spawn interactively (no prompt, opens Claude Code in interactive mode)
workbench spawn -b refactor-api -i
# Spawn from a different base branch
workbench spawn -b feature-x -p "Add feature X" -f develop
# List running tasks
workbench list
# Kill a task
workbench kill fix-auth-bug
# Tear down everything
workbench cleanup| Command | Description |
|---|---|
workbench start |
Create cmux workspace and launch the dashboard |
workbench dashboard |
Run the orchestrator dashboard TUI |
workbench spawn [opts] |
Create a worktree and launch a task workspace |
workbench watcher <worktree> <branch> |
Run the per-task watcher TUI |
workbench list |
Print a table of all tasks |
workbench kill <branch> |
Kill a single task and clean up |
workbench cleanup |
Tear down all tasks, worktrees, and workspaces |
| Flag | Description |
|---|---|
-b, --branch |
Branch name (required) |
-p, --prompt |
Task prompt for the agent |
-a, --agent |
Agent: claude or opencode (default: claude) |
-f, --from |
Base branch (default: main) |
-i, --interactive |
Interactive mode (no prompt) |
The per-task watcher TUI supports file selection with arrow keys. When a file is selected, actions scope to that file.
| Key | Action |
|---|---|
↑↓ |
Select file |
d |
Diff (selected file or full diff) |
e |
Open in editor (selected file or project) |
r |
AI code review (selected file or all changes) |
f |
File picker (fzf with diff preview) |
g |
lazygit |
t |
Terminal in worktree |
x |
Run ./scripts/start.sh |
s |
Stage all changes |
c |
Commit |
esc |
Deselect file |
q |
Quit |
src/
├── index.tsx # CLI entry point with subcommands
├── commands/ # Imperative subcommands
│ ├── start.ts # Create cmux workspace + launch dashboard
│ ├── spawn.ts # Create worktree + launch task
│ ├── list.ts # Print task table
│ ├── kill.ts # Kill a task
│ └── cleanup.ts # Tear down everything
├── modes/
│ ├── dashboard/ # Orchestrator dashboard TUI
│ └── watcher/ # Per-task watcher TUI
├── lib/ # Shared libraries
│ ├── cmux.ts # cmux socket client
│ ├── config.ts # Config and path helpers
│ ├── git.ts # Git operations
│ ├── state.ts # Task state management
│ ├── process.ts # Process management
│ ├── notify.ts # Notifications
│ └── tui.ts # TUI lifecycle helpers
├── hooks/ # Shared React hooks
├── components/ # Shared React components
└── templates/ # Agent wrapper script generators
- delta — better diff rendering
- lazygit — git TUI
- fzf — file picker
- bat — syntax-highlighted file viewer
- Claude Code — AI agent (default)
MIT