
clean-branches
โ Officialโ 3,392by brave ยท part of brave/brave-core
Delete local branches whose PRs have been merged upstream. Checks GitHub PR
This is the playbook your agent receives when the skill activates โ you don't need to read it to use the skill, but it's here to audit before installing.
Clean Branches - Delete Merged Local Branches
Clean up local branches by checking their GitHub PR status and deleting those that have been merged.
Steps
- Fetch and list branches โ Fetch the latest remote state, then get all
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.
- Check merge status for each branch โ Use multiple methods to detect 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,mergedAtA 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.
-
Categorize branches into these groups:
- Merged: Detected as merged by any method above โ safe to delete
- Closed (not merged): PR was closed without merging โ flag for user decision
- No PR / Open PR: No PR found (and not detected as merged), or PR is still open โ skip
-
Display categorized list โ Show the user a summary table with:
- Branch name
- Category (Merged / Closed / No PR / Open)
- PR number and title (if available)
- Detection method (ancestry / squash / PR status)
-
Confirm with user โ Ask the user which branches to delete:
- Pre-select "Merged" branches for deletion
- Ask about "Closed (not merged)" branches individually
- Never auto-delete "No PR" or "Open PR" branches
-
Delete confirmed branches โ If currently on a branch being deleted, switch to
masterfirst 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- Report results โ Summarize:
- How many branches were deleted
- Which branches were kept and why
npx skills add brave/brave-core --skill "clean-branches" --full-depthRun this in your project โ your agent picks the skill up automatically.
No common issues documented yet. If you hit a problem, the repository's GitHub Issues page is the best place to look.
Licensed under MPL-2.0โ you can use, modify, and redistribute it under that license's terms.
View the full license file on GitHub โ