結論:hooksは「Claude Codeのif-then自動化」だ
先に結論から書きます。
Claude Codeのhooks機能を使えば、「コードを修正したら自動でテストを実行」「会話を終了したら自動でgitコミット」「特定のファイルを読んだらSlackに通知」といった自動化が、コードを1行も書かずに実現できます。
私はこの機能を使い始めてから、開発セッション後の「後片付け作業」(git add → commit → push → ログ記録)が完全に消えました。Claude Codeが作業を終了するたびに自動で実行されるからです。
hooks機能を知らずにClaude Codeを使っているなら、確実にもったいない使い方をしています。
hooksの設定方法:settings.jsonの書き方
設定ファイルの場所
Claude Codeのhooksは ~/.claude/settings.json(グローバル設定)または プロジェクトルートの .claude/settings.json(プロジェクト別設定)に記述します。
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "echo 'Claude stopped' >> ~/claude_log.txt"
}
]
}
]
}
}
matcher の使い方
matcher フィールドで、どのツール呼び出しに反応するかを絞り込めます。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit",
"hooks": [
{
"type": "command",
"command": "cd $CLAUDE_PROJECT_DIR && npm test 2>&1 | tail -20"
}
]
}
]
}
}
上記の例では、Editツール(ファイル編集)が完了するたびに npm test が自動実行されます。テストが失敗したらClaudeはそのエラー出力を次の会話に持ち込み、自動で修正を試みます。
実践例1:Stop hookで自動gitコミット
最もよく使われるhooksのパターンです。Claude Codeが作業を終了するたびに変更内容を自動でgitに記録します。
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "cd $CLAUDE_PROJECT_DIR && git add -A && git diff --cached --quiet || git commit -m 'Claude Code auto-commit: '$(date '+%Y-%m-%d %H:%M')"
}
]
}
]
}
}
ポイント: git diff --cached --quiet || の部分で「変更がないときはコミットしない」という条件分岐を入れています。変更のないときにも空コミットが積み重なる問題を防げます。
環境変数 $CLAUDE_PROJECT_DIR
hooksの中では $CLAUDE_PROJECT_DIR という環境変数が使えます。これはClaude Codeが現在作業しているプロジェクトのルートディレクトリを指します。
cd $CLAUDE_PROJECT_DIR を先頭に入れておくことで、どのプロジェクトで作業していても正しいディレクトリでコマンドが実行されます。
実践例2:PostToolUse hookでファイル編集後に自動テスト
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "cd $CLAUDE_PROJECT_DIR && python -m pytest tests/ -x -q 2>&1 | tail -30"
}
]
}
]
}
}
matcher に Edit|Write を指定すると、ファイルの編集または新規作成のどちらでも反応します。
-x オプションで最初の失敗でテストを止め、-q で出力を簡潔にしています。Claude Codeはこの出力を見て、テストが失敗していれば自動で修正しようとします。
実践例3:Stop hookで作業サマリーをファイルに保存
毎日の作業記録を自動で残したい場合。
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "echo '## '$(date '+%Y-%m-%d %H:%M')' - Claude Code作業終了\\nプロジェクト: '$CLAUDE_PROJECT_DIR'\\n---' >> ~/claude_work_log.md"
}
]
}
]
}
}
実践例4:PreToolUse hookで危険なコマンドをブロック
rm -rf や本番DBへの接続など、特定の操作を実行前に止めたい場合。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "echo $CLAUDE_TOOL_INPUT | grep -q 'rm -rf' && echo 'BLOCKED: rm -rf is not allowed' && exit 1 || exit 0"
}
]
}
]
}
}
hooksコマンドが exit 1 を返すと、Claude Codeはそのツール呼び出しをブロックします。安全装置として使えます。
hooksを使う際の3つの注意点
1. 無限ループに注意
PostToolUse hookで「ファイル編集後にファイルを書き換えるコマンド」を実行すると、再びPostToolUseが発火して無限ループになることがあります。
matcher を絞り込んで、副作用が連鎖しない設計にしてください。
2. 出力は30行以内に抑える
hooksコマンドの出力が長すぎると、Claude Codeのコンテキストを圧迫します。tail -20 や head -20 で出力を絞るのが基本です。
3. Windows環境ではPowerShellを使う
Windows環境(Windows 11など)でClaude Codeを使う場合、command フィールドにはPowerShellコマンドを記述します。
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "powershell -Command \"Add-Content -Path $HOME/claude_log.txt -Value ('Stop: ' + (Get-Date))\""
}
]
}
]
}
}
よくある質問
Q: hooksはどのプロジェクトにも共通で適用されますか?
~/.claude/settings.json(ホームディレクトリの .claude フォルダ)に書いた設定はすべてのプロジェクトに適用されます。特定プロジェクトだけに適用したい場合は、そのプロジェクトルートの .claude/settings.json に書いてください。プロジェクト設定が優先されます。
Q: hooksのデバッグ方法は?
hooksが期待通りに動いていない場合、コマンドの出力をファイルにリダイレクトして確認するのが手っ取り早いです。
"command": "echo 'hook fired' >> /tmp/hook_debug.log && <実際のコマンド>"
Q: 複数のhooksを同じイベントに設定できますか?
できます。同じイベント(例: Stop)に複数のhooks配列エントリを追加すると、上から順に実行されます。
まとめ:hooksで「後処理」を消す
Claude Code hooksの本質は「人間が覚えておく必要のある作業を自動化すること」です。
- テストの実行忘れ → PostToolUse hookで自動実行
- gitコミット忘れ → Stop hookで自動コミット
- 作業ログの記録忘れ → Stop hookで自動追記
最初に設定するのは少し手間ですが、一度設定してしまえば以降は何もしなくていい。これがhooksの最大のメリットです。
Claude Codeをすでに使っているなら、まずStop hookにgit自動コミットを仕込むところから始めてみてください。
関連ツールを見る
この記事で紹介したツール・サービスをまとめてチェック。
![]()