Claude Code に作業を任せて別のことをしていると、いつの間にか完了していたり、許可プロンプトで止まっていたりすることがある。

「通知が来れば気づけるのに」と思って設定を試してみた。結果としては動くのだが、期待していたほどスムーズではなかった。以下は試行錯誤の記録として参考にしてほしい。

組み込み設定とその限界

Claude Code には preferredNotifChannel という組み込みの通知設定がある。

{
  "preferredNotifChannel": "auto",
  "inputNeededNotifEnabled": true
}

ただしこれは iTerm2 の通知機能を経由するため、セッション名や生のエスケープシーケンスがそのまま通知に表示されることがある。複数プロジェクトを同時に動かしていると通知が混在して読みにくくなる。

hooks で osascript を使う

組み込み設定に限界を感じたので、~/.claude/settings.jsonhooks を使って macOS ネイティブの通知を直接出す方法も試してみた。

{
  "hooks": {
    "Stop": [{
      "hooks": [{
        "type": "command",
        "command": "osascript -e \"display notification \\\"作業が完了しました\\\" with title \\\"Claude Code [$(basename $PWD)]\\\" sound name \\\"Glass\\\"\""
      }]
    }],
    "Notification": [{
      "hooks": [{
        "type": "command",
        "command": "osascript -e \"display notification \\\"入力が必要です\\\" with title \\\"Claude Code [$(basename $PWD)]\\\" sound name \\\"Ping\\\"\""
      }]
    }]
  }
}

Stop は Claude が作業を終えたとき、Notification は許可プロンプトや質問で入力待ちになったときに発火する。

プロジェクト名を動的に入れる

$(basename $PWD) を使うことで、通知のタイトルに現在のプロジェクト名が自動で入る。

Claude Code [araisun-hugo]
作業が完了しました

複数プロジェクトを並行して動かしていても、どのプロジェクトの通知かが一目でわかる。

サウンドのカスタマイズ

sound name には macOS の通知サウンド名を指定できる。

サウンド名印象
Glass軽くて澄んだ音(完了向き)
Ping短く鋭い音(注意喚起向き)
Basso低く重い音
Funk独特な音

実際に使ってみての感想

  • 通知の遅延 — hooks 経由の通知は Claude の処理が完全に終わってから発火するため、体感では数秒の遅れがある
  • 対話中は通知不要 — Claude と会話しながら使っているときは許可プロンプトがターミナルにインラインで表示されるので、そもそも通知は必要ない。別のアプリに切り替えているときだけ意味がある
  • 通知権限 — macOS のシステム設定 → 通知 で使用中のターミナルアプリに通知が許可されているか確認する

iTerm2 に謎の Alert が大量に出る場合

hooks の設定とは別に、iTerm2 の通知センターに Session xxx: 4;0;100 4;1;20 のような Alert が大量に出ることがある。

これは Claude Code が OSC 9;4 というプログレスバー用のエスケープシーケンスをターミナルに送信していて、iTerm2 がそれを通知として表示しているものだ。以下を追加すると止まる。

{
  "terminalProgressBarEnabled": false
}

まとめ

hook イベントタイミング
Stop作業完了時
Notification許可プロンプト・質問待ち時

設定自体はできるし、プロジェクト名入りの通知も出せる。ただ遅延や通知の多さなど、思ったより快適ではない部分もあった。「ないよりまし」程度に考えておくのがちょうどいいかもしれない。