.cursor/skills/review-local-changes/SKILL.md
手元の実装変更、または現在ブランチとターゲットブランチの差分を、 関連コード(テスト・依存先・呼び出し元)も含めて AI レビューし、結果をマークダウンファイルに出力する。 "レビューして", "実装をレビュー", "変更をチェック", "review my changes", "self review", "セルフレビュー", "develop との差分をレビュー", "ブランチの差分をチェック", "review branch diff" などで起動する。
npx skillsauth add otomatty/zedi review-local-changesInstall 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.
手元の未 push な変更、または現在ブランチとターゲットブランチ(例: develop)の差分を、 関連テスト・依存ファイルも含めて多角的にレビューし、結果をマークダウンファイルとして出力する。
詳細な責務の定義は scope.md を参照する。
Phase 0 — レビュー対象の確認(AskQuestion 1〜2回)
└─ 0-1: 種類 = ローカル変更 / ブランチ差分
└─ 0-2: ローカル変更 → すべての変更 / コミット済みのみ / ステージ済みのみ
ブランチ差分 → ターゲットブランチの指定(未指定時は develop → main → 確認)
Phase 1 — 対象特定(直列・Shell 1回)
└─ ベース/ターゲット決定 → 変更ファイル一覧+統計 → スケール判定
Phase 2 — 情報収集(すべて並列、同一メッセージ内でツール発行)
├─ A: 差分取得 ─────────── Shell 1回(git diff -U2)
├─ B: 静的解析 ─────────── ReadLints + Shell(tsc, フィルタ済み)
├─ C: テスト検索 ─────────── Glob 1回(OR パターン)
├─ D: 呼び出し元検索 ───── Grep 1回(OR パターン)
└─ E: 危険コード検出 ───── Grep 2回(セキュリティ / コード品質)
Phase 3 — 分析・レポート・事後アクション(直列)
--stat で概要を先に取得 → 詳細差分は優先ファイルのみ読む-U2 でコンテキスト行をデフォルト 3→2 に縮小output_mode: "files_with_matches" でパス一覧だけ取得し本文を読まない0-1. 種類の決定
ユーザーが明示していない場合、AskQuestion ツール で次のいずれかを確認する:
「develop との差分をレビュー」「ブランチの差分をチェック」等の表現ならブランチ差分と判定する。 「レビューして」「作業中の変更を見て」等ならローカル変更と判定してよい。
0-2a. ローカル変更の場合 — 範囲の決定
| 選択肢 | 対象 | git diff コマンド |
| -------------------------- | ----------------------------- | --------------------------- |
| すべての変更(デフォルト) | committed + staged + unstaged | git diff $MERGE_BASE |
| コミット済みのみ | committed | git diff $MERGE_BASE HEAD |
| ステージ済みのみ | staged | git diff --cached |
「PR の変更をレビューして」等 → committed のみ。「作業中の変更を見て」等 → すべての変更。意図が明確なら AskQuestion をスキップしてよい。
0-2b. ブランチ差分の場合 — ターゲットブランチの決定
優先順位: ユーザー指定(例: develop, main)→ develop → main。いずれも存在しなければ AskQuestion で指定を求める。
git diff $MERGE_BASE..HEAD または git diff $TARGET..HEAD)。staged/unstaged は含めない。<BASE_BRANCH> として使う。develop → main → HEAD~1。以下のロジックで決定する(シェルスクリプトではなくエージェントのロジックとして実行):
git branch --list develop の結果があれば develop を使うgit branch --list main の結果があれば main を使うHEAD~1 を使うgit merge-base <BASE_BRANCH> HEAD
フォールバック:
git merge-baseが失敗した場合(shallow clone, orphan branch 等)は<BASE_BRANCH>をそのまま使う。それも失敗したらHEAD~1に切り替える。 いずれも失敗する場合はユーザーにベースブランチの指定を求めて終了する。
Shell 1 回 で Phase 0 の選択に応じた diff コマンドを実行する:
echo "=== changed files ==="
git diff --name-only <DIFF_ARGS> | sort -u
echo "=== diff stat ==="
git diff --stat <DIFF_ARGS>
echo "=== commits ==="
git log "$MERGE_BASE..HEAD" --format="%h %s" --reverse 2>/dev/null || echo "(no commits)"
<DIFF_ARGS> は Phase 0 の選択に基づく:
$MERGE_BASE$MERGE_BASE HEAD--cached$MERGE_BASE..HEAD(コミット済みのみ)差分がない場合はユーザーに報告して終了する。
取得したファイル一覧から以下をエージェント側で除外する(grep -v パイプではなくロジックで判定し、クロスプラットフォーム互換を保つ)。
すべての Phase でレビュー対象外:
*.lock, bun.lock, package-lock.json, yarn.lock*.generated.*, *.min.js, *.min.cssdist/, build/, node_modules/--stat 出力の 変更行数(insertions + deletions) でファイルを降順ソートし、スケールに応じた戦略を決定する:
| ファイル数 | 差分の読み方 | 関連ファイル |
| ---------- | ------------------------------------ | --------------------------------------- |
| 1〜5 | 全ファイルの差分(-U2) | 該当箇所を Read(最大 10 件) |
| 6〜15 | 全ファイルの差分(-U2) | export シグネチャ周辺のみ(最大 10 件) |
| 16+ | 変更行数上位 10 ファイルのみ差分取得 | スキップ(ファイル名のみレポート記載) |
例外: セキュリティ関連ファイル(認証・API ルート・ミドルウェア等)は変更行数に関わらず優先的にレビュー対象に含める。
以下の A〜E を 同一メッセージ内でツール呼び出しを並列発行 する。
Phase 0 の選択に応じた 1 つの git diff コマンド で全差分を取得する:
git diff -U2 <DIFF_ARGS>
-- <files> で限定-U2 でコンテキスト行を縮小しトークン消費を削減B-1. ReadLints ツール(Shell 不要・コンテキスト最小)
変更ファイルのパス一覧を ReadLints の paths パラメータに渡す。
IDE が保持している lint 診断を即座に取得でき、Shell 実行コストがゼロ。
B-2. 型チェック(Shell — block_until_ms: 60000)
bunx tsc --noEmit --pretty 2>&1 | tee /tmp/tsc_review.log
# 変更ファイルパス一覧(改行区切り)を用意し、そのいずれかに一致する行のみ抽出する
printf '%s\n' <変更ファイルパス1> <変更ファイルパス2> ... | grep -Ff - /tmp/tsc_review.log || true
変更ファイルフィルタ:
teeで全出力を/tmp/tsc_review.logに保存し、Phase 3 の分析では変更ファイルに関連するエラーのみを対象とする。grep -Ff -に改行区切りでパスを渡すことで、固定文字列マッチで安全にフィルタする(grep -Eだとパス内の正規表現特殊文字で意図しない一致をするため使わない)。 出力に変更ファイル名が含まれないエラーは既存の問題として無視する。head -Nによる打ち切りは行わない(変更ファイルのエラーが埋もれるため)。 タイムアウト:block_until_ms: 60000(60 秒)を設定する。 60 秒以内に完了しない場合はバックグラウンドに移行するため、ターミナルファイルを確認する。 120 秒経過しても完了しない場合は pid を使って kill し、型チェックをスキップとしてレポートに記載する。
変更ファイルのベース名を OR パターンにまとめて Glob ツールを 1 回 で呼び出す:
glob_pattern: "**/{basename1,basename2,...}.{test,spec}.{ts,tsx}"
変更ファイルが
CreatePageDialog.tsxとapi.tsの場合:**/{CreatePageDialog,api}.{test,spec}.{ts,tsx}
__tests__/ 配下も検索する場合は追加で 1 回:
glob_pattern: "**/__tests__/{basename1,basename2,...}.*"
テストが存在しないファイルはレポートに ⚠️ として記載する。
変更ファイルのモジュール名を OR で結合して Grep ツールを 1 回 で呼び出す:
pattern: "from ['\"].*/(moduleA|moduleB|moduleC)['\"]"
glob: "*.{ts,tsx}"
output_mode: "files_with_matches"
files_with_matches によりファイルパスのみ返却され、コンテキスト消費を最小化する。
変更ファイルのパスを 個別に path に指定するか、共通親ディレクトリを使う場合は結果を変更ファイル一覧に対してフィルタする。2 つの Grep 呼び出しを並列発行 する:
E-1. セキュリティ(Critical):
pattern: "(password|secret|token|api_key)\\s*[:=]\\s*['\"][^'\"]{8,}"
path: <変更ファイルのパス(1 ファイルずつ)または共通親ディレクトリ>
glob: "*.{ts,tsx,js,jsx}"
E-2. コード品質(Warning + Info):
pattern: "console\\.(log|debug)|(TODO|FIXME|HACK):"
path: <変更ファイルのパス(1 ファイルずつ)または共通親ディレクトリ>
glob: "*.{ts,tsx,js,jsx}"
共通親ディレクトリで実行した場合、結果から変更ファイル以外のパスに属するマッチは除外する。未変更ファイルの
console.log/TODO/ secrets を Critical/Warning として計上しない。.envファイルが変更ファイル一覧に含まれる場合は即 Critical として記録する(Grep 不要)。
Phase 2 で収集した情報を以下の観点で分析する。
AGENTS.md の「PR レビュー観点」セクション(セキュリティ・パフォーマンス・破壊的変更・エラーハンドリング)を基本とし、以下の自動検出ルールを追加適用する:
| 検出対象 | 重大度 | 判定基準 |
| ------------------------ | -------- | ------------------------------------------ |
| any 型の使用 | Critical | diff 内に : any / as any が存在 |
| lint エラー(ReadLints) | Critical | error レベルの診断 |
| 型エラー(tsc) | Critical | 変更ファイルに関連するエラー |
| ハードコード秘密鍵 | Critical | E-1 の Grep でヒット |
| .env ファイル変更 | Critical | 変更ファイル一覧に含まれる |
| console.log/debug 残存 | Warning | E-2 の Grep でヒット(変更ファイル内のみ) |
| ファイル行数超過 | Warning | 変更後のファイルが概ね 300 行超 |
| 関数行数超過 | Warning | 変更された関数が概ね 150 行超 |
| ネスト深度 | Warning | 4 段超のネストが diff 内に存在 |
| TODO/FIXME/HACK | Info | E-2 の Grep でヒット |
上記の行数閾値は目安であり、プロジェクトの規模や慣習に応じて柔軟に判断する。
any 使用、lint/型エラー、ハードコード秘密鍵、.env 変更docs/reviews/ に出力する(ディレクトリがなければ作成。docs/ は .gitignore により Git 追跡外のローカル作業用。仕様の正はソースとテスト)。
review-<branch-slug>-<YYYYMMDD>.md
branch-slug: ブランチ名の / を - に置換(例: feature/foo → feature-foo)-2, -3 と連番を付与| 条件 | 形式 | | ----------------------------------- | ---------- | | 変更 5 ファイル以下 & Critical 0 件 | コンパクト | | それ以外 | フル |
レポート生成時に .cursor/skills/review-local-changes/template.md を Read ツールで読み込み、該当する形式を使用する。再レビュー時の追加セクションもテンプレートに定義されている。
レポート出力後、AskQuestion ツール で以下を確認する:
bunx prettier --write <modified-files> でフォーマット-rev2, -rev3 を付与sed 等の POSIX 専用コマンドへの依存を避けるgrep -v パイプに頼らない/)をそのまま使い、OS 固有の変換は行わないdocumentation
Zenn 記事を A先輩と B後輩の対話形式で執筆する。 Q&A のように疑問点にピンポイントで答える構成で、 初心者がつまずきやすいポイントを自然に解消する。 "対話形式で記事を書いて", "会話形式の記事", "dialogue article", "対話記事", "先輩後輩の会話で記事" などで起動する。
documentation
Zenn 記事の執筆・推敲を、体験ベースで読みやすいトーンに仕上げる。 AIっぽい定型表現を排除し、実践報告として説得力のある文章を生成する。 "Zenn記事を書いて", "記事の下書き", "ブログ記事を書く", "記事を推敲して", "write a Zenn article", "draft a blog post" などで起動する。
development
Runs Stryker mutation tests only on git-changed production files under `src/` via `scripts/stryker-mutate-changed.mjs` and `bun run test:mutation:changed`. Uses `stryker.config.mutation-changed.mjs` so partial runs do not fail on global `thresholds.break`. Use when the user asks for mutation testing on changed files only, incremental mutation test, diff-based Stryker, or "差分だけミューテーション" / "mutation test for current changes". After a run, use `bun run mutation:report:summary` and attach `reports/mutation/mutation-summary.md` for AI explanation (not HTML).
development
PR レビューコメントを仕様に照らして分析し、対応方針を提案・実行する。 コメントをそのまま受け入れるのではなく、TSDoc/テスト/型定義に基づいて 妥当性を検証し、修正・代替案・対応不要を判断する。 "レビュー対応して", "PRコメントに対応", "review PR comments", "レビューコメントを確認", "PRのレビューを処理" などで起動する。 Cursor / Claude Code 共通で使用可能。