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.
Files changed (274) hide show
  1. package/.agents/skills/spec-unitize/SKILL.md +5 -1
  2. package/.agents/skills/spec-verify/SKILL.md +22 -1
  3. package/dist/cli.js +19 -2
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/about.d.ts.map +1 -1
  6. package/dist/commands/about.js +36 -1
  7. package/dist/commands/about.js.map +1 -1
  8. package/dist/commands/analyze/add-platform.d.ts +3 -0
  9. package/dist/commands/analyze/add-platform.d.ts.map +1 -0
  10. package/dist/commands/analyze/add-platform.js +82 -0
  11. package/dist/commands/analyze/add-platform.js.map +1 -0
  12. package/dist/commands/analyze/audit-fix.d.ts +3 -0
  13. package/dist/commands/analyze/audit-fix.d.ts.map +1 -0
  14. package/dist/commands/analyze/audit-fix.js +73 -0
  15. package/dist/commands/analyze/audit-fix.js.map +1 -0
  16. package/dist/commands/analyze/context-guard.d.ts +3 -0
  17. package/dist/commands/analyze/context-guard.d.ts.map +1 -0
  18. package/dist/commands/analyze/context-guard.js +75 -0
  19. package/dist/commands/analyze/context-guard.js.map +1 -0
  20. package/dist/commands/analyze/doc.d.ts +3 -0
  21. package/dist/commands/analyze/doc.d.ts.map +1 -0
  22. package/dist/commands/analyze/doc.js +77 -0
  23. package/dist/commands/analyze/doc.js.map +1 -0
  24. package/dist/commands/analyze/feature.d.ts +3 -0
  25. package/dist/commands/analyze/feature.d.ts.map +1 -0
  26. package/dist/commands/analyze/feature.js +75 -0
  27. package/dist/commands/analyze/feature.js.map +1 -0
  28. package/dist/commands/analyze/from-code.d.ts +3 -0
  29. package/dist/commands/analyze/from-code.d.ts.map +1 -0
  30. package/dist/commands/analyze/from-code.js +94 -0
  31. package/dist/commands/analyze/from-code.js.map +1 -0
  32. package/dist/commands/analyze/incremental.d.ts +3 -0
  33. package/dist/commands/analyze/incremental.d.ts.map +1 -0
  34. package/dist/commands/analyze/incremental.js +90 -0
  35. package/dist/commands/analyze/incremental.js.map +1 -0
  36. package/dist/commands/analyze/modes.d.ts +13 -0
  37. package/dist/commands/analyze/modes.d.ts.map +1 -0
  38. package/dist/commands/analyze/modes.js +147 -0
  39. package/dist/commands/analyze/modes.js.map +1 -0
  40. package/dist/commands/analyze/module.d.ts +3 -0
  41. package/dist/commands/analyze/module.d.ts.map +1 -0
  42. package/dist/commands/analyze/module.js +95 -0
  43. package/dist/commands/analyze/module.js.map +1 -0
  44. package/dist/commands/analyze/overview.d.ts +3 -0
  45. package/dist/commands/analyze/overview.d.ts.map +1 -0
  46. package/dist/commands/analyze/overview.js +125 -0
  47. package/dist/commands/analyze/overview.js.map +1 -0
  48. package/dist/commands/analyze/shared.d.ts +53 -0
  49. package/dist/commands/analyze/shared.d.ts.map +1 -0
  50. package/dist/commands/analyze/shared.js +34 -0
  51. package/dist/commands/analyze/shared.js.map +1 -0
  52. package/dist/commands/analyze/units.d.ts +46 -0
  53. package/dist/commands/analyze/units.d.ts.map +1 -0
  54. package/dist/commands/analyze/units.js +950 -0
  55. package/dist/commands/analyze/units.js.map +1 -0
  56. package/dist/commands/analyze.d.ts +6 -88
  57. package/dist/commands/analyze.d.ts.map +1 -1
  58. package/dist/commands/analyze.js +167 -1419
  59. package/dist/commands/analyze.js.map +1 -1
  60. package/dist/commands/ask.d.ts.map +1 -1
  61. package/dist/commands/ask.js +4 -2
  62. package/dist/commands/ask.js.map +1 -1
  63. package/dist/commands/dashboard.d.ts.map +1 -1
  64. package/dist/commands/dashboard.js +36 -1
  65. package/dist/commands/dashboard.js.map +1 -1
  66. package/dist/commands/deploy.d.ts +6 -0
  67. package/dist/commands/deploy.d.ts.map +1 -1
  68. package/dist/commands/deploy.js +153 -0
  69. package/dist/commands/deploy.js.map +1 -1
  70. package/dist/commands/doc2spec.d.ts +1 -1
  71. package/dist/commands/doc2spec.d.ts.map +1 -1
  72. package/dist/commands/doc2spec.js +39 -24
  73. package/dist/commands/doc2spec.js.map +1 -1
  74. package/dist/commands/doctor.js +60 -13
  75. package/dist/commands/doctor.js.map +1 -1
  76. package/dist/commands/execute.d.ts.map +1 -1
  77. package/dist/commands/execute.js +22 -0
  78. package/dist/commands/execute.js.map +1 -1
  79. package/dist/commands/help.js +36 -1
  80. package/dist/commands/help.js.map +1 -1
  81. package/dist/commands/init.js +1 -1
  82. package/dist/commands/init.js.map +1 -1
  83. package/dist/commands/pipeline.d.ts.map +1 -1
  84. package/dist/commands/pipeline.js +15 -0
  85. package/dist/commands/pipeline.js.map +1 -1
  86. package/dist/commands/plan.js +2 -0
  87. package/dist/commands/plan.js.map +1 -1
  88. package/dist/commands/pr.d.ts.map +1 -1
  89. package/dist/commands/pr.js +14 -3
  90. package/dist/commands/pr.js.map +1 -1
  91. package/dist/commands/prompts.d.ts +11 -1
  92. package/dist/commands/prompts.d.ts.map +1 -1
  93. package/dist/commands/prompts.js +197 -15
  94. package/dist/commands/prompts.js.map +1 -1
  95. package/dist/commands/reindex.d.ts.map +1 -1
  96. package/dist/commands/reindex.js +23 -0
  97. package/dist/commands/reindex.js.map +1 -1
  98. package/dist/commands/retro.d.ts.map +1 -1
  99. package/dist/commands/retro.js +3 -1
  100. package/dist/commands/retro.js.map +1 -1
  101. package/dist/commands/status-panel.d.ts.map +1 -1
  102. package/dist/commands/status-panel.js +9 -1
  103. package/dist/commands/status-panel.js.map +1 -1
  104. package/dist/commands/unitize.d.ts +3 -0
  105. package/dist/commands/unitize.d.ts.map +1 -1
  106. package/dist/commands/unitize.js +183 -6
  107. package/dist/commands/unitize.js.map +1 -1
  108. package/dist/commands/update-env-configs.d.ts.map +1 -1
  109. package/dist/commands/update-env-configs.js +10 -0
  110. package/dist/commands/update-env-configs.js.map +1 -1
  111. package/dist/commands/verify.d.ts +8 -0
  112. package/dist/commands/verify.d.ts.map +1 -1
  113. package/dist/commands/verify.js +383 -16
  114. package/dist/commands/verify.js.map +1 -1
  115. package/dist/commands/welcome.d.ts.map +1 -1
  116. package/dist/commands/welcome.js +3 -1
  117. package/dist/commands/welcome.js.map +1 -1
  118. package/dist/core/ai-context-generator.d.ts +21 -0
  119. package/dist/core/ai-context-generator.d.ts.map +1 -1
  120. package/dist/core/ai-context-generator.js +54 -1
  121. package/dist/core/ai-context-generator.js.map +1 -1
  122. package/dist/core/ai-verify/plan-generator.d.ts +94 -0
  123. package/dist/core/ai-verify/plan-generator.d.ts.map +1 -0
  124. package/dist/core/ai-verify/plan-generator.js +598 -0
  125. package/dist/core/ai-verify/plan-generator.js.map +1 -0
  126. package/dist/core/ai-verify/result-parser.d.ts +27 -0
  127. package/dist/core/ai-verify/result-parser.d.ts.map +1 -0
  128. package/dist/core/ai-verify/result-parser.js +212 -0
  129. package/dist/core/ai-verify/result-parser.js.map +1 -0
  130. package/dist/core/ai-verify/scope-resolver.d.ts +34 -0
  131. package/dist/core/ai-verify/scope-resolver.d.ts.map +1 -0
  132. package/dist/core/ai-verify/scope-resolver.js +183 -0
  133. package/dist/core/ai-verify/scope-resolver.js.map +1 -0
  134. package/dist/core/ai-verify/types.d.ts +171 -0
  135. package/dist/core/ai-verify/types.d.ts.map +1 -0
  136. package/dist/core/ai-verify/types.js +9 -0
  137. package/dist/core/ai-verify/types.js.map +1 -0
  138. package/dist/core/ai-verify/visual-judge.d.ts +33 -0
  139. package/dist/core/ai-verify/visual-judge.d.ts.map +1 -0
  140. package/dist/core/ai-verify/visual-judge.js +123 -0
  141. package/dist/core/ai-verify/visual-judge.js.map +1 -0
  142. package/dist/core/analyze-engine.d.ts.map +1 -1
  143. package/dist/core/analyze-engine.js +2 -1
  144. package/dist/core/analyze-engine.js.map +1 -1
  145. package/dist/core/ask-engine.d.ts +6 -0
  146. package/dist/core/ask-engine.d.ts.map +1 -1
  147. package/dist/core/ask-engine.js +83 -3
  148. package/dist/core/ask-engine.js.map +1 -1
  149. package/dist/core/code-graph/builder.d.ts.map +1 -1
  150. package/dist/core/code-graph/builder.js +93 -75
  151. package/dist/core/code-graph/builder.js.map +1 -1
  152. package/dist/core/code-graph/incremental-build.d.ts.map +1 -1
  153. package/dist/core/code-graph/incremental-build.js +13 -19
  154. package/dist/core/code-graph/incremental-build.js.map +1 -1
  155. package/dist/core/code-graph/index.d.ts +1 -1
  156. package/dist/core/code-graph/index.d.ts.map +1 -1
  157. package/dist/core/code-graph/index.js +15 -12
  158. package/dist/core/code-graph/index.js.map +1 -1
  159. package/dist/core/code-graph/multimodal.js +1 -1
  160. package/dist/core/code-graph/parser.js +1 -1
  161. package/dist/core/code-graph/query.d.ts +1 -1
  162. package/dist/core/code-graph/reporter.d.ts +1 -1
  163. package/dist/core/code-graph/reporter.d.ts.map +1 -1
  164. package/dist/core/code-graph/reporter.js +18 -10
  165. package/dist/core/code-graph/reporter.js.map +1 -1
  166. package/dist/core/code-graph/requirement-linker.d.ts.map +1 -1
  167. package/dist/core/code-graph/requirement-linker.js +24 -14
  168. package/dist/core/code-graph/requirement-linker.js.map +1 -1
  169. package/dist/core/code-graph/types.d.ts +1 -1
  170. package/dist/core/code-graph/types.js +1 -1
  171. package/dist/core/code-graph/visualizer.d.ts +1 -7
  172. package/dist/core/code-graph/visualizer.d.ts.map +1 -1
  173. package/dist/core/code-graph/visualizer.js +476 -49
  174. package/dist/core/code-graph/visualizer.js.map +1 -1
  175. package/dist/core/code-scanner.d.ts +2 -0
  176. package/dist/core/code-scanner.d.ts.map +1 -1
  177. package/dist/core/code-scanner.js +13 -1
  178. package/dist/core/code-scanner.js.map +1 -1
  179. package/dist/core/deploy/engine.d.ts +21 -0
  180. package/dist/core/deploy/engine.d.ts.map +1 -1
  181. package/dist/core/deploy/engine.js +276 -0
  182. package/dist/core/deploy/engine.js.map +1 -1
  183. package/dist/core/deploy-ledger.d.ts +12 -0
  184. package/dist/core/deploy-ledger.d.ts.map +1 -0
  185. package/dist/core/deploy-ledger.js +35 -0
  186. package/dist/core/deploy-ledger.js.map +1 -0
  187. package/dist/core/environment-config.d.ts +11 -0
  188. package/dist/core/environment-config.d.ts.map +1 -1
  189. package/dist/core/environment-config.js +4 -0
  190. package/dist/core/environment-config.js.map +1 -1
  191. package/dist/core/intent-cache.d.ts.map +1 -1
  192. package/dist/core/intent-cache.js +6 -0
  193. package/dist/core/intent-cache.js.map +1 -1
  194. package/dist/core/knowledge-visualizer.js +1 -1
  195. package/dist/core/page-bundle.d.ts +2 -0
  196. package/dist/core/page-bundle.d.ts.map +1 -1
  197. package/dist/core/page-bundle.js +18 -1
  198. package/dist/core/page-bundle.js.map +1 -1
  199. package/dist/core/plan-html.js +1 -1
  200. package/dist/core/platform-inference.d.ts +35 -0
  201. package/dist/core/platform-inference.d.ts.map +1 -1
  202. package/dist/core/platform-inference.js +92 -0
  203. package/dist/core/platform-inference.js.map +1 -1
  204. package/dist/core/prompt-plugins/analyze-graph-plugin.d.ts.map +1 -1
  205. package/dist/core/prompt-plugins/analyze-graph-plugin.js +16 -1
  206. package/dist/core/prompt-plugins/analyze-graph-plugin.js.map +1 -1
  207. package/dist/core/prompt-plugins/execute-graph-plugin.d.ts +2 -0
  208. package/dist/core/prompt-plugins/execute-graph-plugin.d.ts.map +1 -1
  209. package/dist/core/prompt-plugins/execute-graph-plugin.js +127 -27
  210. package/dist/core/prompt-plugins/execute-graph-plugin.js.map +1 -1
  211. package/dist/core/quality-audit.d.ts.map +1 -1
  212. package/dist/core/quality-audit.js +18 -0
  213. package/dist/core/quality-audit.js.map +1 -1
  214. package/dist/core/rag-engine.d.ts.map +1 -1
  215. package/dist/core/rag-engine.js +12 -243
  216. package/dist/core/rag-engine.js.map +1 -1
  217. package/dist/core/reindex-engine.d.ts +20 -0
  218. package/dist/core/reindex-engine.d.ts.map +1 -1
  219. package/dist/core/reindex-engine.js +142 -0
  220. package/dist/core/reindex-engine.js.map +1 -1
  221. package/dist/core/requirement-clarifier.d.ts.map +1 -1
  222. package/dist/core/requirement-clarifier.js +22 -6
  223. package/dist/core/requirement-clarifier.js.map +1 -1
  224. package/dist/core/reverse-requirement.d.ts +37 -0
  225. package/dist/core/reverse-requirement.d.ts.map +1 -1
  226. package/dist/core/reverse-requirement.js +84 -9
  227. package/dist/core/reverse-requirement.js.map +1 -1
  228. package/dist/core/spec-paths.d.ts +5 -0
  229. package/dist/core/spec-paths.d.ts.map +1 -1
  230. package/dist/core/spec-paths.js +1 -0
  231. package/dist/core/spec-paths.js.map +1 -1
  232. package/dist/core/test-config.d.ts +7 -1
  233. package/dist/core/test-config.d.ts.map +1 -1
  234. package/dist/core/test-config.js +59 -11
  235. package/dist/core/test-config.js.map +1 -1
  236. package/dist/core/ui-verify/index.d.ts +1 -1
  237. package/dist/core/ui-verify/index.d.ts.map +1 -1
  238. package/dist/core/ui-verify/index.js +2 -1
  239. package/dist/core/ui-verify/index.js.map +1 -1
  240. package/dist/core/ui-verify/smoke-engine.js +71 -15
  241. package/dist/core/ui-verify/smoke-engine.js.map +1 -1
  242. package/dist/core/ui-verify/spec-generator.d.ts +5 -9
  243. package/dist/core/ui-verify/spec-generator.d.ts.map +1 -1
  244. package/dist/core/ui-verify/spec-generator.js +66 -3
  245. package/dist/core/ui-verify/spec-generator.js.map +1 -1
  246. package/dist/core/ui-verify/types.d.ts +25 -0
  247. package/dist/core/ui-verify/types.d.ts.map +1 -1
  248. package/dist/core/ui-verify/visual-model-client.d.ts +2 -0
  249. package/dist/core/ui-verify/visual-model-client.d.ts.map +1 -1
  250. package/dist/core/ui-verify/visual-model-client.js +4 -4
  251. package/dist/core/ui-verify/visual-model-client.js.map +1 -1
  252. package/dist/core/unified-config.d.ts +27 -0
  253. package/dist/core/unified-config.d.ts.map +1 -1
  254. package/dist/core/unified-config.js +37 -0
  255. package/dist/core/unified-config.js.map +1 -1
  256. package/dist/core/unified-retrieval.d.ts +8 -0
  257. package/dist/core/unified-retrieval.d.ts.map +1 -1
  258. package/dist/core/unified-retrieval.js +18 -0
  259. package/dist/core/unified-retrieval.js.map +1 -1
  260. package/dist/utils/synonyms.d.ts.map +1 -1
  261. package/dist/utils/synonyms.js +4 -0
  262. package/dist/utils/synonyms.js.map +1 -1
  263. package/package.json +1 -1
  264. package/templates/accounts-example.yaml +49 -0
  265. package/templates/html/fonts/JetBrainsMono.woff2 +0 -0
  266. package/templates/html/fonts/Orbitron.woff2 +0 -0
  267. package/templates/html/speccore-ask-explain.html +1 -1
  268. package/templates/html/speccore-ask-guide.html +2 -2
  269. package/templates/html/speccore-ask-match.html +1 -1
  270. package/templates/html/speccore-ask-pipeline.html +1 -1
  271. package/templates/html/speccore-ask-result.html +2 -2
  272. package/templates/html/speccore-help.html +2 -2
  273. package/templates/html/speccore-setup-guide.html +16 -1
  274. 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,3 @@
1
+ import type { AnalyzeOptions } from './shared';
2
+ export declare function analyzeDocMode(options: AnalyzeOptions, projectRoot: string): Promise<void>;
3
+ //# sourceMappingURL=doc.d.ts.map
@@ -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,3 @@
1
+ import type { AnalyzeOptions } from './shared';
2
+ export declare function analyzeFeatureMode(options: AnalyzeOptions, projectRoot: string): Promise<void>;
3
+ //# sourceMappingURL=feature.d.ts.map
@@ -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,3 @@
1
+ import type { AnalyzeOptions } from './shared';
2
+ export declare function analyzeFromCode(options: AnalyzeOptions): Promise<void>;
3
+ //# sourceMappingURL=from-code.d.ts.map
@@ -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,3 @@
1
+ import type { AnalyzeOptions } from './shared';
2
+ export declare function analyzeIncrementalMode(options: AnalyzeOptions): Promise<void>;
3
+ //# sourceMappingURL=incremental.d.ts.map
@@ -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