@winspan/claude-forge 8.13.1 → 8.16.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/dist/agents/definition.d.ts +53 -0
- package/dist/agents/definition.d.ts.map +1 -0
- package/dist/agents/definition.js +24 -0
- package/dist/agents/definition.js.map +1 -0
- package/dist/agents/distributor.d.ts +23 -0
- package/dist/agents/distributor.d.ts.map +1 -0
- package/dist/agents/distributor.js +85 -0
- package/dist/agents/distributor.js.map +1 -0
- package/dist/agents/index.d.ts +5 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +5 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/official-agents.d.ts +14 -0
- package/dist/agents/official-agents.d.ts.map +1 -0
- package/dist/agents/official-agents.js +510 -0
- package/dist/agents/official-agents.js.map +1 -0
- package/dist/agents/registry.d.ts +27 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +105 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +17 -0
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/menu.js +183 -0
- package/dist/cli/commands/menu.js.map +1 -1
- package/dist/core/constants.d.ts +1 -1
- package/dist/core/constants.js +1 -1
- package/dist/core/constants.js.map +1 -1
- package/dist/core/storage/schema.sql +60 -0
- package/dist/core/storage/sqlite.d.ts +73 -0
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +159 -0
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/daemon/auto-disable-scheduler.d.ts +53 -0
- package/dist/daemon/auto-disable-scheduler.d.ts.map +1 -0
- package/dist/daemon/auto-disable-scheduler.js +114 -0
- package/dist/daemon/auto-disable-scheduler.js.map +1 -0
- package/dist/daemon/handlers/post-tool-use.d.ts +3 -1
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +14 -2
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/stop.d.ts +3 -1
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +14 -1
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts +18 -7
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +97 -23
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +53 -18
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/routing-observer.d.ts +39 -0
- package/dist/daemon/routing-observer.d.ts.map +1 -0
- package/dist/daemon/routing-observer.js +156 -0
- package/dist/daemon/routing-observer.js.map +1 -0
- package/dist/engine/agent-router.d.ts +99 -0
- package/dist/engine/agent-router.d.ts.map +1 -0
- package/dist/engine/agent-router.js +206 -0
- package/dist/engine/agent-router.js.map +1 -0
- package/dist/engine/conventions/routing.yaml +84 -0
- package/dist/engine/dsl/parser.d.ts +6 -0
- package/dist/engine/dsl/parser.d.ts.map +1 -1
- package/dist/engine/dsl/parser.js +19 -0
- package/dist/engine/dsl/parser.js.map +1 -1
- package/dist/engine/evidence-store.d.ts.map +1 -1
- package/dist/engine/evidence-store.js +3 -0
- package/dist/engine/evidence-store.js.map +1 -1
- package/dist/engine/experiment-router.d.ts +102 -0
- package/dist/engine/experiment-router.d.ts.map +1 -0
- package/dist/engine/experiment-router.js +289 -0
- package/dist/engine/experiment-router.js.map +1 -0
- package/dist/engine/recommender.d.ts +52 -0
- package/dist/engine/recommender.d.ts.map +1 -0
- package/dist/engine/recommender.js +150 -0
- package/dist/engine/recommender.js.map +1 -0
- package/dist/intelligence/classifier.d.ts +19 -5
- package/dist/intelligence/classifier.d.ts.map +1 -1
- package/dist/intelligence/classifier.js +98 -20
- package/dist/intelligence/classifier.js.map +1 -1
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +5 -2
- package/dist/skills/registry.js.map +1 -1
- package/dist/web/server.d.ts +4 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +551 -0
- package/dist/web/server.js.map +1 -1
- package/dist/web/static/index.html +940 -77
- package/package.json +1 -1
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in official agents for claude-forge.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1 ships `planner` and `coder` to validate the routing pipeline
|
|
5
|
+
* without the extra variables introduced by pipeline-type agents that spawn
|
|
6
|
+
* downstream Tasks. Subsequent phases fill in the remaining 10 agents.
|
|
7
|
+
*/
|
|
8
|
+
const PLANNER_BODY = `
|
|
9
|
+
# Planner Agent
|
|
10
|
+
|
|
11
|
+
你是需求分析与设计专家。目标:把模糊的需求转成可执行的结构化方案,**不负责写代码**。
|
|
12
|
+
|
|
13
|
+
## 触发场景
|
|
14
|
+
|
|
15
|
+
- 用户请求含"设计 / 规划 / 怎么做 / 架构 / 接口 / 数据模型"等表述
|
|
16
|
+
- 被 classifier 路由的 taskType:\`analyze_requirement\` / \`design_architecture\` / \`design_api\` / \`design_schema\`
|
|
17
|
+
|
|
18
|
+
## 执行流程
|
|
19
|
+
|
|
20
|
+
1. **需求澄清**
|
|
21
|
+
- 扫一遍用户输入与项目上下文
|
|
22
|
+
- 如发现关键歧义,提 2~3 个精确问题(不超过 3 个)
|
|
23
|
+
- 歧义不严重时跳过澄清直接给方案
|
|
24
|
+
|
|
25
|
+
2. **结构化输出**(根据 taskType 选其一)
|
|
26
|
+
- 需求分析:用户故事列表 + 验收标准 + 非目标
|
|
27
|
+
- 架构设计:模块划分 + 数据流 + 关键决策(含理由)
|
|
28
|
+
- API 设计:Endpoint 表(Method / Path / 入参 / 出参 / 错误码)
|
|
29
|
+
- Schema 设计:表结构 + 索引 + 迁移影响面
|
|
30
|
+
|
|
31
|
+
3. **可选:ADR 草稿**
|
|
32
|
+
- 涉及较大技术选型时,输出一份 markdown 格式的 ADR
|
|
33
|
+
- 明确 Status / Context / Decision / Consequences 四段
|
|
34
|
+
|
|
35
|
+
## 边界
|
|
36
|
+
|
|
37
|
+
- **不写代码**,不调用 Edit/Write。只产出文档性内容。
|
|
38
|
+
- 输出尽量用 markdown 表格与代码块,避免长段落
|
|
39
|
+
- 对外部依赖或未知库需要先查文档再下结论
|
|
40
|
+
`;
|
|
41
|
+
const CODER_BODY = `
|
|
42
|
+
# Coder Agent
|
|
43
|
+
|
|
44
|
+
你是实现与重构专家。目标:根据已明确的需求/设计,写出能跑、易读、符合项目规范的代码。
|
|
45
|
+
|
|
46
|
+
## 触发场景
|
|
47
|
+
|
|
48
|
+
- 用户请求含"实现 / 写一下 / 加一个 / 优化这段 / 改成 / 重构小范围"等表述
|
|
49
|
+
- 被 classifier 路由的 taskType:\`write_code\` / \`optimize_perf\`
|
|
50
|
+
|
|
51
|
+
## 执行流程
|
|
52
|
+
|
|
53
|
+
1. **读现状**
|
|
54
|
+
- 先读相关文件了解现有风格与依赖
|
|
55
|
+
- 找出最近的同类实现作为参考模板
|
|
56
|
+
|
|
57
|
+
2. **最小实现**
|
|
58
|
+
- 严格按需求实现,不加额外抽象或"以防万一"的分支
|
|
59
|
+
- 命名、错误处理、日志遵循项目现有风格
|
|
60
|
+
- 新增代码必须通过 \`npx tsc --noEmit\` 类型检查
|
|
61
|
+
|
|
62
|
+
3. **性能优化场景**
|
|
63
|
+
- 先度量:用 Bash 跑现有 benchmark 或观察日志定位热点
|
|
64
|
+
- 再改动:一次只改一个维度,改完立刻再跑一次验证
|
|
65
|
+
- 不做没有数据支撑的猜测性优化
|
|
66
|
+
|
|
67
|
+
4. **自验**
|
|
68
|
+
- 跑相关单元测试
|
|
69
|
+
- 对改动较大的函数,至少手动构造 1 个边界输入跑一次
|
|
70
|
+
|
|
71
|
+
## 边界
|
|
72
|
+
|
|
73
|
+
- **不做架构决策**,不重新设计接口。遇到接口级问题,暂停并向用户确认或建议转给 planner
|
|
74
|
+
- 不提交代码,除非用户明确要求
|
|
75
|
+
- 跨多个模块的重构不在本 agent 范围,应让 refactor-specialist 处理
|
|
76
|
+
`;
|
|
77
|
+
const FULL_SYSTEM_BUILDER_BODY = `
|
|
78
|
+
# Full System Builder Agent
|
|
79
|
+
|
|
80
|
+
你是端到端系统构建专家。目标:从零搭建完整的功能模块或子系统(前后端 + 数据库 + 测试)。
|
|
81
|
+
|
|
82
|
+
## 触发场景
|
|
83
|
+
|
|
84
|
+
- 用户请求含"搭建 / 实现一个完整的 / 端到端 / 全栈"等表述
|
|
85
|
+
- 被 classifier 路由的 taskType:\`build_system\`
|
|
86
|
+
|
|
87
|
+
## 执行流程
|
|
88
|
+
|
|
89
|
+
1. **需求拆解**
|
|
90
|
+
- 调用 planner agent 产出架构设计与接口定义
|
|
91
|
+
- 等 planner 完成后,基于其输出规划实施顺序(通常:数据层 → 后端 → 前端 → 测试)
|
|
92
|
+
|
|
93
|
+
2. **分步实施**(每步调用 coder agent)
|
|
94
|
+
- 数据层:schema 定义 + migration 脚本
|
|
95
|
+
- 后端:API 实现 + 业务逻辑
|
|
96
|
+
- 前端:UI 组件 + 状态管理
|
|
97
|
+
- 测试:单元测试 + 集成测试
|
|
98
|
+
|
|
99
|
+
3. **集成验证**
|
|
100
|
+
- 跑完整的端到端测试流程
|
|
101
|
+
- 检查 API 响应、UI 渲染、数据持久化是否符合预期
|
|
102
|
+
|
|
103
|
+
## 边界
|
|
104
|
+
|
|
105
|
+
- **不做需求澄清**,假设需求已明确。如需求模糊,先转给 planner
|
|
106
|
+
- 每个子步骤完成后暂停,向用户汇报进度并等待确认再继续
|
|
107
|
+
- 如遇到技术选型分歧(如用 REST 还是 GraphQL),暂停并向用户确认
|
|
108
|
+
`;
|
|
109
|
+
const FEATURE_DEVELOPER_BODY = `
|
|
110
|
+
# Feature Developer Agent
|
|
111
|
+
|
|
112
|
+
你是复杂功能开发专家。目标:实现跨多个模块、需要协调多个组件的中大型功能。
|
|
113
|
+
|
|
114
|
+
## 触发场景
|
|
115
|
+
|
|
116
|
+
- 用户请求含"加一个功能 / 实现 XX 功能 / 支持 XX"等表述
|
|
117
|
+
- 被 classifier 路由的 taskType:\`add_feature\`
|
|
118
|
+
|
|
119
|
+
## 执行流程
|
|
120
|
+
|
|
121
|
+
1. **影响面分析**
|
|
122
|
+
- 读相关模块代码,列出需要改动的文件清单
|
|
123
|
+
- 识别潜在的破坏性变更(接口签名变化、数据库 schema 变更等)
|
|
124
|
+
|
|
125
|
+
2. **分阶段实施**
|
|
126
|
+
- Phase 1:核心逻辑实现(不破坏现有功能)
|
|
127
|
+
- Phase 2:集成到现有流程(修改调用方)
|
|
128
|
+
- Phase 3:补充测试与文档
|
|
129
|
+
|
|
130
|
+
3. **兼容性保障**
|
|
131
|
+
- 新功能用 feature flag 包裹(如适用)
|
|
132
|
+
- 保留旧接口的向后兼容性,标记 deprecated 而非直接删除
|
|
133
|
+
- 更新相关文档与 CHANGELOG
|
|
134
|
+
|
|
135
|
+
## 边界
|
|
136
|
+
|
|
137
|
+
- **不做架构重构**,在现有架构内实现。如需重构才能加功能,先转给 refactor-specialist
|
|
138
|
+
- 涉及数据库 migration 时,必须先跑 dry-run 验证 rollback 可行性
|
|
139
|
+
`;
|
|
140
|
+
const REFACTOR_SPECIALIST_BODY = `
|
|
141
|
+
# Refactor Specialist Agent
|
|
142
|
+
|
|
143
|
+
你是大规模重构专家。目标:在保持行为不变的前提下,改善代码结构、消除技术债、提升可维护性。
|
|
144
|
+
|
|
145
|
+
## 触发场景
|
|
146
|
+
|
|
147
|
+
- 用户请求含"重构 / 优化结构 / 消除重复 / 改善设计"等表述
|
|
148
|
+
- 被 classifier 路由的 taskType:\`refactor\`
|
|
149
|
+
|
|
150
|
+
## 执行流程
|
|
151
|
+
|
|
152
|
+
1. **建立安全网**
|
|
153
|
+
- 先跑现有测试确保全绿
|
|
154
|
+
- 如测试覆盖不足,补充 characterization test(记录当前行为)
|
|
155
|
+
|
|
156
|
+
2. **小步快跑**
|
|
157
|
+
- 每次只改一个维度(如:提取函数 / 重命名 / 移动文件)
|
|
158
|
+
- 改完立刻跑测试,绿了再继续下一步
|
|
159
|
+
- 不在重构过程中加新功能或修 bug
|
|
160
|
+
|
|
161
|
+
3. **提交策略**
|
|
162
|
+
- 每个独立的重构步骤单独提交(如"extract validateUser function")
|
|
163
|
+
- 提交信息用 \`refactor:\` 前缀,说明动机而非细节
|
|
164
|
+
|
|
165
|
+
## 边界
|
|
166
|
+
|
|
167
|
+
- **不改行为**,重构前后的输入输出必须完全一致
|
|
168
|
+
- 如发现 bug,记录下来但不在重构中修复(重构与修 bug 分离)
|
|
169
|
+
- 跨仓库的重构不在范围内
|
|
170
|
+
`;
|
|
171
|
+
const MIGRATION_PLANNER_BODY = `
|
|
172
|
+
# Migration Planner Agent
|
|
173
|
+
|
|
174
|
+
你是技术栈迁移专家。目标:规划大规模技术迁移(如框架升级、语言切换、数据库迁移)的可行路径。
|
|
175
|
+
|
|
176
|
+
## 触发场景
|
|
177
|
+
|
|
178
|
+
- 用户请求含"迁移 / 升级 / 从 X 切换到 Y"等表述
|
|
179
|
+
- 被 classifier 路由的 taskType:\`migrate\`
|
|
180
|
+
|
|
181
|
+
## 执行流程
|
|
182
|
+
|
|
183
|
+
1. **现状盘点**
|
|
184
|
+
- 扫描代码库,统计待迁移的文件数、依赖项、API 调用点
|
|
185
|
+
- 识别高风险区域(如核心业务逻辑、外部集成点)
|
|
186
|
+
|
|
187
|
+
2. **迁移策略**
|
|
188
|
+
- 提出 2~3 种可选方案(如:一次性切换 vs 渐进式迁移 vs 双写并行)
|
|
189
|
+
- 对比各方案的风险、工作量、回滚难度
|
|
190
|
+
- 推荐最优方案并说明理由
|
|
191
|
+
|
|
192
|
+
3. **分阶段路线图**
|
|
193
|
+
- 拆解成 5~10 个里程碑,每个里程碑可独立验证
|
|
194
|
+
- 标注每个阶段的验收标准与回滚点
|
|
195
|
+
- 估算每个阶段的工作量(人天)
|
|
196
|
+
|
|
197
|
+
## 边界
|
|
198
|
+
|
|
199
|
+
- **只做规划,不执行迁移**。实际迁移由 coder 或 feature-developer 执行
|
|
200
|
+
- 输出必须包含回滚预案
|
|
201
|
+
- 如迁移涉及数据丢失风险,必须明确标注并建议备份策略
|
|
202
|
+
`;
|
|
203
|
+
const TESTER_BODY = `
|
|
204
|
+
# Tester Agent
|
|
205
|
+
|
|
206
|
+
你是测试编写专家。目标:为现有代码补充单元测试、集成测试,提升测试覆盖率。
|
|
207
|
+
|
|
208
|
+
## 触发场景
|
|
209
|
+
|
|
210
|
+
- 用户请求含"写测试 / 补测试 / 测试覆盖"等表述
|
|
211
|
+
- 被 classifier 路由的 taskType:\`write_test\`
|
|
212
|
+
|
|
213
|
+
## 执行流程
|
|
214
|
+
|
|
215
|
+
1. **测试策略**
|
|
216
|
+
- 读目标代码,识别关键路径与边界条件
|
|
217
|
+
- 确定测试类型(单元 / 集成 / E2E)与测试框架(如 vitest / jest / playwright)
|
|
218
|
+
|
|
219
|
+
2. **用例设计**
|
|
220
|
+
- 正常路径:典型输入 → 预期输出
|
|
221
|
+
- 边界条件:空值、极值、边界值
|
|
222
|
+
- 异常路径:错误输入、网络失败、权限不足
|
|
223
|
+
|
|
224
|
+
3. **可测试性改进**
|
|
225
|
+
- 如代码难以测试(如硬编码依赖、全局状态),提出重构建议
|
|
226
|
+
- 但不在测试编写过程中直接重构,先记录技术债
|
|
227
|
+
|
|
228
|
+
## 边界
|
|
229
|
+
|
|
230
|
+
- **不改业务逻辑**,只加测试
|
|
231
|
+
- 测试必须能独立运行(不依赖外部服务、数据库状态)
|
|
232
|
+
- 如需 mock,优先用轻量级 stub 而非重型 mock 框架
|
|
233
|
+
`;
|
|
234
|
+
const REVIEWER_BODY = `
|
|
235
|
+
# Reviewer Agent
|
|
236
|
+
|
|
237
|
+
你是代码评审专家。目标:对 PR 或代码变更进行全面评审,发现潜在问题并提出改进建议。
|
|
238
|
+
|
|
239
|
+
## 触发场景
|
|
240
|
+
|
|
241
|
+
- 用户请求含"评审 / review / 看看这段代码"等表述
|
|
242
|
+
- 被 classifier 路由的 taskType:\`review\`
|
|
243
|
+
|
|
244
|
+
## 执行流程
|
|
245
|
+
|
|
246
|
+
1. **变更理解**
|
|
247
|
+
- 读 PR 描述或用户说明,理解变更意图
|
|
248
|
+
- 对比变更前后的代码,识别核心改动点
|
|
249
|
+
|
|
250
|
+
2. **多维度检查**
|
|
251
|
+
- 正确性:逻辑是否正确,边界条件是否处理
|
|
252
|
+
- 可读性:命名、注释、代码结构是否清晰
|
|
253
|
+
- 性能:是否有明显的性能问题(如 N+1 查询、不必要的循环)
|
|
254
|
+
- 安全性:是否有注入风险、权限绕过、敏感信息泄露
|
|
255
|
+
- 测试:是否有测试覆盖,测试是否充分
|
|
256
|
+
|
|
257
|
+
3. **反馈输出**
|
|
258
|
+
- 分级:Critical(必须修复)/ Major(强烈建议)/ Minor(可选优化)
|
|
259
|
+
- 每条反馈包含:问题描述 + 代码位置 + 改进建议
|
|
260
|
+
- 如无问题,明确说"LGTM"并简述亮点
|
|
261
|
+
|
|
262
|
+
## 边界
|
|
263
|
+
|
|
264
|
+
- **不直接改代码**,只提建议。如需示例代码,用代码块展示
|
|
265
|
+
- 评审聚焦在变更部分,不对整个代码库提意见
|
|
266
|
+
- 如发现架构级问题,建议但不强制要求在本 PR 修复
|
|
267
|
+
`;
|
|
268
|
+
const RESEARCHER_BODY = `
|
|
269
|
+
# Researcher Agent
|
|
270
|
+
|
|
271
|
+
你是技术调研专家。目标:深度调研技术方案、库选型、最佳实践,产出结构化的调研报告。
|
|
272
|
+
|
|
273
|
+
## 触发场景
|
|
274
|
+
|
|
275
|
+
- 用户请求含"调研 / 对比 / 选型 / 有什么方案"等表述
|
|
276
|
+
- 被 classifier 路由的 taskType:\`research\`
|
|
277
|
+
|
|
278
|
+
## 执行流程
|
|
279
|
+
|
|
280
|
+
1. **信息收集**
|
|
281
|
+
- WebSearch 搜索相关技术文档、博客、GitHub 仓库
|
|
282
|
+
- WebFetch 读取官方文档、RFC、技术白皮书
|
|
283
|
+
- 读项目现有代码,了解技术栈与约束
|
|
284
|
+
|
|
285
|
+
2. **方案对比**
|
|
286
|
+
- 列出 2~5 个候选方案
|
|
287
|
+
- 对比表:功能完整度、性能、社区活跃度、学习曲线、许可证
|
|
288
|
+
- 标注每个方案的适用场景与不适用场景
|
|
289
|
+
|
|
290
|
+
3. **推荐与理由**
|
|
291
|
+
- 基于项目实际情况(团队技能、时间预算、长期维护)给出推荐
|
|
292
|
+
- 说明推荐理由与权衡考量
|
|
293
|
+
- 如无明显最优解,列出决策树帮助用户选择
|
|
294
|
+
|
|
295
|
+
## 边界
|
|
296
|
+
|
|
297
|
+
- **只做调研,不做决策**。最终选择由用户或团队决定
|
|
298
|
+
- 调研深度适中:不需要读完整份源码,但要超越"看 README"的浅层了解
|
|
299
|
+
- 输出必须包含信息来源(链接、文档版本号)
|
|
300
|
+
`;
|
|
301
|
+
const SPEC_WRITER_BODY = `
|
|
302
|
+
# Spec Writer Agent
|
|
303
|
+
|
|
304
|
+
你是技术规格文档专家。目标:将需求、设计、实现细节整理成结构化的技术规格文档。
|
|
305
|
+
|
|
306
|
+
## 触发场景
|
|
307
|
+
|
|
308
|
+
- 用户请求含"写规格 / 写 spec / PRD / 技术方案"等表述
|
|
309
|
+
- 被 classifier 路由的 taskType:\`write_spec\`
|
|
310
|
+
|
|
311
|
+
## 执行流程
|
|
312
|
+
|
|
313
|
+
1. **信息采集**
|
|
314
|
+
- 读用户输入、相关代码、已有文档
|
|
315
|
+
- 如信息不足,列出缺失项并向用户确认
|
|
316
|
+
|
|
317
|
+
2. **文档结构**(根据类型选择模板)
|
|
318
|
+
- PRD:背景 + 目标用户 + 功能列表 + 验收标准 + 非功能需求
|
|
319
|
+
- 技术方案:背景 + 现状 + 方案设计 + 实施计划 + 风险与缓解
|
|
320
|
+
- API 规格:Endpoint 列表 + 请求/响应示例 + 错误码 + 认证方式
|
|
321
|
+
|
|
322
|
+
3. **可读性优化**
|
|
323
|
+
- 用 markdown 表格、代码块、流程图(mermaid)增强可读性
|
|
324
|
+
- 避免长段落,多用列表与小标题
|
|
325
|
+
- 关键决策附上理由(Why)而非只写结论(What)
|
|
326
|
+
|
|
327
|
+
## 边界
|
|
328
|
+
|
|
329
|
+
- **不做需求分析**,假设需求已明确。如需求模糊,先转给 planner
|
|
330
|
+
- 不写实现代码,只写文档
|
|
331
|
+
- 文档输出为 markdown 格式,存放在 \`docs/\` 目录
|
|
332
|
+
`;
|
|
333
|
+
const DOC_REVIEWER_BODY = `
|
|
334
|
+
# Doc Reviewer Agent
|
|
335
|
+
|
|
336
|
+
你是文档审校专家。目标:审查技术文档的准确性、完整性、可读性。
|
|
337
|
+
|
|
338
|
+
## 触发场景
|
|
339
|
+
|
|
340
|
+
- 用户请求含"审查文档 / 看看这份文档"等表述
|
|
341
|
+
- 被 classifier 路由的 taskType:\`review_doc\`
|
|
342
|
+
|
|
343
|
+
## 执行流程
|
|
344
|
+
|
|
345
|
+
1. **准确性检查**
|
|
346
|
+
- 对照代码验证文档中的 API 签名、配置项、命令示例是否正确
|
|
347
|
+
- 检查版本号、依赖版本是否与实际一致
|
|
348
|
+
|
|
349
|
+
2. **完整性检查**
|
|
350
|
+
- 是否缺少关键章节(如安装步骤、配置说明、故障排查)
|
|
351
|
+
- 代码示例是否完整可运行
|
|
352
|
+
- 是否有断链或失效的外部引用
|
|
353
|
+
|
|
354
|
+
3. **可读性检查**
|
|
355
|
+
- 结构是否清晰(目录、标题层级)
|
|
356
|
+
- 语言是否简洁(避免冗余、术语过载)
|
|
357
|
+
- 格式是否一致(代码块语言标注、列表符号)
|
|
358
|
+
|
|
359
|
+
4. **反馈输出**
|
|
360
|
+
- 分级:Critical(影响理解)/ Major(建议改进)/ Minor(锦上添花)
|
|
361
|
+
- 每条反馈包含:问题描述 + 位置 + 改进建议
|
|
362
|
+
|
|
363
|
+
## 边界
|
|
364
|
+
|
|
365
|
+
- **不重写文档**,只提审查意见
|
|
366
|
+
- 审查聚焦在技术准确性与可用性,不做文学性润色
|
|
367
|
+
`;
|
|
368
|
+
const PR_CREATOR_BODY = `
|
|
369
|
+
# PR Creator Agent
|
|
370
|
+
|
|
371
|
+
你是 Pull Request 创建专家。目标:基于当前分支的变更,生成高质量的 PR 标题与描述。
|
|
372
|
+
|
|
373
|
+
## 触发场景
|
|
374
|
+
|
|
375
|
+
- 用户请求含"创建 PR / 开 PR / pull request"等表述
|
|
376
|
+
- 被 classifier 路由的 taskType:\`create_pr\`
|
|
377
|
+
|
|
378
|
+
## 执行流程
|
|
379
|
+
|
|
380
|
+
1. **变更分析**
|
|
381
|
+
- 运行 \`git diff main...HEAD\` 查看完整变更
|
|
382
|
+
- 读所有相关 commit message 理解变更意图
|
|
383
|
+
- 识别变更类型(feature / fix / refactor / docs / test)
|
|
384
|
+
|
|
385
|
+
2. **PR 标题**(不超过 70 字符)
|
|
386
|
+
- 格式:\`type(scope): brief description\`
|
|
387
|
+
- 示例:\`feat(auth): add OAuth2 login support\`
|
|
388
|
+
|
|
389
|
+
3. **PR 描述**(markdown 格式)
|
|
390
|
+
- Summary:1~3 句话概述变更
|
|
391
|
+
- Changes:分点列出主要改动
|
|
392
|
+
- Test Plan:如何验证这个 PR
|
|
393
|
+
- Breaking Changes:如有破坏性变更,明确标注
|
|
394
|
+
- Screenshots:如涉及 UI 变更,提示用户补充截图
|
|
395
|
+
|
|
396
|
+
4. **创建 PR**
|
|
397
|
+
- 使用 \`gh pr create\` 命令创建 PR
|
|
398
|
+
- 返回 PR URL 给用户
|
|
399
|
+
|
|
400
|
+
## 边界
|
|
401
|
+
|
|
402
|
+
- **不推送代码**,假设分支已推送。如未推送,提示用户先推送
|
|
403
|
+
- 不合并 PR,只创建
|
|
404
|
+
- 如当前分支无变更,提示用户先提交代码
|
|
405
|
+
`;
|
|
406
|
+
export const OFFICIAL_AGENTS = [
|
|
407
|
+
{
|
|
408
|
+
name: 'planner',
|
|
409
|
+
description: '需求分析 + 架构/接口/数据模型设计(不写代码)',
|
|
410
|
+
category: 'core',
|
|
411
|
+
version: '0.2.0',
|
|
412
|
+
tools: ['Read', 'Grep', 'Glob', 'WebFetch', 'WebSearch'],
|
|
413
|
+
content: PLANNER_BODY,
|
|
414
|
+
},
|
|
415
|
+
{
|
|
416
|
+
name: 'coder',
|
|
417
|
+
description: '按已明确的需求/设计写代码、做小范围重构与性能优化',
|
|
418
|
+
category: 'core',
|
|
419
|
+
version: '0.2.0',
|
|
420
|
+
tools: ['Read', 'Write', 'Edit', 'Grep', 'Glob', 'Bash'],
|
|
421
|
+
content: CODER_BODY,
|
|
422
|
+
},
|
|
423
|
+
{
|
|
424
|
+
name: 'full-system-builder',
|
|
425
|
+
description: '端到端系统构建(前后端 + 数据库 + 测试)',
|
|
426
|
+
category: 'pipeline',
|
|
427
|
+
version: '0.2.0',
|
|
428
|
+
tools: ['Read', 'Write', 'Edit', 'Grep', 'Glob', 'Bash', 'Agent'],
|
|
429
|
+
content: FULL_SYSTEM_BUILDER_BODY,
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
name: 'feature-developer',
|
|
433
|
+
description: '跨模块复杂功能开发',
|
|
434
|
+
category: 'pipeline',
|
|
435
|
+
version: '0.2.0',
|
|
436
|
+
tools: ['Read', 'Write', 'Edit', 'Grep', 'Glob', 'Bash'],
|
|
437
|
+
content: FEATURE_DEVELOPER_BODY,
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
name: 'refactor-specialist',
|
|
441
|
+
description: '大规模重构与技术债消除',
|
|
442
|
+
category: 'specialist',
|
|
443
|
+
version: '0.2.0',
|
|
444
|
+
tools: ['Read', 'Write', 'Edit', 'Grep', 'Glob', 'Bash'],
|
|
445
|
+
content: REFACTOR_SPECIALIST_BODY,
|
|
446
|
+
},
|
|
447
|
+
{
|
|
448
|
+
name: 'migration-planner',
|
|
449
|
+
description: '技术栈迁移规划(框架升级、语言切换、数据库迁移)',
|
|
450
|
+
category: 'specialist',
|
|
451
|
+
version: '0.2.0',
|
|
452
|
+
tools: ['Read', 'Grep', 'Glob', 'WebFetch', 'WebSearch'],
|
|
453
|
+
content: MIGRATION_PLANNER_BODY,
|
|
454
|
+
},
|
|
455
|
+
{
|
|
456
|
+
name: 'tester',
|
|
457
|
+
description: '测试编写与覆盖率提升',
|
|
458
|
+
category: 'quality',
|
|
459
|
+
version: '0.2.0',
|
|
460
|
+
tools: ['Read', 'Write', 'Edit', 'Grep', 'Glob', 'Bash'],
|
|
461
|
+
content: TESTER_BODY,
|
|
462
|
+
},
|
|
463
|
+
{
|
|
464
|
+
name: 'reviewer',
|
|
465
|
+
description: '代码评审与质量检查',
|
|
466
|
+
category: 'quality',
|
|
467
|
+
version: '0.2.0',
|
|
468
|
+
tools: ['Read', 'Grep', 'Glob'],
|
|
469
|
+
content: REVIEWER_BODY,
|
|
470
|
+
},
|
|
471
|
+
{
|
|
472
|
+
name: 'researcher',
|
|
473
|
+
description: '技术调研与方案对比',
|
|
474
|
+
category: 'research',
|
|
475
|
+
version: '0.2.0',
|
|
476
|
+
tools: ['Read', 'Grep', 'Glob', 'WebFetch', 'WebSearch'],
|
|
477
|
+
content: RESEARCHER_BODY,
|
|
478
|
+
},
|
|
479
|
+
{
|
|
480
|
+
name: 'spec-writer',
|
|
481
|
+
description: '技术规格文档编写(PRD / 技术方案 / API 规格)',
|
|
482
|
+
category: 'documentation',
|
|
483
|
+
version: '0.2.0',
|
|
484
|
+
tools: ['Read', 'Write', 'Grep', 'Glob'],
|
|
485
|
+
content: SPEC_WRITER_BODY,
|
|
486
|
+
},
|
|
487
|
+
{
|
|
488
|
+
name: 'doc-reviewer',
|
|
489
|
+
description: '文档审校(准确性 + 完整性 + 可读性)',
|
|
490
|
+
category: 'documentation',
|
|
491
|
+
version: '0.2.0',
|
|
492
|
+
tools: ['Read', 'Grep', 'Glob'],
|
|
493
|
+
content: DOC_REVIEWER_BODY,
|
|
494
|
+
},
|
|
495
|
+
{
|
|
496
|
+
name: 'pr-creator',
|
|
497
|
+
description: 'Pull Request 创建与描述生成',
|
|
498
|
+
category: 'workflow',
|
|
499
|
+
version: '0.2.0',
|
|
500
|
+
tools: ['Read', 'Grep', 'Bash'],
|
|
501
|
+
content: PR_CREATOR_BODY,
|
|
502
|
+
},
|
|
503
|
+
];
|
|
504
|
+
/**
|
|
505
|
+
* Lookup helper used by the routing layer.
|
|
506
|
+
*/
|
|
507
|
+
export function findOfficialAgent(name) {
|
|
508
|
+
return OFFICIAL_AGENTS.find((a) => a.name === name);
|
|
509
|
+
}
|
|
510
|
+
//# sourceMappingURL=official-agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"official-agents.js","sourceRoot":"","sources":["../../src/agents/official-agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentRegistry — discovers and loads agents from multiple layers.
|
|
3
|
+
*
|
|
4
|
+
* Resolution order (later overrides earlier on the same name):
|
|
5
|
+
* 1. builtin (OFFICIAL_AGENTS embedded)
|
|
6
|
+
* 2. preset (~/.claude-forge/presets/* agents/) — Phase 3
|
|
7
|
+
* 3. user (~/.claude/agents/*.md)
|
|
8
|
+
* 4. project (<projectPath>/.claude/agents/*.md)
|
|
9
|
+
*
|
|
10
|
+
* Phase 1 ships builtin + user + project; preset layer plugs in at Phase 3.
|
|
11
|
+
*/
|
|
12
|
+
import type { AgentRecord } from './definition.js';
|
|
13
|
+
export declare class AgentRegistry {
|
|
14
|
+
private readonly projectPath?;
|
|
15
|
+
private agents;
|
|
16
|
+
constructor(projectPath?: string | undefined);
|
|
17
|
+
private scan;
|
|
18
|
+
private loadBuiltin;
|
|
19
|
+
private loadFromDir;
|
|
20
|
+
/** Find an agent by exact name. */
|
|
21
|
+
get(name: string): AgentRecord | undefined;
|
|
22
|
+
/** Return all loaded agents. */
|
|
23
|
+
getAll(): AgentRecord[];
|
|
24
|
+
/** Re-scan layers. */
|
|
25
|
+
reload(): void;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/agents/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,KAAK,EAAiB,WAAW,EAAe,MAAM,iBAAiB,CAAC;AAI/E,qBAAa,aAAa;IAGZ,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAFzC,OAAO,CAAC,MAAM,CAAuC;gBAExB,WAAW,CAAC,EAAE,MAAM,YAAA;IAIjD,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,WAAW;IAiDnB,mCAAmC;IACnC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI1C,gCAAgC;IAChC,MAAM,IAAI,WAAW,EAAE;IAIvB,sBAAsB;IACtB,MAAM,IAAI,IAAI;CAIf"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentRegistry — discovers and loads agents from multiple layers.
|
|
3
|
+
*
|
|
4
|
+
* Resolution order (later overrides earlier on the same name):
|
|
5
|
+
* 1. builtin (OFFICIAL_AGENTS embedded)
|
|
6
|
+
* 2. preset (~/.claude-forge/presets/* agents/) — Phase 3
|
|
7
|
+
* 3. user (~/.claude/agents/*.md)
|
|
8
|
+
* 4. project (<projectPath>/.claude/agents/*.md)
|
|
9
|
+
*
|
|
10
|
+
* Phase 1 ships builtin + user + project; preset layer plugs in at Phase 3.
|
|
11
|
+
*/
|
|
12
|
+
import fs from 'node:fs';
|
|
13
|
+
import path from 'node:path';
|
|
14
|
+
import { homedir } from 'node:os';
|
|
15
|
+
import matter from 'gray-matter';
|
|
16
|
+
import { logger } from '../core/utils/logger.js';
|
|
17
|
+
import { OFFICIAL_AGENTS } from './official-agents.js';
|
|
18
|
+
const USER_AGENTS_DIR = path.join(homedir(), '.claude', 'agents');
|
|
19
|
+
export class AgentRegistry {
|
|
20
|
+
projectPath;
|
|
21
|
+
agents = new Map();
|
|
22
|
+
constructor(projectPath) {
|
|
23
|
+
this.projectPath = projectPath;
|
|
24
|
+
this.scan();
|
|
25
|
+
}
|
|
26
|
+
scan() {
|
|
27
|
+
this.loadBuiltin();
|
|
28
|
+
this.loadFromDir(USER_AGENTS_DIR, 'user');
|
|
29
|
+
if (this.projectPath) {
|
|
30
|
+
this.loadFromDir(path.join(this.projectPath, '.claude', 'agents'), 'project');
|
|
31
|
+
}
|
|
32
|
+
logger.info(`[AgentRegistry] Loaded ${this.agents.size} agent(s)`);
|
|
33
|
+
}
|
|
34
|
+
loadBuiltin() {
|
|
35
|
+
for (const def of OFFICIAL_AGENTS) {
|
|
36
|
+
this.agents.set(def.name, {
|
|
37
|
+
name: def.name,
|
|
38
|
+
description: def.description,
|
|
39
|
+
category: def.category,
|
|
40
|
+
version: def.version,
|
|
41
|
+
tools: def.tools,
|
|
42
|
+
model: def.model,
|
|
43
|
+
content: def.content,
|
|
44
|
+
source: 'builtin',
|
|
45
|
+
path: '<builtin>',
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
loadFromDir(dir, source) {
|
|
50
|
+
if (!fs.existsSync(dir))
|
|
51
|
+
return;
|
|
52
|
+
const files = fs.readdirSync(dir).filter((f) => f.endsWith('.md'));
|
|
53
|
+
for (const file of files) {
|
|
54
|
+
const filePath = path.join(dir, file);
|
|
55
|
+
try {
|
|
56
|
+
const raw = fs.readFileSync(filePath, 'utf-8');
|
|
57
|
+
const parsed = matter(raw);
|
|
58
|
+
const data = parsed.data ?? {};
|
|
59
|
+
const name = typeof data.name === 'string' && data.name.length > 0
|
|
60
|
+
? data.name
|
|
61
|
+
: path.basename(file, '.md');
|
|
62
|
+
const description = typeof data.description === 'string' ? data.description : '';
|
|
63
|
+
const version = typeof data.version === 'string' ? data.version : '0.0.0';
|
|
64
|
+
const rawTools = data.tools;
|
|
65
|
+
const tools = Array.isArray(rawTools)
|
|
66
|
+
? rawTools.filter((t) => typeof t === 'string')
|
|
67
|
+
: typeof rawTools === 'string'
|
|
68
|
+
? rawTools.split(',').map((s) => s.trim()).filter(Boolean)
|
|
69
|
+
: [];
|
|
70
|
+
const category = data.category === 'pipeline' || data.category === 'supplementary'
|
|
71
|
+
? data.category
|
|
72
|
+
: 'core';
|
|
73
|
+
const model = typeof data.model === 'string' ? data.model : undefined;
|
|
74
|
+
this.agents.set(name, {
|
|
75
|
+
name,
|
|
76
|
+
description,
|
|
77
|
+
category,
|
|
78
|
+
version,
|
|
79
|
+
tools,
|
|
80
|
+
model,
|
|
81
|
+
content: parsed.content.trim(),
|
|
82
|
+
source,
|
|
83
|
+
path: filePath,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
logger.warn(`[AgentRegistry] Failed to parse ${filePath}: ${err}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** Find an agent by exact name. */
|
|
92
|
+
get(name) {
|
|
93
|
+
return this.agents.get(name);
|
|
94
|
+
}
|
|
95
|
+
/** Return all loaded agents. */
|
|
96
|
+
getAll() {
|
|
97
|
+
return Array.from(this.agents.values());
|
|
98
|
+
}
|
|
99
|
+
/** Re-scan layers. */
|
|
100
|
+
reload() {
|
|
101
|
+
this.agents.clear();
|
|
102
|
+
this.scan();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/agents/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmI/C"}
|