xtrm-tools 0.5.34 → 0.5.36
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/.claude-plugin/plugin.json +1 -1
- package/cli/dist/index.cjs +66 -32
- package/cli/dist/index.cjs.map +1 -1
- package/cli/package.json +1 -1
- package/config/pi/extensions/pi-serena-compact/index.ts +121 -0
- package/config/pi/extensions/pi-serena-compact/package.json +16 -0
- package/package.json +1 -1
- package/plugins/xtrm-tools/.claude-plugin/plugin.json +1 -1
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,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
|
-
|
|
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
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(`
|
|
41053
|
-
console.log(`
|
|
41054
|
-
console.log(`
|
|
41055
|
-
console.log(`
|
|
41056
|
-
console.log(`
|
|
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(` bv --robot-triage ${d("graph-aware triage \u2014 find highest-impact work")}`);
|
|
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(`
|
|
41060
|
-
console.log(`
|
|
41061
|
-
console.log(`
|
|
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(`
|
|
41065
|
-
console.log(`
|
|
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
|
-
|
|
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")} ${
|
|
41078
|
-
` ${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`
|
|
41079
41078
|
] : [],
|
|
41080
|
-
...isDryRun ? ["",
|
|
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:
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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 };
|
|
@@ -41388,6 +41387,41 @@ function createInstallCommand() {
|
|
|
41388
41387
|
}
|
|
41389
41388
|
}
|
|
41390
41389
|
}
|
|
41390
|
+
if (!backport) {
|
|
41391
|
+
console.log(t.bold("\n \u2699 bv (beads graph triage)"));
|
|
41392
|
+
const bvOk = (() => {
|
|
41393
|
+
try {
|
|
41394
|
+
(0, import_child_process2.execSync)("bv --version", { stdio: "ignore" });
|
|
41395
|
+
return true;
|
|
41396
|
+
} catch {
|
|
41397
|
+
return false;
|
|
41398
|
+
}
|
|
41399
|
+
})();
|
|
41400
|
+
if (bvOk) {
|
|
41401
|
+
console.log(t.success(" \u2713 bv already installed\n"));
|
|
41402
|
+
} else {
|
|
41403
|
+
let doInstall = effectiveYes;
|
|
41404
|
+
if (!effectiveYes) {
|
|
41405
|
+
const { install } = await (0, import_prompts.default)({
|
|
41406
|
+
type: "confirm",
|
|
41407
|
+
name: "install",
|
|
41408
|
+
message: "Install bv (beads_viewer)? \u2014 graph-aware triage for bd issues",
|
|
41409
|
+
initial: true
|
|
41410
|
+
});
|
|
41411
|
+
doInstall = install;
|
|
41412
|
+
}
|
|
41413
|
+
if (doInstall) {
|
|
41414
|
+
console.log(t.muted("\n Installing bv..."));
|
|
41415
|
+
(0, import_child_process3.spawnSync)("bash", [
|
|
41416
|
+
"-c",
|
|
41417
|
+
"curl -fsSL https://raw.githubusercontent.com/Jaggerxtrm/beads_viewer/main/scripts/install-bv.sh | bash"
|
|
41418
|
+
], { stdio: "inherit" });
|
|
41419
|
+
console.log(t.success(" \u2713 bv installed\n"));
|
|
41420
|
+
} else {
|
|
41421
|
+
console.log(t.muted(" \u2139 Skipped.\n"));
|
|
41422
|
+
}
|
|
41423
|
+
}
|
|
41424
|
+
}
|
|
41391
41425
|
if (!backport) {
|
|
41392
41426
|
console.log(t.bold("\n \u2699 deepwiki (AI-powered repo documentation)"));
|
|
41393
41427
|
const deepwikiOk = isDeepwikiInstalled();
|
|
@@ -41456,12 +41490,12 @@ function createInstallCommand() {
|
|
|
41456
41490
|
await syncMcpForTargets(repoRoot, otherTargets, dryRun);
|
|
41457
41491
|
}
|
|
41458
41492
|
if (allChanges.length === 0) {
|
|
41459
|
-
console.log("\n" +
|
|
41493
|
+
console.log("\n" + kleur_default.bold("\u2713 Files are up-to-date") + "\n");
|
|
41460
41494
|
return;
|
|
41461
41495
|
}
|
|
41462
41496
|
renderPlanTable(allChanges);
|
|
41463
41497
|
if (dryRun) {
|
|
41464
|
-
console.log(
|
|
41498
|
+
console.log(kleur_default.dim(" Dry run \u2014 no changes written\n"));
|
|
41465
41499
|
return;
|
|
41466
41500
|
}
|
|
41467
41501
|
if (!effectiveYes) {
|