speccore 6.69.0 → 6.71.3

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.
Files changed (42) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +2 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/analyze.d.ts +1 -0
  5. package/dist/commands/analyze.d.ts.map +1 -1
  6. package/dist/commands/analyze.js +686 -97
  7. package/dist/commands/analyze.js.map +1 -1
  8. package/dist/commands/audit.d.ts +2 -0
  9. package/dist/commands/audit.d.ts.map +1 -1
  10. package/dist/commands/audit.js +262 -0
  11. package/dist/commands/audit.js.map +1 -1
  12. package/dist/commands/dev.d.ts +2 -0
  13. package/dist/commands/dev.d.ts.map +1 -1
  14. package/dist/commands/dev.js +25 -0
  15. package/dist/commands/dev.js.map +1 -1
  16. package/dist/commands/execute.d.ts +1 -0
  17. package/dist/commands/execute.d.ts.map +1 -1
  18. package/dist/commands/execute.js +137 -0
  19. package/dist/commands/execute.js.map +1 -1
  20. package/dist/commands/iteration/split.d.ts +2 -0
  21. package/dist/commands/iteration/split.d.ts.map +1 -1
  22. package/dist/commands/iteration/split.js +414 -56
  23. package/dist/commands/iteration/split.js.map +1 -1
  24. package/dist/core/change-detection.d.ts +121 -0
  25. package/dist/core/change-detection.d.ts.map +1 -0
  26. package/dist/core/change-detection.js +459 -0
  27. package/dist/core/change-detection.js.map +1 -0
  28. package/dist/core/knowledge-graph.d.ts +26 -0
  29. package/dist/core/knowledge-graph.d.ts.map +1 -1
  30. package/dist/core/knowledge-graph.js +113 -0
  31. package/dist/core/knowledge-graph.js.map +1 -1
  32. package/dist/core/pipeline-engine.d.ts +103 -0
  33. package/dist/core/pipeline-engine.d.ts.map +1 -0
  34. package/dist/core/pipeline-engine.js +436 -0
  35. package/dist/core/pipeline-engine.js.map +1 -0
  36. package/dist/core/prompt-builder.d.ts.map +1 -1
  37. package/dist/core/prompt-builder.js +18 -3
  38. package/dist/core/prompt-builder.js.map +1 -1
  39. package/dist/core/spec-paths.d.ts.map +1 -1
  40. package/dist/core/spec-paths.js +1 -0
  41. package/dist/core/spec-paths.js.map +1 -1
  42. package/package.json +1 -1
@@ -0,0 +1,121 @@
1
+ /**
2
+ * change-detection — 变更感知模块(v6.69.0+)
3
+ *
4
+ * 通过 Git diff 识别变更范围,将变更文件映射到受影响的端,
5
+ * 支持 Pipeline 的增量分析(仅分析受影响端)。
6
+ *
7
+ * v6.69.1 修复:
8
+ * - 对比基准从 HEAD 改为 CONSTITUTION.md 配置的默认分支
9
+ * - 新增分析快照持久化,支持基于上次分析点的增量 diff
10
+ */
11
+ export interface PlatformChangeInfo {
12
+ platform: string;
13
+ changedFiles: string[];
14
+ changeCount: number;
15
+ }
16
+ /**
17
+ * 获取 CONSTITUTION.md 配置的默认分支(带缓存)
18
+ * 优先级:CONSTITUTION.md > 硬编码 'main'
19
+ */
20
+ export declare function getDefaultBaseRef(): string;
21
+ /**
22
+ * 获取 Git 工作区的变更文件列表
23
+ * @param baseRef 对比的基准 ref(默认使用 CONSTITUTION.md 配置的默认分支)
24
+ * @returns 相对路径列表
25
+ */
26
+ export declare function getChangedFiles(baseRef?: string): string[];
27
+ /**
28
+ * 获取两个 commit/ref 之间的变更文件列表
29
+ * @param fromRef 起始 ref(如上次分析的 commit)
30
+ * @param toRef 结束 ref(默认 HEAD)
31
+ */
32
+ export declare function getChangedFilesBetween(fromRef: string, toRef?: string): string[];
33
+ /**
34
+ * 获取工作区中未跟踪的新文件
35
+ */
36
+ export declare function getUntrackedFiles(): string[];
37
+ /**
38
+ * 读取 CONSTITUTION.md 中的源码路径 → 端映射
39
+ * @returns Map<源码路径, 端名>
40
+ */
41
+ export declare function loadSourcePathMap(cwd: string): Promise<Map<string, string>>;
42
+ /**
43
+ * 检测变更影响的端
44
+ *
45
+ * 策略:
46
+ * 1. 需求/规格文件变更(010-requirements/、020-specs/)→ 影响所有端
47
+ * 2. 源码文件变更 → 根据 CONSTITUTION.md 的源码路径映射到对应端
48
+ * 3. 全局配置变更(.speccore/)→ 影响所有端
49
+ * 4. 其他文件变更(CI、文档等)→ 不影响分析
50
+ *
51
+ * v6.69.1: 支持基于分析快照的增量检测
52
+ *
53
+ * @param cwd 工作目录
54
+ * @param changedFiles 可选:预计算的变更文件列表(不传则自动检测)
55
+ * @param options 可选配置
56
+ * @returns 受影响的端名列表(空数组表示无变更或无法检测)
57
+ */
58
+ export declare function detectAffectedPlatforms(cwd: string, changedFiles?: string[], options?: {
59
+ /** 分析范围标识,用于读取快照(如 'global', 'Iteration-Q2', 'Task-001') */
60
+ scope?: string;
61
+ /** 是否使用增量模式(基于上次分析的 commit 做 diff) */
62
+ incremental?: boolean;
63
+ }): Promise<string[]>;
64
+ /**
65
+ * 获取详细的变更信息(按端分组)
66
+ */
67
+ export declare function getPlatformChangeDetails(cwd: string, changedFiles?: string[]): Promise<PlatformChangeInfo[]>;
68
+ /**
69
+ * 检测各端的优先级顺序(关键路径优先排序)
70
+ *
71
+ * 策略:
72
+ * 1. 读取迭代中所有子任务的 TaskState
73
+ * 2. 按 platform 分组,统计各端 high/medium/low 优先级任务数量
74
+ * 3. 按「high 数量降序 → medium 数量降序 → low 数量降序」排序端
75
+ * 4. 如果某端没有任务,赋予最低优先级
76
+ *
77
+ * @param iteration 迭代名
78
+ * @returns 按优先级排序的端名列表(靠前的优先分析)
79
+ */
80
+ export declare function detectPlatformPriorityOrder(iteration: string): Promise<string[]>;
81
+ export interface AnalysisSnapshot {
82
+ lastCommit: string;
83
+ analyzedAt: string;
84
+ branch: string;
85
+ }
86
+ export interface AnalysisSnapshots {
87
+ [scope: string]: AnalysisSnapshot;
88
+ }
89
+ /**
90
+ * 读取分析快照文件
91
+ */
92
+ export declare function readAnalysisSnapshots(): Promise<AnalysisSnapshots>;
93
+ /**
94
+ * 写入分析快照文件
95
+ */
96
+ export declare function writeAnalysisSnapshots(snapshots: AnalysisSnapshots): Promise<void>;
97
+ /**
98
+ * 获取当前 HEAD 的 commit hash
99
+ */
100
+ export declare function getCurrentCommitHash(): string | null;
101
+ /**
102
+ * 获取当前分支名
103
+ */
104
+ export declare function getCurrentBranch(): string | null;
105
+ /**
106
+ * 基于上次分析的快照获取增量变更文件
107
+ * @param scope 分析范围标识(如 'global', 'Iteration-Q2', 'Task-001')
108
+ * @returns 自上次分析以来的变更文件列表(无快照则 fallback 到默认分支对比)
109
+ */
110
+ export declare function getIncrementalChangedFiles(scope: string): Promise<string[]>;
111
+ /**
112
+ * 记录分析快照(分析完成后调用)
113
+ * @param scope 分析范围标识(如 'global', 'Iteration-Q2', 'Task-001')
114
+ */
115
+ export declare function recordAnalysisSnapshot(scope: string): Promise<void>;
116
+ /**
117
+ * 清除指定范围的分析快照
118
+ * @param scope 分析范围标识,不传则清除全部
119
+ */
120
+ export declare function clearAnalysisSnapshot(scope?: string): Promise<void>;
121
+ //# sourceMappingURL=change-detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-detection.d.ts","sourceRoot":"","sources":["../../src/core/change-detection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAQD;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAW1C;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAY1D;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAe,GAAG,MAAM,EAAE,CAWxF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAW5C;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAgDjF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE,MAAM,EAAE,EACvB,OAAO,CAAC,EAAE;IACR,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GACA,OAAO,CAAC,MAAM,EAAE,CAAC,CA2DnB;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAoB/B;AAMD;;;;;;;;;;;GAWG;AACH,wBAAsB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgCtF;AAMD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAAC;CACnC;AAID;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAUxE;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAMxF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,IAAI,CASpD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAShD;AAED;;;;GAIG;AACH,wBAAsB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA6BjF;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBzE;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAczE"}
@@ -0,0 +1,459 @@
1
+ "use strict";
2
+ /**
3
+ * change-detection — 变更感知模块(v6.69.0+)
4
+ *
5
+ * 通过 Git diff 识别变更范围,将变更文件映射到受影响的端,
6
+ * 支持 Pipeline 的增量分析(仅分析受影响端)。
7
+ *
8
+ * v6.69.1 修复:
9
+ * - 对比基准从 HEAD 改为 CONSTITUTION.md 配置的默认分支
10
+ * - 新增分析快照持久化,支持基于上次分析点的增量 diff
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.getDefaultBaseRef = getDefaultBaseRef;
47
+ exports.getChangedFiles = getChangedFiles;
48
+ exports.getChangedFilesBetween = getChangedFilesBetween;
49
+ exports.getUntrackedFiles = getUntrackedFiles;
50
+ exports.loadSourcePathMap = loadSourcePathMap;
51
+ exports.detectAffectedPlatforms = detectAffectedPlatforms;
52
+ exports.getPlatformChangeDetails = getPlatformChangeDetails;
53
+ exports.detectPlatformPriorityOrder = detectPlatformPriorityOrder;
54
+ exports.readAnalysisSnapshots = readAnalysisSnapshots;
55
+ exports.writeAnalysisSnapshots = writeAnalysisSnapshots;
56
+ exports.getCurrentCommitHash = getCurrentCommitHash;
57
+ exports.getCurrentBranch = getCurrentBranch;
58
+ exports.getIncrementalChangedFiles = getIncrementalChangedFiles;
59
+ exports.recordAnalysisSnapshot = recordAnalysisSnapshot;
60
+ exports.clearAnalysisSnapshot = clearAnalysisSnapshot;
61
+ const fs_extra_1 = require("fs-extra");
62
+ const path_1 = require("path");
63
+ const child_process_1 = require("child_process");
64
+ const logger_1 = require("../utils/logger");
65
+ // ═══════════════════════════════════════════════
66
+ // 对比基准:默认分支读取
67
+ // ═══════════════════════════════════════════════
68
+ let cachedDefaultBranch = null;
69
+ /**
70
+ * 获取 CONSTITUTION.md 配置的默认分支(带缓存)
71
+ * 优先级:CONSTITUTION.md > 硬编码 'main'
72
+ */
73
+ function getDefaultBaseRef() {
74
+ if (cachedDefaultBranch)
75
+ return cachedDefaultBranch;
76
+ try {
77
+ const { loadGitConfig } = require('./git-integration');
78
+ const config = loadGitConfig();
79
+ cachedDefaultBranch = config.defaultBranch || 'main';
80
+ }
81
+ catch {
82
+ cachedDefaultBranch = 'main';
83
+ }
84
+ logger_1.logger.debug(`变更感知: 默认对比基准分支 = ${cachedDefaultBranch}`);
85
+ return cachedDefaultBranch;
86
+ }
87
+ /**
88
+ * 获取 Git 工作区的变更文件列表
89
+ * @param baseRef 对比的基准 ref(默认使用 CONSTITUTION.md 配置的默认分支)
90
+ * @returns 相对路径列表
91
+ */
92
+ function getChangedFiles(baseRef) {
93
+ const ref = baseRef || getDefaultBaseRef();
94
+ try {
95
+ const output = (0, child_process_1.execSync)(`git diff --name-only ${ref}`, {
96
+ encoding: 'utf-8',
97
+ stdio: 'pipe',
98
+ }).trim();
99
+ if (!output)
100
+ return [];
101
+ return output.split('\n').filter(f => f.trim().length > 0);
102
+ }
103
+ catch {
104
+ return [];
105
+ }
106
+ }
107
+ /**
108
+ * 获取两个 commit/ref 之间的变更文件列表
109
+ * @param fromRef 起始 ref(如上次分析的 commit)
110
+ * @param toRef 结束 ref(默认 HEAD)
111
+ */
112
+ function getChangedFilesBetween(fromRef, toRef = 'HEAD') {
113
+ try {
114
+ const output = (0, child_process_1.execSync)(`git diff --name-only ${fromRef}..${toRef}`, {
115
+ encoding: 'utf-8',
116
+ stdio: 'pipe',
117
+ }).trim();
118
+ if (!output)
119
+ return [];
120
+ return output.split('\n').filter(f => f.trim().length > 0);
121
+ }
122
+ catch {
123
+ return [];
124
+ }
125
+ }
126
+ /**
127
+ * 获取工作区中未跟踪的新文件
128
+ */
129
+ function getUntrackedFiles() {
130
+ try {
131
+ const output = (0, child_process_1.execSync)('git ls-files --others --exclude-standard', {
132
+ encoding: 'utf-8',
133
+ stdio: 'pipe',
134
+ }).trim();
135
+ if (!output)
136
+ return [];
137
+ return output.split('\n').filter(f => f.trim().length > 0);
138
+ }
139
+ catch {
140
+ return [];
141
+ }
142
+ }
143
+ /**
144
+ * 读取 CONSTITUTION.md 中的源码路径 → 端映射
145
+ * @returns Map<源码路径, 端名>
146
+ */
147
+ async function loadSourcePathMap(cwd) {
148
+ const pathMap = new Map();
149
+ const constitutionPath = (0, path_1.join)(cwd, '.speccore', 'CONSTITUTION.md');
150
+ if (!(await (0, fs_extra_1.pathExists)(constitutionPath))) {
151
+ return pathMap;
152
+ }
153
+ try {
154
+ const content = await (0, fs_extra_1.readFile)(constitutionPath, 'utf-8');
155
+ // 解析「项目信息」表格
156
+ // 格式:| 工程 | 项目名称 | 源码路径 | Git 仓库 | 默认分支 | 对应端 |
157
+ const lines = content.split('\n');
158
+ let inProjectSection = false;
159
+ for (const line of lines) {
160
+ // 检测「项目信息」章节
161
+ if (line.includes('## 项目信息')) {
162
+ inProjectSection = true;
163
+ continue;
164
+ }
165
+ if (inProjectSection && line.startsWith('## ')) {
166
+ inProjectSection = false;
167
+ continue;
168
+ }
169
+ if (!inProjectSection)
170
+ continue;
171
+ // 跳过表头分隔行
172
+ if (line.match(/^\|[-:\s|]+\|$/))
173
+ continue;
174
+ // 跳过空行和提示行
175
+ if (!line.includes('|') || line.includes('工程 | 项目名称'))
176
+ continue;
177
+ const cells = line.split('|').map(c => c.trim()).filter(Boolean);
178
+ if (cells.length >= 6) {
179
+ const srcPath = cells[2]; // 源码路径列
180
+ const platform = cells[5]; // 对应端列
181
+ if (srcPath && platform && platform !== '待填写') {
182
+ // 标准化路径(去掉开头的 ./)
183
+ const normalized = srcPath.replace(/^\.\//, '');
184
+ pathMap.set(normalized, platform);
185
+ }
186
+ }
187
+ }
188
+ }
189
+ catch (e) {
190
+ logger_1.logger.debug('读取 CONSTITUTION.md 失败:', e);
191
+ }
192
+ return pathMap;
193
+ }
194
+ /**
195
+ * 检测变更影响的端
196
+ *
197
+ * 策略:
198
+ * 1. 需求/规格文件变更(010-requirements/、020-specs/)→ 影响所有端
199
+ * 2. 源码文件变更 → 根据 CONSTITUTION.md 的源码路径映射到对应端
200
+ * 3. 全局配置变更(.speccore/)→ 影响所有端
201
+ * 4. 其他文件变更(CI、文档等)→ 不影响分析
202
+ *
203
+ * v6.69.1: 支持基于分析快照的增量检测
204
+ *
205
+ * @param cwd 工作目录
206
+ * @param changedFiles 可选:预计算的变更文件列表(不传则自动检测)
207
+ * @param options 可选配置
208
+ * @returns 受影响的端名列表(空数组表示无变更或无法检测)
209
+ */
210
+ async function detectAffectedPlatforms(cwd, changedFiles, options) {
211
+ let files;
212
+ if (changedFiles) {
213
+ files = changedFiles;
214
+ }
215
+ else if (options?.incremental && options?.scope) {
216
+ // 增量模式:基于上次分析的 commit hash 做 diff
217
+ files = await getIncrementalChangedFiles(options.scope);
218
+ if (files.length > 0) {
219
+ logger_1.logger.info(`🔄 变更感知(增量): 自上次分析后新增 ${files.length} 个变更文件`);
220
+ }
221
+ }
222
+ else {
223
+ // 全量模式:与默认分支对比
224
+ files = [...getChangedFiles(), ...getUntrackedFiles()];
225
+ }
226
+ if (files.length === 0) {
227
+ logger_1.logger.debug('变更感知: 未检测到变更文件');
228
+ return [];
229
+ }
230
+ const pathMap = await loadSourcePathMap(cwd);
231
+ const affected = new Set();
232
+ let hasGlobalChange = false;
233
+ for (const file of files) {
234
+ // 全局变更:需求文档、规格文档、配置
235
+ if (file.includes('010-requirements/') ||
236
+ file.includes('020-specs/') ||
237
+ file.includes('.speccore/CONSTITUTION.md') ||
238
+ file.includes('.speccore/PATTERNS/')) {
239
+ hasGlobalChange = true;
240
+ break;
241
+ }
242
+ // 源码路径匹配
243
+ for (const [srcPath, platform] of pathMap) {
244
+ if (file.startsWith(srcPath + '/') || file === srcPath) {
245
+ affected.add(platform);
246
+ }
247
+ }
248
+ }
249
+ // 全局变更 → 返回所有端
250
+ if (hasGlobalChange && pathMap.size > 0) {
251
+ logger_1.logger.info(`🔄 变更感知: 检测到全局变更(需求/规格/配置),需分析所有 ${pathMap.size} 个端`);
252
+ return Array.from(new Set(pathMap.values()));
253
+ }
254
+ const result = Array.from(affected);
255
+ if (result.length > 0) {
256
+ logger_1.logger.info(`🔄 变更感知: 检测到 ${files.length} 个变更文件,影响端: ${result.join(', ')}`);
257
+ }
258
+ else {
259
+ logger_1.logger.debug(`变更感知: ${files.length} 个变更文件未匹配到任何端`);
260
+ }
261
+ return result;
262
+ }
263
+ /**
264
+ * 获取详细的变更信息(按端分组)
265
+ */
266
+ async function getPlatformChangeDetails(cwd, changedFiles) {
267
+ const files = changedFiles || [...getChangedFiles(), ...getUntrackedFiles()];
268
+ const pathMap = await loadSourcePathMap(cwd);
269
+ const platformFiles = new Map();
270
+ for (const file of files) {
271
+ for (const [srcPath, platform] of pathMap) {
272
+ if (file.startsWith(srcPath + '/') || file === srcPath) {
273
+ const list = platformFiles.get(platform) || [];
274
+ list.push(file);
275
+ platformFiles.set(platform, list);
276
+ }
277
+ }
278
+ }
279
+ return Array.from(platformFiles.entries()).map(([platform, changedFiles]) => ({
280
+ platform,
281
+ changedFiles,
282
+ changeCount: changedFiles.length,
283
+ }));
284
+ }
285
+ // ═══════════════════════════════════════════════
286
+ // v6.69.0+: 关键路径优先 — 端优先级检测
287
+ // ═══════════════════════════════════════════════
288
+ /**
289
+ * 检测各端的优先级顺序(关键路径优先排序)
290
+ *
291
+ * 策略:
292
+ * 1. 读取迭代中所有子任务的 TaskState
293
+ * 2. 按 platform 分组,统计各端 high/medium/low 优先级任务数量
294
+ * 3. 按「high 数量降序 → medium 数量降序 → low 数量降序」排序端
295
+ * 4. 如果某端没有任务,赋予最低优先级
296
+ *
297
+ * @param iteration 迭代名
298
+ * @returns 按优先级排序的端名列表(靠前的优先分析)
299
+ */
300
+ async function detectPlatformPriorityOrder(iteration) {
301
+ const { scanTasks } = await Promise.resolve().then(() => __importStar(require('./state')));
302
+ const tasks = await scanTasks(iteration);
303
+ // 按端分组统计优先级
304
+ const platformStats = new Map();
305
+ for (const task of tasks) {
306
+ const platform = task.platform;
307
+ if (!platform)
308
+ continue;
309
+ const stats = platformStats.get(platform) || { high: 0, medium: 0, low: 0 };
310
+ if (task.priority === 'high')
311
+ stats.high++;
312
+ else if (task.priority === 'low')
313
+ stats.low++;
314
+ else
315
+ stats.medium++;
316
+ platformStats.set(platform, stats);
317
+ }
318
+ // 排序:high 多 → medium 多 → low 多
319
+ const sorted = Array.from(platformStats.entries()).sort((a, b) => {
320
+ const [pa, sa] = a;
321
+ const [pb, sb] = b;
322
+ if (sa.high !== sb.high)
323
+ return sb.high - sa.high;
324
+ if (sa.medium !== sb.medium)
325
+ return sb.medium - sa.medium;
326
+ return sb.low - sa.low;
327
+ });
328
+ const result = sorted.map(([platform]) => platform);
329
+ if (result.length > 0) {
330
+ logger_1.logger.info(`🎯 关键路径优先: 端优先级排序 → ${result.join(' > ')}`);
331
+ }
332
+ return result;
333
+ }
334
+ const SNAPSHOT_FILE = (0, path_1.join)('.speccore', 'cache', 'analysis-snapshots.json');
335
+ /**
336
+ * 读取分析快照文件
337
+ */
338
+ async function readAnalysisSnapshots() {
339
+ try {
340
+ if (await (0, fs_extra_1.pathExists)(SNAPSHOT_FILE)) {
341
+ const content = await (0, fs_extra_1.readFile)(SNAPSHOT_FILE, 'utf-8');
342
+ return JSON.parse(content);
343
+ }
344
+ }
345
+ catch (e) {
346
+ logger_1.logger.debug('读取分析快照失败:', e);
347
+ }
348
+ return {};
349
+ }
350
+ /**
351
+ * 写入分析快照文件
352
+ */
353
+ async function writeAnalysisSnapshots(snapshots) {
354
+ try {
355
+ await (0, fs_extra_1.writeFile)(SNAPSHOT_FILE, JSON.stringify(snapshots, null, 2), 'utf-8');
356
+ }
357
+ catch (e) {
358
+ logger_1.logger.debug('写入分析快照失败:', e);
359
+ }
360
+ }
361
+ /**
362
+ * 获取当前 HEAD 的 commit hash
363
+ */
364
+ function getCurrentCommitHash() {
365
+ try {
366
+ return (0, child_process_1.execSync)('git rev-parse HEAD', {
367
+ encoding: 'utf-8',
368
+ stdio: 'pipe',
369
+ }).trim();
370
+ }
371
+ catch {
372
+ return null;
373
+ }
374
+ }
375
+ /**
376
+ * 获取当前分支名
377
+ */
378
+ function getCurrentBranch() {
379
+ try {
380
+ return (0, child_process_1.execSync)('git rev-parse --abbrev-ref HEAD', {
381
+ encoding: 'utf-8',
382
+ stdio: 'pipe',
383
+ }).trim();
384
+ }
385
+ catch {
386
+ return null;
387
+ }
388
+ }
389
+ /**
390
+ * 基于上次分析的快照获取增量变更文件
391
+ * @param scope 分析范围标识(如 'global', 'Iteration-Q2', 'Task-001')
392
+ * @returns 自上次分析以来的变更文件列表(无快照则 fallback 到默认分支对比)
393
+ */
394
+ async function getIncrementalChangedFiles(scope) {
395
+ const snapshots = await readAnalysisSnapshots();
396
+ const snapshot = snapshots[scope];
397
+ if (!snapshot) {
398
+ logger_1.logger.debug(`变更感知: 未找到 ${scope} 的历史快照,fallback 到默认分支对比`);
399
+ return [...getChangedFiles(), ...getUntrackedFiles()];
400
+ }
401
+ // 检查上次分析的 commit 是否仍存在于当前分支历史中
402
+ const currentCommit = getCurrentCommitHash();
403
+ if (!currentCommit) {
404
+ logger_1.logger.warn('变更感知: 无法获取当前 commit hash');
405
+ return [];
406
+ }
407
+ if (snapshot.lastCommit === currentCommit) {
408
+ logger_1.logger.debug(`变更感知: ${scope} 自上次分析(${snapshot.lastCommit.slice(0, 7)})后无新变更`);
409
+ return [];
410
+ }
411
+ // 使用 git diff <lastCommit>..HEAD 获取增量变更
412
+ const files = getChangedFilesBetween(snapshot.lastCommit);
413
+ logger_1.logger.info(`🔄 变更感知(增量): ${scope} 自 ${snapshot.analyzedAt.slice(0, 10)} ` +
414
+ `(${snapshot.lastCommit.slice(0, 7)}..${currentCommit.slice(0, 7)}) ` +
415
+ `检测到 ${files.length} 个变更文件`);
416
+ return files;
417
+ }
418
+ /**
419
+ * 记录分析快照(分析完成后调用)
420
+ * @param scope 分析范围标识(如 'global', 'Iteration-Q2', 'Task-001')
421
+ */
422
+ async function recordAnalysisSnapshot(scope) {
423
+ const commitHash = getCurrentCommitHash();
424
+ const branch = getCurrentBranch();
425
+ if (!commitHash) {
426
+ logger_1.logger.warn('变更感知: 无法记录快照,当前不是 git 仓库');
427
+ return;
428
+ }
429
+ const snapshots = await readAnalysisSnapshots();
430
+ snapshots[scope] = {
431
+ lastCommit: commitHash,
432
+ analyzedAt: new Date().toISOString(),
433
+ branch: branch || 'unknown',
434
+ };
435
+ await writeAnalysisSnapshots(snapshots);
436
+ logger_1.logger.debug(`变更感知: 已记录 ${scope} 分析快照 → ${commitHash.slice(0, 7)} (${branch})`);
437
+ }
438
+ /**
439
+ * 清除指定范围的分析快照
440
+ * @param scope 分析范围标识,不传则清除全部
441
+ */
442
+ async function clearAnalysisSnapshot(scope) {
443
+ if (scope) {
444
+ const snapshots = await readAnalysisSnapshots();
445
+ delete snapshots[scope];
446
+ await writeAnalysisSnapshots(snapshots);
447
+ logger_1.logger.info(`🗑️ 变更感知: 已清除 ${scope} 的分析快照`);
448
+ }
449
+ else {
450
+ try {
451
+ await (0, fs_extra_1.writeFile)(SNAPSHOT_FILE, '{}', 'utf-8');
452
+ logger_1.logger.info('🗑️ 变更感知: 已清除所有分析快照');
453
+ }
454
+ catch (e) {
455
+ logger_1.logger.debug('清除分析快照失败:', e);
456
+ }
457
+ }
458
+ }
459
+ //# sourceMappingURL=change-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-detection.js","sourceRoot":"","sources":["../../src/core/change-detection.ts"],"names":[],"mappings":"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"}
@@ -71,4 +71,30 @@ export declare function getTaskContext(graph: KnowledgeGraph, taskId: string): {
71
71
  export declare function isGraphStale(cwd: string, iteration?: string): Promise<boolean>;
72
72
  /** 刷新知识图谱(重建 + 保存)—— 供命令完成后调用 */
73
73
  export declare function refreshKnowledgeGraph(cwd: string, iteration?: string): Promise<KnowledgeGraph | null>;
74
+ export interface DependencyChain {
75
+ taskId: string;
76
+ taskName: string;
77
+ depth: number;
78
+ path: string[];
79
+ relations: GraphRelation[];
80
+ entities: GraphEntity[];
81
+ }
82
+ /**
83
+ * 追踪任务的完整依赖链路(向上追溯)
84
+ * 递归追踪 implements → references → depends_on 关系
85
+ */
86
+ export declare function traceDependencyChain(graph: KnowledgeGraph, taskId: string, maxDepth?: number, visited?: Set<string>): DependencyChain[];
87
+ /**
88
+ * 获取任务的完整上下文(扩展版,包含依赖链路)
89
+ * 在 getTaskContext 基础上增加 dependencyChain 字段
90
+ */
91
+ export declare function getFullTaskContext(graph: KnowledgeGraph, taskId: string): {
92
+ requirement: GraphEntity | null;
93
+ siblingSubtasks: GraphEntity[];
94
+ parentTask: GraphEntity | null;
95
+ relatedSpecs: GraphEntity[];
96
+ dependsOn: GraphEntity[];
97
+ dependencyChain: DependencyChain[];
98
+ downstreamTasks: GraphEntity[];
99
+ };
74
100
  //# sourceMappingURL=knowledge-graph.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge-graph.d.ts","sourceRoot":"","sources":["../../src/core/knowledge-graph.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"knowledge-graph.d.ts","sourceRoot":"","sources":["../../src/core/knowledge-graph.ts"],"names":[],"mappings":"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"}