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,17 @@
1
+ /**
2
+ * spec-gen analyze — programmatic API
3
+ *
4
+ * Runs static analysis on the codebase (no LLM required).
5
+ * No side effects (no process.exit, no console.log).
6
+ */
7
+ import type { AnalyzeApiOptions, AnalyzeResult } from './types.js';
8
+ /**
9
+ * Run static analysis on the codebase.
10
+ *
11
+ * Scans the repository, builds a dependency graph, and generates
12
+ * analysis artifacts. No LLM involvement.
13
+ *
14
+ * @throws Error if no spec-gen configuration found
15
+ */
16
+ export declare function specGenAnalyze(options?: AnalyzeApiOptions): Promise<AnalyzeResult>;
17
+ //# sourceMappingURL=analyze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/api/analyze.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAmC,MAAM,YAAY,CAAC;AAepG;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,aAAa,CAAC,CAwF5F"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * spec-gen analyze — programmatic API
3
+ *
4
+ * Runs static analysis on the codebase (no LLM required).
5
+ * No side effects (no process.exit, no console.log).
6
+ */
7
+ import { join } from 'node:path';
8
+ import { access, stat, mkdir, writeFile } from 'node:fs/promises';
9
+ import { readSpecGenConfig } from '../core/services/config-manager.js';
10
+ import { RepositoryMapper } from '../core/analyzer/repository-mapper.js';
11
+ import { DependencyGraphBuilder } from '../core/analyzer/dependency-graph.js';
12
+ import { AnalysisArtifactGenerator } from '../core/analyzer/artifact-generator.js';
13
+ function progress(onProgress, step, status, detail) {
14
+ onProgress?.({ phase: 'analyze', step, status, detail });
15
+ }
16
+ async function fileExists(path) {
17
+ try {
18
+ await access(path);
19
+ return true;
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ /**
26
+ * Run static analysis on the codebase.
27
+ *
28
+ * Scans the repository, builds a dependency graph, and generates
29
+ * analysis artifacts. No LLM involvement.
30
+ *
31
+ * @throws Error if no spec-gen configuration found
32
+ */
33
+ export async function specGenAnalyze(options = {}) {
34
+ const startTime = Date.now();
35
+ const rootPath = options.rootPath ?? process.cwd();
36
+ const maxFiles = options.maxFiles ?? 500;
37
+ const excludePatterns = options.excludePatterns ?? [];
38
+ const force = options.force ?? false;
39
+ const outputRelPath = options.outputPath ?? '.spec-gen/analysis/';
40
+ const outputPath = join(rootPath, outputRelPath);
41
+ const { onProgress } = options;
42
+ // Validate config exists
43
+ const specGenConfig = await readSpecGenConfig(rootPath);
44
+ if (!specGenConfig) {
45
+ throw new Error('No spec-gen configuration found. Run specGenInit() first.');
46
+ }
47
+ // Check for existing recent analysis
48
+ if (!force) {
49
+ const repoStructurePath = join(outputPath, 'repo-structure.json');
50
+ if (await fileExists(repoStructurePath)) {
51
+ const stats = await stat(repoStructurePath);
52
+ const age = Date.now() - stats.mtime.getTime();
53
+ const oneHour = 60 * 60 * 1000;
54
+ if (age < oneHour) {
55
+ progress(onProgress, 'Recent analysis exists', 'skip', `${Math.floor(age / 60000)} minutes old`);
56
+ // Load and return existing analysis
57
+ const { readFile } = await import('node:fs/promises');
58
+ const repoStructureContent = await readFile(repoStructurePath, 'utf-8');
59
+ const repoStructure = JSON.parse(repoStructureContent);
60
+ const depGraphPath = join(outputPath, 'dependency-graph.json');
61
+ let depGraph;
62
+ if (await fileExists(depGraphPath)) {
63
+ const depGraphContent = await readFile(depGraphPath, 'utf-8');
64
+ depGraph = JSON.parse(depGraphContent);
65
+ }
66
+ return {
67
+ repoMap: repoStructure,
68
+ depGraph: depGraph ?? {
69
+ nodes: [], edges: [], clusters: [], cycles: [],
70
+ rankings: { byImportance: [], byConnectivity: [], clusterCenters: [], leafNodes: [], bridgeNodes: [], orphanNodes: [] },
71
+ statistics: { nodeCount: 0, edgeCount: 0, clusterCount: 0, cycleCount: 0, avgDegree: 0, density: 0 },
72
+ },
73
+ artifacts: { repoStructure },
74
+ duration: Date.now() - startTime,
75
+ };
76
+ }
77
+ }
78
+ }
79
+ // Ensure output directory exists
80
+ await mkdir(outputPath, { recursive: true });
81
+ // Phase 1: Repository Mapping
82
+ progress(onProgress, 'Scanning directory structure', 'start');
83
+ const mapper = new RepositoryMapper(rootPath, {
84
+ maxFiles,
85
+ excludePatterns: excludePatterns.length > 0 ? excludePatterns : undefined,
86
+ });
87
+ const repoMap = await mapper.map();
88
+ progress(onProgress, 'Scanning directory structure', 'complete', `${repoMap.summary.analyzedFiles} files`);
89
+ // Phase 2: Dependency Graph
90
+ progress(onProgress, 'Building dependency graph', 'start');
91
+ const graphBuilder = new DependencyGraphBuilder({ rootDir: rootPath });
92
+ const depGraph = await graphBuilder.build(repoMap.allFiles);
93
+ progress(onProgress, 'Building dependency graph', 'complete', `${depGraph.statistics.nodeCount} nodes, ${depGraph.statistics.edgeCount} edges`);
94
+ // Phase 3: Generate Artifacts
95
+ progress(onProgress, 'Generating analysis artifacts', 'start');
96
+ const artifactGenerator = new AnalysisArtifactGenerator({
97
+ rootDir: rootPath,
98
+ outputDir: outputPath,
99
+ maxDeepAnalysisFiles: Math.min(20, Math.ceil(repoMap.highValueFiles.length * 0.3)),
100
+ maxValidationFiles: 5,
101
+ });
102
+ const artifacts = await artifactGenerator.generateAndSave(repoMap, depGraph);
103
+ // Save dependency graph
104
+ await writeFile(join(outputPath, 'dependency-graph.json'), JSON.stringify(depGraph, null, 2));
105
+ progress(onProgress, 'Generating analysis artifacts', 'complete');
106
+ const duration = Date.now() - startTime;
107
+ return { repoMap, depGraph, artifacts, duration };
108
+ }
109
+ //# sourceMappingURL=analyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/api/analyze.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * spec-gen drift — programmatic API
3
+ *
4
+ * Detects spec drift: finds code changes not reflected in specs.
5
+ * No side effects (no process.exit, no console.log).
6
+ */
7
+ import type { DriftResult } from '../types/index.js';
8
+ import type { DriftApiOptions } from './types.js';
9
+ /**
10
+ * Detect spec drift in a project.
11
+ *
12
+ * Compares code changes against existing OpenSpec specifications
13
+ * and reports gaps, stale specs, uncovered files, and orphaned specs.
14
+ *
15
+ * @throws Error if not a git repository
16
+ * @throws Error if no spec-gen configuration found
17
+ * @throws Error if no specs found
18
+ * @throws Error if LLM enhanced mode requested but no API key
19
+ */
20
+ export declare function specGenDrift(options?: DriftApiOptions): Promise<DriftResult>;
21
+ //# sourceMappingURL=drift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../src/api/drift.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,YAAY,CAAC;AAepE;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,CAwHtF"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * spec-gen drift — programmatic API
3
+ *
4
+ * Detects spec drift: finds code changes not reflected in specs.
5
+ * No side effects (no process.exit, no console.log).
6
+ */
7
+ import { join } from 'node:path';
8
+ import { access } from 'node:fs/promises';
9
+ import { readSpecGenConfig } from '../core/services/config-manager.js';
10
+ import { getChangedFiles, isGitRepository, buildSpecMap, buildADRMap, detectDrift, } from '../core/drift/index.js';
11
+ import { createLLMService } from '../core/services/llm-service.js';
12
+ function progress(onProgress, step, status, detail) {
13
+ onProgress?.({ phase: 'drift', step, status, detail });
14
+ }
15
+ async function fileExists(path) {
16
+ try {
17
+ await access(path);
18
+ return true;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ /**
25
+ * Detect spec drift in a project.
26
+ *
27
+ * Compares code changes against existing OpenSpec specifications
28
+ * and reports gaps, stale specs, uncovered files, and orphaned specs.
29
+ *
30
+ * @throws Error if not a git repository
31
+ * @throws Error if no spec-gen configuration found
32
+ * @throws Error if no specs found
33
+ * @throws Error if LLM enhanced mode requested but no API key
34
+ */
35
+ export async function specGenDrift(options = {}) {
36
+ const startTime = Date.now();
37
+ const rootPath = options.rootPath ?? process.cwd();
38
+ const baseRef = options.baseRef ?? 'auto';
39
+ const files = options.files ?? [];
40
+ const domains = options.domains ?? [];
41
+ const llmEnhanced = options.llmEnhanced ?? false;
42
+ const failOn = options.failOn ?? 'warning';
43
+ const maxFiles = options.maxFiles ?? 100;
44
+ const { onProgress } = options;
45
+ // Validate git repo
46
+ if (!(await isGitRepository(rootPath))) {
47
+ throw new Error('Not a git repository. Drift detection requires git.');
48
+ }
49
+ // Load config
50
+ const specGenConfig = await readSpecGenConfig(rootPath);
51
+ if (!specGenConfig) {
52
+ throw new Error('No spec-gen configuration found. Run specGenInit() first.');
53
+ }
54
+ // Check specs exist
55
+ const openspecPath = join(rootPath, specGenConfig.openspecPath ?? 'openspec');
56
+ const specsPath = join(openspecPath, 'specs');
57
+ if (!(await fileExists(specsPath))) {
58
+ throw new Error('No specs found. Run specGenGenerate() first.');
59
+ }
60
+ // Create LLM service if needed
61
+ let llm;
62
+ if (llmEnhanced) {
63
+ const anthropicKey = process.env.ANTHROPIC_API_KEY;
64
+ const openaiKey = process.env.OPENAI_API_KEY;
65
+ if (!anthropicKey && !openaiKey) {
66
+ throw new Error('No LLM API key found. LLM-enhanced drift requires ANTHROPIC_API_KEY or OPENAI_API_KEY.');
67
+ }
68
+ const provider = options.provider ?? (anthropicKey ? 'anthropic' : 'openai');
69
+ llm = createLLMService({
70
+ provider,
71
+ apiBase: options.apiBase ?? specGenConfig.llm?.apiBase,
72
+ sslVerify: options.sslVerify ?? specGenConfig.llm?.sslVerify ?? true,
73
+ enableLogging: true,
74
+ logDir: join(rootPath, '.spec-gen', 'logs'),
75
+ });
76
+ }
77
+ // Get changed files
78
+ progress(onProgress, 'Analyzing git changes', 'start');
79
+ const gitResult = await getChangedFiles({
80
+ rootPath,
81
+ baseRef,
82
+ pathFilter: files.length > 0 ? files : undefined,
83
+ includeUnstaged: true,
84
+ });
85
+ progress(onProgress, 'Analyzing git changes', 'complete', `${gitResult.files.length} changed files`);
86
+ if (gitResult.files.length === 0) {
87
+ return {
88
+ timestamp: new Date().toISOString(),
89
+ baseRef: gitResult.resolvedBase,
90
+ totalChangedFiles: 0,
91
+ specRelevantFiles: 0,
92
+ issues: [],
93
+ summary: { gaps: 0, stale: 0, uncovered: 0, orphanedSpecs: 0, adrGaps: 0, adrOrphaned: 0, total: 0 },
94
+ hasDrift: false,
95
+ duration: Date.now() - startTime,
96
+ mode: 'static',
97
+ };
98
+ }
99
+ // Apply max-files limit
100
+ const actualChangedFiles = gitResult.files.length;
101
+ if (gitResult.files.length > maxFiles) {
102
+ gitResult.files = gitResult.files.slice(0, maxFiles);
103
+ }
104
+ // Build spec map
105
+ progress(onProgress, 'Loading spec mappings', 'start');
106
+ const repoStructurePath = join(rootPath, '.spec-gen', 'analysis', 'repo-structure.json');
107
+ const hasRepoStructure = await fileExists(repoStructurePath);
108
+ const specMap = await buildSpecMap({
109
+ rootPath,
110
+ openspecPath,
111
+ repoStructurePath: hasRepoStructure ? repoStructurePath : undefined,
112
+ });
113
+ // Build ADR map
114
+ const adrMap = await buildADRMap({
115
+ rootPath,
116
+ openspecPath,
117
+ repoStructurePath: hasRepoStructure ? repoStructurePath : undefined,
118
+ });
119
+ progress(onProgress, 'Loading spec mappings', 'complete', `${specMap.domainCount} domains`);
120
+ // Detect drift
121
+ progress(onProgress, 'Detecting drift', 'start');
122
+ const result = await detectDrift({
123
+ rootPath,
124
+ specMap,
125
+ changedFiles: gitResult.files,
126
+ failOn,
127
+ domainFilter: domains.length > 0 ? domains : undefined,
128
+ openspecRelPath: specGenConfig.openspecPath ?? 'openspec',
129
+ llm,
130
+ baseRef: gitResult.resolvedBase,
131
+ adrMap: adrMap ?? undefined,
132
+ });
133
+ result.baseRef = gitResult.resolvedBase;
134
+ result.totalChangedFiles = actualChangedFiles;
135
+ progress(onProgress, 'Detecting drift', 'complete', `${result.summary.total} issues`);
136
+ // Save LLM logs if applicable
137
+ if (llm) {
138
+ try {
139
+ await llm.saveLogs();
140
+ }
141
+ catch { /* best-effort */ }
142
+ }
143
+ return result;
144
+ }
145
+ //# sourceMappingURL=drift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/api/drift.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EACL,eAAe,EACf,eAAe,EACf,YAAY,EACZ,WAAW,EACX,WAAW,GACZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAKnE,SAAS,QAAQ,CAAC,UAAwC,EAAE,IAAY,EAAE,MAAkD,EAAE,MAAe;IAC3I,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,UAA2B,EAAE;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACnD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC;IACzC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAE/B,oBAAoB;IACpB,IAAI,CAAC,CAAC,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,cAAc;IACd,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IAED,oBAAoB;IACpB,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,YAAY,IAAI,UAAU,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,+BAA+B;IAC/B,IAAI,GAA2B,CAAC;IAChC,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACnD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;QAC5G,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7E,GAAG,GAAG,gBAAgB,CAAC;YACrB,QAAQ;YACR,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,aAAa,CAAC,GAAG,EAAE,OAAO;YACtD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,aAAa,CAAC,GAAG,EAAE,SAAS,IAAI,IAAI;YACpE,aAAa,EAAE,IAAI;YACnB,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB;IACpB,QAAQ,CAAC,UAAU,EAAE,uBAAuB,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC;QACtC,QAAQ;QACR,OAAO;QACP,UAAU,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QAChD,eAAe,EAAE,IAAI;KACtB,CAAC,CAAC;IACH,QAAQ,CAAC,UAAU,EAAE,uBAAuB,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,gBAAgB,CAAC,CAAC;IAErG,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO;YACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,SAAS,CAAC,YAAY;YAC/B,iBAAiB,EAAE,CAAC;YACpB,iBAAiB,EAAE,CAAC;YACpB,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;YACpG,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAChC,IAAI,EAAE,QAAQ;SACf,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,MAAM,kBAAkB,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;IAClD,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QACtC,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,iBAAiB;IACjB,QAAQ,CAAC,UAAU,EAAE,uBAAuB,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC;IACzF,MAAM,gBAAgB,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAE7D,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC;QACjC,QAAQ;QACR,YAAY;QACZ,iBAAiB,EAAE,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS;KACpE,CAAC,CAAC;IAEH,gBAAgB;IAChB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;QAC/B,QAAQ;QACR,YAAY;QACZ,iBAAiB,EAAE,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS;KACpE,CAAC,CAAC;IACH,QAAQ,CAAC,UAAU,EAAE,uBAAuB,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,WAAW,UAAU,CAAC,CAAC;IAE5F,eAAe;IACf,QAAQ,CAAC,UAAU,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;QAC/B,QAAQ;QACR,OAAO;QACP,YAAY,EAAE,SAAS,CAAC,KAAK;QAC7B,MAAM;QACN,YAAY,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QACtD,eAAe,EAAE,aAAa,CAAC,YAAY,IAAI,UAAU;QACzD,GAAG;QACH,OAAO,EAAE,SAAS,CAAC,YAAY;QAC/B,MAAM,EAAE,MAAM,IAAI,SAAS;KAC5B,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,YAAY,CAAC;IACxC,MAAM,CAAC,iBAAiB,GAAG,kBAAkB,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,iBAAiB,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC;IAEtF,8BAA8B;IAC9B,IAAI,GAAG,EAAE,CAAC;QACR,IAAI,CAAC;YAAC,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * spec-gen generate — programmatic API
3
+ *
4
+ * Generates OpenSpec specification files from analysis results using LLM.
5
+ * No side effects (no process.exit, no console.log).
6
+ */
7
+ import type { GenerateApiOptions, GenerateResult } from './types.js';
8
+ /**
9
+ * Generate OpenSpec specification files from analysis results using LLM.
10
+ *
11
+ * @throws Error if no spec-gen configuration found
12
+ * @throws Error if no analysis found
13
+ * @throws Error if no LLM API key found
14
+ * @throws Error if LLM API connectivity fails
15
+ * @throws Error if pipeline fails
16
+ */
17
+ export declare function specGenGenerate(options?: GenerateApiOptions): Promise<GenerateResult>;
18
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/api/generate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAoB,MAAM,YAAY,CAAC;AAqDvF;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,cAAc,CAAC,CA8M/F"}
@@ -0,0 +1,251 @@
1
+ /**
2
+ * spec-gen generate — programmatic API
3
+ *
4
+ * Generates OpenSpec specification files from analysis results using LLM.
5
+ * No side effects (no process.exit, no console.log).
6
+ */
7
+ import { join } from 'node:path';
8
+ import { access, readFile } from 'node:fs/promises';
9
+ import { readSpecGenConfig, readOpenSpecConfig, } from '../core/services/config-manager.js';
10
+ import { createLLMService } from '../core/services/llm-service.js';
11
+ import { SpecGenerationPipeline } from '../core/generator/spec-pipeline.js';
12
+ import { OpenSpecFormatGenerator } from '../core/generator/openspec-format-generator.js';
13
+ import { OpenSpecWriter } from '../core/generator/openspec-writer.js';
14
+ import { ADRGenerator } from '../core/generator/adr-generator.js';
15
+ import { MappingGenerator } from '../core/generator/mapping-generator.js';
16
+ function progress(onProgress, step, status, detail) {
17
+ onProgress?.({ phase: 'generate', step, status, detail });
18
+ }
19
+ async function fileExists(path) {
20
+ try {
21
+ await access(path);
22
+ return true;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ async function loadAnalysisData(analysisPath) {
29
+ const repoStructurePath = join(analysisPath, 'repo-structure.json');
30
+ if (!(await fileExists(repoStructurePath))) {
31
+ return null;
32
+ }
33
+ const repoStructureContent = await readFile(repoStructurePath, 'utf-8');
34
+ const repoStructure = JSON.parse(repoStructureContent);
35
+ let llmContext;
36
+ const llmContextPath = join(analysisPath, 'llm-context.json');
37
+ if (await fileExists(llmContextPath)) {
38
+ const content = await readFile(llmContextPath, 'utf-8');
39
+ llmContext = JSON.parse(content);
40
+ }
41
+ else {
42
+ llmContext = {
43
+ phase1_survey: { purpose: 'Initial survey', files: [], estimatedTokens: 0 },
44
+ phase2_deep: { purpose: 'Deep analysis', files: [], totalTokens: 0 },
45
+ phase3_validation: { purpose: 'Validation', files: [], totalTokens: 0 },
46
+ };
47
+ }
48
+ let depGraph;
49
+ const depGraphPath = join(analysisPath, 'dependency-graph.json');
50
+ if (await fileExists(depGraphPath)) {
51
+ const content = await readFile(depGraphPath, 'utf-8');
52
+ depGraph = JSON.parse(content);
53
+ }
54
+ return { repoStructure, llmContext, depGraph };
55
+ }
56
+ /**
57
+ * Generate OpenSpec specification files from analysis results using LLM.
58
+ *
59
+ * @throws Error if no spec-gen configuration found
60
+ * @throws Error if no analysis found
61
+ * @throws Error if no LLM API key found
62
+ * @throws Error if LLM API connectivity fails
63
+ * @throws Error if pipeline fails
64
+ */
65
+ export async function specGenGenerate(options = {}) {
66
+ const startTime = Date.now();
67
+ const rootPath = options.rootPath ?? process.cwd();
68
+ const analysisRelPath = options.analysisPath ?? '.spec-gen/analysis/';
69
+ const analysisPath = join(rootPath, analysisRelPath);
70
+ const { onProgress } = options;
71
+ // Load config
72
+ progress(onProgress, 'Loading configuration', 'start');
73
+ const specGenConfig = await readSpecGenConfig(rootPath);
74
+ if (!specGenConfig) {
75
+ throw new Error('No spec-gen configuration found. Run specGenInit() first.');
76
+ }
77
+ const openspecRelPath = specGenConfig.openspecPath ?? 'openspec';
78
+ const fullOpenspecPath = join(rootPath, openspecRelPath);
79
+ await readOpenSpecConfig(fullOpenspecPath); // Ensure it's readable
80
+ progress(onProgress, 'Loading configuration', 'complete');
81
+ // Load analysis
82
+ progress(onProgress, 'Loading analysis', 'start');
83
+ const analysisData = await loadAnalysisData(analysisPath);
84
+ if (!analysisData) {
85
+ throw new Error('No analysis found. Run specGenAnalyze() first.');
86
+ }
87
+ const { repoStructure, llmContext, depGraph } = analysisData;
88
+ progress(onProgress, 'Loading analysis', 'complete', `${repoStructure.statistics.analyzedFiles} files`);
89
+ // Resolve provider
90
+ const anthropicKey = process.env.ANTHROPIC_API_KEY;
91
+ const openaiKey = process.env.OPENAI_API_KEY;
92
+ const openaiCompatKey = process.env.OPENAI_COMPAT_API_KEY;
93
+ const geminiKey = process.env.GEMINI_API_KEY;
94
+ if (!anthropicKey && !openaiKey && !openaiCompatKey && !geminiKey) {
95
+ throw new Error('No LLM API key found. Set ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, or OPENAI_COMPAT_API_KEY.');
96
+ }
97
+ const envDetectedProvider = anthropicKey ? 'anthropic'
98
+ : geminiKey ? 'gemini'
99
+ : openaiCompatKey ? 'openai-compat'
100
+ : 'openai';
101
+ const effectiveProvider = options.provider ?? specGenConfig.generation.provider ?? envDetectedProvider;
102
+ const defaultModels = {
103
+ anthropic: 'claude-sonnet-4-20250514',
104
+ gemini: 'gemini-2.0-flash',
105
+ 'openai-compat': 'mistral-large-latest',
106
+ openai: 'gpt-4o',
107
+ };
108
+ const effectiveModel = options.model || specGenConfig.generation.model || defaultModels[effectiveProvider];
109
+ const rootConfig = specGenConfig;
110
+ const effectiveBaseUrl = options.openaiCompatBaseUrl
111
+ ?? process.env.OPENAI_COMPAT_BASE_URL
112
+ ?? specGenConfig.generation.openaiCompatBaseUrl
113
+ ?? rootConfig['openaiCompatBaseUrl'];
114
+ // Apply SSL verification setting
115
+ const sslVerify = options.sslVerify ?? specGenConfig.llm?.sslVerify ?? true;
116
+ if (!sslVerify || specGenConfig.generation.skipSslVerify || specGenConfig.embedding?.skipSslVerify) {
117
+ process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
118
+ }
119
+ // Create LLM service
120
+ progress(onProgress, 'Creating LLM service', 'start');
121
+ let llm;
122
+ try {
123
+ llm = createLLMService({
124
+ provider: effectiveProvider,
125
+ model: effectiveModel,
126
+ openaiCompatBaseUrl: effectiveBaseUrl,
127
+ apiBase: options.apiBase ?? specGenConfig.llm?.apiBase,
128
+ sslVerify,
129
+ enableLogging: true,
130
+ logDir: join(rootPath, '.spec-gen', 'logs'),
131
+ });
132
+ }
133
+ catch (error) {
134
+ throw new Error(`Failed to create LLM service: ${error.message}`);
135
+ }
136
+ progress(onProgress, 'Creating LLM service', 'complete', `${effectiveProvider}/${effectiveModel}`);
137
+ // Dry run — return empty result
138
+ if (options.dryRun) {
139
+ progress(onProgress, 'Dry run complete', 'complete');
140
+ return {
141
+ report: {
142
+ timestamp: new Date().toISOString(),
143
+ openspecVersion: specGenConfig.version ?? '1.0.0',
144
+ specGenVersion: '1.0.0',
145
+ filesWritten: [],
146
+ filesSkipped: [],
147
+ filesBackedUp: [],
148
+ filesMerged: [],
149
+ configUpdated: false,
150
+ validationErrors: [],
151
+ warnings: [],
152
+ nextSteps: ['Run without --dry-run to generate specs'],
153
+ },
154
+ pipelineResult: {},
155
+ duration: Date.now() - startTime,
156
+ };
157
+ }
158
+ // Run pipeline
159
+ progress(onProgress, 'Running LLM generation pipeline', 'start');
160
+ const adr = options.adr ?? false;
161
+ const adrOnly = options.adrOnly ?? false;
162
+ const pipeline = new SpecGenerationPipeline(llm, {
163
+ outputDir: join(rootPath, '.spec-gen', 'generation'),
164
+ saveIntermediate: true,
165
+ generateADRs: adr || adrOnly,
166
+ });
167
+ let pipelineResult;
168
+ try {
169
+ pipelineResult = await pipeline.run(repoStructure, llmContext, depGraph);
170
+ }
171
+ catch (error) {
172
+ await llm.saveLogs().catch(() => { });
173
+ throw new Error(`Pipeline failed: ${error.message}`);
174
+ }
175
+ progress(onProgress, 'Running LLM generation pipeline', 'complete');
176
+ // Format specs
177
+ progress(onProgress, 'Formatting specifications', 'start');
178
+ const formatGenerator = new OpenSpecFormatGenerator({
179
+ version: specGenConfig.version,
180
+ includeConfidence: true,
181
+ includeTechnicalNotes: true,
182
+ });
183
+ let generatedSpecs = adrOnly ? [] : formatGenerator.generateSpecs(pipelineResult);
184
+ // Filter by domains
185
+ if (!adrOnly && options.domains && options.domains.length > 0) {
186
+ const domainSet = new Set(options.domains.map(d => d.toLowerCase()));
187
+ generatedSpecs = generatedSpecs.filter(spec => spec.type === 'overview' || spec.type === 'architecture' || domainSet.has(spec.domain.toLowerCase()));
188
+ }
189
+ // Generate ADRs
190
+ if (adr || adrOnly) {
191
+ const adrGenerator = new ADRGenerator({
192
+ version: specGenConfig.version,
193
+ includeMermaid: true,
194
+ });
195
+ const adrSpecs = adrGenerator.generateADRs(pipelineResult);
196
+ generatedSpecs.push(...adrSpecs);
197
+ }
198
+ progress(onProgress, 'Formatting specifications', 'complete', `${generatedSpecs.length} files`);
199
+ // Write specs
200
+ progress(onProgress, 'Writing OpenSpec files', 'start');
201
+ const writeMode = options.writeMode ?? 'replace';
202
+ const writer = new OpenSpecWriter({
203
+ rootPath,
204
+ writeMode,
205
+ version: specGenConfig.version,
206
+ createBackups: true,
207
+ updateConfig: true,
208
+ validateBeforeWrite: true,
209
+ });
210
+ const report = await writer.writeSpecs(generatedSpecs, pipelineResult.survey);
211
+ progress(onProgress, 'Writing OpenSpec files', 'complete', `${report.filesWritten.length} written`);
212
+ // Generate mapping artifact
213
+ if ((options.mapping ?? true) && depGraph) {
214
+ try {
215
+ let semanticSearch;
216
+ const analysisDir = join(rootPath, '.spec-gen', 'analysis');
217
+ const { VectorIndex } = await import('../core/analyzer/vector-index.js');
218
+ if (VectorIndex.exists(analysisDir)) {
219
+ const { EmbeddingService } = await import('../core/analyzer/embedding-service.js');
220
+ let embedSvc;
221
+ try {
222
+ embedSvc = EmbeddingService.fromEnv();
223
+ }
224
+ catch { /* no env config */ }
225
+ if (!embedSvc) {
226
+ const svc = EmbeddingService.fromConfig(specGenConfig);
227
+ if (svc)
228
+ embedSvc = svc;
229
+ }
230
+ if (embedSvc) {
231
+ const svc = embedSvc;
232
+ semanticSearch = (query, limit) => VectorIndex.search(analysisDir, query, svc, { limit });
233
+ }
234
+ }
235
+ const mapper = new MappingGenerator(rootPath, openspecRelPath, semanticSearch);
236
+ await mapper.generate(pipelineResult, depGraph);
237
+ progress(onProgress, 'Generating mapping artifact', 'complete');
238
+ }
239
+ catch {
240
+ // Non-fatal
241
+ }
242
+ }
243
+ // Save LLM logs
244
+ await llm.saveLogs().catch(() => { });
245
+ return {
246
+ report,
247
+ pipelineResult,
248
+ duration: Date.now() - startTime,
249
+ };
250
+ }
251
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/api/generate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,gDAAgD,CAAC;AACzF,OAAO,EAAE,cAAc,EAAkB,MAAM,sCAAsC,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAK1E,SAAS,QAAQ,CAAC,UAAwC,EAAE,IAAY,EAAE,MAAkD,EAAE,MAAe;IAC3I,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAQD,KAAK,UAAU,gBAAgB,CAAC,YAAoB;IAClD,MAAM,iBAAiB,GAAG,IAAI,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;IACpE,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,oBAAoB,GAAG,MAAM,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAkB,CAAC;IAExE,IAAI,UAAsB,CAAC;IAC3B,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;IAC9D,IAAI,MAAM,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACxD,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,UAAU,GAAG;YACX,aAAa,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE;YAC3E,WAAW,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE;YACpE,iBAAiB,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE;SACxE,CAAC;IACJ,CAAC;IAED,IAAI,QAA2C,CAAC;IAChD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAAC;IACjE,IAAI,MAAM,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACtD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA0B,CAAC;IAC1D,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AACjD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAA8B,EAAE;IACpE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACnD,MAAM,eAAe,GAAG,OAAO,CAAC,YAAY,IAAI,qBAAqB,CAAC;IACtE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACrD,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAE/B,cAAc;IACd,QAAQ,CAAC,UAAU,EAAE,uBAAuB,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,eAAe,GAAG,aAAa,CAAC,YAAY,IAAI,UAAU,CAAC;IACjE,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACzD,MAAM,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC,uBAAuB;IACnE,QAAQ,CAAC,UAAU,EAAE,uBAAuB,EAAE,UAAU,CAAC,CAAC;IAE1D,gBAAgB;IAChB,QAAQ,CAAC,UAAU,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC1D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC;IAC7D,QAAQ,CAAC,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,GAAG,aAAa,CAAC,UAAU,CAAC,aAAa,QAAQ,CAAC,CAAC;IAExG,mBAAmB;IACnB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACnD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC7C,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAE7C,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,IAAI,CAAC,eAAe,IAAI,CAAC,SAAS,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CACb,wGAAwG,CACzG,CAAC;IACJ,CAAC;IAED,MAAM,mBAAmB,GAAG,YAAY,CAAC,CAAC,CAAC,WAAW;QACpD,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;YACtB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe;gBACnC,CAAC,CAAC,QAAQ,CAAC;IAEb,MAAM,iBAAiB,GAAG,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC,UAAU,CAAC,QAAQ,IAAI,mBAAmB,CAAC;IAEvG,MAAM,aAAa,GAA2B;QAC5C,SAAS,EAAE,0BAA0B;QACrC,MAAM,EAAE,kBAAkB;QAC1B,eAAe,EAAE,sBAAsB;QACvC,MAAM,EAAE,QAAQ;KACjB,CAAC;IACF,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,IAAI,aAAa,CAAC,UAAU,CAAC,KAAK,IAAI,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAE3G,MAAM,UAAU,GAAG,aAAkD,CAAC;IACtE,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB;WAC/C,OAAO,CAAC,GAAG,CAAC,sBAAsB;WAClC,aAAa,CAAC,UAAU,CAAC,mBAAmB;WAC5C,UAAU,CAAC,qBAAqB,CAAC,CAAC;IAEvC,iCAAiC;IACjC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,aAAa,CAAC,GAAG,EAAE,SAAS,IAAI,IAAI,CAAC;IAC5E,IAAI,CAAC,SAAS,IAAI,aAAa,CAAC,UAAU,CAAC,aAAa,IAAI,aAAa,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC;QACnG,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,GAAG,CAAC;IACjD,CAAC;IAED,qBAAqB;IACrB,QAAQ,CAAC,UAAU,EAAE,sBAAsB,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,GAAe,CAAC;IACpB,IAAI,CAAC;QACH,GAAG,GAAG,gBAAgB,CAAC;YACrB,QAAQ,EAAE,iBAAiB;YAC3B,KAAK,EAAE,cAAc;YACrB,mBAAmB,EAAE,gBAAgB;YACrC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,aAAa,CAAC,GAAG,EAAE,OAAO;YACtD,SAAS;YACT,aAAa,EAAE,IAAI;YACnB,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,iCAAkC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,QAAQ,CAAC,UAAU,EAAE,sBAAsB,EAAE,UAAU,EAAE,GAAG,iBAAiB,IAAI,cAAc,EAAE,CAAC,CAAC;IAEnG,gCAAgC;IAChC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,QAAQ,CAAC,UAAU,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC;QACrD,OAAO;YACL,MAAM,EAAE;gBACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,eAAe,EAAE,aAAa,CAAC,OAAO,IAAI,OAAO;gBACjD,cAAc,EAAE,OAAO;gBACvB,YAAY,EAAE,EAAE;gBAChB,YAAY,EAAE,EAAE;gBAChB,aAAa,EAAE,EAAE;gBACjB,WAAW,EAAE,EAAE;gBACf,aAAa,EAAE,KAAK;gBACpB,gBAAgB,EAAE,EAAE;gBACpB,QAAQ,EAAE,EAAE;gBACZ,SAAS,EAAE,CAAC,yCAAyC,CAAC;aACvD;YACD,cAAc,EAAE,EAAsC;YACtD,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACjC,CAAC;IACJ,CAAC;IAED,eAAe;IACf,QAAQ,CAAC,UAAU,EAAE,iCAAiC,EAAE,OAAO,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,sBAAsB,CAAC,GAAG,EAAE;QAC/C,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC;QACpD,gBAAgB,EAAE,IAAI;QACtB,YAAY,EAAE,GAAG,IAAI,OAAO;KAC7B,CAAC,CAAC;IAEH,IAAI,cAAc,CAAC;IACnB,IAAI,CAAC;QACH,cAAc,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,oBAAqB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,QAAQ,CAAC,UAAU,EAAE,iCAAiC,EAAE,UAAU,CAAC,CAAC;IAEpE,eAAe;IACf,QAAQ,CAAC,UAAU,EAAE,2BAA2B,EAAE,OAAO,CAAC,CAAC;IAC3D,MAAM,eAAe,GAAG,IAAI,uBAAuB,CAAC;QAClD,OAAO,EAAE,aAAa,CAAC,OAAO;QAC9B,iBAAiB,EAAE,IAAI;QACvB,qBAAqB,EAAE,IAAI;KAC5B,CAAC,CAAC;IAEH,IAAI,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IAElF,oBAAoB;IACpB,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACrE,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAC5C,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CACrG,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;QACnB,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC;YACpC,OAAO,EAAE,aAAa,CAAC,OAAO;YAC9B,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;QAC3D,cAAc,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,QAAQ,CAAC,UAAU,EAAE,2BAA2B,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,MAAM,QAAQ,CAAC,CAAC;IAEhG,cAAc;IACd,QAAQ,CAAC,UAAU,EAAE,wBAAwB,EAAE,OAAO,CAAC,CAAC;IACxD,MAAM,SAAS,GAAc,OAAO,CAAC,SAAS,IAAI,SAAS,CAAC;IAE5D,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;QAChC,QAAQ;QACR,SAAS;QACT,OAAO,EAAE,aAAa,CAAC,OAAO;QAC9B,aAAa,EAAE,IAAI;QACnB,YAAY,EAAE,IAAI;QAClB,mBAAmB,EAAE,IAAI;KAC1B,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC9E,QAAQ,CAAC,UAAU,EAAE,wBAAwB,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,UAAU,CAAC,CAAC;IAEpG,4BAA4B;IAC5B,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC1C,IAAI,CAAC;YACH,IAAI,cAA6F,CAAC;YAClG,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YAC5D,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAC;YACzE,IAAI,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;gBACpC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,uCAAuC,CAAC,CAAC;gBACnF,IAAI,QAA2D,CAAC;gBAChE,IAAI,CAAC;oBAAC,QAAQ,GAAG,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC;gBAC5E,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,GAAG,GAAG,gBAAgB,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;oBACvD,IAAI,GAAG;wBAAE,QAAQ,GAAG,GAAG,CAAC;gBAC1B,CAAC;gBACD,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,GAAG,GAAG,QAAQ,CAAC;oBACrB,cAAc,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC5F,CAAC;YACH,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;YAC/E,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;YAChD,QAAQ,CAAC,UAAU,EAAE,6BAA6B,EAAE,UAAU,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAErC,OAAO;QACL,MAAM;QACN,cAAc;QACd,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;KACjC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * spec-gen Programmatic API
3
+ *
4
+ * This is the public API surface for spec-gen. Consumers (like OpenSpec CLI)
5
+ * can import these functions to use spec-gen as a library.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { specGenRun, specGenDrift } from 'spec-gen';
10
+ *
11
+ * // Run the full pipeline
12
+ * const result = await specGenRun({
13
+ * rootPath: '/path/to/project',
14
+ * onProgress: (event) => console.log(event.step),
15
+ * });
16
+ *
17
+ * // Check for drift
18
+ * const drift = await specGenDrift({ rootPath: '/path/to/project' });
19
+ * if (drift.hasDrift) {
20
+ * console.warn(`${drift.summary.total} drift issues found`);
21
+ * }
22
+ * ```
23
+ */
24
+ export { specGenInit } from './init.js';
25
+ export { specGenAnalyze } from './analyze.js';
26
+ export { specGenGenerate } from './generate.js';
27
+ export { specGenVerify } from './verify.js';
28
+ export { specGenDrift } from './drift.js';
29
+ export { specGenRun } from './run.js';
30
+ export { specGenGetSpecRequirements } from './specs.js';
31
+ export type { ProgressCallback, ProgressEvent, BaseOptions, InitApiOptions, InitResult, AnalyzeApiOptions, AnalyzeResult, GenerateApiOptions, GenerateResult, VerifyApiOptions, VerifyResult, DriftApiOptions, RunApiOptions, RunResult, } from './types.js';
32
+ export type { DriftResult, DriftSeverity, SpecGenConfig } from '../types/index.js';
33
+ export type { RepositoryMap } from './types.js';
34
+ export type { DependencyGraphResult } from '../core/analyzer/dependency-graph.js';
35
+ export type { PipelineResult } from '../core/generator/spec-pipeline.js';
36
+ export type { GenerationReport } from '../core/generator/openspec-writer.js';
37
+ export type { VerificationReport } from '../core/verifier/verification-engine.js';
38
+ export type { SpecRequirement } from './specs.js';
39
+ //# sourceMappingURL=index.d.ts.map