.cursor/skills/delete-merged-branches/SKILL.md
指定した基準ブランチ(develop / main など)に取り込まれたローカルおよび origin 上の リモートブランチを安全に削除する。通常 merge は祖先判定、squash/rebase merge は GitHub のマージ済み PR の headRefOid 一致で判定。あわせて、基準ブランチ向けに **リポジトリ全体**のクローズ済み(未マージ)PR のリモートブランチも削除候補にする (基準以外向けの sub-PR や GitHub Copilot 等が作ってクローズしたブランチも掃除できる)。"マージ済みブランチを削除", "delete merged branches", "ローカル/リモートブランチを掃除", "ブランチ整理" などで使う。
npx skillsauth add otomatty/zedi delete-merged-branchesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
git branch --merged は祖先関係のみ見るため、squash/rebase merge では未マージ扱いになる。本スキルでは祖先判定に加え、GitHub の merged PR の headRefOid 一致でローカル・リモート両方の削除対象を安全に決める。あわせて、クローズされた(未マージ)PR のブランチはリモートのみ削除候補とする(ローカルは対象にしない)。クローズ PR は gh pr list --state closed でリポジトリ全体から取得するため、基準以外のブランチ向けに作られた sub-PR(例: copilot/sub-pr-*)も候補になる。主 remote は origin を前提とする。
事前に git fetch origin --prune と gh auth status が通ることを確認したうえで、以下で候補列挙・確認・削除まで行う。
git fetch origin --prune
./scripts/delete-merged-branches.sh [基準ブランチ] [--dry-run]
develop があれば develop、なければ origin/HEAD の短縮名(例: main)。echo y | ./scripts/delete-merged-branches.sh で確認プロンプトに自動で y を送る。スクリプトは (1) merged PR を gh pr list --state merged --base <基準> で一括取得し headRefName / headRefOid で照合する。(2) クローズ済み未マージ PR を gh pr list --state closed(--base なし、リポジトリ全体)から mergedAt == null かつ同一リポジトリ(fork は isCrossRepository で除外)で抽出する。ローカル候補は祖先 or merged PR の headRefOid 一致のみ。リモート専用候補は「merged PR で tip 一致」に加え、クローズ済み未マージ PR については origin の tip が当該 PR の headRefOid と一致する場合のみ(かつ mergedAt == null)削除候補に含め、さらに同名ブランチに open PR がある場合は削除しない。確認後にローカル削除 → リモート削除の順で実行する。
スクリプトを使わないときは以下を参考にする。
事前確認
git fetch origin --prune と gh auth status。主 remote が origin でない場合はユーザーに確認する。
基準ブランチ
ユーザー指定 > ローカル develop > origin/HEAD の短縮名。base_remote=origin/<基準> が存在しない場合は中断して確認。
merged PR の一括取得
ブランチごとに gh pr list を叩かず、1 回だけ取得する。
gh pr list --state merged --base "$base_branch" --limit 200 --json headRefName,headRefOid,number
ローカル候補
git for-each-ref refs/heads --format='%(refname:short)' で一覧。現在ブランチ・基準・main/master/develop・origin/HEAD 先は除外。各ブランチについて:
git merge-base --is-ancestor <branch> "$base_remote" で成功 → 削除可(merged by ancestry)headRefOid を探し、$(git rev-parse <branch>) と一致する場合のみ削除可(merged PR #N)。リモート専用候補
git for-each-ref refs/remotes/origin --format='%(refname:short)' | sed 's|^origin/||' で一覧。保護ブランチ・ローカルに存在するブランチは除外。(a) merged PR の JSON でそのブランチの headRefOid が origin の tip と一致する場合。(b) 別途 gh pr list --state closed(--base なし)から mergedAt == null かつ同一リポジトリの PR の headRefName と headRefOid を取得し、origin の tip が headRefOid と一致するリモートブランチのみ対象とする。このとき、同名ブランチに open PR がある場合は削除しない(基準以外向けの sub-PR や Copilot ブランチを含む)。
削除
候補を提示し確認後、ローカルは git branch -d(必要なら -D)、リモートは git push origin --delete <branch>。
基準ブランチ: develop
Deleted (local):
- `feature/foo` - merged by ancestry
- `feature/bar` - merged PR #123 (squash/rebase-safe)
Deleted (remote):
- `feature/qux` - merged PR #124 (remote-only)
- `sub` - closed PR #XXX (remote-only)
削除: ローカル 2 件、リモート 2 件
削除件数を必ず添える。
リモートブランチ一覧と PR 状態を確認する例:
git fetch origin --prune
git for-each-ref refs/remotes/origin --format='%(refname:short)' | sed 's|^origin/||' | grep -v '^HEAD$' | sort
# 各ブランチの PR 状態: gh pr list --state all --head <branch> --limit 1 --json state,number,mergedAt,baseRefName
削除候補の洗い出しには ./scripts/delete-merged-branches.sh --dry-run が使える。
headRefOid と一致しない場合は削除しない(merge 後に進んだ可能性あり)。origin でない構成では手順を流用するかユーザーに確認する。gh が使えない場合は、祖先で merged と判定できるローカルブランチと、その同名の origin 上のリモートブランチを ancestry ベースでのみ削除し、PR の headRefOid による squash/rebase 判定およびクローズ済み PR の取得は行わない。documentation
Zenn 記事を A先輩と B後輩の対話形式で執筆する。 Q&A のように疑問点にピンポイントで答える構成で、 初心者がつまずきやすいポイントを自然に解消する。 "対話形式で記事を書いて", "会話形式の記事", "dialogue article", "対話記事", "先輩後輩の会話で記事" などで起動する。
documentation
Zenn 記事の執筆・推敲を、体験ベースで読みやすいトーンに仕上げる。 AIっぽい定型表現を排除し、実践報告として説得力のある文章を生成する。 "Zenn記事を書いて", "記事の下書き", "ブログ記事を書く", "記事を推敲して", "write a Zenn article", "draft a blog post" などで起動する。
development
Runs Stryker mutation tests only on git-changed production files under `src/` via `scripts/stryker-mutate-changed.mjs` and `bun run test:mutation:changed`. Uses `stryker.config.mutation-changed.mjs` so partial runs do not fail on global `thresholds.break`. Use when the user asks for mutation testing on changed files only, incremental mutation test, diff-based Stryker, or "差分だけミューテーション" / "mutation test for current changes". After a run, use `bun run mutation:report:summary` and attach `reports/mutation/mutation-summary.md` for AI explanation (not HTML).
development
手元の実装変更、または現在ブランチとターゲットブランチの差分を、 関連コード(テスト・依存先・呼び出し元)も含めて AI レビューし、結果をマークダウンファイルに出力する。 "レビューして", "実装をレビュー", "変更をチェック", "review my changes", "self review", "セルフレビュー", "develop との差分をレビュー", "ブランチの差分をチェック", "review branch diff" などで起動する。