aiblueprint-cli 1.4.44 → 1.4.46

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.
@@ -6,7 +6,7 @@
6
6
  "hooks": [
7
7
  {
8
8
  "type": "command",
9
- "command": "bun ${CLAUDE_PLUGIN_ROOT}/claude-code-config/scripts/validate-command.js"
9
+ "command": "bun {CLAUDE_PATH}/scripts/command-validator/src/cli.ts"
10
10
  }
11
11
  ]
12
12
  }
package/dist/cli.js CHANGED
@@ -32265,7 +32265,7 @@ var lib_default = inquirer;
32265
32265
  // src/commands/setup.ts
32266
32266
  var import_fs_extra7 = __toESM(require_lib4(), 1);
32267
32267
  import path9 from "path";
32268
- import os9 from "os";
32268
+ import os10 from "os";
32269
32269
 
32270
32270
  // node_modules/chalk/source/vendor/ansi-styles/index.js
32271
32271
  var ANSI_BACKGROUND_OFFSET = 10;
@@ -33154,6 +33154,7 @@ var KNOWN_CLAUDE_PATHS = [
33154
33154
  ];
33155
33155
  function transformHookCommand(command, claudeDir) {
33156
33156
  let transformed = command;
33157
+ transformed = replaceClaudePathPlaceholder(transformed, claudeDir);
33157
33158
  for (const pattern of KNOWN_CLAUDE_PATHS) {
33158
33159
  transformed = transformed.replace(pattern, `${claudeDir}/`);
33159
33160
  }
@@ -33508,6 +33509,53 @@ async function createBackup(claudeDir) {
33508
33509
  return backupPath;
33509
33510
  }
33510
33511
 
33512
+ // src/lib/telemetry.ts
33513
+ import os9 from "os";
33514
+ var TELEMETRY_URL = "https://codelynx.dev/api/cli/events";
33515
+ var isDisabled = () => {
33516
+ return process.env.AIBLUEPRINT_TELEMETRY_DISABLED === "1";
33517
+ };
33518
+ var getBasePayload = () => ({
33519
+ cliVersion: getVersion(),
33520
+ platform: os9.platform(),
33521
+ arch: os9.arch(),
33522
+ nodeVersion: process.version
33523
+ });
33524
+ var pendingRequest = null;
33525
+ function trackEvent(event, data) {
33526
+ if (isDisabled())
33527
+ return;
33528
+ const payload = {
33529
+ ...getBasePayload(),
33530
+ event,
33531
+ data
33532
+ };
33533
+ pendingRequest = fetch(TELEMETRY_URL, {
33534
+ method: "POST",
33535
+ headers: { "Content-Type": "application/json" },
33536
+ body: JSON.stringify(payload),
33537
+ signal: AbortSignal.timeout(5000)
33538
+ }).catch(() => {}).then(() => {
33539
+ pendingRequest = null;
33540
+ });
33541
+ }
33542
+ function trackError(error, context) {
33543
+ if (isDisabled())
33544
+ return;
33545
+ const message = error instanceof Error ? error.message : String(error);
33546
+ const stack = error instanceof Error ? error.stack?.slice(0, 500) : undefined;
33547
+ trackEvent("error", {
33548
+ message,
33549
+ stack,
33550
+ ...context
33551
+ });
33552
+ }
33553
+ async function flushTelemetry() {
33554
+ if (pendingRequest) {
33555
+ await pendingRequest;
33556
+ }
33557
+ }
33558
+
33511
33559
  // src/commands/setup.ts
33512
33560
  var __filename2 = fileURLToPath2(import.meta.url);
33513
33561
  var __dirname2 = dirname2(__filename2);
@@ -33612,7 +33660,7 @@ async function setupCommand(params = {}) {
33612
33660
  skipInteractive
33613
33661
  };
33614
33662
  const s = new SimpleSpinner;
33615
- const claudeDir = customClaudeCodeFolder ? path9.resolve(customClaudeCodeFolder) : path9.join(os9.homedir(), ".claude");
33663
+ const claudeDir = customClaudeCodeFolder ? path9.resolve(customClaudeCodeFolder) : path9.join(os10.homedir(), ".claude");
33616
33664
  console.log(source_default.gray(`Installing to: ${claudeDir}`));
33617
33665
  await import_fs_extra7.default.ensureDir(claudeDir);
33618
33666
  s.start("Creating backup of existing configuration");
@@ -33722,10 +33770,11 @@ async function setupCommand(params = {}) {
33722
33770
  await cleanupRepository(repoPath);
33723
33771
  s.stop("Cleanup complete");
33724
33772
  console.log(source_default.green("✨ Setup complete!"));
33773
+ trackEvent("setup", { features: options });
33725
33774
  console.log(source_default.gray(`
33726
33775
  Next steps:`));
33727
33776
  if (options.shellShortcuts) {
33728
- const platform = os9.platform();
33777
+ const platform = os10.platform();
33729
33778
  if (platform === "win32") {
33730
33779
  console.log(source_default.gray(" • Restart PowerShell to load the new functions"));
33731
33780
  } else {
@@ -33738,6 +33787,8 @@ Next steps:`));
33738
33787
  console.log(source_default.blue(`
33739
33788
  \uD83D\uDC8E Want premium features? Get AIBlueprint CLI Pro at https://mlv.sh/claude-cli`));
33740
33789
  } catch (error) {
33790
+ trackError(error, { command: "setup" });
33791
+ await flushTelemetry();
33741
33792
  console.error(source_default.red(`
33742
33793
  ❌ Setup failed:`), error);
33743
33794
  console.log(source_default.red("Setup failed!"));
@@ -33751,7 +33802,7 @@ Next steps:`));
33751
33802
  // src/commands/setup-terminal.ts
33752
33803
  var import_fs_extra8 = __toESM(require_lib4(), 1);
33753
33804
  import path10 from "path";
33754
- import os10 from "os";
33805
+ import os11 from "os";
33755
33806
  import { execSync as execSync3, exec as exec2 } from "child_process";
33756
33807
  var OHMYZSH_INSTALL_URL = "https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh";
33757
33808
  var INSTALL_TIMEOUT = 120000;
@@ -33918,7 +33969,7 @@ plugins=(${pluginsString})`;
33918
33969
  }
33919
33970
  async function setupTerminalCommand(options = {}) {
33920
33971
  const { skipInteractive, homeDir: customHomeDir } = options;
33921
- const homeDir = customHomeDir || os10.homedir();
33972
+ const homeDir = customHomeDir || os11.homedir();
33922
33973
  try {
33923
33974
  console.log(source_default.blue.bold(`
33924
33975
  \uD83D\uDDA5️ AIBlueprint Terminal Setup ${source_default.gray(`v${getVersion()}`)}
@@ -34947,12 +34998,12 @@ var Y2 = ({ indicator: t = "dots" } = {}) => {
34947
34998
  };
34948
34999
 
34949
35000
  // src/commands/pro.ts
34950
- import os13 from "os";
35001
+ import os14 from "os";
34951
35002
  import path13 from "path";
34952
35003
 
34953
35004
  // src/lib/pro-installer.ts
34954
35005
  var import_fs_extra9 = __toESM(require_lib4(), 1);
34955
- import os11 from "os";
35006
+ import os12 from "os";
34956
35007
  import path11 from "path";
34957
35008
  import { exec as exec3 } from "child_process";
34958
35009
  import { promisify as promisify2 } from "util";
@@ -34960,7 +35011,7 @@ var execAsync2 = promisify2(exec3);
34960
35011
  var PREMIUM_REPO = "Melvynx/aiblueprint-cli-premium";
34961
35012
  var PREMIUM_BRANCH = "main";
34962
35013
  function getCacheRepoDir() {
34963
- return path11.join(os11.homedir(), ".config", "aiblueprint", "pro-repos", "aiblueprint-cli-premium");
35014
+ return path11.join(os12.homedir(), ".config", "aiblueprint", "pro-repos", "aiblueprint-cli-premium");
34964
35015
  }
34965
35016
  async function execGitWithAuth(command, token, repoUrl, cwd) {
34966
35017
  const authenticatedUrl = `https://x-access-token:${token}@${repoUrl.replace(/^https?:\/\//, "")}`;
@@ -35077,7 +35128,7 @@ async function downloadDirectoryFromPrivateGitHub(repo, branch, dirPath, targetD
35077
35128
  }
35078
35129
  async function installProConfigs(options) {
35079
35130
  const { githubToken, claudeCodeFolder, onProgress } = options;
35080
- const claudeFolder = claudeCodeFolder || path11.join(os11.homedir(), ".claude");
35131
+ const claudeFolder = claudeCodeFolder || path11.join(os12.homedir(), ".claude");
35081
35132
  try {
35082
35133
  const cacheConfigDir = await cloneOrUpdateRepo(githubToken);
35083
35134
  await copyConfigFromCache(cacheConfigDir, claudeFolder, onProgress);
@@ -35085,7 +35136,7 @@ async function installProConfigs(options) {
35085
35136
  } catch (error) {
35086
35137
  console.warn("Git caching failed, falling back to API download");
35087
35138
  }
35088
- const tempDir = path11.join(os11.tmpdir(), `aiblueprint-premium-${Date.now()}`);
35139
+ const tempDir = path11.join(os12.tmpdir(), `aiblueprint-premium-${Date.now()}`);
35089
35140
  try {
35090
35141
  const success = await downloadDirectoryFromPrivateGitHub(PREMIUM_REPO, PREMIUM_BRANCH, "claude-code-config", tempDir, githubToken, onProgress);
35091
35142
  if (!success) {
@@ -35099,6 +35150,7 @@ async function installProConfigs(options) {
35099
35150
  await import_fs_extra9.default.copy(tempDir, claudeFolder, {
35100
35151
  overwrite: true
35101
35152
  });
35153
+ await replacePathPlaceholdersInDir(claudeFolder, claudeFolder);
35102
35154
  } catch (error) {
35103
35155
  throw new Error(`Failed to install premium configs: ${error instanceof Error ? error.message : "Unknown error"}`);
35104
35156
  } finally {
@@ -35110,15 +35162,15 @@ async function installProConfigs(options) {
35110
35162
 
35111
35163
  // src/lib/token-storage.ts
35112
35164
  var import_fs_extra10 = __toESM(require_lib4(), 1);
35113
- import os12 from "os";
35165
+ import os13 from "os";
35114
35166
  import path12 from "path";
35115
35167
  function getConfigDir() {
35116
- const platform = os12.platform();
35168
+ const platform = os13.platform();
35117
35169
  if (platform === "win32") {
35118
- const appData = process.env.APPDATA || path12.join(os12.homedir(), "AppData", "Roaming");
35170
+ const appData = process.env.APPDATA || path12.join(os13.homedir(), "AppData", "Roaming");
35119
35171
  return path12.join(appData, "aiblueprint");
35120
35172
  } else {
35121
- const configHome = process.env.XDG_CONFIG_HOME || path12.join(os12.homedir(), ".config");
35173
+ const configHome = process.env.XDG_CONFIG_HOME || path12.join(os13.homedir(), ".config");
35122
35174
  return path12.join(configHome, "aiblueprint");
35123
35175
  }
35124
35176
  }
@@ -35154,7 +35206,7 @@ async function getToken() {
35154
35206
  function getTokenInfo() {
35155
35207
  return {
35156
35208
  path: getTokenFilePath(),
35157
- platform: os12.platform()
35209
+ platform: os13.platform()
35158
35210
  };
35159
35211
  }
35160
35212
 
@@ -35261,8 +35313,11 @@ async function proActivateCommand(userToken) {
35261
35313
  M2.info(`Token saved to: ${tokenInfo.path}`);
35262
35314
  M2.info(source_default.cyan(`
35263
35315
  \uD83D\uDCA1 Next step: Run 'npx aiblueprint-cli@latest claude-code pro setup' to install premium configs`));
35316
+ trackEvent("pro-activate");
35264
35317
  Se(source_default.green("✅ Activation complete!"));
35265
35318
  } catch (error) {
35319
+ trackError(error, { command: "pro-activate" });
35320
+ await flushTelemetry();
35266
35321
  if (error instanceof Error) {
35267
35322
  M2.error(error.message);
35268
35323
  }
@@ -35304,7 +35359,7 @@ async function proSetupCommand(options = {}) {
35304
35359
  Se(source_default.red("❌ Not activated"));
35305
35360
  process.exit(1);
35306
35361
  }
35307
- const claudeDir = options.folder ? path13.resolve(options.folder) : path13.join(os13.homedir(), ".claude");
35362
+ const claudeDir = options.folder ? path13.resolve(options.folder) : path13.join(os14.homedir(), ".claude");
35308
35363
  const spinner = Y2();
35309
35364
  const onProgress = (file, type) => {
35310
35365
  spinner.message(`Installing: ${source_default.cyan(file)} ${source_default.gray(`(${type})`)}`);
@@ -35341,6 +35396,11 @@ async function proSetupCommand(options = {}) {
35341
35396
  spinner.start("Counting installed items...");
35342
35397
  const counts = await countInstalledItems(claudeDir);
35343
35398
  spinner.stop("Installation summary ready");
35399
+ trackEvent("pro-setup", {
35400
+ commands: counts.commands,
35401
+ agents: counts.agents,
35402
+ skills: counts.skills
35403
+ });
35344
35404
  M2.success("✅ Setup complete!");
35345
35405
  M2.info("Installed:");
35346
35406
  M2.info(` • Commands (${counts.commands})`);
@@ -35351,6 +35411,8 @@ async function proSetupCommand(options = {}) {
35351
35411
  M2.info(" • Settings.json with hooks and statusline");
35352
35412
  Se(source_default.green("\uD83D\uDE80 Ready to use!"));
35353
35413
  } catch (error) {
35414
+ trackError(error, { command: "pro-setup" });
35415
+ await flushTelemetry();
35354
35416
  if (error instanceof Error) {
35355
35417
  M2.error(error.message);
35356
35418
  }
@@ -35375,8 +35437,11 @@ async function proUpdateCommand(options = {}) {
35375
35437
  claudeCodeFolder: options.folder
35376
35438
  });
35377
35439
  spinner.stop("Premium configurations updated");
35440
+ trackEvent("pro-update");
35378
35441
  Se(source_default.green("✅ Update completed"));
35379
35442
  } catch (error) {
35443
+ trackError(error, { command: "pro-update" });
35444
+ await flushTelemetry();
35380
35445
  if (error instanceof Error) {
35381
35446
  M2.error(error.message);
35382
35447
  }
@@ -35386,7 +35451,7 @@ async function proUpdateCommand(options = {}) {
35386
35451
  }
35387
35452
 
35388
35453
  // src/commands/sync.ts
35389
- import os14 from "os";
35454
+ import os15 from "os";
35390
35455
  import path15 from "path";
35391
35456
 
35392
35457
  // src/lib/sync-utils.ts
@@ -35873,7 +35938,7 @@ async function proSyncCommand(options = {}) {
35873
35938
  Se(source_default.red("❌ Not activated"));
35874
35939
  process.exit(1);
35875
35940
  }
35876
- const claudeDir = options.folder ? path15.resolve(options.folder) : path15.join(os14.homedir(), ".claude");
35941
+ const claudeDir = options.folder ? path15.resolve(options.folder) : path15.join(os15.homedir(), ".claude");
35877
35942
  const spinner = Y2();
35878
35943
  spinner.start("Analyzing changes...");
35879
35944
  const result = await analyzeSyncChanges(claudeDir, githubToken);
@@ -36107,8 +36172,16 @@ async function proSyncCommand(options = {}) {
36107
36172
  await installScriptsDependencies(claudeDir);
36108
36173
  spinner.stop("Scripts dependencies installed");
36109
36174
  }
36175
+ trackEvent("pro-sync", {
36176
+ added: syncResult.success,
36177
+ deleted: syncResult.deleted,
36178
+ failed: syncResult.failed,
36179
+ hookssynced: selectedHooks.length
36180
+ });
36110
36181
  Se(source_default.green("✅ Sync completed"));
36111
36182
  } catch (error) {
36183
+ trackError(error, { command: "pro-sync" });
36184
+ await flushTelemetry();
36112
36185
  if (error instanceof Error) {
36113
36186
  M2.error(error.message);
36114
36187
  }
@@ -36118,7 +36191,7 @@ async function proSyncCommand(options = {}) {
36118
36191
  }
36119
36192
 
36120
36193
  // src/commands/backup.ts
36121
- import os15 from "os";
36194
+ import os16 from "os";
36122
36195
  import path16 from "path";
36123
36196
  function formatBackupDate(date) {
36124
36197
  const now = new Date;
@@ -36139,7 +36212,7 @@ function formatBackupDate(date) {
36139
36212
  return `${date.toLocaleString()} (${relative})`;
36140
36213
  }
36141
36214
  async function backupLoadCommand(options = {}) {
36142
- const claudeDir = options.folder || path16.join(os15.homedir(), ".claude");
36215
+ const claudeDir = options.folder || path16.join(os16.homedir(), ".claude");
36143
36216
  Ie(source_default.blue("\uD83D\uDCE6 Load Backup"));
36144
36217
  const spinner = Y2();
36145
36218
  spinner.start("Scanning for backups...");
@@ -36195,19 +36268,19 @@ async function backupLoadCommand(options = {}) {
36195
36268
  }
36196
36269
 
36197
36270
  // src/commands/openclaw-pro.ts
36198
- import os18 from "os";
36271
+ import os19 from "os";
36199
36272
  import path19 from "path";
36200
36273
 
36201
36274
  // src/lib/openclaw-installer.ts
36202
36275
  var import_fs_extra13 = __toESM(require_lib4(), 1);
36203
- import os16 from "os";
36276
+ import os17 from "os";
36204
36277
  import path17 from "path";
36205
36278
  import { exec as exec4 } from "child_process";
36206
36279
  import { promisify as promisify3 } from "util";
36207
36280
  var execAsync3 = promisify3(exec4);
36208
36281
  var OPENCLAW_PRO_REPO = "Melvynx/openclawpro";
36209
36282
  function getCacheRepoDir2() {
36210
- return path17.join(os16.homedir(), ".config", "openclaw", "pro-repos", "openclawpro");
36283
+ return path17.join(os17.homedir(), ".config", "openclaw", "pro-repos", "openclawpro");
36211
36284
  }
36212
36285
  async function execGitWithAuth2(command, token, repoUrl, cwd) {
36213
36286
  const authenticatedUrl = `https://x-access-token:${token}@${repoUrl.replace(/^https?:\/\//, "")}`;
@@ -36256,7 +36329,7 @@ async function copyConfigFromCache2(cacheConfigDir, targetDir, onProgress) {
36256
36329
  }
36257
36330
  async function installOpenclawProConfigs(options) {
36258
36331
  const { githubToken, openclawFolder, onProgress } = options;
36259
- const targetFolder = openclawFolder || path17.join(os16.homedir(), ".openclaw");
36332
+ const targetFolder = openclawFolder || path17.join(os17.homedir(), ".openclaw");
36260
36333
  try {
36261
36334
  const cacheConfigDir = await cloneOrUpdateRepo2(githubToken);
36262
36335
  await copyConfigFromCache2(cacheConfigDir, targetFolder, onProgress);
@@ -36268,14 +36341,14 @@ async function installOpenclawProConfigs(options) {
36268
36341
 
36269
36342
  // src/lib/openclaw-token-storage.ts
36270
36343
  var import_fs_extra14 = __toESM(require_lib4(), 1);
36271
- import os17 from "os";
36344
+ import os18 from "os";
36272
36345
  import path18 from "path";
36273
36346
  function getConfigDir2() {
36274
- const platform = os17.platform();
36347
+ const platform = os18.platform();
36275
36348
  if (platform === "win32") {
36276
- return path18.join(process.env.APPDATA || os17.homedir(), "openclaw");
36349
+ return path18.join(process.env.APPDATA || os18.homedir(), "openclaw");
36277
36350
  }
36278
- return path18.join(os17.homedir(), ".config", "openclaw");
36351
+ return path18.join(os18.homedir(), ".config", "openclaw");
36279
36352
  }
36280
36353
  function getTokenPath() {
36281
36354
  return path18.join(getConfigDir2(), "token.txt");
@@ -36296,7 +36369,7 @@ async function getOpenclawToken() {
36296
36369
  function getOpenclawTokenInfo() {
36297
36370
  return {
36298
36371
  path: getTokenPath(),
36299
- platform: os17.platform()
36372
+ platform: os18.platform()
36300
36373
  };
36301
36374
  }
36302
36375
 
@@ -36408,7 +36481,7 @@ async function openclawProSetupCommand(options = {}) {
36408
36481
  Se(source_default.red("❌ Not activated"));
36409
36482
  process.exit(1);
36410
36483
  }
36411
- const openclawDir = options.folder ? path19.resolve(options.folder) : path19.join(os18.homedir(), ".openclaw");
36484
+ const openclawDir = options.folder ? path19.resolve(options.folder) : path19.join(os19.homedir(), ".openclaw");
36412
36485
  const spinner = Y2();
36413
36486
  const onProgress = (file, type) => {
36414
36487
  spinner.message(`Installing: ${source_default.cyan(file)} ${source_default.gray(`(${type})`)}`);
@@ -36582,10 +36655,10 @@ var import_fs_extra17 = __toESM(require_lib4(), 1);
36582
36655
  import { spawn as spawn2 } from "child_process";
36583
36656
  import { execSync as execSync4 } from "child_process";
36584
36657
  import path21 from "path";
36585
- import os19 from "os";
36658
+ import os20 from "os";
36586
36659
  function checkCommand2(cmd) {
36587
36660
  try {
36588
- const isWindows2 = os19.platform() === "win32";
36661
+ const isWindows2 = os20.platform() === "win32";
36589
36662
  const whichCmd = isWindows2 ? `where ${cmd}` : `which ${cmd}`;
36590
36663
  execSync4(whichCmd, { stdio: "ignore" });
36591
36664
  return true;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiblueprint-cli",
3
- "version": "1.4.44",
3
+ "version": "1.4.46",
4
4
  "description": "AIBlueprint CLI for setting up Claude Code configurations",
5
5
  "author": "AIBlueprint",
6
6
  "license": "MIT",