speccore 8.3.349 → 8.3.363

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