speccore 6.77.6 → 6.80.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 (54) hide show
  1. package/dist/cli.js +1 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/analyze.d.ts +1 -0
  4. package/dist/commands/analyze.d.ts.map +1 -1
  5. package/dist/commands/analyze.js +251 -59
  6. package/dist/commands/analyze.js.map +1 -1
  7. package/dist/commands/audit.js +5 -5
  8. package/dist/commands/audit.js.map +1 -1
  9. package/dist/commands/execute.d.ts.map +1 -1
  10. package/dist/commands/execute.js +47 -104
  11. package/dist/commands/execute.js.map +1 -1
  12. package/dist/commands/iteration/split.js +83 -35
  13. package/dist/commands/iteration/split.js.map +1 -1
  14. package/dist/core/ai-context-generator.js +1 -1
  15. package/dist/core/ai-context-generator.js.map +1 -1
  16. package/dist/core/analyze-context-guard.js +5 -5
  17. package/dist/core/analyze-context-guard.js.map +1 -1
  18. package/dist/core/ask-engine.d.ts.map +1 -1
  19. package/dist/core/ask-engine.js +12 -3
  20. package/dist/core/ask-engine.js.map +1 -1
  21. package/dist/core/incremental-analyzer.js +6 -6
  22. package/dist/core/incremental-analyzer.js.map +1 -1
  23. package/dist/core/intent-recognition.d.ts.map +1 -1
  24. package/dist/core/intent-recognition.js +8 -0
  25. package/dist/core/intent-recognition.js.map +1 -1
  26. package/dist/core/module-analyzer.js +15 -15
  27. package/dist/core/module-analyzer.js.map +1 -1
  28. package/dist/core/next-steps.js +1 -1
  29. package/dist/core/next-steps.js.map +1 -1
  30. package/dist/core/pipeline-engine.d.ts +2 -0
  31. package/dist/core/pipeline-engine.d.ts.map +1 -1
  32. package/dist/core/pipeline-engine.js +20 -0
  33. package/dist/core/pipeline-engine.js.map +1 -1
  34. package/dist/core/platform-addition.js +6 -6
  35. package/dist/core/platform-addition.js.map +1 -1
  36. package/dist/core/prompt-builder.d.ts.map +1 -1
  37. package/dist/core/prompt-builder.js +48 -6
  38. package/dist/core/prompt-builder.js.map +1 -1
  39. package/dist/core/requirement-clarifier.d.ts +32 -1
  40. package/dist/core/requirement-clarifier.d.ts.map +1 -1
  41. package/dist/core/requirement-clarifier.js +284 -1
  42. package/dist/core/requirement-clarifier.js.map +1 -1
  43. package/dist/core/spec-paths.d.ts +8 -8
  44. package/dist/core/spec-paths.d.ts.map +1 -1
  45. package/dist/core/spec-paths.js +14 -9
  46. package/dist/core/spec-paths.js.map +1 -1
  47. package/dist/core/streaming-analyzer.d.ts.map +1 -1
  48. package/dist/core/streaming-analyzer.js +22 -19
  49. package/dist/core/streaming-analyzer.js.map +1 -1
  50. package/dist/core/verify-engine.d.ts +7 -0
  51. package/dist/core/verify-engine.d.ts.map +1 -1
  52. package/dist/core/verify-engine.js +57 -0
  53. package/dist/core/verify-engine.js.map +1 -1
  54. package/package.json +1 -1
@@ -1277,6 +1277,8 @@ ${apiDesc}
1277
1277
  // ── 4. 子任务目录(按任务类型差异化) ──
1278
1278
  // 预加载执行产出模板材料(每个子任务都需要)
1279
1279
  const testMaterial = extractRelevantSection(specContents['TEST.md'] || '', section.name);
1280
+ const reviewMaterial = extractRelevantSection(specContents['REVIEW.md'] || '', section.name);
1281
+ const deployMaterial = extractRelevantSection(specContents['DEPLOY.md'] || '', section.name);
1280
1282
  const riskMaterial = extractRelevantSection(specContents['RISK.md'] || '', section.name);
1281
1283
  const depsMaterial = extractRelevantSection(specContents['DEPS.md'] || '', section.name);
1282
1284
  const monitorMaterial = extractRelevantSection(specContents['MONITOR.md'] || '', section.name);
@@ -1323,6 +1325,9 @@ ${section.content}
1323
1325
  // 功能单元标识(v6.49.2+):默认取 section 的 functionalUnit 或 section.name
1324
1326
  const featureName = section.functionalUnit || section.name || '未分类';
1325
1327
  await (0, fs_extra_1.writeFile)((0, path_1.join)(subtaskDir, '.meta', 'feature'), featureName);
1328
+ // src/ + tests/ 目录(AI 执行时代码输出位置)
1329
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(subtaskDir, 'src'));
1330
+ await (0, fs_extra_1.ensureDir)((0, path_1.join)(subtaskDir, 'tests'));
1326
1331
  // git-config
1327
1332
  await (0, fs_extra_1.writeFile)((0, path_1.join)(subtaskDir, '.meta', 'git-config'), `# 子任务级 Git 配置(${platformLabel})
1328
1333
  # 以下配置覆盖迭代级 PROJECT_GRAPH.md,未配置项自动继承上一级。
@@ -1380,13 +1385,23 @@ ${section.content}
1380
1385
 
1381
1386
  ### 第二阶段:技术方案
1382
1387
  - [ ] 阅读 00-specs/TECH.md 确认技术方案
1383
- - [ ] 确认本端涉及的接口/页面清单
1384
- - [ ] 确认数据模型和字段映射
1388
+ ${isBk ? `- [ ] 设计本端负责的接口(路径/方法/参数/响应/错误码)
1389
+ - [ ] 设计数据模型(Entity/DTO/VO/表结构)
1390
+ - [ ] 设计业务逻辑流程和边界条件` : `- [ ] 设计本端负责的页面(路由/组件/状态)
1391
+ - [ ] 确认 API 调用链(调哪些后端接口)
1392
+ - [ ] 设计字段映射和表单校验规则`}
1385
1393
 
1386
1394
  ### 第三阶段:开发实施
1387
- - [ ] TECH.md 实施开发
1388
- - [ ] 编写单元测试/集成测试
1389
- - [ ] 自测通过
1395
+ ${isBk ? `- [ ] 实现 Controller/Handler 层(接口入口)
1396
+ - [ ] 实现 Service/UseCase 层(业务逻辑)
1397
+ - [ ] 实现 Repository/Data 层(数据访问)
1398
+ - [ ] 实现单元测试(覆盖核心逻辑和边界条件)
1399
+ - [ ] 自测通过(接口通、数据对、边界覆盖)` : `- [ ] 实现页面组件和路由配置
1400
+ - [ ] 实现状态管理(全局状态 + 本地状态)
1401
+ - [ ] 实现 API 调用封装(请求/错误处理/重试)
1402
+ - [ ] 实现表单校验和字段映射
1403
+ - [ ] 实现 UI 测试(关键流程覆盖)
1404
+ - [ ] 自测通过(页面渲染、交互响应、API 连通)`}
1390
1405
 
1391
1406
  ### 第四阶段:验收交付
1392
1407
  - [ ] 更新 TASK.md 进度
@@ -1397,12 +1412,16 @@ ${section.content}
1397
1412
  ${isBk ? apiList : pageList}
1398
1413
 
1399
1414
  ## 产出物
1400
- | 产出物 | 状态 | 路径 |
1401
- | :--- | :--- | :--- |
1402
- | TASK.md | ✅ | ./TASK.md |
1403
- | TEST.md | ⏳ | ./TEST.md |
1404
- | RISK.md | ⏳ | ./RISK.md |
1405
- | 代码 | ⏳ | CONSTITUTION.md 中定义的工程路径 |
1415
+ | 产出物 | 状态 | 路径 | 说明 |
1416
+ | :--- | :--- | :--- | :--- |
1417
+ | TASK.md | ✅ | ./TASK.md | 本文件 |
1418
+ | TEST.md | ⏳ | ./TEST.md | ${isBk ? '单元测试 + 接口测试' : 'UI 测试 + 组件测试'} |
1419
+ | RISK.md | ⏳ | ./RISK.md | 风险评估 |
1420
+ | REVIEW.md | ⏳ | ./REVIEW.md | 评审清单 |
1421
+ | DEPLOY.md | ⏳ | ./DEPLOY.md | 部署检查 |
1422
+ | ERROR_CODES.md | ⏳ | ./ERROR_CODES.md | 错误码定义 |
1423
+ | src/ | ⏳ | ./src/ | ${isBk ? '后端代码(Controller/Service/Repository/Entity)' : '前端代码(页面/组件/状态/API)'} |
1424
+ | tests/ | ⏳ | ./tests/ | ${isBk ? '单元测试代码' : 'UI/组件测试代码'} |
1406
1425
 
1407
1426
  > 💡 代码输出位置:execute 命令会读取 CONSTITUTION.md 中的「源码路径」列,将代码写入实际工程目录。
1408
1427
 
@@ -1421,8 +1440,8 @@ ${isBk ? apiList : pageList}
1421
1440
  }
1422
1441
  // 执行产出文档
1423
1442
  await (0, fs_extra_1.writeFile)((0, path_1.join)(subtaskDir, 'TEST.md'), generateTestOutline(section, testMaterial));
1424
- await (0, fs_extra_1.writeFile)((0, path_1.join)(subtaskDir, 'REVIEW.md'), generateReviewChecklist(section));
1425
- await (0, fs_extra_1.writeFile)((0, path_1.join)(subtaskDir, 'DEPLOY.md'), generateDeployChecklist(section));
1443
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(subtaskDir, 'REVIEW.md'), generateReviewChecklist(section, reviewMaterial));
1444
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(subtaskDir, 'DEPLOY.md'), generateDeployChecklist(section, deployMaterial));
1426
1445
  await (0, fs_extra_1.writeFile)((0, path_1.join)(subtaskDir, 'ERROR_CODES.md'), generateErrorCodes(section));
1427
1446
  await (0, fs_extra_1.writeFile)((0, path_1.join)(subtaskDir, 'RISK.md'), generateRiskTemplate(section, riskMaterial));
1428
1447
  await (0, fs_extra_1.writeFile)((0, path_1.join)(subtaskDir, 'DEPS.md'), generateDepsTemplate(section, depsMaterial));
@@ -1482,8 +1501,8 @@ ${isBk ? apiList : pageList}
1482
1501
  `);
1483
1502
  // 自动补充的后端也需要执行产出文档
1484
1503
  await (0, fs_extra_1.writeFile)((0, path_1.join)(autoSubtaskDir, 'TEST.md'), generateTestOutline(section, testMaterial));
1485
- await (0, fs_extra_1.writeFile)((0, path_1.join)(autoSubtaskDir, 'REVIEW.md'), generateReviewChecklist(section));
1486
- await (0, fs_extra_1.writeFile)((0, path_1.join)(autoSubtaskDir, 'DEPLOY.md'), generateDeployChecklist(section));
1504
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(autoSubtaskDir, 'REVIEW.md'), generateReviewChecklist(section, reviewMaterial));
1505
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(autoSubtaskDir, 'DEPLOY.md'), generateDeployChecklist(section, deployMaterial));
1487
1506
  await (0, fs_extra_1.writeFile)((0, path_1.join)(autoSubtaskDir, 'ERROR_CODES.md'), generateErrorCodes(section));
1488
1507
  await (0, fs_extra_1.writeFile)((0, path_1.join)(autoSubtaskDir, 'RISK.md'), generateRiskTemplate(section, riskMaterial));
1489
1508
  await (0, fs_extra_1.writeFile)((0, path_1.join)(autoSubtaskDir, 'DEPS.md'), generateDepsTemplate(section, depsMaterial));
@@ -1590,7 +1609,8 @@ async function updateProjectGraph(iterationDir, sections) {
1590
1609
  * 根据需求内容自动生成测试用例框架
1591
1610
  */
1592
1611
  function generateTestOutline(section, material) {
1593
- if (material && material.trim().length > 30) {
1612
+ // v6.79.0+: 降低阈值,让更多 analyze 内容被使用
1613
+ if (material && material.trim().length > 10) {
1594
1614
  return `# ${section.name} — 测试用例\n\n> 来源: analyze → TEST.md(自动提取)\n\n${material.trim()}\n`;
1595
1615
  }
1596
1616
  const name = section.name;
@@ -1598,10 +1618,20 @@ function generateTestOutline(section, material) {
1598
1618
  const isBackend = section.platform?.startsWith('后台') || false;
1599
1619
  const hasApi = content.includes('/api/') || content.includes('接口');
1600
1620
  const hasDb = content.includes('数据表') || content.includes('数据库') || content.includes('表');
1621
+ // v6.79.0+: 从 content 提取 API 表格生成针对性测试用例
1622
+ const apiRows = extractApiRowsFromContent(content);
1601
1623
  let outline = `# ${name} — 测试用例\n\n`;
1602
1624
  outline += `> 自动生成于 split,请在编码后补充具体用例\n\n`;
1603
1625
  outline += `## 1. 单元测试\n\n`;
1604
- if (isBackend && hasApi) {
1626
+ if (isBackend && hasApi && apiRows.length > 0) {
1627
+ outline += `| 用例 | 接口 | 输入 | 预期 | 状态 |\n`;
1628
+ outline += `| :--- | :--- | :--- | :--- | :--- |\n`;
1629
+ for (const row of apiRows.slice(0, 6)) {
1630
+ outline += `| ${row.method} ${row.path} | ${row.path} | 正常参数 | 200 | ⬜ |\n`;
1631
+ outline += `| ${row.method} ${row.path} 异常 | ${row.path} | 非法参数 | 400/500 | ⬜ |\n`;
1632
+ }
1633
+ }
1634
+ else if (isBackend && hasApi) {
1605
1635
  outline += `| 用例 | 接口 | 输入 | 预期 | 状态 |\n`;
1606
1636
  outline += `| :--- | :--- | :--- | :--- | :--- |\n`;
1607
1637
  outline += `| 正常请求 | | | 200 | ⬜ |\n`;
@@ -1635,10 +1665,25 @@ function generateTestOutline(section, material) {
1635
1665
  outline += `\n> ⬜ 待编写 | ✅ 通过 | ❌ 失败 | ➖ 不适用\n`;
1636
1666
  return outline;
1637
1667
  }
1668
+ /** v6.79.0+: 从任务内容中提取 API 表格行 */
1669
+ function extractApiRowsFromContent(content) {
1670
+ const rows = [];
1671
+ const lines = content.split('\n');
1672
+ for (const line of lines) {
1673
+ const m = line.match(/\|\s*(GET|POST|PUT|DELETE|PATCH)\s*\|\s*([^|]+)\|/i);
1674
+ if (m) {
1675
+ rows.push({ method: m[1].toUpperCase(), path: m[2].trim(), desc: '' });
1676
+ }
1677
+ }
1678
+ return rows;
1679
+ }
1638
1680
  /**
1639
1681
  * 根据需求内容自动生成代码审查清单
1640
1682
  */
1641
- function generateReviewChecklist(section) {
1683
+ function generateReviewChecklist(section, material) {
1684
+ if (material && material.trim().length > 10) {
1685
+ return `# ${section.name} — Code Review Checklist\n\n> 来源: analyze → REVIEW.md(自动提取)\n\n${material.trim()}\n`;
1686
+ }
1642
1687
  const name = section.name;
1643
1688
  const content = section.content || '';
1644
1689
  const hasApi = content.includes('/api/') || content.includes('接口');
@@ -1876,7 +1921,10 @@ function generateSchemaTemplate(section, material) {
1876
1921
  \`\`\`
1877
1922
  `;
1878
1923
  }
1879
- function generateDeployChecklist(section) {
1924
+ function generateDeployChecklist(section, material) {
1925
+ if (material && material.trim().length > 10) {
1926
+ return `# ${section.name} — 部署检查清单\n\n> 来源: analyze → DEPLOY.md(自动提取)\n\n${material.trim()}\n`;
1927
+ }
1880
1928
  const name = section.name;
1881
1929
  const hasDb = section.content.match(/数据库|数据表|DDL|ALTER/) !== null;
1882
1930
  return `# ${name} — Deployment Checklist
@@ -2483,9 +2531,9 @@ function buildSplitPrompt(iteration, constitutionContent, reqContent, specConten
2483
2531
  p += `- 但仍需检查隐含跨端依赖(如 admin 页面需要 backend 提供新接口)\n`;
2484
2532
  p += `- 如有隐含依赖,在 dependencies 中标注,或在 scope 中加入对应端\n\n`;
2485
2533
  p += `**判断流程**:\n`;
2486
- p += `1. 读 global/REQUIREMENT.md 的功能模块清单 → 查看「涉及端」列\n`;
2487
- p += `2. 读 global/ANALYSIS.md → 确认跨端关联和数据流向\n`;
2488
- p += `3. 读 global/TECH.md → 了解整体架构中的端交互\n`;
2534
+ p += `1. 读 overview/REQUIREMENT.md 的功能模块清单 → 查看「涉及端」列\n`;
2535
+ p += `2. 读 overview/ANALYSIS.md → 确认跨端关联和数据流向\n`;
2536
+ p += `3. 读 overview/TECH.md → 了解整体架构中的端交互\n`;
2489
2537
  p += `4. 对每个功能模块判定聚合度,决定拆分策略\n\n`;
2490
2538
  // 类型文档 1:1 映射规则
2491
2539
  p += `### 类型文档拆分规则(bugs/refactors/research)\n`;
@@ -2541,12 +2589,12 @@ function buildSplitPrompt(iteration, constitutionContent, reqContent, specConten
2541
2589
  p += `> **reqContent 质量要求(必填,禁止模板化)**:\n`;
2542
2590
  p += `> - 必须是**具体的、可执行的需求描述**,不是"待补充"或"参考全局文档"\n`;
2543
2591
  p += `> - 包含:业务规则(含边界条件)、数据模型(字段/类型/约束)、接口清单(方法/路径/参数/响应)\n`;
2544
- p += `> - 从 020-specs/global/REQUIREMENT.md 和对应端 TECH.md 中提取本任务相关的具体内容\n`;
2592
+ p += `> - 从 020-specs/overview/REQUIREMENT.md 和对应端 TECH.md 中提取本任务相关的具体内容\n`;
2545
2593
  p += `> - 直接写入 00-specs/REQ.md,执行时 AI 不再重新分析需求\n`;
2546
2594
  p += `> **techContent 质量要求(必填,禁止模板化)**:\n`;
2547
2595
  p += `> - 必须是**具体的技术实现方案**,不是框架模板\n`;
2548
2596
  p += `> - 包含:架构设计、核心逻辑伪代码/流程、数据库设计(表结构/索引)、API 详细定义、测试策略\n`;
2549
- p += `> - 从 020-specs/global/TECH.md 和对应端 TECH.md 中提取本任务相关的技术细节\n`;
2597
+ p += `> - 从 020-specs/overview/TECH.md 和对应端 TECH.md 中提取本任务相关的技术细节\n`;
2550
2598
  p += `> - 直接写入 00-specs/TECH.md,执行时 AI 据此直接开发\n`;
2551
2599
  p += `> **质量红线**:如果 reqContent/techContent 只有标题和占位符(如 "<!-- AI-FILL -->"),视为不合格,必须重新生成\n\n`;
2552
2600
  p += `### ⚠️ 拆分规则(重要)\n\n`;
@@ -2841,9 +2889,9 @@ speccore analyze --task ${taskId}${iterFlag}
2841
2889
  process.stdout.write(md);
2842
2890
  process.stdout.write('\n[/SPECCORE_NEXT_STEPS]\n');
2843
2891
  }
2844
- // ── v6.49.14+: 模块驱动拆分 — 从 global/REQUIREMENT.md 读取涉及端 ──
2892
+ // ── v6.49.14+: 模块驱动拆分 — 从 overview/REQUIREMENT.md 读取涉及端 ──
2845
2893
  /**
2846
- * 从 global/REQUIREMENT.md 解析功能模块清单的「涉及端」列
2894
+ * 从 overview/REQUIREMENT.md 解析功能模块清单的「涉及端」列
2847
2895
  * 返回模块列表及其涉及的标准端名
2848
2896
  */
2849
2897
  function parseModulePlatforms(content, allPlatforms) {
@@ -2987,7 +3035,7 @@ async function tryModuleDrivenSplit(iteration, iterationDir, options) {
2987
3035
  const allPlatforms = await detectPlatforms(iterationDir);
2988
3036
  // 收集功能模块(含涉及端信息)
2989
3037
  const modules = [];
2990
- // v6.70.0+: 1. 优先从 global/FUNCTION_MAP.md 读取跨端功能映射表
3038
+ // v6.70.0+: 1. 优先从 overview/FUNCTION_MAP.md 读取跨端功能映射表
2991
3039
  const functionMapPath = (0, path_1.join)(iterationDir, '020-specs', spec_paths_1.GLOBAL_SPECS_DIR, 'FUNCTION_MAP.md');
2992
3040
  let functionMapParsed = false;
2993
3041
  if (await (0, fs_extra_1.pathExists)(functionMapPath)) {
@@ -3000,7 +3048,7 @@ async function tryModuleDrivenSplit(iteration, iterationDir, options) {
3000
3048
  name: u.name,
3001
3049
  slug: slugify(u.name),
3002
3050
  type: 'feature',
3003
- sourceFile: 'global/FUNCTION_MAP.md',
3051
+ sourceFile: 'overview/FUNCTION_MAP.md',
3004
3052
  platforms: u.platforms,
3005
3053
  sharedCapability: u.sharedCapability,
3006
3054
  dependsOn: u.dependsOn,
@@ -3008,14 +3056,14 @@ async function tryModuleDrivenSplit(iteration, iterationDir, options) {
3008
3056
  });
3009
3057
  }
3010
3058
  functionMapParsed = true;
3011
- logger_1.logger.info(` 📋 从 global/FUNCTION_MAP.md 读取到 ${parsed.length} 个功能单元(严格按映射表拆分)`);
3059
+ logger_1.logger.info(` 📋 从 overview/FUNCTION_MAP.md 读取到 ${parsed.length} 个功能单元(严格按映射表拆分)`);
3012
3060
  }
3013
3061
  }
3014
3062
  catch (e) {
3015
3063
  logger_1.logger.debug('解析 FUNCTION_MAP.md 失败:', e);
3016
3064
  }
3017
3065
  }
3018
- // 2. 回退:从 global/REQUIREMENT.md 读取功能模块清单(含涉及端)
3066
+ // 2. 回退:从 overview/REQUIREMENT.md 读取功能模块清单(含涉及端)
3019
3067
  if (!functionMapParsed) {
3020
3068
  const globalReqPath = (0, path_1.join)(iterationDir, '020-specs', spec_paths_1.GLOBAL_SPECS_DIR, 'REQUIREMENT.md');
3021
3069
  let modulePlatformsParsed = false;
@@ -3029,12 +3077,12 @@ async function tryModuleDrivenSplit(iteration, iterationDir, options) {
3029
3077
  name: m.name,
3030
3078
  slug: slugify(m.name),
3031
3079
  type: 'feature',
3032
- sourceFile: 'global/REQUIREMENT.md',
3080
+ sourceFile: 'overview/REQUIREMENT.md',
3033
3081
  platforms: m.platforms,
3034
3082
  });
3035
3083
  }
3036
3084
  modulePlatformsParsed = true;
3037
- logger_1.logger.info(` 📋 从 global/REQUIREMENT.md 读取到 ${parsed.length} 个功能模块(含涉及端)`);
3085
+ logger_1.logger.info(` 📋 从 overview/REQUIREMENT.md 读取到 ${parsed.length} 个功能模块(含涉及端)`);
3038
3086
  }
3039
3087
  }
3040
3088
  catch { }
@@ -3201,9 +3249,9 @@ function buildContentFillingPrompt(iteration, iterationDir, sections, allPlatfor
3201
3249
  p += `你的任务是为每个子任务填充 REQ.md 和 TECH.md。\n\n`;
3202
3250
  p += `## 上下文\n\n`;
3203
3251
  p += `1. Read .speccore/CONSTITUTION.md — 项目配置\n`;
3204
- p += `2. Read 020-specs/global/REQUIREMENT.md — 全局需求规格\n`;
3205
- p += `3. Read 020-specs/global/ANALYSIS.md — 全局分析报告\n`;
3206
- p += `4. Read 020-specs/global/TECH.md — 整体技术架构\n`;
3252
+ p += `2. Read 020-specs/overview/REQUIREMENT.md — 迭代综合需求规格\n`;
3253
+ p += `3. Read 020-specs/overview/ANALYSIS.md — 迭代综合分析报告\n`;
3254
+ p += `4. Read 020-specs/overview/TECH.md — 迭代综合技术架构\n`;
3207
3255
  p += `5. Read 020-specs/{端}/TECH.md — 各端专属技术方案\n\n`;
3208
3256
  p += `## 任务清单\n\n`;
3209
3257
  for (const sec of sections) {