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.
- package/dist/cli.js +1 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze.d.ts +1 -0
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +251 -59
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/audit.js +5 -5
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +47 -104
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/iteration/split.js +83 -35
- package/dist/commands/iteration/split.js.map +1 -1
- package/dist/core/ai-context-generator.js +1 -1
- package/dist/core/ai-context-generator.js.map +1 -1
- package/dist/core/analyze-context-guard.js +5 -5
- package/dist/core/analyze-context-guard.js.map +1 -1
- package/dist/core/ask-engine.d.ts.map +1 -1
- package/dist/core/ask-engine.js +12 -3
- package/dist/core/ask-engine.js.map +1 -1
- package/dist/core/incremental-analyzer.js +6 -6
- package/dist/core/incremental-analyzer.js.map +1 -1
- package/dist/core/intent-recognition.d.ts.map +1 -1
- package/dist/core/intent-recognition.js +8 -0
- package/dist/core/intent-recognition.js.map +1 -1
- package/dist/core/module-analyzer.js +15 -15
- package/dist/core/module-analyzer.js.map +1 -1
- package/dist/core/next-steps.js +1 -1
- package/dist/core/next-steps.js.map +1 -1
- package/dist/core/pipeline-engine.d.ts +2 -0
- package/dist/core/pipeline-engine.d.ts.map +1 -1
- package/dist/core/pipeline-engine.js +20 -0
- package/dist/core/pipeline-engine.js.map +1 -1
- package/dist/core/platform-addition.js +6 -6
- package/dist/core/platform-addition.js.map +1 -1
- package/dist/core/prompt-builder.d.ts.map +1 -1
- package/dist/core/prompt-builder.js +48 -6
- package/dist/core/prompt-builder.js.map +1 -1
- package/dist/core/requirement-clarifier.d.ts +32 -1
- package/dist/core/requirement-clarifier.d.ts.map +1 -1
- package/dist/core/requirement-clarifier.js +284 -1
- package/dist/core/requirement-clarifier.js.map +1 -1
- package/dist/core/spec-paths.d.ts +8 -8
- package/dist/core/spec-paths.d.ts.map +1 -1
- package/dist/core/spec-paths.js +14 -9
- package/dist/core/spec-paths.js.map +1 -1
- package/dist/core/streaming-analyzer.d.ts.map +1 -1
- package/dist/core/streaming-analyzer.js +22 -19
- package/dist/core/streaming-analyzer.js.map +1 -1
- package/dist/core/verify-engine.d.ts +7 -0
- package/dist/core/verify-engine.d.ts.map +1 -1
- package/dist/core/verify-engine.js +57 -0
- package/dist/core/verify-engine.js.map +1 -1
- 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
|
-
|
|
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
|
-
|
|
|
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
|
-
|
|
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. 读
|
|
2487
|
-
p += `2. 读
|
|
2488
|
-
p += `3. 读
|
|
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/
|
|
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/
|
|
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+: 模块驱动拆分 — 从
|
|
2892
|
+
// ── v6.49.14+: 模块驱动拆分 — 从 overview/REQUIREMENT.md 读取涉及端 ──
|
|
2845
2893
|
/**
|
|
2846
|
-
* 从
|
|
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. 优先从
|
|
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: '
|
|
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(` 📋 从
|
|
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. 回退:从
|
|
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: '
|
|
3080
|
+
sourceFile: 'overview/REQUIREMENT.md',
|
|
3033
3081
|
platforms: m.platforms,
|
|
3034
3082
|
});
|
|
3035
3083
|
}
|
|
3036
3084
|
modulePlatformsParsed = true;
|
|
3037
|
-
logger_1.logger.info(` 📋 从
|
|
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/
|
|
3205
|
-
p += `3. Read 020-specs/
|
|
3206
|
-
p += `4. Read 020-specs/
|
|
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) {
|