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)
Release files for gw-cli 0.12.17
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| gw_cli-0.12.17.tar.gz | 1.6 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| gw_cli-0.12.17-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.6 MB
Release files / gw_cli-0.12.17.tar.gz
| Download URL | gw_cli-0.12.17.tar.gz |
|---|---|
| Size | 1.6 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4275b1e36db4b45842e877a1ae965546d2cfc12d16d15ccee162c439256d6b76
|
|
BLAKE2b-256 checksum How to use checksums |
e9c74a31ab009676c49ebfb5626b11304d4511cf6252c01f28bf7d1ea903b44b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 3, 2026.
Transparency logRelease files / gw_cli-0.12.17-py3-none-any.whl
| Download URL | gw_cli-0.12.17-py3-none-any.whl |
|---|---|
| Size | 74.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
73e1a1b2a41a2a30cbffcc6f623164f260466b1b4d944db7c46e6034079371da
|
|
BLAKE2b-256 checksum How to use checksums |
b93c218a1469d616af98f714faeaae83ead5a5abea096a9dd9d2f03ffca9548f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 3, 2026.
Transparency log