speccore 6.98.0 → 7.2.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.
Files changed (91) hide show
  1. package/.agents/agents/README.md +79 -0
  2. package/.agents/agents/spec-analyzer.md +41 -0
  3. package/.agents/agents/spec-architect.md +57 -0
  4. package/.agents/agents/spec-change-detector.md +55 -0
  5. package/.agents/agents/spec-clarifier.md +83 -0
  6. package/.agents/agents/spec-executor.md +41 -0
  7. package/.agents/agents/spec-gatekeeper.md +84 -0
  8. package/.agents/agents/spec-global-analyzer.md +111 -0
  9. package/.agents/agents/spec-knowledge-curator.md +54 -0
  10. package/.agents/agents/spec-reviewer.md +46 -0
  11. package/.agents/agents/spec-security-auditor.md +56 -0
  12. package/.agents/agents/spec-tester.md +120 -0
  13. package/README.md +49 -1
  14. package/dist/cli.js +59 -0
  15. package/dist/cli.js.map +1 -1
  16. package/dist/commands/analyze.d.ts +6 -0
  17. package/dist/commands/analyze.d.ts.map +1 -1
  18. package/dist/commands/analyze.js +648 -53
  19. package/dist/commands/analyze.js.map +1 -1
  20. package/dist/commands/config.js +15 -4
  21. package/dist/commands/config.js.map +1 -1
  22. package/dist/commands/dev.js +30 -8
  23. package/dist/commands/dev.js.map +1 -1
  24. package/dist/commands/graph.d.ts +25 -0
  25. package/dist/commands/graph.d.ts.map +1 -0
  26. package/dist/commands/graph.js +523 -0
  27. package/dist/commands/graph.js.map +1 -0
  28. package/dist/commands/init.d.ts.map +1 -1
  29. package/dist/commands/init.js +62 -276
  30. package/dist/commands/init.js.map +1 -1
  31. package/dist/commands/iteration-from-global.js +2 -2
  32. package/dist/commands/status.d.ts.map +1 -1
  33. package/dist/commands/status.js +149 -0
  34. package/dist/commands/status.js.map +1 -1
  35. package/dist/core/ask-engine.d.ts.map +1 -1
  36. package/dist/core/ask-engine.js +12 -5
  37. package/dist/core/ask-engine.js.map +1 -1
  38. package/dist/core/change-impact-global.d.ts +20 -0
  39. package/dist/core/change-impact-global.d.ts.map +1 -0
  40. package/dist/core/change-impact-global.js +130 -0
  41. package/dist/core/change-impact-global.js.map +1 -0
  42. package/dist/core/code-graph/parser.d.ts.map +1 -1
  43. package/dist/core/code-graph/parser.js +21 -1
  44. package/dist/core/code-graph/parser.js.map +1 -1
  45. package/dist/core/dev-llm.d.ts +10 -0
  46. package/dist/core/dev-llm.d.ts.map +1 -1
  47. package/dist/core/dev-llm.js.map +1 -1
  48. package/dist/core/doc-cross-reference.d.ts +10 -0
  49. package/dist/core/doc-cross-reference.d.ts.map +1 -0
  50. package/dist/core/doc-cross-reference.js +108 -0
  51. package/dist/core/doc-cross-reference.js.map +1 -0
  52. package/dist/core/doc-quality-gate.d.ts +28 -0
  53. package/dist/core/doc-quality-gate.d.ts.map +1 -0
  54. package/dist/core/doc-quality-gate.js +209 -0
  55. package/dist/core/doc-quality-gate.js.map +1 -0
  56. package/dist/core/graph-semantic.d.ts +51 -0
  57. package/dist/core/graph-semantic.d.ts.map +1 -0
  58. package/dist/core/graph-semantic.js +371 -0
  59. package/dist/core/graph-semantic.js.map +1 -0
  60. package/dist/core/incremental-analyzer.js +1 -1
  61. package/dist/core/incremental-analyzer.js.map +1 -1
  62. package/dist/core/intent-recognition.d.ts.map +1 -1
  63. package/dist/core/intent-recognition.js +40 -0
  64. package/dist/core/intent-recognition.js.map +1 -1
  65. package/dist/core/iteration-cache.d.ts +48 -0
  66. package/dist/core/iteration-cache.d.ts.map +1 -0
  67. package/dist/core/iteration-cache.js +148 -0
  68. package/dist/core/iteration-cache.js.map +1 -0
  69. package/dist/core/knowledge-graph.d.ts +3 -0
  70. package/dist/core/knowledge-graph.d.ts.map +1 -1
  71. package/dist/core/knowledge-graph.js +190 -0
  72. package/dist/core/knowledge-graph.js.map +1 -1
  73. package/dist/core/platform-addition.js +3 -3
  74. package/dist/core/platform-addition.js.map +1 -1
  75. package/dist/core/rag-engine.d.ts +30 -0
  76. package/dist/core/rag-engine.d.ts.map +1 -1
  77. package/dist/core/rag-engine.js +78 -0
  78. package/dist/core/rag-engine.js.map +1 -1
  79. package/dist/core/semantic-locator.d.ts +42 -0
  80. package/dist/core/semantic-locator.d.ts.map +1 -0
  81. package/dist/core/semantic-locator.js +290 -0
  82. package/dist/core/semantic-locator.js.map +1 -0
  83. package/dist/core/structured-extractor.d.ts +89 -0
  84. package/dist/core/structured-extractor.d.ts.map +1 -0
  85. package/dist/core/structured-extractor.js +428 -0
  86. package/dist/core/structured-extractor.js.map +1 -0
  87. package/dist/utils/mermaid-render.d.ts +39 -0
  88. package/dist/utils/mermaid-render.d.ts.map +1 -0
  89. package/dist/utils/mermaid-render.js +284 -0
  90. package/dist/utils/mermaid-render.js.map +1 -0
  91. package/package.json +1 -1
@@ -70,6 +70,8 @@ const requirement_clarifier_1 = require("../core/requirement-clarifier");
70
70
  const agents_1 = require("../core/agents");
71
71
  // v6.91.0+: 代码知识图谱摘要注入
72
72
  const code_graph_1 = require("../core/code-graph");
73
+ // v7.2.0+: 结构化代码数据提取
74
+ const structured_extractor_1 = require("../core/structured-extractor");
73
75
  async function analyzeCommand(options) {
74
76
  // v6.97.0+ 修复:全局分析时统一设置 iteration 为 'GLOBAL',避免任何 fallback 到 getDefaultIteration()
75
77
  // 这是根治方案:后面所有 "options.iteration || await getDefaultIteration()" 都会命中 options.iteration
@@ -506,13 +508,17 @@ async function analyzeCommand(options) {
506
508
  if (options.scope === 'global') {
507
509
  // 全局分析:预创建 .speccore/GLOBAL/ 目录结构,不写迭代目录
508
510
  // v6.81.0+: 需求文档单独放在 requirements/ 下,技术文档放在 platforms/ 下
511
+ // v7.2.0+: 全局技术文档统一放在 overview/ 子目录下,与迭代层 020-specs/overview/ 命名一致
509
512
  const globalDir = (0, path_1.join)(process.cwd(), '.speccore', 'GLOBAL');
510
513
  await (0, fs_extra_1.ensureDir)(globalDir);
514
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(globalDir, 'overview'));
511
515
  await (0, fs_extra_1.ensureDir)((0, path_1.join)(globalDir, 'platforms'));
512
516
  await (0, fs_extra_1.ensureDir)((0, path_1.join)(globalDir, 'requirements'));
513
517
  await (0, fs_extra_1.ensureDir)((0, path_1.join)(globalDir, 'requirements', 'images'));
514
518
  await (0, fs_extra_1.ensureDir)((0, path_1.join)(globalDir, 'requirements', 'prototypes'));
515
- logger_1.logger.info(`📁 已预创建 .speccore/GLOBAL/ 目录结构(requirements/ + platforms/)`);
519
+ // v7.0.0+: 图表可视化目录
520
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(globalDir, 'diagrams'));
521
+ logger_1.logger.info(`📁 已预创建 .speccore/GLOBAL/ 目录结构(overview/ + platforms/ + requirements/ + diagrams/)`);
516
522
  }
517
523
  else {
518
524
  const iterForDirs = options.iteration || await (0, context_1.getDefaultIteration)();
@@ -801,11 +807,13 @@ async function analyzeCommand(options) {
801
807
  targetFilename = filename;
802
808
  }
803
809
  else if (globalSet.has(filename)) {
804
- targetDir = globalBaseDir;
810
+ // v7.2.0+: 全局技术文档统一放入 overview/ 子目录,与迭代层命名一致
811
+ targetDir = (0, path_1.join)(globalBaseDir, 'overview');
805
812
  targetFilename = filename;
806
813
  }
807
814
  else {
808
- targetDir = globalBaseDir;
815
+ // v7.2.0+: 未知文件也归入 overview/ 子目录
816
+ targetDir = (0, path_1.join)(globalBaseDir, 'overview');
809
817
  targetFilename = filename;
810
818
  }
811
819
  await (0, fs_extra_1.ensureDir)(targetDir);
@@ -823,6 +831,13 @@ async function analyzeCommand(options) {
823
831
  count++;
824
832
  }
825
833
  logger_1.logger.success(`✅ ${count} 个全局文档已写入 .speccore/GLOBAL/`);
834
+ // v7.2.0+: 全局文档质量门禁
835
+ const { runGlobalQualityGate, printQualityReport } = await Promise.resolve().then(() => __importStar(require('../core/doc-quality-gate')));
836
+ const reports = await runGlobalQualityGate();
837
+ printQualityReport(reports);
838
+ // v7.2.0+: 自动生成文档间交叉引用
839
+ const { generateCrossReferences } = await Promise.resolve().then(() => __importStar(require('../core/doc-cross-reference')));
840
+ await generateCrossReferences();
826
841
  }
827
842
  else {
828
843
  // 迭代级:写 020-specs/(综合文档写入 global/ 子目录,v6.41.0+)
@@ -1199,8 +1214,29 @@ async function analyzeCommand(options) {
1199
1214
  if (options.prompt) {
1200
1215
  // v6.97.0+ 修复:全局分析时不应 fallback 到当前迭代
1201
1216
  const iter = options.scope === 'global' ? 'GLOBAL' : (options.iteration || await (0, context_1.getDefaultIteration)());
1217
+ // v7.2.0+: 保存分析上下文到临时目录
1218
+ if (iter && iter !== 'GLOBAL') {
1219
+ try {
1220
+ const { saveAnalysisContext } = await Promise.resolve().then(() => __importStar(require('../core/iteration-cache')));
1221
+ await saveAnalysisContext({
1222
+ iteration: iter,
1223
+ docName: options.docName,
1224
+ featureName: options.featureName,
1225
+ withCode: options.withCode,
1226
+ timestamp: new Date().toISOString(),
1227
+ });
1228
+ }
1229
+ catch { /* ignore */ }
1230
+ }
1202
1231
  const prompt = await buildMultiDocPrompt('analyze', { iteration: iter, task: options.task, type: options.type, scope: options.scope, withCode: options.withCode, platform: options.platform, phase: options.phase, autoMode: options.auto }, options);
1203
1232
  process.stdout.write(`[SPECCORE_PROMPT]\n${prompt}`);
1233
+ // v7.2.0+: 全局分析完成后输出下一步引导
1234
+ if (options.scope === 'global') {
1235
+ const guide = await buildGlobalAnalysisGuide(options);
1236
+ if (guide) {
1237
+ process.stdout.write(`\n[SPECCORE_GUIDE]\n${guide}`);
1238
+ }
1239
+ }
1204
1240
  process.exitCode = 10;
1205
1241
  return;
1206
1242
  }
@@ -1652,6 +1688,148 @@ async function injectGraphSummary(prompt) {
1652
1688
  return prompt;
1653
1689
  }
1654
1690
  }
1691
+ // ── v7.2.0+: 检测全局分析当前进度 ──
1692
+ // Layer 4 拆分为子层: 4a=产品文档, 4b=全局技术核心, 4c=全局技术扩展, 4d=各端技术
1693
+ async function detectGlobalLayerProgress() {
1694
+ const globalDir = (0, path_1.join)(process.cwd(), '.speccore', 'GLOBAL');
1695
+ let completedLayer = 0;
1696
+ const missing = [];
1697
+ // Layer 1: 检查各端 _INDEX.md
1698
+ try {
1699
+ const platformsDir = (0, path_1.join)(globalDir, 'platforms');
1700
+ const entries = await (0, fs_extra_2.readdir)(platformsDir, { withFileTypes: true });
1701
+ const platformDirs = entries.filter(e => e.isDirectory() && e.name !== '_shared').map(e => e.name);
1702
+ const hasIndex = platformDirs.length > 0 && (await Promise.all(platformDirs.map(async (d) => (0, fs_extra_1.pathExists)((0, path_1.join)(platformsDir, d, '_INDEX.md'))))).some(Boolean);
1703
+ if (hasIndex)
1704
+ completedLayer = 1;
1705
+ else
1706
+ missing.push('Layer 1: platforms/{端}/_INDEX.md');
1707
+ }
1708
+ catch {
1709
+ missing.push('Layer 1: platforms/{端}/_INDEX.md');
1710
+ }
1711
+ // Layer 2: 检查 _ASSOCIATION.md
1712
+ if (completedLayer >= 1) {
1713
+ if (await (0, fs_extra_1.pathExists)((0, path_1.join)(globalDir, 'platforms', '_shared', '_ASSOCIATION.md'))) {
1714
+ completedLayer = 2;
1715
+ }
1716
+ else {
1717
+ missing.push('Layer 2: platforms/_shared/_ASSOCIATION.md + _MODULES.md');
1718
+ }
1719
+ }
1720
+ // Layer 3: 检查 _MODULES.md
1721
+ if (completedLayer >= 2) {
1722
+ if (await (0, fs_extra_1.pathExists)((0, path_1.join)(globalDir, 'platforms', '_shared', '_MODULES.md'))) {
1723
+ completedLayer = 3;
1724
+ }
1725
+ else {
1726
+ missing.push('Layer 3: platforms/_shared/_MODULES.md(功能模块候选清单)');
1727
+ }
1728
+ }
1729
+ // Layer 4 子层检测
1730
+ let subLayer;
1731
+ if (completedLayer >= 3) {
1732
+ const overviewDir = (0, path_1.join)(globalDir, 'overview');
1733
+ const requirementsDir = (0, path_1.join)(globalDir, 'requirements');
1734
+ const completedSubLayers = [];
1735
+ // 4a: 产品文档
1736
+ const hasReq = await (0, fs_extra_1.pathExists)((0, path_1.join)(requirementsDir, 'REQUIREMENT.md'));
1737
+ if (hasReq)
1738
+ completedSubLayers.push('4a');
1739
+ // 4b: 全局技术核心文档
1740
+ const hasCoreTech = await (0, fs_extra_1.pathExists)((0, path_1.join)(overviewDir, 'ARCHITECTURE.md'))
1741
+ && await (0, fs_extra_1.pathExists)((0, path_1.join)(overviewDir, 'FUNCTION_MAP.md'));
1742
+ if (hasCoreTech)
1743
+ completedSubLayers.push('4b');
1744
+ // 4c: 全局技术扩展文档
1745
+ const hasExtTech = await (0, fs_extra_1.pathExists)((0, path_1.join)(overviewDir, 'SECURITY_AUDIT.md'))
1746
+ || await (0, fs_extra_1.pathExists)((0, path_1.join)(overviewDir, 'DATA_FLOW.md'));
1747
+ if (hasExtTech)
1748
+ completedSubLayers.push('4c');
1749
+ // 4d: 各端技术文档
1750
+ try {
1751
+ const platformsDir = (0, path_1.join)(globalDir, 'platforms');
1752
+ const entries = await (0, fs_extra_2.readdir)(platformsDir, { withFileTypes: true });
1753
+ const platformDirs = entries.filter(e => e.isDirectory() && e.name !== '_shared').map(e => e.name);
1754
+ const hasPlatformDoc = platformDirs.length > 0 && (await Promise.all(platformDirs.map(async (d) => (0, fs_extra_1.pathExists)((0, path_1.join)(platformsDir, d, 'API_INVENTORY.md'))
1755
+ || (0, fs_extra_1.pathExists)((0, path_1.join)(platformsDir, d, 'UI_FLOW.md'))))).some(Boolean);
1756
+ if (hasPlatformDoc)
1757
+ completedSubLayers.push('4d');
1758
+ }
1759
+ catch { /* ignore */ }
1760
+ if (completedSubLayers.length === 4) {
1761
+ completedLayer = 4;
1762
+ }
1763
+ else {
1764
+ const subLayerOrder = ['4a', '4b', '4c', '4d'];
1765
+ const nextSub = subLayerOrder.find(s => !completedSubLayers.includes(s)) || '4d';
1766
+ missing.push(`Layer 4${nextSub}: 全局汇总文档子层`);
1767
+ subLayer = { completed: completedSubLayers, next: nextSub };
1768
+ }
1769
+ }
1770
+ return { completedLayer, nextLayer: Math.min(completedLayer + 1, 4), missing, subLayer };
1771
+ }
1772
+ // ── v7.2.0+: 全局分析下一步引导 ──
1773
+ async function buildGlobalAnalysisGuide(options) {
1774
+ const progress = await detectGlobalLayerProgress();
1775
+ const { completedLayer, nextLayer, subLayer } = progress;
1776
+ const deepDoc = options?.deep;
1777
+ let guide = '';
1778
+ // 进度条
1779
+ const layers = ['Layer 1 索引扫描', 'Layer 2 跨端关联', 'Layer 3 模块深入', 'Layer 4 全局汇总'];
1780
+ guide += `\n📊 全局分析进度: ${completedLayer}/4 层完成\n`;
1781
+ guide += layers.map((l, i) => {
1782
+ const status = i < completedLayer ? '✅' : i === completedLayer ? '▶️' : '⬜';
1783
+ return ` ${status} ${l}`;
1784
+ }).join('\n');
1785
+ guide += '\n';
1786
+ if (completedLayer === 4 && (!subLayer || subLayer.completed.length === 4)) {
1787
+ guide += '\n🎉 全局分析全部完成!\n';
1788
+ guide += ' 所有文档已生成在 .speccore/GLOBAL/ 目录\n';
1789
+ guide += ' 如需补充某份文档: speccore analyze --scope global --layer 4 --deep <文档名>\n';
1790
+ return guide;
1791
+ }
1792
+ // 下一步命令
1793
+ guide += '\n➡️ 下一步:\n';
1794
+ if (deepDoc && options?.iterative) {
1795
+ const outlinePath = (0, path_1.join)(process.cwd(), '.speccore', 'cache', `deep-outline-${deepDoc.replace(/\//g, '-')}.md`);
1796
+ const hasOutline = await (0, fs_extra_1.pathExists)(outlinePath);
1797
+ if (!hasOutline) {
1798
+ guide += ` 1. 将 AI 输出的大纲保存到: ${outlinePath}\n`;
1799
+ guide += ` 2. 审核/修改大纲\n`;
1800
+ guide += ` 3. 再次执行: speccore analyze --scope global --layer 4 --deep ${deepDoc} --iterative\n`;
1801
+ }
1802
+ else {
1803
+ guide += ` 1. 将 AI 输出的本节内容追加到文档\n`;
1804
+ guide += ` 2. 继续下一节: speccore analyze --scope global --layer 4 --deep ${deepDoc} --iterative\n`;
1805
+ }
1806
+ }
1807
+ else if (deepDoc) {
1808
+ guide += ` speccore analyze --scope global --layer 4 --deep ${deepDoc}\n`;
1809
+ guide += ` (如需迭代式补全: 加 --iterative 参数)\n`;
1810
+ }
1811
+ else if (nextLayer === 4 && subLayer) {
1812
+ const subNames = {
1813
+ '4a': '产品视角文档(requirements/)',
1814
+ '4b': '全局技术核心文档(overview/)',
1815
+ '4c': '全局技术扩展文档(overview/)',
1816
+ '4d': '各端技术文档(platforms/)',
1817
+ };
1818
+ guide += ` speccore analyze --scope global --layer 4\n`;
1819
+ guide += ` (即将生成: ${subNames[subLayer.next] || subLayer.next})\n`;
1820
+ }
1821
+ else {
1822
+ guide += ` speccore analyze --scope global --layer ${nextLayer}\n`;
1823
+ }
1824
+ // 快捷命令提示
1825
+ guide += '\n💡 快捷命令:\n';
1826
+ guide += ` 查看进度: speccore status\n`;
1827
+ if (completedLayer >= 3) {
1828
+ guide += ` 深度分析单文档: speccore analyze --scope global --layer 4 --deep ARCHITECTURE.md\n`;
1829
+ }
1830
+ guide += ` 全量重新分析: speccore analyze --scope global --with-code\n`;
1831
+ return guide;
1832
+ }
1655
1833
  // ── buildMultiDocPrompt: 多文档协议 ──
1656
1834
  async function buildMultiDocPrompt(command, ctx, options) {
1657
1835
  const iter = ctx.iteration || '当前迭代';
@@ -1667,21 +1845,78 @@ async function buildMultiDocPrompt(command, ctx, options) {
1667
1845
  if (ctx.withCode && (options?.streaming || options?.streamingPhase)) {
1668
1846
  return buildStreamingGlobalPrompt(command, ctx, options);
1669
1847
  }
1848
+ // v7.2.0+: 全局分析分层执行 — 检测当前进度,自动分配 layer
1849
+ const progress = await detectGlobalLayerProgress();
1850
+ const targetLayer = options?.layer || progress.nextLayer;
1851
+ const isLayered = !!options?.layer || progress.completedLayer < 4;
1852
+ // v7.2.0+: 结构化代码数据提取 — Layer 1 之前自动执行
1853
+ let structuredDataHint = '';
1854
+ if (targetLayer === 1 && ctx.withCode) {
1855
+ try {
1856
+ // 读取 CONSTITUTION.md 获取源码路径
1857
+ const constitutionPath = (0, path_1.join)(process.cwd(), '.speccore', 'CONSTITUTION.md');
1858
+ let sourcePaths = ['src'];
1859
+ if (await (0, fs_extra_1.pathExists)(constitutionPath)) {
1860
+ const content = await (0, fs_extra_2.readFile)(constitutionPath, 'utf-8');
1861
+ const match = content.match(/源码路径[\s\S]*?\n\s*-\s*`?([^`\n]+)`?/g);
1862
+ if (match) {
1863
+ sourcePaths = match.map(m => m.replace(/.*-\s*`?/, '').replace(/`?$/, '').trim()).filter(Boolean);
1864
+ }
1865
+ }
1866
+ await (0, structured_extractor_1.extractStructuredData)(process.cwd(), sourcePaths);
1867
+ structuredDataHint = '\n> 📊 **结构化数据**: 已提取到 `.speccore/cache/structured-data.json`,包含 API/Entity/Route/Component 清单\n';
1868
+ }
1869
+ catch (e) {
1870
+ logger_1.logger.warn(` ⚠️ 结构化数据提取失败: ${e.message}`);
1871
+ }
1872
+ }
1873
+ // Layer 角色定义
1874
+ const LAYER_ROLES = {
1875
+ 1: { role: '代码索引专家', focus: '全面扫描各端源码结构,提取目录/接口/实体/配置等索引信息', output: '各端 _INDEX.md + PATTERNS 模式提取 + semantic-tags.json' },
1876
+ 2: { role: '系统架构师', focus: '基于 Layer 1 索引进行跨端关联分析、接口匹配、模块聚类', output: '_ASSOCIATION.md + _MODULES.md' },
1877
+ 3: { role: '业务分析师', focus: '按功能模块深入分析业务逻辑、数据流、规则、时序', output: '各端功能模块深入文档 + 模块级 PATTERNS' },
1878
+ 4: { role: '产品总监 + 技术负责人', focus: '全局汇总,分 4 个子层执行(4a产品→4b技术核心→4c技术扩展→4d各端)', output: 'requirements/ + overview/ + platforms/' },
1879
+ };
1880
+ const layerMeta = LAYER_ROLES[targetLayer];
1670
1881
  let prompt = `\n# 任务: ${command} (全局分析${ctx.withCode ? '+源码' : ''})\n\n`;
1882
+ // v7.2.0+: 分层专注指令 — 强烈约束 AI 只执行当前 layer
1883
+ prompt += `## 🎯 当前执行层级: Layer ${targetLayer}/4 — ${layerMeta.role}\n\n`;
1884
+ prompt += `> ⚠️ **重要约束**: 你当前只需要完成 **Layer ${targetLayer}** 的工作。不要提前做后续层的内容。\n`;
1885
+ prompt += `> 每层完成后通过 \`speccore analyze --scope global --layer ${targetLayer + 1 <= 4 ? targetLayer + 1 : 4}\` 进入下一层。\n\n`;
1886
+ prompt += `| 层级 | 角色 | 核心任务 | 产出物 |\n`;
1887
+ prompt += `| :--- | :--- | :--- | :--- |\n`;
1888
+ prompt += `| 1 | 代码索引专家 | 扫描源码结构,提取索引 | platforms/{端}/_INDEX.md |\n`;
1889
+ prompt += `| 2 | 系统架构师 | 跨端关联、接口匹配、模块聚类 | platforms/_shared/_ASSOCIATION.md + _MODULES.md |\n`;
1890
+ prompt += `| 3 | 业务分析师 | 功能模块深入分析 | 各端功能模块文档 |\n`;
1891
+ prompt += `| 4 | 产品总监+技术负责人 | 全局汇总、需求总纲、一致性校验 | overview/ + requirements/ |\n\n`;
1892
+ if (progress.completedLayer > 0) {
1893
+ prompt += `📊 检测进度: 已完成 Layer ${progress.completedLayer}/4`;
1894
+ if (progress.missing.length > 0) {
1895
+ prompt += `,待补齐: ${progress.missing.join('; ')}`;
1896
+ }
1897
+ prompt += `\n\n`;
1898
+ }
1899
+ prompt += `## 你的专注任务(Layer ${targetLayer})\n`;
1900
+ prompt += `- **角色**: ${layerMeta.role}\n`;
1901
+ prompt += `- **核心任务**: ${layerMeta.focus}\n`;
1902
+ prompt += `- **预期产出**: ${layerMeta.output}\n\n`;
1671
1903
  prompt += `## 要求\n`;
1672
- prompt += `1. **先读宪法**: Read .speccore/CONSTITUTION.md,这是项目配置的唯一权威来源。获取:\n`;
1673
- prompt += ` - 「工程」列 所有工程名(如 meeting-system, booking-service)\n`;
1674
- prompt += ` - 「源码路径」列 各工程的代码目录(用于 Read 源码)\n`;
1675
- prompt += ` - 「## 端列表」章节 → 全局权威端名列表(如 backend/h5/admin)\n`;
1676
- prompt += ` - 每个工程独立分析,文档输出到: .speccore/GLOBAL/platforms/{端名}/\n`;
1677
- prompt += `2. Read .speccore/GLOBAL/ 下所有文档了解跨项目需求\n`;
1678
- prompt += `3. **禁止行为(重要)**: 不要打开浏览器、不要模拟用户操作、不要访问 URL。所有分析必须基于直接 Read 源码文件完成。如果文件不存在,跳过即可,不要尝试其他方式获取。\n`;
1904
+ prompt += `1. **先读宪法**: Read .speccore/CONSTITUTION.md,获取工程名、源码路径、端列表。\n`;
1905
+ prompt += `2. Read .speccore/GLOBAL/ 下已有文档(特别是前一层的产物)作为输入。\n`;
1906
+ prompt += `3. **禁止行为**: 不要打开浏览器、不要模拟用户操作、不要访问 URL。所有分析基于直接 Read 源码。\n`;
1679
1907
  if (ctx.withCode) {
1680
- // v6.71.2+: 双层扫描 + 功能模块驱动(替代原来的按端顺序分析)
1681
- prompt += `4. 从 CONSTITUTION.md 的「源码路径」列读取所有工程目录\n`;
1682
- prompt += `\n## 📊 Layer 1: 快速扫描所有端(并行,只提取索引)\n\n`;
1683
- prompt += `对每个端,读取关键索引文件和配置,提取全面索引(不深入代码逻辑):\n\n`;
1684
- prompt += `**后端端扫描维度(10项)**:\n`;
1908
+ prompt += `4. CONSTITUTION.md 的「源码路径」列读取所有工程目录。\n`;
1909
+ }
1910
+ // 根据 targetLayer 注入对应的专注内容
1911
+ if (targetLayer === 1) {
1912
+ prompt += `\n## 📊 Layer 1: 快速扫描所有端(基于结构化数据生成索引)\n\n`;
1913
+ prompt += `${structuredDataHint}`;
1914
+ prompt += `**重要**: 不要直接扫描源码文件。已使用代码扫描工具提取了结构化数据,你只需要读取这些数据并整理成 _INDEX.md。\n\n`;
1915
+ prompt += `**步骤**: \n`;
1916
+ prompt += `1. Read \`.speccore/cache/structured-data.json\` — 获取所有端的 API/Entity/Route/Component 清单\n`;
1917
+ prompt += `2. 对每个端,基于结构化数据生成 \`_INDEX.md\`(补充扫描工具未覆盖的内容)\n`;
1918
+ prompt += `3. 扫描工具未覆盖的维度(消息队列、定时任务、配置、外部集成、日志监控、错误处理),需要 Read 相关配置文件补充\n\n`;
1919
+ prompt += `**后端端 _INDEX.md 维度(基于 structured-data.json + 补充扫描)**:\n`;
1685
1920
  prompt += `| 扫描项 | 读取位置 | 提取内容 |\n`;
1686
1921
  prompt += `| :--- | :--- | :--- |\n`;
1687
1922
  prompt += `| 接口层 | Controller/Handler/Resource 目录 | 接口类名、接口路径(从注解/装饰器推断)、鉴权注解 |\n`;
@@ -1710,7 +1945,51 @@ async function buildMultiDocPrompt(command, ctx, options) {
1710
1945
  prompt += `| 性能 | 搜索性能相关代码(懒加载/虚拟滚动/缓存/预加载) | 优化手段、适用场景 |\n\n`;
1711
1946
  prompt += `**输出**:每个端一个 \`_INDEX.md\`,按上述维度组织,只含名称和路径列表,不含详细逻辑\n`;
1712
1947
  prompt += `**存放**:\`.speccore/GLOBAL/platforms/{端名}/_INDEX.md\`\n\n`;
1713
- prompt += `## 🔗 Layer 2: 跨端关联分析(基于 Layer 1 的索引)\n\n`;
1948
+ prompt += `### Layer 1 附加任务:提取可复用模式(PATTERNS)\n`;
1949
+ prompt += `在扫描每个端时,同时识别该端的可复用设计模式,写入 \`.speccore/PATTERNS/\`。这是跨迭代复用的核心资产。\n\n`;
1950
+ prompt += `**后端端模式提取维度(6类)**:\n`;
1951
+ prompt += `| 模式类型 | 扫描位置 | 提取内容 | 存放路径 |\n`;
1952
+ prompt += `| :--- | :--- | :--- | :--- |\n`;
1953
+ prompt += `| 架构模式 | 项目结构、模块划分 | 分层架构、目录约定、模块组织方式 | \`PATTERNS/{端名}/architecture/\` |\n`;
1954
+ prompt += `| 数据模型模式 | Entity/Model/Schema | 通用字段设计(软删除、多租户、审计字段)、关联模式 | \`PATTERNS/{端名}/data-model/\` |\n`;
1955
+ prompt += `| API 契约模式 | Controller/Handler | 统一响应格式、分页模式、错误包装、鉴权装饰器 | \`PATTERNS/{端名}/api-contract/\` |\n`;
1956
+ prompt += `| 安全模式 | 鉴权/校验/加密代码 | JWT/RBAC 实现、输入校验策略、敏感数据处理 | \`PATTERNS/{端名}/security/\` |\n`;
1957
+ prompt += `| 性能模式 | 缓存/批量/异步代码 | 缓存策略、批量查询、异步处理、连接池配置 | \`PATTERNS/{端名}/performance/\` |\n`;
1958
+ prompt += `| 工具/中间件 | utils/middleware 目录 | 可复用的工具函数、通用中间件、拦截器 | \`PATTERNS/{端名}/utils/\` |\n`;
1959
+ prompt += `**前端端模式提取维度(6类)**:\n`;
1960
+ prompt += `| 模式类型 | 扫描位置 | 提取内容 | 存放路径 |\n`;
1961
+ prompt += `| :--- | :--- | :--- | :--- |\n`;
1962
+ prompt += `| 组件模式 | components/ui 目录 | 高复用组件、复合组件、设计 token 使用 | \`PATTERNS/{端名}/components/\` |\n`;
1963
+ prompt += `| Hooks 模式 | hooks/composables 目录 | 可复用逻辑抽离、状态封装、生命周期管理 | \`PATTERNS/{端名}/hooks/\` |\n`;
1964
+ prompt += `| 状态管理模式 | store/pinia/vuex/redux | 状态切片设计、actions 组织、持久化策略 | \`PATTERNS/{端名}/state/\` |\n`;
1965
+ prompt += `| 路由/导航模式 | router/routes 配置 | 路由守卫、权限路由、动态路由、面包屑 | \`PATTERNS/{端名}/routing/\` |\n`;
1966
+ prompt += `| 请求/拦截模式 | API 调用封装 | 请求封装、错误处理、重试策略、缓存策略 | \`PATTERNS/{端名}/api-client/\` |\n`;
1967
+ prompt += `| 布局/样式模式 | layouts/themes 目录 | 布局组件、响应式策略、主题切换、CSS 架构 | \`PATTERNS/{端名}/layout/\` |\n`;
1968
+ prompt += `**跨端通用模式**:如果某模式在 2+ 端出现,优先写入通用分类(如 \`PATTERNS/architecture/\`),端差异用段落标注。\n`;
1969
+ prompt += `**写入方式**:使用 \`PATTERNS/{端名}/{分类}/{kebab-case模式名}.md\` 作为文件名。\n\n`;
1970
+ prompt += `### Layer 1 附加任务:提取语义级节点标签(SEMANTIC TAGS)\n`;
1971
+ prompt += `在扫描每个端时,同时提取语义标签,写入 \`.speccore/cache/semantic-tags.json\`。这是知识图谱理解代码意图的关键资产。\n\n`;
1972
+ prompt += `**提取规则(本地解析,零 Token 消耗)**:\n`;
1973
+ prompt += `| 提取源 | 提取内容 | 示例 |\n`;
1974
+ prompt += `| :--- | :--- | :--- |\n`;
1975
+ prompt += `| JSDoc/TSDoc 注释 | 函数/类的 @description、@summary | \`用户认证入口,处理登录/注册/登出\` |\n`;
1976
+ prompt += `| 文件头注释 | 文件顶部的多行注释 | \`会议室预订服务的核心业务逻辑层\` |\n`;
1977
+ prompt += `| 文件名推断 | 文件名关键词映射到业务域 | auth → 认证授权, order → 订单交易 |\n`;
1978
+ prompt += `| 导出名称推断 | 类名后缀推断角色 | XxxController → 接口控制器, XxxService → 业务服务 |\n`;
1979
+ prompt += `| 目录结构推断 | 文件所在目录映射到模块 | src/user/ → 用户管理, src/order/ → 订单交易 |\n\n`;
1980
+ prompt += `**输出格式**:JSON 数组,每个文件一条记录\n`;
1981
+ prompt += `\`\`\`json\n`;
1982
+ prompt += `[\n`;
1983
+ prompt += ` {\n`;
1984
+ prompt += ` "file": "backend/src/auth/AuthController.ts",\n`;
1985
+ prompt += ` "semanticTags": ["认证授权", "用户管理"],\n`;
1986
+ prompt += ` "description": "用户认证控制器,处理登录/注册/Token刷新",\n`;
1987
+ prompt += ` "businessRole": "接口控制器"\n`;
1988
+ prompt += ` }\n`;
1989
+ prompt += `]\n`;
1990
+ prompt += `\`\`\`\n\n`;
1991
+ prompt += `## 🔗 Layer 2: 跨端关联分析(基于 Layer 1 索引 + structured-data.json)\n\n`;
1992
+ prompt += `> 📊 **结构化数据**: Read \`.speccore/cache/structured-data.json\` 获取 API/Entity 清单,与 Layer 1 索引交叉验证\n\n`;
1714
1993
  prompt += `1. **匹配前后端接口**:\n`;
1715
1994
  prompt += ` - 前端 \`_INDEX.md\` 中的 API 调用路径 vs 后端 \`_INDEX.md\` 中的接口路径\n`;
1716
1995
  prompt += ` - **匹配上** → 建立「前端页面 → 前端 API 调用 → 后端接口 → 后端服务」链路\n`;
@@ -1744,7 +2023,10 @@ async function buildMultiDocPrompt(command, ctx, options) {
1744
2023
  prompt += ` - 每个功能模块标注:涉及端、核心页面、核心接口、实体名称、消息队列\n\n`;
1745
2024
  prompt += `**输出**:\n`;
1746
2025
  prompt += `- \`_ASSOCIATION.md\`:前后端关联矩阵 + 接口缺口/未使用接口清单 + 消息流链路 + 定时任务影响 + 外部集成分布 + 配置一致性风险\n`;
2026
+ prompt += ` - 此文档中必须包含 **模块关系 Mermaid 图**(graph LR),展示各功能模块间的依赖关系\n`;
2027
+ prompt += ` - 此文档中必须包含 **接口依赖 Mermaid 图**(graph TD),展示前端页面 → 后端接口的调用关系\n`;
1747
2028
  prompt += `- \`_MODULES.md\`:功能模块候选清单(从源码聚类,含消息/定时任务维度,供 Layer 3 验证)\n`;
2029
+ prompt += ` - 此文档中必须包含 **模块全景 Mermaid 图**(graph LR),展示所有功能模块及其所属端\n`;
1748
2030
  prompt += `**存放**:\`.speccore/GLOBAL/platforms/_shared/\`\n\n`;
1749
2031
  prompt += `## 🔍 Layer 3: 按功能模块深入分析(不是按端)\n\n`;
1750
2032
  prompt += `基于 Layer 2 的 \`_MODULES.md\`,逐个功能模块深入分析。\n`;
@@ -1760,7 +2042,29 @@ async function buildMultiDocPrompt(command, ctx, options) {
1760
2042
  prompt += `- 后端端:该功能模块相关的 API 详细设计、数据模型、业务规则、安全策略\n`;
1761
2043
  prompt += `- 前端端:该功能模块相关的页面详细设计、交互流程、字段映射、错误处理\n`;
1762
2044
  prompt += `- 跨端:该功能模块的交互时序图(含异步消息链路,供 Layer 4 汇总到 INTERACTION_MAP.md)\n`;
2045
+ prompt += ` - 时序图用 **Mermaid sequenceDiagram** 语法嵌入到分析文档中\n`;
2046
+ prompt += ` - 关键操作流程用 **Mermaid flowchart** 语法嵌入到分析文档中\n`;
2047
+ prompt += ` - 状态流转用 **Mermaid stateDiagram** 语法嵌入到分析文档中\n`;
1763
2048
  prompt += `- 跨端:该功能模块涉及的外部集成清单(第三方 API、消息队列、定时任务)\n\n`;
2049
+ prompt += `### Layer 3 附加任务:功能模块级模式提取(PATTERNS)\n`;
2050
+ prompt += `每个功能模块分析完成后,提取该模块的可复用模式,补充到 \`.speccore/PATTERNS/\`。\n\n`;
2051
+ prompt += `**提取维度**:\n`;
2052
+ prompt += `- **跨端交互模式**:该模块的前后端交互方式是否有代表性(如表单提交+乐观更新、轮询刷新、WebSocket 实时推送)\n`;
2053
+ prompt += `- **业务规则模式**:该模块的业务规则是否有通用性(如审批流程、库存扣减、权限校验)\n`;
2054
+ prompt += `- **数据流模式**:该模块的数据流转是否有代表性(如缓存更新策略、数据同步机制、离线优先)\n`;
2055
+ prompt += `- **UI 交互模式**:该模块的页面交互是否有复用价值(如列表筛选、表单校验、弹窗确认、拖拽排序)\n`;
2056
+ prompt += `- **错误处理模式**:该模块的错误场景处理是否有代表性(如网络失败重试、权限不足提示、数据冲突解决)\n\n`;
2057
+ prompt += `**存放规则**:\n`;
2058
+ prompt += `- 单端模式 → \`PATTERNS/{端名}/{分类}/{模块名}-{模式类型}.md\`\n`;
2059
+ prompt += `- 跨端模式 → \`PATTERNS/{分类}/{模块名}-{模式类型}.md\`(不绑定端)\n`;
2060
+ prompt += `- 示例:\`PATTERNS/h5-mobile/components/booking-form-validation.md\`、\`PATTERNS/architecture/optimistic-update-pattern.md\`\n\n`;
2061
+ prompt += `### Layer 3 附加任务:功能模块语义标注\n`;
2062
+ prompt += `每个功能模块分析完成后,为该模块涉及的核心代码文件生成语义标注,追加到 \`semantic-tags.json\`。\n\n`;
2063
+ prompt += `**标注维度**:\n`;
2064
+ prompt += `- **业务功能标签**:该文件在功能模块中承担什么职责(如「表单提交校验」、「状态机驱动」、「数据持久化」)\n`;
2065
+ prompt += `- **交互角色标签**:该文件在跨端交互中扮演什么角色(如「请求发起者」、「事件生产者」、「状态同步者」)\n`;
2066
+ prompt += `- **数据流标签**:该文件处理的数据类型(如「用户输入数据」、「配置数据」、「缓存数据」、「消息事件」)\n`;
2067
+ prompt += `- **质量标签**:该文件的代码特征(如「高复用」、「核心业务」、「边界处理」、「性能敏感」)\n\n`;
1764
2068
  prompt += `## 🌍 Layer 4: 全局汇总(所有功能模块分析完成后)\n\n`;
1765
2069
  prompt += `1. **一致性校验**:\n`;
1766
2070
  prompt += ` - 前端字段 vs 后端字段是否一致(名称、类型、必填性、校验规则)\n`;
@@ -1770,23 +2074,42 @@ async function buildMultiDocPrompt(command, ctx, options) {
1770
2074
  prompt += ` - 消息孤儿清单(无消费者/无生产者的队列)\n`;
1771
2075
  prompt += ` - 配置不一致清单(超时/重试/限流各端差异)\n`;
1772
2076
  prompt += ` → 输出 \`CONSISTENCY_CHECK.md\`\n\n`;
1773
- prompt += `2. **生成全局文档**(按视角分离存放,v6.81.0+):\n`;
1774
- prompt += ` **产品视角 → 存放到 .speccore/GLOBAL/requirements/:**\n`;
1775
- prompt += ` - \`requirements/REQUIREMENT.md\`:全局功能清单(按业务场景组织,产品视角)\n`;
1776
- prompt += ` - \`requirements/{前端端}/REQUIREMENT.md\`:各前端端的产品视角需求(页面+交互+用户旅程)\n`;
2077
+ prompt += `2. **生成全局文档**(按视角分离存放,v6.98.0+):\n`;
2078
+ prompt += ` **产品视角 → 存放到 .speccore/GLOBAL/requirements/(以专业产品角色撰写,v6.99.0+):**\n`;
2079
+ prompt += ` - \`requirements/REQUIREMENT.md\`:全局需求总纲(产品总监视角,按业务场景/用户旅程组织)\n`;
2080
+ prompt += ` - 必须包含:产品愿景、目标用户画像、核心场景地图、功能全景图\n`;
2081
+ prompt += ` - 按业务场景组织章节,每个场景:用户故事 → 操作流程 → 业务规则 → 边界条件 → 验收标准\n`;
2082
+ prompt += ` - 包含功能优先级矩阵(P0/P1/P2)、发布里程碑、风险预判\n`;
2083
+ prompt += ` - 包含与竞品的差异化分析(如有)、数据埋点需求、运营需求\n`;
2084
+ prompt += ` - 不要写技术实现细节,不要按端分章节\n`;
2085
+ prompt += ` - \`requirements/{前端端}/REQUIREMENT.md\`:各前端端的产品视角需求(前端产品经理视角)\n`;
1777
2086
  prompt += ` - 前端端示例: requirements/admin-web/REQUIREMENT.md, requirements/h5-mobile/REQUIREMENT.md\n`;
1778
- prompt += ` - 每个前端端需求目录下可放 images/(截图/流程图)和 prototypes/(原型文件)\n`;
1779
- prompt += ` **技术视角 → 存放到 .speccore/GLOBAL/ 根目录:**\n`;
1780
- prompt += ` - \`FUNCTION_MAP.md\`:功能单元 × 端映射表\n`;
1781
- prompt += ` - \`INTERACTION_MAP.md\`:跨端交互时序图(含同步 API + 异步消息,从 Layer 3 汇总)\n`;
1782
- prompt += ` - \`API_CONTRACT.yaml\`:全局接口契约(汇总所有后端 API_INVENTORY,含 rate limit、幂等性、版本策略)\n`;
1783
- prompt += ` - \`ARCHITECTURE.md\`:全局架构文档(服务拓扑、数据流、部署关系、容错设计、降级策略、扩容方案)\n`;
1784
- prompt += ` - \`SECURITY_AUDIT.md\`:全局安全审计(鉴权策略矩阵、敏感数据流、攻击面分析、CVE 清单、合规检查)\n`;
1785
- prompt += ` - \`PERFORMANCE_BASELINE.md\`:性能基线(慢查询清单、缓存策略矩阵、并发承载评估、关键路径耗时)\n`;
1786
- prompt += ` - \`DATA_FLOW.md\`:数据流与隐私分析(PII 识别与追踪、数据生命周期、存储/传输/归档策略、GDPR 合规检查)\n`;
1787
- prompt += ` - \`EXTERNAL_INTEGRATIONS.md\`:外部集成审计(第三方服务清单、SDK 版本与风险、Webhook 接收分布、重复集成识别)\n`;
1788
- prompt += ` - \`DEPLOYMENT.md\`:部署运维分析(容器化状态、CI/CD 流水线、健康检查端点、环境配置差异、日志聚合方案)\n`;
1789
- prompt += ` - \`OBSERVABILITY.md\`:可观测性分析(日志链路追踪、错误码体系、监控埋点清单、告警策略、SLA 定义)\n\n`;
2087
+ prompt += ` - **信息架构**:页面层级结构、导航关系、面包屑、路由映射\n`;
2088
+ prompt += ` - **用户旅程**:从入口到完成目标的完整流程,标注关键决策点、情绪曲线\n`;
2089
+ prompt += ` - **页面清单**:每页含页面名称、URL/路由、核心功能、进入条件、离开条件\n`;
2090
+ prompt += ` - **交互设计**:表单填写流程、列表操作、搜索筛选、分页/无限滚动、弹窗/抽屉\n`;
2091
+ prompt += ` - **状态与反馈**:加载状态、空状态、错误状态、成功反馈、操作确认\n`;
2092
+ prompt += ` - **权限与角色**:各角色可见页面/可操作按钮/数据范围\n`;
2093
+ prompt += ` - **响应式/适配策略**:不同设备尺寸下的布局变化、断点设计\n`;
2094
+ prompt += ` - **无障碍要求**:键盘导航、屏幕阅读器、色彩对比度(如有要求)\n`;
2095
+ prompt += ` - 每个前端端需求目录下可放 images/(截图/流程图/原型图)和 prototypes/(可交互原型文件)\n`;
2096
+ prompt += ` **技术视角 → 存放到 .speccore/GLOBAL/overview/(不与 platforms/requirements 平级):**\n`;
2097
+ prompt += ` - \`overview/FUNCTION_MAP.md\`:功能单元 × 端映射表\n`;
2098
+ prompt += ` - \`overview/INTERACTION_MAP.md\`:跨端交互时序图(含同步 API + 异步消息,从 Layer 3 汇总)\n`;
2099
+ prompt += ` - 必须包含 **Mermaid sequenceDiagram**,展示各端之间的核心交互时序\n`;
2100
+ prompt += ` - \`overview/API_CONTRACT.yaml\`:全局接口契约(汇总所有后端 API_INVENTORY,含 rate limit、幂等性、版本策略)\n`;
2101
+ prompt += ` - \`overview/ARCHITECTURE.md\`:全局架构文档(服务拓扑、数据流、部署关系、容错设计、降级策略、扩容方案)\n`;
2102
+ prompt += ` - 必须包含 **Mermaid architecture diagram**(graph TB),展示服务拓扑和部署关系\n`;
2103
+ prompt += ` - 必须包含 **Mermaid graph LR**,展示模块间的依赖关系\n`;
2104
+ prompt += ` - \`overview/SECURITY_AUDIT.md\`:全局安全审计(鉴权策略矩阵、敏感数据流、攻击面分析、CVE 清单、合规检查)\n`;
2105
+ prompt += ` - \`overview/PERFORMANCE_BASELINE.md\`:性能基线(慢查询清单、缓存策略矩阵、并发承载评估、关键路径耗时)\n`;
2106
+ prompt += ` - \`overview/DATA_FLOW.md\`:数据流与隐私分析(PII 识别与追踪、数据生命周期、存储/传输/归档策略、GDPR 合规检查)\n`;
2107
+ prompt += ` - 必须包含 **Mermaid flowchart**,展示数据从产生到销毁的完整生命周期\n`;
2108
+ prompt += ` - \`overview/EXTERNAL_INTEGRATIONS.md\`:外部集成审计(第三方服务清单、SDK 版本与风险、Webhook 接收分布、重复集成识别)\n`;
2109
+ prompt += ` - \`overview/DEPLOYMENT.md\`:部署运维分析(容器化状态、CI/CD 流水线、健康检查端点、环境配置差异、日志聚合方案)\n`;
2110
+ prompt += ` - 必须包含 **Mermaid flowchart**,展示 CI/CD 流水线流程\n`;
2111
+ prompt += ` - \`overview/OBSERVABILITY.md\`:可观测性分析(日志链路追踪、错误码体系、监控埋点清单、告警策略、SLA 定义)\n`;
2112
+ prompt += ` - \`overview/CONSISTENCY_CHECK.md\`:一致性校验报告(字段/状态/接口/消息/配置)\n\n`;
1790
2113
  prompt += `3. **生成各端详细文档**(技术视角,从 Layer 3 汇总):\n`;
1791
2114
  prompt += ` > 存放: .speccore/GLOBAL/platforms/{端名}/\n`;
1792
2115
  prompt += ` **后端端(9项)**:\n`;
@@ -1873,6 +2196,43 @@ async function buildMultiDocPrompt(command, ctx, options) {
1873
2196
  prompt += ` - 文件已存在 → 读取旧内容 → 在末尾追加新发现的变体(用 \`---\` 分隔)\n`;
1874
2197
  prompt += ` - 文件不存在 → 直接 Write 新文件\n\n`;
1875
2198
  prompt += `5. 以上文档输出到 .speccore/GLOBAL/ 和 .speccore/PATTERNS/,使用 Write 工具写入\n`;
2199
+ prompt += `\n`;
2200
+ prompt += `## 📊 图表生成规范(v7.0.0+)\n`;
2201
+ prompt += `全局分析必须生成丰富的可视化图表,帮助开发者直观理解系统结构和数据流。\n\n`;
2202
+ prompt += `### Mermaid 图表语法要求\n`;
2203
+ prompt += `所有图表使用标准 Mermaid 语法,嵌入到对应 Markdown 文档的代码块中:\n`;
2204
+ prompt += `\`\`\`mermaid\n`;
2205
+ prompt += `graph LR\n`;
2206
+ prompt += ` A[前端页面] -->|调用| B[后端接口]\n`;
2207
+ prompt += ` B --> C[数据库]\n`;
2208
+ prompt += `\`\`\`\n\n`;
2209
+ prompt += `### 各层级必须生成的图表\n`;
2210
+ prompt += `| 层级 | 文档 | 图表类型 | Mermaid 语法 | 内容 |\n`;
2211
+ prompt += `| :--- | :--- | :--- | :--- | :--- |\n`;
2212
+ prompt += `| Layer 2 | _ASSOCIATION.md | 模块关系图 | graph LR / graph TD | 功能模块间的依赖关系、接口调用链路 |\n`;
2213
+ prompt += `| Layer 2 | _MODULES.md | 模块全景图 | graph LR | 所有功能模块及所属端 |\n`;
2214
+ prompt += `| Layer 3 | 功能模块文档 | 时序图 | sequenceDiagram | 跨端交互时序(请求→处理→响应→推送) |\n`;
2215
+ prompt += `| Layer 3 | 功能模块文档 | 流程图 | flowchart TD | 关键业务流程(如下单、审批、支付) |\n`;
2216
+ prompt += `| Layer 3 | 功能模块文档 | 状态图 | stateDiagram-v2 | 实体状态流转(如订单状态机) |\n`;
2217
+ prompt += `| Layer 4 | INTERACTION_MAP.md | 交互时序图 | sequenceDiagram | 全系统核心跨端交互时序 |\n`;
2218
+ prompt += `| Layer 4 | ARCHITECTURE.md | 架构拓扑图 | graph TB | 服务拓扑、部署关系 |\n`;
2219
+ prompt += `| Layer 4 | ARCHITECTURE.md | 依赖关系图 | graph LR | 模块间依赖关系 |\n`;
2220
+ prompt += `| Layer 4 | DATA_FLOW.md | 数据流图 | flowchart LR | 数据生命周期(产生→传输→存储→归档→销毁) |\n`;
2221
+ prompt += `| Layer 4 | DEPLOYMENT.md | CI/CD 流程图 | flowchart LR | 从代码提交到部署的完整流水线 |\n\n`;
2222
+ prompt += `### 图表质量要求\n`;
2223
+ prompt += `- **节点命名**:使用中文或业务术语,不要使用文件名或类名\n`;
2224
+ prompt += `- **边标注**:标注调用关系(如「调用」、「依赖」、「推送」、「订阅」)\n`;
2225
+ prompt += `- **颜色区分**:用不同颜色区分端(前端=blue, 后端=green, 数据库=gray, 第三方=orange)\n`;
2226
+ prompt += `- **层次清晰**:从上到下或从左到右按逻辑层次排列,避免交叉线过多\n`;
2227
+ prompt += `- **聚焦核心**:不要试图把所有细节放进一张图,核心业务路径优先\n\n`;
2228
+ prompt += `### 独立图表文件(可选但推荐)\n`;
2229
+ prompt += `对于特别复杂的图表,除了嵌入文档外,还可以生成独立的 .mmd 文件到 \`diagrams/\` 目录:\n`;
2230
+ prompt += `- \`diagrams/module-relationship.mmd\`:模块关系图(从 _ASSOCIATION.md 提取)\n`;
2231
+ prompt += `- \`diagrams/architecture.mmd\`:架构拓扑图(从 ARCHITECTURE.md 提取)\n`;
2232
+ prompt += `- \`diagrams/data-flow.mmd\`:数据流图(从 DATA_FLOW.md 提取)\n`;
2233
+ prompt += `- \`diagrams/{模块名}-sequence.mmd\`:核心模块时序图\n`;
2234
+ prompt += `- \`diagrams/{模块名}-flow.mmd\`:核心模块流程图\n`;
2235
+ prompt += `独立 .mmd 文件只包含 Mermaid 代码(无 Markdown 包装),便于后续渲染为 HTML/PNG。\n`;
1876
2236
  }
1877
2237
  else {
1878
2238
  prompt += `4. 读取 .speccore/GLOBAL/ 下各项目需求文档,生成跨项目索引和需求目录\n`;
@@ -1886,27 +2246,27 @@ async function buildMultiDocPrompt(command, ctx, options) {
1886
2246
  prompt += `| _INDEX.md | Layer 1 | platforms/{端}/ | 各端全面索引(10维度扫描:接口/数据/业务/中间件/消息/定时/配置/外部/日志/错误) |\n`;
1887
2247
  prompt += `| _ASSOCIATION.md | Layer 2 | platforms/_shared/ | 前后端关联矩阵 + 接口缺口 + 消息流链路 + 定时任务影响 + 外部集成分布 + 配置一致性风险 |\n`;
1888
2248
  prompt += `| _MODULES.md | Layer 2 | platforms/_shared/ | 功能模块候选清单(含页面/接口/消息三维聚类) |\n`;
1889
- prompt += `\n### 需求文档(产品视角,v6.81.0+)\n`;
2249
+ prompt += `\n### 需求文档(产品视角,v6.99.0+)\n`;
1890
2250
  prompt += `> 存放: .speccore/GLOBAL/requirements/(含 images/ prototypes/ 子目录)\n\n`;
1891
2251
  prompt += `| 文档 | 视角 | 内容 |\n`;
1892
2252
  prompt += `| :--- | :--- | :--- |\n`;
1893
- prompt += `| requirements/REQUIREMENT.md | 全局产品视角 | 全局功能清单(按业务场景组织,从功能模块汇总) |\n`;
1894
- prompt += `| requirements/{前端端}/REQUIREMENT.md | 前端产品视角 | 各前端端的需求(页面+交互+用户旅程+原型占位) |\n`;
1895
- prompt += `\n### 全局技术性文档(Layer 4 汇总生成,v6.82.0+)\n`;
1896
- prompt += `> 存放: .speccore/GLOBAL/ 根目录\n\n`;
2253
+ prompt += `| requirements/REQUIREMENT.md | 产品总监视角 | 需求总纲:愿景、用户画像、场景地图、功能全景、优先级矩阵、里程碑、风险预判 |\n`;
2254
+ prompt += `| requirements/{前端端}/REQUIREMENT.md | 前端产品经理视角 | 信息架构、用户旅程、页面清单、交互设计、状态反馈、权限角色、响应式策略 |\n`;
2255
+ prompt += `\n### 全局技术性文档(Layer 4 汇总生成,v7.2.0+)\n`;
2256
+ prompt += `> 存放: .speccore/GLOBAL/overview/(不与 platforms/requirements 平级)\n\n`;
1897
2257
  prompt += `| 文档 | 视角 | 内容 |\n`;
1898
2258
  prompt += `| :--- | :--- | :--- |\n`;
1899
- prompt += `| FUNCTION_MAP.md | 架构视角 | 功能单元 × 端映射表 |\n`;
1900
- prompt += `| INTERACTION_MAP.md | 架构视角 | 跨端交互时序图(同步 API + 异步消息) |\n`;
1901
- prompt += `| API_CONTRACT.yaml | 技术视角 | 全局接口契约(含 rate limit、幂等性、版本策略、废弃标记) |\n`;
1902
- prompt += `| ARCHITECTURE.md | 技术视角 | 全局架构(服务拓扑、数据流、部署关系、容错、降级、扩容) |\n`;
1903
- prompt += `| SECURITY_AUDIT.md | 安全视角 | 鉴权矩阵、敏感数据流、攻击面、CVE 清单、合规检查 |\n`;
1904
- prompt += `| PERFORMANCE_BASELINE.md | 性能视角 | 慢查询清单、缓存策略矩阵、并发承载、关键路径耗时 |\n`;
1905
- prompt += `| DATA_FLOW.md | 数据视角 | PII 识别追踪、数据生命周期、存储/传输/归档、GDPR 合规 |\n`;
1906
- prompt += `| EXTERNAL_INTEGRATIONS.md | 集成视角 | 第三方服务清单、SDK 风险、Webhook 分布、重复集成识别 |\n`;
1907
- prompt += `| DEPLOYMENT.md | 运维视角 | 容器化、CI/CD、健康检查、环境差异、日志聚合 |\n`;
1908
- prompt += `| OBSERVABILITY.md | 可观测视角 | 日志链路、错误码体系、监控埋点、告警策略、SLA |\n`;
1909
- prompt += `| CONSISTENCY_CHECK.md | 质量视角 | 一致性校验报告(字段/状态/接口/消息/配置) |\n`;
2259
+ prompt += `| overview/FUNCTION_MAP.md | 架构视角 | 功能单元 × 端映射表 |\n`;
2260
+ prompt += `| overview/INTERACTION_MAP.md | 架构视角 | 跨端交互时序图(同步 API + 异步消息) |\n`;
2261
+ prompt += `| overview/API_CONTRACT.yaml | 技术视角 | 全局接口契约(含 rate limit、幂等性、版本策略、废弃标记) |\n`;
2262
+ prompt += `| overview/ARCHITECTURE.md | 技术视角 | 全局架构(服务拓扑、数据流、部署关系、容错、降级、扩容) |\n`;
2263
+ prompt += `| overview/SECURITY_AUDIT.md | 安全视角 | 鉴权矩阵、敏感数据流、攻击面、CVE 清单、合规检查 |\n`;
2264
+ prompt += `| overview/PERFORMANCE_BASELINE.md | 性能视角 | 慢查询清单、缓存策略矩阵、并发承载、关键路径耗时 |\n`;
2265
+ prompt += `| overview/DATA_FLOW.md | 数据视角 | PII 识别追踪、数据生命周期、存储/传输/归档、GDPR 合规 |\n`;
2266
+ prompt += `| overview/EXTERNAL_INTEGRATIONS.md | 集成视角 | 第三方服务清单、SDK 风险、Webhook 分布、重复集成识别 |\n`;
2267
+ prompt += `| overview/DEPLOYMENT.md | 运维视角 | 容器化、CI/CD、健康检查、环境差异、日志聚合 |\n`;
2268
+ prompt += `| overview/OBSERVABILITY.md | 可观测视角 | 日志链路、错误码体系、监控埋点、告警策略、SLA |\n`;
2269
+ prompt += `| overview/CONSISTENCY_CHECK.md | 质量视角 | 一致性校验报告(字段/状态/接口/消息/配置) |\n`;
1910
2270
  prompt += `\n### 后端端技术性文档(9项,Layer 3/4 汇总)\n`;
1911
2271
  prompt += `> 存放: .speccore/GLOBAL/platforms/{后端端名}/\n\n`;
1912
2272
  prompt += `| 文档 | 内容 |\n`;
@@ -1967,6 +2327,175 @@ async function buildMultiDocPrompt(command, ctx, options) {
1967
2327
  prompt += `\n⚠️ 如 CONSTITUTION.md 中「源码路径」为空或路径不存在: 提示用户先配置,给出三个选项:\n`;
1968
2328
  prompt += ` [1] 停止分析 → 配置后重来 | [2] 跳过源码 → 只用文档分析 | [3] 手动指定路径后继续\n`;
1969
2329
  prompt += '\n' + (0, questions_1.buildAutoModeInstruction)('analyze', iter) + '\n';
2330
+ // v7.2.0+: Layer 专注指令 — 在 Prompt 末尾再次强化约束
2331
+ prompt += `\n## 🎯 Layer ${targetLayer} 执行清单(必须逐项完成)\n\n`;
2332
+ prompt += `> ⚠️ **再次强调**: 你只执行 Layer ${targetLayer},不要提前做其他层。\n\n`;
2333
+ if (targetLayer === 1) {
2334
+ prompt += `- [ ] Read CONSTITUTION.md 获取所有端和源码路径\n`;
2335
+ prompt += `- [ ] 对每个端扫描 10 个维度,生成 _INDEX.md\n`;
2336
+ prompt += `- [ ] 提取可复用模式写入 PATTERNS/\n`;
2337
+ prompt += `- [ ] 提取语义标签写入 semantic-tags.json\n`;
2338
+ prompt += `- [ ] 写入完成后执行: \`speccore analyze --scope global --layer 2\`\n`;
2339
+ }
2340
+ else if (targetLayer === 2) {
2341
+ prompt += `- [ ] Read 所有 Layer 1 生成的 _INDEX.md\n`;
2342
+ prompt += `- [ ] 匹配前后端接口,生成关联矩阵\n`;
2343
+ prompt += `- [ ] 识别公共服务、消息流、定时任务影响\n`;
2344
+ prompt += `- [ ] 归纳功能模块,生成 _MODULES.md\n`;
2345
+ prompt += `- [ ] 写入 _ASSOCIATION.md + _MODULES.md\n`;
2346
+ prompt += `- [ ] 写入完成后执行: \`speccore analyze --scope global --layer 3\`\n`;
2347
+ }
2348
+ else if (targetLayer === 3) {
2349
+ const filter = options?.filter;
2350
+ prompt += `- [ ] Read Layer 2 的 _MODULES.md 获取功能模块清单\n`;
2351
+ if (filter) {
2352
+ prompt += `> 🔍 **按需分析**: 只分析与 "${filter}" 匹配的模块\n`;
2353
+ prompt += `> 从 _MODULES.md 中筛选涉及 ${filter} 的功能模块,其他模块跳过\n`;
2354
+ }
2355
+ prompt += `- [ ] ${filter ? '筛选匹配的模块,逐个' : '逐个功能模块'}深入分析(读详细源码)\n`;
2356
+ prompt += `- [ ] 每个模块生成:API 设计、数据模型、业务规则、交互时序\n`;
2357
+ prompt += `- [ ] 时序图/流程图/状态图用 Mermaid 嵌入\n`;
2358
+ prompt += `- [ ] 提取模块级模式补充到 PATTERNS/\n`;
2359
+ prompt += `- [ ] 写入完成后执行: \`speccore analyze --scope global --layer 4${filter ? ' --filter ' + filter : ''}\`\n`;
2360
+ }
2361
+ else if (targetLayer === 4) {
2362
+ // v7.2.0+: Layer 4 拆分子层或单文档深度分析
2363
+ const deepDoc = options?.deep;
2364
+ const subLayerTarget = progress.subLayer?.next || '4a';
2365
+ if (deepDoc) {
2366
+ // --deep 模式:单文档深度分析
2367
+ const outlinePath = (0, path_1.join)(process.cwd(), '.speccore', 'cache', `deep-outline-${deepDoc.replace(/\//g, '-')}.md`);
2368
+ const hasOutline = await (0, fs_extra_1.pathExists)(outlinePath);
2369
+ if (options?.iterative && !hasOutline) {
2370
+ // 迭代模式第一步:输出大纲
2371
+ prompt += `## 🎯 Layer 4 — 单文档深度分析: ${deepDoc}(大纲阶段)\n\n`;
2372
+ prompt += `> ⚠️ **当前阶段**: 你只需要输出 **${deepDoc} 的文档大纲**。\n`;
2373
+ prompt += `> 不要写详细内容,只输出章节结构 + 每个章节的一句话说明。\n\n`;
2374
+ prompt += `**强制输入**: \n`;
2375
+ prompt += `- Read Layer 1 的所有 _INDEX.md\n`;
2376
+ prompt += `- Read Layer 2 的 _ASSOCIATION.md + _MODULES.md\n`;
2377
+ prompt += `- Read Layer 3 的功能模块深入文档\n`;
2378
+ prompt += `- Read \`.speccore/cache/structured-data.json\`(API/Entity 结构化数据)\n\n`;
2379
+ prompt += `**输出格式**: \n`;
2380
+ prompt += `\`\`\`markdown\n`;
2381
+ prompt += `# ${deepDoc.replace('.md', '')}\n`;
2382
+ prompt += `\n`;
2383
+ prompt += `## 1. 章节标题\n`;
2384
+ prompt += `> 一句话说明该章节内容\n`;
2385
+ prompt += `\n`;
2386
+ prompt += `## 2. 章节标题\n`;
2387
+ prompt += `> 一句话说明该章节内容\n`;
2388
+ prompt += `\`\`\`\n\n`;
2389
+ prompt += `**下一步**: 大纲输出后,用户会审核修改,然后执行 \`speccore analyze --scope global --layer 4 --deep ${deepDoc} --iterative\` 进入逐节填充阶段。\n`;
2390
+ }
2391
+ else if (options?.iterative && hasOutline) {
2392
+ // 迭代模式第二步:根据大纲逐节填充
2393
+ const outlineContent = await (0, fs_extra_2.readFile)(outlinePath, 'utf-8');
2394
+ prompt += `## 🎯 Layer 4 — 单文档深度分析: ${deepDoc}(逐节填充阶段)\n\n`;
2395
+ prompt += `> ⚠️ **当前阶段**: 根据已确认的大纲,逐节填充详细内容。\n`;
2396
+ prompt += `> 每次只填充 **一节**,确保深度和质量。\n\n`;
2397
+ prompt += `**已确认大纲**: \n`;
2398
+ prompt += outlineContent.slice(0, 2000); // 限制长度
2399
+ prompt += `\n\n`;
2400
+ prompt += `**强制输入**: \n`;
2401
+ prompt += `- Read Layer 1-3 的所有产物\n`;
2402
+ prompt += `- Read \`.speccore/cache/structured-data.json\`\n`;
2403
+ prompt += `- 如涉及代码细节,Read 相关源码文件\n\n`;
2404
+ prompt += `**深度要求**: \n`;
2405
+ prompt += `- 不要写"待导入"、"待补充"等占位内容\n`;
2406
+ prompt += `- 每个表格必须有真实数据\n`;
2407
+ prompt += `- 每个结论必须有证据(引用文件名/类名/方法名)\n`;
2408
+ prompt += `- 必须包含 Mermaid 图表(如适用)\n\n`;
2409
+ prompt += `**输出**: 只输出当前节的完整内容(不是整份文档)\n`;
2410
+ }
2411
+ else {
2412
+ // 非迭代模式:一次性输出完整文档
2413
+ prompt += `## 🎯 Layer 4 — 单文档深度分析: ${deepDoc}\n\n`;
2414
+ prompt += `> ⚠️ **专注约束**: 你只生成 **${deepDoc}** 这一份文档,不要生成其他文档。\n`;
2415
+ prompt += `> 你必须深入分析,不要写框架/占位符。每节必须有实质性内容。\n\n`;
2416
+ prompt += `**强制输入**: \n`;
2417
+ prompt += `- Read Layer 1 的所有 _INDEX.md(获取源码结构索引)\n`;
2418
+ prompt += `- Read Layer 2 的 _ASSOCIATION.md + _MODULES.md(获取跨端关联)\n`;
2419
+ prompt += `- Read Layer 3 的功能模块深入文档(获取详细分析结果)\n`;
2420
+ prompt += `- Read \`.speccore/cache/structured-data.json\`(API/Entity 结构化数据)\n`;
2421
+ prompt += `- 如果涉及代码细节,直接 Read 相关源码文件,引用具体代码片段\n\n`;
2422
+ prompt += `**深度要求**: \n`;
2423
+ prompt += `- 不要写"待导入"、"待补充"、"示例"等占位内容\n`;
2424
+ prompt += `- 每个表格必须有真实数据(从 Layer 1-3 提取)\n`;
2425
+ prompt += `- 每个结论必须有证据(引用具体文件名/类名/方法名)\n`;
2426
+ prompt += `- 如果信息不足,明确标注"信息不足: 需要读取 xxx 文件"\n`;
2427
+ prompt += `- 必须包含 Mermaid 图表(如适用)\n\n`;
2428
+ prompt += `**输出**: 只输出 \`${deepDoc}\` 的完整内容\n`;
2429
+ }
2430
+ }
2431
+ else {
2432
+ // 子层模式:每次只生成一个子层
2433
+ prompt += `## 🌍 Layer 4: 全局汇总 — 子层 ${subLayerTarget}/4\n\n`;
2434
+ prompt += `> ⚠️ **专注约束**: 你当前只执行 **子层 ${subLayerTarget}**,不要生成其他子层的文档。\n`;
2435
+ prompt += `> 子层完成后执行: \`speccore analyze --scope global --layer 4\` 进入下一子层。\n\n`;
2436
+ prompt += `**强制输入**: \n`;
2437
+ prompt += `- Read Layer 1 的所有 _INDEX.md\n`;
2438
+ prompt += `- Read Layer 2 的 _ASSOCIATION.md + _MODULES.md\n`;
2439
+ prompt += `- Read Layer 3 的功能模块深入文档\n\n`;
2440
+ if (subLayerTarget === '4a') {
2441
+ prompt += `**子层 4a: 产品视角文档(2-3 份)**\n`;
2442
+ prompt += `1. \`requirements/REQUIREMENT.md\` — 全局需求总纲\n`;
2443
+ prompt += ` - 产品愿景、目标用户画像、核心场景地图\n`;
2444
+ prompt += ` - 按业务场景组织:用户故事 → 操作流程 → 业务规则 → 边界条件 → 验收标准\n`;
2445
+ prompt += ` - 功能优先级矩阵(P0/P1/P2)\n`;
2446
+ prompt += ` - 必须从 Layer 3 的功能模块分析中提取真实内容,不要臆造\n`;
2447
+ prompt += `2. 各前端端 \`requirements/{端}/REQUIREMENT.md\` — 只生成已有前端端的需求\n`;
2448
+ prompt += ` - 信息架构、用户旅程、页面清单、交互设计\n`;
2449
+ prompt += ` - 从 Layer 1 的前端 _INDEX.md 提取页面/路由信息\n`;
2450
+ prompt += ` - 从 Layer 3 的模块分析提取交互流程\n`;
2451
+ }
2452
+ else if (subLayerTarget === '4b') {
2453
+ prompt += `**子层 4b: 全局技术核心文档(3-4 份)**\n`;
2454
+ prompt += `1. \`overview/FUNCTION_MAP.md\` — 功能单元 × 端映射表\n`;
2455
+ prompt += ` - 从 Layer 2 的 _MODULES.md 提取功能模块\n`;
2456
+ prompt += ` - 每个功能单元标注:涉及端、核心页面、核心接口、状态枚举\n`;
2457
+ prompt += `2. \`overview/ARCHITECTURE.md\` — 全局架构\n`;
2458
+ prompt += ` - 服务拓扑(从 Layer 1 的后端 _INDEX.md 提取服务名和依赖)\n`;
2459
+ prompt += ` - 数据流(从 Layer 3 的模块分析提取)\n`;
2460
+ prompt += ` - 必须包含 Mermaid architecture diagram\n`;
2461
+ prompt += `3. \`overview/API_CONTRACT.yaml\` — 全局接口契约\n`;
2462
+ prompt += ` - 汇总所有后端端的 API_INVENTORY(从 Layer 1 提取)\n`;
2463
+ prompt += ` - 标注 rate limit、幂等性、版本策略\n`;
2464
+ prompt += `4. \`overview/INTERACTION_MAP.md\` — 跨端交互时序图\n`;
2465
+ prompt += ` - 从 Layer 3 的模块时序图汇总\n`;
2466
+ prompt += ` - 必须包含 Mermaid sequenceDiagram\n`;
2467
+ }
2468
+ else if (subLayerTarget === '4c') {
2469
+ prompt += `**子层 4c: 全局技术扩展文档(4-5 份)**\n`;
2470
+ prompt += `1. \`overview/SECURITY_AUDIT.md\` — 安全审计\n`;
2471
+ prompt += `2. \`overview/PERFORMANCE_BASELINE.md\` — 性能基线\n`;
2472
+ prompt += `3. \`overview/DATA_FLOW.md\` — 数据流与隐私\n`;
2473
+ prompt += `4. \`overview/DEPLOYMENT.md\` — 部署运维\n`;
2474
+ prompt += `5. \`overview/CONSISTENCY_CHECK.md\` — 一致性校验\n`;
2475
+ prompt += ` - 从 Layer 2 的关联分析提取不一致项\n`;
2476
+ }
2477
+ else if (subLayerTarget === '4d') {
2478
+ prompt += `**子层 4d: 各端技术文档**\n`;
2479
+ prompt += `后端端(每端 9 项,但本次只生成核心 3 项,其余后续补充):\n`;
2480
+ prompt += `1. \`API_INVENTORY.md\` — 从 Layer 1 的 _INDEX.md 提取完整接口清单\n`;
2481
+ prompt += `2. \`DATA_MODEL.md\` — 从 Layer 1 的 Entity 目录 + Layer 3 的模块分析提取\n`;
2482
+ prompt += `3. \`BUSINESS_RULES.md\` — 从 Layer 3 的模块分析提取业务规则\n`;
2483
+ prompt += `前端端(每端 9 项,但本次只生成核心 3 项):\n`;
2484
+ prompt += `1. \`UI_FLOW.md\` — 从 Layer 1 的路由 + Layer 3 的模块分析提取\n`;
2485
+ prompt += `2. \`API_CALL_MAP.md\` — 从 Layer 1 的 API 调用提取\n`;
2486
+ prompt += `3. \`STATE_MANAGEMENT.md\` — 从 Layer 1 的 store 目录提取\n`;
2487
+ }
2488
+ prompt += `\n**质量要求**: \n`;
2489
+ prompt += `- 禁止写"待导入"、"待补充"等占位符\n`;
2490
+ prompt += `- 每个表格必须有真实数据(从 Layer 1-3 提取)\n`;
2491
+ prompt += `- 如果信息不足,明确标注"信息不足: 需要读取 xxx"\n`;
2492
+ }
2493
+ }
2494
+ prompt += `\n## 📝 写入方式\n`;
2495
+ prompt += `使用 \`speccore analyze --apply '{"文件路径":"内容"}' --scope global\` 写入。\n`;
2496
+ prompt += `- platforms/ 和 requirements/ 下的文件按原路径写(如 \`platforms/backend/_INDEX.md\`)\n`;
2497
+ prompt += `- overview/ 下的文件写纯文件名即可(如 \`ARCHITECTURE.md\` 自动路由到 overview/)\n`;
2498
+ prompt += `- PATTERNS/ 下的文件写 \`PATTERNS/{分类}/{模式名}.md\`\n`;
1970
2499
  return await injectGraphSummary(prompt);
1971
2500
  }
1972
2501
  const docs = [
@@ -2315,6 +2844,18 @@ sequenceDiagram
2315
2844
  }
2316
2845
  }
2317
2846
  }
2847
+ // v7.2.0+: 细粒度分析 — 只生成指定文档的指定功能
2848
+ if (options?.docName && options?.featureName && !isGlobal) {
2849
+ const targetDoc = options.docName.endsWith('.md') ? options.docName : `${options.docName}.md`;
2850
+ const filtered = taskDocs.filter(([n]) => n === targetDoc || n === options.docName);
2851
+ if (filtered.length > 0) {
2852
+ taskDocs = filtered;
2853
+ }
2854
+ else {
2855
+ // 不在默认文档列表中,创建单文档分析任务
2856
+ taskDocs = [[targetDoc, `# ${targetDoc.replace('.md', '')} — ${options.featureName}\n\n> ${iter} | ${now}\n> 分析范围: 仅「${options.featureName}」功能单元\n\n## 写作要求\n针对「${options.featureName}」进行深入分析,基于需求文档和代码上下文补充详细内容。\n`]];
2857
+ }
2858
+ }
2318
2859
  // ── 用户自定义模板集成(v6.45.0+)──
2319
2860
  const templateLevel = isGlobal ? 'global' : (isTask ? 'task' : 'iteration');
2320
2861
  const userTemplates = await loadUserTemplates(templateLevel, isTask ? taskType : undefined, ctx.platform);
@@ -2340,6 +2881,51 @@ sequenceDiagram
2340
2881
  techDoc[1] = `# 技术架构(跨端全局)\n\n> ${iter}\n\n## 写作要求\n撰写整体技术架构,覆盖所有端的交互关系:\n- 系统整体分层设计(各端在架构中的位置)\n- 跨端交互协议(前端↔后端通信方式、数据流向)\n- 中间件选型(缓存、消息队列、网关等)\n- 数据库整体设计(核心表结构、ER 关系)\n- 技术栈选型及理由\n`;
2341
2882
  }
2342
2883
  let prompt = `\n# 任务: ${command}${task} (${taskDocs.length}个文档 · ${isTask ? `类型:${taskType}` : '迭代全量'}${ctx.phase ? ` · Phase ${ctx.phase}` : ''})\n\n`;
2884
+ // v7.2.0+: 迭代分析代码关联 — 注入结构化数据和语义定位上下文
2885
+ if (!isGlobal && ctx.withCode && ctx.iteration && ctx.iteration !== 'GLOBAL') {
2886
+ try {
2887
+ // 1. 提取结构化数据(如果还没有)
2888
+ const structuredDataPath = (0, path_1.join)(process.cwd(), '.speccore', 'cache', 'structured-data.json');
2889
+ if (!(await (0, fs_extra_1.pathExists)(structuredDataPath))) {
2890
+ const constitutionPath = (0, path_1.join)(process.cwd(), '.speccore', 'CONSTITUTION.md');
2891
+ let sourcePaths = ['src'];
2892
+ if (await (0, fs_extra_1.pathExists)(constitutionPath)) {
2893
+ const content = await (0, fs_extra_2.readFile)(constitutionPath, 'utf-8');
2894
+ const match = content.match(/源码路径[\s\S]*?\n\s*-\s*`?([^`\n]+)`?/g);
2895
+ if (match) {
2896
+ sourcePaths = match.map(m => m.replace(/.*-\s*`?/, '').replace(/`?$/, '').trim()).filter(Boolean);
2897
+ }
2898
+ }
2899
+ const { extractStructuredData } = await Promise.resolve().then(() => __importStar(require('../core/structured-extractor')));
2900
+ await extractStructuredData(process.cwd(), sourcePaths);
2901
+ }
2902
+ // 2. 注入结构化数据摘要到 Prompt
2903
+ if (await (0, fs_extra_1.pathExists)(structuredDataPath)) {
2904
+ const data = await (0, fs_extra_2.readFile)(structuredDataPath, 'utf-8');
2905
+ const structured = JSON.parse(data);
2906
+ const stats = structured.stats || {};
2907
+ prompt += `## 📊 代码结构化数据(自动提取)\n\n`;
2908
+ prompt += `> 已扫描项目源码,提取以下结构化信息供分析参考:\n\n`;
2909
+ prompt += `- API 接口: ${stats.totalApis || 0} 个\n`;
2910
+ prompt += `- 数据实体: ${stats.totalEntities || 0} 个\n`;
2911
+ prompt += `- 页面路由: ${stats.totalRoutes || 0} 个\n`;
2912
+ prompt += `- 前端组件: ${stats.totalComponents || 0} 个\n`;
2913
+ prompt += `- 扫描文件: ${stats.totalFiles || 0} 个\n\n`;
2914
+ prompt += `> 💡 分析技术方案时,可参考 \`.speccore/cache/structured-data.json\` 中的 API/Entity/Route/Component 清单\n`;
2915
+ prompt += `> 如需了解具体实现,直接 Read 对应源码文件\n\n`;
2916
+ }
2917
+ // 3. 语义定位:如果指定了功能名,自动关联上下文
2918
+ if (options?.featureName) {
2919
+ const { buildFeatureContext, buildFeatureContextPrompt } = await Promise.resolve().then(() => __importStar(require('../core/semantic-locator')));
2920
+ const iterDir = await (0, context_1.getIterationDir)(ctx.iteration);
2921
+ const featureCtx = await buildFeatureContext(process.cwd(), iterDir, options.featureName, options.docName);
2922
+ prompt += buildFeatureContextPrompt(featureCtx);
2923
+ }
2924
+ }
2925
+ catch (e) {
2926
+ logger_1.logger.warn(` ⚠️ 代码关联注入失败: ${e.message}`);
2927
+ }
2928
+ }
2343
2929
  // v6.80.0+: 注入需求质量上下文(迭代级分析时)
2344
2930
  if (!isGlobal && !isTask && ctx.iteration && ctx.iteration !== 'GLOBAL') {
2345
2931
  try {
@@ -2510,9 +3096,9 @@ sequenceDiagram
2510
3096
  prompt += `2. 读取全局层产物(建立全局视角,重要)\n`;
2511
3097
  prompt += ` 在读取迭代需求之前,先 Read 全局层已有产物,了解系统当前状态:\n`;
2512
3098
  prompt += ` a. Read .speccore/GLOBAL/requirements/REQUIREMENT.md → 系统已有功能清单\n`;
2513
- prompt += ` b. Read .speccore/GLOBAL/FUNCTION_MAP.md → 已有功能单元和涉及端\n`;
2514
- prompt += ` c. Read .speccore/GLOBAL/API_CONTRACT.yaml → 已有接口契约\n`;
2515
- prompt += ` d. Read .speccore/GLOBAL/ARCHITECTURE.md → 全局架构(如有)\n`;
3099
+ prompt += ` b. Read .speccore/GLOBAL/overview/FUNCTION_MAP.md → 已有功能单元和涉及端\n`;
3100
+ prompt += ` c. Read .speccore/GLOBAL/overview/API_CONTRACT.yaml → 已有接口契约\n`;
3101
+ prompt += ` d. Read .speccore/GLOBAL/overview/ARCHITECTURE.md → 全局架构(如有)\n`;
2516
3102
  prompt += ` e. Read .speccore/GLOBAL/platforms/{相关端}/_INDEX.md → 各端已有页面和接口索引\n`;
2517
3103
  prompt += ` f. Read .speccore/GLOBAL/platforms/_shared/_ASSOCIATION.md → 前后端关联矩阵(如有)\n`;
2518
3104
  prompt += ` g. Read .speccore/GLOBAL/platforms/_shared/_MODULES.md → 功能模块候选(如有)\n`;
@@ -2540,9 +3126,18 @@ sequenceDiagram
2540
3126
  prompt += ` - 第 4 步:如果以上都无法确定,根据需求文档内容判断\n`;
2541
3127
  prompt += ` - 第 5 步:将发现的端列表写入 020-specs/PLATFORMS.md\n`;
2542
3128
  // v6.70.0+: REQUIREMENT.md 以产品视角撰写(不按端分章节)
3129
+ // v6.99.0+: 丰富需求文档章节要求
2543
3130
  prompt += `8. **REQUIREMENT.md 写作风格(重要)**:全局需求文档必须以产品/用户视角撰写\n`;
2544
3131
  prompt += ` - **按业务场景/用户旅程组织章节**,不按端分章节(如"H5端需求"、"后端需求")\n`;
2545
- prompt += ` - 每个场景描述:用户操作 → 系统响应 → 业务规则 → 边界条件\n`;
3132
+ prompt += ` - 文档结构必须包含(如需求文档中有相关信息):\n`;
3133
+ prompt += ` - **产品愿景**:本迭代要解决的核心问题和目标价值(1-2段)\n`;
3134
+ prompt += ` - **目标用户画像**:主要用户角色、使用场景、痛点(如有)\n`;
3135
+ prompt += ` - **核心场景地图**:按业务流程组织的场景列表,每个场景标注优先级\n`;
3136
+ prompt += ` - **功能全景图**:所有功能模块的可视化列表(表格或脑图描述)\n`;
3137
+ prompt += ` - **功能优先级矩阵**:P0(必须)/ P1(重要)/ P2(可选)标注\n`;
3138
+ prompt += ` - **发布里程碑**:如有分期计划,标注各阶段交付内容\n`;
3139
+ prompt += ` - **风险预判**:技术风险、业务风险、依赖风险(如有)\n`;
3140
+ prompt += ` - 每个场景描述:用户操作 → 系统响应 → 业务规则 → 边界条件 → 验收标准\n`;
2546
3141
  prompt += ` - 系统响应中自然包含前后端交互,但不刻意标注技术实现细节\n`;
2547
3142
  prompt += ` - 示例正确写法:「用户选择时间段后点击预订,系统检查会议室可用性,如可用则锁定会议室并创建待支付订单」\n`;
2548
3143
  prompt += ` - 示例错误写法:「后端 booking-service 需要新增 /api/bookings 接口,接收 roomId 参数」\n`;
@@ -2572,7 +3167,7 @@ sequenceDiagram
2572
3167
  // v6.70.0+: 跨端功能映射表(FUNCTION_MAP.md)
2573
3168
  // v6.71.3+: 增加与全局层关联分析
2574
3169
  prompt += `7a. **迭代需求与全局层关联分析(重要)**:在生成功能模块清单时,必须对比全局层产物\n`;
2575
- prompt += ` - 对比迭代需求中的功能模块 vs .speccore/GLOBAL/FUNCTION_MAP.md 中的功能单元\n`;
3170
+ prompt += ` - 对比迭代需求中的功能模块 vs .speccore/GLOBAL/overview/FUNCTION_MAP.md 中的功能单元\n`;
2576
3171
  prompt += ` - 标注每个功能模块的「全局对比」类型(新增/扩展/重构/复用)\n`;
2577
3172
  prompt += ` - 识别冲突:如迭代需求修改了全局层已有接口的字段/路径 → 在 RISK.md 中标注\n`;
2578
3173
  prompt += ` - 识别依赖:如迭代的新功能依赖全局层的某个功能 → 在 FUNCTION_MAP.md「依赖任务」中标注\n\n`;