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.
package/cli/dist/index.cjs
CHANGED
|
@@ -40968,7 +40968,7 @@ async function runPiInstall(dryRun = false) {
|
|
|
40968
40968
|
return;
|
|
40969
40969
|
}
|
|
40970
40970
|
} else {
|
|
40971
|
-
console.log(kleur_default.
|
|
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.
|
|
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(
|
|
41029
|
-
t.header(
|
|
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
|
-
|
|
41039
|
-
missing > 0 ?
|
|
41040
|
-
outdated > 0 ?
|
|
41041
|
-
kleur_default.bold(
|
|
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
|
-
|
|
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")} ${
|
|
41056
|
-
` ${t.label("Hint")} run
|
|
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 ? ["",
|
|
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:
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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" +
|
|
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(
|
|
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());
|