rivet-design 0.11.8 → 0.11.9

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 (46) hide show
  1. package/dist/config/flags.d.ts +3 -0
  2. package/dist/config/flags.d.ts.map +1 -1
  3. package/dist/config/flags.js +1 -0
  4. package/dist/config/flags.js.map +1 -1
  5. package/dist/index.d.ts +1 -8
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +96 -590
  8. package/dist/index.js.map +1 -1
  9. package/dist/install/harnesses.d.ts +82 -0
  10. package/dist/install/harnesses.d.ts.map +1 -0
  11. package/dist/install/harnesses.js +537 -0
  12. package/dist/install/harnesses.js.map +1 -0
  13. package/dist/mcp/agent-variants/WorktreeOrchestrator.d.ts +25 -0
  14. package/dist/mcp/agent-variants/WorktreeOrchestrator.d.ts.map +1 -1
  15. package/dist/mcp/agent-variants/WorktreeOrchestrator.js +121 -0
  16. package/dist/mcp/agent-variants/WorktreeOrchestrator.js.map +1 -1
  17. package/dist/mcp/auth/tools.d.ts.map +1 -1
  18. package/dist/mcp/auth/tools.js +63 -12
  19. package/dist/mcp/auth/tools.js.map +1 -1
  20. package/dist/mcp/server.d.ts.map +1 -1
  21. package/dist/mcp/server.js +2 -7
  22. package/dist/mcp/server.js.map +1 -1
  23. package/dist/onboarding/signin.d.ts +31 -0
  24. package/dist/onboarding/signin.d.ts.map +1 -0
  25. package/dist/onboarding/signin.js +235 -0
  26. package/dist/onboarding/signin.js.map +1 -0
  27. package/dist/routes/agentVariants.d.ts.map +1 -1
  28. package/dist/routes/agentVariants.js +450 -33
  29. package/dist/routes/agentVariants.js.map +1 -1
  30. package/dist/services/PrototypeDeployService.d.ts +2 -0
  31. package/dist/services/PrototypeDeployService.d.ts.map +1 -1
  32. package/dist/services/PrototypeDeployService.js +6 -0
  33. package/dist/services/PrototypeDeployService.js.map +1 -1
  34. package/dist/services/TelemetryService.d.ts +70 -0
  35. package/dist/services/TelemetryService.d.ts.map +1 -1
  36. package/dist/services/TelemetryService.js +85 -0
  37. package/dist/services/TelemetryService.js.map +1 -1
  38. package/dist/services/VariantHistoryService.d.ts +18 -0
  39. package/dist/services/VariantHistoryService.d.ts.map +1 -1
  40. package/dist/services/VariantHistoryService.js +27 -3
  41. package/dist/services/VariantHistoryService.js.map +1 -1
  42. package/package.json +2 -1
  43. package/src/ui/dist/assets/main-BtohezP4.js +641 -0
  44. package/src/ui/dist/assets/{main-CtRINpOq.css → main-IY99De7M.css} +1 -1
  45. package/src/ui/dist/index.html +2 -2
  46. package/src/ui/dist/assets/main-CF-wHnwl.js +0 -641
@@ -0,0 +1,537 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.updateHarnesses = exports.uninstallHarnesses = exports.installHarnesses = exports.sendButtonLabelFor = exports.detectedHarnesses = exports.findHarness = exports.HARNESSES = exports.buildCursorLocalRivetEntry = exports.buildCursorHostedRivetEntry = exports.resolveNpxCommand = void 0;
7
+ /* eslint-disable no-console */
8
+ const child_process_1 = require("child_process");
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const os_1 = __importDefault(require("os"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const skillWriter_1 = require("../utils/skillWriter");
13
+ // ---------------------------------------------------------------------------
14
+ // Shared helpers (previously duplicated per harness in index.ts)
15
+ // ---------------------------------------------------------------------------
16
+ /**
17
+ * Resolve `npx` to an absolute path using the install-time shell PATH.
18
+ *
19
+ * Why: editors like Claude desktop inherit a sanitized PATH at launch that can
20
+ * put stale node versions first, causing `npx` to dispatch to a node so old it
21
+ * can't even `require('node:url')`. Writing the absolute path into the MCP
22
+ * config bypasses that lookup. Falls back to literal "npx" with a warning so
23
+ * install never hard-blocks on a quirky environment.
24
+ */
25
+ const resolveNpxCommand = () => {
26
+ const which = process.platform === 'win32' ? 'where' : 'which';
27
+ try {
28
+ const out = (0, child_process_1.execSync)(`${which} npx`, {
29
+ stdio: ['ignore', 'pipe', 'ignore'],
30
+ encoding: 'utf8',
31
+ });
32
+ // `where` on Windows can return multiple lines (npx, npx.cmd, npx.ps1).
33
+ // Prefer .cmd / .exe over a shebanged shell script so Windows can spawn
34
+ // the resolved path directly.
35
+ const lines = out
36
+ .split(/\r?\n/)
37
+ .map((l) => l.trim())
38
+ .filter((l) => l.length > 0 && fs_1.default.existsSync(l));
39
+ if (lines.length === 0) {
40
+ throw new Error('which returned no usable paths');
41
+ }
42
+ if (process.platform === 'win32') {
43
+ const directlySpawnable = lines.find((l) => /\.(cmd|exe|bat)$/i.test(l));
44
+ return directlySpawnable ?? lines[0];
45
+ }
46
+ return lines[0];
47
+ }
48
+ catch {
49
+ 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.');
50
+ return 'npx';
51
+ }
52
+ };
53
+ exports.resolveNpxCommand = resolveNpxCommand;
54
+ /**
55
+ * Surface a diagnostic when an existing rivet MCP entry's `command` is an
56
+ * absolute path that no longer exists. Common when the user removes the node
57
+ * version that was resolved at install time.
58
+ */
59
+ const warnIfStaleRivetCommand = (entry, editorLabel) => {
60
+ if (typeof entry !== 'object' || entry === null)
61
+ return;
62
+ const cmd = entry.command;
63
+ if (typeof cmd !== 'string')
64
+ return;
65
+ if (!path_1.default.isAbsolute(cmd))
66
+ return;
67
+ if (fs_1.default.existsSync(cmd))
68
+ return;
69
+ console.log(` Note: previous Rivet command for ${editorLabel} (${cmd}) no longer exists. Re-resolving.`);
70
+ };
71
+ /**
72
+ * Read and validate an MCP config JSON file. Refuses to proceed on malformed
73
+ * input so a merge never clobbers a file we couldn't parse. A missing file is
74
+ * a valid empty config.
75
+ */
76
+ const parseConfigFile = (configPath) => {
77
+ if (!fs_1.default.existsSync(configPath))
78
+ return { ok: true, config: {} };
79
+ let parsed;
80
+ try {
81
+ parsed = JSON.parse(fs_1.default.readFileSync(configPath, 'utf8'));
82
+ }
83
+ catch {
84
+ return {
85
+ ok: false,
86
+ error: `could not parse ${configPath}. Fix or delete the file manually, then re-run.`,
87
+ };
88
+ }
89
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
90
+ return {
91
+ ok: false,
92
+ error: `${configPath} is not a JSON object. Fix or delete the file manually, then re-run.`,
93
+ };
94
+ }
95
+ const config = parsed;
96
+ if (config.mcpServers !== undefined &&
97
+ (typeof config.mcpServers !== 'object' || Array.isArray(config.mcpServers))) {
98
+ return {
99
+ ok: false,
100
+ error: `mcpServers in ${configPath} is not an object. Fix it manually, then re-run.`,
101
+ };
102
+ }
103
+ return { ok: true, config };
104
+ };
105
+ const writeConfigFile = (configPath, config) => {
106
+ fs_1.default.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
107
+ };
108
+ // ---------------------------------------------------------------------------
109
+ // MCP entry builders (exported for tests / back-compat re-export from index)
110
+ // ---------------------------------------------------------------------------
111
+ const CURSOR_HOSTED_MCP_URL = 'https://rivet-proxy.onrender.com/mcp';
112
+ const buildCursorHostedRivetEntry = () => ({
113
+ url: CURSOR_HOSTED_MCP_URL,
114
+ });
115
+ exports.buildCursorHostedRivetEntry = buildCursorHostedRivetEntry;
116
+ const buildCursorLocalRivetEntry = () => ({
117
+ command: (0, exports.resolveNpxCommand)(),
118
+ args: ['-y', 'rivet-design@latest', 'mcp', '--editor', 'cursor'],
119
+ });
120
+ exports.buildCursorLocalRivetEntry = buildCursorLocalRivetEntry;
121
+ const buildClaudeDesktopRivetEntry = () => ({
122
+ command: (0, exports.resolveNpxCommand)(),
123
+ args: ['-y', 'rivet-design@latest', 'mcp', '--editor', 'claude-desktop'],
124
+ });
125
+ /**
126
+ * Path to the Claude desktop app's MCP config file.
127
+ * macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
128
+ * Win: %APPDATA%\Claude\claude_desktop_config.json
129
+ * Linux: ~/.config/Claude/claude_desktop_config.json
130
+ */
131
+ const claudeDesktopConfigPath = () => {
132
+ const home = os_1.default.homedir();
133
+ if (process.platform === 'darwin') {
134
+ return path_1.default.join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');
135
+ }
136
+ if (process.platform === 'win32') {
137
+ const appData = process.env.APPDATA ?? path_1.default.join(home, 'AppData', 'Roaming');
138
+ return path_1.default.join(appData, 'Claude', 'claude_desktop_config.json');
139
+ }
140
+ return path_1.default.join(home, '.config', 'Claude', 'claude_desktop_config.json');
141
+ };
142
+ const cliHarness = (opts) => {
143
+ const detect = () => {
144
+ try {
145
+ (0, child_process_1.execSync)(`${opts.bin} --version`, { stdio: 'ignore' });
146
+ return true;
147
+ }
148
+ catch {
149
+ return false;
150
+ }
151
+ };
152
+ /** Run the harness's `mcp add`. Treats "already exists" as success. */
153
+ const register = () => {
154
+ try {
155
+ const output = (0, child_process_1.execSync)(opts.addCmd, { stdio: 'pipe', encoding: 'utf8' });
156
+ if (output)
157
+ process.stdout.write(output);
158
+ console.log(`✓ Rivet MCP server added to ${opts.label}`);
159
+ return true;
160
+ }
161
+ catch (err) {
162
+ const stderr = err.stderr ?? '';
163
+ if (stderr.includes('already exists')) {
164
+ console.log(`✓ Rivet MCP server already registered with ${opts.label}`);
165
+ return true;
166
+ }
167
+ if (stderr)
168
+ process.stderr.write(stderr);
169
+ console.log('Run manually:', opts.addCmd);
170
+ return false;
171
+ }
172
+ };
173
+ const writeSkill = (verb) => {
174
+ if (!opts.skill)
175
+ return;
176
+ const result = opts.skill.write();
177
+ if (result.success) {
178
+ console.log(`✓ Rivet skill ${verb} for ${opts.label}`);
179
+ }
180
+ else {
181
+ console.log(` Warning: could not write skill file to ${opts.skill.dir}: ${result.error}`);
182
+ }
183
+ };
184
+ return {
185
+ id: opts.id,
186
+ label: opts.label,
187
+ sendButtonLabel: opts.sendButtonLabel,
188
+ installUrl: opts.installUrl,
189
+ detect,
190
+ notInstalledMessage: () => `${opts.label} is not installed or not in your PATH.\nInstall it: ${opts.installUrl}`,
191
+ install: () => {
192
+ if (!register())
193
+ return { ok: false, changed: false };
194
+ writeSkill('installed');
195
+ return { ok: true, changed: true };
196
+ },
197
+ uninstall: () => {
198
+ if (!detect()) {
199
+ console.log(` ${opts.label} is not installed — skipping.`);
200
+ return false;
201
+ }
202
+ let changed = false;
203
+ try {
204
+ (0, child_process_1.execSync)(opts.removeCmd, { stdio: 'pipe' });
205
+ console.log(`✓ Rivet MCP server removed from ${opts.label}`);
206
+ changed = true;
207
+ }
208
+ catch {
209
+ console.log(` Rivet was not registered with ${opts.label} (nothing to remove).`);
210
+ }
211
+ if (opts.skill && fs_1.default.existsSync(opts.skill.dir)) {
212
+ fs_1.default.rmSync(opts.skill.dir, { recursive: true, force: true });
213
+ console.log(`✓ Rivet skill file removed for ${opts.label}`);
214
+ changed = true;
215
+ }
216
+ return changed;
217
+ },
218
+ update: () => {
219
+ if (!detect())
220
+ return false;
221
+ try {
222
+ (0, child_process_1.execSync)(opts.removeCmd, { stdio: 'pipe' });
223
+ }
224
+ catch {
225
+ // not registered yet — re-adding below still does the right thing
226
+ }
227
+ if (!register()) {
228
+ console.log(` Failed to update Rivet for ${opts.label}.`);
229
+ return false;
230
+ }
231
+ writeSkill('updated');
232
+ return true;
233
+ },
234
+ nextSteps: opts.nextSteps,
235
+ summaryHint: opts.summaryHint,
236
+ restartHint: opts.restartHint,
237
+ };
238
+ };
239
+ const jsonHarness = (opts) => {
240
+ const ownedKeys = () => Object.keys(opts.entries());
241
+ const detect = () => fs_1.default.existsSync(opts.detectDir);
242
+ return {
243
+ id: opts.id,
244
+ label: opts.label,
245
+ sendButtonLabel: opts.sendButtonLabel,
246
+ installUrl: opts.installUrl,
247
+ detect,
248
+ notInstalledMessage: opts.notInstalledMessage,
249
+ install: () => {
250
+ const configPath = opts.configPath();
251
+ const parsed = parseConfigFile(configPath);
252
+ if (!parsed.ok) {
253
+ console.log(` Error: ${parsed.error}`);
254
+ return { ok: false, changed: false };
255
+ }
256
+ const { config } = parsed;
257
+ config.mcpServers = { ...config.mcpServers, ...opts.entries() };
258
+ writeConfigFile(configPath, config);
259
+ console.log(`✓ Rivet MCP server added to ${configPath}`);
260
+ return { ok: true, changed: true };
261
+ },
262
+ uninstall: () => {
263
+ const configPath = opts.configPath();
264
+ if (!fs_1.default.existsSync(configPath)) {
265
+ console.log(` No ${opts.label} MCP config found — nothing to remove.`);
266
+ return false;
267
+ }
268
+ const parsed = parseConfigFile(configPath);
269
+ if (!parsed.ok) {
270
+ console.log(` Error: ${parsed.error}`);
271
+ return false;
272
+ }
273
+ const { config } = parsed;
274
+ const keys = ownedKeys();
275
+ if (!config.mcpServers || !keys.some((k) => k in config.mcpServers)) {
276
+ console.log(` Rivet was not registered with ${opts.label} (nothing to remove).`);
277
+ return false;
278
+ }
279
+ for (const key of keys)
280
+ delete config.mcpServers[key];
281
+ writeConfigFile(configPath, config);
282
+ console.log(`✓ Rivet MCP server removed from ${configPath}`);
283
+ return true;
284
+ },
285
+ update: () => {
286
+ const configPath = opts.configPath();
287
+ if (!fs_1.default.existsSync(configPath))
288
+ return false;
289
+ const parsed = parseConfigFile(configPath);
290
+ if (!parsed.ok) {
291
+ console.log(` Warning: could not update ${opts.label} (${parsed.error})`);
292
+ return false;
293
+ }
294
+ const { config } = parsed;
295
+ const keys = ownedKeys();
296
+ if (!config.mcpServers || !keys.some((k) => k in config.mcpServers)) {
297
+ return false;
298
+ }
299
+ for (const key of keys)
300
+ warnIfStaleRivetCommand(config.mcpServers[key], opts.label);
301
+ config.mcpServers = { ...config.mcpServers, ...opts.entries() };
302
+ writeConfigFile(configPath, config);
303
+ console.log(`✓ Updated Rivet MCP server for ${opts.label}`);
304
+ return true;
305
+ },
306
+ nextSteps: opts.nextSteps,
307
+ summaryHint: opts.summaryHint,
308
+ restartHint: opts.restartHint,
309
+ };
310
+ };
311
+ // ---------------------------------------------------------------------------
312
+ // The registry — the single source of truth for supported harnesses
313
+ // ---------------------------------------------------------------------------
314
+ exports.HARNESSES = [
315
+ cliHarness({
316
+ id: 'claude',
317
+ label: 'Claude Code',
318
+ sendButtonLabel: 'Send to Claude Code',
319
+ installUrl: 'https://claude.ai/download',
320
+ bin: 'claude',
321
+ addCmd: 'claude mcp add --transport stdio --scope user rivet -- npx -y rivet-design@latest mcp --editor claude',
322
+ removeCmd: 'claude mcp remove rivet',
323
+ skill: {
324
+ write: skillWriter_1.writeSkillFileIfNeeded,
325
+ dir: path_1.default.join(os_1.default.homedir(), '.claude', 'skills', 'rivet'),
326
+ },
327
+ nextSteps: `
328
+ Next steps:
329
+ 1. Start a new Claude Code session
330
+ 2. Type /rivet or say "Open Rivet"
331
+ `,
332
+ summaryHint: 'start a new session, then /rivet',
333
+ restartHint: 'Restart Claude Code to apply changes.',
334
+ }),
335
+ jsonHarness({
336
+ id: 'claude-desktop',
337
+ label: 'the Claude desktop app',
338
+ sendButtonLabel: 'Send to Claude',
339
+ installUrl: 'https://claude.ai/download',
340
+ detectDir: path_1.default.dirname(claudeDesktopConfigPath()),
341
+ configPath: claudeDesktopConfigPath,
342
+ entries: () => ({ rivet: buildClaudeDesktopRivetEntry() }),
343
+ notInstalledMessage: () => `Claude desktop does not appear to be installed (${path_1.default.dirname(claudeDesktopConfigPath())} not found).\nInstall it: https://claude.ai/download`,
344
+ nextSteps: `
345
+ Next steps:
346
+ 1. Fully quit and reopen the Claude desktop app
347
+ 2. Open a new chat and say "Open Rivet"
348
+ `,
349
+ summaryHint: 'fully restart the app, then say "Open Rivet"',
350
+ restartHint: 'Fully restart the Claude desktop app to apply changes.',
351
+ }),
352
+ jsonHarness({
353
+ id: 'cursor',
354
+ label: 'Cursor',
355
+ sendButtonLabel: 'Send to Cursor',
356
+ installUrl: 'https://cursor.com',
357
+ detectDir: path_1.default.join(os_1.default.homedir(), '.cursor'),
358
+ configPath: () => path_1.default.join(os_1.default.homedir(), '.cursor', 'mcp.json'),
359
+ entries: () => ({
360
+ rivet: (0, exports.buildCursorHostedRivetEntry)(),
361
+ 'rivet-local': (0, exports.buildCursorLocalRivetEntry)(),
362
+ }),
363
+ notInstalledMessage: () => 'Cursor does not appear to be installed (~/.cursor not found).\nInstall it: https://cursor.com',
364
+ nextSteps: `
365
+ Next steps:
366
+ 1. Fully restart Cursor
367
+ 2. Open a new chat and say "Open Rivet"
368
+ `,
369
+ summaryHint: 'fully restart Cursor, then say "Open Rivet"',
370
+ restartHint: 'Restart Cursor to apply changes.',
371
+ }),
372
+ cliHarness({
373
+ id: 'codex',
374
+ label: 'OpenAI Codex CLI',
375
+ sendButtonLabel: 'Send to Codex',
376
+ installUrl: 'https://github.com/openai/codex',
377
+ bin: 'codex',
378
+ addCmd: 'codex mcp add rivet -- npx -y rivet-design@latest mcp --editor codex',
379
+ removeCmd: 'codex mcp remove rivet',
380
+ nextSteps: `
381
+ Next steps:
382
+ 1. Start a new Codex session
383
+ 2. Say "Open Rivet"
384
+ `,
385
+ summaryHint: 'start a new session, then say "Open Rivet"',
386
+ restartHint: 'Start a new Codex session to apply changes.',
387
+ }),
388
+ ];
389
+ const findHarness = (id) => exports.HARNESSES.find((h) => h.id === id);
390
+ exports.findHarness = findHarness;
391
+ const detectedHarnesses = () => exports.HARNESSES.filter((h) => h.detect());
392
+ exports.detectedHarnesses = detectedHarnesses;
393
+ /** Label for the in-app "Send to …" button, by harness id. */
394
+ const sendButtonLabelFor = (id) => (id && (0, exports.findHarness)(id)?.sendButtonLabel) ?? 'Send to Claude Code';
395
+ exports.sendButtonLabelFor = sendButtonLabelFor;
396
+ // ---------------------------------------------------------------------------
397
+ // Orchestration — drives install / uninstall / update over the registry
398
+ // ---------------------------------------------------------------------------
399
+ const MCP_INSTALL_WELCOME = `
400
+ Welcome to Rivet!
401
+
402
+ Rivet is a visual editor for your coding agent.
403
+ `;
404
+ const RIVET_ASCII_LOGO = `
405
+
406
+ ****************************************************************************************************
407
+ ****************************************************************************************************
408
+ *******************************+. :****************************************************************
409
+ *******************************: =*************************************:...=*********************
410
+ *******************************+=--=*************************************+. =*********************
411
+ *****************-....... ..:+*-....**:....=*****:....=**:..........-**+.. ....-*****************
412
+ *****************- .... .+*- .***: +***- -*+. :*+. :*****************
413
+ *****************- .+****++**- .****. :**+. :**+ :====: .***+ =*********************
414
+ *****************- .+********- .****+. -+. :***+ .***+ =*********************
415
+ *****************- .+********- .*****+. .: :****+ .++++==--****+ :+++******************
416
+ *****************- .+********- .******+. :******:. .+***. =*****************
417
+ *****************+++++*********+++++*******+++++++********+++++++++++******+++++++******************
418
+ ****************************************************************************************************
419
+ ****************************************************************************************************
420
+
421
+ `;
422
+ const supportedListBlock = () => exports.HARNESSES.map((h) => ` rivet install ${h.id.padEnd(16)}${h.label}`).join('\n');
423
+ /**
424
+ * Install Rivet into one harness (`target` set) or every detected harness
425
+ * (`target` undefined/`'all'`). Returns a process exit code; never exits
426
+ * itself so the multi-install loop survives a single failure.
427
+ */
428
+ const installHarnesses = (target) => {
429
+ console.log(MCP_INSTALL_WELCOME);
430
+ // Single, explicitly named harness — preserves the original hard errors.
431
+ if (target && target !== 'all') {
432
+ const harness = (0, exports.findHarness)(target);
433
+ if (!harness) {
434
+ console.log(`\nUnknown agent "${target}". Supported:\n`);
435
+ console.log(supportedListBlock());
436
+ console.log('');
437
+ return { exitCode: 1 };
438
+ }
439
+ if (!harness.detect()) {
440
+ console.log(`\n${harness.notInstalledMessage()}\n`);
441
+ return { exitCode: 1 };
442
+ }
443
+ console.log(`\nSetting up Rivet for ${harness.label}...\n`);
444
+ const result = harness.install();
445
+ if (result.ok)
446
+ console.log(harness.nextSteps);
447
+ console.log(RIVET_ASCII_LOGO);
448
+ return { exitCode: result.ok ? 0 : 1 };
449
+ }
450
+ // Unified path: install into everything we can detect.
451
+ const targets = (0, exports.detectedHarnesses)();
452
+ if (targets.length === 0) {
453
+ console.log('\nNo supported agents detected. Install one of these, then re-run `rivet install`:\n');
454
+ for (const h of exports.HARNESSES) {
455
+ console.log(` ${h.label.padEnd(24)}${h.installUrl}`);
456
+ }
457
+ console.log('');
458
+ return { exitCode: 0 };
459
+ }
460
+ console.log(`\nDetected ${targets.length} agent${targets.length > 1 ? 's' : ''}: ${targets
461
+ .map((h) => h.label)
462
+ .join(', ')}\n`);
463
+ const installed = [];
464
+ const failed = [];
465
+ for (const harness of targets) {
466
+ console.log(`\nSetting up Rivet for ${harness.label}...`);
467
+ const result = harness.install();
468
+ (result.ok ? installed : failed).push(harness);
469
+ }
470
+ // Completion summary — show exactly which agents got Rivet.
471
+ console.log('\n──────────────────────────────────────────');
472
+ if (installed.length > 0) {
473
+ console.log('Rivet installed for:');
474
+ for (const h of installed) {
475
+ console.log(` ✓ ${h.label} — ${h.summaryHint}`);
476
+ }
477
+ }
478
+ if (failed.length > 0) {
479
+ console.log('\nCould not install for:');
480
+ for (const h of failed) {
481
+ console.log(` ✗ ${h.label} (see messages above)`);
482
+ }
483
+ }
484
+ const skipped = exports.HARNESSES.filter((h) => !targets.includes(h));
485
+ if (skipped.length > 0) {
486
+ console.log(`\nNot detected (skipped): ${skipped.map((h) => h.label).join(', ')}`);
487
+ }
488
+ console.log('──────────────────────────────────────────');
489
+ console.log(RIVET_ASCII_LOGO);
490
+ // Non-zero if any detected agent failed to install, so automation invoking
491
+ // `npx rivet-design install` doesn't treat a partial setup as complete.
492
+ return { exitCode: failed.length > 0 ? 1 : 0 };
493
+ };
494
+ exports.installHarnesses = installHarnesses;
495
+ /**
496
+ * Remove Rivet from one harness, or from all of them with `target === 'all'`.
497
+ * Returns a process exit code (1 for unknown target, else 0).
498
+ */
499
+ const uninstallHarnesses = (target) => {
500
+ if (!target) {
501
+ console.log('\nUsage: rivet uninstall <editor|all>\n');
502
+ console.log(exports.HARNESSES.map((h) => ` rivet uninstall ${h.id.padEnd(16)}Remove from ${h.label}`).join('\n'));
503
+ console.log(` rivet uninstall ${'all'.padEnd(16)}Remove from all editors`);
504
+ console.log('');
505
+ return { exitCode: 0 };
506
+ }
507
+ if (target === 'all') {
508
+ console.log('\nUninstalling Rivet from all editors...\n');
509
+ const changed = exports.HARNESSES.map((h) => h.uninstall()).some(Boolean);
510
+ if (changed)
511
+ console.log('\nRestart your editor sessions to apply changes.\n');
512
+ return { exitCode: 0 };
513
+ }
514
+ const harness = (0, exports.findHarness)(target);
515
+ if (!harness) {
516
+ console.log(`\nUnknown agent "${target}". Supported: ${exports.HARNESSES.map((h) => h.id).join(', ')}, all\n`);
517
+ return { exitCode: 1 };
518
+ }
519
+ console.log(`\nUninstalling Rivet from ${harness.label}...\n`);
520
+ if (harness.uninstall()) {
521
+ console.log(`\n${harness.restartHint}\n`);
522
+ }
523
+ return { exitCode: 0 };
524
+ };
525
+ exports.uninstallHarnesses = uninstallHarnesses;
526
+ /** Re-register Rivet for every detected, already-installed harness. */
527
+ const updateHarnesses = () => {
528
+ console.log('\nUpdating Rivet...\n');
529
+ const updatedAny = exports.HARNESSES.map((h) => h.update()).some(Boolean);
530
+ if (!updatedAny) {
531
+ console.log("No editors found to update. Run 'rivet install' to set Rivet up first.");
532
+ return;
533
+ }
534
+ console.log('\nRestart your editor session to use the latest Rivet.\n');
535
+ };
536
+ exports.updateHarnesses = updateHarnesses;
537
+ //# sourceMappingURL=harnesses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harnesses.js","sourceRoot":"","sources":["../../src/install/harnesses.ts"],"names":[],"mappings":"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"}
@@ -212,6 +212,31 @@ export interface VariantsTelemetry {
212
212
  /** True when the failure was a port collision (EADDRINUSE / already running). */
213
213
  portInUse?: boolean;
214
214
  }) => void;
215
+ trackAgentVariantsPreviewStarted?: (data: {
216
+ sessionId: string;
217
+ variantId: string;
218
+ projectContextKind: 'existing' | 'fresh';
219
+ previewKind: 'dev_server' | 'static_artifact';
220
+ }) => void;
221
+ trackAgentVariantsPreviewReady?: (data: {
222
+ sessionId: string;
223
+ variantId: string;
224
+ projectContextKind: 'existing' | 'fresh';
225
+ previewKind: 'dev_server' | 'static_artifact';
226
+ hasPort: boolean;
227
+ port?: number;
228
+ durationMs?: number | null;
229
+ }) => void;
230
+ trackAgentVariantsPreviewFailed?: (data: {
231
+ sessionId: string;
232
+ variantId: string;
233
+ projectContextKind: 'existing' | 'fresh';
234
+ previewKind: 'dev_server' | 'static_artifact';
235
+ errorCode: string;
236
+ reason?: string;
237
+ portInUse?: boolean;
238
+ durationMs?: number | null;
239
+ }) => void;
215
240
  trackAgentVariantsNewProjectMaterialized?: (data: {
216
241
  sessionId: string;
217
242
  variantId: string;