複数の Claude Code セッションを同時に動かしていると、単なる「Claude needs your attention」という通知では、どのセッションから来たのかわかりません。解決策は、すべての通知にセッションのプロジェクト名やフォルダ名を含めることです。各 hook はセッションの cwd と session_id を JSON で受け取るので、hook でそれを読み取って通知にプロジェクト名を入れられます。claude -n <name> や /rename でセッションにわかりやすい名前を付け、claude --worktree <name> を使えば、同じリポジトリ上の並行セッションがそれぞれ専用のフォルダを持ち、そのフォルダ名が通知に表示されます。
01並行セッションが混乱を招く理由
2〜3 個の Claude Code セッションを並べて動かすのは、今では普通の作業スタイルです。1 つはバグ修正、1 つはテスト作成、1 つはリファクタリングの検討、といった具合です。各セッションはそれぞれのペースで止まります。起きる問題はいつも同じです。
- 通知が来ても、どの terminal タブから来たのかわからない。
- 別のセッションを見ている間に、あるセッションが 20 分も許可の prompt で待たされている。
- 間違ったウィンドウで応答してしまう。
どれも結局は識別の問題です。すべての通知に発信元が示され、すべての応答が確認を求めたセッションに返る必要があります。
02まずセッションをきちんと分離する
同じリポジトリには worktree を使う
同じチェックアウトを 2 つのセッションが編集すると、互いの変更を壊してしまいます。Claude Code の --worktree フラグ(短縮形は -w)を使うと、独立した git worktree を作成し、その中でセッションを開始します。
claude --worktree feature-auth
claude --worktree fix-login
デフォルトでは、各 worktree はリポジトリのルートにある .claude/worktrees/<name>/ に、worktree-<name> という新しいブランチで作成されます。各コマンドはそれぞれ別の terminal で実行してください。worktree が未追跡ファイルとして表示されないよう、.claude/worktrees/ を .gitignore に追加しておきましょう。
終了時に Claude Code は worktree をチェックします。変更がなく、セッションに名前を付けていなければ、Claude Code は worktree とそのブランチを削除します。それ以外の場合は残すかどうかを確認されます。残した worktree に後で戻るには、終了時に表示される claude --worktree <name> --resume コマンドを実行します。worktree を自分で管理したい場合は git worktree add ../project-feature-a -b feature-a でもかまいません。そのフォルダ内で claude を起動してください。
通知にとってうれしい副次効果として、各セッションが feature-auth のような専用のフォルダ名を持つようになります。これこそ通知に表示したい情報です。
セッションに名前を付ける
名前を付けておくと、セッションを探したり再開したりしやすくなります。
claude -n auth-refactor
実行中のセッション内では /rename auth-refactor で同じことができ、名前が prompt バーに表示されます。後から claude --resume auth-refactor を実行すれば、すぐにそのセッションに戻れます。セッション選択画面(名前なしの claude --resume)では、Ctrl+W で一覧をリポジトリのすべての worktree に広げられます。
03自作の通知すべてにプロジェクト名を入れる
すべてのコマンド hook は、標準入力から全イベント共通のフィールドを含む JSON を受け取ります。session_id、cwd、transcript_path、hook_event_name などです。worktree セッションでは cwd は worktree のルートで、Claude がディレクトリを移動すればそれに追従します。hook でこれを読み取り、パスの最後の部分をラベルとして使いましょう。
Mac と Linux では、次の内容を ~/.claude/hooks/notify-session.sh として保存し、chmod +x で実行可能にします。jq が必要です。
#!/bin/sh
input=$(cat)
project=$(basename "$(printf '%s' "$input" | jq -r '.cwd')")
event=$(printf '%s' "$input" | jq -r '.hook_event_name')
case "$event" in
Stop) msg="Claude has finished" ;;
*) msg="Claude needs you" ;;
esac
notify-send "Claude Code: $project" "$msg"
Mac では、macOS ガイドのように最後の行を osascript による通知に置き換えてください。Windows では、同じ JSON を PowerShell の ConvertFrom-Json で読み取ります。完全な例は Windows ガイドにあります。
次に、必要なイベントに対して ~/.claude/settings.json で登録します:
{
"hooks": {
"Stop": [
{ "hooks": [{ "type": "command", "command": "~/.claude/hooks/notify-session.sh" }] }
],
"Notification": [
{ "matcher": "permission_prompt", "hooks": [{ "type": "command", "command": "~/.claude/hooks/notify-session.sh" }] }
]
}
}
パスについて注意点が2つあります。フォルダ名にはスペースが含まれることがあるため、"$input" のように変数はクォートしてください。また、${CLAUDE_PROJECT_DIR} でスクリプトを参照する場合、Claude が worktree に移動した後もこの値はセッション開始時のフォルダのままです。現在のフォルダが必要なときは、入力の cwd を読み取ってください。
tmux を使っている場合は、フォルダよりも pane や window の方がラベルとして適していることがよくあります。正しい pane を見つけて切り替える方法は tmux ガイドで紹介しています。
04難しいのは、正しいセッションに応答すること
ラベル付きの通知があれば、どのセッションが待っているかはわかります。それでも応答するには、その terminal まで行かなければなりません。セッションが3つあれば、正しいタブを探し、prompt までスクロールして入力することになります。自作の hook では応答を送り返すのは簡単ではありません。Claude Code に判断を返せるのは、そのセッション内で待機している hook だけだからです。
このギャップを埋めるのが Claude Code Notifier です。Anthropic 製ではない独立したツールです。コマンドラインツール ccn は Mac、Windows、Linux で Claude Code の hook としてインストールされるため、セッションごとの設定なしに、どの terminal で始めたセッションもすべて対象になります。各通知にはプロジェクト名とフォルダが含まれるので、iPhone や Android スマートフォンでどのセッションからの通知かがわかります。リクエストを送った hook 自体が応答を待っているため、スマートフォンからの承認、選択、追加の指示は、尋ねてきたセッションにそのまま返ります。
複数セッションを扱う際に重要なポイント:
- 複数のコンピューター。1台のスマートフォンを複数のコンピューターとペアリングでき、1台のコンピューターを複数のスマートフォンとペアリングすることもできます。
ccn devicesで、このコンピューターとペアリング済みのスマートフォンを一覧できます。 - 在席検知。直近30秒以内に入力していれば、スマートフォンの応答は待たず、いつもどおり terminal で確認されます。離席中は、設定した上限時間(
hold_ceiling_seconds)までスマートフォンからの応答を待ち、キーボードに触れた時点で待機をやめます。 - スマートフォンなしのデスクトップ通知。スマートフォンをペアリングする前でも、
ccnはいずれかのセッションが完了したとき、権限が必要なとき、質問があるときにコンピューター上でデスクトップ通知を表示します。
一度に1つのセッションしか実行せず、ずっとデスクにいるなら、ラベル付きのデスクトップ通知だけで十分でしょう。各選択肢は比較ガイドで並べて紹介しています。
05よくある質問
どの Claude Code セッションから通知が来たかを見分けるには?
hook の JSON 入力から cwd フィールドを読み取り、フォルダ名を通知のタイトルに入れます。worktree を使えば各セッションが専用のフォルダを持つので、名前はセッションごとに異なります。Claude Code Notifier のようなツールなら、各通知にプロジェクト名とフォルダが自動で含まれます。
同じリポジトリで2つの Claude Code セッションを実行できますか?
できます。ただし、編集が衝突しないようにそれぞれ専用の worktree を用意してください。claude --worktree <name> を実行すると、.claude/worktrees/<name>/ 以下に新しいブランチで worktree が作成され、そこでセッションが開始されます。
Claude Code のセッションに名前を付けるには?
claude -n <name> で起動するか、セッション内で /rename <name> を実行します。後から claude --resume <name> で再開できます。
hook はセッションごとに個別に実行されますか?
はい。各セッションはイベント発生時に自身の hook を実行し、そのセッションの session_id と cwd を入力として渡します。~/.claude/settings.json の hook は、起動するすべてのセッションに適用されます。
複数のコンピューターからの通知が混ざることはありますか?
ccn なら混ざりません。各コンピューターは個別にスマートフォンとペアリングされて固有の名前を持ち、各通知には送信元のプロジェクトが含まれます。