@amirtechai/xclaude 2026.3.26 → 2026.3.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/acp-cli-BJyvrvZg.js +2 -2
  2. package/dist/active-listener-CU_ylekC.js +1 -1
  3. package/dist/audit-extra.async-B4rRNZiG.js +5 -5
  4. package/dist/banner-DPmt57Uz.js +2 -2
  5. package/dist/control-ui/assets/index-3G8b0Cq-.js +1 -1
  6. package/dist/cron-cli-bEZ6ElMg.js +1 -1
  7. package/dist/daemon-install-CUiHaOdT.js +1 -1
  8. package/dist/directive-handling.shared-CQzigvOe.js +1 -1
  9. package/dist/docker-CXxET5gG.js +2 -2
  10. package/dist/extensions/matrix/index.js +2 -2
  11. package/dist/gateway-cli-DuhdO525.js +4 -4
  12. package/dist/helpers-BVhEa8wW.js +1 -1
  13. package/dist/hooks-cli-lIaN3kYr.js +4 -4
  14. package/dist/logs-cli-Bq3nBNR2.js +1 -1
  15. package/dist/method-scopes-DUy_ix8k.js +1 -1
  16. package/dist/onboard-0qd28_MN.js +1 -1
  17. package/dist/onboard-channels-_XyFK_3V.js +1 -1
  18. package/dist/pairing-challenge-D9O9L50g.js +1 -1
  19. package/dist/pi-embedded-B9OsuPCO.js +4 -4
  20. package/dist/plugins-update-command-Dv8ta0bg.js +3 -3
  21. package/dist/prompt-select-styled-CIEXnJnR.js +4 -4
  22. package/dist/provider-auth-guidance-TPAXVl-G.js +1 -1
  23. package/dist/register.maintenance-yXtR6WPz.js +1 -1
  24. package/dist/routes-qV4l4oA9.js +3 -3
  25. package/dist/sandbox-CwT9Xq6-.js +3 -3
  26. package/dist/server-DDdC0fti.js +1 -1
  27. package/dist/shared-CMqWqPGJ.js +2 -2
  28. package/dist/skills-C0FaD6iu.js +1 -1
  29. package/dist/skills-cli-D-35uKN9.js +2 -2
  30. package/dist/status-BNOiyDPY.js +1 -1
  31. package/dist/systemd-hints-DAFIxEJ1.js +2 -2
  32. package/dist/targets-CPrPEKB1.js +1 -1
  33. package/dist/tui-DThQ1HKV.js +2 -2
  34. package/dist/update-cli-WDt52NwJ.js +1 -1
  35. package/package.json +1 -1
  36. package/xclaw.mjs +1 -1
@@ -392,7 +392,7 @@ async function runAcpClientInteractive(opts = {}) {
392
392
  input: process.stdin,
393
393
  output: process.stdout
394
394
  });
395
- console.log("XClaude ACP client");
395
+ console.log("XClaw ACP client");
396
396
  console.log(`Session: ${sessionId}`);
397
397
  console.log("Type a prompt, or \"exit\" to quit.\n");
398
398
  const prompt = () => {
@@ -1938,7 +1938,7 @@ function parseArgs(args) {
1938
1938
  return opts;
1939
1939
  }
1940
1940
  function printHelp() {
1941
- console.log(`Usage: xclaude acp [options]
1941
+ console.log(`Usage: xclaw acp [options]
1942
1942
 
1943
1943
  Gateway-backed ACP server for IDE integration.
1944
1944
 
@@ -15,7 +15,7 @@ function resolveWebAccountId(accountId) {
15
15
  function requireActiveWebListener(accountId) {
16
16
  const id = resolveWebAccountId(accountId);
17
17
  const listener = state.listeners.get(id) ?? null;
18
- if (!listener) throw new Error(`No active WhatsApp Web listener (account: ${id}). Start the gateway, then link WhatsApp with: ${formatCliCommand(`xclaude channels login --channel whatsapp --account ${id}`)}.`);
18
+ if (!listener) throw new Error(`No active WhatsApp Web listener (account: ${id}). Start the gateway, then link WhatsApp with: ${formatCliCommand(`xclaw channels login --channel whatsapp --account ${id}`)}.`);
19
19
  return {
20
20
  accountId: id,
21
21
  listener
@@ -416,7 +416,7 @@ async function collectPluginsTrustFindings(params) {
416
416
  severity: "warn",
417
417
  title: "Plugin install records drift from installed package versions",
418
418
  detail: `Detected plugin install metadata drift:\n${pluginVersionDrift.map((entry) => `- ${entry}`).join("\n")}`,
419
- remediation: "Run `xclaude plugins update --all` (or reinstall affected plugins) to refresh install metadata."
419
+ remediation: "Run `xclaw plugins update --all` (or reinstall affected plugins) to refresh install metadata."
420
420
  });
421
421
  }
422
422
  const hookInstalls = params.cfg.hooks?.internal?.installs ?? {};
@@ -451,7 +451,7 @@ async function collectPluginsTrustFindings(params) {
451
451
  severity: "warn",
452
452
  title: "Hook install records drift from installed package versions",
453
453
  detail: `Detected hook install metadata drift:\n${hookVersionDrift.map((entry) => `- ${entry}`).join("\n")}`,
454
- remediation: "Run `xclaude hooks update --all` (or reinstall affected hooks) to refresh install metadata."
454
+ remediation: "Run `xclaw hooks update --all` (or reinstall affected hooks) to refresh install metadata."
455
455
  });
456
456
  }
457
457
  return findings;
@@ -691,7 +691,7 @@ async function collectPluginsCodeSafetyFindings(params) {
691
691
  severity: "warn",
692
692
  title: "Plugin extensions directory scan failed",
693
693
  detail: `Static code scan could not list extensions directory: ${String(err)}`,
694
- remediation: "Check file permissions and plugin layout, then rerun `xclaude security audit --deep`."
694
+ remediation: "Check file permissions and plugin layout, then rerun `xclaw security audit --deep`."
695
695
  });
696
696
  }
697
697
  });
@@ -732,7 +732,7 @@ async function collectPluginsCodeSafetyFindings(params) {
732
732
  severity: "warn",
733
733
  title: `Plugin "${pluginName}" code scan failed`,
734
734
  detail: `Static code scan could not complete: ${String(err)}`,
735
- remediation: "Check file permissions and plugin layout, then rerun `xclaude security audit --deep`."
735
+ remediation: "Check file permissions and plugin layout, then rerun `xclaw security audit --deep`."
736
736
  });
737
737
  return null;
738
738
  });
@@ -783,7 +783,7 @@ async function collectInstalledSkillsCodeSafetyFindings(params) {
783
783
  severity: "warn",
784
784
  title: `Skill "${skillName}" code scan failed`,
785
785
  detail: `Static code scan could not complete for ${skillDir}: ${String(err)}`,
786
- remediation: "Check file permissions and skill layout, then rerun `xclaude security audit --deep`."
786
+ remediation: "Check file permissions and skill layout, then rerun `xclaw security audit --deep`."
787
787
  });
788
788
  return null;
789
789
  });
@@ -15,7 +15,7 @@ function readCliBannerTaglineMode(env = process.env) {
15
15
  }
16
16
  //#endregion
17
17
  //#region src/cli/tagline.ts
18
- const DEFAULT_TAGLINE = "All your chats, one XClaude.";
18
+ const DEFAULT_TAGLINE = "All your chats, one XClaw.";
19
19
  const HOLIDAY_TAGLINES = {
20
20
  newYear: "New Year's Day: New year, new config—same old EADDRINUSE, but this time we resolve it like grown-ups.",
21
21
  lunarNewYear: "Lunar New Year: May your builds be lucky, your branches prosperous, and your merge conflicts chased away with fireworks.",
@@ -301,7 +301,7 @@ function formatCliBannerLine(version, options = {}) {
301
301
  mode: resolveTaglineMode(options)
302
302
  });
303
303
  const rich = options.richTty ?? isRich();
304
- const title = "🦞 XClaude";
304
+ const title = "🦞 XClaw";
305
305
  const columns = options.columns ?? process.stdout.columns ?? 120;
306
306
  const plainBaseLine = `${title} ${version} (${commitLabel})`;
307
307
  const plainFullLine = tagline ? `${plainBaseLine} — ${tagline}` : plainBaseLine;
@@ -4125,7 +4125,7 @@ ${JSON.stringify(e.issues,null,2)}</pre
4125
4125
  </div>
4126
4126
  `:n`
4127
4127
  <div class="muted" style="margin-top: 8px">
4128
- ${P(`overview.auth.failed`,{command:`xclaude dashboard --no-open`})}
4128
+ ${P(`overview.auth.failed`,{command:`xclaw dashboard --no-open`})}
4129
4129
  <div style="margin-top: 6px">
4130
4130
  <a
4131
4131
  class="session-link"
@@ -643,7 +643,7 @@ function registerCronSimpleCommands(cron) {
643
643
  //#endregion
644
644
  //#region src/cli/cron-cli/register.ts
645
645
  function registerCronCli(program) {
646
- const cron = program.command("cron").description("Manage cron jobs (via Gateway)").addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/cron", "docs.xclaw.ai/cli/cron")}\n${theme.muted("Upgrade tip:")} run \`xclaude doctor --fix\` to normalize legacy cron job storage.\n`);
646
+ const cron = program.command("cron").description("Manage cron jobs (via Gateway)").addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/cron", "docs.xclaw.ai/cli/cron")}\n${theme.muted("Upgrade tip:")} run \`xclaw doctor --fix\` to normalize legacy cron job storage.\n`);
647
647
  registerCronStatusCommand(cron);
648
648
  registerCronListCommand(cron);
649
649
  registerCronAddCommand(cron);
@@ -53,7 +53,7 @@ async function installGatewayDaemonNonInteractive(params) {
53
53
  const daemonRuntimeRaw = opts.daemonRuntime ?? "node";
54
54
  const systemdAvailable = process.platform === "linux" ? await isSystemdUserServiceAvailable() : true;
55
55
  if (process.platform === "linux" && !systemdAvailable) {
56
- runtime.log("Systemd user services are unavailable; skipping service install. Use a direct shell run (`xclaude gateway run`) or rerun without --install-daemon on this session.");
56
+ runtime.log("Systemd user services are unavailable; skipping service install. Use a direct shell run (`xclaw gateway run`) or rerun without --install-daemon on this session.");
57
57
  return {
58
58
  installed: false,
59
59
  skippedReason: "systemd-user-unavailable"
@@ -146,7 +146,7 @@ function formatElevatedUnavailableText(params) {
146
146
  const failures = params.failures ?? [];
147
147
  if (failures.length > 0) lines.push(`Failing gates: ${failures.map((f) => `${f.gate} (${f.key})`).join(", ")}`);
148
148
  else lines.push("Fix-it keys: tools.elevated.enabled, tools.elevated.allowFrom.<provider>, agents.list[].tools.elevated.*");
149
- if (params.sessionKey) lines.push(`See: ${formatCliCommand(`xclaude sandbox explain --session ${params.sessionKey}`)}`);
149
+ if (params.sessionKey) lines.push(`See: ${formatCliCommand(`xclaw sandbox explain --session ${params.sessionKey}`)}`);
150
150
  return lines.join("\n");
151
151
  }
152
152
  //#endregion
@@ -1177,8 +1177,8 @@ async function readContainerConfigHash(containerName) {
1177
1177
  return await readDockerContainerLabel(containerName, "xclaw.configHash");
1178
1178
  }
1179
1179
  function formatSandboxRecreateHint(params) {
1180
- if (params.scope === "session") return formatCliCommand(`xclaude sandbox recreate --session ${params.sessionKey}`);
1181
- if (params.scope === "agent") return formatCliCommand(`xclaude sandbox recreate --agent ${resolveSandboxAgentId(params.sessionKey) ?? "main"}`);
1180
+ if (params.scope === "session") return formatCliCommand(`xclaw sandbox recreate --session ${params.sessionKey}`);
1181
+ if (params.scope === "agent") return formatCliCommand(`xclaw sandbox recreate --agent ${resolveSandboxAgentId(params.sessionKey) ?? "main"}`);
1182
1182
  return formatCliCommand("xclaw sandbox recreate --all");
1183
1183
  }
1184
1184
  async function ensureSandboxContainer(params) {
@@ -269,7 +269,7 @@ function resolveMatrixCliAccountId(accountId) {
269
269
  }
270
270
  function formatMatrixCliCommand(command, accountId) {
271
271
  const normalizedAccountId = normalizeAccountId(accountId);
272
- return `xclaude matrix ${command}${normalizedAccountId === "default" ? "" : ` --account ${normalizedAccountId}`}`;
272
+ return `xclaw matrix ${command}${normalizedAccountId === "default" ? "" : ` --account ${normalizedAccountId}`}`;
273
273
  }
274
274
  function printMatrixOwnDevices(devices) {
275
275
  if (devices.length === 0) {
@@ -618,7 +618,7 @@ function registerMatrixCli(params) {
618
618
  console.log(`Profile sync: name ${result.profile.displayNameUpdated ? "updated" : "unchanged"}, avatar ${result.profile.avatarUpdated ? "updated" : "unchanged"}`);
619
619
  if (result.profile.convertedAvatarFromHttp && result.profile.resolvedAvatarUrl) console.log(`Avatar converted and saved as: ${result.profile.resolvedAvatarUrl}`);
620
620
  }
621
- const bindHint = `xclaude agents bind --agent <id> --bind matrix:${result.accountId}`;
621
+ const bindHint = `xclaw agents bind --agent <id> --bind matrix:${result.accountId}`;
622
622
  console.log(`Bind this account to an agent: ${bindHint}`);
623
623
  },
624
624
  errorPrefix: "Account setup failed"
@@ -23941,7 +23941,7 @@ const GENERATED_BASE_CONFIG_SCHEMA = {
23941
23941
  },
23942
23942
  "gateway.nodes.allowCommands": {
23943
23943
  label: "Gateway Node Allowlist (Extra Commands)",
23944
- help: "Extra node.invoke commands to allow beyond the gateway defaults (array of command strings). Enabling dangerous commands here is a security-sensitive override and is flagged by `xclaude security audit`.",
23944
+ help: "Extra node.invoke commands to allow beyond the gateway defaults (array of command strings). Enabling dangerous commands here is a security-sensitive override and is flagged by `xclaw security audit`.",
23945
23945
  tags: ["access", "network"]
23946
23946
  },
23947
23947
  "gateway.nodes.denyCommands": {
@@ -27182,7 +27182,7 @@ const GENERATED_BASE_CONFIG_SCHEMA = {
27182
27182
  },
27183
27183
  "plugins.installs": {
27184
27184
  label: "Plugin Install Records",
27185
- help: "CLI-managed install metadata (used by `xclaude plugins update` to locate install sources).",
27185
+ help: "CLI-managed install metadata (used by `xclaw plugins update` to locate install sources).",
27186
27186
  tags: ["advanced"]
27187
27187
  },
27188
27188
  "plugins.installs.*.source": {
@@ -39604,7 +39604,7 @@ function logGatewayStartup(params) {
39604
39604
  if (params.isNixMode) params.log.info("gateway: running in Nix mode (config managed externally)");
39605
39605
  const enabledDangerousFlags = collectEnabledInsecureOrDangerousFlags(params.cfg);
39606
39606
  if (enabledDangerousFlags.length > 0) {
39607
- const warning = `security warning: dangerous config flags enabled: ${enabledDangerousFlags.join(", ")}. Run \`xclaude security audit\`.`;
39607
+ const warning = `security warning: dangerous config flags enabled: ${enabledDangerousFlags.join(", ")}. Run \`xclaw security audit\`.`;
39608
39608
  params.log.warn(warning);
39609
39609
  }
39610
39610
  }
@@ -41765,7 +41765,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
41765
41765
  });
41766
41766
  cfgAtStart = authBootstrap.cfg;
41767
41767
  if (authBootstrap.generatedToken) if (authBootstrap.persistedGeneratedToken) log.info("Gateway auth token was missing. Generated a new token and saved it to config (gateway.auth.token).");
41768
- else log.warn("Gateway auth token was missing. Generated a runtime token for this startup without changing config; restart will generate a different token. Persist one with `xclaude config set gateway.auth.mode token` and `xclaude config set gateway.auth.token <token>`.");
41768
+ else log.warn("Gateway auth token was missing. Generated a runtime token for this startup without changing config; restart will generate a different token. Persist one with `xclaw config set gateway.auth.mode token` and `xclaw config set gateway.auth.token <token>`.");
41769
41769
  const diagnosticsEnabled = isDiagnosticsEnabled(cfgAtStart);
41770
41770
  if (diagnosticsEnabled) startDiagnosticHeartbeat();
41771
41771
  setGatewaySigusr1RestartPolicy({ allowExternal: isRestartEnabled(cfgAtStart) });
@@ -6,7 +6,7 @@ function resolveChannelDefaultAccountId(params) {
6
6
  return params.plugin.config.defaultAccountId?.(params.cfg) ?? accountIds[0] ?? "default";
7
7
  }
8
8
  function formatPairingApproveHint(channelId) {
9
- return `Approve via: ${formatCliCommand(`xclaude pairing list ${channelId}`)} / ${formatCliCommand(`xclaude pairing approve ${channelId} <code>`)}`;
9
+ return `Approve via: ${formatCliCommand(`xclaw pairing list ${channelId}`)} / ${formatCliCommand(`xclaw pairing approve ${channelId} <code>`)}`;
10
10
  }
11
11
  function parseOptionalDelimitedEntries(value) {
12
12
  if (!value?.trim()) return;
@@ -521,15 +521,15 @@ function registerHooksCli(program) {
521
521
  hooks.command("disable <name>").description("Disable a hook").action(async (name) => runHooksCliAction(async () => {
522
522
  await disableHook(name);
523
523
  }));
524
- hooks.command("install").description("Deprecated: install a hook pack via `xclaude plugins install`").argument("<path-or-spec>", "Path to a hook pack or npm package spec").option("-l, --link", "Link a local path instead of copying", false).option("--pin", "Record npm installs as exact resolved <name>@<version>", false).action(async (raw, opts) => {
525
- defaultRuntime.log(theme.warn("`xclaude hooks install` is deprecated; use `xclaude plugins install`."));
524
+ hooks.command("install").description("Deprecated: install a hook pack via `xclaw plugins install`").argument("<path-or-spec>", "Path to a hook pack or npm package spec").option("-l, --link", "Link a local path instead of copying", false).option("--pin", "Record npm installs as exact resolved <name>@<version>", false).action(async (raw, opts) => {
525
+ defaultRuntime.log(theme.warn("`xclaw hooks install` is deprecated; use `xclaw plugins install`."));
526
526
  await runPluginInstallCommand({
527
527
  raw,
528
528
  opts
529
529
  });
530
530
  });
531
- hooks.command("update").description("Deprecated: update hook packs via `xclaude plugins update`").argument("[id]", "Hook pack id (omit with --all)").option("--all", "Update all tracked hooks", false).option("--dry-run", "Show what would change without writing", false).action(async (id, opts) => {
532
- defaultRuntime.log(theme.warn("`xclaude hooks update` is deprecated; use `xclaude plugins update`."));
531
+ hooks.command("update").description("Deprecated: update hook packs via `xclaw plugins update`").argument("[id]", "Hook pack id (omit with --all)").option("--all", "Update all tracked hooks", false).option("--dry-run", "Show what would change without writing", false).action(async (id, opts) => {
532
+ defaultRuntime.log(theme.warn("`xclaw hooks update` is deprecated; use `xclaw plugins update`."));
533
533
  await runPluginUpdateCommand({
534
534
  id,
535
535
  opts
@@ -121,7 +121,7 @@ function createLogWriters() {
121
121
  beforeWrite: () => clearActiveProgressLine(),
122
122
  onBrokenPipe: (err, stream) => {
123
123
  const code = err.code ?? "EPIPE";
124
- const message = `xclaude logs: output ${stream === process.stdout ? "stdout" : "stderr"} closed (${code}). Stopping tail.`;
124
+ const message = `xclaw logs: output ${stream === process.stdout ? "stdout" : "stderr"} closed (${code}). Stopping tail.`;
125
125
  try {
126
126
  clearActiveProgressLine();
127
127
  process.stderr.write(`${message}\n`);
@@ -2064,7 +2064,7 @@ var GatewayClient = class {
2064
2064
  try {
2065
2065
  displayHost = new URL(url).hostname || url;
2066
2066
  } catch {}
2067
- const error = /* @__PURE__ */ new Error(`SECURITY ERROR: Cannot connect to "${displayHost}" over plaintext ws://. Both credentials and chat data would be exposed to network interception. Use wss:// for remote URLs. Safe defaults: keep gateway.bind=loopback and connect via SSH tunnel (ssh -N -L 18789:127.0.0.1:18789 user@gateway-host), or use Tailscale Serve/Funnel. ` + (allowPrivateWs ? "" : "Break-glass (trusted private networks only): set XCLAW_ALLOW_INSECURE_PRIVATE_WS=1. ") + "Run `xclaude doctor --fix` for guidance.");
2067
+ const error = /* @__PURE__ */ new Error(`SECURITY ERROR: Cannot connect to "${displayHost}" over plaintext ws://. Both credentials and chat data would be exposed to network interception. Use wss:// for remote URLs. Safe defaults: keep gateway.bind=loopback and connect via SSH tunnel (ssh -N -L 18789:127.0.0.1:18789 user@gateway-host), or use Tailscale Serve/Funnel. ` + (allowPrivateWs ? "" : "Break-glass (trusted private networks only): set XCLAW_ALLOW_INSECURE_PRIVATE_WS=1. ") + "Run `xclaw doctor --fix` for guidance.");
2068
2068
  this.opts.onConnectError?.(error);
2069
2069
  return;
2070
2070
  }
@@ -380,7 +380,7 @@ async function runNonInteractiveLocalSetup(params) {
380
380
  skippedReason: daemonInstall.skippedReason
381
381
  },
382
382
  daemonRuntime: daemonRuntimeRaw,
383
- hints: daemonInstall.skippedReason === "systemd-user-unavailable" ? ["Fix: rerun without `--install-daemon` for one-shot setup, or enable a working user-systemd session and retry.", "If your auth profile uses env-backed refs, keep those env vars set in the shell that runs `xclaude gateway run` or `xclaude agent --local`."] : [`Run \`${formatCliCommand("xclaw gateway status --deep")}\` for more detail.`]
383
+ hints: daemonInstall.skippedReason === "systemd-user-unavailable" ? ["Fix: rerun without `--install-daemon` for one-shot setup, or enable a working user-systemd session and retry.", "If your auth profile uses env-backed refs, keep those env vars set in the shell that runs `xclaw gateway run` or `xclaw agent --local`."] : [`Run \`${formatCliCommand("xclaw gateway status --deep")}\` for more detail.`]
384
384
  });
385
385
  runtime.exit(1);
386
386
  return;
@@ -837,7 +837,7 @@ async function maybeConfigureDmPolicies(params) {
837
837
  };
838
838
  await prompter.note([
839
839
  "Default: pairing (unknown DMs get a pairing code).",
840
- `Approve: ${formatCliCommand(`xclaude pairing approve ${policy.channel} <code>`)}`,
840
+ `Approve: ${formatCliCommand(`xclaw pairing approve ${policy.channel} <code>`)}`,
841
841
  `Allowlist DMs: ${policyKey}="allowlist" + ${allowFromKey} entries.`,
842
842
  `Public DMs: ${policyKey}="open" + ${allowFromKey} includes "*".`,
843
843
  "Multi-user DMs: run: " + formatCliCommand("xclaw config set session.dmScope \"per-channel-peer\"") + " (or \"per-account-channel-peer\" for multi-account channels) to isolate sessions.",
@@ -10,7 +10,7 @@ function buildPairingReply(params) {
10
10
  `Pairing code: ${code}`,
11
11
  "",
12
12
  "Ask the bot owner to approve with:",
13
- formatCliCommand(`xclaude pairing approve ${channel} ${code}`)
13
+ formatCliCommand(`xclaw pairing approve ${channel} ${code}`)
14
14
  ].join("\n");
15
15
  }
16
16
  //#endregion
@@ -95264,7 +95264,7 @@ function formatElevatedUnavailableMessage(params) {
95264
95264
  lines.push("- tools.elevated.allowFrom.<provider>");
95265
95265
  lines.push("- agents.list[].tools.elevated.enabled");
95266
95266
  lines.push("- agents.list[].tools.elevated.allowFrom.<provider>");
95267
- if (params.sessionKey) lines.push(`See: ${formatCliCommand(`xclaude sandbox explain --session ${params.sessionKey}`)}`);
95267
+ if (params.sessionKey) lines.push(`See: ${formatCliCommand(`xclaw sandbox explain --session ${params.sessionKey}`)}`);
95268
95268
  return lines.join("\n");
95269
95269
  }
95270
95270
  //#endregion
@@ -100372,7 +100372,7 @@ function buildSubagentSystemPrompt(params) {
100372
100372
  "For ACP harness sessions (codex/claudecode/gemini), use `sessions_spawn` with `runtime: \"acp\"` (set `agentId` unless `acp.defaultAgent` is configured).",
100373
100373
  "`agents_list` and `subagents` apply to XClaw sub-agents (`runtime: \"subagent\"`); ACP harness ids are controlled by `acp.allowedAgents`.",
100374
100374
  "Do not ask users to run slash commands or CLI when `sessions_spawn` can do it directly.",
100375
- "Do not use `exec` (`xclaude ...`, `acpx ...`) to spawn ACP sessions.",
100375
+ "Do not use `exec` (`xclaw ...`, `acpx ...`) to spawn ACP sessions.",
100376
100376
  "Use `subagents` only for XClaw subagents (`runtime: \"subagent\"`).",
100377
100377
  "Subagent results auto-announce back to you; ACP sessions continue in their bound thread.",
100378
100378
  "Avoid polling loops; spawn, orchestrate, and synthesize results."
@@ -115552,7 +115552,7 @@ function buildDocsSection(params) {
115552
115552
  "Community: https://discord.com/invite/clawd",
115553
115553
  "Find new skills: https://clawhub.com",
115554
115554
  "For XClaw behavior, commands, config, or architecture: consult local docs first.",
115555
- "When diagnosing issues, run `xclaude status` yourself when possible; only ask the user if you lack access (e.g., sandboxed).",
115555
+ "When diagnosing issues, run `xclaw status` yourself when possible; only ask the user if you lack access (e.g., sandboxed).",
115556
115556
  ""
115557
115557
  ];
115558
115558
  }
@@ -115752,7 +115752,7 @@ function buildAgentSystemPrompt(params) {
115752
115752
  "- xclaw gateway start",
115753
115753
  "- xclaw gateway stop",
115754
115754
  "- xclaw gateway restart",
115755
- "If unsure, ask the user to run `xclaude help` (or `xclaude gateway --help`) and paste the output.",
115755
+ "If unsure, ask the user to run `xclaw help` (or `xclaw gateway --help`) and paste the output.",
115756
115756
  "",
115757
115757
  ...skillsSection,
115758
115758
  ...memorySection,
@@ -442,11 +442,11 @@ function buildInvalidPluginInstallConfigError(message) {
442
442
  return error;
443
443
  }
444
444
  async function loadConfigFromSnapshotForInstall(request) {
445
- if (resolvePluginInstallInvalidConfigPolicy(request) !== "recover-matrix-only") throw buildInvalidPluginInstallConfigError("Config invalid; run `xclaude doctor --fix` before installing plugins.");
445
+ if (resolvePluginInstallInvalidConfigPolicy(request) !== "recover-matrix-only") throw buildInvalidPluginInstallConfigError("Config invalid; run `xclaw doctor --fix` before installing plugins.");
446
446
  const snapshot = await readConfigFileSnapshot();
447
447
  const parsed = snapshot.parsed ?? {};
448
- if (!snapshot.exists || Object.keys(parsed).length === 0) throw buildInvalidPluginInstallConfigError("Config file could not be parsed; run `xclaude doctor` to repair it.");
449
- if (snapshot.legacyIssues.length > 0 || snapshot.issues.length === 0 || snapshot.issues.some((issue) => !isAllowedMatrixRecoveryIssue(issue))) throw buildInvalidPluginInstallConfigError("Config invalid outside the Matrix upgrade recovery path; run `xclaude doctor --fix` before reinstalling Matrix.");
448
+ if (!snapshot.exists || Object.keys(parsed).length === 0) throw buildInvalidPluginInstallConfigError("Config file could not be parsed; run `xclaw doctor` to repair it.");
449
+ if (snapshot.legacyIssues.length > 0 || snapshot.issues.length === 0 || snapshot.issues.some((issue) => !isAllowedMatrixRecoveryIssue(issue))) throw buildInvalidPluginInstallConfigError("Config invalid outside the Matrix upgrade recovery path; run `xclaw doctor --fix` before reinstalling Matrix.");
450
450
  return (await cleanStaleMatrixPluginConfig(snapshot.config)).config;
451
451
  }
452
452
  async function loadConfigForInstall(request) {
@@ -3368,7 +3368,7 @@ function noteSourceInstallIssues(root) {
3368
3368
  //#region src/commands/doctor-memory-search.ts
3369
3369
  /**
3370
3370
  * Check whether memory search has a usable embedding provider.
3371
- * Runs as part of `xclaude doctor` — config-only, no network calls.
3371
+ * Runs as part of `xclaw doctor` — config-only, no network calls.
3372
3372
  */
3373
3373
  async function noteMemorySearchHealth(cfg, opts) {
3374
3374
  const agentId = resolveDefaultAgentId(cfg);
@@ -4443,9 +4443,9 @@ async function noteStateIntegrity(cfg, prompter, configPath) {
4443
4443
  });
4444
4444
  if (missing.length > 0) warnings.push([
4445
4445
  `- ${missing.length}/${recentTranscriptCandidates.length} recent sessions are missing transcripts.`,
4446
- ` Verify sessions in store: ${formatCliCommand(`xclaude sessions --store "${absoluteStorePath}"`)}`,
4447
- ` Preview cleanup impact: ${formatCliCommand(`xclaude sessions cleanup --store "${absoluteStorePath}" --dry-run`)}`,
4448
- ` Prune missing entries: ${formatCliCommand(`xclaude sessions cleanup --store "${absoluteStorePath}" --enforce --fix-missing`)}`
4446
+ ` Verify sessions in store: ${formatCliCommand(`xclaw sessions --store "${absoluteStorePath}"`)}`,
4447
+ ` Preview cleanup impact: ${formatCliCommand(`xclaw sessions cleanup --store "${absoluteStorePath}" --dry-run`)}`,
4448
+ ` Prune missing entries: ${formatCliCommand(`xclaw sessions cleanup --store "${absoluteStorePath}" --enforce --fix-missing`)}`
4449
4449
  ].join("\n"));
4450
4450
  const mainEntry = store[resolveMainSessionKey(cfg)];
4451
4451
  if (mainEntry?.sessionId) {
@@ -17,7 +17,7 @@ function resolveProviderAuthLoginCommand(params) {
17
17
  bundledProviderVitestCompat: true
18
18
  }).find((candidate) => matchesProviderId(candidate, params.provider));
19
19
  if (!provider || provider.auth.length === 0) return;
20
- return formatCliCommand(`xclaude models auth login --provider ${provider.id}`);
20
+ return formatCliCommand(`xclaw models auth login --provider ${provider.id}`);
21
21
  }
22
22
  function buildProviderAuthRecoveryHint(params) {
23
23
  const loginCommand = resolveProviderAuthLoginCommand(params);
@@ -297,7 +297,7 @@ async function dashboardCommand(runtime = defaultRuntime, options = {}) {
297
297
  if (resolvedToken.tokenSecretRefConfigured && token) runtime.log("Token auto-auth is disabled for SecretRef-managed gateway.auth.token; use your external token source if prompted.");
298
298
  if (resolvedToken.unresolvedRefReason) {
299
299
  runtime.log(`Token auto-auth unavailable: ${resolvedToken.unresolvedRefReason}`);
300
- runtime.log("Set XCLAW_GATEWAY_TOKEN in this shell or resolve your secret provider, then rerun `xclaude dashboard`.");
300
+ runtime.log("Set XCLAW_GATEWAY_TOKEN in this shell or resolve your secret provider, then rerun `xclaw dashboard`.");
301
301
  }
302
302
  const copied = await copyToClipboard(dashboardUrl).catch(() => false);
303
303
  runtime.log(copied ? "Copied to clipboard." : "Copy to clipboard unavailable.");
@@ -3871,12 +3871,12 @@ async function launchXClawChrome(resolved, profile) {
3871
3871
  });
3872
3872
  log.info(`🦞 xclaw browser profile decorated (${profile.color})`);
3873
3873
  } catch (err) {
3874
- log.warn(`xclaude browser profile decoration failed: ${String(err)}`);
3874
+ log.warn(`xclaw browser profile decoration failed: ${String(err)}`);
3875
3875
  }
3876
3876
  try {
3877
3877
  ensureProfileCleanExit(userDataDir);
3878
3878
  } catch (err) {
3879
- log.warn(`xclaude browser clean-exit prefs failed: ${String(err)}`);
3879
+ log.warn(`xclaw browser clean-exit prefs failed: ${String(err)}`);
3880
3880
  }
3881
3881
  const proc = spawnOnce();
3882
3882
  const stderrChunks = [];
@@ -4629,7 +4629,7 @@ async function stopKnownBrowserProfiles(params) {
4629
4629
  await ctx.forProfile(name).stopRunningBrowser();
4630
4630
  } catch {}
4631
4631
  } catch (err) {
4632
- params.onWarn(`xclaude browser stop failed: ${String(err)}`);
4632
+ params.onWarn(`xclaw browser stop failed: ${String(err)}`);
4633
4633
  }
4634
4634
  }
4635
4635
  //#endregion
@@ -96,7 +96,7 @@ function formatSandboxToolPolicyBlockedMessage(params) {
96
96
  lines.push(`- agents.defaults.sandbox.mode=off (disable sandbox)`);
97
97
  for (const fix of fixes) lines.push(`- ${fix}`);
98
98
  if (runtime.mode === "non-main") lines.push(`- Use main session key (direct): ${runtime.mainSessionKey}`);
99
- lines.push(`- See: ${formatCliCommand(`xclaude sandbox explain --session ${runtime.sessionKey}`)}`);
99
+ lines.push(`- See: ${formatCliCommand(`xclaw sandbox explain --session ${runtime.sessionKey}`)}`);
100
100
  return lines.join("\n");
101
101
  }
102
102
  //#endregion
@@ -1790,8 +1790,8 @@ async function ensureSandboxBrowser(params) {
1790
1790
  const lastUsedAtMs = registryEntry?.lastUsedAtMs;
1791
1791
  if (running && (typeof lastUsedAtMs !== "number" || now - lastUsedAtMs < HOT_BROWSER_WINDOW_MS)) {
1792
1792
  const hint = (() => {
1793
- if (params.cfg.scope === "session") return `xclaude sandbox recreate --browser --session ${params.scopeKey}`;
1794
- if (params.cfg.scope === "agent") return `xclaude sandbox recreate --browser --agent ${resolveSandboxAgentId(params.scopeKey) ?? "main"}`;
1793
+ if (params.cfg.scope === "session") return `xclaw sandbox recreate --browser --session ${params.scopeKey}`;
1794
+ if (params.cfg.scope === "agent") return `xclaw sandbox recreate --browser --agent ${resolveSandboxAgentId(params.scopeKey) ?? "main"}`;
1795
1795
  return "xclaw sandbox recreate --browser --all";
1796
1796
  })();
1797
1797
  defaultRuntime.log(`Sandbox browser config changed for ${containerName} (recently used). Recreate to apply: ${hint}`);
@@ -62,7 +62,7 @@ async function startBrowserControlServerFromConfig() {
62
62
  const s = app.listen(port, "127.0.0.1", () => resolve(s));
63
63
  s.once("error", reject);
64
64
  }).catch((err) => {
65
- logServer.error(`xclaude browser server failed to bind 127.0.0.1:${port}: ${String(err)}`);
65
+ logServer.error(`xclaw browser server failed to bind 127.0.0.1:${port}: ${String(err)}`);
66
66
  return null;
67
67
  });
68
68
  if (!server) return null;
@@ -139,8 +139,8 @@ function buildTelegramDmAccessWarningLines(accountId) {
139
139
  "Your bot is using DM policy: pairing.",
140
140
  "Any Telegram user who discovers the bot can send pairing requests.",
141
141
  "For private use, configure an allowlist with your Telegram user id:",
142
- " " + formatCliCommand(`xclaude config set ${configBase}.dmPolicy "allowlist"`),
143
- " " + formatCliCommand(`xclaude config set ${configBase}.allowFrom '["YOUR_USER_ID"]'`),
142
+ " " + formatCliCommand(`xclaw config set ${configBase}.dmPolicy "allowlist"`),
143
+ " " + formatCliCommand(`xclaw config set ${configBase}.allowFrom '["YOUR_USER_ID"]'`),
144
144
  `Docs: ${formatDocsLink("/channels/pairing", "channels/pairing")}`
145
145
  ];
146
146
  }
@@ -664,7 +664,7 @@ function resolveWorkspaceSkillPromptState(workspaceDir, opts) {
664
664
  eligible,
665
665
  prompt: [
666
666
  remoteNote,
667
- truncated ? `⚠️ Skills truncated: included ${skillsForPrompt.length} of ${resolvedSkills.length}${compact ? " (compact format, descriptions omitted)" : ""}. Run \`xclaude skills check\` to audit.` : compact ? `⚠️ Skills catalog using compact format (descriptions omitted). Run \`xclaude skills check\` to audit.` : "",
667
+ truncated ? `⚠️ Skills truncated: included ${skillsForPrompt.length} of ${resolvedSkills.length}${compact ? " (compact format, descriptions omitted)" : ""}. Run \`xclaw skills check\` to audit.` : compact ? `⚠️ Skills catalog using compact format (descriptions omitted). Run \`xclaw skills check\` to audit.` : "",
668
668
  compact ? formatSkillsCompact(skillsForPrompt) : formatSkillsForPrompt(skillsForPrompt)
669
669
  ].filter(Boolean).join("\n"),
670
670
  resolvedSkills
@@ -21,7 +21,7 @@ import { i as updateSkillsFromClawHub, n as readTrackedClawHubSkillSlugs, r as s
21
21
  //#region src/cli/skills-cli.format.ts
22
22
  function appendClawHubHint(output, json) {
23
23
  if (json) return output;
24
- return `${output}\n\nTip: use \`xclaude skills search\`, \`xclaude skills install\`, and \`xclaude skills update\` for ClawHub-backed skills.`;
24
+ return `${output}\n\nTip: use \`xclaw skills search\`, \`xclaw skills install\`, and \`xclaw skills update\` for ClawHub-backed skills.`;
25
25
  }
26
26
  function formatSkillStatus(skill) {
27
27
  if (skill.eligible) return theme.success("✓ ready");
@@ -198,7 +198,7 @@ function formatSkillInfo(report, skillName, opts) {
198
198
  lines.push(theme.heading("API key setup:"));
199
199
  if (safeHomepage) lines.push(` Get your key: ${safeHomepage}`);
200
200
  lines.push(` Save via UI: ${theme.muted("Control UI → Skills → ")}${safeName}${theme.muted(" → Save key")}`);
201
- lines.push(` Save via CLI: ${formatCliCommand(`xclaude config set skills.entries.${safeSkillKey}.apiKey YOUR_KEY`)}`);
201
+ lines.push(` Save via CLI: ${formatCliCommand(`xclaw config set skills.entries.${safeSkillKey}.apiKey YOUR_KEY`)}`);
202
202
  lines.push(` Stored in: ${theme.muted("~/.xclaw/xclaw.json")} ${theme.muted(`(skills.entries.${safeSkillKey}.apiKey)`)}`);
203
203
  }
204
204
  return appendClawHubHint(lines.join("\n"), opts.json);
@@ -1367,7 +1367,7 @@ async function statusCommand(opts, runtime) {
1367
1367
  if (pairingRecovery) {
1368
1368
  runtime.log("");
1369
1369
  runtime.log(theme.warn("Gateway pairing approval required."));
1370
- if (pairingRecovery.requestId) runtime.log(theme.muted(`Recovery: ${formatCliCommand(`xclaude devices approve ${pairingRecovery.requestId}`)}`));
1370
+ if (pairingRecovery.requestId) runtime.log(theme.muted(`Recovery: ${formatCliCommand(`xclaw devices approve ${pairingRecovery.requestId}`)}`));
1371
1371
  runtime.log(theme.muted(`Fallback: ${formatCliCommand("xclaw devices approve --latest")}`));
1372
1372
  runtime.log(theme.muted(`Inspect: ${formatCliCommand("xclaw devices list")}`));
1373
1373
  }
@@ -173,7 +173,7 @@ function auditGatewayToken(command, issues, expectedGatewayToken) {
173
173
  issues.push({
174
174
  code: SERVICE_AUDIT_CODES.gatewayTokenEmbedded,
175
175
  message: "Gateway service embeds XCLAW_GATEWAY_TOKEN and should be reinstalled.",
176
- detail: "Run `xclaude gateway install --force` to remove embedded service token.",
176
+ detail: "Run `xclaw gateway install --force` to remove embedded service token.",
177
177
  level: "recommended"
178
178
  });
179
179
  const expectedToken = expectedGatewayToken?.trim();
@@ -277,7 +277,7 @@ function checkTokenDrift(params) {
277
277
  if (configToken && serviceToken !== configToken) return {
278
278
  code: SERVICE_AUDIT_CODES.gatewayTokenDrift,
279
279
  message: "Config token differs from service token. The daemon will use the old token after restart.",
280
- detail: "Run `xclaude gateway install --force` to sync the token.",
280
+ detail: "Run `xclaw gateway install --force` to sync the token.",
281
281
  level: "recommended"
282
282
  };
283
283
  return null;
@@ -474,7 +474,7 @@ function resolveAcpInstallCommandHint(cfg) {
474
474
  const backendId = resolveConfiguredAcpBackendId(cfg).toLowerCase();
475
475
  if (backendId === "acpx") {
476
476
  const localPath = path.resolve(process.cwd(), "extensions/acpx");
477
- if (existsSync(localPath)) return `xclaude plugins install ${localPath}`;
477
+ if (existsSync(localPath)) return `xclaw plugins install ${localPath}`;
478
478
  return "xclaw plugins install acpx";
479
479
  }
480
480
  return `Install and enable the plugin that provides ACP backend "${backendId}".`;
@@ -3206,7 +3206,7 @@ function resolveGatewayDisconnectState(reason) {
3206
3206
  if (/pairing required/i.test(reasonLabel)) return {
3207
3207
  connectionStatus: `gateway disconnected: ${reasonLabel}`,
3208
3208
  activityStatus: "pairing required: run xclaw devices list",
3209
- pairingHint: "Pairing required. Run `xclaude devices list`, approve your request ID, then reconnect."
3209
+ pairingHint: "Pairing required. Run `xclaw devices list`, approve your request ID, then reconnect."
3210
3210
  };
3211
3211
  return {
3212
3212
  connectionStatus: `gateway disconnected: ${reasonLabel}`,
@@ -3492,7 +3492,7 @@ async function runTui(opts) {
3492
3492
  const updateHeader = () => {
3493
3493
  const sessionLabel = formatSessionKey(currentSessionKey);
3494
3494
  const agentLabel = formatAgentLabel(currentAgentId);
3495
- header.setText(theme.header(`xclaude tui - ${client.connection.url} - agent ${agentLabel} - session ${sessionLabel}`));
3495
+ header.setText(theme.header(`xclaw tui - ${client.connection.url} - agent ${agentLabel} - session ${sessionLabel}`));
3496
3496
  };
3497
3497
  const busyStates = new Set([
3498
3498
  "sending",
@@ -1431,7 +1431,7 @@ async function updateCommand(opts) {
1431
1431
  //#region src/cli/update-cli/wizard.ts
1432
1432
  async function updateWizardCommand(opts = {}) {
1433
1433
  if (!process.stdin.isTTY) {
1434
- defaultRuntime.error("Update wizard requires a TTY. Use `xclaude update --channel <stable|beta|dev>` instead.");
1434
+ defaultRuntime.error("Update wizard requires a TTY. Use `xclaw update --channel <stable|beta|dev>` instead.");
1435
1435
  defaultRuntime.exit(1);
1436
1436
  return;
1437
1437
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amirtechai/xclaude",
3
- "version": "2026.3.26",
3
+ "version": "2026.3.27",
4
4
  "description": "Multi-channel AI gateway with extensible messaging integrations",
5
5
  "keywords": [],
6
6
  "homepage": "https://xclaw.amirtech.ai",
package/xclaw.mjs CHANGED
@@ -109,7 +109,7 @@ const exists = async (specifier) => {
109
109
  };
110
110
 
111
111
  const buildMissingEntryErrorMessage = async () => {
112
- const lines = ["xclaude: missing dist/entry.(m)js (build output)."];
112
+ const lines = ["xclaw: missing dist/entry.(m)js (build output)."];
113
113
  if (!(await exists("./src/entry.ts"))) {
114
114
  return lines.join("\n");
115
115
  }