skills/stacked-prs/SKILL.md
--- name: stacked-prs description: Rebase a stacked feature branch after its parent PR has been squash-merged. Use when you have a branch B that was built on top of branch A, and A just landed on main (squash-merged). Runs git fetch + git rebase onto main + git push --force-with-lease, so B's diff no longer includes A's flattened commits. category: development argument-hint: [--onto <branch>] [--no-push] [--dry-run] allowed-tools: Bash(git *) --- # Stacked PRs: rebase-after-parent-merges One c
npx skillsauth add RonanCodes/ronan-skills skills/stacked-prsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
One command for the recurring pain point of stacked PRs under a squash-merge + linear-history repo. When PR A squash-merges, the original commits get replaced by one new commit with a different SHA. Any branch B that was built on A still carries A's old commits in its history, which pollutes B's diff until B is rebased onto the new main.
This skill automates the fix.
/ro:stacked-prs # rebase current branch onto origin/main, force-push with lease
/ro:stacked-prs --onto develop # rebase onto a branch other than main
/ro:stacked-prs --no-push # rebase locally, stop before pushing
/ro:stacked-prs --dry-run # show what would happen, don't touch anything
/ro:new-tanstack-app's branch protection).git log main..B now shows "A's commits" + "B's commits", and B's GitHub PR diff is wider than it should be.git status will tell you).git pull --rebase is enough; this skill still works but is overkill.Branch protection only applies to main. Feature branches are explicitly allowed to be force-pushed: rebasing IS how you update a stacked PR under the squash model. --force-with-lease guards against the edge case where someone else pushed to your branch since you last fetched.
main / master. If it is, bail with "you're on the base branch, nothing to rebase."git status --porcelain empty). If not, bail with "commit or stash first."origin remote exists.BRANCH=$(git rev-parse --abbrev-ref HEAD)
BASE=${ONTO:-main}
[ "$BRANCH" = "$BASE" ] && { echo "on $BASE, nothing to rebase"; exit 1; }
[ -n "$(git status --porcelain)" ] && { echo "working tree dirty; commit or stash"; exit 1; }
git rev-parse --abbrev-ref "$BRANCH@{u}" >/dev/null 2>&1 || { echo "no upstream; git push -u first"; exit 1; }
git fetch origin
Show the commits that will be replayed + where the base moved to. This is the whole output in --dry-run mode.
echo "Will rebase $BRANCH onto origin/$BASE"
echo "Commits to replay (in order):"
git log --oneline "origin/$BASE..HEAD"
echo "---"
echo "New base: $(git log -1 --oneline origin/$BASE)"
If --dry-run, exit here.
git rebase "origin/$BASE"
If conflicts fire, abort cleanly and tell the user:
if [ $? -ne 0 ]; then
echo "Rebase hit conflicts. Resolve, then run: git add <files> && git rebase --continue"
echo "To abort entirely: git rebase --abort"
exit 2
fi
--no-push)git push --force-with-lease
--force-with-lease refuses the push if the remote has commits you haven't seen, catching the rare case where someone else pushed to your branch.
echo "✅ $BRANCH rebased onto origin/$BASE and pushed"
git log --oneline "origin/$BASE..HEAD"
/ro:gh-ship: opens the PR, watches checks, confirms merge. Run this once B is rebased./ro:new-tanstack-app: the scaffold that installs branch protection + squash-only merges. This skill exists because of the constraints that scaffold sets up.connections-helper/docs/adr/0002-github-branch-protection-squash-only-merges.md (the reasoning behind squash-only + the stacked-PR section).github-repo-hygiene in llm-wiki-research.development
Close the loop on a Linear ticket when its work ships - move the status and post a deploy comment with the PR link, what shipped, and a try-it link, mentioning the collaborator. Used as the tail of /ro:linear-nightshift for every merged mirror, or manually after an ad-hoc build. Triggers on "linear update", "update the linear ticket", "mark NUT-x done", "tell eoin it shipped", "/ro:linear-update".
devops
Run a night-shift against a collaborator's Linear board. Pulls the team's Grilled tickets (/ro:linear-grill moves a ticket to Grilled once its questions are answered), VERIFIES the questions were actually answered (unanswered → bounce the ticket to the "Question for <name>" state), mirrors verified tickets to ephemeral GitHub issues with ready-for-agent, then runs the standard /ro:night-shift machinery on GitHub. Tail-calls /ro:linear-update for everything that merged + deployed. Triggers on "linear nightshift", "nightshift linear", "drain the linear board", "run the shift off linear", "/ro:linear-nightshift".
development
Grill a collaborator's Linear tickets and move every processed ticket to where it belongs. Resolves the board from the repo's .ro-linear.json, reads the collaborator's Backlog / Ready-for-agent issues, then per ticket either posts 3-5 decision-extracting questions (state moves to "Question for <name>") or confirms it build-ready (state moves to "Grilled", the gate /ro:linear-nightshift consumes); shipped-and-confirmed tickets close as Done. The async-collaborator counterpart of /ro:day-shift for people who never touch GitHub. Triggers on "grill linear", "grill eoin's tickets", "linear grill", "add questions to the linear tickets", "/ro:linear-grill".
development
--- name: about-page description: Add a standard About page to any web app, what it is, the tech stack, and an FAQ, wired into a footer link with a sticky footer. Built with Spartan + Tailwind (the canonical component layer) and falls back to semantic HTML so it ships reliably. Use whenever building, polishing, or shipping an app, every app should have one. Triggers on "add an about page", "about page", "footer about link", or as a standard step in app build/polish. category: frontend argument-h