speccore 8.3.176 → 8.3.178
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/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze.d.ts +1 -1
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +118 -0
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/doc2spec.js +8 -1
- package/dist/commands/doc2spec.js.map +1 -1
- package/dist/commands/execute.js +29 -14
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +32 -0
- package/dist/commands/plan.js.map +1 -1
- package/dist/core/feature-metadata.d.ts +45 -0
- package/dist/core/feature-metadata.d.ts.map +1 -0
- package/dist/core/feature-metadata.js +180 -0
- package/dist/core/feature-metadata.js.map +1 -0
- package/dist/core/plan-graph.d.ts +63 -0
- package/dist/core/plan-graph.d.ts.map +1 -0
- package/dist/core/plan-graph.js +211 -0
- package/dist/core/plan-graph.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.computeBatches = computeBatches;
|
|
4
|
+
exports.findCriticalPath = findCriticalPath;
|
|
5
|
+
exports.detectResourceConflicts = detectResourceConflicts;
|
|
6
|
+
exports.calculatePlatformCoverage = calculatePlatformCoverage;
|
|
7
|
+
exports.buildPlanGraph = buildPlanGraph;
|
|
8
|
+
exports.generatePlanJson = generatePlanJson;
|
|
9
|
+
exports.buildPlanDecisionPrompt = buildPlanDecisionPrompt;
|
|
10
|
+
/**
|
|
11
|
+
* 从 TaskState 提取元数据(只取计划需要的字段)
|
|
12
|
+
*/
|
|
13
|
+
function extractMeta(t) {
|
|
14
|
+
return {
|
|
15
|
+
id: t.id,
|
|
16
|
+
name: t.name,
|
|
17
|
+
depends_on: t.dependencies || [],
|
|
18
|
+
platforms: t.platform ? [t.platform] : [],
|
|
19
|
+
estimated_hours: t.estimatedHours || 0,
|
|
20
|
+
priority: t.priority,
|
|
21
|
+
assignee: t.assignee || '未分配',
|
|
22
|
+
status: t.status,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 构建依赖图并计算执行批次(拓扑排序分层)
|
|
27
|
+
*/
|
|
28
|
+
function computeBatches(tasks) {
|
|
29
|
+
const graph = new Map();
|
|
30
|
+
const inDegree = new Map();
|
|
31
|
+
// 初始化
|
|
32
|
+
for (const t of tasks) {
|
|
33
|
+
graph.set(t.id, t.dependencies || []);
|
|
34
|
+
inDegree.set(t.id, (t.dependencies || []).length);
|
|
35
|
+
}
|
|
36
|
+
const batches = [];
|
|
37
|
+
let remaining = new Set(tasks.map(t => t.id));
|
|
38
|
+
while (remaining.size > 0) {
|
|
39
|
+
// 找出入度为 0 的任务(无未完成的依赖)
|
|
40
|
+
const currentBatch = [];
|
|
41
|
+
for (const taskId of remaining) {
|
|
42
|
+
if ((inDegree.get(taskId) || 0) === 0) {
|
|
43
|
+
currentBatch.push(taskId);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (currentBatch.length === 0) {
|
|
47
|
+
// 有环,剩余任务组成一批
|
|
48
|
+
batches.push({ batch: batches.length + 1, tasks: Array.from(remaining) });
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
batches.push({ batch: batches.length + 1, tasks: currentBatch });
|
|
52
|
+
// 移除已处理的任务,更新入度
|
|
53
|
+
for (const taskId of currentBatch) {
|
|
54
|
+
remaining.delete(taskId);
|
|
55
|
+
for (const [id, deps] of graph) {
|
|
56
|
+
if (deps.includes(taskId)) {
|
|
57
|
+
inDegree.set(id, (inDegree.get(id) || 0) - 1);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return batches;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 计算关键路径(耗时最长的依赖链)
|
|
66
|
+
*/
|
|
67
|
+
function findCriticalPath(tasks, batches) {
|
|
68
|
+
const taskMap = new Map(tasks.map(t => [t.id, t]));
|
|
69
|
+
const dp = new Map();
|
|
70
|
+
function calc(taskId) {
|
|
71
|
+
if (dp.has(taskId))
|
|
72
|
+
return dp.get(taskId);
|
|
73
|
+
const task = taskMap.get(taskId);
|
|
74
|
+
const hours = task?.estimatedHours || 0;
|
|
75
|
+
const deps = task?.dependencies || [];
|
|
76
|
+
if (deps.length === 0) {
|
|
77
|
+
const result = { duration: hours, path: [taskId] };
|
|
78
|
+
dp.set(taskId, result);
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
let maxDep = { duration: 0, path: [] };
|
|
82
|
+
for (const dep of deps) {
|
|
83
|
+
const depResult = calc(dep);
|
|
84
|
+
if (depResult.duration > maxDep.duration) {
|
|
85
|
+
maxDep = depResult;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const result = {
|
|
89
|
+
duration: maxDep.duration + hours,
|
|
90
|
+
path: [...maxDep.path, taskId],
|
|
91
|
+
};
|
|
92
|
+
dp.set(taskId, result);
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
let best = { duration: 0, path: [] };
|
|
96
|
+
for (const t of tasks) {
|
|
97
|
+
const result = calc(t.id);
|
|
98
|
+
if (result.duration > best.duration) {
|
|
99
|
+
best = result;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return best.path;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 检测资源冲突(同一人在同一批次有多个任务)
|
|
106
|
+
*/
|
|
107
|
+
function detectResourceConflicts(tasks, batches) {
|
|
108
|
+
const taskMap = new Map(tasks.map(t => [t.id, t]));
|
|
109
|
+
const conflicts = [];
|
|
110
|
+
for (const batch of batches) {
|
|
111
|
+
const assigneeMap = new Map();
|
|
112
|
+
for (const taskId of batch.tasks) {
|
|
113
|
+
const task = taskMap.get(taskId);
|
|
114
|
+
if (!task || !task.assignee)
|
|
115
|
+
continue;
|
|
116
|
+
const list = assigneeMap.get(task.assignee) || [];
|
|
117
|
+
list.push(taskId);
|
|
118
|
+
assigneeMap.set(task.assignee, list);
|
|
119
|
+
}
|
|
120
|
+
for (const [assignee, taskIds] of assigneeMap) {
|
|
121
|
+
if (taskIds.length > 1) {
|
|
122
|
+
conflicts.push({
|
|
123
|
+
type: 'resource',
|
|
124
|
+
description: `${assignee} 在批次 ${batch.batch} 中同时负责 ${taskIds.length} 个任务`,
|
|
125
|
+
involved: taskIds,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return conflicts;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* 计算端覆盖统计
|
|
134
|
+
*/
|
|
135
|
+
function calculatePlatformCoverage(tasks) {
|
|
136
|
+
const coverage = {};
|
|
137
|
+
for (const t of tasks) {
|
|
138
|
+
if (t.platform) {
|
|
139
|
+
coverage[t.platform] = (coverage[t.platform] || 0) + 1;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return coverage;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* 构建完整的计划图(CLI 算图结果)
|
|
146
|
+
*/
|
|
147
|
+
function buildPlanGraph(tasks) {
|
|
148
|
+
const batches = computeBatches(tasks);
|
|
149
|
+
const criticalPath = findCriticalPath(tasks, batches);
|
|
150
|
+
const conflicts = detectResourceConflicts(tasks, batches);
|
|
151
|
+
const platformCoverage = calculatePlatformCoverage(tasks);
|
|
152
|
+
const totalDuration = criticalPath.reduce((sum, id) => {
|
|
153
|
+
const t = tasks.find(task => task.id === id);
|
|
154
|
+
return sum + (t?.estimatedHours || 0);
|
|
155
|
+
}, 0);
|
|
156
|
+
return {
|
|
157
|
+
tasks: tasks.map(extractMeta),
|
|
158
|
+
batches,
|
|
159
|
+
criticalPath,
|
|
160
|
+
totalDuration,
|
|
161
|
+
conflicts,
|
|
162
|
+
platformCoverage,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* 生成结构化 JSON(给 AI 的输入)
|
|
167
|
+
*/
|
|
168
|
+
function generatePlanJson(graph) {
|
|
169
|
+
return JSON.stringify({
|
|
170
|
+
iteration: graph.tasks.length > 0 ? '当前迭代' : '',
|
|
171
|
+
summary: {
|
|
172
|
+
total_tasks: graph.tasks.length,
|
|
173
|
+
total_batches: graph.batches.length,
|
|
174
|
+
total_duration_hours: graph.totalDuration,
|
|
175
|
+
critical_path: graph.criticalPath,
|
|
176
|
+
},
|
|
177
|
+
tasks: graph.tasks,
|
|
178
|
+
batches: graph.batches,
|
|
179
|
+
conflicts: graph.conflicts,
|
|
180
|
+
platform_coverage: graph.platformCoverage,
|
|
181
|
+
}, null, 2);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* 构建 AI 决策 Prompt(基于 CLI 算好的图)
|
|
185
|
+
*/
|
|
186
|
+
function buildPlanDecisionPrompt(json) {
|
|
187
|
+
return `# 任务: 制定开发计划\n\n` +
|
|
188
|
+
`## 输入数据(CLI 自动计算)\n\n` +
|
|
189
|
+
`以下数据由 CLI 从任务目录扫描并计算得出:\n\n` +
|
|
190
|
+
`\`\`\`json
|
|
191
|
+
${json}
|
|
192
|
+
\`\`\`
|
|
193
|
+
|
|
194
|
+
` +
|
|
195
|
+
`## 需要你判断的问题\n\n` +
|
|
196
|
+
`1. **优先级冲突**:同一批次内是否有高优先级任务应该提前?\n` +
|
|
197
|
+
`2. **资源冲突**:是否有人员同时负责多个任务需要调整?\n` +
|
|
198
|
+
`3. **风险识别**:关键路径上的任务是否有延期风险?\n` +
|
|
199
|
+
`4. **批次优化**:是否有任务可以合并或拆分以优化工期?\n` +
|
|
200
|
+
`5. **依赖合理性**:是否有循环依赖或缺失依赖需要修复?\n\n` +
|
|
201
|
+
`## 输出要求\n\n` +
|
|
202
|
+
`1. 生成分批次执行计划(Mermaid 甘特图或表格)\n` +
|
|
203
|
+
`2. 标注关键路径上的任务\n` +
|
|
204
|
+
`3. 列出所有冲突和建议的解决方案\n` +
|
|
205
|
+
`4. 使用 [DOC:PLAN] 标记输出\n\n` +
|
|
206
|
+
`## 注意\n\n` +
|
|
207
|
+
`- 不要重新计算依赖关系(CLI 已经算好)\n` +
|
|
208
|
+
`- 不要重新估算工时(使用输入数据中的值)\n` +
|
|
209
|
+
`- 只做判断和决策,不做计算\n`;
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=plan-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-graph.js","sourceRoot":"","sources":["../../src/core/plan-graph.ts"],"names":[],"mappings":"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"}
|