brave/clean-branches
'Delete local branches whose PRs have been merged upstream. Checks GitHub PR prune branches, branch cleanup.'
npx skills add https://github.com/brave/brave-core --skill clean-branches
Clean up local branches by checking their GitHub PR status and deleting those
that have been merged.
local branches except master:
git fetch origin master
git branch --format='%(refname:short)' | grep -v '^master$'
Show the list to the user. If no branches exist besides master, report that
and stop.
merges (including squash merges):
Method 1: Direct ancestry — Catches regular merges and fast-forwards:
git branch --merged origin/master --format='%(refname:short)'
Method 2: Squash merge detection via git cherry — For branches not caught
by method 1, check if all commits have equivalent patches in origin/master. A
- prefix means the patch already exists upstream:
git cherry -v origin/master <branch>
If ALL lines start with - (or output is empty), the branch has been
squash-merged.
Method 3: GitHub PR status (if gh is authenticated) — For remaining
branches:
# Check for merged PRs
gh pr list --head <branch> --state merged --json number,title,url
# Check for closed (not merged) PRs
gh pr list --head <branch> --state closed --json number,title,url,mergedAt
A PR is "closed without merge" when it appears in the closed list but has an
empty/null mergedAt field. If gh is not authenticated, skip this method.
Important: Always compare against origin/master (not local master) to
detect merges even when local master is stale.
decision
still open → skip
switch to master first and fast-forward it:
git checkout master && git merge --ff-only origin/master
git branch -D <branch1> <branch2> ...
After deleting, prune stale remote tracking references:
git remote prune origin
Take brave/clean-branches from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.