Claudeのhooksを理解する

技術

Claudeをただ実行するだけでなく、トリガー(hooks)を用いて利用するための方法をメモ

公式ドキュメント
https://code.claude.com/docs/ja/hooks

なぜhooksが必要なのか

公式の例としては破壊的なコマンドに対するガードレールとして触れています。
すなわち、rmコマンドを利用した際に拒絶するようなスクリプトを仕込むことで、意図しない削除を防いでいます。

パーミッションモードで制御する方法もありますが(例: planモードにする)、毎回人手による承認も手間なので、自動化できるタスクには仕込んだ方が良さそうに思われます。

実際に書いて見る

ドキュメントに従って、rmやgit pushを自動実行しないガードレールを実装してみます。

hooksの記載

hooksを行うための設定ファイルを記載します。
claude全体に適用する場合は ~/.claude/settings.json 、固有projectにのみ適用であれば、projectのルートディレクトリを起点に .claude/settings.jsonに記載します。

例: settings.json

  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "if": "Bash(rm *)",
            "command": "bash ~/.claude/hooks/guardrail.sh"
          },
          {
            "type": "command",
            "if": "Bash(git push*)",
            "command": "bash ~/.claude/hooks/guardrail.sh"
          }
        ]
      }
    ]
  }

ここでは特定のBashコマンドを利用する前に発動するような書き方にしています。

例: guardrail.sh


#!/bin/bash

input=$(cat)
command=$(echo "$input" | jq -r '.tool_input.command')

echo "[This command is not permitted: $command" >&2
exit 2

余談ですが、単純に特定コマンドを許可しないだけであればpermissionsをsettings.jsonに書くことでも対応可能です。

"permissions":{
  "deny":[
    "Bash(rm *)",
    "Bash(git push*)"
  ]
}

アラート通知やロギングといったカスタム処理を実施する場合はhooksに記載すると良いと思います。

実行例

適当にtmpファイルを作成して、削除してみて
⏺ **Bash**(touch /tmp/claude_tmp_test.txt && echo "一時ファイルを作成しました" && ls -la /tmp/claude_tmp_test.txt)
  ⎿  一時ファイルを作成しました
     -rw-r--r--  1 yu00sasaki  wheel  0  5  1 18:09 /tmp/claude_tmp_test.txt
⏺ rm コマンドがフック (guardrail.sh) によってブロックされています。フックの内容を確認します。
  Read **1** file (ctrl+o to expand)    
⏺ 設定を確認しました。フックで rm * と git push* がブロックされています。
  rm はフックによって意図的に禁止されているため、ファイルの削除ができません。               
  - /tmp/claude_tmp_test.txt は作成済みです                                        
  - 削除は rm コマンドがブロックされているためできませんでした     

ガードレールが効いてそうです。

hooksできるタイミング

claudeのセッションの流れを載せておりますが、各ポイントに定義が可能のようです。

公式サイトより引用

なので、init処理やfinal処理を記載したり、出力内容について加工したり大抵のことはできそうです。
システム化するのであれば、tokenのリセットやロギングあたりでしょうか。運用周りでは必要になってきそうです。

またcodexでもサポートされています。概ね書き方は似ているので単純なhooksイベントであれば置き換えも可能です。
https://developers.openai.com/codex/hooks

まとめ

今回はClaudeのhooksに機能についてまとめました。特にガードレール周りでは重宝しそうに思えます。面白い使い方が見つかればまた紹介しようと思います。

参考サイト
https://dev.classmethod.jp/articles/claude-code-hooks-if-condition-guardrails/
https://zenn.dev/kazuph/articles/483d6cf5f3798c

コメント

タイトルとURLをコピーしました