openmatrix 0.1.41 → 0.1.42
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.
|
@@ -1,14 +1,4 @@
|
|
|
1
1
|
import type { ParsedTask } from '../types/index.js';
|
|
2
|
-
/**
|
|
3
|
-
* TaskBreakdown - 计划/任务拆解单元
|
|
4
|
-
*
|
|
5
|
-
* 术语区分:
|
|
6
|
-
* - Plan (计划): planner agent 输出,宏观层面,包含 ARCHITECTURE.md 和 PLAN.md
|
|
7
|
-
* - Task (任务): 具体执行单元,2-4 小时,有明确的验收标准
|
|
8
|
-
*
|
|
9
|
-
* 当 assignedAgent 为 'planner' 时,这是一个规划任务,输出是 Plan
|
|
10
|
-
* 当 assignedAgent 为其他时,这是具体的执行 Task
|
|
11
|
-
*/
|
|
12
2
|
export interface TaskBreakdown {
|
|
13
3
|
taskId: string;
|
|
14
4
|
title: string;
|
|
@@ -52,36 +42,13 @@ export declare class TaskPlanner {
|
|
|
52
42
|
/**
|
|
53
43
|
* Break down a parsed task into sub-tasks
|
|
54
44
|
*
|
|
55
|
-
*
|
|
56
|
-
* 1. 如果有明确的 goals (来自 ## 目标 section),按目标拆解
|
|
57
|
-
* 2. 如果没有 goals 但有复杂内容,创建规划任务交给 AI 拆解
|
|
58
|
-
* 3. 如果是简单任务,直接创建单个开发任务
|
|
45
|
+
* 增强版: 生成更细粒度的任务,包含设计、开发、测试配对
|
|
59
46
|
*/
|
|
60
47
|
breakdown(parsedTask: ParsedTask, answers: Record<string, string>): TaskBreakdown[];
|
|
61
|
-
/**
|
|
62
|
-
* 判断是否为复杂任务
|
|
63
|
-
*/
|
|
64
|
-
private isComplexTask;
|
|
65
|
-
/**
|
|
66
|
-
* 创建规划任务 (由 AI 智能拆解)
|
|
67
|
-
*/
|
|
68
|
-
private createPlanningTask;
|
|
69
|
-
/**
|
|
70
|
-
* 创建单个开发任务
|
|
71
|
-
*/
|
|
72
|
-
private createSingleTask;
|
|
73
|
-
/**
|
|
74
|
-
* 按目标拆解任务 (原有逻辑)
|
|
75
|
-
*/
|
|
76
|
-
private breakdownByGoals;
|
|
77
48
|
/**
|
|
78
49
|
* 提取用户上下文
|
|
79
50
|
*/
|
|
80
51
|
private extractUserContext;
|
|
81
|
-
/**
|
|
82
|
-
* 格式化用户上下文为字符串
|
|
83
|
-
*/
|
|
84
|
-
private formatUserContext;
|
|
85
52
|
/**
|
|
86
53
|
* 解析数组类型的回答
|
|
87
54
|
*/
|
|
@@ -25,129 +25,12 @@ class TaskPlanner {
|
|
|
25
25
|
/**
|
|
26
26
|
* Break down a parsed task into sub-tasks
|
|
27
27
|
*
|
|
28
|
-
*
|
|
29
|
-
* 1. 如果有明确的 goals (来自 ## 目标 section),按目标拆解
|
|
30
|
-
* 2. 如果没有 goals 但有复杂内容,创建规划任务交给 AI 拆解
|
|
31
|
-
* 3. 如果是简单任务,直接创建单个开发任务
|
|
28
|
+
* 增强版: 生成更细粒度的任务,包含设计、开发、测试配对
|
|
32
29
|
*/
|
|
33
30
|
breakdown(parsedTask, answers) {
|
|
34
|
-
const breakdowns = [];
|
|
35
|
-
const userContext = this.extractUserContext(answers);
|
|
36
|
-
// 判断任务复杂度
|
|
37
|
-
const isComplexTask = this.isComplexTask(parsedTask);
|
|
38
|
-
// 情况1: 没有 goals,但有复杂内容 → 创建规划任务
|
|
39
|
-
if (parsedTask.goals.length === 0 && isComplexTask) {
|
|
40
|
-
return this.createPlanningTask(parsedTask, userContext, answers);
|
|
41
|
-
}
|
|
42
|
-
// 情况2: 没有 goals,但有简单内容 → 创建单个开发任务
|
|
43
|
-
if (parsedTask.goals.length === 0 && parsedTask.description) {
|
|
44
|
-
return this.createSingleTask(parsedTask, userContext, answers);
|
|
45
|
-
}
|
|
46
|
-
// 情况3: 没有 goals,也没有内容 → 返回空(无效任务)
|
|
47
|
-
if (parsedTask.goals.length === 0) {
|
|
48
|
-
return [];
|
|
49
|
-
}
|
|
50
|
-
// 情况4: 有明确的 goals → 按目标拆解
|
|
51
|
-
return this.breakdownByGoals(parsedTask, userContext, answers);
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* 判断是否为复杂任务
|
|
55
|
-
*/
|
|
56
|
-
isComplexTask(parsedTask) {
|
|
57
|
-
const content = parsedTask.rawContent || '';
|
|
58
|
-
// 检查是否有多个 markdown sections
|
|
59
|
-
const sections = content.match(/^#{1,2}\s+/gm) || [];
|
|
60
|
-
if (sections.length >= 3)
|
|
61
|
-
return true;
|
|
62
|
-
// 检查内容长度
|
|
63
|
-
if (content.length > 500)
|
|
64
|
-
return true;
|
|
65
|
-
// 检查是否有列表项
|
|
66
|
-
const listItems = content.match(/^-\s+/gm) || [];
|
|
67
|
-
if (listItems.length >= 5)
|
|
68
|
-
return true;
|
|
69
|
-
return false;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* 创建规划任务 (由 AI 智能拆解)
|
|
73
|
-
*/
|
|
74
|
-
createPlanningTask(parsedTask, userContext, answers) {
|
|
75
|
-
const planningTaskId = this.generateTaskId();
|
|
76
|
-
return [{
|
|
77
|
-
taskId: planningTaskId,
|
|
78
|
-
title: `${parsedTask.title} - 需求分析与架构设计`,
|
|
79
|
-
description: `# 需求分析与架构设计
|
|
80
|
-
|
|
81
|
-
## 任务背景
|
|
82
|
-
${parsedTask.description || parsedTask.title}
|
|
83
|
-
|
|
84
|
-
## 原始需求
|
|
85
|
-
\`\`\`
|
|
86
|
-
${parsedTask.rawContent}
|
|
87
|
-
\`\`\`
|
|
88
|
-
|
|
89
|
-
## 用户上下文
|
|
90
|
-
${this.formatUserContext(userContext, answers)}
|
|
91
|
-
|
|
92
|
-
## 你的任务
|
|
93
|
-
作为架构师,请:
|
|
94
|
-
1. 深入分析需求,理解核心功能
|
|
95
|
-
2. 设计系统架构
|
|
96
|
-
3. 将需求拆解为可执行的子任务
|
|
97
|
-
4. 为每个子任务定义验收标准
|
|
98
|
-
|
|
99
|
-
## 输出要求
|
|
100
|
-
- 架构设计文档 (ARCHITECTURE.md)
|
|
101
|
-
- 执行计划 (PLAN.md) - 宏观层面的计划,包含子任务清单
|
|
102
|
-
- 每个子计划包含: 标题、描述、优先级、依赖关系、验收标准
|
|
103
|
-
|
|
104
|
-
## 注意事项
|
|
105
|
-
- 任务拆解要细粒度,每个任务应该在 2-4 小时内完成
|
|
106
|
-
- 任务之间要有清晰的依赖关系
|
|
107
|
-
- 考虑技术栈和约束条件`,
|
|
108
|
-
priority: 'P0',
|
|
109
|
-
dependencies: [],
|
|
110
|
-
estimatedComplexity: 'high',
|
|
111
|
-
assignedAgent: 'planner',
|
|
112
|
-
phase: 'design',
|
|
113
|
-
acceptanceCriteria: [
|
|
114
|
-
'架构设计文档完整',
|
|
115
|
-
'执行计划 (PLAN.md) 清晰',
|
|
116
|
-
'每个子计划有明确的验收标准',
|
|
117
|
-
'依赖关系明确',
|
|
118
|
-
'技术方案可行'
|
|
119
|
-
]
|
|
120
|
-
}];
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* 创建单个开发任务
|
|
124
|
-
*/
|
|
125
|
-
createSingleTask(parsedTask, userContext, answers) {
|
|
126
|
-
const taskId = this.generateTaskId();
|
|
127
|
-
return [{
|
|
128
|
-
taskId,
|
|
129
|
-
title: parsedTask.title,
|
|
130
|
-
description: this.buildTaskDescription(parsedTask.description || parsedTask.title, userContext, answers),
|
|
131
|
-
priority: 'P1',
|
|
132
|
-
dependencies: [],
|
|
133
|
-
estimatedComplexity: 'medium',
|
|
134
|
-
assignedAgent: 'coder',
|
|
135
|
-
phase: 'develop',
|
|
136
|
-
acceptanceCriteria: [
|
|
137
|
-
'功能实现完整',
|
|
138
|
-
'代码可编译',
|
|
139
|
-
'无严重 bug',
|
|
140
|
-
'代码符合规范'
|
|
141
|
-
]
|
|
142
|
-
}];
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* 按目标拆解任务 (原有逻辑)
|
|
146
|
-
*/
|
|
147
|
-
breakdownByGoals(parsedTask, userContext, answers) {
|
|
148
31
|
const breakdowns = [];
|
|
149
32
|
const seenTitles = new Set();
|
|
150
|
-
const
|
|
33
|
+
const userContext = this.extractUserContext(answers);
|
|
151
34
|
// 0. 设计阶段任务
|
|
152
35
|
if (parsedTask.goals.length > 1) {
|
|
153
36
|
breakdowns.push({
|
|
@@ -156,10 +39,10 @@ ${this.formatUserContext(userContext, answers)}
|
|
|
156
39
|
description: `分析需求,设计整体架构,规划实现方案
|
|
157
40
|
|
|
158
41
|
## 用户需求
|
|
159
|
-
${
|
|
42
|
+
${userContext.objective || '未指定'}
|
|
160
43
|
|
|
161
44
|
## 技术栈
|
|
162
|
-
${
|
|
45
|
+
${userContext.techStack?.join(', ') || '未指定'}
|
|
163
46
|
|
|
164
47
|
## 输出
|
|
165
48
|
- 架构设计文档
|
|
@@ -354,29 +237,6 @@ ${userContext.documentationLevel}
|
|
|
354
237
|
additionalContext: answers
|
|
355
238
|
};
|
|
356
239
|
}
|
|
357
|
-
/**
|
|
358
|
-
* 格式化用户上下文为字符串
|
|
359
|
-
*/
|
|
360
|
-
formatUserContext(userContext, answers) {
|
|
361
|
-
const parts = [];
|
|
362
|
-
if (answers['brainstormAnswers']) {
|
|
363
|
-
parts.push('### 头脑风暴答案');
|
|
364
|
-
parts.push(answers['brainstormAnswers']);
|
|
365
|
-
}
|
|
366
|
-
if (userContext.objective) {
|
|
367
|
-
parts.push(`### 目标: ${userContext.objective}`);
|
|
368
|
-
}
|
|
369
|
-
if (userContext.techStack && userContext.techStack.length > 0) {
|
|
370
|
-
parts.push(`### 技术栈: ${userContext.techStack.join(', ')}`);
|
|
371
|
-
}
|
|
372
|
-
if (answers['insights']) {
|
|
373
|
-
parts.push(`### 洞察: ${answers['insights']}`);
|
|
374
|
-
}
|
|
375
|
-
if (answers['designNotes']) {
|
|
376
|
-
parts.push(`### 设计笔记: ${answers['designNotes']}`);
|
|
377
|
-
}
|
|
378
|
-
return parts.join('\n\n') || '无额外上下文';
|
|
379
|
-
}
|
|
380
240
|
/**
|
|
381
241
|
* 解析数组类型的回答
|
|
382
242
|
*/
|