speccore 8.3.157 → 8.3.158

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/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.95
340
+ speccore --version # v8.3.158
341
341
  ```
342
342
 
343
343
  ## 命令列表
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"AAoEA,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;IACxC,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAuGD,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAo0D3E;AA2lHD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,eAAe,kCAAkC,CAAC;AAE/D,oBAAoB;AACpB,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAmDrF;AAED,kBAAkB;AAClB,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/F;AAED,iBAAiB;AACjB,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAYjF;AAED,iBAAiB;AACjB,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAI/G;AAED,oCAAoC;AACpC,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,aAAa,EAAE,EACtB,QAAQ,EAAE,YAAY,EAAE,GACvB,OAAO,CAAC,MAAM,CAAC,CAmFjB;AAED,2BAA2B;AAC3B,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,aAAa,EAAE,GACxB,OAAO,CAAC,MAAM,CAAC,CAwEjB"}
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"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"}
@@ -1072,6 +1072,13 @@ ${singlePrompt}`);
1072
1072
  const { detectProfessionalLevel } = await Promise.resolve().then(() => __importStar(require('../core/requirement-clarifier')));
1073
1073
  const reqDir = (0, path_1.join)(iterDir, '010-requirements');
1074
1074
  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
+ }
1075
1082
  const reqIndex = (0, path_1.join)(reqDir, 'INDEX.md');
1076
1083
  if (await (0, fs_extra_1.pathExists)(reqIndex))
1077
1084
  requirements.push(reqIndex);
@@ -1533,7 +1540,12 @@ ${singlePrompt}`);
1533
1540
  printBackupSummary();
1534
1541
  return;
1535
1542
  }
1536
- catch {
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 写入(内容可能不完整)');
1537
1549
  // fallback to single-file mode
1538
1550
  }
1539
1551
  }
@@ -4226,7 +4238,12 @@ sequenceDiagram
4226
4238
  if (iterDir) {
4227
4239
  const specDir = (0, path_1.join)(iterDir, '020-specs');
4228
4240
  const platforms = await (0, spec_paths_1.parsePlatformList)();
4229
- const manifest = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, undefined, ctx.iteration);
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);
4230
4247
  perDocStatus = await (0, spec_skeleton_1.detectSkeletonProgress)(specDir, manifest);
4231
4248
  if (perDocStatus.nextUnfilled) {
4232
4249
  const nextDocName = perDocStatus.nextUnfilled.docName;
@@ -4282,41 +4299,47 @@ sequenceDiagram
4282
4299
  if (missingDocs.length > 0) {
4283
4300
  logger_1.logger.warn(`⚠️ DOC_MATRIX 交叉校验发现 ${missingDocs.length} 个全局文档缺失(不在骨架清单中但应该存在): ${missingDocs.join(', ')}`);
4284
4301
  logger_1.logger.info(`🔧 自动补建骨架文件...`);
4285
- // 为缺失文档补建骨架
4286
- const missingEntries = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, '1', ctx.iteration)
4287
- .filter(e => missingDocs.includes(e.docName));
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));
4288
4306
  if (missingEntries.length > 0) {
4289
4307
  await (0, spec_skeleton_1.generateSkeleton)(specDir, missingEntries);
4290
4308
  logger_1.logger.info(`✅ 已补建 ${missingEntries.length} 个骨架文件,请继续填充`);
4291
4309
  // 重新检测进度(现在有了新骨架)
4292
- const newManifest = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, undefined, ctx.iteration);
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);
4293
4313
  perDocStatus = await (0, spec_skeleton_1.detectSkeletonProgress)(specDir, newManifest);
4294
4314
  }
4295
4315
  }
4296
4316
  // v8.1.1+: Phase 2 平台文档交叉校验
4297
- const expectedPlatformDocs = PLATFORM_DOCS.filter(d => includeDocs.includes(d));
4298
- const missingPlatformDocs = [];
4299
- for (const platform of platforms) {
4300
- for (const doc of expectedPlatformDocs) {
4301
- const docPath = (0, path_1.join)(specDir, platform, doc);
4302
- if (!await (0, fs_extra_1.pathExists)(docPath)) {
4303
- missingPlatformDocs.push(`${platform}/${doc}`);
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
+ }
4304
4327
  }
4305
4328
  }
4306
- }
4307
- if (missingPlatformDocs.length > 0) {
4308
- logger_1.logger.warn(`⚠️ DOC_MATRIX 交叉校验发现 ${missingPlatformDocs.length} 个平台文档缺失: ${missingPlatformDocs.slice(0, 5).join(', ')}${missingPlatformDocs.length > 5 ? '...' : ''}`);
4309
- logger_1.logger.info(`🔧 自动补建平台骨架文件...`);
4310
- const missingPlatformEntries = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, '2', ctx.iteration)
4311
- .filter(e => {
4312
- const relName = e.relPath; // e.g. "overview/TECH.md" relative to specDir
4313
- return missingPlatformDocs.some(mp => relName.endsWith(mp) || mp.endsWith(relName));
4314
- });
4315
- if (missingPlatformEntries.length > 0) {
4316
- await (0, spec_skeleton_1.generateSkeleton)(specDir, missingPlatformEntries);
4317
- logger_1.logger.info(`✅ 已补建 ${missingPlatformEntries.length} 个平台骨架文件,请继续填充`);
4318
- const newManifest = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, undefined, ctx.iteration);
4319
- perDocStatus = await (0, spec_skeleton_1.detectSkeletonProgress)(specDir, newManifest);
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
+ }
4320
4343
  }
4321
4344
  }
4322
4345
  }
@@ -4592,6 +4615,19 @@ status: "clarified"
4592
4615
  else {
4593
4616
  // 回退:从 010-requirements/ 读取原始需求
4594
4617
  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
+ // 再读取子目录中的需求文档(兼容旧结构)
4595
4631
  const prdSources = (0, path_1.join)(reqDir, 'sources');
4596
4632
  const prdConverted = (0, path_1.join)(reqDir, 'converted');
4597
4633
  const prdFeatures = (0, path_1.join)(reqDir, 'features');
@@ -4786,12 +4822,13 @@ status: "clarified"
4786
4822
  prompt += ` ⚠️ 如果全局层产物不存在,跳过该项,继续后续分析\n\n`;
4787
4823
  prompt += `3. 读取迭代需求文档(按优先级顺序):\n`;
4788
4824
  prompt += ` a. 先读 010-requirements/INDEX.md — 了解需求全貌和文件清单\n`;
4789
- prompt += ` b. 再读 010-requirements/converted/*.md — doc2spec 转换后的核心规格(主要依据)\n`;
4790
- prompt += ` c. 再读 010-requirements/features/*/README.md — 功能级补充需求\n`;
4791
- prompt += ` d. 读取 010-requirements/prototypes/ — 原型文件(HTML/图片/链接均读取)\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`;
4792
4829
  prompt += ` ⚠️ 需求文档中链接到原型的(如 \`![原型](../prototypes/xxx.png)\` 或 \`详见 prototypes/xxx.html\`),必须主动 Read 该原型文件\n`;
4793
- prompt += ` e. 如用户指定了特定文档,优先读取指定文件;如要求全部,再读 sources/ 原始文档\n`;
4794
- prompt += ` f. **文档长度自适应**:如果单个需求文档超过 5000 字,先快速扫描目录和章节标题,标记关键章节,再深入阅读。不要在非关键章节上花费过多 tokens\n`;
4830
+ prompt += ` f. 如用户指定了特定文档,优先读取指定文件;如要求全部,再读 sources/ 原始文档\n`;
4831
+ prompt += ` g. **文档长度自适应**:如果单个需求文档超过 5000 字,先快速扫描目录和章节标题,标记关键章节,再深入阅读。不要在非关键章节上花费过多 tokens\n`;
4795
4832
  prompt += `4. 读懂需求文档后,按专业模板标准自由撰写每个文档(不是填空表)\n`;
4796
4833
  prompt += `5. **文档忠实度约束(最高优先级)**:\n`;
4797
4834
  prompt += ` - **严禁臆造**:只能写需求文档中明确提及的功能、接口、页面、字段、业务规则\n`;
@@ -5427,10 +5464,11 @@ async function buildClarifyPhasePrompt(iteration) {
5427
5464
  prompt += `\n## 读取需求文档\n\n`;
5428
5465
  prompt += `依次读取以下文档(按优先级):\n`;
5429
5466
  prompt += `1. \`010-requirements/INDEX.md\` — 需求全貌\n`;
5430
- prompt += `2. \`010-requirements/sources/*.md\` — 原始需求(主要依据)\n`;
5467
+ prompt += `2. \`010-requirements/根目录下的 *.md 文件\` — 用户直接放置的核心需求文档(最高优先级)\n`;
5431
5468
  prompt += `3. \`010-requirements/converted/*.md\` — 已转换文档\n`;
5432
5469
  prompt += `4. \`010-requirements/features/*/README.md\` — 功能级补充\n`;
5433
- prompt += `5. \`010-requirements/prototypes/\` — 原型文件\n\n`;
5470
+ prompt += `5. \`010-requirements/prototypes/\` — 原型文件\n`;
5471
+ prompt += `6. \`010-requirements/sources/*.md\` — 原始需求(补充参考)\n\n`;
5434
5472
  // v8.2.0+: 如果检测到多个功能单元,启用单元化澄清模式
5435
5473
  if (hasMultipleUnits) {
5436
5474
  prompt += `## ⚠️ 功能单元拆分澄清模式(v8.2.0+)\n\n`;