Claude Code の完了・確認待ちに気づく — macOS 通知設定ガイド
タスクを投げて Slack に切り替え、10 分後に戻ったら Claude Code は 9 分前に終わっていた—— もっと悪いと、許可ダイアログを出したままずっと止まっていた。そんな見逃しをなくすための 通知設定を、1 行で終わる設定からカスタム hooks、常駐の状態モニターまで順に紹介します。
気づくべき 2 つの瞬間
Claude Code があなたを待つ状況は 2 種類あり、緊急度が違います:
- 作業の途中で入力待ち — ツールの実行許可(「このコマンドを実行していい?」)、 プランの承認待ち、選択肢つきの確認の質問。答えるまでセッションは完全に停止していて、 気づかない 1 分がまるごと損失になります。
- 応答が完了した — ターンが終わり、次のプロンプトはあなたの番。 緊急ではないものの、戻ってレビューする合図です。
どちらも Claude Code hooks
で拾えます。Notification イベントは Claude が入力を必要とするときに発火し
(許可ダイアログの場合は表示から数秒間未応答のときに発火するので、即答した分で通知が
溢れることはありません)、Stop イベントは応答完了時に発火します。
方法 1: ターミナルのネイティブ通知
スクリプトを書く前に、使っているターミナルを確認してください。Claude Code は Ghostty・Kitty・iTerm2 経由で、 入力待ちのときに macOS のデスクトップ通知を出せます。
- Ghostty / Kitty — 追加設定なしで動きます。macOS が通知の許可を求めてきたら許可するだけです。
- iTerm2 — 事前に有効化が必要です。Settings → Profiles → Terminal で「Send Notification Center alerts」にチェックを入れ、macOS のシステム設定で iTerm2 の通知を許可します。
macOS 標準の Terminal.app にはこの連携がないため、次のベルか hooks を使ってください。
方法 2: ターミナルベル
Claude Code は注意が必要なタイミングでターミナルベルを鳴らせます。
~/.claude/settings.json に 1 行:
{
"preferredNotifChannel": "terminal_bell"
}
多くのターミナルはベルを視覚化してくれます。Terminal.app はタブにバッジを表示し、 iTerm2 はベルを通知に変換でき、tmux はウィンドウにベルインジケーターを付けます。 素朴な仕組みですが、どの環境でも動き、スクリプトも不要です。
方法 3: hooks でカスタムの macOS 通知を出す
追加ツールは不要です。macOS 標準の osascript で通知センターに通知を出せます。
1. 小さなスクリプトを 2 つ作る
mkdir -p ~/.claude/scripts
cat > ~/.claude/scripts/notify-waiting.sh <<'EOF'
#!/bin/bash
# Claude Code の "Notification" hook: セッションが入力待ち。
osascript -e 'display notification "セッションが入力を待っています" with title "Claude Code" sound name "Glass"'
EOF
cat > ~/.claude/scripts/notify-done.sh <<'EOF'
#!/bin/bash
# Claude Code の "Stop" hook: セッションの応答が完了。
osascript -e 'display notification "応答が完了しました" with title "Claude Code"'
EOF
chmod +x ~/.claude/scripts/notify-waiting.sh ~/.claude/scripts/notify-done.sh
2. ~/.claude/settings.json に登録する
hooks セクションを追加します(既にあればマージ)。この場所に書くと全プロジェクトに
適用されます。特定プロジェクトだけに絞るなら、そのプロジェクトの
.claude/settings.json に書いてください。
{
"hooks": {
"Notification": [
{
"hooks": [
{ "type": "command", "command": "$HOME/.claude/scripts/notify-waiting.sh" }
]
}
],
"Stop": [
{
"hooks": [
{ "type": "command", "command": "$HOME/.claude/scripts/notify-done.sh" }
]
}
]
}
}
新しい Claude Code セッションを起動し(hooks は起動時に読み込まれます)、許可リストに 入れていないツールを使うタスクを頼んで、許可ダイアログを数秒放置してみてください。 通知が出れば成功です。
発展形
- 実際のメッセージを表示する。hook は stdin から JSON ペイロードを受け取り、
messageフィールドに Claude が何を求めているかが入っています。 jq が入っているなら:#!/bin/bash msg=$(jq -r '.message // "入力が必要です"') osascript -e "display notification \"${msg//\"/\\\"}\" with title \"Claude Code\"" - プロジェクト名を入れる。ペイロードの
cwdフィールドで どのリポジトリのセッションか分かります。複数セッションを走らせ始めると必須になります (複数セッション管理ガイド参照)。 - リッチな通知にする。Homebrew の
terminal-notifierなら カスタムアイコンやクリックアクションが使えます。 - 通知が出ないときは通知センターの設定を確認。システム設定 → 通知で、
ターミナル(
osascriptの通知はスクリプトエディタ名義のことも)の通知が 許可されているか。集中モード中はバナーが抑制される点にも注意です。
通知バナーの構造的な限界
この設定は本当に便利で、全員に勧めています。ただ、使い込むほどバナー特有の限界に当たります:
- バナーはイベントであって状態ではない。数秒で消えるため、 「今この瞬間、何か自分を待っているものはあるか?」には答えられません。 結局ターミナルを見に行くことになります。
- セッション数に対してスケールしない。3 並列で走らせると同じ見た目の バナーが流れてきます。どのセッション?どのプロジェクト?さっきのはもう対応した?
- 返答への導線がない。バナーは正しいターミナルペインに連れて行って くれません。タブ探しは残ります。
- 許可への応答は検知できない。hook はダイアログが出た瞬間に発火しますが、 あなたが答えた瞬間には発火しません。通知の上に状態を組むと「確認待ち」表示が残留します (詳しくは hooks 状態追跡ガイド)。
もう一つの選択肢: 常駐のステータスウィンドウ
AgentManager は同じ問題を「割り込んでくるイベント」ではなく 「一目で見える状態」として解きます。すべての Claude Code セッションを状態ランプ付きで 一覧する、常時最前面の小さなウィンドウを持つ macOS メニューバーアプリです — 確認待ち、 処理中、 完了、 待機:
- どれかが確認待ちになるとウィンドウが自動で前面に出て (バナー音の代わりに猫の鳴き声も選べます)、すべて解消すると引っ込みます。通知センターは使いません。
- 確認待ちの行には返答の形が出ます — 許可の Yes/No か、プランレビューか、選択式か。
- 行をクリックすると該当ペインへジャンプ — iTerm2・Terminal.app・Ghostty・VS Code 系に対応(tmux は状態表示のみ。ペインへのジャンプは現状非対応)。
- 許可への応答も検知するため、承認した瞬間に「確認待ち」ランプは即時に消え、残留しません。
セットアップはワンクリックです(hooks の登録は自動、解除もきれいにできます)。上の
osascript 設定とも共存できます。hooks は複数登録できるので、Stop のバナーは
残しつつ、確認待ちの管理はウィンドウに任せる構成も可能です。
確認待ちをもう見逃さない
AgentManager は、どの Claude Code セッションが入力待ちになっても その瞬間に前面へ出します。無料で使えます — アカウント登録不要。