@contractspec/bundle.workspace 0.0.0-canary-20260113162409

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 (703) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -0
  3. package/dist/_virtual/rolldown_runtime.mjs +20 -0
  4. package/dist/adapters/ai.d.mts +12 -0
  5. package/dist/adapters/ai.d.mts.map +1 -0
  6. package/dist/adapters/ai.mjs +83 -0
  7. package/dist/adapters/ai.mjs.map +1 -0
  8. package/dist/adapters/factory.d.mts +29 -0
  9. package/dist/adapters/factory.d.mts.map +1 -0
  10. package/dist/adapters/factory.mjs +37 -0
  11. package/dist/adapters/factory.mjs.map +1 -0
  12. package/dist/adapters/fs.d.mts +12 -0
  13. package/dist/adapters/fs.d.mts.map +1 -0
  14. package/dist/adapters/fs.mjs +133 -0
  15. package/dist/adapters/fs.mjs.map +1 -0
  16. package/dist/adapters/git.d.mts +11 -0
  17. package/dist/adapters/git.d.mts.map +1 -0
  18. package/dist/adapters/git.mjs +84 -0
  19. package/dist/adapters/git.mjs.map +1 -0
  20. package/dist/adapters/index.d.mts +7 -0
  21. package/dist/adapters/index.mjs +9 -0
  22. package/dist/adapters/logger.d.mts +18 -0
  23. package/dist/adapters/logger.d.mts.map +1 -0
  24. package/dist/adapters/logger.mjs +81 -0
  25. package/dist/adapters/logger.mjs.map +1 -0
  26. package/dist/adapters/watcher.d.mts +11 -0
  27. package/dist/adapters/watcher.d.mts.map +1 -0
  28. package/dist/adapters/watcher.mjs +74 -0
  29. package/dist/adapters/watcher.mjs.map +1 -0
  30. package/dist/adapters/workspace.d.mts +148 -0
  31. package/dist/adapters/workspace.d.mts.map +1 -0
  32. package/dist/adapters/workspace.mjs +275 -0
  33. package/dist/adapters/workspace.mjs.map +1 -0
  34. package/dist/ai/agents/claude-code-agent.d.mts +22 -0
  35. package/dist/ai/agents/claude-code-agent.d.mts.map +1 -0
  36. package/dist/ai/agents/claude-code-agent.mjs +182 -0
  37. package/dist/ai/agents/claude-code-agent.mjs.map +1 -0
  38. package/dist/ai/agents/cursor-agent.d.mts +68 -0
  39. package/dist/ai/agents/cursor-agent.d.mts.map +1 -0
  40. package/dist/ai/agents/cursor-agent.mjs +436 -0
  41. package/dist/ai/agents/cursor-agent.mjs.map +1 -0
  42. package/dist/ai/agents/index.mjs +7 -0
  43. package/dist/ai/agents/openai-codex-agent.d.mts +22 -0
  44. package/dist/ai/agents/openai-codex-agent.d.mts.map +1 -0
  45. package/dist/ai/agents/openai-codex-agent.mjs +167 -0
  46. package/dist/ai/agents/openai-codex-agent.mjs.map +1 -0
  47. package/dist/ai/agents/orchestrator.d.mts +50 -0
  48. package/dist/ai/agents/orchestrator.d.mts.map +1 -0
  49. package/dist/ai/agents/orchestrator.mjs +143 -0
  50. package/dist/ai/agents/orchestrator.mjs.map +1 -0
  51. package/dist/ai/agents/simple-agent.d.mts +17 -0
  52. package/dist/ai/agents/simple-agent.d.mts.map +1 -0
  53. package/dist/ai/agents/simple-agent.mjs +92 -0
  54. package/dist/ai/agents/simple-agent.mjs.map +1 -0
  55. package/dist/ai/agents/types.d.mts +36 -0
  56. package/dist/ai/agents/types.d.mts.map +1 -0
  57. package/dist/ai/client.d.mts +97 -0
  58. package/dist/ai/client.d.mts.map +1 -0
  59. package/dist/ai/client.mjs +189 -0
  60. package/dist/ai/client.mjs.map +1 -0
  61. package/dist/ai/index.d.mts +9 -0
  62. package/dist/ai/index.mjs +11 -0
  63. package/dist/ai/prompts/code-generation.d.mts +26 -0
  64. package/dist/ai/prompts/code-generation.d.mts.map +1 -0
  65. package/dist/ai/prompts/code-generation.mjs +143 -0
  66. package/dist/ai/prompts/code-generation.mjs.map +1 -0
  67. package/dist/ai/prompts/index.d.mts +10 -0
  68. package/dist/ai/prompts/index.d.mts.map +1 -0
  69. package/dist/ai/prompts/index.mjs +13 -0
  70. package/dist/ai/prompts/index.mjs.map +1 -0
  71. package/dist/ai/prompts/spec-creation.d.mts +29 -0
  72. package/dist/ai/prompts/spec-creation.d.mts.map +1 -0
  73. package/dist/ai/prompts/spec-creation.mjs +111 -0
  74. package/dist/ai/prompts/spec-creation.mjs.map +1 -0
  75. package/dist/ai/providers.d.mts +29 -0
  76. package/dist/ai/providers.d.mts.map +1 -0
  77. package/dist/ai/providers.mjs +39 -0
  78. package/dist/ai/providers.mjs.map +1 -0
  79. package/dist/formatters/index.d.mts +11 -0
  80. package/dist/formatters/index.d.mts.map +1 -0
  81. package/dist/formatters/index.mjs +17 -0
  82. package/dist/formatters/index.mjs.map +1 -0
  83. package/dist/formatters/json.d.mts +56 -0
  84. package/dist/formatters/json.d.mts.map +1 -0
  85. package/dist/formatters/json.mjs +43 -0
  86. package/dist/formatters/json.mjs.map +1 -0
  87. package/dist/formatters/sarif.d.mts +101 -0
  88. package/dist/formatters/sarif.d.mts.map +1 -0
  89. package/dist/formatters/sarif.mjs +163 -0
  90. package/dist/formatters/sarif.mjs.map +1 -0
  91. package/dist/formatters/text.d.mts +35 -0
  92. package/dist/formatters/text.d.mts.map +1 -0
  93. package/dist/formatters/text.mjs +209 -0
  94. package/dist/formatters/text.mjs.map +1 -0
  95. package/dist/index.d.mts +125 -0
  96. package/dist/index.mjs +110 -0
  97. package/dist/ports/ai.d.mts +59 -0
  98. package/dist/ports/ai.d.mts.map +1 -0
  99. package/dist/ports/fs.d.mts +81 -0
  100. package/dist/ports/fs.d.mts.map +1 -0
  101. package/dist/ports/git.d.mts +46 -0
  102. package/dist/ports/git.d.mts.map +1 -0
  103. package/dist/ports/index.d.mts +6 -0
  104. package/dist/ports/logger.d.mts +88 -0
  105. package/dist/ports/logger.d.mts.map +1 -0
  106. package/dist/ports/rulesync.d.mts +38 -0
  107. package/dist/ports/rulesync.d.mts.map +1 -0
  108. package/dist/ports/watcher.d.mts +52 -0
  109. package/dist/ports/watcher.d.mts.map +1 -0
  110. package/dist/services/agent-guide/adapters/claude-code.d.mts +35 -0
  111. package/dist/services/agent-guide/adapters/claude-code.d.mts.map +1 -0
  112. package/dist/services/agent-guide/adapters/claude-code.mjs +144 -0
  113. package/dist/services/agent-guide/adapters/claude-code.mjs.map +1 -0
  114. package/dist/services/agent-guide/adapters/cursor-cli.d.mts +39 -0
  115. package/dist/services/agent-guide/adapters/cursor-cli.d.mts.map +1 -0
  116. package/dist/services/agent-guide/adapters/cursor-cli.mjs +135 -0
  117. package/dist/services/agent-guide/adapters/cursor-cli.mjs.map +1 -0
  118. package/dist/services/agent-guide/adapters/generic-mcp.d.mts +53 -0
  119. package/dist/services/agent-guide/adapters/generic-mcp.d.mts.map +1 -0
  120. package/dist/services/agent-guide/adapters/generic-mcp.mjs +159 -0
  121. package/dist/services/agent-guide/adapters/generic-mcp.mjs.map +1 -0
  122. package/dist/services/agent-guide/adapters/index.d.mts +23 -0
  123. package/dist/services/agent-guide/adapters/index.d.mts.map +1 -0
  124. package/dist/services/agent-guide/adapters/index.mjs +31 -0
  125. package/dist/services/agent-guide/adapters/index.mjs.map +1 -0
  126. package/dist/services/agent-guide/agent-guide-service.d.mts +56 -0
  127. package/dist/services/agent-guide/agent-guide-service.d.mts.map +1 -0
  128. package/dist/services/agent-guide/agent-guide-service.mjs +147 -0
  129. package/dist/services/agent-guide/agent-guide-service.mjs.map +1 -0
  130. package/dist/services/agent-guide/index.d.mts +6 -0
  131. package/dist/services/agent-guide/index.mjs +7 -0
  132. package/dist/services/agent-guide/types.d.mts +58 -0
  133. package/dist/services/agent-guide/types.d.mts.map +1 -0
  134. package/dist/services/build.d.mts +61 -0
  135. package/dist/services/build.d.mts.map +1 -0
  136. package/dist/services/build.mjs +151 -0
  137. package/dist/services/build.mjs.map +1 -0
  138. package/dist/services/ci-check/checks/coverage.mjs +77 -0
  139. package/dist/services/ci-check/checks/coverage.mjs.map +1 -0
  140. package/dist/services/ci-check/checks/deps.mjs +32 -0
  141. package/dist/services/ci-check/checks/deps.mjs.map +1 -0
  142. package/dist/services/ci-check/checks/doctor.mjs +38 -0
  143. package/dist/services/ci-check/checks/doctor.mjs.map +1 -0
  144. package/dist/services/ci-check/checks/drift.mjs +40 -0
  145. package/dist/services/ci-check/checks/drift.mjs.map +1 -0
  146. package/dist/services/ci-check/checks/handlers.mjs +38 -0
  147. package/dist/services/ci-check/checks/handlers.mjs.map +1 -0
  148. package/dist/services/ci-check/checks/implementation.mjs +73 -0
  149. package/dist/services/ci-check/checks/implementation.mjs.map +1 -0
  150. package/dist/services/ci-check/checks/index.mjs +13 -0
  151. package/dist/services/ci-check/checks/integrity.mjs +31 -0
  152. package/dist/services/ci-check/checks/integrity.mjs.map +1 -0
  153. package/dist/services/ci-check/checks/layers.mjs +66 -0
  154. package/dist/services/ci-check/checks/layers.mjs.map +1 -0
  155. package/dist/services/ci-check/checks/structure.mjs +35 -0
  156. package/dist/services/ci-check/checks/structure.mjs.map +1 -0
  157. package/dist/services/ci-check/checks/test-refs.mjs +63 -0
  158. package/dist/services/ci-check/checks/test-refs.mjs.map +1 -0
  159. package/dist/services/ci-check/checks/tests.mjs +38 -0
  160. package/dist/services/ci-check/checks/tests.mjs.map +1 -0
  161. package/dist/services/ci-check/ci-check-service.d.mts +16 -0
  162. package/dist/services/ci-check/ci-check-service.d.mts.map +1 -0
  163. package/dist/services/ci-check/ci-check-service.mjs +129 -0
  164. package/dist/services/ci-check/ci-check-service.mjs.map +1 -0
  165. package/dist/services/ci-check/index.d.mts +2 -0
  166. package/dist/services/ci-check/index.mjs +4 -0
  167. package/dist/services/ci-check/types.d.mts +147 -0
  168. package/dist/services/ci-check/types.d.mts.map +1 -0
  169. package/dist/services/ci-check/types.mjs +37 -0
  170. package/dist/services/ci-check/types.mjs.map +1 -0
  171. package/dist/services/ci-check/utils.mjs +76 -0
  172. package/dist/services/ci-check/utils.mjs.map +1 -0
  173. package/dist/services/clean.d.mts +41 -0
  174. package/dist/services/clean.d.mts.map +1 -0
  175. package/dist/services/clean.mjs +72 -0
  176. package/dist/services/clean.mjs.map +1 -0
  177. package/dist/services/config.d.mts +16 -0
  178. package/dist/services/config.d.mts.map +1 -0
  179. package/dist/services/config.mjs +63 -0
  180. package/dist/services/config.mjs.map +1 -0
  181. package/dist/services/coverage/parsers/index.mjs +34 -0
  182. package/dist/services/coverage/parsers/index.mjs.map +1 -0
  183. package/dist/services/coverage/parsers/istanbul-parser.mjs +108 -0
  184. package/dist/services/coverage/parsers/istanbul-parser.mjs.map +1 -0
  185. package/dist/services/coverage/validator.mjs +55 -0
  186. package/dist/services/coverage/validator.mjs.map +1 -0
  187. package/dist/services/create/ai-generator.d.mts +84 -0
  188. package/dist/services/create/ai-generator.d.mts.map +1 -0
  189. package/dist/services/create/ai-generator.mjs +178 -0
  190. package/dist/services/create/ai-generator.mjs.map +1 -0
  191. package/dist/services/create/index.d.mts +28 -0
  192. package/dist/services/create/index.d.mts.map +1 -0
  193. package/dist/services/create/index.mjs +37 -0
  194. package/dist/services/create/index.mjs.map +1 -0
  195. package/dist/services/create/templates.d.mts +22 -0
  196. package/dist/services/create/templates.d.mts.map +1 -0
  197. package/dist/services/create/templates.mjs +39 -0
  198. package/dist/services/create/templates.mjs.map +1 -0
  199. package/dist/services/deps.d.mts +53 -0
  200. package/dist/services/deps.d.mts.map +1 -0
  201. package/dist/services/deps.mjs +62 -0
  202. package/dist/services/deps.mjs.map +1 -0
  203. package/dist/services/diff.d.mts +34 -0
  204. package/dist/services/diff.d.mts.map +1 -0
  205. package/dist/services/diff.mjs +34 -0
  206. package/dist/services/diff.mjs.map +1 -0
  207. package/dist/services/docs/docs-service.d.mts +20 -0
  208. package/dist/services/docs/docs-service.d.mts.map +1 -0
  209. package/dist/services/docs/docs-service.mjs +59 -0
  210. package/dist/services/docs/docs-service.mjs.map +1 -0
  211. package/dist/services/docs/index.d.mts +1 -0
  212. package/dist/services/docs/index.mjs +3 -0
  213. package/dist/services/doctor/checks/ai.mjs +119 -0
  214. package/dist/services/doctor/checks/ai.mjs.map +1 -0
  215. package/dist/services/doctor/checks/cli.mjs +156 -0
  216. package/dist/services/doctor/checks/cli.mjs.map +1 -0
  217. package/dist/services/doctor/checks/config.mjs +303 -0
  218. package/dist/services/doctor/checks/config.mjs.map +1 -0
  219. package/dist/services/doctor/checks/deps.mjs +267 -0
  220. package/dist/services/doctor/checks/deps.mjs.map +1 -0
  221. package/dist/services/doctor/checks/index.mjs +9 -0
  222. package/dist/services/doctor/checks/layers.mjs +139 -0
  223. package/dist/services/doctor/checks/layers.mjs.map +1 -0
  224. package/dist/services/doctor/checks/mcp.mjs +145 -0
  225. package/dist/services/doctor/checks/mcp.mjs.map +1 -0
  226. package/dist/services/doctor/checks/workspace.mjs +263 -0
  227. package/dist/services/doctor/checks/workspace.mjs.map +1 -0
  228. package/dist/services/doctor/doctor-service.d.mts +24 -0
  229. package/dist/services/doctor/doctor-service.d.mts.map +1 -0
  230. package/dist/services/doctor/doctor-service.mjs +118 -0
  231. package/dist/services/doctor/doctor-service.mjs.map +1 -0
  232. package/dist/services/doctor/index.d.mts +2 -0
  233. package/dist/services/doctor/index.mjs +4 -0
  234. package/dist/services/doctor/types.d.mts +118 -0
  235. package/dist/services/doctor/types.d.mts.map +1 -0
  236. package/dist/services/doctor/types.mjs +29 -0
  237. package/dist/services/doctor/types.mjs.map +1 -0
  238. package/dist/services/drift.mjs +73 -0
  239. package/dist/services/drift.mjs.map +1 -0
  240. package/dist/services/extract.d.mts +12 -0
  241. package/dist/services/extract.d.mts.map +1 -0
  242. package/dist/services/extract.mjs +33 -0
  243. package/dist/services/extract.mjs.map +1 -0
  244. package/dist/services/features/completion.d.mts +21 -0
  245. package/dist/services/features/completion.d.mts.map +1 -0
  246. package/dist/services/features/completion.mjs +70 -0
  247. package/dist/services/features/completion.mjs.map +1 -0
  248. package/dist/services/features/feature-editor.d.mts +27 -0
  249. package/dist/services/features/feature-editor.d.mts.map +1 -0
  250. package/dist/services/features/feature-editor.mjs +37 -0
  251. package/dist/services/features/feature-editor.mjs.map +1 -0
  252. package/dist/services/features/index.d.mts +11 -0
  253. package/dist/services/features/index.d.mts.map +1 -0
  254. package/dist/services/features/index.mjs +16 -0
  255. package/dist/services/features/index.mjs.map +1 -0
  256. package/dist/services/features/validation.d.mts +21 -0
  257. package/dist/services/features/validation.d.mts.map +1 -0
  258. package/dist/services/features/validation.mjs +27 -0
  259. package/dist/services/features/validation.mjs.map +1 -0
  260. package/dist/services/fix/fix-link-formatter.d.mts +12 -0
  261. package/dist/services/fix/fix-link-formatter.d.mts.map +1 -0
  262. package/dist/services/fix/fix-link-formatter.mjs +38 -0
  263. package/dist/services/fix/fix-link-formatter.mjs.map +1 -0
  264. package/dist/services/fix/fix-service.d.mts +74 -0
  265. package/dist/services/fix/fix-service.d.mts.map +1 -0
  266. package/dist/services/fix/fix-service.mjs +169 -0
  267. package/dist/services/fix/fix-service.mjs.map +1 -0
  268. package/dist/services/fix/index.d.mts +16 -0
  269. package/dist/services/fix/index.d.mts.map +1 -0
  270. package/dist/services/fix/index.mjs +24 -0
  271. package/dist/services/fix/index.mjs.map +1 -0
  272. package/dist/services/fix/path-resolver.mjs +83 -0
  273. package/dist/services/fix/path-resolver.mjs.map +1 -0
  274. package/dist/services/fix/schemas.d.mts +17 -0
  275. package/dist/services/fix/schemas.d.mts.map +1 -0
  276. package/dist/services/fix/schemas.mjs +12 -0
  277. package/dist/services/fix/schemas.mjs.map +1 -0
  278. package/dist/services/fix/strategies/implement-ai.d.mts +18 -0
  279. package/dist/services/fix/strategies/implement-ai.d.mts.map +1 -0
  280. package/dist/services/fix/strategies/implement-ai.mjs +139 -0
  281. package/dist/services/fix/strategies/implement-ai.mjs.map +1 -0
  282. package/dist/services/fix/strategies/implement-skeleton.d.mts +14 -0
  283. package/dist/services/fix/strategies/implement-skeleton.d.mts.map +1 -0
  284. package/dist/services/fix/strategies/implement-skeleton.mjs +77 -0
  285. package/dist/services/fix/strategies/implement-skeleton.mjs.map +1 -0
  286. package/dist/services/fix/strategies/index.d.mts +3 -0
  287. package/dist/services/fix/strategies/remove-reference.d.mts +17 -0
  288. package/dist/services/fix/strategies/remove-reference.d.mts.map +1 -0
  289. package/dist/services/fix/strategies/remove-reference.mjs +98 -0
  290. package/dist/services/fix/strategies/remove-reference.mjs.map +1 -0
  291. package/dist/services/fix/types.d.mts +207 -0
  292. package/dist/services/fix/types.d.mts.map +1 -0
  293. package/dist/services/fix/types.mjs +20 -0
  294. package/dist/services/fix/types.mjs.map +1 -0
  295. package/dist/services/formatter.d.mts +15 -0
  296. package/dist/services/formatter.d.mts.map +1 -0
  297. package/dist/services/formatter.mjs +26 -0
  298. package/dist/services/formatter.mjs.map +1 -0
  299. package/dist/services/gap.d.mts +18 -0
  300. package/dist/services/gap.d.mts.map +1 -0
  301. package/dist/services/gap.mjs +44 -0
  302. package/dist/services/gap.mjs.map +1 -0
  303. package/dist/services/generate-artifacts.d.mts +11 -0
  304. package/dist/services/generate-artifacts.d.mts.map +1 -0
  305. package/dist/services/generate-artifacts.mjs +27 -0
  306. package/dist/services/generate-artifacts.mjs.map +1 -0
  307. package/dist/services/hooks/hooks-service.d.mts +24 -0
  308. package/dist/services/hooks/hooks-service.d.mts.map +1 -0
  309. package/dist/services/hooks/hooks-service.mjs +126 -0
  310. package/dist/services/hooks/hooks-service.mjs.map +1 -0
  311. package/dist/services/hooks/index.d.mts +10 -0
  312. package/dist/services/hooks/index.d.mts.map +1 -0
  313. package/dist/services/hooks/index.mjs +12 -0
  314. package/dist/services/hooks/index.mjs.map +1 -0
  315. package/dist/services/hooks/types.d.mts +56 -0
  316. package/dist/services/hooks/types.d.mts.map +1 -0
  317. package/dist/services/impact/formatters.d.mts +27 -0
  318. package/dist/services/impact/formatters.d.mts.map +1 -0
  319. package/dist/services/impact/formatters.mjs +139 -0
  320. package/dist/services/impact/formatters.mjs.map +1 -0
  321. package/dist/services/impact/impact-detection-service.d.mts +22 -0
  322. package/dist/services/impact/impact-detection-service.d.mts.map +1 -0
  323. package/dist/services/impact/impact-detection-service.mjs +96 -0
  324. package/dist/services/impact/impact-detection-service.mjs.map +1 -0
  325. package/dist/services/impact/index.d.mts +11 -0
  326. package/dist/services/impact/index.d.mts.map +1 -0
  327. package/dist/services/impact/index.mjs +16 -0
  328. package/dist/services/impact/index.mjs.map +1 -0
  329. package/dist/services/impact/types.d.mts +63 -0
  330. package/dist/services/impact/types.d.mts.map +1 -0
  331. package/dist/services/implementation/discovery.d.mts +30 -0
  332. package/dist/services/implementation/discovery.d.mts.map +1 -0
  333. package/dist/services/implementation/discovery.mjs +144 -0
  334. package/dist/services/implementation/discovery.mjs.map +1 -0
  335. package/dist/services/implementation/index.d.mts +6 -0
  336. package/dist/services/implementation/index.mjs +7 -0
  337. package/dist/services/implementation/resolver/conventions.d.mts +18 -0
  338. package/dist/services/implementation/resolver/conventions.d.mts.map +1 -0
  339. package/dist/services/implementation/resolver/conventions.mjs +59 -0
  340. package/dist/services/implementation/resolver/conventions.mjs.map +1 -0
  341. package/dist/services/implementation/resolver/index.d.mts +24 -0
  342. package/dist/services/implementation/resolver/index.d.mts.map +1 -0
  343. package/dist/services/implementation/resolver/index.mjs +111 -0
  344. package/dist/services/implementation/resolver/index.mjs.map +1 -0
  345. package/dist/services/implementation/resolver/parsers.d.mts +16 -0
  346. package/dist/services/implementation/resolver/parsers.d.mts.map +1 -0
  347. package/dist/services/implementation/resolver/parsers.mjs +100 -0
  348. package/dist/services/implementation/resolver/parsers.mjs.map +1 -0
  349. package/dist/services/implementation/resolver/status.d.mts +21 -0
  350. package/dist/services/implementation/resolver/status.d.mts.map +1 -0
  351. package/dist/services/implementation/resolver/status.mjs +31 -0
  352. package/dist/services/implementation/resolver/status.mjs.map +1 -0
  353. package/dist/services/implementation/types.d.mts +89 -0
  354. package/dist/services/implementation/types.d.mts.map +1 -0
  355. package/dist/services/index.d.mts +103 -0
  356. package/dist/services/index.mjs +100 -0
  357. package/dist/services/integrity-diagram.d.mts +36 -0
  358. package/dist/services/integrity-diagram.d.mts.map +1 -0
  359. package/dist/services/integrity-diagram.mjs +275 -0
  360. package/dist/services/integrity-diagram.mjs.map +1 -0
  361. package/dist/services/integrity.d.mts +152 -0
  362. package/dist/services/integrity.d.mts.map +1 -0
  363. package/dist/services/integrity.mjs +361 -0
  364. package/dist/services/integrity.mjs.map +1 -0
  365. package/dist/services/layer-discovery.d.mts +77 -0
  366. package/dist/services/layer-discovery.d.mts.map +1 -0
  367. package/dist/services/layer-discovery.mjs +121 -0
  368. package/dist/services/layer-discovery.mjs.map +1 -0
  369. package/dist/services/list.d.mts +37 -0
  370. package/dist/services/list.d.mts.map +1 -0
  371. package/dist/services/list.mjs +46 -0
  372. package/dist/services/list.mjs.map +1 -0
  373. package/dist/services/llm/index.d.mts +28 -0
  374. package/dist/services/llm/index.d.mts.map +1 -0
  375. package/dist/services/llm/index.mjs +187 -0
  376. package/dist/services/llm/index.mjs.map +1 -0
  377. package/dist/services/llm/verify-static.d.mts +26 -0
  378. package/dist/services/llm/verify-static.d.mts.map +1 -0
  379. package/dist/services/llm/verify-static.mjs +82 -0
  380. package/dist/services/llm/verify-static.mjs.map +1 -0
  381. package/dist/services/modules/module-resolver.mjs +61 -0
  382. package/dist/services/modules/module-resolver.mjs.map +1 -0
  383. package/dist/services/openapi/export-service.d.mts +53 -0
  384. package/dist/services/openapi/export-service.d.mts.map +1 -0
  385. package/dist/services/openapi/export-service.mjs +50 -0
  386. package/dist/services/openapi/export-service.mjs.map +1 -0
  387. package/dist/services/openapi/import-service.d.mts +17 -0
  388. package/dist/services/openapi/import-service.d.mts.map +1 -0
  389. package/dist/services/openapi/import-service.mjs +168 -0
  390. package/dist/services/openapi/import-service.mjs.map +1 -0
  391. package/dist/services/openapi/index.d.mts +5 -0
  392. package/dist/services/openapi/index.mjs +6 -0
  393. package/dist/services/openapi/sync-service.d.mts +17 -0
  394. package/dist/services/openapi/sync-service.d.mts.map +1 -0
  395. package/dist/services/openapi/sync-service.mjs +120 -0
  396. package/dist/services/openapi/sync-service.mjs.map +1 -0
  397. package/dist/services/openapi/types.d.mts +162 -0
  398. package/dist/services/openapi/types.d.mts.map +1 -0
  399. package/dist/services/openapi/validate-service.d.mts +16 -0
  400. package/dist/services/openapi/validate-service.d.mts.map +1 -0
  401. package/dist/services/openapi/validate-service.mjs +130 -0
  402. package/dist/services/openapi/validate-service.mjs.map +1 -0
  403. package/dist/services/quickstart/dependencies.d.mts +31 -0
  404. package/dist/services/quickstart/dependencies.d.mts.map +1 -0
  405. package/dist/services/quickstart/dependencies.mjs +57 -0
  406. package/dist/services/quickstart/dependencies.mjs.map +1 -0
  407. package/dist/services/quickstart/index.mjs +4 -0
  408. package/dist/services/quickstart/quickstart-service.d.mts +20 -0
  409. package/dist/services/quickstart/quickstart-service.d.mts.map +1 -0
  410. package/dist/services/quickstart/quickstart-service.mjs +196 -0
  411. package/dist/services/quickstart/quickstart-service.mjs.map +1 -0
  412. package/dist/services/quickstart/types.d.mts +81 -0
  413. package/dist/services/quickstart/types.d.mts.map +1 -0
  414. package/dist/services/regenerator.d.mts +18 -0
  415. package/dist/services/regenerator.d.mts.map +1 -0
  416. package/dist/services/regenerator.mjs +23 -0
  417. package/dist/services/regenerator.mjs.map +1 -0
  418. package/dist/services/registry.d.mts +53 -0
  419. package/dist/services/registry.d.mts.map +1 -0
  420. package/dist/services/registry.mjs +74 -0
  421. package/dist/services/registry.mjs.map +1 -0
  422. package/dist/services/rulesync.d.mts +17 -0
  423. package/dist/services/rulesync.d.mts.map +1 -0
  424. package/dist/services/rulesync.mjs +71 -0
  425. package/dist/services/rulesync.mjs.map +1 -0
  426. package/dist/services/setup/config-generators.d.mts +42 -0
  427. package/dist/services/setup/config-generators.d.mts.map +1 -0
  428. package/dist/services/setup/config-generators.mjs +252 -0
  429. package/dist/services/setup/config-generators.mjs.map +1 -0
  430. package/dist/services/setup/file-merger.d.mts +27 -0
  431. package/dist/services/setup/file-merger.d.mts.map +1 -0
  432. package/dist/services/setup/file-merger.mjs +61 -0
  433. package/dist/services/setup/file-merger.mjs.map +1 -0
  434. package/dist/services/setup/setup-service.d.mts +12 -0
  435. package/dist/services/setup/setup-service.d.mts.map +1 -0
  436. package/dist/services/setup/setup-service.mjs +96 -0
  437. package/dist/services/setup/setup-service.mjs.map +1 -0
  438. package/dist/services/setup/targets/agents-md.mjs +47 -0
  439. package/dist/services/setup/targets/agents-md.mjs.map +1 -0
  440. package/dist/services/setup/targets/cli-config.mjs +60 -0
  441. package/dist/services/setup/targets/cli-config.mjs.map +1 -0
  442. package/dist/services/setup/targets/cursor-rules.mjs +48 -0
  443. package/dist/services/setup/targets/cursor-rules.mjs.map +1 -0
  444. package/dist/services/setup/targets/mcp-claude.mjs +60 -0
  445. package/dist/services/setup/targets/mcp-claude.mjs.map +1 -0
  446. package/dist/services/setup/targets/mcp-cursor.mjs +59 -0
  447. package/dist/services/setup/targets/mcp-cursor.mjs.map +1 -0
  448. package/dist/services/setup/targets/vscode-settings.mjs +63 -0
  449. package/dist/services/setup/targets/vscode-settings.mjs.map +1 -0
  450. package/dist/services/setup/types.d.mts +85 -0
  451. package/dist/services/setup/types.d.mts.map +1 -0
  452. package/dist/services/setup/types.mjs +27 -0
  453. package/dist/services/setup/types.mjs.map +1 -0
  454. package/dist/services/sync.d.mts +42 -0
  455. package/dist/services/sync.d.mts.map +1 -0
  456. package/dist/services/sync.mjs +64 -0
  457. package/dist/services/sync.mjs.map +1 -0
  458. package/dist/services/test/index.d.mts +2 -0
  459. package/dist/services/test/index.mjs +4 -0
  460. package/dist/services/test/test-generator-service.d.mts +24 -0
  461. package/dist/services/test/test-generator-service.d.mts.map +1 -0
  462. package/dist/services/test/test-generator-service.mjs +92 -0
  463. package/dist/services/test/test-generator-service.mjs.map +1 -0
  464. package/dist/services/test/test-service.d.mts +27 -0
  465. package/dist/services/test/test-service.d.mts.map +1 -0
  466. package/dist/services/test/test-service.mjs +94 -0
  467. package/dist/services/test/test-service.mjs.map +1 -0
  468. package/dist/services/test-link/index.d.mts +18 -0
  469. package/dist/services/test-link/index.d.mts.map +1 -0
  470. package/dist/services/test-link/index.mjs +60 -0
  471. package/dist/services/test-link/index.mjs.map +1 -0
  472. package/dist/services/test-link/test-ref-validator.d.mts +2 -0
  473. package/dist/services/test-link/test-ref-validator.mjs +50 -0
  474. package/dist/services/test-link/test-ref-validator.mjs.map +1 -0
  475. package/dist/services/upgrade/index.d.mts +10 -0
  476. package/dist/services/upgrade/index.d.mts.map +1 -0
  477. package/dist/services/upgrade/index.mjs +15 -0
  478. package/dist/services/upgrade/index.mjs.map +1 -0
  479. package/dist/services/upgrade/types.d.mts +78 -0
  480. package/dist/services/upgrade/types.d.mts.map +1 -0
  481. package/dist/services/upgrade/upgrade-service.d.mts +38 -0
  482. package/dist/services/upgrade/upgrade-service.d.mts.map +1 -0
  483. package/dist/services/upgrade/upgrade-service.mjs +201 -0
  484. package/dist/services/upgrade/upgrade-service.mjs.map +1 -0
  485. package/dist/services/validate/blueprint-validator.d.mts +23 -0
  486. package/dist/services/validate/blueprint-validator.d.mts.map +1 -0
  487. package/dist/services/validate/blueprint-validator.mjs +50 -0
  488. package/dist/services/validate/blueprint-validator.mjs.map +1 -0
  489. package/dist/services/validate/implementation-agent-validator.d.mts +20 -0
  490. package/dist/services/validate/implementation-agent-validator.d.mts.map +1 -0
  491. package/dist/services/validate/implementation-agent-validator.mjs +42 -0
  492. package/dist/services/validate/implementation-agent-validator.mjs.map +1 -0
  493. package/dist/services/validate/implementation-validator.d.mts +32 -0
  494. package/dist/services/validate/implementation-validator.d.mts.map +1 -0
  495. package/dist/services/validate/implementation-validator.mjs +64 -0
  496. package/dist/services/validate/implementation-validator.mjs.map +1 -0
  497. package/dist/services/validate/index.d.mts +5 -0
  498. package/dist/services/validate/index.mjs +7 -0
  499. package/dist/services/validate/spec-validator.d.mts +42 -0
  500. package/dist/services/validate/spec-validator.d.mts.map +1 -0
  501. package/dist/services/validate/spec-validator.mjs +49 -0
  502. package/dist/services/validate/spec-validator.mjs.map +1 -0
  503. package/dist/services/validate/tenant-validator.d.mts +21 -0
  504. package/dist/services/validate/tenant-validator.d.mts.map +1 -0
  505. package/dist/services/validate/tenant-validator.mjs +165 -0
  506. package/dist/services/validate/tenant-validator.mjs.map +1 -0
  507. package/dist/services/verification-cache/adapters/filesystem.d.mts +46 -0
  508. package/dist/services/verification-cache/adapters/filesystem.d.mts.map +1 -0
  509. package/dist/services/verification-cache/adapters/filesystem.mjs +120 -0
  510. package/dist/services/verification-cache/adapters/filesystem.mjs.map +1 -0
  511. package/dist/services/verification-cache/adapters/in-memory.d.mts +27 -0
  512. package/dist/services/verification-cache/adapters/in-memory.d.mts.map +1 -0
  513. package/dist/services/verification-cache/adapters/in-memory.mjs +46 -0
  514. package/dist/services/verification-cache/adapters/in-memory.mjs.map +1 -0
  515. package/dist/services/verification-cache/adapters/index.d.mts +3 -0
  516. package/dist/services/verification-cache/adapters/index.mjs +5 -0
  517. package/dist/services/verification-cache/adapters/workspace-state.d.mts +49 -0
  518. package/dist/services/verification-cache/adapters/workspace-state.d.mts.map +1 -0
  519. package/dist/services/verification-cache/adapters/workspace-state.mjs +91 -0
  520. package/dist/services/verification-cache/adapters/workspace-state.mjs.map +1 -0
  521. package/dist/services/verification-cache/cache-service.d.mts +70 -0
  522. package/dist/services/verification-cache/cache-service.d.mts.map +1 -0
  523. package/dist/services/verification-cache/cache-service.mjs +256 -0
  524. package/dist/services/verification-cache/cache-service.mjs.map +1 -0
  525. package/dist/services/verification-cache/index.d.mts +6 -0
  526. package/dist/services/verification-cache/index.mjs +8 -0
  527. package/dist/services/verification-cache/types.d.mts +124 -0
  528. package/dist/services/verification-cache/types.d.mts.map +1 -0
  529. package/dist/services/verification-cache/types.mjs +16 -0
  530. package/dist/services/verification-cache/types.mjs.map +1 -0
  531. package/dist/services/verify/ai-verifier.d.mts +25 -0
  532. package/dist/services/verify/ai-verifier.d.mts.map +1 -0
  533. package/dist/services/verify/ai-verifier.mjs +403 -0
  534. package/dist/services/verify/ai-verifier.mjs.map +1 -0
  535. package/dist/services/verify/behavior-verifier.d.mts +12 -0
  536. package/dist/services/verify/behavior-verifier.d.mts.map +1 -0
  537. package/dist/services/verify/behavior-verifier.mjs +186 -0
  538. package/dist/services/verify/behavior-verifier.mjs.map +1 -0
  539. package/dist/services/verify/index.d.mts +5 -0
  540. package/dist/services/verify/index.mjs +6 -0
  541. package/dist/services/verify/structure-verifier.d.mts +12 -0
  542. package/dist/services/verify/structure-verifier.d.mts.map +1 -0
  543. package/dist/services/verify/structure-verifier.mjs +196 -0
  544. package/dist/services/verify/structure-verifier.mjs.map +1 -0
  545. package/dist/services/verify/types.d.mts +137 -0
  546. package/dist/services/verify/types.d.mts.map +1 -0
  547. package/dist/services/verify/verify-service.d.mts +60 -0
  548. package/dist/services/verify/verify-service.d.mts.map +1 -0
  549. package/dist/services/verify/verify-service.mjs +204 -0
  550. package/dist/services/verify/verify-service.mjs.map +1 -0
  551. package/dist/services/versioning/changelog-formatter.d.mts +24 -0
  552. package/dist/services/versioning/changelog-formatter.d.mts.map +1 -0
  553. package/dist/services/versioning/changelog-formatter.mjs +155 -0
  554. package/dist/services/versioning/changelog-formatter.mjs.map +1 -0
  555. package/dist/services/versioning/conventional-commits.d.mts +95 -0
  556. package/dist/services/versioning/conventional-commits.d.mts.map +1 -0
  557. package/dist/services/versioning/conventional-commits.mjs +184 -0
  558. package/dist/services/versioning/conventional-commits.mjs.map +1 -0
  559. package/dist/services/versioning/index.d.mts +12 -0
  560. package/dist/services/versioning/index.d.mts.map +1 -0
  561. package/dist/services/versioning/index.mjs +28 -0
  562. package/dist/services/versioning/index.mjs.map +1 -0
  563. package/dist/services/versioning/types.d.mts +135 -0
  564. package/dist/services/versioning/types.d.mts.map +1 -0
  565. package/dist/services/versioning/versioning-service.d.mts +74 -0
  566. package/dist/services/versioning/versioning-service.d.mts.map +1 -0
  567. package/dist/services/versioning/versioning-service.mjs +501 -0
  568. package/dist/services/versioning/versioning-service.mjs.map +1 -0
  569. package/dist/services/vibe/config.d.mts +12 -0
  570. package/dist/services/vibe/config.d.mts.map +1 -0
  571. package/dist/services/vibe/config.mjs +43 -0
  572. package/dist/services/vibe/config.mjs.map +1 -0
  573. package/dist/services/vibe/context.d.mts +19 -0
  574. package/dist/services/vibe/context.d.mts.map +1 -0
  575. package/dist/services/vibe/context.mjs +92 -0
  576. package/dist/services/vibe/context.mjs.map +1 -0
  577. package/dist/services/vibe/definitions.d.mts +8 -0
  578. package/dist/services/vibe/definitions.d.mts.map +1 -0
  579. package/dist/services/vibe/definitions.mjs +129 -0
  580. package/dist/services/vibe/definitions.mjs.map +1 -0
  581. package/dist/services/vibe/engine.d.mts +44 -0
  582. package/dist/services/vibe/engine.d.mts.map +1 -0
  583. package/dist/services/vibe/engine.mjs +147 -0
  584. package/dist/services/vibe/engine.mjs.map +1 -0
  585. package/dist/services/vibe/index.d.mts +15 -0
  586. package/dist/services/vibe/index.d.mts.map +1 -0
  587. package/dist/services/vibe/index.mjs +26 -0
  588. package/dist/services/vibe/index.mjs.map +1 -0
  589. package/dist/services/vibe/loader.d.mts +15 -0
  590. package/dist/services/vibe/loader.d.mts.map +1 -0
  591. package/dist/services/vibe/loader.mjs +48 -0
  592. package/dist/services/vibe/loader.mjs.map +1 -0
  593. package/dist/services/vibe/pack.d.mts +19 -0
  594. package/dist/services/vibe/pack.d.mts.map +1 -0
  595. package/dist/services/vibe/pack.mjs +66 -0
  596. package/dist/services/vibe/pack.mjs.map +1 -0
  597. package/dist/services/vibe/types.d.mts +59 -0
  598. package/dist/services/vibe/types.d.mts.map +1 -0
  599. package/dist/services/vibe/types.mjs +12 -0
  600. package/dist/services/vibe/types.mjs.map +1 -0
  601. package/dist/services/view/index.d.mts +11 -0
  602. package/dist/services/view/index.d.mts.map +1 -0
  603. package/dist/services/view/index.mjs +119 -0
  604. package/dist/services/view/index.mjs.map +1 -0
  605. package/dist/services/watch.d.mts +25 -0
  606. package/dist/services/watch.d.mts.map +1 -0
  607. package/dist/services/watch.mjs +33 -0
  608. package/dist/services/watch.mjs.map +1 -0
  609. package/dist/services/workspace-info.d.mts +62 -0
  610. package/dist/services/workspace-info.d.mts.map +1 -0
  611. package/dist/services/workspace-info.mjs +103 -0
  612. package/dist/services/workspace-info.mjs.map +1 -0
  613. package/dist/templates/app-config.template.d.mts +7 -0
  614. package/dist/templates/app-config.template.d.mts.map +1 -0
  615. package/dist/templates/app-config.template.mjs +107 -0
  616. package/dist/templates/app-config.template.mjs.map +1 -0
  617. package/dist/templates/data-view.template.d.mts +7 -0
  618. package/dist/templates/data-view.template.d.mts.map +1 -0
  619. package/dist/templates/data-view.template.mjs +70 -0
  620. package/dist/templates/data-view.template.mjs.map +1 -0
  621. package/dist/templates/event.template.d.mts +11 -0
  622. package/dist/templates/event.template.d.mts.map +1 -0
  623. package/dist/templates/event.template.mjs +42 -0
  624. package/dist/templates/event.template.mjs.map +1 -0
  625. package/dist/templates/experiment.template.d.mts +7 -0
  626. package/dist/templates/experiment.template.d.mts.map +1 -0
  627. package/dist/templates/experiment.template.mjs +89 -0
  628. package/dist/templates/experiment.template.mjs.map +1 -0
  629. package/dist/templates/feature.template.d.mts +33 -0
  630. package/dist/templates/feature.template.d.mts.map +1 -0
  631. package/dist/templates/feature.template.mjs +52 -0
  632. package/dist/templates/feature.template.mjs.map +1 -0
  633. package/dist/templates/fix/skeleton-capability.mjs +49 -0
  634. package/dist/templates/fix/skeleton-capability.mjs.map +1 -0
  635. package/dist/templates/fix/skeleton-event.mjs +56 -0
  636. package/dist/templates/fix/skeleton-event.mjs.map +1 -0
  637. package/dist/templates/fix/skeleton-operation.mjs +122 -0
  638. package/dist/templates/fix/skeleton-operation.mjs.map +1 -0
  639. package/dist/templates/fix/skeleton-presentation.mjs +65 -0
  640. package/dist/templates/fix/skeleton-presentation.mjs.map +1 -0
  641. package/dist/templates/fix/utils.mjs +34 -0
  642. package/dist/templates/fix/utils.mjs.map +1 -0
  643. package/dist/templates/handler.template.d.mts +16 -0
  644. package/dist/templates/handler.template.d.mts.map +1 -0
  645. package/dist/templates/handler.template.mjs +100 -0
  646. package/dist/templates/handler.template.mjs.map +1 -0
  647. package/dist/templates/index.d.mts +22 -0
  648. package/dist/templates/index.d.mts.map +1 -0
  649. package/dist/templates/index.mjs +39 -0
  650. package/dist/templates/index.mjs.map +1 -0
  651. package/dist/templates/integration.template.d.mts +7 -0
  652. package/dist/templates/integration.template.d.mts.map +1 -0
  653. package/dist/templates/integration.template.mjs +160 -0
  654. package/dist/templates/integration.template.mjs.map +1 -0
  655. package/dist/templates/knowledge.template.d.mts +7 -0
  656. package/dist/templates/knowledge.template.d.mts.map +1 -0
  657. package/dist/templates/knowledge.template.mjs +75 -0
  658. package/dist/templates/knowledge.template.mjs.map +1 -0
  659. package/dist/templates/migration.template.d.mts +7 -0
  660. package/dist/templates/migration.template.d.mts.map +1 -0
  661. package/dist/templates/migration.template.mjs +62 -0
  662. package/dist/templates/migration.template.mjs.map +1 -0
  663. package/dist/templates/operation.template.d.mts +11 -0
  664. package/dist/templates/operation.template.d.mts.map +1 -0
  665. package/dist/templates/operation.template.mjs +107 -0
  666. package/dist/templates/operation.template.mjs.map +1 -0
  667. package/dist/templates/presentation.template.d.mts +11 -0
  668. package/dist/templates/presentation.template.d.mts.map +1 -0
  669. package/dist/templates/presentation.template.mjs +80 -0
  670. package/dist/templates/presentation.template.mjs.map +1 -0
  671. package/dist/templates/telemetry.template.d.mts +7 -0
  672. package/dist/templates/telemetry.template.d.mts.map +1 -0
  673. package/dist/templates/telemetry.template.mjs +91 -0
  674. package/dist/templates/telemetry.template.mjs.map +1 -0
  675. package/dist/templates/workflow-runner.template.d.mts +16 -0
  676. package/dist/templates/workflow-runner.template.d.mts.map +1 -0
  677. package/dist/templates/workflow-runner.template.mjs +50 -0
  678. package/dist/templates/workflow-runner.template.mjs.map +1 -0
  679. package/dist/templates/workflow.template.d.mts +7 -0
  680. package/dist/templates/workflow.template.d.mts.map +1 -0
  681. package/dist/templates/workflow.template.mjs +69 -0
  682. package/dist/templates/workflow.template.mjs.map +1 -0
  683. package/dist/types/config.d.mts +34 -0
  684. package/dist/types/config.d.mts.map +1 -0
  685. package/dist/types.d.mts +324 -0
  686. package/dist/types.d.mts.map +1 -0
  687. package/dist/utils/filter.d.mts +16 -0
  688. package/dist/utils/filter.d.mts.map +1 -0
  689. package/dist/utils/filter.mjs +22 -0
  690. package/dist/utils/filter.mjs.map +1 -0
  691. package/dist/utils/index.d.mts +11 -0
  692. package/dist/utils/index.d.mts.map +1 -0
  693. package/dist/utils/index.mjs +20 -0
  694. package/dist/utils/index.mjs.map +1 -0
  695. package/dist/utils/module-loader.d.mts +5 -0
  696. package/dist/utils/module-loader.d.mts.map +1 -0
  697. package/dist/utils/module-loader.mjs +41 -0
  698. package/dist/utils/module-loader.mjs.map +1 -0
  699. package/dist/utils/validation.d.mts +37 -0
  700. package/dist/utils/validation.d.mts.map +1 -0
  701. package/dist/utils/validation.mjs +43 -0
  702. package/dist/utils/validation.mjs.map +1 -0
  703. package/package.json +76 -0
@@ -0,0 +1,501 @@
1
+ import { findPackageRoot, getPackageName } from "../../adapters/workspace.mjs";
2
+ import { formatChangelogJson, formatKeepAChangelog } from "./changelog-formatter.mjs";
3
+ import { commitsToChangeEntries, getHighestBumpType, parseConventionalCommit } from "./conventional-commits.mjs";
4
+ import { bumpVersion, determineBumpType } from "@contractspec/lib.contracts";
5
+
6
+ //#region src/services/versioning/versioning-service.ts
7
+ /**
8
+ * Versioning service.
9
+ *
10
+ * Provides version analysis, version bumping, and changelog generation
11
+ * for ContractSpec specs.
12
+ */
13
+ /**
14
+ * Analyze specs and suggest version bumps based on changes.
15
+ *
16
+ * Compares the current state against a baseline (git ref) and determines
17
+ * which specs need version bumps based on detected changes.
18
+ */
19
+ async function analyzeVersions(adapters, options = {}) {
20
+ const { fs, git, logger } = adapters;
21
+ const workspaceRoot = options.workspaceRoot ?? process.cwd();
22
+ logger.info("Starting version analysis...", { baseline: options.baseline });
23
+ const pattern = options.pattern ?? "**/*.{operation,event,presentation}.ts";
24
+ const specFiles = (await fs.glob({
25
+ pattern,
26
+ cwd: workspaceRoot
27
+ })).filter((f) => !f.includes(".test.") && !f.includes(".spec.") && !f.includes("node_modules"));
28
+ logger.debug(`Found ${specFiles.length} spec files`);
29
+ const analyses = [];
30
+ let totalBreaking = 0;
31
+ let totalNonBreaking = 0;
32
+ for (const specPath of specFiles) try {
33
+ const currentContent = await fs.readFile(specPath);
34
+ const currentMeta = extractSpecMeta(currentContent);
35
+ if (!currentMeta) continue;
36
+ let baselineContent = null;
37
+ if (options.baseline) try {
38
+ baselineContent = await git.showFile(options.baseline, specPath);
39
+ } catch {
40
+ baselineContent = null;
41
+ }
42
+ const changes = analyzeSpecChanges(currentContent, baselineContent);
43
+ const hasBreaking = changes.some((c) => c.type === "breaking");
44
+ const hasNonBreaking = changes.length > 0 && !hasBreaking;
45
+ const needsBump = changes.length > 0;
46
+ if (hasBreaking) totalBreaking++;
47
+ if (hasNonBreaking) totalNonBreaking++;
48
+ const bumpType = determineBumpType(hasBreaking, hasNonBreaking);
49
+ const suggestedVersion = needsBump ? bumpVersion(currentMeta.version, bumpType) : currentMeta.version;
50
+ analyses.push({
51
+ specPath,
52
+ specKey: currentMeta.key,
53
+ currentVersion: currentMeta.version,
54
+ suggestedVersion,
55
+ bumpType,
56
+ changes,
57
+ hasBreaking,
58
+ needsBump
59
+ });
60
+ } catch (error) {
61
+ logger.warn(`Failed to analyze ${specPath}:`, { error: error instanceof Error ? error.message : String(error) });
62
+ }
63
+ const specsNeedingBump = analyses.filter((a) => a.needsBump).length;
64
+ logger.info("Version analysis complete", {
65
+ totalSpecs: analyses.length,
66
+ specsNeedingBump,
67
+ totalBreaking,
68
+ totalNonBreaking
69
+ });
70
+ return {
71
+ analyses,
72
+ totalSpecs: analyses.length,
73
+ specsNeedingBump,
74
+ totalBreaking,
75
+ totalNonBreaking,
76
+ baseline: options.baseline
77
+ };
78
+ }
79
+ /**
80
+ * Analyze version bump based on git commits.
81
+ *
82
+ * Parses conventional commits since the baseline and determines
83
+ * the appropriate version bump type.
84
+ */
85
+ async function analyzeVersionsFromCommits(adapters, options = {}) {
86
+ const { git, logger } = adapters;
87
+ const baseline = options.baseline ?? "HEAD~10";
88
+ logger.info("Analyzing commits for version bump...", { baseline });
89
+ try {
90
+ const commitLog = await git.log(baseline);
91
+ const parsedCommits = [];
92
+ const conventionalCommits = [];
93
+ for (const commit of commitLog) {
94
+ const parsed = parseConventionalCommit(commit.message);
95
+ if (parsed) {
96
+ parsedCommits.push({
97
+ hash: commit.hash,
98
+ message: commit.message,
99
+ type: parsed.type,
100
+ scope: parsed.scope,
101
+ breaking: parsed.breaking
102
+ });
103
+ conventionalCommits.push(parsed);
104
+ }
105
+ }
106
+ const suggestedBumpType = getHighestBumpType(conventionalCommits);
107
+ const changes = commitsToChangeEntries(conventionalCommits);
108
+ const breakingCommits = parsedCommits.filter((c) => c.breaking).length;
109
+ logger.info("Commit analysis complete", {
110
+ totalCommits: parsedCommits.length,
111
+ breakingCommits,
112
+ suggestedBumpType
113
+ });
114
+ return {
115
+ suggestedBumpType,
116
+ commits: parsedCommits,
117
+ changes,
118
+ totalCommits: parsedCommits.length,
119
+ breakingCommits
120
+ };
121
+ } catch (error) {
122
+ logger.warn("Failed to analyze commits", { error: error instanceof Error ? error.message : String(error) });
123
+ return {
124
+ suggestedBumpType: null,
125
+ commits: [],
126
+ changes: [],
127
+ totalCommits: 0,
128
+ breakingCommits: 0
129
+ };
130
+ }
131
+ }
132
+ /**
133
+ * Apply a version bump to a spec file.
134
+ *
135
+ * Updates the version in the spec file and creates a changelog entry.
136
+ */
137
+ async function applyVersionBump(adapters, options) {
138
+ const { fs, logger } = adapters;
139
+ const { specPath, dryRun = false, config } = options;
140
+ logger.info("Applying version bump...", {
141
+ specPath,
142
+ bumpType: options.bumpType
143
+ });
144
+ try {
145
+ const content = await fs.readFile(specPath);
146
+ const meta = extractSpecMeta(content);
147
+ if (!meta) return {
148
+ success: false,
149
+ specPath,
150
+ specKey: "unknown",
151
+ previousVersion: "unknown",
152
+ newVersion: "unknown",
153
+ bumpType: "patch",
154
+ changelogEntry: createEmptyChangelogEntry(),
155
+ error: "Could not extract spec metadata"
156
+ };
157
+ const bumpType = options.bumpType ?? "patch";
158
+ const newVersion = bumpVersion(meta.version, bumpType);
159
+ const changes = options.changes ?? [];
160
+ if (options.changeDescription) changes.push({
161
+ type: bumpType === "major" ? "breaking" : "changed",
162
+ description: options.changeDescription
163
+ });
164
+ const changelogEntry = {
165
+ version: newVersion,
166
+ date: (/* @__PURE__ */ new Date()).toISOString().split("T")[0] ?? "",
167
+ bumpType,
168
+ changes,
169
+ breakingChanges: changes.filter((c) => c.type === "breaking")
170
+ };
171
+ if (!dryRun) {
172
+ const updatedContent = updateSpecVersion(content, meta.version, newVersion);
173
+ await fs.writeFile(specPath, updatedContent);
174
+ }
175
+ logger.info("Version bump applied", {
176
+ specPath,
177
+ previousVersion: meta.version,
178
+ newVersion
179
+ });
180
+ if (config?.integrateWithChangesets) await generateChangeset(adapters, {
181
+ specPath,
182
+ bumpType,
183
+ summary: options.changeDescription ?? `Bump ${meta.key} to ${newVersion}`,
184
+ dryRun
185
+ });
186
+ return {
187
+ success: true,
188
+ specPath,
189
+ specKey: meta.key,
190
+ previousVersion: meta.version,
191
+ newVersion,
192
+ bumpType,
193
+ changelogEntry
194
+ };
195
+ } catch (error) {
196
+ const errorMessage = error instanceof Error ? error.message : String(error);
197
+ logger.error("Version bump failed", {
198
+ specPath,
199
+ error: errorMessage
200
+ });
201
+ return {
202
+ success: false,
203
+ specPath,
204
+ specKey: "unknown",
205
+ previousVersion: "unknown",
206
+ newVersion: "unknown",
207
+ bumpType: options.bumpType ?? "patch",
208
+ changelogEntry: createEmptyChangelogEntry(),
209
+ error: errorMessage
210
+ };
211
+ }
212
+ }
213
+ /**
214
+ * Generate changelogs at all configured tiers.
215
+ */
216
+ async function generateChangelogs(adapters, options = {}) {
217
+ const { logger } = adapters;
218
+ const tiers = options.tiers ?? [
219
+ "spec",
220
+ "library",
221
+ "monorepo"
222
+ ];
223
+ const format = options.format ?? "keep-a-changelog";
224
+ logger.info("Generating changelogs...", {
225
+ tiers,
226
+ format
227
+ });
228
+ const analysis = await analyzeVersions(adapters, {
229
+ baseline: options.baseline,
230
+ workspaceRoot: options.workspaceRoot
231
+ });
232
+ const specChangelogs = [];
233
+ const libraryMarkdown = /* @__PURE__ */ new Map();
234
+ let monorepoMarkdown = "";
235
+ let totalEntries = 0;
236
+ if (tiers.includes("spec")) for (const spec of analysis.analyses.filter((a) => a.needsBump)) {
237
+ const docBlock = {
238
+ id: `changelog.${spec.specKey}`,
239
+ title: `Changelog for ${spec.specKey}`,
240
+ body: formatSpecChangelog(spec),
241
+ kind: "changelog",
242
+ specKey: spec.specKey,
243
+ specVersion: spec.suggestedVersion,
244
+ entries: [{
245
+ version: spec.suggestedVersion,
246
+ date: (/* @__PURE__ */ new Date()).toISOString().split("T")[0] ?? "",
247
+ bumpType: spec.bumpType,
248
+ changes: spec.changes,
249
+ breakingChanges: spec.changes.filter((c) => c.type === "breaking")
250
+ }]
251
+ };
252
+ specChangelogs.push(docBlock);
253
+ totalEntries++;
254
+ }
255
+ if (tiers.includes("library")) {
256
+ const libraryGroups = groupByLibrary(analysis.analyses);
257
+ for (const [libPath, specs] of libraryGroups) {
258
+ const entries = specs.filter((s) => s.needsBump);
259
+ if (entries.length > 0) {
260
+ libraryMarkdown.set(libPath, formatKeepAChangelog(entries.map(specToChangelogEntry)));
261
+ totalEntries += entries.length;
262
+ }
263
+ }
264
+ }
265
+ if (tiers.includes("monorepo")) monorepoMarkdown = formatKeepAChangelog(analysis.analyses.filter((a) => a.needsBump).map(specToChangelogEntry));
266
+ const json = formatChangelogJson(analysis, options.baseline);
267
+ logger.info("Changelog generation complete", { totalEntries });
268
+ return {
269
+ specChangelogs,
270
+ libraryMarkdown,
271
+ monorepoMarkdown,
272
+ json,
273
+ totalEntries
274
+ };
275
+ }
276
+ /**
277
+ * Extract spec metadata from file content.
278
+ */
279
+ function extractSpecMeta(content) {
280
+ const keyMatch = content.match(/key:\s*['"`]([^'"`]+)['"`]/);
281
+ const versionMatch = content.match(/version:\s*['"`]([^'"`]+)['"`]/);
282
+ if (!keyMatch || !versionMatch) return null;
283
+ const key = keyMatch[1];
284
+ const version = versionMatch[1];
285
+ if (!key || !version) return null;
286
+ return {
287
+ key,
288
+ version
289
+ };
290
+ }
291
+ /**
292
+ * Analyze changes between current and baseline spec content.
293
+ */
294
+ function analyzeSpecChanges(current, baseline) {
295
+ const changes = [];
296
+ if (!baseline) {
297
+ changes.push({
298
+ type: "added",
299
+ description: "New spec added"
300
+ });
301
+ return changes;
302
+ }
303
+ const currentMeta = extractSpecMeta(current);
304
+ const baselineMeta = extractSpecMeta(baseline);
305
+ if (!currentMeta || !baselineMeta) return changes;
306
+ if (currentMeta.version !== baselineMeta.version) changes.push({
307
+ type: "changed",
308
+ description: `Version updated from ${baselineMeta.version} to ${currentMeta.version}`,
309
+ path: "meta.version"
310
+ });
311
+ const hasIoChanges = detectIoChanges(current, baseline);
312
+ if (hasIoChanges.breaking) changes.push({
313
+ type: "breaking",
314
+ description: "Breaking changes to input/output schema",
315
+ path: "io"
316
+ });
317
+ else if (hasIoChanges.nonBreaking) changes.push({
318
+ type: "changed",
319
+ description: "Non-breaking changes to input/output schema",
320
+ path: "io"
321
+ });
322
+ return changes;
323
+ }
324
+ /**
325
+ * Detect I/O changes between specs (simplified).
326
+ */
327
+ function detectIoChanges(current, baseline) {
328
+ const ioPattern = /io:\s*\{[\s\S]*?\}/;
329
+ const currentIo = current.match(ioPattern)?.[0] ?? "";
330
+ const baselineIo = baseline.match(ioPattern)?.[0] ?? "";
331
+ if (currentIo === baselineIo) return {
332
+ breaking: false,
333
+ nonBreaking: false
334
+ };
335
+ const currentFields = extractFields(currentIo);
336
+ const baselineFields = extractFields(baselineIo);
337
+ const removedFields = baselineFields.filter((f) => !currentFields.includes(f));
338
+ const addedFields = currentFields.filter((f) => !baselineFields.includes(f));
339
+ return {
340
+ breaking: removedFields.length > 0,
341
+ nonBreaking: addedFields.length > 0 && removedFields.length === 0
342
+ };
343
+ }
344
+ /**
345
+ * Extract field names from a code block (simplified).
346
+ */
347
+ function extractFields(code) {
348
+ return [...code.matchAll(/(\w+):/g)].map((m) => m[1]).filter((field) => !!field);
349
+ }
350
+ /**
351
+ * Update version in spec content.
352
+ */
353
+ function updateSpecVersion(content, oldVersion, newVersion) {
354
+ return content.replace(/* @__PURE__ */ new RegExp(`version:\\s*['"\`]${oldVersion}['"\`]`), `version: '${newVersion}'`);
355
+ }
356
+ /**
357
+ * Create an empty changelog entry.
358
+ */
359
+ function createEmptyChangelogEntry() {
360
+ return {
361
+ version: "0.0.0",
362
+ date: (/* @__PURE__ */ new Date()).toISOString().split("T")[0] ?? "",
363
+ bumpType: "patch",
364
+ changes: []
365
+ };
366
+ }
367
+ /**
368
+ * Format a single spec's changelog.
369
+ */
370
+ function formatSpecChangelog(spec) {
371
+ const lines = [`## [${spec.suggestedVersion}] - ${(/* @__PURE__ */ new Date()).toISOString().split("T")[0]}`, ""];
372
+ const breaking = spec.changes.filter((c) => c.type === "breaking");
373
+ const changed = spec.changes.filter((c) => c.type === "changed");
374
+ const added = spec.changes.filter((c) => c.type === "added");
375
+ if (breaking.length > 0) {
376
+ lines.push("### Breaking Changes");
377
+ breaking.forEach((c) => lines.push(`- ${c.description}`));
378
+ lines.push("");
379
+ }
380
+ if (added.length > 0) {
381
+ lines.push("### Added");
382
+ added.forEach((c) => lines.push(`- ${c.description}`));
383
+ lines.push("");
384
+ }
385
+ if (changed.length > 0) {
386
+ lines.push("### Changed");
387
+ changed.forEach((c) => lines.push(`- ${c.description}`));
388
+ lines.push("");
389
+ }
390
+ return lines.join("\n");
391
+ }
392
+ /**
393
+ * Group specs by library (package path).
394
+ */
395
+ function groupByLibrary(analyses) {
396
+ const groups = /* @__PURE__ */ new Map();
397
+ for (const analysis of analyses) {
398
+ const libPath = analysis.specPath.match(/(.+?\/src\/)/)?.[1] ?? analysis.specPath;
399
+ const existing = groups.get(libPath) ?? [];
400
+ existing.push(analysis);
401
+ groups.set(libPath, existing);
402
+ }
403
+ return groups;
404
+ }
405
+ /**
406
+ * Convert SpecVersionAnalysis to ChangelogEntry.
407
+ */
408
+ function specToChangelogEntry(spec) {
409
+ return {
410
+ version: spec.suggestedVersion,
411
+ date: (/* @__PURE__ */ new Date()).toISOString().split("T")[0] ?? "",
412
+ bumpType: spec.bumpType,
413
+ changes: spec.changes,
414
+ breakingChanges: spec.changes.filter((c) => c.type === "breaking")
415
+ };
416
+ }
417
+ /**
418
+ * Generate a changeset file for a spec update.
419
+ */
420
+ async function generateChangeset(adapters, options) {
421
+ const { fs, logger } = adapters;
422
+ const { specPath, bumpType, summary, dryRun } = options;
423
+ try {
424
+ const pkgRoot = findPackageRoot(specPath);
425
+ const pkgName = getPackageName(pkgRoot);
426
+ if (!pkgName) {
427
+ logger.warn("Could not determine package name for changeset", { specPath });
428
+ return;
429
+ }
430
+ let currentDir = pkgRoot;
431
+ let changesetDir = null;
432
+ while (true) {
433
+ const candidate = fs.join(currentDir, ".changeset");
434
+ if (await fs.exists(candidate)) {
435
+ changesetDir = candidate;
436
+ break;
437
+ }
438
+ const parent = fs.dirname(currentDir);
439
+ if (parent === currentDir) break;
440
+ currentDir = parent;
441
+ }
442
+ if (!changesetDir) {
443
+ logger.warn("No .changeset directory found, skipping changeset generation");
444
+ return;
445
+ }
446
+ const fileName = `${generateRandomName()}.md`;
447
+ const filePath = fs.join(changesetDir, fileName);
448
+ const content = `---
449
+ "${pkgName}": ${bumpType}
450
+ ---
451
+
452
+ ${summary}
453
+ `;
454
+ if (!dryRun) {
455
+ await fs.writeFile(filePath, content);
456
+ logger.info("Generated changeset", { filePath });
457
+ } else logger.info("Would generate changeset", {
458
+ filePath,
459
+ content
460
+ });
461
+ } catch (error) {
462
+ logger.error("Failed to generate changeset", { error: error instanceof Error ? error.message : String(error) });
463
+ }
464
+ }
465
+ /**
466
+ * Generate a random human-readable-ish name (simplified).
467
+ */
468
+ function generateRandomName() {
469
+ const adjectives = [
470
+ "neat",
471
+ "calm",
472
+ "wild",
473
+ "soft",
474
+ "bold",
475
+ "fair",
476
+ "cool"
477
+ ];
478
+ const nouns = [
479
+ "fox",
480
+ "cat",
481
+ "dog",
482
+ "bat",
483
+ "ant",
484
+ "elk",
485
+ "owl"
486
+ ];
487
+ const verbs = [
488
+ "run",
489
+ "fly",
490
+ "hop",
491
+ "eat",
492
+ "nap",
493
+ "cry",
494
+ "sing"
495
+ ];
496
+ return `${adjectives[Math.floor(Math.random() * adjectives.length)]}-${nouns[Math.floor(Math.random() * nouns.length)]}-${verbs[Math.floor(Math.random() * verbs.length)]}-${Math.floor(Math.random() * 1e3)}`;
497
+ }
498
+
499
+ //#endregion
500
+ export { analyzeVersions, analyzeVersionsFromCommits, applyVersionBump, generateChangelogs };
501
+ //# sourceMappingURL=versioning-service.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versioning-service.mjs","names":[],"sources":["../../../src/services/versioning/versioning-service.ts"],"sourcesContent":["/**\n * Versioning service.\n *\n * Provides version analysis, version bumping, and changelog generation\n * for ContractSpec specs.\n */\n\nimport {\n bumpVersion,\n determineBumpType,\n type ChangeEntry,\n type ChangelogEntry,\n type ChangelogDocBlock,\n type VersionBumpType,\n} from '@contractspec/lib.contracts';\nimport { findPackageRoot, getPackageName } from '../../adapters/workspace';\nimport type { FsAdapter } from '../../ports/fs';\nimport type { GitAdapter } from '../../ports/git';\nimport type { LoggerAdapter } from '../../ports/logger';\nimport type {\n VersionAnalyzeOptions,\n VersionAnalyzeResult,\n VersionBumpOptions,\n VersionBumpResult,\n ChangelogGenerateOptions,\n ChangelogGenerateResult,\n SpecVersionAnalysis,\n} from './types';\nimport {\n formatKeepAChangelog,\n formatChangelogJson,\n} from './changelog-formatter';\nimport {\n parseConventionalCommit,\n getHighestBumpType,\n commitsToChangeEntries,\n} from './conventional-commits';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Adapters Type\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface ServiceAdapters {\n fs: FsAdapter;\n git: GitAdapter;\n logger: LoggerAdapter;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Version Analysis\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Analyze specs and suggest version bumps based on changes.\n *\n * Compares the current state against a baseline (git ref) and determines\n * which specs need version bumps based on detected changes.\n */\nexport async function analyzeVersions(\n adapters: ServiceAdapters,\n options: VersionAnalyzeOptions = {}\n): Promise<VersionAnalyzeResult> {\n const { fs, git, logger } = adapters;\n const workspaceRoot = options.workspaceRoot ?? process.cwd();\n\n logger.info('Starting version analysis...', { baseline: options.baseline });\n\n // Discover spec files\n const pattern = options.pattern ?? '**/*.{operation,event,presentation}.ts';\n const files = await fs.glob({ pattern, cwd: workspaceRoot });\n\n const specFiles = files.filter(\n (f) =>\n !f.includes('.test.') &&\n !f.includes('.spec.') &&\n !f.includes('node_modules')\n );\n\n logger.debug(`Found ${specFiles.length} spec files`);\n\n const analyses: SpecVersionAnalysis[] = [];\n let totalBreaking = 0;\n let totalNonBreaking = 0;\n\n for (const specPath of specFiles) {\n try {\n // Read current spec\n const currentContent = await fs.readFile(specPath);\n const currentMeta = extractSpecMeta(currentContent);\n\n if (!currentMeta) {\n continue; // Skip files that don't have valid spec meta\n }\n\n // Get baseline content if baseline specified\n let baselineContent: string | null = null;\n if (options.baseline) {\n try {\n baselineContent = await git.showFile(options.baseline, specPath);\n } catch {\n // File doesn't exist in baseline (new file)\n baselineContent = null;\n }\n }\n\n // Analyze changes\n const changes = analyzeSpecChanges(currentContent, baselineContent);\n const hasBreaking = changes.some((c) => c.type === 'breaking');\n const hasNonBreaking = changes.length > 0 && !hasBreaking;\n const needsBump = changes.length > 0;\n\n if (hasBreaking) totalBreaking++;\n if (hasNonBreaking) totalNonBreaking++;\n\n const bumpType = determineBumpType(hasBreaking, hasNonBreaking);\n const suggestedVersion = needsBump\n ? bumpVersion(currentMeta.version, bumpType)\n : currentMeta.version;\n\n analyses.push({\n specPath,\n specKey: currentMeta.key,\n currentVersion: currentMeta.version,\n suggestedVersion,\n bumpType,\n changes,\n hasBreaking,\n needsBump,\n });\n } catch (error) {\n logger.warn(`Failed to analyze ${specPath}:`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n const specsNeedingBump = analyses.filter((a) => a.needsBump).length;\n\n logger.info('Version analysis complete', {\n totalSpecs: analyses.length,\n specsNeedingBump,\n totalBreaking,\n totalNonBreaking,\n });\n\n return {\n analyses,\n totalSpecs: analyses.length,\n specsNeedingBump,\n totalBreaking,\n totalNonBreaking,\n baseline: options.baseline,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Commit-Based Version Analysis\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Options for commit-based version analysis.\n */\nexport interface CommitAnalyzeOptions {\n /** Git ref to compare against (branch, tag, commit) */\n baseline?: string;\n /** Workspace root directory */\n workspaceRoot?: string;\n /** Include commits matching these paths (glob patterns) */\n include?: string[];\n /** Exclude commits matching these paths (glob patterns) */\n exclude?: string[];\n}\n\n/**\n * Result of commit-based version analysis.\n */\nexport interface CommitAnalyzeResult {\n /** Suggested bump type based on commits */\n suggestedBumpType: VersionBumpType | null;\n /** Parsed conventional commits */\n commits: {\n hash: string;\n message: string;\n type: string;\n scope?: string;\n breaking: boolean;\n }[];\n /** Change entries for changelog */\n changes: ChangeEntry[];\n /** Total commits analyzed */\n totalCommits: number;\n /** Breaking commits count */\n breakingCommits: number;\n}\n\n/**\n * Analyze version bump based on git commits.\n *\n * Parses conventional commits since the baseline and determines\n * the appropriate version bump type.\n */\nexport async function analyzeVersionsFromCommits(\n adapters: ServiceAdapters,\n options: CommitAnalyzeOptions = {}\n): Promise<CommitAnalyzeResult> {\n const { git, logger } = adapters;\n const baseline = options.baseline ?? 'HEAD~10';\n\n logger.info('Analyzing commits for version bump...', { baseline });\n\n try {\n // Get commit messages since baseline\n const commitLog = await git.log(baseline);\n\n const parsedCommits: CommitAnalyzeResult['commits'] = [];\n const conventionalCommits = [];\n\n for (const commit of commitLog) {\n const parsed = parseConventionalCommit(commit.message);\n\n if (parsed) {\n parsedCommits.push({\n hash: commit.hash,\n message: commit.message,\n type: parsed.type,\n scope: parsed.scope,\n breaking: parsed.breaking,\n });\n conventionalCommits.push(parsed);\n }\n }\n\n const suggestedBumpType = getHighestBumpType(conventionalCommits);\n const changes = commitsToChangeEntries(conventionalCommits);\n const breakingCommits = parsedCommits.filter((c) => c.breaking).length;\n\n logger.info('Commit analysis complete', {\n totalCommits: parsedCommits.length,\n breakingCommits,\n suggestedBumpType,\n });\n\n return {\n suggestedBumpType,\n commits: parsedCommits,\n changes,\n totalCommits: parsedCommits.length,\n breakingCommits,\n };\n } catch (error) {\n logger.warn('Failed to analyze commits', {\n error: error instanceof Error ? error.message : String(error),\n });\n\n return {\n suggestedBumpType: null,\n commits: [],\n changes: [],\n totalCommits: 0,\n breakingCommits: 0,\n };\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Version Bump\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Apply a version bump to a spec file.\n *\n * Updates the version in the spec file and creates a changelog entry.\n */\nexport async function applyVersionBump(\n adapters: ServiceAdapters,\n options: VersionBumpOptions\n): Promise<VersionBumpResult> {\n const { fs, logger } = adapters;\n const { specPath, dryRun = false, config } = options;\n\n logger.info('Applying version bump...', {\n specPath,\n bumpType: options.bumpType,\n });\n\n try {\n // Read current spec\n const content = await fs.readFile(specPath);\n const meta = extractSpecMeta(content);\n\n if (!meta) {\n return {\n success: false,\n specPath,\n specKey: 'unknown',\n previousVersion: 'unknown',\n newVersion: 'unknown',\n bumpType: 'patch',\n changelogEntry: createEmptyChangelogEntry(),\n error: 'Could not extract spec metadata',\n };\n }\n\n // Determine bump type\n const bumpType = options.bumpType ?? 'patch';\n const newVersion = bumpVersion(meta.version, bumpType);\n\n // Create changelog entry\n const changes: ChangeEntry[] = options.changes ?? [];\n if (options.changeDescription) {\n changes.push({\n type: bumpType === 'major' ? 'breaking' : 'changed',\n description: options.changeDescription,\n });\n }\n\n const changelogEntry: ChangelogEntry = {\n version: newVersion,\n date: new Date().toISOString().split('T')[0] ?? '',\n bumpType,\n changes,\n breakingChanges: changes.filter((c) => c.type === 'breaking'),\n };\n\n // Update the spec file\n if (!dryRun) {\n const updatedContent = updateSpecVersion(\n content,\n meta.version,\n newVersion\n );\n await fs.writeFile(specPath, updatedContent);\n }\n\n logger.info('Version bump applied', {\n specPath,\n previousVersion: meta.version,\n newVersion,\n });\n\n // Generate changeset if enabled\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((config as any)?.integrateWithChangesets) {\n await generateChangeset(adapters, {\n specPath,\n bumpType,\n summary:\n options.changeDescription ?? `Bump ${meta.key} to ${newVersion}`,\n dryRun,\n });\n }\n\n return {\n success: true,\n specPath,\n specKey: meta.key,\n previousVersion: meta.version,\n newVersion,\n bumpType,\n changelogEntry,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error('Version bump failed', { specPath, error: errorMessage });\n\n return {\n success: false,\n specPath,\n specKey: 'unknown',\n previousVersion: 'unknown',\n newVersion: 'unknown',\n bumpType: options.bumpType ?? 'patch',\n changelogEntry: createEmptyChangelogEntry(),\n error: errorMessage,\n };\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Changelog Generation\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generate changelogs at all configured tiers.\n */\nexport async function generateChangelogs(\n adapters: ServiceAdapters,\n options: ChangelogGenerateOptions = {}\n): Promise<ChangelogGenerateResult> {\n const { logger } = adapters;\n const tiers = options.tiers ?? ['spec', 'library', 'monorepo'];\n const format = options.format ?? 'keep-a-changelog';\n\n logger.info('Generating changelogs...', { tiers, format });\n\n // First, analyze versions to get changes\n const analysis = await analyzeVersions(adapters, {\n baseline: options.baseline,\n workspaceRoot: options.workspaceRoot,\n });\n\n const specChangelogs: ChangelogDocBlock[] = [];\n const libraryMarkdown = new Map<string, string>();\n let monorepoMarkdown = '';\n let totalEntries = 0;\n\n // Generate per-spec changelogs\n if (tiers.includes('spec')) {\n for (const spec of analysis.analyses.filter((a) => a.needsBump)) {\n const docBlock: ChangelogDocBlock = {\n id: `changelog.${spec.specKey}`,\n title: `Changelog for ${spec.specKey}`,\n body: formatSpecChangelog(spec),\n kind: 'changelog',\n specKey: spec.specKey,\n specVersion: spec.suggestedVersion,\n entries: [\n {\n version: spec.suggestedVersion,\n date: new Date().toISOString().split('T')[0] ?? '',\n bumpType: spec.bumpType,\n changes: spec.changes,\n breakingChanges: spec.changes.filter((c) => c.type === 'breaking'),\n },\n ],\n };\n specChangelogs.push(docBlock);\n totalEntries++;\n }\n }\n\n // Generate library-level changelogs\n if (tiers.includes('library')) {\n const libraryGroups = groupByLibrary(analysis.analyses);\n for (const [libPath, specs] of libraryGroups) {\n const entries = specs.filter((s) => s.needsBump);\n if (entries.length > 0) {\n libraryMarkdown.set(\n libPath,\n formatKeepAChangelog(entries.map(specToChangelogEntry))\n );\n totalEntries += entries.length;\n }\n }\n }\n\n // Generate monorepo-level changelog\n if (tiers.includes('monorepo')) {\n const allEntries = analysis.analyses\n .filter((a) => a.needsBump)\n .map(specToChangelogEntry);\n monorepoMarkdown = formatKeepAChangelog(allEntries);\n }\n\n // Generate JSON export\n const json = formatChangelogJson(analysis, options.baseline);\n\n logger.info('Changelog generation complete', { totalEntries });\n\n return {\n specChangelogs,\n libraryMarkdown,\n monorepoMarkdown,\n json,\n totalEntries,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface SpecMeta {\n key: string;\n version: string;\n}\n\n/**\n * Extract spec metadata from file content.\n */\nfunction extractSpecMeta(content: string): SpecMeta | null {\n // Match meta.key and meta.version patterns\n const keyMatch = content.match(/key:\\s*['\"`]([^'\"`]+)['\"`]/);\n const versionMatch = content.match(/version:\\s*['\"`]([^'\"`]+)['\"`]/);\n\n if (!keyMatch || !versionMatch) {\n return null;\n }\n\n const key = keyMatch[1];\n const version = versionMatch[1];\n\n // Type guard for regex capture groups\n if (!key || !version) {\n return null;\n }\n\n return {\n key,\n version,\n };\n}\n\n/**\n * Analyze changes between current and baseline spec content.\n */\nfunction analyzeSpecChanges(\n current: string,\n baseline: string | null\n): ChangeEntry[] {\n const changes: ChangeEntry[] = [];\n\n if (!baseline) {\n // New spec\n changes.push({\n type: 'added',\n description: 'New spec added',\n });\n return changes;\n }\n\n // Simple diff analysis - check for structural changes\n const currentMeta = extractSpecMeta(current);\n const baselineMeta = extractSpecMeta(baseline);\n\n if (!currentMeta || !baselineMeta) {\n return changes;\n }\n\n // Version change\n if (currentMeta.version !== baselineMeta.version) {\n changes.push({\n type: 'changed',\n description: `Version updated from ${baselineMeta.version} to ${currentMeta.version}`,\n path: 'meta.version',\n });\n }\n\n // Check for io changes (simplified)\n const hasIoChanges = detectIoChanges(current, baseline);\n if (hasIoChanges.breaking) {\n changes.push({\n type: 'breaking',\n description: 'Breaking changes to input/output schema',\n path: 'io',\n });\n } else if (hasIoChanges.nonBreaking) {\n changes.push({\n type: 'changed',\n description: 'Non-breaking changes to input/output schema',\n path: 'io',\n });\n }\n\n return changes;\n}\n\n/**\n * Detect I/O changes between specs (simplified).\n */\nfunction detectIoChanges(\n current: string,\n baseline: string\n): { breaking: boolean; nonBreaking: boolean } {\n // Simple heuristic: check if io section differs\n const ioPattern = /io:\\s*\\{[\\s\\S]*?\\}/;\n const currentIo = current.match(ioPattern)?.[0] ?? '';\n const baselineIo = baseline.match(ioPattern)?.[0] ?? '';\n\n if (currentIo === baselineIo) {\n return { breaking: false, nonBreaking: false };\n }\n\n // Check for removed fields (breaking) vs added fields (non-breaking)\n const currentFields = extractFields(currentIo);\n const baselineFields = extractFields(baselineIo);\n\n const removedFields = baselineFields.filter(\n (f) => !currentFields.includes(f)\n );\n const addedFields = currentFields.filter((f) => !baselineFields.includes(f));\n\n return {\n breaking: removedFields.length > 0,\n nonBreaking: addedFields.length > 0 && removedFields.length === 0,\n };\n}\n\n/**\n * Extract field names from a code block (simplified).\n */\nfunction extractFields(code: string): string[] {\n const fieldPattern = /(\\w+):/g;\n const matches = [...code.matchAll(fieldPattern)];\n return matches.map((m) => m[1]).filter((field): field is string => !!field);\n}\n\n/**\n * Update version in spec content.\n */\nfunction updateSpecVersion(\n content: string,\n oldVersion: string,\n newVersion: string\n): string {\n return content.replace(\n new RegExp(`version:\\\\s*['\"\\`]${oldVersion}['\"\\`]`),\n `version: '${newVersion}'`\n );\n}\n\n/**\n * Create an empty changelog entry.\n */\nfunction createEmptyChangelogEntry(): ChangelogEntry {\n return {\n version: '0.0.0',\n date: new Date().toISOString().split('T')[0] ?? '',\n bumpType: 'patch',\n changes: [],\n };\n}\n\n/**\n * Format a single spec's changelog.\n */\nfunction formatSpecChangelog(spec: SpecVersionAnalysis): string {\n const lines: string[] = [\n `## [${spec.suggestedVersion}] - ${new Date().toISOString().split('T')[0]}`,\n '',\n ];\n\n const breaking = spec.changes.filter((c) => c.type === 'breaking');\n const changed = spec.changes.filter((c) => c.type === 'changed');\n const added = spec.changes.filter((c) => c.type === 'added');\n\n if (breaking.length > 0) {\n lines.push('### Breaking Changes');\n breaking.forEach((c) => lines.push(`- ${c.description}`));\n lines.push('');\n }\n\n if (added.length > 0) {\n lines.push('### Added');\n added.forEach((c) => lines.push(`- ${c.description}`));\n lines.push('');\n }\n\n if (changed.length > 0) {\n lines.push('### Changed');\n changed.forEach((c) => lines.push(`- ${c.description}`));\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Group specs by library (package path).\n */\nfunction groupByLibrary(\n analyses: SpecVersionAnalysis[]\n): Map<string, SpecVersionAnalysis[]> {\n const groups = new Map<string, SpecVersionAnalysis[]>();\n\n for (const analysis of analyses) {\n // Extract library path (up to src/)\n const libMatch = analysis.specPath.match(/(.+?\\/src\\/)/);\n const matchedPath = libMatch?.[1];\n const libPath = matchedPath ?? analysis.specPath;\n\n const existing = groups.get(libPath) ?? [];\n existing.push(analysis);\n groups.set(libPath, existing);\n }\n\n return groups;\n}\n\n/**\n * Convert SpecVersionAnalysis to ChangelogEntry.\n */\nfunction specToChangelogEntry(spec: SpecVersionAnalysis): ChangelogEntry {\n return {\n version: spec.suggestedVersion,\n date: new Date().toISOString().split('T')[0] ?? '',\n bumpType: spec.bumpType,\n changes: spec.changes,\n breakingChanges: spec.changes.filter((c) => c.type === 'breaking'),\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Changeset Generation\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface GenerateChangesetOptions {\n specPath: string;\n bumpType: VersionBumpType;\n summary: string;\n dryRun?: boolean;\n}\n\n/**\n * Generate a changeset file for a spec update.\n */\nasync function generateChangeset(\n adapters: ServiceAdapters,\n options: GenerateChangesetOptions\n): Promise<void> {\n const { fs, logger } = adapters;\n const { specPath, bumpType, summary, dryRun } = options;\n\n try {\n const pkgRoot = findPackageRoot(specPath);\n const pkgName = getPackageName(pkgRoot);\n\n if (!pkgName) {\n logger.warn('Could not determine package name for changeset', {\n specPath,\n });\n return;\n }\n\n // Find git root to locate .changeset folder\n // This is a simplification; ideally we find the monorepo root\n // We'll walk up from pkgRoot until we find a .changeset folder or hit root\n let currentDir = pkgRoot;\n let changesetDir: string | null = null;\n\n while (true) {\n const candidate = fs.join(currentDir, '.changeset');\n if (await fs.exists(candidate)) {\n changesetDir = candidate;\n break;\n }\n const parent = fs.dirname(currentDir);\n if (parent === currentDir) break;\n currentDir = parent;\n }\n\n if (!changesetDir) {\n // Create .changeset in package root if not found elsewhere (fallback)\n // But typically it initiates in workspace root.\n // We will skip if we absolutely can't find it to avoid polluting non-monorepos unexpected\n logger.warn(\n 'No .changeset directory found, skipping changeset generation'\n );\n return;\n }\n\n const fileName = `${generateRandomName()}.md`;\n const filePath = fs.join(changesetDir, fileName);\n\n const content = `---\n\"${pkgName}\": ${bumpType}\n---\n\n${summary}\n`;\n\n if (!dryRun) {\n await fs.writeFile(filePath, content);\n logger.info('Generated changeset', { filePath });\n } else {\n logger.info('Would generate changeset', { filePath, content });\n }\n } catch (error) {\n logger.error('Failed to generate changeset', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\n/**\n * Generate a random human-readable-ish name (simplified).\n */\nfunction generateRandomName(): string {\n const adjectives = ['neat', 'calm', 'wild', 'soft', 'bold', 'fair', 'cool'];\n const nouns = ['fox', 'cat', 'dog', 'bat', 'ant', 'elk', 'owl'];\n const verbs = ['run', 'fly', 'hop', 'eat', 'nap', 'cry', 'sing'];\n\n const adj = adjectives[Math.floor(Math.random() * adjectives.length)];\n const noun = nouns[Math.floor(Math.random() * nouns.length)];\n const verb = verbs[Math.floor(Math.random() * verbs.length)];\n const random = Math.floor(Math.random() * 1000);\n\n return `${adj}-${noun}-${verb}-${random}`;\n}\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { DEFAULT_VIBE_CONFIG, VibeConfig } from "./types.mjs";
2
+
3
+ //#region src/services/vibe/config.d.ts
4
+
5
+ /**
6
+ * Load vibe configuration from workspace.
7
+ * Merges defaults with any user-provided config.
8
+ */
9
+ declare function loadVibeConfig(cwd?: string): Promise<VibeConfig>;
10
+ //#endregion
11
+ export { loadVibeConfig };
12
+ //# sourceMappingURL=config.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.mts","names":[],"sources":["../../../src/services/vibe/config.ts"],"sourcesContent":[],"mappings":";;;;;;;;iBAoBsB,cAAA,gBAA8B,QAAQ"}
@@ -0,0 +1,43 @@
1
+ import { findWorkspaceRoot } from "../../adapters/workspace.mjs";
2
+ import { DEFAULT_VIBE_CONFIG } from "./types.mjs";
3
+ import { readFile } from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ import { existsSync } from "node:fs";
6
+ import yaml from "js-yaml";
7
+
8
+ //#region src/services/vibe/config.ts
9
+ /**
10
+ * Vibe configuration loader.
11
+ *
12
+ * Loads vibe configuration from .contractspec/vibe/config.* files.
13
+ */
14
+ /**
15
+ * Load vibe configuration from workspace.
16
+ * Merges defaults with any user-provided config.
17
+ */
18
+ async function loadVibeConfig(cwd) {
19
+ const workingDir = cwd ?? process.cwd();
20
+ const root = findWorkspaceRoot(workingDir) ?? workingDir;
21
+ const possiblePaths = [
22
+ join(root, ".contractspec", "vibe", "config.json"),
23
+ join(root, ".contractspec", "vibe", "config.yaml"),
24
+ join(root, ".contractspec", "vibe", "config.yml")
25
+ ];
26
+ let localConfig = {};
27
+ for (const p of possiblePaths) if (existsSync(p)) try {
28
+ const content = await readFile(p, "utf-8");
29
+ if (p.endsWith(".json")) localConfig = JSON.parse(content);
30
+ else localConfig = yaml.load(content);
31
+ break;
32
+ } catch (e) {
33
+ console.warn(`Warning: Failed to parse ${p}`, e);
34
+ }
35
+ return {
36
+ ...DEFAULT_VIBE_CONFIG,
37
+ ...localConfig
38
+ };
39
+ }
40
+
41
+ //#endregion
42
+ export { loadVibeConfig };
43
+ //# sourceMappingURL=config.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.mjs","names":[],"sources":["../../../src/services/vibe/config.ts"],"sourcesContent":["/**\n * Vibe configuration loader.\n *\n * Loads vibe configuration from .contractspec/vibe/config.* files.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport yaml from 'js-yaml';\nimport { findWorkspaceRoot } from '../../adapters/workspace';\nimport type { VibeConfig } from './types';\nimport { DEFAULT_VIBE_CONFIG } from './types';\n\nexport { DEFAULT_VIBE_CONFIG };\n\n/**\n * Load vibe configuration from workspace.\n * Merges defaults with any user-provided config.\n */\nexport async function loadVibeConfig(cwd?: string): Promise<VibeConfig> {\n const workingDir = cwd ?? process.cwd();\n const root = findWorkspaceRoot(workingDir) ?? workingDir;\n\n const possiblePaths = [\n join(root, '.contractspec', 'vibe', 'config.json'),\n join(root, '.contractspec', 'vibe', 'config.yaml'),\n join(root, '.contractspec', 'vibe', 'config.yml'),\n ];\n\n let localConfig: Partial<VibeConfig> = {};\n\n for (const p of possiblePaths) {\n if (existsSync(p)) {\n try {\n const content = await readFile(p, 'utf-8');\n if (p.endsWith('.json')) {\n localConfig = JSON.parse(content);\n } else {\n localConfig = yaml.load(content) as Partial<VibeConfig>;\n }\n break;\n } catch (e) {\n console.warn(`Warning: Failed to parse ${p}`, e);\n }\n }\n }\n\n return { ...DEFAULT_VIBE_CONFIG, ...localConfig };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAoBA,eAAsB,eAAe,KAAmC;CACtE,MAAM,aAAa,OAAO,QAAQ,KAAK;CACvC,MAAM,OAAO,kBAAkB,WAAW,IAAI;CAE9C,MAAM,gBAAgB;EACpB,KAAK,MAAM,iBAAiB,QAAQ,cAAc;EAClD,KAAK,MAAM,iBAAiB,QAAQ,cAAc;EAClD,KAAK,MAAM,iBAAiB,QAAQ,aAAa;EAClD;CAED,IAAI,cAAmC,EAAE;AAEzC,MAAK,MAAM,KAAK,cACd,KAAI,WAAW,EAAE,CACf,KAAI;EACF,MAAM,UAAU,MAAM,SAAS,GAAG,QAAQ;AAC1C,MAAI,EAAE,SAAS,QAAQ,CACrB,eAAc,KAAK,MAAM,QAAQ;MAEjC,eAAc,KAAK,KAAK,QAAQ;AAElC;UACO,GAAG;AACV,UAAQ,KAAK,4BAA4B,KAAK,EAAE;;AAKtD,QAAO;EAAE,GAAG;EAAqB,GAAG;EAAa"}
@@ -0,0 +1,19 @@
1
+ //#region src/services/vibe/context.d.ts
2
+ /**
3
+ * Context export service.
4
+ *
5
+ * Exports a safe context bundle for AI agents.
6
+ */
7
+ interface ContextExportResult {
8
+ success: boolean;
9
+ files: string[];
10
+ indexPath: string;
11
+ error?: string;
12
+ }
13
+ /**
14
+ * Export a context bundle for AI agents.
15
+ */
16
+ declare function exportContext(cwd?: string): Promise<ContextExportResult>;
17
+ //#endregion
18
+ export { ContextExportResult, exportContext };
19
+ //# sourceMappingURL=context.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.mts","names":[],"sources":["../../../src/services/vibe/context.ts"],"sourcesContent":[],"mappings":";;AAwBA;AAUA;;;UAViB,mBAAA;;;;;;;;;iBAUK,aAAA,gBAEnB,QAAQ"}