claude/skills/workflow-review/SKILL.md
ローカルのgit差分を自動検出し、TDD/テスト品質、コード品質、セキュリティ、アーキテクチャ、プロジェクトルール準拠の5観点でコードレビューを実施。改善点があれば具体的な修正コードを提案。
npx skillsauth add skanehira/dotfiles workflow-reviewInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
ローカルのgit変更を自動検出し、5つの観点からコードレビューを実施します。
/review # すべての変更をレビュー
/review --staged # ステージ済み変更のみ
引数: $ARGUMENTS
- --staged: ステージ済み変更のみ
- --all または 空: すべての変更
Bashツールで以下を実行してgitリポジトリか確認:
git rev-parse --git-dir 2>/dev/null
gitリポジトリでない場合:
「このディレクトリはgitリポジトリではありません。/reviewはgitリポジトリ内で実行してください。」と表示して終了。
Bashツールで以下を実行:
git status --porcelain
$ARGUMENTSが--stagedの場合:
git diff --staged
それ以外の場合:
git diff
git diff --staged
変更が0件の場合: 「レビュー対象の変更がありません。」と表示して終了。
検出された変更:
- [ファイルパス] ([変更種別: 修正/新規/削除])
- ...
合計: N ファイル
各変更ファイルについてReadツールで内容を読み込む。
Globツールで言語に応じたパターンを検索し、変更ファイルに対応するテストを特定:
| 言語 | パターン | 配置 |
| ---------------- | -------------------------------------------- | ----------------------------------------------- |
| Go | *_test.go | 同一ディレクトリ |
| Rust | tests/**/*.rs, モジュール内 #[cfg(test)] | 統合テストは tests/、単体テストはモジュール内 |
| TypeScript/React | *.test.ts, *.test.tsx, __tests__/** | 同一ディレクトリまたは __tests__/ |
| Lua | *_test.lua, *_spec.lua, test_*.lua | 同一ディレクトリ |
**/*_test.go (Go)**/tests/**/*.rs (Rust統合テスト)**/*.test.* (TypeScript/React)**/*_test.* (Lua, 汎用)**/*_spec.* (Lua, 汎用)**/__tests__/** (React)| 言語 | 実装ファイル | テストファイル |
| ---------- | --------------- | ------------------------------------------------------------------------ |
| Go | handler.go | handler_test.go(同一ディレクトリ) |
| Rust | src/user.rs | src/user.rs 内の #[cfg(test)] mod tests、または tests/user_test.rs |
| TypeScript | LoginForm.tsx | LoginForm.test.tsx(同一ディレクトリ) |
| Lua | foo.lua | foo_test.lua, foo_spec.lua, test_foo.lua |
変更ファイルに関連するすべての処理を把握するため、以下の手順で依存関係を追跡:
インポート/依存関係の解析:
言語に応じたインポート文をGrepで抽出:
| 言語 | パターン |
| ---------- | ------------------------------------ |
| Go | import "...", import (...) |
| Rust | use ..., mod ..., extern crate |
| TypeScript | import ... from, require(...) |
逆依存関係の追跡:
呼び出し関係の追跡:
同一モジュール内のファイル:
[変更ファイルのディレクトリ]/**/*
Grepツールで以下を検索:
以下のファイルが存在する場合、Readツールで読み込んでおく:
CLAUDE.md(プロジェクトルート)
docs/DESIGN.md
.claude/rules/(ディレクトリ内のすべてのファイル)
以下の6観点は必須で常にレビューを実施する:
AskUserQuestionツールで追加のレビュー観点を確認する:
AskUserQuestion({
questions: [
{
question: "必須観点(TDD/テスト品質、コード品質、セキュリティ、アーキテクチャ、プロジェクトルール、パフォーマンス)に加えて、追加でレビューしたい観点はありますか?",
header: "追加観点",
options: [
{ label: "追加なし", description: "必須観点のみでレビュー(推奨)" }
],
multiSelect: false
}
]
})
「Other」選択時の処理:
必須観点 + 選択された追加観点について以下のチェックを実施する。
チェック項目:
| 項目 | 重要度 | 確認内容 | | ---------------- | -------- | ------------------------------------------------------------------------ | | テストの存在 | Critical | 新規コードに対応するテストファイルが存在するか | | テストカバレッジ | Warning | 主要関数がテストされているか、エッジケース・エラーケースのテストがあるか | | テスト品質 | Critical | テスト名が動作を説明しているか、AAAパターンに従っているか |
言語別テスト品質基準(詳細は writing-tests スキルを参照):
| 言語 | 命名規則 | 構造 |
| ---------- | ------------------------------ | -------------------- |
| Go | Test関数_should結果_when条件 | Table-Driven Tests |
| Rust | 関数_returns結果_when条件 | #[test], rstest |
| TypeScript | describe + it | AAA, Testing Library |
判定基準:
チェック項目:
| 項目 | 重要度 | 確認内容 |
| ------------ | ------- | ---------------------------------------------------------------------------------------------------- |
| 可読性 | Warning | 関数/変数名が意図を表現しているか、関数の長さ(目安: 50行以内)、ネストの深さ(目安: 3レベル以内) |
| 命名規則 | Info | プロジェクトの既存命名規則に従っているか |
| 重複 | Warning | 同一/類似コードが複数箇所にないか |
| コメント | Info | 複雑なロジックに「なぜ」を説明するコメントがあるか |
| 不要コメント | Warning | 処理を翻訳しただけの無意味なコメントがないか(例: i++; // iをインクリメント) |
| 型安全性 | Warning | 適切な型定義、型ガードがあるか |
| 凝集度 | Warning | モジュール/クラス/関数が単一の目的に集中しているか(機能的凝集が理想) |
| 結合度 | Warning | モジュール間の依存が最小限か、データ結合やメッセージ結合になっているか(内容結合・共通結合は避ける) |
判定基準:
チェック項目:
| 項目 | 重要度 | 確認内容 | | ---------------- | -------- | ------------------------------------------------------- | | シークレット管理 | Critical | ハードコードされたパスワード、APIキー、トークンがないか | | 入力検証 | Critical | ユーザー入力のバリデーションがあるか | | 認証/認可 | Warning | 適切なアクセス制御があるか | | インジェクション | Warning | SQL、コマンド、XSSの脆弱性がないか |
検索パターン:
| カテゴリ | パターン |
| ---------------------- | ------------------------------------------------------------ |
| 秘密情報 | password, secret, api_key, token |
| トークンプレフィックス | ghp_, sk-, aws_, AKIA |
| 危険な関数(共通) | eval(, exec(, system( |
| 危険な関数(Go) | os.Exec, exec.Command, sql.Query(プレースホルダなし) |
| 危険な関数(Rust) | std::process::Command, unsafe { |
判定基準:
チェック項目:
| 項目 | 重要度 | 確認内容 | | ---------------------- | ------- | --------------------------------------------------------------------- | | 責務分離 | Warning | 単一責任原則に従っているか、1ファイル/1関数が単一の責務を持っているか | | 既存パターンとの一貫性 | Warning | プロジェクトの既存パターンと一貫しているか | | 依存関係 | Info | 依存の方向が適切か(具象→抽象) | | Tidy First | Warning | 構造変更と機能変更が混在していないか |
判定基準:
チェック項目:
| 項目 | 重要度 | 確認内容 | | ----------------- | -------- | ------------------------------------------------------------ | | CLAUDE.md準拠 | Critical | コーディング規約、禁止パターン、推奨アプローチに従っているか | | DESIGN.md準拠 | Warning | 設計方針、アーキテクチャ原則に沿った実装か | | .claude/rules準拠 | Warning | プロジェクト固有のルールに違反していないか |
確認手順:
判定基準:
チェック項目:
| 項目 | 重要度 | 確認内容 | | ---------------- | -------- | ----------------------------------------------- | | アルゴリズム効率 | Critical | O(n²)以上の計算量、不要なループのネスト | | メモリ使用量 | Warning | 大量データの保持、メモリリーク、不要なコピー | | I/O効率 | Warning | N+1問題、不要なAPI/DBアクセス、バッチ処理の欠如 | | キャッシュ活用 | Info | 繰り返し計算の結果キャッシュ、メモ化の活用 | | 非同期処理 | Warning | ブロッキング処理、並列化可能な処理の直列実行 |
確認手順:
判定基準:
# Code Review Report
## Summary
| 観点 | Critical | Warning | Info |
|----------------------|----------|---------|-------|
| TDD/テスト品質 | X | X | X |
| コード品質 | X | X | X |
| セキュリティ | X | X | X |
| アーキテクチャ | X | X | X |
| プロジェクトルール | X | X | X |
| **合計** | **X** | **X** | **X** |
各Critical Issueについて以下の形式で表示:
### [観点] 問題タイトル
**ファイル**: `パス:行番号`
**問題**: 問題の説明
**推奨対応**: 対応方法
各Warningについて以下の形式で表示:
### [観点] 問題タイトル
**ファイル**: `パス:行番号`
**問題**: 問題の説明
**推奨対応**: 対応方法
各Infoについて以下の形式で表示:
### [観点] 提案タイトル
**ファイル**: `パス:行番号`
**提案**: 改善提案
レビュー結果を表示した後、AskUserQuestionツールを使用してユーザーに次のアクションを確認:
AskUserQuestion({
questions: [
{
question: "レビューでX件のCritical Issue、Y件のWarningが検出されました。\n\nどのように進めますか?",
header: "レビュー結果",
options: [
{
label: "Critical Issueをすべて修正",
description: "最優先で対応すべき問題の修正コードを表示"
},
{
label: "すべての問題を修正",
description: "Critical + Warning の修正コードをまとめて表示"
},
{
label: "特定の問題のみ修正",
description: "修正したい問題を個別に選択"
},
{
label: "レビュー完了",
description: "修正せずにレビューを終了"
}
],
multiSelect: false
}
]
})
「Critical Issueをすべて修正」「すべての問題を修正」「特定の問題のみ修正」選択時:
各問題について以下の形式で修正案を提示:
## 修正コード提案
### [観点] 問題タイトル
**現在のコード** (`ファイルパス:行番号`):
```言語
現在のコード
```
**修正案**:
```言語
修正後のコード
```
**変更理由**: 変更の根拠を説明
```
### 修正対象の選択
**「特定の問題のみ修正」選択時**:
検出された各指摘を選択肢として表示し、修正したい問題を直接選択させる(複数選択可):
```javascript
AskUserQuestion({
questions: [
{
question: "修正したい問題を選択してください(複数選択可)",
header: "修正対象",
options: [
{ label: "すべて修正", description: "検出されたすべての問題を修正" },
{ label: "[Critical] ハードコードされたAPIキー", description: "セキュリティ: config.lua:45" },
{ label: "[Critical] テストファイルが存在しない", description: "TDD: github-pr-reviewer.lua" },
{ label: "[Warning] 関数が長すぎる", description: "コード品質: utils.lua:120-180 (60行)" }
],
multiSelect: true
}
]
})
```
**注意**:
- AskUserQuestionのoptionsは最大4件のため、「すべて修正」+ 重要度順に上位3件を表示
- 残りの指摘を修正したい場合は「Other」で追加指定可能
選択された問題の修正コードを提示し、承認を得てから修正を適用。
node_modules/, .git/等)package-lock.json, Cargo.lock等).gitignore, .editorconfig等)--stagedオプションで対象を絞ることを推奨」と警告を表示tools
ローカルのコミット履歴と差分からDraft PRを作成する。ブランチ未作成・コミット未作成の状態でも、必要に応じてブランチ作成とコミットを行ってからPRを作成する。`.github/` にPRテンプレートがあれば内容を埋めて、なければ作業内容から本文を生成し、`AskUserQuestion`で作成可否を確認してから `gh pr create --draft` を実行する。「PRを出したい」「draft PRを作成」「プルリクを作って」「PR本文を生成」などのリクエストで起動。
tools
複数サブエージェントに異なる立場を与えて議論を反復し、相違が収束するまで議題を検証して結論を提示する。設計妥当性検証・実装方針比較・原因分析のセカンドオピニオン・アイデアの壁打ちに使用。「議論したい」「壁打ちしたい」「セカンドオピニオン」「複数視点で検証したい」などで起動。
tools
変更内容を分析し、Conventional Commit形式でコミットする (pushはユーザが手動)
development
React 19 + Vite+ (`vp`) + TypeScript + Tailwind CSS v4 + React Router v7 (HashRouter) でモバイル向け静的SPAデモサイトをTDDで構築し、Cloudflare Workers (Static Assets) へ自動デプロイするまでの標準ワークフローを提供する。テンプレートリポジトリ `skanehira/demo-site-template` を `gh repo create --template` で clone することで scaffold を省略する。`localStorage` でフロントエンドのみ完結する"フロントのみ完結デモ"に特化。デザインコンセプトの確立には `frontend-design` スキルを呼び出して連携する。起動トリガー:「デモサイトを作りたい」「モバイル向け静的デモ」「SPAを作ってCloudflareにデプロイ」「静的プロトタイプを公開」「localStorage でフロントだけ完結」。ユースケース:(1)クライアント提案用のUI/UXたたき台、(2)新機能のプロトタイプ、(3)モバイル向けランディング。ツールチェーンは Vite+ (`vp`) で統合(内部 PM は pnpm)。