🐶

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

に公開

やること

下記の画像のように Claude Code に投げたタスクが完了した際に、サウンド付きでデスクトップ通知してサボり者の自分にムチをうちます。

動機

私は怠け者ですので Claude Code にタスクを投げたまま Youtube を見てしまい、無限に時間を溶かし続けていました。

https://docs.anthropic.com/en/release-notes/claude-code

上記の Release Notes にあるように、2025/06/30(多分 JST じゃないと思う....) に Claude Code に Hooks という機能が追加されました。

これが神機能で、Introduction にあるように

https://docs.anthropic.com/en/docs/claude-code/hooks#introduction

Claude Code hooks are user-defined shell commands that execute at various points in Claude Code’s lifecycle.

とのこと。Hook を登録しておけば Claude Code のライフサイクルイベントとして発火できるよということですね。

https://docs.anthropic.com/en/docs/claude-code/hooks#stop

Stop
Runs when the main Claude Code agent has finished responding.

こいつを使えば agent のタスク完了を通知できそうということで作業に取り掛かかりました。

手順

https://docs.anthropic.com/en/docs/claude-code/hooks#quickstart

これはもう公式ドキュメントを見るべきですが、自分が行った作業を簡単に書き記しておきます。

登録するコマンドを用意する

要件は、macOS のデスクトップに通知をする です。色々と拘ろうと思えばいくらでも拘れる気もしますが、一旦はシンプルに目的を達成するためのものを用意しました。

そもそも、何を使えばいいのかすら知らなかったので desktop notifications cli macOS と入力しググってみたところ osascript というコマンドがあることを知りました。

https://blog.petehouston.com/send-desktop-notification-from-command-line-in-macos/

深く考えず、このコマンドを使うだけで良さそう。OSA-e オプションについては下記を見てください。

https://ja.wikipedia.org/wiki/Open_Scripting_Architecture

https://ss64.com/mac/osascript.html

これらの情報を元に作ったコマンドは以下の通りです。

osascript -e 'display notification "Invoke \"Stop\" event." with title "Claude Code" sound name "Glass"'

通知が飛ぶかチェックする

画像の通り、Glass という SE が鳴り、デスクトップに通知が飛んでくれました。

ちなみに、SE はこの Hooks を布教した知り合いが Glass を使っていて、確かに気づけそう且つ不快じゃないということで真似させてもらいました(でも、もしかしたら不快な音の方が気づけるかもしれない)。下記のリポジトリのファイル名を CLI に打ち込んで片っ端から試すのがいいと思います。

https://github.com/extratone/macOSsystemsounds/tree/main/aiff

前述のコマンドの Glass の部分を Basso とかに変えて気に入ったやつを使ってください。もしかしたらこのフォルダ配下にはないが、指定可能な SE もあるかもしれない。がしかし Glass が気に入ったので、これ以上調べなかったです。

Hooks に登録する

  1. Claude Code を起動する
claude
  1. /hooks と入力する

  1. ライフサイクルイベントを選ぶ

今回はタスク完了後に通知が欲しいので Stop を選択しました。

  1. new hook として登録する

  1. コマンドをコピペする

先ほど CLI で試したコマンドをそのままコピペすればいいです。

  1. Hooks の適用スコープを決める

今回の設定はあらゆるプロジェクトで有効にしたかったので User スコープに設定しました。

User スコープでは画像の通り ~/.claude/settings.json に保存がされます。

こんな感じになっています。matcher を指定することで発火条件を絞り込めるようですが、今回は常に発火してほしいものなので未指定。

動作確認

少し見づらいが、画像の右上に通知が出ていることが分かる。

めでたしめでたし。

Discussion