@lwmxiaobei/xbcode 1.0.0
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 +21 -0
- package/README.md +631 -0
- package/README.zh-CN.md +542 -0
- package/dist/agent.js +1450 -0
- package/dist/busy-status.js +29 -0
- package/dist/clipboard-image.js +97 -0
- package/dist/commands.js +109 -0
- package/dist/compact.js +262 -0
- package/dist/config.js +516 -0
- package/dist/error-log.js +80 -0
- package/dist/http.js +89 -0
- package/dist/idle-watchdog.js +88 -0
- package/dist/index.js +2031 -0
- package/dist/input-submit.js +41 -0
- package/dist/mcp/client.js +466 -0
- package/dist/mcp/manager.js +275 -0
- package/dist/mcp/runtime.js +420 -0
- package/dist/mcp/types.js +12 -0
- package/dist/message-bus.js +180 -0
- package/dist/oauth/openai.js +326 -0
- package/dist/prompt.js +156 -0
- package/dist/session-store.js +186 -0
- package/dist/skills/frontmatter.js +85 -0
- package/dist/skills/index.js +2 -0
- package/dist/skills/loader.js +88 -0
- package/dist/skills/render.js +35 -0
- package/dist/skills/types.js +1 -0
- package/dist/subagents.js +64 -0
- package/dist/supervisor.js +58 -0
- package/dist/task-manager.js +280 -0
- package/dist/team-types.js +1 -0
- package/dist/teammate-manager.js +266 -0
- package/dist/tools.js +1068 -0
- package/dist/trust-store.js +42 -0
- package/dist/types.js +1 -0
- package/dist/usage.js +226 -0
- package/dist/utils.js +21 -0
- package/package.json +67 -0
- package/scripts/postinstall.mjs +30 -0
- package/skills/code-review/SKILL.md +22 -0
- package/skills/pdf/SKILL.md +18 -0
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,542 @@
|
|
|
1
|
+
[English](./README.md) | [简体中文](./README.zh-CN.md)
|
|
2
|
+
|
|
3
|
+
# xbcode
|
|
4
|
+
|
|
5
|
+
`xbcode` 是一个基于 TypeScript、OpenAI SDK 和 Ink 构建的终端代码代理。它运行在命令行中,支持流式输出、工具调用、工作区内读写与执行、持久化任务、技能加载、MCP 集成,以及轻量级多 Agent 协作。
|
|
6
|
+
|
|
7
|
+
这个项目的目标不是做一个“什么都包”的庞大框架,而是提供一个足够实用、同时又足够小巧、便于阅读和改造的 CLI Agent 实现。
|
|
8
|
+
|
|
9
|
+
## 特性概览
|
|
10
|
+
|
|
11
|
+
- 基于 Ink + React 的终端交互界面
|
|
12
|
+
- 同时支持 Responses API 和 Chat Completions API
|
|
13
|
+
- 面向当前工作区的文件与命令工具
|
|
14
|
+
- 持久化任务系统,任务保存在 `.tasks/`
|
|
15
|
+
- 支持全局技能和仓库本地技能
|
|
16
|
+
- 支持 MCP server 接入
|
|
17
|
+
- 支持持久化 teammate 协作
|
|
18
|
+
- 支持长对话上下文压缩
|
|
19
|
+
- 代码结构清晰,适合继续二次开发
|
|
20
|
+
|
|
21
|
+
## 快速开始
|
|
22
|
+
|
|
23
|
+
### 安装
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install -g @lwmxiaobei/xbcode
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
或者在当前仓库本地运行:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npm install
|
|
33
|
+
npm run dev
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 首次配置
|
|
37
|
+
|
|
38
|
+
安装后会自动生成默认配置文件:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
~/.xbcode/settings.json
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
最小示例:
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"providers": {
|
|
49
|
+
"openai": {
|
|
50
|
+
"models": ["gpt-4.1", "gpt-4.1-mini", "o3-mini"],
|
|
51
|
+
"apiKey": "YOUR_OPENAI_API_KEY",
|
|
52
|
+
"baseURL": "https://api.openai.com/v1",
|
|
53
|
+
"apiMode": "responses"
|
|
54
|
+
},
|
|
55
|
+
"deepseek": {
|
|
56
|
+
"models": [
|
|
57
|
+
{ "id": "deepseek-chat", "name": "DeepSeek Chat", "description": "DeepSeek V3 chat model" }
|
|
58
|
+
],
|
|
59
|
+
"apiKey": "sk-xxxxx",
|
|
60
|
+
"baseURL": "https://api.deepseek.com/v1",
|
|
61
|
+
"apiMode": "chat-completions"
|
|
62
|
+
},
|
|
63
|
+
"longcat": {
|
|
64
|
+
"models": [
|
|
65
|
+
{ "id": "LongCat-Flash-Chat", "name": "LongCat Flash Chat", "description": "High-performance general-purpose dialogue model" },
|
|
66
|
+
{ "id": "LongCat-Flash-Omni-2603", "name": "LongCat Flash Omni", "description": "Multimodal model" },
|
|
67
|
+
{ "id": "LongCat-Flash-Thinking", "name": "LongCat Flash Thinking", "description": "LongCat thinking model" }
|
|
68
|
+
],
|
|
69
|
+
"apiKey": "ak_xxxxxxx", // 去申请美团的龙猫模型,每天几百万的免费额度,足够测试开发了
|
|
70
|
+
"baseURL": "https://api.longcat.chat/openai",
|
|
71
|
+
"apiMode": "chat-completions"
|
|
72
|
+
},
|
|
73
|
+
"aliyun": {
|
|
74
|
+
"models": ["qwen-plus", "qwen-turbo", "qwen-max"],
|
|
75
|
+
"apiKey": "sk-xxx", // 阿里云百炼 API Key: https://dashscope.console.aliyun.com/
|
|
76
|
+
"baseURL": "https://dashscope.aliyuncs.com/compatible-mode/v1"
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
"defaultProvider": "openai",
|
|
80
|
+
"defaultModel": "gpt-4.1",
|
|
81
|
+
"showThinking": false,
|
|
82
|
+
"mcp": {
|
|
83
|
+
"servers": []
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 启动
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
xbcode
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
本地开发:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
npm run dev
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
构建并运行编译结果:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npm run build
|
|
104
|
+
npm start
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### 第一次输入
|
|
108
|
+
|
|
109
|
+
启动后可以直接输入:
|
|
110
|
+
|
|
111
|
+
```text
|
|
112
|
+
读取当前项目结构,并解释 agent loop 是怎么工作的。
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
如果环境变量里没有预先指定 `MODEL_ID`,并且 `~/.xbcode/settings.json` 里也没有可用的 `defaultModel`,CLI 会引导你选择 provider 和 model。
|
|
116
|
+
|
|
117
|
+
## 使用说明
|
|
118
|
+
|
|
119
|
+
### 常用命令
|
|
120
|
+
|
|
121
|
+
项目脚本:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
npm run dev
|
|
125
|
+
npm run build
|
|
126
|
+
npm run test
|
|
127
|
+
npm start
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
全局安装后的启动命令:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
xbcode
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Slash Commands
|
|
137
|
+
|
|
138
|
+
当前内置命令包括:
|
|
139
|
+
|
|
140
|
+
- `/help`
|
|
141
|
+
- `/status`
|
|
142
|
+
- `/login`
|
|
143
|
+
- `/logout`
|
|
144
|
+
- `/mcp`
|
|
145
|
+
- `/mcp refresh`
|
|
146
|
+
- `/team`
|
|
147
|
+
- `/inbox`
|
|
148
|
+
- `/provider`
|
|
149
|
+
- `/model`
|
|
150
|
+
- `/compact`
|
|
151
|
+
- `/new`
|
|
152
|
+
- `/exit`
|
|
153
|
+
|
|
154
|
+
如果 skill 提供了 prompt command,也会以 slash command 的形式暴露出来。
|
|
155
|
+
|
|
156
|
+
### Provider 和模型配置
|
|
157
|
+
|
|
158
|
+
配置文件位置:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
~/.xbcode/settings.json
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
支持配置多个 provider,每个 provider 可以包含:
|
|
165
|
+
|
|
166
|
+
- `models`
|
|
167
|
+
- `apiKey`
|
|
168
|
+
- `baseURL`
|
|
169
|
+
- `apiMode`
|
|
170
|
+
- `auth`
|
|
171
|
+
|
|
172
|
+
其中:
|
|
173
|
+
|
|
174
|
+
- `apiMode = responses`
|
|
175
|
+
更适合 OpenAI 原生接口
|
|
176
|
+
- `apiMode = chat-completions`
|
|
177
|
+
更适合兼容 Chat Completions 的第三方服务
|
|
178
|
+
- `auth = { "type": "oauth" }`
|
|
179
|
+
目前仅用于 OpenAI,可选开启 ChatGPT OAuth 登录
|
|
180
|
+
|
|
181
|
+
OpenAI OAuth 配置示例:
|
|
182
|
+
|
|
183
|
+
```json
|
|
184
|
+
{
|
|
185
|
+
"providers": {
|
|
186
|
+
"openai": {
|
|
187
|
+
"models": ["gpt-5.4", "gpt-5.4-mini"],
|
|
188
|
+
"apiKey": "OPTIONAL_FALLBACK_KEY",
|
|
189
|
+
"baseURL": "https://api.openai.com/v1",
|
|
190
|
+
"apiMode": "responses",
|
|
191
|
+
"auth": {
|
|
192
|
+
"type": "oauth"
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
如果不显式指定,程序也会根据 `baseURL` 做一部分自动判断,例如 DeepSeek 风格地址会默认切到 `chat-completions`。
|
|
200
|
+
|
|
201
|
+
如果启用了 OpenAI OAuth:
|
|
202
|
+
|
|
203
|
+
- 静态 provider 配置仍然放在 `~/.xbcode/settings.json`
|
|
204
|
+
- 动态 OAuth 凭据会单独写入 `~/.xbcode/credentials.json`
|
|
205
|
+
- 运行时优先使用有效的 OAuth `access_token`
|
|
206
|
+
- 如果刷新失败,并且配置里还有 `apiKey`,则自动回退到 `apiKey`
|
|
207
|
+
|
|
208
|
+
OAuth 命令:
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
/login openai
|
|
212
|
+
/logout openai
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
如果 `/login` 不带参数,就默认登录当前 provider。当前版本会在终端打印 OpenAI 授权 URL,然后等待本地 localhost 回调完成登录。
|
|
216
|
+
|
|
217
|
+
### 工作区行为
|
|
218
|
+
|
|
219
|
+
`xbcode` 总是围绕当前工作目录运行:
|
|
220
|
+
|
|
221
|
+
- 文件工具只能访问 `process.cwd()` 下的路径
|
|
222
|
+
- shell 命令在当前工作目录执行
|
|
223
|
+
- 本地技能从 `<workdir>/skills` 加载
|
|
224
|
+
- 团队状态保存在 `<workdir>/.team`
|
|
225
|
+
- 任务保存在 `<workdir>/.tasks`
|
|
226
|
+
|
|
227
|
+
如果项目根目录存在 `AGENTS.md`,其内容会被注入 system prompt,用来约束 agent 行为。
|
|
228
|
+
|
|
229
|
+
### 内置工具
|
|
230
|
+
|
|
231
|
+
主 agent 可以访问:
|
|
232
|
+
|
|
233
|
+
- `bash`
|
|
234
|
+
- `read_file`
|
|
235
|
+
- `write_file`
|
|
236
|
+
- `edit_file`
|
|
237
|
+
- `task_create`
|
|
238
|
+
- `task_update`
|
|
239
|
+
- `task_list`
|
|
240
|
+
- `task_get`
|
|
241
|
+
- `list_mcp_resources`
|
|
242
|
+
- `read_mcp_resource`
|
|
243
|
+
- `mcp_call`
|
|
244
|
+
- `load_skill`
|
|
245
|
+
- `task`
|
|
246
|
+
- `message_send`
|
|
247
|
+
- `teammate_spawn`
|
|
248
|
+
- `teammate_list`
|
|
249
|
+
- `teammate_shutdown`
|
|
250
|
+
- `lead_inbox`
|
|
251
|
+
|
|
252
|
+
teammate 只能访问受限工具集:
|
|
253
|
+
|
|
254
|
+
- 基础工具
|
|
255
|
+
- `message_send`
|
|
256
|
+
|
|
257
|
+
这是刻意的权限收缩,用来避免无限递归派生和失控协作。
|
|
258
|
+
|
|
259
|
+
### 任务系统
|
|
260
|
+
|
|
261
|
+
任务是持久化存储的,每个任务对应一个 JSON 文件:
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
.tasks/task_<id>.json
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
任务字段包括:
|
|
268
|
+
|
|
269
|
+
- `id`
|
|
270
|
+
- `subject`
|
|
271
|
+
- `description`
|
|
272
|
+
- `status`
|
|
273
|
+
- `blockedBy`
|
|
274
|
+
- `blocks`
|
|
275
|
+
|
|
276
|
+
状态包括:
|
|
277
|
+
|
|
278
|
+
- `pending`
|
|
279
|
+
- `in_progress`
|
|
280
|
+
- `completed`
|
|
281
|
+
|
|
282
|
+
当任务被标记为 `completed` 时,依赖它的任务会自动解除阻塞。
|
|
283
|
+
|
|
284
|
+
### 技能系统
|
|
285
|
+
|
|
286
|
+
技能加载顺序如下:
|
|
287
|
+
|
|
288
|
+
- 全局技能目录(优先):`~/.xbcode/skills`
|
|
289
|
+
- 全局技能目录(兼容 Claude):`~/.claude/skills`
|
|
290
|
+
- 仓库本地技能目录:`<workdir>/skills`
|
|
291
|
+
|
|
292
|
+
规则是:
|
|
293
|
+
|
|
294
|
+
- `~/.xbcode/skills` 先加载
|
|
295
|
+
- `~/.claude/skills` 随后加载以保持兼容
|
|
296
|
+
- 本地技能最后加载,并可以覆盖同名全局技能
|
|
297
|
+
|
|
298
|
+
每个技能都由一个 `SKILL.md` 描述,支持 frontmatter。加载后可用于:
|
|
299
|
+
|
|
300
|
+
- system prompt 中的技能描述注入
|
|
301
|
+
- 生成 slash command
|
|
302
|
+
- 通过 `load_skill` 读取技能内容
|
|
303
|
+
|
|
304
|
+
### MCP 集成
|
|
305
|
+
|
|
306
|
+
MCP 配置写在:
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
~/.xbcode/settings.json
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
当前支持两种 transport:
|
|
313
|
+
|
|
314
|
+
- `stdio`
|
|
315
|
+
- `streamable-http`
|
|
316
|
+
|
|
317
|
+
当前实现中:
|
|
318
|
+
|
|
319
|
+
- MCP server 由共享运行时统一管理
|
|
320
|
+
- MCP tool 会被动态暴露为普通 function tool
|
|
321
|
+
- MCP resource 可通过 `list_mcp_resources` 发现
|
|
322
|
+
- MCP resource 内容可通过 `read_mcp_resource` 读取
|
|
323
|
+
- MCP prompt 通过 `mcp_call` 获取
|
|
324
|
+
|
|
325
|
+
相关文档:
|
|
326
|
+
|
|
327
|
+
- [docs/mcp-overview.md](./docs/mcp-overview.md)
|
|
328
|
+
- [docs/mcp-implementation.md](./docs/mcp-implementation.md)
|
|
329
|
+
- [docs/mcp-config.md](./docs/mcp-config.md)
|
|
330
|
+
|
|
331
|
+
### Team 模式
|
|
332
|
+
|
|
333
|
+
除了单次 `task` 子代理之外,`xbcode` 还支持常驻 teammate:
|
|
334
|
+
|
|
335
|
+
- `lead` 是和用户直接交互的主代理
|
|
336
|
+
- teammate 是具名、可持续存在的后台协作代理
|
|
337
|
+
- 协作通过 inbox 文件完成,而不是共享同一个上下文
|
|
338
|
+
|
|
339
|
+
团队状态保存在:
|
|
340
|
+
|
|
341
|
+
```bash
|
|
342
|
+
.team/
|
|
343
|
+
config.json
|
|
344
|
+
inbox/
|
|
345
|
+
lead.jsonl
|
|
346
|
+
<teammate>.jsonl
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
常用团队工具:
|
|
350
|
+
|
|
351
|
+
- `teammate_spawn`
|
|
352
|
+
- `teammate_list`
|
|
353
|
+
- `teammate_shutdown`
|
|
354
|
+
- `message_send`
|
|
355
|
+
- `lead_inbox`
|
|
356
|
+
|
|
357
|
+
这个设计让不同 agent 各自维护独立上下文,同时还能进行异步协作。
|
|
358
|
+
|
|
359
|
+
## 开发说明
|
|
360
|
+
|
|
361
|
+
### 目录结构
|
|
362
|
+
|
|
363
|
+
```text
|
|
364
|
+
code-agent/
|
|
365
|
+
src/
|
|
366
|
+
index.tsx CLI UI 和输入循环
|
|
367
|
+
agent.ts 核心 agent loop
|
|
368
|
+
tools.ts 工具定义与 handler
|
|
369
|
+
config.ts 配置读取和 provider 解析
|
|
370
|
+
prompt.ts system prompt 拼装
|
|
371
|
+
compact.ts 上下文压缩
|
|
372
|
+
task-manager.ts 持久化任务系统
|
|
373
|
+
message-bus.ts inbox 消息总线
|
|
374
|
+
teammate-manager.ts teammate 生命周期管理
|
|
375
|
+
mcp/ MCP 相关实现
|
|
376
|
+
skills/ 技能解析与渲染
|
|
377
|
+
test/ 测试
|
|
378
|
+
docs/ 设计与实现说明
|
|
379
|
+
skills/ 示例本地技能
|
|
380
|
+
scripts/postinstall.mjs 默认配置生成
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### 核心模块职责
|
|
384
|
+
|
|
385
|
+
#### `src/index.tsx`
|
|
386
|
+
|
|
387
|
+
负责:
|
|
388
|
+
|
|
389
|
+
- 终端 UI 渲染
|
|
390
|
+
- 用户输入处理
|
|
391
|
+
- provider/model 选择
|
|
392
|
+
- slash command 分发
|
|
393
|
+
- 流式输出桥接
|
|
394
|
+
|
|
395
|
+
#### `src/agent.ts`
|
|
396
|
+
|
|
397
|
+
负责:
|
|
398
|
+
|
|
399
|
+
- 主执行回合调度
|
|
400
|
+
- 工具运行时准备
|
|
401
|
+
- Responses API 循环
|
|
402
|
+
- Chat Completions 循环
|
|
403
|
+
- 中断恢复
|
|
404
|
+
- 上下文压缩触发
|
|
405
|
+
- teammate runtime 执行
|
|
406
|
+
|
|
407
|
+
#### `src/tools.ts`
|
|
408
|
+
|
|
409
|
+
负责:
|
|
410
|
+
|
|
411
|
+
- 工具 schema 定义
|
|
412
|
+
- 权限范围控制
|
|
413
|
+
- 文件与 shell handler
|
|
414
|
+
- 任务和团队相关工具
|
|
415
|
+
- 技能接入
|
|
416
|
+
- MCP 接入
|
|
417
|
+
|
|
418
|
+
#### `src/config.ts`
|
|
419
|
+
|
|
420
|
+
负责:
|
|
421
|
+
|
|
422
|
+
- 读取 `~/.xbcode/settings.json`
|
|
423
|
+
- 规范化 provider 配置
|
|
424
|
+
- 模型选择
|
|
425
|
+
- MCP server 配置解析和校验
|
|
426
|
+
|
|
427
|
+
#### `src/prompt.ts`
|
|
428
|
+
|
|
429
|
+
负责 system prompt 的组装,输入包括:
|
|
430
|
+
|
|
431
|
+
- 当前工作目录
|
|
432
|
+
- 已加载技能描述
|
|
433
|
+
- MCP 指令
|
|
434
|
+
- 项目 `AGENTS.md`
|
|
435
|
+
|
|
436
|
+
#### `src/compact.ts`
|
|
437
|
+
|
|
438
|
+
负责两层上下文控制:
|
|
439
|
+
|
|
440
|
+
- `microCompact`
|
|
441
|
+
缩短旧工具输出
|
|
442
|
+
- `autoCompact`
|
|
443
|
+
对历史进行摘要压缩
|
|
444
|
+
|
|
445
|
+
在 `responses` 模式下,当前实现更接近“定期重置上下文链”,而不是保留摘要的连续压缩。
|
|
446
|
+
|
|
447
|
+
### 两种 API 模式
|
|
448
|
+
|
|
449
|
+
#### Responses API 模式
|
|
450
|
+
|
|
451
|
+
适合:
|
|
452
|
+
|
|
453
|
+
- OpenAI 原生接口
|
|
454
|
+
- 使用 `previous_response_id` 串联上下文
|
|
455
|
+
|
|
456
|
+
特点:
|
|
457
|
+
|
|
458
|
+
- 服务端维持上下文链
|
|
459
|
+
- 周期性重置链路,控制上下文增长
|
|
460
|
+
|
|
461
|
+
#### Chat Completions 模式
|
|
462
|
+
|
|
463
|
+
适合:
|
|
464
|
+
|
|
465
|
+
- 第三方兼容接口
|
|
466
|
+
- 需要本地维护消息历史的场景
|
|
467
|
+
|
|
468
|
+
特点:
|
|
469
|
+
|
|
470
|
+
- 本地维护 `chatHistory`
|
|
471
|
+
- 根据 token 估算结果触发压缩
|
|
472
|
+
|
|
473
|
+
### `task` 和 teammate 的区别
|
|
474
|
+
|
|
475
|
+
项目中有两种委派方式:
|
|
476
|
+
|
|
477
|
+
- `task`
|
|
478
|
+
一次性、隔离上下文的子代理
|
|
479
|
+
- teammate
|
|
480
|
+
持久存在、带身份和 inbox 的协作代理
|
|
481
|
+
|
|
482
|
+
当前 `task` 已支持最小化的 `subagent_type`:
|
|
483
|
+
|
|
484
|
+
- `general-purpose`
|
|
485
|
+
默认子代理,适合实现、修改和一般性分包
|
|
486
|
+
- `explore`
|
|
487
|
+
只读探索子代理,适合搜索代码、阅读实现、整理结论,不允许写文件
|
|
488
|
+
|
|
489
|
+
简单理解:
|
|
490
|
+
|
|
491
|
+
- 想做一次性分包,用 `task`
|
|
492
|
+
- 想持续协作,用 teammate
|
|
493
|
+
|
|
494
|
+
### 测试
|
|
495
|
+
|
|
496
|
+
运行测试:
|
|
497
|
+
|
|
498
|
+
```bash
|
|
499
|
+
npm test
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
当前测试覆盖了:
|
|
503
|
+
|
|
504
|
+
- 输入提交去重
|
|
505
|
+
- prompt 构建
|
|
506
|
+
- 技能加载与渲染
|
|
507
|
+
- 一些辅助函数行为
|
|
508
|
+
|
|
509
|
+
### 设计取舍
|
|
510
|
+
|
|
511
|
+
当前实现有一些明确的工程取舍:
|
|
512
|
+
|
|
513
|
+
- 文件访问限制在当前工作区
|
|
514
|
+
- shell 命令有超时
|
|
515
|
+
- 一部分极危险命令会被直接拦截
|
|
516
|
+
- 工具输出会截断,防止撑爆上下文
|
|
517
|
+
- teammate 权限弱于 lead
|
|
518
|
+
|
|
519
|
+
这不是一个强安全沙箱,而是一个偏实用的本地 agent 约束层。
|
|
520
|
+
|
|
521
|
+
### 当前限制
|
|
522
|
+
|
|
523
|
+
当前还没有实现或仍然较弱的部分包括:
|
|
524
|
+
|
|
525
|
+
- 没有 worktree 级别隔离
|
|
526
|
+
- 没有通用长期调度器
|
|
527
|
+
- shell 危险命令过滤仍然比较基础
|
|
528
|
+
- Responses API 模式下的 compact 不是完整摘要链式压缩
|
|
529
|
+
- teammate 能力面被刻意限制
|
|
530
|
+
|
|
531
|
+
## 补充文档
|
|
532
|
+
|
|
533
|
+
更多实现说明可参考:
|
|
534
|
+
|
|
535
|
+
- [docs/TUTORIAL.md](./docs/TUTORIAL.md)
|
|
536
|
+
- [docs/task-dag.md](./docs/task-dag.md)
|
|
537
|
+
- [docs/context-compaction.md](./docs/context-compaction.md)
|
|
538
|
+
- [docs/mcp-plan.md](./docs/mcp-plan.md)
|
|
539
|
+
- [docs/mcp-overview.md](./docs/mcp-overview.md)
|
|
540
|
+
- [docs/mcp-implementation.md](./docs/mcp-implementation.md)
|
|
541
|
+
- [docs/mcp-config.md](./docs/mcp-config.md)
|
|
542
|
+
- [docs/agent-teams.md](./docs/agent-teams.md)
|