Claude Code のフックで自動チェック|通知・守りたいファイルを止める

コース3 設定編 5 / 8・読む時間 約10分・最終確認日

このレッスンの要点

  • フックは、決まったタイミングで必ず動く自分のコマンド。Claude が忘れても、毎回実行されます
  • 書く場所は settings.json の hooks。「いつ(イベント)」「どの道具のとき(matcher)」「何をする(command)」の3段で書きます
  • フックは、あなたのパソコンの上でそのままコマンドを動かします。中身を読んで、試してから使います

フックとは

は、Claude Code の決まったタイミングで、必ず動く自分のです。CLAUDE.md の指示は Claude が忘れることもありますが、フックは Claude が選ぶかどうかに関係なく、そのときが来るたびに実行されます。

イベント動くとき
SessionStartセッションが始まったとき・再開したとき
UserPromptSubmitお願いを送って、Claude が読む前
PreToolUse道具(ファイルの編集やコマンド)を使う前。ここで止められる
PostToolUse道具を使ったあと(もう実行済みなので、取り消しはできない)
NotificationClaude Code がお知らせを出すとき(入力待ちなど)
StopClaude が返事を終えたとき
よく使うイベント。ほかにもたくさんあります。

書き方の3段

フックは settings.json の hooks に書きます。「いつ(イベント)」→「どの道具のとき(matcher)」→「何をする(command)」の3段です。matcher に "Edit|Write" と書けば、ファイルの編集と書きこみのときだけ動きます。空の "" なら、いつでも動きます。

いつNotification(お知らせのとき)
どの道具のとき"" = いつでも
何をするMac の通知を出す
下の「やってみよう」の1つ目の例を、3段に分けるとこうなります。

全部のプロジェクトで使うならユーザー設定(~/.claude/settings.json)、チームで使うなら .claude/settings.json に書きます。すでに hooks があるときは、全体を置きかえずに、その中に足します。自分で書かなくても、したいことを説明して Claude にフックを書いてもらえます。

守りたいファイルの編集を止める

PreToolUse のフックは、道具を使う前に動き、2 で終わると、その操作を止められます。そのときエラーの出力に書いた理由が、Claude に伝わります。

Claude Code
.env にコメントを1行足して
PreToolUse のフック → protect-files.sh が動く
Blocked: .env matches protected pattern '.env'
.env は守られたファイルなので、編集できませんでした。
.env・package-lock.json・.git/ への編集を止める、公式の例です。

使うには、スクリプトを .claude/hooks/protect-files.sh に保存して、chmod +x .claude/hooks/protect-files.sh で動かせるようにし、.claude/settings.json に登録します(3つとも下の「やってみよう」にあります)。スクリプトは jq というコマンドを使うので、入っていなければ先に入れます(Mac なら brew install jq)。

確かめる・安全に使う

/hooks と打つと、設定されているフックと、どの設定ファイルから来ているかが見られます(見るだけの画面です)。フックが出てこないときは、JSON に最後のカンマやメモが入っていないか、置き場所が合っているかを見ます。全部のフックを一度止めたいときは、"disableAllHooks": true を設定します。

こうする
・足す前に、コマンドの中身を読む
・ターミナルで一度試してから登録する
・matcher はしぼる
気をつける
・人からもらったフックを、読まずに入れる
・リポジトリに入っているフックを、確かめずに動かす
フックは、あなたのパソコンの上でそのままコマンドを動かします。書き方しだいでは、ファイルを消すこともできてしまいます。
よくある勘違い

「CLAUDE.md に『毎回〜して』と書けば、必ずやってくれる」わけではありません

毎回の作業を CLAUDE.md に書いて任せる
CLAUDE.md は読まれる指示で、守られないこともあります
必ず実行したいことはフックにする
フックは、Claude が選ぶかどうかに関係なく、そのタイミングが来るたびに動きます

やってみよう

  1. Mac なら、下の依頼文で「入力待ちを知らせる通知」(その下の JSON と同じもの)を、ユーザー設定(~/.claude/settings.json)に足してもらいます(Windows・Linux 用のコマンドも公式ドキュメントにあります。「Windows 用の通知のフックを作って」のように頼めます)
  2. claude を起動して /hooks と打ち、Notification の下に入っているか確かめます
  3. Shift + Tab で「⏸ manual mode on」にして、確認が必要な作業を頼み、別のウィンドウに切りかえて通知が出るか待ちます
  4. 通知が出ないときは、ターミナルで osascript -e 'display notification "test"' を一度打ってから、Mac の「システム設定 > 通知」で Script Editor の通知を許可します
通知のフックを足してもらう依頼文(Mac)ユーザー設定(~/.claude/settings.json)に、Claude Code が入力を待っているときに Mac の通知を出す Notification のフックを、公式ドキュメントの osascript の例で足して。すでにある hooks や設定は消さないで、足したあとの中身を見せて
入力待ちを知らせる通知(Mac。~/.claude/settings.json){ "hooks": { "Notification": [ { "matcher": "", "hooks": [ { "type": "command", "command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'" } ] } ] } }
守りたいファイルの編集を止めるスクリプト(.claude/hooks/protect-files.sh。jq が必要)#!/bin/bash # protect-files.sh INPUT=$(cat) FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty') # Normalize Windows backslash separators so the patterns below match FILE_PATH="${FILE_PATH//\\//}" PROTECTED_PATTERNS=(".env" "package-lock.json" ".git/") for pattern in "${PROTECTED_PATTERNS[@]}"; do if [[ "$FILE_PATH" == *"$pattern"* ]]; then echo "Blocked: $FILE_PATH matches protected pattern '$pattern'" >&2 exit 2 fi done exit 0
そのスクリプトを登録する設定(.claude/settings.json){ "hooks": { "PreToolUse": [ { "matcher": "Edit|Write", "hooks": [ { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-files.sh" } ] } ] } }

確認問題

Q1. PreToolUse のフックが「exit 2」で終わりました。どうなる?
Q2. /hooks でできることは?
今日の練習

普段、Claude に毎回お願いしている「作業のあとの決まりごと」を1つ書き出してみましょう。それがフックにする候補です。

この記事の用語

コース3 設定編の目次

  1. 1設定ファイル(settings.json)の基本
  2. 2許可ルールを決めて確認を減らす
  3. 3CLAUDE.md の育て方
  4. 4自分用のコマンド・スキルを作る
  5. 5フックで自動チェック
  6. 6MCP で外部サービスとつなぐ
  7. 7サブエージェントの使い分け
  8. 8Git と GitHub で変更を守る