@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,76 @@
1
+ //#region src/services/ci-check/utils.ts
2
+ /**
3
+ * Create a category summary from issues.
4
+ */
5
+ function createCategorySummary(category, issues, durationMs) {
6
+ const categoryLabels = {
7
+ structure: "Spec Structure Validation",
8
+ integrity: "Contract Integrity Analysis",
9
+ deps: "Dependency Analysis",
10
+ doctor: "Installation Health",
11
+ handlers: "Handler Implementation",
12
+ tests: "Test Coverage",
13
+ "test-refs": "Test Reference Validation",
14
+ coverage: "Coverage Verification",
15
+ implementation: "Implementation Verification",
16
+ layers: "Contract Layers Validation",
17
+ drift: "Drift Detection"
18
+ };
19
+ const errors = issues.filter((i) => i.severity === "error").length;
20
+ const warnings = issues.filter((i) => i.severity === "warning").length;
21
+ const notes = issues.filter((i) => i.severity === "note").length;
22
+ return {
23
+ category,
24
+ label: categoryLabels[category],
25
+ errors,
26
+ warnings,
27
+ notes,
28
+ passed: errors === 0,
29
+ durationMs
30
+ };
31
+ }
32
+ /**
33
+ * Get git information if available.
34
+ */
35
+ async function getGitInfo(fs) {
36
+ try {
37
+ const gitHeadPath = ".git/HEAD";
38
+ if (!await fs.exists(gitHeadPath)) return {};
39
+ const headContent = await fs.readFile(gitHeadPath);
40
+ const refMatch = headContent.match(/^ref: (.+)$/m);
41
+ if (refMatch) {
42
+ const branch = refMatch[1]?.replace("refs/heads/", "");
43
+ const refPath = `.git/${refMatch[1]}`;
44
+ if (await fs.exists(refPath)) return {
45
+ commitSha: (await fs.readFile(refPath)).trim(),
46
+ branch
47
+ };
48
+ return { branch };
49
+ }
50
+ return { commitSha: headContent.trim() };
51
+ } catch {
52
+ return {};
53
+ }
54
+ }
55
+ /**
56
+ * Determine which checks to run based on options.
57
+ */
58
+ function getChecksToRun(options) {
59
+ const allCategories = [
60
+ "structure",
61
+ "integrity",
62
+ "deps",
63
+ "doctor"
64
+ ];
65
+ if (options.checkHandlers) allCategories.push("handlers");
66
+ if (options.checkTests) allCategories.push("tests");
67
+ if (options.implementation) allCategories.push("implementation");
68
+ if (options.checkDrift) allCategories.push("drift");
69
+ if (options.checks && options.checks.length > 0) return options.checks;
70
+ if (options.skip && options.skip.length > 0) return allCategories.filter((c) => !options.skip?.includes(c));
71
+ return allCategories;
72
+ }
73
+
74
+ //#endregion
75
+ export { createCategorySummary, getChecksToRun, getGitInfo };
76
+ //# sourceMappingURL=utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.mjs","names":[],"sources":["../../../src/services/ci-check/utils.ts"],"sourcesContent":["/**\n * CI check utilities.\n */\n\nimport type { FsAdapter } from '../../ports/fs';\nimport type { CICheckCategory, CICheckCategorySummary, CIIssue } from './types';\n\n/**\n * Create a category summary from issues.\n */\nexport function createCategorySummary(\n category: CICheckCategory,\n issues: CIIssue[],\n durationMs: number\n): CICheckCategorySummary {\n const categoryLabels: Record<CICheckCategory, string> = {\n structure: 'Spec Structure Validation',\n integrity: 'Contract Integrity Analysis',\n deps: 'Dependency Analysis',\n doctor: 'Installation Health',\n handlers: 'Handler Implementation',\n tests: 'Test Coverage',\n 'test-refs': 'Test Reference Validation',\n coverage: 'Coverage Verification',\n implementation: 'Implementation Verification',\n layers: 'Contract Layers Validation',\n drift: 'Drift Detection',\n };\n\n const errors = issues.filter((i) => i.severity === 'error').length;\n const warnings = issues.filter((i) => i.severity === 'warning').length;\n const notes = issues.filter((i) => i.severity === 'note').length;\n\n return {\n category,\n label: categoryLabels[category],\n errors,\n warnings,\n notes,\n passed: errors === 0,\n durationMs,\n };\n}\n\n/**\n * Get git information if available.\n */\nexport async function getGitInfo(\n fs: FsAdapter\n): Promise<{ commitSha?: string; branch?: string }> {\n try {\n // Try to read from .git/HEAD and refs\n const gitHeadPath = '.git/HEAD';\n if (!(await fs.exists(gitHeadPath))) {\n return {};\n }\n\n const headContent = await fs.readFile(gitHeadPath);\n const refMatch = headContent.match(/^ref: (.+)$/m);\n\n if (refMatch) {\n const branch = refMatch[1]?.replace('refs/heads/', '');\n const refPath = `.git/${refMatch[1]}`;\n\n if (await fs.exists(refPath)) {\n const commitSha = (await fs.readFile(refPath)).trim();\n return { commitSha, branch };\n }\n\n return { branch };\n }\n\n // Detached HEAD - content is the SHA\n const commitSha = headContent.trim();\n return { commitSha };\n } catch {\n return {};\n }\n}\n\n/**\n * Determine which checks to run based on options.\n */\nexport function getChecksToRun(options: {\n checkHandlers?: boolean;\n checkTests?: boolean;\n implementation?: unknown;\n checkDrift?: boolean;\n checks?: CICheckCategory[];\n skip?: CICheckCategory[];\n}): CICheckCategory[] {\n const allCategories: CICheckCategory[] = [\n 'structure',\n 'integrity',\n 'deps',\n 'doctor',\n ];\n\n // Add optional checks if explicitly requested\n if (options.checkHandlers) {\n allCategories.push('handlers');\n }\n if (options.checkTests) {\n allCategories.push('tests');\n }\n if (options.implementation) {\n allCategories.push('implementation');\n }\n if (options.checkDrift) {\n allCategories.push('drift');\n }\n\n // If specific checks are requested, use those\n if (options.checks && options.checks.length > 0) {\n return options.checks;\n }\n\n // Otherwise, use all minus skipped\n if (options.skip && options.skip.length > 0) {\n return allCategories.filter((c) => !options.skip?.includes(c));\n }\n\n return allCategories;\n}\n"],"mappings":";;;;AAUA,SAAgB,sBACd,UACA,QACA,YACwB;CACxB,MAAM,iBAAkD;EACtD,WAAW;EACX,WAAW;EACX,MAAM;EACN,QAAQ;EACR,UAAU;EACV,OAAO;EACP,aAAa;EACb,UAAU;EACV,gBAAgB;EAChB,QAAQ;EACR,OAAO;EACR;CAED,MAAM,SAAS,OAAO,QAAQ,MAAM,EAAE,aAAa,QAAQ,CAAC;CAC5D,MAAM,WAAW,OAAO,QAAQ,MAAM,EAAE,aAAa,UAAU,CAAC;CAChE,MAAM,QAAQ,OAAO,QAAQ,MAAM,EAAE,aAAa,OAAO,CAAC;AAE1D,QAAO;EACL;EACA,OAAO,eAAe;EACtB;EACA;EACA;EACA,QAAQ,WAAW;EACnB;EACD;;;;;AAMH,eAAsB,WACpB,IACkD;AAClD,KAAI;EAEF,MAAM,cAAc;AACpB,MAAI,CAAE,MAAM,GAAG,OAAO,YAAY,CAChC,QAAO,EAAE;EAGX,MAAM,cAAc,MAAM,GAAG,SAAS,YAAY;EAClD,MAAM,WAAW,YAAY,MAAM,eAAe;AAElD,MAAI,UAAU;GACZ,MAAM,SAAS,SAAS,IAAI,QAAQ,eAAe,GAAG;GACtD,MAAM,UAAU,QAAQ,SAAS;AAEjC,OAAI,MAAM,GAAG,OAAO,QAAQ,CAE1B,QAAO;IAAE,YADU,MAAM,GAAG,SAAS,QAAQ,EAAE,MAAM;IACjC;IAAQ;AAG9B,UAAO,EAAE,QAAQ;;AAKnB,SAAO,EAAE,WADS,YAAY,MAAM,EAChB;SACd;AACN,SAAO,EAAE;;;;;;AAOb,SAAgB,eAAe,SAOT;CACpB,MAAM,gBAAmC;EACvC;EACA;EACA;EACA;EACD;AAGD,KAAI,QAAQ,cACV,eAAc,KAAK,WAAW;AAEhC,KAAI,QAAQ,WACV,eAAc,KAAK,QAAQ;AAE7B,KAAI,QAAQ,eACV,eAAc,KAAK,iBAAiB;AAEtC,KAAI,QAAQ,WACV,eAAc,KAAK,QAAQ;AAI7B,KAAI,QAAQ,UAAU,QAAQ,OAAO,SAAS,EAC5C,QAAO,QAAQ;AAIjB,KAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,EACxC,QAAO,cAAc,QAAQ,MAAM,CAAC,QAAQ,MAAM,SAAS,EAAE,CAAC;AAGhE,QAAO"}
@@ -0,0 +1,41 @@
1
+ import { FsAdapter } from "../ports/fs.mjs";
2
+ import { LoggerAdapter } from "../ports/logger.mjs";
3
+
4
+ //#region src/services/clean.d.ts
5
+
6
+ interface CleanOptions {
7
+ /**
8
+ * When true, only remove known build artifact directories and known generated
9
+ * suffixes (safe-by-default).
10
+ */
11
+ generatedOnly?: boolean;
12
+ /**
13
+ * Skip deletions; just report.
14
+ */
15
+ dryRun?: boolean;
16
+ /**
17
+ * Only delete files older than this many days.
18
+ */
19
+ olderThanDays?: number;
20
+ /**
21
+ * Output directory used for generated artifacts (handlers/components/forms).
22
+ */
23
+ outputDir?: string;
24
+ }
25
+ interface CleanResult {
26
+ removed: {
27
+ path: string;
28
+ size: number;
29
+ }[];
30
+ skipped: {
31
+ path: string;
32
+ reason: string;
33
+ }[];
34
+ }
35
+ declare function cleanArtifacts(adapters: {
36
+ fs: FsAdapter;
37
+ logger: LoggerAdapter;
38
+ }, options?: CleanOptions): Promise<CleanResult>;
39
+ //#endregion
40
+ export { CleanOptions, CleanResult, cleanArtifacts };
41
+ //# sourceMappingURL=clean.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean.d.mts","names":[],"sources":["../../src/services/clean.ts"],"sourcesContent":[],"mappings":";;;;;AAmCkB,UA1BD,YAAA,CA0BC;EAAmB;;;;EAE3B,aAAA,CAAA,EAAA,OAAA;;;;;;;;;;;;;;UARO,WAAA;;;;;;;;;;iBAKK,cAAA;MACJ;UAAmB;aAC1B,eACR,QAAQ"}
@@ -0,0 +1,72 @@
1
+ //#region src/services/clean.ts
2
+ async function cleanArtifacts(adapters, options = {}) {
3
+ const { fs, logger } = adapters;
4
+ const outputDir = (options.outputDir ?? "./src").replace(/\\/g, "/");
5
+ const basePatterns = [
6
+ "generated/**",
7
+ "dist/**",
8
+ ".turbo/**"
9
+ ];
10
+ const outputDirPatterns = [
11
+ `${outputDir}/handlers/**/*.handler.ts`,
12
+ `${outputDir}/handlers/**/*.handler.test.ts`,
13
+ `${outputDir}/components/**/*.tsx`,
14
+ `${outputDir}/components/**/*.test.tsx`,
15
+ `${outputDir}/forms/**/*.form.tsx`,
16
+ `${outputDir}/forms/**/*.form.test.tsx`,
17
+ `${outputDir}/**/*.runner.ts`,
18
+ `${outputDir}/**/*.renderer.tsx`
19
+ ];
20
+ const patterns = options.generatedOnly ? [...basePatterns, ...outputDirPatterns] : [
21
+ ...basePatterns,
22
+ "**/*.generated.ts",
23
+ "**/*.generated.js",
24
+ "**/*.generated.d.ts",
25
+ ...outputDirPatterns
26
+ ];
27
+ const candidates = await fs.glob({
28
+ patterns,
29
+ ignore: ["node_modules/**"]
30
+ });
31
+ const removed = [];
32
+ const skipped = [];
33
+ for (const p of candidates) try {
34
+ const st = await fs.stat(p);
35
+ const ageDays = (Date.now() - st.mtime.getTime()) / (1e3 * 60 * 60 * 24);
36
+ if (typeof options.olderThanDays === "number" && ageDays < options.olderThanDays) {
37
+ skipped.push({
38
+ path: p,
39
+ reason: `younger_than_${options.olderThanDays}_days`
40
+ });
41
+ continue;
42
+ }
43
+ if (options.dryRun) logger.info("[dry-run] clean would remove", {
44
+ path: p,
45
+ size: st.size
46
+ });
47
+ else {
48
+ await fs.remove(p);
49
+ logger.info("clean.removed", {
50
+ path: p,
51
+ size: st.size
52
+ });
53
+ }
54
+ removed.push({
55
+ path: p,
56
+ size: st.size
57
+ });
58
+ } catch (error) {
59
+ skipped.push({
60
+ path: p,
61
+ reason: error instanceof Error ? error.message : String(error)
62
+ });
63
+ }
64
+ return {
65
+ removed,
66
+ skipped
67
+ };
68
+ }
69
+
70
+ //#endregion
71
+ export { cleanArtifacts };
72
+ //# sourceMappingURL=clean.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean.mjs","names":[],"sources":["../../src/services/clean.ts"],"sourcesContent":["/**\n * Clean service.\n *\n * Safe-by-default cleanup of generated artifacts.\n */\n\nimport type { FsAdapter } from '../ports/fs';\nimport type { LoggerAdapter } from '../ports/logger';\n\nexport interface CleanOptions {\n /**\n * When true, only remove known build artifact directories and known generated\n * suffixes (safe-by-default).\n */\n generatedOnly?: boolean;\n /**\n * Skip deletions; just report.\n */\n dryRun?: boolean;\n /**\n * Only delete files older than this many days.\n */\n olderThanDays?: number;\n /**\n * Output directory used for generated artifacts (handlers/components/forms).\n */\n outputDir?: string;\n}\n\nexport interface CleanResult {\n removed: { path: string; size: number }[];\n skipped: { path: string; reason: string }[];\n}\n\nexport async function cleanArtifacts(\n adapters: { fs: FsAdapter; logger: LoggerAdapter },\n options: CleanOptions = {}\n): Promise<CleanResult> {\n const { fs, logger } = adapters;\n const outputDir = (options.outputDir ?? './src').replace(/\\\\/g, '/');\n\n const basePatterns = ['generated/**', 'dist/**', '.turbo/**'];\n\n const outputDirPatterns = [\n `${outputDir}/handlers/**/*.handler.ts`,\n `${outputDir}/handlers/**/*.handler.test.ts`,\n `${outputDir}/components/**/*.tsx`,\n `${outputDir}/components/**/*.test.tsx`,\n `${outputDir}/forms/**/*.form.tsx`,\n `${outputDir}/forms/**/*.form.test.tsx`,\n `${outputDir}/**/*.runner.ts`,\n `${outputDir}/**/*.renderer.tsx`,\n ];\n\n const patterns = options.generatedOnly\n ? [...basePatterns, ...outputDirPatterns]\n : [\n ...basePatterns,\n '**/*.generated.ts',\n '**/*.generated.js',\n '**/*.generated.d.ts',\n ...outputDirPatterns,\n ];\n\n const candidates = await fs.glob({\n patterns,\n ignore: ['node_modules/**'],\n });\n\n const removed: { path: string; size: number }[] = [];\n const skipped: { path: string; reason: string }[] = [];\n\n for (const p of candidates) {\n try {\n const st = await fs.stat(p);\n const ageDays = (Date.now() - st.mtime.getTime()) / (1000 * 60 * 60 * 24);\n if (\n typeof options.olderThanDays === 'number' &&\n ageDays < options.olderThanDays\n ) {\n skipped.push({\n path: p,\n reason: `younger_than_${options.olderThanDays}_days`,\n });\n continue;\n }\n\n if (options.dryRun) {\n logger.info('[dry-run] clean would remove', { path: p, size: st.size });\n } else {\n await fs.remove(p);\n logger.info('clean.removed', { path: p, size: st.size });\n }\n removed.push({ path: p, size: st.size });\n } catch (error) {\n skipped.push({\n path: p,\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return { removed, skipped };\n}\n"],"mappings":";AAkCA,eAAsB,eACpB,UACA,UAAwB,EAAE,EACJ;CACtB,MAAM,EAAE,IAAI,WAAW;CACvB,MAAM,aAAa,QAAQ,aAAa,SAAS,QAAQ,OAAO,IAAI;CAEpE,MAAM,eAAe;EAAC;EAAgB;EAAW;EAAY;CAE7D,MAAM,oBAAoB;EACxB,GAAG,UAAU;EACb,GAAG,UAAU;EACb,GAAG,UAAU;EACb,GAAG,UAAU;EACb,GAAG,UAAU;EACb,GAAG,UAAU;EACb,GAAG,UAAU;EACb,GAAG,UAAU;EACd;CAED,MAAM,WAAW,QAAQ,gBACrB,CAAC,GAAG,cAAc,GAAG,kBAAkB,GACvC;EACE,GAAG;EACH;EACA;EACA;EACA,GAAG;EACJ;CAEL,MAAM,aAAa,MAAM,GAAG,KAAK;EAC/B;EACA,QAAQ,CAAC,kBAAkB;EAC5B,CAAC;CAEF,MAAM,UAA4C,EAAE;CACpD,MAAM,UAA8C,EAAE;AAEtD,MAAK,MAAM,KAAK,WACd,KAAI;EACF,MAAM,KAAK,MAAM,GAAG,KAAK,EAAE;EAC3B,MAAM,WAAW,KAAK,KAAK,GAAG,GAAG,MAAM,SAAS,KAAK,MAAO,KAAK,KAAK;AACtE,MACE,OAAO,QAAQ,kBAAkB,YACjC,UAAU,QAAQ,eAClB;AACA,WAAQ,KAAK;IACX,MAAM;IACN,QAAQ,gBAAgB,QAAQ,cAAc;IAC/C,CAAC;AACF;;AAGF,MAAI,QAAQ,OACV,QAAO,KAAK,gCAAgC;GAAE,MAAM;GAAG,MAAM,GAAG;GAAM,CAAC;OAClE;AACL,SAAM,GAAG,OAAO,EAAE;AAClB,UAAO,KAAK,iBAAiB;IAAE,MAAM;IAAG,MAAM,GAAG;IAAM,CAAC;;AAE1D,UAAQ,KAAK;GAAE,MAAM;GAAG,MAAM,GAAG;GAAM,CAAC;UACjC,OAAO;AACd,UAAQ,KAAK;GACX,MAAM;GACN,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;GAC/D,CAAC;;AAIN,QAAO;EAAE;EAAS;EAAS"}
@@ -0,0 +1,16 @@
1
+ import { FsAdapter } from "../ports/fs.mjs";
2
+ import { WorkspaceConfig } from "@contractspec/module.workspace";
3
+
4
+ //#region src/services/config.d.ts
5
+
6
+ /**
7
+ * Load workspace configuration from .contractsrc.json.
8
+ */
9
+ declare function loadWorkspaceConfig(fs: FsAdapter, cwd?: string): Promise<WorkspaceConfig>;
10
+ /**
11
+ * Get API key for the configured provider.
12
+ */
13
+ declare function getApiKey(provider: WorkspaceConfig['aiProvider']): string | undefined;
14
+ //#endregion
15
+ export { getApiKey, loadWorkspaceConfig };
16
+ //# sourceMappingURL=config.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.mts","names":[],"sources":["../../src/services/config.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAoCU,iBAHY,mBAAA,CAGZ,EAAA,EAFJ,SAEI,EAAA,GAAA,CAAA,EAAA,MAAA,CAAA,EAAP,OAAO,CAAC,eAAD,CAAA;AAoBV;;;iBAAgB,SAAA,WACJ"}
@@ -0,0 +1,63 @@
1
+ import { DEFAULT_WORKSPACE_CONFIG } from "@contractspec/module.workspace";
2
+ import * as z$1 from "zod";
3
+
4
+ //#region src/services/config.ts
5
+ /**
6
+ * Workspace configuration service.
7
+ */
8
+ const ConfigSchema = z$1.object({
9
+ aiProvider: z$1.enum([
10
+ "claude",
11
+ "openai",
12
+ "ollama",
13
+ "custom"
14
+ ]).default("claude"),
15
+ aiModel: z$1.string().optional(),
16
+ agentMode: z$1.enum([
17
+ "simple",
18
+ "cursor",
19
+ "claude-code",
20
+ "openai-codex"
21
+ ]).default("simple"),
22
+ customEndpoint: z$1.url().nullable().optional(),
23
+ customApiKey: z$1.string().nullable().optional(),
24
+ outputDir: z$1.string().default("./src"),
25
+ conventions: z$1.object({
26
+ operations: z$1.string().default("interactions/commands|queries"),
27
+ events: z$1.string().default("events"),
28
+ presentations: z$1.string().default("presentations"),
29
+ forms: z$1.string().default("forms")
30
+ }),
31
+ defaultOwners: z$1.array(z$1.string()).default([]),
32
+ defaultTags: z$1.array(z$1.string()).default([])
33
+ });
34
+ /**
35
+ * Load workspace configuration from .contractsrc.json.
36
+ */
37
+ async function loadWorkspaceConfig(fs, cwd) {
38
+ const configPath = fs.join(cwd ?? ".", ".contractsrc.json");
39
+ if (!await fs.exists(configPath)) return DEFAULT_WORKSPACE_CONFIG;
40
+ try {
41
+ const content = await fs.readFile(configPath);
42
+ const parsed = JSON.parse(content);
43
+ return ConfigSchema.parse(parsed);
44
+ } catch {
45
+ return DEFAULT_WORKSPACE_CONFIG;
46
+ }
47
+ }
48
+ /**
49
+ * Get API key for the configured provider.
50
+ */
51
+ function getApiKey(provider) {
52
+ switch (provider) {
53
+ case "claude": return process.env["ANTHROPIC_API_KEY"];
54
+ case "openai": return process.env["OPENAI_API_KEY"];
55
+ case "custom": return process.env["CONTRACTSPEC_LLM_API_KEY"];
56
+ case "ollama": return;
57
+ default: return;
58
+ }
59
+ }
60
+
61
+ //#endregion
62
+ export { getApiKey, loadWorkspaceConfig };
63
+ //# sourceMappingURL=config.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.mjs","names":["z"],"sources":["../../src/services/config.ts"],"sourcesContent":["/**\n * Workspace configuration service.\n */\n\nimport * as z from 'zod';\nimport type { WorkspaceConfig } from '@contractspec/module.workspace';\nimport { DEFAULT_WORKSPACE_CONFIG } from '@contractspec/module.workspace';\nimport type { FsAdapter } from '../ports/fs';\n\nconst ConfigSchema = z.object({\n aiProvider: z\n .enum(['claude', 'openai', 'ollama', 'custom'])\n .default('claude'),\n aiModel: z.string().optional(),\n agentMode: z\n .enum(['simple', 'cursor', 'claude-code', 'openai-codex'])\n .default('simple'),\n customEndpoint: z.url().nullable().optional(),\n customApiKey: z.string().nullable().optional(),\n outputDir: z.string().default('./src'),\n conventions: z.object({\n operations: z.string().default('interactions/commands|queries'),\n events: z.string().default('events'),\n presentations: z.string().default('presentations'),\n forms: z.string().default('forms'),\n }),\n defaultOwners: z.array(z.string()).default([]),\n defaultTags: z.array(z.string()).default([]),\n});\n\n/**\n * Load workspace configuration from .contractsrc.json.\n */\nexport async function loadWorkspaceConfig(\n fs: FsAdapter,\n cwd?: string\n): Promise<WorkspaceConfig> {\n const configPath = fs.join(cwd ?? '.', '.contractsrc.json');\n\n const exists = await fs.exists(configPath);\n if (!exists) {\n return DEFAULT_WORKSPACE_CONFIG;\n }\n\n try {\n const content = await fs.readFile(configPath);\n const parsed = JSON.parse(content);\n return ConfigSchema.parse(parsed) as WorkspaceConfig;\n } catch {\n return DEFAULT_WORKSPACE_CONFIG;\n }\n}\n\n/**\n * Get API key for the configured provider.\n */\nexport function getApiKey(\n provider: WorkspaceConfig['aiProvider']\n): string | undefined {\n switch (provider) {\n case 'claude':\n return process.env['ANTHROPIC_API_KEY'];\n case 'openai':\n return process.env['OPENAI_API_KEY'];\n case 'custom':\n return process.env['CONTRACTSPEC_LLM_API_KEY'];\n case 'ollama':\n return undefined; // Ollama doesn't need API key for local\n default:\n return undefined;\n }\n}\n"],"mappings":";;;;;;;AASA,MAAM,eAAeA,IAAE,OAAO;CAC5B,YAAYA,IACT,KAAK;EAAC;EAAU;EAAU;EAAU;EAAS,CAAC,CAC9C,QAAQ,SAAS;CACpB,SAASA,IAAE,QAAQ,CAAC,UAAU;CAC9B,WAAWA,IACR,KAAK;EAAC;EAAU;EAAU;EAAe;EAAe,CAAC,CACzD,QAAQ,SAAS;CACpB,gBAAgBA,IAAE,KAAK,CAAC,UAAU,CAAC,UAAU;CAC7C,cAAcA,IAAE,QAAQ,CAAC,UAAU,CAAC,UAAU;CAC9C,WAAWA,IAAE,QAAQ,CAAC,QAAQ,QAAQ;CACtC,aAAaA,IAAE,OAAO;EACpB,YAAYA,IAAE,QAAQ,CAAC,QAAQ,gCAAgC;EAC/D,QAAQA,IAAE,QAAQ,CAAC,QAAQ,SAAS;EACpC,eAAeA,IAAE,QAAQ,CAAC,QAAQ,gBAAgB;EAClD,OAAOA,IAAE,QAAQ,CAAC,QAAQ,QAAQ;EACnC,CAAC;CACF,eAAeA,IAAE,MAAMA,IAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CAC9C,aAAaA,IAAE,MAAMA,IAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CAC7C,CAAC;;;;AAKF,eAAsB,oBACpB,IACA,KAC0B;CAC1B,MAAM,aAAa,GAAG,KAAK,OAAO,KAAK,oBAAoB;AAG3D,KAAI,CADW,MAAM,GAAG,OAAO,WAAW,CAExC,QAAO;AAGT,KAAI;EACF,MAAM,UAAU,MAAM,GAAG,SAAS,WAAW;EAC7C,MAAM,SAAS,KAAK,MAAM,QAAQ;AAClC,SAAO,aAAa,MAAM,OAAO;SAC3B;AACN,SAAO;;;;;;AAOX,SAAgB,UACd,UACoB;AACpB,SAAQ,UAAR;EACE,KAAK,SACH,QAAO,QAAQ,IAAI;EACrB,KAAK,SACH,QAAO,QAAQ,IAAI;EACrB,KAAK,SACH,QAAO,QAAQ,IAAI;EACrB,KAAK,SACH;EACF,QACE"}
@@ -0,0 +1,34 @@
1
+ import { parseIstanbulCoverage } from "./istanbul-parser.mjs";
2
+
3
+ //#region src/services/coverage/parsers/index.ts
4
+ /**
5
+ * Create a parser for the specified format.
6
+ *
7
+ * @param format - The coverage report format
8
+ * @returns A parser for the format
9
+ */
10
+ function createParser(format) {
11
+ switch (format) {
12
+ case "istanbul": return { parse: parseIstanbulCoverage };
13
+ case "lcov": throw new Error("LCOV format not yet supported");
14
+ case "cobertura": throw new Error("Cobertura format not yet supported");
15
+ default: throw new Error(`Unknown coverage format: ${format}`);
16
+ }
17
+ }
18
+ /**
19
+ * Detect the coverage format from a file path or content.
20
+ *
21
+ * @param path - The file path
22
+ * @param content - Optional file content
23
+ * @returns The detected format
24
+ */
25
+ function detectFormat(path, content) {
26
+ if (path.endsWith(".json") || path.includes("coverage-final.json")) return "istanbul";
27
+ if (path.endsWith(".lcov") || path.includes("lcov.info")) return "lcov";
28
+ if (path.endsWith(".xml") && content?.includes("cobertura")) return "cobertura";
29
+ return "istanbul";
30
+ }
31
+
32
+ //#endregion
33
+ export { createParser, detectFormat };
34
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/coverage/parsers/index.ts"],"sourcesContent":["/**\n * Coverage report parsers.\n *\n * Parses coverage reports from various test runners into a unified format.\n */\n\nimport type { CoverageReport } from '../types';\nimport { parseIstanbulCoverage } from './istanbul-parser';\n\n/**\n * Supported coverage report formats.\n */\nexport type CoverageFormat = 'istanbul' | 'lcov' | 'cobertura';\n\n/**\n * Parser interface for coverage reports.\n */\nexport interface CoverageParser {\n /**\n * Parse a coverage report file or directory.\n *\n * @param content - The file content or directory path\n * @returns Parsed coverage report\n */\n parse(content: string): CoverageReport;\n}\n\n/**\n * Create a parser for the specified format.\n *\n * @param format - The coverage report format\n * @returns A parser for the format\n */\nexport function createParser(format: CoverageFormat): CoverageParser {\n switch (format) {\n case 'istanbul':\n return { parse: parseIstanbulCoverage };\n case 'lcov':\n // LCOV support can be added later\n throw new Error('LCOV format not yet supported');\n case 'cobertura':\n // Cobertura support can be added later\n throw new Error('Cobertura format not yet supported');\n default:\n throw new Error(`Unknown coverage format: ${format}`);\n }\n}\n\n/**\n * Detect the coverage format from a file path or content.\n *\n * @param path - The file path\n * @param content - Optional file content\n * @returns The detected format\n */\nexport function detectFormat(path: string, content?: string): CoverageFormat {\n // Check file extension first\n if (path.endsWith('.json') || path.includes('coverage-final.json')) {\n return 'istanbul';\n }\n if (path.endsWith('.lcov') || path.includes('lcov.info')) {\n return 'lcov';\n }\n if (path.endsWith('.xml') && content?.includes('cobertura')) {\n return 'cobertura';\n }\n\n // Default to Istanbul JSON\n return 'istanbul';\n}\n\nexport { parseIstanbulCoverage } from './istanbul-parser';\n"],"mappings":";;;;;;;;;AAiCA,SAAgB,aAAa,QAAwC;AACnE,SAAQ,QAAR;EACE,KAAK,WACH,QAAO,EAAE,OAAO,uBAAuB;EACzC,KAAK,OAEH,OAAM,IAAI,MAAM,gCAAgC;EAClD,KAAK,YAEH,OAAM,IAAI,MAAM,qCAAqC;EACvD,QACE,OAAM,IAAI,MAAM,4BAA4B,SAAS;;;;;;;;;;AAW3D,SAAgB,aAAa,MAAc,SAAkC;AAE3E,KAAI,KAAK,SAAS,QAAQ,IAAI,KAAK,SAAS,sBAAsB,CAChE,QAAO;AAET,KAAI,KAAK,SAAS,QAAQ,IAAI,KAAK,SAAS,YAAY,CACtD,QAAO;AAET,KAAI,KAAK,SAAS,OAAO,IAAI,SAAS,SAAS,YAAY,CACzD,QAAO;AAIT,QAAO"}
@@ -0,0 +1,108 @@
1
+ //#region src/services/coverage/parsers/istanbul-parser.ts
2
+ function calculatePct(covered, total) {
3
+ if (total === 0) return 100;
4
+ return Math.round(covered / total * 100 * 100) / 100;
5
+ }
6
+ /**
7
+ * Parse Istanbul JSON coverage report.
8
+ *
9
+ * @param content - The JSON content as a string
10
+ * @returns Parsed coverage report
11
+ */
12
+ function parseIstanbulCoverage(content) {
13
+ const data = JSON.parse(content);
14
+ const files = /* @__PURE__ */ new Map();
15
+ let totalStatements = 0;
16
+ let coveredStatements = 0;
17
+ let totalBranches = 0;
18
+ let coveredBranches = 0;
19
+ let totalFunctions = 0;
20
+ let coveredFunctions = 0;
21
+ let totalLines = 0;
22
+ let coveredLines = 0;
23
+ for (const [filePath, fileCoverage] of Object.entries(data)) {
24
+ const parsed = parseFileCoverage(filePath, fileCoverage);
25
+ files.set(filePath, parsed);
26
+ totalStatements += parsed.statements.total;
27
+ coveredStatements += parsed.statements.covered;
28
+ totalBranches += parsed.branches.total;
29
+ coveredBranches += parsed.branches.covered;
30
+ totalFunctions += parsed.functions.total;
31
+ coveredFunctions += parsed.functions.covered;
32
+ totalLines += parsed.lines.total;
33
+ coveredLines += parsed.lines.covered;
34
+ }
35
+ return {
36
+ files,
37
+ total: {
38
+ statements: {
39
+ covered: coveredStatements,
40
+ total: totalStatements,
41
+ pct: calculatePct(coveredStatements, totalStatements)
42
+ },
43
+ branches: {
44
+ covered: coveredBranches,
45
+ total: totalBranches,
46
+ pct: calculatePct(coveredBranches, totalBranches)
47
+ },
48
+ functions: {
49
+ covered: coveredFunctions,
50
+ total: totalFunctions,
51
+ pct: calculatePct(coveredFunctions, totalFunctions)
52
+ },
53
+ lines: {
54
+ covered: coveredLines,
55
+ total: totalLines,
56
+ pct: calculatePct(coveredLines, totalLines)
57
+ }
58
+ }
59
+ };
60
+ }
61
+ /**
62
+ * Parse coverage data for a single file.
63
+ */
64
+ function parseFileCoverage(path, coverage) {
65
+ const statementTotal = Object.keys(coverage.statementMap).length;
66
+ const statementCovered = Object.values(coverage.s).filter((c) => c > 0).length;
67
+ const functionTotal = Object.keys(coverage.fnMap).length;
68
+ const functionCovered = Object.values(coverage.f).filter((c) => c > 0).length;
69
+ let branchTotal = 0;
70
+ let branchCovered = 0;
71
+ for (const branch of Object.values(coverage.b)) {
72
+ branchTotal += branch.length;
73
+ branchCovered += branch.filter((c) => c > 0).length;
74
+ }
75
+ const lineSet = /* @__PURE__ */ new Set();
76
+ const coveredLineSet = /* @__PURE__ */ new Set();
77
+ for (const [id, location] of Object.entries(coverage.statementMap)) for (let line = location.start.line; line <= location.end.line; line++) {
78
+ lineSet.add(line);
79
+ if ((coverage.s[id] ?? 0) > 0) coveredLineSet.add(line);
80
+ }
81
+ return {
82
+ path,
83
+ statements: {
84
+ covered: statementCovered,
85
+ total: statementTotal,
86
+ pct: calculatePct(statementCovered, statementTotal)
87
+ },
88
+ branches: {
89
+ covered: branchCovered,
90
+ total: branchTotal,
91
+ pct: calculatePct(branchCovered, branchTotal)
92
+ },
93
+ functions: {
94
+ covered: functionCovered,
95
+ total: functionTotal,
96
+ pct: calculatePct(functionCovered, functionTotal)
97
+ },
98
+ lines: {
99
+ covered: coveredLineSet.size,
100
+ total: lineSet.size,
101
+ pct: calculatePct(coveredLineSet.size, lineSet.size)
102
+ }
103
+ };
104
+ }
105
+
106
+ //#endregion
107
+ export { parseIstanbulCoverage };
108
+ //# sourceMappingURL=istanbul-parser.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"istanbul-parser.mjs","names":[],"sources":["../../../../src/services/coverage/parsers/istanbul-parser.ts"],"sourcesContent":["/**\n * Istanbul JSON coverage report parser.\n *\n * Parses the standard Istanbul JSON format used by:\n * - Vitest (with coverage.reporter = ['json'])\n * - Bun (with --coverage)\n * - Jest (with collectCoverage and json reporter)\n * - NYC (directly)\n */\n\nimport type { CoverageReport, FileCoverage, CoverageData } from '../types';\n\nfunction calculatePct(covered: number, total: number): number {\n if (total === 0) return 100;\n return Math.round((covered / total) * 100 * 100) / 100;\n}\n\n/**\n * Istanbul JSON coverage format.\n */\ntype IstanbulCoverage = Record<string, IstanbulFileCoverage>;\n\ninterface IstanbulFileCoverage {\n path: string;\n statementMap: Record<string, IstanbulLocation>;\n fnMap: Record<string, IstanbulFunction>;\n branchMap: Record<string, IstanbulBranch>;\n s: Record<string, number>; // statement execution counts\n f: Record<string, number>; // function execution counts\n b: Record<string, number[]>; // branch execution counts\n}\n\ninterface IstanbulLocation {\n start: { line: number; column: number };\n end: { line: number; column: number };\n}\n\ninterface IstanbulFunction {\n name: string;\n decl: IstanbulLocation;\n loc: IstanbulLocation;\n line: number;\n}\n\ninterface IstanbulBranch {\n type: string;\n loc: IstanbulLocation;\n locations: IstanbulLocation[];\n line: number;\n}\n\n/**\n * Parse Istanbul JSON coverage report.\n *\n * @param content - The JSON content as a string\n * @returns Parsed coverage report\n */\nexport function parseIstanbulCoverage(content: string): CoverageReport {\n const data: IstanbulCoverage = JSON.parse(content);\n const files = new Map<string, FileCoverage>();\n\n // Aggregate totals\n let totalStatements = 0;\n let coveredStatements = 0;\n let totalBranches = 0;\n let coveredBranches = 0;\n let totalFunctions = 0;\n let coveredFunctions = 0;\n let totalLines = 0;\n let coveredLines = 0;\n\n for (const [filePath, fileCoverage] of Object.entries(data)) {\n const parsed = parseFileCoverage(filePath, fileCoverage);\n files.set(filePath, parsed);\n\n // Accumulate totals\n totalStatements += parsed.statements.total;\n coveredStatements += parsed.statements.covered;\n totalBranches += parsed.branches.total;\n coveredBranches += parsed.branches.covered;\n totalFunctions += parsed.functions.total;\n coveredFunctions += parsed.functions.covered;\n totalLines += parsed.lines.total;\n coveredLines += parsed.lines.covered;\n }\n\n const total: CoverageData = {\n statements: {\n covered: coveredStatements,\n total: totalStatements,\n pct: calculatePct(coveredStatements, totalStatements),\n },\n branches: {\n covered: coveredBranches,\n total: totalBranches,\n pct: calculatePct(coveredBranches, totalBranches),\n },\n functions: {\n covered: coveredFunctions,\n total: totalFunctions,\n pct: calculatePct(coveredFunctions, totalFunctions),\n },\n lines: {\n covered: coveredLines,\n total: totalLines,\n pct: calculatePct(coveredLines, totalLines),\n },\n };\n\n return { files, total };\n}\n\n/**\n * Parse coverage data for a single file.\n */\nfunction parseFileCoverage(\n path: string,\n coverage: IstanbulFileCoverage\n): FileCoverage {\n // Count statements\n const statementTotal = Object.keys(coverage.statementMap).length;\n const statementCovered = Object.values(coverage.s).filter(\n (c) => c > 0\n ).length;\n\n // Count functions\n const functionTotal = Object.keys(coverage.fnMap).length;\n const functionCovered = Object.values(coverage.f).filter((c) => c > 0).length;\n\n // Count branches (each branch can have multiple paths)\n let branchTotal = 0;\n let branchCovered = 0;\n for (const branch of Object.values(coverage.b)) {\n branchTotal += branch.length;\n branchCovered += branch.filter((c) => c > 0).length;\n }\n\n // Calculate line coverage from statement map\n const lineSet = new Set<number>();\n const coveredLineSet = new Set<number>();\n\n for (const [id, location] of Object.entries(coverage.statementMap)) {\n for (let line = location.start.line; line <= location.end.line; line++) {\n lineSet.add(line);\n if ((coverage.s[id] ?? 0) > 0) {\n coveredLineSet.add(line);\n }\n }\n }\n\n return {\n path,\n statements: {\n covered: statementCovered,\n total: statementTotal,\n pct: calculatePct(statementCovered, statementTotal),\n },\n branches: {\n covered: branchCovered,\n total: branchTotal,\n pct: calculatePct(branchCovered, branchTotal),\n },\n functions: {\n covered: functionCovered,\n total: functionTotal,\n pct: calculatePct(functionCovered, functionTotal),\n },\n lines: {\n covered: coveredLineSet.size,\n total: lineSet.size,\n pct: calculatePct(coveredLineSet.size, lineSet.size),\n },\n };\n}\n"],"mappings":";AAYA,SAAS,aAAa,SAAiB,OAAuB;AAC5D,KAAI,UAAU,EAAG,QAAO;AACxB,QAAO,KAAK,MAAO,UAAU,QAAS,MAAM,IAAI,GAAG;;;;;;;;AA2CrD,SAAgB,sBAAsB,SAAiC;CACrE,MAAM,OAAyB,KAAK,MAAM,QAAQ;CAClD,MAAM,wBAAQ,IAAI,KAA2B;CAG7C,IAAI,kBAAkB;CACtB,IAAI,oBAAoB;CACxB,IAAI,gBAAgB;CACpB,IAAI,kBAAkB;CACtB,IAAI,iBAAiB;CACrB,IAAI,mBAAmB;CACvB,IAAI,aAAa;CACjB,IAAI,eAAe;AAEnB,MAAK,MAAM,CAAC,UAAU,iBAAiB,OAAO,QAAQ,KAAK,EAAE;EAC3D,MAAM,SAAS,kBAAkB,UAAU,aAAa;AACxD,QAAM,IAAI,UAAU,OAAO;AAG3B,qBAAmB,OAAO,WAAW;AACrC,uBAAqB,OAAO,WAAW;AACvC,mBAAiB,OAAO,SAAS;AACjC,qBAAmB,OAAO,SAAS;AACnC,oBAAkB,OAAO,UAAU;AACnC,sBAAoB,OAAO,UAAU;AACrC,gBAAc,OAAO,MAAM;AAC3B,kBAAgB,OAAO,MAAM;;AA0B/B,QAAO;EAAE;EAAO,OAvBY;GAC1B,YAAY;IACV,SAAS;IACT,OAAO;IACP,KAAK,aAAa,mBAAmB,gBAAgB;IACtD;GACD,UAAU;IACR,SAAS;IACT,OAAO;IACP,KAAK,aAAa,iBAAiB,cAAc;IAClD;GACD,WAAW;IACT,SAAS;IACT,OAAO;IACP,KAAK,aAAa,kBAAkB,eAAe;IACpD;GACD,OAAO;IACL,SAAS;IACT,OAAO;IACP,KAAK,aAAa,cAAc,WAAW;IAC5C;GACF;EAEsB;;;;;AAMzB,SAAS,kBACP,MACA,UACc;CAEd,MAAM,iBAAiB,OAAO,KAAK,SAAS,aAAa,CAAC;CAC1D,MAAM,mBAAmB,OAAO,OAAO,SAAS,EAAE,CAAC,QAChD,MAAM,IAAI,EACZ,CAAC;CAGF,MAAM,gBAAgB,OAAO,KAAK,SAAS,MAAM,CAAC;CAClD,MAAM,kBAAkB,OAAO,OAAO,SAAS,EAAE,CAAC,QAAQ,MAAM,IAAI,EAAE,CAAC;CAGvE,IAAI,cAAc;CAClB,IAAI,gBAAgB;AACpB,MAAK,MAAM,UAAU,OAAO,OAAO,SAAS,EAAE,EAAE;AAC9C,iBAAe,OAAO;AACtB,mBAAiB,OAAO,QAAQ,MAAM,IAAI,EAAE,CAAC;;CAI/C,MAAM,0BAAU,IAAI,KAAa;CACjC,MAAM,iCAAiB,IAAI,KAAa;AAExC,MAAK,MAAM,CAAC,IAAI,aAAa,OAAO,QAAQ,SAAS,aAAa,CAChE,MAAK,IAAI,OAAO,SAAS,MAAM,MAAM,QAAQ,SAAS,IAAI,MAAM,QAAQ;AACtE,UAAQ,IAAI,KAAK;AACjB,OAAK,SAAS,EAAE,OAAO,KAAK,EAC1B,gBAAe,IAAI,KAAK;;AAK9B,QAAO;EACL;EACA,YAAY;GACV,SAAS;GACT,OAAO;GACP,KAAK,aAAa,kBAAkB,eAAe;GACpD;EACD,UAAU;GACR,SAAS;GACT,OAAO;GACP,KAAK,aAAa,eAAe,YAAY;GAC9C;EACD,WAAW;GACT,SAAS;GACT,OAAO;GACP,KAAK,aAAa,iBAAiB,cAAc;GAClD;EACD,OAAO;GACL,SAAS,eAAe;GACxB,OAAO,QAAQ;GACf,KAAK,aAAa,eAAe,MAAM,QAAQ,KAAK;GACrD;EACF"}
@@ -0,0 +1,55 @@
1
+ //#region src/services/coverage/validator.ts
2
+ /**
3
+ * Validate coverage data against requirements.
4
+ *
5
+ * @param specKey - The spec key being validated
6
+ * @param specVersion - The spec version
7
+ * @param requirement - The coverage requirements from TestSpec
8
+ * @param actual - The actual coverage data
9
+ * @returns Validation result with pass/fail and details
10
+ */
11
+ function validateCoverage(specKey, specVersion, requirement, actual) {
12
+ const failures = [];
13
+ if (requirement.statements !== void 0 && actual.statements.pct < requirement.statements) failures.push({
14
+ metric: "statements",
15
+ required: requirement.statements,
16
+ actual: actual.statements.pct,
17
+ message: `Statement coverage ${actual.statements.pct}% is below required ${requirement.statements}%`
18
+ });
19
+ if (requirement.branches !== void 0 && actual.branches.pct < requirement.branches) failures.push({
20
+ metric: "branches",
21
+ required: requirement.branches,
22
+ actual: actual.branches.pct,
23
+ message: `Branch coverage ${actual.branches.pct}% is below required ${requirement.branches}%`
24
+ });
25
+ if (requirement.functions !== void 0 && actual.functions.pct < requirement.functions) failures.push({
26
+ metric: "functions",
27
+ required: requirement.functions,
28
+ actual: actual.functions.pct,
29
+ message: `Function coverage ${actual.functions.pct}% is below required ${requirement.functions}%`
30
+ });
31
+ if (requirement.lines !== void 0 && actual.lines.pct < requirement.lines) failures.push({
32
+ metric: "lines",
33
+ required: requirement.lines,
34
+ actual: actual.lines.pct,
35
+ message: `Line coverage ${actual.lines.pct}% is below required ${requirement.lines}%`
36
+ });
37
+ if (requirement.mutations !== void 0) failures.push({
38
+ metric: "mutations",
39
+ required: requirement.mutations,
40
+ actual: 0,
41
+ message: `Mutation coverage required (${requirement.mutations}%) but mutation testing is not yet supported`
42
+ });
43
+ return {
44
+ specKey,
45
+ specVersion,
46
+ requirement,
47
+ actual,
48
+ passed: failures.length === 0,
49
+ failures
50
+ };
51
+ }
52
+
53
+ //#endregion
54
+ export { validateCoverage };
55
+ //# sourceMappingURL=validator.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.mjs","names":[],"sources":["../../../src/services/coverage/validator.ts"],"sourcesContent":["/**\n * Coverage validator.\n *\n * Validates actual coverage data against TestSpec.coverage requirements.\n */\n\nimport type { CoverageRequirement } from '@contractspec/lib.contracts';\nimport type {\n CoverageData,\n CoverageValidationResult,\n CoverageFailure,\n CoverageValidationSummary,\n} from './types';\n\n/**\n * Validate coverage data against requirements.\n *\n * @param specKey - The spec key being validated\n * @param specVersion - The spec version\n * @param requirement - The coverage requirements from TestSpec\n * @param actual - The actual coverage data\n * @returns Validation result with pass/fail and details\n */\nexport function validateCoverage(\n specKey: string,\n specVersion: string,\n requirement: CoverageRequirement,\n actual: CoverageData\n): CoverageValidationResult {\n const failures: CoverageFailure[] = [];\n\n // Check statements requirement\n if (\n requirement.statements !== undefined &&\n actual.statements.pct < requirement.statements\n ) {\n failures.push({\n metric: 'statements',\n required: requirement.statements,\n actual: actual.statements.pct,\n message: `Statement coverage ${actual.statements.pct}% is below required ${requirement.statements}%`,\n });\n }\n\n // Check branches requirement\n if (\n requirement.branches !== undefined &&\n actual.branches.pct < requirement.branches\n ) {\n failures.push({\n metric: 'branches',\n required: requirement.branches,\n actual: actual.branches.pct,\n message: `Branch coverage ${actual.branches.pct}% is below required ${requirement.branches}%`,\n });\n }\n\n // Check functions requirement\n if (\n requirement.functions !== undefined &&\n actual.functions.pct < requirement.functions\n ) {\n failures.push({\n metric: 'functions',\n required: requirement.functions,\n actual: actual.functions.pct,\n message: `Function coverage ${actual.functions.pct}% is below required ${requirement.functions}%`,\n });\n }\n\n // Check lines requirement\n if (requirement.lines !== undefined && actual.lines.pct < requirement.lines) {\n failures.push({\n metric: 'lines',\n required: requirement.lines,\n actual: actual.lines.pct,\n message: `Line coverage ${actual.lines.pct}% is below required ${requirement.lines}%`,\n });\n }\n\n // Note: Mutation coverage would require integration with a mutation testing tool\n // like Stryker. For now, we skip this check.\n if (requirement.mutations !== undefined) {\n // Mutation testing not yet supported\n failures.push({\n metric: 'mutations',\n required: requirement.mutations,\n actual: 0,\n message: `Mutation coverage required (${requirement.mutations}%) but mutation testing is not yet supported`,\n });\n }\n\n return {\n specKey,\n specVersion,\n requirement,\n actual,\n passed: failures.length === 0,\n failures,\n };\n}\n\n/**\n * Validate coverage for multiple specs and create a summary.\n *\n * @param validations - Array of specs with requirements and coverage\n * @returns Summary of all validations\n */\nexport function validateAllCoverage(\n validations: {\n specKey: string;\n specVersion: string;\n requirement: CoverageRequirement;\n actual: CoverageData;\n }[]\n): CoverageValidationSummary {\n const results: CoverageValidationResult[] = [];\n\n for (const v of validations) {\n results.push(\n validateCoverage(v.specKey, v.specVersion, v.requirement, v.actual)\n );\n }\n\n const passedSpecs = results.filter((r) => r.passed).length;\n const failedSpecs = results.filter((r) => !r.passed).length;\n\n return {\n totalSpecs: results.length,\n passedSpecs,\n failedSpecs,\n results,\n allPassed: failedSpecs === 0,\n };\n}\n\n/**\n * Format coverage validation result as a human-readable string.\n */\nexport function formatCoverageResult(result: CoverageValidationResult): string {\n const lines: string[] = [];\n\n lines.push(\n `${result.specKey}.v${result.specVersion}: ${result.passed ? 'PASS' : 'FAIL'}`\n );\n\n if (!result.passed) {\n for (const failure of result.failures) {\n lines.push(` - ${failure.message}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format coverage validation summary as a human-readable string.\n */\nexport function formatCoverageSummary(\n summary: CoverageValidationSummary\n): string {\n const lines: string[] = [];\n\n lines.push('Coverage Validation Summary');\n lines.push('===========================');\n lines.push(`Total specs: ${summary.totalSpecs}`);\n lines.push(`Passed: ${summary.passedSpecs}`);\n lines.push(`Failed: ${summary.failedSpecs}`);\n lines.push('');\n\n for (const result of summary.results) {\n lines.push(formatCoverageResult(result));\n }\n\n return lines.join('\\n');\n}\n"],"mappings":";;;;;;;;;;AAuBA,SAAgB,iBACd,SACA,aACA,aACA,QAC0B;CAC1B,MAAM,WAA8B,EAAE;AAGtC,KACE,YAAY,eAAe,UAC3B,OAAO,WAAW,MAAM,YAAY,WAEpC,UAAS,KAAK;EACZ,QAAQ;EACR,UAAU,YAAY;EACtB,QAAQ,OAAO,WAAW;EAC1B,SAAS,sBAAsB,OAAO,WAAW,IAAI,sBAAsB,YAAY,WAAW;EACnG,CAAC;AAIJ,KACE,YAAY,aAAa,UACzB,OAAO,SAAS,MAAM,YAAY,SAElC,UAAS,KAAK;EACZ,QAAQ;EACR,UAAU,YAAY;EACtB,QAAQ,OAAO,SAAS;EACxB,SAAS,mBAAmB,OAAO,SAAS,IAAI,sBAAsB,YAAY,SAAS;EAC5F,CAAC;AAIJ,KACE,YAAY,cAAc,UAC1B,OAAO,UAAU,MAAM,YAAY,UAEnC,UAAS,KAAK;EACZ,QAAQ;EACR,UAAU,YAAY;EACtB,QAAQ,OAAO,UAAU;EACzB,SAAS,qBAAqB,OAAO,UAAU,IAAI,sBAAsB,YAAY,UAAU;EAChG,CAAC;AAIJ,KAAI,YAAY,UAAU,UAAa,OAAO,MAAM,MAAM,YAAY,MACpE,UAAS,KAAK;EACZ,QAAQ;EACR,UAAU,YAAY;EACtB,QAAQ,OAAO,MAAM;EACrB,SAAS,iBAAiB,OAAO,MAAM,IAAI,sBAAsB,YAAY,MAAM;EACpF,CAAC;AAKJ,KAAI,YAAY,cAAc,OAE5B,UAAS,KAAK;EACZ,QAAQ;EACR,UAAU,YAAY;EACtB,QAAQ;EACR,SAAS,+BAA+B,YAAY,UAAU;EAC/D,CAAC;AAGJ,QAAO;EACL;EACA;EACA;EACA;EACA,QAAQ,SAAS,WAAW;EAC5B;EACD"}
@@ -0,0 +1,84 @@
1
+ import { PresentationKind, WorkspaceConfig } from "@contractspec/module.workspace";
2
+ import { OpKind } from "@contractspec/lib.contracts";
3
+
4
+ //#region src/services/create/ai-generator.d.ts
5
+
6
+ /**
7
+ * AI Generator Service
8
+ */
9
+ declare class AIGenerator {
10
+ private config;
11
+ constructor(config: WorkspaceConfig);
12
+ private getModel;
13
+ /**
14
+ * Generate operation spec from natural language description
15
+ */
16
+ generateOperationSpec(description: string, kind: OpKind): Promise<{
17
+ name: string;
18
+ version: number;
19
+ description: string;
20
+ goal: string;
21
+ context: string;
22
+ stability: "experimental" | "beta" | "stable" | "deprecated";
23
+ owners: string[];
24
+ tags: string[];
25
+ auth: "anonymous" | "user" | "admin";
26
+ inputShape: string;
27
+ outputShape: string;
28
+ flags: string[];
29
+ possibleEvents: string[];
30
+ analytics: string[];
31
+ }>;
32
+ /**
33
+ * Generate event spec from description
34
+ */
35
+ generateEventSpec(description: string): Promise<{
36
+ name: string;
37
+ version: number;
38
+ description: string;
39
+ stability: "experimental" | "beta" | "stable" | "deprecated";
40
+ owners: string[];
41
+ tags: string[];
42
+ payloadShape: string;
43
+ piiFields: string[];
44
+ }>;
45
+ /**
46
+ * Generate presentation spec from description
47
+ */
48
+ generatePresentationSpec(description: string, kind: PresentationKind): Promise<{
49
+ name: string;
50
+ version: number;
51
+ description: string;
52
+ stability: "experimental" | "beta" | "stable" | "deprecated";
53
+ owners: string[];
54
+ tags: string[];
55
+ componentKey?: string | undefined;
56
+ propsShape?: string | undefined;
57
+ content?: string | undefined;
58
+ mimeType?: string | undefined;
59
+ dataShape?: string | undefined;
60
+ }>;
61
+ /**
62
+ * Generate handler implementation from spec
63
+ */
64
+ generateHandler(specCode: string): Promise<string>;
65
+ /**
66
+ * Generate React component from presentation spec
67
+ */
68
+ generateComponent(specCode: string): Promise<string>;
69
+ /**
70
+ * Generate form component from form spec
71
+ */
72
+ generateForm(specCode: string): Promise<string>;
73
+ /**
74
+ * Generate tests for implementation
75
+ */
76
+ generateTests(specCode: string, implementationCode: string, testType: 'handler' | 'component'): Promise<string>;
77
+ /**
78
+ * Stream code generation for better UX
79
+ */
80
+ streamCodeGeneration(prompt: string, onChunk: (text: string) => void): Promise<string>;
81
+ }
82
+ //#endregion
83
+ export { AIGenerator };
84
+ //# sourceMappingURL=ai-generator.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-generator.d.mts","names":[],"sources":["../../../src/services/create/ai-generator.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAsI4E,cApG/D,WAAA,CAoG+D;EAkCjC,QAAA,MAAA;EAeE,WAAA,CAAA,MAAA,EApJf,eAoJe;EAeL,QAAA,QAAA;EAmBnC;;;mDA/JoD,SAAM;;;;;;;;;;;;;;;;;;;0CA6ClB;;;;;;;;;;;;;sDA+Be,mBAAgB;;;;;;;;;;;;;;;;qCAkCjC;;;;uCAeE;;;;kCAeL;;;;kGAmBnC;;;;yEAkBA"}