tmux の中では、~/.tmux.conf に set -g allow-passthrough on を追加するまで、Claude Code のデスクトップ通知は外側の terminal に届きません。これでアタッチ中は解決します。デタッチするとセッションを表示している terminal がなくなるため画面上で知らせる手段はありませんが、Claude Code は動き続け、hook も発火し続けます。デタッチ中のセッションから通知を受け取るには、terminal に頼る hook ではなく、スマートフォンやチャットアプリにネットワーク経由で push を送る hook を使います。
01アタッチ中:tmux に通知を通させる
tmux は Claude Code と terminal の間に入り、デフォルトでは Claude Code がデスクトップ通知に使うエスケープシーケンスを握りつぶしてしまいます。Anthropic の terminal ガイドでは、~/.tmux.conf に次のブロックを追加するよう案内しています。
set -g allow-passthrough on
set -g focus-events on
set -s extended-keys on
set -as terminal-features 'xterm*:extkeys'
実行中のサーバーに反映します。
tmux source-file ~/.tmux.conf
allow-passthrough により、通知や進捗表示が外側の terminal に届くようになります。残りの行は Shift+Enter での改行を直すためのものです。これを設定すると、tmux の外で Claude Code の通知を表示できる terminal(Ghostty、Kitty、アラートを有効にした iTerm2)では、tmux の中でも表示されるようになります。
terminalSequence を返す hook についても同様です。Anthropic の hooks リファレンスによると、これらのシーケンスは Claude Code 自身が書き出すため、tmux や GNU screen の中でも動作します。例は macOS、Linux、SSH の各ガイドにあります。
02アタッチ中だが別のウィンドウにいる場合:ベルを使う
Claude Code をある tmux ウィンドウで動かし、別のウィンドウで作業しているなら、ベルがシンプルな合図になります。Claude Code が常にベルを鳴らすよう設定します。
{
"preferredNotifChannel": "terminal_bell"
}
次に、~/.tmux.conf で tmux がベルに反応するようにします。
setw -g monitor-bell on
set -g bell-action other
set -g visual-bell off
monitor-bell(デフォルトで有効)はベルを鳴らしたウィンドウにフラグを立て、tmux はステータスラインでそのウィンドウに ! を付けます。bell-action other は、表示中以外のウィンドウで鳴ったベルを terminal に渡すので、terminal がビープ音を鳴らしたりアイコンを跳ねさせたりできます。表示中のウィンドウも含めるなら any を使います。visual-bell を on にすると、ベルを渡す代わりに tmux 内にメッセージを表示します。
03どのセッションが対応を求めているかを示す
複数のセッションを動かしていると、「Claude が対応を求めています」だけの通知ではあまり役に立ちません。hook はペインの環境内で実行されるため、tmux にセッション名とウィンドウ名を問い合わせられます。次の Linux の例では、それらをデスクトップ通知に表示します。
#!/bin/bash
msg=$(jq -r '.message // "Claude Code needs your attention"')
where=""
if [ -n "$TMUX_PANE" ]; then
where=$(tmux display-message -p -t "$TMUX_PANE" '#S:#W')
fi
notify-send "Claude Code ${where}" "$msg"
~/.claude/hooks/notify-tmux.sh として保存し、chmod +x を実行してから、Notification または Stop の hook コマンドとして指定します。#S はセッション名、#W はウィンドウ名です。tmux new -s api-refactor のようにセッションに名前を付けておけば、通知を見るだけでどこに戻ればよいかわかります。notify-send はお使いのプラットフォームのコマンドや push に置き換えてください。セッションを見分ける方法は複数セッションのガイドでほかにも紹介しています。
04デタッチ中:push が必要
デタッチこそ tmux を使う理由です。長いタスクを開始し、デタッチして席を離れます。Claude Code はデタッチされたセッションで作業を続けます。ただしこの時点で、エスケープシーケンスやベルを表示する terminal は存在しません。また tmux サーバーを SSH 経由で起動した場合は、デスクトップ通知のコマンドにも届け先がないことがあります。
ネットワークリクエストを送る hook なら、誰かがアタッチしているかどうかは関係ありません。push サービスはどれでも使えます。ntfy ガイドや Telegram・Slack・Discord ガイドに、そのまま貼り付けられる hook があります。ただしこれらは何かが起きたことを知らせるだけで Claude に応答はできないため、許可プロンプトは tmux attach -t api-refactor で再アタッチするまで待ったままになります。
05Claude Code Notifier の位置づけ
Claude Code Notifier は Claude Code の hook を利用した独立したツールです(Anthropic ではなく TouchTap が開発)。無料のコマンドラインツール ccn は Mac、Windows、Linux で動作します。terminal ではなく Claude Code に hook するため、tmux、screen、素のシェルのいずれでも、アタッチ中でもデタッチ中でも同じように動きます。
curl -fsSL https://claudecodenotifier.com/install.sh | sh
デスクトップマシンでは、Claude の完了時、許可が必要なとき、質問が来たときにデスクトップ通知を表示します。スマートフォンをペアリングすると、同じイベントが TouchTap の暗号化リレーを経由して push 通知として届きます。SSH で接続したサーバーも含め、ccn が動くどのマシンからでも受け取れます。
デタッチ中のセッションで生じる空白は、スマートフォンが埋めてくれます。許可リクエストが来たら、スマートフォンから「今回だけ許可」「このセッション中は許可」「拒否」を選べ、再アタッチしなくても Claude は作業を続けます。Claude の質問には回答を選べ、完了したらすぐに次の指示を送れます。直近 30 秒以内に入力していれば、スマートフォンを待たずに terminal が通常どおり確認します。席を外している場合は、設定した上限時間(hold_ceiling_seconds)まで terminal がスマートフォンからの応答を待ち、キーボードに触れた瞬間に待機をやめます。
スマートフォンのペアリング、長時間タスク中に席を外す、ccn のページもご覧ください。スマートフォンアプリにはサブスクリプションか買い切りの購入が必要です。詳しくは料金をご覧ください。
06GNU screen
この点では screen も tmux とほぼ同じです。Anthropic の hooks リファレンスによると、hook の terminalSequence 出力は screen の中でも動作し、表示していないウィンドウでベルが鳴ると screen がメッセージを表示します。デタッチした screen セッションにも、デタッチした tmux と同じ問題があります。画面に何も表示されないので、push を使ってください。
07よくある質問
tmux の中で Claude Code の通知が表示されないのはなぜですか?
passthrough が有効でない限り、tmux は Claude Code が使うエスケープシーケンスをブロックします。~/.tmux.conf に set -g allow-passthrough on を追加し、tmux source-file ~/.tmux.conf を実行してください。
tmux からデタッチしても Claude Code は動き続けますか?
はい。プロセスは tmux サーバー上で動き続け、hook も引き続き実行されます。届かなくなるのは、アタッチされたターミナルが必要な通知だけです。
デタッチした tmux セッションから通知を受け取るには?
ntfy、チャットの Webhook、Claude Code Notifier のスマホアプリなど、ネットワーク経由で push を送る hook を使ってください。ターミナルのエスケープシーケンスやベルは、アタッチ中のクライアントがないと機能しません。
再アタッチせずに権限リクエストを承認できますか?
単純な push サービスではできません。Claude Code Notifier とペアリング済みのスマホがあれば、スマホからリクエストを許可または拒否でき、デタッチしたセッションはそのまま処理を続けます。
どの tmux セッションが対応を待っているか見分けるには?
セッションに名前を付け、その名前を通知に含めましょう。hook からは tmux display-message -p -t "$TMUX_PANE" '#S:#W' で取得できます。