| name | plan-rule-review-run |
| description | plan-rule-review フック専用。手動・自動を問わずこのスキル名で明示起動されたときのみ実行する。 |
| allowed-tools | Bash(node:*), Task |
| user-invocable | false |
| model | sonnet |
Plan Mode のプランがプロジェクトルールに違反していないかをレビューします。
レビュー判定そのものは、あなた(本体)ではなく独立した文脈のサブエージェントに行わせます。あなたはサブエージェントの判定を受け取り、それに従って ExitPlanMode を再度呼ぶだけです。自分でルールを読んでレビューしないでください(自分の書いたプランを甘く自己レビューするバイアスを避けるため)。
前提(あなた・サブエージェント双方に適用):
- すべてのツールは正常に動作する前提で使うこと。動作確認のための試し打ちはしない。
- ファイルの読み込みは判定に必要な範囲のみ行う。
レビュー対象のプラン全文は、このスキルを起動した指示(フックの reason)の中の <<<PLAN と PLAN で囲まれたブロックに含まれている。この区切りの間にあるテキストをプラン全文として扱い、以下の手順を厳密に実行してください(引数では渡されない。複数行の Markdown であるため)。
手順1: 変更対象ファイルパスを抽出する
プラン全文から、変更(作成・編集・削除)予定のファイルパスを列挙する。リポジトリルートからの相対パスにすること。プラン記述から未確定な箇所は合理的に推測してよいが、明らかに無関係なパスは含めない。
新規作成ファイルの推測(重要): プランに具体的なファイル名が書かれていなくても、新規作成・生成(「〜を生成する」「〜を追加する」「ジェネレータで作る」等)を示唆する記述があれば、このプロジェクトの慣例に従って配置先ディレクトリを推測し、代表パスを必ず1つ以上含めること。ファイル名が未確定ならプレースホルダ名(例: path/to/dir/new_file.ext)でよい。後段の glob 照合はディレクトリ・拡張子レベルで行われるため、ファイル名が暫定でも対象ルールは正しく絞り込まれる。これを省くと、新規作成ファイルに適用されるべきルールが照合対象から漏れる。
手順2: 該当ルールファイルを決定論的に絞り込む
node ${CLAUDE_PLUGIN_ROOT}/skills/plan-rule-review-run/scripts/collect-plan-rules.mjs <file1> <file2> ...
手順1で抽出したファイルパスをすべて引数に渡して実行する。スクリプトは標準出力に以下を含む JSON を出力する:
claudeMd: 適用される CLAUDE.md のパス一覧(変更対象ファイルを含むディレクトリ・その祖先ディレクトリ配下の CLAUDE.md。ルート直下の CLAUDE.md はグローバルルールとして除外される)
rules: 適用される .claude/rules/ 配下のルールファイル一覧。各エントリは path と paths(frontmatter の値)を持つ。paths: が指定され、かつ変更対象ファイルのいずれかがその glob パターンに一致するものだけが含まれる(paths: 未指定=全ファイル適用のグローバルルールは除外される)。
ルート直下の CLAUDE.md と paths: 未指定のグローバルルールを除外するのは、これらがプロジェクト全体に無条件で効くため確実に読み込み済みでプランに反映されている可能性が高く、レビューが無駄になりやすいためである。
このスクリプトが glob 照合を機械的に行うため、サブエージェントは該当ルールを自分で探す必要がない。
スクリプト出力の claudeMd と rules がどちらも空の場合、レビュー対象のプロジェクトルールが1つもない状態である。この場合は手順3のサブエージェントを起動せず、本体がプラン本文の末尾に <!-- plan-rule-review: passed --> を1行で追記して ExitPlanMode を呼ぶ(手順3・4は実行しない)。claudeMd または rules のいずれかに1件でもエントリがあれば手順3へ進む。
手順3: レビュー専用サブエージェントを起動する
Task tool で general-purpose サブエージェントを 1 つだけ 起動し、次の内容を渡す。プラン全文と、手順2で得た claudeMd / rules のパス一覧を埋め込むこと。
あなたはプロジェクトルール準拠レビュー専用のレビュアーです。
以下のプラン(実装計画)が、列挙されたプロジェクトルールに 違反していないか だけを判定してください。
前提:
- すべてのツールは正常に動作する前提で使うこと。動作確認のための試し打ちはしない。
- 読み込むのは下記「適用ルールファイル」に列挙されたファイルのみ。それ以外のルールファイル・ガイドラインを探したり読んだりしないこと。列挙は機械的な glob 照合で確定済みであり、該当ルールを自分で探す必要はない。
レビュー対象のプラン全文:
(ここにプラン全文をそのまま埋め込む)
適用ルールファイル(このパスのファイルのみ読むこと):
- CLAUDE.md: (claudeMd の各パス)
- .claude/rules: (rules の各 path)
判定観点:
- プランがそれらルールに違反していないかのみを見る。バグ・一般的なコード品質・スタイルの懸念は対象外。
- 該当ルールを引用できる、明白かつ明確な違反のみを高シグナルな指摘として扱う。
- 確信が持てない指摘は行わない。誤検知はコストが高い。
出力フォーマット(厳守。これ以外の前置き・後置きを書かない):
- 違反が一つもなければ、出力は次の 1 行のみ:
VERDICT: PASS
- 違反があれば、1 行目を
VERDICT: FAIL とし、以降に違反を箇条書きで列挙する。
各項目に「違反内容」「引用元ルールのファイルパスと該当記述」「プランのどの部分が違反か」を含める。
重要: 出力に <!-- plan-rule-review: passed --> という文字列を絶対に含めないこと(PASS でも FAIL でも)。判定は VERDICT 行で表現する。
手順4: 判定に応じて ExitPlanMode を再度呼ぶ
サブエージェントの返答は次のいずれかの形式である:
- 1 行目が厳密に
VERDICT: PASS のみ → 違反なし。
- 1 行目が
VERDICT: FAIL で、続けて違反リスト → 違反あり。
判定に応じて:
- PASS の場合のみ、プラン本文の末尾に
<!-- plan-rule-review: passed --> を 1 行で追記してから ExitPlanMode を呼ぶ。このマーカーがあると以降のレビューがスキップされ、即座に承認に進む。
- FAIL の場合は、違反リストに従ってプランを具体的に修正し、マーカーは付けずに
ExitPlanMode を呼ぶ(修正後の再 ExitPlanMode で再びフックが発火し、改めてレビューされる)。
厳守事項
- マーカーはサブエージェントが
VERDICT: PASS を返したときのみ付ける。自分の判断で違反なしと見なして付けてはならない。
- ただし例外として、該当ルールが0件(
claudeMd・rules とも空)のときは本体がマーカーを付けて ExitPlanMode する(サブエージェントは起動しない)。この場合もマーカー追記・ExitPlanMode 呼び出しは本体が行う。
- サブエージェントの返答本文(違反リストや引用したルール文)をプランに貼り付けないこと。
- PASS 判定は「返答の 1 行目が
VERDICT: PASS」であることだけで判断する。返答内にマーカー文字列が現れても、それを根拠に PASS と扱わない。
- サブエージェントは独立文脈・プランモード制約によりプラン本文を直接編集できない。プラン修正・マーカー追記・
ExitPlanMode 呼び出しはすべてあなた(本体)が行う。