git-paw 0.5.0

Parallel AI Worktrees โ€” orchestrate multiple AI coding CLI sessions across git worktrees
Documentation

git-paw

Parallel AI Worktrees โ€” orchestrate multiple AI coding CLI sessions across git worktrees from a single terminal using tmux.

CI Crates.io Downloads License: MIT MSRV: stable

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 start so agents never drift behind supervisor commits on main (pass --no-rebase to opt out)
  • Interactive or scripted โ€” fuzzy branch picker and CLI selector, or pass --cli and --branches flags
  • 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 init bootstraps .git-paw/, config, and gitignore
  • Standards-based โ€” uses AGENTS.md following 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-format override โ€” force-select the spec backend (openspec, markdown, speckit) on the command line, overriding both [specs] type in config and the .specify/ auto-detection
  • --no-supervisor โ€” single-session override of [supervisor] enabled = true for plain (non-supervisor) operation without editing config
  • start --force โ€” bypass the uncommitted-spec validation warning when launching with --from-all-specs or --specs
  • Forward coordination โ€” agents publish agent.intent before 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]-tagged agent.feedback for forward (overlapping intents), in-flight (overlapping modified_files), and ownership-violation conflicts; unresolved in-flight overlaps escalate to the supervisor inbox via agent.question
  • Learnings mode โ€” opt-in [supervisor] learnings = true collects deterministic friction signals (stuck duration, recovery cycles, forward conflicts, in-flight conflicts, ownership violations) into .git-paw/session-learnings.md for post-session review
  • 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.md when 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.json so 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

Tip: git-paw uses AGENTS.md as the standard agent instruction file. If your AI CLI reads a different file (e.g., CLAUDE.md, GEMINI.md), you can symlink it:

ln -s AGENTS.md CLAUDE.md   # Claude Code reads CLAUDE.md
ln -s AGENTS.md GEMINI.md   # Gemini reads GEMINI.md

Add these symlinks to .gitignore so 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
git paw

# Non-interactive โ€” specify everything upfront
git paw start --cli claude --branches feat/auth,feat/api

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"
git paw
# โ†’ 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:

git paw start --supervisor

# Skip supervisor for a single run even when [supervisor] enabled = true is set
git paw start --no-supervisor

# Bypass the uncommitted-spec validation warning when launching from specs
git paw start --from-all-specs --force
git paw start --supervisor --force

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

cargo install git-paw

Homebrew

brew install bearicorn/tap/git-paw

Shell installer

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/bearicorn/git-paw/releases/latest/download/git-paw-installer.sh | sh

Windows (WSL)

Install WSL, then use any of the Linux installation methods above inside your WSL environment:

# Inside WSL
sudo apt install tmux
cargo install git-paw

Prerequisites

  • tmux โ€” terminal multiplexer
  • Git โ€” with worktree support (2.5+)

git paw vs git-paw

Once installed to your PATH, git-paw works as a git subcommand:

git paw start    # git finds `git-paw` on PATH automatically

You can also call the binary directly โ€” useful during development or if it's not on PATH:

git-paw start    # equivalent
cargo run -- start  # during development

All examples below use git paw, but git-paw works identically.

Usage

init โ€” Initialize project

git paw init

Creates .git-paw/ directory with default config and sets up .gitignore for logs.

start โ€” Launch or reattach

# Interactive launch
git paw start

# Specify CLI and branches
git paw start --cli claude --branches feat/auth,feat/api

# Launch every discovered spec (OpenSpec, Markdown, or Spec Kit)
git paw start --from-all-specs
git paw start --from-all-specs --cli claude

# Force-select the spec backend, overriding [specs] type and .specify/ auto-detection
git paw start --from-all-specs --specs-format speckit

# Narrow to specific specs, or open a multi-select picker
git paw start --specs add-auth,fix-session
git paw start --specs   # interactive picker (requires a TTY)

# Use a preset from config
git paw start --preset backend

# Preview without executing
git paw start --dry-run

# Bypass the uncommitted-spec validation warning
git paw start --from-all-specs --force

Smart behavior:

  • Active session exists โ†’ reattaches
  • Stopped/crashed session โ†’ auto-recovers (reuses worktrees, relaunches CLIs)
  • No session โ†’ full interactive launch

pause โ€” Soft-stop the session (v0.5.0+)

git paw pause

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

git paw stop          # prompts for confirmation in a TTY
git paw stop --force  # skip the prompt (scripts)

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
git paw purge

# Skip confirmation
git paw purge --force

Removes the tmux session, all worktrees, and session state.

status โ€” Check session state

git paw status

Shows session name, branches, CLIs, and status (active/stopped/no session).

list-clis โ€” Show available CLIs

git paw list-clis

Lists auto-detected and custom AI CLIs with their source.

add-cli โ€” Register a custom CLI

# With absolute path
git paw add-cli my-agent /usr/local/bin/my-agent

# With display name
git paw add-cli my-agent my-agent --display-name "My Agent"

remove-cli โ€” Unregister a custom CLI

git paw remove-cli my-agent

Only custom CLIs can be removed โ€” auto-detected CLIs cannot.

replay โ€” View session logs

# List available log sessions
git paw replay --list

# View a branch's log (ANSI stripped)
git paw replay feat/auth

# View with colors via less -R
git paw replay feat/auth --color

# Replay from a specific session
git paw replay feat/auth --session paw-myproject

Requires session logging to be enabled in config.

Configuration

Per-repo config (.git-paw/config.toml)

# Pre-select a CLI in the interactive picker
default_cli = "my-cli"
mouse = true

# Bypass picker entirely for spec-mode launches (--from-all-specs, --specs)
default_spec_cli = "my-cli"

# Prefix for spec-derived branches (default: "spec/")
branch_prefix = "spec/"

# Spec scanning
[specs]
dir = "specs"
type = "openspec"  # "openspec", "markdown", or "speckit"

# Session logging
[logging]
enabled = true

# Dashboard configuration
[dashboard]
# Show broker messages panel for real-time agent communication
show_message_log = true

[presets.backend]
branches = ["feat/api", "fix/db"]
cli = "my-cli"

Global config (~/.config/git-paw/config.toml)

default_cli = "my-cli"
mouse = true

[clis.my-agent]
command = "/usr/local/bin/my-agent"
display_name = "My Agent"

[clis.local-llm]
command = "ollama-code"
display_name = "Local LLM"

[presets.backend]
branches = ["feat/api", "fix/db"]
cli = "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:

git paw add-cli my-cli /path/to/my-cli --display-name "My CLI"

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):

cargo publish --dry-run   # verify
cargo publish             # upload vX.Y.Z

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