Claude Code 会话现在能互相发消息了:v2.1.224 跨会话协作完整上手

AIClaude CodeDeveloper ToolsWorkflow

本文整理改写自 Joe Njenga 的实践分享 "Claude Code Sessions Can Now Talk to Each Other"。保留技术操作骨架,删去了与功能本身无关的素材。

并行跑多个 Claude Code 会话,是当下最快的交付方式之一——一个写 API,一个写调用它的前端。但在此之前,每个会话都是完全隔离的:要么靠人肉复制粘贴上下文,要么依赖终端里各种 hack 凑合,从来没有官方方案。

Claude Code v2.1.224 把这个问题正式解决了:会话之间现在可以直接发消息。下面把整套功能拆给你看,最后在 WSL 里跑一个真实的双会话协作演示。

什么是跨会话消息?

跨会话消息功能只依赖两个新工具,Claude 可以自主调用:

  • ListAgents:列出当前所有可达的运行中会话
  • SendMessage:按名称向某个会话发送消息

消息内容只能是纯文本,由 Claude 自己写好后发出去。接收方的 Claude 在当前工作过程中或下一轮开始时会读到这条消息。注意:接收方只会拿到这段文本,不会包含发送方的对话历史或项目文件。

你可以手动触发这两个工具,Claude 也会根据自己的判断决定什么时候用。

有四件事这个工具做不到:

  • 不能替你批准接收方会话里待审批的权限请求
  • 不能修改接收方会话的配置或 CLAUDE.md
  • 不能执行 /compact 这类斜杠命令
  • 不能跨会话传递对话历史或项目文件

跨会话消息演示

平台要求

跨会话消息需要 Claude Code v2.1.224 或更高版本,目前只支持 macOS、Linux 以及 WSL 2 里的 Linux。原生 Windows(没装 WSL)暂不支持。

先查一下当前版本:

bash
claude --version

查看版本

低于 v2.1.224 的话先升级:

bash
claude update

升级 Claude Code

升到正确版本之后,跨会话消息功能默认就开启了——Claude Code 会在每个会话启动时自动绑定消息收件箱的 socket,什么都不需要手动启用。

在 WSL 里开两个会话

这次演示在 Windows Terminal 里用分屏功能同时跑两个会话,每个会话对应不同的项目目录,这正是跨会话消息发挥价值的典型场景。

把 Windows Terminal 的 WSL 界面分成两个垂直窗格:

bash
Alt + Shift + Plus

分屏操作

现在你有两个独立的终端窗格,都运行在同一个 WSL 环境里。

左侧窗格:进入第一个项目目录,启动第一个会话并起一个可读的名称:

bash
cd ~/projects/my-api
claude --name api-session

启动 api-session

右侧窗格:进入第二个项目目录,启动第二个会话:

bash
cd ~/projects/my-frontend
claude --name frontend-session

启动 frontend-session

--name 参数很关键——它给会话一个可读的标签,而不是自动生成的 myapp-3f 这种随机串。Claude 发消息时是按会话名称寻址的,名字清晰才能一眼看出哪条消息是谁发来的。

如果会话已经启动了,也可以在会话内用 /rename 重命名:

bash
/rename api-session

重命名会话

确认两个会话可以互相发现

在任意一个会话里运行 /list-agents,确认两个会话互相可见:

bash
/list-agents

列出所有代理

你应该能看到另一个正在运行的会话,包括它的名称和工作目录:

列出代理的输出

如果某个会话没出现在列表里,最常见的原因有三个:

  • 会话是用 -p 参数以非交互模式启动的——这种情况下不会绑定收件箱 socket
  • 你的 shell 里设置了 CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFICDISABLE_TELEMETRYDO_NOT_TRACK 环境变量,这会禁用该功能依赖的特性开关
  • 版本还低于 v2.1.224

也可以在任意会话里运行 /status 看自己的对端地址:

bash
/status

status 输出

关注输出里的 Peer address 行,旁边有 uds: 路径就说明会话已注册,可以正常接收消息。两个会话都出现在列表里之后,配置就完成了。

实战演示:API + 前端协调一次破坏性变更

两个会话都跑起来了,互相也能看到对方。现在让它们真正干活,触发第一条跨会话消息。

演示场景

  • api-session:在开发一个 Node.js Express API,正在做数据库 schema 迁移——把整个代码库里的 user_email 列名改成 email_address
  • frontend-session:在构建一个 React 仪表盘,调用同一个 API 并读取每条用户响应里的 user_email 字段

演示场景设置

这两个会话完全不知道对方在做什么——而这正是我们要解决的问题。

第一步:给每个会话下达任务

在左侧窗格(api-session)里输入:

text
We are migrating the user schema. Rename the user_email column to email_address
in the User model, update all database queries that reference it, and update
the API response serializer. This is a breaking change for any consumers
of this API.

在右侧窗格(frontend-session)里输入:

text
Build a UserDashboard component that fetches all users from GET /api/users
and displays their user_email field in a data table with sorting and pagination.

让两个会话各自开始工作。

两个会话开始工作

第二步:消息发出去了

api-session 在做迁移的过程中识别到这是一个破坏性变更,Claude 会主动向 frontend-session 发出警告。

如果没有自动发送,在 api-session 里用下面这个提示词手动触发:

手动触发提示词

观察左侧窗格里发生了什么:Claude 先调用 ListAgents 找到 frontend-session,然后写一条总结列名变更的消息,用 SendMessage 发出去。两个会话就这样一直互相协作,直到任务完成。

会话协作总结

四个值得记住的使用场景

演示展示的是最基础的用法,但跨会话消息能解锁的场景远不止于此。

1. 传递重要发现

当某个会话发现了对另一个会话很重要的信息(比如依赖冲突),你可以让 Claude 把它传过去。

text
Tell the api-session what you just found about the rate limiting behavior
and how it affects any session that calls the payment endpoint

Claude 会写一段精准的总结并发出去。

2. 协调并行 Worktree

git worktree 在同一个仓库里跑多个 Claude Code 会话时,每个会话在自己的工作目录里操作独立的分支——它们同时推进,但对彼此在做什么完全不知情。

bash
git worktree add ~/projects/my-app-feature feature/payments
git worktree add ~/projects/my-app-refactor refactor/user-model
 
# 左侧窗格
cd ~/projects/my-app-feature
claude --name payments-session
# 右侧窗格
cd ~/projects/my-app-refactor
claude --name refactor-session

refactor-session 改完 User model 后,这样告诉它:

text
Message the payments-session and tell it what changed in the User model
so it can update its payment flow accordingly before running

payments 会话会收到 refactor 分支上变更的精准摘要,然后更新自己这边的代码。

3. 查询长任务的执行状态

在某个会话里启动了一个重任务(比如完整的数据库迁移),可以切回另一个会话继续干别的活。

启动时告诉长任务做完汇报一声:

text
Run the full database migration and when it finishes, message the
api-session with the result. Include whether it succeeded, how many
records were affected, and any warnings that came up

迁移完成后,那个会话会向 api-session 发一条简洁的状态消息。

4. 跨机器回复

当你在两台不同的机器上都运行了 Claude Code 并连接了 Remote Control,机器 B 上的会话可以发消息到机器 A。

关键限制:跨机器消息从接收方来看只能回复,不能主动发起——机器 A 可以回复收到的消息,但不能主动向机器 B 发起一段新的对话。

实际使用场景:用工作笔记本查一下家里电脑上跑着的任务进展:

text
Reply to the migration session on my other machine and ask it for
a current status update on where the job stands

还有一个值得记住的细节:同一台机器上的消息走的是本地 Unix socket,不会经过 Anthropic 的服务器

控制选项、限制与可用范围

基于这个功能构建正式工作流之前,有几个开关和硬限制需要提前了解清楚。

入站设置:accept / hold / refuse

每个会话可以通过 crossSessionInbound 设置来控制如何处理收到的消息,有三个选项:

选项行为
acceptClaude Code 把每条收到的消息直接交给 Claude 处理
holdClaude Code 为每条消息显示通知,但不会直接投递,需要你手动批准
refuseClaude Code 丢弃所有收到的消息,发送方不会收到任何通知

在项目或用户配置文件里加上这一行来设置:

json
{
  "crossSessionInbound": "hold"
}

没有配置的情况下,默认行为取决于你的权限模式——跳过权限提示的会话会把消息暂存等待你批准,正常弹出权限提示的会话会直接投递。

要求批准跨机器消息

如果想把所有会话协调限制在本机,要求任何跨机器的消息在发出前都必须得到你的明确批准,把 isolatePeerMachines 设为 true

json
{
  "isolatePeerMachines": true
}

开启后,即使在跳过其他所有权限提示的会话里,发往其他机器的消息也需要你明确批准才会发出。

完全关闭这个功能

要阻止某个会话接收消息,把 crossSessionInbound 设为 refuse。要阻止某个会话发送消息或发现其他代理,给两个工具都加上拒绝规则:

json
{
  "permissions": {
    "deny": ["SendMessage", "ListAgents"]
  },
  "crossSessionInbound": "refuse"
}

限制条件

限制说明
待读取消息上限每个会话最多 50 条待读取消息,超过的会被丢弃
消息去重同一发送方在短时间内发来的相同消息会被自动去重,会话之间的消息循环会自动停止
仅纯文本不支持结构化数据传输、文件共享、对话历史
跨机器单向跨机器消息接收方只能回复,不能主动发起

可用范围

并非所有服务商都支持跨会话消息。通过以下任意渠道使用 Claude Code 时,该功能不可用:

  • Amazon Bedrock
  • AWS 上的 Claude Platform
  • Google Cloud 的 Agent Platform
  • Microsoft Foundry

原生 Windows(没有 WSL)同样不支持。

小结

跨会话消息把 Claude Code 从"一个隔离的终端工具"推进了一步。结合子代理、worktree 这些已有的能力,它正在变成一个有协调能力的智能体系统。

几个值得记住的要点:

  • --name/rename 给会话起个有意义的名字,Claude 发消息时才能准确寻址
  • 发消息之前先跑 /list-agents 确认双方互相可见
  • Claude 自主使用两个工具处理协调:ListAgents 发现其他会话,SendMessage 投递消息
  • 消息只能是纯文本,不能传文件、对话历史,也不能批准待审批的权限
  • 同机器消息走本地 socket,不经过 Anthropic 服务器;跨机器消息会经过 Anthropic 服务器
  • 如果 /list-agents 没有返回任何内容,检查 shell 里是否设置了 DO_NOT_TRACKDISABLE_TELEMETRYCLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC

参考资料

评论

登录后参与评论 登录

加载中…

返回博客列表