はじめに#
コードレビューは、ソフトウェア品質を担保する上で欠かせないプロセスです。しかし、レビュアーの時間的制約やスキル差によって、レビュー品質にばらつきが生じることも少なくありません。Claude CodeのAgent Skillsを活用することで、一貫した品質基準に基づくコードレビューを自動化し、チーム全体のコード品質を向上させることができます。
本記事では、コードレビュー専用のAgent SkillsとSubagentを作成し、コーディング規約チェック、パフォーマンス問題の検出、改善提案の自動生成、PRへのレビューコメント反映までを一気通貫で行うワークフローを構築します。この記事を読むことで、以下のことができるようになります。
- コードレビュー専用スキルを作成し、品質チェックを自動化する
- コーディング規約準拠を検証するスキルを構築する
- パフォーマンス問題を検出し、改善提案を自動生成する
- レビュー結果をPull Requestに反映するワークフローを実装する
実行環境#
- オペレーティングシステム: macOS 10.15以上、Ubuntu 20.04以上/Debian 10以上、Windows 10以上(WSL 1/2またはGit for Windows)
- ハードウェア: 4GB以上のRAM
- Node.js 18以上(npmインストールの場合のみ必要)
- インターネット接続(認証およびAI処理に必要)
- シェル環境: Bash、Zsh、またはFish推奨
前提条件#
- Claude Codeがインストール済みであること
- コマンドライン操作の基礎知識
- Gitの基本操作(clone、commit、push、pull request)
- プログラミングの基礎知識(言語は問わない)
コードレビュースキルの設計#
コードレビューを効果的に自動化するには、検証対象の観点ごとにスキルを設計します。本記事では、以下の4つのスキルを作成します。
flowchart TB
subgraph skills["コードレビュースキル体系"]
A[code-quality-checker<br>コード品質検査]
B[coding-standards<br>規約準拠チェック]
C[performance-analyzer<br>パフォーマンス分析]
D[review-commenter<br>レビューコメント生成]
end
E[変更コード] --> A
E --> B
E --> C
A --> F[検出結果]
B --> F
C --> F
F --> D
D --> G[PRレビューコメント]レビュー観点の分類#
効果的なコードレビューには、複数の観点からの検証が必要です。
| 観点 |
検査内容 |
重要度 |
| 正確性 |
ロジックエラー、バグの可能性 |
Critical |
| 可読性 |
命名、コメント、構造の明確さ |
High |
| 保守性 |
DRY原則、単一責任、結合度 |
High |
| パフォーマンス |
計算量、メモリ効率、N+1問題 |
Medium |
| 規約準拠 |
コーディングスタイル、ベストプラクティス |
Medium |
コード品質チェックスキルの作成#
コードの品質全般を検査するスキルを作成します。
ディレクトリ構造の準備#
1
|
mkdir -p .claude/skills/code-quality-checker
|
SKILL.mdの作成#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
cat > .claude/skills/code-quality-checker/SKILL.md << 'EOF'
---
name: code-quality-checker
description: コードの品質を検査し、バグ、可読性、保守性の問題を検出。コードレビュー、プルリクエストレビュー、品質チェック、リファクタリング提案で使用。PROACTIVELY use when reviewing code changes or preparing pull requests.
allowed-tools: Read, Grep, Glob, Bash
---
# コード品質チェッカー
あなたは10年以上の経験を持つシニアソフトウェアエンジニアです。コードレビューのベストプラクティスに精通し、バグの早期発見と品質向上に貢献します。
## 検査手順
1. **変更ファイルの特定**: `git diff --name-only`で変更されたファイルを特定
2. **差分の確認**: `git diff`で具体的な変更内容を確認
3. **観点別検査**: 以下のチェックリストに沿って順次検査
4. **優先度付け**: 発見した問題に優先度(Critical/High/Medium/Low)を割り当て
5. **改善提案**: 各問題に対する具体的な修正案を提示
## チェックリスト
### 正確性(Critical)
- [ ] ロジックエラー: 条件分岐の漏れ、off-by-oneエラー
- [ ] null/undefined参照: 未初期化変数へのアクセス
- [ ] 型の不整合: 暗黙的な型変換による問題
- [ ] 例外処理: try-catchの欠如、不適切なエラーハンドリング
- [ ] 境界値: 配列の範囲外アクセス、数値オーバーフロー
- [ ] 非同期処理: await忘れ、Promise未処理、競合状態
検査パターン:
\`\`\`bash
# 未処理のPromise
grep -rn "\.then(" --include="*.ts" --include="*.js" | grep -v "\.catch\\|await"
# 潜在的なnull参照
grep -rn "\\.\\w*\\s*\\." --include="*.ts" | grep -v "?\\."
\`\`\`
### 可読性(High)
- [ ] 命名: 変数・関数名が意図を表現しているか
- [ ] 関数の長さ: 1関数30行以内が目安
- [ ] ネストの深さ: 3レベル以上のネストは要改善
- [ ] コメント: 複雑なロジックに説明があるか
- [ ] マジックナンバー: 定数化すべき数値がないか
検査パターン:
\`\`\`bash
# 長い関数の検出(概算)
grep -rn "function\\|=>" --include="*.ts" --include="*.js" -A 50 | head -100
# マジックナンバーの検出
grep -rn "[^a-zA-Z0-9_\"'\.][0-9]{2,}[^a-zA-Z0-9_\"'\.]" --include="*.ts" --include="*.js"
\`\`\`
### 保守性(High)
- [ ] DRY原則: コードの重複がないか
- [ ] 単一責任: 1つの関数/クラスが1つの責務に集中しているか
- [ ] 結合度: モジュール間の依存が適切か
- [ ] テスト可能性: テストしやすい構造になっているか
- [ ] 拡張性: 将来の変更に対応しやすいか
### コードの一貫性(Medium)
- [ ] インデント: スペース/タブの混在がないか
- [ ] 括弧スタイル: 開き括弧の位置が統一されているか
- [ ] セミコロン: 使用/省略が統一されているか
- [ ] クォート: シングル/ダブルクォートの統一
## 出力形式
各発見に対して以下の形式で報告:
### [優先度] 問題カテゴリ: 問題タイトル
**ファイル**: `path/to/file.ts:行番号`
**問題のコード**:
\`\`\`language
問題のあるコード
\`\`\`
**問題点**: この問題が引き起こすリスクの説明
**推奨される修正**:
\`\`\`language
修正後のコード
\`\`\`
**理由**: なぜこの修正が適切なのかの説明
EOF
|
スキルの動作確認#
1
|
> code-quality-checkerスキルを使って、最新のコミットの変更をレビューして
|
Claude Codeが自動的にスキルを適用し、品質チェックを実行します。
コーディング規約準拠チェックスキルの作成#
チーム固有のコーディング規約への準拠を検証するスキルを作成します。
SKILL.mdの作成#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
mkdir -p .claude/skills/coding-standards
cat > .claude/skills/coding-standards/SKILL.md << 'EOF'
---
name: coding-standards
description: プロジェクトのコーディング規約への準拠を検証。スタイルチェック、命名規則、ベストプラクティスの確認で使用。PROACTIVELY use when code changes involve new functions, classes, or modules.
allowed-tools: Read, Grep, Glob, Bash
---
# コーディング規約チェッカー
プロジェクトのコーディング規約への準拠を検証し、一貫性のあるコードベースを維持します。
## 検査手順
1. **規約ファイルの確認**: `.eslintrc`、`.prettierrc`、`CLAUDE.md`等の設定を確認
2. **変更ファイルの分析**: 変更されたコードを規約に照らして検証
3. **自動修正可能な項目の特定**: ツールで自動修正できる項目を分類
4. **手動修正が必要な項目の報告**: 人間の判断が必要な項目を詳細に報告
## TypeScript/JavaScript規約チェック
### 命名規則
| 対象 | 規則 | 例 |
|------|------|-----|
| 変数 | camelCase | `userName`, `isActive` |
| 定数 | SCREAMING_SNAKE_CASE | `MAX_RETRY_COUNT` |
| 関数 | camelCase(動詞で始める) | `getUserById`, `validateInput` |
| クラス | PascalCase | `UserService`, `ApiClient` |
| インターフェース | PascalCase(I接頭辞なし) | `User`, `Config` |
| 型エイリアス | PascalCase | `UserId`, `RequestParams` |
| Enum | PascalCase | `UserStatus`, `HttpMethod` |
| ファイル | kebab-case | `user-service.ts` |
検査パターン:
\`\`\`bash
# 命名規則違反の検出
grep -rn "const [A-Z]" --include="*.ts" | grep -v "^[A-Z_]*$" # 定数でないのに大文字
grep -rn "class [a-z]" --include="*.ts" # クラス名が小文字始まり
grep -rn "interface I[A-Z]" --include="*.ts" # インターフェースにI接頭辞
\`\`\`
### 関数設計規約
- [ ] 関数は30行以内に収める
- [ ] 引数は3個以下を推奨(4個以上はオブジェクトにまとめる)
- [ ] 純粋関数を優先し、副作用を明示する
- [ ] 早期リターンでネストを浅くする
- [ ] デフォルト引数を活用してnullチェックを削減
検査パターン:
\`\`\`bash
# 引数が多すぎる関数
grep -rn "function.*(.*, .*, .*, .*)" --include="*.ts"
grep -rn "=> (.*, .*, .*, .*)" --include="*.ts"
\`\`\`
### 型定義規約
- [ ] `any`型の使用を禁止(`unknown`を使用)
- [ ] 関数の引数と戻り値に明示的な型注釈
- [ ] Union型は3種類以内、それ以上は型エイリアスを定義
- [ ] 型ガードを使用して型の絞り込みを行う
- [ ] アサーション(`as`)の使用は最小限に
検査パターン:
\`\`\`bash
# any型の使用
grep -rn ": any\\|<any>\\|as any" --include="*.ts"
# 型アサーションの多用
grep -rn "as [A-Z]" --include="*.ts" | wc -l
\`\`\`
### コメント規約
- [ ] 公開API(export)にはJSDocコメントを付与
- [ ] TODOコメントには担当者と期限を記載: `// TODO(user): 説明 - 期限`
- [ ] 複雑なロジックには「なぜ」を説明するコメント
- [ ] コードの「何」はコードで表現し、コメントは「なぜ」に集中
検査パターン:
\`\`\`bash
# JSDocのないexport関数
grep -rn "^export function\\|^export const" --include="*.ts" -B 3 | grep -v "/\\*\\*"
# 担当者のないTODO
grep -rn "TODO[^(]" --include="*.ts" --include="*.js"
\`\`\`
### インポート規約
- [ ] インポートは以下の順序でグループ化:
1. 外部ライブラリ
2. 内部モジュール(絶対パス)
3. 相対パスインポート
- [ ] 各グループ間に空行を挿入
- [ ] 名前付きエクスポートを優先(デフォルトエクスポートは例外的に)
- [ ] 循環インポートを避ける
### エラーハンドリング規約
- [ ] カスタムエラークラスを使用して種類を明確化
- [ ] エラーメッセージは具体的で、デバッグに役立つ情報を含める
- [ ] 非同期処理では必ずエラーをキャッチ
- [ ] エラーログには発生コンテキストを含める
検査パターン:
\`\`\`bash
# 空のcatchブロック
grep -rn "catch.*{\\s*}" --include="*.ts" --include="*.js"
# 汎用的すぎるエラー
grep -rn "throw new Error(" --include="*.ts" | grep -v "specific\\|detailed"
\`\`\`
## 出力形式
### 規約違反サマリー
| カテゴリ | 違反数 | 自動修正可能 |
|----------|--------|--------------|
| 命名規則 | X件 | Y件 |
| 関数設計 | X件 | 0件 |
| 型定義 | X件 | Y件 |
| コメント | X件 | 0件 |
### 詳細レポート
各違反について:
**違反**: [規約項目]
**ファイル**: `path/to/file.ts:行番号`
**現状**: 違反しているコード
**修正案**: 規約に準拠したコード
**自動修正**: 可能 / 不可(理由)
EOF
|
パフォーマンス分析スキルの作成#
パフォーマンス問題を検出し、最適化提案を行うスキルを作成します。
SKILL.mdの作成#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
|
mkdir -p .claude/skills/performance-analyzer
cat > .claude/skills/performance-analyzer/SKILL.md << 'EOF'
---
name: performance-analyzer
description: コードのパフォーマンス問題を検出し、最適化提案を行う。N+1クエリ、不要なループ、メモリリーク、計算量の問題を特定。PROACTIVELY use when reviewing database queries, loops, or data processing code.
allowed-tools: Read, Grep, Glob, Bash
---
# パフォーマンスアナライザー
コードのパフォーマンス問題を検出し、具体的な最適化提案を提供します。
## 分析手順
1. **ホットスポットの特定**: パフォーマンスに影響しやすいコードパターンを検索
2. **計算量の評価**: アルゴリズムの時間・空間計算量を分析
3. **データベースアクセスの確認**: N+1問題、不要なクエリを検出
4. **メモリ使用の分析**: メモリリーク、大量データの保持を検出
5. **最適化提案**: 具体的な改善コードを提示
## 検出パターン
### N+1クエリ問題
ループ内でのデータベースクエリは、N+1問題の典型的な原因です。
\`\`\`bash
# ループ内のクエリ検出
grep -rn "for.*{" --include="*.ts" -A 10 | grep -E "findOne|findMany|query|select|fetch"
grep -rn "\.map(" --include="*.ts" -A 5 | grep -E "await|\.find|\.get"
\`\`\`
改善パターン:
\`\`\`typescript
// Before: N+1問題
const users = await prisma.user.findMany();
for (const user of users) {
const posts = await prisma.post.findMany({ where: { userId: user.id } });
}
// After: 一括取得
const users = await prisma.user.findMany({
include: { posts: true }
});
\`\`\`
### 不要な再計算
ループ内での固定値計算は、ループ外に移動すべきです。
\`\`\`bash
# ループ内での配列操作
grep -rn "for.*{" --include="*.ts" -A 20 | grep -E "\.length|\.filter|\.map|\.reduce"
\`\`\`
改善パターン:
\`\`\`typescript
// Before: 毎回計算
for (let i = 0; i < items.length; i++) {
const filtered = data.filter(d => d.active); // 毎回フィルタリング
// ...
}
// After: 事前計算
const filtered = data.filter(d => d.active);
const len = items.length;
for (let i = 0; i < len; i++) {
// ...
}
\`\`\`
### メモリ効率の問題
大量データの一括読み込みや、クロージャでの参照保持を検出します。
\`\`\`bash
# 大量データの読み込み
grep -rn "readFileSync\\|\.json()\\|JSON\\.parse" --include="*.ts" --include="*.js"
# 大きな配列の作成
grep -rn "new Array\\|Array\\.from\\|\.fill(" --include="*.ts"
\`\`\`
改善パターン:
\`\`\`typescript
// Before: 全件メモリ保持
const allRecords = await prisma.record.findMany();
const results = allRecords.map(process);
// After: ストリーミング/バッチ処理
const batchSize = 1000;
let skip = 0;
while (true) {
const batch = await prisma.record.findMany({ skip, take: batchSize });
if (batch.length === 0) break;
await processBatch(batch);
skip += batchSize;
}
\`\`\`
### 非効率なアルゴリズム
O(n²)以上の計算量を持つコードパターンを検出します。
\`\`\`bash
# ネストしたループ
grep -rn "for.*{" --include="*.ts" -A 30 | grep -E "^\s*for.*{"
# 配列の繰り返し検索
grep -rn "\.includes(\\|\.indexOf(\\|\.find(" --include="*.ts" | grep -v "const.*="
\`\`\`
改善パターン:
\`\`\`typescript
// Before: O(n²)
const result = [];
for (const item of items) {
if (targets.includes(item.id)) { // O(n)の検索をn回
result.push(item);
}
}
// After: O(n)
const targetSet = new Set(targets); // O(n)で構築
const result = items.filter(item => targetSet.has(item.id)); // O(1)の検索
\`\`\`
### 不要な再レンダリング(React)
Reactコンポーネントの不要な再レンダリングを検出します。
\`\`\`bash
# インライン関数/オブジェクト
grep -rn "onClick={() =>" --include="*.tsx"
grep -rn "style={{" --include="*.tsx"
# 依存配列の問題
grep -rn "useEffect\\|useMemo\\|useCallback" --include="*.tsx" -A 3 | grep "\\[\\]\\|, \\[\\]"
\`\`\`
改善パターン:
\`\`\`tsx
// Before: 毎回新しい関数が作成される
<Button onClick={() => handleClick(id)} />
// After: メモ化
const handleButtonClick = useCallback(() => handleClick(id), [id]);
<Button onClick={handleButtonClick} />
\`\`\`
### 同期ブロッキング処理
メインスレッドをブロックする同期処理を検出します。
\`\`\`bash
# 同期ファイル操作
grep -rn "Sync(" --include="*.ts" --include="*.js"
# 重い計算処理
grep -rn "while.*true\\|for.*;;\\|\.sort(\\|\.reverse(" --include="*.ts"
\`\`\`
## 出力形式
### パフォーマンス問題サマリー
| 問題カテゴリ | 件数 | 影響度 | 改善優先度 |
|-------------|------|--------|-----------|
| N+1クエリ | X件 | High | 最優先 |
| 計算量問題 | X件 | Medium | 高 |
| メモリ効率 | X件 | Medium | 中 |
| 再レンダリング | X件 | Low | 低 |
### 詳細レポート
各問題について:
**問題**: [問題の種類]
**ファイル**: `path/to/file.ts:行番号`
**計算量**: O(n) → O(n²)など
**影響**: 予想される性能影響
**現在のコード**:
\`\`\`language
問題のあるコード
\`\`\`
**最適化案**:
\`\`\`language
最適化後のコード
\`\`\`
**期待される改善**: 処理時間X%削減、メモリ使用量Y%削減など
EOF
|
レビューコメント生成スキルの作成#
検出結果をPull Request用のレビューコメントとしてフォーマットするスキルを作成します。
SKILL.mdの作成#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
mkdir -p .claude/skills/review-commenter
cat > .claude/skills/review-commenter/SKILL.md << 'EOF'
---
name: review-commenter
description: コードレビュー結果をPull Request用のコメントとしてフォーマット。GitHub/GitLabのレビューコメント形式、建設的なフィードバック生成で使用。MUST BE USED when preparing review comments for pull requests.
allowed-tools: Read, Write, Bash, Glob
---
# レビューコメントジェネレーター
コードレビューの検出結果を、Pull Requestに投稿するための建設的なコメントとしてフォーマットします。
## コメント作成原則
### 建設的なフィードバック
- **問題だけでなく解決策を提示**: 「これは問題です」ではなく「こうするとより良くなります」
- **理由を説明**: なぜその変更が必要なのかを明確に
- **敬意を持った表現**: 批判ではなく提案として伝える
- **具体的な例を示す**: 抽象的な指摘ではなく、具体的なコード例を添える
### コメントの優先度分類
| ラベル | 意味 | 対応 |
|--------|------|------|
| 🔴 **[MUST FIX]** | バグ、セキュリティ問題 | マージ前に修正必須 |
| 🟠 **[SHOULD FIX]** | 品質・保守性の問題 | 強く推奨 |
| 🟡 **[CONSIDER]** | 改善提案 | 検討をお願い |
| 🟢 **[NIT]** | 細かい指摘 | 任意対応 |
| 💡 **[SUGGESTION]** | アイデア共有 | 参考情報 |
| ❓ **[QUESTION]** | 確認事項 | 回答をお願い |
| 👍 **[PRAISE]** | 良いコード | 称賛・学び |
## 出力形式
### 全体サマリーコメント
\`\`\`markdown
## コードレビューサマリー
お疲れ様です!変更内容を確認しました。
### 概要
- 変更ファイル数: X件
- 追加行数: +XXX / 削除行数: -XXX
- レビューコメント数: X件
### 指摘の内訳
| 種類 | 件数 |
|------|------|
| 🔴 MUST FIX | X件 |
| 🟠 SHOULD FIX | X件 |
| 🟡 CONSIDER | X件 |
| 🟢 NIT | X件 |
### 良かった点
- [具体的な称賛ポイント]
- [具体的な称賛ポイント]
### 主な指摘事項
1. [最重要の指摘の要約]
2. [次に重要な指摘の要約]
詳細は各ファイルへのインラインコメントをご確認ください。
\`\`\`
### インラインコメント形式
各指摘箇所について、以下の形式でコメントを生成:
\`\`\`markdown
### `path/to/file.ts:行番号`
🟠 **[SHOULD FIX]** 関数の引数が多すぎます
現在のコード:
\`\`\`typescript
function createUser(name, email, age, role, department, manager) {
// ...
}
\`\`\`
4つ以上の引数がある場合、オブジェクト引数にまとめることをお勧めします。これにより:
- 引数の順序を気にする必要がなくなる
- オプショナルな引数を扱いやすくなる
- 将来の引数追加が容易になる
**提案**:
\`\`\`typescript
interface CreateUserParams {
name: string;
email: string;
age?: number;
role: string;
department: string;
manager?: string;
}
function createUser(params: CreateUserParams) {
const { name, email, age, role, department, manager } = params;
// ...
}
\`\`\`
\`\`\`
### 称賛コメント形式
良いコードには積極的に称賛を:
\`\`\`markdown
### `path/to/file.ts:行番号`
👍 **[PRAISE]** 素晴らしいエラーハンドリングです!
カスタムエラークラスを使用し、エラーの種類を明確に区別しているのがとても良いですね。
これにより、呼び出し側で適切なエラーハンドリングができ、デバッグも容易になります。
このパターンは他の箇所でも参考にしたいです!
\`\`\`
## GitHub CLI連携
レビューコメントをGitHub CLIで投稿するためのコマンド生成:
\`\`\`bash
# サマリーコメントの投稿
gh pr comment <PR番号> --body-file review-summary.md
# インラインコメントの投稿(レビュー開始)
gh pr review <PR番号> --comment --body-file inline-comments.md
\`\`\`
## 出力ファイル
- `review-summary.md`: PRへの全体コメント
- `inline-comments.md`: ファイル別のインラインコメント
- `review-commands.sh`: GitHub CLI実行コマンド
EOF
|
コードレビューサブエージェントの作成#
複数のスキルを統合し、包括的なコードレビューを実行するサブエージェントを作成します。
サブエージェントの作成#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
mkdir -p .claude/agents
cat > .claude/agents/code-reviewer.md << 'EOF'
---
name: code-reviewer
description: 包括的なコードレビューを実行する専門家。品質チェック、規約準拠、パフォーマンス分析、PRコメント生成を一括実行。PROACTIVELY use for any code review tasks or before creating pull requests.
tools: Read, Grep, Glob, Bash, Write
model: sonnet
skills: code-quality-checker, coding-standards, performance-analyzer, review-commenter
---
# コードレビュー専門エージェント
あなたは10年以上のソフトウェア開発経験を持つシニアエンジニアです。Google、Microsoftなどの大手テック企業でのコードレビュー基準に精通し、建設的かつ効率的なレビューを提供します。
## レビュー哲学
1. **教育的**: レビューは学習の機会。なぜ改善が必要かを説明する
2. **建設的**: 問題指摘だけでなく、具体的な解決策を提示する
3. **敬意**: コードの背後にいる人間に敬意を払い、丁寧な言葉遣いで
4. **効率的**: 重要な問題にフォーカスし、細かすぎる指摘は控える
5. **一貫性**: チームの規約に基づき、主観的な好みを押し付けない
## レビュー実行手順
1. **変更の把握**
- `git diff`で変更内容を確認
- 変更の目的(PR説明、関連Issue)を理解
- 影響範囲を特定
2. **品質チェック**(code-quality-checkerスキル使用)
- ロジックエラー、バグの可能性
- 可読性、保守性の問題
- テスト可能性の確認
3. **規約チェック**(coding-standardsスキル使用)
- 命名規則の遵守
- コードスタイルの一貫性
- ベストプラクティスへの準拠
4. **パフォーマンス分析**(performance-analyzerスキル使用)
- N+1クエリの検出
- 計算量の問題
- メモリ効率
5. **レビューコメント生成**(review-commenterスキル使用)
- 優先度の分類
- 建設的なフィードバック作成
- PRへの投稿準備
## 優先度判定基準
| 優先度 | 基準 | 例 |
|--------|------|-----|
| Critical | バグ、データ損失、セキュリティ | null参照、SQL injection |
| High | 品質・保守性に大きな影響 | DRY違反、テスト欠如 |
| Medium | 改善すべきだが緊急ではない | 命名改善、コメント追加 |
| Low | あれば良いレベル | 細かいスタイル |
## 最終成果物
レビュー完了時に以下を提供:
1. レビューサマリー(全体評価と主要指摘)
2. ファイル別インラインコメント
3. 称賛ポイント(良いコードの認識)
4. 改善提案の優先順位付きリスト
EOF
|
サブエージェントの使用方法#
1
|
> code-reviewerサブエージェントを使って、このプルリクエストのコードレビューを実行して
|
サブエージェントは自動的に関連するスキルをロードし、包括的なコードレビューを実行します。
実践的なワークフロー例#
シナリオ1: プルリクエスト作成前のセルフレビュー#
プルリクエストを作成する前に、自分のコードをレビューします。
1
|
> プルリクエストを作成する前に、mainブランチとの差分をレビューして
|
Claude Codeは以下のフローで自動的にレビューを実行します。
sequenceDiagram
participant Dev as 開発者
participant CC as Claude Code
participant QC as code-quality-checker
participant CS as coding-standards
participant PA as performance-analyzer
participant RC as review-commenter
Dev->>CC: セルフレビュー依頼
CC->>CC: git diff main...HEAD
CC->>QC: 品質チェック実行
QC-->>CC: 検出結果
CC->>CS: 規約チェック実行
CS-->>CC: 検出結果
CC->>PA: パフォーマンス分析
PA-->>CC: 検出結果
CC->>RC: コメント生成
RC-->>CC: レビューコメント
CC-->>Dev: レビュー結果提示シナリオ2: 特定ファイルの重点レビュー#
特定のファイルやディレクトリに絞ってレビューします。
1
|
> performance-analyzerスキルを使って、src/services/ディレクトリのパフォーマンス問題を分析して
|
シナリオ3: PRコメントの自動生成#
レビュー結果をGitHub PRのコメントとして投稿可能な形式で生成します。
1
|
> review-commenterスキルを使って、レビュー結果をPRコメント形式で出力して
|
生成されたコメントは以下のコマンドでPRに投稿できます。
1
2
3
4
5
|
# サマリーコメントの投稿
gh pr comment 123 --body-file review-summary.md
# レビューとしてコメントを投稿
gh pr review 123 --comment --body-file inline-comments.md
|
カスタムスラッシュコマンドの作成#
頻繁に使うレビューワークフローをスラッシュコマンドとして登録します。
PRレビューコマンド#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
mkdir -p .claude/commands
cat > .claude/commands/review-pr.md << 'EOF'
code-reviewerサブエージェントを使って、以下のプルリクエストをレビューしてください。
## 対象PR
$ARGUMENTS
## レビュー手順
1. PRの変更内容(`gh pr diff`)を取得
2. 変更されたファイルに対して品質・規約・パフォーマンスチェックを実行
3. 検出結果をPRコメント形式で整形
4. review-summary.mdとinline-comments.mdを生成
## 出力
- レビューサマリー(PR全体へのコメント)
- インラインコメント(ファイル別の指摘)
- 称賛ポイント(良いコードの認識)
EOF
|
使用方法:
クイックチェックコマンド#
1
2
3
4
5
6
7
8
9
10
11
12
13
|
cat > .claude/commands/quick-check.md << 'EOF'
最新のコミットに対して簡易レビューを実行してください。
## チェック項目
1. **Critical問題のみ**: バグ、型エラー、例外処理の欠如
2. **規約の重大違反**: any型の使用、命名規則違反
3. **明らかなパフォーマンス問題**: N+1、同期ブロッキング
## 出力形式
修正が必要な問題のみを簡潔に報告。問題がなければ「LGTM」と報告。
EOF
|
使用方法:
CI/CDパイプラインへの統合#
コードレビュースキルをCI/CDパイプラインに組み込むことで、自動的な品質ゲートを設けられます。
GitHub Actionsでの活用例#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
name: Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
code-review:
runs-on: ubuntu-latest
permissions:
pull-requests: write
contents: read
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Claude Code
run: npm install -g @anthropic-ai/claude-code
- name: Run Code Review
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
claude --print "code-reviewerサブエージェントを使って、このPRの変更をレビューし、結果をreview-output.mdに保存して" > review-output.md
- name: Post Review Comment
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const review = fs.readFileSync('review-output.md', 'utf8');
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: review
});
|
品質ゲートの設定#
Critical問題が検出された場合にCIを失敗させるワークフローを設定します。
1
2
3
4
5
6
|
- name: Check Critical Issues
run: |
if grep -q "🔴 \[MUST FIX\]" review-output.md; then
echo "Critical issues found. Please fix before merging."
exit 1
fi
|
言語別カスタマイズ#
Python向けスキル拡張#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
cat >> .claude/skills/coding-standards/SKILL.md << 'EOF'
## Python規約チェック
### PEP 8準拠
- [ ] インデント: 4スペース
- [ ] 行の長さ: 79文字以内(docstringは72文字)
- [ ] インポート順序: 標準ライブラリ → サードパーティ → ローカル
- [ ] 空行: トップレベル定義間は2行、メソッド間は1行
検査パターン:
\`\`\`bash
# 長すぎる行
grep -rn "^.\{80,\}$" --include="*.py"
# インポート順序違反(概算)
grep -rn "^import\\|^from" --include="*.py" | head -20
\`\`\`
### 型ヒント
- [ ] 関数の引数と戻り値に型ヒントを付与
- [ ] `Optional`、`Union`の適切な使用
- [ ] `Any`の使用を最小限に
検査パターン:
\`\`\`bash
# 型ヒントのない関数定義
grep -rn "def.*):$" --include="*.py" | grep -v "->"
\`\`\`
### docstring
- [ ] 公開関数/クラスにはdocstringを付与
- [ ] Google Style または NumPy Styleで統一
- [ ] Args、Returns、Raisesセクションを含める
EOF
|
Java向けスキル拡張#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
cat >> .claude/skills/coding-standards/SKILL.md << 'EOF'
## Java規約チェック
### Google Java Style Guide準拠
- [ ] クラス名: UpperCamelCase
- [ ] メソッド名: lowerCamelCase
- [ ] 定数: CONSTANT_CASE
- [ ] パッケージ名: すべて小文字
検査パターン:
\`\`\`bash
# 定数命名違反
grep -rn "static final.*[a-z]" --include="*.java"
# publicメソッドのJavadoc欠如
grep -rn "public.*(" --include="*.java" -B 3 | grep -v "/\*\*"
\`\`\`
### 例外処理
- [ ] チェック例外は適切にキャッチまたはスロー
- [ ] catchブロックで例外を握りつぶさない
- [ ] リソースはtry-with-resourcesで管理
検査パターン:
\`\`\`bash
# 空のcatchブロック
grep -rn "catch.*{\\s*}" --include="*.java"
# リソースリーク
grep -rn "new.*Stream\\|new.*Reader\\|new.*Writer" --include="*.java" | grep -v "try"
\`\`\`
EOF
|
ベストプラクティス#
効果的なコードレビュースキルの設計#
| ポイント |
説明 |
| 具体的なチェックリスト |
曖昧な基準ではなく、具体的なチェック項目を列挙 |
| 検出パターンの提供 |
grepコマンド等で機械的に検出できるパターンを含める |
| 修正例の提示 |
問題だけでなく、具体的な修正コードを含める |
| 優先度の明確化 |
すべてを同列に扱わず、重要度で分類 |
レビューコメントの品質向上#
flowchart LR
A[問題検出] --> B{建設的に<br>表現できる?}
B -->|Yes| C[具体的な<br>改善案を追加]
B -->|No| D[表現を<br>見直し]
D --> C
C --> E[優先度を<br>付与]
E --> F[コメント完成]チームでの活用#
- 規約の共有: プロジェクトスキル(
.claude/skills/)をGitで管理
- 継続的な改善: 新しいパターンを発見したらスキルに追加
- オンボーディング: 新メンバーへのコーディング規約教育に活用
- 一貫性の確保: 人によるレビュー品質のばらつきを軽減
まとめ#
Claude CodeのAgent Skillsを活用したコードレビューの自動化について解説しました。本記事で作成したスキルとサブエージェントを活用することで、以下のことが実現できます。
- 一貫した品質基準でのレビュー: code-quality-checkerスキルによる客観的な品質検査
- コーディング規約の自動検証: coding-standardsスキルによるスタイル違反の検出
- パフォーマンス問題の早期発見: performance-analyzerスキルによるN+1、計算量問題の特定
- 建設的なレビューコメントの生成: review-commenterスキルによるPR用コメントの自動作成
- 包括的なレビューの実行: code-reviewerサブエージェントによる統合レビュー
コードレビューは品質向上の重要なプロセスですが、時間と労力がかかります。Claude Codeのスキルを活用することで、機械的なチェックを自動化し、人間のレビュアーはより高度な設計判断やビジネスロジックの検証に集中できるようになります。
参考リンク#