speccore 8.3.158 → 8.3.159

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 (67) hide show
  1. package/README.md +1 -1
  2. package/dist/commands/analyze.d.ts.map +1 -1
  3. package/dist/commands/analyze.js +34 -72
  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/init.d.ts.map +1 -1
  9. package/dist/commands/init.js +66 -215
  10. package/dist/commands/init.js.map +1 -1
  11. package/dist/commands/migrate.d.ts.map +1 -1
  12. package/dist/commands/migrate.js +1 -2
  13. package/dist/commands/migrate.js.map +1 -1
  14. package/dist/commands/update.d.ts.map +1 -1
  15. package/dist/commands/update.js +1 -4
  16. package/dist/commands/update.js.map +1 -1
  17. package/dist/core/agents/defaults/_INDEX.md +15 -15
  18. package/dist/core/agents/defaults/code-reviewer.md +9 -0
  19. package/dist/core/agents/defaults/compiler.md +12 -3
  20. package/dist/core/agents/defaults/dependency-analyst.md +7 -0
  21. package/dist/core/agents/defaults/doc-sync-agent.md +7 -0
  22. package/dist/core/agents/defaults/impact-analyst.md +7 -0
  23. package/dist/core/agents/defaults/interaction-designer.md +17 -0
  24. package/dist/core/agents/defaults/performance-expert.md +9 -0
  25. package/dist/core/agents/defaults/regression-tester.md +7 -0
  26. package/dist/core/agents/defaults/security-reviewer.md +9 -0
  27. package/dist/core/agents/defaults/test-engineer.md +10 -0
  28. package/dist/core/agents/defaults/test-reviewer.md +10 -0
  29. package/dist/core/lock-manager.d.ts.map +1 -1
  30. package/dist/core/lock-manager.js +2 -0
  31. package/dist/core/lock-manager.js.map +1 -1
  32. package/dist/core/rules/defaults/ANALYSIS_QUALITY.md +73 -0
  33. package/dist/core/rules/defaults/EXECUTION.md +20 -0
  34. package/dist/core/rules/defaults/ITERATION_QUALITY.md +49 -0
  35. package/dist/core/rules/defaults/TASK_SPLIT.md +16 -0
  36. package/dist/core/spec-paths.d.ts.map +1 -1
  37. package/dist/core/spec-paths.js +2 -1
  38. package/dist/core/spec-paths.js.map +1 -1
  39. package/package.json +4 -6
  40. package/templates/api-design-example.md +0 -338
  41. package/templates/ci/github-actions.yml +0 -44
  42. package/templates/dashboard.html +0 -425
  43. package/templates/database-example.md +0 -223
  44. package/templates/deploy-docker/README.md +0 -284
  45. package/templates/deploy-docker/deploy-remote.sh +0 -79
  46. package/templates/deploy-docker/docker-compose.yml +0 -113
  47. package/templates/deploy-docker/frontend.Dockerfile +0 -43
  48. package/templates/deploy-docker/nginx.conf +0 -30
  49. package/templates/deploy-examples.yaml +0 -436
  50. package/templates/deploy-java/Dockerfile +0 -50
  51. package/templates/deploy-java/README.md +0 -212
  52. package/templates/deploy-java/deploy.sh +0 -120
  53. package/templates/deploy-java/spring-boot.service +0 -35
  54. package/templates/html/speccore-ask-explain.html +0 -10
  55. package/templates/html/speccore-ask-guide.html +0 -10
  56. package/templates/html/speccore-ask-match.html +0 -10
  57. package/templates/html/speccore-ask-pipeline.html +0 -1
  58. package/templates/html/speccore-ask-result.html +0 -10
  59. package/templates/html/speccore-demo.html +0 -449
  60. package/templates/html/speccore-dev.html +0 -202
  61. package/templates/html/speccore-help.html +0 -1
  62. package/templates/html/speccore-knowledge-graph.html +0 -656
  63. package/templates/html/speccore-retro-T-001.html +0 -1
  64. package/templates/html/speccore-setup-guide.html +0 -289
  65. package/templates/html/speccore-welcome.html +0 -1
  66. package/templates/security-example.md +0 -226
  67. 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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"}
@@ -1072,13 +1072,6 @@ ${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
- }
1082
1075
  const reqIndex = (0, path_1.join)(reqDir, 'INDEX.md');
1083
1076
  if (await (0, fs_extra_1.pathExists)(reqIndex))
1084
1077
  requirements.push(reqIndex);
@@ -1540,12 +1533,7 @@ ${singlePrompt}`);
1540
1533
  printBackupSummary();
1541
1534
  return;
1542
1535
  }
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 写入(内容可能不完整)');
1536
+ catch {
1549
1537
  // fallback to single-file mode
1550
1538
  }
1551
1539
  }
@@ -4238,12 +4226,7 @@ sequenceDiagram
4238
4226
  if (iterDir) {
4239
4227
  const specDir = (0, path_1.join)(iterDir, '020-specs');
4240
4228
  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);
4229
+ const manifest = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, undefined, ctx.iteration);
4247
4230
  perDocStatus = await (0, spec_skeleton_1.detectSkeletonProgress)(specDir, manifest);
4248
4231
  if (perDocStatus.nextUnfilled) {
4249
4232
  const nextDocName = perDocStatus.nextUnfilled.docName;
@@ -4299,47 +4282,41 @@ sequenceDiagram
4299
4282
  if (missingDocs.length > 0) {
4300
4283
  logger_1.logger.warn(`⚠️ DOC_MATRIX 交叉校验发现 ${missingDocs.length} 个全局文档缺失(不在骨架清单中但应该存在): ${missingDocs.join(', ')}`);
4301
4284
  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));
4285
+ // 为缺失文档补建骨架
4286
+ const missingEntries = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, '1', ctx.iteration)
4287
+ .filter(e => missingDocs.includes(e.docName));
4306
4288
  if (missingEntries.length > 0) {
4307
4289
  await (0, spec_skeleton_1.generateSkeleton)(specDir, missingEntries);
4308
4290
  logger_1.logger.info(`✅ 已补建 ${missingEntries.length} 个骨架文件,请继续填充`);
4309
4291
  // 重新检测进度(现在有了新骨架)
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);
4292
+ const newManifest = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, undefined, ctx.iteration);
4313
4293
  perDocStatus = await (0, spec_skeleton_1.detectSkeletonProgress)(specDir, newManifest);
4314
4294
  }
4315
4295
  }
4316
4296
  // 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
- }
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}`);
4327
4304
  }
4328
4305
  }
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
- }
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);
4343
4320
  }
4344
4321
  }
4345
4322
  }
@@ -4615,19 +4592,6 @@ status: "clarified"
4615
4592
  else {
4616
4593
  // 回退:从 010-requirements/ 读取原始需求
4617
4594
  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
4595
  const prdSources = (0, path_1.join)(reqDir, 'sources');
4632
4596
  const prdConverted = (0, path_1.join)(reqDir, 'converted');
4633
4597
  const prdFeatures = (0, path_1.join)(reqDir, 'features');
@@ -4822,13 +4786,12 @@ status: "clarified"
4822
4786
  prompt += ` ⚠️ 如果全局层产物不存在,跳过该项,继续后续分析\n\n`;
4823
4787
  prompt += `3. 读取迭代需求文档(按优先级顺序):\n`;
4824
4788
  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`;
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`;
4829
4792
  prompt += ` ⚠️ 需求文档中链接到原型的(如 \`![原型](../prototypes/xxx.png)\` 或 \`详见 prototypes/xxx.html\`),必须主动 Read 该原型文件\n`;
4830
- prompt += ` f. 如用户指定了特定文档,优先读取指定文件;如要求全部,再读 sources/ 原始文档\n`;
4831
- prompt += ` g. **文档长度自适应**:如果单个需求文档超过 5000 字,先快速扫描目录和章节标题,标记关键章节,再深入阅读。不要在非关键章节上花费过多 tokens\n`;
4793
+ prompt += ` e. 如用户指定了特定文档,优先读取指定文件;如要求全部,再读 sources/ 原始文档\n`;
4794
+ prompt += ` f. **文档长度自适应**:如果单个需求文档超过 5000 字,先快速扫描目录和章节标题,标记关键章节,再深入阅读。不要在非关键章节上花费过多 tokens\n`;
4832
4795
  prompt += `4. 读懂需求文档后,按专业模板标准自由撰写每个文档(不是填空表)\n`;
4833
4796
  prompt += `5. **文档忠实度约束(最高优先级)**:\n`;
4834
4797
  prompt += ` - **严禁臆造**:只能写需求文档中明确提及的功能、接口、页面、字段、业务规则\n`;
@@ -5464,11 +5427,10 @@ async function buildClarifyPhasePrompt(iteration) {
5464
5427
  prompt += `\n## 读取需求文档\n\n`;
5465
5428
  prompt += `依次读取以下文档(按优先级):\n`;
5466
5429
  prompt += `1. \`010-requirements/INDEX.md\` — 需求全貌\n`;
5467
- prompt += `2. \`010-requirements/根目录下的 *.md 文件\` — 用户直接放置的核心需求文档(最高优先级)\n`;
5430
+ prompt += `2. \`010-requirements/sources/*.md\` — 原始需求(主要依据)\n`;
5468
5431
  prompt += `3. \`010-requirements/converted/*.md\` — 已转换文档\n`;
5469
5432
  prompt += `4. \`010-requirements/features/*/README.md\` — 功能级补充\n`;
5470
- prompt += `5. \`010-requirements/prototypes/\` — 原型文件\n`;
5471
- prompt += `6. \`010-requirements/sources/*.md\` — 原始需求(补充参考)\n\n`;
5433
+ prompt += `5. \`010-requirements/prototypes/\` — 原型文件\n\n`;
5472
5434
  // v8.2.0+: 如果检测到多个功能单元,启用单元化澄清模式
5473
5435
  if (hasMultipleUnits) {
5474
5436
  prompt += `## ⚠️ 功能单元拆分澄清模式(v8.2.0+)\n\n`;