会话一多,人就变成了「切窗口的人」
一个 Claude Code 在改前端,一个在跑测试,一个在整理文档,还有一个在等你批准一条命令。并行本来是为了省时间,结果很多人发现:大部分精力花在了来回切窗口看谁在干活、谁卡住了上。
常见的几种情况:
- 等确认却没人看:某个会话弹出权限确认,停在那里半小时,你以为它还在跑。
- 早就跑完了:任务结束后会话安静地等下一句指令,你却还在等它「出结果」。
- 真卡住了:命令挂死或在等网络,窗口看起来和「正在思考」差不多。
- 记不清哪个窗口是哪个项目:tmux 里一排
0、1、2,每次都要进去看一眼。
解决思路很简单:让每个会话自己报告状态,你只看一张汇总表。下面的做法全部在一台常开的 Mac mini 上完成,不依赖额外服务。
准备清单
- 一台常开的 Mac mini(整机独享),已装 Claude Code,并用你自己的账号登录
tmux(brew install tmux)和jq(brew install jq),后者用来解析 hook 收到的 JSON- 日常用 SSH 进机器,需要图形界面时用 UU 远程连接
- 多个会话改同一个仓库时,先按 git worktree 并行 把目录隔开
步骤一:一个任务一个 tmux 会话,名字就是项目
先把「窗口编号」换成「人能看懂的名字」:
- 每个任务单独开一个会话:
tmux new -s web-fix、tmux new -s api-test、tmux new -s docs。 - 在会话里进入对应目录再启动 Claude Code,让「会话名 = 项目或任务」。
- 看全部会话用
tmux ls,切换用tmux switch -t api-test,或者在 tmux 里按前缀键加s打开会话列表。
光这一步,就能告别「2 号窗口是哪个来着」。但 tmux ls 只告诉你会话在不在,不告诉你 Claude Code 在干什么,所以还需要下一步。
步骤二:用 hooks 让每个会话自己写状态
Claude Code 的 hooks 会在特定时刻运行你指定的命令,并通过标准输入传入一段 JSON,其中包含 session_id、cwd 等字段。我们只用四个事件:
UserPromptSubmit:你发出指令,记为「工作中」Notification:Claude Code 需要你确认权限或在等输入,记为「等你」Stop:这一轮回答结束,记为「已停下」SessionEnd:会话退出,删除这条记录
做法如下:
- 新建脚本
~/.claude/hooks/status.sh,第一行写#!/bin/bash,再用chmod +x加执行权限。 - 脚本逻辑只有几行:第一个参数是状态(
working、waiting、idle、end);用input=$(cat)读入 JSON,再用jq -r '.session_id'和jq -r '.cwd'取出会话 ID 和目录。 - 用
tmux display-message -p '#S'取当前 tmux 会话名(不在 tmux 里就记成-)。 - 把「时间、状态、tmux 会话名、目录」用制表符连成一行,覆盖写入
~/.claude-status/<session_id>;状态是end时直接删掉这个文件。 - 脚本最后
exit 0。状态记录只是辅助信息,写失败也不能挡住 Claude Code 正常工作,所以不要在这里返回会拦截操作的退出码。 - 在
~/.claude/settings.json的hooks里,为上面四个事件各挂一条type为command的命令,例如UserPromptSubmit对应~/.claude/hooks/status.sh working,Notification对应~/.claude/hooks/status.sh waiting,以此类推。
写在用户级 settings.json 里,这台 Mac mini 上所有项目的会话都会自动上报,不用每个仓库各配一遍。改完后开一个新会话,发一句话,再看 ~/.claude-status/ 下有没有出现文件,确认生效。
步骤三:一条命令看完所有会话
再写一个汇总脚本,比如 ~/bin/ccs:
- 把
~/.claude-status/下所有文件的内容合起来,按状态排序,用column -t对齐输出。这样「等你」的会话排在一起,最先处理。 - 加一条「可能卡住」判断:状态是「工作中」、但文件超过 20 分钟没更新的,用
find ~/.claude-status -mmin +20找出来,单独标注。阈值按你的任务长短调整,跑大型测试的项目可以放宽。 - 顺手清理残留:会话异常退出时
SessionEnd可能来不及触发,超过一天没更新的文件可以直接删掉。
现在只要 SSH 上去敲一次 ccs,就能看到类似「web-fix 等你、api-test 工作中、docs 已停下」的一张表,而不是挨个 attach 进去看。
步骤四:把「等你」的数量放进 tmux 状态栏
如果你习惯一直挂在 tmux 里,可以让状态栏常驻显示待处理数量:
- 写一个小脚本
~/bin/ccs-count,统计状态为「等你」和「可能卡住」的条数,输出类似等你:1 卡住:0。 - 在
~/.tmux.conf里加上set -g status-right '#(~/bin/ccs-count)'和set -g status-interval 15,执行tmux source ~/.tmux.conf生效。
这样不管你停在哪个会话里,右下角都会提醒还有几个会话在等你。需要离开电脑时的手机推送,可以接着看 手机 SSH 接管与完成通知 那篇,把 Notification 事件再接一条推送。
为什么要放在常开的 Mac mini 上
这块状态板有用的前提是:会话一直在,状态文件一直在更新。放在笔记本上,合盖、断网、换地方,会话一断,状态表就成了过期信息。
更稳的分工是:
- 多个 Claude Code 会话、仓库和状态文件都放在常开的新加坡整机独享 Mac mini 上。
- 你的笔记本或手机只负责 SSH 或 UU 远程连接进去看
ccs、处理「等你」的那几个。 - 机器本身要防休眠,否则「工作中」其实是被系统挂起了,可以配合 pmset 睡眠审计与心跳 一起用。
- 每台机器一个固定专属地址,浏览器即可 SSH / VNC,换设备也能接着看同一张表。
建议验收清单
- 每个任务都在命名 tmux 会话里运行,
tmux ls能一眼看出谁是谁。 - 新开会话发一句指令后,
~/.claude-status/出现对应文件,状态为「工作中」。 - 触发一次权限确认,状态变为「等你」;回答结束后变为「已停下」;退出会话后记录消失。
- 故意让一个会话超过阈值没有动静,
ccs能把它标成「可能卡住」。 - 状态脚本出错时 Claude Code 照常工作,没有被 hook 拦住。
和 Zumac.Ai 怎么配合
多会话并行最需要的是一台不关机、不合盖、能随时连回去的机器。Zumac.Ai 提供位于新加坡家庭宽带上的实体 Mac mini,整机独享(一人一台物理机),支持 SSH 与 UU 远程连接,适合把多个 Claude Code 会话和这块状态板长期挂着。新客户整机租用 ¥999/月起(季付 ¥2,697.30,半年付 6 送 1 ¥5,994,年付 12 送 2 ¥11,988);已购买客户续费保持原价。订购与开通走 panel.zumac.ai;方案说明见 首页费用区;使用问题见 帮助中心。需要人工协助可联系 Telegram @singatao。实际延迟取决于你本地的网络线路。
让会话自己报告状态,你只处理真正需要你的那几个——并行才真的省时间。
