Git Worktree Workspace Orchestrator
Project description
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 (Go — recommended)
brew install nicksenap/grove/grove-go
Homebrew (Python)
brew install nicksenap/grove/grove
From source (Go)
cd go && go build -o gw . && mv gw /usr/local/bin/
From source (Python)
uv tool install .
Migrating from Python to Go
If you have the Python version installed via Homebrew, uninstall it first — both versions install a gw binary:
brew uninstall grove
brew install nicksenap/grove/grove-go
Upgrading
brew upgrade nicksenap/grove/grove-go
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.
Documentation
- Per-repo config & hooks —
.grove.toml, lifecycle hooks,gw run - Agent dashboard —
gw dash, Zellij integration - AI coding tools — Claude Code workflows, MCP server
Go rewrite
Grove is being rewritten in Go. The Python version works but has real distribution pain — Python version conflicts, pipx/uv packaging quirks, and slow startup (~300ms import overhead). The Go binary is a single static executable with instant startup and zero dependencies.
Status
The Go version covers the core workflow. What's missing are the TUI features.
| Command | Go | Notes |
|---|---|---|
init, add-dir, remove-dir |
Done | |
explore |
Done | Deep scan with remote URL caching |
create |
Done | Parallel fetch, rollback, hooks |
delete |
Done | Parallel teardown, hooks |
list, status |
Done | Including -s summary and PR status |
sync |
Done | Parallel rebase, conflict handling |
go |
Done | Including --close-tab for Zellij |
add-repo, remove-repo |
Done | |
rename, doctor, stats |
Done | |
preset |
Done | |
shell-init |
Done | |
mcp-serve |
Done | JSON-RPC server for Claude Code |
hook |
Done | Claude Code hook handler |
run |
Partial | Inline prefix output, no split-pane TUI |
dash |
Not yet | Planned as separate plugin/binary |
285 tests passing (226 unit + 59 e2e).
Requirements
- Go version: No dependencies — single static binary
- Python version: Python 3.12+ (installed automatically by Homebrew)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gw_cli-0.12.17.tar.gz.
File metadata
- Download URL: gw_cli-0.12.17.tar.gz
- Upload date:
- Size: 1.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4275b1e36db4b45842e877a1ae965546d2cfc12d16d15ccee162c439256d6b76
|
|
| MD5 |
b1d57f82e9414162111b7d7c47b49321
|
|
| BLAKE2b-256 |
e9c74a31ab009676c49ebfb5626b11304d4511cf6252c01f28bf7d1ea903b44b
|
Provenance
The following attestation bundles were made for gw_cli-0.12.17.tar.gz:
Publisher:
release.yml on nicksenap/grove
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gw_cli-0.12.17.tar.gz -
Subject digest:
4275b1e36db4b45842e877a1ae965546d2cfc12d16d15ccee162c439256d6b76 - Sigstore transparency entry: 1228560029
- Sigstore integration time:
-
Permalink:
nicksenap/grove@2872b249bdc11f2fc8d428656552c91bea9270ba -
Branch / Tag:
refs/tags/v0.12.17 - Owner: https://github.com/nicksenap
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@2872b249bdc11f2fc8d428656552c91bea9270ba -
Trigger Event:
push
-
Statement type:
File details
Details for the file gw_cli-0.12.17-py3-none-any.whl.
File metadata
- Download URL: gw_cli-0.12.17-py3-none-any.whl
- Upload date:
- Size: 74.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
73e1a1b2a41a2a30cbffcc6f623164f260466b1b4d944db7c46e6034079371da
|
|
| MD5 |
7a1c49f35d5ba97c471a768ca42ef0cb
|
|
| BLAKE2b-256 |
b93c218a1469d616af98f714faeaae83ead5a5abea096a9dd9d2f03ffca9548f
|
Provenance
The following attestation bundles were made for gw_cli-0.12.17-py3-none-any.whl:
Publisher:
release.yml on nicksenap/grove
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gw_cli-0.12.17-py3-none-any.whl -
Subject digest:
73e1a1b2a41a2a30cbffcc6f623164f260466b1b4d944db7c46e6034079371da - Sigstore transparency entry: 1228560048
- Sigstore integration time:
-
Permalink:
nicksenap/grove@2872b249bdc11f2fc8d428656552c91bea9270ba -
Branch / Tag:
refs/tags/v0.12.17 - Owner: https://github.com/nicksenap
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@2872b249bdc11f2fc8d428656552c91bea9270ba -
Trigger Event:
push
-
Statement type: