speccore 8.3.349 → 8.3.366
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/.agents/skills/spec-unitize/SKILL.md +5 -1
- package/.agents/skills/spec-verify/SKILL.md +22 -1
- package/dist/cli.js +19 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/about.d.ts.map +1 -1
- package/dist/commands/about.js +36 -1
- package/dist/commands/about.js.map +1 -1
- package/dist/commands/analyze/add-platform.d.ts +3 -0
- package/dist/commands/analyze/add-platform.d.ts.map +1 -0
- package/dist/commands/analyze/add-platform.js +82 -0
- package/dist/commands/analyze/add-platform.js.map +1 -0
- package/dist/commands/analyze/audit-fix.d.ts +3 -0
- package/dist/commands/analyze/audit-fix.d.ts.map +1 -0
- package/dist/commands/analyze/audit-fix.js +73 -0
- package/dist/commands/analyze/audit-fix.js.map +1 -0
- package/dist/commands/analyze/context-guard.d.ts +3 -0
- package/dist/commands/analyze/context-guard.d.ts.map +1 -0
- package/dist/commands/analyze/context-guard.js +75 -0
- package/dist/commands/analyze/context-guard.js.map +1 -0
- package/dist/commands/analyze/doc.d.ts +3 -0
- package/dist/commands/analyze/doc.d.ts.map +1 -0
- package/dist/commands/analyze/doc.js +77 -0
- package/dist/commands/analyze/doc.js.map +1 -0
- package/dist/commands/analyze/feature.d.ts +3 -0
- package/dist/commands/analyze/feature.d.ts.map +1 -0
- package/dist/commands/analyze/feature.js +75 -0
- package/dist/commands/analyze/feature.js.map +1 -0
- package/dist/commands/analyze/from-code.d.ts +3 -0
- package/dist/commands/analyze/from-code.d.ts.map +1 -0
- package/dist/commands/analyze/from-code.js +94 -0
- package/dist/commands/analyze/from-code.js.map +1 -0
- package/dist/commands/analyze/incremental.d.ts +3 -0
- package/dist/commands/analyze/incremental.d.ts.map +1 -0
- package/dist/commands/analyze/incremental.js +90 -0
- package/dist/commands/analyze/incremental.js.map +1 -0
- package/dist/commands/analyze/modes.d.ts +13 -0
- package/dist/commands/analyze/modes.d.ts.map +1 -0
- package/dist/commands/analyze/modes.js +147 -0
- package/dist/commands/analyze/modes.js.map +1 -0
- package/dist/commands/analyze/module.d.ts +3 -0
- package/dist/commands/analyze/module.d.ts.map +1 -0
- package/dist/commands/analyze/module.js +95 -0
- package/dist/commands/analyze/module.js.map +1 -0
- package/dist/commands/analyze/overview.d.ts +3 -0
- package/dist/commands/analyze/overview.d.ts.map +1 -0
- package/dist/commands/analyze/overview.js +125 -0
- package/dist/commands/analyze/overview.js.map +1 -0
- package/dist/commands/analyze/shared.d.ts +53 -0
- package/dist/commands/analyze/shared.d.ts.map +1 -0
- package/dist/commands/analyze/shared.js +34 -0
- package/dist/commands/analyze/shared.js.map +1 -0
- package/dist/commands/analyze/units.d.ts +46 -0
- package/dist/commands/analyze/units.d.ts.map +1 -0
- package/dist/commands/analyze/units.js +950 -0
- package/dist/commands/analyze/units.js.map +1 -0
- package/dist/commands/analyze.d.ts +6 -88
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +167 -1419
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/ask.d.ts.map +1 -1
- package/dist/commands/ask.js +4 -2
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/dashboard.d.ts.map +1 -1
- package/dist/commands/dashboard.js +36 -1
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/deploy.d.ts +6 -0
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +153 -0
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/doc2spec.d.ts +1 -1
- package/dist/commands/doc2spec.d.ts.map +1 -1
- package/dist/commands/doc2spec.js +39 -24
- package/dist/commands/doc2spec.js.map +1 -1
- package/dist/commands/doctor.js +60 -13
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +22 -0
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/help.js +36 -1
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pipeline.d.ts.map +1 -1
- package/dist/commands/pipeline.js +15 -0
- package/dist/commands/pipeline.js.map +1 -1
- package/dist/commands/plan.js +2 -0
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/pr.d.ts.map +1 -1
- package/dist/commands/pr.js +14 -3
- package/dist/commands/pr.js.map +1 -1
- package/dist/commands/prompts.d.ts +11 -1
- package/dist/commands/prompts.d.ts.map +1 -1
- package/dist/commands/prompts.js +197 -15
- package/dist/commands/prompts.js.map +1 -1
- package/dist/commands/reindex.d.ts.map +1 -1
- package/dist/commands/reindex.js +23 -0
- package/dist/commands/reindex.js.map +1 -1
- package/dist/commands/retro.d.ts.map +1 -1
- package/dist/commands/retro.js +3 -1
- package/dist/commands/retro.js.map +1 -1
- package/dist/commands/status-panel.d.ts.map +1 -1
- package/dist/commands/status-panel.js +9 -1
- package/dist/commands/status-panel.js.map +1 -1
- package/dist/commands/unitize.d.ts +3 -0
- package/dist/commands/unitize.d.ts.map +1 -1
- package/dist/commands/unitize.js +183 -6
- package/dist/commands/unitize.js.map +1 -1
- package/dist/commands/update-env-configs.d.ts.map +1 -1
- package/dist/commands/update-env-configs.js +10 -0
- package/dist/commands/update-env-configs.js.map +1 -1
- package/dist/commands/verify.d.ts +8 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +383 -16
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/welcome.d.ts.map +1 -1
- package/dist/commands/welcome.js +3 -1
- package/dist/commands/welcome.js.map +1 -1
- package/dist/core/ai-context-generator.d.ts +21 -0
- package/dist/core/ai-context-generator.d.ts.map +1 -1
- package/dist/core/ai-context-generator.js +54 -1
- package/dist/core/ai-context-generator.js.map +1 -1
- package/dist/core/ai-verify/plan-generator.d.ts +94 -0
- package/dist/core/ai-verify/plan-generator.d.ts.map +1 -0
- package/dist/core/ai-verify/plan-generator.js +598 -0
- package/dist/core/ai-verify/plan-generator.js.map +1 -0
- package/dist/core/ai-verify/result-parser.d.ts +27 -0
- package/dist/core/ai-verify/result-parser.d.ts.map +1 -0
- package/dist/core/ai-verify/result-parser.js +212 -0
- package/dist/core/ai-verify/result-parser.js.map +1 -0
- package/dist/core/ai-verify/scope-resolver.d.ts +34 -0
- package/dist/core/ai-verify/scope-resolver.d.ts.map +1 -0
- package/dist/core/ai-verify/scope-resolver.js +183 -0
- package/dist/core/ai-verify/scope-resolver.js.map +1 -0
- package/dist/core/ai-verify/types.d.ts +171 -0
- package/dist/core/ai-verify/types.d.ts.map +1 -0
- package/dist/core/ai-verify/types.js +9 -0
- package/dist/core/ai-verify/types.js.map +1 -0
- package/dist/core/ai-verify/visual-judge.d.ts +33 -0
- package/dist/core/ai-verify/visual-judge.d.ts.map +1 -0
- package/dist/core/ai-verify/visual-judge.js +123 -0
- package/dist/core/ai-verify/visual-judge.js.map +1 -0
- package/dist/core/analyze-engine.d.ts.map +1 -1
- package/dist/core/analyze-engine.js +2 -1
- package/dist/core/analyze-engine.js.map +1 -1
- package/dist/core/ask-engine.d.ts +6 -0
- package/dist/core/ask-engine.d.ts.map +1 -1
- package/dist/core/ask-engine.js +83 -3
- package/dist/core/ask-engine.js.map +1 -1
- package/dist/core/code-graph/builder.d.ts.map +1 -1
- package/dist/core/code-graph/builder.js +93 -75
- package/dist/core/code-graph/builder.js.map +1 -1
- package/dist/core/code-graph/incremental-build.d.ts.map +1 -1
- package/dist/core/code-graph/incremental-build.js +13 -19
- package/dist/core/code-graph/incremental-build.js.map +1 -1
- package/dist/core/code-graph/index.d.ts +1 -1
- package/dist/core/code-graph/index.d.ts.map +1 -1
- package/dist/core/code-graph/index.js +15 -12
- package/dist/core/code-graph/index.js.map +1 -1
- package/dist/core/code-graph/multimodal.js +1 -1
- package/dist/core/code-graph/parser.js +1 -1
- package/dist/core/code-graph/query.d.ts +1 -1
- package/dist/core/code-graph/reporter.d.ts +1 -1
- package/dist/core/code-graph/reporter.d.ts.map +1 -1
- package/dist/core/code-graph/reporter.js +18 -10
- package/dist/core/code-graph/reporter.js.map +1 -1
- package/dist/core/code-graph/requirement-linker.d.ts.map +1 -1
- package/dist/core/code-graph/requirement-linker.js +24 -14
- package/dist/core/code-graph/requirement-linker.js.map +1 -1
- package/dist/core/code-graph/types.d.ts +1 -1
- package/dist/core/code-graph/types.js +1 -1
- package/dist/core/code-graph/visualizer.d.ts +1 -7
- package/dist/core/code-graph/visualizer.d.ts.map +1 -1
- package/dist/core/code-graph/visualizer.js +476 -49
- package/dist/core/code-graph/visualizer.js.map +1 -1
- package/dist/core/code-scanner.d.ts +2 -0
- package/dist/core/code-scanner.d.ts.map +1 -1
- package/dist/core/code-scanner.js +13 -1
- package/dist/core/code-scanner.js.map +1 -1
- package/dist/core/deploy/engine.d.ts +21 -0
- package/dist/core/deploy/engine.d.ts.map +1 -1
- package/dist/core/deploy/engine.js +276 -0
- package/dist/core/deploy/engine.js.map +1 -1
- package/dist/core/deploy-ledger.d.ts +12 -0
- package/dist/core/deploy-ledger.d.ts.map +1 -0
- package/dist/core/deploy-ledger.js +35 -0
- package/dist/core/deploy-ledger.js.map +1 -0
- package/dist/core/environment-config.d.ts +11 -0
- package/dist/core/environment-config.d.ts.map +1 -1
- package/dist/core/environment-config.js +4 -0
- package/dist/core/environment-config.js.map +1 -1
- package/dist/core/intent-cache.d.ts.map +1 -1
- package/dist/core/intent-cache.js +6 -0
- package/dist/core/intent-cache.js.map +1 -1
- package/dist/core/knowledge-visualizer.js +1 -1
- package/dist/core/page-bundle.d.ts +2 -0
- package/dist/core/page-bundle.d.ts.map +1 -1
- package/dist/core/page-bundle.js +18 -1
- package/dist/core/page-bundle.js.map +1 -1
- package/dist/core/plan-html.js +1 -1
- package/dist/core/platform-inference.d.ts +35 -0
- package/dist/core/platform-inference.d.ts.map +1 -1
- package/dist/core/platform-inference.js +92 -0
- package/dist/core/platform-inference.js.map +1 -1
- package/dist/core/prompt-plugins/analyze-graph-plugin.d.ts.map +1 -1
- package/dist/core/prompt-plugins/analyze-graph-plugin.js +16 -1
- package/dist/core/prompt-plugins/analyze-graph-plugin.js.map +1 -1
- package/dist/core/prompt-plugins/execute-graph-plugin.d.ts +2 -0
- package/dist/core/prompt-plugins/execute-graph-plugin.d.ts.map +1 -1
- package/dist/core/prompt-plugins/execute-graph-plugin.js +127 -27
- package/dist/core/prompt-plugins/execute-graph-plugin.js.map +1 -1
- package/dist/core/quality-audit.d.ts.map +1 -1
- package/dist/core/quality-audit.js +18 -0
- package/dist/core/quality-audit.js.map +1 -1
- package/dist/core/rag-engine.d.ts.map +1 -1
- package/dist/core/rag-engine.js +12 -243
- package/dist/core/rag-engine.js.map +1 -1
- package/dist/core/reindex-engine.d.ts +20 -0
- package/dist/core/reindex-engine.d.ts.map +1 -1
- package/dist/core/reindex-engine.js +142 -0
- package/dist/core/reindex-engine.js.map +1 -1
- package/dist/core/requirement-clarifier.d.ts.map +1 -1
- package/dist/core/requirement-clarifier.js +22 -6
- package/dist/core/requirement-clarifier.js.map +1 -1
- package/dist/core/reverse-requirement.d.ts +37 -0
- package/dist/core/reverse-requirement.d.ts.map +1 -1
- package/dist/core/reverse-requirement.js +84 -9
- package/dist/core/reverse-requirement.js.map +1 -1
- package/dist/core/spec-paths.d.ts +5 -0
- package/dist/core/spec-paths.d.ts.map +1 -1
- package/dist/core/spec-paths.js +1 -0
- package/dist/core/spec-paths.js.map +1 -1
- package/dist/core/test-config.d.ts +7 -1
- package/dist/core/test-config.d.ts.map +1 -1
- package/dist/core/test-config.js +59 -11
- package/dist/core/test-config.js.map +1 -1
- package/dist/core/ui-verify/index.d.ts +1 -1
- package/dist/core/ui-verify/index.d.ts.map +1 -1
- package/dist/core/ui-verify/index.js +2 -1
- package/dist/core/ui-verify/index.js.map +1 -1
- package/dist/core/ui-verify/smoke-engine.js +71 -15
- package/dist/core/ui-verify/smoke-engine.js.map +1 -1
- package/dist/core/ui-verify/spec-generator.d.ts +5 -9
- package/dist/core/ui-verify/spec-generator.d.ts.map +1 -1
- package/dist/core/ui-verify/spec-generator.js +66 -3
- package/dist/core/ui-verify/spec-generator.js.map +1 -1
- package/dist/core/ui-verify/types.d.ts +25 -0
- package/dist/core/ui-verify/types.d.ts.map +1 -1
- package/dist/core/ui-verify/visual-model-client.d.ts +2 -0
- package/dist/core/ui-verify/visual-model-client.d.ts.map +1 -1
- package/dist/core/ui-verify/visual-model-client.js +4 -4
- package/dist/core/ui-verify/visual-model-client.js.map +1 -1
- package/dist/core/unified-config.d.ts +27 -0
- package/dist/core/unified-config.d.ts.map +1 -1
- package/dist/core/unified-config.js +37 -0
- package/dist/core/unified-config.js.map +1 -1
- package/dist/core/unified-retrieval.d.ts +8 -0
- package/dist/core/unified-retrieval.d.ts.map +1 -1
- package/dist/core/unified-retrieval.js +18 -0
- package/dist/core/unified-retrieval.js.map +1 -1
- package/dist/utils/synonyms.d.ts.map +1 -1
- package/dist/utils/synonyms.js +4 -0
- package/dist/utils/synonyms.js.map +1 -1
- package/package.json +1 -1
- package/templates/accounts-example.yaml +49 -0
- package/templates/html/fonts/JetBrainsMono.woff2 +0 -0
- package/templates/html/fonts/Orbitron.woff2 +0 -0
- package/templates/html/speccore-ask-explain.html +1 -1
- package/templates/html/speccore-ask-guide.html +2 -2
- package/templates/html/speccore-ask-match.html +1 -1
- package/templates/html/speccore-ask-pipeline.html +1 -1
- package/templates/html/speccore-ask-result.html +2 -2
- package/templates/html/speccore-help.html +2 -2
- package/templates/html/speccore-setup-guide.html +16 -1
- package/templates/speccore-yml-example.yml +12 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.analyzeContextGuard = analyzeContextGuard;
|
|
37
|
+
/**
|
|
38
|
+
* analyze 模式:--context-guard / --estimate-only 上下文爆炸防护
|
|
39
|
+
* 返回 true 表示已处理完毕(调用点应直接 return)。
|
|
40
|
+
* v8.3.341+: 从 analyzeCommand 抽出的模式早退块
|
|
41
|
+
* v8.3.359+: 从 analyze.ts 拆分(渐进重构批次 B,逻辑不搬家、行为不变)
|
|
42
|
+
*/
|
|
43
|
+
const logger_1 = require("../../utils/logger");
|
|
44
|
+
const context_1 = require("../../core/context");
|
|
45
|
+
const shared_1 = require("./shared");
|
|
46
|
+
async function analyzeContextGuard(options) {
|
|
47
|
+
const iter = options.iteration || await (0, context_1.getDefaultIteration)();
|
|
48
|
+
if (!iter) {
|
|
49
|
+
logger_1.logger.error('请指定迭代: -I <iteration>');
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
const iterDir = await (0, context_1.getIterationDir)(iter);
|
|
53
|
+
const { estimateContextSize, buildSegmentationPlan, buildContextGuardPrompt } = await Promise.resolve().then(() => __importStar(require('../../core/analyze-context-guard')));
|
|
54
|
+
const estimate = await estimateContextSize(iterDir, { withCode: options.withCode });
|
|
55
|
+
const plan = await buildSegmentationPlan(estimate, iterDir, { withCode: options.withCode });
|
|
56
|
+
logger_1.logger.info('');
|
|
57
|
+
logger_1.logger.info('📊 上下文大小预估报告');
|
|
58
|
+
logger_1.logger.info(`预估 Tokens: ~${estimate.estimatedTokens.toLocaleString()} (${estimate.level})`);
|
|
59
|
+
logger_1.logger.info(`推荐策略: ${estimate.recommendedStrategy}`);
|
|
60
|
+
logger_1.logger.info(`分段数: ${plan.segments.length}`);
|
|
61
|
+
if (options.estimateOnly) {
|
|
62
|
+
// 只输出预估报告到 prompt
|
|
63
|
+
const prompt = buildContextGuardPrompt(estimate, plan);
|
|
64
|
+
await (0, shared_1.emitAiPrompt)(iter, prompt, { mode: 'context-guard' });
|
|
65
|
+
process.exitCode = 10;
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
// context-guard 模式下,将预估信息注入后续 prompt
|
|
69
|
+
// 通过全局变量或 options 传递(简化处理:直接输出报告后继续)
|
|
70
|
+
logger_1.logger.info('');
|
|
71
|
+
logger_1.logger.info('💡 继续执行分析,建议按上述分段策略进行');
|
|
72
|
+
logger_1.logger.info('');
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=context-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-guard.js","sourceRoot":"","sources":["../../../src/commands/analyze/context-guard.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,kDA6BC;AAxCD;;;;;GAKG;AACH,+CAA4C;AAC5C,gDAA0E;AAC1E,qCAAwC;AAGjC,KAAK,UAAU,mBAAmB,CAAC,OAAuB;IAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,IAAA,6BAAmB,GAAE,CAAC;IAC9D,IAAI,CAAC,IAAI,EAAE,CAAC;QAAC,eAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAClE,MAAM,OAAO,GAAG,MAAM,IAAA,yBAAe,EAAC,IAAI,CAAC,CAAC;IAE5C,MAAM,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,GAAG,wDAAa,kCAAkC,GAAC,CAAC;IACjI,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpF,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE5F,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,eAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5B,eAAM,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,eAAe,CAAC,cAAc,EAAE,KAAK,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;IAC5F,eAAM,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACrD,eAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAE5C,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,kBAAkB;QAClB,MAAM,MAAM,GAAG,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACvD,MAAM,IAAA,qBAAY,EAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qCAAqC;IACrC,qCAAqC;IACrC,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,eAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACrC,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc.d.ts","sourceRoot":"","sources":["../../../src/commands/analyze/doc.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiChG"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.analyzeDocMode = analyzeDocMode;
|
|
37
|
+
/**
|
|
38
|
+
* analyze 模式:--doc 局部刷新单个类型文档(bugs/refactors/research)
|
|
39
|
+
* v8.3.341+: 从 analyzeCommand 抽出的模式早退块
|
|
40
|
+
* v8.3.359+: 从 analyze.ts 拆分(渐进重构批次 B,逻辑不搬家、行为不变)
|
|
41
|
+
*/
|
|
42
|
+
const logger_1 = require("../../utils/logger");
|
|
43
|
+
const context_1 = require("../../core/context");
|
|
44
|
+
async function analyzeDocMode(options, projectRoot) {
|
|
45
|
+
const iter = options.iteration || await (0, context_1.getDefaultIteration)();
|
|
46
|
+
if (!iter) {
|
|
47
|
+
logger_1.logger.error('请指定迭代: -I <iteration>');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const iterDir = await (0, context_1.getIterationDir)(iter);
|
|
51
|
+
// 调用点已保证 options.doc 非空,此处断言恢复 narrowing
|
|
52
|
+
const docPath = options.doc; // e.g. "bugs/login-timeout" or "refactors/db-pool"
|
|
53
|
+
const spinner = new logger_1.Spinner(`局部分析: ${docPath}`);
|
|
54
|
+
spinner.start();
|
|
55
|
+
const { analyzeSingleTypedDoc } = await Promise.resolve().then(() => __importStar(require('../../core/analyze-engine')));
|
|
56
|
+
const result = await analyzeSingleTypedDoc(iterDir, docPath);
|
|
57
|
+
if (!result) {
|
|
58
|
+
spinner.fail(`未找到类型文档: 010-requirements/${docPath}.md`);
|
|
59
|
+
logger_1.logger.info(' 支持的格式: bugs/<slug>, refactors/<slug>, research/<slug>');
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const typeDir = docPath.split('/')[0];
|
|
63
|
+
spinner.stop(`✅ 局部分析完成: 020-specs/${docPath}.md`);
|
|
64
|
+
logger_1.logger.info('');
|
|
65
|
+
// 自动刷新知识图谱
|
|
66
|
+
try {
|
|
67
|
+
const { refreshKnowledgeGraph } = await Promise.resolve().then(() => __importStar(require('../../core/knowledge-graph')));
|
|
68
|
+
await refreshKnowledgeGraph(projectRoot, iter);
|
|
69
|
+
logger_1.logger.info('🧠 知识图谱已刷新');
|
|
70
|
+
}
|
|
71
|
+
catch { }
|
|
72
|
+
logger_1.logger.info('');
|
|
73
|
+
logger_1.logger.info('📋 下一步:');
|
|
74
|
+
logger_1.logger.info(` speccore iteration taskify -i ${iter} # 重新拆分任务`);
|
|
75
|
+
logger_1.logger.info(` speccore reindex # 完整重建索引`);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=doc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc.js","sourceRoot":"","sources":["../../../src/commands/analyze/doc.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,wCAiCC;AA1CD;;;;GAIG;AACH,+CAAqD;AACrD,gDAA0E;AAGnE,KAAK,UAAU,cAAc,CAAC,OAAuB,EAAE,WAAmB;IAC/E,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,IAAA,6BAAmB,GAAE,CAAC;IAC9D,IAAI,CAAC,IAAI,EAAE,CAAC;QAAC,eAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,MAAM,IAAA,yBAAe,EAAC,IAAI,CAAC,CAAC;IAC5C,yCAAyC;IACzC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAa,CAAC,CAAC,mDAAmD;IAE1F,MAAM,OAAO,GAAG,IAAI,gBAAO,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,MAAM,EAAE,qBAAqB,EAAE,GAAG,wDAAa,2BAA2B,GAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,6BAA6B,OAAO,KAAK,CAAC,CAAC;QACxD,eAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QACxE,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,uBAAuB,OAAO,KAAK,CAAC,CAAC;IAClD,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhB,WAAW;IACX,IAAI,CAAC;QACH,MAAM,EAAE,qBAAqB,EAAE,GAAG,wDAAa,4BAA4B,GAAC,CAAC;QAC7E,MAAM,qBAAqB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC/C,eAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,eAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,eAAM,CAAC,IAAI,CAAC,oCAAoC,IAAI,oBAAoB,CAAC,CAAC;IAC1E,eAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature.d.ts","sourceRoot":"","sources":["../../../src/commands/analyze/feature.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BpG"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.analyzeFeatureMode = analyzeFeatureMode;
|
|
37
|
+
/**
|
|
38
|
+
* analyze 模式:--feature 局部刷新单个功能模块
|
|
39
|
+
* v8.3.341+: 从 analyzeCommand 抽出的模式早退块
|
|
40
|
+
* v8.3.359+: 从 analyze.ts 拆分(渐进重构批次 B,逻辑不搬家、行为不变)
|
|
41
|
+
*/
|
|
42
|
+
const logger_1 = require("../../utils/logger");
|
|
43
|
+
const context_1 = require("../../core/context");
|
|
44
|
+
const analyze_engine_1 = require("../../core/analyze-engine");
|
|
45
|
+
async function analyzeFeatureMode(options, projectRoot) {
|
|
46
|
+
const iter = options.iteration || await (0, context_1.getDefaultIteration)();
|
|
47
|
+
if (!iter) {
|
|
48
|
+
logger_1.logger.error('请指定迭代: -I <iteration>');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const iterDir = await (0, context_1.getIterationDir)(iter);
|
|
52
|
+
// 调用点已保证 options.feature 非空,此处断言恢复 narrowing
|
|
53
|
+
const featureName = options.feature;
|
|
54
|
+
const spinner = new logger_1.Spinner(`局部分析: ${featureName}`);
|
|
55
|
+
spinner.start();
|
|
56
|
+
const result = await (0, analyze_engine_1.analyzeSingleFeature)(iterDir, featureName);
|
|
57
|
+
if (!result) {
|
|
58
|
+
spinner.fail(`未找到功能模块: 010-requirements/features/${featureName}/SOURCE.md(旧项目为 README.md)`);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
spinner.stop(`✅ 局部分析完成: 020-specs/features/${featureName}.md`);
|
|
62
|
+
logger_1.logger.info('');
|
|
63
|
+
// 自动刷新知识图谱
|
|
64
|
+
try {
|
|
65
|
+
const { refreshKnowledgeGraph } = await Promise.resolve().then(() => __importStar(require('../../core/knowledge-graph')));
|
|
66
|
+
await refreshKnowledgeGraph(projectRoot, iter);
|
|
67
|
+
logger_1.logger.info('🧠 知识图谱已刷新');
|
|
68
|
+
}
|
|
69
|
+
catch { }
|
|
70
|
+
logger_1.logger.info('');
|
|
71
|
+
logger_1.logger.info('📋 下一步:');
|
|
72
|
+
logger_1.logger.info(` speccore iteration taskify -i ${iter} # 重新拆分任务`);
|
|
73
|
+
logger_1.logger.info(` speccore reindex # 完整重建索引`);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature.js","sourceRoot":"","sources":["../../../src/commands/analyze/feature.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,gDA8BC;AAxCD;;;;GAIG;AACH,+CAAqD;AACrD,gDAA0E;AAC1E,8DAAiE;AAG1D,KAAK,UAAU,kBAAkB,CAAC,OAAuB,EAAE,WAAmB;IACnF,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,IAAA,6BAAmB,GAAE,CAAC;IAC9D,IAAI,CAAC,IAAI,EAAE,CAAC;QAAC,eAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,MAAM,IAAA,yBAAe,EAAC,IAAI,CAAC,CAAC;IAC5C,6CAA6C;IAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAiB,CAAC;IAE9C,MAAM,OAAO,GAAG,IAAI,gBAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,MAAM,MAAM,GAAG,MAAM,IAAA,qCAAoB,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAChE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,sCAAsC,WAAW,4BAA4B,CAAC,CAAC;QAC5F,OAAO;IACT,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,gCAAgC,WAAW,KAAK,CAAC,CAAC;IAC/D,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhB,WAAW;IACX,IAAI,CAAC;QACH,MAAM,EAAE,qBAAqB,EAAE,GAAG,wDAAa,4BAA4B,GAAC,CAAC;QAC7E,MAAM,qBAAqB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC/C,eAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,eAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,eAAM,CAAC,IAAI,CAAC,oCAAoC,IAAI,oBAAoB,CAAC,CAAC;IAC1E,eAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"from-code.d.ts","sourceRoot":"","sources":["../../../src/commands/analyze/from-code.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,wBAAsB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAgD5E"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.analyzeFromCode = analyzeFromCode;
|
|
37
|
+
/**
|
|
38
|
+
* analyze 模式:--from-code 源码反推需求(两跳 IR→UR)+ 全局技术分析
|
|
39
|
+
* v8.3.359+: 从 analyze.ts 拆分(渐进重构批次 B,逻辑不搬家、行为不变)
|
|
40
|
+
*/
|
|
41
|
+
const path_1 = require("path");
|
|
42
|
+
const logger_1 = require("../../utils/logger");
|
|
43
|
+
async function analyzeFromCode(options) {
|
|
44
|
+
const { reverseRequirementsFromCode, verifyReverseAnchors } = await Promise.resolve().then(() => __importStar(require('../../core/reverse-requirement')));
|
|
45
|
+
// v8.3.301+: 验证环——只校验锚点一致性,不重跑反推(宿主 AI 填完 UR 后运行)
|
|
46
|
+
if (options.verify) {
|
|
47
|
+
try {
|
|
48
|
+
await verifyReverseAnchors(options.outDir || (0, path_1.join)('.speccore', 'GLOBAL', 'requirements'));
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
logger_1.logger.error(`锚点校验失败: ${e?.message || e}`);
|
|
52
|
+
}
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const { generateGlobalArtifacts } = await Promise.resolve().then(() => __importStar(require('../../core/global-artifacts')));
|
|
56
|
+
const sources = options.source
|
|
57
|
+
? options.source.split(',').map(s => s.trim()).filter(Boolean)
|
|
58
|
+
: options.sourceScope
|
|
59
|
+
? options.sourceScope.split(',').map(s => s.trim()).filter(Boolean)
|
|
60
|
+
: [];
|
|
61
|
+
try {
|
|
62
|
+
// 1. 全局技术分析文档(TECH_STACK/CODE_INDEX/ARCHITECTURE/API_INVENTORY/DATA_MODEL/GLOSSARY/按端 OVERVIEW+TECH)
|
|
63
|
+
await generateGlobalArtifacts(sources, options.depth || 'normal');
|
|
64
|
+
// 2. 从源码反推需求(两跳 IR→UR)
|
|
65
|
+
const result = await reverseRequirementsFromCode({
|
|
66
|
+
sources,
|
|
67
|
+
depth: options.depth,
|
|
68
|
+
platforms: options.platform ? options.platform.split(',').map(p => p.trim()).filter(Boolean) : undefined,
|
|
69
|
+
outputDir: options.outDir,
|
|
70
|
+
});
|
|
71
|
+
logger_1.logger.info('');
|
|
72
|
+
logger_1.logger.info(`🎯 源码反推需求完成(status: candidate,澄清后才成 Spec)`);
|
|
73
|
+
logger_1.logger.info(` 📄 UR 骨架: ${(0, path_1.join)(result.outputDir, 'REQUIREMENT.md')}`);
|
|
74
|
+
logger_1.logger.info(` 🧩 IR 目录: ${result.irDir}(${result.irCount} 个模块)`);
|
|
75
|
+
logger_1.logger.info(` 📝 两跳指引: ${result.promptPath}`);
|
|
76
|
+
logger_1.logger.info('');
|
|
77
|
+
logger_1.logger.info(` 下一步:让宿主 AI 按 REVERSE_PROMPT.md 完成两跳语义抽象,再人工确认功能单元边界。`);
|
|
78
|
+
// v8.3.356+: 需求↔代码联动(requirement-linker 从零接入变为链上消费)——
|
|
79
|
+
// 反推需求落盘后立即与源码图谱建立关联(REQ_CODE_LINK.json),
|
|
80
|
+
// 让「源码→需求」的产物可反向追溯到代码节点。
|
|
81
|
+
try {
|
|
82
|
+
const { linkRequirementsToCode } = await Promise.resolve().then(() => __importStar(require('../../core/code-graph')));
|
|
83
|
+
const link = await linkRequirementsToCode(process.cwd(), undefined);
|
|
84
|
+
logger_1.logger.info(` 🔗 需求↔代码联动: ${link.totalRequirements} 需求 ↔ ${link.totalLinkedNodes} 节点(覆盖率 ${(link.coverageRatio * 100).toFixed(0)}%)`);
|
|
85
|
+
}
|
|
86
|
+
catch (linkError) {
|
|
87
|
+
logger_1.logger.warn(` ⚠️ 需求↔代码联动跳过: ${linkError?.message || linkError}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
logger_1.logger.error(`源码反推需求失败: ${e?.message || e}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=from-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"from-code.js","sourceRoot":"","sources":["../../../src/commands/analyze/from-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental.d.ts","sourceRoot":"","sources":["../../../src/commands/analyze/incremental.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CnF"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.analyzeIncrementalMode = analyzeIncrementalMode;
|
|
37
|
+
/**
|
|
38
|
+
* analyze 模式:--incremental / --reanalyze 增量分析
|
|
39
|
+
* v6.75.0+: 从 analyzeCommand 抽出的模式早退块
|
|
40
|
+
* v8.3.359+: 从 analyze.ts 拆分(渐进重构批次 E,逻辑不搬家、行为不变)
|
|
41
|
+
*/
|
|
42
|
+
const logger_1 = require("../../utils/logger");
|
|
43
|
+
const context_1 = require("../../core/context");
|
|
44
|
+
const shared_1 = require("./shared");
|
|
45
|
+
async function analyzeIncrementalMode(options) {
|
|
46
|
+
const iter = options.iteration || await (0, context_1.getDefaultIteration)();
|
|
47
|
+
if (!iter) {
|
|
48
|
+
logger_1.logger.error('请指定迭代: -I <iteration>');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const iterDir = await (0, context_1.getIterationDir)(iter);
|
|
52
|
+
const { runIncrementalAnalysis, buildIncrementalPrompt } = await Promise.resolve().then(() => __importStar(require('../../core/incremental-analyzer')));
|
|
53
|
+
const analysis = await runIncrementalAnalysis(iterDir, { withCode: options.withCode });
|
|
54
|
+
if (!analysis.hasChanges && analysis.potentialGaps.length === 0) {
|
|
55
|
+
logger_1.logger.success('✅ 未检测到变更,所有分析产出均为最新');
|
|
56
|
+
logger_1.logger.info(' 如需强制重新分析,去掉 --incremental 参数');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
logger_1.logger.info('');
|
|
60
|
+
logger_1.logger.info(`📊 增量分析结果: ${analysis.recommendation}`);
|
|
61
|
+
logger_1.logger.info('');
|
|
62
|
+
if (options.prompt) {
|
|
63
|
+
const prompt = buildIncrementalPrompt(iterDir, analysis, iter);
|
|
64
|
+
await (0, shared_1.emitAiPrompt)(iter, prompt, { mode: 'incremental' });
|
|
65
|
+
process.exitCode = 10;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// 非 prompt 模式,输出摘要
|
|
69
|
+
const changedReqs = analysis.requirementChanges.filter(c => c.changeType !== 'unchanged');
|
|
70
|
+
if (changedReqs.length > 0) {
|
|
71
|
+
logger_1.logger.info(`✏️ 需求文档变更: ${changedReqs.length} 个`);
|
|
72
|
+
}
|
|
73
|
+
const changedCode = analysis.codeChanges.filter(c => c.changeType !== 'unchanged');
|
|
74
|
+
if (changedCode.length > 0) {
|
|
75
|
+
logger_1.logger.info(`✏️ 源码文件变更: ${changedCode.length} 个`);
|
|
76
|
+
}
|
|
77
|
+
if (analysis.addedPlatforms.length > 0) {
|
|
78
|
+
logger_1.logger.info(`🆕 新增端: ${analysis.addedPlatforms.join(', ')}`);
|
|
79
|
+
}
|
|
80
|
+
if (analysis.potentialGaps.length > 0) {
|
|
81
|
+
logger_1.logger.info(`⚠️ 潜在遗漏: ${analysis.potentialGaps.length} 项`);
|
|
82
|
+
for (const gap of analysis.potentialGaps) {
|
|
83
|
+
logger_1.logger.info(` • ${gap}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
logger_1.logger.info('');
|
|
87
|
+
logger_1.logger.info('📋 下一步:');
|
|
88
|
+
logger_1.logger.info(` speccore analyze --prompt -I ${iter} --incremental`);
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=incremental.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental.js","sourceRoot":"","sources":["../../../src/commands/analyze/incremental.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* analyze 模式注册表(Strategy 模式)——detect 谓词与处理器解耦。
|
|
3
|
+
* 注册顺序即优先级,与旧 analyzeCommand if 瀑布的检测顺序完全一致;
|
|
4
|
+
* 命中即退出(handle 返回 true),唯一例外 --context-guard 可能返回 false 继续往下走。
|
|
5
|
+
* v8.3.359+: 从 analyzeCommand 的 if 瀑布抽取(渐进重构批次 F,逻辑不搬家、行为不变)
|
|
6
|
+
*/
|
|
7
|
+
import type { AnalyzeOptions } from './shared';
|
|
8
|
+
/**
|
|
9
|
+
* 按注册表顺序分发模式:首个 detect 命中的策略执行 handle,
|
|
10
|
+
* 返回 true 表示已处理完成(analyzeCommand 应退出)。
|
|
11
|
+
*/
|
|
12
|
+
export declare function dispatchAnalyzeModes(options: AnalyzeOptions, projectRoot: string): Promise<boolean>;
|
|
13
|
+
//# sourceMappingURL=modes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modes.d.ts","sourceRoot":"","sources":["../../../src/commands/analyze/modes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AA8G/C;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMzG"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.dispatchAnalyzeModes = dispatchAnalyzeModes;
|
|
37
|
+
const from_code_1 = require("./from-code");
|
|
38
|
+
const audit_fix_1 = require("./audit-fix");
|
|
39
|
+
const context_guard_1 = require("./context-guard");
|
|
40
|
+
const incremental_1 = require("./incremental");
|
|
41
|
+
const add_platform_1 = require("./add-platform");
|
|
42
|
+
const module_1 = require("./module");
|
|
43
|
+
const feature_1 = require("./feature");
|
|
44
|
+
const doc_1 = require("./doc");
|
|
45
|
+
const overview_1 = require("./overview");
|
|
46
|
+
const units_1 = require("./units");
|
|
47
|
+
/** 模式注册表——顺序即优先级,与旧 if 瀑布检测顺序一致 */
|
|
48
|
+
const MODE_STRATEGIES = [
|
|
49
|
+
{
|
|
50
|
+
// --from-code 模式: 从源码反推需求(两跳 IR→UR)+ 全局技术分析
|
|
51
|
+
// v8.3.184+: CLI 确定性产出「逐模块 IR 骨架 + 合成 UR 骨架 + 两跳 prompt + 全局技术分析文档集」,
|
|
52
|
+
// 宿主 AI 完成语义抽象
|
|
53
|
+
name: 'from-code',
|
|
54
|
+
detect: (o) => !!o.fromCode,
|
|
55
|
+
handle: async (o) => { await (0, from_code_1.analyzeFromCode)(o); return true; },
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
// --full 模式: 委托给 synthesizeCommand(原 synthesize 命令)
|
|
59
|
+
// v8.3.1+ 修复:--phase 不再委托给 synthesize,analyze 的 Phase 1/2 由 analyze 自己处理
|
|
60
|
+
// 原因:analyze --phase 2 应该生成端级文档({端}/TECH.md/DEV_GUIDE.md),
|
|
61
|
+
// 而 synthesize --phase 2 是跨端关系提取(CROSS_PLATFORM.md/ARCHITECTURE.md),
|
|
62
|
+
// 两者完全不同,委托会导致用户永远无法执行 analyze 的 Phase 2
|
|
63
|
+
name: 'full',
|
|
64
|
+
detect: (o) => !!o.full,
|
|
65
|
+
handle: async (o) => {
|
|
66
|
+
const { synthesizeCommand } = await Promise.resolve().then(() => __importStar(require('../synthesize')));
|
|
67
|
+
await synthesizeCommand({
|
|
68
|
+
iteration: o.iteration,
|
|
69
|
+
withCode: o.withCode,
|
|
70
|
+
prompt: o.prompt,
|
|
71
|
+
apply: o.apply,
|
|
72
|
+
full: o.full,
|
|
73
|
+
phase: o.phase,
|
|
74
|
+
applyPhase: o.applyPhase,
|
|
75
|
+
});
|
|
76
|
+
return true;
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
// --audit-fix 模式: 读取质量审计报告并生成修复指令
|
|
81
|
+
name: 'audit-fix',
|
|
82
|
+
detect: (o) => !!o.auditFix,
|
|
83
|
+
handle: async (o) => { await (0, audit_fix_1.analyzeAuditFix)(o); return true; },
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
// v6.75.0+: 上下文爆炸防护(--context-guard / --estimate-only)
|
|
87
|
+
// 唯一允许 fallthrough 的模式:handle 返回 false 时继续后续模式检测
|
|
88
|
+
name: 'context-guard',
|
|
89
|
+
detect: (o) => !!(o.contextGuard || o.estimateOnly),
|
|
90
|
+
handle: async (o) => (0, context_guard_1.analyzeContextGuard)(o),
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
// v6.75.0+: 增量分析模式(--incremental / --reanalyze)
|
|
94
|
+
name: 'incremental',
|
|
95
|
+
detect: (o) => !!(o.incremental || o.reanalyze),
|
|
96
|
+
handle: async (o) => { await (0, incremental_1.analyzeIncrementalMode)(o); return true; },
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
// v6.75.0+: 新增端分析模式(--add-platform)
|
|
100
|
+
name: 'add-platform',
|
|
101
|
+
detect: (o) => !!o.addPlatform,
|
|
102
|
+
handle: async (o) => { await (0, add_platform_1.analyzeAddPlatformMode)(o); return true; },
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
// v6.76.0+: 功能模块级全局分析(--module)
|
|
106
|
+
name: 'module',
|
|
107
|
+
detect: (o) => !!o.module,
|
|
108
|
+
handle: async (o) => { await (0, module_1.analyzeModuleMode)(o); return true; },
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
// --feature 模式: 局部刷新单个功能模块
|
|
112
|
+
name: 'feature',
|
|
113
|
+
detect: (o) => !!o.feature,
|
|
114
|
+
handle: async (o, root) => { await (0, feature_1.analyzeFeatureMode)(o, root); return true; },
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
// --doc 模式: 局部刷新单个类型文档(bugs/refactors/research)
|
|
118
|
+
name: 'doc',
|
|
119
|
+
detect: (o) => !!o.doc,
|
|
120
|
+
handle: async (o, root) => { await (0, doc_1.analyzeDocMode)(o, root); return true; },
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
// v8.3.177+: 总览生成模式(--scope=overview --phase=skeleton|full)
|
|
124
|
+
name: 'overview',
|
|
125
|
+
detect: (o) => o.scope === 'overview',
|
|
126
|
+
handle: async (o) => { await (0, overview_1.analyzeOverviewMode)(o); return true; },
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
// v8.2.0+: 功能单元聚焦分析模式(--extract-units / --unit / --consolidate / --resume-units / --auto-units)
|
|
130
|
+
name: 'unit-modes',
|
|
131
|
+
detect: (o) => !!(o.extractUnits || o.unit || o.consolidate || o.resumeUnits || o.autoUnits),
|
|
132
|
+
handle: async (o, root) => { await (0, units_1.analyzeUnitModes)(o, root); return true; },
|
|
133
|
+
},
|
|
134
|
+
];
|
|
135
|
+
/**
|
|
136
|
+
* 按注册表顺序分发模式:首个 detect 命中的策略执行 handle,
|
|
137
|
+
* 返回 true 表示已处理完成(analyzeCommand 应退出)。
|
|
138
|
+
*/
|
|
139
|
+
async function dispatchAnalyzeModes(options, projectRoot) {
|
|
140
|
+
for (const strategy of MODE_STRATEGIES) {
|
|
141
|
+
if (!strategy.detect(options))
|
|
142
|
+
continue;
|
|
143
|
+
return await strategy.handle(options, projectRoot);
|
|
144
|
+
}
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=modes.js.map
|