How github/gh-stack works
gh-stack is a GitHub CLI extension for managing ordered stacks of branches and their pull requests. The typical workflow initializes a stack, adds branches, rebases and pushes the stack, then submits linked PRs to GitHub; users can also inspect, navigate, check out, or modify stacks. Local stack metadata tracks branch order and PR associations, while Git and GitHub operations are exposed through internal adapters. The graph follows README-documented behavior and sampled interfaces; several command implementations were not sampled, so uncertain internal wiring is omitted.
Main entry points: stack.go Stack metadata · gitops.go Git operations · github.go GitHub client · submit.go Submit PRs
Components 23
CLI workflows
- Initialize stack
cmd/init.go - Add branch
cmd/add.go - Rebase stack
cmd/rebase.go - Push branches
cmd/push.go - Submit PRs
cmd/submit.go - Check out stack
cmd/checkout.go - Modify stack
cmd/modify.go - View stack
cmd/view.go - Navigate stack
cmd/navigate.go - Merge stack
cmd/merge.go - Sync stack
cmd/sync.go
Local stack
- Git operations
internal/git/gitops.go - Stack metadata
internal/stack/stack.go - Configuration
internal/config/config.go - Apply modifications
internal/modify/apply.go
GitHub integration
- GitHub client
internal/github/github.go - Async merge
internal/github/merge_async.go
Terminal interfaces
- Submit editor
internal/tui/submitview/model.go - Stack picker
internal/tui/checkoutview/model.go - Stack editor
internal/tui/modifyview/model.go - Stack display
internal/tui/stackview/model.go
Other components
- CLI user
- GitHub
Connections 44
- CLI user → Initialize stack: runs
- CLI user → Add branch: runs
- CLI user → Rebase stack: runs
- CLI user → Push branches: runs
- CLI user → Submit PRs: runs
- CLI user → Check out stack: runs
- CLI user → Modify stack: runs
- CLI user → View stack: runs
- CLI user → Navigate stack: runs
- CLI user → Merge stack: runs
- CLI user → Sync stack: runs
- Initialize stack → Git operations: creates branches
- Initialize stack → Stack metadata: records stack
- Add branch → Git operations: creates branch
- Add branch → Stack metadata: updates stack
- Rebase stack → Git operations: rebases branches
- Rebase stack → GitHub client: checks PR state
- Push branches → Git operations: pushes branches
- Submit PRs → Git operations: pushes branches
- Submit PRs → Stack metadata: reads stack
- Submit PRs → GitHub client: creates PRs
- Submit PRs → GitHub client: syncs remote stack
- Submit PRs → Submit editor: opens editor
- Check out stack → Stack metadata: checks local stacks
- Check out stack → GitHub client: finds remote stacks
- Check out stack → Stack picker: opens picker
- Check out stack → Git operations: fetches branches
- Check out stack → Stack metadata: saves stack
- Modify stack → Stack metadata: loads stack
- Modify stack → Stack editor: opens editor
- Modify stack → Apply modifications: applies plan
- Apply modifications → Git operations: changes branches
- Apply modifications → Stack metadata: updates stack
- View stack → Stack metadata: reads stack
- View stack → Stack display: renders stack
- Navigate stack → Stack metadata: reads stack
- Navigate stack → Git operations: switches branch
- Merge stack → GitHub client: requests merge
- GitHub client → Async merge: dispatches merge
- GitHub client → GitHub: calls API
- Async merge → GitHub: polls merge
- Sync stack → GitHub client: syncs PR stack
- Sync stack → Stack metadata: reads stack
- Git operations → Configuration: reads settings