Claude Code CLIで実装計画レビューの改善ループを回す。実装計画ファイルと要件ファイルを指定し、Claude Codeにレビューさせ、指摘をトリアージして計画を修正し、再レビューする。
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
他の開発者のGitHub PRを下読みしてレビューコメント案を作り、人間が承認した内容だけを保留(PENDING)レビュー経由で投稿する。自作PRの修正ループには codex-pr-review-loop / claude-pr-review-loop を使う。
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
他の開発者が作成したPull Requestをレビューする際の支援を行います。あなた(このスキルを実行するエージェント)がPRの背景とコードベースを読み込んで報告書とコメント案を作り、ユーザーが承認した内容だけを、同梱スクリプトが保留(PENDING)レビューとしてGitHubに作成・送信します。
スクリプト: ${CLAUDE_SKILL_DIR}/scripts/pr_review_draft.py(python3 標準ライブラリのみで動作。git / gh を外部コマンドとして使用。${CLAUDE_SKILL_DIR} が展開されない環境では、このSKILL.mdがあるディレクトリに読み替える)
gh pr comment gh pr review gh api(POST/PATCH/DELETE)等を直接実行してコメント・レビューを投稿することを禁止する。読み取り専用の呼び出し(gh pr view gh issue view、参照のための gh api / gh api graphql 等)はこの禁止の対象外である。公開行為は submit 一点のみで、それはユーザーの明示的な承認と承認ハッシュを必要とする。stage は保留レビューの作成、abandon は自分が作成した未送信の保留レビューの削除で、どちらも公開状態を作らない(承認していない文章が公開される経路を作らないため)作者は自立した開発者として扱う。テストの実行や動作確認など作者の検証作業(「実施済み」と申告されたその他の作業を含む)は済んでいる前提で読み、実装方針も作者自身が考えて選べるものとして扱う。
gh コマンドがインストール済み・認証済み(対象リポジトリへのアクセス権があること)ユーザーの指示からPRのURLを特定する: $ARGUMENTS 。不足している場合はユーザーに確認する。
python3 "${CLAUDE_SKILL_DIR}/scripts/pr_review_draft.py" start --pr "<PRのURL>"
runDir と worktree を控え、以後のコマンドで使う(cloneDir は最後のworktree片付けで使う)requiredReading が必読対象の一覧(R1=PR説明文、R2以降=Development欄・PR本文からリンクされたGitHubのIssue・PR・Discussion、CI実結果、既存コメント全系統)referenceLinks はGitHub外のURL(スプレッドシート等の外部資料)と既存コメント内のリンク。R番号は付かないが、PRの理解に関わるものは読み、読めなかったものは報告書に明示する。読めた外部資料は本文テキストを <runDir>/collected/extra/ に保存する(用語検査の共有文脈に含まれ、外部資料にしか登場しない識別子が「出典不明の用語」と警告されなくなる)waivers は過去のレビューで見送った指摘。同じ指摘を再提案しないwarnings が空でなければユーザーに伝えるpr.changedFiles が50超または pr.additions+pr.deletions が3000超の目安)では、生成物・lockfileを除外し、ロジック→設定→テスト→ドキュメントの順に分けて読む計画を立て、読み切れなかった範囲は報告書に「未レビュー」と明示する必読対象を1件ずつ実際に読み、状態を記録する。全件の記録が揃うまで draft は実行できない。
# 読了した場合(一行要約を必ず書く)
python3 "${CLAUDE_SKILL_DIR}/scripts/pr_review_draft.py" reading --run "<runDir>" --item R2 --read --summary "認証エラー時のリトライ仕様を定義したIssue"
# 読めなかった場合(権限なし・リンク切れ等。理由を必ず書く)
python3 "${CLAUDE_SKILL_DIR}/scripts/pr_review_draft.py" reading --run "<runDir>" --item R3 --unreadable --reason "リンク先Issueが非公開リポジトリにあり閲覧権限がない"
<runDir>/collected/pr.json または gh pr view <URL> で読む。リンク先がIssueなら gh issue view <URL> --comments、PRなら gh pr view <URL> --comments、Discussionなら gh api graphql で読む。CI実結果は <runDir>/collected/checks.txt と checks.json、既存コメントは <runDir>/collected/ 配下を読むpython3 "${CLAUDE_SKILL_DIR}/scripts/pr_review_draft.py" check --run "<runDir>" が complete: true を返すまで、手順4(報告書の提示)に進まない。falseなら手順2に戻るworktree(PRのhead時点の完全なツリー)で読む。diffだけで判断せず、変更が参照・影響する周辺コード・呼び出し元・テストまで読む<runDir>/collected/diff.patch にあるcheck --run "<runDir>" で complete: true を確認してから、以下の構成でユーザーに提示する。
提示の前に、各指摘を「コメント文面の行動規範」で自己点検し、本文に誤字・脱字がないか読み直す(満たさない懸念の扱いも同規範に従う)。
指摘が1件も無い場合は「問題は見つからなかった」と明確に述べる。指摘ゼロは正当な結果である。
コメント案をJSONファイル(例: <runDir>/draft.json)に書き、検証する。
python3 "${CLAUDE_SKILL_DIR}/scripts/pr_review_draft.py" draft --run "<runDir>" --file "<runDir>/draft.json"
書式:
{
"summary": "対応ありがとうございます!コメントしたので確認をお願いします🙏",
"comments": [
{
"id": "C1",
"kind": "ask",
"path": "src/api/client.py",
"side": "RIGHT",
"line": 42,
"body": "この分岐で `retry_count` が0のままになるように見えました。◯◯の場合の再試行は不要という理解で合っていますか?",
"reason": "再試行仕様(Issue #12)との不一致の可能性",
"evidence": {
"quotes": [
{"path": "src/api/client.py", "start_line": 40, "end_line": 43, "text": "(worktreeの実内容と一致する引用)"}
],
"ci": [
{"check": "test", "conclusion": "success"}
]
},
"unread_premises": ["R3"]
}
]
}
summary は固定文(文言の規定と例外は「コメント文面の行動規範」のまとめ文の規則を参照)kind は must / imo / ask / nits / suggestion。バッジはスクリプトが本文先頭に自動で付ける(自分で書かない)side は RIGHT=変更後の行(追加・コンテキスト行)、LEFT=削除された行。複数行は start_line / start_side を追加reason は必須: この指摘を放置すると何が起きるか、askの場合は何を確認したいかunread_premises: そのコメントが前提にできなかった必読対象のR番号の配列。「読めなかった」と記録済みのR番号だけを書ける(該当が無ければ省略する)evidence.quotes)はworktreeの実内容と、CIへの言及(evidence.ci)は収集済みの実結果と機械照合される。不一致はエラーになるevidence.ci が必須(無い場合はエラー。実結果に基づかない合否予想を書かないため)render/preview.md(投稿物ビュー)と render/list.md(一覧表)が生成される。preview.md の内容を要約せずそのままユーザーに提示する(これが「公開される文字列そのもの」である。例外はApprove時のみで、まとめ文末尾にLGTM画像がスクリプトで追記される。その最終形は approve 出力の summaryFinal で確認する)。チャットに貼るときは preview.md の ~~~ の囲いをそのまま使い、``` で囲い直さない(本文に修正案のコードブロック ``` が含まれると、外側の ``` が内側で閉じて本文が途中で切れて表示されるため)ユーザーの指示(例: 「C1とC2は採用、C3は文面差し替え、C4は見送り」)に従う。取捨選択の指示は送信の指示ではない(送信は手順8で改めて指示を受ける)。
python3 "${CLAUDE_SKILL_DIR}/scripts/pr_review_draft.py" approve --run "<runDir>" --post C1,C2 --skip C3,C4
approvedHash を控える。見送った指摘は記録され、次回の再提案が抑止されるユーザーがPRの承認(Approve)を明示的に指示した場合は、先にLGTM画像を選んでから --event approve を付けて承認する。指摘の内容から独断でApproveを判断しない。Approveの指示は送信種別の指定であり、送信の指示を兼ねない(送信は手順8で改めて指示を受ける)。
# LGTM画像を選ぶ(--id 省略時はランダム。選び直しは lgtm の再実行、--id <番号> で固定も可能)
python3 "${CLAUDE_SKILL_DIR}/scripts/pr_review_draft.py" lgtm --run "<runDir>"
python3 "${CLAUDE_SKILL_DIR}/scripts/pr_review_draft.py" approve --run "<runDir>" --event approve --post C1 --skip C2
imageUrl と、approve の出力の summaryFinal(公開されるまとめ文そのもの)をユーザーに提示してから手順7に進む"comments": [] で通し、--post / --skip なしで approve する。まとめ文は指摘ゼロ用の固定文を使う)python3 "${CLAUDE_SKILL_DIR}/scripts/pr_review_draft.py" stage --run "<runDir>" --approved-hash "<approvedHash>"
viewUrl を伝え、GitHub上でも実際の見た目を確認できることを案内するユーザーが送信を明示的に指示した場合のみ実行する。
python3 "${CLAUDE_SKILL_DIR}/scripts/pr_review_draft.py" submit --run "<runDir>" --approved-hash "<approvedHash>"
approve --run "<runDir>" --adopt-staged で再承認し、新しいハッシュで submit し直す。元の送信種別が APPROVE の場合は --event approve も付けて再承認する(--event を省略すると COMMENT に戻る)abandon --run "<runDir>" を実行する(自分が作成した未送信の保留レビューを削除する。公開済みの内容には影響しない)status --run "<runDir>" で必読ゲート・承認・stageの状態を確認し、続きから進めるgit -C "<cloneDir>" worktree remove "<worktree>"(<cloneDir> は start / status の出力にある)start --repo-dir <path>: 対象リポジトリのローカルcloneを明示指定する(省略時はカレントディレクトリ→キャッシュの順に自動解決)start --config <path>: 設定ファイル(JSON)を指定する。使えるキーと既定値はスクリプト冒頭の DEFAULT_CONFIG を参照。例: 本文中の@メンションは既定で全面禁止だが、{"allowedMentions": ["some-user"]} で明示許可できるこの規範は、行コメントの本文とレビュー全体のまとめ文(summary)の両方に適用する。
コメント案に採用できるのは、次のすべてを満たすものだけである。満たさない懸念は、報告書の「投稿しない指摘」に事実として書く(作者への疑いの形にしない)。
reason に書く内容そのもの)例外: 読めなかった必読対象(R番号付きのもの)と、読めなかった参照資料(referenceLinks にあるリンク先。スプレッドシート等の外部資料と既存コメント内のリンクを含む)への閲覧権限の依頼は、上の条件によらず採用できる(根拠は「読めなかった」という記録・事実)。関連する行があれば ask の行コメントとして、無ければまとめ文の固定文の後に書き足す。
次の2つは、種別(must / imo / ask / nits / suggestion)を問わず、行コメントにもまとめ文にも書かず、報告書でも指摘の形にしない。過去のレビューで実際に問題となった行為への対処として定めた規則である。「投稿できるコメントの条件」の例外に定めた閲覧権限の依頼は、どちらの禁止の対象外である。
丁寧な提案形・質問形で書く。断定・命令調は使わない。指摘の重要度は文面ではなくバッジ(kind)で表現する
事実の対比と提案・質問だけで組み立てる。理由を教え諭す説明、作者の作業ぶりを評価する言い回し、採用を促すための説得材料(修正の安さや放置した場合の将来の手間の見積もり等)は書かない(内容が正しくても、教える側・評価する側の物言いとして届くため)
命名・設計の代替案を提案するときは、今の名前・設計を「分かりにくい」「読み取りにくい」と評する文を書かず、自分の案のほうが分かりやすいと感じた点を「私は〜と感じました」の一人称で書き、採否を作者に委ねる(今の選択を評する文は、根拠が正しくても作者への批判として届くため)。例:
cached_usersについて、名前の案を 1 つ共有させてください🙏設計書で「先読みした利用者」と書かれていたので、
prefetched_usersのように役割をそのまま表す名前のほうが、私は中身を思い浮かべやすいと感じました。採否はお任せします!
本文は前置きなしに本題から書き、短くまとめる。行コメントは「何が問題か・何を確認したいか(前提の説明が要る場合は、前提となる変更 → 残っている問題 → 起きる結果の順に1文ずつ)→作者が自分で確かめるための最小限の根拠(参照先・引用・テスト名などを1つ程度)→修正案(あれば1〜2文。規約・ドキュメント・コメント文の書き換えを提案するときは、差し替え後の文章そのものをコードブロックで添える。この文章の分は3〜5文の目安に含めない。方針だけを示すと、作者に文章を考え直す作業が残るため)」の順で組み立て、全体で3〜5文を目安にする。検証の詳しい過程・出典の列挙・影響範囲の網羅・並行する別経路との比較は本文に載せず、報告書と draft.json の evidence / reason に残す(コメントを読むのは人間で、長い説明は要点を埋もれさせる。詳細な根拠は evidence の機械照合と報告書に残るため、本文は作者が確かめるのに足りる最小限でよい)
1文には1つの内容だけを書き、別々の内容を1文に圧縮しない(詰め込まれた文は、読者が頭の中で分解し直すことになるため)
日本語で書く場合、1〜2文ごとに段落を分け、段落末の文を「。」で終えない。「!」「?」・絵文字・「)」で締めるか、「〜ます」「〜でした」のまま句点を付けずに止め、番号付き手順の直前の導入文も段落末として同じ扱いにする(「。」で終わる文が続く文面は事務的で、読み手を突き放した印象を与えるため)
絵文字は 👍 👌 👀 🙏 の4種類だけを、1コメントに0〜2個の目安で使う(少量は文面を柔らかくするが、種類や数が増えると内容より絵文字のほうが目立つため)。「〜させてください」「〜をお願いします」のようなお願いの文には 🙏 を、「〜に見えました」のような観察した事実の文には 👀 を付ける(お願いの文に 👀 を付けると、相手の様子をうかがう意味に読めるため)
上の規則を適用した行コメントの例:
この分岐で
retry_countが0のままになるように見えますそのため、◯◯の場合に再試行が効きません👀
tests/test_client.py55行目の期待とも一致していませんでした◯◯を☓☓に変えるのが素直かと思いました!
不具合の再現経路に限らず、複数の前提が順に重なって結果に至る説明は、散文に詰め込まず番号付きの手順で書く。1ステップには1つの事実だけを書き、最後のステップは観測できる結果(HTTP 500が返る等)で終える。この形式は手順の分だけ長くなってよい(3〜5文の目安の対象外。複数の前提を1文に圧縮すると、読者が前提の順序を頭の中で組み立て直すことになるため)。例:
この行で親レコードの key を決める処理が、次の手順で 500 になるように見えます👀
- 親レコードがまだ無い既存データを、この API で更新しようとする
- 親レコードを探す
resolve_parent_keyが None を返す- None のまま INSERT が実行され、NOT NULL 制約違反になる
- この例外は
except ValueErrorに拾われないため、HTTP 500 が返る2 の時点で「先に親レコードを取り込んでください」のようなエラーで返すのが良さそうです!
1つのコメントで扱う話題は、そのコメントを付けた行の話題だけにする。離れた場所のコードで起きる問題まで1つのコメントで説明せず、その問題が起きる行への別コメントに分ける(行コメントは直上に該当コードが表示されるため、話題ごとに該当行へ置くと「ここ」「この処理」の指す対象が読者に見え、説明が短くなる)
不明点は決めつけずに ask で質問する。確認できていない前提(読めなかった必読対象等)は本文で開示する。例:
説明欄にあるスプレッドシートを拝見できませんでした。差し支えなければ閲覧権限の追加をお願いします
スプレッドシートを確認できていない前提ですが、◯◯は☓☓のほうが安全に見えました。スプレッドシートに根拠がある場合はこの提案は不要ですので、お知らせいただけると助かります🙏
まとめ文(summary)は次の固定文をそのまま使い、設計の講評・良い点・指摘の予告・件数の案内を足さない(まとめ文を自分で組み立てると講評や称賛が混ざり、作者を評価する側の言葉になるため。Approve時のLGTM画像の追記はスクリプトが行う):
対応ありがとうございます!コメントしたので確認をお願いします🙏
指摘ゼロでApproveだけを送る場合は、コメントが無いのに「コメントした」と書かないよう、代わりに次の固定文を使う:
対応ありがとうございます!LGTMです👍
固定文の後に書き足してよいのは、行コメントにできない閲覧権限の依頼(「投稿できるコメントの条件」の例外)だけである。対象リポジトリの主要言語が日本語でない場合は、固定文と同じ内容を対象言語で書く
褒め言葉・良い点への言及は書かない(称賛は作者を評価する側からの言葉になり、相手を下に見ていると受け取られ得るため)
レビュー対象の変更が何をするかの説明は、「この変更で◯◯は☓☓だけを保存するようになると理解しています」のように「〜と理解しています」の形で自分の読み取りとして書き、断定しない(変更の挙動の説明はレビューする側の解釈であり、読み取りとして書くと、誤読があったときに作者が訂正しやすいため)
作者の申告(PR本文・チェックリスト・コメント等の「実施済み」「確認済み」)に触れるときは「作者の申告によれば」と出典が分かる書き方をし、自分が検証した事実と区別する
CIの設定内容は運用の選択の証拠として読む。CIに含まれていない検証がある(例: 実行時間の長いテストを各自の手元で実行する運用)のは意図的な選択であることが多く、CIの設定内容(手動起動専用のワークフロー・特定テストの除外等)を「実施していない」疑いの根拠として使わない。運用そのものへの疑問はコメント案にせず報告書に書く。ただし、このPRのdiff自体がCI設定・テスト設定を変更していて、その変更に欠陥がある場合は、通常どおり証拠を添えて指摘する
作者に作業を依頼してよいのは、次の2つに限る: (1) 読めなかった必読対象・参照資料への閲覧権限の依頼(「投稿できるコメントの条件」の例外) (2) diffに実在する問題への対処に必要な作業を、証拠を添えて伝える場合(例: 誤ってコミットされた認証情報の無効化)。採否を作者に委ねる提案(imo / suggestion。例: PR本文やドキュメントの説明を補う提案)は依頼ではなく、この制限の対象外である
既存のレビューコメントと重複する指摘は投稿しない(既存コメントは必読対象として読了済みである)
用語は次の3種のみ使う: (1) 一般に通用する技術用語 (2) コード・diffに実在する識別子(バッククォートで原文どおり) (3) PR説明・Issue・既存のレビューコメント・CI実結果・対象リポジトリのドキュメントに登場する用語。独自の略語・複合造語・圧縮語を作らず、実在する識別子(テーブル名・関数名・カラム名・APIパス等)と平易な日本語だけで文を組み立てる(警告の扱いは手順5のとおり)。テーブル・カラム・関数・ファイルを指す語は、その種別を表す一般名詞で済ませず、実在する名前をバッククォートで書く(名前が無いと、読者に該当箇所を探す作業が残るため)
(3)の内部用語は、作者を含む読者が知っている前提にしない。PR本文に載っている用語でもそのまま使わず、意味を表す定義文に言い換えて書く(例: PR本文の独自用語を書く代わりに「draft の行が正規マスタへの反映の対象になるための条件」のように定義で書く)。用語をそのまま使う必要がある場合は、初出時に定義と出典を併記する(PR本文自体がAIで書かれていることがあり、本文に載っている用語を作者自身が把握しているとは限らないため)
同じ物を指す語は、1つのコメントの中でもレビュー全体(コメント間・まとめ文)でも1つに統一する。区別が必要になったときは別の語に言い換えず、同じ基本語に修飾を付ける(例: 「冪等キー」と「古い冪等キー」)(途中で呼び方が変わると、読者には別の物が増えたように読めるため)
逆接の接続詞は「しかし」に統一する(逆接語を使い分けると、読者がそこにニュアンスの差を探すため)
動作の説明には、比喩的・多義的な動詞を使わず、実際に起きることを表す動詞(除外される・捨てられる・上書きされる・付かなくなる等)を使う(比喩の動詞では、どの動作を指すのか読者が特定できないため)
影響の大きさは「問題はないと思います」のような日常の平易な言い回しで書く(かたい漢語は程度を実際より大きく響かせるため)
仕様と実装、設計と実装のように2つの内容が合っていないことは、「異なります」「一致していません」と書くか、双方の内容を並べて事実だけを書く。「食い違い」という語は使わない(差の中身が語に隠れて、何がどう違うのかが伝わらないため)
コメントの言語は対象リポジトリの主要言語(startの出力 language。PR本文・既存コメントから判定される自然言語)に合わせる。unknown の場合はPR説明文の言語に合わせる
suggestion ブロック(コード修正案の埋め込み): 使用しない(修正案は本文の説明で示す)| 症状 | 対応 |
|---|---|
gh のTLS証明書エラーや接続失敗 | Bashのサンドボックスが原因のことがある。サンドボックス無しで再実行する |
| stage が「既にあなたの保留中レビューが存在します」で失敗 | ユーザーに保留レビューの扱い(GitHub上で送信/破棄)を確認してから再実行する。自スクリプトがstageしたものなら abandon で削除できる |
| stage/submit が「PRのheadが変わっています」で失敗 | 作者が新しいコミットをpushしている。手順8のとおり変化の内容をユーザーに報告して指示を仰ぐ。再レビューの指示を受けたら start からやり直す(保留レビューが残っている場合は先に abandon で削除する) |
| submit が「保留レビューが承認内容と一致しません」で失敗 | 手順8の同名の項の手順で対処する(--event の引き継ぎに注意) |
| gh api が 422 で失敗 | スクリプトがAPIのエラー本文を表示する。全文をそのままユーザーに報告する(行アンカーの仕様に関わる情報のため省略しない) |
| lgtm がLGTM画像一覧の取得に失敗 | Bashのサンドボックスによる外部ホスト(lgtmeow.com)遮断が原因のことがある。サンドボックス無しで再実行する |
| clone / fetch に失敗 | 対象リポジトリへのアクセス権と gh auth status を確認する |
| 実行ディレクトリを失った | start を再実行してよい(見送った指摘・投稿履歴は実行ディレクトリに残っている場合のみ引き継がれる) |
event 省略でPENDING、送信は .../events、削除は未送信のみ)line / side の定義(position は廃止予定): https://docs.github.com/en/rest/pulls/comments?apiVersion=2022-11-28event は APPROVE / REQUEST_CHANGES / COMMENT の必須パラメータ: https://docs.github.com/en/rest/pulls/reviews?apiVersion=2022-11-28 (Submit a review for a pull request)id と imageUrl の配列を返す。返る一覧は取得のたびに変わる)아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
Claude Code CLIで実装計画レビューの改善ループを回す。実装計画ファイルと要件ファイルを指定し、Claude Codeにレビューさせ、指摘をトリアージして計画を修正し、再レビューする。
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Claude Code CLIでGitHub PRのコードレビューループを回す。PRのURLを指定し、Claude Codeにレビューさせ、指摘をトリアージしてコードを修正し、再レビューする。PRにリンクされたIssue等は必読として機械的に検証する。
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
コード・テストコード・コミットログ・コードコメントのどこに何を書くかを決めるときに使う。コードには How、テストコードには What、コミットログには Why、コードコメントには Why not を書き分ける。実装時とコミット・PR 作成時に使う。
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
コードの識別子(変数・関数・メソッド・クラス・型・ファイル)に名前を付けるときに使う。get の濫用をやめ、何をして値を得るのかが名前から読み取れる状態にする。実装時と、実装計画でメソッド名・クラス名を決めるときの両方で使う。
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Codex CLIで実装計画レビューの改善ループを回す。実装計画ファイルと要件ファイルを指定し、Codexにレビューさせ、指摘をトリアージして計画を修正し、再レビューする。
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Codex CLIでGitHub PRのコードレビューループを回す。PRのURLを指定し、Codexにレビューさせ、指摘をトリアージしてコードを修正し、再レビューする。PRにリンクされたIssue等は必読として機械的に検証する。
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.