speccore 8.3.180 → 8.3.181

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.
@@ -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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"}
@@ -1181,17 +1181,24 @@ ${singlePrompt}`);
1181
1181
  // 不阻止,但输出强烈警告(输出警告)
1182
1182
  }
1183
1183
  // v8.3.0+: 解析 [CLARIFY:xxx] 标记 — 需求澄清是强制前置步骤
1184
+ // v8.3.181+: 支持两级澄清路径(overview/CLARIFY.md 和 {feature}/overview/CLARIFY.md)
1184
1185
  const clarifyBlocks = parseClarifyMarkers(options.apply);
1185
1186
  if (clarifyBlocks.size > 0 && !isGlobalScope) {
1186
- logger_1.logger.info(`📋 检测到 ${clarifyBlocks.size} 个澄清文档,先写入黄金需求目录...`);
1187
- const goldenDir = (0, path_1.join)(iterDir, '020-specs', 'requirements');
1188
- await (0, fs_extra_1.ensureDir)(goldenDir);
1187
+ logger_1.logger.info(`📋 检测到 ${clarifyBlocks.size} 个澄清文档,先写入...`);
1189
1188
  for (const [filename, content] of clarifyBlocks) {
1190
1189
  const { parseClarifiedRequirement, buildClarifiedHeader } = await Promise.resolve().then(() => __importStar(require('../core/requirement-clarifier')));
1191
1190
  const { content: cleaned } = parseClarifiedRequirement(content);
1192
1191
  const header = buildClarifiedHeader(filename);
1193
1192
  const finalContent = header + cleaned;
1194
- const fp = (0, path_1.join)(goldenDir, (0, path_1.basename)(filename));
1193
+ // 解析写入路径:支持新格式(overview/、{feature}/overview/)和旧格式(requirements/)
1194
+ let fp;
1195
+ if (filename.includes('/') || filename.includes('\\')) {
1196
+ fp = (0, path_1.join)(iterDir, '020-specs', filename);
1197
+ }
1198
+ else {
1199
+ // 兼容旧格式:无路径前缀的文件名写入 requirements/
1200
+ fp = (0, path_1.join)(iterDir, '020-specs', 'requirements', filename);
1201
+ }
1195
1202
  await (0, fs_extra_1.ensureDir)((0, path_1.dirname)(fp));
1196
1203
  await (0, fs_extra_1.writeFile)(fp, finalContent);
1197
1204
  logger_1.logger.info(` ✅ 澄清文档已写入: ${(0, path_1.relative)(_projectRoot, fp)}`);
@@ -1200,8 +1207,8 @@ ${singlePrompt}`);
1200
1207
  }
1201
1208
  // v8.3.0+: 需求澄清验证 — 如果需求质量不足但未澄清,拒绝写入
1202
1209
  if (!isGlobalScope && !isTaskLevel && !options.skipClarify) {
1203
- const goldenDir = (0, path_1.join)(iterDir, '020-specs', 'requirements');
1204
- const hasClarifiedDocs = await (0, fs_extra_1.pathExists)(goldenDir) && (await (0, fs_extra_2.readdir)(goldenDir)).some((f) => f.endsWith('.md'));
1210
+ const { hasValidClarifiedDocs } = await Promise.resolve().then(() => __importStar(require('../core/requirement-clarifier')));
1211
+ const hasClarifiedDocs = await hasValidClarifiedDocs(iterDir);
1205
1212
  if (!hasClarifiedDocs && clarifyBlocks.size === 0) {
1206
1213
  // 重新检测需求质量
1207
1214
  const { detectProfessionalLevel } = await Promise.resolve().then(() => __importStar(require('../core/requirement-clarifier')));
@@ -1228,7 +1235,7 @@ ${singlePrompt}`);
1228
1235
  logger_1.logger.error(` ${lowQualityCount} 个需求文档质量不足,必须先澄清为 PRD`);
1229
1236
  logger_1.logger.info('');
1230
1237
  logger_1.logger.info('解决方式:');
1231
- logger_1.logger.info(' 1. 在 AI 输出中先包含 [CLARIFY:requirements/xxx.md] 标记的澄清文档');
1238
+ logger_1.logger.info(' 1. 在 AI 输出中先包含 [CLARIFY:{feature}/overview/CLARIFY.md] 标记的澄清文档');
1232
1239
  logger_1.logger.info(' 2. 或先手动运行: speccore clarify --from "<需求文件>" --to ' + options.iteration + ' --prompt');
1233
1240
  logger_1.logger.info('');
1234
1241
  logger_1.logger.info(' 如需跳过澄清(不推荐):');
@@ -4774,9 +4781,9 @@ sequenceDiagram
4774
4781
  prompt += `**Step 1**: 读取上述每个需求文档的原始内容\n`;
4775
4782
  prompt += `**Step 2**: 将口语化/非专业描述整理为 PRD 级专业文档\n`;
4776
4783
  prompt += `**Step 3**: 补充:验收标准(AC)、功能边界、业务规则、异常处理、数据模型\n`;
4777
- prompt += `**Step 4**: 输出澄清后的文档,使用以下标记格式:\n`;
4784
+ prompt += `**Step 4**: 输出澄清后的文档,使用以下标记格式(v8.3.181+ 推荐新路径):\n`;
4778
4785
  prompt += `\`\`\`
4779
- [CLARIFY:requirements/{feature-name}-clarified.md]
4786
+ [CLARIFY:{feature-name}/overview/CLARIFY.md]
4780
4787
  ---
4781
4788
  source: "原始文档路径"
4782
4789
  clarified-at: "${now}"
@@ -4804,11 +4811,11 @@ status: "clarified"
4804
4811
  ...
4805
4812
  \`\`\`
4806
4813
  `;
4807
- prompt += `**Step 5**: 用 Read 工具验证文件已正确写入 \`{迭代}/020-specs/requirements/{feature-name}-clarified.md\`\n`;
4814
+ prompt += `**Step 5**: 用 Read 工具验证文件已正确写入 \`{迭代}/020-specs/{feature-name}/overview/CLARIFY.md\`\n`;
4808
4815
  prompt += `**Step 6**: 基于澄清后的需求继续 Phase 1 分析\n\n`;
4809
4816
  prompt += `### ⚠️ 重要提醒\n\n`;
4810
4817
  prompt += `- **如果输出中没有 [CLARIFY:xxx] 标记的澄清文档,--apply 阶段将拒绝写入所有分析结果**\n`;
4811
- prompt += `- CLI 会在接收 --apply 时先解析 [CLARIFY:xxx] 标记,写入 020-specs/requirements/,然后才处理 [DOC:xxx] 标记\n`;
4818
+ prompt += `- CLI 会在接收 --apply 时先解析 [CLARIFY:xxx] 标记,写入 020-specs/{feature}/overview/CLARIFY.md(模块)或 020-specs/overview/CLARIFY.md(全局),然后才处理 [DOC:xxx] 标记\n`;
4812
4819
  prompt += `- 不要跳过此步骤,不要假设需求已经够清晰\n`;
4813
4820
  prompt += `- 如果原始描述不完整,在澄清文档中标注「待补充」而不是自行编造\n\n`;
4814
4821
  prompt += `---\n\n`;
@@ -4935,15 +4942,39 @@ status: "clarified"
4935
4942
  const iterDirForCtx = await (0, context_1.getIterationDir)(iter);
4936
4943
  if (iterDirForCtx) {
4937
4944
  // v8.3.160+: 路径引用模式 — 列出文档清单,让 AI 按需 Read
4945
+ // v8.3.181+: 优先加载两级澄清文档(全局 + 模块),其次兼容旧路径
4938
4946
  const docList = [];
4939
- const goldenReqDir = (0, path_1.join)(iterDirForCtx, '020-specs', 'requirements');
4947
+ const specsDir = (0, path_1.join)(iterDirForCtx, '020-specs');
4948
+ // 1. 全局澄清
4949
+ const globalClarify = (0, path_1.join)(specsDir, 'overview', 'CLARIFY.md');
4950
+ if (await (0, fs_extra_1.pathExists)(globalClarify)) {
4951
+ docList.push('020-specs/overview/CLARIFY.md');
4952
+ }
4953
+ // 2. 模块澄清
4954
+ try {
4955
+ if (await (0, fs_extra_1.pathExists)(specsDir)) {
4956
+ const entries = await (0, fs_extra_2.readdir)(specsDir, { withFileTypes: true });
4957
+ for (const e of entries) {
4958
+ if (e.isDirectory() && e.name !== 'overview') {
4959
+ const moduleClarify = (0, path_1.join)(specsDir, e.name, 'overview', 'CLARIFY.md');
4960
+ if (await (0, fs_extra_1.pathExists)(moduleClarify)) {
4961
+ docList.push(`020-specs/${e.name}/overview/CLARIFY.md`);
4962
+ }
4963
+ }
4964
+ }
4965
+ }
4966
+ }
4967
+ catch { /* 忽略 */ }
4968
+ // 3. 兼容旧路径:020-specs/requirements/
4969
+ const goldenReqDir = (0, path_1.join)(specsDir, 'requirements');
4940
4970
  if (await (0, fs_extra_1.pathExists)(goldenReqDir)) {
4941
4971
  const files = (await Promise.resolve().then(() => __importStar(require('fs-extra')))).readdirSync(goldenReqDir).filter((f) => f.endsWith('.md')).slice(0, 10);
4942
4972
  for (const f of files) {
4943
4973
  docList.push(`020-specs/requirements/${f}`);
4944
4974
  }
4945
4975
  }
4946
- else {
4976
+ // 4. 如果没有澄清文档,回退到原始需求文档
4977
+ if (docList.length === 0) {
4947
4978
  const reqDir = (0, path_1.join)(iterDirForCtx, '010-requirements');
4948
4979
  const prdSources = (0, path_1.join)(reqDir, 'sources');
4949
4980
  const prdConverted = (0, path_1.join)(reqDir, 'converted');
@@ -5909,14 +5940,15 @@ async function buildClarifyPhasePrompt(iteration) {
5909
5940
  prompt += ` - 记录取舍:每轮迭代记录「采纳/拒绝/待确认」的决策\n\n`;
5910
5941
  prompt += `## Step 5: 确认写入\n\n`;
5911
5942
  prompt += `当用户确认 "满意,可以写入" 后:\n\n`;
5912
- prompt += `**必须为每份源文档分别生成独立的澄清文档**,使用 \`[CLARIFY:requirements/文件名-clarified.md]\` 标记分隔:\n\n`;
5943
+ prompt += `**必须为每份源文档分别生成独立的澄清文档**,使用 \`[CLARIFY:{feature-name}/overview/CLARIFY.md]\` 标记分隔:\n\n`;
5944
+ prompt += `> v8.3.181+ 推荐使用新路径。旧格式 \`[CLARIFY:requirements/xxx-clarified.md]\` 仍兼容。\n\n`;
5913
5945
  if (docPaths.length > 1) {
5914
5946
  prompt += `本次共 ${docPaths.length} 份源文档,需要输出 ${docPaths.length} 个 \`[CLARIFY:...]\` 标记块:\n\n`;
5915
5947
  for (const p of docPaths) {
5916
5948
  const name = p.split('/').pop() || '-';
5917
5949
  const baseName = name.replace(/\.md$/, '');
5918
5950
  prompt += `\`\`\`\n`;
5919
- prompt += `[CLARIFY:requirements/${baseName}-clarified.md]\n`;
5951
+ prompt += `[CLARIFY:${baseName}/overview/CLARIFY.md]\n`;
5920
5952
  prompt += `---\n`;
5921
5953
  prompt += `source: "010-requirements/.../${name}"\n`;
5922
5954
  prompt += `clarified-at: "${new Date().toISOString()}"\n`;
@@ -5941,10 +5973,10 @@ async function buildClarifyPhasePrompt(iteration) {
5941
5973
  }
5942
5974
  prompt += `> ⚠️ **禁止合并**:每份源文档必须对应一份独立的 \`-clarified.md\`,即使内容有关联也要分开输出。\n\n`;
5943
5975
  prompt += `同时生成对应的对比报告文件(可选):\n`;
5944
- prompt += `- \`020-specs/requirements/{源文件名}-clarified-diff.md\` — 保存最终对比报告\n\n`;
5976
+ prompt += `- \`020-specs/{源文件名}/overview/CLARIFY-diff.md\` — 保存最终对比报告\n\n`;
5945
5977
  prompt += `使用以下命令写入:\n\n`;
5946
5978
  prompt += `\`\`\`bash\n`;
5947
- prompt += `speccore analyze --apply '{"020-specs/requirements/xxx-clarified.md":"...","020-specs/requirements/xxx-clarified-diff.md":"..."}' -I ${iteration}\n`;
5979
+ prompt += `speccore analyze --apply '{"020-specs/xxx/overview/CLARIFY.md":"...","020-specs/xxx/overview/CLARIFY-diff.md":"..."}' -I ${iteration}\n`;
5948
5980
  prompt += `\`\`\`\n\n`;
5949
5981
  prompt += `> 注意:写入后 CLI 会自动推进到需求确认阶段。\n`;
5950
5982
  return await injectGraphSummary(prompt);