Claude Codeを使い始めて1週間で、作りかけのファイルをAIに消された。
リファクタリングを頼んだだけなのに、Claudeは「不要なファイルを整理しよう」と判断して、いくつかのファイルをまとめて削除した。Gitにcommitしていない変更も含めて。
GitHubにはもっと深刻な事例がある。C:\Usersフォルダが全部消されたという報告。Claude Codeは便利だが、「何でもできる」ということは「何でも壊せる」ということでもある。
この事故の後、「hookを入れなきゃ」と思った。hookというのは、AIが何かをやろうとした瞬間に「ちょっと待て」と割り込んで止める仕組みだ。
最初のhookを書いてみる
hookは実はすごくシンプルだ。たった7行のスクリプトで書ける。
やることは1つ。AIがrm -rf /(ファイルを全部消すコマンド)を実行しようとしたら、ブロックする。
まず、jq(JSONを処理するコマンド)が必要。入っていなければ先にインストールする:
# macOS
brew install jq
# Ubuntu/Debian
sudo apt install jq
次に、hookを保存する場所を作る:
mkdir -p ~/.claude/hooks
次に、スクリプトを書く:
cat > ~/.claude/hooks/my-first-hook.sh << 'EOF'
#!/bin/bash
COMMAND=$(cat | jq -r '.tool_input.command // empty' 2>/dev/null)
if echo "$COMMAND" | grep -qE 'rm\s+-rf\s+/'; then
echo "BLOCKED: rm -rf on root" >&2
exit 2
fi
exit 0
EOF
chmod +x ~/.claude/hooks/my-first-hook.sh
7行。何をやっているか:
-
cat— Claude Codeが「これからこのコマンドを実行するよ」と送ってくるデータを受け取る -
jq— そのデータからコマンドの部分だけを取り出す -
grep—rm -rf /というパターンが含まれているか調べる -
exit 2— 含まれていたらブロック。Claude Codeは「exit 2」を受け取ると、そのコマンドを実行しない
exit 0は「問題なし、実行していいよ」という意味。
登録する
スクリプトを書いただけでは動かない。Claude Codeに「このスクリプトを使って」と教える必要がある。
~/.claude/settings.jsonに以下を追加する:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "~/.claude/hooks/my-first-hook.sh"
}
]
}
]
}
}
PreToolUseは「ツールを使う前に」という意味。matcher: "Bash"は「Bashコマンドの実行前に」という意味。つまり「AIがBashコマンドを実行する前に、毎回このスクリプトを走らせて」という設定。
Claude Codeを再起動すれば、hookが有効になる。
動くか確かめる
本当にrm -rf /を実行して確かめるわけにはいかないので、シミュレーションで確認する:
# 危険なコマンドがブロックされるか
echo '{"tool_input":{"command":"rm -rf /"}}' | bash ~/.claude/hooks/my-first-hook.sh
echo $? # 2が出れば成功(ブロックされた)
# 安全なコマンドは通るか
echo '{"tool_input":{"command":"ls -la"}}' | bash ~/.claude/hooks/my-first-hook.sh
echo $? # 0が出れば成功(許可された)
テストコマンドはbashで明示的に実行しているのでchmod +xがなくても動く。だが後述のsettings.jsonではbashプレフィックスなしでパスだけを指定している。Claude Codeがhookを直接実行する場合、実行権限がないとフックが無視される。chmod +xは忘れずにつけておくこと。
macOSユーザーへ: Claude Codeはhookを制限されたPATHで実行する(#46954)。Homebrewでインストールしたjq(/opt/homebrew/bin/jq)がhookから見つからず、hookが何もせずに終了することがある。hookの先頭に export PATH="/opt/homebrew/bin:$PATH" を追加するか、絶対パス /opt/homebrew/bin/jq を使うと確実。
手動で書かなくてもいい
ここまで読んで「面倒だな」と思った人は、cc-safe-setupを使えば全部自動でやってくれる。
# 8個の安全hookを一発でインストール
npx cc-safe-setup
# 自然言語でhookを作る(JSONもスクリプトも書かなくていい)
npx cc-safe-setup --guard "データベースを消すな"
ただ、仕組みを知っておくと、自分で好きなhookを作れるようになる。「AIに○○をさせたくない」というルールを自分で追加できる。
hookの種類
hookには複数のタイミングがある。よく使うのはこの4つ:
| タイミング | いつ動く | 例 |
|---|---|---|
| PreToolUse | AIがコマンドを実行する前 | 「rm -rfを止める」「mainへのpushを止める」 |
| PostToolUse | AIがコマンドを実行した後 | 「構文エラーがないかチェック」 |
| Notification | AIが通知を送るとき | 「通知内容をログに記録」 |
| Stop | セッションが終わるとき | 「作業ログを保存」 |
他にもSessionStart(セッション開始時)、UserPromptSubmit(ユーザー入力時)などがある。最初はPreToolUseだけ覚えればいい。「AIが何かをする前に、止めるかどうかを判断する」——これがhookの基本。
「どのhookを入れればいいかわからない」なら、Hook Selectorで5つの質問に答えるだけで最適なhookセットが分かる。
hookの設計パターンや自律セッション運用の実践例はAnthropic公式ガイドにない事故防止——800+時間で19点→85点にした全記録(¥800・第3章まで無料)にまとめている。655個のhookを作るまでの800時間の全記録はAIに仕事を任せてみた(¥800・第2章まで無料)。
📖 トークン消費に困っているなら → Claude Codeのトークン消費を半分にする——800時間の運用データから見つけた実践テクニック(¥2,500・はじめに+第1章 無料)
関連記事: Claude Codeのトークン消費を減らす5つの方法——Opus 4.7対応
⚠️ CVE-2026-21852(2026年4月公開): プロジェクト内.claude/settings.json経由でAPIキー窃盗。対策: npx cc-safe-setup(ユーザーレベル設定で免疫)→ 詳細
⚠️ Opus 4.7緊急情報(2026年4月17日)
Opus 4.7のauto mode安全分類器がOpus 4.6にハードコードされている問題が発覚。3日間で23件以上のデータ損失。さらにv2.1.100以降、APIコールごとに約20,000トークンが見えない場所で追加課金されている問題も判明(#46917、GitHub上196件のリアクション)(50GB永久消失含む)。4倍のトークン消費も報告されている。対策: npx cc-safe-setup --opus47(Survival Guide / Safety Scanner)
関連の素材
5月22日に新刊の事例集 Claude Code Claim-Verify Handbook ($19、 約89頁、 約113,000字) を発売します。 道具が「成功した」 「比較した」 「設定された」 と主張する一方で実態が乖離していた事例を GitHubの起票の集まりから130件 (本文15件+付録D 115件) 整理した本で、 14件の防衛の手順と5件の自動の点検の道具と一緒に提供しています。 試し読みのGist (約16,000字、 章1の全件) は こちら。
予防 hook の集まりは cc-safe-setup (MIT、 745件以上の hook、 30,000件以上のインストール)。 月額の継続の媒体 CC Safety Lab (¥500/月、 Ko-fi) は毎月の事故の整理を配信。