Branch cleaner
Workflow
- Resolve the repository, current branch, remote, and remote default branch from Git. Ask only when they remain ambiguous.
- Fetch and prune remote-tracking refs, then collect evidence:
git status -sbgit worktree list --porcelaingit branch --merged <remote>/<default>andgit branch --no-merged <remote>/<default>git for-each-ref refs/heads --sort=committerdate --format="%(committerdate:iso8601) %(refname:short) %(upstream:short) %(upstream:track)"
- When GitHub context is available, prefer the GitHub connector for open/merged PR metadata and branch protection context. Use
ghonly as a fallback. - Exclude the current branch, the default branch, branches checked out in any worktree, protected branches or rulesets, and branches with open PRs. If open-PR or protection state cannot be verified, keep the branch report-only.
- Group candidates by evidence:
- merged into the fetched default branch;
- upstream gone;
- old but unmerged, which is report-only unless the user explicitly approves force deletion.
- Present concrete branch names, last commit dates, merge state, and local/remote scope before deleting anything.
- Delete only approved candidates:
- immediately before each deletion, fetch current evidence and recheck the branch tip SHA, worktree use, open PRs, and protection or ruleset state against the reviewed candidate;
- skip the branch if its tip or state changed, or if any safety check is unavailable;
- local merged branch:
git branch -d <branch>; - remote branch:
git push <remote> --delete <branch>only when remote deletion was explicitly requested; - use
git branch -Donly for an individually named unmerged branch explicitly approved by the user.
- Re-run the candidate commands and
git status -sbto verify the result.
Safety
- Treat age as a review signal, never proof that a branch is safe to delete.
- Never delete through an unresolved glob or a generated command string.
- Do not remove a branch used by another worktree.
- Do not delete remote branches or force-delete unmerged branches without explicit approval.
- Preserve unrelated working-tree changes.
Deliverable
Report deleted branches, skipped branches with reasons, commands run, and any candidates still needing a decision.