@contractspec/bundle.workspace 1.44.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 (425) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +79 -0
  3. package/dist/_virtual/rolldown_runtime.js +36 -0
  4. package/dist/adapters/ai.d.ts +12 -0
  5. package/dist/adapters/ai.d.ts.map +1 -0
  6. package/dist/adapters/ai.js +83 -0
  7. package/dist/adapters/ai.js.map +1 -0
  8. package/dist/adapters/factory.d.ts +29 -0
  9. package/dist/adapters/factory.d.ts.map +1 -0
  10. package/dist/adapters/factory.js +37 -0
  11. package/dist/adapters/factory.js.map +1 -0
  12. package/dist/adapters/fs.d.ts +11 -0
  13. package/dist/adapters/fs.d.ts.map +1 -0
  14. package/dist/adapters/fs.js +131 -0
  15. package/dist/adapters/fs.js.map +1 -0
  16. package/dist/adapters/git.d.ts +11 -0
  17. package/dist/adapters/git.d.ts.map +1 -0
  18. package/dist/adapters/git.js +55 -0
  19. package/dist/adapters/git.js.map +1 -0
  20. package/dist/adapters/index.d.ts +7 -0
  21. package/dist/adapters/index.js +7 -0
  22. package/dist/adapters/logger.d.ts +18 -0
  23. package/dist/adapters/logger.d.ts.map +1 -0
  24. package/dist/adapters/logger.js +81 -0
  25. package/dist/adapters/logger.js.map +1 -0
  26. package/dist/adapters/watcher.d.ts +11 -0
  27. package/dist/adapters/watcher.d.ts.map +1 -0
  28. package/dist/adapters/watcher.js +74 -0
  29. package/dist/adapters/watcher.js.map +1 -0
  30. package/dist/adapters/workspace.d.ts +148 -0
  31. package/dist/adapters/workspace.d.ts.map +1 -0
  32. package/dist/adapters/workspace.js +275 -0
  33. package/dist/adapters/workspace.js.map +1 -0
  34. package/dist/ai/agents/claude-code-agent.d.ts +22 -0
  35. package/dist/ai/agents/claude-code-agent.d.ts.map +1 -0
  36. package/dist/ai/agents/claude-code-agent.js +182 -0
  37. package/dist/ai/agents/claude-code-agent.js.map +1 -0
  38. package/dist/ai/agents/cursor-agent.d.ts +68 -0
  39. package/dist/ai/agents/cursor-agent.d.ts.map +1 -0
  40. package/dist/ai/agents/cursor-agent.js +436 -0
  41. package/dist/ai/agents/cursor-agent.js.map +1 -0
  42. package/dist/ai/agents/index.js +5 -0
  43. package/dist/ai/agents/openai-codex-agent.d.ts +22 -0
  44. package/dist/ai/agents/openai-codex-agent.d.ts.map +1 -0
  45. package/dist/ai/agents/openai-codex-agent.js +167 -0
  46. package/dist/ai/agents/openai-codex-agent.js.map +1 -0
  47. package/dist/ai/agents/orchestrator.d.ts +50 -0
  48. package/dist/ai/agents/orchestrator.d.ts.map +1 -0
  49. package/dist/ai/agents/orchestrator.js +143 -0
  50. package/dist/ai/agents/orchestrator.js.map +1 -0
  51. package/dist/ai/agents/simple-agent.d.ts +17 -0
  52. package/dist/ai/agents/simple-agent.d.ts.map +1 -0
  53. package/dist/ai/agents/simple-agent.js +92 -0
  54. package/dist/ai/agents/simple-agent.js.map +1 -0
  55. package/dist/ai/agents/types.d.ts +36 -0
  56. package/dist/ai/agents/types.d.ts.map +1 -0
  57. package/dist/ai/client.d.ts +83 -0
  58. package/dist/ai/client.d.ts.map +1 -0
  59. package/dist/ai/client.js +163 -0
  60. package/dist/ai/client.js.map +1 -0
  61. package/dist/ai/index.d.ts +17 -0
  62. package/dist/ai/index.d.ts.map +1 -0
  63. package/dist/ai/index.js +28 -0
  64. package/dist/ai/index.js.map +1 -0
  65. package/dist/ai/prompts/code-generation.d.ts +26 -0
  66. package/dist/ai/prompts/code-generation.d.ts.map +1 -0
  67. package/dist/ai/prompts/code-generation.js +143 -0
  68. package/dist/ai/prompts/code-generation.js.map +1 -0
  69. package/dist/ai/prompts/index.d.ts +10 -0
  70. package/dist/ai/prompts/index.d.ts.map +1 -0
  71. package/dist/ai/prompts/index.js +13 -0
  72. package/dist/ai/prompts/index.js.map +1 -0
  73. package/dist/ai/prompts/spec-creation.d.ts +29 -0
  74. package/dist/ai/prompts/spec-creation.d.ts.map +1 -0
  75. package/dist/ai/prompts/spec-creation.js +111 -0
  76. package/dist/ai/prompts/spec-creation.js.map +1 -0
  77. package/dist/ai/providers.d.ts +29 -0
  78. package/dist/ai/providers.d.ts.map +1 -0
  79. package/dist/ai/providers.js +39 -0
  80. package/dist/ai/providers.js.map +1 -0
  81. package/dist/formatters/index.d.ts +11 -0
  82. package/dist/formatters/index.d.ts.map +1 -0
  83. package/dist/formatters/index.js +19 -0
  84. package/dist/formatters/index.js.map +1 -0
  85. package/dist/formatters/json.d.ts +89 -0
  86. package/dist/formatters/json.d.ts.map +1 -0
  87. package/dist/formatters/json.js +72 -0
  88. package/dist/formatters/json.js.map +1 -0
  89. package/dist/formatters/sarif.d.ts +101 -0
  90. package/dist/formatters/sarif.d.ts.map +1 -0
  91. package/dist/formatters/sarif.js +163 -0
  92. package/dist/formatters/sarif.js.map +1 -0
  93. package/dist/formatters/text.d.ts +35 -0
  94. package/dist/formatters/text.d.ts.map +1 -0
  95. package/dist/formatters/text.js +209 -0
  96. package/dist/formatters/text.js.map +1 -0
  97. package/dist/index.d.ts +82 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +204 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/ports/ai.d.ts +59 -0
  102. package/dist/ports/ai.d.ts.map +1 -0
  103. package/dist/ports/fs.d.ts +81 -0
  104. package/dist/ports/fs.d.ts.map +1 -0
  105. package/dist/ports/git.d.ts +33 -0
  106. package/dist/ports/git.d.ts.map +1 -0
  107. package/dist/ports/index.d.ts +5 -0
  108. package/dist/ports/logger.d.ts +88 -0
  109. package/dist/ports/logger.d.ts.map +1 -0
  110. package/dist/ports/watcher.d.ts +52 -0
  111. package/dist/ports/watcher.d.ts.map +1 -0
  112. package/dist/services/agent-guide/adapters/claude-code.d.ts +35 -0
  113. package/dist/services/agent-guide/adapters/claude-code.d.ts.map +1 -0
  114. package/dist/services/agent-guide/adapters/claude-code.js +144 -0
  115. package/dist/services/agent-guide/adapters/claude-code.js.map +1 -0
  116. package/dist/services/agent-guide/adapters/cursor-cli.d.ts +39 -0
  117. package/dist/services/agent-guide/adapters/cursor-cli.d.ts.map +1 -0
  118. package/dist/services/agent-guide/adapters/cursor-cli.js +135 -0
  119. package/dist/services/agent-guide/adapters/cursor-cli.js.map +1 -0
  120. package/dist/services/agent-guide/adapters/generic-mcp.d.ts +53 -0
  121. package/dist/services/agent-guide/adapters/generic-mcp.d.ts.map +1 -0
  122. package/dist/services/agent-guide/adapters/generic-mcp.js +159 -0
  123. package/dist/services/agent-guide/adapters/generic-mcp.js.map +1 -0
  124. package/dist/services/agent-guide/adapters/index.d.ts +23 -0
  125. package/dist/services/agent-guide/adapters/index.d.ts.map +1 -0
  126. package/dist/services/agent-guide/adapters/index.js +31 -0
  127. package/dist/services/agent-guide/adapters/index.js.map +1 -0
  128. package/dist/services/agent-guide/agent-guide-service.d.ts +56 -0
  129. package/dist/services/agent-guide/agent-guide-service.d.ts.map +1 -0
  130. package/dist/services/agent-guide/agent-guide-service.js +147 -0
  131. package/dist/services/agent-guide/agent-guide-service.js.map +1 -0
  132. package/dist/services/agent-guide/index.d.ts +6 -0
  133. package/dist/services/agent-guide/index.js +5 -0
  134. package/dist/services/agent-guide/types.d.ts +58 -0
  135. package/dist/services/agent-guide/types.d.ts.map +1 -0
  136. package/dist/services/build.d.ts +59 -0
  137. package/dist/services/build.d.ts.map +1 -0
  138. package/dist/services/build.js +140 -0
  139. package/dist/services/build.js.map +1 -0
  140. package/dist/services/ci-check/ci-check-service.d.ts +16 -0
  141. package/dist/services/ci-check/ci-check-service.d.ts.map +1 -0
  142. package/dist/services/ci-check/ci-check-service.js +392 -0
  143. package/dist/services/ci-check/ci-check-service.js.map +1 -0
  144. package/dist/services/ci-check/index.d.ts +2 -0
  145. package/dist/services/ci-check/index.js +2 -0
  146. package/dist/services/ci-check/types.d.ts +143 -0
  147. package/dist/services/ci-check/types.d.ts.map +1 -0
  148. package/dist/services/ci-check/types.js +29 -0
  149. package/dist/services/ci-check/types.js.map +1 -0
  150. package/dist/services/clean.d.ts +41 -0
  151. package/dist/services/clean.d.ts.map +1 -0
  152. package/dist/services/clean.js +72 -0
  153. package/dist/services/clean.js.map +1 -0
  154. package/dist/services/config.d.ts +26 -0
  155. package/dist/services/config.d.ts.map +1 -0
  156. package/dist/services/config.js +77 -0
  157. package/dist/services/config.js.map +1 -0
  158. package/dist/services/deps.d.ts +53 -0
  159. package/dist/services/deps.d.ts.map +1 -0
  160. package/dist/services/deps.js +62 -0
  161. package/dist/services/deps.js.map +1 -0
  162. package/dist/services/diff.d.ts +34 -0
  163. package/dist/services/diff.d.ts.map +1 -0
  164. package/dist/services/diff.js +34 -0
  165. package/dist/services/diff.js.map +1 -0
  166. package/dist/services/doctor/checks/ai.js +119 -0
  167. package/dist/services/doctor/checks/ai.js.map +1 -0
  168. package/dist/services/doctor/checks/cli.js +147 -0
  169. package/dist/services/doctor/checks/cli.js.map +1 -0
  170. package/dist/services/doctor/checks/config.js +171 -0
  171. package/dist/services/doctor/checks/config.js.map +1 -0
  172. package/dist/services/doctor/checks/deps.js +247 -0
  173. package/dist/services/doctor/checks/deps.js.map +1 -0
  174. package/dist/services/doctor/checks/index.js +6 -0
  175. package/dist/services/doctor/checks/mcp.js +145 -0
  176. package/dist/services/doctor/checks/mcp.js.map +1 -0
  177. package/dist/services/doctor/checks/workspace.js +244 -0
  178. package/dist/services/doctor/checks/workspace.js.map +1 -0
  179. package/dist/services/doctor/doctor-service.d.ts +24 -0
  180. package/dist/services/doctor/doctor-service.d.ts.map +1 -0
  181. package/dist/services/doctor/doctor-service.js +116 -0
  182. package/dist/services/doctor/doctor-service.js.map +1 -0
  183. package/dist/services/doctor/index.d.ts +2 -0
  184. package/dist/services/doctor/index.js +2 -0
  185. package/dist/services/doctor/types.d.ts +118 -0
  186. package/dist/services/doctor/types.d.ts.map +1 -0
  187. package/dist/services/doctor/types.js +27 -0
  188. package/dist/services/doctor/types.js.map +1 -0
  189. package/dist/services/impact/formatters.d.ts +27 -0
  190. package/dist/services/impact/formatters.d.ts.map +1 -0
  191. package/dist/services/impact/formatters.js +111 -0
  192. package/dist/services/impact/formatters.js.map +1 -0
  193. package/dist/services/impact/impact-detection-service.d.ts +22 -0
  194. package/dist/services/impact/impact-detection-service.d.ts.map +1 -0
  195. package/dist/services/impact/impact-detection-service.js +96 -0
  196. package/dist/services/impact/impact-detection-service.js.map +1 -0
  197. package/dist/services/impact/index.d.ts +11 -0
  198. package/dist/services/impact/index.d.ts.map +1 -0
  199. package/dist/services/impact/index.js +16 -0
  200. package/dist/services/impact/index.js.map +1 -0
  201. package/dist/services/impact/types.d.ts +58 -0
  202. package/dist/services/impact/types.d.ts.map +1 -0
  203. package/dist/services/implementation/discovery.d.ts +30 -0
  204. package/dist/services/implementation/discovery.d.ts.map +1 -0
  205. package/dist/services/implementation/discovery.js +144 -0
  206. package/dist/services/implementation/discovery.js.map +1 -0
  207. package/dist/services/implementation/index.d.ts +3 -0
  208. package/dist/services/implementation/index.js +2 -0
  209. package/dist/services/implementation/resolver.d.ts +44 -0
  210. package/dist/services/implementation/resolver.d.ts.map +1 -0
  211. package/dist/services/implementation/resolver.js +224 -0
  212. package/dist/services/implementation/resolver.js.map +1 -0
  213. package/dist/services/implementation/types.d.ts +79 -0
  214. package/dist/services/implementation/types.d.ts.map +1 -0
  215. package/dist/services/index.d.ts +60 -0
  216. package/dist/services/index.js +57 -0
  217. package/dist/services/integrity-diagram.d.ts +36 -0
  218. package/dist/services/integrity-diagram.d.ts.map +1 -0
  219. package/dist/services/integrity-diagram.js +275 -0
  220. package/dist/services/integrity-diagram.js.map +1 -0
  221. package/dist/services/integrity.d.ts +134 -0
  222. package/dist/services/integrity.d.ts.map +1 -0
  223. package/dist/services/integrity.js +272 -0
  224. package/dist/services/integrity.js.map +1 -0
  225. package/dist/services/list.d.ts +31 -0
  226. package/dist/services/list.d.ts.map +1 -0
  227. package/dist/services/list.js +36 -0
  228. package/dist/services/list.js.map +1 -0
  229. package/dist/services/openapi/export-service.d.ts +53 -0
  230. package/dist/services/openapi/export-service.d.ts.map +1 -0
  231. package/dist/services/openapi/export-service.js +50 -0
  232. package/dist/services/openapi/export-service.js.map +1 -0
  233. package/dist/services/openapi/import-service.d.ts +17 -0
  234. package/dist/services/openapi/import-service.d.ts.map +1 -0
  235. package/dist/services/openapi/import-service.js +74 -0
  236. package/dist/services/openapi/import-service.js.map +1 -0
  237. package/dist/services/openapi/index.d.ts +5 -0
  238. package/dist/services/openapi/index.js +4 -0
  239. package/dist/services/openapi/sync-service.d.ts +17 -0
  240. package/dist/services/openapi/sync-service.d.ts.map +1 -0
  241. package/dist/services/openapi/sync-service.js +120 -0
  242. package/dist/services/openapi/sync-service.js.map +1 -0
  243. package/dist/services/openapi/types.d.ts +162 -0
  244. package/dist/services/openapi/types.d.ts.map +1 -0
  245. package/dist/services/openapi/validate-service.d.ts +16 -0
  246. package/dist/services/openapi/validate-service.d.ts.map +1 -0
  247. package/dist/services/openapi/validate-service.js +130 -0
  248. package/dist/services/openapi/validate-service.js.map +1 -0
  249. package/dist/services/quickstart/dependencies.d.ts +31 -0
  250. package/dist/services/quickstart/dependencies.d.ts.map +1 -0
  251. package/dist/services/quickstart/dependencies.js +57 -0
  252. package/dist/services/quickstart/dependencies.js.map +1 -0
  253. package/dist/services/quickstart/index.js +2 -0
  254. package/dist/services/quickstart/quickstart-service.d.ts +20 -0
  255. package/dist/services/quickstart/quickstart-service.d.ts.map +1 -0
  256. package/dist/services/quickstart/quickstart-service.js +196 -0
  257. package/dist/services/quickstart/quickstart-service.js.map +1 -0
  258. package/dist/services/quickstart/types.d.ts +81 -0
  259. package/dist/services/quickstart/types.d.ts.map +1 -0
  260. package/dist/services/regenerator.d.ts +18 -0
  261. package/dist/services/regenerator.d.ts.map +1 -0
  262. package/dist/services/regenerator.js +23 -0
  263. package/dist/services/regenerator.js.map +1 -0
  264. package/dist/services/registry.d.ts +53 -0
  265. package/dist/services/registry.d.ts.map +1 -0
  266. package/dist/services/registry.js +74 -0
  267. package/dist/services/registry.js.map +1 -0
  268. package/dist/services/setup/config-generators.d.ts +42 -0
  269. package/dist/services/setup/config-generators.d.ts.map +1 -0
  270. package/dist/services/setup/config-generators.js +238 -0
  271. package/dist/services/setup/config-generators.js.map +1 -0
  272. package/dist/services/setup/file-merger.d.ts +27 -0
  273. package/dist/services/setup/file-merger.d.ts.map +1 -0
  274. package/dist/services/setup/file-merger.js +61 -0
  275. package/dist/services/setup/file-merger.js.map +1 -0
  276. package/dist/services/setup/index.js +4 -0
  277. package/dist/services/setup/setup-service.d.ts +12 -0
  278. package/dist/services/setup/setup-service.d.ts.map +1 -0
  279. package/dist/services/setup/setup-service.js +96 -0
  280. package/dist/services/setup/setup-service.js.map +1 -0
  281. package/dist/services/setup/targets/agents-md.js +47 -0
  282. package/dist/services/setup/targets/agents-md.js.map +1 -0
  283. package/dist/services/setup/targets/cli-config.js +60 -0
  284. package/dist/services/setup/targets/cli-config.js.map +1 -0
  285. package/dist/services/setup/targets/cursor-rules.js +48 -0
  286. package/dist/services/setup/targets/cursor-rules.js.map +1 -0
  287. package/dist/services/setup/targets/mcp-claude.js +60 -0
  288. package/dist/services/setup/targets/mcp-claude.js.map +1 -0
  289. package/dist/services/setup/targets/mcp-cursor.js +59 -0
  290. package/dist/services/setup/targets/mcp-cursor.js.map +1 -0
  291. package/dist/services/setup/targets/vscode-settings.js +63 -0
  292. package/dist/services/setup/targets/vscode-settings.js.map +1 -0
  293. package/dist/services/setup/types.d.ts +85 -0
  294. package/dist/services/setup/types.d.ts.map +1 -0
  295. package/dist/services/setup/types.js +27 -0
  296. package/dist/services/setup/types.js.map +1 -0
  297. package/dist/services/sync.d.ts +41 -0
  298. package/dist/services/sync.d.ts.map +1 -0
  299. package/dist/services/sync.js +63 -0
  300. package/dist/services/sync.js.map +1 -0
  301. package/dist/services/test.d.ts +15 -0
  302. package/dist/services/test.d.ts.map +1 -0
  303. package/dist/services/test.js +30 -0
  304. package/dist/services/test.js.map +1 -0
  305. package/dist/services/validate-implementation.d.ts +32 -0
  306. package/dist/services/validate-implementation.d.ts.map +1 -0
  307. package/dist/services/validate-implementation.js +64 -0
  308. package/dist/services/validate-implementation.js.map +1 -0
  309. package/dist/services/validate.d.ts +41 -0
  310. package/dist/services/validate.d.ts.map +1 -0
  311. package/dist/services/validate.js +48 -0
  312. package/dist/services/validate.js.map +1 -0
  313. package/dist/services/verification-cache/adapters/filesystem.d.ts +46 -0
  314. package/dist/services/verification-cache/adapters/filesystem.d.ts.map +1 -0
  315. package/dist/services/verification-cache/adapters/filesystem.js +120 -0
  316. package/dist/services/verification-cache/adapters/filesystem.js.map +1 -0
  317. package/dist/services/verification-cache/adapters/in-memory.d.ts +27 -0
  318. package/dist/services/verification-cache/adapters/in-memory.d.ts.map +1 -0
  319. package/dist/services/verification-cache/adapters/in-memory.js +46 -0
  320. package/dist/services/verification-cache/adapters/in-memory.js.map +1 -0
  321. package/dist/services/verification-cache/adapters/index.d.ts +3 -0
  322. package/dist/services/verification-cache/adapters/index.js +3 -0
  323. package/dist/services/verification-cache/adapters/workspace-state.d.ts +49 -0
  324. package/dist/services/verification-cache/adapters/workspace-state.d.ts.map +1 -0
  325. package/dist/services/verification-cache/adapters/workspace-state.js +91 -0
  326. package/dist/services/verification-cache/adapters/workspace-state.js.map +1 -0
  327. package/dist/services/verification-cache/cache-service.d.ts +70 -0
  328. package/dist/services/verification-cache/cache-service.d.ts.map +1 -0
  329. package/dist/services/verification-cache/cache-service.js +256 -0
  330. package/dist/services/verification-cache/cache-service.js.map +1 -0
  331. package/dist/services/verification-cache/index.d.ts +6 -0
  332. package/dist/services/verification-cache/index.js +6 -0
  333. package/dist/services/verification-cache/types.d.ts +124 -0
  334. package/dist/services/verification-cache/types.d.ts.map +1 -0
  335. package/dist/services/verification-cache/types.js +16 -0
  336. package/dist/services/verification-cache/types.js.map +1 -0
  337. package/dist/services/verify/ai-verifier.d.ts +25 -0
  338. package/dist/services/verify/ai-verifier.d.ts.map +1 -0
  339. package/dist/services/verify/ai-verifier.js +403 -0
  340. package/dist/services/verify/ai-verifier.js.map +1 -0
  341. package/dist/services/verify/behavior-verifier.d.ts +12 -0
  342. package/dist/services/verify/behavior-verifier.d.ts.map +1 -0
  343. package/dist/services/verify/behavior-verifier.js +186 -0
  344. package/dist/services/verify/behavior-verifier.js.map +1 -0
  345. package/dist/services/verify/index.d.ts +5 -0
  346. package/dist/services/verify/index.js +4 -0
  347. package/dist/services/verify/structure-verifier.d.ts +12 -0
  348. package/dist/services/verify/structure-verifier.d.ts.map +1 -0
  349. package/dist/services/verify/structure-verifier.js +196 -0
  350. package/dist/services/verify/structure-verifier.js.map +1 -0
  351. package/dist/services/verify/types.d.ts +137 -0
  352. package/dist/services/verify/types.d.ts.map +1 -0
  353. package/dist/services/verify/verify-service.d.ts +60 -0
  354. package/dist/services/verify/verify-service.d.ts.map +1 -0
  355. package/dist/services/verify/verify-service.js +204 -0
  356. package/dist/services/verify/verify-service.js.map +1 -0
  357. package/dist/services/watch.d.ts +25 -0
  358. package/dist/services/watch.d.ts.map +1 -0
  359. package/dist/services/watch.js +32 -0
  360. package/dist/services/watch.js.map +1 -0
  361. package/dist/services/workspace-info.d.ts +62 -0
  362. package/dist/services/workspace-info.d.ts.map +1 -0
  363. package/dist/services/workspace-info.js +103 -0
  364. package/dist/services/workspace-info.js.map +1 -0
  365. package/dist/templates/app-config.template.d.ts +7 -0
  366. package/dist/templates/app-config.template.d.ts.map +1 -0
  367. package/dist/templates/app-config.template.js +107 -0
  368. package/dist/templates/app-config.template.js.map +1 -0
  369. package/dist/templates/data-view.template.d.ts +7 -0
  370. package/dist/templates/data-view.template.d.ts.map +1 -0
  371. package/dist/templates/data-view.template.js +70 -0
  372. package/dist/templates/data-view.template.js.map +1 -0
  373. package/dist/templates/event.template.d.ts +11 -0
  374. package/dist/templates/event.template.d.ts.map +1 -0
  375. package/dist/templates/event.template.js +40 -0
  376. package/dist/templates/event.template.js.map +1 -0
  377. package/dist/templates/experiment.template.d.ts +7 -0
  378. package/dist/templates/experiment.template.d.ts.map +1 -0
  379. package/dist/templates/experiment.template.js +89 -0
  380. package/dist/templates/experiment.template.js.map +1 -0
  381. package/dist/templates/handler.template.d.ts +16 -0
  382. package/dist/templates/handler.template.d.ts.map +1 -0
  383. package/dist/templates/handler.template.js +100 -0
  384. package/dist/templates/handler.template.js.map +1 -0
  385. package/dist/templates/index.d.ts +21 -0
  386. package/dist/templates/index.d.ts.map +1 -0
  387. package/dist/templates/index.js +37 -0
  388. package/dist/templates/index.js.map +1 -0
  389. package/dist/templates/integration.template.d.ts +7 -0
  390. package/dist/templates/integration.template.d.ts.map +1 -0
  391. package/dist/templates/integration.template.js +160 -0
  392. package/dist/templates/integration.template.js.map +1 -0
  393. package/dist/templates/knowledge.template.d.ts +7 -0
  394. package/dist/templates/knowledge.template.d.ts.map +1 -0
  395. package/dist/templates/knowledge.template.js +75 -0
  396. package/dist/templates/knowledge.template.js.map +1 -0
  397. package/dist/templates/migration.template.d.ts +7 -0
  398. package/dist/templates/migration.template.d.ts.map +1 -0
  399. package/dist/templates/migration.template.js +62 -0
  400. package/dist/templates/migration.template.js.map +1 -0
  401. package/dist/templates/operation.template.d.ts +11 -0
  402. package/dist/templates/operation.template.d.ts.map +1 -0
  403. package/dist/templates/operation.template.js +105 -0
  404. package/dist/templates/operation.template.js.map +1 -0
  405. package/dist/templates/presentation.template.d.ts +11 -0
  406. package/dist/templates/presentation.template.d.ts.map +1 -0
  407. package/dist/templates/presentation.template.js +80 -0
  408. package/dist/templates/presentation.template.js.map +1 -0
  409. package/dist/templates/telemetry.template.d.ts +7 -0
  410. package/dist/templates/telemetry.template.d.ts.map +1 -0
  411. package/dist/templates/telemetry.template.js +91 -0
  412. package/dist/templates/telemetry.template.js.map +1 -0
  413. package/dist/templates/workflow-runner.template.d.ts +16 -0
  414. package/dist/templates/workflow-runner.template.d.ts.map +1 -0
  415. package/dist/templates/workflow-runner.template.js +50 -0
  416. package/dist/templates/workflow-runner.template.js.map +1 -0
  417. package/dist/templates/workflow.template.d.ts +7 -0
  418. package/dist/templates/workflow.template.d.ts.map +1 -0
  419. package/dist/templates/workflow.template.js +69 -0
  420. package/dist/templates/workflow.template.js.map +1 -0
  421. package/dist/types/config.d.ts +34 -0
  422. package/dist/types/config.d.ts.map +1 -0
  423. package/dist/types.d.ts +324 -0
  424. package/dist/types.d.ts.map +1 -0
  425. package/package.json +68 -0
@@ -0,0 +1,74 @@
1
+ import { importFromOpenApi, parseOpenApi } from "@contractspec/lib.contracts-transformers/openapi";
2
+ import { dirname, join } from "path";
3
+
4
+ //#region src/services/openapi/import-service.ts
5
+ /**
6
+ * OpenAPI import service - imports specs from OpenAPI documents.
7
+ */
8
+ /**
9
+ * Import ContractSpec specs from an OpenAPI document.
10
+ */
11
+ async function importFromOpenApiService(contractspecOptions, options, adapters) {
12
+ const { fs, logger } = adapters;
13
+ const { source, outputDir, prefix, tags, exclude, defaultStability, defaultOwners, defaultAuth, dryRun = false } = options;
14
+ logger.info(`Importing from OpenAPI: ${source}`);
15
+ const parseResult = await parseOpenApi(source, {
16
+ fetch: globalThis.fetch,
17
+ readFile: (path) => fs.readFile(path)
18
+ });
19
+ if (parseResult.warnings.length > 0) for (const warning of parseResult.warnings) logger.warn(`Parse warning: ${warning}`);
20
+ logger.info(`Parsed ${parseResult.operations.length} operations from ${parseResult.info.title} v${parseResult.info.version}`);
21
+ const importResult = importFromOpenApi(parseResult, contractspecOptions, {
22
+ prefix,
23
+ tags,
24
+ exclude,
25
+ defaultStability,
26
+ defaultOwners,
27
+ defaultAuth
28
+ });
29
+ logger.info(`Import result: ${importResult.summary.imported} imported, ${importResult.summary.skipped} skipped, ${importResult.summary.errors} errors`);
30
+ const files = [];
31
+ const skippedOperations = [];
32
+ const errorMessages = [];
33
+ for (const spec of importResult.operationSpecs) {
34
+ const filePath = join(outputDir, spec.fileName);
35
+ if (dryRun) logger.info(`[DRY RUN] Would create: ${filePath}`);
36
+ else {
37
+ const dir = dirname(filePath);
38
+ await fs.mkdir(dir);
39
+ await fs.writeFile(filePath, spec.code);
40
+ logger.info(`Created: ${filePath}`);
41
+ }
42
+ files.push({
43
+ path: filePath,
44
+ operationId: spec.source.sourceId,
45
+ specName: spec.fileName.replace(".ts", "")
46
+ });
47
+ }
48
+ for (const skipped of importResult.skipped) {
49
+ skippedOperations.push({
50
+ operationId: skipped.sourceId,
51
+ reason: skipped.reason
52
+ });
53
+ logger.debug(`Skipped: ${skipped.sourceId} - ${skipped.reason}`);
54
+ }
55
+ for (const error of importResult.errors) {
56
+ errorMessages.push({
57
+ operationId: error.sourceId,
58
+ error: error.error
59
+ });
60
+ logger.error(`Error: ${error.sourceId} - ${error.error}`);
61
+ }
62
+ return {
63
+ imported: importResult.summary.imported,
64
+ skipped: importResult.summary.skipped,
65
+ errors: importResult.summary.errors,
66
+ files,
67
+ skippedOperations,
68
+ errorMessages
69
+ };
70
+ }
71
+
72
+ //#endregion
73
+ export { importFromOpenApiService };
74
+ //# sourceMappingURL=import-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-service.js","names":["files: OpenApiImportServiceResult['files']","skippedOperations: OpenApiImportServiceResult['skippedOperations']","errorMessages: OpenApiImportServiceResult['errorMessages']"],"sources":["../../../src/services/openapi/import-service.ts"],"sourcesContent":["/**\n * OpenAPI import service - imports specs from OpenAPI documents.\n */\n\nimport {\n importFromOpenApi,\n parseOpenApi,\n} from '@contractspec/lib.contracts-transformers/openapi';\nimport type { FsAdapter } from '../../ports/fs';\nimport type { LoggerAdapter } from '../../ports/logger';\nimport type {\n OpenApiImportServiceOptions,\n OpenApiImportServiceResult,\n} from './types';\nimport { dirname, join } from 'path';\nimport type { ContractsrcConfig } from '@contractspec/lib.contracts';\n\n/**\n * Import ContractSpec specs from an OpenAPI document.\n */\nexport async function importFromOpenApiService(\n contractspecOptions: ContractsrcConfig,\n options: OpenApiImportServiceOptions,\n adapters: { fs: FsAdapter; logger: LoggerAdapter }\n): Promise<OpenApiImportServiceResult> {\n const { fs, logger } = adapters;\n const {\n source,\n outputDir,\n prefix,\n tags,\n exclude,\n defaultStability,\n defaultOwners,\n defaultAuth,\n dryRun = false,\n } = options;\n\n logger.info(`Importing from OpenAPI: ${source}`);\n\n // Parse the OpenAPI document\n const parseResult = await parseOpenApi(source, {\n fetch: globalThis.fetch,\n readFile: (path) => fs.readFile(path),\n });\n\n if (parseResult.warnings.length > 0) {\n for (const warning of parseResult.warnings) {\n logger.warn(`Parse warning: ${warning}`);\n }\n }\n\n logger.info(\n `Parsed ${parseResult.operations.length} operations from ${parseResult.info.title} v${parseResult.info.version}`\n );\n\n // Import operations\n const importResult = importFromOpenApi(parseResult, contractspecOptions, {\n prefix,\n tags,\n exclude,\n defaultStability,\n defaultOwners,\n defaultAuth,\n });\n\n logger.info(\n `Import result: ${importResult.summary.imported} imported, ${importResult.summary.skipped} skipped, ${importResult.summary.errors} errors`\n );\n\n const files: OpenApiImportServiceResult['files'] = [];\n const skippedOperations: OpenApiImportServiceResult['skippedOperations'] = [];\n const errorMessages: OpenApiImportServiceResult['errorMessages'] = [];\n\n // Write imported specs\n for (const spec of importResult.operationSpecs) {\n const filePath = join(outputDir, spec.fileName);\n\n if (dryRun) {\n logger.info(`[DRY RUN] Would create: ${filePath}`);\n } else {\n // Ensure directory exists\n const dir = dirname(filePath);\n await fs.mkdir(dir);\n\n // Write spec file\n await fs.writeFile(filePath, spec.code);\n logger.info(`Created: ${filePath}`);\n }\n\n files.push({\n path: filePath,\n operationId: spec.source.sourceId,\n specName: spec.fileName.replace('.ts', ''),\n });\n }\n\n // Record skipped operations\n for (const skipped of importResult.skipped) {\n skippedOperations.push({\n operationId: skipped.sourceId,\n reason: skipped.reason,\n });\n logger.debug(`Skipped: ${skipped.sourceId} - ${skipped.reason}`);\n }\n\n // Record errors\n for (const error of importResult.errors) {\n errorMessages.push({\n operationId: error.sourceId,\n error: error.error,\n });\n logger.error(`Error: ${error.sourceId} - ${error.error}`);\n }\n\n return {\n imported: importResult.summary.imported,\n skipped: importResult.summary.skipped,\n errors: importResult.summary.errors,\n files,\n skippedOperations,\n errorMessages,\n };\n}\n"],"mappings":";;;;;;;;;;AAoBA,eAAsB,yBACpB,qBACA,SACA,UACqC;CACrC,MAAM,EAAE,IAAI,WAAW;CACvB,MAAM,EACJ,QACA,WACA,QACA,MACA,SACA,kBACA,eACA,aACA,SAAS,UACP;AAEJ,QAAO,KAAK,2BAA2B,SAAS;CAGhD,MAAM,cAAc,MAAM,aAAa,QAAQ;EAC7C,OAAO,WAAW;EAClB,WAAW,SAAS,GAAG,SAAS,KAAK;EACtC,CAAC;AAEF,KAAI,YAAY,SAAS,SAAS,EAChC,MAAK,MAAM,WAAW,YAAY,SAChC,QAAO,KAAK,kBAAkB,UAAU;AAI5C,QAAO,KACL,UAAU,YAAY,WAAW,OAAO,mBAAmB,YAAY,KAAK,MAAM,IAAI,YAAY,KAAK,UACxG;CAGD,MAAM,eAAe,kBAAkB,aAAa,qBAAqB;EACvE;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AAEF,QAAO,KACL,kBAAkB,aAAa,QAAQ,SAAS,aAAa,aAAa,QAAQ,QAAQ,YAAY,aAAa,QAAQ,OAAO,SACnI;CAED,MAAMA,QAA6C,EAAE;CACrD,MAAMC,oBAAqE,EAAE;CAC7E,MAAMC,gBAA6D,EAAE;AAGrE,MAAK,MAAM,QAAQ,aAAa,gBAAgB;EAC9C,MAAM,WAAW,KAAK,WAAW,KAAK,SAAS;AAE/C,MAAI,OACF,QAAO,KAAK,2BAA2B,WAAW;OAC7C;GAEL,MAAM,MAAM,QAAQ,SAAS;AAC7B,SAAM,GAAG,MAAM,IAAI;AAGnB,SAAM,GAAG,UAAU,UAAU,KAAK,KAAK;AACvC,UAAO,KAAK,YAAY,WAAW;;AAGrC,QAAM,KAAK;GACT,MAAM;GACN,aAAa,KAAK,OAAO;GACzB,UAAU,KAAK,SAAS,QAAQ,OAAO,GAAG;GAC3C,CAAC;;AAIJ,MAAK,MAAM,WAAW,aAAa,SAAS;AAC1C,oBAAkB,KAAK;GACrB,aAAa,QAAQ;GACrB,QAAQ,QAAQ;GACjB,CAAC;AACF,SAAO,MAAM,YAAY,QAAQ,SAAS,KAAK,QAAQ,SAAS;;AAIlE,MAAK,MAAM,SAAS,aAAa,QAAQ;AACvC,gBAAc,KAAK;GACjB,aAAa,MAAM;GACnB,OAAO,MAAM;GACd,CAAC;AACF,SAAO,MAAM,UAAU,MAAM,SAAS,KAAK,MAAM,QAAQ;;AAG3D,QAAO;EACL,UAAU,aAAa,QAAQ;EAC/B,SAAS,aAAa,QAAQ;EAC9B,QAAQ,aAAa,QAAQ;EAC7B;EACA;EACA;EACD"}
@@ -0,0 +1,5 @@
1
+ import { OpenApiExportServiceOptions, OpenApiExportServiceResult, OpenApiImportServiceOptions, OpenApiImportServiceResult, OpenApiSyncServiceOptions, OpenApiSyncServiceResult, OpenApiValidateServiceOptions, OpenApiValidateServiceResult } from "./types.js";
2
+ import { importFromOpenApiService } from "./import-service.js";
3
+ import { syncWithOpenApiService } from "./sync-service.js";
4
+ import { validateAgainstOpenApiService } from "./validate-service.js";
5
+ import { OpenApiExportOptions, OpenApiExportResult, exportOpenApi } from "./export-service.js";
@@ -0,0 +1,4 @@
1
+ import { importFromOpenApiService } from "./import-service.js";
2
+ import { syncWithOpenApiService } from "./sync-service.js";
3
+ import { validateAgainstOpenApiService } from "./validate-service.js";
4
+ import { exportOpenApi } from "./export-service.js";
@@ -0,0 +1,17 @@
1
+ import { FsAdapter } from "../../ports/fs.js";
2
+ import { LoggerAdapter } from "../../ports/logger.js";
3
+ import { OpenApiSyncServiceOptions, OpenApiSyncServiceResult } from "./types.js";
4
+ import { ContractsrcConfig } from "@contractspec/lib.contracts";
5
+
6
+ //#region src/services/openapi/sync-service.d.ts
7
+
8
+ /**
9
+ * Sync ContractSpec specs with OpenAPI sources.
10
+ */
11
+ declare function syncWithOpenApiService(options: OpenApiSyncServiceOptions, config: ContractsrcConfig, adapters: {
12
+ fs: FsAdapter;
13
+ logger: LoggerAdapter;
14
+ }): Promise<OpenApiSyncServiceResult>;
15
+ //#endregion
16
+ export { syncWithOpenApiService };
17
+ //# sourceMappingURL=sync-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-service.d.ts","names":[],"sources":["../../../src/services/openapi/sync-service.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAuBqC,iBAHf,sBAAA,CAGe,OAAA,EAF1B,yBAE0B,EAAA,MAAA,EAD3B,iBAC2B,EAAA,QAAA,EAAA;EAC1B,EAAA,EADO,SACP;EAAR,MAAA,EADkC,aAClC;CAAO,CAAA,EAAP,OAAO,CAAC,wBAAD,CAAA"}
@@ -0,0 +1,120 @@
1
+ import { importFromOpenApi, parseOpenApi } from "@contractspec/lib.contracts-transformers/openapi";
2
+ import { dirname, join } from "path";
3
+
4
+ //#region src/services/openapi/sync-service.ts
5
+ /**
6
+ * OpenAPI sync service - syncs specs with OpenAPI sources.
7
+ */
8
+ /**
9
+ * Sync ContractSpec specs with OpenAPI sources.
10
+ */
11
+ async function syncWithOpenApiService(options, config, adapters) {
12
+ const { fs, logger } = adapters;
13
+ const { sources: optSources, sourceName, interactive, force, dryRun } = options;
14
+ const { outputDir } = config;
15
+ let sourcesToSync = optSources ?? config.openapi?.sources ?? [];
16
+ if (sourceName) {
17
+ sourcesToSync = sourcesToSync.filter((s) => s.name === sourceName);
18
+ if (sourcesToSync.length === 0) throw new Error(`Source not found: ${sourceName}`);
19
+ }
20
+ if (sourcesToSync.length === 0) {
21
+ logger.warn("No OpenAPI sources configured. Add sources to .contractsrc.json");
22
+ return {
23
+ added: 0,
24
+ updated: 0,
25
+ unchanged: 0,
26
+ conflicts: 0,
27
+ changes: []
28
+ };
29
+ }
30
+ const result = {
31
+ added: 0,
32
+ updated: 0,
33
+ unchanged: 0,
34
+ conflicts: 0,
35
+ changes: []
36
+ };
37
+ for (const source of sourcesToSync) {
38
+ logger.info(`Syncing with source: ${source.name}`);
39
+ const sourceLocation = source.url ?? source.file;
40
+ if (!sourceLocation) {
41
+ logger.warn(`Source ${source.name} has no url or file configured`);
42
+ continue;
43
+ }
44
+ const parseResult = await parseOpenApi(sourceLocation, {
45
+ fetch: globalThis.fetch,
46
+ readFile: (path) => fs.readFile(path)
47
+ });
48
+ logger.info(`Parsed ${parseResult.operations.length} operations from ${source.name}`);
49
+ const importResult = importFromOpenApi(parseResult, config, {
50
+ prefix: source.prefix,
51
+ tags: source.tags,
52
+ exclude: source.exclude,
53
+ defaultStability: source.defaultStability,
54
+ defaultAuth: source.defaultAuth
55
+ });
56
+ for (const imported of importResult.operationSpecs) {
57
+ const filePath = join(outputDir, imported.fileName);
58
+ if (!await fs.exists(filePath)) {
59
+ if (!dryRun) {
60
+ const dir = dirname(filePath);
61
+ await fs.mkdir(dir);
62
+ await fs.writeFile(filePath, imported.code);
63
+ }
64
+ result.added++;
65
+ result.changes.push({
66
+ operationId: imported.source.sourceId,
67
+ action: "added",
68
+ path: filePath
69
+ });
70
+ logger.info(`Added: ${imported.source.sourceId}`);
71
+ } else if (await fs.readFile(filePath) === imported.code) {
72
+ result.unchanged++;
73
+ result.changes.push({
74
+ operationId: imported.source.sourceId,
75
+ action: "unchanged",
76
+ path: filePath
77
+ });
78
+ } else if (force === "openapi") {
79
+ if (!dryRun) await fs.writeFile(filePath, imported.code);
80
+ result.updated++;
81
+ result.changes.push({
82
+ operationId: imported.source.sourceId,
83
+ action: "updated",
84
+ path: filePath
85
+ });
86
+ logger.info(`Updated: ${imported.source.sourceId}`);
87
+ } else if (force === "contractspec") {
88
+ result.unchanged++;
89
+ result.changes.push({
90
+ operationId: imported.source.sourceId,
91
+ action: "unchanged",
92
+ path: filePath
93
+ });
94
+ logger.info(`Kept: ${imported.source.sourceId}`);
95
+ } else if (interactive) {
96
+ result.conflicts++;
97
+ result.changes.push({
98
+ operationId: imported.source.sourceId,
99
+ action: "conflict",
100
+ path: filePath
101
+ });
102
+ logger.warn(`Conflict: ${imported.source.sourceId} - needs resolution`);
103
+ } else {
104
+ result.conflicts++;
105
+ result.changes.push({
106
+ operationId: imported.source.sourceId,
107
+ action: "conflict",
108
+ path: filePath
109
+ });
110
+ logger.warn(`Conflict: ${imported.source.sourceId}`);
111
+ }
112
+ }
113
+ }
114
+ logger.info(`Sync complete: ${result.added} added, ${result.updated} updated, ${result.unchanged} unchanged, ${result.conflicts} conflicts`);
115
+ return result;
116
+ }
117
+
118
+ //#endregion
119
+ export { syncWithOpenApiService };
120
+ //# sourceMappingURL=sync-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-service.js","names":["result: OpenApiSyncServiceResult"],"sources":["../../../src/services/openapi/sync-service.ts"],"sourcesContent":["/**\n * OpenAPI sync service - syncs specs with OpenAPI sources.\n */\n\nimport {\n importFromOpenApi,\n parseOpenApi,\n} from '@contractspec/lib.contracts-transformers/openapi';\nimport type { FsAdapter } from '../../ports/fs';\nimport type { LoggerAdapter } from '../../ports/logger';\nimport type {\n OpenApiSyncServiceOptions,\n OpenApiSyncServiceResult,\n} from './types';\nimport { dirname, join } from 'path';\nimport type { ContractsrcConfig } from '@contractspec/lib.contracts';\n\n/**\n * Sync ContractSpec specs with OpenAPI sources.\n */\nexport async function syncWithOpenApiService(\n options: OpenApiSyncServiceOptions,\n config: ContractsrcConfig,\n adapters: { fs: FsAdapter; logger: LoggerAdapter }\n): Promise<OpenApiSyncServiceResult> {\n const { fs, logger } = adapters;\n const {\n sources: optSources,\n sourceName,\n interactive,\n force,\n dryRun,\n } = options;\n const { outputDir } = config;\n\n // Determine which sources to sync\n let sourcesToSync = optSources ?? config.openapi?.sources ?? [];\n\n if (sourceName) {\n sourcesToSync = sourcesToSync.filter((s) => s.name === sourceName);\n if (sourcesToSync.length === 0) {\n throw new Error(`Source not found: ${sourceName}`);\n }\n }\n\n if (sourcesToSync.length === 0) {\n logger.warn(\n 'No OpenAPI sources configured. Add sources to .contractsrc.json'\n );\n return {\n added: 0,\n updated: 0,\n unchanged: 0,\n conflicts: 0,\n changes: [],\n };\n }\n\n const result: OpenApiSyncServiceResult = {\n added: 0,\n updated: 0,\n unchanged: 0,\n conflicts: 0,\n changes: [],\n };\n\n for (const source of sourcesToSync) {\n logger.info(`Syncing with source: ${source.name}`);\n\n // Get source URL or file\n const sourceLocation = source.url ?? source.file;\n if (!sourceLocation) {\n logger.warn(`Source ${source.name} has no url or file configured`);\n continue;\n }\n\n // Parse the OpenAPI document\n const parseResult = await parseOpenApi(sourceLocation, {\n fetch: globalThis.fetch,\n readFile: (path) => fs.readFile(path),\n });\n\n logger.info(\n `Parsed ${parseResult.operations.length} operations from ${source.name}`\n );\n\n // Import operations to get the new specs\n const importResult = importFromOpenApi(parseResult, config, {\n prefix: source.prefix,\n tags: source.tags,\n exclude: source.exclude,\n defaultStability: source.defaultStability,\n defaultAuth: source.defaultAuth,\n });\n\n // Process each imported spec\n for (const imported of importResult.operationSpecs) {\n const filePath = join(outputDir, imported.fileName);\n const exists = await fs.exists(filePath);\n\n if (!exists) {\n // New spec - add it\n if (!dryRun) {\n const dir = dirname(filePath);\n await fs.mkdir(dir);\n await fs.writeFile(filePath, imported.code);\n }\n\n result.added++;\n result.changes.push({\n operationId: imported.source.sourceId,\n action: 'added',\n path: filePath,\n });\n logger.info(`Added: ${imported.source.sourceId}`);\n } else {\n // Existing spec - check for differences\n const existingCode = await fs.readFile(filePath);\n\n if (existingCode === imported.code) {\n // No changes\n result.unchanged++;\n result.changes.push({\n operationId: imported.source.sourceId,\n action: 'unchanged',\n path: filePath,\n });\n } else {\n // Differences detected\n if (force === 'openapi') {\n // Overwrite with OpenAPI version\n if (!dryRun) {\n await fs.writeFile(filePath, imported.code);\n }\n result.updated++;\n result.changes.push({\n operationId: imported.source.sourceId,\n action: 'updated',\n path: filePath,\n });\n logger.info(`Updated: ${imported.source.sourceId}`);\n } else if (force === 'contractspec') {\n // Keep ContractSpec version\n result.unchanged++;\n result.changes.push({\n operationId: imported.source.sourceId,\n action: 'unchanged',\n path: filePath,\n });\n logger.info(`Kept: ${imported.source.sourceId}`);\n } else if (interactive) {\n // Would prompt for resolution in CLI\n result.conflicts++;\n result.changes.push({\n operationId: imported.source.sourceId,\n action: 'conflict',\n path: filePath,\n });\n logger.warn(\n `Conflict: ${imported.source.sourceId} - needs resolution`\n );\n } else {\n // Default: report conflict\n result.conflicts++;\n result.changes.push({\n operationId: imported.source.sourceId,\n action: 'conflict',\n path: filePath,\n });\n logger.warn(`Conflict: ${imported.source.sourceId}`);\n }\n }\n }\n }\n }\n\n logger.info(\n `Sync complete: ${result.added} added, ${result.updated} updated, ${result.unchanged} unchanged, ${result.conflicts} conflicts`\n );\n\n return result;\n}\n"],"mappings":"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"}
@@ -0,0 +1,162 @@
1
+ import { OpenApiSourceConfig } from "@contractspec/lib.contracts";
2
+
3
+ //#region src/services/openapi/types.d.ts
4
+
5
+ /**
6
+ * Options for OpenAPI import.
7
+ */
8
+ interface OpenApiImportServiceOptions {
9
+ /** Source URL or file path */
10
+ source: string;
11
+ /** Output directory for generated spec files */
12
+ outputDir: string;
13
+ /** Prefix for generated spec names */
14
+ prefix?: string;
15
+ /** Only import operations with these tags */
16
+ tags?: string[];
17
+ /** Exclude operations with these operationIds */
18
+ exclude?: string[];
19
+ /** Default stability for imported specs */
20
+ defaultStability?: 'experimental' | 'beta' | 'stable' | 'deprecated';
21
+ /** Default owners for imported specs */
22
+ defaultOwners?: string[];
23
+ /** Default auth level for imported specs */
24
+ defaultAuth?: 'anonymous' | 'user' | 'admin';
25
+ /** Dry run - show what would be imported without writing files */
26
+ dryRun?: boolean;
27
+ }
28
+ /**
29
+ * Result of OpenAPI import.
30
+ */
31
+ interface OpenApiImportServiceResult {
32
+ /** Number of specs successfully imported */
33
+ imported: number;
34
+ /** Number of specs skipped */
35
+ skipped: number;
36
+ /** Number of errors */
37
+ errors: number;
38
+ /** List of imported spec files */
39
+ files: {
40
+ path: string;
41
+ operationId: string;
42
+ specName: string;
43
+ }[];
44
+ /** List of skipped operations */
45
+ skippedOperations: {
46
+ operationId: string;
47
+ reason: string;
48
+ }[];
49
+ /** List of errors */
50
+ errorMessages: {
51
+ operationId: string;
52
+ error: string;
53
+ }[];
54
+ }
55
+ /**
56
+ * Options for OpenAPI sync.
57
+ */
58
+ interface OpenApiSyncServiceOptions {
59
+ /** Sources to sync (uses config if not provided) */
60
+ sources?: OpenApiSourceConfig[];
61
+ /** Source name to sync (if syncing single source) */
62
+ sourceName?: string;
63
+ /** Interactive mode - prompt for conflict resolution */
64
+ interactive?: boolean;
65
+ /** Force resolution mode */
66
+ force?: 'openapi' | 'contractspec';
67
+ /** Dry run - show what would change without writing */
68
+ dryRun?: boolean;
69
+ }
70
+ /**
71
+ * Result of OpenAPI sync.
72
+ */
73
+ interface OpenApiSyncServiceResult {
74
+ /** Number of specs added */
75
+ added: number;
76
+ /** Number of specs updated */
77
+ updated: number;
78
+ /** Number of specs unchanged */
79
+ unchanged: number;
80
+ /** Number of conflicts */
81
+ conflicts: number;
82
+ /** Details of changes */
83
+ changes: {
84
+ operationId: string;
85
+ action: 'added' | 'updated' | 'unchanged' | 'conflict';
86
+ path?: string;
87
+ changeCount?: number;
88
+ }[];
89
+ }
90
+ /**
91
+ * Options for OpenAPI validation.
92
+ */
93
+ interface OpenApiValidateServiceOptions {
94
+ /** Spec file or directory to validate */
95
+ specPath: string;
96
+ /** OpenAPI source to validate against */
97
+ openApiSource: string;
98
+ /** Ignore description differences */
99
+ ignoreDescriptions?: boolean;
100
+ /** Ignore tag differences */
101
+ ignoreTags?: boolean;
102
+ /** Ignore transport differences (path, method) */
103
+ ignoreTransport?: boolean;
104
+ }
105
+ /**
106
+ * Result of OpenAPI validation.
107
+ */
108
+ interface OpenApiValidateServiceResult {
109
+ /** Whether validation passed */
110
+ valid: boolean;
111
+ /** Number of specs validated */
112
+ specsValidated: number;
113
+ /** Number of specs with differences */
114
+ specsWithDiffs: number;
115
+ /** Validation details */
116
+ results: {
117
+ specPath: string;
118
+ operationId?: string;
119
+ valid: boolean;
120
+ diffs: {
121
+ path: string;
122
+ type: string;
123
+ description: string;
124
+ }[];
125
+ }[];
126
+ }
127
+ /**
128
+ * Options for OpenAPI export.
129
+ */
130
+ interface OpenApiExportServiceOptions {
131
+ /** Path to module exporting OperationSpecRegistry */
132
+ registryPath: string;
133
+ /** Output file path */
134
+ outputPath?: string;
135
+ /** Output format */
136
+ format?: 'json' | 'yaml';
137
+ /** OpenAPI title */
138
+ title?: string;
139
+ /** OpenAPI version */
140
+ version?: string;
141
+ /** OpenAPI description */
142
+ description?: string;
143
+ /** Server URLs to include */
144
+ servers?: {
145
+ url: string;
146
+ description?: string;
147
+ }[];
148
+ }
149
+ /**
150
+ * Result of OpenAPI export.
151
+ */
152
+ interface OpenApiExportServiceResult {
153
+ /** Output file path */
154
+ outputPath: string;
155
+ /** Generated content */
156
+ content: string;
157
+ /** Number of operations exported */
158
+ operationCount: number;
159
+ }
160
+ //#endregion
161
+ export { OpenApiExportServiceOptions, OpenApiExportServiceResult, OpenApiImportServiceOptions, OpenApiImportServiceResult, OpenApiSyncServiceOptions, OpenApiSyncServiceResult, OpenApiValidateServiceOptions, OpenApiValidateServiceResult };
162
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/services/openapi/types.ts"],"sourcesContent":[],"mappings":";;;;AAiCA;AA4BA;AAgBA;AAqBiB,UAzFA,2BAAA,CAyF6B;EAgB7B;EAuBA,MAAA,EAAA,MAAA;EAuBA;;;;;;;;;;;;;;;;;;;;UA/HA,0BAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;UA4BA,yBAAA;;YAEL;;;;;;;;;;;;;UAcK,wBAAA;;;;;;;;;;;;;;;;;;;;UAqBA,6BAAA;;;;;;;;;;;;;;;UAgBA,4BAAA;;;;;;;;;;;;;;;;;;;;;;UAuBA,2BAAA;;;;;;;;;;;;;;;;;;;;;;UAuBA,0BAAA"}
@@ -0,0 +1,16 @@
1
+ import { FsAdapter } from "../../ports/fs.js";
2
+ import { LoggerAdapter } from "../../ports/logger.js";
3
+ import { OpenApiValidateServiceOptions, OpenApiValidateServiceResult } from "./types.js";
4
+
5
+ //#region src/services/openapi/validate-service.d.ts
6
+
7
+ /**
8
+ * Validate ContractSpec specs against an OpenAPI source.
9
+ */
10
+ declare function validateAgainstOpenApiService(options: OpenApiValidateServiceOptions, adapters: {
11
+ fs: FsAdapter;
12
+ logger: LoggerAdapter;
13
+ }): Promise<OpenApiValidateServiceResult>;
14
+ //#endregion
15
+ export { validateAgainstOpenApiService };
16
+ //# sourceMappingURL=validate-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-service.d.ts","names":[],"sources":["../../../src/services/openapi/validate-service.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAqBW,iBAHW,6BAAA,CAGX,OAAA,EAFA,6BAEA,EAAA,QAAA,EAAA;EAAR,EAAA,EADe,SACf;EAAO,MAAA,EAD2B,aAC3B;IAAP,QAAQ"}
@@ -0,0 +1,130 @@
1
+ import { parseOpenApi } from "@contractspec/lib.contracts-transformers/openapi";
2
+
3
+ //#region src/services/openapi/validate-service.ts
4
+ /**
5
+ * OpenAPI validation service - validates specs against OpenAPI sources.
6
+ */
7
+ /**
8
+ * Validate ContractSpec specs against an OpenAPI source.
9
+ */
10
+ async function validateAgainstOpenApiService(options, adapters) {
11
+ const { fs, logger } = adapters;
12
+ const { specPath, openApiSource, ignoreDescriptions: _ignoreDescriptions, ignoreTags: _ignoreTags, ignoreTransport } = options;
13
+ logger.info(`Validating specs against OpenAPI: ${openApiSource}`);
14
+ const parseResult = await parseOpenApi(openApiSource, {
15
+ fetch: globalThis.fetch,
16
+ readFile: (path) => fs.readFile(path)
17
+ });
18
+ logger.info(`Parsed ${parseResult.operations.length} operations from ${parseResult.info.title}`);
19
+ const operationsMap = /* @__PURE__ */ new Map();
20
+ for (const op of parseResult.operations) operationsMap.set(op.operationId, op);
21
+ const results = [];
22
+ let specsValidated = 0;
23
+ let specsWithDiffs = 0;
24
+ const stat = await fs.stat(specPath);
25
+ const specFiles = [];
26
+ if (stat.isDirectory) {
27
+ const files = await fs.glob({
28
+ pattern: "**/*.ts",
29
+ cwd: specPath,
30
+ ignore: [
31
+ "node_modules/**",
32
+ "dist/**",
33
+ "*.test.ts",
34
+ "*.spec.ts"
35
+ ],
36
+ absolute: true
37
+ });
38
+ specFiles.push(...files);
39
+ } else specFiles.push(specPath);
40
+ logger.info(`Found ${specFiles.length} spec files to validate`);
41
+ for (const file of specFiles) try {
42
+ const content = await fs.readFile(file);
43
+ const operationIdMatch = content.match(/operationId:\s*['"]([^'"]+)['"]/) || content.match(/name:\s*['"]([^'"]+)['"]/) || content.match(/export\s+const\s+(\w+)Spec\s*=/);
44
+ if (!operationIdMatch || !operationIdMatch[1]) {
45
+ logger.debug(`Could not extract operationId from ${file}`);
46
+ continue;
47
+ }
48
+ const specName = operationIdMatch[1];
49
+ specsValidated++;
50
+ let matchingOp;
51
+ matchingOp = operationsMap.get(specName);
52
+ if (!matchingOp) {
53
+ const snakeName = specName.replace(/([A-Z])/g, "_$1").toLowerCase();
54
+ matchingOp = operationsMap.get(snakeName);
55
+ }
56
+ if (!matchingOp) {
57
+ for (const [opId, op] of operationsMap) if (opId.toLowerCase().includes(specName.toLowerCase()) || specName.toLowerCase().includes(opId.toLowerCase())) {
58
+ matchingOp = op;
59
+ break;
60
+ }
61
+ }
62
+ if (!matchingOp) {
63
+ results.push({
64
+ specPath: file,
65
+ valid: false,
66
+ diffs: [{
67
+ path: "",
68
+ type: "removed",
69
+ description: `No matching operation found in OpenAPI for spec: ${specName}`
70
+ }]
71
+ });
72
+ specsWithDiffs++;
73
+ continue;
74
+ }
75
+ const diffs = [];
76
+ if (matchingOp.deprecated && !content.includes("deprecated")) diffs.push({
77
+ path: "meta.stability",
78
+ type: "modified",
79
+ description: "OpenAPI operation is deprecated but spec does not indicate deprecation"
80
+ });
81
+ if (!ignoreTransport) {
82
+ const pathMatch = content.match(/path:\s*['"]([^'"]+)['"]/);
83
+ if (pathMatch && pathMatch[1] !== matchingOp.path) diffs.push({
84
+ path: "transport.rest.path",
85
+ type: "modified",
86
+ description: `Path mismatch: spec has "${pathMatch[1]}", OpenAPI has "${matchingOp.path}"`
87
+ });
88
+ }
89
+ if (!ignoreTransport) {
90
+ const methodMatch = content.match(/method:\s*['"]([^'"]+)['"]/);
91
+ if (methodMatch?.[1] && methodMatch[1].toLowerCase() !== matchingOp.method.toLowerCase()) diffs.push({
92
+ path: "transport.rest.method",
93
+ type: "modified",
94
+ description: `Method mismatch: spec has "${methodMatch[1]}", OpenAPI has "${matchingOp.method.toUpperCase()}"`
95
+ });
96
+ }
97
+ const valid$1 = diffs.length === 0;
98
+ if (!valid$1) specsWithDiffs++;
99
+ results.push({
100
+ specPath: file,
101
+ operationId: matchingOp.operationId,
102
+ valid: valid$1,
103
+ diffs
104
+ });
105
+ } catch (error) {
106
+ logger.error(`Error validating ${file}: ${error}`);
107
+ results.push({
108
+ specPath: file,
109
+ valid: false,
110
+ diffs: [{
111
+ path: "",
112
+ type: "modified",
113
+ description: `Error: ${error instanceof Error ? error.message : String(error)}`
114
+ }]
115
+ });
116
+ specsWithDiffs++;
117
+ }
118
+ const valid = specsWithDiffs === 0;
119
+ logger.info(`Validation ${valid ? "passed" : "failed"}: ${specsValidated} specs checked, ${specsWithDiffs} with differences`);
120
+ return {
121
+ valid,
122
+ specsValidated,
123
+ specsWithDiffs,
124
+ results
125
+ };
126
+ }
127
+
128
+ //#endregion
129
+ export { validateAgainstOpenApiService };
130
+ //# sourceMappingURL=validate-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-service.js","names":["results: OpenApiValidateServiceResult['results']","specFiles: string[]","specName: string","matchingOp: ParsedOperation | undefined","diffs: OpenApiValidateServiceResult['results'][0]['diffs']","valid"],"sources":["../../../src/services/openapi/validate-service.ts"],"sourcesContent":["/**\n * OpenAPI validation service - validates specs against OpenAPI sources.\n */\n\nimport {\n parseOpenApi,\n type ParsedOperation,\n} from '@contractspec/lib.contracts-transformers/openapi';\nimport type { FsAdapter } from '../../ports/fs';\nimport type { LoggerAdapter } from '../../ports/logger';\nimport type {\n OpenApiValidateServiceOptions,\n OpenApiValidateServiceResult,\n} from './types';\n\n/**\n * Validate ContractSpec specs against an OpenAPI source.\n */\nexport async function validateAgainstOpenApiService(\n options: OpenApiValidateServiceOptions,\n adapters: { fs: FsAdapter; logger: LoggerAdapter }\n): Promise<OpenApiValidateServiceResult> {\n const { fs, logger } = adapters;\n const {\n specPath,\n openApiSource,\n ignoreDescriptions: _ignoreDescriptions,\n ignoreTags: _ignoreTags,\n ignoreTransport,\n } = options;\n\n logger.info(`Validating specs against OpenAPI: ${openApiSource}`);\n\n // Parse the OpenAPI document\n const parseResult = await parseOpenApi(openApiSource, {\n fetch: globalThis.fetch,\n readFile: (path) => fs.readFile(path),\n });\n\n logger.info(\n `Parsed ${parseResult.operations.length} operations from ${parseResult.info.title}`\n );\n\n // Build a map of operations by operationId\n const operationsMap = new Map<string, ParsedOperation>();\n for (const op of parseResult.operations) {\n operationsMap.set(op.operationId, op);\n }\n\n const results: OpenApiValidateServiceResult['results'] = [];\n let specsValidated = 0;\n let specsWithDiffs = 0;\n\n // Check if specPath is a directory or file\n const stat = await fs.stat(specPath);\n const specFiles: string[] = [];\n\n if (stat.isDirectory) {\n // Find all spec files in directory\n const files = await fs.glob({\n pattern: '**/*.ts',\n cwd: specPath,\n ignore: ['node_modules/**', 'dist/**', '*.test.ts', '*.spec.ts'],\n absolute: true,\n });\n specFiles.push(...files);\n } else {\n specFiles.push(specPath);\n }\n\n logger.info(`Found ${specFiles.length} spec files to validate`);\n\n for (const file of specFiles) {\n try {\n // Read the spec file\n const content = await fs.readFile(file);\n\n // Try to extract operationId from the spec file\n // Look for x-contractspec metadata or transport.rest.path\n const operationIdMatch =\n content.match(/operationId:\\s*['\"]([^'\"]+)['\"]/) ||\n content.match(/name:\\s*['\"]([^'\"]+)['\"]/) ||\n content.match(/export\\s+const\\s+(\\w+)Spec\\s*=/);\n\n if (!operationIdMatch || !operationIdMatch[1]) {\n logger.debug(`Could not extract operationId from ${file}`);\n continue;\n }\n\n const specName: string = operationIdMatch[1];\n specsValidated++;\n\n // Try to find matching OpenAPI operation\n // Match by operationId or by similar naming\n let matchingOp: ParsedOperation | undefined;\n\n // Direct match\n matchingOp = operationsMap.get(specName);\n\n // Try variations if no direct match\n if (!matchingOp) {\n // Try camelCase to snake_case\n const snakeName = specName.replace(/([A-Z])/g, '_$1').toLowerCase();\n matchingOp = operationsMap.get(snakeName);\n }\n\n if (!matchingOp) {\n // Try matching by partial name\n for (const [opId, op] of operationsMap) {\n if (\n opId.toLowerCase().includes(specName.toLowerCase()) ||\n specName.toLowerCase().includes(opId.toLowerCase())\n ) {\n matchingOp = op;\n break;\n }\n }\n }\n\n if (!matchingOp) {\n results.push({\n specPath: file,\n valid: false,\n diffs: [\n {\n path: '',\n type: 'removed',\n description: `No matching operation found in OpenAPI for spec: ${specName}`,\n },\n ],\n });\n specsWithDiffs++;\n continue;\n }\n\n // For now, we'll do a basic validation\n // In a full implementation, we would load the actual spec and compare\n const diffs: OpenApiValidateServiceResult['results'][0]['diffs'] = [];\n\n // Check if spec mentions deprecated when OpenAPI says deprecated\n if (matchingOp.deprecated && !content.includes('deprecated')) {\n diffs.push({\n path: 'meta.stability',\n type: 'modified',\n description:\n 'OpenAPI operation is deprecated but spec does not indicate deprecation',\n });\n }\n\n // Check path match\n if (!ignoreTransport) {\n const pathMatch = content.match(/path:\\s*['\"]([^'\"]+)['\"]/);\n if (pathMatch && pathMatch[1] !== matchingOp.path) {\n diffs.push({\n path: 'transport.rest.path',\n type: 'modified',\n description: `Path mismatch: spec has \"${pathMatch[1]}\", OpenAPI has \"${matchingOp.path}\"`,\n });\n }\n }\n\n // Check method match\n if (!ignoreTransport) {\n const methodMatch = content.match(/method:\\s*['\"]([^'\"]+)['\"]/);\n if (\n methodMatch?.[1] &&\n methodMatch[1].toLowerCase() !== matchingOp.method.toLowerCase()\n ) {\n diffs.push({\n path: 'transport.rest.method',\n type: 'modified',\n description: `Method mismatch: spec has \"${methodMatch[1]}\", OpenAPI has \"${matchingOp.method.toUpperCase()}\"`,\n });\n }\n }\n\n const valid = diffs.length === 0;\n if (!valid) {\n specsWithDiffs++;\n }\n\n results.push({\n specPath: file,\n operationId: matchingOp.operationId,\n valid,\n diffs,\n });\n } catch (error) {\n logger.error(`Error validating ${file}: ${error}`);\n results.push({\n specPath: file,\n valid: false,\n diffs: [\n {\n path: '',\n type: 'modified',\n description: `Error: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n });\n specsWithDiffs++;\n }\n }\n\n const valid = specsWithDiffs === 0;\n\n logger.info(\n `Validation ${valid ? 'passed' : 'failed'}: ${specsValidated} specs checked, ${specsWithDiffs} with differences`\n );\n\n return {\n valid,\n specsValidated,\n specsWithDiffs,\n results,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { QuickstartDependency } from "./types.js";
2
+
3
+ //#region src/services/quickstart/dependencies.d.ts
4
+
5
+ /**
6
+ * Minimal dependencies required for ContractSpec to work.
7
+ *
8
+ * This is the absolute minimum needed to define and use contracts.
9
+ */
10
+ declare const MINIMAL_DEPENDENCIES: QuickstartDependency[];
11
+ /**
12
+ * Full dependencies for a complete ContractSpec setup.
13
+ *
14
+ * Includes development tools and extended libraries.
15
+ */
16
+ declare const FULL_DEPENDENCIES: QuickstartDependency[];
17
+ /**
18
+ * Get dependencies for the specified mode.
19
+ */
20
+ declare function getDependencies(mode: 'minimal' | 'full'): QuickstartDependency[];
21
+ /**
22
+ * Get production dependencies (non-dev).
23
+ */
24
+ declare function getProductionDependencies(dependencies: QuickstartDependency[]): QuickstartDependency[];
25
+ /**
26
+ * Get development dependencies.
27
+ */
28
+ declare function getDevDependencies(dependencies: QuickstartDependency[]): QuickstartDependency[];
29
+ //#endregion
30
+ export { FULL_DEPENDENCIES, MINIMAL_DEPENDENCIES, getDependencies, getDevDependencies, getProductionDependencies };
31
+ //# sourceMappingURL=dependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.d.ts","names":[],"sources":["../../../src/services/quickstart/dependencies.ts"],"sourcesContent":[],"mappings":";;;;AA0EA;;;;;cA5Da,sBAAsB;;;;;;cAiBtB,mBAAmB;;;;iBAyBhB,eAAA,4BAEb;;;;iBAOa,yBAAA,eACA,yBACb;;;;iBAOa,kBAAA,eACA,yBACb"}