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 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAGxD,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,aAAa,EACb,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACnF,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAClF,YAAY,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,YAAY,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAClF,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,32 @@
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
+ // API functions
25
+ export { specGenInit } from './init.js';
26
+ export { specGenAnalyze } from './analyze.js';
27
+ export { specGenGenerate } from './generate.js';
28
+ export { specGenVerify } from './verify.js';
29
+ export { specGenDrift } from './drift.js';
30
+ export { specGenRun } from './run.js';
31
+ export { specGenGetSpecRequirements } from './specs.js';
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,gBAAgB;AAChB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * spec-gen init — programmatic API
3
+ *
4
+ * Detects project type and creates spec-gen configuration.
5
+ * No side effects (no process.exit, no console.log).
6
+ */
7
+ import type { InitApiOptions, InitResult } from './types.js';
8
+ /**
9
+ * Initialize spec-gen in a project directory.
10
+ *
11
+ * Creates `.spec-gen/config.json`, the `openspec/` directory structure,
12
+ * and updates `.gitignore`.
13
+ *
14
+ * @throws Error if openspec path is outside project root
15
+ * @throws Error if config exists and force is false
16
+ */
17
+ export declare function specGenInit(options?: InitApiOptions): Promise<InitResult>;
18
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/api/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmBH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAoB,MAAM,YAAY,CAAC;AAM/E;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAgEnF"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * spec-gen init — programmatic API
3
+ *
4
+ * Detects project type and creates spec-gen configuration.
5
+ * No side effects (no process.exit, no console.log).
6
+ */
7
+ import { resolve, relative } from 'node:path';
8
+ import { detectProjectType, getProjectTypeName, } from '../core/services/project-detector.js';
9
+ import { getDefaultConfig, writeSpecGenConfig, specGenConfigExists, openspecDirExists, createOpenSpecStructure, } from '../core/services/config-manager.js';
10
+ import { gitignoreExists, isInGitignore, addToGitignore, } from '../core/services/gitignore-manager.js';
11
+ function progress(onProgress, step, status, detail) {
12
+ onProgress?.({ phase: 'init', step, status, detail });
13
+ }
14
+ /**
15
+ * Initialize spec-gen in a project directory.
16
+ *
17
+ * Creates `.spec-gen/config.json`, the `openspec/` directory structure,
18
+ * and updates `.gitignore`.
19
+ *
20
+ * @throws Error if openspec path is outside project root
21
+ * @throws Error if config exists and force is false
22
+ */
23
+ export async function specGenInit(options = {}) {
24
+ const rootPath = options.rootPath ?? process.cwd();
25
+ const openspecRelPath = options.openspecPath ?? './openspec';
26
+ const openspecFullPath = resolve(rootPath, openspecRelPath);
27
+ const force = options.force ?? false;
28
+ const { onProgress } = options;
29
+ // Validate path traversal
30
+ const relPath = relative(rootPath, openspecFullPath);
31
+ if (relPath.startsWith('..')) {
32
+ throw new Error('OpenSpec path must be within the project directory.');
33
+ }
34
+ // Detect project type
35
+ progress(onProgress, 'Detecting project type', 'start');
36
+ const detection = await detectProjectType(rootPath);
37
+ const projectType = getProjectTypeName(detection.projectType);
38
+ progress(onProgress, 'Detecting project type', 'complete', projectType);
39
+ // Check existing config
40
+ const configExists = await specGenConfigExists(rootPath);
41
+ if (configExists && !force) {
42
+ progress(onProgress, 'Configuration exists', 'skip');
43
+ return {
44
+ configPath: '.spec-gen/config.json',
45
+ openspecPath: openspecRelPath,
46
+ projectType,
47
+ created: false,
48
+ };
49
+ }
50
+ // Create config
51
+ progress(onProgress, 'Creating configuration', 'start');
52
+ const config = getDefaultConfig(detection.projectType, openspecRelPath);
53
+ await writeSpecGenConfig(rootPath, config);
54
+ progress(onProgress, 'Creating configuration', 'complete');
55
+ // Create openspec directory
56
+ const hasOpenspec = await openspecDirExists(openspecFullPath);
57
+ if (!hasOpenspec) {
58
+ progress(onProgress, 'Creating openspec directory', 'start');
59
+ await createOpenSpecStructure(openspecFullPath);
60
+ progress(onProgress, 'Creating openspec directory', 'complete');
61
+ }
62
+ else {
63
+ progress(onProgress, 'OpenSpec directory exists', 'skip');
64
+ }
65
+ // Update .gitignore
66
+ const hasGitignore = await gitignoreExists(rootPath);
67
+ if (hasGitignore) {
68
+ const alreadyIgnored = await isInGitignore(rootPath, '.spec-gen/');
69
+ if (!alreadyIgnored) {
70
+ progress(onProgress, 'Updating .gitignore', 'start');
71
+ await addToGitignore(rootPath, '.spec-gen/', 'spec-gen analysis artifacts');
72
+ progress(onProgress, 'Updating .gitignore', 'complete');
73
+ }
74
+ }
75
+ return {
76
+ configPath: '.spec-gen/config.json',
77
+ openspecPath: openspecRelPath,
78
+ projectType,
79
+ created: true,
80
+ };
81
+ }
82
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/api/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * spec-gen run — programmatic API
3
+ *
4
+ * Runs the full pipeline: init → analyze → generate.
5
+ * Smart defaults skip unnecessary steps.
6
+ * No side effects (no process.exit, no console.log).
7
+ */
8
+ import type { RunApiOptions, RunResult } from './types.js';
9
+ /**
10
+ * Run the full spec-gen pipeline: init → analyze → generate.
11
+ *
12
+ * Uses smart defaults to skip unnecessary steps (e.g., skips init
13
+ * if config exists, skips analysis if recent).
14
+ *
15
+ * @throws Error if no LLM API key found
16
+ * @throws Error if pipeline fails
17
+ */
18
+ export declare function specGenRun(options?: RunApiOptions): Promise<RunResult>;
19
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/api/run.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA+BH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAA+C,MAAM,YAAY,CAAC;AAexG;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,CA8RhF"}
@@ -0,0 +1,291 @@
1
+ /**
2
+ * spec-gen run — programmatic API
3
+ *
4
+ * Runs the full pipeline: init → analyze → generate.
5
+ * Smart defaults skip unnecessary steps.
6
+ * No side effects (no process.exit, no console.log).
7
+ */
8
+ import { join } from 'node:path';
9
+ import { access, stat, readFile, mkdir, writeFile } from 'node:fs/promises';
10
+ import { detectProjectType, getProjectTypeName, } from '../core/services/project-detector.js';
11
+ import { getDefaultConfig, readSpecGenConfig, writeSpecGenConfig, specGenConfigExists, openspecDirExists, createOpenSpecStructure, } from '../core/services/config-manager.js';
12
+ import { gitignoreExists, isInGitignore, addToGitignore, } from '../core/services/gitignore-manager.js';
13
+ import { createLLMService } from '../core/services/llm-service.js';
14
+ import { RepositoryMapper } from '../core/analyzer/repository-mapper.js';
15
+ import { DependencyGraphBuilder } from '../core/analyzer/dependency-graph.js';
16
+ import { AnalysisArtifactGenerator } from '../core/analyzer/artifact-generator.js';
17
+ import { SpecGenerationPipeline } from '../core/generator/spec-pipeline.js';
18
+ import { OpenSpecFormatGenerator } from '../core/generator/openspec-format-generator.js';
19
+ import { OpenSpecWriter } from '../core/generator/openspec-writer.js';
20
+ import { ADRGenerator } from '../core/generator/adr-generator.js';
21
+ function progress(onProgress, step, status, detail) {
22
+ onProgress?.({ phase: 'run', step, status, detail });
23
+ }
24
+ async function fileExists(path) {
25
+ try {
26
+ await access(path);
27
+ return true;
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ /**
34
+ * Run the full spec-gen pipeline: init → analyze → generate.
35
+ *
36
+ * Uses smart defaults to skip unnecessary steps (e.g., skips init
37
+ * if config exists, skips analysis if recent).
38
+ *
39
+ * @throws Error if no LLM API key found
40
+ * @throws Error if pipeline fails
41
+ */
42
+ export async function specGenRun(options = {}) {
43
+ const startTime = Date.now();
44
+ const rootPath = options.rootPath ?? process.cwd();
45
+ const force = options.force ?? false;
46
+ const reanalyze = options.reanalyze ?? false;
47
+ const maxFiles = options.maxFiles ?? 500;
48
+ const adr = options.adr ?? false;
49
+ const { onProgress } = options;
50
+ // ========================================================================
51
+ // STEP 1: INITIALIZATION
52
+ // ========================================================================
53
+ progress(onProgress, 'Initialization', 'start');
54
+ const detection = await detectProjectType(rootPath);
55
+ const projectType = getProjectTypeName(detection.projectType);
56
+ let initResult;
57
+ const configExists = await specGenConfigExists(rootPath);
58
+ let specGenConfig = configExists ? await readSpecGenConfig(rootPath) : null;
59
+ if (configExists && !force) {
60
+ initResult = {
61
+ configPath: '.spec-gen/config.json',
62
+ openspecPath: specGenConfig?.openspecPath ?? './openspec',
63
+ projectType,
64
+ created: false,
65
+ };
66
+ progress(onProgress, 'Initialization', 'skip', 'Config exists');
67
+ }
68
+ else {
69
+ const openspecPath = './openspec';
70
+ specGenConfig = getDefaultConfig(detection.projectType, openspecPath);
71
+ await writeSpecGenConfig(rootPath, specGenConfig);
72
+ const fullOpenspecPath = join(rootPath, openspecPath);
73
+ if (!(await openspecDirExists(fullOpenspecPath))) {
74
+ await createOpenSpecStructure(fullOpenspecPath);
75
+ }
76
+ const hasGitignore = await gitignoreExists(rootPath);
77
+ if (hasGitignore) {
78
+ const alreadyIgnored = await isInGitignore(rootPath, '.spec-gen/');
79
+ if (!alreadyIgnored) {
80
+ await addToGitignore(rootPath, '.spec-gen/', 'spec-gen analysis artifacts');
81
+ }
82
+ }
83
+ initResult = {
84
+ configPath: '.spec-gen/config.json',
85
+ openspecPath: openspecPath,
86
+ projectType,
87
+ created: true,
88
+ };
89
+ progress(onProgress, 'Initialization', 'complete');
90
+ }
91
+ // Ensure we have config
92
+ if (!specGenConfig) {
93
+ specGenConfig = await readSpecGenConfig(rootPath);
94
+ if (!specGenConfig) {
95
+ throw new Error('Failed to load configuration');
96
+ }
97
+ }
98
+ // ========================================================================
99
+ // STEP 2: ANALYSIS
100
+ // ========================================================================
101
+ progress(onProgress, 'Analysis', 'start');
102
+ const analysisPath = join(rootPath, '.spec-gen', 'analysis');
103
+ let analyzeResult;
104
+ // Check for existing recent analysis
105
+ const repoStructurePath = join(analysisPath, 'repo-structure.json');
106
+ let useExisting = false;
107
+ if (await fileExists(repoStructurePath)) {
108
+ const stats = await stat(repoStructurePath);
109
+ const age = Date.now() - stats.mtime.getTime();
110
+ const oneHour = 60 * 60 * 1000;
111
+ if (age < oneHour && !reanalyze && !force) {
112
+ useExisting = true;
113
+ }
114
+ }
115
+ if (useExisting) {
116
+ const repoStructureContent = await readFile(repoStructurePath, 'utf-8');
117
+ const repoStructure = JSON.parse(repoStructureContent);
118
+ let depGraph;
119
+ const depGraphPath = join(analysisPath, 'dependency-graph.json');
120
+ if (await fileExists(depGraphPath)) {
121
+ const content = await readFile(depGraphPath, 'utf-8');
122
+ depGraph = JSON.parse(content);
123
+ }
124
+ analyzeResult = {
125
+ repoMap: repoStructure,
126
+ depGraph: depGraph ?? { nodes: [], edges: [], statistics: { nodeCount: 0, edgeCount: 0, clusterCount: 0, cycleCount: 0, avgDegree: 0 } },
127
+ artifacts: { repoStructure },
128
+ duration: 0,
129
+ };
130
+ progress(onProgress, 'Analysis', 'skip', 'Recent analysis exists');
131
+ }
132
+ else {
133
+ await mkdir(analysisPath, { recursive: true });
134
+ const mapper = new RepositoryMapper(rootPath, { maxFiles });
135
+ const repoMap = await mapper.map();
136
+ const graphBuilder = new DependencyGraphBuilder({ rootDir: rootPath });
137
+ const depGraph = await graphBuilder.build(repoMap.allFiles);
138
+ const artifactGenerator = new AnalysisArtifactGenerator({
139
+ rootDir: rootPath,
140
+ outputDir: analysisPath,
141
+ maxDeepAnalysisFiles: Math.min(20, Math.ceil(repoMap.highValueFiles.length * 0.3)),
142
+ maxValidationFiles: 5,
143
+ });
144
+ const artifacts = await artifactGenerator.generateAndSave(repoMap, depGraph);
145
+ await writeFile(join(analysisPath, 'dependency-graph.json'), JSON.stringify(depGraph, null, 2));
146
+ analyzeResult = {
147
+ repoMap,
148
+ depGraph,
149
+ artifacts,
150
+ duration: Date.now() - startTime,
151
+ };
152
+ progress(onProgress, 'Analysis', 'complete', `${repoMap.summary.analyzedFiles} files`);
153
+ }
154
+ // ========================================================================
155
+ // STEP 3: GENERATION
156
+ // ========================================================================
157
+ if (options.dryRun) {
158
+ progress(onProgress, 'Generation', 'skip', 'Dry run');
159
+ return {
160
+ init: initResult,
161
+ analysis: analyzeResult,
162
+ generation: {
163
+ report: {
164
+ timestamp: new Date().toISOString(),
165
+ openspecVersion: specGenConfig?.version ?? '1.0.0',
166
+ specGenVersion: '1.0.0',
167
+ filesWritten: [],
168
+ filesSkipped: [],
169
+ filesBackedUp: [],
170
+ filesMerged: [],
171
+ configUpdated: false,
172
+ validationErrors: [],
173
+ warnings: [],
174
+ nextSteps: ['Run without --dry-run to generate specs'],
175
+ },
176
+ pipelineResult: {},
177
+ duration: 0,
178
+ },
179
+ duration: Date.now() - startTime,
180
+ };
181
+ }
182
+ progress(onProgress, 'Generation', 'start');
183
+ // Check for API key
184
+ const anthropicKey = process.env.ANTHROPIC_API_KEY;
185
+ const openaiKey = process.env.OPENAI_API_KEY;
186
+ if (!anthropicKey && !openaiKey) {
187
+ throw new Error('No LLM API key found. Set ANTHROPIC_API_KEY or OPENAI_API_KEY.');
188
+ }
189
+ // Create LLM service
190
+ const provider = options.provider ?? (anthropicKey ? 'anthropic' : 'openai');
191
+ const model = options.model ?? 'claude-sonnet-4-20250514';
192
+ let llm;
193
+ try {
194
+ llm = createLLMService({
195
+ provider,
196
+ model,
197
+ apiBase: options.apiBase ?? specGenConfig.llm?.apiBase,
198
+ sslVerify: options.sslVerify ?? specGenConfig.llm?.sslVerify ?? true,
199
+ openaiCompatBaseUrl: options.openaiCompatBaseUrl,
200
+ enableLogging: true,
201
+ logDir: join(rootPath, '.spec-gen', 'logs'),
202
+ });
203
+ }
204
+ catch (error) {
205
+ throw new Error(`Failed to create LLM service: ${error.message}`);
206
+ }
207
+ // Load analysis data for pipeline
208
+ const llmContextPath = join(analysisPath, 'llm-context.json');
209
+ let llmContext;
210
+ if (await fileExists(llmContextPath)) {
211
+ const content = await readFile(llmContextPath, 'utf-8');
212
+ llmContext = JSON.parse(content);
213
+ }
214
+ else {
215
+ llmContext = {
216
+ phase1_survey: { purpose: 'Initial survey', files: [], estimatedTokens: 0 },
217
+ phase2_deep: { purpose: 'Deep analysis', files: [], totalTokens: 0 },
218
+ phase3_validation: { purpose: 'Validation', files: [], totalTokens: 0 },
219
+ };
220
+ }
221
+ const repoStructureContent = await readFile(repoStructurePath, 'utf-8');
222
+ const repoStructure = JSON.parse(repoStructureContent);
223
+ // Run pipeline
224
+ const pipeline = new SpecGenerationPipeline(llm, {
225
+ outputDir: join(rootPath, '.spec-gen', 'generation'),
226
+ saveIntermediate: true,
227
+ generateADRs: adr,
228
+ });
229
+ let pipelineResult;
230
+ try {
231
+ pipelineResult = await pipeline.run(repoStructure, llmContext, analyzeResult.depGraph);
232
+ }
233
+ catch (error) {
234
+ await llm.saveLogs().catch(() => { });
235
+ throw new Error(`Pipeline failed: ${error.message}`);
236
+ }
237
+ // Format and write specs
238
+ const formatGenerator = new OpenSpecFormatGenerator({
239
+ version: specGenConfig.version ?? '1.0.0',
240
+ includeConfidence: true,
241
+ includeTechnicalNotes: true,
242
+ });
243
+ const generatedSpecs = formatGenerator.generateSpecs(pipelineResult);
244
+ if (adr && pipelineResult.adrs && pipelineResult.adrs.length > 0) {
245
+ const adrGenerator = new ADRGenerator({
246
+ version: specGenConfig.version ?? '1.0.0',
247
+ includeMermaid: true,
248
+ });
249
+ const adrSpecs = adrGenerator.generateADRs(pipelineResult);
250
+ generatedSpecs.push(...adrSpecs);
251
+ }
252
+ const writer = new OpenSpecWriter({
253
+ rootPath,
254
+ writeMode: 'replace',
255
+ version: specGenConfig.version ?? '1.0.0',
256
+ createBackups: true,
257
+ updateConfig: true,
258
+ validateBeforeWrite: true,
259
+ });
260
+ const report = await writer.writeSpecs(generatedSpecs, pipelineResult.survey);
261
+ // Save LLM logs
262
+ await llm.saveLogs().catch(() => { });
263
+ progress(onProgress, 'Generation', 'complete', `${report.filesWritten.length} specs written`);
264
+ // Save run metadata
265
+ const duration = Date.now() - startTime;
266
+ const runsDir = join(rootPath, '.spec-gen', 'runs');
267
+ await mkdir(runsDir, { recursive: true });
268
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
269
+ await writeFile(join(runsDir, `${timestamp}.json`), JSON.stringify({
270
+ version: '1.0.0',
271
+ timestamp: new Date().toISOString(),
272
+ duration,
273
+ steps: {
274
+ init: { status: initResult.created ? 'completed' : 'skipped' },
275
+ analyze: { status: useExisting ? 'skipped' : 'completed' },
276
+ generate: { status: 'completed', specsGenerated: report.filesWritten.length },
277
+ },
278
+ result: 'success',
279
+ }, null, 2));
280
+ return {
281
+ init: initResult,
282
+ analysis: analyzeResult,
283
+ generation: {
284
+ report,
285
+ pipelineResult,
286
+ duration: Date.now() - startTime,
287
+ },
288
+ duration,
289
+ };
290
+ }
291
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/api/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * spec-gen API: spec requirements extractor
3
+ *
4
+ * Reads `.spec-gen/analysis/mapping.json` and extracts the exact requirement
5
+ * blocks from the spec files referenced by each mapping entry.
6
+ *
7
+ * The function returns a mapping from the mapping.requirement key to a
8
+ * structured object:
9
+ *
10
+ * {
11
+ * title: string, // requirement heading as found in the file
12
+ * body: string, // markdown body of the requirement (everything after the heading)
13
+ * specFile?: string, // spec file path exactly as referenced in mapping.json
14
+ * domain?: string, // domain from mapping
15
+ * service?: string // service from mapping
16
+ * }
17
+ *
18
+ * Behavior:
19
+ * - For each mapping entry we read the referenced spec file (exact path).
20
+ * - We attempt a deterministic (case-insensitive) equality match of the
21
+ * requirement heading (the text right after "### Requirement:").
22
+ * - If found, we return the extracted body. If not found or the file cannot
23
+ * be read, an empty body string is returned (the caller can interpret this
24
+ * as "not available").
25
+ *
26
+ * This API intentionally avoids fuzzy heuristics — it uses the exact specFile
27
+ * path coming from mapping.json and only performs case-insensitive title
28
+ * equality checks.
29
+ */
30
+ import type { BaseOptions } from './types.js';
31
+ export type SpecRequirement = {
32
+ title: string;
33
+ body: string;
34
+ specFile?: string;
35
+ domain?: string;
36
+ service?: string;
37
+ };
38
+ /**
39
+ * Read spec requirements referenced in mapping.json.
40
+ *
41
+ * @param options.rootPath project root (default: process.cwd())
42
+ * @returns an object keyed by mapping.requirement with SpecRequirement values
43
+ */
44
+ export declare function specGenGetSpecRequirements(options?: BaseOptions): Promise<{
45
+ generatedAt?: string;
46
+ requirements: Record<string, SpecRequirement>;
47
+ }>;
48
+ export default specGenGetSpecRequirements;
49
+ //# sourceMappingURL=specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specs.d.ts","sourceRoot":"","sources":["../../src/api/specs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC;IACnF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC/C,CAAC,CAoGD;AAED,eAAe,0BAA0B,CAAC"}