xtrm-tools 0.5.6 → 0.5.7
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 +102 -9
- package/cli/dist/index.cjs.map +1 -1
- package/cli/package.json +1 -1
- package/hooks/README.md +14 -0
- package/package.json +1 -1
- package/skills/using-xtrm/SKILL.md +9 -12
package/cli/dist/index.cjs
CHANGED
|
@@ -31075,7 +31075,7 @@ var require_main = __commonJS({
|
|
|
31075
31075
|
"use strict";
|
|
31076
31076
|
var fs22 = require("fs");
|
|
31077
31077
|
var path21 = require("path");
|
|
31078
|
-
var
|
|
31078
|
+
var os8 = require("os");
|
|
31079
31079
|
var crypto2 = require("crypto");
|
|
31080
31080
|
var packageJson = require_package();
|
|
31081
31081
|
var version3 = packageJson.version;
|
|
@@ -31198,7 +31198,7 @@ var require_main = __commonJS({
|
|
|
31198
31198
|
return null;
|
|
31199
31199
|
}
|
|
31200
31200
|
function _resolveHome(envPath) {
|
|
31201
|
-
return envPath[0] === "~" ? path21.join(
|
|
31201
|
+
return envPath[0] === "~" ? path21.join(os8.homedir(), envPath.slice(1)) : envPath;
|
|
31202
31202
|
}
|
|
31203
31203
|
function _configVault(options) {
|
|
31204
31204
|
const debug = Boolean(options && options.debug);
|
|
@@ -31880,7 +31880,7 @@ var require_has_flag = __commonJS({
|
|
|
31880
31880
|
var require_supports_colors = __commonJS({
|
|
31881
31881
|
"../node_modules/@colors/colors/lib/system/supports-colors.js"(exports2, module2) {
|
|
31882
31882
|
"use strict";
|
|
31883
|
-
var
|
|
31883
|
+
var os8 = require("os");
|
|
31884
31884
|
var hasFlag2 = require_has_flag();
|
|
31885
31885
|
var env3 = process.env;
|
|
31886
31886
|
var forceColor = void 0;
|
|
@@ -31918,7 +31918,7 @@ var require_supports_colors = __commonJS({
|
|
|
31918
31918
|
}
|
|
31919
31919
|
var min = forceColor ? 1 : 0;
|
|
31920
31920
|
if (process.platform === "win32") {
|
|
31921
|
-
var osRelease =
|
|
31921
|
+
var osRelease = os8.release().split(".");
|
|
31922
31922
|
if (Number(process.versions.node.split(".")[0]) >= 8 && Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) {
|
|
31923
31923
|
return Number(osRelease[2]) >= 14931 ? 3 : 2;
|
|
31924
31924
|
}
|
|
@@ -35747,6 +35747,7 @@ var Listr = class {
|
|
|
35747
35747
|
|
|
35748
35748
|
// src/commands/install.ts
|
|
35749
35749
|
var import_fs_extra11 = __toESM(require_lib2(), 1);
|
|
35750
|
+
var import_os5 = __toESM(require("os"), 1);
|
|
35750
35751
|
|
|
35751
35752
|
// src/core/context.ts
|
|
35752
35753
|
var import_os2 = __toESM(require("os"), 1);
|
|
@@ -41069,10 +41070,101 @@ async function installOfficialClaudePlugins(dryRun) {
|
|
|
41069
41070
|
console.log(t.success(` \u2713 Official plugins ready (${installedCount} installed, ${alreadyInstalledCount} already present)
|
|
41070
41071
|
`));
|
|
41071
41072
|
}
|
|
41073
|
+
async function cleanStalePrePluginFiles(repoRoot, dryRun) {
|
|
41074
|
+
const home = import_os5.default.homedir();
|
|
41075
|
+
const staleHooksDir = import_path11.default.join(home, ".claude", "hooks");
|
|
41076
|
+
const staleSkillsDir = import_path11.default.join(home, ".claude", "skills");
|
|
41077
|
+
const settingsPath = import_path11.default.join(home, ".claude", "settings.json");
|
|
41078
|
+
const removed = [];
|
|
41079
|
+
const repoHooksDir = import_path11.default.join(repoRoot, "hooks");
|
|
41080
|
+
if (await import_fs_extra11.default.pathExists(repoHooksDir) && await import_fs_extra11.default.pathExists(staleHooksDir)) {
|
|
41081
|
+
const repoHookNames = (await import_fs_extra11.default.readdir(repoHooksDir)).filter((n) => n !== "README.md" && n !== "hooks.json");
|
|
41082
|
+
for (const name of repoHookNames) {
|
|
41083
|
+
const staleFile = import_path11.default.join(staleHooksDir, name);
|
|
41084
|
+
if (await import_fs_extra11.default.pathExists(staleFile)) {
|
|
41085
|
+
if (dryRun) {
|
|
41086
|
+
console.log(t.accent(` [DRY RUN] Would remove stale hook: ~/.claude/hooks/${name}`));
|
|
41087
|
+
} else {
|
|
41088
|
+
await import_fs_extra11.default.remove(staleFile);
|
|
41089
|
+
console.log(t.muted(` \u2717 Removed stale hook: ~/.claude/hooks/${name}`));
|
|
41090
|
+
}
|
|
41091
|
+
removed.push(`hooks/${name}`);
|
|
41092
|
+
}
|
|
41093
|
+
}
|
|
41094
|
+
}
|
|
41095
|
+
const repoSkillsDir = import_path11.default.join(repoRoot, "skills");
|
|
41096
|
+
if (await import_fs_extra11.default.pathExists(repoSkillsDir) && await import_fs_extra11.default.pathExists(staleSkillsDir)) {
|
|
41097
|
+
const repoSkillNames = (await import_fs_extra11.default.readdir(repoSkillsDir)).filter((n) => !n.startsWith("."));
|
|
41098
|
+
for (const name of repoSkillNames) {
|
|
41099
|
+
const staleDir = import_path11.default.join(staleSkillsDir, name);
|
|
41100
|
+
if (await import_fs_extra11.default.pathExists(staleDir)) {
|
|
41101
|
+
if (dryRun) {
|
|
41102
|
+
console.log(t.accent(` [DRY RUN] Would remove stale skill: ~/.claude/skills/${name}`));
|
|
41103
|
+
} else {
|
|
41104
|
+
await import_fs_extra11.default.remove(staleDir);
|
|
41105
|
+
console.log(t.muted(` \u2717 Removed stale skill: ~/.claude/skills/${name}`));
|
|
41106
|
+
}
|
|
41107
|
+
removed.push(`skills/${name}`);
|
|
41108
|
+
}
|
|
41109
|
+
}
|
|
41110
|
+
}
|
|
41111
|
+
if (await import_fs_extra11.default.pathExists(settingsPath)) {
|
|
41112
|
+
let settings;
|
|
41113
|
+
try {
|
|
41114
|
+
settings = await import_fs_extra11.default.readJson(settingsPath);
|
|
41115
|
+
} catch {
|
|
41116
|
+
settings = null;
|
|
41117
|
+
}
|
|
41118
|
+
if (settings && settings.hooks && typeof settings.hooks === "object") {
|
|
41119
|
+
let settingsModified = false;
|
|
41120
|
+
for (const [event, matchers] of Object.entries(settings.hooks)) {
|
|
41121
|
+
if (!Array.isArray(matchers)) continue;
|
|
41122
|
+
const cleanedMatchers = matchers.filter((matcher) => {
|
|
41123
|
+
const hooks = Array.isArray(matcher?.hooks) ? matcher.hooks : [];
|
|
41124
|
+
const staleHooks = hooks.filter((h) => {
|
|
41125
|
+
const cmd = typeof h?.command === "string" ? h.command : "";
|
|
41126
|
+
return cmd.includes("/.claude/hooks/") && !cmd.includes("${CLAUDE_PLUGIN_ROOT}");
|
|
41127
|
+
});
|
|
41128
|
+
if (staleHooks.length > 0) {
|
|
41129
|
+
for (const h of staleHooks) {
|
|
41130
|
+
const msg = `settings.json [${event}] hook: ${h.command}`;
|
|
41131
|
+
if (dryRun) {
|
|
41132
|
+
console.log(t.accent(` [DRY RUN] Would remove stale ${msg}`));
|
|
41133
|
+
} else {
|
|
41134
|
+
console.log(t.muted(` \u2717 Removed stale ${msg}`));
|
|
41135
|
+
}
|
|
41136
|
+
removed.push(msg);
|
|
41137
|
+
}
|
|
41138
|
+
const remainingHooks = hooks.filter((h) => {
|
|
41139
|
+
const cmd = typeof h?.command === "string" ? h.command : "";
|
|
41140
|
+
return !(cmd.includes("/.claude/hooks/") && !cmd.includes("${CLAUDE_PLUGIN_ROOT}"));
|
|
41141
|
+
});
|
|
41142
|
+
if (remainingHooks.length === 0) return false;
|
|
41143
|
+
matcher.hooks = remainingHooks;
|
|
41144
|
+
settingsModified = true;
|
|
41145
|
+
return true;
|
|
41146
|
+
}
|
|
41147
|
+
return true;
|
|
41148
|
+
});
|
|
41149
|
+
if (cleanedMatchers.length !== matchers.length) {
|
|
41150
|
+
settings.hooks[event] = cleanedMatchers;
|
|
41151
|
+
settingsModified = true;
|
|
41152
|
+
}
|
|
41153
|
+
}
|
|
41154
|
+
if (settingsModified && !dryRun) {
|
|
41155
|
+
await import_fs_extra11.default.writeJson(settingsPath, settings, { spaces: 2 });
|
|
41156
|
+
}
|
|
41157
|
+
}
|
|
41158
|
+
}
|
|
41159
|
+
if (removed.length === 0) {
|
|
41160
|
+
console.log(t.success(" \u2713 No stale pre-plugin files found"));
|
|
41161
|
+
}
|
|
41162
|
+
}
|
|
41072
41163
|
async function installPlugin(repoRoot, dryRun) {
|
|
41073
41164
|
console.log(t.bold("\n \u2699 xtrm-tools (Claude Code plugin)"));
|
|
41074
41165
|
if (dryRun) {
|
|
41075
41166
|
console.log(t.accent(" [DRY RUN] Would register xtrm-tools marketplace and install plugin\n"));
|
|
41167
|
+
await cleanStalePrePluginFiles(repoRoot, true);
|
|
41076
41168
|
await installOfficialClaudePlugins(true);
|
|
41077
41169
|
return;
|
|
41078
41170
|
}
|
|
@@ -41083,6 +41175,7 @@ async function installPlugin(repoRoot, dryRun) {
|
|
|
41083
41175
|
}
|
|
41084
41176
|
(0, import_child_process3.spawnSync)("claude", ["plugin", "install", "xtrm-tools@xtrm-tools", "--scope", "user"], { stdio: "inherit" });
|
|
41085
41177
|
console.log(t.success(" \u2713 xtrm-tools plugin installed"));
|
|
41178
|
+
await cleanStalePrePluginFiles(repoRoot, dryRun);
|
|
41086
41179
|
await installOfficialClaudePlugins(false);
|
|
41087
41180
|
}
|
|
41088
41181
|
function createInstallAllCommand() {
|
|
@@ -41257,7 +41350,7 @@ async function launchWorktreeSession(opts) {
|
|
|
41257
41350
|
const cwdBasename = import_node_path5.default.basename(cwd);
|
|
41258
41351
|
const slug = name ?? randomSlug(4);
|
|
41259
41352
|
const worktreeName = `${cwdBasename}-xt-${runtime}-${slug}`;
|
|
41260
|
-
const worktreePath = import_node_path5.default.join(
|
|
41353
|
+
const worktreePath = import_node_path5.default.join(repoRoot, ".xtrm", "worktrees", worktreeName);
|
|
41261
41354
|
const branchName = `xt/${slug}`;
|
|
41262
41355
|
console.log(kleur_default.bold(`
|
|
41263
41356
|
Launching ${runtime} session`));
|
|
@@ -56141,7 +56234,7 @@ ${hr}`;
|
|
|
56141
56234
|
// src/commands/clean.ts
|
|
56142
56235
|
var import_fs_extra19 = __toESM(require_lib2(), 1);
|
|
56143
56236
|
var import_path19 = __toESM(require("path"), 1);
|
|
56144
|
-
var
|
|
56237
|
+
var import_os6 = require("os");
|
|
56145
56238
|
var CANONICAL_HOOKS = /* @__PURE__ */ new Set([
|
|
56146
56239
|
"agent_context.py",
|
|
56147
56240
|
"serena-workflow-reminder.py",
|
|
@@ -56202,7 +56295,7 @@ var IGNORED_ITEMS2 = /* @__PURE__ */ new Set([
|
|
|
56202
56295
|
"node_modules"
|
|
56203
56296
|
]);
|
|
56204
56297
|
async function cleanHooks(dryRun) {
|
|
56205
|
-
const hooksDir = import_path19.default.join((0,
|
|
56298
|
+
const hooksDir = import_path19.default.join((0, import_os6.homedir)(), ".claude", "hooks");
|
|
56206
56299
|
const removed = [];
|
|
56207
56300
|
const cache = [];
|
|
56208
56301
|
if (!await import_fs_extra19.default.pathExists(hooksDir)) {
|
|
@@ -56233,7 +56326,7 @@ async function cleanHooks(dryRun) {
|
|
|
56233
56326
|
return { removed, cache };
|
|
56234
56327
|
}
|
|
56235
56328
|
async function cleanSkills(dryRun) {
|
|
56236
|
-
const skillsDir = import_path19.default.join((0,
|
|
56329
|
+
const skillsDir = import_path19.default.join((0, import_os6.homedir)(), ".agents", "skills");
|
|
56237
56330
|
const removed = [];
|
|
56238
56331
|
if (!await import_fs_extra19.default.pathExists(skillsDir)) {
|
|
56239
56332
|
return removed;
|
|
@@ -56261,7 +56354,7 @@ async function cleanSkills(dryRun) {
|
|
|
56261
56354
|
return removed;
|
|
56262
56355
|
}
|
|
56263
56356
|
async function cleanOrphanedHookEntries(dryRun, repoRoot) {
|
|
56264
|
-
const settingsPath = import_path19.default.join((0,
|
|
56357
|
+
const settingsPath = import_path19.default.join((0, import_os6.homedir)(), ".claude", "settings.json");
|
|
56265
56358
|
const removed = [];
|
|
56266
56359
|
if (!await import_fs_extra19.default.pathExists(settingsPath)) {
|
|
56267
56360
|
return removed;
|