@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.
@@ -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)