@unlinearity/cli-wechat-bridge 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,66 +1,70 @@
1
- # CLI WeChat Bridge
1
+ # CLI WeChat Bridge
2
2
 
3
- **命令行工具的微信桥接**:本项目用于桥接微信消息与本地运行的 [`Codex`](https://github.com/openai/codex)、[`Claude Code`](https://code.claude.com/docs/en/overview) 或持久化 `powershell.exe` 会话,并将本地输出、审批请求与运行状态同步回微信。
3
+ <p align='center'><img src='docs/images/logo.png' width=90%></p>
4
4
 
5
- 当前实现以本地工作流为中心展开,重点是保留本地原生终端体验,并在此基础上提供微信侧的远程输入、结果回流与状态同步能力。
5
+ <p align="center"><img alt="Typing SVG" src="https://readme-typing-svg.herokuapp.com?font=JetBrains+Mono&amp;weight=600&amp;duration=4000&amp;pause=500&amp;color=06C763&amp;center=true&amp;vCenter=true&amp;width=660&amp;lines=CLI+WeChat+Bridge+%E5%BE%AE%E4%BF%A1%E6%A1%A5%E6%8E%A5;%E7%9C%9F%E6%AD%A3%E7%9A%84%E2%80%9C%E7%BB%88%E7%AB%AF-%E5%BE%AE%E4%BF%A1%E2%80%9D%E5%8E%9F%E7%94%9F%E5%8F%8C%E5%90%91%E4%BA%A4%E4%BA%92"></p>
6
+
7
+ <p align="center">
8
+ <a href="https://github.com/UNLINEARITY/CLI-WeChat-Bridge"><img alt="GitHub stars" src="https://img.shields.io/github/stars/UNLINEARITY/CLI-WeChat-Bridge?label=Stars&amp;style=for-the-badge&amp;logo=github&amp;color=0891b2&amp;labelColor=1c1917"></a>
9
+ <a href="https://www.npmjs.com/package/@unlinearity/cli-wechat-bridge"><img alt="npm version" src="https://img.shields.io/npm/v/@unlinearity/cli-wechat-bridge?label=npm&amp;style=for-the-badge&amp;logo=npm&amp;color=cb3837&amp;labelColor=1c1917"></a>
10
+ <a href="https://www.npmjs.com/package/@unlinearity/cli-wechat-bridge"><img alt="npm downloads" src="https://img.shields.io/npm/dm/@unlinearity/cli-wechat-bridge?label=Downloads&amp;style=for-the-badge&amp;logo=npm&amp;color=16a34a&amp;labelColor=1c1917"></a>
11
+ <a href="https://github.com/UNLINEARITY/CLI-WeChat-Bridge/blob/main/LICENSE.txt"><img alt="License" src="https://img.shields.io/github/license/UNLINEARITY/CLI-WeChat-Bridge?label=License&amp;style=for-the-badge&amp;color=7c3aed&amp;labelColor=1c1917"></a>
12
+ </p>
13
+
14
+ **命令行工具的微信桥接**:本项目用于桥接微信消息与本地运行的 [`Codex`](https://github.com/openai/codex)、[`Claude Code`](https://code.claude.com/docs/en/overview)、`OpenCode` 或持久化 `powershell.exe` 会话,并将本地输出、审批请求与运行状态同步回微信。
15
+
16
+ 当前实现以本地工作流为中心展开,重点是保留**本地原生终端体验**,支持原生使用以及高级参数注入,并在此基础上提供微信侧的远程输入、结果回流与状态同步能力。
17
+
18
+ <p align='center'><img src='docs/images/animation.webp' width=90%></p>
6
19
 
7
20
  ## 这个项目解决什么问题
8
21
 
9
22
  本项目面向这样一类使用场景:
10
23
 
11
- - 你的主工作流仍在本地终端中进行
12
- - 你希望继续使用原生 `codex` 或其他 CLI 工具,而不是迁移到网页或托管机器人
13
- - 你希望在离开电脑时,仍能通过微信向本地会话发送请求,并接收必要的输出、与状态同步
24
+ - 你的主工作流仍在本地终端中进行;
25
+ - 你希望继续使用原生 `codex` 或其他 CLI 工具,而不是迁移到网页或托管机器人;
26
+ - 你希望在离开电脑时,仍能通过微信向本地会话发送请求,并接收必要的输出、与状态同步。
14
27
 
15
28
  当前项目并不试图把微信变成新的主工作界面。相反,它的定位是:
16
29
 
17
- - 本地 CLI 仍然是主工作界面
18
- - 微信是远程入口,允许远程接入
19
- - 会话一致性、线程状态和审批流仍以**本地会话为中心**
30
+ - 本地 CLI 仍然是主工作界面,并保持原生的使用逻辑;
31
+ - 微信是远程入口,允许远程接入;
32
+ - 会话一致性、线程状态和审批流仍以**本地会话为中心**。
20
33
 
21
34
  ## 快速开始
22
35
 
23
- ### 环境要求
36
+ ### 1. 环境要求
24
37
 
25
- - Windows 为当前主要验证环境
26
38
  - [Node.js](https://nodejs.org/en/download) `>= 24.0.0`(建议直接安装官网 LTS 版本)
27
- - [Bun](https://bun.sh/docs/installation) `>= 1.0.0`
39
+ - [Bun](https://bun.sh/docs/installation) `>= 1.0.0` (开发者需要,普通用户无需安装)
28
40
  - 已安装以下至少一种本地 CLI:(最好更新至最新版本)
29
- - [Codex](https://github.com/openai/codex)
41
+ - [Codex](https://github.com/openai/codex)
30
42
  - [Claude Code](https://code.claude.com/docs/en/overview)
43
+ - OpenCode
31
44
  - powershell.exe
32
45
 
46
+ ### 2. 安装
33
47
 
34
- ### 1. 安装全局命令
35
-
36
- 正式版本可以直接从 npm 安装:
37
-
38
- ```bash
39
- npm install -g @unlinearity/cli-wechat-bridge
40
- ```
41
-
42
- 安装后可在任意项目目录中直接使用 `wechat-codex-start`、`wechat-claude-start`、`wechat-opencode-start` 等命令。
43
-
44
- 如果你希望从源码运行或参与开发,也可以克隆仓库并安装依赖:
45
-
46
- ```bash
47
- git clone https://github.com/UNLINEARITY/CLI-WeChat-Bridge
48
- cd CLI-WeChat-Bridge
49
- bun install
50
- ```
51
-
52
- ### 2. 源码安装全局命令
53
-
54
- 如果使用源码仓库,希望将当前工作区安装为全局命令:
55
-
56
- ```bash
57
- npm install -g . #将命令下载到全局
48
+ 正式版本可以直接从 npm 安装:
49
+
50
+ ```bash
51
+ npm install -g @unlinearity/cli-wechat-bridge@latest
52
+ ```
53
+
54
+ 安装后可在任意项目目录中直接使用 `wechat-daemon`、`wechat-codex-start`、`wechat-claude-start`、`wechat-opencode-start` 等命令。
55
+
56
+ 如果你希望从源码运行或参与开发,也可以克隆仓库并安装依赖:
57
+
58
+ ```bash
59
+ git clone https://github.com/UNLINEARITY/CLI-WeChat-Bridge
60
+ cd CLI-WeChat-Bridge
61
+ bun install
58
62
  ```
59
63
 
60
- 如果仓库更新,可以重新clone,而本地留有旧配置,再强制更新:
64
+ 如果使用源码仓库,希望将当前工作区安装为全局命令:
61
65
 
62
66
  ```bash
63
- npm install -g . --force # 强制清除旧配置
67
+ npm install -g .
64
68
  ```
65
69
 
66
70
  开发阶段也可以使用:
@@ -71,12 +75,35 @@ npm link
71
75
 
72
76
  说明:
73
77
 
74
- - `npm link` 会让全局命令直接指向当前仓库源码
75
- - `npm install -g .` 会安装一份当前仓库的复制版本;后续代码更新后需要重新执行一次
78
+ - `npm link` 会让全局命令直接指向当前仓库源码;
79
+ - `npm install -g .` 会安装一份当前仓库的复制版本;后续代码更新后需要重新执行一次。
80
+
81
+ 如果你想把当前本地源码构建出的包安装到真实全局环境,并在任意目录人工验证,可以直接运行:
82
+
83
+ ```bash
84
+ npm run smoke:global
85
+ ```
86
+
87
+ 这个脚本会先用当前源码打出真实 npm tarball,再执行 `npm install -g <tarball>` 安装到真实全局环境;脚本结束后,你可以离开仓库目录运行 `wechat-codex-start` 等命令。如果你想先清理缓存、卸载当前全局包,或者顺便跑完整质量门禁,可以加上这些参数:
88
+
89
+ ```bash
90
+ npm run smoke:global -- --purge-global --clean-cache --full
91
+ ```
92
+
93
+ - `--clean-cache`:先执行 `npm cache clean --force`
94
+ - `--purge-global`:先卸载当前真实全局包
95
+ - `--full`:额外执行 `npm run quality`
96
+ - `--keep-tarball`:保留生成的 tarball,方便排查
76
97
 
77
98
  ### 3. 完成微信登录
78
99
 
79
- > 在 clone 的仓库目录下:
100
+ npm 全局安装后可以直接运行:
101
+
102
+ ```bash
103
+ wechat-setup
104
+ ```
105
+
106
+ 如果是在 clone 的仓库目录下,也可以运行:
80
107
 
81
108
  ```bash
82
109
  bun run setup # 绑定微信 ClawBot
@@ -84,242 +111,323 @@ bun run setup # 绑定微信 ClawBot
84
111
 
85
112
  该流程会:
86
113
 
87
- 1. 获取微信登录二维码
88
- 2. 选择 y 确认,在终端打印二维码
89
- 3. 等待你在微信中扫码并确认
90
- 4. 将 bot 凭据写入本地数据目录
114
+ 1. 获取微信登录二维码;
115
+ 2. 在终端打印二维码;
116
+ 3. 等待你在微信中扫码并确认;
117
+ 4. 将 bot 凭据写入本地数据目录。
91
118
 
92
119
  ![alt text](docs/images/image-0.png)
93
120
 
94
121
  默认凭据文件路径:
95
122
 
96
123
  ```text
97
- ~/.claude/channels/wechat/account.json
124
+ ~/.cli-bridge/account.json
98
125
  ```
99
126
 
100
- ### 4. 启动 `codex` 模式
127
+ 登录成功后会清理旧的 `sync_buf.txt` 和 `context_tokens.json`,避免旧会话状态污染新的登录状态。
128
+
129
+ 从旧版本升级时,bridge 会自动从旧的 `~/.claude/channels/wechat` 迁移数据到 `~/.cli-bridge`,包括登录凭据、同步游标、上下文 token、工作区状态和已接收附件;已有的新目录文件不会被覆盖,旧目录也会原样保留。旧运行锁不会迁移,旧 `bridge.log` 会保存为 `legacy-bridge.log`,避免覆盖新的运行日志。
130
+
131
+ 如果是首次安装或微信登录已过期,`wechat-codex-start`、`wechat-claude-start`、`wechat-opencode-start` 也会在前台提示扫码登录。
132
+
133
+ ### 4. 先从微信发一条同步消息(重要)
134
+
135
+ 启动 bridge 后,建议先在微信里向 Bot 发送一条消息,例如 `hello`、你要执行的任务或任意一句话。这样 bridge 能拿到最新的微信会话 `context_token`,之后本地终端里的输入、最终回复和审批提示才能稳定同步回微信。
136
+
137
+ 如果冷启动或长时间闲置后直接从本地终端先发消息,bridge 通常仍会捕获这条本地输入并交给 Codex / Claude Code / OpenCode 处理,但微信侧出站发送可能因为旧的 `context_token` 失效而失败。表现就是:本地已经有回复,微信暂时收不到;等你先从微信发来一条消息后,后续双向同步就能恢复正常。
138
+
139
+ ### 5. 常驻 daemon 模式(推荐用于多 CLI 切换)
101
140
 
102
- 假设你的项目目录是:
141
+ 如果你希望微信连接长期保持在线,并在 Codex / Claude Code / OpenCode 之间来回切换,推荐在项目目录启动一个统一 daemon:
103
142
 
104
143
  ```bash
105
144
  cd D:\work\your-project
145
+ wechat-daemon
106
146
  ```
107
- > 当你下载到全局`npm install -g .`后,可以在任意的路径运行桥接!
108
147
 
148
+ 启动后,在微信里发送以下指令即可选择当前活动终端:
109
149
 
110
- 终端 A:(这是用于监听和服务的,先打开这个)
150
+ | 指令 | 行为 |
151
+ | --- | --- |
152
+ | `/codex` | 切换到 Codex |
153
+ | `/claude` | 切换到 Claude Code |
154
+ | `/opencode` | 切换到 OpenCode |
155
+
156
+ daemon 启动后,后续切换都可以直接从微信发起;如果对应 CLI 还没有可见窗口,daemon 会自动打开或复用它,不需要再手动运行 `wechat-codex`、`wechat-claude` 或 `wechat-opencode`。
157
+
158
+ daemon 的 v1 行为是:
159
+
160
+ - daemon 绑定启动时的工作目录;暂不支持在微信里切换工作目录;
161
+ - 启动时会自动接管并清理旧的单 bridge 进程、失效 lock 和旧 endpoint;
162
+ - 切换适配器不会关闭之前的 CLI;
163
+ - 如果对应适配器已经有可见 CLI 在运行,则直接复用;
164
+ - 如果还没有对应 CLI,daemon 会自动打开一个新的可见终端;
165
+ - Codex / Claude / OpenCode 的重要输出都会带上 `[codex]`、`[claude]`、`[opencode]` 标签再发回微信;
166
+ - 可以在微信发送 `/daemon-stop` 停止 daemon。
167
+
168
+ 也可以启动时直接打开某个初始 CLI:
111
169
 
112
170
  ```bash
113
- wechat-bridge-codex
171
+ wechat-daemon --adapter codex
172
+ wechat-daemon --adapter claude --profile work
114
173
  ```
115
- ![alt text](docs/images/image-1.png)
116
174
 
117
- 终端 B:(再新开一个窗口,运行以下命令,近乎原生的codex,不过暂时没有实现远程请求确认,待完善)
175
+ 当同一工作目录已有 `wechat-daemon` 在运行时,`wechat-codex-start` / `wechat-claude-start` / `wechat-opencode-start` 会自动委托给 daemon:请求 daemon 切到对应 CLI,并在需要时打开可见终端,而不是停止 daemon 或关闭其他 CLI。
176
+
177
+ ### 6. 单命令启动桥接(兼容模式)
178
+
179
+ 先进入你要操作的项目目录:
118
180
 
119
181
  ```bash
120
- wechat-codex
182
+ cd D:\work\your-project
121
183
  ```
122
184
 
123
- ![alt text](docs/images/image-2.png)
185
+ 推荐直接选择一个单命令入口:
124
186
 
125
- 然后即可:(允许双向交互!windows 和 linux 均实测成功)
187
+ | 使用的本地 CLI | 启动命令 |
188
+ | --- | --- |
189
+ | Codex | `wechat-codex-start` |
190
+ | Claude Code | `wechat-claude-start` |
191
+ | OpenCode | `wechat-opencode-start` |
126
192
 
127
- - 在微信中发送普通文本
128
- - 在本地 `wechat-codex` 中继续原生交互
129
- - 在本地执行 `/resume` 切线程
130
- - 让微信自动跟随当前本地线程
193
+ 三者会自动完成以下动作:
131
194
 
132
- ![Codex windows](docs/images/image-3.png)
195
+ 1. 校验或刷新微信登录凭据;
196
+ 2. 如果当前目录已有 `wechat-daemon`,则委托 daemon 切换到对应 CLI;
197
+ 3. 如果没有 daemon,则复用当前目录已运行的 bridge,或在当前目录启动新的 bridge;
198
+ 4. 如果独立 bridge 正在服务其他目录,则停止旧 bridge 并切换到当前目录;
199
+ 5. 等待当前目录对应的本地 companion endpoint 就绪;
200
+ 6. 打开可见的本地 CLI 会话。
133
201
 
134
- ![Codex Linux](docs/images/image-4.png)
202
+ 在没有 daemon 时,`wechat-codex-start` / `wechat-claude-start` / `wechat-opencode-start` 仍按**单活工作区切换器**工作:
135
203
 
136
- 如果你希望用**单命令入口**快速启动,也可以直接使用:(仅需打开一个终端)
204
+ - 同一时间只有一个项目与微信对话;
205
+ - 在当前目录重复执行是幂等的;
206
+ - 如果当前目录已经有可见 companion / panel 在运行,则不会重复打开第二个窗口;
207
+ - 如果检测到可见端仍在但 worker 状态异常(如 `stopped` / `error`),会自动重启 bridge 再重新打开可见端;
208
+ - 在其他目录执行会显式切换活动工作区。
137
209
 
138
- ```bash
139
- wechat-codex-start
140
- ```
210
+ ### 7. 手动双终端模式(调试开发)
141
211
 
142
- 它会自动完成以下动作:
212
+ 如果你希望明确观察 bridge 与本地 CLI companion,也可以分两个终端启动。
143
213
 
144
- 1. 复用当前目录已运行的 `wechat-bridge-codex`
145
- 2. 如果 bridge 正在服务其他目录,则停止旧 bridge 并切换到当前目录
146
- 3. 等待当前目录对应的本地 companion endpoint 就绪
147
- 4. 打开可见的 `wechat-codex` 会话
148
-
149
- `wechat-codex-start` 现在按**单活工作区切换器**工作:
150
-
151
- - 同一时间只有一个项目与微信对话
152
- - 在当前目录重复执行是幂等的
153
- - 如果当前目录已经有可见 companion / panel 在运行,则不会重复打开第二个窗口
154
- - 如果检测到可见端仍在但 worker 状态异常(如 `stopped` / `error`),会自动重启 bridge 再重新打开可见端
155
- - 在其他目录执行会显式切换活动工作区
156
-
157
- ### 5. 启动 Claude Code (不走Channels)
214
+ | 适配器 | 终端 A:bridge | 终端 B:本地 companion |
215
+ | --- | --- | --- |
216
+ | Codex | `wechat-bridge-codex` | `wechat-codex` |
217
+ | Claude Code | `wechat-bridge-claude` | `wechat-claude` |
218
+ | OpenCode | `wechat-bridge-opencode` | `wechat-opencode` |
158
219
 
159
- 与 Codex 类似的,
220
+ ## 适配器支持情况
160
221
 
161
- 终端 A:(这是用于监听和服务的,先打开这个)
222
+ > 目前支持将本地文件传输至微信
162
223
 
163
- ```bash
164
- wechat-bridge-claude
165
- ```
224
+ ![文件传输](docs/images/image-8.png)
225
+
226
+ 微信发来的图片和普通文件也会被接收并保存到本地数据目录:
227
+
228
+ - 保存位置:`~/.cli-bridge/inbound-attachments/<日期>/`
229
+ - bridge 会把本地路径追加到转发给 Codex / Claude Code / OpenCode 的 prompt 中,模型可按需读取或解析这些文件;
230
+ - 当前不会自动 OCR 图片,也不会自动抽取 PDF / DOCX 正文;解析动作由本地 CLI 根据路径完成。
231
+
232
+ | 适配器 | 当前状态 | 说明 |
233
+ | --- | --- | --- |
234
+ | `codex` | 已接入 | 双终端模式;本地 companion 为线程权威;微信跟随本地线程 |
235
+ | `claude` | 已接入 | `wechat-bridge-claude` + `wechat-claude` 的双终端 companion 模式;会话切换、最终回复与审批元数据已按 Claude session 语义同步 |
236
+ | `opencode` | 已接入 | `wechat-bridge-opencode` + `wechat-opencode` 的双终端 companion 模式;支持本地 session 切换跟随,微信侧支持 `/new` / `/new-session` |
237
+ | `shell` | 可用 | 持久 `powershell.exe` 会话;高风险命令支持审批 |
238
+
239
+ ### Codex 示例
166
240
 
167
- 终端 B:(再新开一个窗口,运行以下命令,近乎原生的claude code,并且支持通过微信完成远程审批确认)
241
+ 终端 A:
168
242
 
169
243
  ```bash
170
- wechat-claude
244
+ wechat-bridge-codex
171
245
  ```
172
246
 
173
- 也支持单命令启动:
247
+ ![alt text](docs/images/image-1.png)
248
+
249
+ 终端 B:
174
250
 
175
251
  ```bash
176
- wechat-claude-start
252
+ wechat-codex
177
253
  ```
178
254
 
179
- 它会自动在当前目录拉起或复用 `wechat-bridge-claude`,等待 endpoint 就绪后打开可见的 `wechat-claude` companion。
255
+ ![alt text](docs/images/image-2.png)
180
256
 
181
- ![Claude Windows](docs/images/image-6.png)
257
+ 然后即可:
182
258
 
183
- ![Claude Linux](docs/images/image-7.png)
259
+ - 在微信中发送普通文本;
260
+ - 在本地 `wechat-codex` 中继续原生交互;
261
+ - 在本地执行 `/resume` 切线程;
262
+ - 让微信自动跟随当前本地线程。
263
+
264
+ ![Codex windows](docs/images/image-3.png)
184
265
 
266
+ ![Codex Linux](docs/images/image-4.png)
185
267
 
186
- ## 适配器支持情况
268
+ ### Claude Code 示例
187
269
 
188
- > 目前支持将本地文件传输至微信
270
+ Claude Code 支持通过微信完成远程审批确认。
189
271
 
190
- ![文件传输](docs/images/image-8.png)
272
+ ![Claude Windows](docs/images/image-6.png)
191
273
 
274
+ ![Claude Linux](docs/images/image-7.png)
192
275
 
193
- | 适配器 | 当前状态 | 说明 |
194
- | --- | --- | --- |
195
- | `codex` | 已接入 | 双终端模式;本地 panel 为线程权威;微信跟随本地线程 |
196
- | `claude` | 已接入 | 当前采用 `wechat-bridge-claude` + `wechat-claude` 的双终端 companion 模式;会话切换、最终回复与审批元数据已按 Claude session 语义同步 |
197
- | `shell` | 可用 | 持久 `powershell.exe` 会话;高风险命令支持审批 |
276
+ ### OpenCode 示例
198
277
 
278
+ OpenCode 模式下,微信侧支持 `/new` 或 `/new-session` 创建新 session;如果在本地 OpenCode CLI 中创建新 session,微信消息也会跟随新的 session。
199
279
 
200
280
  ## 命令说明
201
281
 
202
282
  ### 推荐全局命令
203
283
 
204
- ```bash
205
- wechat-bridge-codex # 开启 Codex 的桥接
206
- wechat-codex # 打开 Codex (原生交互)
207
- wechat-codex-start # 开启 Codex 的桥接的同时, 打开 Codex
208
- wechat-bridge-claude # 开启 Claude Code 的桥接
209
- wechat-claude # 打开 Claude Code (原生交互)
210
- wechat-claude-start # 开启桥接的同时, 打开 Claude Code
211
- wechat-bridge-shell # 终端桥接,headless 进程
212
- ```
284
+ | 类型 | 命令 |
285
+ | --- | --- |
286
+ | 登录与更新 | `wechat-setup`、`wechat-check-update` |
287
+ | 常驻 daemon | `wechat-daemon` |
288
+ | Codex | `wechat-bridge-codex`、`wechat-codex`、`wechat-codex-start` |
289
+ | Claude Code | `wechat-bridge-claude`、`wechat-claude`、`wechat-claude-start` |
290
+ | OpenCode | `wechat-bridge-opencode`、`wechat-opencode`、`wechat-opencode-start` |
291
+ | Shell | `wechat-bridge-shell` |
213
292
 
214
293
  ### 仓库内开发入口
215
294
 
216
295
  ```bash
217
296
  bun run setup
297
+ bun run daemon
218
298
  bun run bridge:codex
219
299
  bun run codex:panel
220
300
  bun run codex:start
221
301
  bun run bridge:claude
222
302
  bun run claude:companion
223
303
  bun run claude:start
304
+ bun run bridge:opencode
305
+ bun run opencode:panel
306
+ bun run opencode:start
224
307
  bun run bridge:shell
225
308
  bun run bridge:bun -- --adapter codex
309
+ bun run check
226
310
  bun run test
227
311
  ```
228
312
 
313
+ ### Daemon CLI 参数
314
+
315
+ 适用于:
316
+
317
+ - `wechat-daemon`
318
+
319
+ 示例:
320
+
321
+ ```bash
322
+ wechat-daemon --cwd D:\work\my-project
323
+ wechat-daemon --adapter codex
324
+ wechat-daemon --adapter claude --profile work
325
+ ```
326
+
327
+ 支持参数:
328
+
329
+ - `--cwd <path>`:指定 daemon 绑定的工作目录;
330
+ - `--adapter <codex|claude|opencode>`:启动 daemon 后立即切换到指定 CLI;
331
+ - `--profile <name-or-path>`:传给 daemon 创建的适配器;
332
+ - `--no-open`:只创建 bridge slot,不自动打开可见 CLI。
333
+
229
334
  ### Bridge CLI 参数
230
335
 
231
336
  适用于:
232
337
 
338
+ - `wechat-bridge`
233
339
  - `wechat-bridge-codex`
234
340
  - `wechat-bridge-claude`
341
+ - `wechat-bridge-opencode`
235
342
  - `wechat-bridge-shell`
236
343
 
237
344
  示例:
238
345
 
239
346
  ```bash
347
+ wechat-bridge --adapter codex --cwd D:\work\my-project
240
348
  wechat-bridge-codex --cwd D:\work\my-project
241
349
  wechat-bridge-claude --profile work
350
+ wechat-bridge-opencode --cwd D:\work\my-project
242
351
  wechat-bridge-shell --cmd pwsh.exe
352
+ wechat-bridge-codex --lifecycle companion_bound
243
353
  ```
244
354
 
245
355
  支持参数:
246
356
 
247
- - `--cwd <path>`:指定工作目录
248
- - `--cmd <executable>`:覆盖默认命令
249
- - `--profile <name-or-path>`:向适配器传入 profile
357
+ - `--adapter <codex|claude|opencode|shell>`:通用入口 `wechat-bridge` 需要显式指定适配器;
358
+ - `--cwd <path>`:指定工作目录;
359
+ - `--cmd <executable>`:覆盖默认命令;
360
+ - `--profile <name-or-path>`:向适配器传入 profile;
361
+ - `--lifecycle <persistent|companion_bound>`:指定 bridge 生命周期;`wechat-*-start` 会使用 `companion_bound`。
250
362
 
251
- ### `wechat-codex-start` 参数
363
+ ### `wechat-*-start` 参数
252
364
 
253
365
  示例:
254
366
 
255
367
  ```bash
256
368
  wechat-codex-start --cwd D:\work\my-project
257
- wechat-codex-start --profile work
369
+ wechat-claude-start --profile work
370
+ wechat-opencode-start --cwd D:\work\my-project
258
371
  ```
259
372
 
260
373
  支持参数:
261
374
 
262
- - `--cwd <path>`:显式指定 bridge / companion 对应的工作目录
263
- - `--profile <name-or-path>`:转发给后台启动的 `wechat-bridge-codex`
264
- - `--timeout-ms <ms>`:等待当前目录 endpoint 的最长时间,默认 `15000`
265
-
266
- 行为说明:
267
-
268
- - 同目录重复执行:复用当前目录 bridge;如果可见 companion / panel 已经在线,则只提示当前工作区已激活,不会重复打开第二个窗口
269
- - 同目录检测到可见端仍在但 worker 状态异常(如 `stopped` / `error`)时:会自动回收旧 bridge 并重新启动
270
- - 不同目录执行:会停止旧目录的临时 bridge,并切换到新的活动工作区
271
- - 关闭可见 companion / panel 后,后台 `companion_bound` bridge 会一起退出;异常断开时会保留短暂重连窗口
272
-
273
- ### `wechat-claude-start` 参数
375
+ - `--cwd <path>`:显式指定 bridge / companion 对应的工作目录;
376
+ - `--profile <name-or-path>`:转发给后台启动的 `wechat-bridge-codex` / `wechat-bridge-claude` / `wechat-bridge-opencode`;
377
+ - `--timeout-ms <ms>`:等待当前目录 endpoint 的最长时间,默认 `15000`。
274
378
 
275
- 示例:
379
+ 高级用法:除上述启动器参数外,未知参数会继续透传给可见的底层 CLI。这样可以在保留微信登录、工作区切换与 bridge 生命周期管理的同时,启用 Codex / Claude Code 自己的高级启动模式。
276
380
 
277
381
  ```bash
278
- wechat-claude-start --cwd D:\work\my-project
279
- wechat-claude-start --profile work
382
+ wechat-codex-start --yolo
383
+ wechat-codex-start --model gpt-5.2 --yolo
384
+ wechat-claude-start --dangerously-skip-permissions
385
+ wechat-claude-start --model sonnet --dangerously-skip-permissions
280
386
  ```
281
387
 
282
- 支持参数:
283
-
284
- - `--cwd <path>`:显式指定 bridge / companion 对应的工作目录
285
- - `--profile <name-or-path>`:转发给后台启动的 `wechat-bridge-claude`
286
- - `--timeout-ms <ms>`:等待当前目录 endpoint 的最长时间,默认 `15000`
388
+ 其中 `--yolo` 会传给 Codex;`--dangerously-skip-permissions` 会传给 Claude Code。它们只影响本地可见 CLI,不会覆盖 bridge 托管的 Codex remote 连接参数、Claude settings、微信登录状态或当前工作区锁。由于这两类参数会降低审批保护,建议只在可信工作区中使用。
287
389
 
288
390
  ## 微信侧支持的指令
289
391
 
290
392
  | 指令 | 说明 |
291
393
  | --- | --- |
292
394
  | 普通文本 | 发送给当前活动会话 |
395
+ | `/codex` / `/claude` / `/opencode` | daemon 模式下切换活动 CLI;已有 CLI 会复用,没有则自动打开 |
293
396
  | `/status` | 查看 bridge 当前状态 |
294
397
  | `/stop` | 中断当前任务 |
295
398
  | `/reset` | 重建当前本地会话 |
399
+ | `/new` 或 `/new-session` | OpenCode 模式下新建 session |
400
+ | `/confirm` / `/deny` | 处理 Claude Code 权限请求;shell 等需要一次性 code 的请求会在消息中提示具体确认格式 |
401
+ | `/daemon-stop` | daemon 模式下停止常驻进程 |
402
+
403
+ 说明:微信侧 `/resume` 目前仍保持禁用;需要切换 Codex / Claude / OpenCode 会话时,优先在本地 companion 中使用原生 `/resume`、`/new` 或对应 CLI 命令,微信会跟随本地活动会话。
296
404
 
297
405
  ## 工作区模型
298
406
 
299
407
  本项目采用“当前目录即当前工作区”的模型:
300
408
 
301
- - 从哪个目录启动 `wechat-bridge-codex`,哪个目录就是当前工作区
302
- - `wechat-codex` 必须连接同一工作区
303
- - 不同工作区的状态文件相互隔离
409
+ - 从哪个目录启动 `wechat-bridge-codex` / `wechat-bridge-claude` / `wechat-bridge-opencode`,哪个目录就是当前工作区;
410
+ - 对应的本地 companion 必须连接同一工作区;
411
+ - 不同工作区的状态文件相互隔离。
304
412
 
305
- 当前不是“一个全局守护进程同时管理多个仓库”的架构,而是:
413
+ 当前支持两种运行模型:
306
414
 
307
- - 单 owner
308
- - 单 bridge
309
- - 单活动工作区
310
-
311
- 对 `wechat-codex-start` / `wechat-claude-start` / `wechat-opencode-start` 来说,这意味着:
312
-
313
- - 它们是**单活工作区切换器**
314
- - 当前目录重复执行是幂等的
315
- - 其他目录重复执行会触发工作区切换,而不是并行多开
316
-
317
- ## 数据目录与状态文件
415
+ - 独立 bridge:单 owner、单 bridge、单活动工作区;
416
+ - `wechat-daemon`:单 owner、单 daemon、绑定一个启动工作区,但可在这个工作区内同时保留 Codex / Claude Code / OpenCode 三个 CLI slot。
417
+
418
+ 对 `wechat-codex-start` / `wechat-claude-start` / `wechat-opencode-start` 来说,这意味着:
419
+
420
+ - 如果同一工作区已有 daemon,它们会委托 daemon 切换 CLI;
421
+ - 如果没有 daemon,它们是**单活工作区切换器**;
422
+ - 当前目录重复执行是幂等的;
423
+ - 其他目录重复执行会触发工作区切换,而不是并行多开。
424
+
425
+ ## 数据目录与状态文件
318
426
 
319
427
  默认数据目录:
320
428
 
321
429
  ```text
322
- ~/.claude/channels/wechat
430
+ ~/.cli-bridge
323
431
  ```
324
432
 
325
433
  主要文件如下:
@@ -331,15 +439,27 @@ wechat-claude-start --profile work
331
439
  | `context_tokens.json` | 微信上下文 token 缓存 |
332
440
  | `bridge.log` | bridge 运行日志 |
333
441
  | `bridge.lock.json` | bridge 运行锁 |
442
+ | `daemon-endpoint.json` | `wechat-daemon` 本地 IPC endpoint |
443
+ | `inbound-attachments/` | 微信入站图片和普通文件的本地保存目录 |
334
444
  | `workspaces/<workspace-key>/bridge-state.json` | 当前工作区状态 |
335
- | `workspaces/<workspace-key>/codex-panel-endpoint.json` | 当前工作区 panel endpoint |
445
+ | `workspaces/<workspace-key>/codex-panel-endpoint.json` | 当前工作区 companion endpoint;文件名保留历史兼容 |
446
+ | `workspaces/<workspace-key>/<adapter>-companion-endpoint.json` | daemon / 多适配器模式下的适配器独立 companion endpoint |
336
447
 
337
448
  ### 环境变量
338
449
 
339
450
  | 变量名 | 说明 |
340
451
  | --- | --- |
341
452
  | `WECHAT_ILINK_BASE_URL` | 覆盖默认 iLink API 地址 |
342
- | `CLAUDE_WECHAT_CHANNEL_DATA_DIR` | 覆盖默认数据目录 |
453
+ | `CLI_BRIDGE_DATA_DIR` | 覆盖默认数据目录 |
454
+ | `WECHAT_MAX_IMAGE_MB` | 覆盖图片上传大小限制,默认 20 MB |
455
+ | `WECHAT_MAX_FILE_MB` | 覆盖普通文件上传大小限制,默认 50 MB |
456
+ | `WECHAT_MAX_VOICE_MB` | 覆盖语音上传大小限制,默认 20 MB |
457
+ | `WECHAT_MAX_VIDEO_MB` | 覆盖视频上传大小限制,默认 100 MB |
458
+ | `WECHAT_MAX_INBOUND_IMAGE_MB` | 覆盖微信入站图片下载大小限制,默认 20 MB |
459
+ | `WECHAT_MAX_INBOUND_FILE_MB` | 覆盖微信入站普通文件下载大小限制,默认 50 MB |
460
+ | `WECHAT_OPENCODE_DEBUG` | 开启 OpenCode 适配器调试输出 |
461
+
462
+ 旧版 `CLAUDE_WECHAT_CHANNEL_DATA_DIR` 不再作为活动数据目录配置项;如旧环境中设置过该变量,它只会被视为一次性旧数据迁移来源。新的自定义目录请使用 `CLI_BRIDGE_DATA_DIR`。
343
463
 
344
464
  ## 版本更新
345
465
 
@@ -352,82 +472,51 @@ wechat-check-update
352
472
  ```
353
473
 
354
474
  该命令会显示:
355
- - 当前安装的版本
356
- - 远程仓库的最新版本
357
- - 如果有更新,会提供详细的更新指引
358
475
 
359
- ### 启动时自动检查
476
+ - 当前安装的版本;
477
+ - 远程仓库的最新版本;
478
+ - 如果有更新,会提供详细的更新指引。
360
479
 
361
- 当启动 `wechat-bridge` 相关命令时(如 `wechat-bridge-codex`、`wechat-bridge-claude`),程序会自动检查更新(每24小时一次)。
480
+ 当启动 `wechat-bridge` 相关命令时(如 `wechat-bridge-codex`、`wechat-bridge-claude`),程序也会自动检查更新(每 24 小时一次)。自动检查在后台异步执行,不影响启动速度。
362
481
 
363
- - 自动检查在后台异步执行,不影响启动速度
364
- - 检查结果会被缓存,避免频繁查询
365
- - 如果发现新版本,会在终端显示更新提示
482
+ ### 获取最新版本
366
483
 
367
- ### 版本检查机制
484
+ 如果你使用 npm 全局安装,当前推荐直接执行:
368
485
 
369
- - **查询方式**:使用 `git ls-remote --tags origin` 查询远程仓库版本标签
370
- - **缓存策略**:检查结果缓存在 `~/.claude/channels/wechat/update-check.json`,有效期24小时
371
- - **无 API 限制**:不使用 GitHub API,避免限流问题,可以频繁使用
486
+ ```bash
487
+ npm install -g @unlinearity/cli-wechat-bridge@latest
488
+ ```
372
489
 
373
- ### 获取最新版本
490
+ 升级后请重启正在运行的 bridge 和 companion 终端,确保它们加载同一版本。
374
491
 
375
- 当提示有新版本时,使用以下命令更新:
492
+ 如果你使用源码仓库,可以使用以下命令更新:
376
493
 
377
494
  ```bash
378
- # 进入项目目录
379
495
  cd CLI-WeChat-Bridge
380
-
381
- # 拉取最新代码
382
496
  git pull
383
-
384
- # 安装依赖
385
497
  bun install
386
-
387
- # 重新安装全局命令
388
498
  npm install -g .
389
499
  ```
390
500
 
391
- ### 未来计划(还未发布)
392
-
393
- 当项目达到 **1.0.0** 稳定版本后,将发布到 npm,届时可以使用更简便的更新方式:
394
-
395
- ```bash
396
- npm install -g @unlinearity/cli-wechat-bridge@latest
397
- ```
398
-
399
501
  ## 常见问题
400
502
 
401
- ### 1. `wechat-codex` 提示找不到 bridge
503
+ ### 1. `wechat-codex` / `wechat-claude` / `wechat-opencode` 提示找不到 bridge
402
504
 
403
505
  通常原因如下:
404
506
 
405
- - 还没有先启动 `wechat-bridge-codex`
406
- - bridge 与 panel 不在同一个目录
407
- - 当前工作区 endpoint 文件不存在
408
-
409
- 建议:
410
-
411
- 1. 先在目标目录启动 `wechat-bridge-codex`
412
- 2. 再在同一目录启动 `wechat-codex`
413
-
414
- 如果你不想手动分两个终端,也可以直接执行:
507
+ - 还没有先启动对应的 `wechat-bridge-*`;
508
+ - bridge 与 companion 不在同一个目录;
509
+ - 当前工作区 endpoint 文件不存在或来自旧进程。
415
510
 
416
- ```bash
417
- wechat-codex-start
418
- ```
511
+ 建议先确认两个终端在同一目录;如果不想手动分两个终端,可以改用对应的 `wechat-codex-start`、`wechat-claude-start` 或 `wechat-opencode-start`。
419
512
 
420
513
  ### 2. 全局命令不存在
421
514
 
422
515
  请确认已经执行以下之一:
423
516
 
424
517
  ```bash
518
+ npm install -g @unlinearity/cli-wechat-bridge@latest
425
519
  npm install -g .
426
- ```
427
-
428
- 或:
429
-
430
- ```bash
431
520
  npm link
432
521
  ```
433
522
 
@@ -437,8 +526,8 @@ npm link
437
526
 
438
527
  项目已经尽量规避 `codex.ps1`:
439
528
 
440
- - 优先查找 vendor `codex.exe`
441
- - 必要时通过 `cmd.exe` 包装 `codex.cmd`
529
+ - 优先查找 vendor `codex.exe`;
530
+ - 必要时通过 `cmd.exe` 包装 `codex.cmd`。
442
531
 
443
532
  如果本机 PowerShell profile 本身受执行策略限制,终端仍可能打印相关警告。这通常不是 bridge 本身故障。
444
533
 
@@ -452,26 +541,35 @@ npm link
452
541
 
453
542
  如果偶发出现:
454
543
 
455
- 1. 先确认本地 `wechat-codex` 是否真的仍在执行任务
456
- 2. 必要时使用 `/stop`
544
+ 1. 先确认本地 `wechat-codex` 是否真的仍在执行任务;
545
+ 2. 必要时使用 `/stop`;
457
546
  3. 检查:
458
547
 
459
548
  ```text
460
- ~/.claude/channels/wechat/bridge.log
549
+ ~/.cli-bridge/bridge.log
461
550
  ```
462
551
 
463
552
  ### 6. 本地 `/resume` 后微信不同步
464
553
 
465
- 请优先确认: `wechat-bridge-codex` 与 `wechat-codex` 是否都已重启到同一版本。
554
+ 请优先确认:`wechat-bridge-codex` 与 `wechat-codex` 是否都已重启到同一版本。
466
555
 
467
556
  部分设备可能存在第一次本地输入不同步到微信的情况,可以先微信发送指令来建立连接。
468
557
 
558
+ ### 7. `wechat_send_failed` 或 `UND_ERR_CONNECT_TIMEOUT`
559
+
560
+ 如果 `bridge-state.json` 看起来正常,但微信仍然没有收到回复,优先检查:
561
+
562
+ ```text
563
+ ~/.cli-bridge/bridge.log
564
+ ```
565
+
566
+ 如果日志中出现 `wechat_send_failed`、`UND_ERR_CONNECT_TIMEOUT` 或 `ilinkai.weixin.qq.com:443`,通常是 bridge 到 iLink 的出站网络或代理问题,而不是本地 CLI 没有完成任务。请确认当前终端是否继承 `HTTP_PROXY`、`HTTPS_PROXY`、`ALL_PROXY`,以及 Node 是否需要 `NODE_OPTIONS=--use-env-proxy`。
567
+
469
568
  ## 已知限制
470
569
 
471
570
  - 微信 `/resume` 暂时被禁用(可能导致对话双向不稳定)
472
571
  - Codex 不支持底层任务的远程审批!建议给好权限,正常使用,几乎不会主动请求较为低级的远程审批;Claude Code 支持远程审批,但是测试的不够,如有问题可以提 issue。
473
- - 当前模型是单 owner、单 bridge、单活动工作区
474
-
572
+ - `wechat-daemon` v1 绑定启动工作区;暂不支持从微信切换到另一个本地目录。
475
573
 
476
574
  ## 开发说明
477
575
 
@@ -480,10 +578,13 @@ npm link
480
578
  | 文件 | 作用 |
481
579
  | --- | --- |
482
580
  | `src/bridge/wechat-bridge.ts` | bridge 主事件循环 |
483
- | `src/bridge/bridge-adapters.ts` | `codex` / `claude` / `shell` 适配器实现 |
484
- | `src/companion/local-companion.ts` | `wechat-codex` / `wechat-claude` 本地 companion 入口 |
485
- | `src/companion/codex-panel.ts` | Codex panel 入口(备用) |
486
- | `src/companion/codex-panel-link.ts` | bridge 与 Codex panel 的本地 IPC |
581
+ | `src/daemon/wechat-daemon.ts` | 常驻 WeChat daemon 与多 CLI slot 管理 |
582
+ | `src/daemon/daemon-link.ts` | daemon 本地 IPC endpoint 与请求协议 |
583
+ | `src/bridge/bridge-adapters.ts` | `codex` / `claude` / `opencode` / `shell` 适配器入口 |
584
+ | `src/bridge/bridge-adapters.opencode.ts` | OpenCode 适配器实现 |
585
+ | `src/companion/local-companion.ts` | `wechat-claude` / `wechat-opencode` 本地 companion 入口 |
586
+ | `src/companion/codex-remote-client.ts` | `wechat-codex` 本地客户端入口 |
587
+ | `src/companion/local-companion-start.ts` | `wechat-codex-start` / `wechat-claude-start` / `wechat-opencode-start` 单命令启动入口 |
487
588
  | `src/wechat/wechat-transport.ts` | iLink 消息收发 |
488
589
  | `src/bridge/bridge-state.ts` | bridge 状态、锁与日志 |
489
590
  | `src/wechat/setup.ts` | 登录与凭据初始化 |
@@ -494,6 +595,14 @@ npm link
494
595
  bun test
495
596
  ```
496
597
 
598
+ 也可以按目录运行:
599
+
600
+ ```bash
601
+ bun run test:bridge
602
+ bun run test:companion
603
+ bun run test:wechat
604
+ ```
605
+
497
606
  当前测试主要覆盖:
498
607
 
499
608
  - Windows 启动解析
@@ -505,26 +614,21 @@ bun test
505
614
  ## 致谢
506
615
 
507
616
  ### 相关链接
508
- - [Linux DO](https://linux.do/):学AI,上L站!
509
617
 
618
+ - [Linux DO](https://linux.do/):学AI,上L站!
510
619
  - [openclaw-weixin](https://github.com/hao-ji-xing/openclaw-weixin):支持Claude Code Channel,感谢如此迅速的开源。
511
-
512
620
  - [@modelcontextprotocol/sdk](https://github.com/modelcontextprotocol/typescript-sdk):TypeScript 版 MCP SDK
513
-
514
621
  - [node-pty](https://github.com/microsoft/node-pty):本地 PTY / ConPTY 进程桥接
515
-
516
622
  - [@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript):Anthropic TypeScript SDK
517
-
518
623
  - [qrcode-terminal](https://github.com/gtanner/qrcode-terminal):终端二维码输出
519
624
 
520
-
521
625
  ### 感谢支持
522
626
 
523
627
  > 感谢 issue 反馈者 和 pr 贡献者。
524
628
 
525
629
  创作不易,如感觉对您有帮助、觉得有意思,可以请喝杯奶茶。❤️
526
630
 
527
- <p align='center'><img src='docs\images\wechat-tip.png' width=60%></p>
631
+ <p align='center'><img src='docs\images\wechat-tip.png' width=60%></p>
528
632
 
529
633
  ## License
530
634