{"id":39172445,"url":"https://github.com/auswm85/rung","last_synced_at":"2026-02-02T02:10:43.071Z","repository":{"id":332659654,"uuid":"1133921052","full_name":"auswm85/rung","owner":"auswm85","description":"A cli tool and vs code plugin for pr stacking","archived":false,"fork":false,"pushed_at":"2026-01-18T05:22:58.000Z","size":1423,"stargazers_count":2,"open_issues_count":7,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-18T07:27:26.930Z","etag":null,"topics":["cli","developer-tools","git-workflow","rust","stacked-prs"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/auswm85.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-14T02:04:04.000Z","updated_at":"2026-01-18T05:23:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/auswm85/rung","commit_stats":null,"previous_names":["auswm85/rung"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/auswm85/rung","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/auswm85%2Frung","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/auswm85%2Frung/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/auswm85%2Frung/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/auswm85%2Frung/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/auswm85","download_url":"https://codeload.github.com/auswm85/rung/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/auswm85%2Frung/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28684386,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T05:48:07.525Z","status":"ssl_error","status_checked_at":"2026-01-23T05:48:07.129Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","developer-tools","git-workflow","rust","stacked-prs"],"created_at":"2026-01-17T22:24:27.423Z","updated_at":"2026-01-23T08:21:49.234Z","avatar_url":"https://github.com/auswm85.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.png\" alt=\"rung logo\" width=\"120\"\u003e\n\u003c/p\u003e\n\n# rung\n\nA Git workflow tool for managing stacked PRs (pull request chains).\n\n![Demo](assets/demo.gif)\n\n## Overview\n\nRung helps you work with dependent branches by:\n\n- Tracking branch relationships in a stack\n- Syncing child branches when parents are updated\n- Managing PR chains on GitHub with automatic stack comments\n- Handling merges with automatic descendant rebasing\n\n## Installation\n\n### Pre-built binaries (recommended)\n\nDownload the latest release for your platform from [GitHub Releases](https://github.com/auswm85/rung/releases).\n\n**macOS (Apple Silicon):**\n\n```bash\ncurl -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\nsudo mv rung /usr/local/bin/\n```\n\n**macOS (Intel):**\n\n```bash\ncurl -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\nsudo mv rung /usr/local/bin/\n```\n\n**Linux (x86_64):**\n\n```bash\ncurl -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\nsudo mv rung /usr/local/bin/\n```\n\n**Windows:** Download the `.zip` from [releases](https://github.com/auswm85/rung/releases) and add to your PATH.\n\n### Homebrew (macOS/Linux)\n\n```bash\nbrew tap auswm85/rung https://github.com/auswm85/rung\nbrew install rung\n```\n\n### From crates.io\n\n```bash\ncargo install rung-cli\n```\n\n### With cargo-binstall (faster, no compilation)\n\n```bash\ncargo binstall rung-cli\n```\n\n### From source\n\n```bash\ncargo install --path crates/rung-cli\n```\n\n## Quick Start\n\n```bash\n# Initialize rung in a repository\nrung init\n\n# Create your first stacked branch\nrung create feature/auth\n\n# Make changes, commit, then create another branch on top\nrung create feature/auth-tests\n\n# Submit all branches as PRs\nrung submit\n\n# View stack status\nrung status\n```\n\n## Commands\n\n### Global Options\n\n- `--json` - Output as JSON (for tooling integration). Supported by: `status`, `doctor`, `sync`, `submit`, `merge`\n\n### `rung init`\n\nInitialize rung in the current repository. Creates a `.git/rung/` directory to store stack state.\n\n```bash\nrung init\n```\n\n### `rung create \u003cname\u003e`\n\nCreate a new branch with the current branch as its parent. This establishes the branch relationship in the stack.\n\n```bash\nrung create feature/new-feature\n```\n\n### `rung status`\n\nDisplay the current stack as a tree view with sync state and PR status.\n\n```bash\nrung status              # Basic status\nrung status --fetch      # Fetch latest PR status from GitHub\nrung status --json       # Output as JSON for tooling\n```\n\n**Options:**\n\n- `--fetch` - Fetch latest PR status from GitHub\n\n### `rung sync`\n\nSync the stack by rebasing all branches when the base moves forward.\n\n```bash\nrung sync                # Sync all branches\nrung sync --dry-run      # Preview what would happen\nrung sync --base develop # Sync against a different base branch\n```\n\nIf conflicts occur:\n\n```bash\n# Resolve conflicts, then:\ngit add .\nrung sync --continue\n\n# Or abort and restore:\nrung sync --abort\n```\n\n**Options:**\n\n- `--dry-run` - Show what would be done without making changes\n- `--continue` - Continue after resolving conflicts\n- `--abort` - Abort and restore from backup\n- `-b, --base \u003cbranch\u003e` - Base branch to sync against (default: \"main\")\n\n### `rung submit`\n\nPush all stack branches and create/update PRs on GitHub. Each PR includes a stack comment showing the branch hierarchy.\n\n```bash\nrung submit                          # Submit all branches\nrung submit --draft                  # Create PRs as drafts\nrung submit --force                  # Force push\nrung submit --title \"My PR title\"    # Custom title for current branch\n```\n\n**Options:**\n\n- `--draft` - Create PRs as drafts\n- `--force` - Force push even if remote has changes\n- `-t, --title \u003ctitle\u003e` - Custom PR title for current branch\n\n### `rung merge`\n\nMerge the current branch's PR via GitHub API. Automatically:\n\n- Rebases all descendant branches onto the new base\n- Updates PR bases on GitHub\n- Removes the branch from the stack\n- Deletes local and remote branches\n- Pulls latest changes to keep local up to date\n\n```bash\nrung merge                  # Squash merge (default)\nrung merge --method merge   # Regular merge commit\nrung merge --method rebase  # Rebase merge\nrung merge --no-delete      # Keep remote branch after merge\n```\n\n**Options:**\n\n- `-m, --method \u003cmethod\u003e` - Merge method: `squash` (default), `merge`, or `rebase`\n- `--no-delete` - Don't delete the remote branch after merge\n\n### `rung undo`\n\nUndo the last sync operation, restoring all branches to their previous state.\n\n```bash\nrung undo\n```\n\n### `rung nxt`\n\nNavigate to the next (child) branch in the stack.\n\n```bash\nrung nxt\n```\n\n### `rung prv`\n\nNavigate to the previous (parent) branch in the stack.\n\n```bash\nrung prv\n```\n\n### `rung move`\n\nInteractive branch picker for quick navigation. Opens a TUI list to select and jump to any branch in the stack.\n\n```bash\nrung move    # or `rung mv`\n```\n\nDisplays all branches and highlights the current branch. PR numbers are shown when available:\n\n```\n? Jump to branch:\n  feat/auth #41\n\u003e feat/api #42 ◀\n  feat/ui\n```\n\n### `rung log`\n\nShow commits on the current branch (commits between parent branch and HEAD). Helps visualize what's in the current stack branch.\n\n```bash\nrung log\n```\n\nExample output:\n\n```text\na1b2c3d    Add user authentication     alice\ne4f5g6h    Fix login redirect          alice\n```\n\n### `rung doctor`\n\nDiagnose issues with the stack and repository. Checks:\n\n- **Stack integrity**: Branches exist, parents are valid, no circular dependencies\n- **Git state**: Clean working directory, not detached HEAD, no rebase in progress\n- **Sync state**: Branches that need rebasing, sync operations in progress\n- **GitHub connectivity**: Authentication, PR status (open/closed/merged)\n\n```bash\nrung doctor\n```\n\nIssues are reported with severity (error/warning) and actionable suggestions.\n\n## Typical Workflow\n\n```bash\n# Start on main\ngit checkout main\n\n# Initialize rung (first time only)\nrung init\n\n# Create first feature branch\nrung create feature/api-client\n\n# Make changes and commit\ngit add . \u0026\u0026 git commit -m \"Add API client\"\n\n# Create dependent branch\nrung create feature/api-tests\n\n# Make more changes\ngit add . \u0026\u0026 git commit -m \"Add API tests\"\n\n# Submit both as PRs\nrung submit\n\n# After review, merge from bottom of stack\nrung prv                    # Go to parent branch\nrung merge                  # Merge PR, rebase children automatically\n\n# Continue with remaining PRs\nrung merge                  # Merge the next PR\n```\n\n## Stack Comments\n\nWhen you submit PRs, rung adds a comment to each PR showing the stack hierarchy:\n\n```\n### Stack\n\n- API Tests #124 👈\n- API Client #123\n- `main`\n\n---\n*Managed by [rung](https://github.com/auswm85/rung)*\n```\n\n## Configuration\n\nRung stores its state in `.git/rung/`:\n\n- `stack.json` - Branch relationships and PR numbers\n- `config.json` - Repository-specific settings\n- `backups/` - Sync backup data for undo\n\n## Requirements\n\n- Rust 1.85+\n- Git 2.x\n- GitHub CLI (`gh`) authenticated, or `GITHUB_TOKEN` environment variable\n\n## Project Structure\n\n```\ncrates/\n  rung-cli/      # Command-line interface\n  rung-core/     # Core logic (stack, sync, state)\n  rung-git/      # Git operations wrapper\n  rung-github/   # GitHub API client\n```\n\n## Development\n\n```bash\n# Clone and set up git hooks\ngit clone https://github.com/auswm85/rung\ncd rung\ngit config core.hooksPath .githooks\n\n# Run tests\ncargo test\n\n# Run with clippy\ncargo clippy\n\n# Build release\ncargo build --release\n```\n\n## Authors\n\n\u003ca href=\"https://github.com/auswm85/rung/graphs/contributors\"\u003e\n  \u003cimg src=\"https://contrib.rocks/image?repo=auswm85/rung\" /\u003e\n\u003c/a\u003e\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fauswm85%2Frung","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fauswm85%2Frung","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fauswm85%2Frung/lists"}