CLI WeChat Bridge
命令行工具的微信桥接:本项目将微信消息桥接到本地运行的 Codex、Claude Code、OpenCode 和 Pi,同时把本地输出、审批请求与运行状态同步回微信。
项目围绕本地工作流设计,重点是保留本地原生终端体验:你仍然在本地使用原生 CLI 和高级启动参数,微信负责远程输入、结果回流与状态同步。
文档导航
- 问题排查:上下文 token、网络代理、本地 endpoint、已知限制等常见问题。
- 运行配置:数据目录、上传大小限制、调试开关等环境变量。
- 开发说明:源码运行、测试、构建、打包和全局 smoke 验证。
- 发布说明:各版本变更与升级说明。
- 通信架构:各 CLI 适配器的通信机制、PTY / RPC 依赖分析和技术决策。
这个项目解决什么问题?
本项目适合这样的使用场景:
- 你的主工作流仍在本地终端中进行;
- 你希望继续使用 Codex、Claude Code、OpenCode、Pi 等原生 CLI,而不是迁移到网页或托管机器人;
- 你希望离开电脑后,仍能通过微信向本地会话发送请求,并接收必要输出和状态更新。
本项目不试图把微信变成新的主工作界面。它的定位是:
- 本地 CLI 仍然是主工作界面,并保持原生的使用逻辑;
- 微信是远程入口,用来接入本地会话;
- 会话一致性、线程状态和审批流仍以本地会话为中心。
快速开始
1. 环境要求
- Node.js
>= 24.0.0(建议直接安装官网 LTS 版本) - 已安装以下任意一种本地 CLI,并尽量保持最新版本:
- Codex
- Claude Code
- OpenCode
>= 1.18.0 < 2.0.0 - Pi(已验证
0.84.2;需要本机可执行pi命令)
2. 安装
发布版本可以直接从 npm 安装:
npm install -g cli-wechat-bridge@latest
安装后,可以在任意项目目录中直接运行 wechat-codex、wechat-claude、wechat-opencode、wechat-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
登录流程会:
- 获取微信登录二维码;
- 在终端打印二维码;
- 等待你在微信中扫码并确认;
- 保存本地登录凭据。

登录成功后,程序会清理旧的同步游标和上下文 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 |
这些命令会自动完成以下动作:
- 校验或刷新微信登录凭据;
- 如果当前目录已有
wechat-daemon,则委托 daemon 切换到对应 CLI; - 如果没有 daemon,则创建或复用内部 transient bridge runtime;
- 如果旧 runtime 正在服务其他目录,则安全停止旧 runtime 并切换到当前目录;
- 等待当前目录对应的本地 endpoint 就绪;
- 打开可见的本地 CLI 会话。
没有 daemon 时,四个直接命令按单活工作区切换器工作:
- 同一时间只有一个项目与微信对话;
- Codex 在当前目录重复执行时会复用已有会话;Claude Code、OpenCode 和 Pi 启动器默认新建会话;
- Pi 如需显式恢复上一次会话,可使用
wechat-pi --session-start-mode restore; - 如果当前目录已经有可见 companion / panel 在运行,则不会重复打开第二个窗口;
- 如果检测到可见端仍在运行但 worker 状态异常(如
stopped/error),会自动重启 bridge 再重新打开可见端; - 在其他目录执行会显式切换活动工作区。
wechat-codex-start、wechat-claude-start、wechat-opencode-start、wechat-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-codex、wechat-claude、wechat-opencode 或 wechat-pi。

当前 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 示例


Claude Code 示例


OpenCode 示例
OpenCode 模式下,微信侧支持 /new 或 /new-session 创建新 session;如果在本地 OpenCode CLI 中创建新 session,微信消息也会跟随新的 session。
命令说明
常用全局命令
| 类型 | 命令 |
|---|---|
| 登录与更新 | wechat-setup、wechat-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-codex、wechat-claude、wechat-opencode、wechat-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 贡献者。
创作不易,如果觉得它有帮助或有意思,可以请喝杯奶茶。❤️
相关链接
主要依赖:
- @opencode-ai/sdk:OpenCode session 和事件流客户端
- @modelcontextprotocol/sdk:MCP server 入口使用的 TypeScript SDK
- node-pty:本地 PTY / ConPTY 进程桥接
- qrcode-terminal:终端二维码输出
运行与开发基础:
- Node.js:运行发布包和 CLI 入口
- TypeScript:源码语言和构建工具链
- Bun:源码模式运行与测试工具
- ESLint:代码检查
社区与参考:
- Linux DO:学 AI,上 L 站!
- @tencent-weixin/openclaw-weixin:腾讯微信团队发布的 OpenClaw Weixin channel npm 包
- openclaw-weixin:早期 WeChat / Claude Code Channel 参考项目。
License
本项目采用双协议授权:
开源协议:AGPL-3.0
- 个人使用、学习、研究:完全免费
- 修改和衍生作品必须以相同协议(AGPL-3.0)开源
- 通过网络提供基于本项目的服务,也必须公开完整源代码
商业授权
如果你希望在闭源商业产品中使用本项目(不公开你的源代码),需要获得商业许可。请联系作者获取商业授权方案:
- GitHub: @UNLINEARITY
No comments yet
Be the first to share your take.