cli-wechat-bridge 1.1.6 → 1.1.8
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/LICENSE.txt +661 -661
- package/README.md +454 -475
- package/bin/_run-entry.mjs +23 -5
- package/bin/wecom-check-update.mjs +5 -0
- package/bin/wecom-claude.mjs +5 -0
- package/bin/wecom-codex.mjs +5 -0
- package/bin/wecom-daemon.mjs +5 -0
- package/bin/wecom-opencode.mjs +5 -0
- package/bin/wecom-pi.mjs +5 -0
- package/bin/wecom-setup.mjs +5 -0
- package/dist/bridge/adapter-control.js +58 -0
- package/dist/bridge/bridge-adapters.claude.js +155 -4
- package/dist/bridge/bridge-adapters.codex.js +112 -7
- package/dist/bridge/bridge-adapters.core.js +19 -1
- package/dist/bridge/bridge-adapters.opencode.js +150 -1
- package/dist/bridge/bridge-adapters.pi.js +39 -0
- package/dist/bridge/bridge-process-reaper.js +35 -2
- package/dist/bridge/bridge-state.js +10 -3
- package/dist/bridge/claude-native-controls.js +133 -0
- package/dist/bridge/native-terminal-control.js +253 -0
- package/dist/bridge/wechat-bridge.js +389 -87
- package/dist/channels/wechat/wechat-outbound-queue.js +10 -3
- package/dist/channels/wecom/bridge-final-reply.js +26 -0
- package/dist/channels/wecom/setup-cli.js +6 -0
- package/dist/channels/wecom/setup.js +176 -0
- package/dist/channels/wecom/wecom-channel-port.js +45 -0
- package/dist/channels/wecom/wecom-config.js +66 -0
- package/dist/channels/wecom/wecom-media.js +141 -0
- package/dist/channels/wecom/wecom-message.js +149 -0
- package/dist/channels/wecom/wecom-transport.js +308 -0
- package/dist/companion/codex-remote-client.js +24 -3
- package/dist/companion/codex-visible-client-link.js +101 -0
- package/dist/companion/local-companion-start.js +56 -11
- package/dist/companion/local-companion.js +19 -1
- package/dist/companion/pi-tui-bridge-extension.js +56 -3
- package/dist/core/bridge-control.js +8 -0
- package/dist/core/channel-types.js +3 -1
- package/dist/core/conversation-routing.js +48 -0
- package/dist/core/direct-run.js +17 -0
- package/dist/core/inbound-message-claims.js +61 -0
- package/dist/daemon/daemon-link.js +3 -0
- package/dist/daemon/wechat-daemon.js +335 -60
- package/dist/i18n/messages-en.js +3 -1
- package/dist/i18n/messages-zh.js +3 -1
- package/dist/runtime/legacy-adapter-runtime.js +15 -0
- package/dist/runtime/runtime-types.js +3 -0
- package/dist/utils/doctor.js +30 -10
- package/dist/utils/version-checker.js +11 -11
- package/dist/wechat/setup.js +113 -13
- package/dist/wechat/wechat-transport.js +96 -58
- package/package.json +116 -104
- package/scripts/ensure-node-pty-permissions.mjs +73 -73
package/README.md
CHANGED
|
@@ -1,476 +1,455 @@
|
|
|
1
|
-
# CLI WeChat Bridge
|
|
2
|
-
|
|
3
|
-
<p align='center'><img src='docs/images/logo.png' width=90%></p>
|
|
4
|
-
|
|
5
|
-
<p align="center"><img alt="Typing SVG" src="https://readme-typing-svg.herokuapp.com?font=JetBrains+Mono&weight=600&duration=4000&pause=500&color=06C763&center=true&vCenter=true&width=660&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&style=for-the-badge&logo=github&color=0891b2&labelColor=1c1917"></a>
|
|
9
|
-
<a href="https://www.npmjs.com/package/cli-wechat-bridge"><img alt="npm version" src="https://img.shields.io/npm/v/cli-wechat-bridge?label=npm&style=for-the-badge&logo=npm&color=cb3837&labelColor=1c1917"></a>
|
|
10
|
-
<a href="https://www.npmjs.com/package/cli-wechat-bridge"><img alt="npm downloads" src="https://img.shields.io/npm/dt/cli-wechat-bridge?label=Downloads&style=for-the-badge&logo=npm&color=16a34a&labelColor=1c1917"></a>
|
|
11
|
-
<a href="https://www.npmjs.com/package/@unlinearity/cli-wechat-bridge"><img alt="scoped npm downloads" src="https://img.shields.io/npm/dt/@unlinearity/cli-wechat-bridge?label=Scoped%20downloads&style=for-the-badge&logo=npm&color=15803d&labelColor=1c1917"></a>
|
|
12
|
-
<a href="https://www.npmjs.com/package/cli-wechat-bridge">
|
|
13
|
-
<img alt="License" src="https://img.shields.io/badge/License-AGPL--3.0-7c3aed?style=for-the-badge&labelColor=1c1917">
|
|
14
|
-
</a>
|
|
15
|
-
<a href="https://github.com/UNLINEARITY/CLI-WeChat-Bridge/actions/workflows/ci.yml"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/UNLINEARITY/CLI-WeChat-Bridge/ci.yml?branch=main&label=CI&style=for-the-badge&logo=githubactions&logoColor=white&labelColor=1c1917"></a>
|
|
16
|
-
</p>
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
项目围绕本地工作流设计,重点是保留**本地原生终端体验**:你仍然在本地使用原生 CLI
|
|
21
|
-
|
|
22
|
-
<p align=
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
- [
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
1
|
+
# CLI WeChat Bridge
|
|
2
|
+
|
|
3
|
+
<p align='center'><img src='docs/images/logo.png' width=90%></p>
|
|
4
|
+
|
|
5
|
+
<p align="center"><img alt="Typing SVG" src="https://readme-typing-svg.herokuapp.com?font=JetBrains+Mono&weight=600&duration=4000&pause=500&color=06C763&center=true&vCenter=true&width=660&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&style=for-the-badge&logo=github&color=0891b2&labelColor=1c1917"></a>
|
|
9
|
+
<a href="https://www.npmjs.com/package/cli-wechat-bridge"><img alt="npm version" src="https://img.shields.io/npm/v/cli-wechat-bridge?label=npm&style=for-the-badge&logo=npm&color=cb3837&labelColor=1c1917"></a>
|
|
10
|
+
<a href="https://www.npmjs.com/package/cli-wechat-bridge"><img alt="npm downloads" src="https://img.shields.io/npm/dt/cli-wechat-bridge?label=Downloads&style=for-the-badge&logo=npm&color=16a34a&labelColor=1c1917"></a>
|
|
11
|
+
<a href="https://www.npmjs.com/package/@unlinearity/cli-wechat-bridge"><img alt="scoped npm downloads" src="https://img.shields.io/npm/dt/@unlinearity/cli-wechat-bridge?label=Scoped%20downloads&style=for-the-badge&logo=npm&color=15803d&labelColor=1c1917"></a>
|
|
12
|
+
<a href="https://www.npmjs.com/package/cli-wechat-bridge">
|
|
13
|
+
<img alt="License" src="https://img.shields.io/badge/License-AGPL--3.0-7c3aed?style=for-the-badge&labelColor=1c1917">
|
|
14
|
+
</a>
|
|
15
|
+
<a href="https://github.com/UNLINEARITY/CLI-WeChat-Bridge/actions/workflows/ci.yml"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/UNLINEARITY/CLI-WeChat-Bridge/ci.yml?branch=main&label=CI&style=for-the-badge&logo=githubactions&logoColor=white&labelColor=1c1917"></a>
|
|
16
|
+
</p>
|
|
17
|
+
|
|
18
|
+
**命令行工具的微信与企业微信桥接**:本项目将微信或企业微信消息桥接到本地运行的 [`Codex`](https://github.com/openai/codex)、[`Claude Code`](https://code.claude.com/docs/en/overview)、[`OpenCode`](https://github.com/anomalyco/opencode) 和 [`Pi`](https://github.com/earendil-works/pi),同时把本地输出、审批请求与运行状态同步回对应通道。
|
|
19
|
+
|
|
20
|
+
项目围绕本地工作流设计,重点是保留**本地原生终端体验**:你仍然在本地使用原生 CLI 和高级启动参数,微信或企业微信负责远程输入、结果回流与状态同步。
|
|
21
|
+
|
|
22
|
+
<p align="center">
|
|
23
|
+
<a href="https://unlinearity.github.io/CLI-WeChat-Bridge/"><strong>产品主页 ↗</strong></a>
|
|
24
|
+
</p>
|
|
25
|
+
|
|
26
|
+
<p align='center'><img src='docs/images/animation.webp' width=90%></p>
|
|
27
|
+
|
|
28
|
+
## 文档导航
|
|
29
|
+
|
|
30
|
+
- [问题排查](docs/troubleshooting.md):上下文 token、网络代理、本地 endpoint、已知限制等常见问题。
|
|
31
|
+
- [运行配置](docs/configuration.md):微信与企业微信的数据目录、上传大小限制、调试开关等环境变量。
|
|
32
|
+
- [开发说明](docs/development.md):源码运行、测试、构建、打包和全局 smoke 验证。
|
|
33
|
+
- [发布说明](docs/releases/README.md):各版本变更与升级说明。
|
|
34
|
+
- [通信架构](docs/architecture.md):各 CLI 适配器的通信机制、PTY / RPC 依赖分析和技术决策。
|
|
35
|
+
|
|
36
|
+
## 一、这个项目解决什么问题?
|
|
37
|
+
|
|
38
|
+
本项目适合这样的使用场景:
|
|
39
|
+
|
|
40
|
+
- 你的主工作流仍在本地终端中进行;
|
|
41
|
+
- 你希望继续使用 Codex、Claude Code、OpenCode、Pi 等原生 CLI,而不是迁移到网页或托管机器人;
|
|
42
|
+
- 你希望离开电脑后,仍能通过微信或企业微信向本地会话发送请求,并接收必要输出和状态更新。
|
|
43
|
+
|
|
44
|
+
本项目不试图把微信或企业微信变成新的主工作界面。它的定位是:
|
|
45
|
+
|
|
46
|
+
- 本地 CLI 仍然是主工作界面,并保持原生的使用逻辑;
|
|
47
|
+
- **微信或企业微信是远程入口**,用来接入本地会话;
|
|
48
|
+
- 会话一致性、线程状态和审批流仍以**本地会话为中心**。
|
|
49
|
+
|
|
50
|
+
## 二、快速开始
|
|
51
|
+
|
|
52
|
+
### 1. 环境要求
|
|
53
|
+
|
|
50
54
|
- [Node.js](https://nodejs.org/en/download) `>= 22.13.0`(建议直接安装官网 LTS 版本)
|
|
51
|
-
- 已安装以下任意一种本地 CLI,并尽量保持最新版本:
|
|
52
|
-
- [Codex](https://github.com/openai/codex)
|
|
53
|
-
- [Claude Code](https://code.claude.com/docs/en/overview)
|
|
54
|
-
- [OpenCode](https://github.com/anomalyco/opencode) `>= 1.18.0 < 2.0.0`
|
|
55
|
-
- [Pi](https://github.com/earendil-works/pi)(已验证 `0.84.2`;需要本机可执行 `pi` 命令)
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
<
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
npm
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
-
|
|
106
|
-
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
</details>
|
|
112
|
-
|
|
113
|
-
### 3.
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
-
|
|
228
|
-
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
wechat-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
wechat-
|
|
295
|
-
wechat-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
-
|
|
304
|
-
-
|
|
305
|
-
-
|
|
306
|
-
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
wechat-
|
|
313
|
-
wechat-claude --
|
|
314
|
-
wechat-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
|
324
|
-
|
|
|
325
|
-
|
|
|
326
|
-
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
|
355
|
-
|
|
|
356
|
-
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
-
|
|
441
|
-
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
- [
|
|
448
|
-
|
|
449
|
-
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
社区与参考:
|
|
453
|
-
|
|
454
|
-
- [Linux DO](https://linux.do/):学 AI,上 L 站!
|
|
455
|
-
- [@tencent-weixin/openclaw-weixin](https://www.npmjs.com/package/@tencent-weixin/openclaw-weixin):腾讯微信团队发布的 OpenClaw Weixin channel npm 包
|
|
456
|
-
- [openclaw-weixin](https://github.com/hao-ji-xing/openclaw-weixin):早期 WeChat / Claude Code Channel 参考项目。
|
|
457
|
-
|
|
458
|
-
## License
|
|
459
|
-
|
|
460
|
-
本项目采用**双协议**授权:
|
|
461
|
-
|
|
462
|
-
**开源协议:[AGPL-3.0](LICENSE.txt)**
|
|
463
|
-
|
|
464
|
-
- 个人使用、学习、研究:完全免费
|
|
465
|
-
- 修改和衍生作品必须以相同协议(AGPL-3.0)开源
|
|
466
|
-
- 通过网络提供基于本项目的服务,也必须公开完整源代码
|
|
467
|
-
|
|
468
|
-
**商业授权**
|
|
469
|
-
|
|
470
|
-
如果你希望在闭源商业产品中使用本项目(不公开你的源代码),需要获得商业许可。请联系作者获取商业授权方案:
|
|
471
|
-
|
|
472
|
-
- GitHub: [@UNLINEARITY](https://github.com/UNLINEARITY)
|
|
473
|
-
|
|
474
|
-
<p align="center">
|
|
475
|
-
<img alt="Star History Chart" src="https://api.star-history.com/chart?repos=UNLINEARITY/CLI-WeChat-Bridge&type=timeline&legend=top-left">
|
|
476
|
-
</p>
|
|
55
|
+
- 已安装以下任意一种本地 CLI,并尽量保持最新版本:
|
|
56
|
+
- [Codex](https://github.com/openai/codex)
|
|
57
|
+
- [Claude Code](https://code.claude.com/docs/en/overview)
|
|
58
|
+
- [OpenCode](https://github.com/anomalyco/opencode) `>= 1.18.0 < 2.0.0`
|
|
59
|
+
- [Pi](https://github.com/earendil-works/pi)(已验证 `0.84.2`;需要本机可执行 `pi` 命令)
|
|
60
|
+
- 已准备一个远程通道:个人微信使用 `wechat-setup`,企业微信使用 `wecom-setup`
|
|
61
|
+
|
|
62
|
+
### 2. 安装与更新
|
|
63
|
+
|
|
64
|
+
发布版本可以直接从 npm 安装/更新:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
npm install -g cli-wechat-bridge@latest
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
兼容性说明:旧包名 `@unlinearity/cli-wechat-bridge` 会继续同步发布,已经安装旧包名的用户可以正常升级;新用户优先使用更短的 `cli-wechat-bridge`。
|
|
71
|
+
|
|
72
|
+
<details>
|
|
73
|
+
<summary><b>安装遇到问题?(node-pty 原生模块)</b></summary>
|
|
74
|
+
|
|
75
|
+
本项目使用 `node-pty` 为 CLI 适配器提供完整终端模拟。**Claude Code 适配器当前通过 PTY 交互模式工作**,node-pty 不可用时会回退到兼容模式,但 Claude Code 在此模式下可能无法正常桥接;Codex 适配器主要通过 WebSocket RPC 通信,通常不受影响;OpenCode 适配器不依赖 node-pty;Pi 直接继承可见 companion 的真实终端,也不需要 node-pty 模拟。
|
|
76
|
+
|
|
77
|
+
**较新 npm 在 Linux 上阻止安装脚本:** 如果安装输出提示 `cli-wechat-bridge` 和 `node-pty` 的 install/postinstall scripts 未被 `allowScripts` 允许,请执行一次干净重装:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
npm uninstall -g cli-wechat-bridge
|
|
81
|
+
npm install -g cli-wechat-bridge@latest --allow-scripts=cli-wechat-bridge,node-pty
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
`cli-wechat-bridge@latest` 必须写在同一条安装命令中。不要只运行 `npm install -g --allow-scripts=...`;缺少包名时,npm 会尝试读取当前目录的 `package.json`,并可能报 `ENOENT /home/<user>/package.json`。
|
|
85
|
+
|
|
86
|
+
如需让后续全局升级继续允许这两个已确认的脚本,可以先写入用户级配置:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npm config set allow-scripts=cli-wechat-bridge,node-pty --location=user
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Linux 用户**(最常见):需要原生模块编译工具:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# Debian / Ubuntu
|
|
96
|
+
sudo apt install build-essential python3
|
|
97
|
+
# RHEL / Fedora
|
|
98
|
+
sudo dnf groupinstall "Development Tools" && sudo dnf install python3
|
|
99
|
+
# Alpine
|
|
100
|
+
apk add build-base python3
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
安装编译工具后,使用上面的 `--allow-scripts=cli-wechat-bridge,node-pty` 命令重新安装。
|
|
104
|
+
|
|
105
|
+
**macOS 用户**:如遇编译问题,安装 Xcode 命令行工具:`xcode-select --install`
|
|
106
|
+
|
|
107
|
+
**Windows 用户**:
|
|
108
|
+
- 需要 Windows 10 1809(build 18309)或更高版本
|
|
109
|
+
- 如果 node-pty 加载失败,运行 `npm rebuild node-pty` 或重新安装
|
|
110
|
+
- 确保已安装 [Visual C++ Redistributable](https://aka.ms/vs/17/release/vc_redist.x64.exe)
|
|
111
|
+
|
|
112
|
+
运行 `wechat-daemon --doctor` 可快速检查环境状态。详见 [问题排查](docs/troubleshooting.md#pty-不可用--回退模式)。
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
</details>
|
|
116
|
+
|
|
117
|
+
### 3. 完成登录(均可配置,看个人喜好)
|
|
118
|
+
|
|
119
|
+
#### 3.1 微信登录
|
|
120
|
+
|
|
121
|
+
全局安装后运行:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
wechat-setup
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
二维码默认使用 `small` 模式;如果 Windows 终端中的小二维码字符渲染异常,可使用
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
wechat-setup --qr-mode normal
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
切换为普通模式。
|
|
134
|
+
|
|
135
|
+
登录流程会:
|
|
136
|
+
|
|
137
|
+
1. 获取微信登录二维码;
|
|
138
|
+
2. 在终端打印二维码;
|
|
139
|
+
3. 等待你在微信中扫码并确认;
|
|
140
|
+
4. 保存本地登录凭据。
|
|
141
|
+
|
|
142
|
+

|
|
143
|
+
|
|
144
|
+
登录成功后,程序会清理旧的同步游标和上下文 token,避免旧会话状态污染新的登录状态。数据目录、状态文件和旧版本迁移说明见 [问题排查](docs/troubleshooting.md#数据目录与状态文件)。
|
|
145
|
+
|
|
146
|
+
首次安装或微信登录过期时,四个直接启动命令也会在前台提示扫码登录。
|
|
147
|
+
|
|
148
|
+
#### 3.2 企业微信接入
|
|
149
|
+
|
|
150
|
+
企业微信使用官方智能机器人长连接,不需要公网回调地址。接入流程如下:
|
|
151
|
+
|
|
152
|
+
1. 在企业微信客户端的“工作台 → 智能机器人”中创建 API 模式机器人,选择“使用长连接”,取得 Bot ID 和 Secret;
|
|
153
|
+
2. 运行 `wecom-setup`,输入 Bot ID 和 Secret;
|
|
154
|
+
3. 在企业微信中与机器人单聊,发送终端显示的 `/pair <code>` 完成一次性操作者配对;
|
|
155
|
+
|
|
156
|
+

|
|
157
|
+
|
|
158
|
+
### 4. 先从微信发一条同步消息(重要)
|
|
159
|
+
|
|
160
|
+
启动 bridge 后,建议先在微信里向 Bot 发送一条消息,例如 `hello`、你要执行的任务,或任意一句话。这样 bridge 能拿到最新的微信会话 `context_token`,之后本地终端中的输入、最终回复和审批提示才能稳定同步回微信。
|
|
161
|
+
|
|
162
|
+
如果冷启动或长时间闲置后直接从本地终端先发消息,bridge 通常仍会捕获这条本地输入并交给 Codex / Claude Code / OpenCode / Pi 处理,但回发到微信时可能因为旧的 `context_token` 失效而失败。表现是:本地已经有回复,微信暂时收不到;等你先从微信发来一条消息后,后续双向同步就能恢复正常。
|
|
163
|
+
|
|
164
|
+
### 5. 直接启动本地 CLI
|
|
165
|
+
|
|
166
|
+
先进入需要操作的项目目录:
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
cd D:\work\your-project
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
然后选择一个单命令入口:
|
|
173
|
+
|
|
174
|
+
| 使用的本地 CLI | 微信启动命令 | 企业微信启动命令 |
|
|
175
|
+
| --- | --- | --- |
|
|
176
|
+
| Codex | `wechat-codex` | `wecom-codex` |
|
|
177
|
+
| Claude Code | `wechat-claude` | `wecom-claude` |
|
|
178
|
+
| OpenCode | `wechat-opencode` | `wecom-opencode` |
|
|
179
|
+
| Pi | `wechat-pi` | `wecom-pi` |
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
没有 daemon 时,四个直接命令按**单个活动工作区切换器**工作:
|
|
183
|
+
|
|
184
|
+
- 同一时间只有一个项目与微信或企业微信对话;
|
|
185
|
+
- 如果检测到可见端仍在运行但 worker 状态异常(如 `stopped` / `error`),会自动重启 bridge 再重新打开可见端;
|
|
186
|
+
- 在其他目录执行会显式切换活动工作区。
|
|
187
|
+
|
|
188
|
+
### 6. 常驻 daemon 模式(支持多 CLI 切换)
|
|
189
|
+
|
|
190
|
+
如果你希望远程通道连接长期保持在线,并在 Codex / Claude Code / OpenCode / Pi 之间来回切换,可以在项目目录启动统一 daemon:
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
cd D:\work\your-project
|
|
194
|
+
wechat-daemon
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
企业微信使用同样的 daemon 工作流:
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
wecom-daemon --adapter claude
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
启动后,在对应远程通道里发送以下指令即可选择当前活动终端:
|
|
204
|
+
|
|
205
|
+
| 指令 | 行为 |
|
|
206
|
+
| --- | --- |
|
|
207
|
+
| `/codex [prompt]` | 切换到 Codex;携带 prompt 时切换后立即转发剩余文本 |
|
|
208
|
+
| `/claude [prompt]` | 切换到 Claude Code;携带 prompt 时切换后立即转发剩余文本 |
|
|
209
|
+
| `/opencode [prompt]` | 切换到 OpenCode;携带 prompt 时切换后立即转发剩余文本 |
|
|
210
|
+
| `/pi [prompt]` | 切换到 Pi;携带 prompt 时切换后立即转发剩余文本 |
|
|
211
|
+
|
|
212
|
+
daemon 启动后,后续切换都可以直接从对应远程通道发起;如果对应 CLI 还没有可见窗口,daemon 会自动打开或复用它,不需要再手动运行适配器命令。
|
|
213
|
+
|
|
214
|
+

|
|
215
|
+
|
|
216
|
+

|
|
217
|
+
|
|
218
|
+

|
|
219
|
+
|
|
220
|
+
当前 daemon 行为如下:
|
|
221
|
+
|
|
222
|
+
- daemon 绑定启动时的工作目录;暂不支持从远程通道切换工作目录;
|
|
223
|
+
- 启动时会自动接管并清理旧的单 bridge 进程、失效 lock 和旧 endpoint;
|
|
224
|
+
- 如果还没有对应 CLI,daemon 会自动打开一个新的可见终端;
|
|
225
|
+
- Codex / Claude / OpenCode / Pi 的重要输出都会带上 `[codex]`、`[claude]`、`[opencode]`、`[pi]` 标签再发回对应远程通道;
|
|
226
|
+
- 可以在对应远程通道里发送 `/daemon-stop` 停止 daemon。
|
|
227
|
+
|
|
228
|
+
也可以在启动时指定初始 CLI:
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
wechat-daemon --adapter codex
|
|
232
|
+
wechat-daemon --adapter claude --profile work
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
当同一工作目录已有对应通道的 daemon 在运行时,直接启动命令会自动委托给 daemon:请求 daemon 切到对应 CLI,并在需要时打开可见终端,不会停止 daemon 或关闭其他 CLI。
|
|
236
|
+
|
|
237
|
+
## 三、适配器支持情况
|
|
238
|
+
|
|
239
|
+
> 目前支持将本地文件发送到微信或企业微信,微信和企业微信也允许发送文件给本地 CLI 解析(注意模型本身要具备处理对应文件的能力!)
|
|
240
|
+
|
|
241
|
+

|
|
242
|
+
|
|
243
|
+
微信或企业微信发来的图片和普通文件也会被接收并保存到本地:
|
|
244
|
+
|
|
245
|
+
- bridge 会将本地路径追加到转发给 Codex / Claude Code / OpenCode / Pi 的 prompt 中,模型可按需读取或解析这些文件;
|
|
246
|
+
- 当前不会自动 OCR 图片,也不会自动抽取 PDF / DOCX 正文;如需解析,由本地 CLI 根据路径完成。
|
|
247
|
+
- 具体保存位置见 [问题排查](docs/troubleshooting.md#数据目录与状态文件)。
|
|
248
|
+
|
|
249
|
+
| 适配器 | 当前状态 | 说明 |
|
|
250
|
+
| --- | --- | --- |
|
|
251
|
+
| `codex` | 已接入 | `wechat-codex` / `wecom-codex` 自动确保内部 runtime 并打开可见 Codex;远程通道跟随本地 thread |
|
|
252
|
+
| `claude` | 已接入 | `wechat-claude` / `wecom-claude` 自动启动或复用 Claude Code;会话、最终回复与审批按 Claude session 语义同步 |
|
|
253
|
+
| `opencode` | 已接入 | `wechat-opencode` / `wecom-opencode` 自动启动或复用 OpenCode;支持本地 session 跟随及远程通道 `/new` / `/new-session` |
|
|
254
|
+
| `pi` | 已接入 | `wechat-pi` / `wecom-pi` 启动用户原生 Pi TUI,并通过本地 extension 让远程通道接管同一 session,支持最终回复、停止、新建和恢复 session |
|
|
255
|
+
|
|
256
|
+
Pi 按全权限本地代理运行:bridge 不增加工具审批层,并传入 `--approve` 信任当前项目;读写文件和执行命令均使用启动 `wechat-pi` 的本地用户权限。原生 TUI 的主题、快捷键、模型选择和 extension UI 都会保留。`wechat-pi` 本身就是被微信接管的 Pi TUI;不要再启动第二个 Pi 进程同时写入同一个 session 文件。Pi `0.85.0` 及更新版本要求 Node.js `>=22.19.0`,低于该版本时 `wechat-pi` / `wecom-pi` 会在启动前明确提示。
|
|
257
|
+
|
|
258
|
+
### Codex 示例
|
|
259
|
+
|
|
260
|
+

|
|
261
|
+
|
|
262
|
+

|
|
263
|
+
|
|
264
|
+
### Claude Code 示例
|
|
265
|
+
|
|
266
|
+

|
|
267
|
+
|
|
268
|
+

|
|
269
|
+
|
|
270
|
+
### OpenCode / Pi 示例
|
|
271
|
+
|
|
272
|
+
OpenCode 模式下,微信和企业微信侧都支持 `/new` 或 `/new-session` 创建新 session;如果在本地 OpenCode CLI 中创建新 session,远程通道消息也会跟随新的 session。
|
|
273
|
+
|
|
274
|
+
## 四、终端侧命令说明
|
|
275
|
+
|
|
276
|
+
所有命令都在目标项目目录中执行。`wechat-*` 使用个人微信,`wecom-*` 使用企业微信;两类入口的适配器名称和参数保持一致。
|
|
277
|
+
|
|
278
|
+
### 4.1 全局入口
|
|
279
|
+
|
|
280
|
+
| 用途 | 微信 | 企业微信 | 说明 |
|
|
281
|
+
| --- | --- | --- | --- |
|
|
282
|
+
| 登录 / 配对 | `wechat-setup` | `wecom-setup` | 微信扫码登录;企业微信输入 Bot ID、Secret 并完成 `/pair` |
|
|
283
|
+
| 常驻 daemon | `wechat-daemon` | `wecom-daemon` | 在当前目录保持远程连接并管理多个 CLI slot |
|
|
284
|
+
| Codex | `wechat-codex` | `wecom-codex` | 启动或复用 Codex 可见终端 |
|
|
285
|
+
| Claude Code | `wechat-claude` | `wecom-claude` | 启动或复用 Claude Code 可见终端 |
|
|
286
|
+
| OpenCode | `wechat-opencode` | `wecom-opencode` | 启动或复用 OpenCode 可见终端 |
|
|
287
|
+
| Pi | `wechat-pi` | `wecom-pi` | 启动或复用 Pi 原生 TUI |
|
|
288
|
+
|
|
289
|
+
1.1.5 已移除完成弃用周期的 `wechat-*-start` 别名;请直接使用上表中的入口。公开的 `wechat-bridge*` 命令和 Shell adapter 也已移除,内部 bridge runtime 由直接命令和 daemon 自动管理。
|
|
290
|
+
|
|
291
|
+
### 4.2 常驻 daemon
|
|
292
|
+
|
|
293
|
+
| 参数 | 作用 | 示例 |
|
|
294
|
+
| --- | --- | --- |
|
|
295
|
+
| `--cwd <path>` | 绑定 daemon 的工作目录 | `wechat-daemon --cwd D:\work\my-project` |
|
|
296
|
+
| `--adapter <codex / claude / opencode / pi>` | 启动后切换到指定 CLI | `wechat-daemon --adapter claude` |
|
|
297
|
+
| `--profile <name-or-path>` | 将 profile 传给对应适配器 | `wechat-daemon --adapter claude --profile work` |
|
|
298
|
+
| `--no-open` | 创建 runtime slot,但不自动打开可见 CLI | `wechat-daemon --no-open` |
|
|
299
|
+
| `--doctor` | 检查 Node.js、CLI、锁、endpoint 和 daemon 状态 | `wechat-daemon --doctor` |
|
|
300
|
+
|
|
301
|
+
企业微信 daemon 使用相同参数,例如 `wecom-daemon --adapter claude --profile work`。daemon 绑定启动时的工作目录;具体的微信 / 企业微信侧控制指令见[下一章](#五微信--企业微信侧支持的指令)。
|
|
302
|
+
|
|
303
|
+
### 4.3 直接启动适配器
|
|
304
|
+
|
|
305
|
+
| 适配器 | 微信入口 | 企业微信入口 | 默认会话策略 |
|
|
306
|
+
| --- | --- | --- | --- |
|
|
307
|
+
| Codex | `wechat-codex` | `wecom-codex` | 恢复当前会话 |
|
|
308
|
+
| Claude Code | `wechat-claude` | `wecom-claude` | 新建会话 |
|
|
309
|
+
| OpenCode | `wechat-opencode` | `wecom-opencode` | 新建会话 |
|
|
310
|
+
| Pi | `wechat-pi` | `wecom-pi` | 新建会话 |
|
|
311
|
+
|
|
312
|
+
通用参数:
|
|
313
|
+
|
|
314
|
+
| 参数 | 作用 | 示例 |
|
|
315
|
+
| --- | --- | --- |
|
|
316
|
+
| `--cwd <path>` | 指定 runtime 和可见 CLI 的工作目录 | `wechat-claude --cwd D:\work\my-project` |
|
|
317
|
+
| `--profile <name-or-path>` | 传给内部 runtime | `wechat-claude --profile work` |
|
|
318
|
+
| `--timeout-ms <ms>` | 等待当前目录 endpoint 的最长时间,默认 `15000` | `wechat-codex --timeout-ms 30000` |
|
|
319
|
+
| `--session-start-mode <restore / new>` | 显式选择恢复或新建会话 | `wechat-pi --session-start-mode restore` |
|
|
320
|
+
| `--doctor` | 检查选定适配器和工作区,不启动 CLI | `wechat-claude --doctor` |
|
|
321
|
+
| 其他参数 | 继续透传给可见的底层 CLI | `wechat-codex --model gpt-5.2 --yolo` |
|
|
322
|
+
|
|
323
|
+
`--yolo` 会传给 Codex,`--dangerously-skip-permissions` 会传给 Claude Code;这些参数只影响本地可见 CLI,不会覆盖内部 runtime、通道凭据或工作区锁。对应的企业微信入口只需将命令前缀替换为 `wecom-`。
|
|
324
|
+
|
|
325
|
+
### 4.4 更新
|
|
326
|
+
|
|
327
|
+
| 操作 | 命令 | 说明 |
|
|
328
|
+
| --- | --- | --- |
|
|
329
|
+
| 检查更新 | `wechat-check-update` / `wecom-check-update` | 查询 npm 上的最新版本 |
|
|
330
|
+
| 升级 | `npm install -g cli-wechat-bridge@latest` | 升级后重启正在运行的 bridge、daemon 和 companion |
|
|
331
|
+
|
|
332
|
+
直接启动命令也支持 `--doctor`,用于检查选定适配器和当前工作区而不启动 CLI。
|
|
333
|
+
|
|
334
|
+
## 五、微信 / 企业微信侧支持的指令
|
|
335
|
+
|
|
336
|
+
以下通用指令同时适用于微信和企业微信。普通文本会发送到当前活动会话;带 `[prompt]` 的适配器切换指令会先切换 CLI,再转发剩余文本。
|
|
337
|
+
|
|
338
|
+
### 5.1 通用控制指令
|
|
339
|
+
|
|
340
|
+
| 指令 | 适用范围 | 行为 |
|
|
341
|
+
| --- | --- | --- |
|
|
342
|
+
| 普通文本 | 直接启动、daemon | 发送到当前活动会话 |
|
|
343
|
+
| `/codex [prompt]` | daemon | 切换到 Codex;可选 prompt 在切换成功后转发 |
|
|
344
|
+
| `/claude [prompt]` | daemon | 切换到 Claude Code;可选 prompt 在切换成功后转发 |
|
|
345
|
+
| `/opencode [prompt]` | daemon | 切换到 OpenCode;可选 prompt 在切换成功后转发 |
|
|
346
|
+
| `/pi [prompt]` | daemon | 切换到 Pi;可选 prompt 在切换成功后转发 |
|
|
347
|
+
| `/status` | 直接启动、daemon | 查看 bridge、daemon、适配器和工作区状态 |
|
|
348
|
+
| `/model`、`/model <编号>` | Codex、Claude Code、OpenCode、Pi | 列出模型并切换当前会话的模型;编号列表 5 分钟内有效 |
|
|
349
|
+
| `/plan`、`/plan on`、`/plan off` | Codex、Claude Code、OpenCode | 开启计划模式,或恢复进入前的模式 / primary agent |
|
|
350
|
+
| `/stop` | 直接启动、daemon | 中断当前任务 |
|
|
351
|
+
| `/reset` | 直接启动、daemon | 重建当前本地会话 |
|
|
352
|
+
| `/new`、`/new-session` | OpenCode、Pi | 创建新的 session |
|
|
353
|
+
| `/resume`、`/resume <编号或 ID 前缀>` | Codex、Claude Code、OpenCode、Pi | 列出并恢复当前工作目录的最近 thread/session;列表编号 5 分钟内有效 |
|
|
354
|
+
| `/confirm`、`/yes` | 直接启动、daemon | 有待审批时批准当前权限请求 |
|
|
355
|
+
| `/deny`、`/no` | 直接启动、daemon | 有待审批时拒绝当前权限请求 |
|
|
356
|
+
| `confirm`、`yes` | 有待审批时 | `/confirm` 的文本别名 |
|
|
357
|
+
| `deny`、`no` | 有待审批时 | `/deny` 的文本别名 |
|
|
358
|
+
| `/answer <key>=<value>` | 有待回答问题时 | 提交 Codex、OpenCode 等适配器的结构化回答 |
|
|
359
|
+
| `/daemon-stop` | daemon | 停止当前常驻 daemon |
|
|
360
|
+
| `/pair <code>` | 企业微信首次配置 | 在 `wecom-setup` 提示后完成操作者配对 |
|
|
361
|
+
|
|
362
|
+
Claude Code 的模型、计划模式控制需要可见 CLI 处于空闲原生提示符,且没有待审批、本地草稿或打开的弹窗。操作会短暂打开原生选择器并等待确认;控制期间操作本地键盘会取消远程控制。Claude Code 使用选择器的 `s`(仅当前会话)切换模型,需要 CLI 支持此选项;`/plan off` 会恢复进入计划模式前的 permission mode,没有记录时恢复 `default`。
|
|
363
|
+
|
|
364
|
+
OpenCode 的控制不依赖可见 TUI 的输入框、菜单或当前面板。桥接通过 OpenCode server 的会话 API 查询已连接模型、提交模型与 primary agent,并回读 session 确认结果;微信和企业微信消息直接通过 SDK 提交,同时显式携带已生效的 agent、model 和 variant。OpenCode 的 `/plan` 选择 `plan` primary agent;缺少该 agent 时会提示错误,`/plan off` 没有历史记录时恢复 `build` 或首个非 plan primary agent。
|
|
365
|
+
|
|
366
|
+
Pi 的 `/model` 通过已连接原生 TUI extension 读取当前 scoped model 列表;没有 scoped models 时使用 model registry 中可用的模型,并通过 `pi.setModel()` 切换。Pi 的 `/plan` 仍由可选扩展定义,不作为 bridge 的通用控制命令。
|
|
367
|
+
|
|
368
|
+
模型列表绑定当前会话、CLI 进程和操作者;切换会话或 daemon 活动 CLI 后请重新发送 `/model`。Claude 原生菜单名称被终端宽度截断或无法唯一识别时,桥接会提示刷新或扩大终端;OpenCode 只有在 server 回读确认后才报告切换成功。
|
|
369
|
+
|
|
370
|
+
### 5.2 会话恢复与本地同步
|
|
371
|
+
|
|
372
|
+
| 适配器 | 远程 `/resume` | 本地切换同步 |
|
|
373
|
+
| --- | --- | --- |
|
|
374
|
+
| Codex | 从当前 cwd 获取 CLI / VS Code 根 thread,执行 `thread/read`、`thread/resume` 预检,确认可见客户端稳定后提交 shared thread | Codex picker 或本地 `/resume` 产生的 thread 切换会同步到远程通道 |
|
|
375
|
+
| Claude Code | 向当前 PTY 提交精确 `/resume <UUID>`,等待 `SessionEnd(reason=resume)` 和目标 `SessionStart(source=resume)` | 本地 picker 或 `/resume` 产生相同 Hook 序列,远程通道跟随新的 transcript |
|
|
376
|
+
| OpenCode | 列出当前 cwd 的 session 并恢复选定 session | 本地 picker、`/resume` 或新建 session 后,远程通道跟随新的 session |
|
|
377
|
+
| Pi | 列出当前 cwd 的 session 并恢复选定 session | 本地 session 切换后,远程通道跟随新的 session;Pi turn 完成后发送一次最终回复 |
|
|
378
|
+
|
|
379
|
+
所有适配器的 `/resume` 都只处理 daemon / bridge 启动目录内的最近 root thread/session,并等待当前任务进入 idle。有任务、审批或待回答问题时请先处理或使用 `/stop`;仍处于 active 状态的 Codex thread,以及仍在运行的 Claude background session,不允许从远程通道接管。OpenCode 和 Pi 的本地 session 切换会使之前的编号列表失效;如果切换发生在远程任务执行期间,bridge 会先中断旧任务。
|
|
380
|
+
|
|
381
|
+
### 5.3 daemon 表情绑定
|
|
382
|
+
|
|
383
|
+
Daemon 模式支持将消息开头的表情映射为命令。表情绑定对微信和企业微信 daemon 均使用同一份配置,修改后立即生效并持久化到 `~/.cli-bridge/emoji-bindings.json`。
|
|
384
|
+
|
|
385
|
+

|
|
386
|
+
|
|
387
|
+
| 表情 | 默认命令 | 作用 |
|
|
388
|
+
| --- | --- | --- |
|
|
389
|
+
| `[OK]` | `/confirm` | 批准权限请求 |
|
|
390
|
+
| `[闭嘴]` | `/stop` | 中断当前任务 |
|
|
391
|
+
| `[拥抱]` | `/claude` | 切换到 Claude Code |
|
|
392
|
+
| `[强]` | `/codex` | 切换到 Codex |
|
|
393
|
+
| `[胜利]` | `/opencode` | 切换到 OpenCode |
|
|
394
|
+
| `[再见]` | `/daemon-stop` | 停止 daemon |
|
|
395
|
+
|
|
396
|
+
| 管理指令 | 行为 |
|
|
397
|
+
| --- | --- |
|
|
398
|
+
| `/bindings` | 查看当前所有绑定 |
|
|
399
|
+
| `/bind [表情] /命令` | 绑定表情到命令,例如 `/bind [微笑] /status` |
|
|
400
|
+
| `/unbind [表情]` | 解除表情绑定,例如 `/unbind [微笑]` |
|
|
401
|
+
|
|
402
|
+
表情必须出现在消息开头才会触发;表情后面的文本会在执行命令后继续转发;匹配不区分大小写。
|
|
403
|
+
|
|
404
|
+
## 六、致谢 & License
|
|
405
|
+
|
|
406
|
+
### 感谢支持
|
|
407
|
+
|
|
408
|
+
> 感谢 issue 反馈者和 PR 贡献者。
|
|
409
|
+
|
|
410
|
+
创作不易,如果觉得它有帮助或有意思,可以请喝杯奶茶。❤️
|
|
411
|
+
|
|
412
|
+
<p align='center'><img src='docs/images/wechat-tip.png' width=60%></p>
|
|
413
|
+
|
|
414
|
+
### 相关链接
|
|
415
|
+
|
|
416
|
+
主要依赖:
|
|
417
|
+
|
|
418
|
+
- [@opencode-ai/sdk](https://www.npmjs.com/package/@opencode-ai/sdk):OpenCode session 和事件流客户端
|
|
419
|
+
- [@wecom/aibot-node-sdk](https://www.npmjs.com/package/@wecom/aibot-node-sdk):企业微信智能机器人 WebSocket 长连接客户端
|
|
420
|
+
- [@modelcontextprotocol/sdk](https://github.com/modelcontextprotocol/typescript-sdk):MCP server 入口使用的 TypeScript SDK
|
|
421
|
+
- [node-pty](https://github.com/microsoft/node-pty):本地 PTY / ConPTY 进程桥接
|
|
422
|
+
- [qrcode-terminal](https://github.com/gtanner/qrcode-terminal):终端二维码输出
|
|
423
|
+
|
|
424
|
+
运行与开发基础:
|
|
425
|
+
|
|
426
|
+
- [Node.js](https://nodejs.org/):运行发布包和 CLI 入口
|
|
427
|
+
- [TypeScript](https://www.typescriptlang.org/):源码语言和构建工具链
|
|
428
|
+
- [Bun](https://bun.sh/):源码模式运行与测试工具
|
|
429
|
+
- [ESLint](https://eslint.org/):代码检查
|
|
430
|
+
|
|
431
|
+
社区与参考:
|
|
432
|
+
|
|
433
|
+
- [Linux DO](https://linux.do/):学 AI,上 L 站!
|
|
434
|
+
- [@tencent-weixin/openclaw-weixin](https://www.npmjs.com/package/@tencent-weixin/openclaw-weixin):腾讯微信团队发布的 OpenClaw Weixin channel npm 包
|
|
435
|
+
- [openclaw-weixin](https://github.com/hao-ji-xing/openclaw-weixin):早期 WeChat / Claude Code Channel 参考项目。
|
|
436
|
+
|
|
437
|
+
### License
|
|
438
|
+
|
|
439
|
+
本项目采用**双协议**授权:
|
|
440
|
+
|
|
441
|
+
**开源协议:[AGPL-3.0](LICENSE.txt)**
|
|
442
|
+
|
|
443
|
+
- 个人使用、学习、研究:完全免费
|
|
444
|
+
- 修改和衍生作品必须以相同协议(AGPL-3.0)开源
|
|
445
|
+
- 通过网络提供基于本项目的服务,也必须公开完整源代码
|
|
446
|
+
|
|
447
|
+
**商业授权**
|
|
448
|
+
|
|
449
|
+
如果你希望在闭源商业产品中使用本项目(不公开你的源代码),需要获得商业许可。请联系作者获取商业授权方案:
|
|
450
|
+
|
|
451
|
+
- GitHub: [@UNLINEARITY](https://github.com/UNLINEARITY)
|
|
452
|
+
|
|
453
|
+
<!-- star-history:start -->
|
|
454
|
+
[](https://star-history.com/#UNLINEARITY/CLI-WeChat-Bridge&Date)
|
|
455
|
+
<!-- star-history:end -->
|