Skip to main content

Stacked PRs for GitHub — agent-first CLI for parallel development

Project description

ez

Agent-first version control. Stacked PRs, worktree isolation, zero friction.

License: MIT PyPI CI


ez makes version control invisible for AI coding agents. Four commands cover the entire development lifecycle. Multiple agents work on the same repo without stepping on each other.

Install

pip install ez-stack
ez setup --yes
ez init

The 4 Commands

ez create feat/auth              # Start: worktree + branch + cd
ez push -am "feat: add auth"     # Ship: stage + commit + push + PR
ez sync --autostash              # Sync: pull trunk, clean merged, restack
ez delete feat/auth --yes        # Done: remove worktree + branch

That's it. No git add, no git commit, no gh pr create, no cd.

Why ez?

For agents: Each ez create gives the agent an isolated worktree. Multiple agents work in parallel on the same repo without merge conflicts. Structured JSON output, mutation receipts, and exit codes let agents verify every operation.

For humans: Stacked PRs become effortless. Auto-restacking, auto-cleanup of merged branches, and a dashboard that shows everything at a glance.

Dashboard

ez list
     BRANCH                         PR       CI     AGE    PORT    STATUS
--------------------------------------------------------------------------------
     main (trunk)                   -        -      2m     -       -
  *  feat/auth                      #42      ✓      5m     14832   clean
     feat/api                       #43      ⏳     15m    11247   2M 1U
     feat/ui                        -        -      1h     16503   no worktree

Shows all local branches with PR status, CI pass/fail, time since last commit, deterministic dev port per worktree, and working tree state. Branches not tracked by ez still appear and are labeled not tracked. ez list --json for machine output.

Multi-Agent Workflow

# Agent 1 (terminal 1)
ez create feat/auth --from main
# ... works in .worktrees/feat-auth ...
ez push -am "feat: auth system"

# Agent 2 (terminal 2, same repo)
ez create feat/api --from main
# ... works in .worktrees/feat-api ...
ez push -am "feat: API routes"

# No conflicts. Each agent has its own worktree.

Stacked PRs

# Build a stack of dependent changes
ez create feat/auth-types
ez commit -m "add auth types"

ez create feat/auth-api          # stacks on auth-types
ez commit -m "add auth API"

ez submit                        # pushes all, creates PRs with correct bases

# After the first PR merges:
ez sync                          # cleans up, restacks remaining branches

Scope Guard

Keep an agent focused on the files a branch is supposed to touch:

ez create feat/auth --scope 'src/auth/**' --scope 'tests/auth/**'
ez scope show
ez scope add 'benches/auth/**'
ez scope set --mode strict 'src/auth/**' 'tests/auth/**'

With scope configured, ez commit and ez push -am check the staged file set before mutating git state. In warn mode they print drift and continue. In strict mode they stop.

Worktree Hooks

Create .ez/hooks/post-create/default.md to give agents setup instructions:

# Worktree Setup
1. `npm install`
2. `cp .env.example .env`
3. Start dev server on port $EZ_PORT

Hooks are markdown instructions, not scripts. ez prints them, the agent follows them. Use --hook <name> for project-specific hooks, or --hook alone to list available hooks.

All Commands

Flagship

Command Description
ez create <name> Create worktree + branch (default). --from main for independent work. --no-worktree for branch only.
ez list Dashboard for all local branches: PRs, CI, age, ports, and working tree state. --json for machine output.
ez delete [name] Delete branch + worktree. Auto-detects worktrees and best-effort stops listeners on the branch dev port. --yes for agents.
ez push Push + create/update PR. -am "msg" to stage+commit+push in one step. --no-pr skips PR updates, --pr overrides no_pr config.

Committing

Command Description
ez commit -m "msg" Commit the current staged set + restack children
ez commit -am "msg" Stage tracked files + commit
ez commit -m "msg" -- path1 path2 Stage specific files + commit
ez commit --if-changed No-op if nothing staged
ez amend Amend last commit + restack

Intended workflow:

  • Focused commit: ez commit -m "msg" -- path1 path2
  • Bulk update: ez commit -am "msg"
  • Partial hunks: git add -p then ez commit -m "msg"

Scope

Command Description
ez scope show Show the current branch's configured scope
ez scope add <pattern...> Append patterns to the current branch's scope
ez scope set <pattern...> Replace the current branch's scope
ez scope clear Remove scope configuration from the current branch

Syncing

Command Description
ez sync Fetch trunk, clean merged branches, restack
ez sync --autostash Stash before sync, restore after
ez sync --dry-run Preview what sync would do
ez restack Fetch trunk, refresh it locally, and rebase stale branches onto their latest parent tips

Navigation

Command Description
ez switch <name> Switch to branch (cd's to worktree if applicable)
ez switch <pr-number> Switch by PR number
ez up / ez down Navigate the stack
ez top / ez bottom Jump to stack endpoints

Inspection

Command Description
ez log Visual stack tree with PR status
ez log --json Stack as JSON
ez status Branch info + working tree state
ez status --json Branch info as JSON
ez diff Diff vs parent (what the PR reviewer sees)
ez diff --stat Diffstat summary
ez diff --name-only Changed file names
ez parent Print parent branch name to stdout

PRs

Command Description
ez submit Push entire stack + create/update all PRs
ez pr-link Print PR URL to stdout
ez pr-edit --title "..." --body "..." Edit PR metadata
ez draft / ez ready Toggle PR draft status
ez merge Merge bottom PR via GitHub
ez merge --yes Merge non-interactively for agents/scripts
ez merge --stack --yes Merge the current linear stack bottom-to-top

Setup

Command Description
ez init --yes Initialize ez and accept recommended non-interactive defaults
ez setup --yes Configure shell integration
ez config list/get/set View or update repo settings such as default_from, draft, no_pr, and rerere
ez skill install Install the ez-workflow skill for AI agents
ez update Update to latest version

Agent Integration

Install the skill so agents auto-discover ez:

ez skill install

This writes the canonical skill to .agents/skills/ez-workflow/SKILL.md, then creates compatibility symlinks for agent-specific skill roots such as .claude/skills/ez-workflow and .codex/skills/ez-workflow.

See SKILL.md for the full agent workflow, and reference.md for the complete command reference.

How It Works

  • Worktrees give each agent an isolated copy of the repo with its own branch
  • Stack metadata in .git/ez/stack.json tracks branch parents and PR numbers
  • Auto-restacking via git rebase --onto keeps children up to date when parents change
  • Mutation receipts (JSON on stderr) let agents verify every operation
  • Progressive helpez, ez <cmd>, ez <cmd> --help each give more detail

Prerequisites

  • git 2.38+
  • gh (GitHub CLI), authenticated via gh auth login
  • Python 3.8+ (for pip install) or download binaries from Releases

License

MIT. See LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

ez_stack-0.2.24-py3-none-manylinux_2_17_x86_64.whl (864.3 kB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ez_stack-0.2.24-py3-none-manylinux_2_17_aarch64.whl (803.3 kB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ez_stack-0.2.24-py3-none-macosx_11_0_arm64.whl (780.0 kB view details)

Uploaded Python 3macOS 11.0+ ARM64

ez_stack-0.2.24-py3-none-macosx_10_12_x86_64.whl (830.4 kB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file ez_stack-0.2.24-py3-none-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for ez_stack-0.2.24-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 a6dd2f8bb0610c3490529667833a88c14290f8ef0120e25c6e94fa60c0b34aec
MD5 ed7b78383afcf3f58cfe108221e2313a
BLAKE2b-256 2ad44be1fa2f1cc9f590859cf5b42bb66b9363c69143bf89b9a9588d4dd31fcb

See more details on using hashes here.

Provenance

The following attestation bundles were made for ez_stack-0.2.24-py3-none-manylinux_2_17_x86_64.whl:

Publisher: python-wheel.yml on rohoswagger/ez-stack

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ez_stack-0.2.24-py3-none-manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for ez_stack-0.2.24-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 0b60c913528d94b97166e2ccd3a88e3608b61fcd9a6d2297ac8ab77181688cd2
MD5 c1d0d28a120095b10f08a6d58023ea54
BLAKE2b-256 453346e7e126aa24076e5c4f13c86dba96b724229071be67343a9cfb9d492fd1

See more details on using hashes here.

Provenance

The following attestation bundles were made for ez_stack-0.2.24-py3-none-manylinux_2_17_aarch64.whl:

Publisher: python-wheel.yml on rohoswagger/ez-stack

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ez_stack-0.2.24-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ez_stack-0.2.24-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c4c36528e9e3c826f01b3d2feddcb9044e55c47959a64f5bb47a04761df48662
MD5 3499f833e9b30332eee32f945d928035
BLAKE2b-256 9454e74c2e3a97d60eae7ca04b9d1185f2285b9b7f7eb87c32544410d28b5d3a

See more details on using hashes here.

Provenance

The following attestation bundles were made for ez_stack-0.2.24-py3-none-macosx_11_0_arm64.whl:

Publisher: python-wheel.yml on rohoswagger/ez-stack

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ez_stack-0.2.24-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for ez_stack-0.2.24-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 80ac25acf46af788a5c986d24790a803a79cfe56d2d56763f7205a1255d38497
MD5 26cac15a37b789aaf877e992829b1ac7
BLAKE2b-256 66673bc845f750883ce05eaef918c95ca59923f806459e2441f1c050f3b6060a

See more details on using hashes here.

Provenance

The following attestation bundles were made for ez_stack-0.2.24-py3-none-macosx_10_12_x86_64.whl:

Publisher: python-wheel.yml on rohoswagger/ez-stack

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page