RemitAid Tech Blog
🔔

ClaudeCode x Cursorの通知はHooksを使うのが丸そう

に公開

こんにちは!RemitAidでソフトウェアエンジニアをしているnos0611です。
RemitAidでは開発にClaude Codeを使用しているのですが、通知設定について一定の解が得られたので紹介できればと思います。

さっそく結論

タイトルにも記載しましたが、Hooksを使った以下のような設定を実施しました。

settings.json
"hooks": {
  "Notification": [{
    "hooks": [{
      "type": "command",
      "command": "osascript -e 'display notification \"確認をお願いします\" with title \"Claude Code\"' && say \"確認をお願いします\""
    }]
  }],
  "Stop": [{
    "hooks": [{
      "type": "command",
      "command": "osascript -e 'display notification \"タスクが完了しました\" with title \"Claude Code\"' && say \"タスクが完了しました\""
    }]
  }]
}

そもそもの悩み事

Claude Codeに何かタスクをお願いする際、裏で動かしつつ自身は別の作業をすることが多いかと思います。
そうするとClaude Codeの実行画面も裏に行くため、

  • 入力で止まっていたことに気づかない
  • タスクが完了していたことに気づかない

といった理由で結局タスクが進んでいなかったということがしばしば発生します。
せっかく裏で実行させていた意味が薄れてしまうため、入力待ち/タスクの完了を通知させるべく設定方法を検討しました。

実現したいこと

入力待ち/タスク完了時に以下が発火することを目標としました。

  • 通知のポップアップが現れる
  • 音声による通知を行う

検討の経緯

公式の通知設定

Calude Codeの公式サイトではターミナルベル/iTerm2による通知が紹介されています。
初めはこちらを試したのですが、Cursorのターミナル上でClaude Codeを使用する場合は噛み合わせが悪いらしく、以下の理由で断念しました。

  • ターミナルベルの使用
    • こちらは使用しているアプリケーションの通知をMacの環境設定から許可する必要がありますが、Cursorにはそもそも通知機能がない(?)のか設定一覧に出てきません。
  • iTerm2
    • こちらはiTerm2上でClaude Codeを実行している場合のみ発火するようです。IDEを使った開発を行っている場合はClaude Codeを使うときだけターミナルを切り替える必要が出てくるため、利便性に欠けます。

CLAUDE.mdによる指示

それならばということで、CLAUDE.mdに以下のような設定を追加しました。

**YOU MUST**: When asking for user confirmation or action (e.g., yes/no questions), execute the notification command BEFORE asking the question. This includes:
- Before executing any destructive operations (git reset, git stash, file deletions)
- Before making significant changes that require user approval
- When asking yes/no questions or requesting user input
- When presenting options for the user to choose from

Execute this notification command FIRST, BEFORE writing the question:
```sh
# ポップアップの表示
osascript -e 'display notification "確認をお願いします" with title "Claude Code"'
# 音声による通知
say "確認をお願いします"
```
IMPORTANT: The notification MUST be executed as a separate Bash tool call BEFORE writing any question or request to the user.

**YOU MUST**: When all tasks are completed, notify the user with the following command:
```sh
osascript -e 'display notification "タスクが完了しました" with title "Claude Code"'
say "タスクが完了しました"
```

こちらの設定を行ったところ、一定うまく通知を実施してくれました。
ですが、たまに通知してくれなかったり、かと思えば変なタイミングで通知が飛んできたりと、イマイチ安定性に欠ける状態となっていましました。
こちらとしては一切気にせず別のことをしたいので、「通知が来ていないだけで実は終わっていたりするかな、、?」と確認に行く必要があったりと結局手離れできません。

Hooksによる通知

そうして最終的に辿りついたのがHooksです。
こちらも公式ページで紹介されています(最初に気づきたかった)。
Hooksを利用すると、特定のタイミングで指定したコマンドを実行することができます。

コマンド紹介

CLAUDE.mdの箇所で少し先出しましたが、入力待ち/タスク完了時のポップアップと音声通知の実現には以下のコマンドを使用しています。
display
ポップアップの表示に使用するAppleScriptコマンドです。
通知許可を行うため、初回のセットアップとして以下の手順が必要となります。

  1. LaunchPad→その他→スクリプトエディタを開く
  2. 適当な通知を実行する
    • display notification "test notification" with title "Notification"
    • 通知を許可する
  3. 設定→通知→スクリプトエディタの通知が許可されていることを確認する

osascript
displayコマンドをCLI上で実行するために使用するコマンドです。

say
引数に渡した言葉を読み上げてくれるコマンドです。

設定方法

最終的には、冒頭で紹介した通りの内容をsettings.jsonに適用しています。

settings.json
"hooks": {
  "Notification": [{
    "hooks": [{
      "type": "command",
      "command": "osascript -e 'display notification \"確認をお願いします\" with title \"Claude Code\"' && say \"確認をお願いします\""
    }]
  }],
  "Stop": [{
    "hooks": [{
      "type": "command",
      "command": "osascript -e 'display notification \"タスクが完了しました\" with title \"Claude Code\"' && say \"タスクが完了しました\""
    }]
  }]
}

Notificationに渡した内容が入力待ちのタイミングで実行され、Stopに渡した内容がタスク完了時に実行されます。
こちらを設定してからしばらく運用していますが、通知が漏れているとか変なタイミングで通知されているとかは今のところはありません!

終わりに

RemitAid では一緒に働く仲間を募集しています。
1 人目カスタマーサクセスの募集を開始しました。
興味がある方は以下からご確認ください!
https://youtrust.jp/recruitment_posts/ad655de82471df86af4f19469fe4c0de

RemitAid Tech Blog
RemitAid Tech Blog

Discussion