CLI WeChat Bridge

命令行工具的微信桥接:本项目将微信消息桥接到本地运行的 CodexClaude CodeOpenCodePi,同时把本地输出、审批请求与运行状态同步回微信。

项目围绕本地工作流设计,重点是保留本地原生终端体验:你仍然在本地使用原生 CLI 和高级启动参数,微信负责远程输入、结果回流与状态同步。

文档导航

  • 问题排查:上下文 token、网络代理、本地 endpoint、已知限制等常见问题。
  • 运行配置:数据目录、上传大小限制、调试开关等环境变量。
  • 开发说明:源码运行、测试、构建、打包和全局 smoke 验证。
  • 发布说明:各版本变更与升级说明。
  • 通信架构:各 CLI 适配器的通信机制、PTY / RPC 依赖分析和技术决策。

这个项目解决什么问题?

本项目适合这样的使用场景:

  • 你的主工作流仍在本地终端中进行;
  • 你希望继续使用 Codex、Claude Code、OpenCode、Pi 等原生 CLI,而不是迁移到网页或托管机器人;
  • 你希望离开电脑后,仍能通过微信向本地会话发送请求,并接收必要输出和状态更新。

本项目不试图把微信变成新的主工作界面。它的定位是:

  • 本地 CLI 仍然是主工作界面,并保持原生的使用逻辑;
  • 微信是远程入口,用来接入本地会话;
  • 会话一致性、线程状态和审批流仍以本地会话为中心

快速开始

1. 环境要求

  • Node.js >= 24.0.0(建议直接安装官网 LTS 版本)
  • 已安装以下任意一种本地 CLI,并尽量保持最新版本:

2. 安装

发布版本可以直接从 npm 安装:

npm install -g cli-wechat-bridge@latest

安装后,可以在任意项目目录中直接运行 wechat-codexwechat-claudewechat-opencodewechat-pi,或使用 wechat-daemon 保持长期连接。

兼容性说明:旧包名 @unlinearity/cli-wechat-bridge 会继续同步发布,已经安装旧包名的用户可以正常升级;新用户优先使用更短的 cli-wechat-bridge

本项目使用 node-pty 为 CLI 适配器提供完整终端模拟。Claude Code 适配器当前通过 PTY 交互模式工作,node-pty 不可用时会回退到兼容模式,但 Claude Code 在此模式下可能无法正常桥接;Codex 适配器主要通过 WebSocket RPC 通信,通常不受影响;OpenCode 适配器不依赖 node-pty;Pi 直接继承可见 companion 的真实终端,也不需要 node-pty 模拟。

Linux 用户(最常见):需要原生模块编译工具:

# Debian / Ubuntu
sudo apt install build-essential python3
# RHEL / Fedora
sudo dnf groupinstall "Development Tools" && sudo dnf install python3
# Alpine
apk add build-base python3

安装编译工具后重新安装:npm install -g cli-wechat-bridge@latest

macOS 用户:如遇编译问题,安装 Xcode 命令行工具:xcode-select --install

Windows 用户

  • 需要 Windows 10 1809(build 18309)或更高版本
  • 如果 node-pty 加载失败,运行 npm rebuild node-pty 或重新安装
  • 确保已安装 Visual C++ Redistributable

运行 wechat-daemon --doctor 可快速检查环境状态。详见 问题排查

3. 完成微信登录

全局安装后运行:

wechat-setup

登录流程会:

  1. 获取微信登录二维码;
  2. 在终端打印二维码;
  3. 等待你在微信中扫码并确认;
  4. 保存本地登录凭据。

微信登录二维码

登录成功后,程序会清理旧的同步游标和上下文 token,避免旧会话状态污染新的登录状态。数据目录、状态文件和旧版本迁移说明见 问题排查

首次安装或微信登录过期时,四个直接启动命令也会在前台提示扫码登录。

4. 先从微信发一条同步消息(重要)

启动 bridge 后,建议先在微信里向 Bot 发送一条消息,例如 hello、你要执行的任务,或任意一句话。这样 bridge 能拿到最新的微信会话 context_token,之后本地终端中的输入、最终回复和审批提示才能稳定同步回微信。

如果冷启动或长时间闲置后直接从本地终端先发消息,bridge 通常仍会捕获这条本地输入并交给 Codex / Claude Code / OpenCode / Pi 处理,但回发到微信时可能因为旧的 context_token 失效而失败。表现是:本地已经有回复,微信暂时收不到;等你先从微信发来一条消息后,后续双向同步就能恢复正常。

5. 直接启动本地 CLI

先进入需要操作的项目目录:

cd D:\work\your-project

然后选择一个单命令入口:

使用的本地 CLI 启动命令
Codex wechat-codex
Claude Code wechat-claude
OpenCode wechat-opencode
Pi wechat-pi

这些命令会自动完成以下动作:

  1. 校验或刷新微信登录凭据;
  2. 如果当前目录已有 wechat-daemon,则委托 daemon 切换到对应 CLI;
  3. 如果没有 daemon,则创建或复用内部 transient bridge runtime;
  4. 如果旧 runtime 正在服务其他目录,则安全停止旧 runtime 并切换到当前目录;
  5. 等待当前目录对应的本地 endpoint 就绪;
  6. 打开可见的本地 CLI 会话。

没有 daemon 时,四个直接命令按单活工作区切换器工作:

  • 同一时间只有一个项目与微信对话;
  • Codex 在当前目录重复执行时会复用已有会话;Claude Code、OpenCode 和 Pi 启动器默认新建会话;
  • Pi 如需显式恢复上一次会话,可使用 wechat-pi --session-start-mode restore
  • 如果当前目录已经有可见 companion / panel 在运行,则不会重复打开第二个窗口;
  • 如果检测到可见端仍在运行但 worker 状态异常(如 stopped / error),会自动重启 bridge 再重新打开可见端;
  • 在其他目录执行会显式切换活动工作区。

wechat-codex-startwechat-claude-startwechat-opencode-startwechat-pi-start 暂时保留为过渡别名,功能与直接命令一致,但会输出弃用提示,并将在下一版本移除。

6. 常驻 daemon 模式(支持多 CLI 切换)

如果你希望微信连接长期保持在线,并在 Codex / Claude Code / OpenCode / Pi 之间来回切换,可以在项目目录启动统一 daemon:

cd D:\work\your-project
wechat-daemon

启动后,在微信里发送以下指令即可选择当前活动终端:

指令 行为
/codex [prompt] 切换到 Codex;携带 prompt 时切换后立即转发剩余文本
/claude [prompt] 切换到 Claude Code;携带 prompt 时切换后立即转发剩余文本
/opencode [prompt] 切换到 OpenCode;携带 prompt 时切换后立即转发剩余文本
/pi [prompt] 切换到 Pi;携带 prompt 时切换后立即转发剩余文本

daemon 启动后,后续切换都可以直接从微信发起;如果对应 CLI 还没有可见窗口,daemon 会自动打开或复用它,不需要再手动运行 wechat-codexwechat-claudewechat-opencodewechat-pi

多CLI 示例

当前 daemon 行为如下:

  • daemon 绑定启动时的工作目录;暂不支持在微信里切换工作目录;
  • 启动时会自动接管并清理旧的单 bridge 进程、失效 lock 和旧 endpoint;
  • 切换适配器不会关闭之前的 CLI;
  • 如果对应适配器已经有可见 CLI 在运行,则直接复用;
  • 如果还没有对应 CLI,daemon 会自动打开一个新的可见终端;
  • 如果当前活动 CLI 的本地窗口被关闭,下一条普通微信输入会自动重开可见终端;Codex 会重置旧 runtime 的残留 busy/turn 状态并建立新的可见 thread;
  • Codex / Claude / OpenCode / Pi 的重要输出都会带上 [codex][claude][opencode][pi] 标签再发回微信;
  • 可以在微信里发送 /daemon-stop 停止 daemon。

也可以在启动时指定初始 CLI:

wechat-daemon --adapter codex
wechat-daemon --adapter claude --profile work

当同一工作目录已有 wechat-daemon 在运行时,四个直接启动命令会自动委托给 daemon:请求 daemon 切到对应 CLI,并在需要时打开可见终端,不会停止 daemon 或关闭其他 CLI。

其中 wechat-pi 默认表示启动一个新的 Pi session;如果 Pi TUI 已经可见,daemon 会在现有窗口中创建新 session。微信中的 /pi 仅用于切换适配器,仍会复用已经连接的 Pi TUI。

适配器支持情况

目前支持将本地文件发送到微信,微信也允许发送文件给本地 cli 解析 (注意模型本身要具备处理对应文件的能力!)

文件传输

微信发来的图片和普通文件也会被接收并保存到本地:

  • bridge 会将本地路径追加到转发给 Codex / Claude Code / OpenCode / Pi 的 prompt 中,模型可按需读取或解析这些文件;
  • 当前不会自动 OCR 图片,也不会自动抽取 PDF / DOCX 正文;如需解析,由本地 CLI 根据路径完成。
  • 具体保存位置见 问题排查
适配器 当前状态 说明
codex 已接入 wechat-codex 自动确保内部 runtime 并打开可见 Codex;微信跟随本地 thread
claude 已接入 wechat-claude 自动启动或复用 Claude Code;会话、最终回复与审批按 Claude session 语义同步
opencode 已接入 wechat-opencode 自动启动或复用 OpenCode;支持本地 session 跟随及微信 /new / /new-session
pi 已接入 wechat-pi 启动用户原生 Pi TUI,并通过本地 extension 让微信接管同一 session,支持最终回复、停止、新建和恢复 session

Pi 按全权限本地代理运行:bridge 不增加工具审批层,并传入 --approve 信任当前项目;读写文件和执行命令均使用启动 wechat-pi 的本地用户权限。原生 TUI 的主题、快捷键、模型选择和 extension UI 都会保留。wechat-pi 本身就是被微信接管的 Pi TUI;不要再启动第二个 Pi 进程同时写入同一个 session 文件。

Codex 示例

Codex windows

Codex Linux

Claude Code 示例

Claude Windows

Claude Linux

OpenCode 示例

OpenCode 模式下,微信侧支持 /new/new-session 创建新 session;如果在本地 OpenCode CLI 中创建新 session,微信消息也会跟随新的 session。

命令说明

常用全局命令

类型 命令
登录与更新 wechat-setupwechat-check-update
常驻 daemon wechat-daemon
Codex wechat-codex
Claude Code wechat-claude
OpenCode wechat-opencode
Pi wechat-pi

wechat-*-start 暂时作为弃用别名保留一个版本。公开的 wechat-bridge* 命令和 Shell adapter 已移除;内部 bridge runtime 仍由直接命令和 daemon 自动管理。

Daemon CLI 参数

示例:

wechat-daemon --cwd D:\work\my-project
wechat-daemon --adapter codex
wechat-daemon --adapter claude --profile work

支持参数:

  • --cwd <path>:指定 daemon 绑定的工作目录;
  • --adapter <codex|claude|opencode|pi>:启动 daemon 后立即切换到指定 CLI;
  • --profile <name-or-path>:传给 daemon 创建的对应适配器;
  • --no-open:只创建 runtime slot,不自动打开可见 CLI;
  • --doctor:检查环境、CLI、锁、endpoint 和 daemon 状态。

直接启动命令参数

适用于 wechat-codexwechat-claudewechat-opencodewechat-pi

wechat-codex --cwd D:\work\my-project
wechat-claude --profile work
wechat-opencode --cwd D:\work\my-project
wechat-pi --cwd D:\work\my-project --model openai/gpt-5.6-sol

支持参数:

  • --cwd <path>:指定 runtime 与可见 CLI 对应的工作目录;
  • --profile <name-or-path>:传给内部 runtime;
  • --timeout-ms <ms>:等待当前目录 endpoint 的最长时间,默认 15000
  • --session-start-mode <restore|new>:显式选择恢复或新建会话;
  • 其他未知参数会继续透传给可见的底层 CLI。

默认会话策略:Codex 恢复当前会话;Claude Code、OpenCode 和 Pi 新建会话。

wechat-codex --yolo
wechat-codex --model gpt-5.2 --yolo
wechat-claude --dangerously-skip-permissions
wechat-claude --model sonnet --dangerously-skip-permissions

其中,--yolo 会传给 Codex;--dangerously-skip-permissions 会传给 Claude Code。它们只影响本地可见 CLI,不会覆盖内部 runtime 的连接参数、微信登录状态或工作区锁。由于这两类参数会降低审批保护,建议只在可信工作区中使用。

微信侧支持的指令

指令 说明
普通文本 发送到当前活动会话
/codex [prompt] / /claude [prompt] / /opencode [prompt] / /pi [prompt] daemon 模式下切换活动 CLI;已有 CLI 会复用,没有则自动打开;可选 prompt 会在切换成功后立即转发
/status 查看 bridge 当前状态
/stop 中断当前任务
/reset 重建当前本地会话
/new/new-session OpenCode 或 Pi 模式下新建 session
/confirm / /deny 处理 CLI 权限请求;需要一次性 code 的请求会在消息中提示具体确认格式
/daemon-stop daemon 模式下停止常驻进程
/bindings 查看当前所有表情绑定
/bind [表情] /命令 绑定表情到指定命令
/unbind [表情] 解除指定表情的绑定

说明:微信侧 /resume 目前暂时保持禁用;需要切换 Codex / Claude / OpenCode / Pi 会话时,优先在本地 companion 中使用 /new 或对应 CLI 的会话命令,微信会跟随本地活动会话。

表情绑定

Daemon 模式支持将微信表情映射为命令,在微信中发送表情即可快速触发操作。(不过注意,第一次启动相关cli的时候,最好不要带消息,等启动完成再“表情+文本”快速给指定 cli 发送消息。

表情触发

默认绑定:

表情 命令 说明
[OK] /confirm 批准权限请求
[闭嘴] /stop 中断当前任务
[拥抱] /claude 切换到 Claude Code
[强] /codex 切换到 Codex
[胜利] /opencode 切换到 OpenCode
[再见] /daemon-stop 停止 daemon

管理命令:

/bindings              查看当前所有绑定
/bind [表情] /命令     绑定表情到命令,如 /bind [微笑] /status
/unbind [表情]         解除绑定,如 /unbind [微笑]

触发规则:

  • 表情必须出现在消息开头才会触发(如 [OK] 触发,你好[OK] 不触发);
  • 如果表情后面还有文本(如 [拥抱]帮我写个脚本),会先执行命令再将剩余文本作为消息转发;
  • 大小写不敏感([OK][ok] 等价);
  • 修改后立即生效并持久化到 ~/.cli-bridge/emoji-bindings.json,重启 daemon 后保留。

工作区模型

本项目采用“当前目录即当前工作区”的模型:

  • 从哪个目录启动 wechat-codex / wechat-claude / wechat-opencode / wechat-pi,哪个目录就是当前工作区;
  • 直接命令会自动管理同一工作区的内部 runtime 与可见 CLI;
  • 不同工作区的运行状态相互隔离。

目前支持两种运行模型:

  • 直接启动模式:单 owner、内部 transient runtime、单活动工作区;
  • wechat-daemon:单 owner、单 daemon、绑定一个启动工作区,但可在这个工作区内同时保留 Codex / Claude Code / OpenCode / Pi 四个 CLI slot。

对四个直接启动命令来说,这意味着:

  • 如果同一工作区已有 daemon,它们会委托 daemon 切换 CLI;
  • 如果没有 daemon,它们会作为单活工作区切换器工作;
  • 当前目录重复执行是幂等的;
  • 在其他目录执行会触发工作区切换,而不是并行多开。

版本更新

检查更新

运行以下命令检查是否有新版本:

wechat-check-update

该命令会显示:

  • 当前安装的版本;
  • 远程仓库的最新版本;
  • 如果有更新,会提供详细的更新指引。

没有 daemon 时,四个直接命令启动的内部 runtime 会按现有缓存策略检查更新。自动检查在后台异步执行,不影响启动速度。

获取最新版本

如果你使用 npm 全局安装,建议直接执行:

npm install -g cli-wechat-bridge@latest

升级后请重启正在运行的 bridge 和 companion 终端,确保它们加载同一版本。

致谢

感谢支持

感谢 issue 反馈者和 PR 贡献者。

创作不易,如果觉得它有帮助或有意思,可以请喝杯奶茶。❤️

相关链接

主要依赖:

运行与开发基础:

  • Node.js:运行发布包和 CLI 入口
  • TypeScript:源码语言和构建工具链
  • Bun:源码模式运行与测试工具
  • ESLint:代码检查

社区与参考:

License

本项目采用双协议授权:

开源协议:AGPL-3.0

  • 个人使用、学习、研究:完全免费
  • 修改和衍生作品必须以相同协议(AGPL-3.0)开源
  • 通过网络提供基于本项目的服务,也必须公开完整源代码

商业授权

如果你希望在闭源商业产品中使用本项目(不公开你的源代码),需要获得商业许可。请联系作者获取商业授权方案: