claude-use 11.29.0 → 11.30.0

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/README.md CHANGED
@@ -98,7 +98,7 @@ agent-shim profile set <name> [--category <category>=<bool>]... [--entry <catego
98
98
  agent-shim profile set <name> [--extends <profile>]... [--no-extends] [--description <text> | --no-description] [--json]
99
99
  agent-shim profile set <name> [--[no-]launch-skip-permissions] [--[no-]launch-remote-control] [--[no-]launch-headroom] [--[no-]launch-track-usage]
100
100
  agent-shim profile set <name> [--launch-claude-version <version> | --no-launch-claude-version] [--json] [--json]
101
- agent-shim profile set <name> [--launch-delay <duration> | --no-launch-delay] [--[no-]launch-pause] [--json]
101
+ agent-shim profile set <name> [--launch-delay <duration> | --no-launch-delay] [--[no-]launch-pause] [--[no-]launch-explain] [--json]
102
102
  agent-shim profile set <name> [--launch-provider <provider> | --no-launch-provider] [--json]
103
103
  agent-shim profile list [--json]
104
104
  agent-shim profile show <name> [--json]
@@ -183,6 +183,7 @@ agent-shim run [@<identity>] [launch flags] [claude arguments]
183
183
  # --[no-]skip-permissions --[no-]remote-control --[no-]headroom --[no-]track-usage --[no-]wait
184
184
  # --claude-version <version> run exactly this installed Claude Code version
185
185
  # --delay <duration> wait this long after the launcher's own output before starting claude; --[no-]pause waits for a key press instead
186
+ # --[no-]explain with @pool:<name>, list every member the pick ranked and why, not only the one picked
186
187
  # --native run the real claude with nothing from agent-shim applied; cannot be combined with the flags above
187
188
  claude @<identity> ... # the same, once `agent-shim shim enable` has run
188
189
  ```
package/dist/cli.cjs CHANGED
@@ -27031,7 +27031,9 @@ var init_schema = __esm({
27031
27031
  /** How long the launcher waits after its own output before it starts claude, so that output can be read before Claude Code takes over the terminal (`5s`, `500ms`). Applies only when a terminal is watching. */
27032
27032
  delay: external_exports.string().regex(DURATION_RE, "must be a duration such as 5s or 500ms").optional(),
27033
27033
  /** Whether the launcher waits for a key press after its own output before it starts claude. Takes the place of `delay` when both are set. Applies only when a terminal is watching. */
27034
- pause: external_exports.boolean().optional()
27034
+ pause: external_exports.boolean().optional(),
27035
+ /** Whether the launcher's report, for a launch that picks from a pool, lists every member the pick ranked with why each stands where it does, and not only the member it picked. */
27036
+ explain: external_exports.boolean().optional()
27035
27037
  });
27036
27038
  CREDENTIAL_TARGETS = ["bearer", "apiKey", "oauthToken"];
27037
27039
  PROVIDER_CREDENTIAL_TARGETS = ["bearer", "apiKey"];
@@ -32571,6 +32573,9 @@ function flattenLayers(layers, options) {
32571
32573
  if (layer.launch.pause !== void 0) {
32572
32574
  launch.pause = layer.launch.pause;
32573
32575
  }
32576
+ if (layer.launch.explain !== void 0) {
32577
+ launch.explain = layer.launch.explain;
32578
+ }
32574
32579
  }
32575
32580
  if (layer.entries === void 0) {
32576
32581
  continue;
@@ -34318,7 +34323,7 @@ var init_package = __esm({
34318
34323
  "package.json"() {
34319
34324
  package_default = {
34320
34325
  name: "claude-use",
34321
- version: "11.29.0",
34326
+ version: "11.30.0",
34322
34327
  description: "A profile manager and launcher for Claude Code that lets one person run multiple logins from one machine while controlling what gets shared between them.",
34323
34328
  license: "MIT",
34324
34329
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -63125,7 +63130,8 @@ var init_argv = __esm({
63125
63130
  { flag: "--skip-permissions", key: "skipPermissions" },
63126
63131
  { flag: "--remote-control", key: "remoteControl" },
63127
63132
  { flag: "--wait", key: "wait" },
63128
- { flag: "--pause", key: "pause" }
63133
+ { flag: "--pause", key: "pause" },
63134
+ { flag: "--explain", key: "explain" }
63129
63135
  ];
63130
63136
  LAUNCHER_FLAG_NAMES = [
63131
63137
  ...VALUED_FLAGS,
@@ -63314,6 +63320,7 @@ function resolveLaunchFlags(params) {
63314
63320
  headroom: params.flags?.headroom ?? parseEnvBool("AGENT_SHIM_HEADROOM", params.env.AGENT_SHIM_HEADROOM) ?? params.cascade?.headroom ?? false,
63315
63321
  trackUsage: params.flags?.trackUsage ?? parseEnvBool("AGENT_SHIM_TRACK_USAGE", params.env.AGENT_SHIM_TRACK_USAGE) ?? params.cascade?.trackUsage ?? true,
63316
63322
  pause: params.flags?.pause ?? parseEnvBool("AGENT_SHIM_PAUSE", params.env.AGENT_SHIM_PAUSE) ?? params.cascade?.pause ?? false,
63323
+ explain: params.flags?.explain ?? parseEnvBool("AGENT_SHIM_EXPLAIN", params.env.AGENT_SHIM_EXPLAIN) ?? params.cascade?.explain ?? false,
63317
63324
  delayMs: resolveDelayMs(params)
63318
63325
  };
63319
63326
  }
@@ -63687,6 +63694,18 @@ var init_hold = __esm({
63687
63694
  }
63688
63695
  });
63689
63696
 
63697
+ // src/usage/candidateText.ts
63698
+ function candidateHeading(candidate) {
63699
+ const score = candidate.score === void 0 ? "" : ` score ${candidate.score.toFixed(2)}${candidate.scoreWindow === "fiveHour" ? " by 5h reset" : " by 7d reset"}`;
63700
+ const dry = candidate.feasible ? "" : " (5h would run dry)";
63701
+ return `[${candidate.class}${score}]${dry}`;
63702
+ }
63703
+ var init_candidateText = __esm({
63704
+ "src/usage/candidateText.ts"() {
63705
+ "use strict";
63706
+ }
63707
+ });
63708
+
63690
63709
  // src/launcher/launchReport.ts
63691
63710
  function poolDetail(pool) {
63692
63711
  const [reason] = pool.reasons;
@@ -63695,6 +63714,12 @@ function poolDetail(pool) {
63695
63714
  }
63696
63715
  return reason === void 0 ? {} : { detail: reason };
63697
63716
  }
63717
+ function rankingNotes(ranking, picked) {
63718
+ return ranking.flatMap((candidate, index) => [
63719
+ `${String(index + 1)}. ${candidate.identity} ${candidateHeading(candidate)}${candidate.identity === picked ? " (picked)" : ""}`,
63720
+ ` ${candidate.reasons.join("; ")}`
63721
+ ]);
63722
+ }
63698
63723
  function decisionRows(facts) {
63699
63724
  return [
63700
63725
  { label: "identity", value: facts.identity ?? "(none)", detail: facts.identitySource },
@@ -63702,7 +63727,8 @@ function decisionRows(facts) {
63702
63727
  {
63703
63728
  label: "pool",
63704
63729
  value: facts.pool.name,
63705
- ...poolDetail(facts.pool)
63730
+ ...poolDetail(facts.pool),
63731
+ ...facts.ranking === void 0 ? {} : { notes: rankingNotes(facts.ranking, facts.identity) }
63706
63732
  }
63707
63733
  ],
63708
63734
  ...facts.profile === void 0 ? [] : [{ label: "profile", value: facts.profile.name, detail: facts.profile.source }],
@@ -63737,6 +63763,7 @@ function noteRow(text2) {
63737
63763
  var init_launchReport = __esm({
63738
63764
  "src/launcher/launchReport.ts"() {
63739
63765
  "use strict";
63766
+ init_candidateText();
63740
63767
  }
63741
63768
  });
63742
63769
 
@@ -64991,6 +65018,7 @@ function resolvePoolLaunch(params) {
64991
65018
  identity: pick2.identity,
64992
65019
  explanation: `pool ${poolName}: ${move}${pick2.reasons.slice(0, REASONS_LOGGED).join("; ")}`,
64993
65020
  reasons: pick2.reasons,
65021
+ candidates: graph.ranking.candidates,
64994
65022
  ...movedOff === void 0 ? {} : { movedOff }
64995
65023
  };
64996
65024
  }
@@ -65165,7 +65193,8 @@ function pickFromPool(decided, params, parsedArgv, readOnly) {
65165
65193
  }
65166
65194
  return {
65167
65195
  identityDecision: { ...decided, name: resolution.identity },
65168
- poolPick: { name: decided.pool, reasons: resolution.reasons, ...resolution.movedOff === void 0 ? {} : { movedOff: resolution.movedOff } }
65196
+ poolPick: { name: decided.pool, reasons: resolution.reasons, ...resolution.movedOff === void 0 ? {} : { movedOff: resolution.movedOff } },
65197
+ poolRanking: resolution.candidates
65169
65198
  };
65170
65199
  }
65171
65200
  function decideLaunch(params, readOnly) {
@@ -65192,7 +65221,7 @@ function decideLaunch(params, readOnly) {
65192
65221
  return trimmed === "" ? void 0 : trimmed;
65193
65222
  }
65194
65223
  });
65195
- const { identityDecision, poolPick } = pickFromPool(decidedIdentity, params, parsedArgv, readOnly);
65224
+ const { identityDecision, poolPick, poolRanking } = pickFromPool(decidedIdentity, params, parsedArgv, readOnly);
65196
65225
  const farmIdentity = configDirEscapeHatchApplies ? void 0 : identityDecision.name;
65197
65226
  const farm = farmIdentity === void 0 ? void 0 : params.farm;
65198
65227
  if (!readOnly && farm !== void 0 && farmIdentity !== void 0) {
@@ -65328,6 +65357,7 @@ function decideLaunch(params, readOnly) {
65328
65357
  ...parsedArgv.headroom === void 0 ? {} : { headroom: parsedArgv.headroom },
65329
65358
  ...parsedArgv.trackUsage === void 0 ? {} : { trackUsage: parsedArgv.trackUsage },
65330
65359
  ...parsedArgv.pause === void 0 ? {} : { pause: parsedArgv.pause },
65360
+ ...parsedArgv.explain === void 0 ? {} : { explain: parsedArgv.explain },
65331
65361
  ...parsedArgv.delay === void 0 ? {} : { delay: parsedArgv.delay }
65332
65362
  }
65333
65363
  });
@@ -65364,6 +65394,7 @@ function decideLaunch(params, readOnly) {
65364
65394
  parsedArgv,
65365
65395
  identityDecision,
65366
65396
  poolPick,
65397
+ poolRanking,
65367
65398
  notes,
65368
65399
  configDirEscapeHatch: configDirEscapeHatchApplies,
65369
65400
  farmIdentity,
@@ -65384,12 +65415,13 @@ function prepareLaunch(params) {
65384
65415
  const { paths, proc, log } = params;
65385
65416
  const { env } = proc;
65386
65417
  const decided = decideLaunch(params, false);
65387
- const { identityDecision, configProfileDecision, resolvedProvider, identityCredential, poolPick, notes, flags: resolvedFlags, args: finalArgv, configDirEscapeHatch: configDirEscapeHatchApplies, decision } = decided;
65418
+ const { identityDecision, configProfileDecision, resolvedProvider, identityCredential, poolPick, poolRanking, notes, flags: resolvedFlags, args: finalArgv, configDirEscapeHatch: configDirEscapeHatchApplies, decision } = decided;
65388
65419
  const rows = [
65389
65420
  ...decisionRows({
65390
65421
  identity: identityDecision.name,
65391
65422
  identitySource: identityDecision.source,
65392
65423
  pool: poolPick,
65424
+ ranking: resolvedFlags.explain ? poolRanking : void 0,
65393
65425
  profile: configProfileDecision.name === void 0 ? void 0 : { name: configProfileDecision.name, source: configProfileDecision.source },
65394
65426
  provider: resolvedProvider === void 0 ? void 0 : { name: resolvedProvider.name, credential: `${resolvedProvider.credential.target} from ${describeSource(resolvedProvider.credential.source)}` },
65395
65427
  identityCredential: identityCredential === void 0 ? void 0 : `${identityCredential.target} from ${describeSource(identityCredential.source)}`
@@ -111520,6 +111552,9 @@ function applyProfileChange(paths, name, change) {
111520
111552
  if (change.launchPause !== void 0) {
111521
111553
  launchPatch.pause = change.launchPause;
111522
111554
  }
111555
+ if (change.launchExplain !== void 0) {
111556
+ launchPatch.explain = change.launchExplain;
111557
+ }
111523
111558
  if (Object.keys(launchPatch).length > 0) {
111524
111559
  setProfileLaunchFlags(paths, name, launchPatch);
111525
111560
  touched = true;
@@ -112806,7 +112841,7 @@ function registerProfileCommand(program2, deps) {
112806
112841
  withExamples(
112807
112842
  profile.command("set <name>").description(
112808
112843
  "Update a configuration profile's categories, entries, extends list, description or launch settings. With no options on a terminal, walks through its categories."
112809
- ).option("--category <category=bool>", "Share (true) or hide (false) a whole category (repeatable).", collectBoolPair).option("--entry <path=bool>", "Share (true) or hide (false) one <category>/<path> entry (repeatable).", collectBoolPair).option("--extends <profile>", "Replace the extends list with these profiles (repeatable, in order).", collectRepeated).option("--no-extends", "Clear the extends list.").option("--description <text>", "Replace the description.").option("--no-description", "Clear the description.").option("--launch-skip-permissions", "Launches under this profile skip permission prompts.").option("--no-launch-skip-permissions", "Launches under this profile keep permission prompts.").option("--launch-remote-control", "Launches under this profile enable Remote Control.").option("--no-launch-remote-control", "Launches under this profile leave Remote Control off.").option("--launch-headroom", "Launches under this profile route through headroom.").option("--no-launch-headroom", "Launches under this profile route direct.").option("--launch-track-usage", "Launches under this profile route through the front door so their requests and quota are recorded, with no headroom needed.").option("--no-launch-track-usage", "Launches under this profile are not recorded unless a provider or headroom routes them anyway.").option("--launch-provider <provider>", "Launches under this profile route through this provider.").option("--no-launch-provider", "Clear this profile's provider selection.").option("--launch-claude-version <version>", "Launches under this profile run exactly this installed Claude Code version (such as 2.1.220); a version that is not installed fails the launch.").option("--no-launch-claude-version", "Clear this profile's Claude Code version pin.").option("--launch-delay <duration>", "Launches under this profile wait this long (such as 5s) after the launcher's own output before starting claude, so the output can be read.", parseDurationLiteral).option("--no-launch-delay", "Clear this profile's launch delay.").option("--launch-pause", "Launches under this profile wait for a key press after the launcher's own output before starting claude.").option("--no-launch-pause", "Launches under this profile start claude without waiting for a key press.").option("--json", "Print the result as JSON.").action(async (name, allOptions) => {
112844
+ ).option("--category <category=bool>", "Share (true) or hide (false) a whole category (repeatable).", collectBoolPair).option("--entry <path=bool>", "Share (true) or hide (false) one <category>/<path> entry (repeatable).", collectBoolPair).option("--extends <profile>", "Replace the extends list with these profiles (repeatable, in order).", collectRepeated).option("--no-extends", "Clear the extends list.").option("--description <text>", "Replace the description.").option("--no-description", "Clear the description.").option("--launch-skip-permissions", "Launches under this profile skip permission prompts.").option("--no-launch-skip-permissions", "Launches under this profile keep permission prompts.").option("--launch-remote-control", "Launches under this profile enable Remote Control.").option("--no-launch-remote-control", "Launches under this profile leave Remote Control off.").option("--launch-headroom", "Launches under this profile route through headroom.").option("--no-launch-headroom", "Launches under this profile route direct.").option("--launch-track-usage", "Launches under this profile route through the front door so their requests and quota are recorded, with no headroom needed.").option("--no-launch-track-usage", "Launches under this profile are not recorded unless a provider or headroom routes them anyway.").option("--launch-provider <provider>", "Launches under this profile route through this provider.").option("--no-launch-provider", "Clear this profile's provider selection.").option("--launch-claude-version <version>", "Launches under this profile run exactly this installed Claude Code version (such as 2.1.220); a version that is not installed fails the launch.").option("--no-launch-claude-version", "Clear this profile's Claude Code version pin.").option("--launch-delay <duration>", "Launches under this profile wait this long (such as 5s) after the launcher's own output before starting claude, so the output can be read.", parseDurationLiteral).option("--no-launch-delay", "Clear this profile's launch delay.").option("--launch-pause", "Launches under this profile wait for a key press after the launcher's own output before starting claude.").option("--no-launch-pause", "Launches under this profile start claude without waiting for a key press.").option("--launch-explain", "Launches under this profile that pick from a pool list every member the pick ranked and why, in the launcher's report.").option("--no-launch-explain", "Launches under this profile name only the member a pool pick chose.").option("--json", "Print the result as JSON.").action(async (name, allOptions) => {
112810
112845
  const { json: json2, ...options } = allOptions;
112811
112846
  requireProfileExists(paths, name);
112812
112847
  if (Object.entries(allOptions).every(([key, value2]) => key === "json" || value2 === void 0)) {
@@ -127708,7 +127743,8 @@ var ConfigProfileSetInputSchema = external_exports.strictObject({
127708
127743
  provider: external_exports.union([external_exports.string().min(1), external_exports.literal(false)]).optional(),
127709
127744
  claudeVersion: external_exports.union([external_exports.string().min(1), external_exports.literal(false)]).optional(),
127710
127745
  delay: external_exports.union([external_exports.string().regex(DURATION_RE), external_exports.literal(false)]).optional(),
127711
- pause: external_exports.boolean().optional()
127746
+ pause: external_exports.boolean().optional(),
127747
+ explain: external_exports.boolean().optional()
127712
127748
  }).optional()
127713
127749
  });
127714
127750
  var ConfigProfileSetOutputSchema = storedMutationOutput("profile", "updated", ProfileValueSchema);
@@ -127920,7 +127956,8 @@ function createConfigApiRouter(deps) {
127920
127956
  ...launch?.provider === void 0 ? {} : { launchProvider: launch.provider },
127921
127957
  ...launch?.claudeVersion === void 0 ? {} : { launchClaudeVersion: launch.claudeVersion },
127922
127958
  ...launch?.delay === void 0 ? {} : { launchDelay: launch.delay },
127923
- ...launch?.pause === void 0 ? {} : { launchPause: launch.pause }
127959
+ ...launch?.pause === void 0 ? {} : { launchPause: launch.pause },
127960
+ ...launch?.explain === void 0 ? {} : { launchExplain: launch.explain }
127924
127961
  });
127925
127962
  return { action: "updated", kind: "profile", name: input2.name, value: profileValue(input2.name, paths) };
127926
127963
  })
@@ -128221,6 +128258,7 @@ var LaunchFlagsSchema = external_exports.strictObject({
128221
128258
  headroom: external_exports.boolean(),
128222
128259
  trackUsage: external_exports.boolean(),
128223
128260
  pause: external_exports.boolean(),
128261
+ explain: external_exports.boolean(),
128224
128262
  /** How long the launch waits after its own output before it starts claude, in milliseconds. */
128225
128263
  delayMs: external_exports.number()
128226
128264
  });
@@ -146123,13 +146161,12 @@ init_cliError();
146123
146161
  init_schema();
146124
146162
  init_schema();
146125
146163
  init_realPorts();
146164
+ init_candidateText();
146126
146165
  init_preflight();
146127
146166
  function formatPoolPick(report, nowMs) {
146128
146167
  const head = report.pick === void 0 ? `Pool ${report.pool}: every member is refused right now${report.earliestReturn === void 0 ? "" : `; ${report.earliestReturn.identity} returns at ${report.earliestReturn.at} (in ${formatAge(Date.parse(report.earliestReturn.at) - nowMs)})`}` : `Pool ${report.pool}: a launch from ${report.directory} would run as ${report.pick}`;
146129
146168
  const rows = report.candidates.map((candidate, index) => {
146130
- const score = candidate.score === void 0 ? "" : ` score ${candidate.score.toFixed(2)}${candidate.scoreWindow === "fiveHour" ? " by 5h reset" : " by 7d reset"}`;
146131
- const dry = candidate.feasible ? "" : " (5h would run dry)";
146132
- return ` ${String(index + 1)}. ${candidate.identity} [${candidate.class}${score}]${dry}
146169
+ return ` ${String(index + 1)}. ${candidate.identity} ${candidateHeading(candidate)}
146133
146170
  ${candidate.reasons.join("; ")}`;
146134
146171
  });
146135
146172
  return [head, ...rows, ...report.missing.map((name) => ` (skipped: ${name} is not an identity)`), ...report.stickyProblem === void 0 ? [] : [`Note: ${report.stickyProblem}; the last-pick record was ignored.`]];
@@ -147029,11 +147066,12 @@ Launching:
147029
147066
  --[no-]wait with @pool:<name>, sleep until the earliest member returns when all are refused
147030
147067
  --delay <duration> wait this long (5s, 500ms) after the launcher's own output before starting claude
147031
147068
  --[no-]pause wait for a key press after the launcher's own output before starting claude
147069
+ --[no-]explain with @pool:<name>, list every member the pick ranked and why, not only the one picked
147032
147070
  --native run the real claude with nothing from agent-shim applied (no other launch flag allowed)
147033
147071
 
147034
147072
  Environment:
147035
147073
  AGENT_SHIM_IDENTITY, AGENT_SHIM_CONFIG_PROFILE, AGENT_SHIM_SKIP_PERMISSIONS,
147036
- AGENT_SHIM_REMOTE_CONTROL, AGENT_SHIM_HEADROOM, AGENT_SHIM_TRACK_USAGE, AGENT_SHIM_DELAY, AGENT_SHIM_PAUSE, AGENT_SHIM_ALLOW_AMBIENT_CREDENTIAL,
147074
+ AGENT_SHIM_REMOTE_CONTROL, AGENT_SHIM_HEADROOM, AGENT_SHIM_TRACK_USAGE, AGENT_SHIM_DELAY, AGENT_SHIM_PAUSE, AGENT_SHIM_EXPLAIN, AGENT_SHIM_ALLOW_AMBIENT_CREDENTIAL,
147037
147075
  AGENT_SHIM_CATEGORY_OVERRIDE, AGENT_SHIM_ENTRY_OVERRIDE, AGENT_SHIM_HOME,
147038
147076
  AGENT_SHIM_DEBUG (print stack traces), NO_COLOR. Booleans are true, false, 1 or 0.
147039
147077
 
@@ -147755,6 +147793,7 @@ function otherLaunchFlags(parsed) {
147755
147793
  ...parsed.claudeVersion === void 0 ? [] : ["--claude-version"],
147756
147794
  ...parsed.delay === void 0 ? [] : ["--delay"],
147757
147795
  ...parsed.pause === void 0 ? [] : ["--[no-]pause"],
147796
+ ...parsed.explain === void 0 ? [] : ["--[no-]explain"],
147758
147797
  ...parsed.headroom === void 0 ? [] : ["--[no-]headroom"],
147759
147798
  ...parsed.trackUsage === void 0 ? [] : ["--[no-]track-usage"],
147760
147799
  ...parsed.skipPermissions === void 0 ? [] : ["--[no-]skip-permissions"],
package/dist/index.cjs CHANGED
@@ -289,7 +289,9 @@ var init_schema = __esm({
289
289
  /** How long the launcher waits after its own output before it starts claude, so that output can be read before Claude Code takes over the terminal (`5s`, `500ms`). Applies only when a terminal is watching. */
290
290
  delay: import_zod.z.string().regex(DURATION_RE, "must be a duration such as 5s or 500ms").optional(),
291
291
  /** Whether the launcher waits for a key press after its own output before it starts claude. Takes the place of `delay` when both are set. Applies only when a terminal is watching. */
292
- pause: import_zod.z.boolean().optional()
292
+ pause: import_zod.z.boolean().optional(),
293
+ /** Whether the launcher's report, for a launch that picks from a pool, lists every member the pick ranked with why each stands where it does, and not only the member it picked. */
294
+ explain: import_zod.z.boolean().optional()
293
295
  });
294
296
  CREDENTIAL_TARGETS = ["bearer", "apiKey", "oauthToken"];
295
297
  PROVIDER_CREDENTIAL_TARGETS = ["bearer", "apiKey"];
@@ -1398,6 +1400,9 @@ function flattenLayers(layers, options) {
1398
1400
  if (layer.launch.pause !== void 0) {
1399
1401
  launch.pause = layer.launch.pause;
1400
1402
  }
1403
+ if (layer.launch.explain !== void 0) {
1404
+ launch.explain = layer.launch.explain;
1405
+ }
1401
1406
  }
1402
1407
  if (layer.entries === void 0) {
1403
1408
  continue;
@@ -2978,7 +2983,7 @@ var init_package = __esm({
2978
2983
  "package.json"() {
2979
2984
  package_default = {
2980
2985
  name: "claude-use",
2981
- version: "11.29.0",
2986
+ version: "11.30.0",
2982
2987
  description: "A profile manager and launcher for Claude Code that lets one person run multiple logins from one machine while controlling what gets shared between them.",
2983
2988
  license: "MIT",
2984
2989
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -7578,7 +7583,8 @@ var init_argv = __esm({
7578
7583
  { flag: "--skip-permissions", key: "skipPermissions" },
7579
7584
  { flag: "--remote-control", key: "remoteControl" },
7580
7585
  { flag: "--wait", key: "wait" },
7581
- { flag: "--pause", key: "pause" }
7586
+ { flag: "--pause", key: "pause" },
7587
+ { flag: "--explain", key: "explain" }
7582
7588
  ];
7583
7589
  LAUNCHER_FLAG_NAMES = [
7584
7590
  ...VALUED_FLAGS,
@@ -7767,6 +7773,7 @@ function resolveLaunchFlags(params) {
7767
7773
  headroom: params.flags?.headroom ?? parseEnvBool("AGENT_SHIM_HEADROOM", params.env.AGENT_SHIM_HEADROOM) ?? params.cascade?.headroom ?? false,
7768
7774
  trackUsage: params.flags?.trackUsage ?? parseEnvBool("AGENT_SHIM_TRACK_USAGE", params.env.AGENT_SHIM_TRACK_USAGE) ?? params.cascade?.trackUsage ?? true,
7769
7775
  pause: params.flags?.pause ?? parseEnvBool("AGENT_SHIM_PAUSE", params.env.AGENT_SHIM_PAUSE) ?? params.cascade?.pause ?? false,
7776
+ explain: params.flags?.explain ?? parseEnvBool("AGENT_SHIM_EXPLAIN", params.env.AGENT_SHIM_EXPLAIN) ?? params.cascade?.explain ?? false,
7770
7777
  delayMs: resolveDelayMs(params)
7771
7778
  };
7772
7779
  }
@@ -8106,6 +8113,18 @@ var init_hold = __esm({
8106
8113
  }
8107
8114
  });
8108
8115
 
8116
+ // src/usage/candidateText.ts
8117
+ function candidateHeading(candidate) {
8118
+ const score = candidate.score === void 0 ? "" : ` score ${candidate.score.toFixed(2)}${candidate.scoreWindow === "fiveHour" ? " by 5h reset" : " by 7d reset"}`;
8119
+ const dry = candidate.feasible ? "" : " (5h would run dry)";
8120
+ return `[${candidate.class}${score}]${dry}`;
8121
+ }
8122
+ var init_candidateText = __esm({
8123
+ "src/usage/candidateText.ts"() {
8124
+ "use strict";
8125
+ }
8126
+ });
8127
+
8109
8128
  // src/launcher/launchReport.ts
8110
8129
  function poolDetail(pool) {
8111
8130
  const [reason] = pool.reasons;
@@ -8114,6 +8133,12 @@ function poolDetail(pool) {
8114
8133
  }
8115
8134
  return reason === void 0 ? {} : { detail: reason };
8116
8135
  }
8136
+ function rankingNotes(ranking, picked) {
8137
+ return ranking.flatMap((candidate, index) => [
8138
+ `${String(index + 1)}. ${candidate.identity} ${candidateHeading(candidate)}${candidate.identity === picked ? " (picked)" : ""}`,
8139
+ ` ${candidate.reasons.join("; ")}`
8140
+ ]);
8141
+ }
8117
8142
  function decisionRows(facts) {
8118
8143
  return [
8119
8144
  { label: "identity", value: facts.identity ?? "(none)", detail: facts.identitySource },
@@ -8121,7 +8146,8 @@ function decisionRows(facts) {
8121
8146
  {
8122
8147
  label: "pool",
8123
8148
  value: facts.pool.name,
8124
- ...poolDetail(facts.pool)
8149
+ ...poolDetail(facts.pool),
8150
+ ...facts.ranking === void 0 ? {} : { notes: rankingNotes(facts.ranking, facts.identity) }
8125
8151
  }
8126
8152
  ],
8127
8153
  ...facts.profile === void 0 ? [] : [{ label: "profile", value: facts.profile.name, detail: facts.profile.source }],
@@ -8156,6 +8182,7 @@ function noteRow(text) {
8156
8182
  var init_launchReport = __esm({
8157
8183
  "src/launcher/launchReport.ts"() {
8158
8184
  "use strict";
8185
+ init_candidateText();
8159
8186
  }
8160
8187
  });
8161
8188
 
@@ -8541,6 +8568,7 @@ function resolvePoolLaunch(params) {
8541
8568
  identity: pick.identity,
8542
8569
  explanation: `pool ${poolName}: ${move}${pick.reasons.slice(0, REASONS_LOGGED).join("; ")}`,
8543
8570
  reasons: pick.reasons,
8571
+ candidates: graph.ranking.candidates,
8544
8572
  ...movedOff === void 0 ? {} : { movedOff }
8545
8573
  };
8546
8574
  }
@@ -8715,7 +8743,8 @@ function pickFromPool(decided, params, parsedArgv, readOnly) {
8715
8743
  }
8716
8744
  return {
8717
8745
  identityDecision: { ...decided, name: resolution.identity },
8718
- poolPick: { name: decided.pool, reasons: resolution.reasons, ...resolution.movedOff === void 0 ? {} : { movedOff: resolution.movedOff } }
8746
+ poolPick: { name: decided.pool, reasons: resolution.reasons, ...resolution.movedOff === void 0 ? {} : { movedOff: resolution.movedOff } },
8747
+ poolRanking: resolution.candidates
8719
8748
  };
8720
8749
  }
8721
8750
  function decideLaunch(params, readOnly) {
@@ -8742,7 +8771,7 @@ function decideLaunch(params, readOnly) {
8742
8771
  return trimmed === "" ? void 0 : trimmed;
8743
8772
  }
8744
8773
  });
8745
- const { identityDecision, poolPick } = pickFromPool(decidedIdentity, params, parsedArgv, readOnly);
8774
+ const { identityDecision, poolPick, poolRanking } = pickFromPool(decidedIdentity, params, parsedArgv, readOnly);
8746
8775
  const farmIdentity = configDirEscapeHatchApplies ? void 0 : identityDecision.name;
8747
8776
  const farm = farmIdentity === void 0 ? void 0 : params.farm;
8748
8777
  if (!readOnly && farm !== void 0 && farmIdentity !== void 0) {
@@ -8878,6 +8907,7 @@ function decideLaunch(params, readOnly) {
8878
8907
  ...parsedArgv.headroom === void 0 ? {} : { headroom: parsedArgv.headroom },
8879
8908
  ...parsedArgv.trackUsage === void 0 ? {} : { trackUsage: parsedArgv.trackUsage },
8880
8909
  ...parsedArgv.pause === void 0 ? {} : { pause: parsedArgv.pause },
8910
+ ...parsedArgv.explain === void 0 ? {} : { explain: parsedArgv.explain },
8881
8911
  ...parsedArgv.delay === void 0 ? {} : { delay: parsedArgv.delay }
8882
8912
  }
8883
8913
  });
@@ -8914,6 +8944,7 @@ function decideLaunch(params, readOnly) {
8914
8944
  parsedArgv,
8915
8945
  identityDecision,
8916
8946
  poolPick,
8947
+ poolRanking,
8917
8948
  notes,
8918
8949
  configDirEscapeHatch: configDirEscapeHatchApplies,
8919
8950
  farmIdentity,
@@ -8934,12 +8965,13 @@ function prepareLaunch(params) {
8934
8965
  const { paths, proc, log } = params;
8935
8966
  const { env } = proc;
8936
8967
  const decided = decideLaunch(params, false);
8937
- const { identityDecision, configProfileDecision, resolvedProvider, identityCredential, poolPick, notes, flags: resolvedFlags, args: finalArgv, configDirEscapeHatch: configDirEscapeHatchApplies, decision } = decided;
8968
+ const { identityDecision, configProfileDecision, resolvedProvider, identityCredential, poolPick, poolRanking, notes, flags: resolvedFlags, args: finalArgv, configDirEscapeHatch: configDirEscapeHatchApplies, decision } = decided;
8938
8969
  const rows = [
8939
8970
  ...decisionRows({
8940
8971
  identity: identityDecision.name,
8941
8972
  identitySource: identityDecision.source,
8942
8973
  pool: poolPick,
8974
+ ranking: resolvedFlags.explain ? poolRanking : void 0,
8943
8975
  profile: configProfileDecision.name === void 0 ? void 0 : { name: configProfileDecision.name, source: configProfileDecision.source },
8944
8976
  provider: resolvedProvider === void 0 ? void 0 : { name: resolvedProvider.name, credential: `${resolvedProvider.credential.target} from ${describeSource(resolvedProvider.credential.source)}` },
8945
8977
  identityCredential: identityCredential === void 0 ? void 0 : `${identityCredential.target} from ${describeSource(identityCredential.source)}`
@@ -13949,6 +13981,9 @@ function applyProfileChange(paths, name, change) {
13949
13981
  if (change.launchPause !== void 0) {
13950
13982
  launchPatch.pause = change.launchPause;
13951
13983
  }
13984
+ if (change.launchExplain !== void 0) {
13985
+ launchPatch.explain = change.launchExplain;
13986
+ }
13952
13987
  if (Object.keys(launchPatch).length > 0) {
13953
13988
  setProfileLaunchFlags(paths, name, launchPatch);
13954
13989
  touched = true;
@@ -16166,7 +16201,8 @@ var ConfigProfileSetInputSchema = import_zod24.z.strictObject({
16166
16201
  provider: import_zod24.z.union([import_zod24.z.string().min(1), import_zod24.z.literal(false)]).optional(),
16167
16202
  claudeVersion: import_zod24.z.union([import_zod24.z.string().min(1), import_zod24.z.literal(false)]).optional(),
16168
16203
  delay: import_zod24.z.union([import_zod24.z.string().regex(DURATION_RE), import_zod24.z.literal(false)]).optional(),
16169
- pause: import_zod24.z.boolean().optional()
16204
+ pause: import_zod24.z.boolean().optional(),
16205
+ explain: import_zod24.z.boolean().optional()
16170
16206
  }).optional()
16171
16207
  });
16172
16208
  var ConfigProfileSetOutputSchema = storedMutationOutput("profile", "updated", ProfileValueSchema);
@@ -16378,7 +16414,8 @@ function createConfigApiRouter(deps) {
16378
16414
  ...launch?.provider === void 0 ? {} : { launchProvider: launch.provider },
16379
16415
  ...launch?.claudeVersion === void 0 ? {} : { launchClaudeVersion: launch.claudeVersion },
16380
16416
  ...launch?.delay === void 0 ? {} : { launchDelay: launch.delay },
16381
- ...launch?.pause === void 0 ? {} : { launchPause: launch.pause }
16417
+ ...launch?.pause === void 0 ? {} : { launchPause: launch.pause },
16418
+ ...launch?.explain === void 0 ? {} : { launchExplain: launch.explain }
16382
16419
  });
16383
16420
  return { action: "updated", kind: "profile", name: input.name, value: profileValue(input.name, paths) };
16384
16421
  })
@@ -16688,6 +16725,7 @@ var LaunchFlagsSchema = import_zod26.z.strictObject({
16688
16725
  headroom: import_zod26.z.boolean(),
16689
16726
  trackUsage: import_zod26.z.boolean(),
16690
16727
  pause: import_zod26.z.boolean(),
16728
+ explain: import_zod26.z.boolean(),
16691
16729
  /** How long the launch waits after its own output before it starts claude, in milliseconds. */
16692
16730
  delayMs: import_zod26.z.number()
16693
16731
  });
package/dist/index.mjs CHANGED
@@ -267,7 +267,9 @@ var init_schema = __esm({
267
267
  /** How long the launcher waits after its own output before it starts claude, so that output can be read before Claude Code takes over the terminal (`5s`, `500ms`). Applies only when a terminal is watching. */
268
268
  delay: z.string().regex(DURATION_RE, "must be a duration such as 5s or 500ms").optional(),
269
269
  /** Whether the launcher waits for a key press after its own output before it starts claude. Takes the place of `delay` when both are set. Applies only when a terminal is watching. */
270
- pause: z.boolean().optional()
270
+ pause: z.boolean().optional(),
271
+ /** Whether the launcher's report, for a launch that picks from a pool, lists every member the pick ranked with why each stands where it does, and not only the member it picked. */
272
+ explain: z.boolean().optional()
271
273
  });
272
274
  CREDENTIAL_TARGETS = ["bearer", "apiKey", "oauthToken"];
273
275
  PROVIDER_CREDENTIAL_TARGETS = ["bearer", "apiKey"];
@@ -1376,6 +1378,9 @@ function flattenLayers(layers, options) {
1376
1378
  if (layer.launch.pause !== void 0) {
1377
1379
  launch.pause = layer.launch.pause;
1378
1380
  }
1381
+ if (layer.launch.explain !== void 0) {
1382
+ launch.explain = layer.launch.explain;
1383
+ }
1379
1384
  }
1380
1385
  if (layer.entries === void 0) {
1381
1386
  continue;
@@ -2954,7 +2959,7 @@ var init_package = __esm({
2954
2959
  "package.json"() {
2955
2960
  package_default = {
2956
2961
  name: "claude-use",
2957
- version: "11.29.0",
2962
+ version: "11.30.0",
2958
2963
  description: "A profile manager and launcher for Claude Code that lets one person run multiple logins from one machine while controlling what gets shared between them.",
2959
2964
  license: "MIT",
2960
2965
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -7551,7 +7556,8 @@ var init_argv = __esm({
7551
7556
  { flag: "--skip-permissions", key: "skipPermissions" },
7552
7557
  { flag: "--remote-control", key: "remoteControl" },
7553
7558
  { flag: "--wait", key: "wait" },
7554
- { flag: "--pause", key: "pause" }
7559
+ { flag: "--pause", key: "pause" },
7560
+ { flag: "--explain", key: "explain" }
7555
7561
  ];
7556
7562
  LAUNCHER_FLAG_NAMES = [
7557
7563
  ...VALUED_FLAGS,
@@ -7741,6 +7747,7 @@ function resolveLaunchFlags(params) {
7741
7747
  headroom: params.flags?.headroom ?? parseEnvBool("AGENT_SHIM_HEADROOM", params.env.AGENT_SHIM_HEADROOM) ?? params.cascade?.headroom ?? false,
7742
7748
  trackUsage: params.flags?.trackUsage ?? parseEnvBool("AGENT_SHIM_TRACK_USAGE", params.env.AGENT_SHIM_TRACK_USAGE) ?? params.cascade?.trackUsage ?? true,
7743
7749
  pause: params.flags?.pause ?? parseEnvBool("AGENT_SHIM_PAUSE", params.env.AGENT_SHIM_PAUSE) ?? params.cascade?.pause ?? false,
7750
+ explain: params.flags?.explain ?? parseEnvBool("AGENT_SHIM_EXPLAIN", params.env.AGENT_SHIM_EXPLAIN) ?? params.cascade?.explain ?? false,
7744
7751
  delayMs: resolveDelayMs(params)
7745
7752
  };
7746
7753
  }
@@ -8078,6 +8085,18 @@ var init_hold = __esm({
8078
8085
  }
8079
8086
  });
8080
8087
 
8088
+ // src/usage/candidateText.ts
8089
+ function candidateHeading(candidate) {
8090
+ const score = candidate.score === void 0 ? "" : ` score ${candidate.score.toFixed(2)}${candidate.scoreWindow === "fiveHour" ? " by 5h reset" : " by 7d reset"}`;
8091
+ const dry = candidate.feasible ? "" : " (5h would run dry)";
8092
+ return `[${candidate.class}${score}]${dry}`;
8093
+ }
8094
+ var init_candidateText = __esm({
8095
+ "src/usage/candidateText.ts"() {
8096
+ "use strict";
8097
+ }
8098
+ });
8099
+
8081
8100
  // src/launcher/launchReport.ts
8082
8101
  function poolDetail(pool) {
8083
8102
  const [reason] = pool.reasons;
@@ -8086,6 +8105,12 @@ function poolDetail(pool) {
8086
8105
  }
8087
8106
  return reason === void 0 ? {} : { detail: reason };
8088
8107
  }
8108
+ function rankingNotes(ranking, picked) {
8109
+ return ranking.flatMap((candidate, index) => [
8110
+ `${String(index + 1)}. ${candidate.identity} ${candidateHeading(candidate)}${candidate.identity === picked ? " (picked)" : ""}`,
8111
+ ` ${candidate.reasons.join("; ")}`
8112
+ ]);
8113
+ }
8089
8114
  function decisionRows(facts) {
8090
8115
  return [
8091
8116
  { label: "identity", value: facts.identity ?? "(none)", detail: facts.identitySource },
@@ -8093,7 +8118,8 @@ function decisionRows(facts) {
8093
8118
  {
8094
8119
  label: "pool",
8095
8120
  value: facts.pool.name,
8096
- ...poolDetail(facts.pool)
8121
+ ...poolDetail(facts.pool),
8122
+ ...facts.ranking === void 0 ? {} : { notes: rankingNotes(facts.ranking, facts.identity) }
8097
8123
  }
8098
8124
  ],
8099
8125
  ...facts.profile === void 0 ? [] : [{ label: "profile", value: facts.profile.name, detail: facts.profile.source }],
@@ -8128,6 +8154,7 @@ function noteRow(text) {
8128
8154
  var init_launchReport = __esm({
8129
8155
  "src/launcher/launchReport.ts"() {
8130
8156
  "use strict";
8157
+ init_candidateText();
8131
8158
  }
8132
8159
  });
8133
8160
 
@@ -8513,6 +8540,7 @@ function resolvePoolLaunch(params) {
8513
8540
  identity: pick.identity,
8514
8541
  explanation: `pool ${poolName}: ${move}${pick.reasons.slice(0, REASONS_LOGGED).join("; ")}`,
8515
8542
  reasons: pick.reasons,
8543
+ candidates: graph.ranking.candidates,
8516
8544
  ...movedOff === void 0 ? {} : { movedOff }
8517
8545
  };
8518
8546
  }
@@ -8689,7 +8717,8 @@ function pickFromPool(decided, params, parsedArgv, readOnly) {
8689
8717
  }
8690
8718
  return {
8691
8719
  identityDecision: { ...decided, name: resolution.identity },
8692
- poolPick: { name: decided.pool, reasons: resolution.reasons, ...resolution.movedOff === void 0 ? {} : { movedOff: resolution.movedOff } }
8720
+ poolPick: { name: decided.pool, reasons: resolution.reasons, ...resolution.movedOff === void 0 ? {} : { movedOff: resolution.movedOff } },
8721
+ poolRanking: resolution.candidates
8693
8722
  };
8694
8723
  }
8695
8724
  function decideLaunch(params, readOnly) {
@@ -8716,7 +8745,7 @@ function decideLaunch(params, readOnly) {
8716
8745
  return trimmed === "" ? void 0 : trimmed;
8717
8746
  }
8718
8747
  });
8719
- const { identityDecision, poolPick } = pickFromPool(decidedIdentity, params, parsedArgv, readOnly);
8748
+ const { identityDecision, poolPick, poolRanking } = pickFromPool(decidedIdentity, params, parsedArgv, readOnly);
8720
8749
  const farmIdentity = configDirEscapeHatchApplies ? void 0 : identityDecision.name;
8721
8750
  const farm = farmIdentity === void 0 ? void 0 : params.farm;
8722
8751
  if (!readOnly && farm !== void 0 && farmIdentity !== void 0) {
@@ -8852,6 +8881,7 @@ function decideLaunch(params, readOnly) {
8852
8881
  ...parsedArgv.headroom === void 0 ? {} : { headroom: parsedArgv.headroom },
8853
8882
  ...parsedArgv.trackUsage === void 0 ? {} : { trackUsage: parsedArgv.trackUsage },
8854
8883
  ...parsedArgv.pause === void 0 ? {} : { pause: parsedArgv.pause },
8884
+ ...parsedArgv.explain === void 0 ? {} : { explain: parsedArgv.explain },
8855
8885
  ...parsedArgv.delay === void 0 ? {} : { delay: parsedArgv.delay }
8856
8886
  }
8857
8887
  });
@@ -8888,6 +8918,7 @@ function decideLaunch(params, readOnly) {
8888
8918
  parsedArgv,
8889
8919
  identityDecision,
8890
8920
  poolPick,
8921
+ poolRanking,
8891
8922
  notes,
8892
8923
  configDirEscapeHatch: configDirEscapeHatchApplies,
8893
8924
  farmIdentity,
@@ -8908,12 +8939,13 @@ function prepareLaunch(params) {
8908
8939
  const { paths, proc, log } = params;
8909
8940
  const { env } = proc;
8910
8941
  const decided = decideLaunch(params, false);
8911
- const { identityDecision, configProfileDecision, resolvedProvider, identityCredential, poolPick, notes, flags: resolvedFlags, args: finalArgv, configDirEscapeHatch: configDirEscapeHatchApplies, decision } = decided;
8942
+ const { identityDecision, configProfileDecision, resolvedProvider, identityCredential, poolPick, poolRanking, notes, flags: resolvedFlags, args: finalArgv, configDirEscapeHatch: configDirEscapeHatchApplies, decision } = decided;
8912
8943
  const rows = [
8913
8944
  ...decisionRows({
8914
8945
  identity: identityDecision.name,
8915
8946
  identitySource: identityDecision.source,
8916
8947
  pool: poolPick,
8948
+ ranking: resolvedFlags.explain ? poolRanking : void 0,
8917
8949
  profile: configProfileDecision.name === void 0 ? void 0 : { name: configProfileDecision.name, source: configProfileDecision.source },
8918
8950
  provider: resolvedProvider === void 0 ? void 0 : { name: resolvedProvider.name, credential: `${resolvedProvider.credential.target} from ${describeSource(resolvedProvider.credential.source)}` },
8919
8951
  identityCredential: identityCredential === void 0 ? void 0 : `${identityCredential.target} from ${describeSource(identityCredential.source)}`
@@ -13536,6 +13568,9 @@ function applyProfileChange(paths, name, change) {
13536
13568
  if (change.launchPause !== void 0) {
13537
13569
  launchPatch.pause = change.launchPause;
13538
13570
  }
13571
+ if (change.launchExplain !== void 0) {
13572
+ launchPatch.explain = change.launchExplain;
13573
+ }
13539
13574
  if (Object.keys(launchPatch).length > 0) {
13540
13575
  setProfileLaunchFlags(paths, name, launchPatch);
13541
13576
  touched = true;
@@ -15753,7 +15788,8 @@ var ConfigProfileSetInputSchema = z24.strictObject({
15753
15788
  provider: z24.union([z24.string().min(1), z24.literal(false)]).optional(),
15754
15789
  claudeVersion: z24.union([z24.string().min(1), z24.literal(false)]).optional(),
15755
15790
  delay: z24.union([z24.string().regex(DURATION_RE), z24.literal(false)]).optional(),
15756
- pause: z24.boolean().optional()
15791
+ pause: z24.boolean().optional(),
15792
+ explain: z24.boolean().optional()
15757
15793
  }).optional()
15758
15794
  });
15759
15795
  var ConfigProfileSetOutputSchema = storedMutationOutput("profile", "updated", ProfileValueSchema);
@@ -15965,7 +16001,8 @@ function createConfigApiRouter(deps) {
15965
16001
  ...launch?.provider === void 0 ? {} : { launchProvider: launch.provider },
15966
16002
  ...launch?.claudeVersion === void 0 ? {} : { launchClaudeVersion: launch.claudeVersion },
15967
16003
  ...launch?.delay === void 0 ? {} : { launchDelay: launch.delay },
15968
- ...launch?.pause === void 0 ? {} : { launchPause: launch.pause }
16004
+ ...launch?.pause === void 0 ? {} : { launchPause: launch.pause },
16005
+ ...launch?.explain === void 0 ? {} : { launchExplain: launch.explain }
15969
16006
  });
15970
16007
  return { action: "updated", kind: "profile", name: input.name, value: profileValue(input.name, paths) };
15971
16008
  })
@@ -16275,6 +16312,7 @@ var LaunchFlagsSchema = z26.strictObject({
16275
16312
  headroom: z26.boolean(),
16276
16313
  trackUsage: z26.boolean(),
16277
16314
  pause: z26.boolean(),
16315
+ explain: z26.boolean(),
16278
16316
  /** How long the launch waits after its own output before it starts claude, in milliseconds. */
16279
16317
  delayMs: z26.number()
16280
16318
  });
@@ -278,6 +278,7 @@ declare const LaunchSchema: z.ZodObject<{
278
278
  claudeVersion: z.ZodOptional<z.ZodString>;
279
279
  delay: z.ZodOptional<z.ZodString>;
280
280
  pause: z.ZodOptional<z.ZodBoolean>;
281
+ explain: z.ZodOptional<z.ZodBoolean>;
281
282
  }, z.core.$strict>;
282
283
  type LaunchFlags = z.infer<typeof LaunchSchema>;
283
284
  /**
@@ -861,6 +862,7 @@ declare const ConfigProfileSchema: z.ZodObject<{
861
862
  claudeVersion: z.ZodOptional<z.ZodString>;
862
863
  delay: z.ZodOptional<z.ZodString>;
863
864
  pause: z.ZodOptional<z.ZodBoolean>;
865
+ explain: z.ZodOptional<z.ZodBoolean>;
864
866
  }, z.core.$strict>>;
865
867
  }, z.core.$strict>;
866
868
  type ConfigProfile = z.infer<typeof ConfigProfileSchema>;
@@ -1069,6 +1071,7 @@ declare const DirectoryRuleSchema: z.ZodObject<{
1069
1071
  claudeVersion: z.ZodOptional<z.ZodString>;
1070
1072
  delay: z.ZodOptional<z.ZodString>;
1071
1073
  pause: z.ZodOptional<z.ZodBoolean>;
1074
+ explain: z.ZodOptional<z.ZodBoolean>;
1072
1075
  }, z.core.$strict>>;
1073
1076
  path: z.ZodString;
1074
1077
  configProfile: z.ZodOptional<z.ZodString>;
@@ -1250,6 +1253,7 @@ declare const DirectoryRulesSchema: z.ZodObject<{
1250
1253
  claudeVersion: z.ZodOptional<z.ZodString>;
1251
1254
  delay: z.ZodOptional<z.ZodString>;
1252
1255
  pause: z.ZodOptional<z.ZodBoolean>;
1256
+ explain: z.ZodOptional<z.ZodBoolean>;
1253
1257
  }, z.core.$strict>>;
1254
1258
  path: z.ZodString;
1255
1259
  configProfile: z.ZodOptional<z.ZodString>;
@@ -1432,6 +1436,7 @@ declare const PortableConfigSchema: z.ZodObject<{
1432
1436
  claudeVersion: z.ZodOptional<z.ZodString>;
1433
1437
  delay: z.ZodOptional<z.ZodString>;
1434
1438
  pause: z.ZodOptional<z.ZodBoolean>;
1439
+ explain: z.ZodOptional<z.ZodBoolean>;
1435
1440
  }, z.core.$strict>>;
1436
1441
  configProfile: z.ZodOptional<z.ZodString>;
1437
1442
  identity: z.ZodOptional<z.ZodString>;
@@ -1638,6 +1643,7 @@ declare const GlobalConfigSchema: z.ZodObject<{
1638
1643
  claudeVersion: z.ZodOptional<z.ZodString>;
1639
1644
  delay: z.ZodOptional<z.ZodString>;
1640
1645
  pause: z.ZodOptional<z.ZodBoolean>;
1646
+ explain: z.ZodOptional<z.ZodBoolean>;
1641
1647
  }, z.core.$strict>>;
1642
1648
  headroom: z.ZodOptional<z.ZodObject<{
1643
1649
  source: z.ZodOptional<z.ZodString>;
@@ -5990,6 +5996,7 @@ declare function createConfigApiRouter(deps: ConfigApiDeps): {
5990
5996
  claudeVersion: zod.ZodOptional<zod.ZodString>;
5991
5997
  delay: zod.ZodOptional<zod.ZodString>;
5992
5998
  pause: zod.ZodOptional<zod.ZodBoolean>;
5999
+ explain: zod.ZodOptional<zod.ZodBoolean>;
5993
6000
  }, zod_v4_core.$strict>>;
5994
6001
  }, zod_v4_core.$strict>;
5995
6002
  }, zod_v4_core.$strict>, MergedErrorMap<$ErrorMap, TErrorMap>>;
@@ -6008,6 +6015,7 @@ declare function createConfigApiRouter(deps: ConfigApiDeps): {
6008
6015
  claudeVersion: zod.ZodOptional<zod.ZodUnion<readonly [zod.ZodString, zod.ZodLiteral<false>]>>;
6009
6016
  delay: zod.ZodOptional<zod.ZodUnion<readonly [zod.ZodString, zod.ZodLiteral<false>]>>;
6010
6017
  pause: zod.ZodOptional<zod.ZodBoolean>;
6018
+ explain: zod.ZodOptional<zod.ZodBoolean>;
6011
6019
  }, zod_v4_core.$strict>>;
6012
6020
  }, zod_v4_core.$strict>, zod.ZodObject<{
6013
6021
  action: zod.ZodLiteral<"updated">;
@@ -6113,6 +6121,7 @@ declare function createConfigApiRouter(deps: ConfigApiDeps): {
6113
6121
  claudeVersion: zod.ZodOptional<zod.ZodString>;
6114
6122
  delay: zod.ZodOptional<zod.ZodString>;
6115
6123
  pause: zod.ZodOptional<zod.ZodBoolean>;
6124
+ explain: zod.ZodOptional<zod.ZodBoolean>;
6116
6125
  }, zod_v4_core.$strict>>;
6117
6126
  }, zod_v4_core.$strict>;
6118
6127
  }, zod_v4_core.$strict>, MergedErrorMap<$ErrorMap, TErrorMap>>;
@@ -6715,6 +6724,7 @@ declare function createConfigApiRouter(deps: ConfigApiDeps): {
6715
6724
  claudeVersion: zod.ZodOptional<zod.ZodString>;
6716
6725
  delay: zod.ZodOptional<zod.ZodString>;
6717
6726
  pause: zod.ZodOptional<zod.ZodBoolean>;
6727
+ explain: zod.ZodOptional<zod.ZodBoolean>;
6718
6728
  }, zod_v4_core.$strict>>;
6719
6729
  path: zod.ZodString;
6720
6730
  configProfile: zod.ZodOptional<zod.ZodString>;
@@ -6901,6 +6911,7 @@ declare function createConfigApiRouter(deps: ConfigApiDeps): {
6901
6911
  claudeVersion: zod.ZodOptional<zod.ZodString>;
6902
6912
  delay: zod.ZodOptional<zod.ZodString>;
6903
6913
  pause: zod.ZodOptional<zod.ZodBoolean>;
6914
+ explain: zod.ZodOptional<zod.ZodBoolean>;
6904
6915
  }, zod_v4_core.$strict>>;
6905
6916
  path: zod.ZodString;
6906
6917
  configProfile: zod.ZodOptional<zod.ZodString>;
@@ -7232,6 +7243,8 @@ interface ResolvedLaunchFlags {
7232
7243
  readonly trackUsage: boolean;
7233
7244
  /** Whether the launcher waits for a key press after its own output before it starts claude. */
7234
7245
  readonly pause: boolean;
7246
+ /** Whether the launch's report lists every pool member the pick ranked and why, and not only the one picked. */
7247
+ readonly explain: boolean;
7235
7248
  /** How long the launcher waits after its own output before it starts claude, in milliseconds; zero for no wait. */
7236
7249
  readonly delayMs: number;
7237
7250
  }
@@ -7524,6 +7537,7 @@ declare function createLaunchApiRouter(deps: LaunchApiDeps): {
7524
7537
  headroom: zod.ZodBoolean;
7525
7538
  trackUsage: zod.ZodBoolean;
7526
7539
  pause: zod.ZodBoolean;
7540
+ explain: zod.ZodBoolean;
7527
7541
  delayMs: zod.ZodNumber;
7528
7542
  }, zod_v4_core.$strict>;
7529
7543
  claudeVersion: zod.ZodOptional<zod.ZodObject<{
@@ -8642,6 +8656,7 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
8642
8656
  headroom: zod.ZodBoolean;
8643
8657
  trackUsage: zod.ZodBoolean;
8644
8658
  pause: zod.ZodBoolean;
8659
+ explain: zod.ZodBoolean;
8645
8660
  delayMs: zod.ZodNumber;
8646
8661
  }, zod_v4_core.$strict>;
8647
8662
  claudeVersion: zod.ZodOptional<zod.ZodObject<{
@@ -9012,6 +9027,7 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
9012
9027
  claudeVersion: zod.ZodOptional<zod.ZodString>;
9013
9028
  delay: zod.ZodOptional<zod.ZodString>;
9014
9029
  pause: zod.ZodOptional<zod.ZodBoolean>;
9030
+ explain: zod.ZodOptional<zod.ZodBoolean>;
9015
9031
  }, zod_v4_core.$strict>>;
9016
9032
  }, zod_v4_core.$strict>;
9017
9033
  }, zod_v4_core.$strict>, MergedErrorMap<$ErrorMap, TErrorMap>>;
@@ -9030,6 +9046,7 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
9030
9046
  claudeVersion: zod.ZodOptional<zod.ZodUnion<readonly [zod.ZodString, zod.ZodLiteral<false>]>>;
9031
9047
  delay: zod.ZodOptional<zod.ZodUnion<readonly [zod.ZodString, zod.ZodLiteral<false>]>>;
9032
9048
  pause: zod.ZodOptional<zod.ZodBoolean>;
9049
+ explain: zod.ZodOptional<zod.ZodBoolean>;
9033
9050
  }, zod_v4_core.$strict>>;
9034
9051
  }, zod_v4_core.$strict>, zod.ZodObject<{
9035
9052
  action: zod.ZodLiteral<"updated">;
@@ -9135,6 +9152,7 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
9135
9152
  claudeVersion: zod.ZodOptional<zod.ZodString>;
9136
9153
  delay: zod.ZodOptional<zod.ZodString>;
9137
9154
  pause: zod.ZodOptional<zod.ZodBoolean>;
9155
+ explain: zod.ZodOptional<zod.ZodBoolean>;
9138
9156
  }, zod_v4_core.$strict>>;
9139
9157
  }, zod_v4_core.$strict>;
9140
9158
  }, zod_v4_core.$strict>, MergedErrorMap<$ErrorMap, TErrorMap>>;
@@ -9737,6 +9755,7 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
9737
9755
  claudeVersion: zod.ZodOptional<zod.ZodString>;
9738
9756
  delay: zod.ZodOptional<zod.ZodString>;
9739
9757
  pause: zod.ZodOptional<zod.ZodBoolean>;
9758
+ explain: zod.ZodOptional<zod.ZodBoolean>;
9740
9759
  }, zod_v4_core.$strict>>;
9741
9760
  path: zod.ZodString;
9742
9761
  configProfile: zod.ZodOptional<zod.ZodString>;
@@ -9923,6 +9942,7 @@ declare function createDoorApiRouter(deps: DoorApiDeps): {
9923
9942
  claudeVersion: zod.ZodOptional<zod.ZodString>;
9924
9943
  delay: zod.ZodOptional<zod.ZodString>;
9925
9944
  pause: zod.ZodOptional<zod.ZodBoolean>;
9945
+ explain: zod.ZodOptional<zod.ZodBoolean>;
9926
9946
  }, zod_v4_core.$strict>>;
9927
9947
  path: zod.ZodString;
9928
9948
  configProfile: zod.ZodOptional<zod.ZodString>;
@@ -11149,6 +11169,7 @@ declare const ConfigProfileAddOutputSchema: z.ZodObject<{
11149
11169
  claudeVersion: z.ZodOptional<z.ZodString>;
11150
11170
  delay: z.ZodOptional<z.ZodString>;
11151
11171
  pause: z.ZodOptional<z.ZodBoolean>;
11172
+ explain: z.ZodOptional<z.ZodBoolean>;
11152
11173
  }, z.core.$strict>>;
11153
11174
  }, z.core.$strict>;
11154
11175
  }, z.core.$strict>;
@@ -11168,6 +11189,7 @@ declare const ConfigProfileSetInputSchema: z.ZodObject<{
11168
11189
  claudeVersion: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<false>]>>;
11169
11190
  delay: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<false>]>>;
11170
11191
  pause: z.ZodOptional<z.ZodBoolean>;
11192
+ explain: z.ZodOptional<z.ZodBoolean>;
11171
11193
  }, z.core.$strict>>;
11172
11194
  }, z.core.$strict>;
11173
11195
  declare const ConfigProfileSetOutputSchema: z.ZodObject<{
@@ -11274,6 +11296,7 @@ declare const ConfigProfileSetOutputSchema: z.ZodObject<{
11274
11296
  claudeVersion: z.ZodOptional<z.ZodString>;
11275
11297
  delay: z.ZodOptional<z.ZodString>;
11276
11298
  pause: z.ZodOptional<z.ZodBoolean>;
11299
+ explain: z.ZodOptional<z.ZodBoolean>;
11277
11300
  }, z.core.$strict>>;
11278
11301
  }, z.core.$strict>;
11279
11302
  }, z.core.$strict>;
@@ -11878,6 +11901,7 @@ declare const ConfigRuleAddOutputSchema: z.ZodObject<{
11878
11901
  claudeVersion: z.ZodOptional<z.ZodString>;
11879
11902
  delay: z.ZodOptional<z.ZodString>;
11880
11903
  pause: z.ZodOptional<z.ZodBoolean>;
11904
+ explain: z.ZodOptional<z.ZodBoolean>;
11881
11905
  }, z.core.$strict>>;
11882
11906
  path: z.ZodString;
11883
11907
  configProfile: z.ZodOptional<z.ZodString>;
@@ -12066,6 +12090,7 @@ declare const ConfigRuleSetOutputSchema: z.ZodObject<{
12066
12090
  claudeVersion: z.ZodOptional<z.ZodString>;
12067
12091
  delay: z.ZodOptional<z.ZodString>;
12068
12092
  pause: z.ZodOptional<z.ZodBoolean>;
12093
+ explain: z.ZodOptional<z.ZodBoolean>;
12069
12094
  }, z.core.$strict>>;
12070
12095
  path: z.ZodString;
12071
12096
  configProfile: z.ZodOptional<z.ZodString>;
@@ -12553,6 +12578,7 @@ declare const LaunchResolveOutputSchema: z.ZodObject<{
12553
12578
  headroom: z.ZodBoolean;
12554
12579
  trackUsage: z.ZodBoolean;
12555
12580
  pause: z.ZodBoolean;
12581
+ explain: z.ZodBoolean;
12556
12582
  delayMs: z.ZodNumber;
12557
12583
  }, z.core.$strict>;
12558
12584
  claudeVersion: z.ZodOptional<z.ZodObject<{
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-use",
3
- "version": "11.29.0",
3
+ "version": "11.30.0",
4
4
  "description": "A profile manager and launcher for Claude Code that lets one person run multiple logins from one machine while controlling what gets shared between them.",
5
5
  "license": "MIT",
6
6
  "author": "Joseph Mearman <joseph@mearman.co.uk>",