Skip to main content

Git Worktree Workspace Orchestrator

Project description

Grove logo

Grove (gw)

grove /ɡrōv/ noun — a small group of trees growing together.

Why?

Monorepos solve cross-project work, but not everyone has one. You've got separate repos, separate CI, separate deploys — and that's fine until you need to work across them.

One feature across three services means git worktree add three times, tracking three branches, jumping between three directories, cleaning up three worktrees when you're done. It's annoying.

Grove gives you the multi-repo worktree workflow that monorepos get for free. One command, one workspace, all repos on the same branch.

Install

Homebrew

brew tap nicksenap/grove
brew install grove

PyPI

pipx install gw-cli
# or
pip install gw-cli

From source

uv tool install .

Then add shell integration to your .zshrc (or .bashrc):

eval "$(gw shell-init)"

This enables gw go to change your working directory and auto-cds into new workspaces after gw create.

Usage

# Setup — register one or more directories containing your repos
gw init ~/dev ~/work/microservices
gw add-dir ~/other/repos
gw remove-dir ~/old/repos
gw explore                                             # deep-scan for repos (2–3 levels)

# Workspaces
gw create my-feature -r svc-a,svc-b -b feat/login     # create workspace
gw list                                                # list workspaces
gw list -s                                             # list with git status summary
gw status my-feature                                   # git status across repos
gw sync my-feature                                     # rebase all repos onto base branch
gw go my-feature                                       # cd into workspace
gw run my-feature                                      # run dev processes (TUI)
gw add-repo my-feature -r svc-c                        # add a repo to existing workspace
gw remove-repo my-feature -r svc-a                     # remove a repo from workspace
gw rename my-feature --to new-name                     # rename a workspace
gw doctor                                              # diagnose workspace health issues
gw delete my-feature                                   # clean up (worktrees + branches)

# Presets — save repo groups for quick workspace creation
gw preset add backend -r svc-auth,svc-api,svc-worker
gw preset list
gw preset remove backend
gw create my-feature -p backend                        # use a preset instead of -r

All interactive menus support type-to-search filtering, arrow-key navigation (single-select), or arrow + tab (multi-select) with an (all) shortcut.

Per-repo config

Drop a .grove.toml in any repo to override defaults:

# merchant-portal/.grove.toml
base_branch = "stage"              # branch from origin/stage instead of origin/main
setup = "pnpm install"             # run after worktree creation
teardown = "rm -rf node_modules"   # run before worktree removal
pre_sync = "pnpm run build:check"  # run before rebase during sync
post_sync = "pnpm install"         # run after successful rebase
pre_run = "docker compose pull"    # run before gw run starts
run = "pnpm dev"                   # started by gw run (foreground)
post_run = "docker compose down"   # run on gw run exit / Ctrl+C

All hook keys accept a string or a list of commands:

setup = ["uv sync", "uv run pre-commit install"]

Hook failures are warnings — they never block the operation they're attached to.

Design philosophy

The hook system follows the npm-style pre/post convention: one primitive (run, sync) with optional pre_ and post_ counterparts that fire around it. Instead of building special-purpose features (secret injection, dependency installs, container management), Grove gives you generic hook points and gets out of the way.

When Hooks Example use
Worktree created setup pnpm install, inject secrets, seed DB
Worktree removed teardown rm -rf node_modules, revoke temp creds
Before/after rebase pre_sync, post_sync Type-check before rebase, reinstall after
Dev session pre_run, run, post_run Pull containers, start dev server, tear down

gw run

gw run launches a Textual TUI that manages run hooks across all repos. Each repo gets its own log pane with a sidebar showing status indicators (green = running, yellow = starting, red = exited with error).

Key Action
j / k / / Navigate repos
g / G Jump to first / last
19 Quick-select repo by number
r Restart selected repo
q Quit (terminates all processes)

Pre-run hooks fire before the TUI launches, post-run hooks fire after it exits.

Dashboard (gw dash)

A Textual TUI for monitoring Claude Code agents across all your workspaces. Agents are sorted into a kanban board with four columns — Active, Attention, Idle, Done — based on live status. Inspired by Clorch.

gw dash install   # install Claude Code hooks
gw dash           # launch the dashboard
gw dash uninstall # remove hooks
Key Action
h / l Navigate columns
j / k Navigate cards
Enter Jump to agent's Zellij tab
y / n Approve / deny permission request
/ Search / filter agents
Escape Clear search
r Refresh
q Quit

How it works

Claude Code hooks write agent state to ~/.grove/status/<session_id>.json on every event. The dashboard polls these files every 500ms and renders a real-time kanban view of all active agents.

Tracked per agent: status, working directory, git branch, dirty file count, last tool used, tool/error/subagent counts, activity sparkline, permission request details, and initial prompt.

Zellij tab matching

When you press Enter to jump to an agent, the dashboard finds the right Zellij tab using a multi-step strategy:

Priority Strategy Example
1 Exact tab name = project name grove → tab grove
2 Case-insensitive tab name Grove → tab grove
3 Workspace name from CWD matched against tab names CWD has feat-rewrite → tab matching
4 CWD path match via zellij action dump-layout Agent CWD under tab CWD or vice versa
5 Project name substring in tab name api → tab public-api

Terminal multiplexer integration

Grove integrates with Zellij for tab management. When running inside Zellij:

  • gw go --close-tab closes the current Zellij tab (useful when you're done with a workspace)
  • gw dash lets you press Enter to jump directly to an agent's Zellij tab, and y/n to approve or deny permission requests

Support for tmux and other terminal multiplexers is planned.

Works with AI coding tools

Worktrees mean isolation. That makes Grove a natural fit for tools like Claude Code — spin up a workspace, let your AI agent work across repos without touching anything else, clean up when done:

gw create -p backend -b fix/auth-bug
claude "fix the auth token expiry bug across svc-auth and api-gateway"
gw delete fix-auth-bug   # removes worktrees, branches, and workspace

Grove copies your CLAUDE.md into new workspaces, so your agent gets project context from the start.

Requirements

Python 3.12+ (installed automatically by Homebrew)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gw_cli-0.12.15.tar.gz (1.5 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gw_cli-0.12.15-py3-none-any.whl (74.7 kB view details)

Uploaded Python 3

File details

Details for the file gw_cli-0.12.15.tar.gz.

File metadata

  • Download URL: gw_cli-0.12.15.tar.gz
  • Upload date:
  • Size: 1.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for gw_cli-0.12.15.tar.gz
Algorithm Hash digest
SHA256 74e17151e79c195c85d3f6bea229cf4dcabf477b72f497d9166b689b157097b4
MD5 fe2cc9801c80a16b3655ce5d336332a8
BLAKE2b-256 0082b8741fe4c87d80637611f76ff0b803e619f21495d3d36a0dd4f2a94bd007

See more details on using hashes here.

Provenance

The following attestation bundles were made for gw_cli-0.12.15.tar.gz:

Publisher: release.yml on nicksenap/grove

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file gw_cli-0.12.15-py3-none-any.whl.

File metadata

  • Download URL: gw_cli-0.12.15-py3-none-any.whl
  • Upload date:
  • Size: 74.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for gw_cli-0.12.15-py3-none-any.whl
Algorithm Hash digest
SHA256 1ccc174e0ddee8de0e3978c427d306a837e7da7cb907b72f84d013a9e6d3a911
MD5 2c4a5302a1086ee4e4b3c2d9d5c6c26b
BLAKE2b-256 0258589e8502a8bad51506c11fdd401443227f9ec7841c2614ea6eaf738aad80

See more details on using hashes here.

Provenance

The following attestation bundles were made for gw_cli-0.12.15-py3-none-any.whl:

Publisher: release.yml on nicksenap/grove

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page