@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 @@
1
+ {"version":3,"file":"file-merger.mjs","names":[],"sources":["../../../src/services/setup/file-merger.ts"],"sourcesContent":["/**\n * File merger utilities.\n *\n * Deep-merges JSON files without losing user settings.\n */\n\n/**\n * Deep merge two objects, preserving existing user values.\n * New keys are added, but existing keys are NOT overwritten.\n */\nexport function deepMergePreserve<T extends Record<string, unknown>>(\n existing: T,\n defaults: T\n): T {\n const result = { ...existing };\n\n for (const key of Object.keys(defaults)) {\n const existingValue = existing[key];\n const defaultValue = defaults[key];\n\n if (existingValue === undefined) {\n // Key doesn't exist in user config, add it\n (result as Record<string, unknown>)[key] = defaultValue;\n } else if (isPlainObject(existingValue) && isPlainObject(defaultValue)) {\n // Both are objects, recurse\n (result as Record<string, unknown>)[key] = deepMergePreserve(\n existingValue as Record<string, unknown>,\n defaultValue as Record<string, unknown>\n );\n }\n // If key exists and is not an object, keep user's value\n }\n\n return result;\n}\n\n/**\n * Deep merge two objects, with new values taking precedence.\n * Used when we want to update existing configs.\n */\nexport function deepMergeOverwrite<T extends Record<string, unknown>>(\n existing: T,\n updates: Partial<T>\n): T {\n const result = { ...existing };\n\n for (const key of Object.keys(updates)) {\n const existingValue = existing[key];\n const updateValue = updates[key];\n\n if (updateValue === undefined) {\n continue;\n }\n\n if (isPlainObject(existingValue) && isPlainObject(updateValue)) {\n (result as Record<string, unknown>)[key] = deepMergeOverwrite(\n existingValue as Record<string, unknown>,\n updateValue as Record<string, unknown>\n );\n } else {\n (result as Record<string, unknown>)[key] = updateValue;\n }\n }\n\n return result;\n}\n\n/**\n * Check if a value is a plain object (not array, null, or other).\n */\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\n/**\n * Parse JSON safely, returning null on failure.\n */\nexport function safeParseJson<T>(content: string): T | null {\n try {\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * Format JSON with consistent indentation.\n */\nexport function formatJson(obj: unknown): string {\n return JSON.stringify(obj, null, 2) + '\\n';\n}\n"],"mappings":";;;;;;;;;;AAUA,SAAgB,kBACd,UACA,UACG;CACH,MAAM,SAAS,EAAE,GAAG,UAAU;AAE9B,MAAK,MAAM,OAAO,OAAO,KAAK,SAAS,EAAE;EACvC,MAAM,gBAAgB,SAAS;EAC/B,MAAM,eAAe,SAAS;AAE9B,MAAI,kBAAkB,OAEpB,CAAC,OAAmC,OAAO;WAClC,cAAc,cAAc,IAAI,cAAc,aAAa,CAEpE,CAAC,OAAmC,OAAO,kBACzC,eACA,aACD;;AAKL,QAAO;;;;;;AAOT,SAAgB,mBACd,UACA,SACG;CACH,MAAM,SAAS,EAAE,GAAG,UAAU;AAE9B,MAAK,MAAM,OAAO,OAAO,KAAK,QAAQ,EAAE;EACtC,MAAM,gBAAgB,SAAS;EAC/B,MAAM,cAAc,QAAQ;AAE5B,MAAI,gBAAgB,OAClB;AAGF,MAAI,cAAc,cAAc,IAAI,cAAc,YAAY,CAC5D,CAAC,OAAmC,OAAO,mBACzC,eACA,YACD;MAED,CAAC,OAAmC,OAAO;;AAI/C,QAAO;;;;;AAMT,SAAS,cAAc,OAAkD;AACvE,QACE,OAAO,UAAU,YACjB,UAAU,QACV,CAAC,MAAM,QAAQ,MAAM,IACrB,OAAO,eAAe,MAAM,KAAK,OAAO;;;;;AAO5C,SAAgB,cAAiB,SAA2B;AAC1D,KAAI;AACF,SAAO,KAAK,MAAM,QAAQ;SACpB;AACN,SAAO;;;;;;AAOX,SAAgB,WAAW,KAAsB;AAC/C,QAAO,KAAK,UAAU,KAAK,MAAM,EAAE,GAAG"}
@@ -0,0 +1,12 @@
1
+ import { FsAdapter } from "../../ports/fs.mjs";
2
+ import { SetupOptions, SetupPromptCallbacks, SetupResult } from "./types.mjs";
3
+
4
+ //#region src/services/setup/setup-service.d.ts
5
+
6
+ /**
7
+ * Run the ContractSpec setup.
8
+ */
9
+ declare function runSetup(fs: FsAdapter, options: SetupOptions, prompts?: SetupPromptCallbacks): Promise<SetupResult>;
10
+ //#endregion
11
+ export { runSetup };
12
+ //# sourceMappingURL=setup-service.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-service.d.mts","names":[],"sources":["../../../src/services/setup/setup-service.ts"],"sourcesContent":[],"mappings":";;;;;;;;iBA6CsB,QAAA,KAChB,oBACK,wBACA,uBACR,QAAQ"}
@@ -0,0 +1,96 @@
1
+ import { findPackageRoot, findWorkspaceRoot, getPackageName, isMonorepo } from "../../adapters/workspace.mjs";
2
+ import { ALL_SETUP_TARGETS, SETUP_TARGET_LABELS } from "./types.mjs";
3
+ import { setupCliConfig } from "./targets/cli-config.mjs";
4
+ import { setupVscodeSettings } from "./targets/vscode-settings.mjs";
5
+ import { setupMcpCursor } from "./targets/mcp-cursor.mjs";
6
+ import { setupMcpClaude } from "./targets/mcp-claude.mjs";
7
+ import { setupCursorRules } from "./targets/cursor-rules.mjs";
8
+ import { setupAgentsMd } from "./targets/agents-md.mjs";
9
+
10
+ //#region src/services/setup/setup-service.ts
11
+ /**
12
+ * Default prompt callbacks that always accept defaults.
13
+ */
14
+ const defaultPrompts = {
15
+ confirm: async () => true,
16
+ multiSelect: async (_msg, options) => options.filter((o) => o.selected !== false).map((o) => o.value),
17
+ input: async (_msg, defaultValue) => defaultValue ?? ""
18
+ };
19
+ /**
20
+ * Run the ContractSpec setup.
21
+ */
22
+ async function runSetup(fs, options, prompts = defaultPrompts) {
23
+ const results = [];
24
+ const targets = options.targets.length > 0 ? options.targets : ALL_SETUP_TARGETS;
25
+ const workspaceRoot = options.workspaceRoot;
26
+ const detectedWorkspaceRoot = findWorkspaceRoot(workspaceRoot);
27
+ const packageRoot = options.packageRoot ?? findPackageRoot(workspaceRoot);
28
+ const monorepo = options.isMonorepo ?? isMonorepo(detectedWorkspaceRoot);
29
+ const packageName = options.packageName ?? (monorepo ? getPackageName(packageRoot) : void 0);
30
+ let scope = options.scope ?? "workspace";
31
+ const isDifferentRoots = packageRoot !== detectedWorkspaceRoot;
32
+ if (monorepo && options.interactive && isDifferentRoots) scope = (await prompts.multiSelect(`Monorepo detected. Configure at which level?`, [{
33
+ value: "package",
34
+ label: `Package level (${packageName ?? packageRoot})`,
35
+ selected: true
36
+ }, {
37
+ value: "workspace",
38
+ label: `Workspace level (${detectedWorkspaceRoot})`
39
+ }]))[0] ?? "package";
40
+ let selectedTargets = targets;
41
+ if (options.interactive) selectedTargets = await prompts.multiSelect("Select components to configure:", ALL_SETUP_TARGETS.map((t) => ({
42
+ value: t,
43
+ label: SETUP_TARGET_LABELS[t],
44
+ selected: targets.includes(t)
45
+ })));
46
+ let projectName = options.projectName;
47
+ if (options.interactive && !projectName) {
48
+ const defaultName = scope === "package" && packageName ? packageName : workspaceRoot.split("/").pop() ?? "my-project";
49
+ projectName = await prompts.input("Project name:", defaultName);
50
+ }
51
+ const setupOptions = {
52
+ ...options,
53
+ workspaceRoot: detectedWorkspaceRoot,
54
+ packageRoot,
55
+ isMonorepo: monorepo,
56
+ scope,
57
+ packageName,
58
+ projectName,
59
+ targets: selectedTargets
60
+ };
61
+ for (const target of selectedTargets) {
62
+ const result = await setupTarget(fs, target, setupOptions, prompts);
63
+ results.push(result);
64
+ }
65
+ const succeeded = results.filter((r) => r.action !== "error").length;
66
+ const failed = results.filter((r) => r.action === "error").length;
67
+ const scopeInfo = monorepo ? ` (${scope} level)` : "";
68
+ return {
69
+ success: failed === 0,
70
+ files: results,
71
+ summary: `Setup complete${scopeInfo}: ${succeeded} configured, ${failed} failed.`
72
+ };
73
+ }
74
+ /**
75
+ * Setup a single target.
76
+ */
77
+ async function setupTarget(fs, target, options, prompts) {
78
+ switch (target) {
79
+ case "cli-config": return setupCliConfig(fs, options, prompts);
80
+ case "vscode-settings": return setupVscodeSettings(fs, options, prompts);
81
+ case "mcp-cursor": return setupMcpCursor(fs, options, prompts);
82
+ case "mcp-claude": return setupMcpClaude(fs, options, prompts);
83
+ case "cursor-rules": return setupCursorRules(fs, options, prompts);
84
+ case "agents-md": return setupAgentsMd(fs, options, prompts);
85
+ default: return {
86
+ target,
87
+ filePath: "",
88
+ action: "error",
89
+ message: `Unknown target: ${target}`
90
+ };
91
+ }
92
+ }
93
+
94
+ //#endregion
95
+ export { runSetup };
96
+ //# sourceMappingURL=setup-service.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-service.mjs","names":[],"sources":["../../../src/services/setup/setup-service.ts"],"sourcesContent":["/**\n * Setup service.\n *\n * Orchestrates the full ContractSpec setup flow.\n * Supports both single projects and monorepos.\n */\n\nimport type { FsAdapter } from '../../ports/fs';\nimport type {\n SetupOptions,\n SetupResult,\n SetupFileResult,\n SetupTarget,\n SetupPromptCallbacks,\n SetupScope,\n} from './types';\nimport { ALL_SETUP_TARGETS, SETUP_TARGET_LABELS } from './types';\nimport {\n setupCliConfig,\n setupVscodeSettings,\n setupMcpCursor,\n setupMcpClaude,\n setupCursorRules,\n setupAgentsMd,\n} from './targets/index';\nimport {\n findPackageRoot,\n findWorkspaceRoot,\n isMonorepo,\n getPackageName,\n} from '../../adapters/workspace';\n\n/**\n * Default prompt callbacks that always accept defaults.\n */\nconst defaultPrompts: SetupPromptCallbacks = {\n confirm: async () => true,\n multiSelect: async (_msg, options) =>\n options.filter((o) => o.selected !== false).map((o) => o.value),\n input: async (_msg, defaultValue) => defaultValue ?? '',\n};\n\n/**\n * Run the ContractSpec setup.\n */\nexport async function runSetup(\n fs: FsAdapter,\n options: SetupOptions,\n prompts: SetupPromptCallbacks = defaultPrompts\n): Promise<SetupResult> {\n const results: SetupFileResult[] = [];\n const targets =\n options.targets.length > 0 ? options.targets : ALL_SETUP_TARGETS;\n\n // Detect monorepo context if not already provided\n const workspaceRoot = options.workspaceRoot;\n const detectedWorkspaceRoot = findWorkspaceRoot(workspaceRoot);\n const packageRoot = options.packageRoot ?? findPackageRoot(workspaceRoot);\n const monorepo = options.isMonorepo ?? isMonorepo(detectedWorkspaceRoot);\n const packageName =\n options.packageName ?? (monorepo ? getPackageName(packageRoot) : undefined);\n\n // Determine scope\n let scope: SetupScope = options.scope ?? 'workspace';\n const isDifferentRoots = packageRoot !== detectedWorkspaceRoot;\n\n // If in a monorepo and interactive, prompt for scope\n if (monorepo && options.interactive && isDifferentRoots) {\n const scopeChoice = await prompts.multiSelect<SetupScope>(\n `Monorepo detected. Configure at which level?`,\n [\n {\n value: 'package',\n label: `Package level (${packageName ?? packageRoot})`,\n selected: true,\n },\n {\n value: 'workspace',\n label: `Workspace level (${detectedWorkspaceRoot})`,\n },\n ]\n );\n scope = scopeChoice[0] ?? 'package';\n }\n\n // If interactive, prompt for target selection\n let selectedTargets = targets;\n if (options.interactive) {\n selectedTargets = await prompts.multiSelect(\n 'Select components to configure:',\n ALL_SETUP_TARGETS.map((t) => ({\n value: t,\n label: SETUP_TARGET_LABELS[t],\n selected: targets.includes(t),\n }))\n );\n }\n\n // Get project name if interactive\n let projectName = options.projectName;\n if (options.interactive && !projectName) {\n const defaultName =\n scope === 'package' && packageName\n ? packageName\n : (workspaceRoot.split('/').pop() ?? 'my-project');\n projectName = await prompts.input('Project name:', defaultName);\n }\n\n const setupOptions: SetupOptions = {\n ...options,\n workspaceRoot: detectedWorkspaceRoot,\n packageRoot,\n isMonorepo: monorepo,\n scope,\n packageName,\n projectName,\n targets: selectedTargets,\n };\n\n // Run each target setup\n for (const target of selectedTargets) {\n const result = await setupTarget(fs, target, setupOptions, prompts);\n results.push(result);\n }\n\n const succeeded = results.filter((r) => r.action !== 'error').length;\n const failed = results.filter((r) => r.action === 'error').length;\n\n const scopeInfo = monorepo ? ` (${scope} level)` : '';\n return {\n success: failed === 0,\n files: results,\n summary: `Setup complete${scopeInfo}: ${succeeded} configured, ${failed} failed.`,\n };\n}\n\n/**\n * Setup a single target.\n */\nasync function setupTarget(\n fs: FsAdapter,\n target: SetupTarget,\n options: SetupOptions,\n prompts: SetupPromptCallbacks\n): Promise<SetupFileResult> {\n switch (target) {\n case 'cli-config':\n return setupCliConfig(fs, options, prompts);\n case 'vscode-settings':\n return setupVscodeSettings(fs, options, prompts);\n case 'mcp-cursor':\n return setupMcpCursor(fs, options, prompts);\n case 'mcp-claude':\n return setupMcpClaude(fs, options, prompts);\n case 'cursor-rules':\n return setupCursorRules(fs, options, prompts);\n case 'agents-md':\n return setupAgentsMd(fs, options, prompts);\n default:\n return {\n target,\n filePath: '',\n action: 'error',\n message: `Unknown target: ${target}`,\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAmCA,MAAM,iBAAuC;CAC3C,SAAS,YAAY;CACrB,aAAa,OAAO,MAAM,YACxB,QAAQ,QAAQ,MAAM,EAAE,aAAa,MAAM,CAAC,KAAK,MAAM,EAAE,MAAM;CACjE,OAAO,OAAO,MAAM,iBAAiB,gBAAgB;CACtD;;;;AAKD,eAAsB,SACpB,IACA,SACA,UAAgC,gBACV;CACtB,MAAM,UAA6B,EAAE;CACrC,MAAM,UACJ,QAAQ,QAAQ,SAAS,IAAI,QAAQ,UAAU;CAGjD,MAAM,gBAAgB,QAAQ;CAC9B,MAAM,wBAAwB,kBAAkB,cAAc;CAC9D,MAAM,cAAc,QAAQ,eAAe,gBAAgB,cAAc;CACzE,MAAM,WAAW,QAAQ,cAAc,WAAW,sBAAsB;CACxE,MAAM,cACJ,QAAQ,gBAAgB,WAAW,eAAe,YAAY,GAAG;CAGnE,IAAI,QAAoB,QAAQ,SAAS;CACzC,MAAM,mBAAmB,gBAAgB;AAGzC,KAAI,YAAY,QAAQ,eAAe,iBAerC,UAdoB,MAAM,QAAQ,YAChC,gDACA,CACE;EACE,OAAO;EACP,OAAO,kBAAkB,eAAe,YAAY;EACpD,UAAU;EACX,EACD;EACE,OAAO;EACP,OAAO,oBAAoB,sBAAsB;EAClD,CACF,CACF,EACmB,MAAM;CAI5B,IAAI,kBAAkB;AACtB,KAAI,QAAQ,YACV,mBAAkB,MAAM,QAAQ,YAC9B,mCACA,kBAAkB,KAAK,OAAO;EAC5B,OAAO;EACP,OAAO,oBAAoB;EAC3B,UAAU,QAAQ,SAAS,EAAE;EAC9B,EAAE,CACJ;CAIH,IAAI,cAAc,QAAQ;AAC1B,KAAI,QAAQ,eAAe,CAAC,aAAa;EACvC,MAAM,cACJ,UAAU,aAAa,cACnB,cACC,cAAc,MAAM,IAAI,CAAC,KAAK,IAAI;AACzC,gBAAc,MAAM,QAAQ,MAAM,iBAAiB,YAAY;;CAGjE,MAAM,eAA6B;EACjC,GAAG;EACH,eAAe;EACf;EACA,YAAY;EACZ;EACA;EACA;EACA,SAAS;EACV;AAGD,MAAK,MAAM,UAAU,iBAAiB;EACpC,MAAM,SAAS,MAAM,YAAY,IAAI,QAAQ,cAAc,QAAQ;AACnE,UAAQ,KAAK,OAAO;;CAGtB,MAAM,YAAY,QAAQ,QAAQ,MAAM,EAAE,WAAW,QAAQ,CAAC;CAC9D,MAAM,SAAS,QAAQ,QAAQ,MAAM,EAAE,WAAW,QAAQ,CAAC;CAE3D,MAAM,YAAY,WAAW,KAAK,MAAM,WAAW;AACnD,QAAO;EACL,SAAS,WAAW;EACpB,OAAO;EACP,SAAS,iBAAiB,UAAU,IAAI,UAAU,eAAe,OAAO;EACzE;;;;;AAMH,eAAe,YACb,IACA,QACA,SACA,SAC0B;AAC1B,SAAQ,QAAR;EACE,KAAK,aACH,QAAO,eAAe,IAAI,SAAS,QAAQ;EAC7C,KAAK,kBACH,QAAO,oBAAoB,IAAI,SAAS,QAAQ;EAClD,KAAK,aACH,QAAO,eAAe,IAAI,SAAS,QAAQ;EAC7C,KAAK,aACH,QAAO,eAAe,IAAI,SAAS,QAAQ;EAC7C,KAAK,eACH,QAAO,iBAAiB,IAAI,SAAS,QAAQ;EAC/C,KAAK,YACH,QAAO,cAAc,IAAI,SAAS,QAAQ;EAC5C,QACE,QAAO;GACL;GACA,UAAU;GACV,QAAQ;GACR,SAAS,mBAAmB;GAC7B"}
@@ -0,0 +1,47 @@
1
+ import { generateAgentsMd } from "../config-generators.mjs";
2
+
3
+ //#region src/services/setup/targets/agents-md.ts
4
+ /**
5
+ * Setup AGENTS.md
6
+ *
7
+ * In monorepo with package scope, creates AGENTS.md at package root.
8
+ */
9
+ async function setupAgentsMd(fs, options, prompts) {
10
+ const targetRoot = options.isMonorepo && options.scope === "package" ? options.packageRoot ?? options.workspaceRoot : options.workspaceRoot;
11
+ const filePath = fs.join(targetRoot, "AGENTS.md");
12
+ try {
13
+ const exists = await fs.exists(filePath);
14
+ const content = generateAgentsMd(options);
15
+ if (exists) if (options.interactive) {
16
+ if (!await prompts.confirm(`${filePath} exists. Overwrite?`)) return {
17
+ target: "agents-md",
18
+ filePath,
19
+ action: "skipped",
20
+ message: "User kept existing AGENTS.md"
21
+ };
22
+ } else return {
23
+ target: "agents-md",
24
+ filePath,
25
+ action: "skipped",
26
+ message: "File already exists"
27
+ };
28
+ await fs.writeFile(filePath, content);
29
+ return {
30
+ target: "agents-md",
31
+ filePath,
32
+ action: exists ? "merged" : "created",
33
+ message: exists ? "Updated AGENTS.md" : "Created AGENTS.md"
34
+ };
35
+ } catch (error) {
36
+ return {
37
+ target: "agents-md",
38
+ filePath,
39
+ action: "error",
40
+ message: error instanceof Error ? error.message : "Unknown error"
41
+ };
42
+ }
43
+ }
44
+
45
+ //#endregion
46
+ export { setupAgentsMd };
47
+ //# sourceMappingURL=agents-md.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-md.mjs","names":[],"sources":["../../../../src/services/setup/targets/agents-md.ts"],"sourcesContent":["/**\n * AGENTS.md setup target.\n */\n\nimport type { FsAdapter } from '../../../ports/fs';\nimport type {\n SetupOptions,\n SetupFileResult,\n SetupPromptCallbacks,\n} from '../types';\nimport { generateAgentsMd } from '../config-generators';\n\n/**\n * Setup AGENTS.md\n *\n * In monorepo with package scope, creates AGENTS.md at package root.\n */\nexport async function setupAgentsMd(\n fs: FsAdapter,\n options: SetupOptions,\n prompts: SetupPromptCallbacks\n): Promise<SetupFileResult> {\n // Determine target root based on scope\n const targetRoot =\n options.isMonorepo && options.scope === 'package'\n ? (options.packageRoot ?? options.workspaceRoot)\n : options.workspaceRoot;\n\n const filePath = fs.join(targetRoot, 'AGENTS.md');\n\n try {\n const exists = await fs.exists(filePath);\n const content = generateAgentsMd(options);\n\n if (exists) {\n if (options.interactive) {\n const proceed = await prompts.confirm(`${filePath} exists. Overwrite?`);\n if (!proceed) {\n return {\n target: 'agents-md',\n filePath,\n action: 'skipped',\n message: 'User kept existing AGENTS.md',\n };\n }\n } else {\n // Non-interactive: skip existing file\n return {\n target: 'agents-md',\n filePath,\n action: 'skipped',\n message: 'File already exists',\n };\n }\n }\n\n await fs.writeFile(filePath, content);\n return {\n target: 'agents-md',\n filePath,\n action: exists ? 'merged' : 'created',\n message: exists ? 'Updated AGENTS.md' : 'Created AGENTS.md',\n };\n } catch (error) {\n return {\n target: 'agents-md',\n filePath,\n action: 'error',\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n"],"mappings":";;;;;;;;AAiBA,eAAsB,cACpB,IACA,SACA,SAC0B;CAE1B,MAAM,aACJ,QAAQ,cAAc,QAAQ,UAAU,YACnC,QAAQ,eAAe,QAAQ,gBAChC,QAAQ;CAEd,MAAM,WAAW,GAAG,KAAK,YAAY,YAAY;AAEjD,KAAI;EACF,MAAM,SAAS,MAAM,GAAG,OAAO,SAAS;EACxC,MAAM,UAAU,iBAAiB,QAAQ;AAEzC,MAAI,OACF,KAAI,QAAQ,aAEV;OAAI,CADY,MAAM,QAAQ,QAAQ,GAAG,SAAS,qBAAqB,CAErE,QAAO;IACL,QAAQ;IACR;IACA,QAAQ;IACR,SAAS;IACV;QAIH,QAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS;GACV;AAIL,QAAM,GAAG,UAAU,UAAU,QAAQ;AACrC,SAAO;GACL,QAAQ;GACR;GACA,QAAQ,SAAS,WAAW;GAC5B,SAAS,SAAS,sBAAsB;GACzC;UACM,OAAO;AACd,SAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS,iBAAiB,QAAQ,MAAM,UAAU;GACnD"}
@@ -0,0 +1,60 @@
1
+ import { generateContractsrcConfig } from "../config-generators.mjs";
2
+ import { deepMergePreserve, formatJson, safeParseJson } from "../file-merger.mjs";
3
+
4
+ //#region src/services/setup/targets/cli-config.ts
5
+ /**
6
+ * Setup .contractsrc.json
7
+ *
8
+ * In monorepo with package scope, creates config at package root.
9
+ */
10
+ async function setupCliConfig(fs, options, prompts) {
11
+ const targetRoot = options.isMonorepo && options.scope === "package" ? options.packageRoot ?? options.workspaceRoot : options.workspaceRoot;
12
+ const filePath = fs.join(targetRoot, ".contractsrc.json");
13
+ try {
14
+ const exists = await fs.exists(filePath);
15
+ const defaults = generateContractsrcConfig(options);
16
+ if (exists) {
17
+ const existing = safeParseJson(await fs.readFile(filePath));
18
+ if (!existing) return {
19
+ target: "cli-config",
20
+ filePath,
21
+ action: "error",
22
+ message: "Existing file is not valid JSON"
23
+ };
24
+ if (options.interactive) {
25
+ if (!await prompts.confirm(`${filePath} exists. Merge ContractSpec defaults?`)) return {
26
+ target: "cli-config",
27
+ filePath,
28
+ action: "skipped",
29
+ message: "User skipped merge"
30
+ };
31
+ }
32
+ const merged = deepMergePreserve(existing, defaults);
33
+ await fs.writeFile(filePath, formatJson(merged));
34
+ return {
35
+ target: "cli-config",
36
+ filePath,
37
+ action: "merged",
38
+ message: "Merged with existing configuration"
39
+ };
40
+ }
41
+ await fs.writeFile(filePath, formatJson(defaults));
42
+ return {
43
+ target: "cli-config",
44
+ filePath,
45
+ action: "created",
46
+ message: "Created CLI configuration"
47
+ };
48
+ } catch (error) {
49
+ return {
50
+ target: "cli-config",
51
+ filePath,
52
+ action: "error",
53
+ message: error instanceof Error ? error.message : "Unknown error"
54
+ };
55
+ }
56
+ }
57
+
58
+ //#endregion
59
+ export { setupCliConfig };
60
+ //# sourceMappingURL=cli-config.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-config.mjs","names":[],"sources":["../../../../src/services/setup/targets/cli-config.ts"],"sourcesContent":["/**\n * CLI config setup target.\n */\n\nimport type { FsAdapter } from '../../../ports/fs';\nimport type {\n SetupOptions,\n SetupFileResult,\n SetupPromptCallbacks,\n} from '../types';\nimport { generateContractsrcConfig } from '../config-generators';\nimport { deepMergePreserve, safeParseJson, formatJson } from '../file-merger';\n\n/**\n * Setup .contractsrc.json\n *\n * In monorepo with package scope, creates config at package root.\n */\nexport async function setupCliConfig(\n fs: FsAdapter,\n options: SetupOptions,\n prompts: SetupPromptCallbacks\n): Promise<SetupFileResult> {\n // Determine target root based on scope\n const targetRoot =\n options.isMonorepo && options.scope === 'package'\n ? (options.packageRoot ?? options.workspaceRoot)\n : options.workspaceRoot;\n\n const filePath = fs.join(targetRoot, '.contractsrc.json');\n\n try {\n const exists = await fs.exists(filePath);\n const defaults = generateContractsrcConfig(options);\n\n if (exists) {\n const content = await fs.readFile(filePath);\n const existing = safeParseJson<Record<string, unknown>>(content);\n\n if (!existing) {\n return {\n target: 'cli-config',\n filePath,\n action: 'error',\n message: 'Existing file is not valid JSON',\n };\n }\n\n if (options.interactive) {\n const proceed = await prompts.confirm(\n `${filePath} exists. Merge ContractSpec defaults?`\n );\n if (!proceed) {\n return {\n target: 'cli-config',\n filePath,\n action: 'skipped',\n message: 'User skipped merge',\n };\n }\n }\n\n const merged = deepMergePreserve(\n existing,\n defaults as Record<string, unknown>\n );\n await fs.writeFile(filePath, formatJson(merged));\n\n return {\n target: 'cli-config',\n filePath,\n action: 'merged',\n message: 'Merged with existing configuration',\n };\n }\n\n await fs.writeFile(filePath, formatJson(defaults));\n return {\n target: 'cli-config',\n filePath,\n action: 'created',\n message: 'Created CLI configuration',\n };\n } catch (error) {\n return {\n target: 'cli-config',\n filePath,\n action: 'error',\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n"],"mappings":";;;;;;;;;AAkBA,eAAsB,eACpB,IACA,SACA,SAC0B;CAE1B,MAAM,aACJ,QAAQ,cAAc,QAAQ,UAAU,YACnC,QAAQ,eAAe,QAAQ,gBAChC,QAAQ;CAEd,MAAM,WAAW,GAAG,KAAK,YAAY,oBAAoB;AAEzD,KAAI;EACF,MAAM,SAAS,MAAM,GAAG,OAAO,SAAS;EACxC,MAAM,WAAW,0BAA0B,QAAQ;AAEnD,MAAI,QAAQ;GAEV,MAAM,WAAW,cADD,MAAM,GAAG,SAAS,SAAS,CACqB;AAEhE,OAAI,CAAC,SACH,QAAO;IACL,QAAQ;IACR;IACA,QAAQ;IACR,SAAS;IACV;AAGH,OAAI,QAAQ,aAIV;QAAI,CAHY,MAAM,QAAQ,QAC5B,GAAG,SAAS,uCACb,CAEC,QAAO;KACL,QAAQ;KACR;KACA,QAAQ;KACR,SAAS;KACV;;GAIL,MAAM,SAAS,kBACb,UACA,SACD;AACD,SAAM,GAAG,UAAU,UAAU,WAAW,OAAO,CAAC;AAEhD,UAAO;IACL,QAAQ;IACR;IACA,QAAQ;IACR,SAAS;IACV;;AAGH,QAAM,GAAG,UAAU,UAAU,WAAW,SAAS,CAAC;AAClD,SAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS;GACV;UACM,OAAO;AACd,SAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS,iBAAiB,QAAQ,MAAM,UAAU;GACnD"}
@@ -0,0 +1,48 @@
1
+ import { generateCursorRules } from "../config-generators.mjs";
2
+
3
+ //#region src/services/setup/targets/cursor-rules.ts
4
+ /**
5
+ * Setup .cursor/rules/contractspec.mdc
6
+ */
7
+ async function setupCursorRules(fs, options, prompts) {
8
+ const rulesDir = fs.join(options.workspaceRoot, ".cursor", "rules");
9
+ const filePath = fs.join(rulesDir, "contractspec.mdc");
10
+ try {
11
+ const cursorDir = fs.join(options.workspaceRoot, ".cursor");
12
+ if (!await fs.exists(cursorDir)) await fs.mkdir(cursorDir);
13
+ if (!await fs.exists(rulesDir)) await fs.mkdir(rulesDir);
14
+ const exists = await fs.exists(filePath);
15
+ const content = generateCursorRules(options);
16
+ if (exists) if (options.interactive) {
17
+ if (!await prompts.confirm(`${filePath} exists. Overwrite with latest rules?`)) return {
18
+ target: "cursor-rules",
19
+ filePath,
20
+ action: "skipped",
21
+ message: "User kept existing rules"
22
+ };
23
+ } else return {
24
+ target: "cursor-rules",
25
+ filePath,
26
+ action: "skipped",
27
+ message: "File already exists"
28
+ };
29
+ await fs.writeFile(filePath, content);
30
+ return {
31
+ target: "cursor-rules",
32
+ filePath,
33
+ action: exists ? "merged" : "created",
34
+ message: exists ? "Updated Cursor rules" : "Created Cursor rules"
35
+ };
36
+ } catch (error) {
37
+ return {
38
+ target: "cursor-rules",
39
+ filePath,
40
+ action: "error",
41
+ message: error instanceof Error ? error.message : "Unknown error"
42
+ };
43
+ }
44
+ }
45
+
46
+ //#endregion
47
+ export { setupCursorRules };
48
+ //# sourceMappingURL=cursor-rules.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-rules.mjs","names":[],"sources":["../../../../src/services/setup/targets/cursor-rules.ts"],"sourcesContent":["/**\n * Cursor rules setup target.\n */\n\nimport type { FsAdapter } from '../../../ports/fs';\nimport type {\n SetupOptions,\n SetupFileResult,\n SetupPromptCallbacks,\n} from '../types';\nimport { generateCursorRules } from '../config-generators';\n\n/**\n * Setup .cursor/rules/contractspec.mdc\n */\nexport async function setupCursorRules(\n fs: FsAdapter,\n options: SetupOptions,\n prompts: SetupPromptCallbacks\n): Promise<SetupFileResult> {\n const rulesDir = fs.join(options.workspaceRoot, '.cursor', 'rules');\n const filePath = fs.join(rulesDir, 'contractspec.mdc');\n\n try {\n // Ensure .cursor/rules directory exists\n const cursorDir = fs.join(options.workspaceRoot, '.cursor');\n if (!(await fs.exists(cursorDir))) {\n await fs.mkdir(cursorDir);\n }\n if (!(await fs.exists(rulesDir))) {\n await fs.mkdir(rulesDir);\n }\n\n const exists = await fs.exists(filePath);\n const content = generateCursorRules(options);\n\n if (exists) {\n if (options.interactive) {\n const proceed = await prompts.confirm(\n `${filePath} exists. Overwrite with latest rules?`\n );\n if (!proceed) {\n return {\n target: 'cursor-rules',\n filePath,\n action: 'skipped',\n message: 'User kept existing rules',\n };\n }\n } else {\n // Non-interactive: skip existing file\n return {\n target: 'cursor-rules',\n filePath,\n action: 'skipped',\n message: 'File already exists',\n };\n }\n }\n\n await fs.writeFile(filePath, content);\n return {\n target: 'cursor-rules',\n filePath,\n action: exists ? 'merged' : 'created',\n message: exists ? 'Updated Cursor rules' : 'Created Cursor rules',\n };\n } catch (error) {\n return {\n target: 'cursor-rules',\n filePath,\n action: 'error',\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n"],"mappings":";;;;;;AAeA,eAAsB,iBACpB,IACA,SACA,SAC0B;CAC1B,MAAM,WAAW,GAAG,KAAK,QAAQ,eAAe,WAAW,QAAQ;CACnE,MAAM,WAAW,GAAG,KAAK,UAAU,mBAAmB;AAEtD,KAAI;EAEF,MAAM,YAAY,GAAG,KAAK,QAAQ,eAAe,UAAU;AAC3D,MAAI,CAAE,MAAM,GAAG,OAAO,UAAU,CAC9B,OAAM,GAAG,MAAM,UAAU;AAE3B,MAAI,CAAE,MAAM,GAAG,OAAO,SAAS,CAC7B,OAAM,GAAG,MAAM,SAAS;EAG1B,MAAM,SAAS,MAAM,GAAG,OAAO,SAAS;EACxC,MAAM,UAAU,oBAAoB,QAAQ;AAE5C,MAAI,OACF,KAAI,QAAQ,aAIV;OAAI,CAHY,MAAM,QAAQ,QAC5B,GAAG,SAAS,uCACb,CAEC,QAAO;IACL,QAAQ;IACR;IACA,QAAQ;IACR,SAAS;IACV;QAIH,QAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS;GACV;AAIL,QAAM,GAAG,UAAU,UAAU,QAAQ;AACrC,SAAO;GACL,QAAQ;GACR;GACA,QAAQ,SAAS,WAAW;GAC5B,SAAS,SAAS,yBAAyB;GAC5C;UACM,OAAO;AACd,SAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS,iBAAiB,QAAQ,MAAM,UAAU;GACnD"}
@@ -0,0 +1,60 @@
1
+ import { generateClaudeMcpConfig, getClaudeDesktopConfigPath } from "../config-generators.mjs";
2
+ import { deepMergePreserve, formatJson, safeParseJson } from "../file-merger.mjs";
3
+
4
+ //#region src/services/setup/targets/mcp-claude.ts
5
+ /**
6
+ * Setup Claude Desktop MCP config.
7
+ * This modifies the user's global Claude config, so we're extra careful.
8
+ */
9
+ async function setupMcpClaude(fs, options, prompts) {
10
+ const filePath = getClaudeDesktopConfigPath();
11
+ try {
12
+ const exists = await fs.exists(filePath);
13
+ const defaults = generateClaudeMcpConfig();
14
+ if (options.interactive) {
15
+ if (!await prompts.confirm(`Configure Claude Desktop at ${filePath}?`)) return {
16
+ target: "mcp-claude",
17
+ filePath,
18
+ action: "skipped",
19
+ message: "User skipped Claude Desktop configuration"
20
+ };
21
+ }
22
+ if (exists) {
23
+ const existing = safeParseJson(await fs.readFile(filePath));
24
+ if (!existing) return {
25
+ target: "mcp-claude",
26
+ filePath,
27
+ action: "error",
28
+ message: "Existing file is not valid JSON"
29
+ };
30
+ const merged = deepMergePreserve(existing, defaults);
31
+ await fs.writeFile(filePath, formatJson(merged));
32
+ return {
33
+ target: "mcp-claude",
34
+ filePath,
35
+ action: "merged",
36
+ message: "Added ContractSpec to Claude Desktop"
37
+ };
38
+ }
39
+ const parentDir = filePath.substring(0, filePath.lastIndexOf("/"));
40
+ if (!await fs.exists(parentDir)) await fs.mkdir(parentDir);
41
+ await fs.writeFile(filePath, formatJson(defaults));
42
+ return {
43
+ target: "mcp-claude",
44
+ filePath,
45
+ action: "created",
46
+ message: "Created Claude Desktop configuration"
47
+ };
48
+ } catch (error) {
49
+ return {
50
+ target: "mcp-claude",
51
+ filePath,
52
+ action: "error",
53
+ message: error instanceof Error ? error.message : "Unknown error"
54
+ };
55
+ }
56
+ }
57
+
58
+ //#endregion
59
+ export { setupMcpClaude };
60
+ //# sourceMappingURL=mcp-claude.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-claude.mjs","names":[],"sources":["../../../../src/services/setup/targets/mcp-claude.ts"],"sourcesContent":["/**\n * Claude Desktop MCP setup target.\n */\n\nimport type { FsAdapter } from '../../../ports/fs';\nimport type {\n SetupOptions,\n SetupFileResult,\n SetupPromptCallbacks,\n} from '../types';\nimport {\n generateClaudeMcpConfig,\n getClaudeDesktopConfigPath,\n} from '../config-generators';\nimport { deepMergePreserve, safeParseJson, formatJson } from '../file-merger';\n\n/**\n * Setup Claude Desktop MCP config.\n * This modifies the user's global Claude config, so we're extra careful.\n */\nexport async function setupMcpClaude(\n fs: FsAdapter,\n options: SetupOptions,\n prompts: SetupPromptCallbacks\n): Promise<SetupFileResult> {\n const filePath = getClaudeDesktopConfigPath();\n\n try {\n const exists = await fs.exists(filePath);\n const defaults = generateClaudeMcpConfig();\n\n if (options.interactive) {\n const proceed = await prompts.confirm(\n `Configure Claude Desktop at ${filePath}?`\n );\n if (!proceed) {\n return {\n target: 'mcp-claude',\n filePath,\n action: 'skipped',\n message: 'User skipped Claude Desktop configuration',\n };\n }\n }\n\n if (exists) {\n const content = await fs.readFile(filePath);\n const existing = safeParseJson<Record<string, unknown>>(content);\n\n if (!existing) {\n return {\n target: 'mcp-claude',\n filePath,\n action: 'error',\n message: 'Existing file is not valid JSON',\n };\n }\n\n const merged = deepMergePreserve(\n existing,\n defaults as Record<string, unknown>\n );\n await fs.writeFile(filePath, formatJson(merged));\n\n return {\n target: 'mcp-claude',\n filePath,\n action: 'merged',\n message: 'Added ContractSpec to Claude Desktop',\n };\n }\n\n // Ensure parent directory exists\n const parentDir = filePath.substring(0, filePath.lastIndexOf('/'));\n const parentExists = await fs.exists(parentDir);\n if (!parentExists) {\n await fs.mkdir(parentDir);\n }\n\n await fs.writeFile(filePath, formatJson(defaults));\n return {\n target: 'mcp-claude',\n filePath,\n action: 'created',\n message: 'Created Claude Desktop configuration',\n };\n } catch (error) {\n return {\n target: 'mcp-claude',\n filePath,\n action: 'error',\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n"],"mappings":";;;;;;;;AAoBA,eAAsB,eACpB,IACA,SACA,SAC0B;CAC1B,MAAM,WAAW,4BAA4B;AAE7C,KAAI;EACF,MAAM,SAAS,MAAM,GAAG,OAAO,SAAS;EACxC,MAAM,WAAW,yBAAyB;AAE1C,MAAI,QAAQ,aAIV;OAAI,CAHY,MAAM,QAAQ,QAC5B,+BAA+B,SAAS,GACzC,CAEC,QAAO;IACL,QAAQ;IACR;IACA,QAAQ;IACR,SAAS;IACV;;AAIL,MAAI,QAAQ;GAEV,MAAM,WAAW,cADD,MAAM,GAAG,SAAS,SAAS,CACqB;AAEhE,OAAI,CAAC,SACH,QAAO;IACL,QAAQ;IACR;IACA,QAAQ;IACR,SAAS;IACV;GAGH,MAAM,SAAS,kBACb,UACA,SACD;AACD,SAAM,GAAG,UAAU,UAAU,WAAW,OAAO,CAAC;AAEhD,UAAO;IACL,QAAQ;IACR;IACA,QAAQ;IACR,SAAS;IACV;;EAIH,MAAM,YAAY,SAAS,UAAU,GAAG,SAAS,YAAY,IAAI,CAAC;AAElE,MAAI,CADiB,MAAM,GAAG,OAAO,UAAU,CAE7C,OAAM,GAAG,MAAM,UAAU;AAG3B,QAAM,GAAG,UAAU,UAAU,WAAW,SAAS,CAAC;AAClD,SAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS;GACV;UACM,OAAO;AACd,SAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS,iBAAiB,QAAQ,MAAM,UAAU;GACnD"}
@@ -0,0 +1,59 @@
1
+ import { generateCursorMcpConfig } from "../config-generators.mjs";
2
+ import { deepMergePreserve, formatJson, safeParseJson } from "../file-merger.mjs";
3
+
4
+ //#region src/services/setup/targets/mcp-cursor.ts
5
+ /**
6
+ * Setup .cursor/mcp.json
7
+ */
8
+ async function setupMcpCursor(fs, options, prompts) {
9
+ const dirPath = fs.join(options.workspaceRoot, ".cursor");
10
+ const filePath = fs.join(dirPath, "mcp.json");
11
+ try {
12
+ if (!await fs.exists(dirPath)) await fs.mkdir(dirPath);
13
+ const exists = await fs.exists(filePath);
14
+ const defaults = generateCursorMcpConfig();
15
+ if (exists) {
16
+ const existing = safeParseJson(await fs.readFile(filePath));
17
+ if (!existing) return {
18
+ target: "mcp-cursor",
19
+ filePath,
20
+ action: "error",
21
+ message: "Existing file is not valid JSON"
22
+ };
23
+ if (options.interactive) {
24
+ if (!await prompts.confirm(`${filePath} exists. Add ContractSpec MCP server?`)) return {
25
+ target: "mcp-cursor",
26
+ filePath,
27
+ action: "skipped",
28
+ message: "User skipped merge"
29
+ };
30
+ }
31
+ const merged = deepMergePreserve(existing, defaults);
32
+ await fs.writeFile(filePath, formatJson(merged));
33
+ return {
34
+ target: "mcp-cursor",
35
+ filePath,
36
+ action: "merged",
37
+ message: "Added ContractSpec MCP server"
38
+ };
39
+ }
40
+ await fs.writeFile(filePath, formatJson(defaults));
41
+ return {
42
+ target: "mcp-cursor",
43
+ filePath,
44
+ action: "created",
45
+ message: "Created Cursor MCP configuration"
46
+ };
47
+ } catch (error) {
48
+ return {
49
+ target: "mcp-cursor",
50
+ filePath,
51
+ action: "error",
52
+ message: error instanceof Error ? error.message : "Unknown error"
53
+ };
54
+ }
55
+ }
56
+
57
+ //#endregion
58
+ export { setupMcpCursor };
59
+ //# sourceMappingURL=mcp-cursor.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-cursor.mjs","names":[],"sources":["../../../../src/services/setup/targets/mcp-cursor.ts"],"sourcesContent":["/**\n * Cursor MCP setup target.\n */\n\nimport type { FsAdapter } from '../../../ports/fs';\nimport type {\n SetupOptions,\n SetupFileResult,\n SetupPromptCallbacks,\n} from '../types';\nimport { generateCursorMcpConfig } from '../config-generators';\nimport { deepMergePreserve, safeParseJson, formatJson } from '../file-merger';\n\n/**\n * Setup .cursor/mcp.json\n */\nexport async function setupMcpCursor(\n fs: FsAdapter,\n options: SetupOptions,\n prompts: SetupPromptCallbacks\n): Promise<SetupFileResult> {\n const dirPath = fs.join(options.workspaceRoot, '.cursor');\n const filePath = fs.join(dirPath, 'mcp.json');\n\n try {\n // Ensure .cursor directory exists\n const dirExists = await fs.exists(dirPath);\n if (!dirExists) {\n await fs.mkdir(dirPath);\n }\n\n const exists = await fs.exists(filePath);\n const defaults = generateCursorMcpConfig();\n\n if (exists) {\n const content = await fs.readFile(filePath);\n const existing = safeParseJson<Record<string, unknown>>(content);\n\n if (!existing) {\n return {\n target: 'mcp-cursor',\n filePath,\n action: 'error',\n message: 'Existing file is not valid JSON',\n };\n }\n\n if (options.interactive) {\n const proceed = await prompts.confirm(\n `${filePath} exists. Add ContractSpec MCP server?`\n );\n if (!proceed) {\n return {\n target: 'mcp-cursor',\n filePath,\n action: 'skipped',\n message: 'User skipped merge',\n };\n }\n }\n\n const merged = deepMergePreserve(\n existing,\n defaults as Record<string, unknown>\n );\n await fs.writeFile(filePath, formatJson(merged));\n\n return {\n target: 'mcp-cursor',\n filePath,\n action: 'merged',\n message: 'Added ContractSpec MCP server',\n };\n }\n\n await fs.writeFile(filePath, formatJson(defaults));\n return {\n target: 'mcp-cursor',\n filePath,\n action: 'created',\n message: 'Created Cursor MCP configuration',\n };\n } catch (error) {\n return {\n target: 'mcp-cursor',\n filePath,\n action: 'error',\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n"],"mappings":";;;;;;;AAgBA,eAAsB,eACpB,IACA,SACA,SAC0B;CAC1B,MAAM,UAAU,GAAG,KAAK,QAAQ,eAAe,UAAU;CACzD,MAAM,WAAW,GAAG,KAAK,SAAS,WAAW;AAE7C,KAAI;AAGF,MAAI,CADc,MAAM,GAAG,OAAO,QAAQ,CAExC,OAAM,GAAG,MAAM,QAAQ;EAGzB,MAAM,SAAS,MAAM,GAAG,OAAO,SAAS;EACxC,MAAM,WAAW,yBAAyB;AAE1C,MAAI,QAAQ;GAEV,MAAM,WAAW,cADD,MAAM,GAAG,SAAS,SAAS,CACqB;AAEhE,OAAI,CAAC,SACH,QAAO;IACL,QAAQ;IACR;IACA,QAAQ;IACR,SAAS;IACV;AAGH,OAAI,QAAQ,aAIV;QAAI,CAHY,MAAM,QAAQ,QAC5B,GAAG,SAAS,uCACb,CAEC,QAAO;KACL,QAAQ;KACR;KACA,QAAQ;KACR,SAAS;KACV;;GAIL,MAAM,SAAS,kBACb,UACA,SACD;AACD,SAAM,GAAG,UAAU,UAAU,WAAW,OAAO,CAAC;AAEhD,UAAO;IACL,QAAQ;IACR;IACA,QAAQ;IACR,SAAS;IACV;;AAGH,QAAM,GAAG,UAAU,UAAU,WAAW,SAAS,CAAC;AAClD,SAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS;GACV;UACM,OAAO;AACd,SAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS,iBAAiB,QAAQ,MAAM,UAAU;GACnD"}
@@ -0,0 +1,63 @@
1
+ import { generateVscodeSettings } from "../config-generators.mjs";
2
+ import { deepMergePreserve, formatJson, safeParseJson } from "../file-merger.mjs";
3
+
4
+ //#region src/services/setup/targets/vscode-settings.ts
5
+ /**
6
+ * Setup .vscode/settings.json
7
+ *
8
+ * VS Code settings are typically at workspace root, but in monorepo
9
+ * with package scope, can be at package root.
10
+ */
11
+ async function setupVscodeSettings(fs, options, prompts) {
12
+ const targetRoot = options.isMonorepo && options.scope === "package" ? options.packageRoot ?? options.workspaceRoot : options.workspaceRoot;
13
+ const dirPath = fs.join(targetRoot, ".vscode");
14
+ const filePath = fs.join(dirPath, "settings.json");
15
+ try {
16
+ if (!await fs.exists(dirPath)) await fs.mkdir(dirPath);
17
+ const exists = await fs.exists(filePath);
18
+ const defaults = generateVscodeSettings();
19
+ if (exists) {
20
+ const existing = safeParseJson(await fs.readFile(filePath));
21
+ if (!existing) return {
22
+ target: "vscode-settings",
23
+ filePath,
24
+ action: "error",
25
+ message: "Existing file is not valid JSON"
26
+ };
27
+ if (options.interactive) {
28
+ if (!await prompts.confirm(`${filePath} exists. Add ContractSpec settings?`)) return {
29
+ target: "vscode-settings",
30
+ filePath,
31
+ action: "skipped",
32
+ message: "User skipped merge"
33
+ };
34
+ }
35
+ const merged = deepMergePreserve(existing, defaults);
36
+ await fs.writeFile(filePath, formatJson(merged));
37
+ return {
38
+ target: "vscode-settings",
39
+ filePath,
40
+ action: "merged",
41
+ message: "Added ContractSpec settings"
42
+ };
43
+ }
44
+ await fs.writeFile(filePath, formatJson(defaults));
45
+ return {
46
+ target: "vscode-settings",
47
+ filePath,
48
+ action: "created",
49
+ message: "Created VS Code settings"
50
+ };
51
+ } catch (error) {
52
+ return {
53
+ target: "vscode-settings",
54
+ filePath,
55
+ action: "error",
56
+ message: error instanceof Error ? error.message : "Unknown error"
57
+ };
58
+ }
59
+ }
60
+
61
+ //#endregion
62
+ export { setupVscodeSettings };
63
+ //# sourceMappingURL=vscode-settings.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vscode-settings.mjs","names":[],"sources":["../../../../src/services/setup/targets/vscode-settings.ts"],"sourcesContent":["/**\n * VS Code settings setup target.\n */\n\nimport type { FsAdapter } from '../../../ports/fs';\nimport type {\n SetupOptions,\n SetupFileResult,\n SetupPromptCallbacks,\n} from '../types';\nimport { generateVscodeSettings } from '../config-generators';\nimport { deepMergePreserve, safeParseJson, formatJson } from '../file-merger';\n\n/**\n * Setup .vscode/settings.json\n *\n * VS Code settings are typically at workspace root, but in monorepo\n * with package scope, can be at package root.\n */\nexport async function setupVscodeSettings(\n fs: FsAdapter,\n options: SetupOptions,\n prompts: SetupPromptCallbacks\n): Promise<SetupFileResult> {\n // VS Code settings typically stay at workspace root\n // but can be at package root if specifically requested\n const targetRoot =\n options.isMonorepo && options.scope === 'package'\n ? (options.packageRoot ?? options.workspaceRoot)\n : options.workspaceRoot;\n\n const dirPath = fs.join(targetRoot, '.vscode');\n const filePath = fs.join(dirPath, 'settings.json');\n\n try {\n // Ensure .vscode directory exists\n const dirExists = await fs.exists(dirPath);\n if (!dirExists) {\n await fs.mkdir(dirPath);\n }\n\n const exists = await fs.exists(filePath);\n const defaults = generateVscodeSettings();\n\n if (exists) {\n const content = await fs.readFile(filePath);\n const existing = safeParseJson<Record<string, unknown>>(content);\n\n if (!existing) {\n return {\n target: 'vscode-settings',\n filePath,\n action: 'error',\n message: 'Existing file is not valid JSON',\n };\n }\n\n if (options.interactive) {\n const proceed = await prompts.confirm(\n `${filePath} exists. Add ContractSpec settings?`\n );\n if (!proceed) {\n return {\n target: 'vscode-settings',\n filePath,\n action: 'skipped',\n message: 'User skipped merge',\n };\n }\n }\n\n const merged = deepMergePreserve(\n existing,\n defaults as Record<string, unknown>\n );\n await fs.writeFile(filePath, formatJson(merged));\n\n return {\n target: 'vscode-settings',\n filePath,\n action: 'merged',\n message: 'Added ContractSpec settings',\n };\n }\n\n await fs.writeFile(filePath, formatJson(defaults));\n return {\n target: 'vscode-settings',\n filePath,\n action: 'created',\n message: 'Created VS Code settings',\n };\n } catch (error) {\n return {\n target: 'vscode-settings',\n filePath,\n action: 'error',\n message: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n"],"mappings":";;;;;;;;;;AAmBA,eAAsB,oBACpB,IACA,SACA,SAC0B;CAG1B,MAAM,aACJ,QAAQ,cAAc,QAAQ,UAAU,YACnC,QAAQ,eAAe,QAAQ,gBAChC,QAAQ;CAEd,MAAM,UAAU,GAAG,KAAK,YAAY,UAAU;CAC9C,MAAM,WAAW,GAAG,KAAK,SAAS,gBAAgB;AAElD,KAAI;AAGF,MAAI,CADc,MAAM,GAAG,OAAO,QAAQ,CAExC,OAAM,GAAG,MAAM,QAAQ;EAGzB,MAAM,SAAS,MAAM,GAAG,OAAO,SAAS;EACxC,MAAM,WAAW,wBAAwB;AAEzC,MAAI,QAAQ;GAEV,MAAM,WAAW,cADD,MAAM,GAAG,SAAS,SAAS,CACqB;AAEhE,OAAI,CAAC,SACH,QAAO;IACL,QAAQ;IACR;IACA,QAAQ;IACR,SAAS;IACV;AAGH,OAAI,QAAQ,aAIV;QAAI,CAHY,MAAM,QAAQ,QAC5B,GAAG,SAAS,qCACb,CAEC,QAAO;KACL,QAAQ;KACR;KACA,QAAQ;KACR,SAAS;KACV;;GAIL,MAAM,SAAS,kBACb,UACA,SACD;AACD,SAAM,GAAG,UAAU,UAAU,WAAW,OAAO,CAAC;AAEhD,UAAO;IACL,QAAQ;IACR;IACA,QAAQ;IACR,SAAS;IACV;;AAGH,QAAM,GAAG,UAAU,UAAU,WAAW,SAAS,CAAC;AAClD,SAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS;GACV;UACM,OAAO;AACd,SAAO;GACL,QAAQ;GACR;GACA,QAAQ;GACR,SAAS,iBAAiB,QAAQ,MAAM,UAAU;GACnD"}
@@ -0,0 +1,85 @@
1
+ //#region src/services/setup/types.d.ts
2
+ /**
3
+ * Setup service types.
4
+ */
5
+ /**
6
+ * Target components that can be configured during setup.
7
+ */
8
+ type SetupTarget = 'cli-config' | 'vscode-settings' | 'mcp-cursor' | 'mcp-claude' | 'cursor-rules' | 'agents-md';
9
+ /**
10
+ * All available setup targets.
11
+ */
12
+ declare const ALL_SETUP_TARGETS: SetupTarget[];
13
+ /**
14
+ * Human-readable labels for setup targets.
15
+ */
16
+ declare const SETUP_TARGET_LABELS: Record<SetupTarget, string>;
17
+ /**
18
+ * Scope of configuration in a monorepo.
19
+ */
20
+ type SetupScope = 'workspace' | 'package';
21
+ /**
22
+ * Options for the setup service.
23
+ */
24
+ interface SetupOptions {
25
+ /** Root directory of the workspace (monorepo root or single project root). */
26
+ workspaceRoot: string;
27
+ /** Current package root (may differ from workspaceRoot in monorepos). */
28
+ packageRoot?: string;
29
+ /** Whether this is a monorepo. */
30
+ isMonorepo?: boolean;
31
+ /** Where to create config: workspace level or package level. */
32
+ scope?: SetupScope;
33
+ /** Current package name (if in a monorepo package). */
34
+ packageName?: string;
35
+ /** If true, skip prompts and use defaults. */
36
+ interactive: boolean;
37
+ /** Specific targets to configure (defaults to all). */
38
+ targets: SetupTarget[];
39
+ /** Project name (defaults to directory name). */
40
+ projectName?: string;
41
+ /** Default code owners. */
42
+ defaultOwners?: string[];
43
+ }
44
+ /**
45
+ * Result of a single file setup operation.
46
+ */
47
+ interface SetupFileResult {
48
+ /** Target that was configured. */
49
+ target: SetupTarget;
50
+ /** File path that was created or modified. */
51
+ filePath: string;
52
+ /** Action taken. */
53
+ action: 'created' | 'merged' | 'skipped' | 'error';
54
+ /** Message describing what happened. */
55
+ message: string;
56
+ }
57
+ /**
58
+ * Full result of the setup operation.
59
+ */
60
+ interface SetupResult {
61
+ /** Whether all operations succeeded. */
62
+ success: boolean;
63
+ /** Results for each file. */
64
+ files: SetupFileResult[];
65
+ /** Summary message. */
66
+ summary: string;
67
+ }
68
+ /**
69
+ * Callback for interactive prompts during setup.
70
+ */
71
+ interface SetupPromptCallbacks {
72
+ /** Confirm an action. */
73
+ confirm: (message: string) => Promise<boolean>;
74
+ /** Select multiple options. */
75
+ multiSelect: <T extends string>(message: string, options: {
76
+ value: T;
77
+ label: string;
78
+ selected?: boolean;
79
+ }[]) => Promise<T[]>;
80
+ /** Input a string value. */
81
+ input: (message: string, defaultValue?: string) => Promise<string>;
82
+ }
83
+ //#endregion
84
+ export { ALL_SETUP_TARGETS, SETUP_TARGET_LABELS, SetupFileResult, SetupOptions, SetupPromptCallbacks, SetupResult, SetupScope, SetupTarget };
85
+ //# sourceMappingURL=types.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/services/setup/types.ts"],"sourcesContent":[],"mappings":";;AAOA;AAWA;AAYA;AAYA;AAKA;AAwBiB,KAhEL,WAAA,GAgEoB,YAEtB,GAAA,iBAAW,GAAA,YAAA,GAAA,YAAA,GAAA,cAAA,GAAA,WAAA;AAYrB;AAYA;;AAMsB,cArFT,iBAqFS,EArFU,WAqFV,EAAA;;;;AAGsC,cA5E/C,mBA4E+C,EA5E1B,MA4E0B,CA5EnB,WA4EmB,EAAA,MAAA,CAAA;;;;KAhEhD,UAAA;;;;UAKK,YAAA;;;;;;;;UAQP;;;;;;WAMC;;;;;;;;;UAUM,eAAA;;UAEP;;;;;;;;;;;UAYO,WAAA;;;;SAIR;;;;;;;UAQQ,oBAAA;;gCAEe;;;WAIV;;;UACf,QAAQ;;qDAEsC"}