@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,63 @@
1
+ import { ImpactResult as ImpactResult$1 } from "@contractspec/module.workspace";
2
+
3
+ //#region src/services/impact/types.d.ts
4
+
5
+ /** Options for impact detection */
6
+ interface ImpactDetectionOptions {
7
+ /** Git ref to compare against (branch, tag, commit) */
8
+ baseline?: string;
9
+ /** Glob pattern for spec discovery */
10
+ pattern?: string;
11
+ /** Workspace root directory */
12
+ workspaceRoot?: string;
13
+ }
14
+ /** Impact detection result with additional context */
15
+ interface ImpactDetectionResult extends ImpactResult$1 {
16
+ /** Working directory */
17
+ workspaceRoot: string;
18
+ /** Number of specs analyzed */
19
+ specsAnalyzed: number;
20
+ }
21
+ /** PR comment options */
22
+ interface PrCommentOptions {
23
+ /** Template style */
24
+ template: 'minimal' | 'detailed';
25
+ /** Include links to files */
26
+ includeLinks?: boolean;
27
+ /** Repository URL for links */
28
+ repositoryUrl?: string;
29
+ /** Commit SHA for links */
30
+ commitSha?: string;
31
+ /** Drift detection result */
32
+ drift?: {
33
+ hasDrift: boolean;
34
+ files: string[];
35
+ };
36
+ }
37
+ /** GitHub check run payload */
38
+ interface CheckRunPayload {
39
+ /** Check run name */
40
+ name: string;
41
+ /** Head SHA */
42
+ headSha: string;
43
+ /** Conclusion */
44
+ conclusion: 'success' | 'failure' | 'neutral';
45
+ /** Output title */
46
+ title: string;
47
+ /** Output summary */
48
+ summary: string;
49
+ /** Annotations */
50
+ annotations?: CheckRunAnnotation[];
51
+ }
52
+ /** Check run annotation */
53
+ interface CheckRunAnnotation {
54
+ path: string;
55
+ startLine: number;
56
+ endLine: number;
57
+ annotationLevel: 'notice' | 'warning' | 'failure';
58
+ message: string;
59
+ title?: string;
60
+ }
61
+ //#endregion
62
+ export { CheckRunAnnotation, CheckRunPayload, ImpactDetectionOptions, ImpactDetectionResult, type ImpactResult$1 as ImpactResult, PrCommentOptions };
63
+ //# sourceMappingURL=types.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/services/impact/types.ts"],"sourcesContent":[],"mappings":";;;;AA4BA;AAiBiB,UAnCA,sBAAA,CA+CD;EAIC;;;;;;;;UAzCA,qBAAA,SAA8B;;;;;;;UAQ9B,gBAAA;;;;;;;;;;;;;;;;UAiBA,eAAA;;;;;;;;;;;;gBAYD;;;UAIC,kBAAA"}
@@ -0,0 +1,30 @@
1
+ import { FsAdapter } from "../../ports/fs.mjs";
2
+ import { DiscoveryOptions, SpecReferenceMatch } from "./types.mjs";
3
+ import { ImplementationType } from "@contractspec/lib.contracts";
4
+
5
+ //#region src/services/implementation/discovery.d.ts
6
+
7
+ /**
8
+ * Infer implementation type from file path.
9
+ */
10
+ declare function inferImplementationType(filePath: string): ImplementationType;
11
+ /**
12
+ * Extract spec references from source code.
13
+ */
14
+ declare function extractSpecReferences(code: string, filePath: string): SpecReferenceMatch[];
15
+ /**
16
+ * Discover implementations that reference a specific spec.
17
+ */
18
+ declare function discoverImplementationsForSpec(specKey: string, adapters: {
19
+ fs: FsAdapter;
20
+ }, options?: DiscoveryOptions): Promise<SpecReferenceMatch[]>;
21
+ /**
22
+ * Discover all spec references in the workspace.
23
+ * Returns a map of spec key to implementation references.
24
+ */
25
+ declare function discoverAllImplementations(adapters: {
26
+ fs: FsAdapter;
27
+ }, options?: DiscoveryOptions): Promise<Map<string, SpecReferenceMatch[]>>;
28
+ //#endregion
29
+ export { discoverAllImplementations, discoverImplementationsForSpec, extractSpecReferences, inferImplementationType };
30
+ //# sourceMappingURL=discovery.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.mts","names":[],"sources":["../../../src/services/implementation/discovery.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAsLU,iBAnIM,uBAAA,CAmIN,QAAA,EAAA,MAAA,CAAA,EAnIiD,kBAmIjD;AAkCV;;;AAGuB,iBAhJP,qBAAA,CAgJO,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,CAAA,EA7IpB,kBA6IoB,EAAA;;;;iBAzCD,8BAAA;MAEJ;aACP,mBACR,QAAQ;;;;;iBAkCW,0BAAA;MACJ;aACP,mBACR,QAAQ,YAAY"}
@@ -0,0 +1,144 @@
1
+ //#region src/services/implementation/discovery.ts
2
+ /**
3
+ * Patterns for detecting spec references in source code.
4
+ */
5
+ const SPEC_REFERENCE_PATTERNS = {
6
+ namedImport: /import\s*\{[^}]*\b(\w+(?:Spec|Contract|Command|Query))\b[^}]*\}\s*from/g,
7
+ defaultImport: /import\s+(\w+(?:Spec|Contract|Command|Query))\s+from/g,
8
+ contractHandler: /ContractHandler\s*<\s*typeof\s+(\w+)\s*>/g,
9
+ typeofSpec: /typeof\s+(\w+(?:Spec|Contract|Command|Query))\b/g,
10
+ specAssignment: /(?:spec|contract)\s*[:=]\s*(\w+(?:Spec|Contract|Command|Query))\b/gi
11
+ };
12
+ /**
13
+ * File patterns that indicate implementation types.
14
+ */
15
+ const IMPLEMENTATION_TYPE_PATTERNS = {
16
+ ".handler.ts": "handler",
17
+ ".handler.tsx": "handler",
18
+ ".service.ts": "service",
19
+ ".service.tsx": "service",
20
+ ".test.ts": "test",
21
+ ".test.tsx": "test",
22
+ ".spec.ts": "test",
23
+ ".spec.tsx": "test",
24
+ ".component.tsx": "component",
25
+ ".tsx": "component",
26
+ ".form.tsx": "form",
27
+ ".hook.ts": "hook",
28
+ ".hook.tsx": "hook"
29
+ };
30
+ /**
31
+ * Infer implementation type from file path.
32
+ */
33
+ function inferImplementationType(filePath) {
34
+ const lowerPath = filePath.toLowerCase();
35
+ for (const [pattern, type] of Object.entries(IMPLEMENTATION_TYPE_PATTERNS)) if (lowerPath.endsWith(pattern)) return type;
36
+ if (lowerPath.includes("/handlers/")) return "handler";
37
+ if (lowerPath.includes("/services/")) return "service";
38
+ if (lowerPath.includes("/components/")) return "component";
39
+ if (lowerPath.includes("/forms/")) return "form";
40
+ if (lowerPath.includes("/hooks/")) return "hook";
41
+ if (lowerPath.includes("/__tests__/")) return "test";
42
+ return "other";
43
+ }
44
+ /**
45
+ * Extract spec references from source code.
46
+ */
47
+ function extractSpecReferences(code, filePath) {
48
+ const matches = [];
49
+ const seenSpecs = /* @__PURE__ */ new Set();
50
+ const addMatch = (specKey, referenceType, lineNumber) => {
51
+ const key = `${specKey}:${referenceType}`;
52
+ if (seenSpecs.has(key)) return;
53
+ seenSpecs.add(key);
54
+ matches.push({
55
+ filePath,
56
+ specKey,
57
+ referenceType,
58
+ lineNumber,
59
+ inferredType: inferImplementationType(filePath)
60
+ });
61
+ };
62
+ const getLineNumber = (position) => {
63
+ return code.substring(0, position).split("\n").length;
64
+ };
65
+ let match;
66
+ const handlerPattern = new RegExp(SPEC_REFERENCE_PATTERNS.contractHandler);
67
+ while ((match = handlerPattern.exec(code)) !== null) if (match[1]) addMatch(match[1], "handler", getLineNumber(match.index));
68
+ const typeofPattern = new RegExp(SPEC_REFERENCE_PATTERNS.typeofSpec);
69
+ while ((match = typeofPattern.exec(code)) !== null) if (match[1]) addMatch(match[1], "typeof", getLineNumber(match.index));
70
+ const namedPattern = new RegExp(SPEC_REFERENCE_PATTERNS.namedImport);
71
+ while ((match = namedPattern.exec(code)) !== null) {
72
+ const specNames = match[0].match(/\b(\w+(?:Spec|Contract|Command|Query))\b/g);
73
+ if (specNames) for (const name of specNames) addMatch(name, "import", getLineNumber(match.index));
74
+ }
75
+ const defaultPattern = new RegExp(SPEC_REFERENCE_PATTERNS.defaultImport);
76
+ while ((match = defaultPattern.exec(code)) !== null) if (match[1]) addMatch(match[1], "import", getLineNumber(match.index));
77
+ const assignPattern = new RegExp(SPEC_REFERENCE_PATTERNS.specAssignment);
78
+ while ((match = assignPattern.exec(code)) !== null) if (match[1]) addMatch(match[1], "unknown", getLineNumber(match.index));
79
+ return matches;
80
+ }
81
+ /**
82
+ * Default glob patterns for implementation files.
83
+ */
84
+ const DEFAULT_INCLUDE_PATTERNS = ["**/*.ts", "**/*.tsx"];
85
+ const DEFAULT_EXCLUDE_PATTERNS = [
86
+ "**/node_modules/**",
87
+ "**/dist/**",
88
+ "**/.git/**",
89
+ "**/*.d.ts",
90
+ "**/*.operation.ts",
91
+ "**/*.spec.ts",
92
+ "**/*.feature.ts",
93
+ "**/*.event.ts",
94
+ "**/*.presentation.ts"
95
+ ];
96
+ /**
97
+ * Discover implementations that reference a specific spec.
98
+ */
99
+ async function discoverImplementationsForSpec(specKey, adapters, options = {}) {
100
+ const { fs } = adapters;
101
+ const includePatterns = options.includePatterns ?? DEFAULT_INCLUDE_PATTERNS;
102
+ const excludePatterns = options.excludePatterns ?? DEFAULT_EXCLUDE_PATTERNS;
103
+ const allMatches = [];
104
+ for (const pattern of includePatterns) {
105
+ const files = await fs.glob({
106
+ pattern,
107
+ ignore: excludePatterns
108
+ });
109
+ for (const filePath of files) try {
110
+ const matchingRefs = extractSpecReferences(await fs.readFile(filePath), filePath).filter((ref) => ref.specKey === specKey);
111
+ allMatches.push(...matchingRefs);
112
+ } catch {}
113
+ }
114
+ return allMatches;
115
+ }
116
+ /**
117
+ * Discover all spec references in the workspace.
118
+ * Returns a map of spec key to implementation references.
119
+ */
120
+ async function discoverAllImplementations(adapters, options = {}) {
121
+ const { fs } = adapters;
122
+ const includePatterns = options.includePatterns ?? DEFAULT_INCLUDE_PATTERNS;
123
+ const excludePatterns = options.excludePatterns ?? DEFAULT_EXCLUDE_PATTERNS;
124
+ const specToImplementations = /* @__PURE__ */ new Map();
125
+ for (const pattern of includePatterns) {
126
+ const files = await fs.glob({
127
+ pattern,
128
+ ignore: excludePatterns
129
+ });
130
+ for (const filePath of files) try {
131
+ const references = extractSpecReferences(await fs.readFile(filePath), filePath);
132
+ for (const ref of references) {
133
+ const existing = specToImplementations.get(ref.specKey) ?? [];
134
+ existing.push(ref);
135
+ specToImplementations.set(ref.specKey, existing);
136
+ }
137
+ } catch {}
138
+ }
139
+ return specToImplementations;
140
+ }
141
+
142
+ //#endregion
143
+ export { discoverAllImplementations, discoverImplementationsForSpec, extractSpecReferences, inferImplementationType };
144
+ //# sourceMappingURL=discovery.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.mjs","names":[],"sources":["../../../src/services/implementation/discovery.ts"],"sourcesContent":["/**\n * Implementation auto-discovery service.\n *\n * Scans workspace files to find implementations that reference specs.\n * Uses regex-based pattern matching for performance (avoids full AST parsing).\n */\n\nimport type { FsAdapter } from '../../ports/fs';\nimport type { ImplementationType } from '@contractspec/lib.contracts';\nimport type { DiscoveryOptions, SpecReferenceMatch } from './types';\n\n/**\n * Patterns for detecting spec references in source code.\n */\nconst SPEC_REFERENCE_PATTERNS = {\n // import { SpecName } from './path'\n namedImport:\n /import\\s*\\{[^}]*\\b(\\w+(?:Spec|Contract|Command|Query))\\b[^}]*\\}\\s*from/g,\n // import SpecName from './path'\n defaultImport: /import\\s+(\\w+(?:Spec|Contract|Command|Query))\\s+from/g,\n // ContractHandler<typeof SpecName>\n contractHandler: /ContractHandler\\s*<\\s*typeof\\s+(\\w+)\\s*>/g,\n // typeof SpecName (generic usage)\n typeofSpec: /typeof\\s+(\\w+(?:Spec|Contract|Command|Query))\\b/g,\n // spec: SpecKey or spec = SpecKey\n specAssignment:\n /(?:spec|contract)\\s*[:=]\\s*(\\w+(?:Spec|Contract|Command|Query))\\b/gi,\n};\n\n/**\n * File patterns that indicate implementation types.\n */\nconst IMPLEMENTATION_TYPE_PATTERNS: Record<string, ImplementationType> = {\n '.handler.ts': 'handler',\n '.handler.tsx': 'handler',\n '.service.ts': 'service',\n '.service.tsx': 'service',\n '.test.ts': 'test',\n '.test.tsx': 'test',\n '.spec.ts': 'test',\n '.spec.tsx': 'test',\n '.component.tsx': 'component',\n '.tsx': 'component', // Default for TSX files\n '.form.tsx': 'form',\n '.hook.ts': 'hook',\n '.hook.tsx': 'hook',\n};\n\n/**\n * Infer implementation type from file path.\n */\nexport function inferImplementationType(filePath: string): ImplementationType {\n const lowerPath = filePath.toLowerCase();\n\n // Check specific patterns first (order matters)\n for (const [pattern, type] of Object.entries(IMPLEMENTATION_TYPE_PATTERNS)) {\n if (lowerPath.endsWith(pattern)) {\n return type;\n }\n }\n\n // Check directory patterns\n if (lowerPath.includes('/handlers/')) return 'handler';\n if (lowerPath.includes('/services/')) return 'service';\n if (lowerPath.includes('/components/')) return 'component';\n if (lowerPath.includes('/forms/')) return 'form';\n if (lowerPath.includes('/hooks/')) return 'hook';\n if (lowerPath.includes('/__tests__/')) return 'test';\n\n return 'other';\n}\n\n/**\n * Extract spec references from source code.\n */\nexport function extractSpecReferences(\n code: string,\n filePath: string\n): SpecReferenceMatch[] {\n const matches: SpecReferenceMatch[] = [];\n const seenSpecs = new Set<string>();\n\n // Helper to add unique matches\n const addMatch = (\n specKey: string,\n referenceType: SpecReferenceMatch['referenceType'],\n lineNumber?: number\n ) => {\n const key = `${specKey}:${referenceType}`;\n if (seenSpecs.has(key)) return;\n seenSpecs.add(key);\n\n matches.push({\n filePath,\n specKey,\n referenceType,\n lineNumber,\n inferredType: inferImplementationType(filePath),\n });\n };\n\n // Find line number for a match position\n const getLineNumber = (position: number): number => {\n const lines = code.substring(0, position).split('\\n');\n return lines.length;\n };\n\n // Check ContractHandler pattern (most specific)\n let match: RegExpExecArray | null;\n const handlerPattern = new RegExp(SPEC_REFERENCE_PATTERNS.contractHandler);\n while ((match = handlerPattern.exec(code)) !== null) {\n if (match[1]) {\n addMatch(match[1], 'handler', getLineNumber(match.index));\n }\n }\n\n // Check typeof pattern\n const typeofPattern = new RegExp(SPEC_REFERENCE_PATTERNS.typeofSpec);\n while ((match = typeofPattern.exec(code)) !== null) {\n if (match[1]) {\n addMatch(match[1], 'typeof', getLineNumber(match.index));\n }\n }\n\n // Check named imports\n const namedPattern = new RegExp(SPEC_REFERENCE_PATTERNS.namedImport);\n while ((match = namedPattern.exec(code)) !== null) {\n // Extract all spec names from the import statement\n const importBlock = match[0];\n const specNames = importBlock.match(\n /\\b(\\w+(?:Spec|Contract|Command|Query))\\b/g\n );\n if (specNames) {\n for (const name of specNames) {\n addMatch(name, 'import', getLineNumber(match.index));\n }\n }\n }\n\n // Check default imports\n const defaultPattern = new RegExp(SPEC_REFERENCE_PATTERNS.defaultImport);\n while ((match = defaultPattern.exec(code)) !== null) {\n if (match[1]) {\n addMatch(match[1], 'import', getLineNumber(match.index));\n }\n }\n\n // Check spec assignments\n const assignPattern = new RegExp(SPEC_REFERENCE_PATTERNS.specAssignment);\n while ((match = assignPattern.exec(code)) !== null) {\n if (match[1]) {\n addMatch(match[1], 'unknown', getLineNumber(match.index));\n }\n }\n\n return matches;\n}\n\n/**\n * Default glob patterns for implementation files.\n */\nconst DEFAULT_INCLUDE_PATTERNS = ['**/*.ts', '**/*.tsx'];\n\nconst DEFAULT_EXCLUDE_PATTERNS = [\n '**/node_modules/**',\n '**/dist/**',\n '**/.git/**',\n '**/*.d.ts',\n '**/*.operation.ts', // Skip spec files themselves\n '**/*.spec.ts', // Skip test spec files\n '**/*.feature.ts', // Skip feature files\n '**/*.event.ts', // Skip event spec files\n '**/*.presentation.ts', // Skip presentation files\n];\n\n/**\n * Discover implementations that reference a specific spec.\n */\nexport async function discoverImplementationsForSpec(\n specKey: string,\n adapters: { fs: FsAdapter },\n options: DiscoveryOptions = {}\n): Promise<SpecReferenceMatch[]> {\n const { fs } = adapters;\n const includePatterns = options.includePatterns ?? DEFAULT_INCLUDE_PATTERNS;\n const excludePatterns = options.excludePatterns ?? DEFAULT_EXCLUDE_PATTERNS;\n\n const allMatches: SpecReferenceMatch[] = [];\n\n // Scan each include pattern\n for (const pattern of includePatterns) {\n const files = await fs.glob({ pattern, ignore: excludePatterns });\n\n for (const filePath of files) {\n try {\n const content = await fs.readFile(filePath);\n const references = extractSpecReferences(content, filePath);\n\n // Filter to only references for the target spec\n const matchingRefs = references.filter(\n (ref) => ref.specKey === specKey\n );\n allMatches.push(...matchingRefs);\n } catch {\n // Skip files that can't be read\n }\n }\n }\n\n return allMatches;\n}\n\n/**\n * Discover all spec references in the workspace.\n * Returns a map of spec key to implementation references.\n */\nexport async function discoverAllImplementations(\n adapters: { fs: FsAdapter },\n options: DiscoveryOptions = {}\n): Promise<Map<string, SpecReferenceMatch[]>> {\n const { fs } = adapters;\n const includePatterns = options.includePatterns ?? DEFAULT_INCLUDE_PATTERNS;\n const excludePatterns = options.excludePatterns ?? DEFAULT_EXCLUDE_PATTERNS;\n\n const specToImplementations = new Map<string, SpecReferenceMatch[]>();\n\n // Scan each include pattern\n for (const pattern of includePatterns) {\n const files = await fs.glob({ pattern, ignore: excludePatterns });\n\n for (const filePath of files) {\n try {\n const content = await fs.readFile(filePath);\n const references = extractSpecReferences(content, filePath);\n\n // Group by spec key\n for (const ref of references) {\n const existing = specToImplementations.get(ref.specKey) ?? [];\n existing.push(ref);\n specToImplementations.set(ref.specKey, existing);\n }\n } catch {\n // Skip files that can't be read\n }\n }\n }\n\n return specToImplementations;\n}\n"],"mappings":";;;;AAcA,MAAM,0BAA0B;CAE9B,aACE;CAEF,eAAe;CAEf,iBAAiB;CAEjB,YAAY;CAEZ,gBACE;CACH;;;;AAKD,MAAM,+BAAmE;CACvE,eAAe;CACf,gBAAgB;CAChB,eAAe;CACf,gBAAgB;CAChB,YAAY;CACZ,aAAa;CACb,YAAY;CACZ,aAAa;CACb,kBAAkB;CAClB,QAAQ;CACR,aAAa;CACb,YAAY;CACZ,aAAa;CACd;;;;AAKD,SAAgB,wBAAwB,UAAsC;CAC5E,MAAM,YAAY,SAAS,aAAa;AAGxC,MAAK,MAAM,CAAC,SAAS,SAAS,OAAO,QAAQ,6BAA6B,CACxE,KAAI,UAAU,SAAS,QAAQ,CAC7B,QAAO;AAKX,KAAI,UAAU,SAAS,aAAa,CAAE,QAAO;AAC7C,KAAI,UAAU,SAAS,aAAa,CAAE,QAAO;AAC7C,KAAI,UAAU,SAAS,eAAe,CAAE,QAAO;AAC/C,KAAI,UAAU,SAAS,UAAU,CAAE,QAAO;AAC1C,KAAI,UAAU,SAAS,UAAU,CAAE,QAAO;AAC1C,KAAI,UAAU,SAAS,cAAc,CAAE,QAAO;AAE9C,QAAO;;;;;AAMT,SAAgB,sBACd,MACA,UACsB;CACtB,MAAM,UAAgC,EAAE;CACxC,MAAM,4BAAY,IAAI,KAAa;CAGnC,MAAM,YACJ,SACA,eACA,eACG;EACH,MAAM,MAAM,GAAG,QAAQ,GAAG;AAC1B,MAAI,UAAU,IAAI,IAAI,CAAE;AACxB,YAAU,IAAI,IAAI;AAElB,UAAQ,KAAK;GACX;GACA;GACA;GACA;GACA,cAAc,wBAAwB,SAAS;GAChD,CAAC;;CAIJ,MAAM,iBAAiB,aAA6B;AAElD,SADc,KAAK,UAAU,GAAG,SAAS,CAAC,MAAM,KAAK,CACxC;;CAIf,IAAI;CACJ,MAAM,iBAAiB,IAAI,OAAO,wBAAwB,gBAAgB;AAC1E,SAAQ,QAAQ,eAAe,KAAK,KAAK,MAAM,KAC7C,KAAI,MAAM,GACR,UAAS,MAAM,IAAI,WAAW,cAAc,MAAM,MAAM,CAAC;CAK7D,MAAM,gBAAgB,IAAI,OAAO,wBAAwB,WAAW;AACpE,SAAQ,QAAQ,cAAc,KAAK,KAAK,MAAM,KAC5C,KAAI,MAAM,GACR,UAAS,MAAM,IAAI,UAAU,cAAc,MAAM,MAAM,CAAC;CAK5D,MAAM,eAAe,IAAI,OAAO,wBAAwB,YAAY;AACpE,SAAQ,QAAQ,aAAa,KAAK,KAAK,MAAM,MAAM;EAGjD,MAAM,YADc,MAAM,GACI,MAC5B,4CACD;AACD,MAAI,UACF,MAAK,MAAM,QAAQ,UACjB,UAAS,MAAM,UAAU,cAAc,MAAM,MAAM,CAAC;;CAM1D,MAAM,iBAAiB,IAAI,OAAO,wBAAwB,cAAc;AACxE,SAAQ,QAAQ,eAAe,KAAK,KAAK,MAAM,KAC7C,KAAI,MAAM,GACR,UAAS,MAAM,IAAI,UAAU,cAAc,MAAM,MAAM,CAAC;CAK5D,MAAM,gBAAgB,IAAI,OAAO,wBAAwB,eAAe;AACxE,SAAQ,QAAQ,cAAc,KAAK,KAAK,MAAM,KAC5C,KAAI,MAAM,GACR,UAAS,MAAM,IAAI,WAAW,cAAc,MAAM,MAAM,CAAC;AAI7D,QAAO;;;;;AAMT,MAAM,2BAA2B,CAAC,WAAW,WAAW;AAExD,MAAM,2BAA2B;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;AAKD,eAAsB,+BACpB,SACA,UACA,UAA4B,EAAE,EACC;CAC/B,MAAM,EAAE,OAAO;CACf,MAAM,kBAAkB,QAAQ,mBAAmB;CACnD,MAAM,kBAAkB,QAAQ,mBAAmB;CAEnD,MAAM,aAAmC,EAAE;AAG3C,MAAK,MAAM,WAAW,iBAAiB;EACrC,MAAM,QAAQ,MAAM,GAAG,KAAK;GAAE;GAAS,QAAQ;GAAiB,CAAC;AAEjE,OAAK,MAAM,YAAY,MACrB,KAAI;GAKF,MAAM,eAHa,sBADH,MAAM,GAAG,SAAS,SAAS,EACO,SAAS,CAG3B,QAC7B,QAAQ,IAAI,YAAY,QAC1B;AACD,cAAW,KAAK,GAAG,aAAa;UAC1B;;AAMZ,QAAO;;;;;;AAOT,eAAsB,2BACpB,UACA,UAA4B,EAAE,EACc;CAC5C,MAAM,EAAE,OAAO;CACf,MAAM,kBAAkB,QAAQ,mBAAmB;CACnD,MAAM,kBAAkB,QAAQ,mBAAmB;CAEnD,MAAM,wCAAwB,IAAI,KAAmC;AAGrE,MAAK,MAAM,WAAW,iBAAiB;EACrC,MAAM,QAAQ,MAAM,GAAG,KAAK;GAAE;GAAS,QAAQ;GAAiB,CAAC;AAEjE,OAAK,MAAM,YAAY,MACrB,KAAI;GAEF,MAAM,aAAa,sBADH,MAAM,GAAG,SAAS,SAAS,EACO,SAAS;AAG3D,QAAK,MAAM,OAAO,YAAY;IAC5B,MAAM,WAAW,sBAAsB,IAAI,IAAI,QAAQ,IAAI,EAAE;AAC7D,aAAS,KAAK,IAAI;AAClB,0BAAsB,IAAI,IAAI,SAAS,SAAS;;UAE5C;;AAMZ,QAAO"}
@@ -0,0 +1,6 @@
1
+ import { DiscoveryOptions, ImplementationSource, ImplementationStatus, ResolvedImplementation, ResolverOptions, SpecImplementationResult, SpecReferenceMatch } from "./types.mjs";
2
+ import { discoverAllImplementations, discoverImplementationsForSpec, extractSpecReferences, inferImplementationType } from "./discovery.mjs";
3
+ import { getSpecKeyVariants, parseExplicitImplementations } from "./resolver/parsers.mjs";
4
+ import { getConventionPaths, toKebabCase } from "./resolver/conventions.mjs";
5
+ import { determineStatus, getImplementationSummary } from "./resolver/status.mjs";
6
+ import { resolveAllImplementations, resolveImplementations } from "./resolver/index.mjs";
@@ -0,0 +1,7 @@
1
+ import { discoverAllImplementations, discoverImplementationsForSpec, extractSpecReferences, inferImplementationType } from "./discovery.mjs";
2
+ import { getConventionPaths, toKebabCase } from "./resolver/conventions.mjs";
3
+ import { getSpecKeyVariants, parseExplicitImplementations } from "./resolver/parsers.mjs";
4
+ import { determineStatus, getImplementationSummary } from "./resolver/status.mjs";
5
+ import { resolveAllImplementations, resolveImplementations } from "./resolver/index.mjs";
6
+
7
+ export { };
@@ -0,0 +1,18 @@
1
+ import { ImplementationType } from "@contractspec/lib.contracts";
2
+
3
+ //#region src/services/implementation/resolver/conventions.d.ts
4
+
5
+ /**
6
+ * Convert string to kebab-case.
7
+ */
8
+ declare function toKebabCase(value: string): string;
9
+ /**
10
+ * Get convention-based implementation paths for a spec.
11
+ */
12
+ declare function getConventionPaths(specType: string, specKey: string, outputDir: string): {
13
+ path: string;
14
+ type: ImplementationType;
15
+ }[];
16
+ //#endregion
17
+ export { getConventionPaths, toKebabCase };
18
+ //# sourceMappingURL=conventions.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conventions.d.mts","names":[],"sources":["../../../../src/services/implementation/resolver/conventions.ts"],"sourcesContent":[],"mappings":";;;;AAmBA;;;iBAVgB,WAAA;;;;iBAUA,kBAAA;;QAIS"}
@@ -0,0 +1,59 @@
1
+ //#region src/services/implementation/resolver/conventions.ts
2
+ /**
3
+ * Convert string to kebab-case.
4
+ */
5
+ function toKebabCase(value) {
6
+ return value.replace(/\./g, "-").replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
7
+ }
8
+ /**
9
+ * Get convention-based implementation paths for a spec.
10
+ */
11
+ function getConventionPaths(specType, specKey, outputDir) {
12
+ const kebab = toKebabCase(specKey);
13
+ const paths = [];
14
+ if (specType === "operation") {
15
+ paths.push({
16
+ path: `${outputDir}/handlers/${kebab}.handler.ts`,
17
+ type: "handler"
18
+ });
19
+ paths.push({
20
+ path: `${outputDir}/handlers/${kebab}.handler.test.ts`,
21
+ type: "test"
22
+ });
23
+ }
24
+ if (specType === "presentation") {
25
+ paths.push({
26
+ path: `${outputDir}/components/${kebab}.tsx`,
27
+ type: "component"
28
+ });
29
+ paths.push({
30
+ path: `${outputDir}/components/${kebab}.test.tsx`,
31
+ type: "test"
32
+ });
33
+ }
34
+ if (specType === "form") {
35
+ paths.push({
36
+ path: `${outputDir}/forms/${kebab}.form.tsx`,
37
+ type: "form"
38
+ });
39
+ paths.push({
40
+ path: `${outputDir}/forms/${kebab}.form.test.tsx`,
41
+ type: "test"
42
+ });
43
+ }
44
+ if (specType === "event") {
45
+ paths.push({
46
+ path: `${outputDir}/handlers/${kebab}.handler.ts`,
47
+ type: "handler"
48
+ });
49
+ paths.push({
50
+ path: `${outputDir}/handlers/${kebab}.handler.test.ts`,
51
+ type: "test"
52
+ });
53
+ }
54
+ return paths;
55
+ }
56
+
57
+ //#endregion
58
+ export { getConventionPaths, toKebabCase };
59
+ //# sourceMappingURL=conventions.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conventions.mjs","names":[],"sources":["../../../../src/services/implementation/resolver/conventions.ts"],"sourcesContent":["/**\n * Convention-based implementation path resolution.\n */\n\nimport type { ImplementationType } from '@contractspec/lib.contracts';\n\n/**\n * Convert string to kebab-case.\n */\nexport function toKebabCase(value: string): string {\n return value\n .replace(/\\./g, '-')\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .toLowerCase();\n}\n\n/**\n * Get convention-based implementation paths for a spec.\n */\nexport function getConventionPaths(\n specType: string,\n specKey: string,\n outputDir: string\n): { path: string; type: ImplementationType }[] {\n const kebab = toKebabCase(specKey);\n const paths: { path: string; type: ImplementationType }[] = [];\n\n if (specType === 'operation') {\n paths.push({\n path: `${outputDir}/handlers/${kebab}.handler.ts`,\n type: 'handler',\n });\n paths.push({\n path: `${outputDir}/handlers/${kebab}.handler.test.ts`,\n type: 'test',\n });\n }\n\n if (specType === 'presentation') {\n paths.push({\n path: `${outputDir}/components/${kebab}.tsx`,\n type: 'component',\n });\n paths.push({\n path: `${outputDir}/components/${kebab}.test.tsx`,\n type: 'test',\n });\n }\n\n if (specType === 'form') {\n paths.push({\n path: `${outputDir}/forms/${kebab}.form.tsx`,\n type: 'form',\n });\n paths.push({\n path: `${outputDir}/forms/${kebab}.form.test.tsx`,\n type: 'test',\n });\n }\n\n if (specType === 'event') {\n paths.push({\n path: `${outputDir}/handlers/${kebab}.handler.ts`,\n type: 'handler',\n });\n paths.push({\n path: `${outputDir}/handlers/${kebab}.handler.test.ts`,\n type: 'test',\n });\n }\n\n return paths;\n}\n"],"mappings":";;;;AASA,SAAgB,YAAY,OAAuB;AACjD,QAAO,MACJ,QAAQ,OAAO,IAAI,CACnB,QAAQ,mBAAmB,QAAQ,CACnC,aAAa;;;;;AAMlB,SAAgB,mBACd,UACA,SACA,WAC8C;CAC9C,MAAM,QAAQ,YAAY,QAAQ;CAClC,MAAM,QAAsD,EAAE;AAE9D,KAAI,aAAa,aAAa;AAC5B,QAAM,KAAK;GACT,MAAM,GAAG,UAAU,YAAY,MAAM;GACrC,MAAM;GACP,CAAC;AACF,QAAM,KAAK;GACT,MAAM,GAAG,UAAU,YAAY,MAAM;GACrC,MAAM;GACP,CAAC;;AAGJ,KAAI,aAAa,gBAAgB;AAC/B,QAAM,KAAK;GACT,MAAM,GAAG,UAAU,cAAc,MAAM;GACvC,MAAM;GACP,CAAC;AACF,QAAM,KAAK;GACT,MAAM,GAAG,UAAU,cAAc,MAAM;GACvC,MAAM;GACP,CAAC;;AAGJ,KAAI,aAAa,QAAQ;AACvB,QAAM,KAAK;GACT,MAAM,GAAG,UAAU,SAAS,MAAM;GAClC,MAAM;GACP,CAAC;AACF,QAAM,KAAK;GACT,MAAM,GAAG,UAAU,SAAS,MAAM;GAClC,MAAM;GACP,CAAC;;AAGJ,KAAI,aAAa,SAAS;AACxB,QAAM,KAAK;GACT,MAAM,GAAG,UAAU,YAAY,MAAM;GACrC,MAAM;GACP,CAAC;AACF,QAAM,KAAK;GACT,MAAM,GAAG,UAAU,YAAY,MAAM;GACrC,MAAM;GACP,CAAC;;AAGJ,QAAO"}
@@ -0,0 +1,24 @@
1
+ import { FsAdapter } from "../../../ports/fs.mjs";
2
+ import { ResolverOptions, SpecImplementationResult } from "../types.mjs";
3
+ import { getSpecKeyVariants, parseExplicitImplementations } from "./parsers.mjs";
4
+ import { getConventionPaths, toKebabCase } from "./conventions.mjs";
5
+ import { determineStatus, getImplementationSummary } from "./status.mjs";
6
+ import { WorkspaceConfig } from "@contractspec/module.workspace";
7
+
8
+ //#region src/services/implementation/resolver/index.d.ts
9
+
10
+ /**
11
+ * Resolve all implementations for a spec file.
12
+ */
13
+ declare function resolveImplementations(specFile: string, adapters: {
14
+ fs: FsAdapter;
15
+ }, config: WorkspaceConfig, options?: ResolverOptions): Promise<SpecImplementationResult>;
16
+ /**
17
+ * Resolve implementations for multiple spec files.
18
+ */
19
+ declare function resolveAllImplementations(specFiles: string[], adapters: {
20
+ fs: FsAdapter;
21
+ }, config: WorkspaceConfig, options?: ResolverOptions): Promise<SpecImplementationResult[]>;
22
+ //#endregion
23
+ export { resolveAllImplementations, resolveImplementations };
24
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/services/implementation/resolver/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAyKA;;AAGU,iBA5HY,sBAAA,CA4HZ,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA;EACC,EAAA,EA3HO,SA2HP;CACA,EAAA,MAAA,EA3HD,eA2HC,EAAA,OAAA,CAAA,EA1HA,eA0HA,CAAA,EAzHR,OAyHQ,CAzHA,wBAyHA,CAAA;;;;iBALW,yBAAA;MAEJ;WACR,2BACC,kBACR,QAAQ"}
@@ -0,0 +1,111 @@
1
+ import { discoverImplementationsForSpec } from "../discovery.mjs";
2
+ import { getConventionPaths, toKebabCase } from "./conventions.mjs";
3
+ import { getSpecKeyVariants, parseExplicitImplementations } from "./parsers.mjs";
4
+ import { determineStatus, getImplementationSummary } from "./status.mjs";
5
+ import { scanSpecSource } from "@contractspec/module.workspace";
6
+ import path from "path";
7
+ import { createHash } from "crypto";
8
+
9
+ //#region src/services/implementation/resolver/index.ts
10
+ /**
11
+ * Implementation resolver service.
12
+ *
13
+ * Resolves all implementations for a spec by merging:
14
+ * 1. Explicit mappings from spec.implementations
15
+ * 2. Auto-discovered references from workspace scanning
16
+ * 3. Convention-based paths (naming conventions)
17
+ */
18
+ const DEFAULT_OPTIONS = {
19
+ includeExplicit: true,
20
+ includeDiscovered: true,
21
+ includeConvention: true,
22
+ computeHashes: true
23
+ };
24
+ /**
25
+ * Compute SHA256 hash of content.
26
+ */
27
+ function computeHash(content) {
28
+ return createHash("sha256").update(content).digest("hex");
29
+ }
30
+ /**
31
+ * Resolve all implementations for a spec file.
32
+ */
33
+ async function resolveImplementations(specFile, adapters, config, options = {}) {
34
+ const opts = {
35
+ ...DEFAULT_OPTIONS,
36
+ ...options
37
+ };
38
+ const { fs } = adapters;
39
+ if (!await fs.exists(specFile)) throw new Error(`Spec file not found: ${specFile}`);
40
+ const specContent = await fs.readFile(specFile);
41
+ const specHash = opts.computeHashes ? computeHash(specContent) : void 0;
42
+ const scan = scanSpecSource(specContent, specFile);
43
+ const specKey = scan.key ?? path.basename(specFile).replace(/\.[jt]s$/, "");
44
+ const specVersion = scan.version ?? "1.0.0";
45
+ const specType = scan.specType ?? "operation";
46
+ const implementations = [];
47
+ const seenPaths = /* @__PURE__ */ new Set();
48
+ const addImpl = async (path$1, type, source, description) => {
49
+ if (seenPaths.has(path$1)) return;
50
+ seenPaths.add(path$1);
51
+ const exists = await fs.exists(path$1);
52
+ let contentHash;
53
+ if (exists && opts.computeHashes) try {
54
+ contentHash = computeHash(await fs.readFile(path$1));
55
+ } catch {}
56
+ implementations.push({
57
+ path: path$1,
58
+ type,
59
+ source,
60
+ exists,
61
+ contentHash,
62
+ description
63
+ });
64
+ };
65
+ if (opts.includeExplicit) {
66
+ const explicitImpls = parseExplicitImplementations(specContent);
67
+ for (const impl of explicitImpls) await addImpl(impl.path, impl.type, "explicit", impl.description);
68
+ }
69
+ if (opts.includeDiscovered) {
70
+ const discovered = await discoverImplementationsForSpec(specKey, adapters, opts);
71
+ const specKeyVariants = getSpecKeyVariants(specKey);
72
+ for (const variant of specKeyVariants) {
73
+ const variantDiscovered = await discoverImplementationsForSpec(variant, adapters, opts);
74
+ discovered.push(...variantDiscovered);
75
+ }
76
+ for (const ref of discovered) {
77
+ if (ref.filePath === specFile) continue;
78
+ await addImpl(ref.filePath, ref.inferredType, "discovered");
79
+ }
80
+ }
81
+ if (opts.includeConvention) {
82
+ const conventionPaths = getConventionPaths(specType, specKey, opts.outputDir ?? config.outputDir ?? "./src");
83
+ for (const { path: path$1, type } of conventionPaths) await addImpl(path$1, type, "convention");
84
+ }
85
+ return {
86
+ specKey,
87
+ specVersion,
88
+ specPath: specFile,
89
+ specType,
90
+ implementations,
91
+ status: determineStatus(implementations),
92
+ specHash
93
+ };
94
+ }
95
+ /**
96
+ * Resolve implementations for multiple spec files.
97
+ */
98
+ async function resolveAllImplementations(specFiles, adapters, config, options = {}) {
99
+ const results = [];
100
+ for (const specFile of specFiles) try {
101
+ const result = await resolveImplementations(specFile, adapters, config, options);
102
+ results.push(result);
103
+ } catch (error) {
104
+ console.error(`Failed to resolve implementations for ${specFile}:`, error);
105
+ }
106
+ return results;
107
+ }
108
+
109
+ //#endregion
110
+ export { resolveAllImplementations, resolveImplementations };
111
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["path"],"sources":["../../../../src/services/implementation/resolver/index.ts"],"sourcesContent":["/**\n * Implementation resolver service.\n *\n * Resolves all implementations for a spec by merging:\n * 1. Explicit mappings from spec.implementations\n * 2. Auto-discovered references from workspace scanning\n * 3. Convention-based paths (naming conventions)\n */\n\nimport { createHash } from 'crypto';\nimport path from 'path';\n\nimport type { WorkspaceConfig } from '@contractspec/module.workspace';\nimport { scanSpecSource } from '@contractspec/module.workspace';\nimport type { ImplementationType } from '@contractspec/lib.contracts';\nimport type { FsAdapter } from '../../../ports/fs';\nimport type {\n ResolverOptions,\n ResolvedImplementation,\n SpecImplementationResult,\n} from '../types';\nimport { discoverImplementationsForSpec } from '../discovery';\n\nimport { getConventionPaths } from './conventions';\nimport { getSpecKeyVariants, parseExplicitImplementations } from './parsers';\nimport { determineStatus } from './status';\n\nexport * from './parsers';\nexport * from './conventions';\nexport * from './status';\n\nconst DEFAULT_OPTIONS: ResolverOptions = {\n includeExplicit: true,\n includeDiscovered: true,\n includeConvention: true,\n computeHashes: true,\n};\n\n/**\n * Compute SHA256 hash of content.\n */\nfunction computeHash(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\n/**\n * Resolve all implementations for a spec file.\n */\nexport async function resolveImplementations(\n specFile: string,\n adapters: { fs: FsAdapter },\n config: WorkspaceConfig,\n options: ResolverOptions = {}\n): Promise<SpecImplementationResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const { fs } = adapters;\n\n // Read and parse spec file\n const specExists = await fs.exists(specFile);\n if (!specExists) {\n throw new Error(`Spec file not found: ${specFile}`);\n }\n\n const specContent = await fs.readFile(specFile);\n const specHash = opts.computeHashes ? computeHash(specContent) : undefined;\n const scan = scanSpecSource(specContent, specFile);\n\n const specKey = scan.key ?? path.basename(specFile).replace(/\\.[jt]s$/, '');\n const specVersion = scan.version ?? '1.0.0';\n const specType = scan.specType ?? 'operation';\n\n const implementations: ResolvedImplementation[] = [];\n const seenPaths = new Set<string>();\n\n // Helper to add unique implementations\n const addImpl = async (\n path: string,\n type: ImplementationType,\n source: ResolvedImplementation['source'],\n description?: string\n ) => {\n if (seenPaths.has(path)) return;\n seenPaths.add(path);\n\n const exists = await fs.exists(path);\n let contentHash: string | undefined;\n\n if (exists && opts.computeHashes) {\n try {\n const content = await fs.readFile(path);\n contentHash = computeHash(content);\n } catch {\n // Ignore hash computation errors\n }\n }\n\n implementations.push({\n path,\n type,\n source,\n exists,\n contentHash,\n description,\n });\n };\n\n // 1. Add explicit implementations from spec\n if (opts.includeExplicit) {\n // Parse explicit implementations from spec source\n const explicitImpls = parseExplicitImplementations(specContent);\n for (const impl of explicitImpls) {\n await addImpl(impl.path, impl.type, 'explicit', impl.description);\n }\n }\n\n // 2. Add auto-discovered implementations\n if (opts.includeDiscovered) {\n const discovered = await discoverImplementationsForSpec(\n specKey,\n adapters,\n opts\n );\n\n // Also search for spec key variants\n const specKeyVariants = getSpecKeyVariants(specKey);\n for (const variant of specKeyVariants) {\n const variantDiscovered = await discoverImplementationsForSpec(\n variant,\n adapters,\n opts\n );\n discovered.push(...variantDiscovered);\n }\n\n for (const ref of discovered) {\n // Skip the spec file itself\n if (ref.filePath === specFile) continue;\n\n await addImpl(ref.filePath, ref.inferredType, 'discovered');\n }\n }\n\n // 3. Add convention-based implementations\n if (opts.includeConvention) {\n const outputDir = opts.outputDir ?? config.outputDir ?? './src';\n const conventionPaths = getConventionPaths(specType, specKey, outputDir);\n\n for (const { path, type } of conventionPaths) {\n await addImpl(path, type, 'convention');\n }\n }\n\n // Determine overall status\n const status = determineStatus(implementations);\n\n return {\n specKey,\n specVersion,\n specPath: specFile,\n specType,\n implementations,\n status,\n specHash,\n };\n}\n\n/**\n * Resolve implementations for multiple spec files.\n */\nexport async function resolveAllImplementations(\n specFiles: string[],\n adapters: { fs: FsAdapter },\n config: WorkspaceConfig,\n options: ResolverOptions = {}\n): Promise<SpecImplementationResult[]> {\n const results: SpecImplementationResult[] = [];\n\n for (const specFile of specFiles) {\n try {\n const result = await resolveImplementations(\n specFile,\n adapters,\n config,\n options\n );\n results.push(result);\n } catch (error) {\n // Log error but continue with other specs\n console.error(\n `Failed to resolve implementations for ${specFile}:`,\n error\n );\n }\n }\n\n return results;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA+BA,MAAM,kBAAmC;CACvC,iBAAiB;CACjB,mBAAmB;CACnB,mBAAmB;CACnB,eAAe;CAChB;;;;AAKD,SAAS,YAAY,SAAyB;AAC5C,QAAO,WAAW,SAAS,CAAC,OAAO,QAAQ,CAAC,OAAO,MAAM;;;;;AAM3D,eAAsB,uBACpB,UACA,UACA,QACA,UAA2B,EAAE,EACM;CACnC,MAAM,OAAO;EAAE,GAAG;EAAiB,GAAG;EAAS;CAC/C,MAAM,EAAE,OAAO;AAIf,KAAI,CADe,MAAM,GAAG,OAAO,SAAS,CAE1C,OAAM,IAAI,MAAM,wBAAwB,WAAW;CAGrD,MAAM,cAAc,MAAM,GAAG,SAAS,SAAS;CAC/C,MAAM,WAAW,KAAK,gBAAgB,YAAY,YAAY,GAAG;CACjE,MAAM,OAAO,eAAe,aAAa,SAAS;CAElD,MAAM,UAAU,KAAK,OAAO,KAAK,SAAS,SAAS,CAAC,QAAQ,YAAY,GAAG;CAC3E,MAAM,cAAc,KAAK,WAAW;CACpC,MAAM,WAAW,KAAK,YAAY;CAElC,MAAM,kBAA4C,EAAE;CACpD,MAAM,4BAAY,IAAI,KAAa;CAGnC,MAAM,UAAU,OACd,QACA,MACA,QACA,gBACG;AACH,MAAI,UAAU,IAAIA,OAAK,CAAE;AACzB,YAAU,IAAIA,OAAK;EAEnB,MAAM,SAAS,MAAM,GAAG,OAAOA,OAAK;EACpC,IAAI;AAEJ,MAAI,UAAU,KAAK,cACjB,KAAI;AAEF,iBAAc,YADE,MAAM,GAAG,SAASA,OAAK,CACL;UAC5B;AAKV,kBAAgB,KAAK;GACnB;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;;AAIJ,KAAI,KAAK,iBAAiB;EAExB,MAAM,gBAAgB,6BAA6B,YAAY;AAC/D,OAAK,MAAM,QAAQ,cACjB,OAAM,QAAQ,KAAK,MAAM,KAAK,MAAM,YAAY,KAAK,YAAY;;AAKrE,KAAI,KAAK,mBAAmB;EAC1B,MAAM,aAAa,MAAM,+BACvB,SACA,UACA,KACD;EAGD,MAAM,kBAAkB,mBAAmB,QAAQ;AACnD,OAAK,MAAM,WAAW,iBAAiB;GACrC,MAAM,oBAAoB,MAAM,+BAC9B,SACA,UACA,KACD;AACD,cAAW,KAAK,GAAG,kBAAkB;;AAGvC,OAAK,MAAM,OAAO,YAAY;AAE5B,OAAI,IAAI,aAAa,SAAU;AAE/B,SAAM,QAAQ,IAAI,UAAU,IAAI,cAAc,aAAa;;;AAK/D,KAAI,KAAK,mBAAmB;EAE1B,MAAM,kBAAkB,mBAAmB,UAAU,SADnC,KAAK,aAAa,OAAO,aAAa,QACgB;AAExE,OAAK,MAAM,EAAE,cAAM,UAAU,gBAC3B,OAAM,QAAQA,QAAM,MAAM,aAAa;;AAO3C,QAAO;EACL;EACA;EACA,UAAU;EACV;EACA;EACA,QARa,gBAAgB,gBAAgB;EAS7C;EACD;;;;;AAMH,eAAsB,0BACpB,WACA,UACA,QACA,UAA2B,EAAE,EACQ;CACrC,MAAM,UAAsC,EAAE;AAE9C,MAAK,MAAM,YAAY,UACrB,KAAI;EACF,MAAM,SAAS,MAAM,uBACnB,UACA,UACA,QACA,QACD;AACD,UAAQ,KAAK,OAAO;UACb,OAAO;AAEd,UAAQ,MACN,yCAAyC,SAAS,IAClD,MACD;;AAIL,QAAO"}
@@ -0,0 +1,16 @@
1
+ import { ImplementationRef } from "@contractspec/lib.contracts";
2
+
3
+ //#region src/services/implementation/resolver/parsers.d.ts
4
+
5
+ /**
6
+ * Parse explicit implementations from spec source code using ts-morph.
7
+ * Looks for: implementations: [{ path: '...', type: '...' }] inside the main spec object.
8
+ */
9
+ declare function parseExplicitImplementations(code: string): ImplementationRef[];
10
+ /**
11
+ * Get common variants of a spec key for discovery.
12
+ */
13
+ declare function getSpecKeyVariants(specKey: string): string[];
14
+ //#endregion
15
+ export { getSpecKeyVariants, parseExplicitImplementations };
16
+ //# sourceMappingURL=parsers.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsers.d.mts","names":[],"sources":["../../../../src/services/implementation/resolver/parsers.ts"],"sourcesContent":[],"mappings":";;;;AAqIA;;;;iBAvHgB,4BAAA,gBAEb;;;;iBAqHa,kBAAA"}
@@ -0,0 +1,100 @@
1
+ import { Node, Project, SyntaxKind } from "ts-morph";
2
+
3
+ //#region src/services/implementation/resolver/parsers.ts
4
+ /**
5
+ * Parse explicit implementations from spec source code using ts-morph.
6
+ * Looks for: implementations: [{ path: '...', type: '...' }] inside the main spec object.
7
+ */
8
+ function parseExplicitImplementations(code) {
9
+ const implementations = [];
10
+ const sourceFile = new Project({ useInMemoryFileSystem: true }).createSourceFile("spec.ts", code);
11
+ const extractImpls = (obj) => {
12
+ if (!Node.isObjectLiteralExpression(obj)) return;
13
+ const prop = obj.getProperty("implementations");
14
+ if (prop && Node.isPropertyAssignment(prop)) {
15
+ const init = prop.getInitializer();
16
+ if (init && Node.isArrayLiteralExpression(init)) {
17
+ for (const elem of init.getElements()) if (Node.isObjectLiteralExpression(elem)) {
18
+ let pathVal;
19
+ let typeVal;
20
+ let descVal;
21
+ const pathProp = elem.getProperty("path");
22
+ if (pathProp && Node.isPropertyAssignment(pathProp)) {
23
+ const init$1 = pathProp.getInitializer();
24
+ if (Node.isStringLiteral(init$1)) pathVal = init$1.getLiteralText();
25
+ }
26
+ const typeProp = elem.getProperty("type");
27
+ if (typeProp && Node.isPropertyAssignment(typeProp)) {
28
+ const init$1 = typeProp.getInitializer();
29
+ if (Node.isStringLiteral(init$1)) typeVal = init$1.getLiteralText();
30
+ }
31
+ const descProp = elem.getProperty("description");
32
+ if (descProp && Node.isPropertyAssignment(descProp)) {
33
+ const init$1 = descProp.getInitializer();
34
+ if (Node.isStringLiteral(init$1)) descVal = init$1.getLiteralText();
35
+ }
36
+ if (pathVal && typeVal) implementations.push({
37
+ path: pathVal,
38
+ type: typeVal,
39
+ description: descVal
40
+ });
41
+ }
42
+ }
43
+ }
44
+ };
45
+ const callExpressions = sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression);
46
+ for (const call of callExpressions) {
47
+ const expr = call.getExpression().getText();
48
+ if ([
49
+ "defineCommand",
50
+ "defineQuery",
51
+ "defineEvent",
52
+ "defineFeature"
53
+ ].includes(expr)) {
54
+ const args = call.getArguments();
55
+ if (args.length > 0 && Node.isObjectLiteralExpression(args[0])) {
56
+ extractImpls(args[0]);
57
+ return implementations;
58
+ }
59
+ }
60
+ }
61
+ const varStmts = sourceFile.getVariableStatements();
62
+ for (const stmt of varStmts) if (stmt.isExported()) for (const decl of stmt.getDeclarations()) {
63
+ const init = decl.getInitializer();
64
+ if (init && Node.isObjectLiteralExpression(init)) {
65
+ if (init.getProperty("implementations")) {
66
+ extractImpls(init);
67
+ return implementations;
68
+ }
69
+ }
70
+ }
71
+ const exportAssign = sourceFile.getExportAssignment((d) => !d.isExportEquals());
72
+ if (exportAssign) {
73
+ const expr = exportAssign.getExpression();
74
+ if (Node.isObjectLiteralExpression(expr)) extractImpls(expr);
75
+ else if (Node.isAsExpression(expr) && Node.isObjectLiteralExpression(expr.getExpression())) extractImpls(expr.getExpression());
76
+ }
77
+ return implementations;
78
+ }
79
+ /**
80
+ * Get common variants of a spec key for discovery.
81
+ */
82
+ function getSpecKeyVariants(specKey) {
83
+ const variants = [];
84
+ const base = specKey.replace(/Spec$/, "").replace(/Contract$/, "").replace(/Command$/, "").replace(/Query$/, "");
85
+ if (base !== specKey) {
86
+ variants.push(base);
87
+ variants.push(`${base}Spec`);
88
+ variants.push(`${base}Contract`);
89
+ }
90
+ const parts = specKey.split(".");
91
+ if (parts.length > 1) {
92
+ const pascalName = parts.map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join("");
93
+ variants.push(pascalName);
94
+ }
95
+ return variants;
96
+ }
97
+
98
+ //#endregion
99
+ export { getSpecKeyVariants, parseExplicitImplementations };
100
+ //# sourceMappingURL=parsers.mjs.map