Every agent in its own copy, instantly
What you get
Every agent works in its own workspace with your current state: modified, staged and new files included. Your checkout, your HEAD and your Git index stay untouched. Many agents work in parallel on the same repository. Each one delivers a commit that you review and apply.
Before and after
You are working on serde and have three modified files and a new file PLAN.md, none of it committed. The task: A second agent should work with exactly this state, without writing into your checkout.
Without greppy
With Git you build the copy by hand: create a worktree, carry over the changes, find the new files and copy them.
$ git worktree add --detach ../agent-1
Preparing worktree (detached HEAD 7fc3b4c)
HEAD is now at 7fc3b4c Release 1.0.229
$ git diff HEAD | git -C ../agent-1 apply && git -C ../agent-1 status --short
M README.md
M serde/src/lib.rs
M serde_core/src/private/size_hint.rs
$ git ls-files --others --exclude-standard
PLAN.md
$ cp PLAN.md ../agent-1/ && git -C ../agent-1 status --short
M README.md
M serde/src/lib.rs
M serde_core/src/private/size_hint.rs
?? PLAN.md
You need four commands per agent before it starts. Its result lands as a branch in that worktree, which you merge and clean up yourself.
With greppy
greppy -p "TASK" creates the workspace itself. greppy index --agent-worktree creates the same workspace ahead of time and warms its index, so you see what the agent gets.
$ greppy index --agent-worktree
…
store mode: overlay (Base 61d1f6b54eac, reused)
…
indexed Delta generation 1: 4 changed/deleted paths, 9 private nodes (project: serde)
$ greppy workspace status
agent workspace ready (ordinary backend; provider inactive); 0 workspace(s), 378 chunks, 1575696 physical bytes
The workspace contains all four uncommitted paths and reuses the shared index; greppy indexes those four paths and nothing else.
| without greppy | with greppy | |
|---|---|---|
| Commands until the copy is ready | 4 | 0, greppy -p creates it |
| Uncommitted paths in the copy | 4 of 4, carried over by hand | 4 of 4, automatically |
| Index of the copy | none | shared Base, 4 paths in its own Delta |
| Result | branch in the worktree | commit under refs/greppy/agent/<run-id> |
How it works
greppy keeps the state of your repository in a block store: files in blocks of up to 1 MiB, addressed by their BLAKE3 hash, with the bookkeeping in SQLite in WAL mode. Every workspace gets your commit plus everything you have modified, staged or newly created; ignored files stay out. greppy stores new content and nothing else: another workspace with the same state created 0 new blocks, and one with one additional modified file created 6 new blocks totaling 54,340 bytes. The workspace shares Git objects with your repository for reading; index, refs and new commits stay private. With an active provider (FSKit on macOS, FUSE3 on Linux, set up with greppy workspace setup), greppy mounts the workspace copy-on-write. Without a provider it creates private directories, with the same flow and the same result. At the end there is a commit under refs/greppy/agent/<run-id>. Its parent is your state including uncommitted changes, so the commit contains exactly the agent's work. Once the commit is saved, greppy removes the workspace.
The commands
| Command | what it does |
|---|---|
greppy -p "TASK" |
starts the agent in its own workspace with your state; the result is a commit under refs/greppy/agent/<run-id> |
greppy index --agent-worktree |
creates the agent's workspace ahead of time and warms its index |
greppy workspace status |
workspaces, block store and provider at a glance |
greppy workspace setup |
sets up the copy-on-write provider |
git show refs/greppy/agent/<run-id> |
review the agent's commit |
greppy agent apply REF |
applies exactly the agent's changes; your Git index stays byte-identical |
git cherry-pick -n REF |
apply with plain Git |
More in the docs
- Built-in agent: workspace, sandbox, reviewing and applying the proposal
- Worktrees and shared indexes: how agent workspaces share the index