simplify
変更中のコード(git diff)を読んで、再利用可能な既存コードの見落とし・過剰設計・無関係な編集・非効率な実装を列挙し、ユーザ承認の上で最小差分で修正する。 Use when user asks to [シンプル化, 簡素化, リファクタ, 冗長を削って, /simplify, simplify].
SKILL.md.claude/skills/dev/simplify/SKILL.md
GitHub変更中のコード(git diff)を対象に、再利用 / 品質 / 効率 の3観点で問題を洗い出し、ユーザ承認後に最小差分で修正する Evaluator + Generator。
用途
- LLM 生成直後のコードに典型的な問題(勝手な抽象化・車輪の再発明・無関係な整形)を最終段で潰す
- PR 作成前の最後のクリーンアップとして呼ぶ
- ハーネス設計原則「Generator と Evaluator を分離」「シンプルさ最優先」の実装レベルでの自動化
引数
/simplify [target ...]
target省略時:git diff --name-only HEADの変更ファイルを対象- ファイルパス: 単一ファイル
- ディレクトリパス: 配下の変更ファイル(git diff に含まれるもののみ)
実行手順
Step 1: 対象 diff の収集
git diff HEAD --unified=10 -- {target...}で変更を取得- diff が空なら「変更なし」と報告して終了
- バイナリ・画像・
*.jsonのロックファイルは除外
Step 2: 3観点で問題点を列挙(修正はまだしない)
以下の観点でそれぞれ issue を抽出する。重要度は HIGH / MEDIUM / LOW で付ける。
2-A. 再利用の見落とし(Reuse)
- プロジェクト内に既存のユーティリティがあるのに新規実装している
- 例:
.claude/scripts/lib/mdx-io.mjsのreadMdxFile/writeMdxFileを使わず、直接readFileSync/writeFileSyncを呼んでいる → HIGH(CRLF 事故の再発リスク) - 例:
src/lib/docs.tsのpreprocessMDXと同等の正規表現を別ファイルで再実装
- 例:
- グローバルな探索(Grep)で類似関数を確認してから指摘する
2-B. 品質(Quality)
- CLAUDE.md 違反:
- 装飾絵文字を本文に使用(❌✅💡等)→ HIGH
- 4列以上の表・キーバリュー表 → MEDIUM
border-gray-*にdark:border-*が無い → HIGH- 生の
rounded-lg/shadow-md使用(デザイントークン無視)→ MEDIUM
- 勝手な仮定・過剰設計:
- 依頼されていない機能追加 → MEDIUM
- 1 回しか使わないコードの抽象化 → MEDIUM
- 起こり得ないエラーハンドリング → LOW
2-C. 効率(Efficiency)
- 同じファイルを複数回読む・同じ正規表現を複数回 new する → LOW
- 並列化可能な独立ループを順次実行 → LOW
- 無関係な編集(依頼対象外のフォーマット変更・リネーム)→ MEDIUM
Step 3: ユーザに提示して承認を得る
以下のフォーマットで出力し、必ず確認を取ってから修正を開始する:
=== /simplify: N files ===
<ファイルパス1>
[HIGH] L42: readFileSync を直接呼んでいる
→ .claude/scripts/lib/mdx-io.mjs の writeMdxFile を使うべき
(CRLF 保持が壊れて 100+ ファイル reject の事故歴あり)
[MEDIUM] L58: 4列の比較表
→ 散文化 or 2軸比較に分割
<ファイルパス2>
[HIGH] L12: border-gray-200 に dark:border 指定なし
→ `dark:border-gray-700` を追加
=== Summary ===
HIGH: 2 / MEDIUM: 1 / LOW: 0
修正を適用しますか? (yes / no / HIGH のみ / 個別選択)
Step 4: 承認後に最小差分で修正
- ユーザが承認した issue のみ 修正する
- 1 修正 = 1 Edit(まとめ差分にしない。レビューしやすさ優先)
- 無関係な整形・リネームはしない(Step 2-C で指摘したなら、その修正のみ)
- 修正後に
git diff --statを報告
Step 5: 検証チェーン(pre-commit 相当)
Step 4 の修正後、自動で以下を実行して結果を報告する。失敗したら次に進まない。
- UI 変更があるなら
node scripts/lint-ui.mjsを走らせる(ステージ対象ではなく修正ファイルに対して) - MDX 変更があるなら
node scripts/pre-commit-mdx.mjsを走らせる(staged ではなく修正ファイル対象の軽量検証) - src/lib や .claude/scripts/lib の変更があるなら
npm testを走らせる - type-check 変更影響が疑わしければ
npm run type-check(.tsx / .ts 変更があれば必ず走らせる)
全部 OK なら Step 6 へ。fail したら内容を報告してユーザに判断を委ねる(本スキルは修正まではしない)。
Step 6: /pr-create 呼出確認
以下のプロンプトを出してユーザに選ばせる:
修正 + 検証 OK。次のアクションを選んでください:
1. /pr-create ── 現ブランチから PR を作成
2. commit のみ ── 変更をステージ済みまでに留める
3. 何もしない ── 終了
選択 (1/2/3):
選択 1: /pr-create を呼び出す(title / body の草案生成まで本スキルで行い、最終承認は /pr-create 内で)
選択 2: ユーザが手動で commit するよう案内して終了
選択 3: 「/simplify 完了」と報告して終了
重要: hook ではなくスキル内でチェーン化しているため、ユーザが /simplify を明示的に叩いた時のみ Step 5-6 が走る。自動発火はしない(CLAUDE.md §1「確認を挟むのは解釈の違いで成果物が大きく変わるときだけ」を守るため)。
出力フォーマット(省略版)
検出は常に全件行う。絞るのは表示だけ(検出段階で落とすと見逃しになる)。
10ファイル以上 or issue 20件超のとき:
- 会話にはファイル別の件数サマリ+重大度上位のみを表示
- 全件は
.tmp/simplify-<対象>.mdに書き出してパスを明示する(黙って省略しない) - 詳細は「特定ファイルで
/simplify <path>を再実行してください」と案内
例
例 1: scripts で直接 writeFileSync を使用
scripts/backfill-category.mjs
[HIGH] L24: writeFileSync を直接呼んでいる
→ .claude/scripts/lib/mdx-io.mjs の transformMdxFile を使う
(CLAUDE.md の MDX 書き込み規約、CRLF 保持)
例 2: 依頼以外の整形変更が混入
src/components/ui/Callout/Callout.tsx
[MEDIUM] L1-5: import 順のみの変更(依頼範囲外)
→ 削除して diff を最小に
アンチパターン
- 承認を得る前に修正を始めない ── Step 3 のユーザ確認は必須
- 無関係な dead code を勝手に消さない ── 指摘のみ、削除は別タスクで依頼
- diff の外を触らない ── 「ついでに」の周辺改善は禁止
- 重大度を過大評価しない ── HIGH は「事故歴あり」「CLAUDE.md 明示違反」に限定
- 既存のユーティリティ有無を Grep で確認せずに「既存あり」と主張しない ── 確認手順を省略するとハルシネーションになる
参照
CLAUDE.md── 「12 原則」(§1-§4 が実装の行動原則・§5 がハーネス設計原則).claude/knowledge/reference/content-authoring.md── MDX コンポーネント・frontmatter 規約.claude/skills/dev/code-review/SKILL.md── コード品質レビュー(観点が重複するため、/simplify は「修正提案型」、/code-review は「批判型」と使い分け).claude/skills/dev/pr-create/SKILL.md── Step 6 で呼び出す PR 作成スキルscripts/lint-ui.mjs── UI 静的 lint(Step 5-1 で呼ぶ)scripts/pre-commit-mdx.mjs── MDX pre-commit 検証(Step 5-2 で呼ぶ)