speccore 8.3.158 → 8.3.160

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 (85) hide show
  1. package/README.md +1 -1
  2. package/dist/commands/analyze.d.ts.map +1 -1
  3. package/dist/commands/analyze.js +88 -96
  4. package/dist/commands/analyze.js.map +1 -1
  5. package/dist/commands/ask.d.ts.map +1 -1
  6. package/dist/commands/ask.js +0 -13
  7. package/dist/commands/ask.js.map +1 -1
  8. package/dist/commands/execute.d.ts.map +1 -1
  9. package/dist/commands/execute.js +67 -6
  10. package/dist/commands/execute.js.map +1 -1
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +71 -216
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/commands/iteration/split.d.ts.map +1 -1
  15. package/dist/commands/iteration/split.js +73 -9
  16. package/dist/commands/iteration/split.js.map +1 -1
  17. package/dist/commands/migrate.d.ts.map +1 -1
  18. package/dist/commands/migrate.js +1 -2
  19. package/dist/commands/migrate.js.map +1 -1
  20. package/dist/commands/update.d.ts.map +1 -1
  21. package/dist/commands/update.js +1 -4
  22. package/dist/commands/update.js.map +1 -1
  23. package/dist/core/agent-adapter.d.ts +81 -0
  24. package/dist/core/agent-adapter.d.ts.map +1 -0
  25. package/dist/core/agent-adapter.js +425 -0
  26. package/dist/core/agent-adapter.js.map +1 -0
  27. package/dist/core/agents/defaults/_INDEX.md +15 -15
  28. package/dist/core/agents/defaults/code-reviewer.md +9 -0
  29. package/dist/core/agents/defaults/compiler.md +12 -3
  30. package/dist/core/agents/defaults/dependency-analyst.md +7 -0
  31. package/dist/core/agents/defaults/doc-sync-agent.md +7 -0
  32. package/dist/core/agents/defaults/impact-analyst.md +7 -0
  33. package/dist/core/agents/defaults/interaction-designer.md +17 -0
  34. package/dist/core/agents/defaults/performance-expert.md +9 -0
  35. package/dist/core/agents/defaults/regression-tester.md +7 -0
  36. package/dist/core/agents/defaults/security-reviewer.md +9 -0
  37. package/dist/core/agents/defaults/test-engineer.md +10 -0
  38. package/dist/core/agents/defaults/test-reviewer.md +10 -0
  39. package/dist/core/lock-manager.d.ts.map +1 -1
  40. package/dist/core/lock-manager.js +2 -0
  41. package/dist/core/lock-manager.js.map +1 -1
  42. package/dist/core/pipeline-engine.d.ts +49 -8
  43. package/dist/core/pipeline-engine.d.ts.map +1 -1
  44. package/dist/core/pipeline-engine.js +221 -34
  45. package/dist/core/pipeline-engine.js.map +1 -1
  46. package/dist/core/prompt-builder.d.ts +4 -0
  47. package/dist/core/prompt-builder.d.ts.map +1 -1
  48. package/dist/core/prompt-builder.js +83 -10
  49. package/dist/core/prompt-builder.js.map +1 -1
  50. package/dist/core/rules/defaults/ANALYSIS_QUALITY.md +73 -0
  51. package/dist/core/rules/defaults/EXECUTION.md +20 -0
  52. package/dist/core/rules/defaults/ITERATION_QUALITY.md +49 -0
  53. package/dist/core/rules/defaults/TASK_SPLIT.md +16 -0
  54. package/dist/core/spec-paths.d.ts.map +1 -1
  55. package/dist/core/spec-paths.js +2 -1
  56. package/dist/core/spec-paths.js.map +1 -1
  57. package/package.json +4 -6
  58. package/templates/api-design-example.md +0 -338
  59. package/templates/ci/github-actions.yml +0 -44
  60. package/templates/dashboard.html +0 -425
  61. package/templates/database-example.md +0 -223
  62. package/templates/deploy-docker/README.md +0 -284
  63. package/templates/deploy-docker/deploy-remote.sh +0 -79
  64. package/templates/deploy-docker/docker-compose.yml +0 -113
  65. package/templates/deploy-docker/frontend.Dockerfile +0 -43
  66. package/templates/deploy-docker/nginx.conf +0 -30
  67. package/templates/deploy-examples.yaml +0 -436
  68. package/templates/deploy-java/Dockerfile +0 -50
  69. package/templates/deploy-java/README.md +0 -212
  70. package/templates/deploy-java/deploy.sh +0 -120
  71. package/templates/deploy-java/spring-boot.service +0 -35
  72. package/templates/html/speccore-ask-explain.html +0 -10
  73. package/templates/html/speccore-ask-guide.html +0 -10
  74. package/templates/html/speccore-ask-match.html +0 -10
  75. package/templates/html/speccore-ask-pipeline.html +0 -1
  76. package/templates/html/speccore-ask-result.html +0 -10
  77. package/templates/html/speccore-demo.html +0 -449
  78. package/templates/html/speccore-dev.html +0 -202
  79. package/templates/html/speccore-help.html +0 -1
  80. package/templates/html/speccore-knowledge-graph.html +0 -656
  81. package/templates/html/speccore-retro-T-001.html +0 -1
  82. package/templates/html/speccore-setup-guide.html +0 -289
  83. package/templates/html/speccore-welcome.html +0 -1
  84. package/templates/security-example.md +0 -226
  85. package/templates/verify-spec-example.yaml +0 -982
package/README.md CHANGED
@@ -337,7 +337,7 @@ speccore status # 查看分析进度和过
337
337
 
338
338
  ```bash
339
339
  npm install -g speccore
340
- speccore --version # v8.3.158
340
+ speccore --version # v8.3.95
341
341
  ```
342
342
 
343
343
  ## 命令列表
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"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"}
@@ -850,8 +850,8 @@ async function analyzeCommand(options) {
850
850
  engine = result.engine;
851
851
  steps = result.steps;
852
852
  pipelineKey = iter;
853
- // v6.80.0+: 默认从 clarify 开始,skipClarify 时从 phase1 开始
854
- initStep = options.skipClarify ? 'phase1-prompt' : 'clarify-prompt';
853
+ // v8.3.160+: clarify 拆分为 product → interaction → security 三个子步骤
854
+ initStep = options.skipClarify ? 'phase1-prompt' : 'clarify-product';
855
855
  }
856
856
  // 检查是否有活跃的 Pipeline(恢复模式)
857
857
  const hasActive = await pipeline_engine_1.PipelineEngine.hasActivePipeline(_projectRoot, pipelineKey);
@@ -896,8 +896,8 @@ async function analyzeCommand(options) {
896
896
  }, options);
897
897
  }
898
898
  }
899
- else if (currentStep === 'clarify-prompt') {
900
- // v6.80.0+: Phase 0 需求澄清
899
+ else if (currentStep === 'clarify-product' || currentStep === 'clarify-interaction' || currentStep === 'clarify-security') {
900
+ // v8.3.160+: Phase 0 需求澄清(拆分为 product / interaction / security 三个子步骤)
901
901
  prompt = await buildClarifyPhasePrompt(iter);
902
902
  }
903
903
  else if (currentStep === 'confirm-check') {
@@ -941,22 +941,27 @@ async function analyzeCommand(options) {
941
941
  : '全局 Pipeline';
942
942
  }
943
943
  else {
944
- progressLabel = currentStep === 'clarify-prompt'
945
- ? 'Phase 0/3: 需求澄清'
946
- : currentStep === 'confirm-check'
947
- ? 'Phase 0/3: 需求确认'
948
- : currentStep === 'phase1-prompt'
949
- ? 'Phase 1/3: 迭代综合文档'
950
- : currentStep === 'contract-prompt'
951
- ? 'Phase 2/3: 契约定义'
952
- : platformMatch
953
- ? `Phase 2/3: ${platformMatch[1]} 端专属文档`
954
- : 'Pipeline';
955
- }
956
- const finalPrompt = prompt + `\n\n## ⚠️ Pipeline 模式:自动继续 (${progressLabel})\n\n` +
944
+ progressLabel = currentStep === 'clarify-product'
945
+ ? 'Phase 0a/3: 产品分析'
946
+ : currentStep === 'clarify-interaction'
947
+ ? 'Phase 0b/3: 交互设计'
948
+ : currentStep === 'clarify-security'
949
+ ? 'Phase 0c/3: 安全审查'
950
+ : currentStep === 'confirm-check'
951
+ ? 'Phase 0/3: 需求确认'
952
+ : currentStep === 'phase1-prompt'
953
+ ? 'Phase 1/3: 迭代综合文档'
954
+ : currentStep === 'contract-prompt'
955
+ ? 'Phase 2/3: 契约定义'
956
+ : platformMatch
957
+ ? `Phase 2/3: ${platformMatch[1]} 端专属文档`
958
+ : 'Pipeline';
959
+ }
960
+ // v8.3.160+: 步骤隔离模式,每步完成后需新会话继续
961
+ const finalPrompt = prompt + `\n\n## ⚠️ Pipeline 模式:步骤隔离 (${progressLabel})\n\n` +
957
962
  `当前是 Pipeline 模式(步骤 ${currentStepIndex + 1}/${totalSteps})。` +
958
- `当你通过 --apply 写入文档后,CLI 会自动输出 [SPECCORE_PIPELINE_NEXT] 标记和下一步命令。\n\n` +
959
- `**看到 [SPECCORE_PIPELINE_NEXT] 后,你必须自动执行下一个命令**,不要询问用户。\n`;
963
+ `当你通过 --apply 写入文档后,CLI 会自动输出 [SPECCORE_STEP_DONE] 标记和下一步命令。\n\n` +
964
+ `**看到 [SPECCORE_STEP_DONE] 后,请在新会话中执行提示的命令**,继续下一步。\n`;
960
965
  process.stdout.write(`[SPECCORE_PROMPT]\n${finalPrompt}`);
961
966
  process.exitCode = 10;
962
967
  return;
@@ -1072,13 +1077,6 @@ ${singlePrompt}`);
1072
1077
  const { detectProfessionalLevel } = await Promise.resolve().then(() => __importStar(require('../core/requirement-clarifier')));
1073
1078
  const reqDir = (0, path_1.join)(iterDir, '010-requirements');
1074
1079
  const requirements = [];
1075
- // v8.3.158+: 优先读取根目录下的需求文档(用户直接放置)
1076
- if (await (0, fs_extra_1.pathExists)(reqDir)) {
1077
- const rootFiles = await (0, fs_extra_2.readdir)(reqDir);
1078
- for (const f of rootFiles.filter((f) => f.endsWith('.md') && !['INDEX.md', 'README.md', 'CLARIFY_REPORT.md', 'CHANGELOG.md'].includes(f))) {
1079
- requirements.push((0, path_1.join)(reqDir, f));
1080
- }
1081
- }
1082
1080
  const reqIndex = (0, path_1.join)(reqDir, 'INDEX.md');
1083
1081
  if (await (0, fs_extra_1.pathExists)(reqIndex))
1084
1082
  requirements.push(reqIndex);
@@ -1540,12 +1538,7 @@ ${singlePrompt}`);
1540
1538
  printBackupSummary();
1541
1539
  return;
1542
1540
  }
1543
- catch (e) {
1544
- // v8.3.158+: JSON 解析失败时给出明确警告,避免静默 fallback 导致用户困惑
1545
- logger_1.logger.warn('⚠️ 多文档 JSON 解析失败,回退到单文件模式');
1546
- logger_1.logger.warn(' 原因: AI 输出的 --apply 内容不是合法 JSON 格式');
1547
- logger_1.logger.info(' 建议: 使用 [DOC:filename] 标记格式,或将 JSON 写入文件后用 --apply @file.json');
1548
- logger_1.logger.info(' 当前内容将作为单文件 ANALYSIS.md 写入(内容可能不完整)');
1541
+ catch {
1549
1542
  // fallback to single-file mode
1550
1543
  }
1551
1544
  }
@@ -1917,7 +1910,8 @@ ${singlePrompt}`);
1917
1910
  platformOrder: platformOrder.length > 0 ? platformOrder : undefined,
1918
1911
  })).engine;
1919
1912
  }
1920
- await engine.advance();
1913
+ // v8.3.160+: 默认步骤隔离模式
1914
+ const stepResult = await engine.advance();
1921
1915
  const state = await engine.getState();
1922
1916
  if (state?.currentStep === 'done') {
1923
1917
  logger_1.logger.success('🎉 Pipeline 完成!');
@@ -1954,9 +1948,9 @@ ${singlePrompt}`);
1954
1948
  iteration: options.iteration || 'GLOBAL', scope: 'global', withCode: options.withCode,
1955
1949
  });
1956
1950
  }
1957
- // v6.80.0+: clarify 阶段推进
1951
+ // v8.3.160+: clarify 阶段推进(拆分为 product / interaction / security)
1958
1952
  }
1959
- else if (state.currentStep === 'clarify-prompt') {
1953
+ else if (state.currentStep === 'clarify-product' || state.currentStep === 'clarify-interaction' || state.currentStep === 'clarify-security') {
1960
1954
  nextPrompt = await buildClarifyPhasePrompt(options.iteration);
1961
1955
  }
1962
1956
  else if (state.currentStep === 'confirm-check') {
@@ -1985,7 +1979,31 @@ ${singlePrompt}`);
1985
1979
  iteration: options.iteration,
1986
1980
  });
1987
1981
  }
1988
- process.stdout.write(`[SPECCORE_PIPELINE_NEXT]\n${nextPrompt}`);
1982
+ // v8.3.160+: 步骤隔离模式输出标记 + 子 Agent 激活
1983
+ const scopeFlag = isGlobalScope ? '--scope global' : `-I ${options.iteration}`;
1984
+ const nextCmd = `speccore analyze ${scopeFlag} --resume`;
1985
+ const output = [
1986
+ `[SPECCORE_STEP_DONE]`,
1987
+ `步骤 "${state.currentStep}" 已完成。`,
1988
+ ``,
1989
+ `[SPECCORE_NEXT_STEP]`,
1990
+ `下一步: ${state.currentStep}`,
1991
+ `请在新的对话中执行: ${nextCmd}`,
1992
+ ``,
1993
+ `[SPECCORE_CONTEXT_SNAPSHOT]`,
1994
+ JSON.stringify(stepResult.contextSnapshot || {}),
1995
+ ``,
1996
+ // v8.3.160+: 子 Agent 激活标记
1997
+ ...(stepResult.subagent ? [
1998
+ `[SPECCORE_SUBAGENT: ${stepResult.subagent}]`,
1999
+ `[SPECCORE_CONTEXT_BUDGET: ${stepResult.contextBudget || 12000}]`,
2000
+ `[SPECCORE_CONTEXT_TYPE: ${stepResult.contextType || 'full'}]`,
2001
+ ``,
2002
+ ] : []),
2003
+ `--- 下一步 Prompt ---`,
2004
+ nextPrompt,
2005
+ ].join('\n');
2006
+ process.stdout.write(output);
1989
2007
  process.exitCode = 10;
1990
2008
  }
1991
2009
  return;
@@ -4238,12 +4256,7 @@ sequenceDiagram
4238
4256
  if (iterDir) {
4239
4257
  const specDir = (0, path_1.join)(iterDir, '020-specs');
4240
4258
  const platforms = await (0, spec_paths_1.parsePlatformList)();
4241
- // v8.3.158+: 骨架进度检测必须使用与骨架生成一致的 manifest(功能模块结构)
4242
- const features = await (0, spec_paths_1.parseFeatureList)(iterDir);
4243
- const useFeatureMode = features.length > 0;
4244
- const manifest = useFeatureMode
4245
- ? (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)(features, platforms, undefined, ctx.iteration)
4246
- : (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, undefined, ctx.iteration);
4259
+ const manifest = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, undefined, ctx.iteration);
4247
4260
  perDocStatus = await (0, spec_skeleton_1.detectSkeletonProgress)(specDir, manifest);
4248
4261
  if (perDocStatus.nextUnfilled) {
4249
4262
  const nextDocName = perDocStatus.nextUnfilled.docName;
@@ -4299,47 +4312,41 @@ sequenceDiagram
4299
4312
  if (missingDocs.length > 0) {
4300
4313
  logger_1.logger.warn(`⚠️ DOC_MATRIX 交叉校验发现 ${missingDocs.length} 个全局文档缺失(不在骨架清单中但应该存在): ${missingDocs.join(', ')}`);
4301
4314
  logger_1.logger.info(`🔧 自动补建骨架文件...`);
4302
- // 为缺失文档补建骨架(使用与当前模式一致的 manifest)
4303
- const missingEntries = (useFeatureMode
4304
- ? (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)(features, platforms, '1', ctx.iteration)
4305
- : (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, '1', ctx.iteration)).filter(e => missingDocs.includes(e.docName));
4315
+ // 为缺失文档补建骨架
4316
+ const missingEntries = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, '1', ctx.iteration)
4317
+ .filter(e => missingDocs.includes(e.docName));
4306
4318
  if (missingEntries.length > 0) {
4307
4319
  await (0, spec_skeleton_1.generateSkeleton)(specDir, missingEntries);
4308
4320
  logger_1.logger.info(`✅ 已补建 ${missingEntries.length} 个骨架文件,请继续填充`);
4309
4321
  // 重新检测进度(现在有了新骨架)
4310
- const newManifest = useFeatureMode
4311
- ? (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)(features, platforms, undefined, ctx.iteration)
4312
- : (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, undefined, ctx.iteration);
4322
+ const newManifest = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, undefined, ctx.iteration);
4313
4323
  perDocStatus = await (0, spec_skeleton_1.detectSkeletonProgress)(specDir, newManifest);
4314
4324
  }
4315
4325
  }
4316
4326
  // v8.1.1+: Phase 2 平台文档交叉校验
4317
- // v8.3.158+: 功能模块模式下跳过旧结构交叉校验(平台文档按功能模块组织,不在 020-specs/{端}/ 下)
4318
- if (!useFeatureMode) {
4319
- const expectedPlatformDocs = PLATFORM_DOCS.filter(d => includeDocs.includes(d));
4320
- const missingPlatformDocs = [];
4321
- for (const platform of platforms) {
4322
- for (const doc of expectedPlatformDocs) {
4323
- const docPath = (0, path_1.join)(specDir, platform, doc);
4324
- if (!await (0, fs_extra_1.pathExists)(docPath)) {
4325
- missingPlatformDocs.push(`${platform}/${doc}`);
4326
- }
4327
+ const expectedPlatformDocs = PLATFORM_DOCS.filter(d => includeDocs.includes(d));
4328
+ const missingPlatformDocs = [];
4329
+ for (const platform of platforms) {
4330
+ for (const doc of expectedPlatformDocs) {
4331
+ const docPath = (0, path_1.join)(specDir, platform, doc);
4332
+ if (!await (0, fs_extra_1.pathExists)(docPath)) {
4333
+ missingPlatformDocs.push(`${platform}/${doc}`);
4327
4334
  }
4328
4335
  }
4329
- if (missingPlatformDocs.length > 0) {
4330
- logger_1.logger.warn(`⚠️ DOC_MATRIX 交叉校验发现 ${missingPlatformDocs.length} 个平台文档缺失: ${missingPlatformDocs.slice(0, 5).join(', ')}${missingPlatformDocs.length > 5 ? '...' : ''}`);
4331
- logger_1.logger.info(`🔧 自动补建平台骨架文件...`);
4332
- const missingPlatformEntries = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, '2', ctx.iteration)
4333
- .filter(e => {
4334
- const relName = e.relPath;
4335
- return missingPlatformDocs.some(mp => relName.endsWith(mp) || mp.endsWith(relName));
4336
- });
4337
- if (missingPlatformEntries.length > 0) {
4338
- await (0, spec_skeleton_1.generateSkeleton)(specDir, missingPlatformEntries);
4339
- logger_1.logger.info(`✅ 已补建 ${missingPlatformEntries.length} 个平台骨架文件,请继续填充`);
4340
- const newManifest = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, undefined, ctx.iteration);
4341
- perDocStatus = await (0, spec_skeleton_1.detectSkeletonProgress)(specDir, newManifest);
4342
- }
4336
+ }
4337
+ if (missingPlatformDocs.length > 0) {
4338
+ logger_1.logger.warn(`⚠️ DOC_MATRIX 交叉校验发现 ${missingPlatformDocs.length} 个平台文档缺失: ${missingPlatformDocs.slice(0, 5).join(', ')}${missingPlatformDocs.length > 5 ? '...' : ''}`);
4339
+ logger_1.logger.info(`🔧 自动补建平台骨架文件...`);
4340
+ const missingPlatformEntries = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, '2', ctx.iteration)
4341
+ .filter(e => {
4342
+ const relName = e.relPath; // e.g. "overview/TECH.md" relative to specDir
4343
+ return missingPlatformDocs.some(mp => relName.endsWith(mp) || mp.endsWith(relName));
4344
+ });
4345
+ if (missingPlatformEntries.length > 0) {
4346
+ await (0, spec_skeleton_1.generateSkeleton)(specDir, missingPlatformEntries);
4347
+ logger_1.logger.info(`✅ 已补建 ${missingPlatformEntries.length} 个平台骨架文件,请继续填充`);
4348
+ const newManifest = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, undefined, ctx.iteration);
4349
+ perDocStatus = await (0, spec_skeleton_1.detectSkeletonProgress)(specDir, newManifest);
4343
4350
  }
4344
4351
  }
4345
4352
  }
@@ -4615,19 +4622,6 @@ status: "clarified"
4615
4622
  else {
4616
4623
  // 回退:从 010-requirements/ 读取原始需求
4617
4624
  const reqDir = (0, path_1.join)(iterDirForCtx, '010-requirements');
4618
- // v8.3.158+: 优先读取根目录下的 .md 文件(用户直接放置的需求文档)
4619
- const rootFiles = (await Promise.resolve().then(() => __importStar(require('fs-extra')))).readdirSync(reqDir).filter((f) => f.endsWith('.md') && !['INDEX.md', 'README.md', 'CLARIFY_REPORT.md', 'CHANGELOG.md'].includes(f));
4620
- if (rootFiles.length > 0) {
4621
- for (const f of rootFiles.slice(0, 10)) {
4622
- const filePath = (0, path_1.join)(reqDir, f);
4623
- let content = await (await Promise.resolve().then(() => __importStar(require('fs-extra')))).readFile(filePath, 'utf-8');
4624
- content = await (0, prompt_builder_1.processMarkdownContent)(content, filePath, seenPaths, undefined, {
4625
- maxLinkDepth: 2, maxLinkChars: 1200, maxSvgChars: 1500,
4626
- });
4627
- prdContent += `\n### ${f}\n${content.slice(0, 3000)}\n`;
4628
- }
4629
- }
4630
- // 再读取子目录中的需求文档(兼容旧结构)
4631
4625
  const prdSources = (0, path_1.join)(reqDir, 'sources');
4632
4626
  const prdConverted = (0, path_1.join)(reqDir, 'converted');
4633
4627
  const prdFeatures = (0, path_1.join)(reqDir, 'features');
@@ -4822,13 +4816,12 @@ status: "clarified"
4822
4816
  prompt += ` ⚠️ 如果全局层产物不存在,跳过该项,继续后续分析\n\n`;
4823
4817
  prompt += `3. 读取迭代需求文档(按优先级顺序):\n`;
4824
4818
  prompt += ` a. 先读 010-requirements/INDEX.md — 了解需求全貌和文件清单\n`;
4825
- prompt += ` b. 再读 010-requirements/根目录下的 *.md 文件 — 用户直接放置的核心需求文档(最高优先级)\n`;
4826
- prompt += ` c. 再读 010-requirements/converted/*.md — doc2spec 转换后的核心规格\n`;
4827
- prompt += ` d. 再读 010-requirements/features/*/README.md — 功能级补充需求\n`;
4828
- prompt += ` e. 读取 010-requirements/prototypes/ — 原型文件(HTML/图片/链接均读取)\n`;
4819
+ prompt += ` b. 再读 010-requirements/converted/*.md — doc2spec 转换后的核心规格(主要依据)\n`;
4820
+ prompt += ` c. 再读 010-requirements/features/*/README.md — 功能级补充需求\n`;
4821
+ prompt += ` d. 读取 010-requirements/prototypes/ — 原型文件(HTML/图片/链接均读取)\n`;
4829
4822
  prompt += ` ⚠️ 需求文档中链接到原型的(如 \`![原型](../prototypes/xxx.png)\` 或 \`详见 prototypes/xxx.html\`),必须主动 Read 该原型文件\n`;
4830
- prompt += ` f. 如用户指定了特定文档,优先读取指定文件;如要求全部,再读 sources/ 原始文档\n`;
4831
- prompt += ` g. **文档长度自适应**:如果单个需求文档超过 5000 字,先快速扫描目录和章节标题,标记关键章节,再深入阅读。不要在非关键章节上花费过多 tokens\n`;
4823
+ prompt += ` e. 如用户指定了特定文档,优先读取指定文件;如要求全部,再读 sources/ 原始文档\n`;
4824
+ prompt += ` f. **文档长度自适应**:如果单个需求文档超过 5000 字,先快速扫描目录和章节标题,标记关键章节,再深入阅读。不要在非关键章节上花费过多 tokens\n`;
4832
4825
  prompt += `4. 读懂需求文档后,按专业模板标准自由撰写每个文档(不是填空表)\n`;
4833
4826
  prompt += `5. **文档忠实度约束(最高优先级)**:\n`;
4834
4827
  prompt += ` - **严禁臆造**:只能写需求文档中明确提及的功能、接口、页面、字段、业务规则\n`;
@@ -5464,11 +5457,10 @@ async function buildClarifyPhasePrompt(iteration) {
5464
5457
  prompt += `\n## 读取需求文档\n\n`;
5465
5458
  prompt += `依次读取以下文档(按优先级):\n`;
5466
5459
  prompt += `1. \`010-requirements/INDEX.md\` — 需求全貌\n`;
5467
- prompt += `2. \`010-requirements/根目录下的 *.md 文件\` — 用户直接放置的核心需求文档(最高优先级)\n`;
5460
+ prompt += `2. \`010-requirements/sources/*.md\` — 原始需求(主要依据)\n`;
5468
5461
  prompt += `3. \`010-requirements/converted/*.md\` — 已转换文档\n`;
5469
5462
  prompt += `4. \`010-requirements/features/*/README.md\` — 功能级补充\n`;
5470
- prompt += `5. \`010-requirements/prototypes/\` — 原型文件\n`;
5471
- prompt += `6. \`010-requirements/sources/*.md\` — 原始需求(补充参考)\n\n`;
5463
+ prompt += `5. \`010-requirements/prototypes/\` — 原型文件\n\n`;
5472
5464
  // v8.2.0+: 如果检测到多个功能单元,启用单元化澄清模式
5473
5465
  if (hasMultipleUnits) {
5474
5466
  prompt += `## ⚠️ 功能单元拆分澄清模式(v8.2.0+)\n\n`;
@@ -5641,7 +5633,7 @@ async function buildConfirmCheckPrompt(iteration) {
5641
5633
  prompt += `\`\`\`bash\n`;
5642
5634
  prompt += `speccore analyze --prompt -I ${iteration} --pipeline --skip-clarify=false\n`;
5643
5635
  prompt += `\`\`\`\n`;
5644
- prompt += `> 重新进入 clarify-prompt 阶段,AI 会基于已有 draft 继续迭代。\n\n`;
5636
+ prompt += `> 重新进入 clarify-product 阶段,AI 会基于已有 draft 继续迭代。\n\n`;
5645
5637
  prompt += `**选项 C:跳过确认,直接进入分析(风险自负)**\n`;
5646
5638
  prompt += `\`\`\`bash\n`;
5647
5639
  prompt += `speccore analyze --prompt -I ${iteration} --pipeline --skip-clarify\n`;