Hooks で「うっかり事故」を防ぐ — 私が実際に入れている 3 つの安全網
Claude Code は便利ですが、鵜呑みにして動かすと「うっかり消した」が起きます。Hooks という仕組みで、私が入れている実用的な 3 つの守り方を紹介します。
結論(2 行で)
- Hooks は「ツールが動く前後に、自前のチェックを挟む」仕組みです。
- 非エンジニアでも、3 行のシェルで書ける安全網 を 3 つ入れておくと、事故が 9 割減ります。
このページで扱うこと
- Hooks の 3 行での説明
- 入れておくと安心な 3 つの Hook
- 書き方(設定ファイル 1 箇所だけ)
- 実際に私が助かったケース
Hooks の 3 行での説明
- PreToolUse: ツールが動く「前」に、自前チェックを挟む
- PostToolUse: ツールが動いた「後」に、通知や記録をする
- Stop: Claude Code が答え終わったときに、まとめ処理をする
「動く前に 1 回止まって」「動いたあと 1 行記録して」、くらいの軽い使い方で十分です。
入れておくと安心な 3 つの Hook
① rm 系コマンドを止める(PreToolUse)
CC-08 で書いた「原則 rm しない」は、CLAUDE.md だけだと 破られることがある んです。
Hook で ツール実行前に止める と、確実です。
PreToolUse:
- matcher: "Bash"
command: |
if echo "$CLAUDE_TOOL_INPUT" | grep -qE "^rm -rf|^rm -r"; then
echo "BLOCKED: rm -rf の実行は禁止されています。_archive_ に移動してください"
exit 2
fi
exit 2 で実行が止まります。「移動して」と言い直せば OK。
② 重要ファイルの編集を確認する(PreToolUse)
CLAUDE.md や .env や家計簿 CSV のような、消したら困るファイル を触るときだけ、画面に警告を出します。
PreToolUse:
- matcher: "Edit|Write"
command: |
file=$(echo "$CLAUDE_TOOL_INPUT" | jq -r '.file_path')
if echo "$file" | grep -qE "CLAUDE\.md|\.env|household/.*\.csv"; then
echo "⚠️ 重要ファイルを編集します: $file"
fi
exit 0 のままなら、通過しつつ画面に警告が出る状態。
③ 作業終わりに Desktop 通知(Stop)
これは地味にすごく便利。Claude Code が 長い作業を終えた瞬間 に Desktop 通知が出ます。
Windows の場合:
Stop:
- command: |
powershell -Command "New-BurntToastNotification -Text '✅ Claude Code 作業完了'"
Mac の場合:
Stop:
- command: |
osascript -e 'display notification "作業完了 🌸" with title "Claude Code"'
コーヒーを淹れに行って戻ってきたら「あ、もう終わってる」のタイミングが分かるので、待ち時間のストレスが消えます。
書き方(設定ファイル 1 箇所だけ)
場所は ~/.claude/settings.json(全プロジェクト共通)または <プロジェクト>/.claude/settings.local.json(そのプロジェクト専用)。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -qE \"^rm -rf\"; then echo 'BLOCKED: rm -rf は禁止'; exit 2; fi"
}
]
}
],
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "powershell -Command \"New-BurntToastNotification -Text '✅ Claude Code 完了'\""
}
]
}
]
}
}
ファイルを保存したら claude を再起動 する必要があります。
実際に私が助かったケース
ケース 1: スクリプト修正中に rm -rf node_modules を提案された
Claude Code が「クリーンにしたいので node_modules を消しましょう」と言い出しました。 普段なら「はい」と押していましたが、Hook が BLOCKED で止めてくれた。
node_modules は消しても OK ですが、このときは 裏で別のビルドが走っていた ので、消していたらビルドが死んでいました。
ケース 2: CLAUDE.md を上書きされそうになった
「CLAUDE.md を整理しましょう」と提案されたとき、Hook の ② で 画面に警告が出た。 ここで「まず diff を見せて」と私が止められました。もし通していたら、育てて 3 ヶ月の CLAUDE.md が白紙 になっていました。
ケース 3: 長い処理の通知で、家事と両立できた
画像 30 枚のリサイズ作業を Claude Code に任せて、洗濯物を干している間に Desktop 通知が鳴った。 「待つ」時間が減ったのが、実は一番大きい効果です🌸
詰まったポイント
- Hook が動かない:
claude再起動を忘れがち。~/.claude/settings.jsonは起動時にだけ読まれます - エスケープがしんどい: JSON の中にシェルを書くので
\"が辛いです。長いスクリプトは別ファイルにしてcommandではそれを呼ぶ形が楽 - matcher の書き方:
Bash/Edit/Write/Readなどのツール名。正規表現も OK(Edit|Write)
次に読むとよい記事
この記事は、以下の方々の素晴らしい発信から学ばせていただきました。
- Claude Code Hooks 入門— minorun365
ターミナルを見ただけで閉じたくなっていたワーママが、Claude Code を自分の手足にするまでの最初の一歩。
「ChatGPT で十分じゃないの?」によく聞かれるので、両方を 3 ヶ月ずつ本気で使って出た答えをまとめました。結論は「役割がぜんぜん違う」でした。
「プログラマー向けの道具でしょ?」と思って半年スルーしていた私が、ある一言で考えを変えた話。ワーママの毎日が、Claude Code でどう変わったか。
速報じゃなくて「翻訳」します。難しいニュースを、ワーママの私がやさしく噛み砕いて、月曜朝にお届け。