@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,73 @@
1
+ import { generateArtifacts } from "./generate-artifacts.mjs";
2
+ import { mkdtemp, rm } from "node:fs/promises";
3
+ import path from "path";
4
+ import { tmpdir } from "node:os";
5
+
6
+ //#region src/services/drift.ts
7
+ /**
8
+ * Drift detection service.
9
+ *
10
+ * Detects when generated artifacts are out of sync with their source specs.
11
+ */
12
+ /**
13
+ * Detect drift between generated artifacts and source specs.
14
+ *
15
+ * Generates artifacts to a temporary directory and compares against
16
+ * the existing generated directory to find differences.
17
+ *
18
+ * @param adapters - Workspace adapters for file operations
19
+ * @param contractsDir - Directory containing source contracts
20
+ * @param generatedDir - Directory containing generated artifacts
21
+ * @returns Result indicating if drift exists and which files are affected
22
+ */
23
+ async function detectDrift(adapters, contractsDir, generatedDir) {
24
+ const tempDir = await mkdtemp(path.join(tmpdir(), "contractspec-drift-"));
25
+ try {
26
+ await generateArtifacts(adapters, contractsDir, tempDir);
27
+ const differences = [];
28
+ const fs = await import("node:fs/promises");
29
+ async function getFiles(dir) {
30
+ const dirents = await fs.readdir(dir, { withFileTypes: true });
31
+ const files = [];
32
+ for (const dirent of dirents) {
33
+ const res = path.resolve(dir, dirent.name);
34
+ if (dirent.isDirectory()) files.push(...await getFiles(res));
35
+ else files.push(res);
36
+ }
37
+ return files;
38
+ }
39
+ const getRelativeFiles = async (root) => {
40
+ if (!await fs.stat(root).catch(() => false)) return [];
41
+ return (await getFiles(root)).map((f) => path.relative(root, f)).sort();
42
+ };
43
+ const tempFiles = await getRelativeFiles(tempDir);
44
+ const existingFiles = await getRelativeFiles(generatedDir);
45
+ const allFiles = new Set([...tempFiles, ...existingFiles]);
46
+ for (const file of allFiles) {
47
+ if (!existingFiles.includes(file)) {
48
+ differences.push(file);
49
+ continue;
50
+ }
51
+ if (!tempFiles.includes(file)) {
52
+ differences.push(file);
53
+ continue;
54
+ }
55
+ const tempContent = await fs.readFile(path.join(tempDir, file));
56
+ const existingContent = await fs.readFile(path.join(generatedDir, file));
57
+ if (!tempContent.equals(existingContent)) differences.push(file);
58
+ }
59
+ return {
60
+ hasDrift: differences.length > 0,
61
+ files: differences
62
+ };
63
+ } finally {
64
+ await rm(tempDir, {
65
+ recursive: true,
66
+ force: true
67
+ });
68
+ }
69
+ }
70
+
71
+ //#endregion
72
+ export { detectDrift };
73
+ //# sourceMappingURL=drift.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.mjs","names":[],"sources":["../../src/services/drift.ts"],"sourcesContent":["/**\n * Drift detection service.\n *\n * Detects when generated artifacts are out of sync with their source specs.\n */\n\nimport path from 'path';\nimport { mkdtemp, rm } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport type { WorkspaceAdapters } from '../ports/logger';\nimport { generateArtifacts } from './generate-artifacts';\n\n/**\n * Result of drift detection.\n */\nexport interface DriftResult {\n /** Whether drift was detected. */\n hasDrift: boolean;\n /** Relative paths of files with drift. */\n files: string[];\n}\n\n/**\n * Detect drift between generated artifacts and source specs.\n *\n * Generates artifacts to a temporary directory and compares against\n * the existing generated directory to find differences.\n *\n * @param adapters - Workspace adapters for file operations\n * @param contractsDir - Directory containing source contracts\n * @param generatedDir - Directory containing generated artifacts\n * @returns Result indicating if drift exists and which files are affected\n */\nexport async function detectDrift(\n adapters: WorkspaceAdapters,\n contractsDir: string,\n generatedDir: string\n): Promise<DriftResult> {\n // 1. Create temp directory\n const tempDir = await mkdtemp(path.join(tmpdir(), 'contractspec-drift-'));\n\n try {\n // 2. Generate artifacts to temp dir\n // We assume generateArtifacts mimics the structure of generatedDir inside tempDir\n // But generateArtifacts usage in generate-artifacts.ts is:\n // const docsDir = path.join(generatedDir, 'docs');\n // It uses generatedDir as root.\n\n await generateArtifacts(adapters, contractsDir, tempDir);\n\n // 3. Compare tempDir with generatedDir\n // We only care about files that exist in tempDir (should match generatedDir)\n // AND files in generatedDir that shouldn't be there?\n // \"Generated: configurable generated root..., never hand-edited\"\n // So distinct(temp) == distinct(generated).\n\n const differences: string[] = [];\n\n // Use node:fs for walking directories\n const fs = await import('node:fs/promises');\n\n async function getFiles(dir: string): Promise<string[]> {\n const dirents = await fs.readdir(dir, { withFileTypes: true });\n const files: string[] = [];\n for (const dirent of dirents) {\n const res = path.resolve(dir, dirent.name);\n if (dirent.isDirectory()) {\n files.push(...(await getFiles(res)));\n } else {\n files.push(res);\n }\n }\n return files;\n }\n\n // Get all files from both, relative to root\n const getRelativeFiles = async (root: string) => {\n if (!(await fs.stat(root).catch(() => false))) return [];\n const files = await getFiles(root);\n return files.map((f) => path.relative(root, f)).sort();\n };\n\n const tempFiles = await getRelativeFiles(tempDir);\n const existingFiles = await getRelativeFiles(generatedDir);\n\n const allFiles = new Set([...tempFiles, ...existingFiles]);\n\n for (const file of allFiles) {\n // Files in temp (expected) but not in existing\n if (!existingFiles.includes(file)) {\n differences.push(file); // Missing in existing (drift: outdated/incomplete)\n continue;\n }\n\n // Files in existing but not in temp\n if (!tempFiles.includes(file)) {\n differences.push(file); // Extra file in generated (drift: polluted)\n continue;\n }\n\n // Content comparison\n const tempContent = await fs.readFile(path.join(tempDir, file));\n const existingContent = await fs.readFile(path.join(generatedDir, file));\n\n if (!tempContent.equals(existingContent)) {\n differences.push(file); // Content mismatch\n }\n }\n\n return {\n hasDrift: differences.length > 0,\n files: differences,\n };\n } finally {\n // 4. Cleanup\n await rm(tempDir, { recursive: true, force: true });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAiCA,eAAsB,YACpB,UACA,cACA,cACsB;CAEtB,MAAM,UAAU,MAAM,QAAQ,KAAK,KAAK,QAAQ,EAAE,sBAAsB,CAAC;AAEzE,KAAI;AAOF,QAAM,kBAAkB,UAAU,cAAc,QAAQ;EAQxD,MAAM,cAAwB,EAAE;EAGhC,MAAM,KAAK,MAAM,OAAO;EAExB,eAAe,SAAS,KAAgC;GACtD,MAAM,UAAU,MAAM,GAAG,QAAQ,KAAK,EAAE,eAAe,MAAM,CAAC;GAC9D,MAAM,QAAkB,EAAE;AAC1B,QAAK,MAAM,UAAU,SAAS;IAC5B,MAAM,MAAM,KAAK,QAAQ,KAAK,OAAO,KAAK;AAC1C,QAAI,OAAO,aAAa,CACtB,OAAM,KAAK,GAAI,MAAM,SAAS,IAAI,CAAE;QAEpC,OAAM,KAAK,IAAI;;AAGnB,UAAO;;EAIT,MAAM,mBAAmB,OAAO,SAAiB;AAC/C,OAAI,CAAE,MAAM,GAAG,KAAK,KAAK,CAAC,YAAY,MAAM,CAAG,QAAO,EAAE;AAExD,WADc,MAAM,SAAS,KAAK,EACrB,KAAK,MAAM,KAAK,SAAS,MAAM,EAAE,CAAC,CAAC,MAAM;;EAGxD,MAAM,YAAY,MAAM,iBAAiB,QAAQ;EACjD,MAAM,gBAAgB,MAAM,iBAAiB,aAAa;EAE1D,MAAM,WAAW,IAAI,IAAI,CAAC,GAAG,WAAW,GAAG,cAAc,CAAC;AAE1D,OAAK,MAAM,QAAQ,UAAU;AAE3B,OAAI,CAAC,cAAc,SAAS,KAAK,EAAE;AACjC,gBAAY,KAAK,KAAK;AACtB;;AAIF,OAAI,CAAC,UAAU,SAAS,KAAK,EAAE;AAC7B,gBAAY,KAAK,KAAK;AACtB;;GAIF,MAAM,cAAc,MAAM,GAAG,SAAS,KAAK,KAAK,SAAS,KAAK,CAAC;GAC/D,MAAM,kBAAkB,MAAM,GAAG,SAAS,KAAK,KAAK,cAAc,KAAK,CAAC;AAExE,OAAI,CAAC,YAAY,OAAO,gBAAgB,CACtC,aAAY,KAAK,KAAK;;AAI1B,SAAO;GACL,UAAU,YAAY,SAAS;GAC/B,OAAO;GACR;WACO;AAER,QAAM,GAAG,SAAS;GAAE,WAAW;GAAM,OAAO;GAAM,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { WorkspaceAdapters } from "../ports/logger.mjs";
2
+ import { OpenApiImportServiceResult } from "./openapi/types.mjs";
3
+
4
+ //#region src/services/extract.d.ts
5
+ interface ExtractOptions {
6
+ source: string;
7
+ outputDir: string;
8
+ }
9
+ declare function extractContracts(adapters: WorkspaceAdapters, options: ExtractOptions, cwd?: string): Promise<OpenApiImportServiceResult>;
10
+ //#endregion
11
+ export { ExtractOptions, extractContracts };
12
+ //# sourceMappingURL=extract.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.mts","names":[],"sources":["../../src/services/extract.ts"],"sourcesContent":[],"mappings":";;;;UAKiB,cAAA;;EAAA,SAAA,EAAA,MAAc;AAK/B;AACY,iBADU,gBAAA,CACV,QAAA,EAAA,iBAAA,EAAA,OAAA,EACD,cADC,EAAA,GAAA,CAAA,EAAA,MAAA,CAAA,EAGT,OAHS,CAGD,0BAHC,CAAA"}
@@ -0,0 +1,33 @@
1
+ import { loadWorkspaceConfig } from "./config.mjs";
2
+ import { importFromOpenApiService } from "./openapi/import-service.mjs";
3
+ import "./openapi/index.mjs";
4
+
5
+ //#region src/services/extract.ts
6
+ async function extractContracts(adapters, options, cwd) {
7
+ const { fs, logger } = adapters;
8
+ const { source, outputDir } = options;
9
+ const sourcePath = fs.resolve(cwd ?? process.cwd(), source);
10
+ if (!await fs.exists(sourcePath)) throw new Error(`Source file not found: ${sourcePath}`);
11
+ const config = await loadWorkspaceConfig(fs, cwd);
12
+ const conventions = {
13
+ models: "models",
14
+ groupByFeature: false,
15
+ ...config.conventions
16
+ };
17
+ const runConfig = {
18
+ ...config,
19
+ outputDir,
20
+ schemaFormat: config.schemaFormat ?? "zod",
21
+ conventions
22
+ };
23
+ logger.info(`Extracting contracts from ${sourcePath} to ${outputDir}`);
24
+ return importFromOpenApiService(runConfig, {
25
+ source: sourcePath,
26
+ outputDir,
27
+ dryRun: false
28
+ }, adapters);
29
+ }
30
+
31
+ //#endregion
32
+ export { extractContracts };
33
+ //# sourceMappingURL=extract.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.mjs","names":[],"sources":["../../src/services/extract.ts"],"sourcesContent":["import type { WorkspaceAdapters } from '../ports/logger';\nimport { loadWorkspaceConfig } from './config';\nimport { importFromOpenApiService } from './openapi/index';\nimport type { OpenApiImportServiceResult } from './openapi/types';\n\nexport interface ExtractOptions {\n source: string;\n outputDir: string;\n}\n\nexport async function extractContracts(\n adapters: WorkspaceAdapters,\n options: ExtractOptions,\n cwd?: string\n): Promise<OpenApiImportServiceResult> {\n const { fs, logger } = adapters;\n const { source, outputDir } = options;\n\n // Verify source existence\n // We resolve source relative to CWD if checking locally, or absolute\n const sourcePath = fs.resolve(cwd ?? process.cwd(), source);\n if (!(await fs.exists(sourcePath))) {\n throw new Error(`Source file not found: ${sourcePath}`);\n }\n\n // Load Base Config\n const config = await loadWorkspaceConfig(fs, cwd);\n\n // Override config if needed or pass as options to import service\n // importFromOpenApiService takes (contractsrcConfig, importOptions, adapters)\n // We need to merge outputDir override if present.\n const conventions = {\n models: 'models',\n groupByFeature: false,\n ...config.conventions,\n };\n\n const runConfig = {\n ...config,\n outputDir: outputDir, // CLI/Option override\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schemaFormat: (config as any).schemaFormat ?? 'zod',\n conventions,\n };\n\n logger.info(`Extracting contracts from ${sourcePath} to ${outputDir}`);\n\n return importFromOpenApiService(\n runConfig,\n {\n source: sourcePath,\n outputDir: outputDir,\n dryRun: false,\n },\n adapters\n );\n}\n"],"mappings":";;;;;AAUA,eAAsB,iBACpB,UACA,SACA,KACqC;CACrC,MAAM,EAAE,IAAI,WAAW;CACvB,MAAM,EAAE,QAAQ,cAAc;CAI9B,MAAM,aAAa,GAAG,QAAQ,OAAO,QAAQ,KAAK,EAAE,OAAO;AAC3D,KAAI,CAAE,MAAM,GAAG,OAAO,WAAW,CAC/B,OAAM,IAAI,MAAM,0BAA0B,aAAa;CAIzD,MAAM,SAAS,MAAM,oBAAoB,IAAI,IAAI;CAKjD,MAAM,cAAc;EAClB,QAAQ;EACR,gBAAgB;EAChB,GAAG,OAAO;EACX;CAED,MAAM,YAAY;EAChB,GAAG;EACQ;EAEX,cAAe,OAAe,gBAAgB;EAC9C;EACD;AAED,QAAO,KAAK,6BAA6B,WAAW,MAAM,YAAY;AAEtE,QAAO,yBACL,WACA;EACE,QAAQ;EACG;EACX,QAAQ;EACT,EACD,SACD"}
@@ -0,0 +1,21 @@
1
+ import { AnalyzedSpecType } from "@contractspec/module.workspace";
2
+
3
+ //#region src/services/features/completion.d.ts
4
+
5
+ /**
6
+ * Result of context detection.
7
+ */
8
+ interface FeatureContext {
9
+ type: 'operations' | 'events' | 'presentations';
10
+ specType: AnalyzedSpecType;
11
+ }
12
+ /**
13
+ * Detect which array context the cursor is in within a feature file.
14
+ *
15
+ * @param textBeforeCursor Text from start of file to cursor position.
16
+ * @param textAfterCursor Text from cursor position to end of file (or reasonable lookahead).
17
+ */
18
+ declare function detectFeatureContext(textBeforeCursor: string, textAfterCursor: string): FeatureContext | null;
19
+ //#endregion
20
+ export { FeatureContext, detectFeatureContext };
21
+ //# sourceMappingURL=completion.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.mts","names":[],"sources":["../../../src/services/features/completion.ts"],"sourcesContent":[],"mappings":";;;;;;AAKA;AAWgB,UAXC,cAAA,CAWmB;;YATxB;;;;;;;;iBASI,oBAAA,qDAGb"}
@@ -0,0 +1,70 @@
1
+ //#region src/services/features/completion.ts
2
+ /**
3
+ * Detect which array context the cursor is in within a feature file.
4
+ *
5
+ * @param textBeforeCursor Text from start of file to cursor position.
6
+ * @param textAfterCursor Text from cursor position to end of file (or reasonable lookahead).
7
+ */
8
+ function detectFeatureContext(textBeforeCursor, textAfterCursor) {
9
+ const patterns = [
10
+ {
11
+ type: "operations",
12
+ regex: /operations\s*:\s*\[/g,
13
+ specType: "operation"
14
+ },
15
+ {
16
+ type: "events",
17
+ regex: /events\s*:\s*\[/g,
18
+ specType: "event"
19
+ },
20
+ {
21
+ type: "presentations",
22
+ regex: /presentations\s*:\s*\[/g,
23
+ specType: "presentation"
24
+ }
25
+ ];
26
+ let lastMatch = null;
27
+ for (const { type, regex, specType } of patterns) {
28
+ let match;
29
+ regex.lastIndex = 0;
30
+ while ((match = regex.exec(textBeforeCursor)) !== null) if (!lastMatch || match.index > lastMatch.index) lastMatch = {
31
+ type,
32
+ specType,
33
+ index: match.index
34
+ };
35
+ }
36
+ if (!lastMatch) return null;
37
+ const relevantText = textBeforeCursor.slice(lastMatch.index) + textAfterCursor;
38
+ const typeStr = lastMatch.type;
39
+ (/* @__PURE__ */ new RegExp(`${typeStr}\\s*:\\s*\\[`)).exec(relevantText);
40
+ const textFromMatch = textBeforeCursor.slice(lastMatch.index);
41
+ let depth = 0;
42
+ let inString = false;
43
+ let stringChar = "";
44
+ for (let i = 0; i < textFromMatch.length; i++) {
45
+ const char = textFromMatch[i];
46
+ const prevChar = i > 0 ? textFromMatch[i - 1] : "";
47
+ if ((char === "\"" || char === "'" || char === "`") && prevChar !== "\\") {
48
+ if (!inString) {
49
+ inString = true;
50
+ stringChar = char;
51
+ } else if (char === stringChar) inString = false;
52
+ continue;
53
+ }
54
+ if (inString) continue;
55
+ if (char === "[") depth++;
56
+ else if (char === "]") {
57
+ depth--;
58
+ if (depth === 0) return null;
59
+ }
60
+ }
61
+ if (depth > 0) return {
62
+ type: lastMatch.type,
63
+ specType: lastMatch.specType
64
+ };
65
+ return null;
66
+ }
67
+
68
+ //#endregion
69
+ export { detectFeatureContext };
70
+ //# sourceMappingURL=completion.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.mjs","names":[],"sources":["../../../src/services/features/completion.ts"],"sourcesContent":["import type { AnalyzedSpecType } from '@contractspec/module.workspace';\n\n/**\n * Result of context detection.\n */\nexport interface FeatureContext {\n type: 'operations' | 'events' | 'presentations';\n specType: AnalyzedSpecType;\n}\n\n/**\n * Detect which array context the cursor is in within a feature file.\n *\n * @param textBeforeCursor Text from start of file to cursor position.\n * @param textAfterCursor Text from cursor position to end of file (or reasonable lookahead).\n */\nexport function detectFeatureContext(\n textBeforeCursor: string,\n textAfterCursor: string\n): FeatureContext | null {\n // Find the last occurrence of each array type\n const patterns = [\n {\n type: 'operations' as const,\n regex: /operations\\s*:\\s*\\[/g,\n specType: 'operation' as AnalyzedSpecType,\n },\n {\n type: 'events' as const,\n regex: /events\\s*:\\s*\\[/g,\n specType: 'event' as AnalyzedSpecType,\n },\n {\n type: 'presentations' as const,\n regex: /presentations\\s*:\\s*\\[/g,\n specType: 'presentation' as AnalyzedSpecType,\n },\n ];\n\n let lastMatch: {\n type: 'operations' | 'events' | 'presentations';\n specType: AnalyzedSpecType;\n index: number;\n } | null = null;\n\n for (const { type, regex, specType } of patterns) {\n let match;\n // Reset regex lastIndex\n regex.lastIndex = 0;\n while ((match = regex.exec(textBeforeCursor)) !== null) {\n if (!lastMatch || match.index > lastMatch.index) {\n lastMatch = { type, specType, index: match.index };\n }\n }\n }\n\n if (!lastMatch) {\n return null;\n }\n\n // Check if we're still inside the array (no closing bracket yet)\n const relevantText =\n textBeforeCursor.slice(lastMatch.index) + textAfterCursor;\n // We only care about checking if the bracket matches.\n // Actually, simpler logic: verify we haven't closed the array *before* the cursor.\n // But wait, the cursor is at `textBeforeCursor.length`.\n // The array starts at `lastMatch.index` (plus length of match).\n // We need to count brackets from start of array content.\n\n // Re-extract match to know length\n const typeStr = lastMatch.type;\n const arrayStartRegex = new RegExp(`${typeStr}\\\\s*:\\\\s*\\\\[`);\n arrayStartRegex.exec(relevantText); // this matches at 0 effectively since we sliced?\n // No, relevantText starts at lastMatch.index.\n // So validation:\n\n const textFromMatch = textBeforeCursor.slice(lastMatch.index);\n\n let depth = 0;\n let inString = false;\n let stringChar = '';\n\n for (let i = 0; i < textFromMatch.length; i++) {\n const char = textFromMatch[i];\n const prevChar = i > 0 ? textFromMatch[i - 1] : '';\n\n // Handle string literals\n if ((char === '\"' || char === \"'\" || char === '`') && prevChar !== '\\\\') {\n if (!inString) {\n inString = true;\n stringChar = char;\n } else if (char === stringChar) {\n inString = false;\n }\n continue;\n }\n\n if (inString) continue;\n\n if (char === '[') {\n depth++;\n } else if (char === ']') {\n depth--;\n if (depth === 0) {\n // Array is closed before cursor\n return null;\n }\n }\n }\n\n // If we are here, depth should be > 0 (usually 1 if flat array, or nested)\n // If depth is > 0, we are inside.\n if (depth > 0) {\n return {\n type: lastMatch.type,\n specType: lastMatch.specType,\n };\n }\n\n return null;\n}\n"],"mappings":";;;;;;;AAgBA,SAAgB,qBACd,kBACA,iBACuB;CAEvB,MAAM,WAAW;EACf;GACE,MAAM;GACN,OAAO;GACP,UAAU;GACX;EACD;GACE,MAAM;GACN,OAAO;GACP,UAAU;GACX;EACD;GACE,MAAM;GACN,OAAO;GACP,UAAU;GACX;EACF;CAED,IAAI,YAIO;AAEX,MAAK,MAAM,EAAE,MAAM,OAAO,cAAc,UAAU;EAChD,IAAI;AAEJ,QAAM,YAAY;AAClB,UAAQ,QAAQ,MAAM,KAAK,iBAAiB,MAAM,KAChD,KAAI,CAAC,aAAa,MAAM,QAAQ,UAAU,MACxC,aAAY;GAAE;GAAM;GAAU,OAAO,MAAM;GAAO;;AAKxD,KAAI,CAAC,UACH,QAAO;CAIT,MAAM,eACJ,iBAAiB,MAAM,UAAU,MAAM,GAAG;CAQ5C,MAAM,UAAU,UAAU;AAE1B,kBADwB,IAAI,OAAO,GAAG,QAAQ,cAAc,EAC5C,KAAK,aAAa;CAIlC,MAAM,gBAAgB,iBAAiB,MAAM,UAAU,MAAM;CAE7D,IAAI,QAAQ;CACZ,IAAI,WAAW;CACf,IAAI,aAAa;AAEjB,MAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;EAC7C,MAAM,OAAO,cAAc;EAC3B,MAAM,WAAW,IAAI,IAAI,cAAc,IAAI,KAAK;AAGhD,OAAK,SAAS,QAAO,SAAS,OAAO,SAAS,QAAQ,aAAa,MAAM;AACvE,OAAI,CAAC,UAAU;AACb,eAAW;AACX,iBAAa;cACJ,SAAS,WAClB,YAAW;AAEb;;AAGF,MAAI,SAAU;AAEd,MAAI,SAAS,IACX;WACS,SAAS,KAAK;AACvB;AACA,OAAI,UAAU,EAEZ,QAAO;;;AAOb,KAAI,QAAQ,EACV,QAAO;EACL,MAAM,UAAU;EAChB,UAAU,UAAU;EACrB;AAGH,QAAO"}
@@ -0,0 +1,27 @@
1
+ //#region src/services/features/feature-editor.d.ts
2
+ /**
3
+ * Feature file editing services.
4
+ */
5
+ /**
6
+ * Result of a computation to edit a feature file.
7
+ */
8
+ interface FeatureEdit {
9
+ index: number;
10
+ text: string;
11
+ }
12
+ /**
13
+ * Compute the edit required to add a spec reference to a feature file.
14
+ * Returns the index to insert at and the text to insert.
15
+ */
16
+ declare function computeAddSpecEdit(content: string, spec: {
17
+ key: string;
18
+ version: string | number;
19
+ type: string;
20
+ }): FeatureEdit | null;
21
+ /**
22
+ * Get array name in feature spec for a given spec type.
23
+ */
24
+ declare function getArrayNameForSpecType(specType: string): string;
25
+ //#endregion
26
+ export { FeatureEdit, computeAddSpecEdit, getArrayNameForSpecType };
27
+ //# sourceMappingURL=feature-editor.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-editor.d.mts","names":[],"sources":["../../../src/services/features/feature-editor.ts"],"sourcesContent":[],"mappings":";;AAOA;AASA;AA+BA;;;UAxCiB,WAAA;;;;;;;;iBASD,kBAAA;;;;IAGb;;;;iBA4Ba,uBAAA"}
@@ -0,0 +1,37 @@
1
+ //#region src/services/features/feature-editor.ts
2
+ /**
3
+ * Compute the edit required to add a spec reference to a feature file.
4
+ * Returns the index to insert at and the text to insert.
5
+ */
6
+ function computeAddSpecEdit(content, spec) {
7
+ const arrayName = getArrayNameForSpecType(spec.type);
8
+ const match = new RegExp(`${arrayName}\\s*:\\s*\\[`, "g").exec(content);
9
+ if (match) {
10
+ const insertIndex = match.index + match[0].length;
11
+ const versionStr = typeof spec.version === "string" ? `'${spec.version}'` : spec.version;
12
+ return {
13
+ index: insertIndex,
14
+ text: `\n { key: '${spec.key}', version: ${versionStr} },`
15
+ };
16
+ }
17
+ return null;
18
+ }
19
+ /**
20
+ * Get array name in feature spec for a given spec type.
21
+ */
22
+ function getArrayNameForSpecType(specType) {
23
+ switch (specType) {
24
+ case "operation":
25
+ case "command":
26
+ case "query": return "operations";
27
+ case "event": return "events";
28
+ case "presentation": return "presentations";
29
+ case "experiment": return "experiments";
30
+ case "workflow": return "workflows";
31
+ default: return "operations";
32
+ }
33
+ }
34
+
35
+ //#endregion
36
+ export { computeAddSpecEdit, getArrayNameForSpecType };
37
+ //# sourceMappingURL=feature-editor.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-editor.mjs","names":[],"sources":["../../../src/services/features/feature-editor.ts"],"sourcesContent":["/**\n * Feature file editing services.\n */\n\n/**\n * Result of a computation to edit a feature file.\n */\nexport interface FeatureEdit {\n index: number;\n text: string;\n}\n\n/**\n * Compute the edit required to add a spec reference to a feature file.\n * Returns the index to insert at and the text to insert.\n */\nexport function computeAddSpecEdit(\n content: string,\n spec: { key: string; version: string | number; type: string }\n): FeatureEdit | null {\n const arrayName = getArrayNameForSpecType(spec.type);\n\n // Find the array in the document\n const arrayPattern = new RegExp(`${arrayName}\\\\s*:\\\\s*\\\\[`, 'g');\n const match = arrayPattern.exec(content);\n\n if (match) {\n // Insert after the opening bracket\n const insertIndex = match.index + match[0].length;\n\n // Format the reference\n const versionStr =\n typeof spec.version === 'string' ? `'${spec.version}'` : spec.version;\n const refText = `\\n { key: '${spec.key}', version: ${versionStr} },`;\n\n return {\n index: insertIndex,\n text: refText,\n };\n }\n\n return null;\n}\n\n/**\n * Get array name in feature spec for a given spec type.\n */\nexport function getArrayNameForSpecType(specType: string): string {\n switch (specType) {\n case 'operation':\n case 'command':\n case 'query':\n return 'operations';\n case 'event':\n return 'events';\n case 'presentation':\n return 'presentations';\n case 'experiment':\n return 'experiments';\n case 'workflow':\n return 'workflows'; // Assuming workflows are supported similarly\n default:\n return 'operations';\n }\n}\n"],"mappings":";;;;;AAgBA,SAAgB,mBACd,SACA,MACoB;CACpB,MAAM,YAAY,wBAAwB,KAAK,KAAK;CAIpD,MAAM,QADe,IAAI,OAAO,GAAG,UAAU,eAAe,IAAI,CACrC,KAAK,QAAQ;AAExC,KAAI,OAAO;EAET,MAAM,cAAc,MAAM,QAAQ,MAAM,GAAG;EAG3C,MAAM,aACJ,OAAO,KAAK,YAAY,WAAW,IAAI,KAAK,QAAQ,KAAK,KAAK;AAGhE,SAAO;GACL,OAAO;GACP,MAJc,iBAAiB,KAAK,IAAI,cAAc,WAAW;GAKlE;;AAGH,QAAO;;;;;AAMT,SAAgB,wBAAwB,UAA0B;AAChE,SAAQ,UAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK,QACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,eACH,QAAO;EACT,KAAK,aACH,QAAO;EACT,KAAK,WACH,QAAO;EACT,QACE,QAAO"}
@@ -0,0 +1,11 @@
1
+ import { FeatureEdit, computeAddSpecEdit, getArrayNameForSpecType } from "./feature-editor.mjs";
2
+ import { FeatureRefError, validateFeatureRefs } from "./validation.mjs";
3
+ import { FeatureContext, detectFeatureContext } from "./completion.mjs";
4
+
5
+ //#region src/services/features/index.d.ts
6
+ declare namespace index_d_exports {
7
+ export { FeatureContext, FeatureEdit, FeatureRefError, computeAddSpecEdit, detectFeatureContext, getArrayNameForSpecType, validateFeatureRefs };
8
+ }
9
+ //#endregion
10
+ export { index_d_exports };
11
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/features/index.ts"],"sourcesContent":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { __exportAll } from "../../_virtual/rolldown_runtime.mjs";
2
+ import { computeAddSpecEdit, getArrayNameForSpecType } from "./feature-editor.mjs";
3
+ import { validateFeatureRefs } from "./validation.mjs";
4
+ import { detectFeatureContext } from "./completion.mjs";
5
+
6
+ //#region src/services/features/index.ts
7
+ var features_exports = /* @__PURE__ */ __exportAll({
8
+ computeAddSpecEdit: () => computeAddSpecEdit,
9
+ detectFeatureContext: () => detectFeatureContext,
10
+ getArrayNameForSpecType: () => getArrayNameForSpecType,
11
+ validateFeatureRefs: () => validateFeatureRefs
12
+ });
13
+
14
+ //#endregion
15
+ export { features_exports };
16
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/services/features/index.ts"],"sourcesContent":["export * from './feature-editor';\nexport * from './validation';\nexport * from './completion';\n"],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { SpecInventory } from "../integrity.mjs";
2
+ import { FeatureScanResult } from "@contractspec/module.workspace";
3
+
4
+ //#region src/services/features/validation.d.ts
5
+
6
+ /**
7
+ * Validation error for a feature reference.
8
+ */
9
+ interface FeatureRefError {
10
+ key: string;
11
+ version: string | number;
12
+ type: string;
13
+ message: string;
14
+ }
15
+ /**
16
+ * Validate references in a feature against the workspace inventory.
17
+ */
18
+ declare function validateFeatureRefs(feature: FeatureScanResult, inventory: SpecInventory): FeatureRefError[];
19
+ //#endregion
20
+ export { FeatureRefError, validateFeatureRefs };
21
+ //# sourceMappingURL=validation.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.mts","names":[],"sources":["../../../src/services/features/validation.ts"],"sourcesContent":[],"mappings":";;;;;;;AAMA;AAUgB,UAVC,eAAA,CAUkB;EACxB,GAAA,EAAA,MAAA;EACE,OAAA,EAAA,MAAA,GAAA,MAAA;EACV,IAAA,EAAA,MAAA;EAAe,OAAA,EAAA,MAAA;;;;;iBAHF,mBAAA,UACL,8BACE,gBACV"}
@@ -0,0 +1,27 @@
1
+ //#region src/services/features/validation.ts
2
+ /**
3
+ * Validate references in a feature against the workspace inventory.
4
+ */
5
+ function validateFeatureRefs(feature, inventory) {
6
+ const errors = [];
7
+ const checkRefs = (refs, inventoryMap, type) => {
8
+ for (const ref of refs) {
9
+ const key = `${ref.key}.v${ref.version}`;
10
+ if (!inventoryMap.has(key)) errors.push({
11
+ key: ref.key,
12
+ version: ref.version,
13
+ type,
14
+ message: `${type} ${ref.key}.v${ref.version} not found`
15
+ });
16
+ }
17
+ };
18
+ checkRefs(feature.operations, inventory.operations, "Operation");
19
+ checkRefs(feature.events, inventory.events, "Event");
20
+ checkRefs(feature.presentations, inventory.presentations, "Presentation");
21
+ checkRefs(feature.experiments, inventory.experiments, "Experiment");
22
+ return errors;
23
+ }
24
+
25
+ //#endregion
26
+ export { validateFeatureRefs };
27
+ //# sourceMappingURL=validation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.mjs","names":[],"sources":["../../../src/services/features/validation.ts"],"sourcesContent":["import type { FeatureScanResult } from '@contractspec/module.workspace';\nimport type { SpecInventory } from '../integrity';\n\n/**\n * Validation error for a feature reference.\n */\nexport interface FeatureRefError {\n key: string;\n version: string | number;\n type: string;\n message: string;\n}\n\n/**\n * Validate references in a feature against the workspace inventory.\n */\nexport function validateFeatureRefs(\n feature: FeatureScanResult,\n inventory: SpecInventory\n): FeatureRefError[] {\n const errors: FeatureRefError[] = [];\n\n // Helper to check refs\n const checkRefs = (\n refs: { key: string; version: string | number }[],\n inventoryMap: Map<string, unknown>,\n type: string\n ) => {\n for (const ref of refs) {\n const key = `${ref.key}.v${ref.version}`;\n if (!inventoryMap.has(key)) {\n errors.push({\n key: ref.key,\n version: ref.version,\n type,\n message: `${type} ${ref.key}.v${ref.version} not found`,\n });\n }\n }\n };\n\n checkRefs(feature.operations, inventory.operations, 'Operation');\n checkRefs(feature.events, inventory.events, 'Event');\n checkRefs(feature.presentations, inventory.presentations, 'Presentation');\n checkRefs(feature.experiments, inventory.experiments, 'Experiment');\n // Check workflows if/when supported in inventory\n\n return errors;\n}\n"],"mappings":";;;;AAgBA,SAAgB,oBACd,SACA,WACmB;CACnB,MAAM,SAA4B,EAAE;CAGpC,MAAM,aACJ,MACA,cACA,SACG;AACH,OAAK,MAAM,OAAO,MAAM;GACtB,MAAM,MAAM,GAAG,IAAI,IAAI,IAAI,IAAI;AAC/B,OAAI,CAAC,aAAa,IAAI,IAAI,CACxB,QAAO,KAAK;IACV,KAAK,IAAI;IACT,SAAS,IAAI;IACb;IACA,SAAS,GAAG,KAAK,GAAG,IAAI,IAAI,IAAI,IAAI,QAAQ;IAC7C,CAAC;;;AAKR,WAAU,QAAQ,YAAY,UAAU,YAAY,YAAY;AAChE,WAAU,QAAQ,QAAQ,UAAU,QAAQ,QAAQ;AACpD,WAAU,QAAQ,eAAe,UAAU,eAAe,eAAe;AACzE,WAAU,QAAQ,aAAa,UAAU,aAAa,aAAa;AAGnE,QAAO"}
@@ -0,0 +1,12 @@
1
+ import { IntegrityIssue } from "../integrity.mjs";
2
+ import { FixLink, FixLinkOptions } from "./types.mjs";
3
+
4
+ //#region src/services/fix/fix-link-formatter.d.ts
5
+
6
+ /**
7
+ * Generate fix links for an issue.
8
+ */
9
+ declare function generateFixLinks(issue: IntegrityIssue, options: FixLinkOptions): FixLink[];
10
+ //#endregion
11
+ export { generateFixLinks };
12
+ //# sourceMappingURL=fix-link-formatter.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-link-formatter.d.mts","names":[],"sources":["../../../src/services/fix/fix-link-formatter.ts"],"sourcesContent":[],"mappings":";;;;;;;;iBAYgB,gBAAA,QACP,yBACE,iBACR"}
@@ -0,0 +1,38 @@
1
+ //#region src/services/fix/fix-link-formatter.ts
2
+ /**
3
+ * Generate fix links for an issue.
4
+ */
5
+ function generateFixLinks(issue, options) {
6
+ const links = [];
7
+ if (!issue.ref || !issue.file) return links;
8
+ if (options.includeCli) links.push({
9
+ type: "cli",
10
+ label: "Fix with CLI",
11
+ value: `contractspec fix --target "${issue.file}"`
12
+ });
13
+ if (options.includeVscode) {
14
+ const path = issue.file.startsWith("/") ? issue.file : `/${issue.file}`;
15
+ const ref = issue.ref;
16
+ const line = ref.line || 1;
17
+ const col = ref.column || 1;
18
+ links.push({
19
+ type: "vscode",
20
+ label: "Open in VS Code",
21
+ value: `vscode://file${path}:${line}:${col}`
22
+ });
23
+ }
24
+ if (options.includeGithubIssue && options.repository) {
25
+ const title = encodeURIComponent(`Fix Integrity Issue: ${issue.message}`);
26
+ const body = encodeURIComponent(`Found integrity issue in \`${issue.file}\`:\n\n> ${issue.message}\n\nReference: \`${issue.ref.key}.v${issue.ref.version}\``);
27
+ links.push({
28
+ type: "github-issue",
29
+ label: "Create Issue",
30
+ value: `https://github.com/${options.repository}/issues/new?title=${title}&body=${body}`
31
+ });
32
+ }
33
+ return links;
34
+ }
35
+
36
+ //#endregion
37
+ export { generateFixLinks };
38
+ //# sourceMappingURL=fix-link-formatter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-link-formatter.mjs","names":[],"sources":["../../../src/services/fix/fix-link-formatter.ts"],"sourcesContent":["/**\n * Fix Link Formatter.\n *\n * Generates links for external surfaces (CLI, VSCode, GitHub).\n */\n\nimport type { FixLink, FixLinkOptions } from './types';\nimport type { IntegrityIssue } from '../integrity';\n\n/**\n * Generate fix links for an issue.\n */\nexport function generateFixLinks(\n issue: IntegrityIssue,\n options: FixLinkOptions\n): FixLink[] {\n const links: FixLink[] = [];\n\n if (!issue.ref || !issue.file) {\n return links;\n }\n\n // CLI Command\n if (options.includeCli) {\n links.push({\n type: 'cli',\n label: 'Fix with CLI',\n value: `contractspec fix --target \"${issue.file}\"`,\n });\n }\n\n // VSCode Deep Link\n if (options.includeVscode) {\n // vscode://file/{path}:{line}:{col}\n const path = issue.file.startsWith('/') ? issue.file : `/${issue.file}`;\n // Cast to any to access potential line/column if not in strictly typed RefInfo\n // or assume they exist if runtime provides them\n // Cast to unknown first to avoid exact type constraints if properties are missing in type definition\n const ref = issue.ref as unknown as { line?: number; column?: number };\n const line = ref.line || 1;\n const col = ref.column || 1;\n links.push({\n type: 'vscode',\n label: 'Open in VS Code',\n value: `vscode://file${path}:${line}:${col}`,\n });\n }\n\n // GitHub Issue\n if (options.includeGithubIssue && options.repository) {\n const title = encodeURIComponent(`Fix Integrity Issue: ${issue.message}`);\n const body = encodeURIComponent(\n `Found integrity issue in \\`${issue.file}\\`:\\n\\n> ${issue.message}\\n\\nReference: \\`${issue.ref.key}.v${issue.ref.version}\\``\n );\n links.push({\n type: 'github-issue',\n label: 'Create Issue',\n value: `https://github.com/${options.repository}/issues/new?title=${title}&body=${body}`,\n });\n }\n\n return links;\n}\n"],"mappings":";;;;AAYA,SAAgB,iBACd,OACA,SACW;CACX,MAAM,QAAmB,EAAE;AAE3B,KAAI,CAAC,MAAM,OAAO,CAAC,MAAM,KACvB,QAAO;AAIT,KAAI,QAAQ,WACV,OAAM,KAAK;EACT,MAAM;EACN,OAAO;EACP,OAAO,8BAA8B,MAAM,KAAK;EACjD,CAAC;AAIJ,KAAI,QAAQ,eAAe;EAEzB,MAAM,OAAO,MAAM,KAAK,WAAW,IAAI,GAAG,MAAM,OAAO,IAAI,MAAM;EAIjE,MAAM,MAAM,MAAM;EAClB,MAAM,OAAO,IAAI,QAAQ;EACzB,MAAM,MAAM,IAAI,UAAU;AAC1B,QAAM,KAAK;GACT,MAAM;GACN,OAAO;GACP,OAAO,gBAAgB,KAAK,GAAG,KAAK,GAAG;GACxC,CAAC;;AAIJ,KAAI,QAAQ,sBAAsB,QAAQ,YAAY;EACpD,MAAM,QAAQ,mBAAmB,wBAAwB,MAAM,UAAU;EACzE,MAAM,OAAO,mBACX,8BAA8B,MAAM,KAAK,WAAW,MAAM,QAAQ,mBAAmB,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,QAAQ,IAC1H;AACD,QAAM,KAAK;GACT,MAAM;GACN,OAAO;GACP,OAAO,sBAAsB,QAAQ,WAAW,oBAAoB,MAAM,QAAQ;GACnF,CAAC;;AAGJ,QAAO"}
@@ -0,0 +1,74 @@
1
+ import { FsAdapter } from "../../ports/fs.mjs";
2
+ import { LoggerAdapter } from "../../ports/logger.mjs";
3
+ import { IntegrityIssue } from "../integrity.mjs";
4
+ import { BatchFixRequest, BatchFixResult, FixOptions, FixResult, FixStrategyType, FixableIssue } from "./types.mjs";
5
+
6
+ //#region src/services/fix/fix-service.d.ts
7
+
8
+ /**
9
+ * Service for fixing integrity issues.
10
+ */
11
+ declare class FixService {
12
+ private readonly adapters;
13
+ private strategies;
14
+ constructor(adapters: {
15
+ fs: FsAdapter;
16
+ logger: LoggerAdapter;
17
+ });
18
+ /**
19
+ * Register a fix strategy.
20
+ */
21
+ private registerStrategy;
22
+ /**
23
+ * Get available strategies for an issue.
24
+ */
25
+ getStrategiesForIssue(issue: IntegrityIssue): FixStrategyType[];
26
+ /**
27
+ * Parse CI issue into a fixable issue context.
28
+ */
29
+ parseFixableIssue(issue: IntegrityIssue): Omit<FixableIssue, 'availableStrategies' | 'strategies'> | undefined;
30
+ /**
31
+ * Fix a single issue.
32
+ */
33
+ fixIssue(issue: FixableIssue, options: FixOptions): Promise<FixResult>;
34
+ /**
35
+ * Batch fix multiple issues.
36
+ */
37
+ batchFix(request: BatchFixRequest): Promise<BatchFixResult>;
38
+ /**
39
+ * Scan for integrity issues and return fixable ones.
40
+ */
41
+ scanAndGetFixables(options?: {
42
+ pattern?: string;
43
+ cwd?: string;
44
+ }): Promise<FixableIssue[]>;
45
+ /**
46
+ * Convert an integrity issue into a FixableIssue with strategies.
47
+ */
48
+ getToFix(issue: IntegrityIssue): FixableIssue | null;
49
+ /**
50
+ * Determine the best strategy for an issue.
51
+ *
52
+ * Logic moved from CLI to be shared.
53
+ */
54
+ resolveStrategy(issue: FixableIssue, options: {
55
+ forceStrategy?: FixStrategyType;
56
+ preferAi?: boolean;
57
+ interactive?: boolean;
58
+ select?: (issue: FixableIssue, strategies: FixStrategyType[]) => Promise<FixStrategyType | undefined>;
59
+ }): Promise<FixStrategyType | undefined>;
60
+ /**
61
+ * Determine scan options based on input target.
62
+ */
63
+ determineScanOptions(target: string): Promise<{
64
+ pattern?: string;
65
+ cwd?: string;
66
+ }>;
67
+ /**
68
+ * Parse CI output JSON into FixableIssues.
69
+ */
70
+ parseIssuesFromCIResult(ciIssues: unknown[]): FixableIssue[];
71
+ }
72
+ //#endregion
73
+ export { FixService };
74
+ //# sourceMappingURL=fix-service.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-service.d.mts","names":[],"sources":["../../../src/services/fix/fix-service.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAkFU,cAtDG,UAAA,CAsDH;EAAL,iBAAA,QAAA;EAiBmB,QAAA,UAAA;EAAuB,WAAA,CAAA,QAAA,EAAA;IAAqB,EAAA,EAnE/B,SAmE+B;IAAR,MAAA,EAnEJ,aAmEI;EA0BlC,CAAA;EAA0B;;;EAuC/C,QAAA,gBAAA;EAca;;;EA0BI,qBAAA,CAAA,KAAA,EA/IS,cA+IT,CAAA,EA/I0B,eA+I1B,EAAA;EAKP;;;EAEJ,iBAAA,CAAA,KAAA,EAlIA,cAkIA,CAAA,EAjIN,IAiIM,CAjID,YAiIC,EAAA,qBAAA,GAAA,YAAA,CAAA,GAAA,SAAA;EAEE;;;EAuDmC,QAAA,CAAA,KAAA,EAzKxB,YAyKwB,EAAA,OAAA,EAzKD,UAyKC,CAAA,EAzKY,OAyKZ,CAzKoB,SAyKpB,CAAA;EAAY;;;oBA/IlC,kBAAkB,QAAQ;;;;;;;MAuC/C,QAAQ;;;;kBAcK,iBAAiB;;;;;;yBAwBxB;oBAEW;;;qBAKP,0BACK,sBACT,QAAQ;MAEd,QAAQ;;;;wCAsCR;;;;;;;gDAiB2C"}