openmatrix 0.1.99 → 0.2.2
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/impl/coder-agent.js +42 -42
- package/dist/agents/impl/executor-agent.js +75 -75
- package/dist/agents/impl/planner-agent.js +63 -63
- package/dist/agents/impl/reviewer-agent.js +66 -66
- package/dist/agents/impl/tester-agent.js +56 -56
- package/dist/cli/commands/auto.js +20 -6
- package/dist/cli/commands/complete.js +1 -1
- package/dist/cli/commands/meeting.js +0 -1
- package/dist/cli/commands/report.js +45 -45
- package/dist/cli/commands/start.js +168 -34
- package/dist/cli/commands/status.js +0 -1
- package/dist/cli/commands/step.js +62 -35
- package/dist/orchestrator/ai-reviewer.d.ts +30 -2
- package/dist/orchestrator/ai-reviewer.js +314 -209
- package/dist/orchestrator/answer-mapper.d.ts +1 -0
- package/dist/orchestrator/answer-mapper.js +5 -2
- package/dist/orchestrator/approval-manager.js +14 -13
- package/dist/orchestrator/executor.d.ts +10 -1
- package/dist/orchestrator/executor.js +62 -2
- package/dist/orchestrator/interactive-question-generator.js +4 -3
- package/dist/orchestrator/meeting-manager.js +32 -31
- package/dist/orchestrator/phase-executor.js +9 -6
- package/dist/orchestrator/scheduler.d.ts +8 -6
- package/dist/orchestrator/scheduler.js +53 -22
- package/dist/orchestrator/state-machine.js +2 -2
- package/dist/orchestrator/task-planner.d.ts +83 -4
- package/dist/orchestrator/task-planner.js +702 -124
- package/dist/storage/state-manager.d.ts +6 -0
- package/dist/storage/state-manager.js +28 -0
- package/package.json +55 -55
- package/scripts/build-check.js +19 -19
- package/scripts/install-skills.js +57 -57
- package/skills/approve.md +250 -250
- package/skills/auto.md +298 -298
- package/skills/meeting.md +324 -324
- package/skills/om.md +112 -112
- package/skills/openmatrix.md +112 -112
- package/skills/start.md +38 -6
- package/dist/cli/commands/upgrade.d.ts +0 -2
- package/dist/cli/commands/upgrade.js +0 -329
- package/dist/orchestrator/task-planner.old.d.ts +0 -87
- package/dist/orchestrator/task-planner.old.js +0 -444
|
@@ -16,162 +16,162 @@ class AIReviewer {
|
|
|
16
16
|
* 生成 AI Review 提示词
|
|
17
17
|
*/
|
|
18
18
|
buildReviewPrompt(task) {
|
|
19
|
-
return `# AI Code Review - 验收阶段
|
|
20
|
-
|
|
21
|
-
## 任务信息
|
|
22
|
-
- Task ID: ${task.id}
|
|
23
|
-
- 标题: ${task.title}
|
|
24
|
-
- 描述: ${task.description}
|
|
25
|
-
|
|
26
|
-
## 审查范围
|
|
27
|
-
|
|
28
|
-
请对本次任务的所有代码变更进行完整审查。
|
|
29
|
-
|
|
30
|
-
## 审查清单
|
|
31
|
-
|
|
32
|
-
### 1. 代码质量 (Code Quality)
|
|
33
|
-
- [ ] 代码可读性: 命名清晰、结构合理
|
|
34
|
-
- [ ] 函数复杂度: 单一职责、适当长度
|
|
35
|
-
- [ ] 代码复用: 避免重复、抽取公共逻辑
|
|
36
|
-
- [ ] 注释质量: 关键逻辑有注释、复杂代码有说明
|
|
37
|
-
- [ ] 错误处理: 异常情况有处理、错误信息清晰
|
|
38
|
-
|
|
39
|
-
### 2. 安全性 (Security)
|
|
40
|
-
- [ ] 输入验证: 用户输入有校验
|
|
41
|
-
- [ ] SQL 注入: 数据库查询使用参数化
|
|
42
|
-
- [ ] XSS 攻击: 输出有转义
|
|
43
|
-
- [ ] 敏感数据: 密码/密钥不明文存储
|
|
44
|
-
- [ ] 权限控制: 敏感操作有权限检查
|
|
45
|
-
|
|
46
|
-
### 3. 性能 (Performance)
|
|
47
|
-
- [ ] 算法效率: 时间复杂度合理
|
|
48
|
-
- [ ] 数据库查询: 避免 N+1、使用索引
|
|
49
|
-
- [ ] 内存使用: 无内存泄漏、大对象及时释放
|
|
50
|
-
- [ ] 缓存策略: 适当使用缓存
|
|
51
|
-
- [ ] 异步处理: 耗时操作使用异步
|
|
52
|
-
|
|
53
|
-
### 4. 最佳实践 (Best Practices)
|
|
54
|
-
- [ ] 设计模式: 合理使用设计模式
|
|
55
|
-
- [ ] 依赖注入: 避免硬编码依赖
|
|
56
|
-
- [ ] 配置管理: 配置与代码分离
|
|
57
|
-
- [ ] 日志记录: 关键操作有日志
|
|
58
|
-
- [ ] 测试友好: 代码易于测试
|
|
59
|
-
|
|
60
|
-
### 5. 测试覆盖 (Test Coverage)
|
|
61
|
-
- [ ] 单元测试: 核心逻辑有测试
|
|
62
|
-
- [ ] 边界情况: 边界值有测试
|
|
63
|
-
- [ ] 异常路径: 错误情况有测试
|
|
64
|
-
- [ ] 测试质量: 测试有意义、不是为测试而测试
|
|
65
|
-
|
|
66
|
-
## 输出格式
|
|
67
|
-
|
|
68
|
-
在 \`.openmatrix/tasks/${task.id}/artifacts/\` 目录下创建:
|
|
69
|
-
|
|
70
|
-
### ai-review-report.md
|
|
71
|
-
|
|
72
|
-
\`\`\`markdown
|
|
73
|
-
# AI Review 报告
|
|
74
|
-
|
|
75
|
-
## 任务信息
|
|
76
|
-
- Task ID: ${task.id}
|
|
77
|
-
- 审查时间: [当前时间]
|
|
78
|
-
|
|
79
|
-
## 总体评价
|
|
80
|
-
[✅ 通过 / ⚠️ 需要修改 / ❌ 拒绝]
|
|
81
|
-
|
|
82
|
-
## 分类评估
|
|
83
|
-
|
|
84
|
-
### 1. 代码质量
|
|
85
|
-
- 评分: [0-100]
|
|
86
|
-
- 状态: ✅ / ⚠️ / ❌
|
|
87
|
-
- 详情:
|
|
88
|
-
- [具体评价1]
|
|
89
|
-
- [具体评价2]
|
|
90
|
-
|
|
91
|
-
### 2. 安全性
|
|
92
|
-
- 评分: [0-100]
|
|
93
|
-
- 状态: ✅ / ⚠️ / ❌
|
|
94
|
-
- 详情:
|
|
95
|
-
- [具体评价1]
|
|
96
|
-
- [具体评价2]
|
|
97
|
-
|
|
98
|
-
### 3. 性能
|
|
99
|
-
- 评分: [0-100]
|
|
100
|
-
- 状态: ✅ / ⚠️ / ❌
|
|
101
|
-
- 详情:
|
|
102
|
-
- [具体评价1]
|
|
103
|
-
- [具体评价2]
|
|
104
|
-
|
|
105
|
-
### 4. 最佳实践
|
|
106
|
-
- 评分: [0-100]
|
|
107
|
-
- 状态: ✅ / ⚠️ / ❌
|
|
108
|
-
- 详情:
|
|
109
|
-
- [具体评价1]
|
|
110
|
-
- [具体评价2]
|
|
111
|
-
|
|
112
|
-
### 5. 测试覆盖
|
|
113
|
-
- 评分: [0-100]
|
|
114
|
-
- 状态: ✅ / ⚠️ / ❌
|
|
115
|
-
- 详情:
|
|
116
|
-
- [具体评价1]
|
|
117
|
-
- [具体评价2]
|
|
118
|
-
|
|
119
|
-
## 问题列表
|
|
120
|
-
|
|
121
|
-
### 严重 (Critical) - 必须修复
|
|
122
|
-
1. [文件:行号] 问题描述
|
|
123
|
-
- 建议: 修复建议
|
|
124
|
-
|
|
125
|
-
### 重要 (Major) - 强烈建议修复
|
|
126
|
-
1. [文件:行号] 问题描述
|
|
127
|
-
- 建议: 修复建议
|
|
128
|
-
|
|
129
|
-
### 次要 (Minor) - 可选优化
|
|
130
|
-
1. [文件:行号] 问题描述
|
|
131
|
-
|
|
132
|
-
### 建议 (Suggestion) - 改进建议
|
|
133
|
-
1. [改进建议]
|
|
134
|
-
|
|
135
|
-
## 总结
|
|
136
|
-
[审查总结和最终建议]
|
|
137
|
-
\`\`\`
|
|
138
|
-
|
|
139
|
-
## 最终输出
|
|
140
|
-
|
|
141
|
-
根据审查结果,输出以下之一:
|
|
142
|
-
|
|
143
|
-
**通过:**
|
|
144
|
-
\`\`\`
|
|
145
|
-
AI_REVIEW_APPROVED
|
|
146
|
-
\`\`\`
|
|
147
|
-
|
|
148
|
-
**需要修改:**
|
|
149
|
-
\`\`\`
|
|
150
|
-
AI_REVIEW_NEEDS_CHANGES
|
|
151
|
-
需要修复的问题:
|
|
152
|
-
1. [Critical/Major 问题描述]
|
|
153
|
-
\`\`\`
|
|
154
|
-
|
|
155
|
-
**拒绝:**
|
|
156
|
-
\`\`\`
|
|
157
|
-
AI_REVIEW_REJECTED
|
|
158
|
-
拒绝原因:
|
|
159
|
-
1. [严重问题描述]
|
|
160
|
-
\`\`\`
|
|
161
|
-
|
|
162
|
-
## 审查原则
|
|
163
|
-
|
|
164
|
-
1. **平衡** - 不要过于严苛,也不要过于宽松
|
|
165
|
-
2. **实用** - 关注真正重要的问题
|
|
166
|
-
3. **建设性** - 提供具体的改进建议
|
|
167
|
-
4. **上下文** - 考虑项目的实际情况和约束
|
|
168
|
-
5. **渐进** - 允许代码渐进式改进,不要求完美
|
|
19
|
+
return `# AI Code Review - 验收阶段
|
|
20
|
+
|
|
21
|
+
## 任务信息
|
|
22
|
+
- Task ID: ${task.id}
|
|
23
|
+
- 标题: ${task.title}
|
|
24
|
+
- 描述: ${task.description}
|
|
25
|
+
|
|
26
|
+
## 审查范围
|
|
27
|
+
|
|
28
|
+
请对本次任务的所有代码变更进行完整审查。
|
|
29
|
+
|
|
30
|
+
## 审查清单
|
|
31
|
+
|
|
32
|
+
### 1. 代码质量 (Code Quality)
|
|
33
|
+
- [ ] 代码可读性: 命名清晰、结构合理
|
|
34
|
+
- [ ] 函数复杂度: 单一职责、适当长度
|
|
35
|
+
- [ ] 代码复用: 避免重复、抽取公共逻辑
|
|
36
|
+
- [ ] 注释质量: 关键逻辑有注释、复杂代码有说明
|
|
37
|
+
- [ ] 错误处理: 异常情况有处理、错误信息清晰
|
|
38
|
+
|
|
39
|
+
### 2. 安全性 (Security)
|
|
40
|
+
- [ ] 输入验证: 用户输入有校验
|
|
41
|
+
- [ ] SQL 注入: 数据库查询使用参数化
|
|
42
|
+
- [ ] XSS 攻击: 输出有转义
|
|
43
|
+
- [ ] 敏感数据: 密码/密钥不明文存储
|
|
44
|
+
- [ ] 权限控制: 敏感操作有权限检查
|
|
45
|
+
|
|
46
|
+
### 3. 性能 (Performance)
|
|
47
|
+
- [ ] 算法效率: 时间复杂度合理
|
|
48
|
+
- [ ] 数据库查询: 避免 N+1、使用索引
|
|
49
|
+
- [ ] 内存使用: 无内存泄漏、大对象及时释放
|
|
50
|
+
- [ ] 缓存策略: 适当使用缓存
|
|
51
|
+
- [ ] 异步处理: 耗时操作使用异步
|
|
52
|
+
|
|
53
|
+
### 4. 最佳实践 (Best Practices)
|
|
54
|
+
- [ ] 设计模式: 合理使用设计模式
|
|
55
|
+
- [ ] 依赖注入: 避免硬编码依赖
|
|
56
|
+
- [ ] 配置管理: 配置与代码分离
|
|
57
|
+
- [ ] 日志记录: 关键操作有日志
|
|
58
|
+
- [ ] 测试友好: 代码易于测试
|
|
59
|
+
|
|
60
|
+
### 5. 测试覆盖 (Test Coverage)
|
|
61
|
+
- [ ] 单元测试: 核心逻辑有测试
|
|
62
|
+
- [ ] 边界情况: 边界值有测试
|
|
63
|
+
- [ ] 异常路径: 错误情况有测试
|
|
64
|
+
- [ ] 测试质量: 测试有意义、不是为测试而测试
|
|
65
|
+
|
|
66
|
+
## 输出格式
|
|
67
|
+
|
|
68
|
+
在 \`.openmatrix/tasks/${task.id}/artifacts/\` 目录下创建:
|
|
69
|
+
|
|
70
|
+
### ai-review-report.md
|
|
71
|
+
|
|
72
|
+
\`\`\`markdown
|
|
73
|
+
# AI Review 报告
|
|
74
|
+
|
|
75
|
+
## 任务信息
|
|
76
|
+
- Task ID: ${task.id}
|
|
77
|
+
- 审查时间: [当前时间]
|
|
78
|
+
|
|
79
|
+
## 总体评价
|
|
80
|
+
[✅ 通过 / ⚠️ 需要修改 / ❌ 拒绝]
|
|
81
|
+
|
|
82
|
+
## 分类评估
|
|
83
|
+
|
|
84
|
+
### 1. 代码质量
|
|
85
|
+
- 评分: [0-100]
|
|
86
|
+
- 状态: ✅ / ⚠️ / ❌
|
|
87
|
+
- 详情:
|
|
88
|
+
- [具体评价1]
|
|
89
|
+
- [具体评价2]
|
|
90
|
+
|
|
91
|
+
### 2. 安全性
|
|
92
|
+
- 评分: [0-100]
|
|
93
|
+
- 状态: ✅ / ⚠️ / ❌
|
|
94
|
+
- 详情:
|
|
95
|
+
- [具体评价1]
|
|
96
|
+
- [具体评价2]
|
|
97
|
+
|
|
98
|
+
### 3. 性能
|
|
99
|
+
- 评分: [0-100]
|
|
100
|
+
- 状态: ✅ / ⚠️ / ❌
|
|
101
|
+
- 详情:
|
|
102
|
+
- [具体评价1]
|
|
103
|
+
- [具体评价2]
|
|
104
|
+
|
|
105
|
+
### 4. 最佳实践
|
|
106
|
+
- 评分: [0-100]
|
|
107
|
+
- 状态: ✅ / ⚠️ / ❌
|
|
108
|
+
- 详情:
|
|
109
|
+
- [具体评价1]
|
|
110
|
+
- [具体评价2]
|
|
111
|
+
|
|
112
|
+
### 5. 测试覆盖
|
|
113
|
+
- 评分: [0-100]
|
|
114
|
+
- 状态: ✅ / ⚠️ / ❌
|
|
115
|
+
- 详情:
|
|
116
|
+
- [具体评价1]
|
|
117
|
+
- [具体评价2]
|
|
118
|
+
|
|
119
|
+
## 问题列表
|
|
120
|
+
|
|
121
|
+
### 严重 (Critical) - 必须修复
|
|
122
|
+
1. [文件:行号] 问题描述
|
|
123
|
+
- 建议: 修复建议
|
|
124
|
+
|
|
125
|
+
### 重要 (Major) - 强烈建议修复
|
|
126
|
+
1. [文件:行号] 问题描述
|
|
127
|
+
- 建议: 修复建议
|
|
128
|
+
|
|
129
|
+
### 次要 (Minor) - 可选优化
|
|
130
|
+
1. [文件:行号] 问题描述
|
|
131
|
+
|
|
132
|
+
### 建议 (Suggestion) - 改进建议
|
|
133
|
+
1. [改进建议]
|
|
134
|
+
|
|
135
|
+
## 总结
|
|
136
|
+
[审查总结和最终建议]
|
|
137
|
+
\`\`\`
|
|
138
|
+
|
|
139
|
+
## 最终输出
|
|
140
|
+
|
|
141
|
+
根据审查结果,输出以下之一:
|
|
142
|
+
|
|
143
|
+
**通过:**
|
|
144
|
+
\`\`\`
|
|
145
|
+
AI_REVIEW_APPROVED
|
|
146
|
+
\`\`\`
|
|
147
|
+
|
|
148
|
+
**需要修改:**
|
|
149
|
+
\`\`\`
|
|
150
|
+
AI_REVIEW_NEEDS_CHANGES
|
|
151
|
+
需要修复的问题:
|
|
152
|
+
1. [Critical/Major 问题描述]
|
|
153
|
+
\`\`\`
|
|
154
|
+
|
|
155
|
+
**拒绝:**
|
|
156
|
+
\`\`\`
|
|
157
|
+
AI_REVIEW_REJECTED
|
|
158
|
+
拒绝原因:
|
|
159
|
+
1. [严重问题描述]
|
|
160
|
+
\`\`\`
|
|
161
|
+
|
|
162
|
+
## 审查原则
|
|
163
|
+
|
|
164
|
+
1. **平衡** - 不要过于严苛,也不要过于宽松
|
|
165
|
+
2. **实用** - 关注真正重要的问题
|
|
166
|
+
3. **建设性** - 提供具体的改进建议
|
|
167
|
+
4. **上下文** - 考虑项目的实际情况和约束
|
|
168
|
+
5. **渐进** - 允许代码渐进式改进,不要求完美
|
|
169
169
|
`;
|
|
170
170
|
}
|
|
171
171
|
/**
|
|
172
172
|
* 解析 AI Review 结果
|
|
173
173
|
*/
|
|
174
|
-
parseReviewResult(output) {
|
|
174
|
+
parseReviewResult(taskId, output) {
|
|
175
175
|
const lines = output.split('\n');
|
|
176
176
|
const issues = [];
|
|
177
177
|
const categories = [];
|
|
@@ -249,7 +249,7 @@ AI_REVIEW_REJECTED
|
|
|
249
249
|
const summaryMatch = output.match(/## 总结\s*([\s\S]*?)(?=```|$)/);
|
|
250
250
|
const summary = summaryMatch ? summaryMatch[1].trim() : '';
|
|
251
251
|
return {
|
|
252
|
-
taskId
|
|
252
|
+
taskId,
|
|
253
253
|
overallStatus,
|
|
254
254
|
categories,
|
|
255
255
|
issues,
|
|
@@ -263,64 +263,169 @@ AI_REVIEW_REJECTED
|
|
|
263
263
|
*/
|
|
264
264
|
buildAcceptPrompt(task) {
|
|
265
265
|
const reviewPrompt = this.buildReviewPrompt(task);
|
|
266
|
-
return `# 验收阶段 (Accept Phase)
|
|
267
|
-
|
|
268
|
-
## 任务信息
|
|
269
|
-
- ID: ${task.id}
|
|
270
|
-
- 标题: ${task.title}
|
|
271
|
-
- 描述: ${task.description}
|
|
272
|
-
|
|
273
|
-
## 验收流程
|
|
274
|
-
|
|
275
|
-
### 1. AI Code Review
|
|
276
|
-
执行完整的代码审查:
|
|
277
|
-
|
|
278
|
-
${reviewPrompt}
|
|
279
|
-
|
|
280
|
-
### 2. 功能验证
|
|
281
|
-
- 确认功能按需求实现
|
|
282
|
-
- 检查边界情况处理
|
|
283
|
-
- 验证错误处理
|
|
284
|
-
|
|
285
|
-
### 3. 文档检查
|
|
286
|
-
- README 是否更新
|
|
287
|
-
- API 文档是否完整
|
|
288
|
-
- 注释是否充分
|
|
289
|
-
|
|
290
|
-
### 4. 最终确认
|
|
291
|
-
- 所有测试通过
|
|
292
|
-
- AI Review 通过
|
|
293
|
-
- 文档已更新
|
|
294
|
-
- 可以合并
|
|
295
|
-
|
|
296
|
-
## 输出要求
|
|
297
|
-
|
|
298
|
-
在 \`.openmatrix/tasks/${task.id}/artifacts/\` 目录下创建:
|
|
299
|
-
- \`accept-report.md\` - 验收报告
|
|
300
|
-
- \`ai-review-report.md\` - AI 审查报告
|
|
301
|
-
|
|
302
|
-
## 结果格式
|
|
303
|
-
|
|
304
|
-
如果验收通过,输出:
|
|
305
|
-
\`\`\`
|
|
306
|
-
ACCEPT_PASSED
|
|
307
|
-
\`\`\`
|
|
308
|
-
|
|
309
|
-
如果需要修改,输出:
|
|
310
|
-
\`\`\`
|
|
311
|
-
ACCEPT_NEEDS_MODIFICATION
|
|
312
|
-
修改建议:
|
|
313
|
-
1. [建议]
|
|
314
|
-
2. [建议]
|
|
315
|
-
\`\`\`
|
|
316
|
-
|
|
317
|
-
如果验收失败,输出:
|
|
318
|
-
\`\`\`
|
|
319
|
-
ACCEPT_FAILED
|
|
320
|
-
失败原因:
|
|
321
|
-
1. [原因]
|
|
322
|
-
\`\`\`
|
|
266
|
+
return `# 验收阶段 (Accept Phase)
|
|
267
|
+
|
|
268
|
+
## 任务信息
|
|
269
|
+
- ID: ${task.id}
|
|
270
|
+
- 标题: ${task.title}
|
|
271
|
+
- 描述: ${task.description}
|
|
272
|
+
|
|
273
|
+
## 验收流程
|
|
274
|
+
|
|
275
|
+
### 1. AI Code Review
|
|
276
|
+
执行完整的代码审查:
|
|
277
|
+
|
|
278
|
+
${reviewPrompt}
|
|
279
|
+
|
|
280
|
+
### 2. 功能验证
|
|
281
|
+
- 确认功能按需求实现
|
|
282
|
+
- 检查边界情况处理
|
|
283
|
+
- 验证错误处理
|
|
284
|
+
|
|
285
|
+
### 3. 文档检查
|
|
286
|
+
- README 是否更新
|
|
287
|
+
- API 文档是否完整
|
|
288
|
+
- 注释是否充分
|
|
289
|
+
|
|
290
|
+
### 4. 最终确认
|
|
291
|
+
- 所有测试通过
|
|
292
|
+
- AI Review 通过
|
|
293
|
+
- 文档已更新
|
|
294
|
+
- 可以合并
|
|
295
|
+
|
|
296
|
+
## 输出要求
|
|
297
|
+
|
|
298
|
+
在 \`.openmatrix/tasks/${task.id}/artifacts/\` 目录下创建:
|
|
299
|
+
- \`accept-report.md\` - 验收报告
|
|
300
|
+
- \`ai-review-report.md\` - AI 审查报告
|
|
301
|
+
|
|
302
|
+
## 结果格式
|
|
303
|
+
|
|
304
|
+
如果验收通过,输出:
|
|
305
|
+
\`\`\`
|
|
306
|
+
ACCEPT_PASSED
|
|
307
|
+
\`\`\`
|
|
308
|
+
|
|
309
|
+
如果需要修改,输出:
|
|
310
|
+
\`\`\`
|
|
311
|
+
ACCEPT_NEEDS_MODIFICATION
|
|
312
|
+
修改建议:
|
|
313
|
+
1. [建议]
|
|
314
|
+
2. [建议]
|
|
315
|
+
\`\`\`
|
|
316
|
+
|
|
317
|
+
如果验收失败,输出:
|
|
318
|
+
\`\`\`
|
|
319
|
+
ACCEPT_FAILED
|
|
320
|
+
失败原因:
|
|
321
|
+
1. [原因]
|
|
322
|
+
\`\`\`
|
|
323
323
|
`;
|
|
324
324
|
}
|
|
325
|
+
/**
|
|
326
|
+
* 根据 Review 报告生成修复任务
|
|
327
|
+
*
|
|
328
|
+
* 对每个 critical/major 问题生成独立的修复任务,
|
|
329
|
+
* 这些任务会被加入执行队列并自动执行。
|
|
330
|
+
*
|
|
331
|
+
* @param originalTask 被审查的原始任务
|
|
332
|
+
* @param report Review 报告
|
|
333
|
+
* @param reviewTaskId 审查任务本身的 ID(用于依赖)
|
|
334
|
+
* @returns 修复任务列表
|
|
335
|
+
*/
|
|
336
|
+
generateFixTasks(originalTask, report, reviewTaskId) {
|
|
337
|
+
const fixTasks = [];
|
|
338
|
+
let counter = 0;
|
|
339
|
+
// 只对 critical 和 major 级别的问题生成修复任务
|
|
340
|
+
const actionableIssues = report.issues.filter(issue => issue.severity === 'critical' || issue.severity === 'major');
|
|
341
|
+
// 按文件分组,减少上下文切换
|
|
342
|
+
const issuesByFile = new Map();
|
|
343
|
+
for (const issue of actionableIssues) {
|
|
344
|
+
const fileKey = issue.file || 'general';
|
|
345
|
+
if (!issuesByFile.has(fileKey)) {
|
|
346
|
+
issuesByFile.set(fileKey, []);
|
|
347
|
+
}
|
|
348
|
+
issuesByFile.get(fileKey).push(issue);
|
|
349
|
+
}
|
|
350
|
+
for (const [file, issues] of issuesByFile) {
|
|
351
|
+
counter++;
|
|
352
|
+
const isCritical = issues.some(i => i.severity === 'critical');
|
|
353
|
+
const severityLabel = isCritical ? '紧急修复' : '修复';
|
|
354
|
+
// 构建修复描述
|
|
355
|
+
const issueDetails = issues.map((issue, i) => `${i + 1}. [${issue.severity.toUpperCase()}] ${issue.description}${issue.suggestion ? ` → 建议: ${issue.suggestion}` : ''}`).join('\n');
|
|
356
|
+
fixTasks.push({
|
|
357
|
+
taskId: `${originalTask.id}-FIX-${String(counter).padStart(2, '0')}`,
|
|
358
|
+
title: `${severityLabel}: ${file === 'general' ? '通用问题' : file}`,
|
|
359
|
+
description: `# 代码修复任务
|
|
360
|
+
|
|
361
|
+
## 来源
|
|
362
|
+
由 AI Review 自动生成 — 审查任务: ${reviewTaskId}
|
|
363
|
+
|
|
364
|
+
## 原始任务
|
|
365
|
+
- ID: ${originalTask.id}
|
|
366
|
+
- 标题: ${originalTask.title}
|
|
367
|
+
|
|
368
|
+
## 需要修复的问题 (${issues.length} 个)
|
|
369
|
+
|
|
370
|
+
${issueDetails}
|
|
371
|
+
|
|
372
|
+
## 输出要求
|
|
373
|
+
1. 修复上述所有问题
|
|
374
|
+
2. 确保不引入新的问题
|
|
375
|
+
3. 保持代码风格一致
|
|
376
|
+
4. 完成后输出修复说明
|
|
377
|
+
|
|
378
|
+
${file !== 'general' ? `\n## 目标文件\n\`${file}\`` : ''}`,
|
|
379
|
+
priority: isCritical ? 'P0' : 'P1',
|
|
380
|
+
assignedAgent: 'coder',
|
|
381
|
+
dependencies: [reviewTaskId],
|
|
382
|
+
timeout: 120000
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
// 修复完成后,生成一个重新验证任务
|
|
386
|
+
if (fixTasks.length > 0) {
|
|
387
|
+
fixTasks.push({
|
|
388
|
+
taskId: `${originalTask.id}-REVERIFY`,
|
|
389
|
+
title: `重新验证: ${originalTask.title}`,
|
|
390
|
+
description: `# 重新验证任务
|
|
391
|
+
|
|
392
|
+
## 背景
|
|
393
|
+
原始任务 ${originalTask.id} 经过 Review 后发现 ${actionableIssues.length} 个问题,已创建 ${fixTasks.length} 个修复任务。
|
|
394
|
+
现在需要验证所有修复是否正确应用。
|
|
395
|
+
|
|
396
|
+
## 验证清单
|
|
397
|
+
- [ ] 所有修复任务已执行
|
|
398
|
+
- [ ] 原 Review 报告中的 critical/major 问题已解决
|
|
399
|
+
- [ ] 修复没有引入新的问题
|
|
400
|
+
- [ ] 代码可以编译/运行
|
|
401
|
+
- [ ] 测试仍然通过
|
|
402
|
+
|
|
403
|
+
## 输出
|
|
404
|
+
如果验证通过,输出:
|
|
405
|
+
\`\`\`
|
|
406
|
+
REVERIFY_PASSED
|
|
407
|
+
所有 ${actionableIssues.length} 个问题已修复
|
|
408
|
+
\`\`\`
|
|
409
|
+
|
|
410
|
+
如果验证失败,输出:
|
|
411
|
+
\`\`\`
|
|
412
|
+
REVERIFY_FAILED
|
|
413
|
+
遗留问题:
|
|
414
|
+
1. [问题描述]
|
|
415
|
+
\`\`\``,
|
|
416
|
+
priority: 'P1',
|
|
417
|
+
assignedAgent: 'reviewer',
|
|
418
|
+
dependencies: [reviewTaskId, ...fixTasks.map(f => f.taskId)],
|
|
419
|
+
timeout: 60000
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
return fixTasks;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* 判断 Review 报告是否需要自动修复
|
|
426
|
+
*/
|
|
427
|
+
needsAutoFix(report) {
|
|
428
|
+
return report.issues.some(issue => issue.severity === 'critical' || issue.severity === 'major');
|
|
429
|
+
}
|
|
325
430
|
}
|
|
326
431
|
exports.AIReviewer = AIReviewer;
|
|
@@ -98,11 +98,14 @@ function extractTasksInputFields(answers) {
|
|
|
98
98
|
if (typeof mode === 'string') {
|
|
99
99
|
result.mode = mode;
|
|
100
100
|
}
|
|
101
|
-
// e2e_tests → e2eTests 布尔字段
|
|
101
|
+
// e2e_tests → e2eTests 布尔字段 + e2eType
|
|
102
102
|
const e2e = answers['e2e_tests'] || answers['e2eTests'] || answers['E2E测试'];
|
|
103
103
|
if (e2e !== undefined) {
|
|
104
104
|
const e2eStr = Array.isArray(e2e) ? e2e[0] : e2e;
|
|
105
|
-
result.e2eTests = e2eStr === 'true' || e2eStr === '启用 E2E 测试' || e2eStr === '是';
|
|
105
|
+
result.e2eTests = e2eStr === 'functional' || e2eStr === 'visual' || e2eStr === 'true' || e2eStr === '启用 E2E 测试' || e2eStr === '是';
|
|
106
|
+
if (result.e2eTests && e2eStr === 'visual') {
|
|
107
|
+
result.e2eType = 'visual';
|
|
108
|
+
}
|
|
106
109
|
}
|
|
107
110
|
return result;
|
|
108
111
|
}
|
|
@@ -62,9 +62,10 @@ class ApprovalManager {
|
|
|
62
62
|
};
|
|
63
63
|
await this.stateManager.updateApproval(updatedApproval);
|
|
64
64
|
// 如果是 meeting 类型且被批准,解除任务阻塞
|
|
65
|
+
// 恢复到 pending 让调度器重新调度,而非直接 in_progress
|
|
65
66
|
if (approval.type === 'meeting' && decision.decision === 'approve') {
|
|
66
67
|
await this.stateManager.updateTask(approval.taskId, {
|
|
67
|
-
status: '
|
|
68
|
+
status: 'pending',
|
|
68
69
|
error: null
|
|
69
70
|
});
|
|
70
71
|
}
|
|
@@ -79,18 +80,18 @@ class ApprovalManager {
|
|
|
79
80
|
taskId,
|
|
80
81
|
title: `🔴 阻塞问题需要解决`,
|
|
81
82
|
description: `任务 ${taskId} 遇到阻塞问题`,
|
|
82
|
-
content: `
|
|
83
|
-
## 阻塞原因
|
|
84
|
-
|
|
85
|
-
${blockingReason}
|
|
86
|
-
|
|
87
|
-
## 影响范围
|
|
88
|
-
|
|
89
|
-
${impactScope.map(t => `- ${t}`).join('\n')}
|
|
90
|
-
|
|
91
|
-
## 需要决策
|
|
92
|
-
|
|
93
|
-
请选择解决方案或提供自定义方案:
|
|
83
|
+
content: `
|
|
84
|
+
## 阻塞原因
|
|
85
|
+
|
|
86
|
+
${blockingReason}
|
|
87
|
+
|
|
88
|
+
## 影响范围
|
|
89
|
+
|
|
90
|
+
${impactScope.map(t => `- ${t}`).join('\n')}
|
|
91
|
+
|
|
92
|
+
## 需要决策
|
|
93
|
+
|
|
94
|
+
请选择解决方案或提供自定义方案:
|
|
94
95
|
`.trim(),
|
|
95
96
|
options: [
|
|
96
97
|
{ key: 'approve', label: '✅ 问题已解决,继续执行' },
|
|
@@ -40,6 +40,7 @@ export declare class OrchestratorExecutor {
|
|
|
40
40
|
private stateMachine;
|
|
41
41
|
private phaseExecutor;
|
|
42
42
|
private retryManager;
|
|
43
|
+
private aiReviewer;
|
|
43
44
|
private config;
|
|
44
45
|
private taskTimers;
|
|
45
46
|
constructor(stateManager: StateManager, approvalManager: ApprovalManager, config?: Partial<ExecutorConfig>);
|
|
@@ -92,12 +93,20 @@ export declare class OrchestratorExecutor {
|
|
|
92
93
|
private handleBlockedTasks;
|
|
93
94
|
/**
|
|
94
95
|
* 标记任务完成
|
|
96
|
+
*
|
|
97
|
+
* 增强:对于 reviewer 任务,自动解析 Review 报告并生成修复任务
|
|
95
98
|
*/
|
|
96
99
|
completeTask(taskId: string, result: {
|
|
97
100
|
success: boolean;
|
|
98
101
|
output?: string;
|
|
99
102
|
error?: string;
|
|
100
|
-
}): Promise<
|
|
103
|
+
}): Promise<{
|
|
104
|
+
createdFixTasks?: string[];
|
|
105
|
+
}>;
|
|
106
|
+
/**
|
|
107
|
+
* 处理 Review 结果:解析报告,如有 critical/major 问题则自动创建修复任务
|
|
108
|
+
*/
|
|
109
|
+
private processReviewResult;
|
|
101
110
|
/**
|
|
102
111
|
* 获取当前阶段
|
|
103
112
|
*/
|