1. Hookの基本
概要
Hookとは、Claude Codeのライフサイクル中の特定イベント(例:PreToolUse)において実行される、ユーザー定義のシェルコマンドです。
これにより、LLMによる“選択的な処理”ではなく、確実に処理される“決定論的な制御”が可能になります。
ユースケース例
Claudeが入力待ちになる際に、カスタム通知を送る
ファイル編集後に自動でprettierやgofmtを実行
すべてのシェルコマンドをログに記録
Claudeの出力がチームのコーディング規約に反する場合、自動でフィードバック
本番環境や機密ディレクトリの書き込み操作を防止
Promptではなく、Hookに制約を記述することで、毎回確実に動作する“アプリケーションレベルのルール”が構築できます。
注意点
Hookは、確認なしにあなたのユーザー権限でシェルを実行します。セキュリティを十分考慮してください。
2. Hookの設定方法(クイックスタート)
以下は、Claudeが実行するすべてのシェルコマンドをログに記録する例です。
前提
jqコマンドが必要です(JSON処理のため)。
手順
/hooksコマンドを実行 →PreToolUseイベントを選択Matcherを追加 →
Bashと入力Hookを追加:
jq -r '"\(.tool_input.command) - \(.tool_input.description // \"No description\")"' >> ~/.claude/bash-command-log.txt保存場所:
User settingsを選択(全プロジェクトに適用)動作確認:
/hooksで登録を確認
登録された設定の例:
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "jq -r '\"\\(.tool_input.command) - \\(.tool_input.description // \"No description\")\"' >> ~/.claude/bash-command-log.txt"
}
]
}
]
}3. Hookの仕組みと詳細仕様
PreToolUse,PostToolUse,Notification,Stopの4種類のイベントに対応入力はJSON形式でstdinから受け取り、出力もJSONまたはExit Codeで返す
フックの構成は
matcher+hooksの組み合わせ
例(matcher):
Write:Writeツールのみに一致Edit|Write:複数のツールに一致(正規表現)mcp__github__.*:MCP(モデルコンテキストプロトコル)ツールに対応
出力方式:
Exit Code:
0:成功、stdoutが表示される2:ブロック、stderrがClaudeに送られ制御される
JSON形式:
{
"decision": "block",
"reason": "機密情報の書き込みは禁止されています"
}4. 応用例:コードガード、CI/CD、自動フォーマット
機密情報スキャン(PreToolUse)
マッチャ:
Write|Edit|MultiEditアクション:正規表現やgitleaksライブラリを使ってAPIキー・パスワードを検出
フィードバック:ExitCode=2またはJSONでClaudeに警告
本番環境の書き込み防止
Gitブランチが
main/productionの場合にrmやwriteを即時ブロック
依存関係の自動インストール
Claudeが
npm startなどを実行する前にnpm installを自動実行
コードレビューと静的解析(PostToolUse)
Claudeがコードを書いた直後にLinterやESLintを実行
フィードバックを人間的に返す(例:「関数の複雑度が高すぎます」)
ユニットテストの自動生成
関数をClaudeが書いた直後に、その関数に対するテストコードをLLMで生成し即時実行
Gitコミット連携(Stop)
Stopイベントで
git diff→ LLM → Conventional Commitメッセージ自動生成
Jira連携
チケットIDをブランチ名やコミットから取得 → 自動でIn Reviewに更新
5. Claude Code Hook活用のまとめ
Claude CodeのHook機構は、単なる補助的ツールではなく、LLMの出力を“ルールベースな自動化システム”へと昇華させる強力な仕組みです。
以下の観点で真価を発揮します:
エンジニアリングガバナンス(規約、ルールの徹底)
品質ゲート(静的解析・セキュリティチェック)
セキュアコーディング(秘密情報保護、ブランチ制御)
ローカル環境統制(依存管理、自動インストール)
チームワークとワークフロー(通知、Git/Jira連携)
Hookを正しく設計すれば、Claudeが出力するコードはレビュー不要で即マージ可能な品質に達することも夢ではありません。
Claudeの各Code Hooks
on_input(input: str) -> Union[str, None]
入力時フック
用途: ユーザーからの入力を受け取ったときにトリガーされます。入力を前処理したい場合や、入力に基づいて何かログを取ったり、入力値を変更する用途に使用されます。
入力時フック
用途: ユーザーからの入力を受け取ったときにトリガーされます。入力を前処理したい場合や、入力に基づいて何かログを取ったり、入力値を変更する用途に使用されます。
on_output(output: str) -> str
出力時フック
用途: Claudeからの出力がユーザーに返される前にトリガーされます。出力の後処理やフィルタリング、ログ記録などに使えます。
出力時フック
用途: Claudeからの出力がユーザーに返される前にトリガーされます。出力の後処理やフィルタリング、ログ記録などに使えます。
on_tool_start(tool_name: str, input: str) -> None
ツール開始時フック
用途: Claudeがツール(例: web検索や関数実行)を呼び出す直前に実行されます。開始ログの記録やモニタリングに使用されます。
ツール開始時フック
用途: Claudeがツール(例: web検索や関数実行)を呼び出す直前に実行されます。開始ログの記録やモニタリングに使用されます。
on_tool_end(tool_name: str, input: str, output: str) -> str
ツール終了時フック
用途: Claudeがツールの実行を終えた直後に実行されます。出力の整形や監査ログの記録に使えます。
ツール終了時フック
用途: Claudeがツールの実行を終えた直後に実行されます。出力の整形や監査ログの記録に使えます。
on_tool_error(tool_name: str, input: str, error: Exception) -> str
ツールエラー時フック
用途: Claudeがツール呼び出しで例外を検出した場合に実行されます。エラーログを取ったり、エラー内容に基づいてメッセージをカスタマイズするのに便利です。
ツールエラー時フック
用途: Claudeがツール呼び出しで例外を検出した場合に実行されます。エラーログを取ったり、エラー内容に基づいてメッセージをカスタマイズするのに便利です。
on_completion(messages: List[Dict[str, str]]) -> None
セッション完了時フック
用途: Claudeが会話を完了したときに呼び出され、会話履歴を取得できます。チャット履歴の保存や外部連携のトリガーに使用されます。
セッション完了時フック
用途: Claudeが会話を完了したときに呼び出され、会話履歴を取得できます。チャット履歴の保存や外部連携のトリガーに使用されます。
0 件のコメント:
コメントを投稿