speccore 8.3.233 → 8.3.235

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.
@@ -101,4 +101,9 @@ export declare function detectPendingUnits(iteration: string, allUnits: Iteratio
101
101
  export declare function consolidateUnitAnalyses(iteration: string, units: IterationUnit[], analyses: UnitAnalysis[]): Promise<string>;
102
102
  /** 构建单个功能单元的深度分析 Prompt */
103
103
  export declare function buildUnitAnalysisPrompt(iterDir: string, iteration: string, unit: IterationUnit, allUnits: IterationUnit[]): Promise<string>;
104
+ /**
105
+ * v8.3.234+: 生成并落盘「功能单元分析质量报告」——成功/失败清单 + 每单元产出物评分。
106
+ * 落盘到 020-specs/QUALITY_AUDIT.md;无可评单元时返回 null。
107
+ */
108
+ export declare function buildAndSaveQualityReport(iterDir: string, iter: string, units: IterationUnit[]): Promise<string | null>;
104
109
  //# sourceMappingURL=analyze.d.ts.map
@@ -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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"}
@@ -42,6 +42,7 @@ exports.loadUnitAnalyses = loadUnitAnalyses;
42
42
  exports.detectPendingUnits = detectPendingUnits;
43
43
  exports.consolidateUnitAnalyses = consolidateUnitAnalyses;
44
44
  exports.buildUnitAnalysisPrompt = buildUnitAnalysisPrompt;
45
+ exports.buildAndSaveQualityReport = buildAndSaveQualityReport;
45
46
  /**
46
47
  * analyze — 统一分析命令
47
48
  *
@@ -703,6 +704,8 @@ async function analyzeCommand(options) {
703
704
  logger_1.logger.success('🎉 所有功能单元分析已完成!');
704
705
  logger_1.logger.info(' 运行 --consolidate 汇总为统一报告');
705
706
  logger_1.logger.info(` speccore analyze --prompt -I ${iter} --consolidate`);
707
+ // v8.3.234+: 执行完成质量报告(成功/失败清单 + 产出物评分)
708
+ await buildAndSaveQualityReport(iterDir, iter, units);
706
709
  return;
707
710
  }
708
711
  targetUnitIds = pending.map(u => u.id);
@@ -715,6 +718,8 @@ async function analyzeCommand(options) {
715
718
  logger_1.logger.success('🎉 所有功能单元分析已完成!');
716
719
  logger_1.logger.info(' 运行 --consolidate 汇总为统一报告');
717
720
  logger_1.logger.info(` speccore analyze --prompt -I ${iter} --consolidate`);
721
+ // v8.3.234+: 执行完成质量报告(成功/失败清单 + 产出物评分)
722
+ await buildAndSaveQualityReport(iterDir, iter, units);
718
723
  return;
719
724
  }
720
725
  targetUnitIds = [pending[0].id];
@@ -726,7 +731,7 @@ async function analyzeCommand(options) {
726
731
  if (options.autoUnits || options.resumeUnits) {
727
732
  const loopResult = await runUnitDispatchLoop(iter, iterDir, units);
728
733
  if (loopResult.finished) {
729
- printUnitLoopSummary(iter, loopResult);
734
+ await printUnitLoopSummary(iter, iterDir, units, loopResult);
730
735
  return;
731
736
  }
732
737
  process.stdout.write(`[SPECCORE_PROMPT]\n${loopResult.prompt}\n\n## 完成后继续\n\n落盘后运行以下命令,CLI 将校验产出并自动推进到下一个单元:\n\n\`\`\`bash\nspeccore analyze --resume-units -I ${iter}\n\`\`\`\n`);
@@ -6306,6 +6311,15 @@ async function buildConfirmCheckPrompt(iteration) {
6306
6311
  const iterDir = await (0, context_1.getIterationDir)(iteration);
6307
6312
  const reportPath = (0, path_1.join)(iterDir, '010-requirements', 'CLARIFY_REPORT.md');
6308
6313
  const goldenDir = (0, path_1.join)(iterDir, '020-specs', 'requirements');
6314
+ // v8.3.235+: 报告不存在时自动生成(修复「CLARIFY_REPORT.md 无代码生成、确认步骤永远读不到」断链)
6315
+ if (!(await (0, fs_extra_1.pathExists)(reportPath))) {
6316
+ try {
6317
+ const { writeClarifyReport } = await Promise.resolve().then(() => __importStar(require('../core/requirement-clarifier')));
6318
+ const p = await writeClarifyReport(iterDir);
6319
+ logger_1.logger.info(`📋 已生成澄清报告: ${(0, path_1.relative)(process.cwd(), p)}`);
6320
+ }
6321
+ catch { /* 生成失败不阻塞确认步骤 */ }
6322
+ }
6309
6323
  let prompt = `\n# 任务: 需求确认(Phase 0: 确认检查,v6.83.0+)\n\n`;
6310
6324
  if (await (0, fs_extra_1.pathExists)(reportPath)) {
6311
6325
  const report = await (0, fs_extra_2.readFile)(reportPath, 'utf-8');
@@ -6918,7 +6932,7 @@ async function runUnitDispatchLoop(iter, iterDir, units) {
6918
6932
  });
6919
6933
  }
6920
6934
  /** 输出调度循环完成汇总 */
6921
- function printUnitLoopSummary(iter, result) {
6935
+ async function printUnitLoopSummary(iter, iterDir, units, result) {
6922
6936
  const s = result.summary;
6923
6937
  if (s.failed.length > 0) {
6924
6938
  logger_1.logger.warn(`⚠️ 功能单元分析循环完成: ${s.done.length} 完成 / ${s.failed.length} 失败`);
@@ -6931,6 +6945,77 @@ function printUnitLoopSummary(iter, result) {
6931
6945
  logger_1.logger.success(`🎉 所有 ${s.done.length} 个功能单元分析完成!`);
6932
6946
  }
6933
6947
  logger_1.logger.info(` 下一步: 汇总统一报告 speccore analyze --prompt -I ${iter} --consolidate`);
6948
+ // v8.3.234+: 执行完成质量报告(成功/失败清单 + 产出物评分)落盘 QUALITY_AUDIT.md
6949
+ await buildAndSaveQualityReport(iterDir, iter, units);
6950
+ }
6951
+ /**
6952
+ * v8.3.234+: 生成并落盘「功能单元分析质量报告」——成功/失败清单 + 每单元产出物评分。
6953
+ * 落盘到 020-specs/QUALITY_AUDIT.md;无可评单元时返回 null。
6954
+ */
6955
+ async function buildAndSaveQualityReport(iterDir, iter, units) {
6956
+ if (units.length === 0)
6957
+ return null;
6958
+ const { validateContentQuality } = await Promise.resolve().then(() => __importStar(require('../core/spec-skeleton')));
6959
+ const report = [];
6960
+ for (const u of units) {
6961
+ const specDir = getUnitSpecDir(iterDir, u);
6962
+ const rows = [];
6963
+ for (const f of ['REQUIREMENT.md', 'ANALYSIS.md', 'TECH.md']) {
6964
+ const fp = (0, path_1.join)(specDir, f);
6965
+ if (!(await (0, fs_extra_1.pathExists)(fp)))
6966
+ continue;
6967
+ const content = (await (0, fs_extra_2.readFile)(fp, 'utf-8')).trim();
6968
+ if (!content || content.includes('SPEC-SKELETON') || content.length < 200)
6969
+ continue;
6970
+ const q = await validateContentQuality(f, content, '');
6971
+ rows.push({ doc: f, score: q.score, issues: q.issues });
6972
+ }
6973
+ report.push({ unit: u.name, ok: rows.length > 0, rows });
6974
+ }
6975
+ const okCount = report.filter(r => r.ok).length;
6976
+ const failCount = report.length - okCount;
6977
+ const totalDocs = report.reduce((a, r) => a + r.rows.length, 0);
6978
+ const avgScore = totalDocs > 0 ? Math.round(report.reduce((a, r) => a + r.rows.reduce((b, row) => b + row.score, 0), 0) / totalDocs) : 0;
6979
+ const lines = [];
6980
+ lines.push('# 功能单元分析质量报告');
6981
+ lines.push('');
6982
+ lines.push(`> 生成时间: ${new Date().toISOString()}`);
6983
+ lines.push(`> 迭代: ${iter}`);
6984
+ lines.push(`> 结果: ${okCount} 成功 / ${failCount} 失败(共 ${units.length} 单元,评 ${totalDocs} 份文档,平均 ${avgScore} 分)`);
6985
+ lines.push('');
6986
+ lines.push('## 评分明细');
6987
+ lines.push('');
6988
+ lines.push('| 单元 | 状态 | 文档 | 评分 | 主要扣分项 |');
6989
+ lines.push('|:---|:---|:---|:---|:---|');
6990
+ for (const r of report) {
6991
+ if (r.ok) {
6992
+ for (const row of r.rows) {
6993
+ lines.push(`| ${r.unit} | ✅ | ${row.doc} | ${row.score} | ${row.issues.slice(0, 3).join(';') || '—'} |`);
6994
+ }
6995
+ }
6996
+ else {
6997
+ lines.push(`| ${r.unit} | ❌ 失败 | — | — | 缺少有效规格文档(REQUIREMENT/ANALYSIS/TECH 至少一份,内容 ≥200 字符且非骨架) |`);
6998
+ }
6999
+ }
7000
+ lines.push('');
7001
+ lines.push('## 失败单元修复');
7002
+ lines.push('');
7003
+ if (failCount === 0) {
7004
+ lines.push('无失败单元。');
7005
+ }
7006
+ else {
7007
+ lines.push('```bash');
7008
+ lines.push(`speccore analyze --resume-units -I ${iter}`);
7009
+ lines.push('```');
7010
+ lines.push('仍为骨架/空内容的单元会被重新纳入分析,循环直到干净。');
7011
+ }
7012
+ lines.push('');
7013
+ const specRoot = (0, path_1.join)(iterDir, '020-specs');
7014
+ await (0, fs_extra_1.ensureDir)(specRoot);
7015
+ const reportPath = (0, path_1.join)(specRoot, 'QUALITY_AUDIT.md');
7016
+ await (0, fs_extra_1.writeFile)(reportPath, lines.join('\n'));
7017
+ logger_1.logger.info(` 📊 质量报告已落盘: 020-specs/QUALITY_AUDIT.md(${okCount} 成功 / ${failCount} 失败,平均 ${avgScore} 分)`);
7018
+ return reportPath;
6934
7019
  }
6935
7020
  // ═══════════════════════════════════════════════════════════
6936
7021
  // 多子任务分析支持(v8.3.94+)