11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Codeでhooksが追加されないことがあるのと、その解決策

Posted at

最初にまとめ

Claude Codeにhooks機能を追加しようとして .claude/settings.json.claude/settings.local.json(以下、どちらも纏めて「設定ファイル」と記述)を直接編集する際は、以下の点に注意してください。

  • Claude Codeを起動していない状態で設定ファイルを編集した場合
    • 問題なし、Claude Codeを起動すればそのままhooks機能が有効化されている
  • Claude Codeを起動している状態で設定ファイルを編集した場合
    • Claude Codeを再起動する必要がある
    • 複数セッション起動している場合は、一度全てのセッションを切断する
  • ただし、再起動してもhooks機能が有効化されていない場合がある
    • その時はClaude Codeを起動し、/hooks からコマンドを登録してあげる必要がある
    • もしかしたら初回は /hooks からの登録が必須かもしれない?

一部私の環境に依存している部分があるかも知れません。
困った時は /hooks からのコマンド登録を一度試されることを推奨します。

hooks機能の裏側

公式ドキュメントに以下の記載があります。

構成の安全性
設定ファイル内のフックを直接編集しても、すぐには反映されません。

  1. 起動時にフックのスナップショットをキャプチャします
  2. セッション全体を通じてこのスナップショットを使用します
  3. フックが外部で変更された場合に警告します
  4. /hooks変更を適用するにはメニューでの確認が必要です
  5. これにより、悪意のあるフックの変更が現在のセッションに影響するのを防ぎます。

対処法

ということで、Claude Codeを起動している状態で設定ファイルを編集しても、hooksの更新がされません。
なので、Claude Codeを再起動する必要があります。

また、Claude Codeを起動していない状態で設定ファイルを編集した場合は、編集後の状態でhooksのスナップショットが取得されるため、立ち上げた段階から編集後のhooksが適用されているはずです。

注意点1.
Claude Codeを複数セッションを立ち上げているときは、すべてのセッションを切断することをお忘れなく…
私は2つ立ち上げたうちの1つだけセッションを切断した状態で設定ファイルを編集してしまって、全然設定が反映されなくて頭を抱えていました。

注意点2.
また、上記が原因なのかはわかりませんが、時には/hooksからコマンドを登録しないと、設定ファイルをいくら編集しても全く反映されない、という事象にもぶつかりました。
上手く設定が反映されない時は、大人しく/hooksからサイド設定し直す方が早そうです。

確認方法

本当にhooksの設定ができているかを確認しましょう。
自分で設定した設定ファイルと、/hooksコマンドの設定内容を見比べて、両者に同じ設定がされているかを確認してください。

例えば以下のような設定ファイルがあるとします。

.claude/settings.local.json
{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "../script/slack-notify.sh \"Claude Code の作業が完了しました\""
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Write|Edit|MultiEdit",
        "hooks": [
          {
            "type": "command",
            "command": "../script/slack-notify.sh \"ファイルの編集が完了しました\""
          }
        ]
      }
    ],
    "SubagentStop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "../script/slack-notify.sh \"タスクの実行が完了しました\""
          }
        ]
      }
    ]
  }
}

上から、Stopイベント・PostToolUseイベント・SubagentStopイベントです。
これを確認していきます。

Claude Codeで/hooksコマンドを実行すると、以下のような画面になります。
ここでまずは4. Stopを選択します。
image.png

すると以下のように、Stopイベントに登録されているコマンドが確認できます。

2.はグローバル設定なので先程のjsonには含まれておらず、
3.としてローカル設定(=このディレクトリ配下で有効なhooks設定)のスクリプト実行コマンドが確認できます。
image.png

続いて、2. PostToolUseを選択します。
すると以下のように、Matcherとcommand、両方の設定が確認できます。
image.png

image.png

最後に5.SubagentStopを確認します。
これは意図的に最初異なるパスを設定した状態でClaude Codeを起動し、その状態で設定ファイルを編集しました。
なので先ほどとは異なるパスのスクリプトを実行するように記載されています。
image.png

なので、Claude Codeを再起動します。/exit から、再度ターミナルで claude コマンドを実行してClaude Codeを起動します。
そして再度 /hooks を実行。
image.png

再び5. SubagentStopを確認すると、変更後の設定が反映されていました🙌
image.png

もし変更されていない場合は、1. + Add new hook...から再度登録し直してみてください!

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?