はじめてAIhajimete-ai🗞️ 無料購読
Tier 3

Hooks で「うっかり事故」を防ぐ — 私が実際に入れている 3 つの安全網

Claude Code は便利ですが、鵜呑みにして動かすと「うっかり消した」が起きます。Hooks という仕組みで、私が入れている実用的な 3 つの守り方を紹介します。

最終更新: 2026-04-23Hooks安全応用

結論(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 特集の他の記事
🗞️ 毎週月曜、やさしいAIニュース

速報じゃなくて「翻訳」します。難しいニュースを、ワーママの私がやさしく噛み砕いて、月曜朝にお届け。

無料・いつでも解除できます