Claude CodeのHooksでタスク完了メッセージをデスクトップ通知する


Claude CodeではNotificationでベル音を鳴らすことができますが、私は音量をゼロにしてMacを使っているため、デスクトップのバナー通知で視覚的に知らせてほしいと思っていました。一部のユーザーは、osascriptやterminal-notifierのコマンド呼び出し指示を各自CLAUD.mdに記載してこれを実現させているようですが、毎回推論コンテキストに載せるに抵抗があり、そこまでは手を出せていませんでした。

しか昨日リリースされたHooks機能は、まさにこの用途に最適でした。ドキュメントにもカスタム通知を設定する例が載っています。

Hooks - Anthropic
Customize and extend Claude Code’s behavior by registering shell commands

すでにHooksのさまざまなユースケースが公開されていて、例えばファイルのフォーマッタやSlack・LINEへの通知などを行っているユーザーがいます。

Claude Code の Hooks で作業が終わった後にフォーマッターを実行する
Claude Code hooks は Claude Code のライフサイクルの特定のタイミングで実行されるユーザー定義のシェルスクリプトです。hooks を使用することで、コードのフォーマットを常に実行することができます。この記事では hooks を使用してコードの変更後に prettier が実行されるように設定してみましょう。

Hooksの仕様としては、イベントごとに決まったJSONテキストが標準入力されるので、それに応答するコマンドを設定ファイルに記述します。公式ドキュメントの例では、jqコマンドでパースしてパイプ処理し、ファイル書き込みをするワンライナーが紹介されています。それより複雑なことをしたい場合は、Pythonスクリプトなどを書くことが推奨されているようでした。

私はこれを利用して、完了メッセージを会話ログファイルの末尾から取得するスクリプトを作成しました。これをデスクトップに通知したいと思います。並列に分析タスクを実行しているので会話内容を含むことでどのタスクが完了したのか分かりやすくなります。

https://blog.lai.so/claude-code-hooks
https://blog.lai.so/claude-code-hooks. GitHub Gist: instantly share code, notes, and snippets.

これは以下のようなスクリプトで配置して設定します。

mkdir -p ~/.claude/hooks
pbpaste > ~/.claude/hooks/stop-send-notification.mjs
chmod +x ~/.claude/hooks/stop-send-notification.mjs
cat ~/.claude/settings.json

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/hooks/stop-send-notification.mjs"
          }
        ]
      }
    ]
  }
}

会話の応答が止まるタイミングで以下のように通知されます。

NotificationではなくStopなのはなぜかというと私の環境では期待したタイミングでNotificationが呼ばれないからです(なぜ・・)。

なお、macOSのScript Editorに権限が設定されていない場合、osascriptのdisplay notificationによる通知が届かないのでご注意ください。

Trying to use Terminal for Display Notification
Hi all ! In macOS Sequoia, if I run in Script Editor: display notification “Hi all” it works as expected. But if I use in Terminal: osascript -e ‘display notification “Hello from me” with title “Hello”’ is not working!! But “display dialog” works perfectly: osascript -e ‘display dialog “Hello from me” with title “Hello”’ And also this is not working from the Script Editor: do shell script “osascript -e ‘run script \“display notification \\\“hello\\\”\”’” I don’t understand why display…

私は通常、Claude CodeのVScode拡張のエディタを使って埋め込みターミナルウィンドウ内でClaude Codeを起動しています。

これまでは、常にサイドバーにログを表示し、更新が止まったことを目視してタスクの完了を把握していました。この設定に移行したことによりエディタのタブをバックグラウンドに隠してラップトップの画面が広く使えるようになってよかったです。

TIPSとして、「claude -p "grep foo" --debug」とデバッグオプションで実行すると、Hooksの開発がしやすくなります。これは、どのHookがいつ呼ばれているかを画面に出力してくれます。

Subscribe to laiso

Sign up now to get access to the library of members-only issues.
Jamie Larson
Subscribe