同時執行多個 Claude Code session 時,單純一句「Claude 需要你的注意」並不夠,因為你無法分辨是哪個 session 發出的。解法是在每則通知中加上 session 的專案或資料夾。每個 hook 都會以 JSON 收到該 session 的 cwd 和 session_id,你的 hook 可以讀取它們,把專案名稱放進通知。用 claude -n <name> 或 /rename 為 session 取清楚的名稱,並使用 claude --worktree <name>,讓同一個 repository 上的平行 session 各自擁有資料夾,資料夾名稱也會顯示在通知中。
01為什麼平行 session 容易搞混
並排執行兩三個 Claude Code session 已是常見的工作方式:一個修 bug、一個寫測試、一個嘗試重構。每個 session 各自在不同時間停下來,問題也總是那幾個:
- 收到通知卻不知道來自哪個 terminal 分頁;
- 你盯著某個 session 時,另一個已經在權限 prompt 上等了二十分鐘;
- 你在錯的視窗回覆。
這三個問題歸根究柢都是識別問題。每則通知都應說明來源,每個回覆都應送回發問的 session。
02先把 session 好好分開
同一個 repository 請使用 worktree
兩個 session 編輯同一份 checkout 會互相覆蓋變更。Claude Code 的 --worktree 旗標(簡寫 -w)會建立隔離的 git worktree,並在其中啟動 session:
claude --worktree feature-auth
claude --worktree fix-login
預設情況下,每個 worktree 會建立在 repository 根目錄的 .claude/worktrees/<name>/ 底下,位於名為 worktree-<name> 的新分支。每個指令請在各自的 terminal 中執行。將 .claude/worktrees/ 加進 .gitignore,以免 worktree 顯示為未追蹤的檔案。
離開時,Claude Code 會檢查 worktree。如果沒有變更且你從未為 session 命名,Claude Code 會移除該 worktree 及其分支;否則會詢問是否保留。之後要回到保留的 worktree,執行離開時顯示的 claude --worktree <name> --resume 指令即可。如果你想自己管理 worktree,也可以用 git worktree add ../project-feature-a -b feature-a,再到該資料夾中啟動 claude。
對通知來說還有個好處:每個 session 現在都有自己的資料夾名稱,例如 feature-auth,正好適合放在通知裡。
為 session 命名
有了名稱,session 就容易找到和恢復:
claude -n auth-refactor
在執行中的 session 裡,/rename auth-refactor 效果相同,名稱會顯示在 prompt 列上。之後執行 claude --resume auth-refactor 就能直接回去。在 session 選擇器中(不帶名稱的 claude --resume),按 Ctrl+W 可將清單擴大到該 repository 的所有 worktree。
03在每則自製通知中標示專案
每個 command hook 都會從標準輸入收到 JSON,內含所有事件共用的欄位,包括 session_id、cwd、transcript_path 和 hook_event_name。在 worktree session 中,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 上,請把最後一行換成 osascript 通知,做法見 macOS 指南。在 Windows 上,用 PowerShell 的 ConvertFrom-Json 讀取同樣的 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" }] }
]
}
}
關於路徑有兩點要注意。像 "$input" 這類變數要加上引號,因為資料夾名稱可能包含空格。另外,如果你用 ${CLAUDE_PROJECT_DIR} 參照腳本,要記得它會固定指向 session 啟動時的資料夾,即使 Claude 之後切換到 worktree 也不會改變。需要目前資料夾時,請從輸入讀取 cwd。
如果你使用 tmux,用 pane 或 window 當標籤通常比資料夾更清楚。tmux 指南說明如何找到並切換到正確的 pane。
04難題:回覆正確的 session
有標籤的通知能告訴你是哪個 session 在等你,但你還是得回到那個 terminal 才能回覆。同時開三個 session 時,就得找到正確的分頁、捲到 prompt 再輸入。自己寫的 hook 很難把你的回覆送回去,因為只有在該 session 中等待的那個 hook,才能把決定回傳給 Claude Code。
Claude Code Notifier 正好補上這個缺口。它是獨立開發的工具,並非 Anthropic 出品。它的命令列工具 ccn 會以 Claude Code hook 的形式安裝在 Mac、Windows 和 Linux 上,因此你啟動的每個 session 都會涵蓋在內,不限 terminal,也不需要逐一設定。每則通知都附有專案名稱和資料夾,讓你在 iPhone 或 Android 手機上就能看出是哪個 session 發出的。由於發出請求的 hook 正是等待你回覆的那一個,你在手機上做的核准、選擇或後續指示,都會送回提出請求的 session。
同時跑多個 session 時,有幾個重點:
- 多台電腦。一支手機可以與多台電腦配對,一台電腦也可以配對多支手機。
ccn devices會列出與這台電腦配對的手機。 - 在場偵測。如果你在最近 30 秒內有輸入,就不會等待手機,terminal 會照常詢問。如果你不在電腦前,session 會等待手機回覆,最長到你設定的上限(
hold_ceiling_seconds),而且只要你一碰鍵盤就會停止等待。 - 沒有手機也能用桌面通知。在配對手機之前,只要任何 session 完成、需要權限或提出問題,
ccn都會在電腦上顯示桌面通知。
如果你一次只跑一個 session,而且人就在桌前,有標籤的桌面通知大概就夠用了。比較指南並列整理了各種選項。
05常見問題
如何分辨通知是哪個 Claude Code session 發出的?
從 hook 的 JSON 輸入讀取 cwd 欄位,再把資料夾名稱放進通知標題。使用 worktree 時,每個 session 都有自己的資料夾,所以名稱不會重複。像 Claude Code Notifier 這類工具會自動在每則通知中附上專案名稱和資料夾。
可以在同一個 repository 中跑兩個 Claude Code session 嗎?
可以,但要讓每個 session 使用各自的 worktree,以免修改互相衝突。claude --worktree <name> 會在 .claude/worktrees/<name>/ 下以新分支建立 worktree,並在那裡啟動 session。
如何為 Claude Code session 命名?
用 claude -n <name> 啟動,或在 session 中執行 /rename <name>。之後可用 claude --resume <name> 繼續。
每個 session 的 hook 是分開執行的嗎?
是的。每個 session 在事件觸發時會執行自己的 hook,並在輸入中傳入該 session 的 session_id 和 cwd。~/.claude/settings.json 中的 hook 會套用到你啟動的每個 session。
不同電腦的通知會混在一起嗎?
使用 ccn 就不會。每台電腦都分別與手機配對並有自己的名稱,每則通知也會標明來自哪個專案。