フックと自動化
SessionStartフックを接続してコンテキストを自動ロードします。PreToolUseを使用して危険なコマンドをブロックします。承認ゲート付きでClaudeをcronで実行します。
フックは、Claude Codeが特定のライフサイクルイベントで実行するコマンドです。~/.claude/settings.jsonで一度設定すると、自動的に起動します。フックは、SessionStartごとにSTATE.mdをロードしたり、コミットする前にステージングされた.envファイルをチェックしたりするなど、忘れがちな規律を強制します。セットアップコストは10分です。その見返りは永続的です。
SessionStartはセッションが開いた瞬間に起動します。それがプリントするものは、最初のメッセージの前にコンテキストになります:
{
"hooks": {
"SessionStart": [
{
"command": "cat ~/notes/STATE.md ~/notes/MEMORY.md 2>/dev/null || true"
}
]
}
}|| trueが重要です: ファイルが見つからない場合でもセッション開始を中断しないでください。フックは50ms未満に保ち、セッション開始時にネットワーク呼び出しを行わないでください。最新のAPIデータが必要な場合は、ローカルファイルを書き込むcronを実行し、フックでそのファイルをロードします。
さらに4つのフックイベント:
Stop: セッション終了時に起動します。リマインダーに使用します: 「閉じる前に: このセッションの決定事項、進行中、ブロッカーでSTATE.mdを更新してください。」
PreToolUse: Claudeがツールを呼び出す前に起動します。セキュリティ強制層: 危険なコマンドをブロックし、監査証跡のために呼び出しをログに記録します。終了コード0は呼び出しを許可し、終了コード2はブロックします。
PostToolUse: ツールが戻った後に起動します。ファイル書き込み後にリンターを実行したり、SQLマイグレーション後にRLSポリシーをチェックしたりします。
UserPromptSubmit: Enterキーを押したときに起動します。外部コンテンツのコンテキストを注入したり、プロンプトインジェクション防御を適用したりします。
rm -rfを含むBash呼び出しをブロックするPreToolUseフック:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -q 'rm -rf'; then echo 'BLOCKED: rm -rf not allowed' >&2; exit 2; fi"
}
]
}
}matcherフィールドは特定のツールをターゲットにします。これがないと、フックはすべてのツール呼び出しで起動します。フックを高速かつターゲットに絞るためにマッチャーを使用してください。
フックが起動しない場合、次の順序で確認してください:
構文: 有効なJSONですか? cat ~/.claude/settings.json | python3 -m json.toolを実行してください。
ファイルパス: ターミナルでフックコマンドを手動でテストしてください。
終了コード: || trueがありませんか?
速度: 3秒を超えていますか? 遅い部分をcronに移動してください。
2つの本番環境での落とし穴。すべてのフックに明示的なtimeoutフィールドを設定して、動作が予測可能に保たれるようにしてください。そして、フックはフルシェルではなく、ストリップされた環境で実行されます: フックが環境変数(Slackトークンなど)を必要とする場合、フックコマンドで.envを明示的にソースしてください。これは、ターミナルでは機能するがClaude Codeではサイレントに失敗するフックの最も一般的な原因です。
Cron駆動のClaude Code。 同じエージェントがclaude --headlessを介してスケジュール実行できます: 午前7時の朝のブリーフィングをSlackに投稿したり、4時間ごとのソーシャルメディア監視、30分ごとのデプロイヘルスチェックなど。
重要なパターン: 承認ゲート。cronがドラフトを作成し、あなたがレビューし、システムが送信します。レビューなしでアウトバウンドメッセージを送信する自律エージェントは、最終的に間違ったものを送信します: 間違ったテンプレート、間違ったオーディエンス、間違ったタイミング。アーキテクチャ: エージェントが発見してドラフトを作成し、人間がレビューしてリリースする。 実装: エージェントはドラフトをSlackチャンネルに書き込みます。人間が承認するまで何もアウトバウンドされません。これは、どのエージェントも暴走することなく、数十のエージェントにスケールします。
フックシステムを段階的に構築します:
フェーズ1(1〜2週目)、ロードフック: SessionStartがSTATE.mdとMEMORY.mdをロードし、Stopが更新を促します。
フェーズ2(3〜4週目)、ガードフック: PreToolUseが不可逆的なコマンド(mainへの強制プッシュ、DROP TABLE、rm -rf)をハードブロックします。
フェーズ3(2ヶ月目以降)、監査フック: PostToolUseが実際に書き込まれたものをチェックします: RLSポリシーが欠落しているSQLマイグレーション、レート制限が欠落している新しいAPIルート、書き込まれたファイル内のシークレットなど。
PostToolUseは、監査のためにPreToolUseよりも強力です。なぜなら、Claudeが意図したものではなく、書き込まれたファイルの内容、つまり真実を読み取るからです。実際の失敗モードに基づいてフックを構築してください: 実際の問題を解決する2つのフックは、10の理論的なフックよりも優れています。
SessionStartはコンテキストをロードし、Stopはリマインダーを出し、PreToolUseは危険なコマンドをブロックし(終了コード2)、PostToolUseは書き込まれたものを監査し、cronと承認ゲートはClaudeを人間が送信ボタンを押すスケジュールシステムに変えます。SessionStartでcat ~/notes/STATE.md 2>/dev/null || trueという1つのフックから始めましょう。毎月次のフェーズを追加してください。