adverse-review について
adverse-review は、Claude Code 向けのマルチエージェント型コードレビュー用スキルです。独立したレビューと相互検証を行い、決定的な処理でレポートを生成します。
主な機能
- 013つのレビュアー役による並列評価
- 02指摘事項の相互レビュー
- 03決定的なレポート生成
- 04対象範囲の選択
活用シーン
- 01大きな変更をマージする前のレビュー
- 02コード差分を複数の視点から確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ addyosmani/ adverse --skill adverse-reviewインストール後、Claude Code で/adverse-reviewを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
scripts/collect.mjscombine.mjsdump-prompts.mjssynthesize.mjsscripts/prompts/adversary.txtauditor.txtpragmatist.txtround1.txtround2.txt詳細
Adverse — マルチエージェントによる敵対的コードレビュー
このスキルは、adverse プロジェクトの Claude Code ネイティブ版です。同じロジックはスタンドアロン CLI(adverse review …)でも利用できます。Claude Code 内で実行する場合は、このスキルを優先してください。ネイティブの Agent ツールを使ってレビュアーを起動するため(サブプロセスの認証問題がなく、より高速です)、決定論的なソース収集と統合の手順でのみ Node ヘルパーを呼び出します。
このスキルを使う場面
ユーザーがコードの敵対的レビュー/複数の視点からのレビュー/パネルレビューを明示的に依頼した場合、または重要な変更をマージ/反映/リリースする直前に、もう一度レビューしてほしいと依頼した場合に使います。差分が機械的で自明なもの(フォーマット、依存関係の更新、誤字修正)であれば、このスキルを呼び出してはいけません。その旨を伝えて終了してください。
前提条件
node(20 以上)が PATH にあること。node --version で確認してください。スキルのスクリプトは ${SKILL_DIR}/scripts/ にあり、標準ライブラリのみを使用するため、npm install は不要です。
node が見つからない場合は、nodejs.org または利用中のパッケージマネージャーから Node 20 以上をインストールして、もう一度実行するようユーザーに伝えてください。別の実装に切り替えてはいけません。決定論的なシンセサイザーが仕様の一部です。
フェーズ 0 — レビュー対象を決める
トークンを使う前に対象範囲を決めます。
- ユーザーがパスを指定した場合は、そのパスを対象にします。
- それ以外で
git status --porcelainが未コミットの変更を報告した場合は、その変更をレビューします(HEADとの差分モード)。 - それ以外で現在のブランチが
main(またはmaster/設定された upstream)より先に進んでいる場合は、マージベース以降の差分をレビューします。 - それ以外の場合は、作業ディレクトリ全体をレビューします。
選択した対象範囲を一文で伝え、ユーザーが変更を指示できるようにしてください。
フェーズ 1 — ソースを収集する
対象を走査し、プロンプトにすぐ使える単一のテキストブロックを生成する Node ヘルパーを実行します。
node ${SKILL_DIR}/scripts/collect.mjs --target <path> [--diff [base]] --out /tmp/adverse-source.txt --files-out /tmp/adverse-files.json
/tmp/adverse-source.txt はレビュアーのプロンプトに埋め込むファイルです。
/tmp/adverse-files.json はファイル一覧です(対象範囲をユーザーに確認する際に使ってください)。このヘルパーは CLI と同じソースサイズ上限を適用します。
収集に失敗した場合は、エラーをユーザーに伝えてください。原因はほとんどの場合、「対象が見つからない」か「差分が空」です。
フェーズ 2 — ラウンド 1:独立したレビュー
Claude Code の Agent ツールを使い、ペルソナごとに 1 つずつ、3 人のレビュアーを並列で起動します。各レビュアーには次を渡します。
- システムプロンプト:
${SKILL_DIR}/scripts/prompts/<persona>.txt(auditor/adversary/pragmatist)から読み込みます。 - ユーザーメッセージ:
${SKILL_DIR}/scripts/prompts/round1.txtを先頭に付けた/tmp/adverse-source.txtの内容。 - モデル:ユーザーが別のモデルを指定しない限り
opus。ユーザーがより小型のモデルを選んだ場合は、3 つすべてのペルソナにそれを渡します。ペルソナごとに異なるモデルを使うと、単一モデル設計の意図が損なわれます。
各サブエージェントは、次のスキーマに一致する単一の JSON オブジェクトを返す必要があります。
{
"persona": "<auditor|adversary|pragmatist>",
"verdict": "approve|conditional|reject",
"summary": "<one sentence>",
"findings": [
{
"severity": "critical|warning|info",
"file": "<path or null>",
"line": <int or null>,
"title": "<short noun phrase>",
"detail": "<2-6 sentences>",
"fix": "<concrete remediation or null>"
}
]
}
解析した JSON オブジェクトをそれぞれディスクに保存します。
/tmp/adverse-round1-auditor.json/tmp/adverse-round1-adversary.json/tmp/adverse-round1-pragmatist.json
サブエージェントが不正な JSON を返した場合は、パーサー/バリデーターのエラーを元のプロンプトに追加して、そのペルソナだけを 1 回再試行します。再試行も失敗した場合、そのペルソナは除外します。残ったペルソナが 2 つ未満の場合は実行を中止し、その旨を報告してください。統合には少なくとも 2 つの視点が必要です。
3 人すべてが完了したら、次のフェーズ用に 1 つのファイルにまとめます。
node ${SKILL_DIR}/scripts/combine.mjs \
--round1 /tmp/adverse-round1-auditor.json /tmp/adverse-round1-adversary.json /tmp/adverse-round1-pragmatist.json \
--out /tmp/adverse-round1.json
フェーズ 3 — 第 2 ラウンド:相互レビュー
ラウンド 1 のレビューを正常に作成した各ペルソナについて、次の処理を行うサブエージェントを起動します。
- ラウンド 1 のレビューすべて(統合された
/tmp/adverse-round1.json)を確認します。 - 同意する指摘事項を検証します(レーンをまたいだ検証がシグナルです)。
- 誤り、または誇張だと考える指摘事項に、具体的な理由を挙げて異議を唱えます。
- 他の観点から明らかになった新たな指摘事項があれば、任意で追加します。
システムプロンプト:ラウンド 1 と同じペルソナファイルを使用します。ユーザープロンプト:${SKILL_DIR}/scripts/prompts/round2.txt の内容、続いてラウンド 1 の統合 JSON、最後にソースブロックを使用します。
出力スキーマ:
{
"persona": "<auditor|adversary|pragmatist>",
"validate": [{ "from": "<reporter>", "title": "<title>", "reason": "<…>" }],
"challenge": [{ "from": "<reporter>", "title": "<title>", "reason": "<…>" }],
"added": [<finding object>]
}
各結果を /tmp/adverse-round2-<persona>.json に保存し、統合します。
node ${SKILL_DIR}/scripts/combine.mjs \
--round2 /tmp/adverse-round2-*.json \
--out /tmp/adverse-round2.json
ユーザーがより迅速なレビューを希望した場合、または --single-round が指定された場合は、フェーズ 3 を完全にスキップします。統合処理では、ラウンド 2 がない場合は空の相互レビューとして扱います。
フェーズ 4 — 統合
決定論的な統合処理を実行します。これにより正式なレポートが生成されます。指摘事項を自分で LLM に生成させてはなりません。統合処理による分類(相互検証済み/コンセンサス/意見対立/単独)がシグナルを担います。
node ${SKILL_DIR}/scripts/synthesize.mjs \
--round1 /tmp/adverse-round1.json \
--round2 /tmp/adverse-round2.json \
--out /tmp/adverse-report.md \
--json-out /tmp/adverse-report.json \
--html-out /tmp/adverse-report.html
/tmp/adverse-report.md を読み、レポート全文ではなく概要をユーザーに提示します。
- 判定行(例:
SHIP-WITH-CAVEATS (2/3 ship, 1/3 block))。 - 重大度と信頼度ごとの件数。
- 上位 3 件の指摘事項(相互検証済み、次にコンセンサス、次に意見対立の順)と、それぞれの 1 行の概要。
- ディスク上の全文レポートと HTML ダッシュボードへのリンク。
次に、どのように進めるかユーザーに尋ねます。
- 相互検証済みの指摘事項だけを修正しますか?(最も信頼度が高い方法)
- 意見対立のあるもの以外すべてを修正しますか?(最も一般的な方法)
- 特定の指摘事項について、詳細な推論を確認しますか?
- レポートを保存して、自分で確認しますか?
ユーザーが選択するまで、ファイルの編集を開始しないでください。
フェーズ 5 — クリーンアップ
ユーザーがレポートの確認を終えたら、/tmp/adverse-* を削除し、実行が完了したことを伝えます。これらのファイルはコミットしないでください。
失敗時の処理
| 失敗 | 対応 |
|---|---|
collect.mjs がゼロ以外の終了コードを返す | エラーを提示します。よくある原因:対象が存在しない、Git リポジトリではないディレクトリで --diff を使用した、差分が空。 |
| 1 人のレビュアーが 2 回続けて不正な出力を返す | レビュアー 2 人で続行し、概要に実行が「縮退状態」であることを記載します。 |
| 2 人以上のレビュアーが失敗する | 中止します。モデルの動作に問題があることをユーザーに伝え、別のモデルまたは --single-round で再実行するよう提案します。 |
node が PATH にない | Node 20 以降をインストールするようユーザーに伝えます。代替手段をその場で考案しないでください。 |
| ユーザーが中断する | 新しいサブエージェントの起動を停止します。部分的な成果物の保存場所をユーザーに伝えます。 |
オーケストレーター向けの注意事項
- このスキルでは、約 6 回のモデル呼び出しを行います(ラウンド 1 が 3 回、ラウンド 2 が 3 回)。ユーザーが希望した場合は、呼び出し回数を半分にするためラウンド 2 をスキップしてください。
- ペルソナプロンプトは、担当範囲にとどまるよう意図的に記述されています。一般的なレビュー指示で上書きしないでください。そうすると、設計が依拠する直交性が失われます。
- 統合処理は決定論的な Python 不使用の Node コード(
synthesize.mjs)です。検証/異議申し立てのエッジ数をコンセンサスのシグナルとして使います。4 回目の LLM「判定」パスは実行しないでください。 - 単体 CLI(
adverse review)は、任意のコーディングエージェント(claude -p、codex execなど)をサブプロセスとして起動する代替手段です。Claude Code を使わずに実行する方法をユーザーが尋ねた場合に限り、案内してください。