audit-code-review について
audit-code-reviewは、プルリクエスト、コミット、指定ファイルの変更をレビューするスキルです。正確性、セキュリティ、性能、保守性、テストを体系的に確認し、ブロッキング項目と提案を区別します。
主な機能
- 01プロジェクト文書と差分全体の確認
- 02正確性と境界条件の検査
- 03セキュリティと性能リスクの確認
- 04重複実装の調査
- 05重大度に応じた指摘の分類
活用シーン
- 01マージ前のプルリクエスト確認
- 02コミットに含まれるセキュリティ問題の点検
- 03変更コードの正確性リスクの発見
- 04実行可能なレビューコメントの作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ kensaurus/ skills --skill audit-code-reviewインストール後、Claude Code で/audit-code-reviewを入力して読み込まれたか確認します。
詳細
コードレビューのスキル
自由度:混合 — フェーズ 1~2 の判断 [HIGH freedom];
レビュー前の Git/ドキュメント確認は必須 [LOW freedom — run exactly]。
この PR または指定された差分をレビューします。リポジトリ全体に関わるアンチパターンは audit-code-quality を参照してください。
一括変換のセマンティクスは audit-codemod-safety を参照してください。
推論の進め方
- 観察 — 該当する差分と周辺のファイルを引用します(該当行だけではなく)
- 解釈 — これをマージすると、何が壊れたり、漏洩したり、重複したりするでしょうか?
- 分類 — ブロッキング/提案/軽微な指摘/称賛
- 重大度 — セキュリティ、データ損失、既存機能の破壊はブロッキングです
作業例
観察: 新しい
GET /api/invoices/:idが、userId条件なしでInvoice.findById(id)を返しています(この差分のapp/api/invoices/[id]/route.ts)。 解釈: 認証済みのユーザーなら誰でも、別のユーザーの請求書を読み取れます。 分類: ブロッキング(IDOR)。 重大度: 致命的 — マージ前に必ず修正が必要です。 指摘:[id]/route.ts| 所有者チェックを追加 | ブロッキング
レビュー前の確認 [LOW freedom — run exactly]
コードをレビューする前に:
1. 関連ドキュメントを読む
README.md (project conventions)
src/[domain]/@_[domain]-README.md (domain-specific patterns)
CONTRIBUTING.md (code standards)
2. 変更全体を把握する
PR またはコミットをレビューする場合:
git log --oneline -10 # recent context
git diff <base>..HEAD --stat # files changed
git diff <base>..HEAD # full diff
特定のファイルをレビューする場合は、変更された行だけでなく、コンテキストを把握するためにファイル全体を読んでください。
3. 重複した実装がないか確認する
Grep と SemanticSearch を使って、以下を確認します。
- このコードは既存の機能と重複していませんか?
- 拡張すべき既存のコンポーネント/サービスはありませんか?
- コードベースで確立されたパターンに従っていますか?
4. 本番環境への影響を確認する(Sentry)
変更がエラーの発生しやすいコードに関わる場合は、関連する Sentry の問題が存在するか確認します。
sentry:search_issues
{
"organizationSlug": "<ORG_SLUG>",
"query": "issues related to <component or function being changed>",
"projectSlugOrId": "<PROJECT_SLUG>",
"regionUrl": "<REGION_URL>",
"limit": 10
}
これにより、変更対象のコードに既知の本番環境の問題があるか、この変更が問題を修正するのか、または問題を新たに引き起こすリスクがあるのかが分かります。
5. 最新のベストプラクティスを調べる(複雑なパターンの場合)
検証したいパターンをコードが使用している場合:
firecrawl:firecrawl_search
{
"query": "<framework> <pattern> best practice <current year>",
"limit": 5,
"sources": [{ "type": "web" }]
}
レビュープロセス [HIGH freedom]
フェーズ 1:全体的な評価
行単位のレビューに入る前に:
- この変更の目的は何ですか?
- アーキテクチャ上、このアプローチは妥当ですか?
- よりシンプルな代替案はありますか?
- 新たな依存関係が追加されますか? それらは正当化されていますか?
フェーズ 2:詳細レビューのチェックリスト
正確性
- 想定されるすべての入力に対してロジックが正しい
- 変更が PR/タスクの要件を満たしている — 要件の欠落、中途半端な実装、または気付かれないまま範囲が狭められている場合は、ブロッキングの指摘です
- エッジケースに対応している(null、空、オーバーフロー、並行アクセス)
- 明らかなバグがない(オフバイワン、演算子の誤り、await の欠落)
- エラー処理が十分かつ適切である
- 非同期コードが競合状態とクリーンアップに対応している(AbortController など)
セキュリティ
- SQL インジェクションの脆弱性がない(ユーザー入力を使った生のクエリ)
- XSS の脆弱性がない(dangerouslySetInnerHTML、innerHTML)
- ハードコードされた秘密情報や認証情報がない
- ユーザー向けのすべてのエンドポイントに入力検証がある
- 認証/認可が適切に確認されている(UI レベルだけではない)
- ログやエラーメッセージに機密データが含まれていない
パフォーマンス
- N+1 クエリがない(一括処理、Eager Loading)
- 不要なループや計算の繰り返しがない
- 適切なデータ構造を使っている(Map と Object、Set と Array)
- メモリリークがない(イベントリスナーがクリーンアップされ、サブスクリプションが解除されている)
- React:不要な再レンダリングがない(適切な場合は memo、useMemo、useCallback を使用)
- データベース:クエリがインデックスを使用し、テーブル全体のスキャンを回避している
可読性
- 明確で説明的な名前(関数、変数、型)が使われている
- 関数のサイズが適切である(単一責任)
- コメントが「何を」ではなく「なぜ」を説明している(自明でない制約のみ)
- プロジェクトの既存のスタイルと一貫している
保守性
- DRY — 共有すべきロジックが重複していない
- 単一責任 — 各関数/コンポーネントが一つのことだけを行う
- マジックナンバーやマジック文字列がない(定数またはユニオン型を使用する)
- 型が具体的である(
anyや範囲が広すぎるユニオン型がない) - 依存関係が適切で最小限である
テスト
- テストが変更内容を網羅している(正常系+エッジケース)
- テストが独立しており、決定的である
- 不安定なテスト(タイムアウト、競合状態)を導入していない
- テスト名が期待される動作を説明している
重複の防止
- コンポーネントが重複していない(
src/components/を確認済み) - サービスやフックが重複していない
- 既存のパターンを重複させず、拡張している
- 2 回以上使用する共有ロジックをユーティリティ/フックに切り出している
フィードバック形式
重大度レベルを使用してください。
### Critical (must fix before merge)
**[File:Line]** — [Description]
Why: [Impact if not fixed]
Fix: [Specific suggestion]
### Suggestion (recommended improvement)
**[File:Line]** — [Description]
Why: [Benefit of the change]
Alternative: [How to improve]
### Nitpick (optional, non-blocking)
**[File:Line]** — [Description]
### Praise (good patterns to reinforce)
**[File:Line]** — [What's done well and why]
ブロッキングと非ブロッキング
ブロッキング(必ず修正)
- セキュリティの脆弱性
- データ破損のリスク
- 既存機能の破壊
- 重大なエラーハンドリングの欠如
- パフォーマンスの低下(測定可能なもの)
- 型安全性への違反(
any、未チェックのキャスト)
非ブロッキング(提案)
- より適切な命名や整理
- エッジケースのテスト不足
- ドキュメントの不足
- 軽微なパフォーマンス改善
- リンターでカバーされていないスタイル上の好み
よく指摘するパターン
TypeScript/JavaScript
// BLOCK: any types
const data: any = response;
// BLOCK: unhandled promises
fetchData(); // missing await or .catch()
// BLOCK: implicit type coercion in conditions
if (value) // when value could be 0 or ""
// SUGGEST: magic strings
if (status === 'active') // use a constant or union type
React
// BLOCK: missing key in lists
{items.map(item => <Item {...item} />)}
// BLOCK: stale closure in useEffect
useEffect(() => {
setInterval(() => console.log(count), 1000); // captures stale count
}, []);
// SUGGEST: inline object creation in props
<Component style={{ margin: 10 }} /> // new object each render
データベース
-- BLOCK: SQL injection vector
WHERE name = '${userInput}'
-- SUGGEST: missing index
SELECT * FROM orders WHERE user_id = ? -- is user_id indexed?
-- SUGGEST: SELECT *
SELECT * FROM users -- select only needed columns
報告前の自己批評 [自由度低 — 省略しないでください]
- 根拠がある — 「もっと良くできる」ではなく、diff の
File:Lineを示す - 再現可能 — 該当箇所だけでなく、ファイル全体を読む
- 重大度に妥当性がある — ブロッキングはセキュリティ/データ損失/破壊/重大なエラーハンドリングの欠如に限る
- 適切な担当先である — リポジトリ全体に関する問題 →
audit-code-quality、一括変換 →audit-codemod-safety - 誤った安全判定がない — リンターでカバーされるスタイルはブロッキングではない
レビュー返信テンプレート
## Code Review: [PR Title / File]
### Summary
[1-2 sentence overall assessment — is this ready to merge?]
### Critical (blocking)
[List any must-fix findings]
### Suggestions (recommended)
[List recommended improvements]
### Praise
[Highlight good practices — reinforces positive patterns]
### Questions
[Clarifying questions about intent or design decisions]
### Research Notes
[If patterns were verified via Firecrawl/Context7, note what was confirmed]
指摘事項に該当するもの
ブロッキングの指摘事項とは、正確性に関するバグ、セキュリティ上の欠陥、データ損失につながる経路、変更で主張されていることと実際の動作との食い違いです。提案や細かな指摘は、上記のフィードバック形式に従ってください。各指摘には該当行、影響、修正方法を記載します。リンターまたはコードベース独自の規約ですでにカバーされているスタイルは、どの重大度でも指摘事項には該当しません。該当箇所を判断する前に周辺のコードを読み、意図が不明確な場合は推測せず、「質問」セクションで確認してください。