https://github.com/nvandessel/frond
Agent-first CLI for managing stacked PRs with DAG dependencies on GitHub.
https://github.com/nvandessel/frond
cli dag developer-tools git github golang pull-requests stacked-prs
Last synced: 2 months ago
JSON representation
Agent-first CLI for managing stacked PRs with DAG dependencies on GitHub.
- Host: GitHub
- URL: https://github.com/nvandessel/frond
- Owner: nvandessel
- License: apache-2.0
- Created: 2026-02-23T17:49:41.000Z (2 months ago)
- Default Branch: main
- Last Pushed: 2026-03-01T03:35:58.000Z (2 months ago)
- Last Synced: 2026-03-01T04:27:33.891Z (2 months ago)
- Topics: cli, dag, developer-tools, git, github, golang, pull-requests, stacked-prs
- Language: Go
- Homepage:
- Size: 201 KB
- Stars: 4
- Watchers: 0
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
- Security: SECURITY.md
- Agents: AGENTS.md
Awesome Lists containing this project
README
# frond 🌴
[](https://github.com/nvandessel/frond/actions/workflows/ci.yml)
[](https://codecov.io/gh/nvandessel/frond)
[](https://goreportcard.com/report/github.com/nvandessel/frond)
[](https://github.com/nvandessel/frond/releases/latest)
Minimal, agent-first CLI for managing stacked PRs with DAG dependencies on GitHub.
Single binary. Zero config.
## Install
**Homebrew** (macOS/Linux):
```bash
brew install nvandessel/frond/frond
```
**Binary download**: grab the latest from [GitHub Releases](https://github.com/nvandessel/frond/releases/latest).
**From source**:
```bash
go install github.com/nvandessel/frond@latest
```
Requires [git](https://git-scm.com/) and [gh](https://cli.github.com/) (authenticated).
### Shell completions
```bash
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 # fish
```
## Usage
```bash
frond 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, rebase
```
```
main
├── feature/auth #42
│ ├── auth/login #43 [ready]
│ ├── auth/signup #44 [ready]
│ └── auth/e2e (not pushed) [blocked: auth/login, auth/signup]
```
## Commands
| Command | Description |
|---------|-------------|
| `frond new [--on ] [--after ]` | 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 --on [--after ]` | Track existing branch |
| `frond untrack []` | Remove from tracking |
`--json` on every command. Exit codes: 0 success, 1 error, 2 conflict.
## Stacking patterns
`--on` creates the git/PR hierarchy (deep stacking). `--after` creates logical dependencies (wide fan-out). Combine both for real-world use:
```bash
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-migrations
```
```
main
└── 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.
## Key concepts
- **`--on`** sets the git parent (PR base). One per branch.
- **`--after`** sets logical dependencies (merge ordering). Zero or more.
- These are orthogonal — `--on` for PR targeting, `--after` for merge ordering.
- State lives at `/frond.json` — shared across worktrees, invisible to the working tree.