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.
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +49 -17
- package/dist/commands/analyze.js.map +1 -1
- package/dist/core/prompt-builder.d.ts.map +1 -1
- package/dist/core/prompt-builder.js +73 -16
- package/dist/core/prompt-builder.js.map +1 -1
- package/dist/core/requirement-clarifier.d.ts +8 -1
- package/dist/core/requirement-clarifier.d.ts.map +1 -1
- package/dist/core/requirement-clarifier.js +53 -18
- package/dist/core/requirement-clarifier.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":"AA6EA,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,GAAG,UAAU,CAAC;IACrD,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;IAClB,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;IACrB,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,
|
|
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
|
@@ -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
|
-
|
|
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
|
|
1204
|
-
const hasClarifiedDocs = await (
|
|
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:
|
|
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**:
|
|
4784
|
+
prompt += `**Step 4**: 输出澄清后的文档,使用以下标记格式(v8.3.181+ 推荐新路径):\n`;
|
|
4778
4785
|
prompt += `\`\`\`
|
|
4779
|
-
[CLARIFY:
|
|
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/
|
|
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/
|
|
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
|
|
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
|
-
|
|
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:
|
|
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
|
|
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/
|
|
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/
|
|
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);
|