speccore 8.3.261 → 8.3.263
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/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +51 -4
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/doc2spec.d.ts.map +1 -1
- package/dist/commands/doc2spec.js +59 -13
- package/dist/commands/doc2spec.js.map +1 -1
- package/dist/commands/iteration/taskify.d.ts.map +1 -1
- package/dist/commands/iteration/taskify.js +2 -1
- package/dist/commands/iteration/taskify.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +52 -10
- package/dist/commands/run.js.map +1 -1
- package/dist/core/ask-engine.d.ts.map +1 -1
- package/dist/core/ask-engine.js +7 -0
- package/dist/core/ask-engine.js.map +1 -1
- package/dist/core/intent-cache.d.ts.map +1 -1
- package/dist/core/intent-cache.js +16 -7
- package/dist/core/intent-cache.js.map +1 -1
- package/dist/core/intent-recognition.d.ts +2 -0
- package/dist/core/intent-recognition.d.ts.map +1 -1
- package/dist/core/intent-recognition.js +15 -1
- package/dist/core/intent-recognition.js.map +1 -1
- package/dist/core/unit-context-assembler.d.ts.map +1 -1
- package/dist/core/unit-context-assembler.js +13 -1
- package/dist/core/unit-context-assembler.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/analyze.js
CHANGED
|
@@ -1056,6 +1056,18 @@ async function analyzeCommand(options) {
|
|
|
1056
1056
|
const reqRoot = (0, path_1.join)(reqDir, 'REQUIREMENT.md');
|
|
1057
1057
|
if (await (0, fs_extra_1.pathExists)(reqRoot))
|
|
1058
1058
|
requirements.push(reqRoot);
|
|
1059
|
+
// v8.3.263: 全局上下文(unitize 过滤出的非功能章节:名词约定/非功能需求等)
|
|
1060
|
+
// 纳入澄清清单——此前 GLOBAL_CONTEXT-*.md 无任何下游读取(断链)
|
|
1061
|
+
const reqOverviewDir = (0, path_1.join)(reqDir, 'overview');
|
|
1062
|
+
if (await (0, fs_extra_1.pathExists)(reqOverviewDir)) {
|
|
1063
|
+
try {
|
|
1064
|
+
const ovFiles = await (0, fs_extra_2.readdir)(reqOverviewDir);
|
|
1065
|
+
for (const f of ovFiles.filter((f) => f.startsWith('GLOBAL_CONTEXT-') && f.endsWith('.md') && !(0, task_utils_1.isTimestampBackup)(f))) {
|
|
1066
|
+
requirements.push((0, path_1.join)(reqOverviewDir, f));
|
|
1067
|
+
}
|
|
1068
|
+
}
|
|
1069
|
+
catch { }
|
|
1070
|
+
}
|
|
1059
1071
|
// 收集 features/*/SOURCE.md(v8.3.226+ 语义名,兼容旧 README.md)
|
|
1060
1072
|
// v8.3.236+: converted/ 非空时跳过切片收集——切片源自 converted 切分,
|
|
1061
1073
|
// 内容重复会污染澄清清单(会议项目实测 78 份「源文档」大部分是切片元数据)
|
|
@@ -5942,8 +5954,29 @@ async function generateQualityReport(iteration) {
|
|
|
5942
5954
|
}
|
|
5943
5955
|
return { docPaths, reports: qualityReports };
|
|
5944
5956
|
}
|
|
5957
|
+
// v8.3.263: 澄清阶段的功能单元优先从 features/ 目录提取(切分层对齐锚点)——
|
|
5958
|
+
// 文档章节提取会把「使用规范/修订记录」等元章节误当功能单元,导致澄清粒度错位;
|
|
5959
|
+
// features/ 为空时才回退到文档章节提取。
|
|
5960
|
+
async function extractUnitsForClarify(iterDir, allDocContent) {
|
|
5961
|
+
const featuresDir = (0, path_1.join)(iterDir, '010-requirements', 'features');
|
|
5962
|
+
try {
|
|
5963
|
+
if (await (0, fs_extra_1.pathExists)(featuresDir)) {
|
|
5964
|
+
const entries = await (0, fs_extra_2.readdir)(featuresDir, { withFileTypes: true });
|
|
5965
|
+
const dirs = entries.filter((e) => e.isDirectory() && !e.name.startsWith('.'));
|
|
5966
|
+
if (dirs.length > 0) {
|
|
5967
|
+
return dirs.map((e, i) => ({
|
|
5968
|
+
id: `M-${String(i + 1).padStart(2, '0')}`,
|
|
5969
|
+
name: e.name,
|
|
5970
|
+
content: '',
|
|
5971
|
+
}));
|
|
5972
|
+
}
|
|
5973
|
+
}
|
|
5974
|
+
}
|
|
5975
|
+
catch { /* features/ 不可读时回退章节提取 */ }
|
|
5976
|
+
return (0, requirement_clarifier_1.extractUnitsFromText)(allDocContent);
|
|
5977
|
+
}
|
|
5978
|
+
// 生成质量报告(复用抽离的审查逻辑)+ 拿到文档清单与质量报告
|
|
5945
5979
|
async function buildClarifyPhasePrompt(iteration) {
|
|
5946
|
-
// 生成质量报告(复用抽离的审查逻辑)+ 拿到文档清单与质量报告
|
|
5947
5980
|
const iterDir = await (0, context_1.getIterationDir)(iteration);
|
|
5948
5981
|
const raw = await generateQualityReport(iteration);
|
|
5949
5982
|
// v8.3.236+: 过滤非需求文档——功能单元元数据(features/*/)、全局上下文(overview/GLOBAL_CONTEXT-*)
|
|
@@ -5959,7 +5992,21 @@ async function buildClarifyPhasePrompt(iteration) {
|
|
|
5959
5992
|
return false;
|
|
5960
5993
|
return true;
|
|
5961
5994
|
});
|
|
5962
|
-
|
|
5995
|
+
// v8.3.263: 排除 010-requirements 根 README.md(目录规范说明,非业务需求文档),
|
|
5996
|
+
// 同名文档去重(sources/ 与 converted/ 各一份时 converted 优先——doc2spec 转换版更规范)
|
|
5997
|
+
const rootReadme = (0, path_1.join)(iterDir, '010-requirements', 'README.md');
|
|
5998
|
+
const dedupMap = new Map();
|
|
5999
|
+
for (const r of qualityReports) {
|
|
6000
|
+
if (r.filePath === rootReadme)
|
|
6001
|
+
continue;
|
|
6002
|
+
const base = (0, path_1.basename)(r.filePath);
|
|
6003
|
+
const prev = dedupMap.get(base);
|
|
6004
|
+
if (!prev || (r.filePath.includes('converted') && !prev.filePath.includes('converted'))) {
|
|
6005
|
+
dedupMap.set(base, r);
|
|
6006
|
+
}
|
|
6007
|
+
}
|
|
6008
|
+
const dedupedReports = qualityReports.filter((r) => r.filePath !== rootReadme && dedupMap.get((0, path_1.basename)(r.filePath)) === r);
|
|
6009
|
+
const docPaths = dedupedReports.map((r) => r.filePath);
|
|
5963
6010
|
let allDocContent = '';
|
|
5964
6011
|
for (const p of docPaths) {
|
|
5965
6012
|
try {
|
|
@@ -5967,7 +6014,7 @@ async function buildClarifyPhasePrompt(iteration) {
|
|
|
5967
6014
|
}
|
|
5968
6015
|
catch { /* ignore */ }
|
|
5969
6016
|
}
|
|
5970
|
-
const extractedUnits = (
|
|
6017
|
+
const extractedUnits = await extractUnitsForClarify(iterDir, allDocContent);
|
|
5971
6018
|
const hasMultipleUnits = extractedUnits.length >= 2;
|
|
5972
6019
|
let prompt = `\n# 任务: 需求专业化(Phase 0: 需求澄清,v6.84.0+)\n\n`;
|
|
5973
6020
|
const projectRoot = (0, task_utils_1.findProjectRoot)() || ((0, task_utils_1.findProjectRoot)() || process.cwd());
|
|
@@ -6000,7 +6047,7 @@ async function buildClarifyPhasePrompt(iteration) {
|
|
|
6000
6047
|
prompt += '\n\n';
|
|
6001
6048
|
}
|
|
6002
6049
|
prompt += `## 质量评价摘要(7维度)\n\n`;
|
|
6003
|
-
for (const r of
|
|
6050
|
+
for (const r of dedupedReports) {
|
|
6004
6051
|
const name = r.filePath.split('/').pop() || '-';
|
|
6005
6052
|
prompt += `### ${name} — 综合评分 ${r.overallScore}/100 (${r.level.toUpperCase()})\n\n`;
|
|
6006
6053
|
prompt += `| 维度 | 评分 | 问题数 | 状态 |\n`;
|