approve-pr
他の人の PR を approve する前の確認を行い、approve のコマンドを示す。approve そのものは人が打つ。人だけが /approve-pr で起動する。
SKILL.mdhome/.claude/skills/approve-pr/SKILL.md
GitHub他の人の PR を approve してよい状態かを確かめ、approve のコマンドを示すところまで行います。
approve は人が打ちます。 フック( block-known-footguns.sh の5番目の検査)が、Claude からの gh pr review --approve を常に止めています。本スキルはその守りを外さず、判断材料をそろえて渡すだけです。
disable-model-invocation: true なので、本スキルは人が /approve-pr を打ったときだけ起動します。
進め方
1. 対象を特定する
- 引数の PR 番号 / URL から引く。引数が無ければ止めて、PR を尋ねる(現在のブランチの PR は、たいてい自分の PR なので approve の対象にならない)
OWNER/REPOは URL から、無ければgh repo view --json nameWithOwner -q .nameWithOwnerで取る
gh pr view <PR> -R OWNER/REPO --json author,state,isDraft,headRefOid,url
gh api user -q .login
2. 4項目を確かめる
止めるかどうかは人が決めます。 本スキルは結果を並べるだけで、項目に引っかかってもコマンドは示します。ただし、作成者が自分のときは示しません(GitHub が拒むため)。
| 項目 | 確かめ方 | 引っかかったとき |
|---|---|---|
| 作成者が自分でない | author.login と自分の login を比べる |
コマンドを示さずに終える。自分の PR は approve できない |
| HEAD が動いていない | 自分の最後のレビューの commit_id と headRefOid を比べる(下記) |
動いた分のコミットを path 付きで並べる |
| CI の状態 | gh pr checks <PR> -R OWNER/REPO |
fail / pending の行を並べる |
| 自分の指摘の残り | 自分が付けた [must] のスレッドのうち、未解決のもの(下記) |
スレッドの URL を並べる |
自分の最後のレビューの commit_id を引く。
gh api "repos/OWNER/REPO/pulls/<PR>/reviews" \
--jq '[.[] | select(.user.login=="<自分>")] | last | .commit_id'
レビューが1件も無ければ、「この PR はまだレビューしていない」と並べる。HEAD との比較はできない。
動いていたら差分のコミットを出す。
gh api "repos/OWNER/REPO/compare/<commit_id>...<headRefOid>" --jq '.commits[] | "\(.sha[0:9]) \(.commit.message | split("\n")[0])"'
自分の [must] で未解決のスレッドを引く。
gh api graphql -f query='query{repository(owner:"OWNER",name:"REPO"){pullRequest(number:<PR>){reviewThreads(first:100){nodes{isResolved comments(first:1){nodes{author{login} body url}}}}}}}' \
--jq '.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved | not) | .comments.nodes[0] | select(.author.login=="<自分>" and (.body | test("(^|\n)\\[must\\]"))) | .url'
jq の test には複数行のフラグが無く、^ は本文の先頭にしか当たらない。本文の1行目はメンションなので、改行を明示して2行目の prefix を拾う。
総括コメントに置いた [must] はスレッドにならないので、この検索に出ない。 自分のレビュー本文に [must] があれば、その本文の URL も並べ、直ったかは人が見ると添える。
3. 結果とコマンドを示す
4項目を1つの表で返し、最後にコマンドを1行で置く。コマンドは ! を付けた形で示す(そのまま打てば、このセッションで実行される)。
| 項目 | 結果 |
| --- | --- |
| 作成者 | 自分ではない(<login>) |
| HEAD | 前回レビュー(<sha>)から動いていない |
| CI | 7本すべて pass |
| 自分の must | 未解決なし |
approve するなら:
! gh pr review <PR> -R OWNER/REPO --approve
やってはいけないこと
- approve を自分で打つこと。フックが止めるが、止められる前提で打たない。人が打つまで待つ
- 引っかかった項目を理由に、コマンドを示さずに終えること。止めるかは人が決める(作成者が自分のときを除く)
gh apiで"event":"APPROVE"のレビューを投稿すること。フックの外の経路で、同じく人の判断を飛ばす- 引数が無いときに、現在のブランチの PR を対象にすること
関連
/review-pr(レビューの投稿): 指摘を書いて投稿するのはあちら。approve の見立てもあちらが会話で渡す。本スキルは人が approve すると決めた後の確認だけを持つno_operating_on_others_prs.md(他人の PR は触らない): approve はレビューする側の行為で、作成者の領分には入らない。本スキルもコメント・本文には触れない