機能を学ぶ · COURSE
Hooks の 7 つの基本レシピ
決定論的な自動化を組み立てる。コピペで使える 7 例。
audience
Claude Code を毎日使う人
duration
60分
lessons
8 章
reviewed
2026.05
2 分でコース概要を見る
先に読むとよい
このコースで作るもの
- 01Hook 設定済み settings.json(7 レシピのうち最低 3 個)
- 02guard-prod.sh / format / 通知のシェルスクリプト一式
- 03Hook 動作確認チェックリスト
達成目安
全 8 レッスンを読み、コース完了マークを付ける
未完了
クイズ 8 問に挑戦し、正答率 80% 以上
未挑戦
成果物 3 個を実際に手元に作る
自己チェック
コース構成
このコースで学ぶこと
- 01
Hook が必要な瞬間
Skill との違い。「Claude の判断に任せたくない」「毎回必ず動かしたい」が Hook のサイン。
Skill は「Claude が読んで判断して実行する手順書」、Hook は「決まった瞬間に決まったコードを叩く」もの。lint・テスト・通知・ブロックのような決定論的な処理は Hook の領分です。
29 個ある Hook イベントの中で、最初に覚えるべきは 7 つ。これを押さえれば 80% カバーできます。
- **PreToolUse** — ツール実行前。ブロックや引数書き換え
- **PostToolUse** — ツール実行後。フォーマッタ・テスト走らせ
- **SessionStart** — セッション開始時。env 注入や挨拶
- **Stop** — Claude が応答を終えたとき。通知に
- **UserPromptSubmit** — ユーザー入力直後。検閲・展開
- **PreCompact** — コンパクション前。要約観点を渡す
- **Notification** — Claude が入力待ちになったとき
理解度チェック
Q1.Skill ではなく Hook を選ぶべき瞬間は?
- 02
Recipe 1:編集後に自動フォーマット
PostToolUse で Edit/Write の直後に Biome / Prettier を走らせる。最も使われるパターン。
コードベースが常に綺麗な状態に保たれます。チームで共有すれば全員のコミットが整います。
json{ "hooks": { "PostToolUse": [ { "matcher": "Edit|Write", "command": "biome format --write ${FILE} 2>/dev/null || prettier --write ${FILE}" } ] } }.claude/settings.json 理解度チェック
Q1.PostToolUse の matcher に `Edit|Write` を指定する意味は?
- 03
Recipe 2:本番ファイルへの書込をブロック
PreToolUse で `infra/prod/**` や `.env` への書込を確実に止める。事故防止の必須レシピ。
deny ルールでも防げますが、Hook ならパスを正規表現で柔軟に判定でき、なぜ止めたかの理由を Claude にフィードバックできます。matcher で tool を絞り、path 判定はスクリプト側で行います。
json{ "hooks": { "PreToolUse": [ { "matcher": "Edit|Write", "command": "scripts/guard-prod.sh" } ] } }.claude/settings.json 理解度チェック
Q1.PreToolUse Hook で exit code `2` を返すと?
- 04
Recipe 3:Stop で完了通知
長時間タスクを任せて席を立つときの友。macOS なら osascript、Linux なら notify-send、Windows なら Slack 通知。
json{ "hooks": { "Stop": [ { "command": "osascript -e 'display notification \"Claude が応答を終えました\" with title \"Claude Code\" sound name \"Glass\"'" } ] } }macOS 用。他 OS は notify-send / curl で Slack Webhook 等に 理解度チェック
Q1.Stop hook が発火するタイミングは?
- 05
Recipe 4:SessionStart で開発情報を注入
セッション開始時に「現在のブランチ」「直近のテスト結果」「環境メモ」などを Claude に渡す。シークレットは渡さない。
SessionStart Hook は stdout に JSON を返し、`hookSpecificOutput.additionalContext` が会話冒頭に注入される。CLAUDE.md だけでは伝わらない動的情報(今日のブランチ・前回のテスト結果)を毎セッションで補える。
json{ "hooks": { "SessionStart": [ { "command": "scripts/session-context.sh" } ] } }session-context.sh は JSON を stdout に出力する 理解度チェック
Q1.SessionStart で会話冒頭に動的情報を注入する方法は?
- 06
Recipe 5:UserPromptSubmit で PII 検閲
ユーザーが Claude に送信する直前に、電話番号・メール・クレジット番号らしき文字列を検出して警告。
json{ "hooks": { "UserPromptSubmit": [ { "command": "scripts/pii-check.sh" } ] } }pii-check.sh が exit 2 を返せばプロンプト送信をブロック 理解度チェック
Q1.UserPromptSubmit Hook で PII を検出したときの正しいブロック方法は?
- 07
Recipe 6:PreCompact で観点を渡す
コンパクション直前に「これだけは必ず残して」という観点を Claude に注入。長期セッションでの記憶喪失を防ぐ。
PreCompact Hook も SessionStart 同様、stdout に JSON を返して `hookSpecificOutput.additionalContext` で要約観点を渡す。スクリプト側でプロジェクト状態を読んで動的に組み立てると効果が大きい。
json{ "hooks": { "PreCompact": [ { "command": "scripts/precompact-guide.sh" } ] } }precompact-guide.sh の出力例(stdout) 理解度チェック
Q1.PreCompact hook が解決する“長期セッションの困りごと”は?
- 08
Recipe 7:バックグラウンドでテスト並走
編集後にテストを走らせたいが、毎回 30 秒以上待ちたくないとき。Hook をバックグラウンド detach し、結果は次のセッション開始時に拾う設計が現実的。
Hooks 完全版(公式 docs)json{ "hooks": { "PostToolUse": [ { "matcher": "Edit", "command": "nohup pnpm test --silent > .claude/last-test.log 2>&1 & disown" } ] } }command の末尾 `& disown` で detach。Hook 自体は即時 return 理解度チェック
Q1.Hook をバックグラウンドで走らせるトレードオフは?


