rivet-design 0.12.4 → 0.13.1

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 (535) hide show
  1. package/README.md +50 -26
  2. package/README.npm.md +50 -26
  3. package/bin/rivet.js +39 -24
  4. package/dist/{mcp/agent-variants → agent-variants}/SessionStore.d.ts +13 -20
  5. package/dist/agent-variants/SessionStore.d.ts.map +1 -0
  6. package/dist/{mcp/agent-variants → agent-variants}/SessionStore.js +74 -84
  7. package/dist/agent-variants/SessionStore.js.map +1 -0
  8. package/dist/{mcp/agent-variants → agent-variants}/WorktreeOrchestrator.d.ts +58 -25
  9. package/dist/agent-variants/WorktreeOrchestrator.d.ts.map +1 -0
  10. package/dist/{mcp/agent-variants → agent-variants}/WorktreeOrchestrator.js +299 -57
  11. package/dist/agent-variants/WorktreeOrchestrator.js.map +1 -0
  12. package/dist/{mcp/agent-variants → agent-variants}/WorktreeOrchestrator.testHelpers.d.ts +1 -9
  13. package/dist/agent-variants/WorktreeOrchestrator.testHelpers.d.ts.map +1 -0
  14. package/dist/{mcp/agent-variants → agent-variants}/WorktreeOrchestrator.testHelpers.js +3 -18
  15. package/dist/agent-variants/WorktreeOrchestrator.testHelpers.js.map +1 -0
  16. package/dist/agent-variants/briefContent.d.ts.map +1 -0
  17. package/dist/agent-variants/briefContent.js.map +1 -0
  18. package/dist/{mcp/agent-variants → agent-variants}/contracts.d.ts +716 -722
  19. package/dist/agent-variants/contracts.d.ts.map +1 -0
  20. package/dist/{mcp/agent-variants → agent-variants}/contracts.js +4 -5
  21. package/dist/agent-variants/contracts.js.map +1 -0
  22. package/dist/agent-variants/createProjectArtifacts.d.ts.map +1 -0
  23. package/dist/agent-variants/createProjectArtifacts.js.map +1 -0
  24. package/dist/agent-variants/diffQa.d.ts.map +1 -0
  25. package/dist/agent-variants/diffQa.js.map +1 -0
  26. package/dist/{mcp/agent-variants → agent-variants}/elementRefToTarget.d.ts +1 -1
  27. package/dist/agent-variants/elementRefToTarget.d.ts.map +1 -0
  28. package/dist/agent-variants/elementRefToTarget.js.map +1 -0
  29. package/dist/agent-variants/errors.d.ts.map +1 -0
  30. package/dist/agent-variants/errors.js.map +1 -0
  31. package/dist/agent-variants/generatedDestination.d.ts +29 -0
  32. package/dist/agent-variants/generatedDestination.d.ts.map +1 -0
  33. package/dist/agent-variants/generatedDestination.js +59 -0
  34. package/dist/agent-variants/generatedDestination.js.map +1 -0
  35. package/dist/{mcp/agent-variants → agent-variants}/index.d.ts +3 -6
  36. package/dist/agent-variants/index.d.ts.map +1 -0
  37. package/dist/{mcp/agent-variants → agent-variants}/index.js +3 -6
  38. package/dist/agent-variants/index.js.map +1 -0
  39. package/dist/agent-variants/previewQa.d.ts.map +1 -0
  40. package/dist/agent-variants/previewQa.js.map +1 -0
  41. package/dist/agent-variants/runLabel.d.ts.map +1 -0
  42. package/dist/agent-variants/runLabel.js.map +1 -0
  43. package/dist/agent-variants/runPlan.d.ts.map +1 -0
  44. package/dist/agent-variants/runPlan.js.map +1 -0
  45. package/dist/agent-variants/sourceContext.d.ts.map +1 -0
  46. package/dist/agent-variants/sourceContext.js.map +1 -0
  47. package/dist/agent-variants/variantContext.d.ts.map +1 -0
  48. package/dist/agent-variants/variantContext.js.map +1 -0
  49. package/dist/cli/client.d.ts +43 -0
  50. package/dist/cli/client.d.ts.map +1 -0
  51. package/dist/cli/client.js +109 -0
  52. package/dist/cli/client.js.map +1 -0
  53. package/dist/cli/commandNames.d.ts +9 -0
  54. package/dist/cli/commandNames.d.ts.map +1 -0
  55. package/dist/cli/commandNames.js +24 -0
  56. package/dist/cli/commandNames.js.map +1 -0
  57. package/dist/cli/commands/auth.d.ts +10 -0
  58. package/dist/cli/commands/auth.d.ts.map +1 -0
  59. package/dist/cli/commands/auth.js +81 -0
  60. package/dist/cli/commands/auth.js.map +1 -0
  61. package/dist/cli/commands/elementSelector.d.ts +10 -0
  62. package/dist/cli/commands/elementSelector.d.ts.map +1 -0
  63. package/dist/cli/commands/elementSelector.js +41 -0
  64. package/dist/cli/commands/elementSelector.js.map +1 -0
  65. package/dist/cli/commands/evidence.d.ts +9 -0
  66. package/dist/cli/commands/evidence.d.ts.map +1 -0
  67. package/dist/cli/commands/evidence.js +85 -0
  68. package/dist/cli/commands/evidence.js.map +1 -0
  69. package/dist/cli/commands/mcpServe.d.ts +40 -0
  70. package/dist/cli/commands/mcpServe.d.ts.map +1 -0
  71. package/dist/cli/commands/mcpServe.js +485 -0
  72. package/dist/cli/commands/mcpServe.js.map +1 -0
  73. package/dist/cli/commands/open.d.ts +28 -0
  74. package/dist/cli/commands/open.d.ts.map +1 -0
  75. package/dist/cli/commands/open.js +280 -0
  76. package/dist/cli/commands/open.js.map +1 -0
  77. package/dist/cli/commands/reference.d.ts +8 -0
  78. package/dist/cli/commands/reference.d.ts.map +1 -0
  79. package/dist/cli/commands/reference.js +101 -0
  80. package/dist/cli/commands/reference.js.map +1 -0
  81. package/dist/cli/commands/serve.d.ts +9 -0
  82. package/dist/cli/commands/serve.d.ts.map +1 -0
  83. package/dist/cli/commands/serve.js +182 -0
  84. package/dist/cli/commands/serve.js.map +1 -0
  85. package/dist/cli/commands/shared.d.ts +31 -0
  86. package/dist/cli/commands/shared.d.ts.map +1 -0
  87. package/dist/cli/commands/shared.js +82 -0
  88. package/dist/cli/commands/shared.js.map +1 -0
  89. package/dist/cli/commands/status.d.ts +10 -0
  90. package/dist/cli/commands/status.d.ts.map +1 -0
  91. package/dist/cli/commands/status.js +61 -0
  92. package/dist/cli/commands/status.js.map +1 -0
  93. package/dist/cli/commands/stop.d.ts +8 -0
  94. package/dist/cli/commands/stop.d.ts.map +1 -0
  95. package/dist/cli/commands/stop.js +41 -0
  96. package/dist/cli/commands/stop.js.map +1 -0
  97. package/dist/cli/commands/variants.d.ts +4 -0
  98. package/dist/cli/commands/variants.d.ts.map +1 -0
  99. package/dist/cli/commands/variants.js +435 -0
  100. package/dist/cli/commands/variants.js.map +1 -0
  101. package/dist/cli/commands/wait.d.ts +10 -0
  102. package/dist/cli/commands/wait.d.ts.map +1 -0
  103. package/dist/cli/commands/wait.js +101 -0
  104. package/dist/cli/commands/wait.js.map +1 -0
  105. package/dist/cli/entry.d.ts +12 -0
  106. package/dist/cli/entry.d.ts.map +1 -0
  107. package/dist/cli/entry.js +61 -0
  108. package/dist/cli/entry.js.map +1 -0
  109. package/dist/cli/envelope.d.ts +60 -0
  110. package/dist/cli/envelope.d.ts.map +1 -0
  111. package/dist/cli/envelope.js +57 -0
  112. package/dist/cli/envelope.js.map +1 -0
  113. package/dist/cli/flags.d.ts +20 -0
  114. package/dist/cli/flags.d.ts.map +1 -0
  115. package/dist/cli/flags.js +72 -0
  116. package/dist/cli/flags.js.map +1 -0
  117. package/dist/cli/handoff.d.ts +54 -0
  118. package/dist/cli/handoff.d.ts.map +1 -0
  119. package/dist/cli/handoff.js +106 -0
  120. package/dist/cli/handoff.js.map +1 -0
  121. package/dist/cli/handoffStore.d.ts +24 -0
  122. package/dist/cli/handoffStore.d.ts.map +1 -0
  123. package/dist/cli/handoffStore.js +49 -0
  124. package/dist/cli/handoffStore.js.map +1 -0
  125. package/dist/cli/hostWorkNextAction.d.ts +45 -0
  126. package/dist/cli/hostWorkNextAction.d.ts.map +1 -0
  127. package/dist/cli/hostWorkNextAction.js +43 -0
  128. package/dist/cli/hostWorkNextAction.js.map +1 -0
  129. package/dist/cli/io.d.ts +17 -0
  130. package/dist/cli/io.d.ts.map +1 -0
  131. package/dist/cli/io.js +19 -0
  132. package/dist/cli/io.js.map +1 -0
  133. package/dist/cli/router.d.ts +23 -0
  134. package/dist/cli/router.d.ts.map +1 -0
  135. package/dist/cli/router.js +236 -0
  136. package/dist/cli/router.js.map +1 -0
  137. package/dist/cli/runnerSelection.d.ts +60 -0
  138. package/dist/cli/runnerSelection.d.ts.map +1 -0
  139. package/dist/cli/runnerSelection.js +93 -0
  140. package/dist/cli/runnerSelection.js.map +1 -0
  141. package/dist/cli/serverHandshake.d.ts +51 -0
  142. package/dist/cli/serverHandshake.d.ts.map +1 -0
  143. package/dist/cli/serverHandshake.js +144 -0
  144. package/dist/cli/serverHandshake.js.map +1 -0
  145. package/dist/index.d.ts +2 -14
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +84 -138
  148. package/dist/index.js.map +1 -1
  149. package/dist/install/allowlists.d.ts +65 -0
  150. package/dist/install/allowlists.d.ts.map +1 -0
  151. package/dist/install/allowlists.js +333 -0
  152. package/dist/install/allowlists.js.map +1 -0
  153. package/dist/install/codexGuidance.d.ts +11 -0
  154. package/dist/install/codexGuidance.d.ts.map +1 -0
  155. package/dist/install/codexGuidance.js +90 -0
  156. package/dist/install/codexGuidance.js.map +1 -0
  157. package/dist/install/harnesses.d.ts +37 -26
  158. package/dist/install/harnesses.d.ts.map +1 -1
  159. package/dist/install/harnesses.js +312 -502
  160. package/dist/install/harnesses.js.map +1 -1
  161. package/dist/install/legacyMcp.d.ts +26 -0
  162. package/dist/install/legacyMcp.d.ts.map +1 -0
  163. package/dist/install/legacyMcp.js +160 -0
  164. package/dist/install/legacyMcp.js.map +1 -0
  165. package/dist/install/mcpRegistration.d.ts +45 -0
  166. package/dist/install/mcpRegistration.d.ts.map +1 -0
  167. package/dist/install/mcpRegistration.js +215 -0
  168. package/dist/install/mcpRegistration.js.map +1 -0
  169. package/dist/mcp/changeBatchClassification.d.ts +20 -20
  170. package/dist/mcp/changeBatchClassification.d.ts.map +1 -1
  171. package/dist/mcp/changeBatchClassification.js +46 -46
  172. package/dist/mcp/changeBatchClassification.js.map +1 -1
  173. package/dist/proxy-middleware/proxy-config.d.ts +6 -0
  174. package/dist/proxy-middleware/proxy-config.d.ts.map +1 -1
  175. package/dist/proxy-middleware/proxy-config.js +162 -5
  176. package/dist/proxy-middleware/proxy-config.js.map +1 -1
  177. package/dist/routes/agentVariants.d.ts +14 -2
  178. package/dist/routes/agentVariants.d.ts.map +1 -1
  179. package/dist/routes/agentVariants.js +366 -65
  180. package/dist/routes/agentVariants.js.map +1 -1
  181. package/dist/routes/cli.d.ts +31 -0
  182. package/dist/routes/cli.d.ts.map +1 -0
  183. package/dist/routes/cli.js +95 -0
  184. package/dist/routes/cli.js.map +1 -0
  185. package/dist/routes/git.d.ts +1 -0
  186. package/dist/routes/git.d.ts.map +1 -1
  187. package/dist/routes/git.js +2 -1
  188. package/dist/routes/git.js.map +1 -1
  189. package/dist/routes/inlineStartTracker.d.ts +23 -0
  190. package/dist/routes/inlineStartTracker.d.ts.map +1 -0
  191. package/dist/routes/inlineStartTracker.js +17 -0
  192. package/dist/routes/inlineStartTracker.js.map +1 -0
  193. package/dist/routes/mcp.d.ts +2 -12
  194. package/dist/routes/mcp.d.ts.map +1 -1
  195. package/dist/routes/mcp.js +4 -785
  196. package/dist/routes/mcp.js.map +1 -1
  197. package/dist/server.d.ts +24 -9
  198. package/dist/server.d.ts.map +1 -1
  199. package/dist/server.js +169 -33
  200. package/dist/server.js.map +1 -1
  201. package/dist/services/CommitMessageGenerator.d.ts +9 -1
  202. package/dist/services/CommitMessageGenerator.d.ts.map +1 -1
  203. package/dist/services/CommitMessageGenerator.js +4 -1
  204. package/dist/services/CommitMessageGenerator.js.map +1 -1
  205. package/dist/services/ComponentSearchService.d.ts +4 -1
  206. package/dist/services/ComponentSearchService.d.ts.map +1 -1
  207. package/dist/services/ComponentSearchService.js.map +1 -1
  208. package/dist/services/ConfigManager.d.ts +8 -0
  209. package/dist/services/ConfigManager.d.ts.map +1 -1
  210. package/dist/services/ConfigManager.js +9 -0
  211. package/dist/services/ConfigManager.js.map +1 -1
  212. package/dist/services/HistoryReplayService.d.ts +20 -9
  213. package/dist/services/HistoryReplayService.d.ts.map +1 -1
  214. package/dist/services/HistoryReplayService.js +99 -43
  215. package/dist/services/HistoryReplayService.js.map +1 -1
  216. package/dist/services/MCPVariantsTelemetry.d.ts +1 -1
  217. package/dist/services/MCPVariantsTelemetry.d.ts.map +1 -1
  218. package/dist/services/MCPVariantsTelemetry.js +1 -0
  219. package/dist/services/MCPVariantsTelemetry.js.map +1 -1
  220. package/dist/services/PRTitleGenerator.d.ts +10 -2
  221. package/dist/services/PRTitleGenerator.d.ts.map +1 -1
  222. package/dist/services/PRTitleGenerator.js +8 -2
  223. package/dist/services/PRTitleGenerator.js.map +1 -1
  224. package/dist/services/ProjectDetectionService.d.ts.map +1 -1
  225. package/dist/services/ProjectDetectionService.js +14 -4
  226. package/dist/services/ProjectDetectionService.js.map +1 -1
  227. package/dist/services/ProjectMetadataStore.d.ts +115 -0
  228. package/dist/services/ProjectMetadataStore.d.ts.map +1 -0
  229. package/dist/services/ProjectMetadataStore.js +336 -0
  230. package/dist/services/ProjectMetadataStore.js.map +1 -0
  231. package/dist/services/SessionBridgeService.d.ts +52 -224
  232. package/dist/services/SessionBridgeService.d.ts.map +1 -1
  233. package/dist/services/SessionBridgeService.js +97 -649
  234. package/dist/services/SessionBridgeService.js.map +1 -1
  235. package/dist/services/SessionService.d.ts +4 -1
  236. package/dist/services/SessionService.d.ts.map +1 -1
  237. package/dist/services/SessionService.js +7 -4
  238. package/dist/services/SessionService.js.map +1 -1
  239. package/dist/services/StaticFileService.d.ts.map +1 -1
  240. package/dist/services/StaticFileService.js +6 -0
  241. package/dist/services/StaticFileService.js.map +1 -1
  242. package/dist/services/TelemetryService.d.ts +16 -80
  243. package/dist/services/TelemetryService.d.ts.map +1 -1
  244. package/dist/services/TelemetryService.js +18 -94
  245. package/dist/services/TelemetryService.js.map +1 -1
  246. package/dist/services/VariantGenerationService.d.ts +45 -0
  247. package/dist/services/VariantGenerationService.d.ts.map +1 -0
  248. package/dist/services/VariantGenerationService.js +214 -0
  249. package/dist/services/VariantGenerationService.js.map +1 -0
  250. package/dist/services/VariantHistoryService.d.ts +37 -1
  251. package/dist/services/VariantHistoryService.d.ts.map +1 -1
  252. package/dist/services/VariantHistoryService.js +122 -1
  253. package/dist/services/VariantHistoryService.js.map +1 -1
  254. package/dist/services/VariantRunService.d.ts +25 -6
  255. package/dist/services/VariantRunService.d.ts.map +1 -1
  256. package/dist/services/VariantRunService.js +99 -4
  257. package/dist/services/VariantRunService.js.map +1 -1
  258. package/dist/services/VariantsRuntime.d.ts +1 -3
  259. package/dist/services/VariantsRuntime.d.ts.map +1 -1
  260. package/dist/services/VariantsRuntime.js +0 -1
  261. package/dist/services/VariantsRuntime.js.map +1 -1
  262. package/dist/services/WorktreeManager.d.ts +1 -1
  263. package/dist/services/WorktreeManager.d.ts.map +1 -1
  264. package/dist/services/createAgentVariantsOrchestrator.d.ts +2 -2
  265. package/dist/services/createAgentVariantsOrchestrator.d.ts.map +1 -1
  266. package/dist/services/createAgentVariantsOrchestrator.js +2 -3
  267. package/dist/services/createAgentVariantsOrchestrator.js.map +1 -1
  268. package/dist/services/projectMetadataMigrations.d.ts +59 -0
  269. package/dist/services/projectMetadataMigrations.d.ts.map +1 -0
  270. package/dist/services/projectMetadataMigrations.js +109 -0
  271. package/dist/services/projectMetadataMigrations.js.map +1 -0
  272. package/dist/types/change-request-types.d.ts +32 -4
  273. package/dist/types/change-request-types.d.ts.map +1 -1
  274. package/dist/utils/logger.d.ts +2 -1
  275. package/dist/utils/logger.d.ts.map +1 -1
  276. package/dist/utils/logger.js +3 -7
  277. package/dist/utils/logger.js.map +1 -1
  278. package/dist/utils/loopback.d.ts +3 -0
  279. package/dist/utils/loopback.d.ts.map +1 -0
  280. package/dist/utils/loopback.js +13 -0
  281. package/dist/utils/loopback.js.map +1 -0
  282. package/dist/utils/pid.d.ts +3 -0
  283. package/dist/utils/pid.d.ts.map +1 -0
  284. package/dist/utils/pid.js +15 -0
  285. package/dist/utils/pid.js.map +1 -0
  286. package/dist/utils/queueAccess.d.ts +7 -0
  287. package/dist/utils/queueAccess.d.ts.map +1 -1
  288. package/dist/utils/queueAccess.js +8 -1
  289. package/dist/utils/queueAccess.js.map +1 -1
  290. package/dist/utils/shouldRecordHostedDemoSessionAction.d.ts +3 -3
  291. package/dist/utils/shouldRecordHostedDemoSessionAction.d.ts.map +1 -1
  292. package/dist/utils/shouldRecordHostedDemoSessionAction.js +3 -19
  293. package/dist/utils/shouldRecordHostedDemoSessionAction.js.map +1 -1
  294. package/dist/utils/skillWriter.d.ts.map +1 -1
  295. package/dist/utils/skillWriter.js +12 -11
  296. package/dist/utils/skillWriter.js.map +1 -1
  297. package/dist/utils/skills/claude-skill.d.ts +7 -2
  298. package/dist/utils/skills/claude-skill.d.ts.map +1 -1
  299. package/dist/utils/skills/claude-skill.js +10 -83
  300. package/dist/utils/skills/claude-skill.js.map +1 -1
  301. package/dist/utils/skills/cli-guidance.d.ts +12 -0
  302. package/dist/utils/skills/cli-guidance.d.ts.map +1 -0
  303. package/dist/utils/skills/cli-guidance.js +59 -0
  304. package/dist/utils/skills/cli-guidance.js.map +1 -0
  305. package/dist/utils/skills/cursor-rules.d.ts +8 -2
  306. package/dist/utils/skills/cursor-rules.d.ts.map +1 -1
  307. package/dist/utils/skills/cursor-rules.js +11 -80
  308. package/dist/utils/skills/cursor-rules.js.map +1 -1
  309. package/dist/utils/variantSessionStart.d.ts +1 -1
  310. package/dist/utils/variantSessionStart.d.ts.map +1 -1
  311. package/dist/utils/variantSessionStart.js +1 -1
  312. package/dist/utils/variantSessionStart.js.map +1 -1
  313. package/package.json +4 -4
  314. package/src/ui/dist/assets/main-B725ucb9.js +419 -0
  315. package/src/ui/dist/assets/main-Dyos9I29.css +1 -0
  316. package/src/ui/dist/index.html +2 -2
  317. package/dist/mcp/agent-variants/SessionStore.d.ts.map +0 -1
  318. package/dist/mcp/agent-variants/SessionStore.js.map +0 -1
  319. package/dist/mcp/agent-variants/WorktreeOrchestrator.d.ts.map +0 -1
  320. package/dist/mcp/agent-variants/WorktreeOrchestrator.js.map +0 -1
  321. package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.d.ts.map +0 -1
  322. package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.js.map +0 -1
  323. package/dist/mcp/agent-variants/areNaSourceContext.d.ts +0 -20
  324. package/dist/mcp/agent-variants/areNaSourceContext.d.ts.map +0 -1
  325. package/dist/mcp/agent-variants/areNaSourceContext.js +0 -118
  326. package/dist/mcp/agent-variants/areNaSourceContext.js.map +0 -1
  327. package/dist/mcp/agent-variants/briefContent.d.ts.map +0 -1
  328. package/dist/mcp/agent-variants/briefContent.js.map +0 -1
  329. package/dist/mcp/agent-variants/contracts.d.ts.map +0 -1
  330. package/dist/mcp/agent-variants/contracts.js.map +0 -1
  331. package/dist/mcp/agent-variants/createProjectArtifacts.d.ts.map +0 -1
  332. package/dist/mcp/agent-variants/createProjectArtifacts.js.map +0 -1
  333. package/dist/mcp/agent-variants/createZeroToOneTool.d.ts +0 -63
  334. package/dist/mcp/agent-variants/createZeroToOneTool.d.ts.map +0 -1
  335. package/dist/mcp/agent-variants/createZeroToOneTool.js +0 -265
  336. package/dist/mcp/agent-variants/createZeroToOneTool.js.map +0 -1
  337. package/dist/mcp/agent-variants/diffQa.d.ts.map +0 -1
  338. package/dist/mcp/agent-variants/diffQa.js.map +0 -1
  339. package/dist/mcp/agent-variants/elementRefToTarget.d.ts.map +0 -1
  340. package/dist/mcp/agent-variants/elementRefToTarget.js.map +0 -1
  341. package/dist/mcp/agent-variants/errors.d.ts.map +0 -1
  342. package/dist/mcp/agent-variants/errors.js.map +0 -1
  343. package/dist/mcp/agent-variants/generatedDestination.d.ts +0 -75
  344. package/dist/mcp/agent-variants/generatedDestination.d.ts.map +0 -1
  345. package/dist/mcp/agent-variants/generatedDestination.js +0 -103
  346. package/dist/mcp/agent-variants/generatedDestination.js.map +0 -1
  347. package/dist/mcp/agent-variants/index.d.ts.map +0 -1
  348. package/dist/mcp/agent-variants/index.js.map +0 -1
  349. package/dist/mcp/agent-variants/pendingChangesAdapter.d.ts +0 -38
  350. package/dist/mcp/agent-variants/pendingChangesAdapter.d.ts.map +0 -1
  351. package/dist/mcp/agent-variants/pendingChangesAdapter.js +0 -93
  352. package/dist/mcp/agent-variants/pendingChangesAdapter.js.map +0 -1
  353. package/dist/mcp/agent-variants/pinterestSourceContext.d.ts +0 -23
  354. package/dist/mcp/agent-variants/pinterestSourceContext.d.ts.map +0 -1
  355. package/dist/mcp/agent-variants/pinterestSourceContext.js +0 -137
  356. package/dist/mcp/agent-variants/pinterestSourceContext.js.map +0 -1
  357. package/dist/mcp/agent-variants/previewQa.d.ts.map +0 -1
  358. package/dist/mcp/agent-variants/previewQa.js.map +0 -1
  359. package/dist/mcp/agent-variants/runLabel.d.ts.map +0 -1
  360. package/dist/mcp/agent-variants/runLabel.js.map +0 -1
  361. package/dist/mcp/agent-variants/runPlan.d.ts.map +0 -1
  362. package/dist/mcp/agent-variants/runPlan.js.map +0 -1
  363. package/dist/mcp/agent-variants/sourceContext.d.ts.map +0 -1
  364. package/dist/mcp/agent-variants/sourceContext.js.map +0 -1
  365. package/dist/mcp/agent-variants/tools.d.ts +0 -187
  366. package/dist/mcp/agent-variants/tools.d.ts.map +0 -1
  367. package/dist/mcp/agent-variants/tools.js +0 -1165
  368. package/dist/mcp/agent-variants/tools.js.map +0 -1
  369. package/dist/mcp/agent-variants/variantContext.d.ts.map +0 -1
  370. package/dist/mcp/agent-variants/variantContext.js.map +0 -1
  371. package/dist/mcp/auth/httpOAuthProvider.d.ts +0 -103
  372. package/dist/mcp/auth/httpOAuthProvider.d.ts.map +0 -1
  373. package/dist/mcp/auth/httpOAuthProvider.js +0 -735
  374. package/dist/mcp/auth/httpOAuthProvider.js.map +0 -1
  375. package/dist/mcp/auth/tools.d.ts +0 -39
  376. package/dist/mcp/auth/tools.d.ts.map +0 -1
  377. package/dist/mcp/auth/tools.js +0 -304
  378. package/dist/mcp/auth/tools.js.map +0 -1
  379. package/dist/mcp/branding.d.ts +0 -4
  380. package/dist/mcp/branding.d.ts.map +0 -1
  381. package/dist/mcp/branding.js +0 -8
  382. package/dist/mcp/branding.js.map +0 -1
  383. package/dist/mcp/hostedServer.d.ts +0 -27
  384. package/dist/mcp/hostedServer.d.ts.map +0 -1
  385. package/dist/mcp/hostedServer.js +0 -71
  386. package/dist/mcp/hostedServer.js.map +0 -1
  387. package/dist/mcp/httpServer.d.ts +0 -63
  388. package/dist/mcp/httpServer.d.ts.map +0 -1
  389. package/dist/mcp/httpServer.js +0 -602
  390. package/dist/mcp/httpServer.js.map +0 -1
  391. package/dist/mcp/instructions.d.ts +0 -25
  392. package/dist/mcp/instructions.d.ts.map +0 -1
  393. package/dist/mcp/instructions.js +0 -39
  394. package/dist/mcp/instructions.js.map +0 -1
  395. package/dist/mcp/integrations/tools.d.ts +0 -19
  396. package/dist/mcp/integrations/tools.d.ts.map +0 -1
  397. package/dist/mcp/integrations/tools.js +0 -101
  398. package/dist/mcp/integrations/tools.js.map +0 -1
  399. package/dist/mcp/server.d.ts +0 -214
  400. package/dist/mcp/server.d.ts.map +0 -1
  401. package/dist/mcp/server.js +0 -2536
  402. package/dist/mcp/server.js.map +0 -1
  403. package/dist/mcp/toolAnalytics.d.ts +0 -26
  404. package/dist/mcp/toolAnalytics.d.ts.map +0 -1
  405. package/dist/mcp/toolAnalytics.js +0 -95
  406. package/dist/mcp/toolAnalytics.js.map +0 -1
  407. package/dist/mcp/types.d.ts +0 -7
  408. package/dist/mcp/types.d.ts.map +0 -1
  409. package/dist/mcp/types.js +0 -3
  410. package/dist/mcp/types.js.map +0 -1
  411. package/dist/mcp/watchLoopResumePrompt.d.ts +0 -16
  412. package/dist/mcp/watchLoopResumePrompt.d.ts.map +0 -1
  413. package/dist/mcp/watchLoopResumePrompt.js +0 -21
  414. package/dist/mcp/watchLoopResumePrompt.js.map +0 -1
  415. package/dist/prompts/agentModPrompts.d.ts +0 -4
  416. package/dist/prompts/agentModPrompts.d.ts.map +0 -1
  417. package/dist/prompts/agentModPrompts.js +0 -34
  418. package/dist/prompts/agentModPrompts.js.map +0 -1
  419. package/dist/prompts/tokenWriterPrompts.d.ts +0 -4
  420. package/dist/prompts/tokenWriterPrompts.d.ts.map +0 -1
  421. package/dist/prompts/tokenWriterPrompts.js +0 -59
  422. package/dist/prompts/tokenWriterPrompts.js.map +0 -1
  423. package/dist/routes/comments.d.ts +0 -3
  424. package/dist/routes/comments.d.ts.map +0 -1
  425. package/dist/routes/comments.js +0 -113
  426. package/dist/routes/comments.js.map +0 -1
  427. package/dist/routes/components.d.ts +0 -7
  428. package/dist/routes/components.d.ts.map +0 -1
  429. package/dist/routes/components.js +0 -88
  430. package/dist/routes/components.js.map +0 -1
  431. package/dist/routes/controls.d.ts +0 -7
  432. package/dist/routes/controls.d.ts.map +0 -1
  433. package/dist/routes/controls.js +0 -50
  434. package/dist/routes/controls.js.map +0 -1
  435. package/dist/routes/design.d.ts +0 -2
  436. package/dist/routes/design.d.ts.map +0 -1
  437. package/dist/routes/design.js +0 -29
  438. package/dist/routes/design.js.map +0 -1
  439. package/dist/routes/modifications.d.ts +0 -10
  440. package/dist/routes/modifications.d.ts.map +0 -1
  441. package/dist/routes/modifications.js +0 -394
  442. package/dist/routes/modifications.js.map +0 -1
  443. package/dist/routes/tokens.d.ts +0 -2
  444. package/dist/routes/tokens.d.ts.map +0 -1
  445. package/dist/routes/tokens.js +0 -115
  446. package/dist/routes/tokens.js.map +0 -1
  447. package/dist/services/AgentSessionService.d.ts +0 -91
  448. package/dist/services/AgentSessionService.d.ts.map +0 -1
  449. package/dist/services/AgentSessionService.js +0 -282
  450. package/dist/services/AgentSessionService.js.map +0 -1
  451. package/dist/services/BridgeBatchPipeline.d.ts +0 -103
  452. package/dist/services/BridgeBatchPipeline.d.ts.map +0 -1
  453. package/dist/services/BridgeBatchPipeline.js +0 -295
  454. package/dist/services/BridgeBatchPipeline.js.map +0 -1
  455. package/dist/services/BridgeQueueStore.d.ts +0 -28
  456. package/dist/services/BridgeQueueStore.d.ts.map +0 -1
  457. package/dist/services/BridgeQueueStore.js +0 -88
  458. package/dist/services/BridgeQueueStore.js.map +0 -1
  459. package/dist/services/CSSTokenWriter.d.ts +0 -22
  460. package/dist/services/CSSTokenWriter.d.ts.map +0 -1
  461. package/dist/services/CSSTokenWriter.js +0 -116
  462. package/dist/services/CSSTokenWriter.js.map +0 -1
  463. package/dist/services/DesignTokenService.d.ts +0 -39
  464. package/dist/services/DesignTokenService.d.ts.map +0 -1
  465. package/dist/services/DesignTokenService.js +0 -100
  466. package/dist/services/DesignTokenService.js.map +0 -1
  467. package/dist/services/InlineVariantGenerationService.d.ts +0 -51
  468. package/dist/services/InlineVariantGenerationService.d.ts.map +0 -1
  469. package/dist/services/InlineVariantGenerationService.js +0 -475
  470. package/dist/services/InlineVariantGenerationService.js.map +0 -1
  471. package/dist/services/InterfaceGenerationService.d.ts +0 -12
  472. package/dist/services/InterfaceGenerationService.d.ts.map +0 -1
  473. package/dist/services/InterfaceGenerationService.js +0 -256
  474. package/dist/services/InterfaceGenerationService.js.map +0 -1
  475. package/dist/services/TailwindConfigWriter.d.ts +0 -24
  476. package/dist/services/TailwindConfigWriter.d.ts.map +0 -1
  477. package/dist/services/TailwindConfigWriter.js +0 -105
  478. package/dist/services/TailwindConfigWriter.js.map +0 -1
  479. package/dist/services/TerminalAgentRunner.d.ts +0 -65
  480. package/dist/services/TerminalAgentRunner.d.ts.map +0 -1
  481. package/dist/services/TerminalAgentRunner.js +0 -511
  482. package/dist/services/TerminalAgentRunner.js.map +0 -1
  483. package/dist/services/VisualVariantAgentRunner.d.ts +0 -20
  484. package/dist/services/VisualVariantAgentRunner.d.ts.map +0 -1
  485. package/dist/services/VisualVariantAgentRunner.js +0 -66
  486. package/dist/services/VisualVariantAgentRunner.js.map +0 -1
  487. package/dist/services/adapters/TailwindCSSTokenAdapter.d.ts +0 -35
  488. package/dist/services/adapters/TailwindCSSTokenAdapter.d.ts.map +0 -1
  489. package/dist/services/adapters/TailwindCSSTokenAdapter.js +0 -278
  490. package/dist/services/adapters/TailwindCSSTokenAdapter.js.map +0 -1
  491. package/dist/services/agent/AgentCore.d.ts +0 -126
  492. package/dist/services/agent/AgentCore.d.ts.map +0 -1
  493. package/dist/services/agent/AgentCore.js +0 -759
  494. package/dist/services/agent/AgentCore.js.map +0 -1
  495. package/dist/services/agent/AgentModService.d.ts +0 -98
  496. package/dist/services/agent/AgentModService.d.ts.map +0 -1
  497. package/dist/services/agent/AgentModService.js +0 -400
  498. package/dist/services/agent/AgentModService.js.map +0 -1
  499. package/dist/services/agent/index.d.ts +0 -2
  500. package/dist/services/agent/index.d.ts.map +0 -1
  501. package/dist/services/agent/index.js +0 -6
  502. package/dist/services/agent/index.js.map +0 -1
  503. package/dist/types/editor-interface-types.d.ts +0 -67
  504. package/dist/types/editor-interface-types.d.ts.map +0 -1
  505. package/dist/types/editor-interface-types.js +0 -12
  506. package/dist/types/editor-interface-types.js.map +0 -1
  507. package/dist/utils/elementRefToContext.d.ts +0 -4
  508. package/dist/utils/elementRefToContext.d.ts.map +0 -1
  509. package/dist/utils/elementRefToContext.js +0 -63
  510. package/dist/utils/elementRefToContext.js.map +0 -1
  511. package/dist/utils/skills/shared-variants-protocol.d.ts +0 -69
  512. package/dist/utils/skills/shared-variants-protocol.d.ts.map +0 -1
  513. package/dist/utils/skills/shared-variants-protocol.js +0 -292
  514. package/dist/utils/skills/shared-variants-protocol.js.map +0 -1
  515. package/src/ui/dist/assets/main-Dnah9pII.css +0 -1
  516. package/src/ui/dist/assets/main-plq7aT76.js +0 -656
  517. /package/dist/{mcp/agent-variants → agent-variants}/briefContent.d.ts +0 -0
  518. /package/dist/{mcp/agent-variants → agent-variants}/briefContent.js +0 -0
  519. /package/dist/{mcp/agent-variants → agent-variants}/createProjectArtifacts.d.ts +0 -0
  520. /package/dist/{mcp/agent-variants → agent-variants}/createProjectArtifacts.js +0 -0
  521. /package/dist/{mcp/agent-variants → agent-variants}/diffQa.d.ts +0 -0
  522. /package/dist/{mcp/agent-variants → agent-variants}/diffQa.js +0 -0
  523. /package/dist/{mcp/agent-variants → agent-variants}/elementRefToTarget.js +0 -0
  524. /package/dist/{mcp/agent-variants → agent-variants}/errors.d.ts +0 -0
  525. /package/dist/{mcp/agent-variants → agent-variants}/errors.js +0 -0
  526. /package/dist/{mcp/agent-variants → agent-variants}/previewQa.d.ts +0 -0
  527. /package/dist/{mcp/agent-variants → agent-variants}/previewQa.js +0 -0
  528. /package/dist/{mcp/agent-variants → agent-variants}/runLabel.d.ts +0 -0
  529. /package/dist/{mcp/agent-variants → agent-variants}/runLabel.js +0 -0
  530. /package/dist/{mcp/agent-variants → agent-variants}/runPlan.d.ts +0 -0
  531. /package/dist/{mcp/agent-variants → agent-variants}/runPlan.js +0 -0
  532. /package/dist/{mcp/agent-variants → agent-variants}/sourceContext.d.ts +0 -0
  533. /package/dist/{mcp/agent-variants → agent-variants}/sourceContext.js +0 -0
  534. /package/dist/{mcp/agent-variants → agent-variants}/variantContext.d.ts +0 -0
  535. /package/dist/{mcp/agent-variants → agent-variants}/variantContext.js +0 -0
@@ -36,533 +36,337 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.updateHarnesses = exports.uninstallHarnesses = exports.installHarnesses = exports.sendButtonLabelFor = exports.detectedHarnesses = exports.findHarness = exports.HARNESSES = exports.buildCursorLocalRivetEntry = exports.buildCursorHostedRivetEntry = exports.resolveNpxCommand = void 0;
39
+ exports.verifyCodexRules = exports.updateHarnesses = exports.uninstallHarnesses = exports.installHarnesses = exports.sendButtonLabelFor = exports.detectedHarnesses = exports.findHarness = exports.HARNESSES = void 0;
40
40
  /* eslint-disable no-console */
41
41
  const childProcess = __importStar(require("child_process"));
42
42
  const fs_1 = __importDefault(require("fs"));
43
43
  const os_1 = __importDefault(require("os"));
44
44
  const path_1 = __importDefault(require("path"));
45
45
  const skillWriter_1 = require("../utils/skillWriter");
46
- // ---------------------------------------------------------------------------
47
- // Shared helpers (previously duplicated per harness in index.ts)
48
- // ---------------------------------------------------------------------------
49
- /**
50
- * Resolve `npx` to an absolute path using the install-time shell PATH.
51
- *
52
- * Why: editors like Claude desktop inherit a sanitized PATH at launch that can
53
- * put stale node versions first, causing `npx` to dispatch to a node so old it
54
- * can't even `require('node:url')`. Writing the absolute path into the MCP
55
- * config bypasses that lookup. Falls back to literal "npx" with a warning so
56
- * install never hard-blocks on a quirky environment.
57
- */
58
- const resolveNpxCommand = () => {
59
- const which = process.platform === 'win32' ? 'where' : 'which';
46
+ const allowlists_1 = require("./allowlists");
47
+ Object.defineProperty(exports, "verifyCodexRules", { enumerable: true, get: function () { return allowlists_1.verifyCodexRules; } });
48
+ const codexGuidance_1 = require("./codexGuidance");
49
+ const legacyMcp_1 = require("./legacyMcp");
50
+ const mcpRegistration_1 = require("./mcpRegistration");
51
+ const binaryDetect = (bin) => () => {
60
52
  try {
61
- const out = childProcess.execSync(`${which} npx`, {
62
- stdio: ['ignore', 'pipe', 'ignore'],
63
- encoding: 'utf8',
64
- });
65
- // `where` on Windows can return multiple lines (npx, npx.cmd, npx.ps1).
66
- // Prefer .cmd / .exe over a shebanged shell script so Windows can spawn
67
- // the resolved path directly.
68
- const lines = out
69
- .split(/\r?\n/)
70
- .map((l) => l.trim())
71
- .filter((l) => l.length > 0 && fs_1.default.existsSync(l));
72
- if (lines.length === 0) {
73
- throw new Error('which returned no usable paths');
74
- }
75
- if (process.platform === 'win32') {
76
- const directlySpawnable = lines.find((l) => /\.(cmd|exe|bat)$/i.test(l));
77
- return directlySpawnable ?? lines[0];
78
- }
79
- return lines[0];
53
+ childProcess.execSync(`${bin} --version`, { stdio: 'ignore' });
54
+ return true;
80
55
  }
81
56
  catch {
82
- console.log(' Warning: could not resolve `npx` to an absolute path. Falling back to "npx" — if your editor uses an outdated Node, it may fail to start the server.');
83
- return 'npx';
57
+ return false;
84
58
  }
85
59
  };
86
- exports.resolveNpxCommand = resolveNpxCommand;
87
- /**
88
- * Surface a diagnostic when an existing rivet MCP entry's `command` is an
89
- * absolute path that no longer exists. Common when the user removes the node
90
- * version that was resolved at install time.
91
- */
92
- const warnIfStaleRivetCommand = (entry, editorLabel) => {
93
- if (typeof entry !== 'object' || entry === null)
94
- return;
95
- const cmd = entry.command;
96
- if (typeof cmd !== 'string')
97
- return;
98
- if (!path_1.default.isAbsolute(cmd))
99
- return;
100
- if (fs_1.default.existsSync(cmd))
101
- return;
102
- console.log(` Note: previous Rivet command for ${editorLabel} (${cmd}) no longer exists. Re-resolving.`);
103
- };
104
- /**
105
- * Read and validate an MCP config JSON file. Refuses to proceed on malformed
106
- * input so a merge never clobbers a file we couldn't parse. A missing file is
107
- * a valid empty config.
108
- */
109
- const parseConfigFile = (configPath) => {
110
- if (!fs_1.default.existsSync(configPath))
111
- return { ok: true, config: {} };
112
- let parsed;
113
- try {
114
- parsed = JSON.parse(fs_1.default.readFileSync(configPath, 'utf8'));
60
+ const reportAllowlistWrite = (label, filePath, result) => {
61
+ if (!result.ok) {
62
+ console.log(` Error: could not write the ${label} command allowlist (${filePath}): ${result.error}`);
63
+ console.log(' Run this in your own terminal instead:');
64
+ console.log(' npx -y rivet-design@latest install');
65
+ return false;
115
66
  }
116
- catch {
117
- return {
118
- ok: false,
119
- error: `could not parse ${configPath}. Fix or delete the file manually, then re-run.`,
120
- };
121
- }
122
- if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
123
- return {
124
- ok: false,
125
- error: `${configPath} is not a JSON object. Fix or delete the file manually, then re-run.`,
126
- };
67
+ console.log(result.changed
68
+ ? `✓ Command allowlist written to ${filePath}`
69
+ : `✓ Command allowlist already present in ${filePath}`);
70
+ if (result.verified) {
71
+ console.log('✓ Verified: `rivet` invocations run without an approval prompt.');
127
72
  }
128
- const config = parsed;
129
- if (config.mcpServers !== undefined &&
130
- (typeof config.mcpServers !== 'object' || Array.isArray(config.mcpServers))) {
131
- return {
132
- ok: false,
133
- error: `mcpServers in ${configPath} is not an object. Fix it manually, then re-run.`,
134
- };
73
+ else {
74
+ console.log(' Warning: could not verify the allowlist entry — the host may still prompt per call.');
135
75
  }
136
- return { ok: true, config };
137
- };
138
- const writeConfigFile = (configPath, config) => {
139
- fs_1.default.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
140
- };
141
- const ACCESS_ERROR_CODES = new Set(['EACCES', 'EPERM']);
142
- const CODING_AGENT_ENV_KEYS = [
143
- 'CLAUDECODE',
144
- 'CODEX_SANDBOX',
145
- 'CURSOR_AGENT',
146
- 'CURSOR_TRACE_ID',
147
- 'GITHUB_ACTIONS',
148
- ];
149
- /**
150
- * Detect shells commonly launched by coding agents or automation.
151
- */
152
- const isCodingAgentShell = () => CODING_AGENT_ENV_KEYS.some((key) => Boolean(process.env[key]));
153
- /**
154
- * Extract a stable error code from filesystem exceptions.
155
- */
156
- const errorCodeFor = (err) => {
157
- if (typeof err !== 'object' || err === null)
158
- return undefined;
159
- const code = err.code;
160
- return typeof code === 'string' ? code : undefined;
161
- };
162
- /**
163
- * Convert an unknown thrown value into terminal-safe text.
164
- */
165
- const errorMessageFor = (err) => {
166
- if (err instanceof Error)
167
- return err.message;
168
- return String(err);
169
- };
170
- /**
171
- * Determine whether a config write failed because this process lacks access.
172
- */
173
- const isAccessWriteError = (err) => {
174
- const code = errorCodeFor(err);
175
- return code ? ACCESS_ERROR_CODES.has(code) : false;
76
+ return true;
176
77
  };
177
- /**
178
- * Convert child process output into terminal-safe text.
179
- */
180
- const processOutputFor = (output) => {
181
- if (Buffer.isBuffer(output))
182
- return output.toString('utf8');
183
- if (typeof output === 'string')
184
- return output;
185
- return '';
78
+ const claudeSkillDir = () => path_1.default.join(os_1.default.homedir(), '.claude', 'skills', 'rivet');
79
+ /** Uniform progress line for an `--mcp` registration attempt. */
80
+ const reportMcpRegistration = (label, result) => {
81
+ if (!result.ok) {
82
+ console.log(` Error: could not register the Rivet MCP server with ${label}: ${result.error}`);
83
+ return false;
84
+ }
85
+ console.log(result.changed
86
+ ? `✓ Registered the Rivet MCP server (\`rivet mcp serve\`) with ${label}`
87
+ : `✓ Rivet MCP server already registered with ${label}`);
88
+ return true;
186
89
  };
187
- /**
188
- * Detect permission failures emitted by editor CLIs.
189
- */
190
- const isAccessFailureText = (text) => /\b(?:EPERM|EACCES)\b|operation not permitted|permission denied|failed to write|failed to persist config/i.test(text);
191
90
  // ---------------------------------------------------------------------------
192
- // MCP entry builders (exported for tests / back-compat re-export from index)
91
+ // The registry the single source of truth for supported harnesses
193
92
  // ---------------------------------------------------------------------------
194
- const CURSOR_HOSTED_MCP_URL = 'https://rivet-proxy.onrender.com/mcp';
195
- const CURSOR_MCP_INSTALL_URL = 'https://cursor.com/install-mcp';
196
- const CURSOR_HOSTED_SERVER_NAME = 'rivet';
197
- const buildCursorHostedRivetEntry = () => ({
198
- url: CURSOR_HOSTED_MCP_URL,
199
- });
200
- exports.buildCursorHostedRivetEntry = buildCursorHostedRivetEntry;
201
- /**
202
- * Build Cursor's one-click install URL for the hosted Rivet MCP server.
203
- */
204
- const buildCursorHostedInstallUrl = () => {
205
- const params = new URLSearchParams({
206
- name: CURSOR_HOSTED_SERVER_NAME,
207
- config: Buffer.from(JSON.stringify((0, exports.buildCursorHostedRivetEntry)()), 'utf8').toString('base64'),
208
- });
209
- return `${CURSOR_MCP_INSTALL_URL}?${params.toString()}`;
210
- };
211
- const buildCursorLocalRivetEntry = () => ({
212
- command: (0, exports.resolveNpxCommand)(),
213
- args: ['-y', 'rivet-design@latest', 'mcp', '--editor', 'cursor'],
214
- });
215
- exports.buildCursorLocalRivetEntry = buildCursorLocalRivetEntry;
216
- const buildClaudeDesktopRivetEntry = () => ({
217
- command: (0, exports.resolveNpxCommand)(),
218
- args: ['-y', 'rivet-design@latest', 'mcp', '--editor', 'claude-desktop'],
219
- });
220
- /**
221
- * Path to the Claude desktop app's MCP config file.
222
- * macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
223
- * Win: %APPDATA%\Claude\claude_desktop_config.json
224
- * Linux: ~/.config/Claude/claude_desktop_config.json
225
- */
226
- const claudeDesktopConfigPath = () => {
227
- const home = os_1.default.homedir();
228
- if (process.platform === 'darwin') {
229
- return path_1.default.join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');
230
- }
231
- if (process.platform === 'win32') {
232
- const appData = process.env.APPDATA ?? path_1.default.join(home, 'AppData', 'Roaming');
233
- return path_1.default.join(appData, 'Claude', 'claude_desktop_config.json');
234
- }
235
- return path_1.default.join(home, '.config', 'Claude', 'claude_desktop_config.json');
236
- };
237
- const cliHarness = (opts) => {
238
- const detect = () => {
239
- try {
240
- childProcess.execSync(`${opts.bin} --version`, { stdio: 'ignore' });
241
- return true;
93
+ const claudeHarness = {
94
+ id: 'claude',
95
+ label: 'Claude Code',
96
+ sendButtonLabel: 'Send to Claude Code',
97
+ installUrl: 'https://claude.ai/download',
98
+ supportsMcp: true,
99
+ detect: binaryDetect('claude'),
100
+ notInstalledMessage: () => 'Claude Code is not installed or not in your PATH.\nInstall it: https://claude.ai/download',
101
+ install: (options) => {
102
+ const skill = (0, skillWriter_1.writeSkillFileIfNeeded)();
103
+ if (skill.success) {
104
+ console.log('✓ Rivet CLI skill installed for Claude Code');
242
105
  }
243
- catch {
244
- return false;
106
+ else {
107
+ console.log(` Warning: could not write skill file to ${claudeSkillDir()}: ${skill.error}`);
245
108
  }
246
- };
247
- /** Run the harness's `mcp add`. Treats "already exists" as success. */
248
- const register = () => {
249
- try {
250
- const output = childProcess.execSync(opts.addCmd, {
251
- stdio: 'pipe',
252
- encoding: 'utf8',
253
- });
254
- if (output)
255
- process.stdout.write(output);
256
- console.log(`✓ Rivet MCP server added to ${opts.label}`);
257
- return true;
258
- }
259
- catch (err) {
260
- const stderr = processOutputFor(err.stderr);
261
- if (stderr.includes('already exists')) {
262
- console.log(`✓ Rivet MCP server already registered with ${opts.label}`);
263
- return true;
264
- }
265
- if (isAccessFailureText(stderr)) {
266
- console.log(` Could not register Rivet with ${opts.label} from this shell.`);
267
- console.log(' Looks like this was launched by a coding agent or sandboxed shell, which may not be allowed to edit that app config.');
268
- }
269
- else {
270
- const message = stderr.trim().split(/\r?\n/)[0];
271
- if (message)
272
- console.log(` Error: ${message}`);
273
- }
274
- console.log(' Run this in your own terminal instead:');
275
- console.log(` ${opts.addCmd}`);
276
- return false;
109
+ const allowlistOk = reportAllowlistWrite('Claude Code', (0, allowlists_1.claudeSettingsPath)(), (0, allowlists_1.writeClaudeAllowlist)());
110
+ if ((0, legacyMcp_1.cleanupClaudeLegacyMcp)().changed) {
111
+ console.log('✓ Removed the MCP registration a previous Rivet version wrote');
277
112
  }
278
- };
279
- const writeSkill = (verb) => {
280
- if (!opts.skill)
281
- return;
282
- const result = opts.skill.write();
283
- if (result.success) {
284
- console.log(`✓ Rivet skill ${verb} for ${opts.label}`);
113
+ let mcpOk = true;
114
+ if (options?.mcp) {
115
+ mcpOk = reportMcpRegistration('Claude Code', (0, mcpRegistration_1.registerClaudeCodeMcp)());
285
116
  }
286
- else {
287
- console.log(` Warning: could not write skill file to ${opts.skill.dir}: ${result.error}`);
117
+ return { ok: skill.success && allowlistOk && mcpOk, changed: true };
118
+ },
119
+ uninstall: () => {
120
+ let changed = false;
121
+ if (fs_1.default.existsSync(claudeSkillDir())) {
122
+ fs_1.default.rmSync(claudeSkillDir(), { recursive: true, force: true });
123
+ console.log('✓ Rivet skill file removed for Claude Code');
124
+ changed = true;
288
125
  }
289
- };
290
- return {
291
- id: opts.id,
292
- label: opts.label,
293
- sendButtonLabel: opts.sendButtonLabel,
294
- installUrl: opts.installUrl,
295
- detect,
296
- notInstalledMessage: () => `${opts.label} is not installed or not in your PATH.\nInstall it: ${opts.installUrl}`,
297
- install: () => {
298
- if (!register())
299
- return { ok: false, changed: false };
300
- writeSkill('installed');
301
- return { ok: true, changed: true };
302
- },
303
- uninstall: () => {
304
- if (!detect()) {
305
- console.log(` ${opts.label} is not installed — skipping.`);
306
- return false;
307
- }
308
- let changed = false;
309
- try {
310
- childProcess.execSync(opts.removeCmd, { stdio: 'pipe' });
311
- console.log(`✓ Rivet MCP server removed from ${opts.label}`);
312
- changed = true;
313
- }
314
- catch {
315
- console.log(` Rivet was not registered with ${opts.label} (nothing to remove).`);
316
- }
317
- if (opts.skill && fs_1.default.existsSync(opts.skill.dir)) {
318
- fs_1.default.rmSync(opts.skill.dir, { recursive: true, force: true });
319
- console.log(`✓ Rivet skill file removed for ${opts.label}`);
320
- changed = true;
321
- }
322
- return changed;
323
- },
324
- update: () => {
325
- if (!detect())
326
- return false;
327
- try {
328
- childProcess.execSync(opts.removeCmd, { stdio: 'pipe' });
329
- }
330
- catch {
331
- // not registered yet — re-adding below still does the right thing
332
- }
333
- if (!register()) {
334
- console.log(` Failed to update Rivet for ${opts.label}.`);
335
- return false;
336
- }
337
- writeSkill('updated');
338
- return true;
339
- },
340
- nextSteps: opts.nextSteps,
341
- summaryHint: opts.summaryHint,
342
- restartHint: opts.restartHint,
343
- };
344
- };
345
- /**
346
- * Print manual recovery steps when an editor config cannot be written.
347
- */
348
- const printManualJsonInstallInstructions = ({ configPath, err, opts, }) => {
349
- const code = errorCodeFor(err);
350
- console.log(` Could not update ${opts.label} MCP config${code ? ` (${code})` : ''}: ${configPath}`);
351
- if (opts.id === 'cursor') {
352
- console.log(" Looks like this was launched by a coding agent, which can't modify ~/.cursor/.");
353
- }
354
- else if (isCodingAgentShell()) {
355
- console.log(' Looks like this was launched by a coding agent or sandboxed shell, which may not be allowed to edit that app config.');
356
- }
357
- else {
358
- console.log(' If this was launched by a coding agent or sandboxed shell, it may not be allowed to edit that app config.');
359
- }
360
- if (opts.manualInstallUrl) {
361
- console.log('\n Click this link to install the hosted MCP server:');
362
- console.log(` ${opts.manualInstallUrl()}`);
363
- }
364
- console.log('\n Run this in your own terminal instead:');
365
- console.log(` npx -y rivet-design@latest install ${opts.id}`);
366
- };
367
- /**
368
- * Print a one-click install link for editor-hosted MCP registration.
369
- */
370
- const printJsonInstallLink = (opts) => {
371
- if (!opts.manualInstallUrl)
372
- return;
373
- console.log('\nCursor one-click hosted MCP install link:');
374
- console.log(` ${opts.manualInstallUrl()}`);
375
- console.log('Click it if Cursor still asks you to approve the MCP server.');
376
- };
377
- /**
378
- * Print a compact write failure for non-install config mutations.
379
- */
380
- const printJsonWriteFailure = (configPath, err) => {
381
- console.log(` Error: could not write Rivet MCP config to ${configPath}: ${errorMessageFor(err)}`);
382
- };
383
- const jsonHarness = (opts) => {
384
- const ownedKeys = () => Object.keys(opts.entries());
385
- const detect = () => fs_1.default.existsSync(opts.detectDir);
386
- return {
387
- id: opts.id,
388
- label: opts.label,
389
- sendButtonLabel: opts.sendButtonLabel,
390
- installUrl: opts.installUrl,
391
- detect,
392
- notInstalledMessage: opts.notInstalledMessage,
393
- install: () => {
394
- const configPath = opts.configPath();
395
- const parsed = parseConfigFile(configPath);
396
- if (!parsed.ok) {
397
- console.log(` Error: ${parsed.error}`);
398
- return { ok: false, changed: false };
399
- }
400
- const { config } = parsed;
401
- const entries = opts.entries();
402
- config.mcpServers = { ...config.mcpServers, ...entries };
403
- try {
404
- writeConfigFile(configPath, config);
405
- }
406
- catch (err) {
407
- if (isAccessWriteError(err)) {
408
- printManualJsonInstallInstructions({
409
- configPath,
410
- err,
411
- opts,
412
- });
413
- }
414
- else {
415
- printJsonWriteFailure(configPath, err);
416
- }
417
- return { ok: false, changed: false };
418
- }
419
- console.log(`✓ Rivet MCP server added to ${configPath}`);
420
- printJsonInstallLink(opts);
421
- return { ok: true, changed: true };
422
- },
423
- uninstall: () => {
424
- const configPath = opts.configPath();
425
- if (!fs_1.default.existsSync(configPath)) {
426
- console.log(` No ${opts.label} MCP config found — nothing to remove.`);
427
- return false;
428
- }
429
- const parsed = parseConfigFile(configPath);
430
- if (!parsed.ok) {
431
- console.log(` Error: ${parsed.error}`);
432
- return false;
433
- }
434
- const { config } = parsed;
435
- const keys = ownedKeys();
436
- if (!config.mcpServers || !keys.some((k) => k in config.mcpServers)) {
437
- console.log(` Rivet was not registered with ${opts.label} (nothing to remove).`);
438
- return false;
439
- }
440
- for (const key of keys)
441
- delete config.mcpServers[key];
442
- try {
443
- writeConfigFile(configPath, config);
444
- }
445
- catch (err) {
446
- printJsonWriteFailure(configPath, err);
447
- return false;
448
- }
449
- console.log(`✓ Rivet MCP server removed from ${configPath}`);
450
- return true;
451
- },
452
- update: () => {
453
- const configPath = opts.configPath();
454
- if (!fs_1.default.existsSync(configPath))
455
- return false;
456
- const parsed = parseConfigFile(configPath);
457
- if (!parsed.ok) {
458
- console.log(` Warning: could not update ${opts.label} (${parsed.error})`);
459
- return false;
460
- }
461
- const { config } = parsed;
462
- const keys = ownedKeys();
463
- if (!config.mcpServers || !keys.some((k) => k in config.mcpServers)) {
464
- return false;
465
- }
466
- for (const key of keys)
467
- warnIfStaleRivetCommand(config.mcpServers[key], opts.label);
468
- config.mcpServers = { ...config.mcpServers, ...opts.entries() };
469
- try {
470
- writeConfigFile(configPath, config);
471
- }
472
- catch (err) {
473
- printJsonWriteFailure(configPath, err);
474
- return false;
475
- }
476
- console.log(`✓ Updated Rivet MCP server for ${opts.label}`);
477
- return true;
478
- },
479
- nextSteps: opts.nextSteps,
480
- summaryHint: opts.summaryHint,
481
- restartHint: opts.restartHint,
482
- };
483
- };
484
- // ---------------------------------------------------------------------------
485
- // The registry — the single source of truth for supported harnesses
486
- // ---------------------------------------------------------------------------
487
- exports.HARNESSES = [
488
- cliHarness({
489
- id: 'claude',
490
- label: 'Claude Code',
491
- sendButtonLabel: 'Send to Claude Code',
492
- installUrl: 'https://claude.ai/download',
493
- bin: 'claude',
494
- addCmd: 'claude mcp add --transport stdio --scope user rivet -- npx -y rivet-design@latest mcp --editor claude',
495
- removeCmd: 'claude mcp remove rivet',
496
- skill: {
497
- write: skillWriter_1.writeSkillFileIfNeeded,
498
- dir: path_1.default.join(os_1.default.homedir(), '.claude', 'skills', 'rivet'),
499
- },
500
- nextSteps: `
126
+ const allowlist = (0, allowlists_1.removeClaudeAllowlist)();
127
+ if (allowlist.ok && allowlist.changed) {
128
+ console.log(`✓ Command allowlist entries removed from ${(0, allowlists_1.claudeSettingsPath)()}`);
129
+ changed = true;
130
+ }
131
+ // Removes the registration whatever its vintage (legacy or `mcp serve`).
132
+ if ((0, mcpRegistration_1.unregisterClaudeCodeMcp)().changed) {
133
+ console.log('✓ Rivet MCP registration removed from Claude Code');
134
+ changed = true;
135
+ }
136
+ return changed;
137
+ },
138
+ update: () => {
139
+ if (!binaryDetect('claude')())
140
+ return false;
141
+ const skill = (0, skillWriter_1.writeSkillFileIfNeeded)();
142
+ const allowlist = (0, allowlists_1.writeClaudeAllowlist)();
143
+ (0, legacyMcp_1.cleanupClaudeLegacyMcp)();
144
+ if ((0, mcpRegistration_1.hasServeRegistrationViaHostCli)('claude')) {
145
+ // Opted in: re-register so the node/bin paths track this install.
146
+ (0, mcpRegistration_1.registerClaudeCodeMcp)();
147
+ }
148
+ const updated = skill.success && allowlist.ok && (allowlist.changed || true);
149
+ if (updated) {
150
+ console.log('✓ Refreshed Rivet CLI guidance for Claude Code');
151
+ }
152
+ return updated;
153
+ },
154
+ nextSteps: `
501
155
  Next steps:
502
156
  1. Start a new Claude Code session
503
157
  2. Type /rivet or say "Open Rivet"
504
158
  `,
505
- summaryHint: 'start a new session, then /rivet',
506
- restartHint: 'Restart Claude Code to apply changes.',
507
- }),
508
- jsonHarness({
509
- id: 'claude-desktop',
510
- label: 'the Claude desktop app',
511
- sendButtonLabel: 'Send to Claude',
512
- installUrl: 'https://claude.ai/download',
513
- detectDir: path_1.default.dirname(claudeDesktopConfigPath()),
514
- configPath: claudeDesktopConfigPath,
515
- entries: () => ({ rivet: buildClaudeDesktopRivetEntry() }),
516
- notInstalledMessage: () => `Claude desktop does not appear to be installed (${path_1.default.dirname(claudeDesktopConfigPath())} not found).\nInstall it: https://claude.ai/download`,
517
- nextSteps: `
518
- Next steps:
519
- 1. Fully quit and reopen the Claude desktop app
520
- 2. Open a new chat and say "Open Rivet"
521
- `,
522
- summaryHint: 'fully restart the app, then say "Open Rivet"',
523
- restartHint: 'Fully restart the Claude desktop app to apply changes.',
524
- }),
525
- jsonHarness({
526
- id: 'cursor',
527
- label: 'Cursor',
528
- sendButtonLabel: 'Send to Cursor',
529
- installUrl: 'https://cursor.com',
530
- detectDir: path_1.default.join(os_1.default.homedir(), '.cursor'),
531
- configPath: () => path_1.default.join(os_1.default.homedir(), '.cursor', 'mcp.json'),
532
- entries: () => ({
533
- rivet: (0, exports.buildCursorHostedRivetEntry)(),
534
- 'rivet-local': (0, exports.buildCursorLocalRivetEntry)(),
535
- }),
536
- manualInstallUrl: buildCursorHostedInstallUrl,
537
- notInstalledMessage: () => 'Cursor does not appear to be installed (~/.cursor not found).\nInstall it: https://cursor.com',
538
- nextSteps: `
159
+ summaryHint: 'start a new session, then /rivet',
160
+ restartHint: 'Restart Claude Code to apply changes.',
161
+ };
162
+ const cursorHarness = {
163
+ id: 'cursor',
164
+ label: 'Cursor',
165
+ sendButtonLabel: 'Send to Cursor',
166
+ installUrl: 'https://cursor.com',
167
+ supportsMcp: true,
168
+ detect: () => fs_1.default.existsSync(path_1.default.join(os_1.default.homedir(), '.cursor')),
169
+ notInstalledMessage: () => 'Cursor does not appear to be installed (~/.cursor not found).\nInstall it: https://cursor.com',
170
+ install: (options) => {
171
+ const allowlistOk = reportAllowlistWrite('Cursor', (0, allowlists_1.cursorPermissionsPath)(), (0, allowlists_1.writeCursorAllowlist)());
172
+ if ((0, legacyMcp_1.cleanupCursorLegacyMcp)().changed) {
173
+ console.log('✓ Removed the MCP entries a previous Rivet version wrote to ~/.cursor/mcp.json');
174
+ }
175
+ let mcpOk = true;
176
+ if (options?.mcp) {
177
+ mcpOk = reportMcpRegistration('Cursor (~/.cursor/mcp.json)', (0, mcpRegistration_1.registerCursorMcp)());
178
+ }
179
+ console.log(' Rivet writes its usage rules into each project (.cursor/rules/rivet.mdc) when you open it.');
180
+ return { ok: allowlistOk && mcpOk, changed: true };
181
+ },
182
+ uninstall: () => {
183
+ let changed = false;
184
+ const allowlist = (0, allowlists_1.removeCursorAllowlist)();
185
+ if (allowlist.ok && allowlist.changed) {
186
+ console.log(`✓ Command allowlist entries removed from ${(0, allowlists_1.cursorPermissionsPath)()}`);
187
+ changed = true;
188
+ }
189
+ if ((0, legacyMcp_1.cleanupCursorLegacyMcp)().changed) {
190
+ console.log('✓ Removed legacy Rivet MCP entries from ~/.cursor/mcp.json');
191
+ changed = true;
192
+ }
193
+ if ((0, mcpRegistration_1.unregisterCursorMcp)().changed) {
194
+ console.log('✓ Rivet MCP registration removed from ~/.cursor/mcp.json');
195
+ changed = true;
196
+ }
197
+ return changed;
198
+ },
199
+ update: () => {
200
+ if (!fs_1.default.existsSync(path_1.default.join(os_1.default.homedir(), '.cursor')))
201
+ return false;
202
+ const allowlist = (0, allowlists_1.writeCursorAllowlist)();
203
+ (0, legacyMcp_1.cleanupCursorLegacyMcp)();
204
+ if ((0, mcpRegistration_1.hasCursorServeRegistration)()) {
205
+ (0, mcpRegistration_1.registerCursorMcp)();
206
+ }
207
+ if (allowlist.ok) {
208
+ console.log('✓ Refreshed the Cursor command allowlist for Rivet');
209
+ }
210
+ return allowlist.ok;
211
+ },
212
+ nextSteps: `
539
213
  Next steps:
540
- 1. Fully restart Cursor
541
- 2. Open a new chat and say "Open Rivet"
214
+ 1. Open a project in Cursor
215
+ 2. Say "Open Rivet" the agent drives Rivet with \`rivet\` commands
542
216
  `,
543
- summaryHint: 'fully restart Cursor, then say "Open Rivet"',
544
- restartHint: 'Restart Cursor to apply changes.',
545
- }),
546
- cliHarness({
547
- id: 'codex',
548
- label: 'OpenAI Codex CLI',
549
- sendButtonLabel: 'Send to Codex',
550
- installUrl: 'https://github.com/openai/codex',
551
- bin: 'codex',
552
- addCmd: 'codex mcp add rivet -- npx -y rivet-design@latest mcp --editor codex',
553
- removeCmd: 'codex mcp remove rivet',
554
- nextSteps: `
217
+ summaryHint: 'open a project, then say "Open Rivet"',
218
+ restartHint: 'Restart Cursor to apply changes.',
219
+ };
220
+ const codexHarness = {
221
+ id: 'codex',
222
+ label: 'OpenAI Codex CLI',
223
+ sendButtonLabel: 'Send to Codex',
224
+ installUrl: 'https://github.com/openai/codex',
225
+ supportsMcp: true,
226
+ detect: binaryDetect('codex'),
227
+ notInstalledMessage: () => 'OpenAI Codex CLI is not installed or not in your PATH.\nInstall it: https://github.com/openai/codex',
228
+ install: (options) => {
229
+ const guidance = (0, codexGuidance_1.writeCodexGuidance)();
230
+ if (guidance.ok) {
231
+ console.log('✓ Rivet CLI guidance written to ~/.codex/AGENTS.md');
232
+ }
233
+ else {
234
+ console.log(` Warning: could not write ~/.codex/AGENTS.md guidance: ${guidance.error}`);
235
+ }
236
+ const rules = (0, allowlists_1.writeCodexRules)();
237
+ const rulesOk = reportAllowlistWrite('Codex execpolicy', (0, allowlists_1.codexRulesPath)(), rules);
238
+ if (rules.ok && !rules.verified) {
239
+ console.log(' Note: verification uses `codex execpolicy check` (preview); if unavailable, restart Codex and approve `rivet` once — it will be remembered.');
240
+ }
241
+ if ((0, legacyMcp_1.cleanupCodexLegacyMcp)().changed) {
242
+ console.log('✓ Removed the MCP registration a previous Rivet version wrote');
243
+ }
244
+ let mcpOk = true;
245
+ if (options?.mcp) {
246
+ mcpOk = reportMcpRegistration('OpenAI Codex CLI', (0, mcpRegistration_1.registerCodexMcp)());
247
+ }
248
+ return { ok: guidance.ok && rulesOk && mcpOk, changed: true };
249
+ },
250
+ uninstall: () => {
251
+ let changed = false;
252
+ const guidance = (0, codexGuidance_1.removeCodexGuidance)();
253
+ if (guidance.ok && guidance.changed) {
254
+ console.log('✓ Rivet guidance removed from ~/.codex/AGENTS.md');
255
+ changed = true;
256
+ }
257
+ const rules = (0, allowlists_1.removeCodexRules)();
258
+ if (rules.ok && rules.changed) {
259
+ console.log(`✓ Execpolicy rules removed (${(0, allowlists_1.codexRulesPath)()})`);
260
+ changed = true;
261
+ }
262
+ if ((0, mcpRegistration_1.unregisterCodexMcp)().changed) {
263
+ console.log('✓ Rivet MCP registration removed from Codex');
264
+ changed = true;
265
+ }
266
+ return changed;
267
+ },
268
+ update: () => {
269
+ if (!binaryDetect('codex')())
270
+ return false;
271
+ const guidance = (0, codexGuidance_1.writeCodexGuidance)();
272
+ const rules = (0, allowlists_1.writeCodexRules)();
273
+ (0, legacyMcp_1.cleanupCodexLegacyMcp)();
274
+ if ((0, mcpRegistration_1.hasServeRegistrationViaHostCli)('codex')) {
275
+ (0, mcpRegistration_1.registerCodexMcp)();
276
+ }
277
+ const updated = guidance.ok && rules.ok;
278
+ if (updated) {
279
+ console.log('✓ Refreshed Rivet CLI guidance for OpenAI Codex CLI');
280
+ }
281
+ return updated;
282
+ },
283
+ nextSteps: `
555
284
  Next steps:
556
285
  1. Start a new Codex session
557
286
  2. Say "Open Rivet"
558
287
  `,
559
- summaryHint: 'start a new session, then say "Open Rivet"',
560
- restartHint: 'Start a new Codex session to apply changes.',
561
- }),
288
+ summaryHint: 'start a new session, then say "Open Rivet"',
289
+ restartHint: 'Start a new Codex session to apply changes.',
290
+ };
291
+ /**
292
+ * Claude Desktop is retired as a *CLI* install target: it has no shell
293
+ * access, so it cannot run `rivet` commands. With `--mcp` it re-enters the
294
+ * flow — the resident `rivet mcp serve` stdio server is exactly the bridge a
295
+ * shell-less host needs. Without the flag, install only cleans up what old
296
+ * versions wrote.
297
+ */
298
+ const CLAUDE_DESKTOP_OUT_OF_SCOPE_MESSAGE = `Claude Desktop has no shell access to run the \`rivet\` CLI. To use Rivet
299
+ from Claude Desktop, register the MCP server instead:
300
+
301
+ rivet install claude-desktop --mcp
302
+
303
+ Otherwise use Claude Code (\`rivet install claude\`) — the browser editor
304
+ still works alongside any shell-capable agent.`;
305
+ const claudeDesktopHarness = {
306
+ id: 'claude-desktop',
307
+ label: 'the Claude desktop app',
308
+ sendButtonLabel: 'Send to Claude',
309
+ installUrl: 'https://claude.ai/download',
310
+ isRetired: true,
311
+ supportsMcp: true,
312
+ detect: () => fs_1.default.existsSync(path_1.default.dirname((0, legacyMcp_1.claudeDesktopConfigPath)())),
313
+ notInstalledMessage: () => `Claude desktop does not appear to be installed (${path_1.default.dirname((0, legacyMcp_1.claudeDesktopConfigPath)())} not found).\nInstall it: https://claude.ai/download`,
314
+ install: (options) => {
315
+ if (options?.mcp) {
316
+ const result = (0, mcpRegistration_1.registerClaudeDesktopMcp)();
317
+ const ok = reportMcpRegistration('the Claude desktop app (claude_desktop_config.json)', result);
318
+ if (ok) {
319
+ console.log(' Claude Desktop has no working directory: tools take a `project` parameter — tell the agent which project root to target.');
320
+ }
321
+ return { ok, changed: result.changed };
322
+ }
323
+ console.log(CLAUDE_DESKTOP_OUT_OF_SCOPE_MESSAGE);
324
+ const cleanup = (0, legacyMcp_1.cleanupClaudeDesktopLegacyMcp)();
325
+ if (cleanup.changed) {
326
+ console.log('✓ Removed the MCP registration a previous Rivet version wrote to claude_desktop_config.json');
327
+ }
328
+ return { ok: true, changed: cleanup.changed };
329
+ },
330
+ uninstall: () => {
331
+ // Removes the registration whatever its vintage (legacy or `mcp serve`).
332
+ const legacy = (0, legacyMcp_1.cleanupClaudeDesktopLegacyMcp)();
333
+ const serve = (0, mcpRegistration_1.unregisterClaudeDesktopMcp)();
334
+ const changed = legacy.changed || serve.changed;
335
+ if (changed) {
336
+ console.log(`✓ Rivet MCP registration removed from ${(0, legacyMcp_1.claudeDesktopConfigPath)()}`);
337
+ }
338
+ else {
339
+ console.log(' Rivet was not registered with the Claude desktop app (nothing to remove).');
340
+ }
341
+ return changed;
342
+ },
343
+ update: () => {
344
+ const legacy = (0, legacyMcp_1.cleanupClaudeDesktopLegacyMcp)().changed;
345
+ if ((0, mcpRegistration_1.hasClaudeDesktopServeRegistration)()) {
346
+ // Opted in: re-register so the node/bin paths track this install.
347
+ return (0, mcpRegistration_1.registerClaudeDesktopMcp)().changed || legacy;
348
+ }
349
+ return legacy;
350
+ },
351
+ nextSteps: `
352
+ Next steps:
353
+ 1. Fully restart the Claude desktop app (the MCP server loads on launch)
354
+ 2. Ask Claude to check Rivet status — tools take a \`project\` parameter,
355
+ so name the project root you want to work on
356
+ `,
357
+ summaryHint: 'restart the app; agent uses the rivet MCP tools',
358
+ restartHint: 'Fully restart the Claude desktop app to apply changes.',
359
+ };
360
+ exports.HARNESSES = [
361
+ claudeHarness,
362
+ claudeDesktopHarness,
363
+ cursorHarness,
364
+ codexHarness,
562
365
  ];
563
366
  const findHarness = (id) => exports.HARNESSES.find((h) => h.id === id);
564
367
  exports.findHarness = findHarness;
565
- const detectedHarnesses = () => exports.HARNESSES.filter((h) => h.detect());
368
+ const detectedHarnesses = (options) => exports.HARNESSES.filter((h) => (!h.isRetired || (options?.mcp === true && h.supportsMcp === true)) &&
369
+ h.detect());
566
370
  exports.detectedHarnesses = detectedHarnesses;
567
371
  /** Label for the in-app "Send to …" button, by harness id. */
568
372
  const sendButtonLabelFor = (id) => (id && (0, exports.findHarness)(id)?.sendButtonLabel) ?? 'Send to Claude Code';
@@ -570,10 +374,14 @@ exports.sendButtonLabelFor = sendButtonLabelFor;
570
374
  // ---------------------------------------------------------------------------
571
375
  // Orchestration — drives install / uninstall / update over the registry
572
376
  // ---------------------------------------------------------------------------
573
- const MCP_INSTALL_WELCOME = `
377
+ const CLI_INSTALL_WELCOME = `
574
378
  Welcome to Rivet!
575
379
 
576
- Rivet is a design agent for your coding agent.
380
+ Rivet is a design agent for your coding agent. Your agent drives it by
381
+ running \`rivet\` CLI commands — install writes each agent's usage guidance
382
+ and its command allowlist so those commands run without approval prompts.
383
+ Add --mcp to also register the resident MCP server (\`rivet mcp serve\`),
384
+ for hosts without shell access like Claude Desktop.
577
385
  `;
578
386
  const supportedListBlock = () => exports.HARNESSES.map((h) => ` rivet install ${h.id.padEnd(16)}${h.label}`).join('\n');
579
387
  /**
@@ -581,8 +389,8 @@ const supportedListBlock = () => exports.HARNESSES.map((h) => ` rivet install $
581
389
  * (`target` undefined/`'all'`). Returns a process exit code; never exits
582
390
  * itself so the multi-install loop survives a single failure.
583
391
  */
584
- const installHarnesses = (target) => {
585
- console.log(MCP_INSTALL_WELCOME);
392
+ const installHarnesses = (target, options) => {
393
+ console.log(CLI_INSTALL_WELCOME);
586
394
  // Single, explicitly named harness — preserves the original hard errors.
587
395
  if (target && target !== 'all') {
588
396
  const harness = (0, exports.findHarness)(target);
@@ -592,21 +400,23 @@ const installHarnesses = (target) => {
592
400
  console.log('');
593
401
  return { exitCode: 1 };
594
402
  }
595
- if (!harness.detect()) {
403
+ if (!harness.isRetired && !harness.detect()) {
596
404
  console.log(`\n${harness.notInstalledMessage()}\n`);
597
405
  return { exitCode: 1 };
598
406
  }
599
407
  console.log(`\nSetting up Rivet for ${harness.label}...\n`);
600
- const result = harness.install();
601
- if (result.ok)
408
+ const result = harness.install(options);
409
+ if (result.ok && result.changed)
602
410
  console.log(harness.nextSteps);
603
411
  return { exitCode: result.ok ? 0 : 1 };
604
412
  }
605
413
  // Unified path: install into everything we can detect.
606
- const targets = (0, exports.detectedHarnesses)();
414
+ const targets = (0, exports.detectedHarnesses)(options);
607
415
  if (targets.length === 0) {
608
416
  console.log('\nNo supported agents detected. Install one of these, then re-run `rivet install`:\n');
609
417
  for (const h of exports.HARNESSES) {
418
+ if (h.isRetired)
419
+ continue;
610
420
  console.log(` ${h.label.padEnd(24)}${h.installUrl}`);
611
421
  }
612
422
  console.log('');
@@ -619,7 +429,7 @@ const installHarnesses = (target) => {
619
429
  const failed = [];
620
430
  for (const harness of targets) {
621
431
  console.log(`\nSetting up Rivet for ${harness.label}...`);
622
- const result = harness.install();
432
+ const result = harness.install(options);
623
433
  (result.ok ? installed : failed).push(harness);
624
434
  }
625
435
  // Completion summary — show exactly which agents got Rivet.
@@ -636,7 +446,7 @@ const installHarnesses = (target) => {
636
446
  console.log(` ✗ ${h.label} (see messages above)`);
637
447
  }
638
448
  }
639
- const skipped = exports.HARNESSES.filter((h) => !targets.includes(h));
449
+ const skipped = exports.HARNESSES.filter((h) => !h.isRetired && !targets.includes(h));
640
450
  if (skipped.length > 0) {
641
451
  console.log(`\nNot detected (skipped): ${skipped.map((h) => h.label).join(', ')}`);
642
452
  }
@@ -677,7 +487,7 @@ const uninstallHarnesses = (target) => {
677
487
  return { exitCode: 0 };
678
488
  };
679
489
  exports.uninstallHarnesses = uninstallHarnesses;
680
- /** Re-register Rivet for every detected, already-installed harness. */
490
+ /** Refresh guidance/allowlists for every detected, already-installed harness. */
681
491
  const updateHarnesses = () => {
682
492
  console.log('\nUpdating Rivet...\n');
683
493
  const updatedAny = exports.HARNESSES.map((h) => h.update()).some(Boolean);