{"id":38753349,"url":"https://github.com/mubbie/stacksmith","last_synced_at":"2026-01-17T11:51:34.155Z","repository":{"id":287291955,"uuid":"964253704","full_name":"mubbie/stacksmith","owner":"mubbie","description":"Ultralight Artisan Git Stacking Tool","archived":false,"fork":false,"pushed_at":"2025-04-27T15:27:01.000Z","size":5801,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-27T16:26:06.701Z","etag":null,"topics":["bash","bubbles","bubbletea","cli","cobra","git","go","golang","lipgloss","terminal"],"latest_commit_sha":null,"homepage":"","language":"Go","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/mubbie.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-10T23:35:37.000Z","updated_at":"2025-04-27T15:27:05.000Z","dependencies_parsed_at":null,"dependency_job_id":"007caf76-7798-4b1d-9bc4-2c38fde6dfd5","html_url":"https://github.com/mubbie/stacksmith","commit_stats":null,"previous_names":["mubbie/stacksmith"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/mubbie/stacksmith","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mubbie%2Fstacksmith","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mubbie%2Fstacksmith/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mubbie%2Fstacksmith/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mubbie%2Fstacksmith/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mubbie","download_url":"https://codeload.github.com/mubbie/stacksmith/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mubbie%2Fstacksmith/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28508461,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T11:50:55.898Z","status":"ssl_error","status_checked_at":"2026-01-17T11:50:55.569Z","response_time":85,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["bash","bubbles","bubbletea","cli","cobra","git","go","golang","lipgloss","terminal"],"created_at":"2026-01-17T11:51:33.436Z","updated_at":"2026-01-17T11:51:34.133Z","avatar_url":"https://github.com/mubbie.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Stacksmith\n\n\u003cimg src=\"https://vhs.charm.sh/vhs-4MMT5EmmcjU7WdktwoOm8c.gif\" alt=\"Made with VHS\"\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://vhs.charm.sh\"\u003e\n    \u003cimg src=\"https://stuff.charm.sh/vhs/badge.svg\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/mubbie/stacksmith/releases\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/v/release/mubbie/stacksmith\" alt=\"Latest Release\"\u003e\n  \u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/github/license/mubbie/stacksmith\" alt=\"License\"\u003e\n  \u003cimg src=\"https://github.com/mubbie/stacksmith/actions/workflows/release.yml/badge.svg\" alt=\"CI\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/built%20with-Go-00ADD8?logo=go\" alt=\"Built with Go\"\u003e\n  \u003ca href=\"https://goreportcard.com/report/github.com/mubbie/stacksmith\"\u003e\n    \u003cimg src=\"https://goreportcard.com/badge/github.com/mubbie/stacksmith\" alt=\"Go Report Card\"\u003e\n  \u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/github/stars/mubbie/stacksmith?style=social\" alt=\"GitHub Stars\"\u003e\n\u003c/p\u003e\n\n\u003e Ultralight Artisan Git Stacking Tool\n\u003e (*Forgive the corny jokes — staying on brand 🧑🏾‍🏭*)\n\nStacksmith is your terminal blacksmithing forge for managing stacked pull branches and pull requests using **vanilla Git** 🌳\n\nThis repo contains two versions:\n\n| Version             | Description                                         | Status |\n|----------------------|-----------------------------------------------------| ----- | \n| `stacksmith-lite.sh` | 🪶 Lightweight Bash script for fast Git stacking    | ✅ Stable |\n| `stacksmith`         | ⚡ Upcoming Go-powered CLI with rich UI (coming soon) | 🚧 In Progress | \n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWhy Stacksmith? 🤔\u003c/strong\u003e\u003c/summary\u003e\n\nImagine this: you're building a big feature. It's going to touch a lot of files and introduce a lot of changes.\nWith traditional Git workflows, your options are usually:\n\n- 🫠 Put it all in one huge branch → easy for you, painful for your reviewers.\n- ⏳ Break it into many small PRs → good for reviewers, but you end up stuck waiting for each PR to merge before you can build on the next one.\n\nBoth kinda suck.\n\n```text\nOption 1 → One giant PR 😱\n\nOption 2 → Many PRs but blocked 😩\n\nStacksmith → Many PRs. Keep shipping 🚀\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWhat Are Stacked PRs? 🚂\u003c/strong\u003e\u003c/summary\u003e\n\nStacked PRs let you break work into small, focused branches — each building on top of the last.\n\n```text\nmain \u003c- PR1 \u003c- PR2 \u003c- PR3 \u003c- PR4 ...\n```\n\nEach PR targets the previous one, reviewers see small diffs, and you keep moving fast.\n\nBUT managing these stacks manually with plain Git is tedious (See: [Stacked branches with vanilla Git](https://www.codetinkerer.com/2023/10/01/stacked-branches-with-vanilla-git.html), [Stacked branches with vanilla Git - Reddit Thread](https://www.reddit.com/r/programming/comments/16yqfef/stacked_branches_with_vanilla_git/)):\n\n- Rebasing every branch on top of the latest\n- Force pushing without messing things up\n- Retargeting PRs\n\nThat's where `stacksmith` comes in.\n\n\u003c/details\u003e\n\n---\n\n## Stacksmith (Go Edition) ⚡\n\nA Go-powered version of stacksmith with an interactive CLI. It includes:\n\n- 🔄 Guided flows for stacking, syncing, and fixing branches\n- 🎨 Stylish user interface built with [Bubble Tea](https://github.com/charmbracelet/bubbletea) and [Lip Gloss](https://github.com/charmbracelet/lipgloss) from [charm.sh](https://charm.sh/)\n- 🖥️ Full Terminal UI, interactive graph, and DAG visualization (coming soon!)\n\n### Install Stacksmith (Go Edition) 🚀\n\n#### Linux \u0026 macOS\n\n```bash\nbrew tap mubbie/homebrew-tap\nbrew install stacksmith\n```\n\n\u003cdetails\u003e\n\u003csummary\u003eOr install manually\u003c/summary\u003e\n  \n```bash\ncurl -LO https://github.com/mubbie/stacksmith/releases/latest/download/stacksmith_$(uname -s | tr '[:upper:]' '[:lower:]')_amd64.tar.gz\ntar -xzf stacksmith_*.tar.gz\nsudo mv stacksmith /usr/local/bin/\n```\n\n\u003c/details\u003e\n\n#### Windows\n\n📦 [Installer available on GitHub Releases](https://github.com/mubbie/stacksmith/releases)\n\nOnce [approved](https://github.com/microsoft/winget-pkgs/pull/249878), you'll also be able to install via:\n\n```powershell\nwinget install Mubbie.Stacksmith\n```\n\n\u003e ℹ️ Note: Winget package is pending approval. We’ll update this once it lands.\n\n---\n\n## Stacksmith Lite 🪶\n\n`stacksmith-lite.sh` is a zero-installation, dead-simple Bash script for managing stacked branches using **vanilla Git.**\n\nIt works anywhere Git works:\n\n- ✅ Local dev\n- ✅ CI environments\n- ✅ Remote VMs\n- ✅ No plugins, no wrappers, no setup\n\n### Install Stacksmith Lite 🚀\n\n```bash\ncurl -sL https://raw.githubusercontent.com/mubbie/stacksmith/main/scripts/stacksmith-lite.sh -o stacksmith\nchmod +x stacksmith\nsudo mv stacksmith /usr/local/bin/\n```\n\nOr just alias it:\n\n```bash\nalias stacksmith='bash /path/to/stacksmith-lite.sh'\n```\n\nIf you run into trouble adding `stacksmith` to your path, [here's](https://specifications.freedesktop.org/basedir-spec/latest/) an excellent and helpful article recommended by my friend [Osaro](https://github.com/osaroadade) 🙂\n\n---\n\n## Usage ⚙️\n\n#### 🧩 Launch Interactive UI (In Go Edition)\n\n```bash\nstacksmith\n```\n\n#### 🪵 Create a new stacked branch\n\n```bash\nstacksmith stack \u003cnew-branch\u003e \u003cparent-branch\u003e\n```\n\n#### 🧽 Rebase and sync your stack\n\n```bash\nstacksmith sync \u003cbranch1\u003e \u003cbranch2\u003e \u003cbranch3\u003e ...\n```\n\n#### 🔧 Rebase a branch after parent PR merges\n\n```bash\nstacksmith fix-pr \u003cbranch\u003e \u003cnew-target\u003e\n```\n\n#### ⬆️ Push current branch safely\n\n```bash\nstacksmith push\n```\n\n#### 🌳 Visualize your branch stack\n\n```bash\nstacksmith graph\n```\n\n\u003e Prints an ASCII-style Git commit graph with branch tips and relationships.\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eManaging PRs with Stacksmith 📂\u003c/strong\u003e\u003c/summary\u003e\n\n\u003e Stacksmith helps you manage your local branches beautifully. But your PRs will still need to be created, managed, and merged manually on your Git hosting platform (Azure DevOps, GitHub, GitLab, Bitbucket, etc).\n\n### PR Lifecycle with Stacksmith\n\n- Create your stacked branches locally with `stacksmith stack`\n- Push them with `stacksmith push`\n- Open PRs in your Git platform (targeting their parent branches, ex: ex: PR2 targets PR1, PR3 targets PR2, etc.)\n- Merge PRs bottom-up (base first, then next, then next)\n- After each PR merge:\n  - Use `stacksmith fix-pr` to rebase the next branch onto the new target (usually `main`)\n  - Retarget the PR in your Git platform to point to `main`\n  - Push again with `stacksmith push`\n\n### Pro Tip\n\nUse `stacksmith sync` to quickly rebase and update a full stack when many PRs have merged.\n\n- Stacksmith = Local branch management magic\n- Your Git platform = PR creation, review, merging\n- Together = Dev happiness 🌟\n\n### What Stacksmith Doesn't Do 🙅\n\n- ❌ Create PRs for you (use your Git platform)\n- ❌ Auto-retarget PRs (you do that manually)\n- ❌ Auto-detect your stack (you pass branch names explicitly)\n\nStacksmith stays simple \u0026 bashy — that's the point.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eGotchas \u0026 Pitfalls 🔦 \u003c/strong\u003e\u003c/summary\u003e\n  \n\u003e Some common sharp edges when working with stacked PRs (and how to avoid them):\n\n| Situation                          | What Happens                                              | How To Handle                                                                |\n| ---------------------------------- | --------------------------------------------------------- | ---------------------------------------------------------------------------- |\n| PR merges out of order             | Git history gets messy; later PR shows unexpected changes | Rebase your branch onto `main` using `stacksmith fix-pr` and retarget the PR |\n| Forgetting to retarget PR          | PR shows extra unrelated commits                          | Always retarget PR to `main` (or the correct parent) after parent merges     |\n| Not force-pushing after rebase     | Remote branch gets out of sync with local                 | Always use `stacksmith push` (safe force-push) after rebasing                |\n| Accidentally rebasing wrong parent | Changes vanish or conflict                                | Double-check the branch order when using `stacksmith sync`                   |\n\n**Final Rule of Thumb:**\n\n- Merge PRs from the bottom up\n- Rebase child branches immediately after parent merges\n- Retarget PRs accordingly\n- Push your changes\n- Clean stack = Happy reviewers + Happy you 🌱\n\n\u003c/details\u003e\n\n---\n\n## Coming Soon in Stacksmith (Go Edition) ⚡\n\nWe’re rebuilding Stacksmith in Go for a more powerful and visual CLI experience:\n- 🌲 Rich, colorized DAG views\n- 🧑🏾‍🏭 Interactive TUI\n- 🧪 Diff previews \u0026 branch introspection\n- 💾 Config and logging support\n- 🔌 GitHub/Azure integration\n\nSee the full [Stacksmith Go Roadmap](./docs/planning/stacksmith-go.md) ➡️\n\n---\n\n## 🤝 Contribution\n\nContributions are welcome! ✨\n1. Fork the project\n2. Create your feature branch (git checkout -b feat/amazing-feature)\n3. Commit your changes (git commit -m 'feat: add amazing feature')\n4. Push to the branch (git push)\n5. Open a pull request\n\nAdd commands, fix bugs, clean up UI, or just drop a pun. All artisan hands on deck.\n\n---\n\n## 📢 Feedback\n\nGot ideas, bugs, or thoughts? Love a bad artisan pun? Open an issue or reach out!\n\nYour feedback makes this tool better (and funnier). 😎\n\n---\n\nCrafted with love (and corny jokes), by artisans of the stack (mostly GPT-4o). 🧑🏾‍🏭✨\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmubbie%2Fstacksmith","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmubbie%2Fstacksmith","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmubbie%2Fstacksmith/lists"}