speccore 8.3.158 → 8.3.160
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 +1 -1
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +88 -96
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/ask.d.ts.map +1 -1
- package/dist/commands/ask.js +0 -13
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +67 -6
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +71 -216
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/iteration/split.d.ts.map +1 -1
- package/dist/commands/iteration/split.js +73 -9
- package/dist/commands/iteration/split.js.map +1 -1
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +1 -2
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +1 -4
- package/dist/commands/update.js.map +1 -1
- package/dist/core/agent-adapter.d.ts +81 -0
- package/dist/core/agent-adapter.d.ts.map +1 -0
- package/dist/core/agent-adapter.js +425 -0
- package/dist/core/agent-adapter.js.map +1 -0
- package/dist/core/agents/defaults/_INDEX.md +15 -15
- package/dist/core/agents/defaults/code-reviewer.md +9 -0
- package/dist/core/agents/defaults/compiler.md +12 -3
- package/dist/core/agents/defaults/dependency-analyst.md +7 -0
- package/dist/core/agents/defaults/doc-sync-agent.md +7 -0
- package/dist/core/agents/defaults/impact-analyst.md +7 -0
- package/dist/core/agents/defaults/interaction-designer.md +17 -0
- package/dist/core/agents/defaults/performance-expert.md +9 -0
- package/dist/core/agents/defaults/regression-tester.md +7 -0
- package/dist/core/agents/defaults/security-reviewer.md +9 -0
- package/dist/core/agents/defaults/test-engineer.md +10 -0
- package/dist/core/agents/defaults/test-reviewer.md +10 -0
- package/dist/core/lock-manager.d.ts.map +1 -1
- package/dist/core/lock-manager.js +2 -0
- package/dist/core/lock-manager.js.map +1 -1
- package/dist/core/pipeline-engine.d.ts +49 -8
- package/dist/core/pipeline-engine.d.ts.map +1 -1
- package/dist/core/pipeline-engine.js +221 -34
- package/dist/core/pipeline-engine.js.map +1 -1
- package/dist/core/prompt-builder.d.ts +4 -0
- package/dist/core/prompt-builder.d.ts.map +1 -1
- package/dist/core/prompt-builder.js +83 -10
- package/dist/core/prompt-builder.js.map +1 -1
- package/dist/core/rules/defaults/ANALYSIS_QUALITY.md +73 -0
- package/dist/core/rules/defaults/EXECUTION.md +20 -0
- package/dist/core/rules/defaults/ITERATION_QUALITY.md +49 -0
- package/dist/core/rules/defaults/TASK_SPLIT.md +16 -0
- package/dist/core/spec-paths.d.ts.map +1 -1
- package/dist/core/spec-paths.js +2 -1
- package/dist/core/spec-paths.js.map +1 -1
- package/package.json +4 -6
- package/templates/api-design-example.md +0 -338
- package/templates/ci/github-actions.yml +0 -44
- package/templates/dashboard.html +0 -425
- package/templates/database-example.md +0 -223
- package/templates/deploy-docker/README.md +0 -284
- package/templates/deploy-docker/deploy-remote.sh +0 -79
- package/templates/deploy-docker/docker-compose.yml +0 -113
- package/templates/deploy-docker/frontend.Dockerfile +0 -43
- package/templates/deploy-docker/nginx.conf +0 -30
- package/templates/deploy-examples.yaml +0 -436
- package/templates/deploy-java/Dockerfile +0 -50
- package/templates/deploy-java/README.md +0 -212
- package/templates/deploy-java/deploy.sh +0 -120
- package/templates/deploy-java/spring-boot.service +0 -35
- package/templates/html/speccore-ask-explain.html +0 -10
- package/templates/html/speccore-ask-guide.html +0 -10
- package/templates/html/speccore-ask-match.html +0 -10
- package/templates/html/speccore-ask-pipeline.html +0 -1
- package/templates/html/speccore-ask-result.html +0 -10
- package/templates/html/speccore-demo.html +0 -449
- package/templates/html/speccore-dev.html +0 -202
- package/templates/html/speccore-help.html +0 -1
- package/templates/html/speccore-knowledge-graph.html +0 -656
- package/templates/html/speccore-retro-T-001.html +0 -1
- package/templates/html/speccore-setup-guide.html +0 -289
- package/templates/html/speccore-welcome.html +0 -1
- package/templates/security-example.md +0 -226
- package/templates/verify-spec-example.yaml +0 -982
package/README.md
CHANGED
|
@@ -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,
|
|
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
|
@@ -850,8 +850,8 @@ async function analyzeCommand(options) {
|
|
|
850
850
|
engine = result.engine;
|
|
851
851
|
steps = result.steps;
|
|
852
852
|
pipelineKey = iter;
|
|
853
|
-
//
|
|
854
|
-
initStep = options.skipClarify ? 'phase1-prompt' : 'clarify-
|
|
853
|
+
// v8.3.160+: clarify 拆分为 product → interaction → security 三个子步骤
|
|
854
|
+
initStep = options.skipClarify ? 'phase1-prompt' : 'clarify-product';
|
|
855
855
|
}
|
|
856
856
|
// 检查是否有活跃的 Pipeline(恢复模式)
|
|
857
857
|
const hasActive = await pipeline_engine_1.PipelineEngine.hasActivePipeline(_projectRoot, pipelineKey);
|
|
@@ -896,8 +896,8 @@ async function analyzeCommand(options) {
|
|
|
896
896
|
}, options);
|
|
897
897
|
}
|
|
898
898
|
}
|
|
899
|
-
else if (currentStep === 'clarify-
|
|
900
|
-
//
|
|
899
|
+
else if (currentStep === 'clarify-product' || currentStep === 'clarify-interaction' || currentStep === 'clarify-security') {
|
|
900
|
+
// v8.3.160+: Phase 0 需求澄清(拆分为 product / interaction / security 三个子步骤)
|
|
901
901
|
prompt = await buildClarifyPhasePrompt(iter);
|
|
902
902
|
}
|
|
903
903
|
else if (currentStep === 'confirm-check') {
|
|
@@ -941,22 +941,27 @@ async function analyzeCommand(options) {
|
|
|
941
941
|
: '全局 Pipeline';
|
|
942
942
|
}
|
|
943
943
|
else {
|
|
944
|
-
progressLabel = currentStep === 'clarify-
|
|
945
|
-
? 'Phase
|
|
946
|
-
: currentStep === '
|
|
947
|
-
? 'Phase
|
|
948
|
-
: currentStep === '
|
|
949
|
-
? 'Phase
|
|
950
|
-
: currentStep === '
|
|
951
|
-
? 'Phase
|
|
952
|
-
:
|
|
953
|
-
?
|
|
954
|
-
: '
|
|
955
|
-
|
|
956
|
-
|
|
944
|
+
progressLabel = currentStep === 'clarify-product'
|
|
945
|
+
? 'Phase 0a/3: 产品分析'
|
|
946
|
+
: currentStep === 'clarify-interaction'
|
|
947
|
+
? 'Phase 0b/3: 交互设计'
|
|
948
|
+
: currentStep === 'clarify-security'
|
|
949
|
+
? 'Phase 0c/3: 安全审查'
|
|
950
|
+
: currentStep === 'confirm-check'
|
|
951
|
+
? 'Phase 0/3: 需求确认'
|
|
952
|
+
: currentStep === 'phase1-prompt'
|
|
953
|
+
? 'Phase 1/3: 迭代综合文档'
|
|
954
|
+
: currentStep === 'contract-prompt'
|
|
955
|
+
? 'Phase 2/3: 契约定义'
|
|
956
|
+
: platformMatch
|
|
957
|
+
? `Phase 2/3: ${platformMatch[1]} 端专属文档`
|
|
958
|
+
: 'Pipeline';
|
|
959
|
+
}
|
|
960
|
+
// v8.3.160+: 步骤隔离模式,每步完成后需新会话继续
|
|
961
|
+
const finalPrompt = prompt + `\n\n## ⚠️ Pipeline 模式:步骤隔离 (${progressLabel})\n\n` +
|
|
957
962
|
`当前是 Pipeline 模式(步骤 ${currentStepIndex + 1}/${totalSteps})。` +
|
|
958
|
-
`当你通过 --apply 写入文档后,CLI 会自动输出 [
|
|
959
|
-
`**看到 [
|
|
963
|
+
`当你通过 --apply 写入文档后,CLI 会自动输出 [SPECCORE_STEP_DONE] 标记和下一步命令。\n\n` +
|
|
964
|
+
`**看到 [SPECCORE_STEP_DONE] 后,请在新会话中执行提示的命令**,继续下一步。\n`;
|
|
960
965
|
process.stdout.write(`[SPECCORE_PROMPT]\n${finalPrompt}`);
|
|
961
966
|
process.exitCode = 10;
|
|
962
967
|
return;
|
|
@@ -1072,13 +1077,6 @@ ${singlePrompt}`);
|
|
|
1072
1077
|
const { detectProfessionalLevel } = await Promise.resolve().then(() => __importStar(require('../core/requirement-clarifier')));
|
|
1073
1078
|
const reqDir = (0, path_1.join)(iterDir, '010-requirements');
|
|
1074
1079
|
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
1080
|
const reqIndex = (0, path_1.join)(reqDir, 'INDEX.md');
|
|
1083
1081
|
if (await (0, fs_extra_1.pathExists)(reqIndex))
|
|
1084
1082
|
requirements.push(reqIndex);
|
|
@@ -1540,12 +1538,7 @@ ${singlePrompt}`);
|
|
|
1540
1538
|
printBackupSummary();
|
|
1541
1539
|
return;
|
|
1542
1540
|
}
|
|
1543
|
-
catch
|
|
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 写入(内容可能不完整)');
|
|
1541
|
+
catch {
|
|
1549
1542
|
// fallback to single-file mode
|
|
1550
1543
|
}
|
|
1551
1544
|
}
|
|
@@ -1917,7 +1910,8 @@ ${singlePrompt}`);
|
|
|
1917
1910
|
platformOrder: platformOrder.length > 0 ? platformOrder : undefined,
|
|
1918
1911
|
})).engine;
|
|
1919
1912
|
}
|
|
1920
|
-
|
|
1913
|
+
// v8.3.160+: 默认步骤隔离模式
|
|
1914
|
+
const stepResult = await engine.advance();
|
|
1921
1915
|
const state = await engine.getState();
|
|
1922
1916
|
if (state?.currentStep === 'done') {
|
|
1923
1917
|
logger_1.logger.success('🎉 Pipeline 完成!');
|
|
@@ -1954,9 +1948,9 @@ ${singlePrompt}`);
|
|
|
1954
1948
|
iteration: options.iteration || 'GLOBAL', scope: 'global', withCode: options.withCode,
|
|
1955
1949
|
});
|
|
1956
1950
|
}
|
|
1957
|
-
//
|
|
1951
|
+
// v8.3.160+: clarify 阶段推进(拆分为 product / interaction / security)
|
|
1958
1952
|
}
|
|
1959
|
-
else if (state.currentStep === 'clarify-
|
|
1953
|
+
else if (state.currentStep === 'clarify-product' || state.currentStep === 'clarify-interaction' || state.currentStep === 'clarify-security') {
|
|
1960
1954
|
nextPrompt = await buildClarifyPhasePrompt(options.iteration);
|
|
1961
1955
|
}
|
|
1962
1956
|
else if (state.currentStep === 'confirm-check') {
|
|
@@ -1985,7 +1979,31 @@ ${singlePrompt}`);
|
|
|
1985
1979
|
iteration: options.iteration,
|
|
1986
1980
|
});
|
|
1987
1981
|
}
|
|
1988
|
-
|
|
1982
|
+
// v8.3.160+: 步骤隔离模式输出标记 + 子 Agent 激活
|
|
1983
|
+
const scopeFlag = isGlobalScope ? '--scope global' : `-I ${options.iteration}`;
|
|
1984
|
+
const nextCmd = `speccore analyze ${scopeFlag} --resume`;
|
|
1985
|
+
const output = [
|
|
1986
|
+
`[SPECCORE_STEP_DONE]`,
|
|
1987
|
+
`步骤 "${state.currentStep}" 已完成。`,
|
|
1988
|
+
``,
|
|
1989
|
+
`[SPECCORE_NEXT_STEP]`,
|
|
1990
|
+
`下一步: ${state.currentStep}`,
|
|
1991
|
+
`请在新的对话中执行: ${nextCmd}`,
|
|
1992
|
+
``,
|
|
1993
|
+
`[SPECCORE_CONTEXT_SNAPSHOT]`,
|
|
1994
|
+
JSON.stringify(stepResult.contextSnapshot || {}),
|
|
1995
|
+
``,
|
|
1996
|
+
// v8.3.160+: 子 Agent 激活标记
|
|
1997
|
+
...(stepResult.subagent ? [
|
|
1998
|
+
`[SPECCORE_SUBAGENT: ${stepResult.subagent}]`,
|
|
1999
|
+
`[SPECCORE_CONTEXT_BUDGET: ${stepResult.contextBudget || 12000}]`,
|
|
2000
|
+
`[SPECCORE_CONTEXT_TYPE: ${stepResult.contextType || 'full'}]`,
|
|
2001
|
+
``,
|
|
2002
|
+
] : []),
|
|
2003
|
+
`--- 下一步 Prompt ---`,
|
|
2004
|
+
nextPrompt,
|
|
2005
|
+
].join('\n');
|
|
2006
|
+
process.stdout.write(output);
|
|
1989
2007
|
process.exitCode = 10;
|
|
1990
2008
|
}
|
|
1991
2009
|
return;
|
|
@@ -4238,12 +4256,7 @@ sequenceDiagram
|
|
|
4238
4256
|
if (iterDir) {
|
|
4239
4257
|
const specDir = (0, path_1.join)(iterDir, '020-specs');
|
|
4240
4258
|
const platforms = await (0, spec_paths_1.parsePlatformList)();
|
|
4241
|
-
|
|
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);
|
|
4259
|
+
const manifest = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, undefined, ctx.iteration);
|
|
4247
4260
|
perDocStatus = await (0, spec_skeleton_1.detectSkeletonProgress)(specDir, manifest);
|
|
4248
4261
|
if (perDocStatus.nextUnfilled) {
|
|
4249
4262
|
const nextDocName = perDocStatus.nextUnfilled.docName;
|
|
@@ -4299,47 +4312,41 @@ sequenceDiagram
|
|
|
4299
4312
|
if (missingDocs.length > 0) {
|
|
4300
4313
|
logger_1.logger.warn(`⚠️ DOC_MATRIX 交叉校验发现 ${missingDocs.length} 个全局文档缺失(不在骨架清单中但应该存在): ${missingDocs.join(', ')}`);
|
|
4301
4314
|
logger_1.logger.info(`🔧 自动补建骨架文件...`);
|
|
4302
|
-
//
|
|
4303
|
-
const missingEntries = (
|
|
4304
|
-
|
|
4305
|
-
: (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, '1', ctx.iteration)).filter(e => missingDocs.includes(e.docName));
|
|
4315
|
+
// 为缺失文档补建骨架
|
|
4316
|
+
const missingEntries = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, '1', ctx.iteration)
|
|
4317
|
+
.filter(e => missingDocs.includes(e.docName));
|
|
4306
4318
|
if (missingEntries.length > 0) {
|
|
4307
4319
|
await (0, spec_skeleton_1.generateSkeleton)(specDir, missingEntries);
|
|
4308
4320
|
logger_1.logger.info(`✅ 已补建 ${missingEntries.length} 个骨架文件,请继续填充`);
|
|
4309
4321
|
// 重新检测进度(现在有了新骨架)
|
|
4310
|
-
const newManifest =
|
|
4311
|
-
? (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)(features, platforms, undefined, ctx.iteration)
|
|
4312
|
-
: (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, undefined, ctx.iteration);
|
|
4322
|
+
const newManifest = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, undefined, ctx.iteration);
|
|
4313
4323
|
perDocStatus = await (0, spec_skeleton_1.detectSkeletonProgress)(specDir, newManifest);
|
|
4314
4324
|
}
|
|
4315
4325
|
}
|
|
4316
4326
|
// v8.1.1+: Phase 2 平台文档交叉校验
|
|
4317
|
-
|
|
4318
|
-
|
|
4319
|
-
|
|
4320
|
-
const
|
|
4321
|
-
|
|
4322
|
-
|
|
4323
|
-
|
|
4324
|
-
if (!await (0, fs_extra_1.pathExists)(docPath)) {
|
|
4325
|
-
missingPlatformDocs.push(`${platform}/${doc}`);
|
|
4326
|
-
}
|
|
4327
|
+
const expectedPlatformDocs = PLATFORM_DOCS.filter(d => includeDocs.includes(d));
|
|
4328
|
+
const missingPlatformDocs = [];
|
|
4329
|
+
for (const platform of platforms) {
|
|
4330
|
+
for (const doc of expectedPlatformDocs) {
|
|
4331
|
+
const docPath = (0, path_1.join)(specDir, platform, doc);
|
|
4332
|
+
if (!await (0, fs_extra_1.pathExists)(docPath)) {
|
|
4333
|
+
missingPlatformDocs.push(`${platform}/${doc}`);
|
|
4327
4334
|
}
|
|
4328
4335
|
}
|
|
4329
|
-
|
|
4330
|
-
|
|
4331
|
-
|
|
4332
|
-
|
|
4333
|
-
|
|
4334
|
-
|
|
4335
|
-
|
|
4336
|
-
|
|
4337
|
-
|
|
4338
|
-
|
|
4339
|
-
|
|
4340
|
-
|
|
4341
|
-
|
|
4342
|
-
|
|
4336
|
+
}
|
|
4337
|
+
if (missingPlatformDocs.length > 0) {
|
|
4338
|
+
logger_1.logger.warn(`⚠️ DOC_MATRIX 交叉校验发现 ${missingPlatformDocs.length} 个平台文档缺失: ${missingPlatformDocs.slice(0, 5).join(', ')}${missingPlatformDocs.length > 5 ? '...' : ''}`);
|
|
4339
|
+
logger_1.logger.info(`🔧 自动补建平台骨架文件...`);
|
|
4340
|
+
const missingPlatformEntries = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, '2', ctx.iteration)
|
|
4341
|
+
.filter(e => {
|
|
4342
|
+
const relName = e.relPath; // e.g. "overview/TECH.md" relative to specDir
|
|
4343
|
+
return missingPlatformDocs.some(mp => relName.endsWith(mp) || mp.endsWith(relName));
|
|
4344
|
+
});
|
|
4345
|
+
if (missingPlatformEntries.length > 0) {
|
|
4346
|
+
await (0, spec_skeleton_1.generateSkeleton)(specDir, missingPlatformEntries);
|
|
4347
|
+
logger_1.logger.info(`✅ 已补建 ${missingPlatformEntries.length} 个平台骨架文件,请继续填充`);
|
|
4348
|
+
const newManifest = (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, undefined, ctx.iteration);
|
|
4349
|
+
perDocStatus = await (0, spec_skeleton_1.detectSkeletonProgress)(specDir, newManifest);
|
|
4343
4350
|
}
|
|
4344
4351
|
}
|
|
4345
4352
|
}
|
|
@@ -4615,19 +4622,6 @@ status: "clarified"
|
|
|
4615
4622
|
else {
|
|
4616
4623
|
// 回退:从 010-requirements/ 读取原始需求
|
|
4617
4624
|
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
4625
|
const prdSources = (0, path_1.join)(reqDir, 'sources');
|
|
4632
4626
|
const prdConverted = (0, path_1.join)(reqDir, 'converted');
|
|
4633
4627
|
const prdFeatures = (0, path_1.join)(reqDir, 'features');
|
|
@@ -4822,13 +4816,12 @@ status: "clarified"
|
|
|
4822
4816
|
prompt += ` ⚠️ 如果全局层产物不存在,跳过该项,继续后续分析\n\n`;
|
|
4823
4817
|
prompt += `3. 读取迭代需求文档(按优先级顺序):\n`;
|
|
4824
4818
|
prompt += ` a. 先读 010-requirements/INDEX.md — 了解需求全貌和文件清单\n`;
|
|
4825
|
-
prompt += ` b. 再读 010-requirements
|
|
4826
|
-
prompt += ` c. 再读 010-requirements/
|
|
4827
|
-
prompt += ` d.
|
|
4828
|
-
prompt += ` e. 读取 010-requirements/prototypes/ — 原型文件(HTML/图片/链接均读取)\n`;
|
|
4819
|
+
prompt += ` b. 再读 010-requirements/converted/*.md — doc2spec 转换后的核心规格(主要依据)\n`;
|
|
4820
|
+
prompt += ` c. 再读 010-requirements/features/*/README.md — 功能级补充需求\n`;
|
|
4821
|
+
prompt += ` d. 读取 010-requirements/prototypes/ — 原型文件(HTML/图片/链接均读取)\n`;
|
|
4829
4822
|
prompt += ` ⚠️ 需求文档中链接到原型的(如 \`\` 或 \`详见 prototypes/xxx.html\`),必须主动 Read 该原型文件\n`;
|
|
4830
|
-
prompt += `
|
|
4831
|
-
prompt += `
|
|
4823
|
+
prompt += ` e. 如用户指定了特定文档,优先读取指定文件;如要求全部,再读 sources/ 原始文档\n`;
|
|
4824
|
+
prompt += ` f. **文档长度自适应**:如果单个需求文档超过 5000 字,先快速扫描目录和章节标题,标记关键章节,再深入阅读。不要在非关键章节上花费过多 tokens\n`;
|
|
4832
4825
|
prompt += `4. 读懂需求文档后,按专业模板标准自由撰写每个文档(不是填空表)\n`;
|
|
4833
4826
|
prompt += `5. **文档忠实度约束(最高优先级)**:\n`;
|
|
4834
4827
|
prompt += ` - **严禁臆造**:只能写需求文档中明确提及的功能、接口、页面、字段、业务规则\n`;
|
|
@@ -5464,11 +5457,10 @@ async function buildClarifyPhasePrompt(iteration) {
|
|
|
5464
5457
|
prompt += `\n## 读取需求文档\n\n`;
|
|
5465
5458
|
prompt += `依次读取以下文档(按优先级):\n`;
|
|
5466
5459
|
prompt += `1. \`010-requirements/INDEX.md\` — 需求全貌\n`;
|
|
5467
|
-
prompt += `2. \`010-requirements
|
|
5460
|
+
prompt += `2. \`010-requirements/sources/*.md\` — 原始需求(主要依据)\n`;
|
|
5468
5461
|
prompt += `3. \`010-requirements/converted/*.md\` — 已转换文档\n`;
|
|
5469
5462
|
prompt += `4. \`010-requirements/features/*/README.md\` — 功能级补充\n`;
|
|
5470
|
-
prompt += `5. \`010-requirements/prototypes/\` — 原型文件\n`;
|
|
5471
|
-
prompt += `6. \`010-requirements/sources/*.md\` — 原始需求(补充参考)\n\n`;
|
|
5463
|
+
prompt += `5. \`010-requirements/prototypes/\` — 原型文件\n\n`;
|
|
5472
5464
|
// v8.2.0+: 如果检测到多个功能单元,启用单元化澄清模式
|
|
5473
5465
|
if (hasMultipleUnits) {
|
|
5474
5466
|
prompt += `## ⚠️ 功能单元拆分澄清模式(v8.2.0+)\n\n`;
|
|
@@ -5641,7 +5633,7 @@ async function buildConfirmCheckPrompt(iteration) {
|
|
|
5641
5633
|
prompt += `\`\`\`bash\n`;
|
|
5642
5634
|
prompt += `speccore analyze --prompt -I ${iteration} --pipeline --skip-clarify=false\n`;
|
|
5643
5635
|
prompt += `\`\`\`\n`;
|
|
5644
|
-
prompt += `> 重新进入 clarify-
|
|
5636
|
+
prompt += `> 重新进入 clarify-product 阶段,AI 会基于已有 draft 继续迭代。\n\n`;
|
|
5645
5637
|
prompt += `**选项 C:跳过确认,直接进入分析(风险自负)**\n`;
|
|
5646
5638
|
prompt += `\`\`\`bash\n`;
|
|
5647
5639
|
prompt += `speccore analyze --prompt -I ${iteration} --pipeline --skip-clarify\n`;
|