https://github.com/auswm85/rung
A cli tool and vs code plugin for pr stacking
https://github.com/auswm85/rung
cli developer-tools git-workflow rust stacked-prs
Last synced: about 2 hours ago
JSON representation
A cli tool and vs code plugin for pr stacking
- Host: GitHub
- URL: https://github.com/auswm85/rung
- Owner: auswm85
- License: mit
- Created: 2026-01-14T02:04:04.000Z (13 days ago)
- Default Branch: main
- Last Pushed: 2026-01-18T05:22:58.000Z (9 days ago)
- Last Synced: 2026-01-18T07:27:26.930Z (9 days ago)
- Topics: cli, developer-tools, git-workflow, rust, stacked-prs
- Language: Rust
- Homepage:
- Size: 1.36 MB
- Stars: 2
- Watchers: 0
- Forks: 1
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Codeowners: .github/CODEOWNERS
Awesome Lists containing this project
README
# rung
A Git workflow tool for managing stacked PRs (pull request chains).

## Overview
Rung helps you work with dependent branches by:
- Tracking branch relationships in a stack
- Syncing child branches when parents are updated
- Managing PR chains on GitHub with automatic stack comments
- Handling merges with automatic descendant rebasing
## Installation
### Pre-built binaries (recommended)
Download the latest release for your platform from [GitHub Releases](https://github.com/auswm85/rung/releases).
**macOS (Apple Silicon):**
```bash
curl -fsSL https://github.com/auswm85/rung/releases/latest/download/rung-$(curl -s https://api.github.com/repos/auswm85/rung/releases/latest | grep tag_name | cut -d '"' -f 4 | sed 's/v//')-aarch64-apple-darwin.tar.gz | tar xz
sudo mv rung /usr/local/bin/
```
**macOS (Intel):**
```bash
curl -fsSL https://github.com/auswm85/rung/releases/latest/download/rung-$(curl -s https://api.github.com/repos/auswm85/rung/releases/latest | grep tag_name | cut -d '"' -f 4 | sed 's/v//')-x86_64-apple-darwin.tar.gz | tar xz
sudo mv rung /usr/local/bin/
```
**Linux (x86_64):**
```bash
curl -fsSL https://github.com/auswm85/rung/releases/latest/download/rung-$(curl -s https://api.github.com/repos/auswm85/rung/releases/latest | grep tag_name | cut -d '"' -f 4 | sed 's/v//')-x86_64-unknown-linux-gnu.tar.gz | tar xz
sudo mv rung /usr/local/bin/
```
**Windows:** Download the `.zip` from [releases](https://github.com/auswm85/rung/releases) and add to your PATH.
### Homebrew (macOS/Linux)
```bash
brew tap auswm85/rung https://github.com/auswm85/rung
brew install rung
```
### From crates.io
```bash
cargo install rung-cli
```
### With cargo-binstall (faster, no compilation)
```bash
cargo binstall rung-cli
```
### From source
```bash
cargo install --path crates/rung-cli
```
## Quick Start
```bash
# Initialize rung in a repository
rung init
# Create your first stacked branch
rung create feature/auth
# Make changes, commit, then create another branch on top
rung create feature/auth-tests
# Submit all branches as PRs
rung submit
# View stack status
rung status
```
## Commands
### Global Options
- `--json` - Output as JSON (for tooling integration). Supported by: `status`, `doctor`, `sync`, `submit`, `merge`
### `rung init`
Initialize rung in the current repository. Creates a `.git/rung/` directory to store stack state.
```bash
rung init
```
### `rung create `
Create a new branch with the current branch as its parent. This establishes the branch relationship in the stack.
```bash
rung create feature/new-feature
```
### `rung status`
Display the current stack as a tree view with sync state and PR status.
```bash
rung status # Basic status
rung status --fetch # Fetch latest PR status from GitHub
rung status --json # Output as JSON for tooling
```
**Options:**
- `--fetch` - Fetch latest PR status from GitHub
### `rung sync`
Sync the stack by rebasing all branches when the base moves forward.
```bash
rung sync # Sync all branches
rung sync --dry-run # Preview what would happen
rung sync --base develop # Sync against a different base branch
```
If conflicts occur:
```bash
# Resolve conflicts, then:
git add .
rung sync --continue
# Or abort and restore:
rung sync --abort
```
**Options:**
- `--dry-run` - Show what would be done without making changes
- `--continue` - Continue after resolving conflicts
- `--abort` - Abort and restore from backup
- `-b, --base ` - Base branch to sync against (default: "main")
### `rung submit`
Push all stack branches and create/update PRs on GitHub. Each PR includes a stack comment showing the branch hierarchy.
```bash
rung submit # Submit all branches
rung submit --draft # Create PRs as drafts
rung submit --force # Force push
rung submit --title "My PR title" # Custom title for current branch
```
**Options:**
- `--draft` - Create PRs as drafts
- `--force` - Force push even if remote has changes
- `-t, --title ` - Custom PR title for current branch
### `rung merge`
Merge the current branch's PR via GitHub API. Automatically:
- Rebases all descendant branches onto the new base
- Updates PR bases on GitHub
- Removes the branch from the stack
- Deletes local and remote branches
- Pulls latest changes to keep local up to date
```bash
rung merge # Squash merge (default)
rung merge --method merge # Regular merge commit
rung merge --method rebase # Rebase merge
rung merge --no-delete # Keep remote branch after merge
```
**Options:**
- `-m, --method ` - Merge method: `squash` (default), `merge`, or `rebase`
- `--no-delete` - Don't delete the remote branch after merge
### `rung undo`
Undo the last sync operation, restoring all branches to their previous state.
```bash
rung undo
```
### `rung nxt`
Navigate to the next (child) branch in the stack.
```bash
rung nxt
```
### `rung prv`
Navigate to the previous (parent) branch in the stack.
```bash
rung prv
```
### `rung move`
Interactive branch picker for quick navigation. Opens a TUI list to select and jump to any branch in the stack.
```bash
rung move # or `rung mv`
```
Displays all branches and highlights the current branch. PR numbers are shown when available:
```
? Jump to branch:
feat/auth #41
> feat/api #42 ◀
feat/ui
```
### `rung log`
Show commits on the current branch (commits between parent branch and HEAD). Helps visualize what's in the current stack branch.
```bash
rung log
```
Example output:
```text
a1b2c3d Add user authentication alice
e4f5g6h Fix login redirect alice
```
### `rung doctor`
Diagnose issues with the stack and repository. Checks:
- **Stack integrity**: Branches exist, parents are valid, no circular dependencies
- **Git state**: Clean working directory, not detached HEAD, no rebase in progress
- **Sync state**: Branches that need rebasing, sync operations in progress
- **GitHub connectivity**: Authentication, PR status (open/closed/merged)
```bash
rung doctor
```
Issues are reported with severity (error/warning) and actionable suggestions.
## Typical Workflow
```bash
# Start on main
git checkout main
# Initialize rung (first time only)
rung init
# Create first feature branch
rung create feature/api-client
# Make changes and commit
git add . && git commit -m "Add API client"
# Create dependent branch
rung create feature/api-tests
# Make more changes
git add . && git commit -m "Add API tests"
# Submit both as PRs
rung submit
# After review, merge from bottom of stack
rung prv # Go to parent branch
rung merge # Merge PR, rebase children automatically
# Continue with remaining PRs
rung merge # Merge the next PR
```
## Stack Comments
When you submit PRs, rung adds a comment to each PR showing the stack hierarchy:
```
### Stack
- API Tests #124 👈
- API Client #123
- `main`
---
*Managed by [rung](https://github.com/auswm85/rung)*
```
## Configuration
Rung stores its state in `.git/rung/`:
- `stack.json` - Branch relationships and PR numbers
- `config.json` - Repository-specific settings
- `backups/` - Sync backup data for undo
## Requirements
- Rust 1.85+
- Git 2.x
- GitHub CLI (`gh`) authenticated, or `GITHUB_TOKEN` environment variable
## Project Structure
```
crates/
rung-cli/ # Command-line interface
rung-core/ # Core logic (stack, sync, state)
rung-git/ # Git operations wrapper
rung-github/ # GitHub API client
```
## Development
```bash
# Clone and set up git hooks
git clone https://github.com/auswm85/rung
cd rung
git config core.hooksPath .githooks
# Run tests
cargo test
# Run with clippy
cargo clippy
# Build release
cargo build --release
```
## Authors
## License
MIT