speccore 6.74.0 → 6.76.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.
@@ -0,0 +1,458 @@
1
+ "use strict";
2
+ /**
3
+ * incremental-analyzer — 增量分析引擎(v6.75.0)
4
+ *
5
+ * 核心能力:
6
+ * 1. 检测上次分析后的变更(需求文档变更、源码变更、新增端)
7
+ * 2. 对比已有分析产出,识别需要重新分析的部分
8
+ * 3. 复用未变更的内容(在 prompt 中标注"已有内容,请复用/校验")
9
+ * 4. 检查遗漏:用 checklist 检查上次分析是否有遗漏
10
+ *
11
+ * 增量分析触发条件:
12
+ * - 需求文档 mtime 更新
13
+ * - 需求文档内容 hash 变化
14
+ * - 源码文件变更(如果 --with-code)
15
+ * - 新增端(检测端列表变化)
16
+ */
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.runIncrementalAnalysis = runIncrementalAnalysis;
52
+ exports.buildIncrementalPrompt = buildIncrementalPrompt;
53
+ const path_1 = require("path");
54
+ const fs_extra_1 = require("fs-extra");
55
+ const crypto_1 = require("crypto");
56
+ const spec_paths_1 = require("./spec-paths");
57
+ // ── 常量 ──
58
+ const SNAPSHOT_FILE = '.speccore/cache/last-analysis-snapshot.json';
59
+ // ── 核心函数 ──
60
+ /**
61
+ * 执行增量分析
62
+ * @param iterDir 迭代目录
63
+ * @param options 分析选项
64
+ */
65
+ async function runIncrementalAnalysis(iterDir, options) {
66
+ const result = {
67
+ hasChanges: false,
68
+ requirementChanges: [],
69
+ codeChanges: [],
70
+ addedPlatforms: [],
71
+ removedPlatforms: [],
72
+ staleOutputs: [],
73
+ potentialGaps: [],
74
+ recommendation: '',
75
+ };
76
+ // 1. 读取上次分析快照
77
+ const snapshot = await loadSnapshot(iterDir);
78
+ // 2. 检测需求文档变更
79
+ const reqChanges = await detectRequirementChanges(iterDir, snapshot);
80
+ result.requirementChanges = reqChanges;
81
+ if (reqChanges.some(c => c.changeType !== 'unchanged')) {
82
+ result.hasChanges = true;
83
+ }
84
+ // 3. 检测源码变更(如果 --with-code)
85
+ if (options?.withCode) {
86
+ const codeChanges = await detectCodeChanges(iterDir, snapshot);
87
+ result.codeChanges = codeChanges;
88
+ if (codeChanges.some(c => c.changeType !== 'unchanged')) {
89
+ result.hasChanges = true;
90
+ }
91
+ }
92
+ // 4. 检测端列表变更
93
+ const currentPlatforms = await (0, spec_paths_1.parsePlatformList)();
94
+ if (snapshot) {
95
+ const added = currentPlatforms.filter(p => !snapshot.platforms.includes(p));
96
+ const removed = snapshot.platforms.filter(p => !currentPlatforms.includes(p));
97
+ result.addedPlatforms = added;
98
+ result.removedPlatforms = removed;
99
+ if (added.length > 0 || removed.length > 0) {
100
+ result.hasChanges = true;
101
+ }
102
+ }
103
+ // 5. 识别需要重新分析的已有产出
104
+ result.staleOutputs = await identifyStaleOutputs(iterDir, result);
105
+ // 6. 检查上次分析的潜在遗漏
106
+ result.potentialGaps = await detectPotentialGaps(iterDir);
107
+ // 7. 生成建议
108
+ result.recommendation = buildRecommendation(result);
109
+ // 8. 保存新快照
110
+ await saveSnapshot(iterDir, {
111
+ timestamp: new Date().toISOString(),
112
+ requirementHashes: Object.fromEntries(reqChanges.map(c => [c.filePath, c.contentHash])),
113
+ codeHashes: Object.fromEntries(result.codeChanges.map(c => [c.filePath, c.contentHash])),
114
+ platforms: currentPlatforms,
115
+ outputs: await listExistingOutputs(iterDir),
116
+ });
117
+ return result;
118
+ }
119
+ /**
120
+ * 生成增量分析 Prompt
121
+ */
122
+ function buildIncrementalPrompt(iterDir, analysis, iteration) {
123
+ let prompt = `\n# 任务: 增量分析(基于上次分析结果)\n\n`;
124
+ prompt += `## 分析背景\n\n`;
125
+ prompt += `本次分析是**增量分析**,基于上次分析已有产出,只重新分析变更/遗漏的部分,复用未变更的内容。\n\n`;
126
+ // 变更摘要
127
+ prompt += `## 变更摘要\n\n`;
128
+ const changedReqs = analysis.requirementChanges.filter(c => c.changeType !== 'unchanged');
129
+ if (changedReqs.length > 0) {
130
+ prompt += `### 需求文档变更(${changedReqs.length} 个)\n\n`;
131
+ for (const c of changedReqs) {
132
+ const typeLabel = c.changeType === 'added' ? '🆕 新增' : c.changeType === 'modified' ? '✏️ 修改' : '🗑️ 删除';
133
+ prompt += `- ${typeLabel}: \`${c.filePath.replace(iterDir + '/', '')}\`\n`;
134
+ }
135
+ prompt += `\n`;
136
+ }
137
+ const changedCode = analysis.codeChanges.filter(c => c.changeType !== 'unchanged');
138
+ if (changedCode.length > 0) {
139
+ prompt += `### 源码变更(${changedCode.length} 个)\n\n`;
140
+ for (const c of changedCode.slice(0, 10)) {
141
+ const typeLabel = c.changeType === 'added' ? '🆕 新增' : c.changeType === 'modified' ? '✏️ 修改' : '🗑️ 删除';
142
+ prompt += `- ${typeLabel}: \`${c.filePath}\`\n`;
143
+ }
144
+ if (changedCode.length > 10) {
145
+ prompt += `- ... 等共 ${changedCode.length} 个文件\n`;
146
+ }
147
+ prompt += `\n`;
148
+ }
149
+ if (analysis.addedPlatforms.length > 0) {
150
+ prompt += `### 新增端(${analysis.addedPlatforms.length} 个)\n\n`;
151
+ for (const p of analysis.addedPlatforms) {
152
+ prompt += `- 🆕 ${p}\n`;
153
+ }
154
+ prompt += `\n`;
155
+ }
156
+ if (analysis.removedPlatforms.length > 0) {
157
+ prompt += `### 移除端(${analysis.removedPlatforms.length} 个)\n\n`;
158
+ for (const p of analysis.removedPlatforms) {
159
+ prompt += `- 🗑️ ${p}\n`;
160
+ }
161
+ prompt += `\n`;
162
+ }
163
+ // 需要重新分析的部分
164
+ if (analysis.staleOutputs.length > 0) {
165
+ prompt += `## 需要重新分析的产出\n\n`;
166
+ prompt += `以下已有产出因输入变更而需要更新:\n\n`;
167
+ for (const o of analysis.staleOutputs) {
168
+ prompt += `- \`${o}\`\n`;
169
+ }
170
+ prompt += `\n`;
171
+ }
172
+ // 遗漏检查
173
+ if (analysis.potentialGaps.length > 0) {
174
+ prompt += `## 上次分析的潜在遗漏\n\n`;
175
+ prompt += `以下项在上次分析中可能未覆盖,请检查并补充:\n\n`;
176
+ for (const gap of analysis.potentialGaps) {
177
+ prompt += `- [ ] ${gap}\n`;
178
+ }
179
+ prompt += `\n`;
180
+ }
181
+ // 复用指令
182
+ prompt += `## 复用指令\n\n`;
183
+ prompt += `对于**未变更**的需求和源码,请按以下方式处理:\n\n`;
184
+ prompt += `1. **Read 已有分析产出**(不要重新从零分析)\n`;
185
+ prompt += `2. **校验已有内容**是否仍然准确(需求未变则内容应不变)\n`;
186
+ prompt += `3. **只更新受影响的部分**:\n`;
187
+ prompt += ` - 如果某功能模块的需求未变更 → 复用已有分析,只做一致性校验\n`;
188
+ prompt += ` - 如果某功能模块的需求已变更 → 重新分析该模块\n`;
189
+ prompt += ` - 如果新增了功能模块 → 补充分析新模块\n`;
190
+ prompt += `4. **全局文档更新**:如果功能模块有增删改,更新 FUNCTION_MAP.md 和 INTERACTION_MAP.md\n\n`;
191
+ // 具体执行步骤
192
+ prompt += `## 执行步骤\n\n`;
193
+ prompt += `### Step 1: 读取上次分析产出\n`;
194
+ prompt += `Read 以下文件了解已有分析结果:\n`;
195
+ prompt += `- \`020-specs/global/REQUIREMENT.md\`\n`;
196
+ prompt += `- \`020-specs/global/FUNCTION_MAP.md\`\n`;
197
+ prompt += `- \`020-specs/global/ANALYSIS.md\`\n`;
198
+ prompt += `- 各端的 TECH.md、TEST.md 等\n\n`;
199
+ prompt += `### Step 2: 读取变更后的需求文档\n`;
200
+ prompt += `只读取变更的需求文档(上面的变更摘要),未变更的不需要重读。\n\n`;
201
+ prompt += `### Step 3: 增量更新分析\n`;
202
+ prompt += `基于变更内容,更新受影响的分析产出:\n`;
203
+ prompt += `- 新增功能 → 补充到 REQUIREMENT.md、FUNCTION_MAP.md、各端 TECH.md\n`;
204
+ prompt += `- 修改功能 → 更新对应文档中的相关内容\n`;
205
+ prompt += `- 删除功能 → 从 FUNCTION_MAP.md 中移除,标注各端对应代码为「待删除」\n\n`;
206
+ prompt += `### Step 4: 检查遗漏\n`;
207
+ prompt += `对照上面的「潜在遗漏」清单,确认是否已覆盖。\n\n`;
208
+ prompt += `## 写入方式\n`;
209
+ prompt += `\`\`\`bash\n`;
210
+ prompt += `speccore analyze --apply '{"global/REQUIREMENT.md":"...",...}' -I ${iteration}\n`;
211
+ prompt += `\`\`\`\n`;
212
+ return prompt;
213
+ }
214
+ // ── 内部函数 ──
215
+ /** 加载上次分析快照 */
216
+ async function loadSnapshot(iterDir) {
217
+ const snapshotPath = (0, path_1.join)(iterDir, '..', SNAPSHOT_FILE);
218
+ if (!(await (0, fs_extra_1.pathExists)(snapshotPath)))
219
+ return null;
220
+ try {
221
+ const content = await (0, fs_extra_1.readFile)(snapshotPath, 'utf-8');
222
+ return JSON.parse(content);
223
+ }
224
+ catch {
225
+ return null;
226
+ }
227
+ }
228
+ /** 保存分析快照 */
229
+ async function saveSnapshot(iterDir, snapshot) {
230
+ const { ensureDir, writeFile } = await Promise.resolve().then(() => __importStar(require('fs-extra')));
231
+ const snapshotPath = (0, path_1.join)(iterDir, '..', SNAPSHOT_FILE);
232
+ await ensureDir((0, path_1.join)(iterDir, '..', '.speccore', 'cache'));
233
+ await writeFile(snapshotPath, JSON.stringify(snapshot, null, 2));
234
+ }
235
+ /** 检测需求文档变更 */
236
+ async function detectRequirementChanges(iterDir, snapshot) {
237
+ const changes = [];
238
+ const reqDir = (0, path_1.join)(iterDir, '010-requirements');
239
+ if (!(await (0, fs_extra_1.pathExists)(reqDir)))
240
+ return changes;
241
+ // 收集所有需求文件
242
+ const reqFiles = await findAllFiles(reqDir, ['.md', '.txt']);
243
+ // 对比快照
244
+ const currentHashes = {};
245
+ for (const file of reqFiles) {
246
+ const hash = await hashFile(file);
247
+ currentHashes[file] = hash;
248
+ if (!snapshot) {
249
+ changes.push({ filePath: file, changeType: 'added', lastModified: (await (0, fs_extra_1.stat)(file)).mtime.toISOString(), contentHash: hash });
250
+ }
251
+ else if (snapshot.requirementHashes[file] !== hash) {
252
+ changes.push({
253
+ filePath: file,
254
+ changeType: snapshot.requirementHashes[file] ? 'modified' : 'added',
255
+ lastModified: (await (0, fs_extra_1.stat)(file)).mtime.toISOString(),
256
+ contentHash: hash,
257
+ previousHash: snapshot.requirementHashes[file],
258
+ });
259
+ }
260
+ else {
261
+ changes.push({ filePath: file, changeType: 'unchanged', lastModified: (await (0, fs_extra_1.stat)(file)).mtime.toISOString(), contentHash: hash });
262
+ }
263
+ }
264
+ // 检测删除的文件
265
+ if (snapshot) {
266
+ for (const file of Object.keys(snapshot.requirementHashes)) {
267
+ if (!currentHashes[file]) {
268
+ changes.push({ filePath: file, changeType: 'deleted', lastModified: '', contentHash: '', previousHash: snapshot.requirementHashes[file] });
269
+ }
270
+ }
271
+ }
272
+ return changes;
273
+ }
274
+ /** 检测源码变更 */
275
+ async function detectCodeChanges(iterDir, snapshot) {
276
+ const changes = [];
277
+ const constitutionPath = (0, path_1.join)(iterDir, '..', '.speccore', 'CONSTITUTION.md');
278
+ if (!(await (0, fs_extra_1.pathExists)(constitutionPath)))
279
+ return changes;
280
+ const constitutionContent = await (0, fs_extra_1.readFile)(constitutionPath, 'utf-8');
281
+ const sourcePaths = extractSourcePaths(constitutionContent);
282
+ const codeExtensions = ['.ts', '.tsx', '.js', '.jsx', '.java', '.go', '.py', '.vue', '.php', '.rb'];
283
+ const allCodeFiles = [];
284
+ for (const sp of sourcePaths) {
285
+ const fullPath = (0, path_1.join)(iterDir, '..', sp);
286
+ if (await (0, fs_extra_1.pathExists)(fullPath)) {
287
+ allCodeFiles.push(...await findAllFiles(fullPath, codeExtensions));
288
+ }
289
+ }
290
+ const currentHashes = {};
291
+ for (const file of allCodeFiles) {
292
+ const hash = await hashFile(file);
293
+ currentHashes[file] = hash;
294
+ if (!snapshot) {
295
+ changes.push({ filePath: file, changeType: 'added', lastModified: (await (0, fs_extra_1.stat)(file)).mtime.toISOString(), contentHash: hash });
296
+ }
297
+ else if (snapshot.codeHashes[file] !== hash) {
298
+ changes.push({
299
+ filePath: file,
300
+ changeType: snapshot.codeHashes[file] ? 'modified' : 'added',
301
+ lastModified: (await (0, fs_extra_1.stat)(file)).mtime.toISOString(),
302
+ contentHash: hash,
303
+ previousHash: snapshot.codeHashes[file],
304
+ });
305
+ }
306
+ else {
307
+ changes.push({ filePath: file, changeType: 'unchanged', lastModified: (await (0, fs_extra_1.stat)(file)).mtime.toISOString(), contentHash: hash });
308
+ }
309
+ }
310
+ // 检测删除
311
+ if (snapshot) {
312
+ for (const file of Object.keys(snapshot.codeHashes)) {
313
+ if (!currentHashes[file]) {
314
+ changes.push({ filePath: file, changeType: 'deleted', lastModified: '', contentHash: '', previousHash: snapshot.codeHashes[file] });
315
+ }
316
+ }
317
+ }
318
+ return changes;
319
+ }
320
+ /** 识别过期的分析产出 */
321
+ async function identifyStaleOutputs(iterDir, analysis) {
322
+ const stale = [];
323
+ const specDir = (0, path_1.join)(iterDir, '020-specs');
324
+ // 如果需求文档变更,对应的功能模块分析可能过期
325
+ const changedReqs = analysis.requirementChanges.filter(c => c.changeType === 'modified' || c.changeType === 'added');
326
+ for (const req of changedReqs) {
327
+ // 从文件路径推断功能模块名
328
+ const moduleMatch = req.filePath.match(/features\/([^/]+)/);
329
+ if (moduleMatch) {
330
+ const moduleName = moduleMatch[1];
331
+ const moduleSpec = (0, path_1.join)(specDir, 'features', `${moduleName}.md`);
332
+ if (await (0, fs_extra_1.pathExists)(moduleSpec)) {
333
+ stale.push(`020-specs/features/${moduleName}.md`);
334
+ }
335
+ }
336
+ }
337
+ // 如果新增端,全局文档需要更新
338
+ if (analysis.addedPlatforms.length > 0) {
339
+ stale.push('020-specs/global/FUNCTION_MAP.md');
340
+ stale.push('020-specs/global/INTERACTION_MAP.md');
341
+ stale.push('.speccore/GLOBAL/ARCHITECTURE.md');
342
+ }
343
+ // 如果源码变更,对应的端分析可能过期
344
+ const changedCode = analysis.codeChanges.filter(c => c.changeType === 'modified');
345
+ if (changedCode.length > 0) {
346
+ // 标记所有端的 TECH.md 可能需要检查
347
+ const platforms = await (0, spec_paths_1.parsePlatformList)();
348
+ for (const p of platforms) {
349
+ stale.push(`020-specs/${p}/TECH.md`);
350
+ }
351
+ }
352
+ return [...new Set(stale)];
353
+ }
354
+ /** 检测潜在遗漏 */
355
+ async function detectPotentialGaps(iterDir) {
356
+ const gaps = [];
357
+ const specDir = (0, path_1.join)(iterDir, '020-specs');
358
+ const reqDir = (0, path_1.join)(iterDir, '010-requirements');
359
+ // 1. 检查需求文档中的功能是否在分析中有对应
360
+ const featuresDir = (0, path_1.join)(reqDir, 'features');
361
+ if (await (0, fs_extra_1.pathExists)(featuresDir)) {
362
+ const features = await (0, fs_extra_1.readdir)(featuresDir, { withFileTypes: true });
363
+ for (const f of features.filter(e => e.isDirectory())) {
364
+ const specPath = (0, path_1.join)(specDir, 'features', `${f.name}.md`);
365
+ if (!(await (0, fs_extra_1.pathExists)(specPath))) {
366
+ gaps.push(`功能模块 "${f.name}" 有需求文档但未生成分析文档`);
367
+ }
368
+ }
369
+ }
370
+ // 2. 检查全局文档完整性
371
+ const globalDocs = ['REQUIREMENT.md', 'ANALYSIS.md', 'FUNCTION_MAP.md'];
372
+ for (const doc of globalDocs) {
373
+ if (!(await (0, fs_extra_1.pathExists)((0, path_1.join)(specDir, 'global', doc)))) {
374
+ gaps.push(`全局文档缺失: global/${doc}`);
375
+ }
376
+ }
377
+ // 3. 检查各端文档完整性
378
+ const platforms = await (0, spec_paths_1.parsePlatformList)();
379
+ for (const p of platforms) {
380
+ if (!(await (0, fs_extra_1.pathExists)((0, path_1.join)(specDir, p, 'TECH.md')))) {
381
+ gaps.push(`端 ${p} 缺失 TECH.md`);
382
+ }
383
+ }
384
+ return gaps;
385
+ }
386
+ /** 生成增量分析建议 */
387
+ function buildRecommendation(analysis) {
388
+ const parts = [];
389
+ if (analysis.addedPlatforms.length > 0) {
390
+ parts.push(`新增端 ${analysis.addedPlatforms.join(', ')} 需要完整分析,并更新全局文档`);
391
+ }
392
+ const changedReqs = analysis.requirementChanges.filter(c => c.changeType !== 'unchanged');
393
+ if (changedReqs.length > 0) {
394
+ parts.push(`${changedReqs.length} 个需求文档变更,需要更新对应分析`);
395
+ }
396
+ const changedCode = analysis.codeChanges.filter(c => c.changeType !== 'unchanged');
397
+ if (changedCode.length > 0) {
398
+ parts.push(`${changedCode.length} 个源码文件变更,需要检查对应端分析`);
399
+ }
400
+ if (analysis.potentialGaps.length > 0) {
401
+ parts.push(`发现 ${analysis.potentialGaps.length} 个潜在遗漏需要补充`);
402
+ }
403
+ if (parts.length === 0) {
404
+ return '无变更 detected,建议运行最终核对检查(phase6-final-audit)确认完整性';
405
+ }
406
+ return parts.join(';');
407
+ }
408
+ /** 列出已有分析产出 */
409
+ async function listExistingOutputs(iterDir) {
410
+ const outputs = [];
411
+ const specDir = (0, path_1.join)(iterDir, '020-specs');
412
+ if (!(await (0, fs_extra_1.pathExists)(specDir)))
413
+ return outputs;
414
+ const files = await findAllFiles(specDir, ['.md', '.yaml', '.yml']);
415
+ return files.map(f => f.replace(iterDir + '/', ''));
416
+ }
417
+ // ── 辅助函数 ──
418
+ /** 计算文件内容 hash */
419
+ async function hashFile(filePath) {
420
+ try {
421
+ const content = await (0, fs_extra_1.readFile)(filePath);
422
+ return (0, crypto_1.createHash)('md5').update(content).digest('hex');
423
+ }
424
+ catch {
425
+ return '';
426
+ }
427
+ }
428
+ /** 递归查找文件 */
429
+ async function findAllFiles(dir, extensions) {
430
+ const result = [];
431
+ try {
432
+ const entries = await (0, fs_extra_1.readdir)(dir, { withFileTypes: true });
433
+ for (const entry of entries) {
434
+ const fullPath = (0, path_1.join)(dir, entry.name);
435
+ if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules') {
436
+ result.push(...await findAllFiles(fullPath, extensions));
437
+ }
438
+ else if (entry.isFile() && extensions.some(ext => entry.name.endsWith(ext))) {
439
+ result.push(fullPath);
440
+ }
441
+ }
442
+ }
443
+ catch { /* ignore */ }
444
+ return result;
445
+ }
446
+ /** 从 CONSTITUTION.md 提取源码路径 */
447
+ function extractSourcePaths(content) {
448
+ const paths = [];
449
+ const lines = content.split('\n');
450
+ for (const line of lines) {
451
+ const matches = line.match(/[\w\-./]+/g);
452
+ if (matches) {
453
+ paths.push(...matches.filter(p => p.includes('/') && !p.startsWith('http')));
454
+ }
455
+ }
456
+ return [...new Set(paths)];
457
+ }
458
+ //# sourceMappingURL=incremental-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental-analyzer.js","sourceRoot":"","sources":["../../src/core/incremental-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * module-analyzer — 功能模块级全局分析引擎(v6.76.0)
3
+ *
4
+ * 核心能力:
5
+ * 1. 在全局层对单个功能模块进行分析(区别于 --feature 的局部分析)
6
+ * 2. 模块已存在 → 重新分析该模块,更新全局层 + 各端相关文档
7
+ * 3. 模块不存在 → 从需求文档中提取该模块,按全局标准分析
8
+ * 4. 自动识别模块涉及的端,只更新相关端文档
9
+ *
10
+ * 与 --feature 的区别:
11
+ * - --feature: 局部分析 → 只生成 020-specs/features/{name}.md
12
+ * - --module: 全局视角 → 更新 FUNCTION_MAP / INTERACTION_MAP / API_CONTRACT / 各端文档
13
+ */
14
+ export interface ModuleAnalysisResult {
15
+ moduleName: string;
16
+ exists: boolean;
17
+ involvedPlatforms: string[];
18
+ isBackend: boolean[];
19
+ globalUpdates: ModuleGlobalUpdate[];
20
+ platformUpdates: ModulePlatformUpdate[];
21
+ crossPlatformChecks: CrossPlatformCheck[];
22
+ }
23
+ export interface ModuleGlobalUpdate {
24
+ file: string;
25
+ action: 'update-section' | 'append-row' | 'replace-sequence' | 'update-contract';
26
+ description: string;
27
+ }
28
+ export interface ModulePlatformUpdate {
29
+ platform: string;
30
+ files: string[];
31
+ description: string;
32
+ }
33
+ export interface CrossPlatformCheck {
34
+ category: 'api-consistency' | 'field-mapping' | 'enum-consistency' | 'auth-alignment';
35
+ platforms: string[];
36
+ description: string;
37
+ }
38
+ export interface ModuleInfo {
39
+ name: string;
40
+ involvedPlatforms: string[];
41
+ description: string;
42
+ sourceFile?: string;
43
+ }
44
+ /**
45
+ * 执行功能模块级全局分析
46
+ * @param iterDir 迭代目录
47
+ * @param moduleName 功能模块名
48
+ */
49
+ export declare function analyzeModule(iterDir: string, moduleName: string): Promise<ModuleAnalysisResult>;
50
+ /**
51
+ * 生成模块级分析 Prompt
52
+ */
53
+ export declare function buildModuleAnalysisPrompt(iterDir: string, result: ModuleAnalysisResult, iteration: string): string;
54
+ /**
55
+ * 列出所有已分析的功能模块(从 FUNCTION_MAP 提取)
56
+ */
57
+ export declare function listAnalyzedModules(iterDir: string): Promise<string[]>;
58
+ /**
59
+ * 列出需求文档中所有功能模块(从 features/ 目录提取)
60
+ */
61
+ export declare function listRequirementModules(iterDir: string): Promise<string[]>;
62
+ //# sourceMappingURL=module-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-analyzer.d.ts","sourceRoot":"","sources":["../../src/core/module-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,aAAa,EAAE,kBAAkB,EAAE,CAAC;IACpC,eAAe,EAAE,oBAAoB,EAAE,CAAC;IACxC,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,gBAAgB,GAAG,YAAY,GAAG,kBAAkB,GAAG,iBAAiB,CAAC;IACjF,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,iBAAiB,GAAG,eAAe,GAAG,kBAAkB,GAAG,gBAAgB,CAAC;IACtF,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,oBAAoB,CAAC,CA0C/B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,oBAAoB,EAC5B,SAAS,EAAE,MAAM,GAChB,MAAM,CA4HR;AAiOD;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmB5E;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAM/E"}