Cleanup Stale Branches
SkillDev toolsDelete stale git branches (local + remote) that have no open PR, and prune worktrees.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Cleanup Stale Branches skill
What this skill tells your AI
The instructions your AI receives, as published by openrouterlabs/spawn in .claude/skills/pcl/SKILL.md and read by ahel’s review.
Delete local and remote git branches that no longer have an open PR, and prune stale worktrees.
Arguments
--dry-run— List what would be deleted without actually deleting anything.
$ARGUMENTS
Procedure
Step 1: Checkout main branch
Switch to main and update to latest:
git checkout main
git pull --rebase origin main
Critical: This ensures we're not on a branch that's about to be deleted, and that we're working from the latest main.
Step 2: Fetch and prune remote refs
git fetch --prune origin
Step 3: Identify stale remote branches
List all remote branches except main and HEAD:
git branch -r --format='%(refname:short) %(committerdate:relative)' | grep -v 'origin/main\|origin/HEAD\|^origin '
Step 4: Get branches with open PRs (protected)
gh pr list --repo OpenRouterLabs/spawn --state open --json headRefName --jq '.[].headRefName'
Any branch with an open PR MUST be skipped. Never delete a branch that has an open PR.
Step 5: Delete stale remote branches
For each remote branch that is NOT in the open PR list:
git push origin --delete BRANCH_NAME
If --dry-run was passed, print [dry-run] would delete origin/BRANCH_NAME instead.
Step 6: Delete stale local branches
List local branches (excluding the current branch and main):
git branch --list | grep -v '^\*' | grep -v '^ *main$' | tr -d ' '
For each, check if it's already merged into main or has no remote:
git branch -d BRANCH_NAME 2>/dev/null || git branch -D BRANCH_NAME
If --dry-run, print [dry-run] would delete local BRANCH_NAME instead.
Step 7: Prune worktrees
git worktree prune
Remove any leftover worktree directories:
rm -rf /tmp/spawn-worktrees 2>/dev/null || true
Step 8: Verify final state
Ensure we're on main branch:
git branch --show-current
Should output: main
Step 9: Summary
Print a summary:
- Number of remote branches deleted
- Number of local branches deleted
- Number of branches skipped (had open PRs)
- Worktree prune status
Signals
- GitHub stars
- 237
- Forks
- 35
- Last commit
- Jul 2026
Advanced
- Catalog kind
- skill
- Gateway key
pcl- Source
- github.com/openrouterlabs/spawn