Minimal, agent-first CLI for managing stacked PRs with DAG dependencies on GitHub.
Single binary. Zero config.
Homebrew (macOS/Linux):
brew install nvandessel/frond/frondBinary download: grab the latest from GitHub Releases.
From source:
go install github.com/nvandessel/frond@latestRequires git and gh (authenticated).
frond completion bash > /etc/bash_completion.d/frond # bash (Linux)
frond completion zsh > "${fpath[1]}/_frond" # zsh
frond completion fish > ~/.config/fish/completions/frond.fish # fishfrond new feature/auth # create tracked branch
frond new auth/login --on feature/auth # child branch
frond new auth/e2e --on feature/auth --after auth/login # with dependency
frond push -t "Login flow" # push + create PR
frond status # show dependency graph
frond sync # fetch, cleanup merged, rebasemain
├── feature/auth #42
│ ├── auth/login #43 [ready]
│ ├── auth/signup #44 [ready]
│ └── auth/e2e (not pushed) [blocked: auth/login, auth/signup]
| Command | Description |
|---|---|
frond new <name> [--on <parent>] [--after <deps>] |
Create tracked branch |
frond push [-t title] [-b body] [--draft] |
Push + create/update PR |
frond sync |
Fetch, detect merges, reparent, rebase |
frond status [--json] [--fetch] |
Show dependency graph |
frond track <branch> --on <parent> [--after <deps>] |
Track existing branch |
frond untrack [<branch>] |
Remove from tracking |
--json on every command. Exit codes: 0 success, 1 error, 2 conflict.
--on creates the git/PR hierarchy (deep stacking). --after creates logical dependencies (wide fan-out). Combine both for real-world use:
frond new feature/payments --on main
frond new pay/stripe-client --on feature/payments
frond new pay/stripe-tests --on pay/stripe-client # deep: stacks on stripe-client
frond new pay/db-schema --on feature/payments
frond new pay/db-migrations --on pay/db-schema # deep: stacks on db-schema
frond new pay/api-handlers --on feature/payments --after pay/stripe-client,pay/db-schema # wide: fan-out deps
frond new pay/e2e --on feature/payments --after pay/api-handlers,pay/stripe-tests,pay/db-migrationsmain
└── feature/payments PR → main
├── pay/stripe-client PR → feature/payments [ready]
│ └── pay/stripe-tests PR → pay/stripe-client [ready]
├── pay/db-schema PR → feature/payments [ready]
│ └── pay/db-migrations PR → pay/db-schema [ready]
├── pay/api-handlers PR → feature/payments [blocked: stripe-client, db-schema]
└── pay/e2e PR → feature/payments [blocked: api-handlers, stripe-tests, db-migrations]
When pay/stripe-client merges, frond sync reparents pay/stripe-tests, unblocks pay/api-handlers, and rebases what's ready.
--onsets the git parent (PR base). One per branch.--aftersets logical dependencies (merge ordering). Zero or more.- These are orthogonal —
--onfor PR targeting,--afterfor merge ordering. - State lives at
<git-common-dir>/frond.json— shared across worktrees, invisible to the working tree.