vybekiit 0.7.33 → 0.7.34

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.
package/dist/bin.js CHANGED
@@ -265,7 +265,7 @@ var twilioConfigSchema = Schema2.Struct({
265
265
  });
266
266
  var anthropicConfigSchema = Schema2.Struct({
267
267
  ANTHROPIC_API_KEY: NonEmpty,
268
- ANTHROPIC_MODEL: Schema2.optionalWith(NonEmpty, { default: () => "claude-3-5-haiku-latest" })
268
+ ANTHROPIC_MODEL: Schema2.optionalWith(NonEmpty, { default: () => "claude-haiku-5-5" })
269
269
  });
270
270
  var openrouterConfigSchema = Schema2.Struct({
271
271
  OPENROUTER_API_KEY: NonEmpty,
@@ -2406,6 +2406,7 @@ var AGENT_LAYER_PATHS = [
2406
2406
  "language.md",
2407
2407
  ".claude/settings.json",
2408
2408
  ".claude/hooks",
2409
+ ".codex/hooks.json",
2409
2410
  ".cursor/rules/vybekiit.mdc",
2410
2411
  ".cursor/rules/patterns.mdc",
2411
2412
  ".github/copilot-instructions.md",
@@ -14175,8 +14176,12 @@ var copyPackageIntoKit = async (packagesRoot, packageDir, dest) => {
14175
14176
  filter: (src) => shouldCopyScaffoldPath(src)
14176
14177
  });
14177
14178
  };
14178
- var writeWorkspaceClaudeSettings = async (surfaceDest, dest, template) => {
14179
- const appSettingsPath = join14(surfaceDest, ".claude", "settings.json");
14179
+ var AGENT_HOOK_SETTINGS_FILES = [
14180
+ [".claude", "settings.json"],
14181
+ [".codex", "hooks.json"]
14182
+ ];
14183
+ var writeWorkspaceHookSettings = async (dest, template, [settingsFolder, settingsFile]) => {
14184
+ const appSettingsPath = join14(dest, "templates", template, settingsFolder, settingsFile);
14180
14185
  if (!await pathExists3(appSettingsPath)) {
14181
14186
  return;
14182
14187
  }
@@ -14185,8 +14190,8 @@ var writeWorkspaceClaudeSettings = async (surfaceDest, dest, template) => {
14185
14190
  "/.claude/hooks/",
14186
14191
  `/templates/${template}/.claude/hooks/`
14187
14192
  );
14188
- await mkdir5(join14(dest, ".claude"), { recursive: true });
14189
- await writeFile6(join14(dest, ".claude", "settings.json"), workspaceSettings);
14193
+ await mkdir5(join14(dest, settingsFolder), { recursive: true });
14194
+ await writeFile6(join14(dest, settingsFolder, settingsFile), workspaceSettings);
14190
14195
  };
14191
14196
  var scaffoldKitWorkspace = async (options) => {
14192
14197
  const surfaceSource = join14(options.kitRoot, "templates", options.template);
@@ -14252,7 +14257,11 @@ The app lives in templates/${options.template}. Before planning or changing it,
14252
14257
  );
14253
14258
  await ensureAgentSkillSymlinks(options.dest);
14254
14259
  }
14255
- await writeWorkspaceClaudeSettings(surfaceDest, options.dest, options.template);
14260
+ await Promise.all(
14261
+ AGENT_HOOK_SETTINGS_FILES.map(
14262
+ (settingsPath) => writeWorkspaceHookSettings(options.dest, options.template, settingsPath)
14263
+ )
14264
+ );
14256
14265
  await shipFirstPartyMcpConfigs({ dest: options.dest, template: options.template });
14257
14266
  await writeKitWorkspaceManifest({
14258
14267
  projectRoot: options.dest,
@@ -15768,7 +15777,7 @@ var getAgentConfigsForTemplate = () => ({
15768
15777
  "Claude Code": ".claude/settings.json + hooks/",
15769
15778
  Kiro: ".kiro/steering/vybekiit.md",
15770
15779
  Cursor: ".cursor/rules/vybekiit.mdc",
15771
- Codex: "AGENTS.md",
15780
+ Codex: "AGENTS.md + .codex/hooks.json",
15772
15781
  Gemini: "GEMINI.md",
15773
15782
  Copilot: ".github/copilot-instructions.md",
15774
15783
  Windsurf: ".windsurfrules",
@@ -16536,7 +16545,7 @@ var readInitPackageJson = async (cwd) => {
16536
16545
  // src/commands/initAssets.ts
16537
16546
  var execFileAsync4 = promisify4(execFile4);
16538
16547
  var HERE5 = dirname10(fileURLToPath5(import.meta.url));
16539
- var copyClaudeHooks = async (cwd, templateDir) => {
16548
+ var copyAgentHooks = async (cwd, templateDir) => {
16540
16549
  const claudeSource = join27(templateDir, ".claude");
16541
16550
  if (!await pathExists4(claudeSource)) {
16542
16551
  process.stdout.write(" \u26A0\uFE0F Could not copy .claude hooks (source missing)\n");
@@ -16544,6 +16553,13 @@ var copyClaudeHooks = async (cwd, templateDir) => {
16544
16553
  }
16545
16554
  await cp4(claudeSource, join27(cwd, ".claude"), { recursive: true, force: true });
16546
16555
  process.stdout.write(" \u2705 .claude/settings.json + hooks\n");
16556
+ const codexHooksSource = join27(templateDir, ".codex", "hooks.json");
16557
+ if (!await pathExists4(codexHooksSource)) {
16558
+ return;
16559
+ }
16560
+ await mkdir10(join27(cwd, ".codex"), { recursive: true });
16561
+ await cp4(codexHooksSource, join27(cwd, ".codex", "hooks.json"), { force: true });
16562
+ process.stdout.write(" \u2705 .codex/hooks.json\n");
16547
16563
  };
16548
16564
  var copyWorkflows = async (cwd, templateDir, pm) => {
16549
16565
  const workflowsDir = join27(cwd, ".github", "workflows");
@@ -16766,11 +16782,11 @@ var writeInitSuccess = (pm) => {
16766
16782
  `);
16767
16783
  process.stdout.write("\n");
16768
16784
  process.stdout.write(" Platform configs generated:\n");
16769
- process.stdout.write(" .kiro/steering/vybekiit.md -> Kiro\n");
16770
- process.stdout.write(" .cursor/rules/vybekiit.mdc -> Cursor\n");
16771
- process.stdout.write(" AGENTS.md -> OpenAI Codex\n");
16772
- process.stdout.write(" GEMINI.md -> Gemini CLI\n");
16773
- process.stdout.write(" AGENTS.md + .claude/hooks/ -> Claude Code\n");
16785
+ process.stdout.write(" .kiro/steering/vybekiit.md -> Kiro\n");
16786
+ process.stdout.write(" .cursor/rules/vybekiit.mdc -> Cursor\n");
16787
+ process.stdout.write(" AGENTS.md + .codex/hooks.json -> OpenAI Codex\n");
16788
+ process.stdout.write(" GEMINI.md -> Gemini CLI\n");
16789
+ process.stdout.write(" AGENTS.md + .claude/hooks/ -> Claude Code\n");
16774
16790
  };
16775
16791
 
16776
16792
  // src/commands/initPatches.ts
@@ -16837,7 +16853,7 @@ var runInit = async (args) => {
16837
16853
  const { cleanup: resolvedCleanup, source } = await locateTemplateSource(projectType);
16838
16854
  cleanup = resolvedCleanup;
16839
16855
  const templateDir = join30(source, projectType);
16840
- await copyClaudeHooks(cwd, templateDir);
16856
+ await copyAgentHooks(cwd, templateDir);
16841
16857
  await copyWorkflows(cwd, templateDir, pm);
16842
16858
  await copyPrePushHook(cwd, templateDir);
16843
16859
  await copySecurityFile(cwd, templateDir);
@@ -20400,9 +20416,8 @@ var VerifyGateFailedError = class extends Error {
20400
20416
  };
20401
20417
 
20402
20418
  // ../packages/browserAutomation/src/domains/extension/connect.ts
20403
- var DEFAULT_CDP_ENDPOINT2 = "http://localhost:9222";
20404
20419
  var connectToCwsChrome = async (ctx) => {
20405
- const endpoint = ctx.cdpEndpoint === void 0 ? DEFAULT_CDP_ENDPOINT2 : ctx.cdpEndpoint;
20420
+ const endpoint = ctx.cdpEndpoint === void 0 ? DEFAULT_CDP_ENDPOINT : ctx.cdpEndpoint;
20406
20421
  const log = verbLogger(ctx);
20407
20422
  const profileDir = await chromeProfilePath("extension");
20408
20423
  log.log(`[cws] attaching to CWS Chrome at ${endpoint}`);
@@ -29939,7 +29954,7 @@ var SUPABASE = {
29939
29954
  command: "supabase",
29940
29955
  args: ["projects", "list"],
29941
29956
  loginHint: "supabase login",
29942
- signIn: { command: "supabase", args: ["login"] }
29957
+ signIn: { command: "supabase", args: ["login"], needsTerminal: true }
29943
29958
  }
29944
29959
  };
29945
29960
  var NEON = {
@@ -31458,6 +31473,7 @@ var reportFor = (reports, toolName) => reports.find((report) => report.tool ===
31458
31473
  import { existsSync as existsSync16, readFileSync as readFileSync11 } from "fs";
31459
31474
  import { join as join62 } from "path";
31460
31475
  import process33 from "process";
31476
+ var UPDATE_KIT_HINT = 'Ask your AI helper: "Update my kit."';
31461
31477
  var readManifest2 = (cwd) => {
31462
31478
  const path = join62(cwd, "platform-skills.manifest.json");
31463
31479
  if (!existsSync16(path)) {
@@ -31517,19 +31533,17 @@ var formatPlatformSkillsReport = (report) => {
31517
31533
  const count = Object.keys(lock.skills).length;
31518
31534
  lines.push(`\u2713 platform skills lock - ${count} pinned skill(s) in skills-lock.json.`);
31519
31535
  } catch {
31520
- lines.push("\u2192 platform skills lock - skills-lock.json unreadable.");
31536
+ lines.push(`\u2192 platform skills lock - skills-lock.json unreadable. ${UPDATE_KIT_HINT}`);
31521
31537
  }
31522
31538
  } else {
31523
- lines.push("\u2192 platform skills lock - skills-lock.json missing (run pin-platform-skills).");
31539
+ lines.push(`\u2192 platform skills lock - skills-lock.json missing. ${UPDATE_KIT_HINT}`);
31524
31540
  }
31525
31541
  if (report.ok) {
31526
31542
  const scope = report.lockCount > 0 ? `all ${report.lockCount} locked skill(s)` : "all explicit manifest skills";
31527
31543
  lines.push(`\u2713 platform skills - ${scope} are present.`);
31528
31544
  return lines;
31529
31545
  }
31530
- lines.push(
31531
- `\u2192 platform skills - missing: ${report.missing.join(", ")}. Ask your agent to refresh platform skills (update-kit) or run the pin script.`
31532
- );
31546
+ lines.push(`\u2192 platform skills - missing: ${report.missing.join(", ")}. ${UPDATE_KIT_HINT}`);
31533
31547
  return lines;
31534
31548
  };
31535
31549
 
@@ -32631,7 +32645,7 @@ import { homedir as homedir15 } from "os";
32631
32645
  import { join as join72 } from "path";
32632
32646
  import process39 from "process";
32633
32647
  import { confirm as confirm3, isCancel as isCancel5 } from "@clack/prompts";
32634
- import { Effect as Effect45, Schema as Schema31 } from "effect";
32648
+ import { Effect as Effect46, Schema as Schema32 } from "effect";
32635
32649
 
32636
32650
  // src/global/agentGuidance.ts
32637
32651
  import { constants as constants3, existsSync as existsSync20 } from "fs";
@@ -33058,6 +33072,9 @@ var formatEntitlementBlock = (entitlement) => {
33058
33072
  return ["", ...accountLines, ...helpLines, ""];
33059
33073
  };
33060
33074
 
33075
+ // src/global/installCodexMcp.ts
33076
+ import { Data as Data14, Effect as Effect45, Schema as Schema31 } from "effect";
33077
+
33061
33078
  // src/global/installGlobalMcp.ts
33062
33079
  import process38 from "process";
33063
33080
  var ZERO_CONFIG = [
@@ -33206,6 +33223,114 @@ var installGlobalMcp = async (deps = defaultDeps4) => {
33206
33223
  return { enabled, alreadyPresent, refreshed, needsKey, failed, claudeMissing: false };
33207
33224
  };
33208
33225
 
33226
+ // src/global/installCodexMcp.ts
33227
+ var CodexListingError = class extends Data14.TaggedError("CodexListingError") {
33228
+ };
33229
+ var CodexMcpRegistration = Schema31.Struct({
33230
+ name: Schema31.String,
33231
+ transport: Schema31.Struct({
33232
+ command: Schema31.optionalWith(Schema31.String, { default: () => "" }),
33233
+ args: Schema31.optionalWith(Schema31.Array(Schema31.String), { default: () => [] })
33234
+ })
33235
+ });
33236
+ var decodeCodexMcpListing = Schema31.decodeUnknown(
33237
+ Schema31.parseJson(Schema31.Array(CodexMcpRegistration))
33238
+ );
33239
+ var CODEX_MCP_SERVERS = GLOBAL_MCP_SERVERS.filter(
33240
+ (mcpServer) => mcpServer.transport === "stdio"
33241
+ );
33242
+ var codexMcpAddArguments = (mcpServer, environment) => {
33243
+ const envFlags = (mcpServer.envKeys || []).flatMap((key) => [
33244
+ "--env",
33245
+ `${key}=${environment[key] || ""}`
33246
+ ]);
33247
+ return ["mcp", "add", ...envFlags, mcpServer.name, "--", ...mcpServer.command];
33248
+ };
33249
+ var codexMcpOwner = (mcpServer, registrations) => {
33250
+ const registration = registrations.find((registered) => registered.name === mcpServer.name);
33251
+ if (registration === void 0) {
33252
+ return "absent";
33253
+ }
33254
+ const registeredCommand = [registration.transport.command, ...registration.transport.args].join(
33255
+ " "
33256
+ );
33257
+ const vybekiitRegistration = mcpServer.name === "vybekiit" || registeredCommand === mcpServer.command.join(" ");
33258
+ return vybekiitRegistration ? "vybekiit" : "user";
33259
+ };
33260
+ var codexInstalled = (codex) => Effect45.promise(() => codex(["--version"])).pipe(
33261
+ Effect45.map((codexVersion) => codexVersion.code !== MISSING_COMMAND_CODE)
33262
+ );
33263
+ var listCodexMcpRegistrations = (codex) => Effect45.promise(() => codex(["mcp", "list", "--json"])).pipe(
33264
+ Effect45.filterOrFail(
33265
+ (codexListing) => codexListing.code === 0,
33266
+ (codexListing) => new CodexListingError({
33267
+ message: `Codex could not list its tool connections. ${codexListing.stderr.trim()}`
33268
+ })
33269
+ ),
33270
+ Effect45.flatMap(
33271
+ (codexListing) => decodeCodexMcpListing(codexListing.stdout).pipe(
33272
+ Effect45.mapError(
33273
+ (cause) => new CodexListingError({
33274
+ message: "Codex listed its tool connections in a shape VybeKiit does not know.",
33275
+ cause
33276
+ })
33277
+ )
33278
+ )
33279
+ )
33280
+ );
33281
+ var codexServerOutcome = (codexSetup, mcpServer, registrations) => {
33282
+ if (!hasKeys(mcpServer, codexSetup.environment)) {
33283
+ return Effect45.succeed({ name: mcpServer.name, outcome: "needsKey" });
33284
+ }
33285
+ const registered = codexMcpOwner(mcpServer, registrations) !== "absent";
33286
+ const refreshDue = registered && codexSetup.forceRefresh && isZeroConfig(mcpServer);
33287
+ if (registered && !refreshDue) {
33288
+ return Effect45.succeed({ name: mcpServer.name, outcome: "alreadyPresent" });
33289
+ }
33290
+ const addedOutcome = refreshDue ? "refreshed" : "enabled";
33291
+ const addArguments = codexMcpAddArguments(mcpServer, codexSetup.environment);
33292
+ return Effect45.promise(() => codexSetup.codex(addArguments)).pipe(
33293
+ Effect45.map(
33294
+ (codexAdd) => ({
33295
+ name: mcpServer.name,
33296
+ outcome: codexAdd.code === 0 ? addedOutcome : "failed"
33297
+ })
33298
+ )
33299
+ );
33300
+ };
33301
+ var serverNamesWith = (serverOutcomes, outcome) => serverOutcomes.filter((serverOutcome) => serverOutcome.outcome === outcome).map((serverOutcome) => serverOutcome.name);
33302
+ var codexInstallation = (serverOutcomes, codexMissing) => ({
33303
+ enabled: serverNamesWith(serverOutcomes, "enabled"),
33304
+ alreadyPresent: serverNamesWith(serverOutcomes, "alreadyPresent"),
33305
+ refreshed: serverNamesWith(serverOutcomes, "refreshed"),
33306
+ needsKey: serverNamesWith(serverOutcomes, "needsKey"),
33307
+ failed: serverNamesWith(serverOutcomes, "failed"),
33308
+ codexMissing
33309
+ });
33310
+ var installCodexMcp = (codexSetup) => Effect45.gen(function* () {
33311
+ if (!(yield* codexInstalled(codexSetup.codex))) {
33312
+ return codexInstallation([], true);
33313
+ }
33314
+ const unlistedOutcomes = CODEX_MCP_SERVERS.map(
33315
+ (mcpServer) => ({
33316
+ name: mcpServer.name,
33317
+ outcome: hasKeys(mcpServer, codexSetup.environment) ? "failed" : "needsKey"
33318
+ })
33319
+ );
33320
+ const serverOutcomes = yield* listCodexMcpRegistrations(codexSetup.codex).pipe(
33321
+ Effect45.flatMap(
33322
+ (registrations) => Effect45.all(
33323
+ CODEX_MCP_SERVERS.map(
33324
+ (mcpServer) => codexServerOutcome(codexSetup, mcpServer, registrations)
33325
+ ),
33326
+ { concurrency: 1 }
33327
+ )
33328
+ ),
33329
+ Effect45.catchTag("CodexListingError", () => Effect45.succeed(unlistedOutcomes))
33330
+ );
33331
+ return codexInstallation(serverOutcomes, false);
33332
+ });
33333
+
33209
33334
  // src/global/installGlobalSkills.ts
33210
33335
  import { cp as cp5, mkdir as mkdir22, readdir as readdir14, readFile as readFile37, rm as rm5, stat as stat3, writeFile as writeFile27 } from "fs/promises";
33211
33336
  import { join as join71 } from "path";
@@ -33274,7 +33399,18 @@ var installGlobalSkills = async (paths, sourceDir = paths.bundledSkillsDir) => {
33274
33399
 
33275
33400
  // src/global/runGlobalInstall.ts
33276
33401
  var shouldRunSessionOneOnInstall = (args, isFirstInstall) => isFirstInstall || args.includes("--session-one");
33277
- var globalSetupComplete = (managedFilesReady, mcpInstallation) => managedFilesReady && (mcpInstallation.claudeMissing || isVybekiitMcpReady(mcpInstallation));
33402
+ var globalSetupComplete = (managedFilesReady, mcpInstallation, codexMcpInstallation) => managedFilesReady && (mcpInstallation.claudeMissing || isVybekiitMcpReady(mcpInstallation)) && (codexMcpInstallation.codexMissing || isVybekiitMcpReady(codexMcpInstallation));
33403
+ var codexMcpLines = (codexMcp) => {
33404
+ if (codexMcp.codexMissing) {
33405
+ return [];
33406
+ }
33407
+ const enabledLabel = codexMcp.enabled.length > 0 ? codexMcp.enabled.join(", ") : "none newly added";
33408
+ return [
33409
+ ` \u2022 Codex ${enabledLabel} (the same tool connections in Codex)`,
33410
+ ...codexMcp.refreshed.length > 0 ? [` refreshed: ${codexMcp.refreshed.join(", ")}`] : [],
33411
+ ...codexMcp.failed.length > 0 ? [` failed to register: ${codexMcp.failed.join(", ")}`] : []
33412
+ ];
33413
+ };
33278
33414
  var formatGlobalInstallSummary = (summary) => {
33279
33415
  const isUpdate = summary.previousVersion !== null && summary.previousVersion !== summary.version;
33280
33416
  const isRerun = summary.previousVersion !== null && summary.previousVersion === summary.version;
@@ -33326,6 +33462,7 @@ var formatGlobalInstallSummary = (summary) => {
33326
33462
  lines.push(` failed to register: ${summary.mcpFailed.join(", ")}`);
33327
33463
  }
33328
33464
  }
33465
+ lines.push(...codexMcpLines(summary.codexMcp));
33329
33466
  if (skillsEmpty) {
33330
33467
  lines.push("");
33331
33468
  } else {
@@ -33371,7 +33508,7 @@ var runGlobalInstall = async (args, gate = checkEntitlement) => {
33371
33508
  }
33372
33509
  }
33373
33510
  const paths = globalInstallPaths();
33374
- const agentSettings = Schema31.decodeUnknownSync(AgentInstallationSettings)({
33511
+ const agentSettings = Schema32.decodeUnknownSync(AgentInstallationSettings)({
33375
33512
  homeDirectory: homedir15(),
33376
33513
  claudeDirectory: paths.configDir,
33377
33514
  codexDirectory: process39.env.CODEX_HOME || join72(homedir15(), ".codex"),
@@ -33392,8 +33529,11 @@ var runGlobalInstall = async (args, gate = checkEntitlement) => {
33392
33529
  env: process39.env,
33393
33530
  forceRefresh: isRerun
33394
33531
  });
33532
+ const codexMcp = await Effect46.runPromise(
33533
+ installCodexMcp({ codex: makeExec("codex"), environment: process39.env, forceRefresh: isRerun })
33534
+ );
33395
33535
  const awareness = await installAwareness(paths);
33396
- const agentInstallations = await Effect45.runPromise(
33536
+ const agentInstallations = await Effect46.runPromise(
33397
33537
  installAgentGuidance(agentSettings, detectedAgents, paths.skillsDir, skills.installed, version)
33398
33538
  );
33399
33539
  process39.stdout.write(
@@ -33421,13 +33561,14 @@ var runGlobalInstall = async (args, gate = checkEntitlement) => {
33421
33561
  mcpNeedsKey: mcp.needsKey,
33422
33562
  mcpFailed: mcp.failed,
33423
33563
  claudeMissing: mcp.claudeMissing,
33564
+ codexMcp,
33424
33565
  commandInstalled: awareness.commandWritten,
33425
33566
  version,
33426
33567
  previousVersion: previous?.version ?? null
33427
33568
  };
33428
- if (!globalSetupComplete(postStatus.skillCount > 0 && usableAgent, mcp)) {
33569
+ if (!globalSetupComplete(postStatus.skillCount > 0 && usableAgent, mcp, codexMcp)) {
33429
33570
  process39.stderr.write(
33430
- "VybeKiit setup is incomplete: the managed files or an available Claude Code connection could not be prepared.\n"
33571
+ "VybeKiit setup is incomplete: the managed files or the VybeKiit connection in Claude Code or Codex could not be prepared.\n"
33431
33572
  );
33432
33573
  return 1;
33433
33574
  }
@@ -33569,6 +33710,10 @@ var playWelcomeBanner = async (options = {}) => {
33569
33710
  };
33570
33711
 
33571
33712
  // src/commands/setupAuthentication.ts
33713
+ var DESKTOP_MACHINE = {
33714
+ canOpenBrowser: canOpenDesktopBrowser,
33715
+ hasTerminal: isInteractive
33716
+ };
33572
33717
  var AUTH_PROBE_TIMEOUT_MILLISECONDS = 6e4;
33573
33718
  var defaultSetupCommandRunner = (command, args, interactive) => runProcess(
33574
33719
  command,
@@ -33576,19 +33721,26 @@ var defaultSetupCommandRunner = (command, args, interactive) => runProcess(
33576
33721
  interactive ? { stdio: "inherit" } : { timeout: AUTH_PROBE_TIMEOUT_MILLISECONDS }
33577
33722
  );
33578
33723
  var needsSignIn = (tool, loginHint) => ({
33579
- connected: false,
33724
+ status: "needsSignIn",
33580
33725
  line: `\u2717 ${tool.name} needs sign-in. Run: ${loginHint}`
33581
33726
  });
33582
- var connectTool = async (tool, run, canOpenBrowser) => {
33727
+ var connectTool = async (tool, run, machine) => {
33583
33728
  const { auth } = tool;
33584
33729
  if (auth === void 0) {
33585
- return { connected: true, line: `\u2713 ${tool.name} is ready.` };
33730
+ return { status: "connected", line: `\u2713 ${tool.name} is ready.` };
33586
33731
  }
33587
33732
  const existingSignIn = await run(auth.command, auth.args, false);
33588
33733
  if (isSignedIn2(auth, existingSignIn)) {
33589
- return { connected: true, line: `\u2713 ${tool.name} reused your existing sign-in.` };
33734
+ return { status: "connected", line: `\u2713 ${tool.name} reused your existing sign-in.` };
33590
33735
  }
33591
- if (auth.signIn === void 0 || !canOpenBrowser()) {
33736
+ const signInWaitsForTerminal = auth.signIn?.needsTerminal === true && !machine.hasTerminal();
33737
+ if (signInWaitsForTerminal) {
33738
+ return {
33739
+ status: "later",
33740
+ line: `\u2192 ${tool.name} sign-in waits until your app needs it, because it asks for a code typed in a terminal. Then run: ${auth.loginHint}`
33741
+ };
33742
+ }
33743
+ if (auth.signIn === void 0 || !machine.canOpenBrowser()) {
33592
33744
  return needsSignIn(tool, auth.loginHint);
33593
33745
  }
33594
33746
  process.stdout.write(`
@@ -33599,22 +33751,22 @@ Opening the ${tool.name} sign-in page in your browser...
33599
33751
  return needsSignIn(tool, auth.loginHint);
33600
33752
  }
33601
33753
  const verifiedSignIn = await run(auth.command, auth.args, false);
33602
- return isSignedIn2(auth, verifiedSignIn) ? { connected: true, line: `\u2713 ${tool.name} sign-in verified.` } : needsSignIn(tool, auth.loginHint);
33754
+ return isSignedIn2(auth, verifiedSignIn) ? { status: "connected", line: `\u2713 ${tool.name} sign-in verified.` } : needsSignIn(tool, auth.loginHint);
33603
33755
  };
33604
- var connectSetupServices = async (preferences, withoutGithub, run = defaultSetupCommandRunner, canOpenBrowser = canOpenDesktopBrowser) => {
33756
+ var connectSetupServices = async (preferences, withoutGithub, run = defaultSetupCommandRunner, machine = DESKTOP_MACHINE) => {
33605
33757
  const selectedTools = selectToolchain(setupEnvironment(preferences), {
33606
33758
  wantsGoogleAuth: preferences.googleSignIn,
33607
33759
  withoutGithub
33608
33760
  });
33609
33761
  const attempts = await selectedTools.reduce(async (earlierAttempts, tool) => {
33610
33762
  const finishedAttempts = await earlierAttempts;
33611
- const connection = await connectTool(tool, run, canOpenBrowser);
33763
+ const connection = await connectTool(tool, run, machine);
33612
33764
  return [...finishedAttempts, { tool, connection }];
33613
33765
  }, Promise.resolve([]));
33614
33766
  return {
33615
- ok: attempts.every(({ connection }) => connection.connected),
33616
- connected: attempts.filter(({ connection }) => connection.connected).map(({ tool }) => tool.name),
33617
- needsAttention: attempts.filter(({ connection }) => !connection.connected).map(({ tool }) => tool.name),
33767
+ ok: attempts.every(({ connection }) => connection.status !== "needsSignIn"),
33768
+ connected: attempts.filter(({ connection }) => connection.status === "connected").map(({ tool }) => tool.name),
33769
+ needsAttention: attempts.filter(({ connection }) => connection.status === "needsSignIn").map(({ tool }) => tool.name),
33618
33770
  lines: attempts.map(({ connection }) => connection.line)
33619
33771
  };
33620
33772
  };
@@ -33977,7 +34129,7 @@ import { confirm as confirm5, isCancel as isCancel7 } from "@clack/prompts";
33977
34129
  // src/lib/kitUpdateInspection.ts
33978
34130
  import { readFile as readFile39 } from "fs/promises";
33979
34131
  import { join as join75 } from "path";
33980
- import { Schema as Schema32 } from "effect";
34132
+ import { Schema as Schema33 } from "effect";
33981
34133
  var WORKSPACE_SUPPORT_PATHS = [
33982
34134
  "tsconfig.base.json",
33983
34135
  "tsup.base.ts",
@@ -33986,10 +34138,10 @@ var WORKSPACE_SUPPORT_PATHS = [
33986
34138
  "scripts/lib/tsupWorkspaceAliases.d.mts",
33987
34139
  "scripts/lib/repoRoot.mjs"
33988
34140
  ];
33989
- var KitSourcePackage = Schema32.Struct({ version: Schema32.String });
34141
+ var KitSourcePackage = Schema33.Struct({ version: Schema33.String });
33990
34142
  var packageVersion = async (packagePath) => {
33991
34143
  const packageText = await readFile39(packagePath, "utf8");
33992
- const kitPackage = await Schema32.decodeUnknownPromise(KitSourcePackage)(JSON.parse(packageText));
34144
+ const kitPackage = await Schema33.decodeUnknownPromise(KitSourcePackage)(JSON.parse(packageText));
33993
34145
  return kitPackage.version;
33994
34146
  };
33995
34147
  var packageRootFromManifestPath = (workspacePath) => {
@@ -34174,8 +34326,21 @@ var restoreBuyerPaths = async (projectRoot, backupRoot, buyerPaths) => {
34174
34326
  })
34175
34327
  );
34176
34328
  };
34329
+ var changedHookSettingsFor = (inspection) => AGENT_HOOK_SETTINGS_FILES.filter(
34330
+ ([settingsFolder, settingsFile]) => inspection.changedMaintainedPaths.includes(
34331
+ `templates/${inspection.manifest.surface}/${settingsFolder}/${settingsFile}`
34332
+ )
34333
+ );
34177
34334
  var applyVerifiedPreview = async (projectRoot, previewRoot, backupRoot, inspection) => {
34178
- const protectedPaths = [...inspection.changedMaintainedPaths, KIT_WORKSPACE_MANIFEST_PATH];
34335
+ const changedHookSettings = changedHookSettingsFor(inspection);
34336
+ const workspaceHookSettingsPaths = changedHookSettings.map(
34337
+ ([settingsFolder, settingsFile]) => `${settingsFolder}/${settingsFile}`
34338
+ );
34339
+ const protectedPaths = [
34340
+ ...inspection.changedMaintainedPaths,
34341
+ KIT_WORKSPACE_MANIFEST_PATH,
34342
+ ...workspaceHookSettingsPaths
34343
+ ];
34179
34344
  await rm6(backupRoot, { recursive: true, force: true });
34180
34345
  await mkdir23(backupRoot, { recursive: true });
34181
34346
  const buyerPaths = await Promise.all(
@@ -34190,6 +34355,11 @@ var applyVerifiedPreview = async (projectRoot, previewRoot, backupRoot, inspecti
34190
34355
  )
34191
34356
  );
34192
34357
  await overlayMaintainedPaths(previewRoot, projectRoot, inspection.changedMaintainedPaths).then(async () => {
34358
+ await Promise.all(
34359
+ changedHookSettings.map(
34360
+ (settingsPath) => writeWorkspaceHookSettings(projectRoot, inspection.manifest.surface, settingsPath)
34361
+ )
34362
+ );
34193
34363
  await writeKitWorkspaceManifest({
34194
34364
  projectRoot,
34195
34365
  kitVersion: inspection.plan.targetVersion,
@@ -34424,11 +34594,12 @@ import { homedir as homedir17 } from "os";
34424
34594
  import { join as join77, resolve as resolve24 } from "path";
34425
34595
  import process46 from "process";
34426
34596
  import { confirm as confirm6, isCancel as isCancel8 } from "@clack/prompts";
34427
- import { Cause, Data as Data14, Effect as Effect46, Either as Either13, Exit, Option as Option4, Schema as Schema33 } from "effect";
34428
- var GlobalUninstallError = class extends Data14.TaggedError("GlobalUninstallError") {
34597
+ import { Cause, Data as Data15, Effect as Effect47, Either as Either13, Exit, Option as Option4, Schema as Schema34 } from "effect";
34598
+ var GlobalUninstallError = class extends Data15.TaggedError("GlobalUninstallError") {
34429
34599
  };
34430
34600
  var REMOVAL_GROUPS = {
34431
34601
  mcp: "Claude Code tool connections",
34602
+ codexMcp: "Codex tool connections",
34432
34603
  skillLinks: "Skill links for your other coding assistants",
34433
34604
  skills: "Skills",
34434
34605
  instructions: "VybeKiit instructions in your coding assistants",
@@ -34445,32 +34616,37 @@ var mcpRemoval = (name) => ({
34445
34616
  group: REMOVAL_GROUPS.mcp,
34446
34617
  name
34447
34618
  });
34619
+ var codexMcpRemoval = (name) => ({
34620
+ kind: "codexMcp",
34621
+ group: REMOVAL_GROUPS.codexMcp,
34622
+ name
34623
+ });
34448
34624
  var uninstallPlan = (removals, keptNotes = [], repairNotes = []) => ({ removals, keptNotes, repairNotes });
34449
34625
  var combinedPlan = (plans) => uninstallPlan(
34450
34626
  plans.flatMap((plan) => plan.removals),
34451
34627
  plans.flatMap((plan) => plan.keptNotes),
34452
34628
  plans.flatMap((plan) => plan.repairNotes)
34453
34629
  );
34454
- var readOptionalText2 = (path) => Effect46.tryPromise({
34630
+ var readOptionalText2 = (path) => Effect47.tryPromise({
34455
34631
  try: async () => existsSync22(path) ? Option4.some(await readFile40(path, "utf8")) : Option4.none(),
34456
34632
  catch: (cause) => new GlobalUninstallError({ message: `Could not read ${path}.`, cause })
34457
34633
  });
34458
- var readDirectoryNames = (directory) => Effect46.tryPromise({
34634
+ var readDirectoryNames = (directory) => Effect47.tryPromise({
34459
34635
  try: async () => existsSync22(directory) ? await readdir16(directory) : [],
34460
34636
  catch: (cause) => new GlobalUninstallError({ message: `Could not read ${directory}.`, cause })
34461
34637
  });
34462
- var planMcpRemovals = (claude) => Effect46.gen(function* () {
34463
- const claudeVersion = yield* Effect46.promise(() => claude(["--version"]));
34638
+ var planMcpRemovals = (claude) => Effect47.gen(function* () {
34639
+ const claudeVersion = yield* Effect47.promise(() => claude(["--version"]));
34464
34640
  if (claudeVersion.code === 127) {
34465
34641
  return uninstallPlan(
34466
34642
  [],
34467
34643
  ["Claude Code tool connections, because Claude Code is not installed."]
34468
34644
  );
34469
34645
  }
34470
- const registrations = yield* Effect46.all(
34646
+ const registrations = yield* Effect47.all(
34471
34647
  GLOBAL_MCP_SERVERS.map(
34472
- (mcpServer) => Effect46.promise(() => claude(["mcp", "get", mcpServer.name])).pipe(
34473
- Effect46.map((registeredServer) => ({
34648
+ (mcpServer) => Effect47.promise(() => claude(["mcp", "get", mcpServer.name])).pipe(
34649
+ Effect47.map((registeredServer) => ({
34474
34650
  name: mcpServer.name,
34475
34651
  owner: registeredServer.code === 0 ? mcpRegistrationOwner(mcpServer, registeredServer.stdout) : "absent"
34476
34652
  }))
@@ -34483,11 +34659,34 @@ var planMcpRemovals = (claude) => Effect46.gen(function* () {
34483
34659
  registrations.filter((registration) => registration.owner === "user").map((registration) => `Your own ${registration.name} tool connection in Claude Code.`)
34484
34660
  );
34485
34661
  });
34486
- var planSkillLinkRemovals = (skillLinksDirectory, claudeSkillsDirectory, managedSkills) => Effect46.gen(function* () {
34662
+ var planCodexMcpRemovals = (codex) => Effect47.gen(function* () {
34663
+ if (!(yield* codexInstalled(codex))) {
34664
+ return uninstallPlan([]);
34665
+ }
34666
+ const registrations = yield* Effect47.either(listCodexMcpRegistrations(codex));
34667
+ if (Either13.isLeft(registrations)) {
34668
+ return uninstallPlan(
34669
+ [],
34670
+ [],
34671
+ [
34672
+ `${registrations.left.message} Run \`codex mcp list\` and remove the VybeKiit ones with \`codex mcp remove <name>\`.`
34673
+ ]
34674
+ );
34675
+ }
34676
+ const owners = CODEX_MCP_SERVERS.map((mcpServer) => ({
34677
+ name: mcpServer.name,
34678
+ owner: codexMcpOwner(mcpServer, registrations.right)
34679
+ }));
34680
+ return uninstallPlan(
34681
+ owners.filter((registration) => registration.owner === "vybekiit").map((registration) => codexMcpRemoval(registration.name)),
34682
+ owners.filter((registration) => registration.owner === "user").map((registration) => `Your own ${registration.name} tool connection in Codex.`)
34683
+ );
34684
+ });
34685
+ var planSkillLinkRemovals = (skillLinksDirectory, claudeSkillsDirectory, managedSkills) => Effect47.gen(function* () {
34487
34686
  const linkedSkillNames = yield* readDirectoryNames(skillLinksDirectory);
34488
- const managedLinks = yield* Effect46.all(
34687
+ const managedLinks = yield* Effect47.all(
34489
34688
  linkedSkillNames.filter((skillName) => managedSkills.includes(skillName)).map(
34490
- (skillName) => Effect46.tryPromise({
34689
+ (skillName) => Effect47.tryPromise({
34491
34690
  try: async () => {
34492
34691
  const skillLink = join77(skillLinksDirectory, skillName);
34493
34692
  if (!(await lstat5(skillLink)).isSymbolicLink()) {
@@ -34508,13 +34707,13 @@ var planSkillLinkRemovals = (skillLinksDirectory, claudeSkillsDirectory, managed
34508
34707
  managedLinks.flatMap(Option4.toArray).map((skillLink) => pathRemoval(REMOVAL_GROUPS.skillLinks, skillLink))
34509
34708
  );
34510
34709
  });
34511
- var planInstructionRemoval = (instructionPath) => Effect46.gen(function* () {
34710
+ var planInstructionRemoval = (instructionPath) => Effect47.gen(function* () {
34512
34711
  const installedInstruction = yield* readOptionalText2(instructionPath);
34513
34712
  if (Option4.isNone(installedInstruction)) {
34514
34713
  return uninstallPlan([]);
34515
34714
  }
34516
- const userInstruction = yield* Effect46.either(
34517
- Effect46.try(() => removeAgentInstruction(installedInstruction.value))
34715
+ const userInstruction = yield* Effect47.either(
34716
+ Effect47.try(() => removeAgentInstruction(installedInstruction.value))
34518
34717
  );
34519
34718
  if (Either13.isLeft(userInstruction)) {
34520
34719
  return uninstallPlan(
@@ -34548,7 +34747,7 @@ var planInstructionRemoval = (instructionPath) => Effect46.gen(function* () {
34548
34747
  pathRemoval(REMOVAL_GROUPS.instructionBackups, backupPath)
34549
34748
  ]);
34550
34749
  });
34551
- var planStatusLineRemoval = (settingsFile) => Effect46.gen(function* () {
34750
+ var planStatusLineRemoval = (settingsFile) => Effect47.gen(function* () {
34552
34751
  const claudeSettingsText = yield* readOptionalText2(settingsFile);
34553
34752
  if (Option4.isNone(claudeSettingsText)) {
34554
34753
  return uninstallPlan([]);
@@ -34573,7 +34772,7 @@ var planStatusLineRemoval = (settingsFile) => Effect46.gen(function* () {
34573
34772
  }
34574
34773
  return uninstallPlan([]);
34575
34774
  });
34576
- var planGuideRemoval = (guideDirectory) => Effect46.gen(function* () {
34775
+ var planGuideRemoval = (guideDirectory) => Effect47.gen(function* () {
34577
34776
  const guideEntries = yield* readDirectoryNames(guideDirectory);
34578
34777
  const otherEntries = guideEntries.filter((fileName) => !GUIDE_FILES.includes(fileName));
34579
34778
  const guideRemovals = guideEntries.filter((fileName) => GUIDE_FILES.includes(fileName)).map((fileName) => pathRemoval(REMOVAL_GROUPS.guide, join77(guideDirectory, fileName)));
@@ -34590,25 +34789,26 @@ var planGuideRemoval = (guideDirectory) => Effect46.gen(function* () {
34590
34789
  { kind: "emptyDirectory", group: REMOVAL_GROUPS.guide, path: guideDirectory }
34591
34790
  ]);
34592
34791
  });
34593
- var planInstallStampRemoval = (claudeDirectory) => Effect46.gen(function* () {
34594
- const previousSetup = yield* Effect46.promise(() => readInstallState(claudeDirectory));
34792
+ var planInstallStampRemoval = (claudeDirectory) => Effect47.gen(function* () {
34793
+ const previousSetup = yield* Effect47.promise(() => readInstallState(claudeDirectory));
34595
34794
  const installStampPath = installStatePath(claudeDirectory);
34596
34795
  const firstAppPath2 = previousSetup?.firstAppPath ?? "";
34597
34796
  const appNotes = firstAppPath2 === "" ? [] : [`Your app at ${firstAppPath2}. Delete that folder yourself if you no longer want it.`];
34598
34797
  const installStampRemovals = existsSync22(installStampPath) ? [pathRemoval(REMOVAL_GROUPS.installStamp, installStampPath)] : [];
34599
34798
  return uninstallPlan(installStampRemovals, appNotes);
34600
34799
  });
34601
- var planGlobalUninstall = (settings, claude) => Effect46.gen(function* () {
34800
+ var planGlobalUninstall = (settings, assistantCommands) => Effect47.gen(function* () {
34602
34801
  const paths = globalInstallPaths(settings.claudeDirectory);
34603
- const managedSkills = yield* Effect46.promise(() => listManagedSkillNames(paths.skillsDir));
34802
+ const managedSkills = yield* Effect47.promise(() => listManagedSkillNames(paths.skillsDir));
34604
34803
  const commandPath = join77(paths.commandsDir, "vybekiit.md");
34605
- const mcpPlan = yield* planMcpRemovals(claude);
34606
- const skillLinkPlans = yield* Effect46.all(
34804
+ const mcpPlan = yield* planMcpRemovals(assistantCommands.claude);
34805
+ const codexMcpPlan = yield* planCodexMcpRemovals(assistantCommands.codex);
34806
+ const skillLinkPlans = yield* Effect47.all(
34607
34807
  agentSkillLinkDirectories(settings).map(
34608
34808
  (directory) => planSkillLinkRemovals(directory, paths.skillsDir, managedSkills)
34609
34809
  )
34610
34810
  );
34611
- const instructionPlans = yield* Effect46.all(
34811
+ const instructionPlans = yield* Effect47.all(
34612
34812
  agentInstructionPaths(settings).map(planInstructionRemoval)
34613
34813
  );
34614
34814
  const statusLinePlan = yield* planStatusLineRemoval(paths.settingsFile);
@@ -34616,6 +34816,7 @@ var planGlobalUninstall = (settings, claude) => Effect46.gen(function* () {
34616
34816
  const installStampPlan = yield* planInstallStampRemoval(paths.configDir);
34617
34817
  return combinedPlan([
34618
34818
  mcpPlan,
34819
+ codexMcpPlan,
34619
34820
  ...skillLinkPlans,
34620
34821
  uninstallPlan(
34621
34822
  managedSkills.map(
@@ -34631,11 +34832,23 @@ var planGlobalUninstall = (settings, claude) => Effect46.gen(function* () {
34631
34832
  installStampPlan
34632
34833
  ]);
34633
34834
  });
34634
- var applyRemoval = (removal, claude) => {
34835
+ var applyRemoval = (removal, assistantCommands) => {
34836
+ if (removal.kind === "codexMcp") {
34837
+ return Effect47.promise(() => assistantCommands.codex(["mcp", "remove", removal.name])).pipe(
34838
+ Effect47.flatMap(
34839
+ (codexRemoval) => codexRemoval.code === 0 ? Effect47.void : Effect47.fail(
34840
+ new GlobalUninstallError({
34841
+ message: `Could not remove the ${removal.name} tool connection from Codex.`
34842
+ })
34843
+ )
34844
+ )
34845
+ );
34846
+ }
34635
34847
  if (removal.kind === "mcp") {
34636
- return Effect46.promise(() => claude(["mcp", "remove", "-s", "user", removal.name])).pipe(
34637
- Effect46.flatMap(
34638
- (mcpRemoval2) => mcpRemoval2.code === 0 ? Effect46.void : Effect46.fail(
34848
+ const claudeRemoval = ["mcp", "remove", "-s", "user", removal.name];
34849
+ return Effect47.promise(() => assistantCommands.claude(claudeRemoval)).pipe(
34850
+ Effect47.flatMap(
34851
+ (mcpRemoval2) => mcpRemoval2.code === 0 ? Effect47.void : Effect47.fail(
34639
34852
  new GlobalUninstallError({
34640
34853
  message: `Could not remove the ${removal.name} tool connection from Claude Code.`
34641
34854
  })
@@ -34643,7 +34856,7 @@ var applyRemoval = (removal, claude) => {
34643
34856
  )
34644
34857
  );
34645
34858
  }
34646
- return Effect46.tryPromise({
34859
+ return Effect47.tryPromise({
34647
34860
  try: async () => {
34648
34861
  if (removal.kind === "rewrite") {
34649
34862
  await writeFile29(removal.path, removal.remainingText, "utf8");
@@ -34658,33 +34871,35 @@ var applyRemoval = (removal, claude) => {
34658
34871
  catch: (cause) => new GlobalUninstallError({ message: `Could not remove ${removal.path}.`, cause })
34659
34872
  });
34660
34873
  };
34661
- var applyGlobalUninstall = (plan, claude) => Effect46.all(plan.removals.map((removal) => Effect46.either(applyRemoval(removal, claude)))).pipe(
34662
- Effect46.map(
34874
+ var applyGlobalUninstall = (plan, assistantCommands) => Effect47.all(
34875
+ plan.removals.map((removal) => Effect47.either(applyRemoval(removal, assistantCommands)))
34876
+ ).pipe(
34877
+ Effect47.map(
34663
34878
  (attempts) => attempts.flatMap((attempt) => Either13.isLeft(attempt) ? [attempt.left.message] : [])
34664
34879
  )
34665
34880
  );
34666
- var removalSubject = (removal) => removal.kind === "mcp" ? removal.name : removal.path;
34881
+ var removalSubject = (removal) => removal.kind === "mcp" || removal.kind === "codexMcp" ? removal.name : removal.path;
34667
34882
  var formatUninstallPlan = (plan) => [...new Set(plan.removals.map((removal) => removal.group))].map((group) => {
34668
34883
  const subjects = plan.removals.filter((removal) => removal.group === group).map(removalSubject);
34669
34884
  const listedSubjects = subjects.length <= 3 ? `: ${subjects.join(", ")}` : "";
34670
34885
  return ` \u2022 ${group} (${subjects.length})${listedSubjects}`;
34671
34886
  });
34672
34887
  var noteLines = (heading, notes) => notes.length === 0 ? [] : [heading, ...notes.map((note) => ` \u2022 ${note}`)];
34673
- var printLines = (lines) => Effect46.sync(() => process46.stdout.write(`${lines.join("\n")}
34888
+ var printLines = (lines) => Effect47.sync(() => process46.stdout.write(`${lines.join("\n")}
34674
34889
  `));
34675
- var runGlobalUninstall = async (commandArguments, interactiveTerminal, claude = makeExec("claude")) => {
34890
+ var runGlobalUninstall = async (commandArguments, interactiveTerminal, assistantCommands = { claude: makeExec("claude"), codex: makeExec("codex") }) => {
34676
34891
  const confirmedUpfront = commandArguments.includes("--yes") || commandArguments.includes("-y");
34677
34892
  const dryRun = commandArguments.includes("--dry-run");
34678
34893
  const paths = globalInstallPaths();
34679
- const settings = Schema33.decodeUnknownSync(AgentInstallationSettings)({
34894
+ const settings = Schema34.decodeUnknownSync(AgentInstallationSettings)({
34680
34895
  homeDirectory: homedir17(),
34681
34896
  claudeDirectory: paths.configDir,
34682
34897
  codexDirectory: process46.env.CODEX_HOME || join77(homedir17(), ".codex"),
34683
34898
  executablePath: "",
34684
34899
  plainLanguageGuide: paths.bundledLanguageGuide
34685
34900
  });
34686
- const uninstallProgram = Effect46.gen(function* () {
34687
- const plan = yield* planGlobalUninstall(settings, claude);
34901
+ const uninstallProgram = Effect47.gen(function* () {
34902
+ const plan = yield* planGlobalUninstall(settings, assistantCommands);
34688
34903
  const keptLines = noteLines("Not removed:", plan.keptNotes);
34689
34904
  const repairLines = noteLines("Needs your attention:", plan.repairNotes);
34690
34905
  const needsRepair = plan.repairNotes.length > 0;
@@ -34708,7 +34923,7 @@ var runGlobalUninstall = async (commandArguments, interactiveTerminal, claude =
34708
34923
  return 0;
34709
34924
  }
34710
34925
  if (!confirmedUpfront) {
34711
- const removalApproved = yield* Effect46.promise(
34926
+ const removalApproved = yield* Effect47.promise(
34712
34927
  () => confirm6({ message: "Remove VybeKiit from this computer?", initialValue: false })
34713
34928
  );
34714
34929
  if (isCancel8(removalApproved) || removalApproved !== true) {
@@ -34716,7 +34931,7 @@ var runGlobalUninstall = async (commandArguments, interactiveTerminal, claude =
34716
34931
  return 0;
34717
34932
  }
34718
34933
  }
34719
- const failures = yield* applyGlobalUninstall(plan, claude);
34934
+ const failures = yield* applyGlobalUninstall(plan, assistantCommands);
34720
34935
  const headline = failures.length === 0 ? "\u2705 VybeKiit was removed from this computer." : "\u2717 VybeKiit was only partly removed.";
34721
34936
  yield* printLines([
34722
34937
  headline,
@@ -34729,7 +34944,7 @@ var runGlobalUninstall = async (commandArguments, interactiveTerminal, claude =
34729
34944
  ]);
34730
34945
  return failures.length > 0 || needsRepair ? 1 : 0;
34731
34946
  });
34732
- const uninstallExit = await Effect46.runPromiseExit(uninstallProgram);
34947
+ const uninstallExit = await Effect47.runPromiseExit(uninstallProgram);
34733
34948
  if (Exit.isSuccess(uninstallExit)) {
34734
34949
  return uninstallExit.value;
34735
34950
  }