Open10

ClaudeCode のhooks 再入門 & CLAUDE.md 勝手に育てるやつについて

YoshikiAgatsumaYoshikiAgatsuma

hooksの作成終わって、claudeに、「pwd コマンド使って」って言う

hooksで設定したbashコマンド実行されて、ログ吐き出されてる

ちなみに、以下が公式サイトのコマンドだけど、上のhooksの設定保存先に合わせて出力先は変える必要があるね

jq -r '"\(.tool_input.command) - \(.tool_input.description // "No description")"' >> ~/.claude/bash-command-log.txt

あと、このhooksは不要なので容量増えてくだけなので後で消す

YoshikiAgatsumaYoshikiAgatsuma

次は、SessionEndで取り敢えず通知飛ばすか
https://code.claude.com/docs/ja/hooks-guide#カスタム通知フック

cmd + k で検索欄開いて、アシスタントに聞くってやつで、notify-send って何?って聞いた

notify-send 自体は、Claude Code のドキュメントには詳しく説明されていません。これは Linux のデスクトップ通知システムの標準コマンド です。
Claude Code のドキュメントでは、Notification フックの例として使用されていますが、notify-send コマンド自体の説明はありません。Linux システムで利用可能な外部コマンドです。

うむ、そんなコマンド入ってないな

$ which notify
notifyd     notifyutil
YoshikiAgatsumaYoshikiAgatsuma

じゃあ次は、macでデスクトップ通知する方法探すか
てことで取り敢えずコマンド入れてみる

これが良さそう
https://zenn.dev/yuru_log/articles/claude-code-hooks-terminal-notifier-guide#terminal-notifierでmacosに美しい通知を送信しましょう

$ brew install terminal-notifier
==> Auto-updating Homebrew..
...

$ which terminal-notifier
/opt/homebrew/bin/terminal-notifier

$ terminal-notifier -message "タスクが完了しました"

YoshikiAgatsumaYoshikiAgatsuma

その前に、sound変更したい

この部分

$ terminal-notifier -title 'Claude Code' -subtitle '処理完了' -message 'すべてのタスクが終了しました' -sound default

defaultにしてる部分をmacの設定画面の通知音の名前に変えてみれば良いかも?てことで試す

$ terminal-notifier -title 'Claude Code' -subtitle '処理完了' -message 'すべてのタスクが終了しました' -sound Crystal

ん、なんか音違くね?同じCrystalなのに。
一応、ファイルの場所と言われる箇所見てみる
Crystalなくね?

$ ls /System/Library/Sounds/
Basso.aiff	Blow.aiff	Bottle.aiff	Frog.aiff	Funk.aiff	Glass.aiff	Hero.aiff	Morse.aiff	Ping.aiff	Pop.aiff	Purr.aiff	Sosumi.aiff	Submarine.aiff	Tink.aiff

よくわかんないけど、macの設定画面で「Crystal」の音は、「Glass」というものと同じ音でした。(自分の耳がおかしくなければ)

なので、コマンドは以下になりそう👏

$ terminal-notifier -title 'Claude Code' -subtitle '処理完了' -message 'すべてのタスクが終了しました' -sound Glass
YoshikiAgatsumaYoshikiAgatsuma

じゃあ気を取り直して話を戻して
hooksのSessionEndで、terminal-notifierを設定して、claudeを/exit したら通知来るかどうか確認する

前述と同じように、SessionEndに対して、hooksを作成していく

defaultの部分はGlassに後から、settings.local.jsonを書き換えました。

そしたらclaudeを/exitしてみる

$ claude

 ▐▛███▜▌   Claude Code v2.0.49
▝▜█████▛▘  Sonnet 4.5 · Claude Max
  ▘▘ ▝▝    ~/xxxxx

> /exit 
  Bye!

──────────────────────────────────────────────────────────────────────────────────────────────
>  
──────────────────────────────────────────────────────────────────────────────────────────────
  ⏵⏵ accept edits on (shift+tab to cycle)                       Thinking off (tab to toggle)

ピロ〜〜〜〜ん🎵
はいキタ〜㊗️

YoshikiAgatsumaYoshikiAgatsuma

よしよし、じゃあ、呼び出す処理を今回の本題の suggest-claude-md-hook.sh に変更する
最終こんな感じ

.claude/settings.local.json
{
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
  ...
  "hooks": {
    "SessionEnd": [
      {
        "matcher": "*",
        "hooks": [
          {
            "type": "command",
            "command": "bin/suggest-claude-md-hook.sh"
          }
        ]
      }
    ],
    "PreCompact": [
      {
        "matcher": "*",
        "hooks": [
          {
            "type": "command",
            "command": "bin/suggest-claude-md-hook.sh"
          }
        ]
      }
    ]
  }
}

YoshikiAgatsumaYoshikiAgatsuma

取り敢えず、第一目標はこんな感じに動いた。
https://www.youtube.com/watch?v=blmNoYkqIvY

「この内容をCLAUDE.mdに追記してください」のように指示してください。

動画内で、ターミナルが立ち上がっていた部分、claudeの別sessionで会話が残っているので、session-id探して立ち上げ直せば、claudeに指示を出すことはできそう

ちなみに、

  • Claude Code で特定sessionを探すとき、claude -r [session-id] で続きから始めたい時に便利だったツール
    • npx ccsearch@latest search "xxxxxx" とかで検索できるの便利だった

https://zenn.dev/suthio/articles/126bc21f0741a6