Feature Highlights
stax merge- Cascade-merge your stack from bottom -> current with CI/rebase-aware safety checks.stax generate --pr-body- Generate polished PR descriptions with AI from your branch diff and context.stax standup- Get a quick summary of recent PRs, pushes, and activity for daily standups.stax ss- Submit or update the full PR stack with correct parent/child base relationships.stax rs --restack- Sync trunk and restack descendants so your branch tree stays clean and current.Interactive TUI- Browse your stack tree, PR status, diffs, and reorder branches visually.stax undo/stax redo- Recover safely from restacks and rebases with transactional history snapshots.
What are Stacked Branches?
Instead of one massive PR with 50 files, stacked branches let you split work into small, reviewable pieces that build on each other (and visualize it as a tree).
Why this is great:
- Smaller reviews - Each PR is focused, so reviewers move faster and catch more issues
- Parallel progress - Keep building on top while lower PRs are still in review
- Safer shipping - Merge foundations first; reduce the risk of “one giant PR” landing at once
- Cleaner history - Each logical change lands independently (easier to understand, revert, and
git blame)
◉ feature/auth-ui 1↑
○ feature/auth-api 1↑
○ main
Each branch is a focused PR. Reviewers see small diffs. You ship faster.
Why stax?
stax is a modern stacked-branch workflow that keeps PRs small, rebases safe, and the whole stack easy to reason about.
- Blazing fast - Native Rust binary (~22ms
stax lson a 10-branch stack) - Terminal UX - Interactive TUI with tree view, PR status, diff viewer, and reorder mode
- Ship stacks, not mega-PRs - Submit/update a whole stack of PRs with correct bases in one command
- Safe history rewriting - Transactional restacks + automatic backups +
stax undo/stax redo - Merge the stack for you - Cascade merge bottom → current, with rebase/PR-base updates along the way
- Drop-in compatible - Uses freephite metadata format—existing stacks migrate instantly
Install
# Homebrew (macOS/Linux)
# Or with cargo binstall
Both stax and st (short alias) are installed automatically. All examples below use stax, but st works identically.
Full Documentation
- Live docs: https://cesarferreira.github.io/stax/
- Source docs index: docs/index.md
Run docs locally with uv:
Quick Start
Set up GitHub auth first (required for PR creation, CI checks, and review metadata):
# Option A (recommended): use GitHub CLI auth
# Option B: enter a personal access token manually
# Option C: provide a stax-specific env var
By default, stax does not use ambient GITHUB_TOKEN unless you opt in via [auth].allow_github_token_env = true in config.
# 1. Create stacked branches
# 2. View your stack
# ◉ auth-ui 1↑ ← you are here
# ○ auth-api 1↑
# ○ main
# 3. Submit PRs for the whole stack
# Creating PR for auth-api... ✓ #12 (targets main)
# Creating PR for auth-ui... ✓ #13 (targets auth-api)
# 4. After reviews, sync and rebase
Core Commands
| Command | What it does |
|---|---|
stax |
Launch interactive TUI |
stax ls |
Show your stack with PR status and what needs rebasing |
stax ll |
Show stack with PR URLs and full details |
stax create <name> |
Create a new branch stacked on current |
stax ss |
Submit stack - push all branches and create/update PRs |
stax merge |
Merge PRs from bottom of stack up to current branch |
stax rs |
Repo sync - pull trunk, clean up merged branches |
stax rs --restack |
Sync and rebase all branches onto updated trunk |
stax restack |
Restack current stack (ancestors + current + descendants) |
stax restack --auto-stash-pop |
Restack even when target worktrees are dirty (auto-stash/pop) |
stax rs --restack --auto-stash-pop |
Sync, restack, auto-stash/pop dirty worktrees |
stax cascade |
Restack from bottom, push, and create/update PRs |
stax cascade --no-pr |
Restack and push (skip PR creation/updates) |
stax cascade --no-submit |
Restack only (no remote interaction) |
stax cascade --auto-stash-pop |
Cascade even when target worktrees are dirty (auto-stash/pop) |
stax co |
Interactive branch checkout with fuzzy search |
stax u / stax d |
Move up/down the stack |
stax m |
Modify - stage all changes and amend current commit |
stax pr |
Open current branch's PR in browser |
stax open |
Open repository in browser |
stax copy |
Copy branch name to clipboard |
stax copy --pr |
Copy PR URL to clipboard |
stax standup |
Show your recent activity for standups |
stax changelog |
Generate changelog between two refs |
stax undo |
Undo last operation (restack, submit, etc.) |
Interactive Branch Creation
Run stax create without arguments to launch the guided wizard:
)
)
)
)
AI-Powered PR Body Generation
Generate a PR description using AI, based on your diff, commit messages, and the repo's PR template:
stax collects the diff, commit messages, and PR template for the current branch, sends them to an AI agent (Claude, Codex, Gemini CLI, or OpenCode), and updates the PR body on GitHub.
Prerequisites:
- Current branch must be tracked by stax
- Current branch must already have a PR (create one with
stax submit/stax ss)
You can also generate during submit:
First Run
If no AI agent is configured, stax auto-detects what's installed and walks you through setup:
? Select AI agent:
> claude (default)
codex
gemini
opencode
? Select model for claude:
> claude-sonnet-4-5-20250929 — Sonnet 4.5 (default, balanced)
claude-haiku-4-5-20251001 — Haiku 4.5 (fastest, cheapest)
claude-opus-4-6 — Opus 4.6 (most capable)
? Save choices to config? (Y/n): Y
✓ Saved ai.agent = "claude", ai.model = "claude-sonnet-4-5-20250929"
Options
--agent <name>: Override the configured agent for this invocation (claude,codex,gemini,opencode)--model <name>: Override the model (e.g.,claude-haiku-4-5-20251001,gpt-4.1-mini,gemini-2.5-flash)--edit: Open $EDITOR to review/tweak the generated body before updating the PR
Interactive TUI
Run stax with no arguments to launch the interactive terminal UI:
TUI Features:
- Visual stack tree with PR status, sync indicators, and commit counts
- Full diff viewer for each branch
- Keyboard-driven: checkout, restack, submit PRs, create/rename/delete branches
- Reorder mode: Rearrange branches in your stack with
othenShift+↑/↓
| Key | Action |
|---|---|
j/k or ↑/↓ |
Navigate branches |
Enter |
Checkout branch |
r |
Restack selected branch |
R (Shift+r) |
Restack all branches in stack |
s |
Submit stack |
p |
Open selected branch PR |
o |
Enter reorder mode (reparent branches) |
n |
Create new branch |
e |
Rename current branch |
d |
Delete branch |
/ |
Search/filter branches |
Tab |
Toggle focus between stack and diff panes |
? |
Show all keybindings |
q/Esc |
Quit |
Reorder Mode
Rearrange branches within your stack without manually running reparent commands:
- Select a branch and press
oto enter reorder mode - Use
Shift+↑/↓to move the branch up or down in the stack - Preview shows which reparent operations will happen
- Press
Enterto apply changes and automatically restack
Split Mode
Split a branch with many commits into multiple stacked branches:
How it works:
- Run
stax spliton a branch with multiple commits - Navigate commits with
j/kor arrows - Press
sto mark a split point and enter a branch name - Preview shows the resulting branch structure in real-time
- Press
Enterto execute - new branches are created with proper metadata
| Key | Action |
|---|---|
j/k or ↑/↓ |
Navigate commits |
s |
Mark split point at cursor (enter branch name) |
d |
Remove split point at cursor |
S-J/K |
Move split point down/up |
Enter |
Execute split |
? |
Show help |
q/Esc |
Cancel and quit |
Example: You have a branch with commits A→B→C→D→E. Mark splits after B ("part1") and D ("part2"):
Before: After:
main main
└─ my-feature (A-E) └─ part1 (A, B)
└─ part2 (C, D)
└─ my-feature (E)
Split uses the transaction system, so you can stax undo if needed.
Standup Summary
Struggling to remember what you worked on yesterday? Run stax standup to get a quick summary of your recent activity:

Shows your merged PRs, opened PRs, recent pushes, and anything that needs attention - perfect for daily standups.
Changelog Generation
Generate a pretty changelog between two git refs - perfect for release notes or understanding what changed between versions:
Example output:
Changelog: v1.0.0 → HEAD (5 commits)
──────────────────────────────────────────────────
abc1234 #42 feat: implement user auth (@johndoe)
def5678 #38 fix: resolve cache issue (@janesmith)
ghi9012 chore: update deps (@bob)
Monorepo Support
Working in a monorepo? Filter commits to only those touching a specific folder:
This shows only commits that modified files within that path - ideal for generating changelogs for individual packages or services.
JSON Output
For scripting or CI pipelines:
PR numbers are automatically extracted from commit messages (GitHub's squash merge format: (#123)).
Multi-Worktree Support
stax is worktree-aware. When you have branches checked out across multiple worktrees, restack, sync, and cascade all work correctly without requiring you to switch worktrees manually.
How it works
- Restack / upstack restack / sync
--restack: When a branch to be rebased is checked out in another worktree, stax runsgit rebaseinside that worktree instead of checking it out in the current one. - Merged middle branches (including squash merges): When sync reparents children off a merged branch, stax preserves the old-base boundary and uses
git rebase --ontoso child branches replay only novel commits instead of replaying already-integrated parent history. - Cascade: Before restacking, stax fetches from remote and fast-forwards your local trunk — even if trunk is checked out in a different worktree. This prevents rebasing onto a stale local trunk, which would cause PRs to include commits already merged to remote.
- Sync trunk update: If trunk is checked out in another worktree, stax pulls it there directly.
Dirty worktrees
By default, stax fails fast if a target worktree has uncommitted changes, showing you the branch name and worktree path.
Use --auto-stash-pop to let stax stash changes automatically before rebasing and restore them afterward:
If the rebase results in a conflict, the stash is kept intact so your changes are not lost. Run git stash list to find them.
Cascade flags
| Command | Behavior |
|---|---|
stax cascade |
restack → push → create/update PRs |
stax cascade --no-pr |
restack → push (skip PR creation/updates) |
stax cascade --no-submit |
restack only (no remote interaction) |
stax cascade --auto-stash-pop |
any of the above, auto-stash/pop dirty worktrees |
Use --no-pr when your remote branches should be updated (pushed) but you aren't ready to open or update PRs yet — e.g. branches still in progress. Use --no-submit for a pure local restack with no network activity at all. Use --auto-stash-pop if any branch in the stack is checked out in a dirty worktree.
Tip: run
stax rsbeforestax cascadeto pull the latest trunk and avoid rebasing onto stale commits. If your local trunk is behind remote,stax cascadewill warn you.
Safe History Rewriting with Undo
Stax makes rebasing and force-pushing safe with automatic backups and one-command recovery:
# Make a mistake while restacking? No problem.
# ✗ conflict in feature/auth
# Your repo is recoverable via: stax undo
# Instantly restore to before the restack
# ✓ Undone! Restored 3 branch(es).
How It Works
Every potentially-destructive operation (restack, submit, sync --restack, TUI reorder) is transactional:
- Snapshot - Before touching anything, stax records the current commit SHA of each affected branch
- Backup refs - Creates Git refs at
refs/stax/backups/<op-id>/<branch>pointing to original commits - Execute - Performs the operation (rebase, force-push, etc.)
- Receipt - Saves an operation receipt to
.git/stax/ops/<op-id>.json
If anything goes wrong, stax undo reads the receipt and restores all branches to their exact prior state.
Undo & Redo Commands
| Command | Description |
|---|---|
stax undo |
Undo the last operation |
stax undo <op-id> |
Undo a specific operation |
stax redo |
Redo (re-apply) the last undone operation |
Flags:
--yes- Auto-approve prompts (useful for scripts)--no-push- Only restore local branches, don't touch remote
Remote Recovery
If the undone operation had force-pushed branches, stax will prompt:
# ✓ Restored 2 local branch(es)
# This operation force-pushed 2 branch(es) to remote.
# Force-push to restore remote branches too? [y/N]
Use --yes to auto-approve or --no-push to skip remote restoration.
Real-World Example
You're building a payments feature. Instead of one 2000-line PR:
# Start the foundation
# ... write database models, commit ...
# Stack the API layer on top
# ... write API endpoints, commit ...
# Stack the UI on top of that
# ... write React components, commit ...
# View your stack
# ◉ payments-ui 1↑ ← you are here
# ○ payments-api 1↑
# ○ payments-models 1↑
# ○ main
# Submit all 3 as separate PRs (each targeting its parent)
# Creating PR for payments-models... ✓ #101 (targets main)
# Creating PR for payments-api... ✓ #102 (targets payments-models)
# Creating PR for payments-ui... ✓ #103 (targets payments-api)
Reviewers can now review 3 small PRs instead of one giant one. When payments-models is approved and merged:
# ✓ Pulled latest main
# ✓ Cleaned up payments-models (merged)
# ✓ Rebased payments-api onto main
# ✓ Rebased payments-ui onto payments-api
# ✓ Updated PR #102 to target main
Cascade Stack Merge
Merge your entire stack with one command! stax merge intelligently merges PRs from the bottom of your stack up to your current branch, handling rebases and PR updates automatically.
How It Works
Stack: main ← PR-A ← PR-B ← PR-C ← PR-D
Position │ What gets merged
────────────────┼─────────────────────────────
On PR-A │ Just PR-A (1 PR)
On PR-B │ PR-A, then PR-B (2 PRs)
On PR-C │ PR-A → PR-B → PR-C (3 PRs)
On PR-D (top) │ Entire stack (4 PRs)
The merge scope depends on your current branch:
- Bottom of stack: Merges just that one PR
- Middle of stack: Merges all PRs from bottom up to current
- Top of stack: Merges the entire stack
Example Usage
# View your stack
# ◉ payments-ui 1↑ ← you are here
# ○ payments-api 1↑
# ○ payments-models 1↑
# ○ main
# Merge all 3 PRs into main
You'll see an interactive preview before merging:
╭──────────────────────────────────────────────────────╮
│ Stack Merge │
╰──────────────────────────────────────────────────────╯
You are on: payments-ui (PR #103)
This will merge 3 PRs from bottom → current:
┌─────────────────────────────────────────────────┐
│ 1. payments-models (#101) ✓ Ready │
│ ├─ CI: ✓ passed │
│ ├─ Reviews: ✓ 2/2 approved │
│ └─ Merges into: main │
├─────────────────────────────────────────────────┤
│ 2. payments-api (#102) ✓ Ready │
│ ├─ CI: ✓ passed │
│ ├─ Reviews: ✓ 1/1 approved │
│ └─ Merges into: main (after rebase) │
├─────────────────────────────────────────────────┤
│ 3. payments-ui (#103) ✓ Ready │ ← you are here
│ ├─ CI: ✓ passed │
│ ├─ Reviews: ✓ 1/1 approved │
│ └─ Merges into: main (after rebase) │
└─────────────────────────────────────────────────┘
Merge method: squash (change with --method)
? Proceed with merge? [y/N]
What Happens During Merge
For each PR in the stack (bottom to top):
- Wait for CI - Polls until CI passes (or use
--no-waitto skip) - Merge - Merges the PR using your chosen method (squash/merge/rebase)
- Rebase next - Rebases the next PR onto updated main
- Update PR base - Changes the next PR's target from the merged branch to main
- Push - Force-pushes the rebased branch
- Repeat - Continues until all PRs are merged
If anything fails (CI, conflicts, permissions), the merge stops safely. Already-merged PRs remain merged, and you can fix the issue and run stax merge again to continue.
Merge Options
# Merge with preview only (no actual merge)
# Merge entire stack regardless of current position
# Choose merge strategy
# Skip CI polling (fail if not ready)
# Keep branches after merge (don't delete)
# Set custom CI timeout (default: 30 minutes)
# Skip confirmation prompt
Partial Stack Merge
You can merge just part of your stack by checking out a middle branch:
# Stack: main ← auth ← auth-api ← auth-ui ← auth-tests
# This merges only: auth, auth-api (not auth-ui or auth-tests)
# Remaining branches (auth-ui, auth-tests) are rebased onto main
# Run stax merge again later to merge those too
Import Your Open PRs
Already have open PRs on GitHub that aren't tracked by stax? Import them all at once:
This command:
- Fetches all your open PRs from GitHub
- Downloads any missing branches from remote
- Sets up tracking with the correct parent (based on each PR's target branch)
- Stores PR metadata for each branch
Perfect for onboarding an existing repository or after cloning a fresh copy.
Working with Multiple Stacks
You can have multiple independent stacks at once:
# You're working on auth...
# Teammate needs urgent bugfix reviewed - start a new stack
# View everything
# ○ auth-validation 1↑
# ○ auth-login 1↑
# ○ auth 1↑
# │ ◉ hotfix-payment 1↑ ← you are here
# ○─┘ main
Navigation
| Command | What it does |
|---|---|
stax u |
Move up to child branch |
stax d |
Move down to parent branch |
stax u 3 |
Move up 3 branches |
stax top |
Jump to tip of current stack |
stax bottom |
Jump to base of stack (first branch above trunk) |
stax t |
Jump to trunk (main/master) |
stax prev |
Toggle to previous branch (like git checkout -) |
stax co |
Interactive picker with fuzzy search |
Reading the Stack View
○ feature/validation 1↑
◉ feature/auth 1↓ 2↑ ⟳
│ ○ ☁ feature/payments PR #42
○─┘ ☁ main
| Symbol | Meaning |
|---|---|
◉ |
Current branch |
○ |
Other branch |
☁ |
Has remote tracking |
1↑ |
1 commit ahead of parent |
1↓ |
1 commit behind parent |
⟳ |
Needs restacking (parent changed) |
PR #42 |
Has open PR |
Configuration
Config at ~/.config/stax/config.toml:
# ~/.config/stax/config.toml
# Created automatically on first run with these defaults:
[]
= "%m-%d"
= "-"
[]
= "origin"
= "https://github.com"
[]
= true
[]
= true
= false
[]
# agent = "claude" # or: "codex" / "gemini" / "opencode"
# model = "claude-sonnet-4-5-20250929"
# Common overrides you can enable later:
# [branch]
# format = "{user}/{date}/{message}"
# user = "cesar"
#
# [remote]
# api_base_url = "https://github.company.com/api/v3"
#
# [auth]
# gh_hostname = "github.company.com"
Branch Name Format
Use format to template branch names with {user}, {date}, and {message} placeholders:
[]
= "{user}/{date}/{message}" # "cesar/02-11/add-login"
= "cesar" # Optional: defaults to git config user.name
= "%m-%d" # Optional: chrono strftime (default: "%m-%d")
Empty placeholders are cleaned up automatically.
GitHub Authentication
stax looks for a GitHub token in the following order (first found wins):
STAX_GITHUB_TOKENenvironment variable- Credentials file (
~/.config/stax/.credentials) gh auth token(whenauth.use_gh_cli = true, default)GITHUB_TOKENenvironment variable (only whenauth.allow_github_token_env = true)
# Option 1: stax-specific env var (highest priority)
# Option 2: Interactive setup (saves to credentials file)
# Option 3: Import from GitHub CLI auth (saves to credentials file)
To use GITHUB_TOKEN as a fallback, opt in explicitly:
[]
= true
The credentials file is created with 600 permissions (read/write for owner only).
Check which source stax is actively using:
Claude Code Integration
Teach Claude Code how to use stax by installing the skills file:
# Create skills directory if it doesn't exist
# Download the stax skills file
This enables Claude Code to help you with stax workflows, create stacked branches, submit PRs, and more.
Codex Integration
Teach Codex how to use stax by installing the skill file into your Codex skills directory:
# Create skills directory if it doesn't exist
# Download the stax skill file
This enables Codex to help you with stax workflows, create stacked branches, submit PRs, and more.
Gemini CLI Integration
Teach Gemini CLI how to use stax by installing this repo's skill content as GEMINI.md in your project:
# From the stax repo root
Gemini CLI loads project instructions from GEMINI.md, so this gives it stack-aware workflow guidance for branch creation, submit flows, and related operations.
OpenCode Integration
Teach OpenCode how to use stax by installing the skill file in OpenCode's skills directory:
This enables OpenCode to help with stax workflows, stack operations, and PR generation.
Freephite/Graphite Compatibility
stax uses the same metadata format as freephite and supports similar commands:
| freephite | stax | graphite | stax |
|---|---|---|---|
fp ss |
stax ss |
gt submit |
stax submit |
fp bs |
stax branch submit |
gt branch submit |
stax branch submit |
fp us submit |
stax upstack submit |
gt upstack submit |
stax upstack submit |
fp ds submit |
stax downstack submit |
gt downstack submit |
stax downstack submit |
fp rs |
stax rs |
gt sync |
stax sync |
fp bc |
stax bc |
gt create |
stax create |
fp bco |
stax bco |
gt checkout |
stax co |
fp bu |
stax bu |
gt up |
stax u |
fp bd |
stax bd |
gt down |
stax d |
fp ls |
stax ls |
gt log |
stax log |
Migration is instant - just install stax and your existing stacks work.
PR Templates
stax automatically discovers PR templates in your repository:
Single Template
If you have one template at .github/PULL_REQUEST_TEMPLATE.md, stax uses it automatically:
Multiple Templates
Place templates in .github/PULL_REQUEST_TEMPLATE/ directory:
.github/
└── PULL_REQUEST_TEMPLATE/
├── feature.md
├── bugfix.md
└── docs.md
stax shows an interactive fuzzy-search picker:
# ? Select PR template
# > No template
# bugfix
# feature
# docs
Template Control Flags
--template <name>: Skip picker, use specific template--no-template: Don't use any template--edit: Always open $EDITOR for body (regardless of template)
All Commands
Stack Operations
| Command | Alias | Description |
|---|---|---|
stax status |
s, ls |
Show stack (simple view) |
stax ll |
Show stack with PR URLs and full details | |
stax log |
l |
Show stack with commits and PR info |
stax submit |
ss |
Submit full current stack (ancestors + current + descendants) |
stax merge |
Merge PRs from bottom of stack to current | |
stax sync |
rs |
Pull trunk, delete merged branches |
stax restack |
Restack current stack (ancestors + current + descendants) | |
stax diff |
Show diffs for each branch vs parent | |
stax range-diff |
Show range-diff for branches needing restack |
Branch Management
| Command | Alias | Description |
|---|---|---|
stax create <name> |
c, bc |
Create stacked branch |
stax checkout |
co, bco |
Interactive branch picker |
stax modify |
m |
Stage all + amend current commit |
stax rename |
b r |
Rename branch and optionally edit commit message |
stax branch track |
Track an existing branch | |
stax branch track --all-prs |
Track all your open PRs | |
stax branch untrack |
ut |
Remove stax metadata for a branch (keep git branch) |
stax branch reparent |
Change parent of a branch | |
stax branch submit |
bs |
Submit only current branch |
stax branch delete |
Delete a branch | |
stax branch fold |
Fold branch into parent | |
stax branch squash |
Squash commits on branch | |
stax upstack restack |
Restack current branch + descendants | |
stax upstack submit |
Submit current branch + descendants | |
stax downstack get |
Show branches below current | |
stax downstack submit |
Submit ancestors + current branch |
Navigation
| Command | Alias | Description |
|---|---|---|
stax up [n] |
u, bu |
Move up n branches |
stax down [n] |
d, bd |
Move down n branches |
stax top |
Move to stack tip | |
stax bottom |
Move to stack base | |
stax trunk |
t |
Switch to trunk |
stax prev |
p |
Toggle to previous branch |
Interactive
| Command | Description |
|---|---|
stax |
Launch interactive TUI |
stax split |
Interactive TUI to split branch into multiple stacked branches |
Recovery
| Command | Description |
|---|---|
stax undo |
Undo last operation (restack, submit, etc.) |
stax undo <op-id> |
Undo a specific operation by ID |
stax redo |
Re-apply the last undone operation |
Utilities
| Command | Description |
|---|---|
stax auth |
Set GitHub token (--from-gh supported) |
stax auth status |
Show active GitHub auth source and resolution order |
stax config |
Show configuration |
stax doctor |
Check repo health |
stax continue |
Continue after resolving conflicts |
stax pr |
Open PR in browser |
stax open |
Open repository in browser |
stax ci |
Show CI status for current branch (full table with ETA) |
stax ci --stack |
Show CI status for all branches in current stack |
stax ci --all |
Show CI status for all tracked branches |
stax ci --watch |
Watch CI until completion (polls every 15s, records history) |
stax ci --watch --interval 30 |
Watch with custom polling interval in seconds |
stax ci --verbose |
Compact summary cards instead of full per-check table |
stax ci --json |
Output CI status as JSON |
stax copy |
Copy branch name to clipboard |
stax copy --pr |
Copy PR URL to clipboard |
stax comments |
Show PR comments with rendered markdown |
stax comments --plain |
Show PR comments as raw markdown |
stax standup |
Show your recent activity for standups |
stax standup --hours 48 |
Look back 48 hours instead of default 24 |
stax standup --json |
Output activity as JSON for scripting |
stax changelog <from> [to] |
Generate changelog between two refs |
stax changelog v1.0 --path src/ |
Changelog filtered by path (monorepo) |
stax changelog v1.0 --json |
Output changelog as JSON |
stax generate --pr-body |
Generate PR body with AI and update the PR |
stax generate --pr-body --edit |
Generate and review in editor before updating |
Common Flags
stax create -m "msg"- Create branch with commit messagestax create -a- Stage all changesstax create -am "msg"- Stage all and commitstax branch create --message "msg" --prefix feature/- Create with explicit message and prefixstax branch reparent --branch feature-a --parent main- Reparent a specific branchstax rename new-name- Rename current branchstax rename -e- Rename and edit commit messagestax branch rename --push- Rename and update remote branch in one stepstax branch squash --message "Squashed commit"- Squash branch commits with explicit messagestax branch fold --keep- Fold branch into parent but keep branchstax submit --draft- Create PRs as draftsstax branch submit/stax bs- Submit current branch onlystax upstack submit- Submit current branch and descendantsstax downstack submit- Submit ancestors and current branchstax submit --yes- Auto-approve promptsstax submit --no-pr- Push branches only, skip PR creation/updatesstax submit --no-fetch- Skipgit fetch; use cached remote-tracking refsstax submit --open- Open the current branch PR in browser after submit (stax ss --open/stax bs --open)stax submit --force- Submit even when restack check failsstax submit --no-prompt- Use defaults, skip interactive promptsstax submit --template <name>- Use specific template by name (skip picker)stax submit --no-template- Skip template selection (no template)stax submit --edit- Always open editor for PR bodystax submit --ai-body- Generate PR body with AI during submitstax submit --reviewers alice,bob- Add reviewersstax submit --labels bug,urgent- Add labelsstax submit --assignees alice- Assign usersstax submit --quiet- Minimize submit outputstax submit --verbose- Show detailed submit output, including GitHub API request countsstax merge --all- Merge entire stackstax merge --method squash- Choose merge method (squash/merge/rebase)stax merge --dry-run- Preview merge without executingstax merge --no-wait- Don't wait for CI, fail if not readystax merge --no-delete- Keep branches after mergestax merge --timeout 60- Wait up to 60 minutes for CI per PRstax merge --quiet- Minimize merge outputstax restack --auto-stash-pop- Auto-stash/pop dirty target worktrees during restackstax restack --all- Restack all branches in current stackstax restack --continue- Continue after resolving restack conflictsstax restack --quiet- Minimize restack outputstax upstack restack --auto-stash-pop- Auto-stash/pop when restacking descendantsstax rs --restack --auto-stash-pop- Sync, restack, auto-stash/pop dirty worktrees (rs= sync alias)stax sync --force- Force sync without promptsstax sync --safe- Avoid hard reset when updating trunkstax sync --continue- Continue after resolving sync/restack conflictsstax sync --quiet- Minimize sync outputstax sync --verbose- Show detailed sync outputstax cascade --no-pr- Restack and push branches; skip PR creation/updatesstax cascade --no-submit- Restack only, no remote interactionstax cascade --auto-stash-pop- Auto-stash/pop dirty target worktrees during cascade restackstax sync --restack- Sync and rebase all branchesstax status --stack <branch>- Show only one stackstax status --current- Show only current stackstax status --compact- Compact outputstax status --json- Output as JSONstax log --stack <branch> --current --compact --json- Filter log outputstax checkout --trunk- Jump directly to trunkstax checkout --parent- Jump to parent branchstax checkout --child 1- Jump to first child branchstax ci --refresh- Bypass CI cachestax undo --yes- Undo without promptsstax undo --no-push- Undo locally only, skip remotestax undo --quiet- Minimize undo outputstax redo --quiet- Minimize redo outputstax auth --token <token>- Set GitHub token directlystax generate --pr-body --edit- Generate and review in editorstax generate --pr-body --agent codex- Use specific AI agentstax generate --pr-body --agent gemini- Use Gemini CLI as the agentstax generate --pr-body --agent opencode- Use OpenCode as the agentstax generate --pr-body --model claude-haiku-4-5-20251001- Use specific model
CI/Automation example:
Benchmarks
| Command | stax | freephite | graphite |
|---|---|---|---|
ls (10-branch stack) |
46.8ms | 1374.0ms | 506.0ms |
Raw hyperfine results:
➜ hyperfine 'stax ls' 'fp ls' 'gt ls' --warmup 5
Benchmark 1: stax ls
Time (mean ± σ): 46.8 ms ± 0.5 ms [User: 7.9 ms, System: 8.8 ms]
Range (min … max): 45.7 ms … 48.6 ms 57 runs
Benchmark 2: fp ls
Time (mean ± σ): 1.374 s ± 0.011 s [User: 0.417 s, System: 0.274 s]
Range (min … max): 1.361 s … 1.394 s 10 runs
Benchmark 3: gt ls
Time (mean ± σ): 506.0 ms ± 18.0 ms [User: 220.9 ms, System: 69.2 ms]
Range (min … max): 489.8 ms … 536.3 ms 10 runs
Summary
stax ls ran
10.81 ± 0.40 times faster than gt ls
29.35 ± 0.41 times faster than fp ls
License
MIT