🐰

Claude Code の Hooks 機能で遊んでみた - セッション終了時に自動でCLAUDE.mdを更新させたい+α

に公開

モチベーション

https://zenn.dev/appbrew/articles/e2f38677f6a0ce
https://zenn.dev/y_agatsuma/scraps/165bb85d6f9c56

AppBrewさんのこちらの記事にあやかって、普段worktree切って色々と並列で作業進める中で、せっかくコードを 書く 書かせるなら技術記事もセットでポンポン出したいなって思ったのがきっかけです。

自社プロダクトなのでかなり自由にAIにコードを書かせていて、コード自体に価値や秘匿性が必要なものでもないと思っているので、(隠すとこは隠すけど)積極的にオープンに発信しています。
おいおい大丈夫か、とか、この内容合ってんの?とかあればいつでもコメントください🙏

概要

AppBrewさんの記事から、Claude Code にはHooks機能という便利な仕組みがあって、セッションの開始時や終了時に任意のコマンドを実行できるようである。
https://code.claude.com/docs/ja/hooks-guide

記事の内容をまず試した上で、その延長でブログの記事生成もしちゃって欲しいなって思った。

結果から言うと、まだ完成していませんが、途中までの試行錯誤が面白かったので記録として残しておきます。

やりたいこと

Hooksについて整理&AppBrewさんの記事の内容(→今回はここだけ)

  • Claude Code のセッション終了時に自動でスクリプトを実行
  • そのスクリプトで、セッションの内容をもとにCLAUDE.mdファイルを更新する提案を出す
  • 最終的には、プロジェクトの知見がCLAUDE.mdに自動で蓄積されていく仕組みを作りたい

その後にやりたいこと: ブログ記事の自動生成

  • 自動で
    • hooksのSessionEndのタイミング
    • 同じ仕組みで、シェルを作成し、そのセッション内での会話やcommit履歴を元に、記事のネタになりそうなものをピックアップ
    • 必要/選択したトピックの記事を書いてもらう
  • 手動で
    • 作られた記事を、用意してあるsub-agentのドキュメントレビューに渡す
    • レビューを修正
    • 記事完成

Hooks機能を理解するまでの道のり

VS Code拡張では設定できない罠

最初、VS Code拡張の /hooks コマンドで設定画面を開いて「これで設定できるんだ!」と思ったんですが、実はCLIがないと実装できないんですね。

VS Code拡張はあくまで設定の「閲覧」と「編集」ができるだけで、実際にhooksを動かすにはCLIのClaude Codeが必要でした。


設定ファイルの保存先が3つある

Hooks の設定ファイルは以下の3箇所に保存できます:

  1. ユーザー設定(グローバル)
  2. プロジェクト設定.claude/settings.json
  3. プロジェクト設定(ローカル).claude/settings.local.json

https://code.claude.com/docs/ja/settings#設定ファイル

実際の実装手順

ステップ1: まずは pwd で動作確認

いきなり複雑なスクリプトを書くのではなく、まずは簡単なコマンドで動作確認。

{
  "hooks": {
    "SessionEnd": [{
      "matcher": "*",
      "hooks": [{
        "type": "command",
        "command": "pwd"
      }]
    }]
  }
}

セッション終了時にコマンドログが出力されることを確認できました!

ステップ2: macOS通知を実装してみる

「ちゃんと動いてるのか目に見える形で確認したい」と思い、macOS の通知機能を追加することに。

公式ドキュメントには Linux の notify-send を使った例があったんですが、macOS には notify-send がありません。

調べてみると、terminal-notifier というツールがあることを発見。

brew install terminal-notifier

で簡単にインストールできました。

最初は --sound Crystal を指定したんですが、実際に鳴った音は「Glass」と同じ音でした。まあ、音が鳴ればいいのでこれで良しとしました。
(詳しくはこちら)

{
  "hooks": {
    "SessionEnd": [{
      "matcher": "*",
      "hooks": [{
        "type": "command",
        "command": "terminal-notifier -message 'Claude Code セッション終了' -sound Glass"
      }]
    }]
  }
}

ステップ3: 本命のスクリプト呼び出し

通知が動くことを確認したので、いよいよ本題の suggest-claude-md-hook.sh スクリプトを呼び出すように変更。
suggest-claude-md-hook.sh

{
  "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"
      }]
    }]
  }
}

動作確認

実際に動画を撮って確認してみました。セッション終了時にスクリプトが自動実行されることを確認!(動画文字小さくてすいません🙇‍♂️)
https://www.youtube.com/watch?v=blmNoYkqIvY

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

ちなみに、Claude Code で特定sessionを探すとき、claude -r [session-id] で続きから始めたい時に便利だったツール

  • npx ccsearch@latest search "xxxxxx" とかで検索できるの便利だった

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

学んだこと

Hooks機能は思ったより柔軟

任意のシェルコマンドを実行できるので、工夫次第で色々なワークフローを自動化できそうです。

まずは小さく試す

いきなり複雑なスクリプトを書くのではなく、pwd → 通知 → 本命のスクリプト、と段階的に確認していったのが良かったです。

macOS特有の問題もある

Linux向けのサンプルをそのまま使えないことがあるので、macOSを使っている人は環境に合わせた調整が必要です。

終わりに

セッション終了時に自動でドキュメントが更新される未来、夢がありますよね。

引き続き、試行錯誤を続けていきます。同じようなことをやってみたい方の参考になれば幸いです!


この記事は、実際の試行錯誤の過程をそのまま記録したものです。より詳しい技術的な背景やコード例は、元のZennスクラップをご覧ください。

関連技術: Claude Code, CLI, Hooks, macOS, terminal-notifier, Shell Script, Automation

筆者: 91works開発チーム

91works Tech Blog

Discussion