codex/profiles/xsv-linux-1/skills/respond-to-pr-reviews/SKILL.md
GitHub PR のレビュースレッドを取得し、返信コメントと `resolveReviewThread` GraphQL mutation まで使って完走クローズする skill。`gh` CLI には resolve 相当コマンドが無いため、reply + resolve のループは GraphQL 直接呼び出しが必須で、このノウハウは本 skill にしかない。TRIGGER when: ユーザーが「PR のレビュー対応」「PR #N のコメント捌いて」「未 resolve スレッドを片付けて」「CodeRabbit / Gemini / Codex のレビュー対応」「レビューに返信して resolve」等を依頼した時、または「PR に bot から指摘が N 件来た」「スレッドが open のまま」「レビュー受けたけど返信忘れそう」等の状況説明があった時。自分で `gh pr view --comments` と手動 commit で捌こうとすると (1) `isResolved` 状態が取れない (2) resolve もできない (3) reply 忘れが頻発、のため必ず本 skill を起動すること。SKIP: 自分が PR を review する側(「この PR を review してほしい」「コードの気になる点を指摘して」)は review-pr / codex-review 側。PR 作成・マージ・レビュアー指名も別スキル。
npx skillsauth add seika139/dotfiles respond-to-pr-reviewsInstall 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.
Pull Request に付いたレビューコメントに対して、妥当性判断 → 対応 → 返信 → resolve の 1 サイクルを、全スレッドが片付くまでループするスキル。
普通にコードを直して push するだけだと、以下のような見落としが起きる:
このスキルは上記を「必ず全スレッド resolve する」「必ず返信を残す」という workflow で防ぐ。
gh CLI が認証済み┌───────────────────────────────────────────┐
│ 1. 対象 PR を特定 │
│ 2. 未 resolve のレビュースレッドを列挙 │
│ 3. 各スレッドに対して: │
│ a. 妥当性判断 │
│ b-1. 妥当 → 修正 → commit → push │
│ b-2. 不要 → 理由を明確化 │
│ c. スレッドに返信コメント │
│ d. resolveReviewThread で resolve │
│ 4. 再度スレッド一覧を取得 │
│ 新規レビューがあれば 2. に戻る │
│ 無ければ完了 │
└───────────────────────────────────────────┘
ユーザーが PR 番号を指定していればそれを使う。指定がなければカレントブランチから特定する。
# 引数で指定された場合
PR_NUMBER=13
# カレントブランチから特定(このコマンドは現ブランチの PR を返す)
PR_NUMBER=$(gh pr view --json number --jq '.number')
特定できなかったら skill を終了し、ユーザーに「対象 PR を教えてください」と聞く。
重要: gh pr view --comments は body しか返さず isResolved を含まない。必ず GraphQL の reviewThreads を使う。
gh api graphql -f query='
{
repository(owner: "OWNER", name: "REPO") {
pullRequest(number: PR_NUMBER) {
reviewThreads(first: 50) {
nodes {
id
isResolved
isOutdated
path
line
comments(first: 10) {
nodes {
author { login }
body
createdAt
url
}
}
}
}
}
}
}'
そして isResolved == false のスレッドだけを処理対象にする。isOutdated は無視する(コードが変わっていても会話は未解決というケースが多い)。
コメント本文を読み、以下のどれに該当するかを判断する:
| 判定 | 基準 | アクション | |---|---|---| | Major / Critical | アーキテクチャ変更、API 破壊、依存追加、ユーザー体験に影響する挙動変更 | 必ずユーザーに確認してから進める | | Minor / Nit | typo、ドキュメント微修正、コメント、軽い refactor、ログ改善 | 自律的に判断して OK | | 不要 | 既に別の方法で解決済み、既存の設計意図と合わない、誤読による指摘 | 理由を明文化してユーザーに確認 |
bot レビューでは本文先頭に priority / severity (🔴 Major, 🟡 Minor など) が書かれていることが多いので、判断の参考にする。
bot の主張は 古い情報に基づくことが多い。手を動かす前に、指摘内容を独立して再現・検証する:
package.json / pyproject.toml など): 変更前に必ず現行版の実態を確認する。
npm view @typescript-eslint/parser@<current> peerDependenciespip show <pkg> / cargo search <crate>検証結果が bot の主張と食い違った場合、修正せずに「確認した結果、問題ありません」 と返信して resolve する道を優先する。PR に不要な差分を足さない方が価値が高い。
Read で確認Edit で修正mise run test、uv run pytest、npm test、cargo test など)
"PR レビュー対応""hook のタイムアウトと OSError ハンドリングを追加"git push で同一ブランチに push以下のどれかに当てはまることを確認:
必ず具体的な理由を用意する。定型文「問題ありません」では伝わらない。
これが一番抜けやすいステップ。修正した場合でも、不要と判断した場合でも、必ず返信を残す。
返信は gh api でスレッドに対して post する:
# review comment に reply するには、元コメントの id が必要
gh api --method POST \
"repos/OWNER/REPO/pulls/PR_NUMBER/comments/COMMENT_ID/replies" \
-f body="..."
返信の書き方:
| 状況 | 返信例 |
|---|---|
| 修正した | ご指摘ありがとうございます。〜の commit (SHA) で対応しました。 + 補足 |
| 修正不要 | ご指摘ありがとうございます。〜の理由でこの実装を維持します。 |
| 部分対応 | 〜の部分は反映しました。〜は別 PR で扱います(理由: XXX)。 |
gh CLI には resolve コマンドが無いので、GraphQL で叩く。scripts/resolve_thread.sh を使うか、以下を直接実行:
gh api graphql -f query='
mutation($threadId: ID!) {
resolveReviewThread(input: {threadId: $threadId}) {
thread { isResolved }
}
}' -f threadId="$THREAD_ID"
返り値が isResolved: true になっていることを確認する。
push すると CI 経由で新しい bot レビューが付くことがある(CodeRabbit は push 毎に再レビューする)。全スレッドを resolve した後、もう一度 Step 2 のクエリを叩いて、未 resolve スレッドが増えていないか確認する。
無限ループ防止のため、同じ内容のレビューが繰り返し付く場合は 2 周目で止めてユーザーに相談する。
以下は gh CLI のサブコマンドが無いため、GraphQL 経由で叩く必要がある:
reviewThreads の取得(isResolved を含む)resolveReviewThread mutationunresolveReviewThread mutationscripts/resolve_thread.sh と scripts/list_unresolved_threads.sh に便利スクリプトを用意してある。
| bot | 修正後の自動 resolve | 備考 |
|---|---|---|
| CodeRabbit | ✅ 自動で resolve してくれる | fix committed のような返信にすると resolve する |
| Gemini Code Assist | ❌ 自動 resolve しない | 必ず明示的に resolve する |
| CodeX | 状況による | 様子を見つつ明示 resolve を推奨 |
| 人間レビュアー | ❌ レビュアー自身が resolve するのが本来の流儀 | 返信だけして resolve は相手に任せるのが無難な場合もある |
人間レビュアーのコメントに対しては、返信を残した後 resolve するかはユーザーに確認する。自分から resolve すると「ちゃんと議論が終わったの?」という印象を与えることがある。
push 直後に CI が走り始め、新しい bot レビューが数分後に付くことがある。Step 4 のループでスレッドを再取得するタイミングは、push から少なくとも 1〜2 分は待つのが良い。待たない場合は「CI 完走後に再チェック」とユーザーに伝えて一旦止める。
たまに「別のセッションが同じ PR を触っている」ことがある。最初に git log origin/<branch> -5 でリモートの最新コミットを確認し、自分のローカル作業より先に進んでいたら一度 pull してから判断する。diverged なら skill を止めてユーザーに報告。
レビュー対応中に、コメントに含まれない別の問題(CI が既に red、別の deprecation warning、他ファイルの lint 違反など)を発見することがある。判断基準:
原則:PR の本来の目的を膨らませない。skill の価値は「レビューを完走する」ことで、「ついでにリファクタする」ことではない。
skill 完走時は以下を報告する:
## PR #N レビュー対応完了
- 処理したスレッド数: X
- 修正対応: Y スレッド (commit SHA の一覧)
- 修正不要: Z スレッド (判断理由付き)
- 追加 push: N commits
- 未 resolve 残: 0 件 (または「人間レビュアー N 件は返信のみ、resolve は相手に委ねる」)
- CI 状況: ALL GREEN / 〜 待ち
scripts/list_unresolved_threads.sh <pr-number> — 未 resolve スレッドを JSON で出力scripts/resolve_thread.sh <thread-id> — スレッドを resolvescripts/reply_to_thread.sh <comment-id> <body> — スレッドに返信これらは GraphQL / gh api のラッパー。直接呼んでも良い。
tools
git worktree で隔離された作業環境を作成する。Claude command /worktree 相当を Codex CLI で実行する。
tools
AI ペルソナで Playwright MCP 経由の UX レビューを実施する。Claude command /ux-review 相当を Codex CLI で実行する。
tools
汎用的なフォントを避け、デザイン性の高いタイポグラフィを選択してフロントエンドの質を向上させるスキル。UI制作やLP作成時に使用します。
tools
Issue を作成(または既存 Issue を指定)し、実装して PR を作成する。Claude command /solve-issue 相当を Codex CLI で実行する。