xtrm-tools 0.5.33 → 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.33",
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,32 +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
+ function printNextSteps() {
41047
+ const d = (s) => kleur_default.dim(s);
41048
+ const b = (s) => kleur_default.bold(s);
41049
+ console.log(b(" Next steps\n"));
41050
+ console.log(d(" In your project:"));
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")}`);
41056
+ console.log("");
41057
+ console.log(d(" Worktree workflow:"));
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")}`);
41061
+ console.log("");
41062
+ console.log(d(" Reference:"));
41063
+ console.log(` xtrm status ${d("check installed vs repo")}`);
41064
+ console.log(` xtrm docs show ${d("browse all documentation")}`);
41065
+ console.log("");
41066
+ }
41046
41067
  async function renderSummaryCard(allChanges, totalCount, allSkipped, isDryRun) {
41047
41068
  const boxen2 = (await Promise.resolve().then(() => (init_boxen(), boxen_exports))).default;
41048
41069
  const hasDrift = allSkipped.length > 0;
41049
41070
  const lines = [
41050
- 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)") : ""),
41051
41072
  "",
41052
41073
  ` ${t.label("Targets")} ${allChanges.length} environment${allChanges.length !== 1 ? "s" : ""}`,
41053
41074
  ` ${t.label("Installed")} ${totalCount} item${totalCount !== 1 ? "s" : ""}`,
41054
41075
  ...hasDrift ? [
41055
- ` ${t.label("Skipped")} ${kleur_default.yellow(String(allSkipped.length))} drifted (local changes preserved)`,
41056
- ` ${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`
41057
41078
  ] : [],
41058
- ...isDryRun ? ["", t.accent(" Dry run \u2014 no changes written")] : []
41079
+ ...isDryRun ? ["", kleur_default.dim(" Dry run \u2014 no changes written")] : []
41059
41080
  ];
41060
41081
  console.log("\n" + boxen2(lines.join("\n"), {
41061
41082
  padding: { top: 1, bottom: 1, left: 1, right: 3 },
41062
41083
  borderStyle: "round",
41063
- borderColor: hasDrift ? "yellow" : "green"
41084
+ borderColor: "gray"
41064
41085
  }) + "\n");
41065
41086
  }
41066
41087
  function formatTargetLabel(target) {
@@ -41125,7 +41146,7 @@ var OFFICIAL_CLAUDE_PLUGINS = [
41125
41146
  async function installOfficialClaudePlugins(dryRun) {
41126
41147
  console.log(t.bold("\n \u2699 official Claude plugins (serena/context7/github/ralph-loop)"));
41127
41148
  if (dryRun) {
41128
- 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"));
41129
41150
  return;
41130
41151
  }
41131
41152
  (0, import_child_process3.spawnSync)("claude", ["plugin", "marketplace", "add", OFFICIAL_CLAUDE_MARKETPLACE, "--scope", "user"], { stdio: "pipe" });
@@ -41161,7 +41182,7 @@ async function cleanStalePrePluginFiles(repoRoot, dryRun) {
41161
41182
  const staleFile = import_path12.default.join(staleHooksDir, name);
41162
41183
  if (await import_fs_extra12.default.pathExists(staleFile)) {
41163
41184
  if (dryRun) {
41164
- 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}`));
41165
41186
  } else {
41166
41187
  await import_fs_extra12.default.remove(staleFile);
41167
41188
  console.log(t.muted(` \u2717 Removed stale hook: ~/.claude/hooks/${name}`));
@@ -41177,7 +41198,7 @@ async function cleanStalePrePluginFiles(repoRoot, dryRun) {
41177
41198
  const staleDir = import_path12.default.join(staleSkillsDir, name);
41178
41199
  if (await import_fs_extra12.default.pathExists(staleDir)) {
41179
41200
  if (dryRun) {
41180
- 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}`));
41181
41202
  } else {
41182
41203
  await import_fs_extra12.default.remove(staleDir);
41183
41204
  console.log(t.muted(` \u2717 Removed stale skill: ~/.claude/skills/${name}`));
@@ -41207,7 +41228,7 @@ async function cleanStalePrePluginFiles(repoRoot, dryRun) {
41207
41228
  for (const h of staleHooks) {
41208
41229
  const msg = `settings.json [${event}] hook: ${h.command}`;
41209
41230
  if (dryRun) {
41210
- console.log(t.accent(` [DRY RUN] Would remove stale ${msg}`));
41231
+ console.log(kleur_default.dim(` [DRY RUN] Would remove stale ${msg}`));
41211
41232
  } else {
41212
41233
  console.log(t.muted(` \u2717 Removed stale ${msg}`));
41213
41234
  }
@@ -41263,7 +41284,7 @@ async function installPlugin(repoRoot, dryRun) {
41263
41284
  console.log(t.bold("\n \u2699 xtrm-tools (Claude Code plugin)"));
41264
41285
  warnIfOutdated();
41265
41286
  if (dryRun) {
41266
- 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"));
41267
41288
  await cleanStalePrePluginFiles(repoRoot, true);
41268
41289
  await installOfficialClaudePlugins(true);
41269
41290
  return;
@@ -41288,7 +41309,7 @@ function installUserStatusLine(dryRun) {
41288
41309
  const settingsPath = import_path12.default.join(import_os5.default.homedir(), ".claude", "settings.json");
41289
41310
  const settings = import_fs_extra12.default.existsSync(settingsPath) ? JSON.parse(import_fs_extra12.default.readFileSync(settingsPath, "utf8")) : {};
41290
41311
  if (dryRun) {
41291
- console.log(t.accent(` [DRY RUN] Would write statusLine \u2192 ${scriptPath}`));
41312
+ console.log(kleur_default.dim(` [DRY RUN] Would write statusLine \u2192 ${scriptPath}`));
41292
41313
  return;
41293
41314
  }
41294
41315
  settings.statusLine = { type: "command", command: `node ${scriptPath}`, padding: 1 };
@@ -41434,12 +41455,12 @@ function createInstallCommand() {
41434
41455
  await syncMcpForTargets(repoRoot, otherTargets, dryRun);
41435
41456
  }
41436
41457
  if (allChanges.length === 0) {
41437
- 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");
41438
41459
  return;
41439
41460
  }
41440
41461
  renderPlanTable(allChanges);
41441
41462
  if (dryRun) {
41442
- 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"));
41443
41464
  return;
41444
41465
  }
41445
41466
  if (!effectiveYes) {
@@ -41471,6 +41492,9 @@ function createInstallCommand() {
41471
41492
  }
41472
41493
  const allSkipped = allChanges.flatMap((c) => c.skippedDrifted);
41473
41494
  await renderSummaryCard(allChanges, totalCount, allSkipped, dryRun);
41495
+ if (!dryRun && !backport) {
41496
+ printNextSteps();
41497
+ }
41474
41498
  });
41475
41499
  installCmd.addCommand(createInstallAllCommand());
41476
41500
  installCmd.addCommand(createInstallBasicCommand());