05 フック — イベント駆動の自動実行
フックとは
フックは 特定のイベント発生時に自動実行されるシェルスクリプト。Claude Codeの動作を拡張・制御する。
ユーザーがツールを実行
│
▼
PreToolUse フックが発火 ──→ チェックOK → ツール実行
│ └─ チェックNG → ブロック
▼
ツールが実行される
│
▼
PostToolUse フックが発火 ──→ ログ記録・後処理
主要4種のフック
SessionStart
セッション開始時に実行。
| 項目 | 説明 |
|---|---|
| タイミング | Claude Code起動時 |
| 用途 | 環境変数の読み込み、初期化処理、設定の検証、ハンドオフ読込 |
| 備考 | なし |
PreToolUse
ツール実行前に実行。最も重要なフック。
| 項目 | 説明 |
|---|---|
| タイミング | 各ツール(Read, Edit, Bash等)の実行前 |
| 用途 | セキュリティチェック、危険コマンドのブロック、入力検証 |
| 備考 | なし |
| ブロック可能 | Yes — スクリプトがエラーを返すとツール実行がキャンセルされる |
💡 ※2026-07-02統合撤去: 2026-06-30に追加していた minimax系MCPブロック(matcher mcp__minimax-(official|video)__.*・exit 2)は、32MB真因=glm-rate-proxy client_max_size 未設定と判明(9ac5f24fd解決)したため PreToolUse hook を削除し撤去。minimax-official/video は日常セッションで即呼び可能。
現場の知見: フックのスクリプトがエラー(exit code ≠ 0)を返すと、ツールの実行がサイレントにブロックされる。意図せぬブロックに注意。→ 11_現場の知見
クロスプラットフォーム対応: フックスクリプトで python3 を直接呼ぶとWindows Git Bashで動作しない。run-security-check.sh ラッパーが python3 / python / wsl を自動検出する。Bashフックは純bash(grep/sed)でJSON解析しpython3に依存しない。
ブロックされるコマンドの例:
bash -x(デバッグ出力でシークレット露出の恐れ)cat -A(特殊文字表示でシークレット露出の恐れ)- マスクなしの
grep(APIキーを含むファイルの検索) - フィルタなしの
env(全環境変数の表示)
PostToolUse
ツール実行後に実行。
| 項目 | 説明 |
|---|---|
| タイミング | 各ツールの実行後 |
| 用途 | ログ記録、実行結果の後処理、設定の自動同期、通知 |
| 備考 | なし |
Stop
セッション終了時に実行。
| 項目 | 説明 |
|---|---|
| タイミング | Claude Code終了時 |
| 用途 | クリーンアップ、ログ保存、ハンドオフ情報の書き出し |
| 備考 | なし |
Notification / PostToolUseFailure
エラー・ブロック時(Notification)、ツール失敗時(PostToolUseFailure)に実行。Discord通知等の異常系ハンドリングに使用。
設定方法
フックは settings.json の hooks セクションに定義する。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "python3 ~/.claude/scripts/security/check-command-safety.py"
}
]
}
],
"SessionStart": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "source ~/.secrets.env"
}
]
}
],
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "~/.claude/scripts/session/save-session-log.sh",
"timeout": 5000
},
{
"type": "command",
"command": "~/.claude/scripts/session/generate-handoff.sh",
"timeout": 3000
},
{
"type": "command",
"command": "~/.claude/scripts/session/queue-guide-updates.sh",
"timeout": 5000
}
]
}
]
}
}
matcherについて
matcherはツール名を指定(例:"Bash","Edit","Read")- 空文字
""は全ツールにマッチ - 複数のフックを設定可能(配列で定義)
現在のフック構成(実態)
| フック | スクリプト | 役割 |
|---|---|---|
| SessionStart | ||
check-cwd.sh |
作業ディレクトリチェック | |
check-version.sh |
バージョン確認・新機能検知 | |
load-handoff.sh |
最新5件ハンドオフ自動読込(履歴空ならstate fallback) | |
load-obsidian-log.sh |
SSOT日記読み込み(今日・昨日のセッションログ+バックログ+7日以上経過タスクの自動確認プロンプト・セッション数カウント付きサマリー) | |
start-clipboard-watcher.sh |
クリップボード監視起動 | |
load-secrets.sh |
APIキー注入 | |
sync-secrets-to-settings.sh |
シークレットをsettings.jsonに同期 | |
check-secrets-leak.sh |
シークレット漏洩チェック | |
check-decision-indexes.sh |
_INDEX.md同期チェック | |
check-submodule-sync.sh |
サブモジュール同期チェック | |
auto-update-indexes.sh |
_INDEX.md自動更新 | |
auto-fix-links.sh |
Markdownリンク自動修正 | |
check-mcp-guide-sync.sh |
MCPガイドとの差分検知 | |
check-knowledge-lint.sh |
Knowledge Lint cron設定確認 | |
check-claude-config-sync.sh |
claude-configリポジトリ同期チェック | |
check-proxy-compat.sh |
CC版変化時にプロキシ互換性(GLM応答のtool_use)を自動検証・同版かつ前回okは省略・警告のみでブロックしない(2026-07-09 追加) | |
sync-settings-to-example.sh |
settings.jsonのサンプル同期 | |
skill-guard.sh |
スキル定義の整合性ガード | |
check-ssot-sync-staleness.sh |
SSOT整合性の日次自動発動(state日付≠今日で /ssot-sync auto をプロンプト注入・1日1回・REPL idle依存なし) |
|
generate-skill-catalog.py |
SKILL_CATALOG.md自動生成(自作Skills+Plugin+MCP・廃止旧sync-claude-md.sh代替) | |
| PreToolUse | ||
check-command-safety.py |
危険コマンドのブロック(APIキー漏洩防止等) | |
guard-destructive-commands.sh |
破壊的コマンドのガード(python3不要・純bash動作) | |
| PostToolUse | ||
track-tool-usage.sh |
ツール使用ログ記録 | |
detect-commit-for-ssot.sh |
git commitでSSOT記録トリガー検知 | |
post-tool-settings-sync.sh |
settings.json変更後のSSOT設定ファイルへの同期 | |
mirror-to-custom.sh |
スキル変更をskills-customへmirror | |
| PostToolUseFailure | ||
| (atuin) | シェル履歴統合 | |
| Stop | ||
save-session-log.sh |
SSOT日記にセッション終了タイムスタンプ記録 | |
generate-handoff.sh |
ハンドオフ情報の書き出し | |
queue-guide-updates.sh |
claude-code-guideの更新キュー記録 | |
sync-skills-windows.sh |
Windows側のskillsをWSL側に同期 | |
notify-done.sh |
完了通知(Discord) | |
next-issue.py |
自律開発ループの継続判定 | |
claude-config-sync.sh |
~/.claude/ → knowledge-base + claude-config へ自動同期 |
|
| Notification | ||
notify-discord-on-error.sh |
エラー・ブロック時にDiscord通知 |
SessionStartは20コマンド構成。初期化・セキュリティ・SSOT同期・設定チェック・日次自動発動の5カテゴリに分類される。PreToolUseの check-command-safety.py は run-security-check.sh ラッパー経由でクロスプラットフォーム対応。
state日付管理による日次自動発動パターン(再利用可能)
check-ssot-sync-staleness.sh が実装する「stateファイルの日付で1日1回を制御」する汎用パターン。CronCreateは REPL idle時しか発火しないが、SessionStart hookはセッション開始で確実に走るため、この組合せで「忘れない」を担保する。
STATE="$HOME/.claude/state/<task>-last-run"
TODAY=$(date +%Y-%m-%d)
LAST=$(cat "$STATE" 2>/dev/null)
if [ "$LAST" != "$TODAY" ]; then
# stdout がプロンプトとして注入される → CCが自律実行
echo "[<task> 日次実行トリガー] ...を実行してください"
fi
実行側スキルは完了後 date +%Y-%m-%d > "$STATE" で再発火を抑制する。
自律タスクループ(Stop Hook 応用)
概要
GitHub Issue を順番に自動実装するイベント駆動ループ。
CronCreate が時間トリガーのみなのに対し、Stop Hook を使うことで「前のタスク完了後に次を起動」が実現できる。
ファイル構成
~/.claude/scripts/auto-dev/
├── state.json # キュー状態(永続)
├── start.sh # 手動起動エントリポイント
├── next-issue.py # Stop Hook 本体
└── loop.log # 実行ログ(自動生成)
使い方
# WSL で実行(Issue #76 → #75 の順で自律実行)
bash ~/.claude/scripts/auto-dev/start.sh 76 75
# 状態確認
cat ~/.claude/scripts/auto-dev/state.json
# ログ確認
tail -f ~/.claude/scripts/auto-dev/loop.log
緊急停止
python3 -c "
import json
p='/home/<USER>/.claude/scripts/auto-dev/state.json'
s=json.load(open(p))
s['active']=False
json.dump(s,open(p,'w'),indent=2)
print('停止しました')
"
誤爆防止
state.active == falseの時はnext-issue.pyが即exit(0)— 通常の会話終了では何も起きないexcept節で必ずexit(0)— Stop Hook がセッション終了をブロックすることはない
動作フロー
start.sh 76 75
→ state.json: active=true / pending=[76,75]
→ claude --print "Issue #76 を実装して..."
→ [セッション終了]
→ Stop Hook → next-issue.py
→ completed=[76] / pending=[75]
→ claude --print "Issue #75 を実装して..."
→ [セッション終了]
→ Stop Hook → next-issue.py
→ completed=[76,75] / pending=[] → active=false → 完了
詳細: [[../../01_DECISIONS/claude-code/2026-05-30_自律タスクループ実装.md]]
デバッグ方法
フックが期待通りに動かない場合:
- フックのログを確認 — エラーメッセージが表示される
- 手動でスクリプトを実行 — ターミナルで直接実行して動作確認
/configで設定確認 — hooks セクションの内容を確認- 一時的に無効化 — settings.json で該当フックをコメントアウト
💡 やさしい補足(初心者向け)
- 「フック」= 特定のタイミングで自動で動く番人: 「作業開始時」「命令実行前」「終了時」などに、自動で決まった処理を走らせる仕組み
- 代表例: 危険な命令を止める(セキュリティ)・操作を記録する(ログ)・終了時にメモを残す
- 設定ファイルで管理: 何をいつ動かすかは設定ファイルに書く。小さなプログラム(スクリプト)を組み合わせる
- 地味だけど強力: 手動で毎回やる作業をフックに任せると、ミスが減って楽になる