chatccc 0.2.52 → 0.2.53

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.
Files changed (39) hide show
  1. package/README.md +95 -256
  2. package/bin/chatccc.mjs +23 -23
  3. package/demo/ilink_echo_probe.ts +222 -222
  4. package/im-skills/feishu-skill/download-video.mjs +162 -162
  5. package/im-skills/feishu-skill/receive-send-file.md +66 -66
  6. package/im-skills/feishu-skill/receive-send-image.md +27 -27
  7. package/im-skills/feishu-skill/send-file.mjs +50 -50
  8. package/im-skills/feishu-skill/send-image.mjs +50 -50
  9. package/im-skills/feishu-skill/skill.md +10 -10
  10. package/package.json +59 -59
  11. package/src/__tests__/agent-image-rpc.test.ts +33 -33
  12. package/src/__tests__/agent-rpc-body.test.ts +41 -41
  13. package/src/__tests__/card-plain-text.test.ts +42 -42
  14. package/src/__tests__/codex-adapter.test.ts +304 -304
  15. package/src/__tests__/config-reload.test.ts +26 -26
  16. package/src/__tests__/config-sample.test.ts +19 -19
  17. package/src/__tests__/crash-logging.test.ts +62 -62
  18. package/src/__tests__/fixtures/codex_simple_text.jsonl +4 -4
  19. package/src/__tests__/fixtures/codex_with_tool.jsonl +6 -6
  20. package/src/__tests__/im-skills.test.ts +46 -46
  21. package/src/__tests__/session.test.ts +57 -2
  22. package/src/__tests__/sim-agent.test.ts +173 -173
  23. package/src/__tests__/sim-platform.test.ts +76 -76
  24. package/src/__tests__/sim-store.test.ts +213 -213
  25. package/src/__tests__/stream-state.test.ts +134 -134
  26. package/src/__tests__/wechat-platform.test.ts +57 -32
  27. package/src/adapters/codex-adapter.ts +294 -294
  28. package/src/adapters/codex-session-meta-store.ts +130 -130
  29. package/src/agent-file-rpc.ts +156 -156
  30. package/src/agent-image-rpc.ts +152 -152
  31. package/src/agent-rpc-body.ts +48 -48
  32. package/src/card-plain-text.ts +108 -108
  33. package/src/im-skills.ts +109 -109
  34. package/src/platform-adapter.ts +60 -60
  35. package/src/session-chat-binding.ts +6 -1
  36. package/src/session.ts +40 -35
  37. package/src/sim-agent.ts +167 -167
  38. package/src/trace.ts +50 -50
  39. package/src/wechat-platform.ts +1 -1
package/README.md CHANGED
@@ -1,21 +1,10 @@
1
1
  # ChatCCC
2
2
 
3
- **飞书(推荐,体验丝滑)/ 微信 聊天控制 Claude Code / Cursor / Codex**
3
+ **用飞书或微信聊天控制 Claude Code / Cursor / Codex。**
4
4
 
5
- ---
6
-
7
- ## 解决的核心痛点
8
-
9
- 传统的 Claude Code(尤其是使用第三方 API 的,如 DeepSeek),需要坐在电脑桌前才能用。**离开电脑就没法用了。**
10
-
11
- ChatCCC 把 Claude Code、Cursor Agent、Codex (OpenAI) 接入了飞书群聊和微信私聊:
5
+ ChatCCC 把本地 AI 编程工具接入即时通讯软件。你可以在手机上发消息,让 Claude Code、Cursor Agent 或 Codex 继续写代码、查问题、跑命令;不用一直守在电脑前。
12
6
 
13
- - **手机上也能用 Claude Code / Cursor / Codex** —— 在飞书群或微信里发消息就等于在终端输入指令,AI 的思考和回复会流式展示在群卡片里(微信为文本模式)
14
- - **双平台支持** —— 飞书(群聊 + 卡片)和微信 iLink(私聊 + 文本),一套代码同时服务两个平台
15
- - **多会话并行** —— 一个群就是一个 AI 会话,完全隔离、互不干扰,并行工作效率更高
16
- - **多工具切换** —— `/new` 使用默认 Agent 创建会话,也可用 `/new claude`、`/new cursor`、`/new codex` 指定工具,各取所长
17
-
18
- 一句话:**在任何设备上打开飞书,就能让 Claude Code / Cursor / Codex 帮你写代码、排查问题、分析项目。**
7
+ 飞书是推荐入口:群聊就是会话,卡片能流式更新,体验完整。微信 iLink 更适合快速试用或临时使用:扫码即可接入,但只能走私聊文本模式。
19
8
 
20
9
  <p align="center">
21
10
  <img src="images/img_readme_messages.jpg" alt="飞书会话列表" width="220" align="top" />
@@ -27,51 +16,27 @@ ChatCCC 把 Claude Code、Cursor Agent、Codex (OpenAI) 接入了飞书群聊和
27
16
 
28
17
  ---
29
18
 
30
- ## 为什么选 ChatCCC
31
-
32
- - **一群一会话,心智最简单** —— `/new` 直接建一个新飞书群,群本身就是 AI 会话上下文。换会话就是换群,没有 thread / 子话题概念,手机端切换最直观
33
- - **零配置成本** —— 单一 `config.json`,没有 TOML 也没有零散环境变量。`npm i -g chatccc` 后**任意目录**直接 `chatccc` 就跑,首次启动自动弹出本地 Web 配置向导
34
- - **群里能跑 git** —— `/git status`、`/git pull`、`/git log` 在飞书群里直接执行 stdout/stderr 回发,不用回电脑
35
- - **代码极简易改** —— 纯 TypeScript 实现,核心只有 20 多个文件,统一 `ToolAdapter` 接口屏蔽 Claude / Cursor / Codex 差异,看得懂、改得动
36
- - **微信 iLink 支持** —— 扫码登录微信个人号,即可在微信中与 AI 对话。微信端为纯文本模式(无卡片),生成过程中的内容以增量方式推送,避免重复刷屏。
37
-
38
- ---
19
+ ## 为什么用 ChatCCC
39
20
 
40
- ## 微信 iLink 平台
21
+ - **手机上也能用 AI 编程工具**:在飞书或微信发消息,就像在终端给 Agent 下指令。
22
+ - **飞书体验更完整**:一群一会话、CardKit 卡片流式更新、支持群管理和多会话并行。
23
+ - **微信接入更轻**:不用创建飞书应用,启动后扫码即可在微信私聊里使用。
24
+ - **多 Agent 切换**:`/new` 使用默认 Agent,也可以用 `/new claude`、`/new cursor`、`/new codex` 指定工具。
25
+ - **群里能跑 git**:`/git status`、`/git pull`、`/git log` 会在当前会话工作目录执行,并把输出发回聊天窗口。
41
26
 
42
- 除了飞书,ChatCCC 也支持通过 [微信 iLink](https://github.com/openilink/openilink-sdk-node) 接入微信个人号。**微信模式无需任何配置,启动后扫码即可使用。**
27
+ ## 飞书和微信的差异
43
28
 
44
- ### 快速开始(微信)
45
-
46
- ```bash
47
- chatccc # 启动 ChatCCC
48
- # → 控制台打印出微信扫码二维码
49
- # → 打开微信扫一扫 → 关注机器人
50
- # → 发送 /new 开始对话
51
- ```
52
-
53
- 就这么简单。**不用创建飞书应用、不用配置权限、不用订阅回调。** 扫一下控制台上的二维码就能用。
54
-
55
- ### 微信与飞书的差异
56
-
57
- | 特性 | 飞书 | 微信 |
29
+ | 项目 | 飞书(推荐) | 微信 iLink |
58
30
  | --- | --- | --- |
59
- | 会话类型 | 群聊(一群一会话) | 私聊(一对一) |
60
- | 消息展示 | CardKit 卡片(流式更新) | 纯文本(增量推送,结尾标记"━━━ 回答结束 ━━━") |
61
- | `/new` 行为 | 创建新群聊 | 在当前私聊中创建新会话 |
62
- | `/newh` 行为 | 群内重置会话 | 私聊内重置会话 |
63
- | 非指令消息 | 走卡片进度展示 | 立即回复"生成中...",增量推送结果 |
64
- | 群管理 | 创建/重命名/解散/设置头像 | 不支持 |
65
- | 启动方式 | 飞书应用凭证 + WebSocket | 扫码登录(QR 码) |
66
- | 连接保活 | WebSocket 长连接 | HTTP 长轮询 |
67
-
68
- ### 启用微信
31
+ | 使用场景 | 长期主力使用 | 快速试用、临时远程控制 |
32
+ | 会话形态 | 群聊,一群一会话 | 私聊,一对一 |
33
+ | 消息展示 | CardKit 卡片,流式更新 | 纯文本,增量推送 |
34
+ | `/new` | 自动创建新群并绑定新会话 | 在当前私聊里创建新会话 |
35
+ | 多会话并行 | 直接切换不同群 | 需要在同一私聊内切换上下文 |
36
+ | 群管理 | 支持创建、重命名、解散、头像 | 不支持 |
37
+ | 接入成本 | 需要配置飞书应用 | 启动后扫码登录 |
69
38
 
70
- `config.json` `platforms.ilink.enabled` 设为 `true`(默认已开启)。启动 ChatCCC 后,终端会打印微信扫码登录二维码,使用微信扫描即可登录。
71
-
72
- > 微信 iLink 登录的 token 和 context 会持久化到 `state/ilink-auth.json`,下次启动时会自动尝试复用。token 过期后重新扫码即可。
73
-
74
- > 微信模式下无须配置飞书应用、无须订阅事件回调。只需启动 ChatCCC → 扫码 → 在微信中找到机器人即可对话。
39
+ 如果你主要在手机上长期控制 AI 编程工具,优先用飞书;如果只是想马上跑起来,微信更省配置。
75
40
 
76
41
  ---
77
42
 
@@ -83,21 +48,14 @@ chatccc # 启动 ChatCCC
83
48
 
84
49
  ```bash
85
50
  npm install -g chatccc
86
- ```
87
-
88
- 要求 Node.js >= 20。安装完成后,**在任意目录**直接启动即可:
89
-
90
- ```bash
91
51
  chatccc
92
52
  ```
93
53
 
94
- > ChatCCC 的所有数据(`config.json`、`logs/`、`state/`)都保存在 npm 包安装目录下,与你当前终端所在目录无关。**不需要先 `cd` 到任何特定目录。**
54
+ 要求 Node.js >= 20。安装完成后,在任意目录执行 `chatccc` 即可启动。配置、日志和状态文件会保存在包目录下的 `config.json`、`logs/`、`state/`。
95
55
 
96
- 首次启动时若 `config.json` 还没有有效凭证,会自动起一个本地 Web 配置向导(默认 `http://127.0.0.1:18080`),用浏览器把飞书 App ID / App Secret 等填进去,保存即开始运行。
56
+ 首次启动时,如果还没有有效配置,ChatCCC 会自动打开本地 Web 配置向导(默认 `http://127.0.0.1:18080`)。
97
57
 
98
- > 已在运行的实例,启动完成后控制台底部 banner 也会打印「配置面板」地址,随时可以打开浏览器查看状态、修改配置(多数改动无需重启即可生效)。停止 / 重启请通过页面顶部按钮或终端 `Ctrl+C`,**面板上不再提供"启动"按钮**——服务停止后页面随进程退出,需要回到终端重新执行 `chatccc`。
99
-
100
- #### 从源码安装
58
+ #### 从源码运行
101
59
 
102
60
  ```bash
103
61
  git clone https://github.com/wzj998/ChatCCC.git
@@ -106,162 +64,84 @@ npm install
106
64
  npm run dev
107
65
  ```
108
66
 
109
- 启动后机器人通过 WebSocket 连接飞书服务器,日志会写入仓库根目录下的 `logs/`。
110
-
111
- #### Cursor Agent CLI(使用 Cursor 会话时需要)
67
+ ### 2. 即时通讯软件配置
112
68
 
113
- ChatCCC **不捆绑** Cursor Agent CLI,需要用户自行安装。
69
+ #### 飞书(推荐)
114
70
 
115
- **推荐安装方式(Windows):**
71
+ 1. 打开 [飞书开放平台](https://open.feishu.cn),创建一个**企业自建应用**。
72
+ 2. 在「应用功能」里开启**机器人**能力。
73
+ 3. 在「权限管理」里开通 `im:` 和 `cardkit:` 前缀下的相关权限:
116
74
 
117
- PowerShell 中执行:
75
+ | 前缀 | 用途 |
76
+ | --- | --- |
77
+ | `im:` | 收发消息、创建和管理群聊、机器人发言 |
78
+ | `cardkit:` | 卡片展示、流式更新、按钮和交互回调 |
118
79
 
119
- ```powershell
120
- irm 'https://cursor.com/install?win32=true' | iex
121
- ```
80
+ <p align="center">
81
+ <img src="images/img_readme_permission.png" alt="飞书应用权限配置" width="280" />
82
+ </p>
122
83
 
123
- 安装完成后 `agent` 命令会出现在系统 PATH 中。
84
+ 4. 在「事件与回调」里订阅 `im.message.receive_v1` `card.action.trigger`。
124
85
 
125
- **其他安装方式:**
86
+ <p align="center">
87
+ <img src="images/img_readme_event.png" alt="飞书事件订阅" width="280" />
88
+ &emsp;
89
+ <img src="images/img_readme_callback.png" alt="飞书请求网址与回调" width="280" />
90
+ </p>
126
91
 
127
- 1. **Cursor IDE 自带**:安装 [Cursor IDE](https://cursor.com) 后,部分版本会自带 `agent` 或 `cursor-agent` 命令
128
- 2. **独立安装**:Cursor 正在逐步提供独立的 CLI 安装方式
92
+ 5. 创建应用版本并发布(企业内部可用即可)。
93
+ 6. 在「凭证与基础信息」复制 **App ID** 和 **App Secret**,填入本地 Web 配置向导或 `config.json`。
129
94
 
130
- 安装后需登录 Cursor 账号:
95
+ 如果你同时使用公司飞书和个人飞书,建议把个人账号放在另一个客户端里:安卓可用系统「应用双开」,iOS 可用 Lark。
131
96
 
132
- ```bash
133
- agent login
134
- ```
97
+ #### 微信 iLink(可选)
135
98
 
136
- 验证是否已安装(任一可用即可):
99
+ 微信模式不需要创建飞书应用。保持 `config.json` 里的 `platforms.ilink.enabled` 为 `true`(默认开启),启动 `chatccc` 后,终端会打印微信扫码登录二维码。
137
100
 
138
101
  ```bash
139
- agent --version
140
- cursor-agent --version
102
+ chatccc
103
+ # 控制台出现二维码后,用微信扫一扫登录
104
+ # 在微信里找到机器人,发送 /new 开始对话
141
105
  ```
142
106
 
143
- ChatCCC 启动时会按以下顺序确定 Cursor Agent CLI:
107
+ 微信登录信息会保存到 `state/ilink-auth.json`。token 过期后重新扫码即可。
144
108
 
145
- 1. `config.json` 中的 `cursor.path` 指定的路径(若已配置)
146
- 2. Windows 上 Cursor IDE 默认安装位置 `%LOCALAPPDATA%\cursor-agent\agent.cmd`(自动识别)
147
- 3. PATH 中的 `agent` 命令
109
+ ### 3. AI 工具配置
148
110
 
149
- > 首次启动 ChatCCC 时,如果 `config.json` 不存在,会从 `config.sample.json` 复制一份并**立即探测一次** Cursor / Codex CLI 的绝对路径,命中就写入 `cursor.path` / `codex.path`,无须手动编辑。
111
+ ChatCCC 只负责把聊天消息转给本地 AI 工具,不捆绑这些 CLI。你只需要安装自己要用的 Agent。
150
112
 
151
- 若想强制使用某个非默认的可执行文件(例如 `cursor-agent` 而不是 `agent`),可在 `config.json` 中显式指定:
113
+ #### Claude Code
152
114
 
153
- ```json
154
- {
155
- "cursor": {
156
- "path": "/path/to/agent"
157
- }
158
- }
159
- ```
115
+ 如果使用官方 Claude Code,本机完成 Claude CLI 登录即可。若使用 DeepSeek 等 Anthropic 兼容网关,把 `claude.apiKey` 和 `claude.baseUrl` 填到 `config.json` 或 Web 配置向导。
160
116
 
161
- > 旧版字段 `cursor.command` 仍可读取(启动时会打印一次 warning 提示改名),新配置请统一使用 `cursor.path`。
117
+ #### Cursor Agent CLI
162
118
 
163
- > **说明**:只使用 Claude Code(`/new claude`,或把 Claude Code 设为默认 Agent 后使用 `/new`)的用户无需安装 Cursor CLI。
119
+ Windows 推荐安装:
164
120
 
165
- #### Codex CLI(使用 Codex 会话时需要)
166
-
167
- ChatCCC **不捆绑** Codex CLI,需要用户自行安装:
168
-
169
- ```bash
170
- npm install -g @openai/codex
121
+ ```powershell
122
+ irm 'https://cursor.com/install?win32=true' | iex
123
+ agent login
171
124
  ```
172
125
 
173
- 安装后需登录 OpenAI 账号:
126
+ 验证:
174
127
 
175
128
  ```bash
176
- codex login
129
+ agent --version
177
130
  ```
178
131
 
179
- 验证是否已安装:
132
+ #### Codex CLI
180
133
 
181
134
  ```bash
135
+ npm install -g @openai/codex
136
+ codex login
182
137
  codex --version
183
138
  ```
184
139
 
185
- Codex 会话的模型和努力程度由 `config.toml`(`~/.codex/config.toml`)决定,也可在 `config.json` 中显式覆盖:
186
-
187
- ```json
188
- {
189
- "codex": {
190
- "path": "",
191
- "model": "",
192
- "effort": ""
193
- }
194
- }
195
- ```
196
-
197
- - `codex.path`:留空时直接调用 PATH 中的 `codex`;可填绝对路径指向自定义可执行文件(首次创建 `config.json` 时会自动探测并填入)
198
- - `codex.model`:留空时由 `~/.codex/config.toml` 决定
199
- - `codex.effort`:留空时由 `~/.codex/config.toml` 决定(通过 `-c model_reasoning_effort` 传递)
200
-
201
- > 旧版字段 `codex.command` 仍可读取(启动时会打印一次 warning 提示改名),新配置请统一使用 `codex.path`。
202
-
203
- > **说明**:只使用 Claude Code 或 Cursor 的用户无需安装 Codex CLI。
204
-
205
- ### 2. 创建飞书应用
206
-
207
- 打开 [飞书开放平台](https://open.feishu.cn),创建一个**企业自建应用**。
208
-
209
- > **第一步:同时使用公司飞书和个人飞书**
210
- >
211
- > 如果你所在的公司也使用飞书,请看此步骤;否则请直接跳到第二步。
212
- >
213
- > 如果你既要在公司飞书中使用 ChatCCC,又想用个人飞书账号,推荐以下方案:
214
- >
215
- > **方案一:安卓手机**
216
- >
217
- > 使用系统的「应用双开」功能,把飞书复制一份。原版飞书登录公司账号,飞书复制版登录个人飞书账号,两个飞书可以同时在线、互不干扰。
218
- >
219
- > **方案二:苹果手机**
220
- >
221
- > 在 App Store 下载「飞书国际版(Lark)」。原版飞书登录公司账号,Lark 登录个人飞书账号,两个 App 互相独立、可同时在线。
222
-
223
- > **第二步:添加机器人(千万别忘!)**
224
- >
225
- > 创建应用后,立刻在「应用功能」中开启「机器人」能力。没有机器人,就根本找不到哪里和这个机器人对话,整个 ChatCCC 无法工作。
226
-
227
- **权限配置(重要)**(在「权限管理」中按前缀搜索,**将以下两类前缀开头的权限全部开通**):
228
-
229
- | 前缀 | 用途(简要) |
230
- | ---- | ------------ |
231
- | `im:` | 收发消息、创建与管理群聊、以机器人身份发言等(请将此前缀下所有权限全部开通) |
232
- | `cardkit:` | 群卡片展示、流式更新、卡片按钮与交互回调相关能力等 |
233
-
234
- 控制台中同一前缀下往往有多条子权限,请逐项勾选开通,避免遗漏导致收不到消息或卡片异常。
235
-
236
- <p align="center">
237
- <img src="images/img_readme_permission.png" alt="飞书应用权限配置" width="280" />
238
- </p>
239
-
240
- **事件订阅(重要)**(在「事件与回调」中):订阅 `im.message.receive_v1` 和 `card.action.trigger` 事件。
241
-
242
- <p align="center">
243
- <img src="images/img_readme_event.png" alt="飞书事件订阅" width="280" />
244
- &emsp;
245
- <img src="images/img_readme_callback.png" alt="飞书请求网址与回调" width="280" />
246
- </p>
247
-
248
- **发布版本(不要忘了)**:配置完成后创建应用版本并发布(仅企业内部可用即可)。
249
-
250
- ### 3. 获取凭证
140
+ Codex 的默认模型和推理强度可继续由 `~/.codex/config.toml` 管理,也可以在 `config.json` 中覆盖。
251
141
 
252
- 在飞书应用详情页的「凭证与基础信息」中,复制 **App ID** 和 **App Secret**。
142
+ ### 4. `config.json`
253
143
 
254
- ### 4. 配置 `config.json`
255
-
256
- ChatCCC 的所有运行参数都集中在包根目录的 `config.json`。
257
-
258
- #### 推荐:用 Web 配置向导(首次启动自动弹出)
259
-
260
- 第一次运行 `chatccc` 时,如果 `config.json` 还没有有效凭证,会自动起一个本地 Web 服务(默认 `http://127.0.0.1:18080`)。在浏览器里把上一步拿到的 **App ID** / **App Secret** 等填进去,保存即写入 `config.json`,进程立即继续启动飞书 WebSocket。
261
-
262
- #### 备选:手动编辑 `config.json`
263
-
264
- `config.json` 不存在时,ChatCCC 会从 `config.sample.json` 复制一份,结构如下:
144
+ `config.json` 不存在时,ChatCCC 会从 `config.sample.json` 复制一份。常用结构如下:
265
145
 
266
146
  ```json
267
147
  {
@@ -299,85 +179,44 @@ ChatCCC 的所有运行参数都集中在包根目录的 `config.json`。
299
179
  }
300
180
  ```
301
181
 
302
- 各字段含义:
303
-
304
- | 字段 | 必填 | 说明 |
305
- | --- | --- | --- |
306
- | `feishu.appId` / `feishu.appSecret` | | 飞书应用「凭证与基础信息」中的 App ID / App Secret |
307
- | `platforms.feishu.enabled` / `platforms.ilink.enabled` | | IM 平台开关;默认同时开启飞书和微信 iLink。开启微信后启动时会显示扫码登录二维码 |
308
- | `port` | | 本地 WebSocket 中继 + Web 向导监听端口,默认 `18080`;同机多实例时改成不同值即可 |
309
- | `gitTimeoutSeconds` | | `/git` 命令在会话工作目录执行时的单次超时秒数,默认 `180`,允许范围 `1–3600`,超时会被 `SIGKILL` 强制终止 |
310
- | `claude.enabled` / `cursor.enabled` / `codex.enabled` | 否 | 是否启用对应 AI Agent;Web 向导/管理页只展示 `enabled: true` 的 agent 卡片。字段缺省时按「任一配置字段非空」自动判定(向后兼容) |
311
- | `claude.defaultAgent` / `cursor.defaultAgent` / `codex.defaultAgent` | | `/new` 未指定具体 Agent 时使用哪个默认 Agent;同一时间应只有一个为 `true`。Web 配置页切换某个 Agent 为默认时会自动关闭其它 Agent 的默认开关 |
312
- | `claude.model` | | Claude Code 会话使用的模型;留空(`""` / 全空白)→ 不向 SDK 传 `model`,由 SDK / 服务商默认决定 |
313
- | `claude.effort` | 否 | Claude 思考深度(如 `low` / `medium` / `high` / `max`);留空 → 不向 SDK 传 `effort` |
314
- | `claude.apiKey` | 否 | 第三方 Anthropic 兼容网关的 API 密钥;**官方 Claude 用户保持 `""` 即可**,详见下文「第三方 API」一节 |
315
- | `claude.baseUrl` | 否 | 第三方 Anthropic 兼容网关的 base URL(例如 `https://api.deepseek.com/anthropic`);**官方 Claude 用户保持 `""` 即可** |
316
- | `cursor.model` | 否 | Cursor 会话使用的模型 ID(如 `claude-opus-4-7-max`);留空时不传 `--model`,可用 `agent --list-models` 查看支持的模型 |
317
- | `codex.model` | 否 | Codex 会话使用的模型;留空时由 `~/.codex/config.toml` 决定 |
318
- | `codex.effort` | 否 | Codex 努力程度(`low` / `medium` / `high`);留空时由 `~/.codex/config.toml` 决定 |
319
-
320
- > `claude.model` / `claude.effort` 的旧值 `"default"` 仍兼容,启动时会按留空处理并打印一次 warning,请尽快改成 `""`。
182
+ | 字段 | 说明 |
183
+ | --- | --- |
184
+ | `feishu.appId` / `feishu.appSecret` | 飞书应用凭证 |
185
+ | `platforms.feishu.enabled` | 是否启用飞书 |
186
+ | `platforms.ilink.enabled` | 是否启用微信 iLink |
187
+ | `port` | 本地 Web 配置面板和中继服务端口 |
188
+ | `gitTimeoutSeconds` | `/git` 命令超时时间,默认 180 |
189
+ | `*.enabled` | 是否启用对应 AI Agent |
190
+ | `*.defaultAgent` | `/new` 未指定 Agent 时使用哪个工具 |
191
+ | `cursor.path` / `codex.path` | CLI 可执行文件路径;留空时自动探测或使用 PATH |
192
+ | `claude.apiKey` / `claude.baseUrl` | 第三方 Anthropic 兼容网关配置;官方 Claude 用户留空 |
321
193
 
322
- > `cursor.path` / `codex.path` 由首次启动时的自动探测填入,一般无需手动修改。
323
-
324
- #### 第三方 API(如 DeepSeek):填 `claude.apiKey` 与 `claude.baseUrl`
325
-
326
- 若你通过 **Anthropic 兼容网关**(例如 DeepSeek 的 `/anthropic` 端点)调用模型,需要把网关凭证填到 `config.json` 的 `claude.apiKey` 与 `claude.baseUrl`。**官方 Claude 用户**(本机已通过 `claude` CLI 完成 OAuth 登录)保持这两项 `""` 即可,无需任何额外配置。
327
-
328
- 两条等价的填写路径:
329
-
330
- **1. Web 配置向导(推荐)**
331
-
332
- 打开 `http://127.0.0.1:18080`(首次启动自动弹出,已在运行的实例也可手动访问),在「Claude Agent」一节顶部把「API 来源」从 **官方 API(Anthropic 直连)** 切换到 **第三方 API(自定义网关)**——切换后会出现 API Key / Base URL 两个输入框,填进去保存即可。**切回官方模式后保存,已填的密钥会被自动清空**,不会残留在 `config.json` 中。
333
-
334
- **2. 直接编辑 `config.json`**
335
-
336
- ```json
337
- {
338
- "claude": {
339
- "model": "",
340
- "effort": "",
341
- "apiKey": "你的_API_密钥",
342
- "baseUrl": "https://api.deepseek.com/anthropic"
343
- }
344
- }
345
- ```
346
-
347
- > ChatCCC 不会把这两个值写入主进程的环境变量;它们仅在调用 Claude Agent SDK 时被注入到 SDK 拉起的子进程,跟主进程 env 完全隔离。两项留空 / 缺失时,子进程沿用主进程默认的鉴权行为(即官方 Claude 的 OAuth)。
348
-
349
- > 所有运行参数(端口、`/git` 超时、各 AI 工具模型 / 路径等)都在第 4 节展示的 `config.json` 里配置,不再使用 `CHATCCC_*` 环境变量。多实例共存只需在每个实例的 `config.json` 里把 `port` 设为不同值即可(例如 `18080` / `18081`),ChatCCC 启动时会自动清理各自端口上的旧进程。
350
-
351
- > **权限说明**:目前 ChatCCC 以 `bypassPermissions` 模式运行,即跳过所有权限确认、允许所有操作。后续会考虑引入细粒度权限控制,让你可以按需放行特定操作。
352
-
353
- > **Linux 用户注意**:不能将项目装在 `/root` 目录下运行。
194
+ > 当前 ChatCCC `bypassPermissions` 模式运行,会跳过 Agent 操作确认。请只在可信环境中使用。
354
195
 
355
196
  ### 5. 开始使用
356
197
 
357
- **飞书:** 在飞书中找到你的机器人,发送 `/new`(使用默认 Agent)或 `/new claude` / `/new cursor` / `/new codex`,机器人会自动创建一个群聊并把 AI 会话绑定到该群。之后直接在群里发消息就能对话。
358
-
359
- **微信:** 启动 `chatccc` 后,控制台会打印微信扫码二维码。打开微信扫一扫关注机器人,直接发送 `/new` 或 `/new claude` 等指令即可在私聊中开始对话。所有命令与飞书端完全一致。
360
-
361
- ### 可用指令
198
+ **飞书:** 找到你的机器人,发送 `/new`、`/new claude`、`/new cursor` `/new codex`。机器人会创建一个新群并绑定 AI 会话,之后直接在群里聊天即可。
362
199
 
200
+ **微信:** 扫码登录后,在机器人私聊里发送 `/new` 或指定 Agent 的 `/new ...` 命令即可开始。功能与飞书基本一致,但展示为纯文本。
363
201
 
364
- | 指令 | 作用 |
365
- | --------------- | ---------------------------- |
366
- | `/new` | 使用默认 Agent 创建新会话 |
367
- | `/new claude` | 创建新的 Claude Code 会话 |
368
- | `/new cursor` | 创建新的 Cursor 会话 |
369
- | `/new codex` | 创建新的 Codex 会话(OpenAI) |
370
- | `/stop` | 停止当前正在生成的回复 |
371
- | `/status` | 查看当前会话的状态(轮数、模型、上下文 token 等) |
372
- | `/cd` | 查看/设置当前会话的默认工作目录 |
373
- | `/sessions` | 查看所有会话状态 |
374
- | `/newh` | 重置当前会话(创建新 Session,保留工作目录,同一群内继续) |
375
- | `/git <子命令>` | 在**当前会话工作目录**执行 `git ...` 并把 stdout/stderr 回发到群里(仅会话群内可用,超时见 `config.json` 的 `gitTimeoutSeconds` 字段) |
376
- | `/restart` | 重启机器人进程 |
202
+ ## 可用指令
377
203
 
204
+ | 指令 | 作用 |
205
+ | --- | --- |
206
+ | `/new` | 使用默认 Agent 创建新会话 |
207
+ | `/new claude` | 创建 Claude Code 会话 |
208
+ | `/new cursor` | 创建 Cursor 会话 |
209
+ | `/new codex` | 创建 Codex 会话 |
210
+ | `/newh` | 重置当前会话,保留工作目录 |
211
+ | `/stop` | 停止当前回复 |
212
+ | `/status` | 查看当前会话状态 |
213
+ | `/cd` | 查看或设置当前会话工作目录 |
214
+ | `/sessions` | 查看所有会话状态 |
215
+ | `/git <子命令>` | 在当前会话工作目录执行 `git ...` 并回传输出 |
216
+ | `/restart` | 重启机器人进程 |
378
217
 
379
218
  ---
380
219
 
381
220
  ## 技术栈
382
221
 
383
- TypeScript / Node.js >= 20 / tsx / Anthropic Claude Agent SDK / Cursor Agent CLI / Codex CLI (OpenAI) / 飞书 WebSocket API / CardKit
222
+ TypeScript / Node.js >= 20 / tsx / Anthropic Claude Agent SDK / Cursor Agent CLI / Codex CLI / 飞书 WebSocket API / CardKit / 微信 iLink
package/bin/chatccc.mjs CHANGED
@@ -1,24 +1,24 @@
1
- #!/usr/bin/env node
2
- import { spawnSync } from "node:child_process";
3
- import { createRequire } from "node:module";
4
- import { dirname, join } from "node:path";
5
-
6
- const require = createRequire(import.meta.url);
7
- // 相对 bin/chatccc.mjs 解析 package.json,包根目录不依赖 cwd,也不会多退一级到 node_modules
8
- const pkgRoot = dirname(require.resolve("../package.json"));
9
- const indexTs = join(pkgRoot, "src", "index.ts");
10
- const tsxCli = require.resolve("tsx/cli");
11
-
12
- const result = spawnSync(process.execPath, [tsxCli, indexTs, ...process.argv.slice(2)], {
13
- stdio: "inherit",
14
- cwd: process.cwd(),
15
- env: process.env,
16
- });
17
-
18
- const code = result.status === null ? 1 : result.status;
19
- if (code !== 0) {
20
- console.error("[ 未启动 ]");
21
- console.error("chatccc 子进程已结束,服务没有在后台运行。");
22
- }
23
-
1
+ #!/usr/bin/env node
2
+ import { spawnSync } from "node:child_process";
3
+ import { createRequire } from "node:module";
4
+ import { dirname, join } from "node:path";
5
+
6
+ const require = createRequire(import.meta.url);
7
+ // 相对 bin/chatccc.mjs 解析 package.json,包根目录不依赖 cwd,也不会多退一级到 node_modules
8
+ const pkgRoot = dirname(require.resolve("../package.json"));
9
+ const indexTs = join(pkgRoot, "src", "index.ts");
10
+ const tsxCli = require.resolve("tsx/cli");
11
+
12
+ const result = spawnSync(process.execPath, [tsxCli, indexTs, ...process.argv.slice(2)], {
13
+ stdio: "inherit",
14
+ cwd: process.cwd(),
15
+ env: process.env,
16
+ });
17
+
18
+ const code = result.status === null ? 1 : result.status;
19
+ if (code !== 0) {
20
+ console.error("[ 未启动 ]");
21
+ console.error("chatccc 子进程已结束,服务没有在后台运行。");
22
+ }
23
+
24
24
  process.exit(code);