spec-gen-cli 1.0.0

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 (303) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1078 -0
  3. package/dist/api/analyze.d.ts +17 -0
  4. package/dist/api/analyze.d.ts.map +1 -0
  5. package/dist/api/analyze.js +109 -0
  6. package/dist/api/analyze.js.map +1 -0
  7. package/dist/api/drift.d.ts +21 -0
  8. package/dist/api/drift.d.ts.map +1 -0
  9. package/dist/api/drift.js +145 -0
  10. package/dist/api/drift.js.map +1 -0
  11. package/dist/api/generate.d.ts +18 -0
  12. package/dist/api/generate.d.ts.map +1 -0
  13. package/dist/api/generate.js +251 -0
  14. package/dist/api/generate.js.map +1 -0
  15. package/dist/api/index.d.ts +39 -0
  16. package/dist/api/index.d.ts.map +1 -0
  17. package/dist/api/index.js +32 -0
  18. package/dist/api/index.js.map +1 -0
  19. package/dist/api/init.d.ts +18 -0
  20. package/dist/api/init.d.ts.map +1 -0
  21. package/dist/api/init.js +82 -0
  22. package/dist/api/init.js.map +1 -0
  23. package/dist/api/run.d.ts +19 -0
  24. package/dist/api/run.d.ts.map +1 -0
  25. package/dist/api/run.js +291 -0
  26. package/dist/api/run.js.map +1 -0
  27. package/dist/api/specs.d.ts +49 -0
  28. package/dist/api/specs.d.ts.map +1 -0
  29. package/dist/api/specs.js +136 -0
  30. package/dist/api/specs.js.map +1 -0
  31. package/dist/api/types.d.ts +176 -0
  32. package/dist/api/types.d.ts.map +1 -0
  33. package/dist/api/types.js +9 -0
  34. package/dist/api/types.js.map +1 -0
  35. package/dist/api/verify.d.ts +20 -0
  36. package/dist/api/verify.d.ts.map +1 -0
  37. package/dist/api/verify.js +117 -0
  38. package/dist/api/verify.js.map +1 -0
  39. package/dist/cli/commands/analyze.d.ts +27 -0
  40. package/dist/cli/commands/analyze.d.ts.map +1 -0
  41. package/dist/cli/commands/analyze.js +485 -0
  42. package/dist/cli/commands/analyze.js.map +1 -0
  43. package/dist/cli/commands/drift.d.ts +9 -0
  44. package/dist/cli/commands/drift.d.ts.map +1 -0
  45. package/dist/cli/commands/drift.js +540 -0
  46. package/dist/cli/commands/drift.js.map +1 -0
  47. package/dist/cli/commands/generate.d.ts +9 -0
  48. package/dist/cli/commands/generate.d.ts.map +1 -0
  49. package/dist/cli/commands/generate.js +633 -0
  50. package/dist/cli/commands/generate.js.map +1 -0
  51. package/dist/cli/commands/init.d.ts +9 -0
  52. package/dist/cli/commands/init.d.ts.map +1 -0
  53. package/dist/cli/commands/init.js +171 -0
  54. package/dist/cli/commands/init.js.map +1 -0
  55. package/dist/cli/commands/mcp.d.ts +638 -0
  56. package/dist/cli/commands/mcp.d.ts.map +1 -0
  57. package/dist/cli/commands/mcp.js +574 -0
  58. package/dist/cli/commands/mcp.js.map +1 -0
  59. package/dist/cli/commands/run.d.ts +24 -0
  60. package/dist/cli/commands/run.d.ts.map +1 -0
  61. package/dist/cli/commands/run.js +546 -0
  62. package/dist/cli/commands/run.js.map +1 -0
  63. package/dist/cli/commands/verify.d.ts +9 -0
  64. package/dist/cli/commands/verify.d.ts.map +1 -0
  65. package/dist/cli/commands/verify.js +417 -0
  66. package/dist/cli/commands/verify.js.map +1 -0
  67. package/dist/cli/commands/view.d.ts +9 -0
  68. package/dist/cli/commands/view.d.ts.map +1 -0
  69. package/dist/cli/commands/view.js +511 -0
  70. package/dist/cli/commands/view.js.map +1 -0
  71. package/dist/cli/index.d.ts +9 -0
  72. package/dist/cli/index.d.ts.map +1 -0
  73. package/dist/cli/index.js +83 -0
  74. package/dist/cli/index.js.map +1 -0
  75. package/dist/core/analyzer/architecture-writer.d.ts +67 -0
  76. package/dist/core/analyzer/architecture-writer.d.ts.map +1 -0
  77. package/dist/core/analyzer/architecture-writer.js +209 -0
  78. package/dist/core/analyzer/architecture-writer.js.map +1 -0
  79. package/dist/core/analyzer/artifact-generator.d.ts +222 -0
  80. package/dist/core/analyzer/artifact-generator.d.ts.map +1 -0
  81. package/dist/core/analyzer/artifact-generator.js +726 -0
  82. package/dist/core/analyzer/artifact-generator.js.map +1 -0
  83. package/dist/core/analyzer/call-graph.d.ts +83 -0
  84. package/dist/core/analyzer/call-graph.d.ts.map +1 -0
  85. package/dist/core/analyzer/call-graph.js +827 -0
  86. package/dist/core/analyzer/call-graph.js.map +1 -0
  87. package/dist/core/analyzer/code-shaper.d.ts +33 -0
  88. package/dist/core/analyzer/code-shaper.d.ts.map +1 -0
  89. package/dist/core/analyzer/code-shaper.js +149 -0
  90. package/dist/core/analyzer/code-shaper.js.map +1 -0
  91. package/dist/core/analyzer/dependency-graph.d.ts +179 -0
  92. package/dist/core/analyzer/dependency-graph.d.ts.map +1 -0
  93. package/dist/core/analyzer/dependency-graph.js +574 -0
  94. package/dist/core/analyzer/dependency-graph.js.map +1 -0
  95. package/dist/core/analyzer/duplicate-detector.d.ts +52 -0
  96. package/dist/core/analyzer/duplicate-detector.d.ts.map +1 -0
  97. package/dist/core/analyzer/duplicate-detector.js +279 -0
  98. package/dist/core/analyzer/duplicate-detector.js.map +1 -0
  99. package/dist/core/analyzer/embedding-service.d.ts +50 -0
  100. package/dist/core/analyzer/embedding-service.d.ts.map +1 -0
  101. package/dist/core/analyzer/embedding-service.js +104 -0
  102. package/dist/core/analyzer/embedding-service.js.map +1 -0
  103. package/dist/core/analyzer/file-walker.d.ts +78 -0
  104. package/dist/core/analyzer/file-walker.d.ts.map +1 -0
  105. package/dist/core/analyzer/file-walker.js +531 -0
  106. package/dist/core/analyzer/file-walker.js.map +1 -0
  107. package/dist/core/analyzer/import-parser.d.ts +91 -0
  108. package/dist/core/analyzer/import-parser.d.ts.map +1 -0
  109. package/dist/core/analyzer/import-parser.js +720 -0
  110. package/dist/core/analyzer/import-parser.js.map +1 -0
  111. package/dist/core/analyzer/index.d.ts +10 -0
  112. package/dist/core/analyzer/index.d.ts.map +1 -0
  113. package/dist/core/analyzer/index.js +10 -0
  114. package/dist/core/analyzer/index.js.map +1 -0
  115. package/dist/core/analyzer/refactor-analyzer.d.ts +80 -0
  116. package/dist/core/analyzer/refactor-analyzer.d.ts.map +1 -0
  117. package/dist/core/analyzer/refactor-analyzer.js +339 -0
  118. package/dist/core/analyzer/refactor-analyzer.js.map +1 -0
  119. package/dist/core/analyzer/repository-mapper.d.ts +150 -0
  120. package/dist/core/analyzer/repository-mapper.d.ts.map +1 -0
  121. package/dist/core/analyzer/repository-mapper.js +731 -0
  122. package/dist/core/analyzer/repository-mapper.js.map +1 -0
  123. package/dist/core/analyzer/signature-extractor.d.ts +31 -0
  124. package/dist/core/analyzer/signature-extractor.d.ts.map +1 -0
  125. package/dist/core/analyzer/signature-extractor.js +387 -0
  126. package/dist/core/analyzer/signature-extractor.js.map +1 -0
  127. package/dist/core/analyzer/significance-scorer.d.ts +79 -0
  128. package/dist/core/analyzer/significance-scorer.d.ts.map +1 -0
  129. package/dist/core/analyzer/significance-scorer.js +407 -0
  130. package/dist/core/analyzer/significance-scorer.js.map +1 -0
  131. package/dist/core/analyzer/subgraph-extractor.d.ts +43 -0
  132. package/dist/core/analyzer/subgraph-extractor.d.ts.map +1 -0
  133. package/dist/core/analyzer/subgraph-extractor.js +129 -0
  134. package/dist/core/analyzer/subgraph-extractor.js.map +1 -0
  135. package/dist/core/analyzer/vector-index.d.ts +63 -0
  136. package/dist/core/analyzer/vector-index.d.ts.map +1 -0
  137. package/dist/core/analyzer/vector-index.js +169 -0
  138. package/dist/core/analyzer/vector-index.js.map +1 -0
  139. package/dist/core/drift/drift-detector.d.ts +102 -0
  140. package/dist/core/drift/drift-detector.d.ts.map +1 -0
  141. package/dist/core/drift/drift-detector.js +597 -0
  142. package/dist/core/drift/drift-detector.js.map +1 -0
  143. package/dist/core/drift/git-diff.d.ts +55 -0
  144. package/dist/core/drift/git-diff.d.ts.map +1 -0
  145. package/dist/core/drift/git-diff.js +356 -0
  146. package/dist/core/drift/git-diff.js.map +1 -0
  147. package/dist/core/drift/index.d.ts +12 -0
  148. package/dist/core/drift/index.d.ts.map +1 -0
  149. package/dist/core/drift/index.js +9 -0
  150. package/dist/core/drift/index.js.map +1 -0
  151. package/dist/core/drift/spec-mapper.d.ts +73 -0
  152. package/dist/core/drift/spec-mapper.d.ts.map +1 -0
  153. package/dist/core/drift/spec-mapper.js +353 -0
  154. package/dist/core/drift/spec-mapper.js.map +1 -0
  155. package/dist/core/generator/adr-generator.d.ts +32 -0
  156. package/dist/core/generator/adr-generator.d.ts.map +1 -0
  157. package/dist/core/generator/adr-generator.js +192 -0
  158. package/dist/core/generator/adr-generator.js.map +1 -0
  159. package/dist/core/generator/index.d.ts +9 -0
  160. package/dist/core/generator/index.d.ts.map +1 -0
  161. package/dist/core/generator/index.js +12 -0
  162. package/dist/core/generator/index.js.map +1 -0
  163. package/dist/core/generator/mapping-generator.d.ts +54 -0
  164. package/dist/core/generator/mapping-generator.d.ts.map +1 -0
  165. package/dist/core/generator/mapping-generator.js +239 -0
  166. package/dist/core/generator/mapping-generator.js.map +1 -0
  167. package/dist/core/generator/openspec-compat.d.ts +160 -0
  168. package/dist/core/generator/openspec-compat.d.ts.map +1 -0
  169. package/dist/core/generator/openspec-compat.js +523 -0
  170. package/dist/core/generator/openspec-compat.js.map +1 -0
  171. package/dist/core/generator/openspec-format-generator.d.ts +111 -0
  172. package/dist/core/generator/openspec-format-generator.d.ts.map +1 -0
  173. package/dist/core/generator/openspec-format-generator.js +817 -0
  174. package/dist/core/generator/openspec-format-generator.js.map +1 -0
  175. package/dist/core/generator/openspec-writer.d.ts +131 -0
  176. package/dist/core/generator/openspec-writer.d.ts.map +1 -0
  177. package/dist/core/generator/openspec-writer.js +379 -0
  178. package/dist/core/generator/openspec-writer.js.map +1 -0
  179. package/dist/core/generator/prompts.d.ts +35 -0
  180. package/dist/core/generator/prompts.d.ts.map +1 -0
  181. package/dist/core/generator/prompts.js +212 -0
  182. package/dist/core/generator/prompts.js.map +1 -0
  183. package/dist/core/generator/spec-pipeline.d.ts +94 -0
  184. package/dist/core/generator/spec-pipeline.d.ts.map +1 -0
  185. package/dist/core/generator/spec-pipeline.js +474 -0
  186. package/dist/core/generator/spec-pipeline.js.map +1 -0
  187. package/dist/core/generator/stages/stage1-survey.d.ts +19 -0
  188. package/dist/core/generator/stages/stage1-survey.d.ts.map +1 -0
  189. package/dist/core/generator/stages/stage1-survey.js +105 -0
  190. package/dist/core/generator/stages/stage1-survey.js.map +1 -0
  191. package/dist/core/generator/stages/stage2-entities.d.ts +11 -0
  192. package/dist/core/generator/stages/stage2-entities.d.ts.map +1 -0
  193. package/dist/core/generator/stages/stage2-entities.js +67 -0
  194. package/dist/core/generator/stages/stage2-entities.js.map +1 -0
  195. package/dist/core/generator/stages/stage3-services.d.ts +11 -0
  196. package/dist/core/generator/stages/stage3-services.d.ts.map +1 -0
  197. package/dist/core/generator/stages/stage3-services.js +75 -0
  198. package/dist/core/generator/stages/stage3-services.js.map +1 -0
  199. package/dist/core/generator/stages/stage4-api.d.ts +11 -0
  200. package/dist/core/generator/stages/stage4-api.d.ts.map +1 -0
  201. package/dist/core/generator/stages/stage4-api.js +65 -0
  202. package/dist/core/generator/stages/stage4-api.js.map +1 -0
  203. package/dist/core/generator/stages/stage5-architecture.d.ts +10 -0
  204. package/dist/core/generator/stages/stage5-architecture.d.ts.map +1 -0
  205. package/dist/core/generator/stages/stage5-architecture.js +62 -0
  206. package/dist/core/generator/stages/stage5-architecture.js.map +1 -0
  207. package/dist/core/generator/stages/stage6-adr.d.ts +8 -0
  208. package/dist/core/generator/stages/stage6-adr.d.ts.map +1 -0
  209. package/dist/core/generator/stages/stage6-adr.js +41 -0
  210. package/dist/core/generator/stages/stage6-adr.js.map +1 -0
  211. package/dist/core/services/chat-agent.d.ts +45 -0
  212. package/dist/core/services/chat-agent.d.ts.map +1 -0
  213. package/dist/core/services/chat-agent.js +310 -0
  214. package/dist/core/services/chat-agent.js.map +1 -0
  215. package/dist/core/services/chat-tools.d.ts +32 -0
  216. package/dist/core/services/chat-tools.d.ts.map +1 -0
  217. package/dist/core/services/chat-tools.js +270 -0
  218. package/dist/core/services/chat-tools.js.map +1 -0
  219. package/dist/core/services/config-manager.d.ts +61 -0
  220. package/dist/core/services/config-manager.d.ts.map +1 -0
  221. package/dist/core/services/config-manager.js +143 -0
  222. package/dist/core/services/config-manager.js.map +1 -0
  223. package/dist/core/services/gitignore-manager.d.ts +29 -0
  224. package/dist/core/services/gitignore-manager.d.ts.map +1 -0
  225. package/dist/core/services/gitignore-manager.js +106 -0
  226. package/dist/core/services/gitignore-manager.js.map +1 -0
  227. package/dist/core/services/index.d.ts +8 -0
  228. package/dist/core/services/index.d.ts.map +1 -0
  229. package/dist/core/services/index.js +8 -0
  230. package/dist/core/services/index.js.map +1 -0
  231. package/dist/core/services/llm-service.d.ts +336 -0
  232. package/dist/core/services/llm-service.d.ts.map +1 -0
  233. package/dist/core/services/llm-service.js +1155 -0
  234. package/dist/core/services/llm-service.js.map +1 -0
  235. package/dist/core/services/mcp-handlers/analysis.d.ts +42 -0
  236. package/dist/core/services/mcp-handlers/analysis.d.ts.map +1 -0
  237. package/dist/core/services/mcp-handlers/analysis.js +300 -0
  238. package/dist/core/services/mcp-handlers/analysis.js.map +1 -0
  239. package/dist/core/services/mcp-handlers/graph.d.ts +65 -0
  240. package/dist/core/services/mcp-handlers/graph.d.ts.map +1 -0
  241. package/dist/core/services/mcp-handlers/graph.js +509 -0
  242. package/dist/core/services/mcp-handlers/graph.js.map +1 -0
  243. package/dist/core/services/mcp-handlers/semantic.d.ts +38 -0
  244. package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -0
  245. package/dist/core/services/mcp-handlers/semantic.js +172 -0
  246. package/dist/core/services/mcp-handlers/semantic.js.map +1 -0
  247. package/dist/core/services/mcp-handlers/utils.d.ts +21 -0
  248. package/dist/core/services/mcp-handlers/utils.d.ts.map +1 -0
  249. package/dist/core/services/mcp-handlers/utils.js +62 -0
  250. package/dist/core/services/mcp-handlers/utils.js.map +1 -0
  251. package/dist/core/services/project-detector.d.ts +32 -0
  252. package/dist/core/services/project-detector.d.ts.map +1 -0
  253. package/dist/core/services/project-detector.js +111 -0
  254. package/dist/core/services/project-detector.js.map +1 -0
  255. package/dist/core/verifier/index.d.ts +5 -0
  256. package/dist/core/verifier/index.d.ts.map +1 -0
  257. package/dist/core/verifier/index.js +5 -0
  258. package/dist/core/verifier/index.js.map +1 -0
  259. package/dist/core/verifier/verification-engine.d.ts +226 -0
  260. package/dist/core/verifier/verification-engine.d.ts.map +1 -0
  261. package/dist/core/verifier/verification-engine.js +681 -0
  262. package/dist/core/verifier/verification-engine.js.map +1 -0
  263. package/dist/types/index.d.ts +252 -0
  264. package/dist/types/index.d.ts.map +1 -0
  265. package/dist/types/index.js +5 -0
  266. package/dist/types/index.js.map +1 -0
  267. package/dist/types/pipeline.d.ts +148 -0
  268. package/dist/types/pipeline.d.ts.map +1 -0
  269. package/dist/types/pipeline.js +5 -0
  270. package/dist/types/pipeline.js.map +1 -0
  271. package/dist/utils/errors.d.ts +51 -0
  272. package/dist/utils/errors.d.ts.map +1 -0
  273. package/dist/utils/errors.js +128 -0
  274. package/dist/utils/errors.js.map +1 -0
  275. package/dist/utils/logger.d.ts +149 -0
  276. package/dist/utils/logger.d.ts.map +1 -0
  277. package/dist/utils/logger.js +331 -0
  278. package/dist/utils/logger.js.map +1 -0
  279. package/dist/utils/progress.d.ts +142 -0
  280. package/dist/utils/progress.d.ts.map +1 -0
  281. package/dist/utils/progress.js +280 -0
  282. package/dist/utils/progress.js.map +1 -0
  283. package/dist/utils/prompts.d.ts +53 -0
  284. package/dist/utils/prompts.d.ts.map +1 -0
  285. package/dist/utils/prompts.js +199 -0
  286. package/dist/utils/prompts.js.map +1 -0
  287. package/dist/utils/shutdown.d.ts +89 -0
  288. package/dist/utils/shutdown.d.ts.map +1 -0
  289. package/dist/utils/shutdown.js +237 -0
  290. package/dist/utils/shutdown.js.map +1 -0
  291. package/package.json +114 -0
  292. package/src/viewer/InteractiveGraphViewer.jsx +1486 -0
  293. package/src/viewer/app/index.html +17 -0
  294. package/src/viewer/app/main.jsx +13 -0
  295. package/src/viewer/components/ArchitectureView.jsx +177 -0
  296. package/src/viewer/components/ChatPanel.jsx +448 -0
  297. package/src/viewer/components/ClusterGraph.jsx +441 -0
  298. package/src/viewer/components/FilterBar.jsx +179 -0
  299. package/src/viewer/components/FlatGraph.jsx +275 -0
  300. package/src/viewer/components/MicroComponents.jsx +83 -0
  301. package/src/viewer/hooks/usePanZoom.js +79 -0
  302. package/src/viewer/utils/constants.js +47 -0
  303. package/src/viewer/utils/graph-helpers.js +291 -0
@@ -0,0 +1,474 @@
1
+ /**
2
+ * Spec Generation Pipeline
3
+ *
4
+ * Orchestrates the multi-step LLM process to generate accurate specifications
5
+ * in OpenSpec format from code analysis.
6
+ */
7
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
8
+ import { join, resolve } from 'node:path';
9
+ import logger from '../../utils/logger.js';
10
+ import { buildGraphPromptSection, getFileGodFunctions, extractSubgraph } from '../analyzer/subgraph-extractor.js';
11
+ import { getSkeletonContent, detectLanguage, isSkeletonWorthIncluding } from '../analyzer/code-shaper.js';
12
+ import { isTestFile } from '../analyzer/artifact-generator.js';
13
+ import { runStage1 } from './stages/stage1-survey.js';
14
+ import { runStage2 } from './stages/stage2-entities.js';
15
+ import { runStage3 } from './stages/stage3-services.js';
16
+ import { runStage4 } from './stages/stage4-api.js';
17
+ import { runStage5 } from './stages/stage5-architecture.js';
18
+ import { runStage6 } from './stages/stage6-adr.js';
19
+ import { PROMPTS } from './prompts.js';
20
+ // ============================================================================
21
+ // SPEC GENERATION PIPELINE
22
+ // ============================================================================
23
+ /**
24
+ * Spec Generation Pipeline
25
+ */
26
+ export class SpecGenerationPipeline {
27
+ llm;
28
+ options;
29
+ progress;
30
+ /** Set at the start of run() and used by stage methods for graph-based prompts */
31
+ currentLLMContext;
32
+ constructor(llm, options) {
33
+ this.llm = llm;
34
+ this.progress = options.progress;
35
+ this.options = {
36
+ outputDir: options.outputDir,
37
+ skipStages: options.skipStages ?? [],
38
+ resumeFrom: options.resumeFrom ?? '',
39
+ maxRetries: options.maxRetries ?? 2,
40
+ rootPath: options.rootPath ?? '',
41
+ saveIntermediate: options.saveIntermediate ?? true,
42
+ generateADRs: options.generateADRs ?? false,
43
+ };
44
+ }
45
+ /**
46
+ * Run the complete pipeline
47
+ */
48
+ async run(repoStructure, llmContext, depGraph) {
49
+ this.currentLLMContext = llmContext;
50
+ const startTime = Date.now();
51
+ let totalTokens = 0;
52
+ const completedStages = [];
53
+ const skippedStages = [];
54
+ // Ensure output directory exists
55
+ if (this.options.saveIntermediate) {
56
+ await mkdir(this.options.outputDir, { recursive: true });
57
+ }
58
+ const totalStages = this.options.generateADRs ? 6 : 5;
59
+ let stageNum = 0;
60
+ const startStage = (name, label) => {
61
+ stageNum++;
62
+ if (this.progress) {
63
+ this.progress.updateGeneration({ stage: stageNum, totalStages, stageName: label });
64
+ }
65
+ else {
66
+ logger.analysis(`Running Stage ${stageNum}: ${label}`);
67
+ }
68
+ };
69
+ // Helper to execute a pipeline stage with consistent error handling
70
+ const executeStage = async (name, label, runner, fallback, normalize, onSuccess) => {
71
+ if (!this.shouldRunStage(name)) {
72
+ skippedStages.push(name);
73
+ return fallback();
74
+ }
75
+ startStage(name, label);
76
+ const result = await runner();
77
+ if (result.success && result.data) {
78
+ let data = result.data;
79
+ if (normalize)
80
+ data = normalize(data);
81
+ totalTokens += result.tokens;
82
+ completedStages.push(name);
83
+ if (onSuccess)
84
+ onSuccess(data);
85
+ return data;
86
+ }
87
+ else {
88
+ const errorMsg = result.error ?? 'Unknown error';
89
+ this.progress?.stop();
90
+ logger.warning(`${label} failed: ${errorMsg}`);
91
+ if (name === 'survey' && /Unauthorized|401|403/i.test(errorMsg)) {
92
+ throw new Error(`API authentication failed: ${errorMsg}. Check your API key`);
93
+ }
94
+ return await fallback();
95
+ }
96
+ };
97
+ // Stage 1: Project Survey
98
+ const survey = await executeStage('survey', 'Project Survey', async () => runStage1(this.llm, this.options, this.saveResult.bind(this), repoStructure, llmContext), () => this.getDefaultSurvey(repoStructure), data => ({
99
+ ...data,
100
+ frameworks: data.frameworks ?? [],
101
+ suggestedDomains: data.suggestedDomains ?? [],
102
+ schemaFiles: data.schemaFiles ?? [],
103
+ serviceFiles: data.serviceFiles ?? [],
104
+ apiFiles: data.apiFiles ?? [],
105
+ }));
106
+ // Stage 2: Entity Extraction
107
+ let entities = [];
108
+ const schemaFiles = await this.resolveFiles(llmContext, survey.schemaFiles ?? [], this.getSchemaFiles(llmContext));
109
+ if (schemaFiles.length > 0) {
110
+ entities = await executeStage('entities', 'Entity Extraction', async () => runStage2(this, survey, schemaFiles, (i, total, file) => {
111
+ this.progress?.updateGeneration({ stage: stageNum, totalStages, stageName: `Entity Extraction ${i}/${total}: ${file}` });
112
+ }), () => []);
113
+ }
114
+ else {
115
+ logger.warning('No schema files found, skipping entity extraction');
116
+ skippedStages.push('entities');
117
+ }
118
+ // Stage 3: Service Analysis
119
+ let services = [];
120
+ const serviceFiles = await this.resolveFiles(llmContext, survey.serviceFiles ?? [], this.getServiceFiles(llmContext));
121
+ if (serviceFiles.length > 0) {
122
+ services = await executeStage('services', 'Service Analysis', async () => runStage3(this, survey, entities, serviceFiles, (i, total, file) => {
123
+ this.progress?.updateGeneration({ stage: stageNum, totalStages, stageName: `Service Analysis ${i}/${total}: ${file}` });
124
+ }), () => []);
125
+ }
126
+ else {
127
+ logger.warning('No service files found, skipping service analysis');
128
+ skippedStages.push('services');
129
+ }
130
+ // Stage 4: API Extraction
131
+ let endpoints = [];
132
+ const apiFiles = await this.resolveFiles(llmContext, survey.apiFiles ?? [], this.getApiFiles(llmContext));
133
+ if (apiFiles.length > 0) {
134
+ endpoints = await executeStage('api', 'API Extraction', async () => runStage4(this, apiFiles, (i, total, file) => {
135
+ this.progress?.updateGeneration({ stage: stageNum, totalStages, stageName: `API Extraction ${i}/${total}: ${file}` });
136
+ }), () => []);
137
+ }
138
+ else {
139
+ logger.warning('No API files found, skipping API extraction');
140
+ skippedStages.push('api');
141
+ }
142
+ // Stage 5: Architecture Synthesis
143
+ const architecture = await executeStage('architecture', 'Architecture Synthesis', async () => runStage5(this, survey, entities, services, endpoints, depGraph, llmContext.callGraph), () => this.getDefaultArchitecture(survey), data => ({
144
+ ...data,
145
+ layerMap: data.layerMap ?? [],
146
+ integrations: data.integrations ?? [],
147
+ keyDecisions: data.keyDecisions ?? [],
148
+ }));
149
+ // Stage 6: ADR Enrichment (optional)
150
+ let adrs = [];
151
+ if (this.options.generateADRs && this.shouldRunStage('adr')) {
152
+ if (architecture.keyDecisions.length > 0) {
153
+ adrs = await executeStage('adr', 'ADR Enrichment', async () => runStage6(this, architecture), () => []);
154
+ }
155
+ else {
156
+ logger.warning('No key decisions found, skipping ADR enrichment');
157
+ skippedStages.push('adr');
158
+ }
159
+ }
160
+ const duration = Date.now() - startTime;
161
+ const costTracking = this.llm.getCostTracking();
162
+ const pipelineResult = {
163
+ survey,
164
+ entities,
165
+ services,
166
+ endpoints,
167
+ architecture,
168
+ adrs: adrs.length > 0 ? adrs : undefined,
169
+ metadata: {
170
+ totalTokens,
171
+ estimatedCost: costTracking.estimatedCost,
172
+ duration,
173
+ completedStages,
174
+ skippedStages,
175
+ },
176
+ };
177
+ // Save final result
178
+ if (this.options.saveIntermediate) {
179
+ await this.saveResult('pipeline-result', pipelineResult);
180
+ }
181
+ logger.success(`Pipeline completed in ${(duration / 1000).toFixed(1)}s, ${totalTokens} tokens used`);
182
+ return pipelineResult;
183
+ }
184
+ /**
185
+ * Check if a stage should run
186
+ */
187
+ shouldRunStage(stage) {
188
+ if (this.options.skipStages.includes(stage)) {
189
+ return false;
190
+ }
191
+ if (this.options.resumeFrom) {
192
+ const stages = ['survey', 'entities', 'services', 'api', 'architecture', 'adr'];
193
+ const resumeIndex = stages.indexOf(this.options.resumeFrom);
194
+ const currentIndex = stages.indexOf(stage);
195
+ return currentIndex >= resumeIndex;
196
+ }
197
+ return true;
198
+ }
199
+ /**
200
+ * Split file content into chunks, breaking only on blank lines (function/class boundaries).
201
+ * A chunk is emitted when its size exceeds maxChars and a blank line is encountered.
202
+ * overlapLines trailing lines from the previous chunk are prepended to the next one,
203
+ * preserving context (e.g. class declaration visible when processing its methods).
204
+ */
205
+ chunkContent(content, maxChars, overlapLines = 10) {
206
+ if (content.length <= maxChars)
207
+ return [content];
208
+ const lines = content.split('\n');
209
+ const chunks = [];
210
+ let currentLines = [];
211
+ let currentSize = 0;
212
+ for (const line of lines) {
213
+ currentLines.push(line);
214
+ currentSize += line.length + 1;
215
+ // Break only at blank lines once the threshold is reached
216
+ if (currentSize >= maxChars && line.trim() === '') {
217
+ const chunk = currentLines.join('\n').trim();
218
+ if (chunk.length > 0)
219
+ chunks.push(chunk);
220
+ // Carry over the last N lines as overlap for the next chunk
221
+ const overlap = currentLines.slice(-overlapLines);
222
+ currentLines = [...overlap];
223
+ currentSize = overlap.reduce((s, l) => s + l.length + 1, 0);
224
+ }
225
+ }
226
+ const remaining = currentLines.join('\n').trim();
227
+ if (remaining.length > 0)
228
+ chunks.push(remaining);
229
+ return chunks;
230
+ }
231
+ /**
232
+ * For a large file, try to build a graph-based prompt section.
233
+ * Returns null when no call graph data is available or the file has no god functions
234
+ * (caller should fall back to raw source chunking).
235
+ *
236
+ * When file content is provided, appends a stripped skeleton when it achieves
237
+ * a meaningful size reduction (≥ 20%), giving the LLM both topology and
238
+ * internal control-flow structure.
239
+ */
240
+ graphPromptFor(filePath, content) {
241
+ const ctx = this.currentLLMContext;
242
+ if (!ctx?.callGraph)
243
+ return null;
244
+ const graphSection = buildGraphPromptSection(ctx.callGraph, ctx.signatures, filePath);
245
+ if (!graphSection)
246
+ return null;
247
+ if (!content)
248
+ return graphSection;
249
+ const language = detectLanguage(filePath);
250
+ const skeleton = getSkeletonContent(content, language);
251
+ if (isSkeletonWorthIncluding(content, skeleton)) {
252
+ // Cap skeleton at 4000 chars to avoid overwhelming the prompt
253
+ const cap = 4000;
254
+ const skeletonExcerpt = skeleton.length > cap
255
+ ? skeleton.slice(0, cap) + '\n... [skeleton truncated]'
256
+ : skeleton;
257
+ return `${graphSection}\n\nFunction skeleton (logs/comments stripped):\n${skeletonExcerpt}`;
258
+ }
259
+ return graphSection;
260
+ }
261
+ /**
262
+ * Generate sub-specifications for the direct callees of god functions in a file.
263
+ * Makes a single batched LLM call covering all callees at once.
264
+ * Returns [] when no graph data or no god functions are found.
265
+ */
266
+ async generateSubSpecs(filePath, parentName, parentPurpose) {
267
+ const callGraph = this.currentLLMContext?.callGraph;
268
+ if (!callGraph)
269
+ return [];
270
+ const godFunctions = getFileGodFunctions(callGraph, filePath);
271
+ if (godFunctions.length === 0)
272
+ return [];
273
+ // Collect unique direct callees across all god functions in this file
274
+ const seenCallees = new Set();
275
+ const calleeInfos = [];
276
+ for (const godFn of godFunctions) {
277
+ const sub = extractSubgraph(callGraph, godFn);
278
+ const directCallees = [...new Set(sub.edges.filter(([from]) => from === godFn.name).map(([, to]) => to))];
279
+ for (const calleeName of directCallees) {
280
+ if (seenCallees.has(calleeName))
281
+ continue;
282
+ seenCallees.add(calleeName);
283
+ const sigEntry = this.currentLLMContext?.signatures
284
+ ?.flatMap(s => s.entries)
285
+ .find(e => e.name === calleeName);
286
+ const subcallees = [...new Set(sub.edges.filter(([from]) => from === calleeName).map(([, to]) => to))];
287
+ calleeInfos.push({
288
+ name: calleeName,
289
+ signature: sigEntry?.signature,
290
+ docstring: sigEntry?.docstring,
291
+ subcallees,
292
+ });
293
+ }
294
+ }
295
+ if (calleeInfos.length === 0)
296
+ return [];
297
+ try {
298
+ const result = await this.llm.completeJSON({
299
+ systemPrompt: PROMPTS.stage3_subspec_system,
300
+ userPrompt: PROMPTS.stage3_subspec(parentName, parentPurpose, calleeInfos),
301
+ temperature: 0.3,
302
+ maxTokens: 4000,
303
+ });
304
+ if (Array.isArray(result)) {
305
+ // Ensure callee field is set — LLM sometimes names it differently
306
+ for (const sub of result) {
307
+ if (!sub.callee) {
308
+ const matched = calleeInfos.find(c => c.name === sub.name ||
309
+ c.name.toLowerCase().includes((sub.name ?? '').toLowerCase()));
310
+ sub.callee = matched?.name ?? sub.name;
311
+ }
312
+ sub.operations = sub.operations ?? [];
313
+ }
314
+ return result;
315
+ }
316
+ }
317
+ catch (error) {
318
+ logger.warning(`Sub-specs: failed for ${parentName}: ${error.message}`);
319
+ }
320
+ return [];
321
+ }
322
+ /**
323
+ * Get schema files from LLM context
324
+ */
325
+ getSchemaFiles(context) {
326
+ return context.phase2_deep.files
327
+ .filter(f => {
328
+ const name = f.path.toLowerCase();
329
+ return (name.includes('model') ||
330
+ name.includes('schema') ||
331
+ name.includes('entity') ||
332
+ name.includes('types') ||
333
+ name.includes('interface'));
334
+ })
335
+ .map(f => ({ path: f.path, content: f.content ?? '' }))
336
+ .filter(f => f.content.length > 0);
337
+ }
338
+ /**
339
+ * Get service files from LLM context
340
+ */
341
+ getServiceFiles(context) {
342
+ return context.phase2_deep.files
343
+ .filter(f => {
344
+ const name = f.path.toLowerCase();
345
+ return (name.includes('service') ||
346
+ name.includes('manager') ||
347
+ name.includes('handler') ||
348
+ name.includes('controller') ||
349
+ name.includes('use-case') ||
350
+ name.includes('usecase'));
351
+ })
352
+ .map(f => ({ path: f.path, content: f.content ?? '' }))
353
+ .filter(f => f.content.length > 0);
354
+ }
355
+ /**
356
+ * Get API files from LLM context
357
+ */
358
+ getApiFiles(context) {
359
+ return context.phase2_deep.files
360
+ .filter(f => {
361
+ const name = f.path.toLowerCase();
362
+ return (name.includes('route') ||
363
+ name.includes('api') ||
364
+ name.includes('endpoint') ||
365
+ name.includes('controller') ||
366
+ name.includes('rest'));
367
+ })
368
+ .map(f => ({ path: f.path, content: f.content ?? '' }))
369
+ .filter(f => f.content.length > 0);
370
+ }
371
+ /**
372
+ * Resolve file paths identified by Stage 1 LLM to actual file content.
373
+ * First looks in phase2_deep (already in memory); if not found and rootPath is set,
374
+ * reads the file from disk so that files outside the top-20 scored set can still
375
+ * be analyzed in later stages.
376
+ * Falls back to the provided heuristic list if no paths resolve.
377
+ */
378
+ async resolveFiles(context, llmPaths, fallback) {
379
+ // Guard: never pass test files to the LLM stages regardless of what Stage 1 suggested
380
+ const safePaths = llmPaths.filter(p => !isTestFile(p));
381
+ if (safePaths.length === 0) {
382
+ return fallback.filter(f => !isTestFile(f.path));
383
+ }
384
+ llmPaths = safePaths;
385
+ const allFiles = context.phase2_deep.files;
386
+ const resolved = [];
387
+ for (const p of llmPaths) {
388
+ // 1. Look in phase2_deep (already loaded in memory)
389
+ const found = allFiles.find(f => f.path === p || f.path.endsWith('/' + p) || p.endsWith('/' + f.path));
390
+ if (found?.content) {
391
+ resolved.push({ path: found.path, content: found.content });
392
+ continue;
393
+ }
394
+ // 2. Read from disk when rootPath is configured (covers files outside phase2_deep)
395
+ if (this.options.rootPath) {
396
+ try {
397
+ const absPath = resolve(this.options.rootPath, p);
398
+ // Prevent path traversal outside the project root
399
+ if (!absPath.startsWith(resolve(this.options.rootPath)))
400
+ continue;
401
+ const content = await readFile(absPath, 'utf-8');
402
+ resolved.push({ path: p, content });
403
+ }
404
+ catch {
405
+ // file not found or unreadable — skip
406
+ }
407
+ }
408
+ }
409
+ return resolved.length > 0 ? resolved : fallback;
410
+ }
411
+ /**
412
+ * Get default survey when stage is skipped
413
+ */
414
+ getDefaultSurvey(repoStructure) {
415
+ return {
416
+ projectCategory: 'other',
417
+ primaryLanguage: repoStructure.projectType,
418
+ frameworks: repoStructure.frameworks,
419
+ architecturePattern: repoStructure.architecture.pattern,
420
+ domainSummary: `A ${repoStructure.projectType} project`,
421
+ suggestedDomains: repoStructure.domains.map(d => d.name),
422
+ confidence: 0.5,
423
+ schemaFiles: [],
424
+ serviceFiles: [],
425
+ apiFiles: [],
426
+ };
427
+ }
428
+ /**
429
+ * Get default architecture when stage is skipped
430
+ */
431
+ getDefaultArchitecture(survey) {
432
+ return {
433
+ systemPurpose: survey.domainSummary,
434
+ architectureStyle: survey.architecturePattern,
435
+ layerMap: [],
436
+ dataFlow: 'Unknown',
437
+ integrations: [],
438
+ securityModel: 'Unknown',
439
+ keyDecisions: [],
440
+ };
441
+ }
442
+ /**
443
+ * Save intermediate result
444
+ */
445
+ async saveResult(name, data) {
446
+ const filepath = join(this.options.outputDir, `${name}.json`);
447
+ await writeFile(filepath, JSON.stringify(data, null, 2));
448
+ logger.debug(`Saved ${name} to ${filepath}`);
449
+ }
450
+ /**
451
+ * Load previous stage result (for resume)
452
+ */
453
+ async loadStageResult(stage) {
454
+ try {
455
+ const filepath = join(this.options.outputDir, `stage-${stage}.json`);
456
+ const content = await readFile(filepath, 'utf-8');
457
+ return JSON.parse(content);
458
+ }
459
+ catch {
460
+ return null;
461
+ }
462
+ }
463
+ }
464
+ // ============================================================================
465
+ // CONVENIENCE FUNCTIONS
466
+ // ============================================================================
467
+ /**
468
+ * Run the spec generation pipeline
469
+ */
470
+ export async function runSpecGenerationPipeline(llm, repoStructure, llmContext, options, depGraph) {
471
+ const pipeline = new SpecGenerationPipeline(llm, options);
472
+ return pipeline.run(repoStructure, llmContext, depGraph);
473
+ }
474
+ //# sourceMappingURL=spec-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-pipeline.js","sourceRoot":"","sources":["../../../src/core/generator/spec-pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Stage 1: Project Survey
3
+ *
4
+ * Analyzes repository structure to categorize the project and identify key files.
5
+ */
6
+ import type { LLMService } from '../../services/llm-service.js';
7
+ import type { PipelineOptions, ProjectSurveyResult, StageResult } from '../../../types/pipeline.js';
8
+ import type { LLMContext, RepoStructure } from '../../analyzer/artifact-generator.js';
9
+ export declare function runStage1(llm: LLMService, options: PipelineOptions, saveResult: (name: string, result: unknown) => Promise<void>, repoStructure: RepoStructure, llmContext: LLMContext): Promise<StageResult<ProjectSurveyResult>>;
10
+ /**
11
+ * Single Stage 1 LLM call for one chunk of files/signatures.
12
+ */
13
+ export declare function runStage1WithSection(llm: LLMService, options: PipelineOptions, saveResult: (name: string, result: unknown) => Promise<void>, repoStructure: RepoStructure, fileListingSection: string, isSignatures: boolean): Promise<StageResult<ProjectSurveyResult>>;
14
+ /**
15
+ * Merge multiple Stage 1 results (from chunked runs) into one.
16
+ * Uses the highest-confidence result for metadata; concatenates + deduplicates file lists.
17
+ */
18
+ export declare function mergeStage1Results(results: StageResult<ProjectSurveyResult>[]): StageResult<ProjectSurveyResult>;
19
+ //# sourceMappingURL=stage1-survey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage1-survey.d.ts","sourceRoot":"","sources":["../../../../src/core/generator/stages/stage1-survey.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACpG,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAGtF,wBAAsB,SAAS,CAC7B,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,EAC5D,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC,CAa3C;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,EAC5D,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,MAAM,EAC1B,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC,CA4D3C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,mBAAmB,CAAC,EAAE,GAAG,WAAW,CAAC,mBAAmB,CAAC,CAmBhH"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Stage 1: Project Survey
3
+ *
4
+ * Analyzes repository structure to categorize the project and identify key files.
5
+ */
6
+ import logger from '../../../utils/logger.js';
7
+ import { formatSignatureMaps, STAGE1_MAX_CHARS } from '../../analyzer/signature-extractor.js';
8
+ import { PROMPTS } from '../prompts.js';
9
+ export async function runStage1(llm, options, saveResult, repoStructure, llmContext) {
10
+ if (llmContext.signatures && llmContext.signatures.length > 0) {
11
+ const chunks = formatSignatureMaps(llmContext.signatures, STAGE1_MAX_CHARS);
12
+ if (chunks.length === 1) {
13
+ return runStage1WithSection(llm, options, saveResult, repoStructure, chunks[0], true);
14
+ }
15
+ logger.analysis(`Stage 1: ${chunks.length} signature chunks across ${llmContext.signatures.length} files`);
16
+ const results = await Promise.all(chunks.map((c) => runStage1WithSection(llm, options, saveResult, repoStructure, c, true)));
17
+ return mergeStage1Results(results);
18
+ }
19
+ // Legacy fallback — only the 20 files in phase2_deep are visible
20
+ const section = llmContext.phase2_deep.files.map(f => `- ${f.path}`).join('\n');
21
+ return runStage1WithSection(llm, options, saveResult, repoStructure, section, false);
22
+ }
23
+ /**
24
+ * Single Stage 1 LLM call for one chunk of files/signatures.
25
+ */
26
+ export async function runStage1WithSection(llm, options, saveResult, repoStructure, fileListingSection, isSignatures) {
27
+ const startTime = Date.now();
28
+ const sectionLabel = isSignatures
29
+ ? 'Function/class signatures extracted from all project files (use exact file paths shown in === headers for schemaFiles/serviceFiles/apiFiles):'
30
+ : 'Available file paths for analysis (use ONLY these exact strings for schemaFiles/serviceFiles/apiFiles):';
31
+ const userPrompt = `Analyze this project structure:
32
+
33
+ Project Name: ${repoStructure.projectName}
34
+ Project Type: ${repoStructure.projectType}
35
+ Frameworks: ${repoStructure.frameworks.join(', ')}
36
+ Architecture Pattern: ${repoStructure.architecture.pattern}
37
+
38
+ Layers:
39
+ ${repoStructure.architecture.layers.map(l => `- ${l.name}: ${l.purpose} (${l.files.length} files)`).join('\n')}
40
+
41
+ Detected Domains:
42
+ ${repoStructure.domains.map(d => `- ${d.name}: ${d.files.length} files, entities: ${d.entities.join(', ')}`).join('\n')}
43
+
44
+ Statistics:
45
+ - Total files: ${repoStructure.statistics.totalFiles}
46
+ - Analyzed files: ${repoStructure.statistics.analyzedFiles}
47
+ - Node count: ${repoStructure.statistics.nodeCount}
48
+ - Edge count: ${repoStructure.statistics.edgeCount}
49
+ - Clusters: ${repoStructure.statistics.clusterCount}
50
+
51
+ ${sectionLabel}
52
+ ${fileListingSection}`;
53
+ try {
54
+ const result = await llm.completeJSON({
55
+ systemPrompt: PROMPTS.stage1_survey,
56
+ userPrompt,
57
+ temperature: 0.3,
58
+ maxTokens: 3000,
59
+ });
60
+ const stageResult = {
61
+ stage: 'survey',
62
+ success: true,
63
+ data: result,
64
+ tokens: llm.getTokenUsage().totalTokens,
65
+ duration: Date.now() - startTime,
66
+ };
67
+ if (options.saveIntermediate) {
68
+ await saveResult('stage1-survey', stageResult);
69
+ }
70
+ return stageResult;
71
+ }
72
+ catch (error) {
73
+ return {
74
+ stage: 'survey',
75
+ success: false,
76
+ error: error.message,
77
+ tokens: 0,
78
+ duration: Date.now() - startTime,
79
+ };
80
+ }
81
+ }
82
+ /**
83
+ * Merge multiple Stage 1 results (from chunked runs) into one.
84
+ * Uses the highest-confidence result for metadata; concatenates + deduplicates file lists.
85
+ */
86
+ export function mergeStage1Results(results) {
87
+ const successful = results.filter(r => r.success && r.data);
88
+ if (successful.length === 0)
89
+ return results[0];
90
+ const best = successful.reduce((a, b) => (a.data.confidence >= b.data.confidence ? a : b));
91
+ return {
92
+ ...best,
93
+ data: {
94
+ ...best.data,
95
+ frameworks: [...new Set(successful.flatMap(r => r.data.frameworks ?? []))],
96
+ suggestedDomains: [...new Set(successful.flatMap(r => r.data.suggestedDomains ?? []))],
97
+ schemaFiles: [...new Set(successful.flatMap(r => r.data.schemaFiles ?? []))],
98
+ serviceFiles: [...new Set(successful.flatMap(r => r.data.serviceFiles ?? []))],
99
+ apiFiles: [...new Set(successful.flatMap(r => r.data.apiFiles ?? []))],
100
+ },
101
+ tokens: results.reduce((s, r) => s + r.tokens, 0),
102
+ duration: results.reduce((s, r) => s + r.duration, 0),
103
+ };
104
+ }
105
+ //# sourceMappingURL=stage1-survey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage1-survey.js","sourceRoot":"","sources":["../../../../src/core/generator/stages/stage1-survey.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Stage 2: Entity Extraction
3
+ *
4
+ * Extracts core data models/entities from schema files.
5
+ */
6
+ import type { ExtractedEntity, StageResult, PipelineContext, ProjectSurveyResult } from '../../../types/pipeline.js';
7
+ export declare function runStage2(pipeline: PipelineContext, survey: ProjectSurveyResult, schemaFiles: Array<{
8
+ path: string;
9
+ content: string;
10
+ }>, onFile?: (i: number, total: number, file: string) => void): Promise<StageResult<ExtractedEntity[]>>;
11
+ //# sourceMappingURL=stage2-entities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage2-entities.d.ts","sourceRoot":"","sources":["../../../../src/core/generator/stages/stage2-entities.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAErH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,mBAAmB,EAC3B,WAAW,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EACrD,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GACxD,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,CAAC,CAgEzC"}