Scott Watermasysk presents

Stooges

Git Workspaces, the Smart Way

Multiple independent copies of your repository—with near-zero disk overhead. No stashing. No conflicts. No nonsense.

✽ ✽ ✽

Starring

Larry

Larry

Workspace One

Curly

Curly

Workspace Two

Moe

Moe

Workspace Three

The Picture

You run an AI coding agent in one workspace. A long test suite in another. A hotfix in a third. Each one a fully independent clone of your repository—its own .git, its own index, its own branch.

And thanks to copy-on-write magic, they share disk blocks with the original. Extra space? Only as files diverge. It's practically free.

Method Disk Cost Independent? Tooling
Plain Copies Full duplicate Yes None
Git Worktrees Shared .git No — shared index & locks Built-in
Stooges Copy-on-write Yes Full CLI

Feature Presentation

Copy-on-Write

Workspaces share disk blocks with the original. Extra space used only as files diverge. Near-zero overhead.

Fully Independent

Each workspace has its own .git directory. No shared lock files. No index conflicts. True isolation.

Sync & Rebase

Keep all workspaces current with one command. Automatic conflict-free rebasing across every branch.

Built for Agents

Run multiple AI coding agents in parallel, each in its own isolated workspace. No stepping on toes.

A Typical Scene

Initialize Once

$ stooges init

Sets up the base repo & creates Larry, Curly, and Moe.

Add a Workspace

$ stooges add feature-x -b

Creates a new workspace with its own branch. Base-derived add (except --track) and branch runs sync first by default. Or use stooges branch scott/aud-656, stooges fork scott/aud-656, or stooges track feature/x to derive the workspace name automatically.

Work Independently

$ cd feature-x && git commit -am "ship it"

Or enable the optional shell wrapper and stooges add, stooges branch, stooges fork, or stooges track can drop you in automatically.

Keep Everything Current

$ stooges rebase

Syncs base, rebases all workspace branches. Done.

The Full Repertoire

Branch Example

$ stooges branch scott/aud-656

Derives workspace aud-656 and creates or switches local branch scott/aud-656.

Fork Example

$ cd larry && stooges fork scott/aud-656

Copies the current managed workspace state into aud-656 and creates local branch scott/aud-656; errors if that branch already exists in the copied workspace.

Track Example

$ stooges track feature/foo

Derives workspace foo and checks out a local branch tracking origin/feature/foo; errors if the remote branch is missing or the destination local branch already exists.

stooges init Set up base repo & default workspaces
stooges add Create new workspaces with optional branches; base-derived runs sync first by default except --track
stooges branch Create a workspace from a branch name; syncs base first by default
stooges fork Copy the current workspace into a new branched workspace
stooges track Create a tracked workspace from a remote branch name
stooges sync Fetch & fast-forward the base repo
stooges rebase Sync base, then rebase all workspace branches
stooges clean Sync & prune stale remote-tracking refs
stooges list Show all workspaces with branch & status
stooges doctor Check platform support & workspace health
stooges shell-init Optional shell wrapper for auto-cd after add/branch/fork/track
stooges upgrade Install the latest GitHub release over this binary
stooges lock/unlock Toggle read-only protection on base repo
✽ ✽ ✽

Now Showing

Get the Picture

$ curl -sSL https://raw.githubusercontent.com/scottwater/stooges/main/install.sh | bash

or, with Go—

$ go install github.com/scottwater/stooges/cmd/stooges@latest

Already installed? Run stooges upgrade to grab the latest release.

Optional: enable auto-cd after stooges add, stooges branch, stooges fork, or stooges track by adding this to your shell profile:

$ eval "$(stooges shell-init zsh)"

Use bash instead of zsh if needed. This setup is optional; without it, Stooges works normally and you can just cd into the workspace yourself.


View on GitHub
Copied to clipboard