This release is a pre-release and may not be stable for production use.
gr2
gr2 is the workspace layer for multi-repo work. One repository is just git; when a change spans repositories — a feature slice, a release, several agents touching several repos — gr2 gives you a workspace over them, isolated lanes to work in, and one grouped review/PR set for the slice. It is the Python successor to the Rust gr (1.x, called gr1 below); both ship from this repository, and gr2 is the command for the workspace and the slice.
Install
python3 -m venv ~/gr2-venv && source ~/gr2-venv/bin/activate
pip install --pre gitgrip # the PyPI package is "gitgrip"; the command is "gr2"
gr2 --version
--pre is required while 2.x is an alpha — without it pip installs 1.5.1, which is gr1. To run unreleased development code instead, install from a checkout: pip install -e gr2/ from the repository root.
The Rust gr (gr1, 1.x) installs with brew install synapt-dev/tap/gitgrip or cargo install gitgrip. The two do not collide; you can have both installed.
First five minutes
Every command below was run, in this order, in a clean virtualenv against a throwaway workspace of two repositories. Put two clones side by side in one folder, say ~/ws/repo-a and ~/ws/repo-b.
cd ~/ws
gr2 workspace init ~/ws # scans the folder; writes .grip/workspace_spec.toml
gr2 workspace materialize ~/ws --yes # builds the .grip layout and a default unit
gr2 workspace status ~/ws # what kind of workspace this is
gr2 store init ~/ws # the workspace snapshot store (needed before review)
A unit is one worker — you, or one agent — and default is created for you. A lane is one piece of work spanning repos, with its own clones, so two lanes never step on each other:
gr2 lane create ~/ws default feat-x --repos repo-a,repo-b --branch feat/x
gr2 lane enter ~/ws default feat-x --actor human:you
Both commands print, per repo, the absolute directory you work in:
repo-a: ~/ws/.grip/state/lanes/default/feat-x/repos/repo-a
repo-b: ~/ws/.grip/state/lanes/default/feat-x/repos/repo-b
Edit there — not in your original clones. Stage and commit across the lane's repos:
gr2 add . --repo-path ~/ws/.grip/state/lanes/default/feat-x/repos/repo-a
gr2 commit -m "my change" --workspace-root ~/ws --owner-unit default
commit with the lane flags commits every lane repo that has staged changes and names the repos it skipped. If every repo was skipped it exits non-zero with one sentence naming where it looked — and, when it can see them, where your staged changes actually are. Run one command across every lane repo, then turn the lane into one reviewable object:
gr2 exec run ~/ws default --actor human:you -- pytest -q # one command, every lane repo
gr2 review create-project ~/ws default feat-x # prints gr:<sha>: one object to review
gr2 lane current ~/ws default # where am I?
gr2 lane exit ~/ws default --actor human:you
exec run and lane exit require --actor. Every group and verb takes --help; gr2 --help lists them all.
What works today, and what is not there yet
Alpha 2 is a working local workspace layer. Verified by running the walk above:
workspace(init, materialize, status, migrate-gr1 from a gr1 gripspace),lane(create, enter, exit, current, lease),store(init, snapshot, log, diff, checkout),exec run,repo status,sync status,review create-project.- Lanes are independent clones: two lanes, or two agents, never share refs, an index, or a working tree.
- A lane commit that commits nothing anywhere refuses loudly instead of reporting success.
Not there yet:
- The full walk with remote PRs (
gr2 push,gr2 pr create) is documented in--helpbut was not exercised in a clean environment for this README; treat those two as alpha. gr2 --helpand some verb output still say "prototype" in places; the wording is being cleaned up as verbs land.- The Rust
gr(gr1) still ownsspawn,fleet, andmanifestuntil their gr2 ports land. Everything else — workspace sync, lanes, the multi-repo slice, its review — is gr2's job; if a verb is missing or wrong there, that is a bug worth reporting, not a reason to reach for gr1.
Commands
| Group | Verbs |
|---|---|
workspace |
init, init-from-topology, materialize, status, convert-clone, detect-gr1, migrate-gr1, migrate-lane-state, bootstrap-gr1 |
spec |
show, validate |
lane |
create, enter, exit, current, resolve, bind, lease |
| (top level) | branch, add, commit, push, prune |
sync |
status, run |
pr |
create, status, checks, merge |
review |
open, close, checkout-pr, run, requirements, bind, verify, rebind, create-project |
exec |
status, run |
repo |
status, hooks, hook-run, projection-run |
store |
init, snapshot, log, diff, checkout |
target, config, plan, apply |
stored PR target; config overlays; show/apply the materialization plan |
Overlay substrate
gr2 also carries the config-overlay substrate (capture, compose, and materialize configuration layers over a workspace): see docs/OVERLAY-SUBSTRATE.md.
Development
pip install -e "gr2[dev]" # from the repository root
cd gr2 && pytest # the gr2 suite (tests + overlay tests)
cd gr2 && ruff check . # lint, same config as CI
Release files for gitgrip 2.0.0a2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| gitgrip-2.0.0a2.tar.gz | 671.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| gitgrip-2.0.0a2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.0 MB
Release files / gitgrip-2.0.0a2.tar.gz
| Download URL | gitgrip-2.0.0a2.tar.gz |
|---|---|
| Size | 671.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
79fa71c47fa1108f47afe0f660943b6f33e151bfdc74f2c87bae7fae5920b9cd
|
|
BLAKE2b-256 checksum How to use checksums |
1c9ec89995938e860d42c2a7dba4788101349fe5d1f4ee8d2f022a688e2bac45
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 21, 2026.
Transparency logRelease files / gitgrip-2.0.0a2-py3-none-any.whl
| Download URL | gitgrip-2.0.0a2-py3-none-any.whl |
|---|---|
| Size | 365.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2345d44c3255a0dc4948356bde32aec6a5471e7dfce143664776d5169ebc28f2
|
|
BLAKE2b-256 checksum How to use checksums |
17af050911b64ca45b853d869dd80d92079c991f5506437b026202c234ea38f0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 21, 2026.
Transparency log