08-03. Skills で「特定の場面で起動するスペシャリスト」を作る
この回のゴール
- Skill が CLAUDE.md と何が違うか(常時 vs 場面別、eager vs lazy)を理解する
.claude/skills/<name>/SKILL.mdの構造と発火条件を書けるようになる- 自分のリポジトリで Skill を 2 つ以上作って動作確認する
1. 動機: CLAUDE.md だけでは "詰まる" シーン
CLAUDE.md は 毎セッションの先頭で読まれる = 常駐コンテキスト。 だが業務には 特定の状況でだけ呼びたい知識 がたくさんある:
- コミットメッセージを書く時 → コミット規約 (Conventional Commits 準拠など)
- リリースノートを書く時 → リリースノート用の見出し構成・絵文字
- 新規ライブラリを追加する時 → ライセンス確認とサイズチェック手順
- DB マイグレーションを書く時 → 後方互換性・ロールバックチェックリスト
これら全部を CLAUDE.md に書くと 冗長で読みにくく、効果が薄れる(2 章 6 節のアンチパターン)。
→ Skills = 「特定の意図のときだけ Claude が読みに行く知識・手順」
2. Skill の構造
cd <your-repo>
claude
> /init
SKILL.md の最低限の中身:
> ステージにある変更で適切なコミットメッセージを書いて
重要: description フィールド
- Claude は
descriptionを読んで「今、この Skill を発動すべきか」を判断する - 動詞ベース・状況ベースで書く: 「...する時に使う」
- 抽象的すぎる説明だと発火しない / 過剰発火する
3. CLAUDE.md vs Skills vs Hooks
| CLAUDE.md | Skills | Hooks | |
|---|---|---|---|
| いつ読まれる | 毎セッション開始時 | Claude が「使うべき」と判断した時 | 特定イベント時(ToolUse 前後など) |
| Claude の判断 | 常に参照 | description 見て判断 | 関係なく強制実行 |
| 失敗時の影響 | コンテキスト汚染 | 該当タスク質低下 | セッション継続/中断 |
| 用途 | 普遍的なプロジェクトルール | 場面別のノウハウ | 機械的な強制(テスト実行など) |
→ 階層: CLAUDE.md (常駐) ≪ Skills (lazy) ≪ Hooks (強制)
4. ハンズオン: 2 つの Skill を作る
Skill 1: コミットメッセージ
- 役割分担(どこに何が書いてあるか)
- SSH 接続情報
- ワークフロー (5 ステップ)
- Critical Rules
- Nginx 設定の罠
- 情報漏洩防止ポリシー
- バックアップルール
- セキュリティ
- リソース制約
- ドキュメント鮮度
.claude/skills/git-commit-message/SKILL.md:
Skill 2: PR レビューチェックリスト
wzxhzdk:4
.claude/skills/pr-review-checklist/SKILL.md:
wzxhzdk:5
動作確認
wzxhzdk:6
5. アンチパターン
| 症状 | 原因 | 対策 |
|---|---|---|
| 関係ない場面で Skill が発火 | description が広すぎる | 状況を絞る:「コミットメッセージを書く時」 |
| 必要な場面で Skill が呼ばれない | description に該当キーワードが無い | 動詞・名詞両方含める |
| Skill 同士が矛盾 | 似た目的を別 Skill で書いた | 1 つに統合、もしくは明確にスコープ分離 |
| Skill が肥大化 | 全部入りで書いた | サブファイル(templates/, scripts/)に分割し、SKILL.md からは概要のみ |
6. 今回の限界 (notes に書く内容)
- Skills は Claude が判断する 仕組み = 100% の発火保証はない
- 「絶対にこの処理を Edit の前に走らせたい」(例: lint, test) には不向き
- → 次回 (08-04) で Hooks を導入し、強制力のある自動化を学ぶ