xtrm-tools 0.5.34 → 0.5.35

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xtrm-tools",
3
- "version": "0.5.34",
3
+ "version": "0.5.35",
4
4
  "description": "xtrm-tools: dual-runtime workflow enforcement (Claude Code + Pi) — hooks, extensions, skills, and MCP servers",
5
5
  "author": {
6
6
  "name": "jaggers"
@@ -40968,7 +40968,7 @@ async function runPiInstall(dryRun = false) {
40968
40968
  return;
40969
40969
  }
40970
40970
  } else {
40971
- console.log(kleur_default.cyan(" [DRY RUN] npm install -g oh-pi"));
40971
+ console.log(kleur_default.dim(" [DRY RUN] npm install -g oh-pi"));
40972
40972
  }
40973
40973
  console.log(t.success(" \u2713 pi installed"));
40974
40974
  } else {
@@ -41002,7 +41002,7 @@ async function runPiInstall(dryRun = false) {
41002
41002
  } else {
41003
41003
  for (const pkg of preCheck.packages.needed) {
41004
41004
  if (dryRun) {
41005
- console.log(kleur_default.cyan(` [DRY RUN] pi install ${pkg}`));
41005
+ console.log(kleur_default.dim(` [DRY RUN] pi install ${pkg}`));
41006
41006
  continue;
41007
41007
  }
41008
41008
  const r = (0, import_node_child_process2.spawnSync)("pi", ["install", pkg], { stdio: "pipe", encoding: "utf8" });
@@ -41025,8 +41025,8 @@ function renderPlanTable(allChanges) {
41025
41025
  const table = new Table({
41026
41026
  head: [
41027
41027
  t.header("Target"),
41028
- t.header(kleur_default.green("+ New")),
41029
- t.header(kleur_default.yellow("\u2191 Update")),
41028
+ t.header("+ New"),
41029
+ t.header("\u2191 Update"),
41030
41030
  t.header("Total")
41031
41031
  ],
41032
41032
  style: { head: [], border: [] }
@@ -41035,54 +41035,53 @@ function renderPlanTable(allChanges) {
41035
41035
  const missing = Object.values(changeSet).reduce((s, c) => s + c.missing.length, 0);
41036
41036
  const outdated = Object.values(changeSet).reduce((s, c) => s + c.outdated.length, 0);
41037
41037
  table.push([
41038
- kleur_default.white(formatTargetLabel(target)),
41039
- missing > 0 ? kleur_default.green(String(missing)) : t.label("\u2014"),
41040
- outdated > 0 ? kleur_default.yellow(String(outdated)) : t.label("\u2014"),
41041
- kleur_default.bold().white(String(totalChanges))
41038
+ formatTargetLabel(target),
41039
+ missing > 0 ? String(missing) : t.label("\u2014"),
41040
+ outdated > 0 ? String(outdated) : t.label("\u2014"),
41041
+ kleur_default.bold(String(totalChanges))
41042
41042
  ]);
41043
41043
  }
41044
41044
  console.log("\n" + table.toString() + "\n");
41045
41045
  }
41046
41046
  function printNextSteps() {
41047
- const c = (s) => kleur_default.cyan(s);
41048
41047
  const d = (s) => kleur_default.dim(s);
41049
41048
  const b = (s) => kleur_default.bold(s);
41050
41049
  console.log(b(" Next steps\n"));
41051
41050
  console.log(d(" In your project:"));
41052
- console.log(` ${c("xtrm init")} ${d("initialize beads + gitnexus for this repo")}`);
41053
- console.log(` ${c("bd prime")} ${d("load session context and available work")}`);
41054
- console.log(` ${c("bd ready")} ${d("find unblocked issues to work on")}`);
41055
- console.log(` ${c("bd update <id> --claim")} ${d("claim an issue before editing any file")}`);
41056
- console.log(` ${c("bd close <id>")} ${d("close when done \u2014 auto-commits")}`);
41051
+ console.log(` xtrm init ${d("initialize beads + gitnexus for this repo")}`);
41052
+ console.log(` bd prime ${d("load session context and available work")}`);
41053
+ console.log(` bd ready ${d("find unblocked issues to work on")}`);
41054
+ console.log(` bd update <id> --claim ${d("claim an issue before editing any file")}`);
41055
+ console.log(` bd close <id> ${d("close when done \u2014 auto-commits")}`);
41057
41056
  console.log("");
41058
41057
  console.log(d(" Worktree workflow:"));
41059
- console.log(` ${c("xt claude")} ${d("launch Claude Code in a sandboxed worktree")}`);
41060
- console.log(` ${c("xt end --dry-run")} ${d("preview PR title, body, and linked issues")}`);
41061
- console.log(` ${c("xt end")} ${d("push branch, open PR, clean up worktree")}`);
41058
+ console.log(` xt claude ${d("launch Claude Code in a sandboxed worktree")}`);
41059
+ console.log(` xt end --dry-run ${d("preview PR title, body, and linked issues")}`);
41060
+ console.log(` xt end ${d("push branch, open PR, clean up worktree")}`);
41062
41061
  console.log("");
41063
41062
  console.log(d(" Reference:"));
41064
- console.log(` ${c("xtrm status")} ${d("check installed vs repo")}`);
41065
- console.log(` ${c("xtrm docs show")} ${d("browse all documentation")}`);
41063
+ console.log(` xtrm status ${d("check installed vs repo")}`);
41064
+ console.log(` xtrm docs show ${d("browse all documentation")}`);
41066
41065
  console.log("");
41067
41066
  }
41068
41067
  async function renderSummaryCard(allChanges, totalCount, allSkipped, isDryRun) {
41069
41068
  const boxen2 = (await Promise.resolve().then(() => (init_boxen(), boxen_exports))).default;
41070
41069
  const hasDrift = allSkipped.length > 0;
41071
41070
  const lines = [
41072
- hasDrift ? t.boldGreen(" \u2713 Install complete") + t.warning(" (with skipped drift)") : t.boldGreen(" \u2713 Install complete"),
41071
+ kleur_default.bold(" \u2713 Install complete") + (hasDrift ? kleur_default.dim(" (with skipped drift)") : ""),
41073
41072
  "",
41074
41073
  ` ${t.label("Targets")} ${allChanges.length} environment${allChanges.length !== 1 ? "s" : ""}`,
41075
41074
  ` ${t.label("Installed")} ${totalCount} item${totalCount !== 1 ? "s" : ""}`,
41076
41075
  ...hasDrift ? [
41077
- ` ${t.label("Skipped")} ${kleur_default.yellow(String(allSkipped.length))} drifted (local changes preserved)`,
41078
- ` ${t.label("Hint")} run ${t.accent("xtrm install --backport")} to push them back`
41076
+ ` ${t.label("Skipped")} ${allSkipped.length} drifted (local changes preserved)`,
41077
+ ` ${t.label("Hint")} run xtrm install --backport to push them back`
41079
41078
  ] : [],
41080
- ...isDryRun ? ["", t.accent(" Dry run \u2014 no changes written")] : []
41079
+ ...isDryRun ? ["", kleur_default.dim(" Dry run \u2014 no changes written")] : []
41081
41080
  ];
41082
41081
  console.log("\n" + boxen2(lines.join("\n"), {
41083
41082
  padding: { top: 1, bottom: 1, left: 1, right: 3 },
41084
41083
  borderStyle: "round",
41085
- borderColor: hasDrift ? "yellow" : "green"
41084
+ borderColor: "gray"
41086
41085
  }) + "\n");
41087
41086
  }
41088
41087
  function formatTargetLabel(target) {
@@ -41147,7 +41146,7 @@ var OFFICIAL_CLAUDE_PLUGINS = [
41147
41146
  async function installOfficialClaudePlugins(dryRun) {
41148
41147
  console.log(t.bold("\n \u2699 official Claude plugins (serena/context7/github/ralph-loop)"));
41149
41148
  if (dryRun) {
41150
- console.log(t.accent(" [DRY RUN] Would register claude-plugins-official marketplace and install official plugins\n"));
41149
+ console.log(kleur_default.dim(" [DRY RUN] Would register claude-plugins-official marketplace and install official plugins\n"));
41151
41150
  return;
41152
41151
  }
41153
41152
  (0, import_child_process3.spawnSync)("claude", ["plugin", "marketplace", "add", OFFICIAL_CLAUDE_MARKETPLACE, "--scope", "user"], { stdio: "pipe" });
@@ -41183,7 +41182,7 @@ async function cleanStalePrePluginFiles(repoRoot, dryRun) {
41183
41182
  const staleFile = import_path12.default.join(staleHooksDir, name);
41184
41183
  if (await import_fs_extra12.default.pathExists(staleFile)) {
41185
41184
  if (dryRun) {
41186
- console.log(t.accent(` [DRY RUN] Would remove stale hook: ~/.claude/hooks/${name}`));
41185
+ console.log(kleur_default.dim(` [DRY RUN] Would remove stale hook: ~/.claude/hooks/${name}`));
41187
41186
  } else {
41188
41187
  await import_fs_extra12.default.remove(staleFile);
41189
41188
  console.log(t.muted(` \u2717 Removed stale hook: ~/.claude/hooks/${name}`));
@@ -41199,7 +41198,7 @@ async function cleanStalePrePluginFiles(repoRoot, dryRun) {
41199
41198
  const staleDir = import_path12.default.join(staleSkillsDir, name);
41200
41199
  if (await import_fs_extra12.default.pathExists(staleDir)) {
41201
41200
  if (dryRun) {
41202
- console.log(t.accent(` [DRY RUN] Would remove stale skill: ~/.claude/skills/${name}`));
41201
+ console.log(kleur_default.dim(` [DRY RUN] Would remove stale skill: ~/.claude/skills/${name}`));
41203
41202
  } else {
41204
41203
  await import_fs_extra12.default.remove(staleDir);
41205
41204
  console.log(t.muted(` \u2717 Removed stale skill: ~/.claude/skills/${name}`));
@@ -41229,7 +41228,7 @@ async function cleanStalePrePluginFiles(repoRoot, dryRun) {
41229
41228
  for (const h of staleHooks) {
41230
41229
  const msg = `settings.json [${event}] hook: ${h.command}`;
41231
41230
  if (dryRun) {
41232
- console.log(t.accent(` [DRY RUN] Would remove stale ${msg}`));
41231
+ console.log(kleur_default.dim(` [DRY RUN] Would remove stale ${msg}`));
41233
41232
  } else {
41234
41233
  console.log(t.muted(` \u2717 Removed stale ${msg}`));
41235
41234
  }
@@ -41285,7 +41284,7 @@ async function installPlugin(repoRoot, dryRun) {
41285
41284
  console.log(t.bold("\n \u2699 xtrm-tools (Claude Code plugin)"));
41286
41285
  warnIfOutdated();
41287
41286
  if (dryRun) {
41288
- console.log(t.accent(" [DRY RUN] Would register xtrm-tools marketplace and install plugin\n"));
41287
+ console.log(kleur_default.dim(" [DRY RUN] Would register xtrm-tools marketplace and install plugin\n"));
41289
41288
  await cleanStalePrePluginFiles(repoRoot, true);
41290
41289
  await installOfficialClaudePlugins(true);
41291
41290
  return;
@@ -41310,7 +41309,7 @@ function installUserStatusLine(dryRun) {
41310
41309
  const settingsPath = import_path12.default.join(import_os5.default.homedir(), ".claude", "settings.json");
41311
41310
  const settings = import_fs_extra12.default.existsSync(settingsPath) ? JSON.parse(import_fs_extra12.default.readFileSync(settingsPath, "utf8")) : {};
41312
41311
  if (dryRun) {
41313
- console.log(t.accent(` [DRY RUN] Would write statusLine \u2192 ${scriptPath}`));
41312
+ console.log(kleur_default.dim(` [DRY RUN] Would write statusLine \u2192 ${scriptPath}`));
41314
41313
  return;
41315
41314
  }
41316
41315
  settings.statusLine = { type: "command", command: `node ${scriptPath}`, padding: 1 };
@@ -41456,12 +41455,12 @@ function createInstallCommand() {
41456
41455
  await syncMcpForTargets(repoRoot, otherTargets, dryRun);
41457
41456
  }
41458
41457
  if (allChanges.length === 0) {
41459
- console.log("\n" + t.boldGreen("\u2713 Files are up-to-date") + "\n");
41458
+ console.log("\n" + kleur_default.bold("\u2713 Files are up-to-date") + "\n");
41460
41459
  return;
41461
41460
  }
41462
41461
  renderPlanTable(allChanges);
41463
41462
  if (dryRun) {
41464
- console.log(t.accent("\u{1F4A1} Dry run \u2014 no changes written\n"));
41463
+ console.log(kleur_default.dim(" Dry run \u2014 no changes written\n"));
41465
41464
  return;
41466
41465
  }
41467
41466
  if (!effectiveYes) {