git-paw
Parallel AI Worktrees โ orchestrate multiple AI coding CLI sessions across git worktrees from a single terminal using tmux.
Demo
$ git paw
๐พ git-paw โ Parallel AI Worktrees
? Select mode:
> Same CLI for all branches
Different CLI per branch
? Select branches (space to toggle, enter to confirm):
> [x] feat/auth
[x] feat/api
[ ] fix/typo
[ ] main
? Select AI CLI:
> claude
codex
gemini
โ Creating worktrees...
../myproject-feat-auth/
../myproject-feat-api/
โ Launching tmux session: paw-myproject
Pane 1: feat/auth โ claude
Pane 2: feat/api โ claude
Attaching to tmux session...
What It Does
git-paw lets you run multiple AI coding assistants in parallel, each in its own git worktree and tmux pane. Pick your branches, pick your AI CLI(s), and git-paw handles the rest โ creating worktrees, launching a tmux session, and wiring everything together. Stop and resume sessions at will; your worktrees and uncommitted work are preserved.
Features
- Parallel AI sessions โ run Claude, Codex, Gemini, or any AI CLI across multiple branches simultaneously
- Git worktree isolation โ each branch gets its own working directory, no stashing or switching needed
- Smart session management โ reattach to active sessions, auto-recover after crashes or reboots, and rebase existing agent branches onto the repository's default branch on every
git paw startso agents never drift behind supervisor commits onmain(pass--no-rebaseto opt out) - Interactive or scripted โ fuzzy branch picker and CLI selector, or pass
--cliand--branchesflags - Per-branch CLI assignment โ use Claude on one branch and Gemini on another in the same session
- Presets โ save branch + CLI combos in config for one-command launches
- Custom CLI support โ register any AI CLI with
git paw add-cli - Session persistence โ state saved to disk, survives tmux crashes and system reboots
- Dry run โ preview the session plan before executing with
--dry-run - Mouse-friendly tmux โ click to switch panes, drag borders to resize, scroll with mouse wheel
- Spec-driven launch โ auto-discover specs and launch sessions with
--from-all-specs(or narrow to a subset via--specs NAME[,NAME...]) - AGENTS.md integration โ auto-inject session context into worktree AGENTS.md files
- Session logging โ capture raw terminal output per pane for later review
- Replay โ view session logs with ANSI stripping or colored output via
less -R - Project init โ
git paw initbootstraps.git-paw/, config, and gitignore - Standards-based โ uses
AGENTS.mdfollowing the Linux Foundation standard for AI agent instructions - Agent coordination โ built-in HTTP broker lets agents share status, artifacts, and blocked requests
- Dashboard TUI โ live status table in pane 0 shows agent progress at a glance
- Broker messages panel โ optional dashboard section showing real-time agent communication (configurable via
[dashboard] show_message_log = true) - Skill templates โ coordination instructions auto-injected into each agent's AGENTS.md
- Boot-prompt injection โ standardized boot instructions automatically prepended to all agent prompts, ensuring reliable self-reporting (register, done, blocked, question operations) โ always enabled for broker sessions
- Cursor-based messaging โ lossless message polling with sequence tracking
- Spec Kit backend โ first-class support for GitHub Spec Kit projects via
[specs] type = "speckit";.specify/specs/is auto-detected at the repo root and the[P]/non-[P]task split decomposes into per-task and consolidated worktrees --specs-formatoverride โ force-select the spec backend (openspec,markdown,speckit) on the command line, overriding both[specs] typein config and the.specify/auto-detection--no-supervisorโ single-session override of[supervisor] enabled = truefor plain (non-supervisor) operation without editing configstart --forceโ bypass the uncommitted-spec validation warning when launching with--from-all-specsor--specs- Forward coordination โ agents publish
agent.intentbefore they begin editing so peers (and the broker conflict detector) see the planned file set ahead of the first commit - Automatic conflict detection โ the broker auto-emits
[conflict-detector]-taggedagent.feedbackfor forward (overlapping intents), in-flight (overlappingmodified_files), and ownership-violation conflicts; unresolved in-flight overlaps escalate to the supervisor inbox viaagent.question - Learnings mode โ opt-in
[supervisor] learnings = truecollects deterministic friction signals (stuck duration, recovery cycles, forward conflicts, in-flight conflicts, ownership violations) into.git-paw/session-learnings.mdfor post-session review. No telemetry โ the file is purely local and nothing is sent anywhere; you can optionally share it via a GitHub issue (after reviewing/anonymising it) to help improve the tool. See Learnings โ Privacy & Sharing - Governance pointers โ point the supervisor at your existing ADRs, test strategy, security checklist, DoD, and constitution via the
[governance]config table; Spec Kit projects auto-wire.specify/memory/constitution.mdwhen present - Auto-approval policy โ
[supervisor.auto_approve]controls safe-command prefixes and approval level for stalled-pane sweeps;[supervisor.common_dev_allowlist]seeds a curated dev-loop preset into.claude/settings.jsonso common build/test/git commands bypass per-prompt approval - Conflict-detector tuning โ
[supervisor.conflict]exposes the in-flight escalation window (window_seconds), the intent-overlap warning toggle (warn_on_intent_overlap), and the ownership-violation escalation toggle (escalate_on_violation) - Learnings flush cadence โ
[supervisor.learnings_config] flush_interval_seconds(default 60) controls how often learnings entries are flushed from memory to.git-paw/session-learnings.md - Routing through the supervisor โ type
/agentsin the supervisor pane to see the live agent inventory (status, mode, pane) and/tell <agent> <prompt>to route a prompt to one agent without tab-switching into its pane;[supervisor.tell] modepicks the delivery channel (feedbackqueue by default,send-keysfor accept-edits agents) and every route is recorded in the session learnings - MCP server (v0.7.0+) โ
git paw mcpexposes this repo's read-only state (coordination intents/conflicts, governance docs, specs/tasks, session status/learnings, agent skills, git context) over the Model Context Protocol so any MCP-aware client can query it; runs standalone over stdio, degrades gracefully when no session is active, and never invokes an agent CLI as a backend
Tip: git-paw uses
AGENTS.mdas the standard agent instruction file. If your AI CLI reads a different file (e.g.,CLAUDE.md,GEMINI.md), you can symlink it:Add these symlinks to
.gitignoreso they stay local to each developer.
Platform Support
| Platform | Status | Notes |
|---|---|---|
| macOS (ARM) | Supported | Primary development platform |
| macOS (x86) | Supported | |
| Linux (x86_64) | Supported | |
| Linux (ARM64) | Supported | |
| Windows | WSL only | tmux is a Unix tool โ use Windows Subsystem for Linux |
Why no native Windows? git-paw relies on tmux for terminal multiplexing, which is not available natively on Windows. WSL provides a full Linux environment where git-paw works perfectly.
Quick Start: Same CLI
Use the same AI CLI across all branches:
# Interactive โ pick branches and CLI from prompts
# Non-interactive โ specify everything upfront
This creates:
- A worktree for each branch (
../yourproject-feat-auth/,../yourproject-feat-api/) - A tmux session with one pane per branch, each running
claude
Quick Start: Per-Branch CLI
Use different AI CLIs on different branches:
# Interactive mode โ select "Different CLI per branch"
# โ Pick branches: feat/auth, feat/api
# โ Pick CLI for feat/auth: claude
# โ Pick CLI for feat/api: gemini
Result: a tmux session where feat/auth runs Claude and feat/api runs Gemini, side by side.
Quick Start: Supervisor Mode
Run an unattended supervisor agent that orchestrates the worker agents on your behalf:
# Skip supervisor for a single run even when [supervisor] enabled = true is set
# Bypass the uncommitted-spec validation warning when launching from specs
The supervisor agent runs in its own pane, polls each worker agent for progress and artifacts via the broker, runs the configured test command between merges, and writes a session summary when work completes. Use this mode when you want to leave a multi-branch session running without continually steering each agent yourself.
In v0.5.0 supervisor mode also seeds a curated dev-command allowlist into .claude/settings.json on session start so common dev-loop commands (cargo build, git commit, just, mdbook build, openspec validate, ...) bypass per-prompt approval. Opt out with [supervisor.common_dev_allowlist] enabled = false; extend with extra = [...].
--no-supervisor is the highest-precedence step in the supervisor-mode resolution chain โ it wins over both [supervisor] enabled = true in config and any interactive prompt. It is mutually exclusive with --supervisor; passing both fails at parse time. --force only matters for spec-mode launches (--from-all-specs / --specs) and bypasses the warning when uncommitted spec changes are detected on disk.
Installation
From crates.io
Homebrew
Shell installer
|
Windows (WSL)
Install WSL, then use any of the Linux installation methods above inside your WSL environment:
# Inside WSL
Prerequisites
git paw vs git-paw
Once installed to your PATH, git-paw works as a git subcommand:
You can also call the binary directly โ useful during development or if it's not on PATH:
All examples below use git paw, but git-paw works identically.
Usage
init โ Initialize project
Creates .git-paw/ directory with default config and sets up .gitignore for logs.
start โ Launch or reattach
# Interactive launch
# Specify CLI and branches
# Launch every discovered spec (OpenSpec, Markdown, or Spec Kit)
# Force-select the spec backend, overriding [specs] type and .specify/ auto-detection
# Narrow to specific specs, or open a multi-select picker
# Use a preset from config
# Preview without executing
# Bypass the uncommitted-spec validation warning
Smart behavior:
- Active session exists โ reattaches
- Stopped/crashed session โ auto-recovers (reuses worktrees, relaunches CLIs)
- No session โ full interactive launch
add โ Attach a branch mid-session (v0.6.0+)
Hot-attaches a worktree and agent pane to a running supervisor session โ no stop/purge/restart, the other agents keep working. The grid re-tiles to the layout a start of that many agents would produce, the new agent boots with the same broker boot block + prompt a start-time agent gets, and the supervisor discovers it on its next sweep. Adding past the 25-agent cap is rejected; adding to a paused session leaves the new pane paused until git paw resume. See Session Lifecycle.
remove โ Detach a single agent (v0.6.0+)
Detaches one agent: closes its pane, re-tiles the grid for the smaller agent count, removes its worktree (reusing purge's teardown), and drops it from the session. Safe by default โ refuses a worktree with uncommitted changes (listing what would be lost) unless --force; --keep-worktree detaches the pane but leaves the worktree on disk. git paw remove supervisor is refused โ use git paw stop to end the whole session.
pause โ Soft-stop the session (v0.5.0+)
Detaches the tmux client, stops the broker, and leaves every CLI pane running. Preserves agent conversation state for instant resume via git paw start. Holds RAM (~300 MB per Claude pane), so use it for short breaks (lunch, meetings, end-of-day). See Pause and Resume for the full trade-off.
stop โ Kill the CLIs, keep the worktrees
Kills the tmux session and every CLI pane process but preserves worktrees and state on disk. CLI conversation context is lost. Run git paw start later to recover with fresh CLI processes.
purge โ Remove everything
# With confirmation prompt
# Skip confirmation
Removes the tmux session, all worktrees, and session state.
status โ Check session state
Shows session name, branches, CLIs, and status (active/stopped/no session).
list-clis โ Show available CLIs
Lists auto-detected and custom AI CLIs with their source.
add-cli โ Register a custom CLI
# With absolute path
# With display name
remove-cli โ Unregister a custom CLI
Only custom CLIs can be removed โ auto-detected CLIs cannot.
replay โ View session logs
# List available log sessions
# View a branch's log (ANSI stripped)
# View with colors via less -R
# Replay from a specific session
Requires session logging to be enabled in config.
mcp โ Read-only MCP server (v0.7.0+)
Runs a Model Context Protocol server on stdio so any MCP-aware client (Claude Desktop, Cursor, ChatGPT Desktop, Windsurf, VS Code MCP) can query this repository's read-only state: coordination intents/conflicts, governance docs, specs and tasks, session status and learnings, agent skills, and git context. It runs standalone โ no tmux session or broker required.
# Serve the repo in the current directory
# Serve a specific repo (required for clients that spawn from a fixed dir,
# notably Claude Desktop)
# Tee diagnostics to a file (stderr is always used; stdout is JSON-RPC only)
Claude Desktop config (claude_desktop_config.json):
See the MCP user-guide chapter for per-client setup (Cursor, ChatGPT Desktop, Windsurf, VS Code MCP), the full tool reference, and known limitations.
Configuration
Per-repo config (.git-paw/config.toml)
# Pre-select a CLI in the interactive picker
= "my-cli"
= true
# Bypass picker entirely for spec-mode launches (--from-all-specs, --specs)
= "my-cli"
# Prefix for spec-derived branches (default: "spec/")
= "spec/"
# Spec scanning
[]
= "specs"
= "openspec" # "openspec", "markdown", or "speckit"
# Session logging
[]
= true
# Dashboard configuration
[]
# Show broker messages panel for real-time agent communication
= true
[]
= ["feat/api", "fix/db"]
= "my-cli"
Global config (~/.config/git-paw/config.toml)
= "my-cli"
= true
[]
= "/usr/local/bin/my-agent"
= "My Agent"
[]
= "ollama-code"
= "Local LLM"
[]
= ["feat/api", "fix/db"]
= "my-cli"
Per-repo config overrides global config for overlapping fields.
Supported AI CLIs
git-paw auto-detects the following AI coding CLIs when they are on PATH. The list reflects src/detect.rs::KNOWN_CLIS at the time of this release; the table grows as binaries land in upstream releases.
| CLI | Binary |
|---|---|
| Claude Code | claude |
| OpenAI Codex | codex |
| Google Gemini CLI | gemini |
| Aider | aider |
| Vibe | vibe |
| Qwen | qwen |
| Amp | amp |
| opencode | opencode |
| Cline | cline |
| Droid | droid |
| Pi | pi |
| Junie | junie |
| Cursor Agent | cursor |
| GitHub Copilot CLI | copilot |
| cn | cn |
| Kilo Code | kilo |
| Kimi | kimi |
Don't see your CLI? Register it:
How It Works
git paw start
โ
โโ 1. Validate git repo
โโ 2. Load config (global + repo)
โโ 3. Detect AI CLIs on PATH + custom
โโ 4. Interactive selection (or use flags)
โโ 5. Create git worktrees
โ ../project-feat-auth/
โ ../project-feat-api/
โโ 6. Create tmux session (paw-project)
โ โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโ
โ โ feat/auth โ feat/api โ
โ โ โ claude โ โ claude โ
โ โ โ โ
โ โโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโ
โโ 7. Save session state to disk
โโ 8. Attach to tmux session
git paw pause โ soft stop (detach + broker stop; CLIs keep running)
git paw stop โ kills CLIs, keeps worktrees + state
git paw start โ auto-recovers (or restarts a paused session)
git paw purge โ removes everything
Contributing
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
Releases
Releases follow a single chore: prepare vX.Y.Z release commit on main that
bumps Cargo.toml, regenerates CHANGELOG.md via git cliff, and archives
completed OpenSpec changes (moving them under
openspec/changes/archive/<date>-<change>/ and syncing their delta specs into
openspec/specs/). Pushing the vX.Y.Z tag triggers
cargo-dist on GitHub Actions to
build cross-platform binaries and update the Homebrew tap.
After the tag, the maintainer publishes to crates.io manually (it is not wired into cargo-dist):
The full procedure (archive ordering, changelog regeneration, tag rules,
crates.io publish step, recovery from a botched prep commit) lives in
AGENTS.md ยง Release & Distribution.
License
MIT โ Copyright 2026 bearicorn