@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,186 @@
1
+ import { isEmitDeclRef } from "@contractspec/lib.contracts/operations";
2
+
3
+ //#region src/services/verify/behavior-verifier.ts
4
+ /**
5
+ * Check if a scenario is likely covered by the implementation.
6
+ */
7
+ function checkScenarioCoverage(code, scenario) {
8
+ const keywords = [
9
+ ...scenario.given,
10
+ ...scenario.when,
11
+ ...scenario.then
12
+ ].flatMap((s) => s.toLowerCase().split(/\s+/).filter((w) => w.length > 3));
13
+ const codeLower = code.toLowerCase();
14
+ const foundKeywords = keywords.filter((kw) => codeLower.includes(kw));
15
+ const coverage = keywords.length > 0 ? foundKeywords.length / keywords.length : 0;
16
+ const scenarioNameLower = scenario.key.toLowerCase().replace(/\s+/g, "");
17
+ const hasTestForScenario = codeLower.includes(scenarioNameLower) || codeLower.includes(`test('${scenario.key.toLowerCase()}'`) || codeLower.includes(`it('${scenario.key.toLowerCase()}'`) || codeLower.includes(`describe('${scenario.key.toLowerCase()}'`);
18
+ const passed = coverage >= .3 || hasTestForScenario;
19
+ return {
20
+ name: scenario.key,
21
+ type: "scenario",
22
+ passed,
23
+ expected: `Given: ${scenario.given.join("; ")}; When: ${scenario.when.join("; ")}; Then: ${scenario.then.join("; ")}`,
24
+ details: passed ? void 0 : `Scenario keywords not found in implementation (${Math.round(coverage * 100)}% coverage)`
25
+ };
26
+ }
27
+ /**
28
+ * Check if an example is likely handled.
29
+ */
30
+ function checkExampleCoverage(code, example) {
31
+ const inputStr = JSON.stringify(example.input);
32
+ const outputStr = JSON.stringify(example.output);
33
+ const inputValues = extractStringValues(example.input);
34
+ const outputValues = extractStringValues(example.output);
35
+ const codeLower = code.toLowerCase();
36
+ const foundInputValues = inputValues.filter((v) => codeLower.includes(v.toLowerCase()));
37
+ const foundOutputValues = outputValues.filter((v) => codeLower.includes(v.toLowerCase()));
38
+ const avgCoverage = ((inputValues.length > 0 ? foundInputValues.length / inputValues.length : 1) + (outputValues.length > 0 ? foundOutputValues.length / outputValues.length : 1)) / 2;
39
+ const passed = avgCoverage >= .2;
40
+ return {
41
+ name: example.key,
42
+ type: "example",
43
+ passed,
44
+ expected: `Input: ${inputStr.slice(0, 100)}...; Output: ${outputStr.slice(0, 100)}...`,
45
+ details: passed ? void 0 : `Example values not found in implementation (${Math.round(avgCoverage * 100)}% coverage)`
46
+ };
47
+ }
48
+ /**
49
+ * Extract string values from an object for comparison.
50
+ */
51
+ function extractStringValues(obj) {
52
+ const values = [];
53
+ function extract(value) {
54
+ if (typeof value === "string" && value.length > 2) values.push(value);
55
+ else if (Array.isArray(value)) value.forEach(extract);
56
+ else if (value && typeof value === "object") Object.values(value).forEach(extract);
57
+ }
58
+ extract(obj);
59
+ return values;
60
+ }
61
+ /**
62
+ * Check if an error case is handled.
63
+ */
64
+ function checkErrorCaseCoverage(code, errorCode, errorDef) {
65
+ const hasErrorCode = code.includes(errorCode);
66
+ const hasHttpStatus = errorDef.http ? code.includes(String(errorDef.http)) : true;
67
+ const whenKeywords = errorDef.when.toLowerCase().split(/\s+/).filter((w) => w.length > 3);
68
+ const codeLower = code.toLowerCase();
69
+ const foundWhenKeywords = whenKeywords.filter((kw) => codeLower.includes(kw));
70
+ const whenCoverage = whenKeywords.length > 0 ? foundWhenKeywords.length / whenKeywords.length : 1;
71
+ const passed = hasErrorCode && (hasHttpStatus || whenCoverage >= .3);
72
+ return {
73
+ name: `Error: ${errorCode}`,
74
+ type: "error",
75
+ passed,
76
+ expected: `When: ${errorDef.when}; Return: ${errorCode} (HTTP ${errorDef.http ?? 400})`,
77
+ details: passed ? void 0 : !hasErrorCode ? `Error code '${errorCode}' not found in implementation` : `Error condition not properly implemented`
78
+ };
79
+ }
80
+ /**
81
+ * Check if events are emitted in the right conditions.
82
+ */
83
+ function checkEventConditions(code, spec) {
84
+ const events = spec.sideEffects?.emits ?? [];
85
+ const checks = [];
86
+ for (const event of events) {
87
+ const eventName = isEmitDeclRef(event) ? event.ref.key : event.key;
88
+ const when = event.when;
89
+ const whenKeywords = when.toLowerCase().split(/\s+/).filter((w) => w.length > 3);
90
+ const codeLower = code.toLowerCase();
91
+ const hasEvent = codeLower.includes(eventName.toLowerCase());
92
+ const foundKeywords = whenKeywords.filter((kw) => codeLower.includes(kw));
93
+ const conditionCoverage = whenKeywords.length > 0 ? foundKeywords.length / whenKeywords.length : 1;
94
+ checks.push({
95
+ name: `Event: ${eventName}`,
96
+ type: "scenario",
97
+ passed: hasEvent && conditionCoverage >= .3,
98
+ expected: `Emit ${eventName} when: ${when}`,
99
+ details: !hasEvent ? `Event '${eventName}' not found` : conditionCoverage < .3 ? `Event condition not properly implemented` : void 0
100
+ });
101
+ }
102
+ return checks;
103
+ }
104
+ /**
105
+ * Check if idempotency is properly handled.
106
+ */
107
+ function checkIdempotency(code, spec) {
108
+ if (spec.policy.idempotent === void 0) return null;
109
+ if (!spec.policy.idempotent) return null;
110
+ const idempotentPatterns = [
111
+ "idempotency",
112
+ "idempotent",
113
+ "already exists",
114
+ "upsert",
115
+ "on conflict",
116
+ "if not exists",
117
+ "dedupe",
118
+ "duplicate"
119
+ ];
120
+ const codeLower = code.toLowerCase();
121
+ const hasIdempotentPattern = idempotentPatterns.some((p) => codeLower.includes(p));
122
+ return {
123
+ name: "Idempotency",
124
+ type: "scenario",
125
+ passed: hasIdempotentPattern,
126
+ expected: "Operation should be idempotent (safe to retry)",
127
+ details: hasIdempotentPattern ? void 0 : "No idempotency pattern found for idempotent operation"
128
+ };
129
+ }
130
+ /**
131
+ * Run all behavior checks and produce a verification report.
132
+ */
133
+ function verifyBehavior(input) {
134
+ const { spec, implementationCode, implementationPath } = input;
135
+ const startTime = Date.now();
136
+ const checks = [];
137
+ for (const scenario of spec.acceptance?.scenarios ?? []) checks.push(checkScenarioCoverage(implementationCode, scenario));
138
+ for (const example of spec.acceptance?.examples ?? []) checks.push(checkExampleCoverage(implementationCode, example));
139
+ for (const [code, errorDef] of Object.entries(spec.io.errors ?? {})) checks.push(checkErrorCaseCoverage(implementationCode, code, errorDef));
140
+ checks.push(...checkEventConditions(implementationCode, spec));
141
+ const idempotencyCheck = checkIdempotency(implementationCode, spec);
142
+ if (idempotencyCheck) checks.push(idempotencyCheck);
143
+ const issues = checks.filter((c) => !c.passed).map((c) => ({
144
+ severity: c.type === "error" ? "error" : "warning",
145
+ category: c.type === "scenario" ? "scenario" : c.type === "example" ? "scenario" : "error_handling",
146
+ message: c.details ?? `${c.type} not covered: ${c.name}`,
147
+ location: implementationPath ? { file: implementationPath } : void 0,
148
+ suggestion: c.expected ? `Expected: ${c.expected}` : void 0
149
+ }));
150
+ const scenarioChecks = checks.filter((c) => c.type === "scenario");
151
+ const errorChecks = checks.filter((c) => c.type === "error");
152
+ const passedCount = checks.filter((c) => c.passed).length;
153
+ const score = checks.length > 0 ? Math.round(passedCount / checks.length * 100) : 100;
154
+ return {
155
+ tier: "behavior",
156
+ passed: issues.filter((i) => i.severity === "error").length === 0,
157
+ score,
158
+ issues,
159
+ suggestions: checks.filter((c) => !c.passed && c.expected).map((c) => `${c.name}: ${c.expected}`),
160
+ coverage: {
161
+ scenarios: {
162
+ total: scenarioChecks.length,
163
+ covered: scenarioChecks.filter((c) => c.passed).length
164
+ },
165
+ errors: {
166
+ total: errorChecks.length,
167
+ handled: errorChecks.filter((c) => c.passed).length
168
+ },
169
+ fields: {
170
+ total: checks.length,
171
+ implemented: passedCount
172
+ }
173
+ },
174
+ meta: {
175
+ specName: spec.meta.key,
176
+ specVersion: spec.meta.version,
177
+ implementationPath: implementationPath ?? "unknown",
178
+ verifiedAt: (/* @__PURE__ */ new Date()).toISOString(),
179
+ duration: Date.now() - startTime
180
+ }
181
+ };
182
+ }
183
+
184
+ //#endregion
185
+ export { verifyBehavior };
186
+ //# sourceMappingURL=behavior-verifier.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"behavior-verifier.mjs","names":[],"sources":["../../../src/services/verify/behavior-verifier.ts"],"sourcesContent":["/**\n * Tier 2: Behavior Verification\n *\n * Verifies that the implementation covers acceptance scenarios,\n * examples, and error cases defined in the spec.\n */\n\nimport type { AnyOperationSpec } from '@contractspec/lib.contracts';\nimport { isEmitDeclRef } from '@contractspec/lib.contracts/operations';\nimport type {\n VerificationIssue,\n VerificationReport,\n} from '@contractspec/lib.contracts/llm';\nimport type { BehaviorCheck, VerifyInput } from './types';\n\n/**\n * Check if a scenario is likely covered by the implementation.\n */\nfunction checkScenarioCoverage(\n code: string,\n scenario: { key: string; given: string[]; when: string[]; then: string[] }\n): BehaviorCheck {\n // Extract keywords from scenario\n const keywords = [\n ...scenario.given,\n ...scenario.when,\n ...scenario.then,\n ].flatMap((s) =>\n s\n .toLowerCase()\n .split(/\\s+/)\n .filter((w) => w.length > 3)\n );\n\n // Count how many keywords appear in code\n const codeLower = code.toLowerCase();\n const foundKeywords = keywords.filter((kw) => codeLower.includes(kw));\n const coverage =\n keywords.length > 0 ? foundKeywords.length / keywords.length : 0;\n\n // Also check for test patterns mentioning the scenario\n const scenarioNameLower = scenario.key.toLowerCase().replace(/\\s+/g, '');\n const hasTestForScenario =\n codeLower.includes(scenarioNameLower) ||\n codeLower.includes(`test('${scenario.key.toLowerCase()}'`) ||\n codeLower.includes(`it('${scenario.key.toLowerCase()}'`) ||\n codeLower.includes(`describe('${scenario.key.toLowerCase()}'`);\n\n const passed = coverage >= 0.3 || hasTestForScenario;\n\n return {\n name: scenario.key,\n type: 'scenario',\n passed,\n expected: `Given: ${scenario.given.join('; ')}; When: ${scenario.when.join('; ')}; Then: ${scenario.then.join('; ')}`,\n details: passed\n ? undefined\n : `Scenario keywords not found in implementation (${Math.round(coverage * 100)}% coverage)`,\n };\n}\n\n/**\n * Check if an example is likely handled.\n */\nfunction checkExampleCoverage(\n code: string,\n example: { key: string; input: unknown; output: unknown }\n): BehaviorCheck {\n // Extract key values from example\n const inputStr = JSON.stringify(example.input);\n const outputStr = JSON.stringify(example.output);\n\n // Look for example values in code (could be in tests or implementation)\n const inputValues = extractStringValues(example.input);\n const outputValues = extractStringValues(example.output);\n\n const codeLower = code.toLowerCase();\n const foundInputValues = inputValues.filter((v) =>\n codeLower.includes(v.toLowerCase())\n );\n const foundOutputValues = outputValues.filter((v) =>\n codeLower.includes(v.toLowerCase())\n );\n\n const inputCoverage =\n inputValues.length > 0 ? foundInputValues.length / inputValues.length : 1;\n const outputCoverage =\n outputValues.length > 0\n ? foundOutputValues.length / outputValues.length\n : 1;\n const avgCoverage = (inputCoverage + outputCoverage) / 2;\n\n const passed = avgCoverage >= 0.2;\n\n return {\n name: example.key,\n type: 'example',\n passed,\n expected: `Input: ${inputStr.slice(0, 100)}...; Output: ${outputStr.slice(0, 100)}...`,\n details: passed\n ? undefined\n : `Example values not found in implementation (${Math.round(avgCoverage * 100)}% coverage)`,\n };\n}\n\n/**\n * Extract string values from an object for comparison.\n */\nfunction extractStringValues(obj: unknown): string[] {\n const values: string[] = [];\n\n function extract(value: unknown): void {\n if (typeof value === 'string' && value.length > 2) {\n values.push(value);\n } else if (Array.isArray(value)) {\n value.forEach(extract);\n } else if (value && typeof value === 'object') {\n Object.values(value).forEach(extract);\n }\n }\n\n extract(obj);\n return values;\n}\n\n/**\n * Check if an error case is handled.\n */\nfunction checkErrorCaseCoverage(\n code: string,\n errorCode: string,\n errorDef: { description: string; http?: number; when: string }\n): BehaviorCheck {\n // Check if error code is referenced\n const hasErrorCode = code.includes(errorCode);\n\n // Check for HTTP status code\n const hasHttpStatus = errorDef.http\n ? code.includes(String(errorDef.http))\n : true;\n\n // Check for keywords from the 'when' condition\n const whenKeywords = errorDef.when\n .toLowerCase()\n .split(/\\s+/)\n .filter((w) => w.length > 3);\n const codeLower = code.toLowerCase();\n const foundWhenKeywords = whenKeywords.filter((kw) => codeLower.includes(kw));\n const whenCoverage =\n whenKeywords.length > 0\n ? foundWhenKeywords.length / whenKeywords.length\n : 1;\n\n const passed = hasErrorCode && (hasHttpStatus || whenCoverage >= 0.3);\n\n return {\n name: `Error: ${errorCode}`,\n type: 'error',\n passed,\n expected: `When: ${errorDef.when}; Return: ${errorCode} (HTTP ${errorDef.http ?? 400})`,\n details: passed\n ? undefined\n : !hasErrorCode\n ? `Error code '${errorCode}' not found in implementation`\n : `Error condition not properly implemented`,\n };\n}\n\n/**\n * Check if events are emitted in the right conditions.\n */\nfunction checkEventConditions(\n code: string,\n spec: AnyOperationSpec\n): BehaviorCheck[] {\n const events = spec.sideEffects?.emits ?? [];\n const checks: BehaviorCheck[] = [];\n\n for (const event of events) {\n const eventName = isEmitDeclRef(event) ? event.ref.key : event.key;\n const when = event.when;\n\n // Check if event name appears near the condition keywords\n const whenKeywords = when\n .toLowerCase()\n .split(/\\s+/)\n .filter((w) => w.length > 3);\n const codeLower = code.toLowerCase();\n\n // Find if event is mentioned\n const hasEvent = codeLower.includes(eventName.toLowerCase());\n\n // Find if condition keywords are present\n const foundKeywords = whenKeywords.filter((kw) => codeLower.includes(kw));\n const conditionCoverage =\n whenKeywords.length > 0 ? foundKeywords.length / whenKeywords.length : 1;\n\n checks.push({\n name: `Event: ${eventName}`,\n type: 'scenario',\n passed: hasEvent && conditionCoverage >= 0.3,\n expected: `Emit ${eventName} when: ${when}`,\n details: !hasEvent\n ? `Event '${eventName}' not found`\n : conditionCoverage < 0.3\n ? `Event condition not properly implemented`\n : undefined,\n });\n }\n\n return checks;\n}\n\n/**\n * Check if idempotency is properly handled.\n */\nfunction checkIdempotency(\n code: string,\n spec: AnyOperationSpec\n): BehaviorCheck | null {\n if (spec.policy.idempotent === undefined) {\n return null;\n }\n\n if (!spec.policy.idempotent) {\n // Command that's not idempotent - no specific check needed\n return null;\n }\n\n // For idempotent operations, look for patterns that ensure idempotency\n const idempotentPatterns = [\n 'idempotency',\n 'idempotent',\n 'already exists',\n 'upsert',\n 'on conflict',\n 'if not exists',\n 'dedupe',\n 'duplicate',\n ];\n\n const codeLower = code.toLowerCase();\n const hasIdempotentPattern = idempotentPatterns.some((p) =>\n codeLower.includes(p)\n );\n\n return {\n name: 'Idempotency',\n type: 'scenario',\n passed: hasIdempotentPattern,\n expected: 'Operation should be idempotent (safe to retry)',\n details: hasIdempotentPattern\n ? undefined\n : 'No idempotency pattern found for idempotent operation',\n };\n}\n\n/**\n * Run all behavior checks and produce a verification report.\n */\nexport function verifyBehavior(input: VerifyInput): VerificationReport {\n const { spec, implementationCode, implementationPath } = input;\n const startTime = Date.now();\n\n const checks: BehaviorCheck[] = [];\n\n // Check scenarios\n for (const scenario of spec.acceptance?.scenarios ?? []) {\n checks.push(checkScenarioCoverage(implementationCode, scenario));\n }\n\n // Check examples\n for (const example of spec.acceptance?.examples ?? []) {\n checks.push(checkExampleCoverage(implementationCode, example));\n }\n\n // Check error cases\n for (const [code, errorDef] of Object.entries(spec.io.errors ?? {})) {\n checks.push(checkErrorCaseCoverage(implementationCode, code, errorDef));\n }\n\n // Check event conditions\n checks.push(...checkEventConditions(implementationCode, spec));\n\n // Check idempotency\n const idempotencyCheck = checkIdempotency(implementationCode, spec);\n if (idempotencyCheck) {\n checks.push(idempotencyCheck);\n }\n\n // Convert to issues\n const issues: VerificationIssue[] = checks\n .filter((c) => !c.passed)\n .map((c) => ({\n severity: c.type === 'error' ? ('error' as const) : ('warning' as const),\n category:\n c.type === 'scenario'\n ? ('scenario' as const)\n : c.type === 'example'\n ? ('scenario' as const)\n : ('error_handling' as const),\n message: c.details ?? `${c.type} not covered: ${c.name}`,\n location: implementationPath ? { file: implementationPath } : undefined,\n suggestion: c.expected ? `Expected: ${c.expected}` : undefined,\n }));\n\n // Calculate metrics\n const scenarioChecks = checks.filter((c) => c.type === 'scenario');\n const errorChecks = checks.filter((c) => c.type === 'error');\n\n const passedCount = checks.filter((c) => c.passed).length;\n const score =\n checks.length > 0 ? Math.round((passedCount / checks.length) * 100) : 100;\n const passed = issues.filter((i) => i.severity === 'error').length === 0;\n\n // Generate suggestions\n const suggestions = checks\n .filter((c) => !c.passed && c.expected)\n .map((c) => `${c.name}: ${c.expected}`);\n\n return {\n tier: 'behavior',\n passed,\n score,\n issues,\n suggestions,\n coverage: {\n scenarios: {\n total: scenarioChecks.length,\n covered: scenarioChecks.filter((c) => c.passed).length,\n },\n errors: {\n total: errorChecks.length,\n handled: errorChecks.filter((c) => c.passed).length,\n },\n fields: {\n total: checks.length,\n implemented: passedCount,\n },\n },\n meta: {\n specName: spec.meta.key,\n specVersion: spec.meta.version,\n implementationPath: implementationPath ?? 'unknown',\n verifiedAt: new Date().toISOString(),\n duration: Date.now() - startTime,\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { AIReviewResult, BehaviorCheck, FieldMapping, FieldMatchType, IntentAlignment, SemanticVerificationResult, StructureCheck, VerifyConfig, VerifyInput, VerifyOptions, VerifyResult } from "./types.mjs";
2
+ import { VerifyService, createVerifyService, verifyService } from "./verify-service.mjs";
3
+ import { verifyStructure } from "./structure-verifier.mjs";
4
+ import { verifyBehavior } from "./behavior-verifier.mjs";
5
+ import { createQuickAIReview, verifySemanticFields, verifyWithAI, verifyWithAIEnhanced } from "./ai-verifier.mjs";
@@ -0,0 +1,6 @@
1
+ import { verifyStructure } from "./structure-verifier.mjs";
2
+ import { verifyBehavior } from "./behavior-verifier.mjs";
3
+ import { createQuickAIReview, verifySemanticFields, verifyWithAI, verifyWithAIEnhanced } from "./ai-verifier.mjs";
4
+ import { VerifyService, createVerifyService, verifyService } from "./verify-service.mjs";
5
+
6
+ export { };
@@ -0,0 +1,12 @@
1
+ import { VerifyInput } from "./types.mjs";
2
+ import { VerificationReport } from "@contractspec/lib.contracts/llm";
3
+
4
+ //#region src/services/verify/structure-verifier.d.ts
5
+
6
+ /**
7
+ * Run all structure checks and produce a verification report.
8
+ */
9
+ declare function verifyStructure(input: VerifyInput): VerificationReport;
10
+ //#endregion
11
+ export { verifyStructure };
12
+ //# sourceMappingURL=structure-verifier.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure-verifier.d.mts","names":[],"sources":["../../../src/services/verify/structure-verifier.ts"],"sourcesContent":[],"mappings":";;;;;;;;iBA0PgB,eAAA,QAAuB,cAAc"}
@@ -0,0 +1,196 @@
1
+ import { isEmitDeclRef } from "@contractspec/lib.contracts/operations";
2
+
3
+ //#region src/services/verify/structure-verifier.ts
4
+ /**
5
+ * Check if code exports a handler function.
6
+ */
7
+ function checkHandlerExport(code) {
8
+ const hasExport = /export\s+(async\s+)?function\s+\w+/.test(code) || /export\s+const\s+\w+\s*=\s*(async\s*)?\(/.test(code) || /export\s+default\s+(async\s+)?function/.test(code) || /export\s+\{\s*\w+/.test(code);
9
+ return {
10
+ name: "handler_export",
11
+ passed: hasExport,
12
+ details: hasExport ? void 0 : "No exported handler function found",
13
+ suggestion: "Export a function that handles the operation: export async function handle(...) { }"
14
+ };
15
+ }
16
+ /**
17
+ * Check if code imports from @contractspec/lib.contracts.
18
+ */
19
+ function checkContractsImport(code) {
20
+ const hasImport = code.includes("from '@contractspec/lib.contracts'") || code.includes("from \"@contractspec/lib.contracts\"");
21
+ return {
22
+ name: "contracts_import",
23
+ passed: hasImport,
24
+ details: hasImport ? void 0 : "Missing import from @contractspec/lib.contracts",
25
+ suggestion: "Add: import { ... } from '@contractspec/lib.contracts';"
26
+ };
27
+ }
28
+ /**
29
+ * Check if code imports from @contractspec/lib.schema.
30
+ */
31
+ function checkSchemaImport(code, spec) {
32
+ if (!(spec.io.input !== null || spec.io.output !== null)) return {
33
+ name: "schema_import",
34
+ passed: true
35
+ };
36
+ const hasImport = code.includes("from '@contractspec/lib.schema'") || code.includes("from \"@contractspec/lib.schema\"");
37
+ return {
38
+ name: "schema_import",
39
+ passed: hasImport,
40
+ details: hasImport ? void 0 : "Missing import from @contractspec/lib.schema",
41
+ suggestion: "Add: import { ... } from '@contractspec/lib.schema';"
42
+ };
43
+ }
44
+ /**
45
+ * Check for TypeScript any usage.
46
+ */
47
+ function checkNoAnyType(code) {
48
+ const anyPattern = /:\s*any\b|as\s+any\b|<any>/;
49
+ const lines = code.split("\n");
50
+ const anyUsages = [];
51
+ for (let i = 0; i < lines.length; i++) {
52
+ const line = lines[i] ?? "";
53
+ if (line.trim().startsWith("//") || line.trim().startsWith("*")) continue;
54
+ if (anyPattern.test(line)) anyUsages.push(i + 1);
55
+ }
56
+ return {
57
+ name: "no_any_type",
58
+ passed: anyUsages.length === 0,
59
+ details: anyUsages.length > 0 ? `Found 'any' type on lines: ${anyUsages.slice(0, 5).join(", ")}${anyUsages.length > 5 ? "..." : ""}` : void 0,
60
+ suggestion: "Replace any with proper types from the spec schema"
61
+ };
62
+ }
63
+ /**
64
+ * Check if error codes from spec are handled.
65
+ */
66
+ function checkErrorHandling(code, spec) {
67
+ const errors = spec.io.errors;
68
+ if (!errors || Object.keys(errors).length === 0) return {
69
+ name: "error_handling",
70
+ passed: true
71
+ };
72
+ const errorCodes = Object.keys(errors);
73
+ const missingErrors = [];
74
+ for (const errorCode of errorCodes) if (!code.includes(errorCode)) missingErrors.push(errorCode);
75
+ return {
76
+ name: "error_handling",
77
+ passed: missingErrors.length === 0,
78
+ details: missingErrors.length > 0 ? `Missing error handling for: ${missingErrors.join(", ")}` : void 0,
79
+ suggestion: "Implement handlers for all error cases defined in the spec"
80
+ };
81
+ }
82
+ /**
83
+ * Check if events are emitted.
84
+ */
85
+ function checkEventEmission(code, spec) {
86
+ const events = spec.sideEffects?.emits;
87
+ if (!events || events.length === 0) return {
88
+ name: "event_emission",
89
+ passed: true
90
+ };
91
+ const hasEmitPattern = code.includes("emit(") || code.includes(".emit(") || code.includes("publish(") || code.includes(".publish(") || code.includes("dispatchEvent") || code.includes("eventBus");
92
+ const eventNames = events.map((e) => {
93
+ if (isEmitDeclRef(e)) return e.ref.key;
94
+ return e.key;
95
+ });
96
+ const mentionedEvents = eventNames.filter((name) => code.includes(name));
97
+ return {
98
+ name: "event_emission",
99
+ passed: hasEmitPattern && mentionedEvents.length > 0,
100
+ details: !hasEmitPattern ? "No event emission pattern found" : mentionedEvents.length === 0 ? `Events not referenced: ${eventNames.join(", ")}` : void 0,
101
+ suggestion: "Emit events as specified in sideEffects.emits"
102
+ };
103
+ }
104
+ /**
105
+ * Check for validation of input.
106
+ */
107
+ function checkInputValidation(code, spec) {
108
+ if (!spec.io.input) return {
109
+ name: "input_validation",
110
+ passed: true
111
+ };
112
+ const hasValidation = code.includes(".parse(") || code.includes(".safeParse(") || code.includes("validate(") || code.includes(".validate(") || code.includes("schema.") || code.includes("zodSchema") || code.includes(".getZod()");
113
+ return {
114
+ name: "input_validation",
115
+ passed: hasValidation,
116
+ details: hasValidation ? void 0 : "No input validation pattern found",
117
+ suggestion: "Validate input using the schema: schema.parse(input) or schema.safeParse(input)"
118
+ };
119
+ }
120
+ /**
121
+ * Check for async/await usage on async operations.
122
+ */
123
+ function checkAsyncPatterns(code, spec) {
124
+ const isAsync = /export\s+(const\s+\w+\s*=\s*)?async/.test(code) || /async\s+function/.test(code);
125
+ if (!(spec.meta.kind === "command")) return {
126
+ name: "async_patterns",
127
+ passed: true
128
+ };
129
+ return {
130
+ name: "async_patterns",
131
+ passed: isAsync,
132
+ details: isAsync ? void 0 : "Handler should be async for command operations",
133
+ suggestion: "Make the handler function async: export async function handle(...)"
134
+ };
135
+ }
136
+ /**
137
+ * Run all structure checks and produce a verification report.
138
+ */
139
+ function verifyStructure(input) {
140
+ const { spec, implementationCode, implementationPath } = input;
141
+ const startTime = Date.now();
142
+ const checks = [
143
+ checkHandlerExport(implementationCode),
144
+ checkContractsImport(implementationCode),
145
+ checkSchemaImport(implementationCode, spec),
146
+ checkNoAnyType(implementationCode),
147
+ checkErrorHandling(implementationCode, spec),
148
+ checkEventEmission(implementationCode, spec),
149
+ checkInputValidation(implementationCode, spec),
150
+ checkAsyncPatterns(implementationCode, spec)
151
+ ];
152
+ const issues = checks.filter((c) => !c.passed).map((c) => ({
153
+ severity: c.name === "no_any_type" ? "warning" : "error",
154
+ category: c.name.includes("import") ? "import" : c.name.includes("export") ? "export" : "type",
155
+ message: c.details ?? `Check failed: ${c.name}`,
156
+ location: implementationPath ? { file: implementationPath } : void 0,
157
+ suggestion: c.suggestion
158
+ }));
159
+ const passedCount = checks.filter((c) => c.passed).length;
160
+ const score = Math.round(passedCount / checks.length * 100);
161
+ const passed = issues.filter((i) => i.severity === "error").length === 0;
162
+ const suggestions = checks.filter((c) => !c.passed && c.suggestion).map((c) => c.suggestion);
163
+ const errorCount = Object.keys(spec.io.errors ?? {}).length;
164
+ return {
165
+ tier: "structure",
166
+ passed,
167
+ score,
168
+ issues,
169
+ suggestions,
170
+ coverage: {
171
+ scenarios: {
172
+ total: 0,
173
+ covered: 0
174
+ },
175
+ errors: {
176
+ total: errorCount,
177
+ handled: checks.find((c) => c.name === "error_handling")?.passed ? errorCount : 0
178
+ },
179
+ fields: {
180
+ total: checks.length,
181
+ implemented: passedCount
182
+ }
183
+ },
184
+ meta: {
185
+ specName: spec.meta.key,
186
+ specVersion: spec.meta.version,
187
+ implementationPath: implementationPath ?? "unknown",
188
+ verifiedAt: (/* @__PURE__ */ new Date()).toISOString(),
189
+ duration: Date.now() - startTime
190
+ }
191
+ };
192
+ }
193
+
194
+ //#endregion
195
+ export { verifyStructure };
196
+ //# sourceMappingURL=structure-verifier.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure-verifier.mjs","names":[],"sources":["../../../src/services/verify/structure-verifier.ts"],"sourcesContent":["/**\n * Tier 1: Structure Verification\n *\n * Verifies that the implementation has correct TypeScript structure:\n * - Types match spec I/O schemas\n * - Required exports exist\n * - Imports are correct\n */\n\nimport type { AnyOperationSpec } from '@contractspec/lib.contracts';\nimport { isEmitDeclRef } from '@contractspec/lib.contracts/operations';\nimport type {\n VerificationIssue,\n VerificationReport,\n} from '@contractspec/lib.contracts/llm';\nimport type { StructureCheck, VerifyInput } from './types';\n\n/**\n * Check if code exports a handler function.\n */\nfunction checkHandlerExport(code: string): StructureCheck {\n const hasExport =\n /export\\s+(async\\s+)?function\\s+\\w+/.test(code) ||\n /export\\s+const\\s+\\w+\\s*=\\s*(async\\s*)?\\(/.test(code) ||\n /export\\s+default\\s+(async\\s+)?function/.test(code) ||\n /export\\s+\\{\\s*\\w+/.test(code);\n\n return {\n name: 'handler_export',\n passed: hasExport,\n details: hasExport ? undefined : 'No exported handler function found',\n suggestion:\n 'Export a function that handles the operation: export async function handle(...) { }',\n };\n}\n\n/**\n * Check if code imports from @contractspec/lib.contracts.\n */\nfunction checkContractsImport(code: string): StructureCheck {\n const hasImport =\n code.includes(\"from '@contractspec/lib.contracts'\") ||\n code.includes('from \"@contractspec/lib.contracts\"');\n\n return {\n name: 'contracts_import',\n passed: hasImport,\n details: hasImport\n ? undefined\n : 'Missing import from @contractspec/lib.contracts',\n suggestion: \"Add: import { ... } from '@contractspec/lib.contracts';\",\n };\n}\n\n/**\n * Check if code imports from @contractspec/lib.schema.\n */\nfunction checkSchemaImport(\n code: string,\n spec: AnyOperationSpec\n): StructureCheck {\n // Only required if spec uses schema types\n const needsSchema = spec.io.input !== null || spec.io.output !== null;\n if (!needsSchema) {\n return { name: 'schema_import', passed: true };\n }\n\n const hasImport =\n code.includes(\"from '@contractspec/lib.schema'\") ||\n code.includes('from \"@contractspec/lib.schema\"');\n\n return {\n name: 'schema_import',\n passed: hasImport,\n details: hasImport\n ? undefined\n : 'Missing import from @contractspec/lib.schema',\n suggestion: \"Add: import { ... } from '@contractspec/lib.schema';\",\n };\n}\n\n/**\n * Check for TypeScript any usage.\n */\nfunction checkNoAnyType(code: string): StructureCheck {\n // Match : any, as any, <any>, but not in comments or strings\n const anyPattern = /:\\s*any\\b|as\\s+any\\b|<any>/;\n\n // Simple check - could be enhanced with AST parsing\n const lines = code.split('\\n');\n const anyUsages: number[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n // Skip comments\n if (line.trim().startsWith('//') || line.trim().startsWith('*')) continue;\n if (anyPattern.test(line)) {\n anyUsages.push(i + 1);\n }\n }\n\n return {\n name: 'no_any_type',\n passed: anyUsages.length === 0,\n details:\n anyUsages.length > 0\n ? `Found 'any' type on lines: ${anyUsages.slice(0, 5).join(', ')}${anyUsages.length > 5 ? '...' : ''}`\n : undefined,\n suggestion: 'Replace any with proper types from the spec schema',\n };\n}\n\n/**\n * Check if error codes from spec are handled.\n */\nfunction checkErrorHandling(\n code: string,\n spec: AnyOperationSpec\n): StructureCheck {\n const errors = spec.io.errors;\n if (!errors || Object.keys(errors).length === 0) {\n return { name: 'error_handling', passed: true };\n }\n\n const errorCodes = Object.keys(errors);\n const missingErrors: string[] = [];\n\n for (const errorCode of errorCodes) {\n // Check if error code is mentioned in code\n if (!code.includes(errorCode)) {\n missingErrors.push(errorCode);\n }\n }\n\n return {\n name: 'error_handling',\n passed: missingErrors.length === 0,\n details:\n missingErrors.length > 0\n ? `Missing error handling for: ${missingErrors.join(', ')}`\n : undefined,\n suggestion: 'Implement handlers for all error cases defined in the spec',\n };\n}\n\n/**\n * Check if events are emitted.\n */\nfunction checkEventEmission(\n code: string,\n spec: AnyOperationSpec\n): StructureCheck {\n const events = spec.sideEffects?.emits;\n if (!events || events.length === 0) {\n return { name: 'event_emission', passed: true };\n }\n\n // Look for event emission patterns\n const hasEmitPattern =\n code.includes('emit(') ||\n code.includes('.emit(') ||\n code.includes('publish(') ||\n code.includes('.publish(') ||\n code.includes('dispatchEvent') ||\n code.includes('eventBus');\n\n const eventNames = events.map((e) => {\n if (isEmitDeclRef(e)) {\n return e.ref.key;\n }\n return e.key;\n });\n\n const mentionedEvents = eventNames.filter((name) => code.includes(name));\n\n return {\n name: 'event_emission',\n passed: hasEmitPattern && mentionedEvents.length > 0,\n details: !hasEmitPattern\n ? 'No event emission pattern found'\n : mentionedEvents.length === 0\n ? `Events not referenced: ${eventNames.join(', ')}`\n : undefined,\n suggestion: 'Emit events as specified in sideEffects.emits',\n };\n}\n\n/**\n * Check for validation of input.\n */\nfunction checkInputValidation(\n code: string,\n spec: AnyOperationSpec\n): StructureCheck {\n if (!spec.io.input) {\n return { name: 'input_validation', passed: true };\n }\n\n // Look for validation patterns\n const hasValidation =\n code.includes('.parse(') ||\n code.includes('.safeParse(') ||\n code.includes('validate(') ||\n code.includes('.validate(') ||\n code.includes('schema.') ||\n code.includes('zodSchema') ||\n code.includes('.getZod()');\n\n return {\n name: 'input_validation',\n passed: hasValidation,\n details: hasValidation ? undefined : 'No input validation pattern found',\n suggestion:\n 'Validate input using the schema: schema.parse(input) or schema.safeParse(input)',\n };\n}\n\n/**\n * Check for async/await usage on async operations.\n */\nfunction checkAsyncPatterns(\n code: string,\n spec: AnyOperationSpec\n): StructureCheck {\n // Check if handler is async\n const isAsync =\n /export\\s+(const\\s+\\w+\\s*=\\s*)?async/.test(code) ||\n /async\\s+function/.test(code);\n\n // For commands, async is typically expected\n const expectsAsync = spec.meta.kind === 'command';\n\n if (!expectsAsync) {\n return { name: 'async_patterns', passed: true };\n }\n\n return {\n name: 'async_patterns',\n passed: isAsync,\n details: isAsync\n ? undefined\n : 'Handler should be async for command operations',\n suggestion:\n 'Make the handler function async: export async function handle(...)',\n };\n}\n\n/**\n * Run all structure checks and produce a verification report.\n */\nexport function verifyStructure(input: VerifyInput): VerificationReport {\n const { spec, implementationCode, implementationPath } = input;\n const startTime = Date.now();\n\n const checks: StructureCheck[] = [\n checkHandlerExport(implementationCode),\n checkContractsImport(implementationCode),\n checkSchemaImport(implementationCode, spec),\n checkNoAnyType(implementationCode),\n checkErrorHandling(implementationCode, spec),\n checkEventEmission(implementationCode, spec),\n checkInputValidation(implementationCode, spec),\n checkAsyncPatterns(implementationCode, spec),\n ];\n\n // Convert checks to issues\n const issues: VerificationIssue[] = checks\n .filter((c) => !c.passed)\n .map((c) => ({\n severity:\n c.name === 'no_any_type' ? ('warning' as const) : ('error' as const),\n category: c.name.includes('import')\n ? ('import' as const)\n : c.name.includes('export')\n ? ('export' as const)\n : ('type' as const),\n message: c.details ?? `Check failed: ${c.name}`,\n location: implementationPath ? { file: implementationPath } : undefined,\n suggestion: c.suggestion,\n }));\n\n const passedCount = checks.filter((c) => c.passed).length;\n const score = Math.round((passedCount / checks.length) * 100);\n const passed = issues.filter((i) => i.severity === 'error').length === 0;\n\n // Generate suggestions\n const suggestions = checks\n .filter((c) => !c.passed && c.suggestion)\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n .map((c) => c.suggestion!);\n\n // Calculate coverage\n const errorCount = Object.keys(spec.io.errors ?? {}).length;\n const handledErrors = checks.find((c) => c.name === 'error_handling')?.passed\n ? errorCount\n : 0;\n\n return {\n tier: 'structure',\n passed,\n score,\n issues,\n suggestions,\n coverage: {\n scenarios: { total: 0, covered: 0 }, // Not applicable for structure tier\n errors: { total: errorCount, handled: handledErrors },\n fields: { total: checks.length, implemented: passedCount },\n },\n meta: {\n specName: spec.meta.key,\n specVersion: spec.meta.version,\n implementationPath: implementationPath ?? 'unknown',\n verifiedAt: new Date().toISOString(),\n duration: Date.now() - startTime,\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ import { AnyOperationSpec } from "@contractspec/lib.contracts";
2
+ import { VerificationIssue, VerificationReport, VerificationTier } from "@contractspec/lib.contracts/llm";
3
+
4
+ //#region src/services/verify/types.d.ts
5
+
6
+ /** Configuration for the verification service */
7
+ interface VerifyConfig {
8
+ /** Enable verbose logging */
9
+ verbose?: boolean;
10
+ /** API key for AI verification (tier 3) */
11
+ aiApiKey?: string;
12
+ /** AI provider for tier 3 verification */
13
+ aiProvider?: 'anthropic' | 'openai' | 'local';
14
+ }
15
+ /** Options for running verification */
16
+ interface VerifyOptions {
17
+ /** Which tiers to run (default: all up to specified) */
18
+ tiers?: VerificationTier[];
19
+ /** Stop on first failure */
20
+ failFast?: boolean;
21
+ /** Include suggestions in report */
22
+ includeSuggestions?: boolean;
23
+ }
24
+ /** Input for verification */
25
+ interface VerifyInput {
26
+ /** Spec to verify against */
27
+ spec: AnyOperationSpec;
28
+ /** Implementation code to verify */
29
+ implementationCode: string;
30
+ /** Implementation file path (for error reporting) */
31
+ implementationPath?: string;
32
+ }
33
+ /** Result of running all verification tiers */
34
+ interface VerifyResult {
35
+ /** Overall pass/fail */
36
+ passed: boolean;
37
+ /** Combined score (0-100) */
38
+ score: number;
39
+ /** Reports from each tier that was run */
40
+ reports: Map<VerificationTier, VerificationReport>;
41
+ /** All issues across all tiers */
42
+ allIssues: VerificationIssue[];
43
+ /** Summary message */
44
+ summary: string;
45
+ /** Duration in ms */
46
+ duration: number;
47
+ }
48
+ /** Structure check result */
49
+ interface StructureCheck {
50
+ /** Check name */
51
+ name: string;
52
+ /** Check passed */
53
+ passed: boolean;
54
+ /** Details if failed */
55
+ details?: string;
56
+ /** Suggested fix */
57
+ suggestion?: string;
58
+ }
59
+ /** Behavior check result */
60
+ interface BehaviorCheck {
61
+ /** Scenario or example name */
62
+ name: string;
63
+ /** Check type */
64
+ type: 'scenario' | 'example' | 'error';
65
+ /** Check passed */
66
+ passed: boolean;
67
+ /** Expected behavior */
68
+ expected?: string;
69
+ /** Actual behavior */
70
+ actual?: string;
71
+ /** Details */
72
+ details?: string;
73
+ }
74
+ /** AI review result */
75
+ interface AIReviewResult {
76
+ /** Overall compliance */
77
+ compliant: boolean;
78
+ /** Confidence score (0-1) */
79
+ confidence: number;
80
+ /** Findings */
81
+ findings: {
82
+ category: string;
83
+ severity: 'error' | 'warning' | 'info';
84
+ message: string;
85
+ location?: string;
86
+ suggestion?: string;
87
+ }[];
88
+ /** Raw AI response */
89
+ rawResponse?: string;
90
+ }
91
+ /** Field match type for semantic analysis */
92
+ type FieldMatchType = 'exact' | 'compatible' | 'mismatch' | 'missing';
93
+ /** Field mapping between spec and implementation */
94
+ interface FieldMapping {
95
+ /** Field name from spec */
96
+ specField: string;
97
+ /** Field type from spec */
98
+ specType: string;
99
+ /** Corresponding field in implementation (if found) */
100
+ implementationField?: string;
101
+ /** Field type in implementation */
102
+ implementationType?: string;
103
+ /** Match quality */
104
+ match: FieldMatchType;
105
+ /** AI confidence in this mapping (0-1) */
106
+ aiConfidence: number;
107
+ /** Suggestion if mismatch */
108
+ suggestion?: string;
109
+ }
110
+ /** Intent alignment analysis */
111
+ interface IntentAlignment {
112
+ /** Overall alignment score (0-100) */
113
+ score: number;
114
+ /** Issues with intent alignment */
115
+ issues: string[];
116
+ /** Suggestions for better alignment */
117
+ suggestions: string[];
118
+ }
119
+ /** Full semantic verification result */
120
+ interface SemanticVerificationResult {
121
+ /** Field-by-field mappings */
122
+ fieldMappings: FieldMapping[];
123
+ /** Intent alignment analysis */
124
+ intentAlignment: IntentAlignment;
125
+ /** Additional semantic issues found */
126
+ semanticIssues: {
127
+ category: string;
128
+ severity: 'error' | 'warning' | 'info';
129
+ message: string;
130
+ suggestion?: string;
131
+ }[];
132
+ /** Raw AI response for debugging */
133
+ rawResponse?: string;
134
+ }
135
+ //#endregion
136
+ export { AIReviewResult, BehaviorCheck, FieldMapping, FieldMatchType, IntentAlignment, SemanticVerificationResult, StructureCheck, VerifyConfig, VerifyInput, VerifyOptions, VerifyResult };
137
+ //# sourceMappingURL=types.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/services/verify/types.ts"],"sourcesContent":[],"mappings":";;;;;AAsBA;AAUiB,UApBA,YAAA,CAoBW;EAUX;EAMF,OAAA,CAAA,EAAA,OAAA;EAAkB;EAAtB,QAAA,CAAA,EAAA,MAAA;EAEE;EAAiB,UAAA,CAAA,EAAA,WAAA,GAAA,QAAA,GAAA,OAAA;AAQ9B;AAYA;AAgBiB,UAhEA,aAAA,CAgEc;EAkBnB;EAGK,KAAA,CAAA,EAnFP,gBAmFmB,EAAA;EAkBZ;EAUA,QAAA,CAAA,EAAA,OAAA;;;;;UAvGA,WAAA;;QAET;;;;;;;UAQS,YAAA;;;;;;WAMN,IAAI,kBAAkB;;aAEpB;;;;;;;UAQI,cAAA;;;;;;;;;;;UAYA,aAAA;;;;;;;;;;;;;;;UAgBA,cAAA;;;;;;;;;;;;;;;;;KAkBL,cAAA;;UAGK,YAAA;;;;;;;;;;SAUR;;;;;;;UAQQ,eAAA;;;;;;;;;UAUA,0BAAA;;iBAEA;;mBAEE"}