Cleanup Stale Branches

SkillDev tools

Delete stale git branches (local + remote) that have no open PR, and prune worktrees.

Available today. Use it from your connected AI after setup.

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