aiblueprint-cli 1.4.108 → 1.4.109

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.
Files changed (33) hide show
  1. package/README.md +9 -0
  2. package/agents-config/claude-config/mods/agent4everything/.claude-plugin/plugin.json +5 -0
  3. package/agents-config/claude-config/mods/agent4everything/hooks/hooks.json +1 -0
  4. package/agents-config/claude-config/mods/agent4everything/hooks/register.ts +96 -0
  5. package/agents-config/claude-config/mods/aiblueprint/.claude-plugin/plugin.json +71 -0
  6. package/agents-config/claude-config/mods/aiblueprint/hooks/hooks.json +1 -0
  7. package/agents-config/claude-config/mods/aiblueprint/hooks/register.tsx +309 -0
  8. package/agents-config/claude-config/mods/aiblueprint/tests/band.test.tsx +74 -0
  9. package/agents-config/claude-config/mods/aiblueprint/types/index.d.ts +14 -0
  10. package/agents-config/claude-config/scripts/.claude/skills/fix-on-my-computer/SKILL.md +8 -74
  11. package/agents-config/claude-config/scripts/statusline/src/index.ts +1 -0
  12. package/agents-config/scripts/.claude/skills/fix-on-my-computer/SKILL.md +8 -74
  13. package/agents-config/scripts/statusline/src/index.ts +1 -0
  14. package/agents-config/skills/agents-manager/SKILL.md +15 -453
  15. package/agents-config/skills/apex/SKILL.md +14 -110
  16. package/agents-config/skills/app-icon/SKILL.md +22 -117
  17. package/agents-config/skills/appstore-connect/SKILL.md +22 -85
  18. package/agents-config/skills/audit-memories/SKILL.md +13 -139
  19. package/agents-config/skills/audit-skills/SKILL.md +6 -65
  20. package/agents-config/skills/environments-manager/SKILL.md +14 -238
  21. package/agents-config/skills/grill-me/SKILL.md +8 -22
  22. package/agents-config/skills/hooks-manager/SKILL.md +8 -54
  23. package/agents-config/skills/rules-manager/SKILL.md +11 -192
  24. package/agents-config/skills/skill-manager/SKILL.md +19 -158
  25. package/agents-config/skills/skill-manager/references/description-recommandation.md +15 -85
  26. package/agents-config/skills/test-audit/CAMPAIGN.md +117 -0
  27. package/agents-config/skills/test-audit/LICENSE +23 -0
  28. package/agents-config/skills/test-audit/SKILL.md +169 -0
  29. package/agents-config/skills/test-audit/agents/openai.yaml +10 -0
  30. package/agents-config/skills/test-audit/assets/codex-icon.svg +1 -0
  31. package/agents-config/skills/use-style/SKILL.md +8 -48
  32. package/dist/cli.js +115 -72
  33. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -32299,7 +32299,7 @@ var lib_default = inquirer;
32299
32299
  // src/commands/setup.ts
32300
32300
  var import_fs_extra9 = __toESM(require_lib4(), 1);
32301
32301
  import path13 from "path";
32302
- import os11 from "os";
32302
+ import os12 from "os";
32303
32303
 
32304
32304
  // node_modules/chalk/source/vendor/ansi-styles/index.js
32305
32305
  var ANSI_BACKGROUND_OFFSET = 10;
@@ -33022,10 +33022,27 @@ async function installStatuslineDependencies(claudeDir) {
33022
33022
 
33023
33023
  // src/commands/setup/settings.ts
33024
33024
  var import_fs_extra2 = __toESM(require_lib4(), 1);
33025
+ import os5 from "os";
33025
33026
  import path4 from "path";
33026
33027
  function toPosixPath(p) {
33027
33028
  return p.replace(/\\/g, "/");
33028
33029
  }
33030
+ function expandHome(p) {
33031
+ return p.startsWith("~/") ? path4.join(os5.homedir(), p.slice(2)) : p;
33032
+ }
33033
+ function enableMods(env, mods, claudeDir) {
33034
+ env.CLAUDE_CODE_ENABLE_FUNCTION_HOOKS = "1";
33035
+ const dirs = (env.CLAUDE_CODE_PLUGIN_DIRS ?? "").split(path4.delimiter).filter(Boolean);
33036
+ const known = new Set(dirs.map((dir) => path4.resolve(expandHome(dir))));
33037
+ for (const mod of mods) {
33038
+ const dir = path4.join(claudeDir, "mods", mod);
33039
+ if (known.has(path4.resolve(dir)))
33040
+ continue;
33041
+ dirs.push(toPosixPath(dir));
33042
+ known.add(path4.resolve(dir));
33043
+ }
33044
+ env.CLAUDE_CODE_PLUGIN_DIRS = dirs.join(path4.delimiter);
33045
+ }
33029
33046
  async function hasExistingStatusLine(claudeDir) {
33030
33047
  const settingsPath = path4.join(claudeDir, "settings.json");
33031
33048
  try {
@@ -33060,6 +33077,9 @@ async function updateSettings(options, claudeDir) {
33060
33077
  delete settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL;
33061
33078
  }
33062
33079
  settings.env.CLAUDE_CODE_DISABLE_1M_CONTEXT = "1";
33080
+ if (options.installedMods && options.installedMods.length > 0) {
33081
+ enableMods(settings.env, options.installedMods, claudeDir);
33082
+ }
33063
33083
  if (!settings.permissions) {
33064
33084
  settings.permissions = {};
33065
33085
  }
@@ -33086,7 +33106,7 @@ async function updateSettings(options, claudeDir) {
33086
33106
  // src/commands/setup/utils.ts
33087
33107
  var import_fs_extra3 = __toESM(require_lib4(), 1);
33088
33108
  import path5 from "path";
33089
- import os5 from "os";
33109
+ import os6 from "os";
33090
33110
  import { exec } from "child_process";
33091
33111
  import { promisify } from "util";
33092
33112
  var execAsync = promisify(exec);
@@ -33103,7 +33123,7 @@ class SimpleSpinner {
33103
33123
  }
33104
33124
  var GITHUB_REPO = "https://github.com/Melvynx/aiblueprint.git";
33105
33125
  async function cloneRepository() {
33106
- const tmpDir = path5.join(os5.tmpdir(), `aiblueprint-${Date.now()}`);
33126
+ const tmpDir = path5.join(os6.tmpdir(), `aiblueprint-${Date.now()}`);
33107
33127
  try {
33108
33128
  await import_fs_extra3.default.ensureDir(tmpDir);
33109
33129
  await execAsync(`git clone --depth 1 --quiet ${GITHUB_REPO} "${tmpDir}"`);
@@ -33153,7 +33173,7 @@ function getVersion() {
33153
33173
 
33154
33174
  // src/lib/platform.ts
33155
33175
  var import_fs_extra4 = __toESM(require_lib4(), 1);
33156
- import os6 from "os";
33176
+ import os7 from "os";
33157
33177
  import path6 from "path";
33158
33178
  import { execSync as execSync2 } from "child_process";
33159
33179
  function escapeShellArg(arg) {
@@ -33162,15 +33182,15 @@ function escapeShellArg(arg) {
33162
33182
  var cachedPlatformInfo = null;
33163
33183
  var cachedAudioPlayer = undefined;
33164
33184
  function isWSL() {
33165
- if (os6.platform() !== "linux")
33185
+ if (os7.platform() !== "linux")
33166
33186
  return false;
33167
- const release = os6.release().toLowerCase();
33187
+ const release = os7.release().toLowerCase();
33168
33188
  return release.includes("microsoft") || release.includes("wsl");
33169
33189
  }
33170
33190
  function getPlatformInfo() {
33171
33191
  if (cachedPlatformInfo)
33172
33192
  return cachedPlatformInfo;
33173
- const platform = os6.platform();
33193
+ const platform = os7.platform();
33174
33194
  const wsl = isWSL();
33175
33195
  cachedPlatformInfo = {
33176
33196
  platform,
@@ -33178,14 +33198,14 @@ function getPlatformInfo() {
33178
33198
  isMacOS: platform === "darwin",
33179
33199
  isLinux: platform === "linux" && !wsl,
33180
33200
  isWSL: wsl,
33181
- homeDir: os6.homedir()
33201
+ homeDir: os7.homedir()
33182
33202
  };
33183
33203
  return cachedPlatformInfo;
33184
33204
  }
33185
33205
  function detectAudioPlayer() {
33186
33206
  if (cachedAudioPlayer !== undefined)
33187
33207
  return cachedAudioPlayer;
33188
- const platform = os6.platform();
33208
+ const platform = os7.platform();
33189
33209
  if (platform === "darwin") {
33190
33210
  cachedAudioPlayer = "afplay";
33191
33211
  return cachedAudioPlayer;
@@ -33224,7 +33244,7 @@ function getPlaySoundCommand(soundPath) {
33224
33244
  const player = detectAudioPlayer();
33225
33245
  if (!player)
33226
33246
  return null;
33227
- const platform = os6.platform();
33247
+ const platform = os7.platform();
33228
33248
  const safePath = escapeShellArg(soundPath);
33229
33249
  if (platform === "darwin") {
33230
33250
  return `afplay -v 0.1 ${safePath}`;
@@ -33336,12 +33356,11 @@ async function applyPathPlaceholders(target, claudeDir) {
33336
33356
  }
33337
33357
  }
33338
33358
  function transformFileContent(content, claudeDir) {
33339
- let transformed = content;
33340
- transformed = replaceClaudePathPlaceholder(transformed, claudeDir);
33341
- for (const pattern of KNOWN_CLAUDE_PATHS) {
33342
- transformed = transformed.replace(new RegExp(pattern.source, "g"), `${claudeDir}/`);
33343
- }
33344
- transformed = transformed.replace(/\\/g, "/");
33359
+ const normalizedClaudeDir = claudeDir.replace(/\\/g, "/");
33360
+ const windowsPath = /C:[\\/]+Users[\\/]+[^\\/\r\n"'`]+[\\/]+\.claude[\\/]+([^\s"'`<>|]*)/;
33361
+ const claudePaths = new RegExp([windowsPath.source, ...KNOWN_CLAUDE_PATHS.map((pattern) => pattern.source)].join("|"), "gi");
33362
+ let transformed = content.replace(claudePaths, (_match, relativePath) => `${normalizedClaudeDir}/${relativePath?.replace(/\\+/g, "/") ?? ""}`);
33363
+ transformed = replaceClaudePathPlaceholder(transformed, normalizedClaudeDir);
33345
33364
  const audioPatterns = [
33346
33365
  /afplay\s+-v\s+[\d.]+\s+'[^']+'/g,
33347
33366
  /afplay\s+'[^']+'/g,
@@ -33360,7 +33379,7 @@ function transformFileContent(content, claudeDir) {
33360
33379
  }
33361
33380
 
33362
33381
  // src/lib/telemetry.ts
33363
- import os7 from "os";
33382
+ import os8 from "os";
33364
33383
  import fs5 from "fs";
33365
33384
  import path7 from "path";
33366
33385
  var TELEMETRY_URL = "https://codelynx.dev/api/cli/events";
@@ -33369,13 +33388,13 @@ var isDisabled = () => {
33369
33388
  };
33370
33389
  var getBasePayload = () => ({
33371
33390
  cliVersion: getVersion(),
33372
- platform: os7.platform(),
33373
- arch: os7.arch(),
33391
+ platform: os8.platform(),
33392
+ arch: os8.arch(),
33374
33393
  nodeVersion: process.version
33375
33394
  });
33376
33395
  function getTokenFilePath() {
33377
- const homeDir = os7.homedir();
33378
- if (os7.platform() === "win32") {
33396
+ const homeDir = os8.homedir();
33397
+ if (os8.platform() === "win32") {
33379
33398
  const appData = process.env.APPDATA || path7.join(homeDir, "AppData", "Roaming");
33380
33399
  return path7.join(appData, "aiblueprint", "token.txt");
33381
33400
  }
@@ -33388,12 +33407,12 @@ function getSystemInfo() {
33388
33407
  hasProToken = fs5.existsSync(getTokenFilePath());
33389
33408
  } catch {}
33390
33409
  return {
33391
- osVersion: os7.release(),
33392
- osType: os7.type(),
33393
- totalMemory: `${Math.round(os7.totalmem() / (1024 * 1024 * 1024))}GB`,
33394
- cpus: os7.cpus().length,
33410
+ osVersion: os8.release(),
33411
+ osType: os8.type(),
33412
+ totalMemory: `${Math.round(os8.totalmem() / (1024 * 1024 * 1024))}GB`,
33413
+ cpus: os8.cpus().length,
33395
33414
  shell: process.env.SHELL || process.env.COMSPEC || "unknown",
33396
- homeDir: os7.homedir(),
33415
+ homeDir: os8.homedir(),
33397
33416
  locale: process.env.LANG || process.env.LC_ALL || "unknown",
33398
33417
  hasProToken
33399
33418
  };
@@ -33436,12 +33455,12 @@ async function flushTelemetry() {
33436
33455
 
33437
33456
  // src/lib/agents-installer.ts
33438
33457
  var import_fs_extra5 = __toESM(require_lib4(), 1);
33439
- import os8 from "os";
33458
+ import os9 from "os";
33440
33459
  import path8 from "path";
33441
33460
  var AGENT_CATEGORIES = ["skills", "agents"];
33442
33461
  async function platformSymlink(source, target) {
33443
33462
  await import_fs_extra5.default.ensureDir(path8.dirname(target));
33444
- const isWindows = os8.platform() === "win32";
33463
+ const isWindows = os9.platform() === "win32";
33445
33464
  const sourceStat = await import_fs_extra5.default.stat(source).catch(() => null);
33446
33465
  const isDir = sourceStat?.isDirectory() ?? false;
33447
33466
  if (isWindows && isDir) {
@@ -33553,10 +33572,10 @@ function isAgentCategory(category) {
33553
33572
  }
33554
33573
 
33555
33574
  // src/lib/folder-paths.ts
33556
- import os9 from "os";
33575
+ import os10 from "os";
33557
33576
  import path9 from "path";
33558
33577
  function resolveFolders(options = {}) {
33559
- const rootDir = options.folder ? path9.resolve(options.folder) : os9.homedir();
33578
+ const rootDir = options.folder ? path9.resolve(options.folder) : os10.homedir();
33560
33579
  const claudeDir = options.claudeCodeFolder ? path9.resolve(options.claudeCodeFolder) : path9.join(rootDir, ".claude");
33561
33580
  const codexDir = options.codexFolder ? path9.resolve(options.codexFolder) : path9.join(rootDir, ".codex");
33562
33581
  const agentsDir = options.agentsFolder ? path9.resolve(options.agentsFolder) : path9.join(rootDir, ".agents");
@@ -33727,7 +33746,7 @@ async function mergeCodexConfigFile(sourceConfigPath, codexDir) {
33727
33746
 
33728
33747
  // src/lib/configs-store.ts
33729
33748
  var import_fs_extra7 = __toESM(require_lib4(), 1);
33730
- import os10 from "os";
33749
+ import os11 from "os";
33731
33750
  import path11 from "path";
33732
33751
  var RETENTION_MANAGED_BACKUP_TRIGGERS = new Set(["setup", "sync", "load", "backup-load"]);
33733
33752
  var DEFAULT_BACKUP_RETENTION_DAYS = 30;
@@ -33780,7 +33799,7 @@ async function hasContent(folderPath) {
33780
33799
  async function copyManagedFolder(source, destination) {
33781
33800
  await import_fs_extra7.default.copy(source, destination, {
33782
33801
  overwrite: true,
33783
- dereference: os10.platform() === "win32",
33802
+ dereference: os11.platform() === "win32",
33784
33803
  filter: async (sourcePath) => {
33785
33804
  const stat = await import_fs_extra7.default.lstat(sourcePath);
33786
33805
  return !(stat.isSocket() || stat.isFIFO() || stat.isCharacterDevice() || stat.isBlockDevice());
@@ -34340,7 +34359,8 @@ async function setupCommand(params = {}) {
34340
34359
  "customStatusline",
34341
34360
  "aiblueprintAgents",
34342
34361
  "aiblueprintSkills",
34343
- "installCodex"
34362
+ "installCodex",
34363
+ "claudeMods"
34344
34364
  ];
34345
34365
  console.log(source_default.green("✓ Installing all features (--skip mode)"));
34346
34366
  } else {
@@ -34374,6 +34394,11 @@ async function setupCommand(params = {}) {
34374
34394
  value: "installCodex",
34375
34395
  name: "Codex setup - Starter config + share skills/agents with ~/.codex",
34376
34396
  checked: true
34397
+ },
34398
+ {
34399
+ value: "claudeMods",
34400
+ name: "Claude Code mods - aiblueprint usage band + agent4everything skills sync",
34401
+ checked: true
34377
34402
  }
34378
34403
  ]
34379
34404
  }
@@ -34390,6 +34415,7 @@ async function setupCommand(params = {}) {
34390
34415
  aiblueprintAgents: features.includes("aiblueprintAgents"),
34391
34416
  aiblueprintSkills: features.includes("aiblueprintSkills"),
34392
34417
  installCodex: features.includes("installCodex"),
34418
+ claudeMods: features.includes("claudeMods"),
34393
34419
  skipInteractive
34394
34420
  };
34395
34421
  const s = new SimpleSpinner;
@@ -34440,6 +34466,23 @@ async function setupCommand(params = {}) {
34440
34466
  s.stop("Scripts not available in repository");
34441
34467
  }
34442
34468
  }
34469
+ if (options.claudeMods) {
34470
+ s.start("Setting up Claude Code mods");
34471
+ const modsSource = await resolveClaudeAssetPath(sourceDir, "mods");
34472
+ if (modsSource) {
34473
+ const entries = await import_fs_extra9.default.readdir(modsSource, { withFileTypes: true });
34474
+ const mods = entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);
34475
+ for (const mod of mods) {
34476
+ await import_fs_extra9.default.copy(path13.join(modsSource, mod), path13.join(claudeDir, "mods", mod), {
34477
+ overwrite: true
34478
+ });
34479
+ }
34480
+ options.installedMods = mods;
34481
+ s.stop(`Mods installed (${mods.join(", ")})`);
34482
+ } else {
34483
+ s.stop("Mods not available in repository");
34484
+ }
34485
+ }
34443
34486
  if (options.aiblueprintAgents) {
34444
34487
  s.start("Setting up AIBlueprint agents");
34445
34488
  const agentsSource = path13.join(sourceDir, "agents");
@@ -34544,7 +34587,7 @@ async function setupCommand(params = {}) {
34544
34587
  console.log(source_default.gray(`
34545
34588
  Next steps:`));
34546
34589
  if (options.shellShortcuts) {
34547
- const platform = os11.platform();
34590
+ const platform = os12.platform();
34548
34591
  if (platform === "win32") {
34549
34592
  console.log(source_default.gray(" • Restart PowerShell to load the new functions"));
34550
34593
  } else {
@@ -34574,7 +34617,7 @@ Next steps:`));
34574
34617
  // src/commands/setup-terminal.ts
34575
34618
  var import_fs_extra10 = __toESM(require_lib4(), 1);
34576
34619
  import path14 from "path";
34577
- import os12 from "os";
34620
+ import os13 from "os";
34578
34621
  import { execSync as execSync3, exec as exec2 } from "child_process";
34579
34622
  var OHMYZSH_INSTALL_URL = "https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh";
34580
34623
  var INSTALL_TIMEOUT = 120000;
@@ -34741,7 +34784,7 @@ plugins=(${pluginsString})`;
34741
34784
  }
34742
34785
  async function setupTerminalCommand(options = {}) {
34743
34786
  const { skipInteractive, homeDir: customHomeDir } = options;
34744
- const homeDir = customHomeDir || os12.homedir();
34787
+ const homeDir = customHomeDir || os13.homedir();
34745
34788
  try {
34746
34789
  console.log(source_default.blue.bold(`
34747
34790
  \uD83D\uDDA5️ AIBlueprint Terminal Setup ${source_default.gray(`v${getVersion()}`)}
@@ -34891,24 +34934,24 @@ Next steps:`));
34891
34934
  // src/commands/setup/symlinks.ts
34892
34935
  var import_fs_extra11 = __toESM(require_lib4(), 1);
34893
34936
  import path15 from "path";
34894
- import os13 from "os";
34937
+ import os14 from "os";
34895
34938
  async function getToolPaths(tool, customFolder) {
34896
34939
  let baseDir;
34897
34940
  switch (tool) {
34898
34941
  case "claude-code":
34899
- baseDir = customFolder ? path15.resolve(customFolder) : path15.join(os13.homedir(), ".claude");
34942
+ baseDir = customFolder ? path15.resolve(customFolder) : path15.join(os14.homedir(), ".claude");
34900
34943
  return {
34901
34944
  baseDir,
34902
34945
  agentsPath: path15.join(baseDir, "agents")
34903
34946
  };
34904
34947
  case "codex":
34905
- baseDir = customFolder ? path15.resolve(customFolder) : path15.join(os13.homedir(), ".codex");
34948
+ baseDir = customFolder ? path15.resolve(customFolder) : path15.join(os14.homedir(), ".codex");
34906
34949
  return {
34907
34950
  baseDir,
34908
34951
  agentsPath: path15.join(baseDir, "agents")
34909
34952
  };
34910
34953
  case "factoryai":
34911
- baseDir = customFolder ? path15.resolve(customFolder) : path15.join(os13.homedir(), ".factory");
34954
+ baseDir = customFolder ? path15.resolve(customFolder) : path15.join(os14.homedir(), ".factory");
34912
34955
  return {
34913
34956
  baseDir,
34914
34957
  agentsPath: path15.join(baseDir, "droids")
@@ -34936,7 +34979,7 @@ async function createSymlink(sourcePath, targetPath, options = {}) {
34936
34979
  return false;
34937
34980
  }
34938
34981
  }
34939
- const isWindows = os13.platform() === "win32";
34982
+ const isWindows = os14.platform() === "win32";
34940
34983
  if (isWindows) {
34941
34984
  await import_fs_extra11.default.symlink(sourcePath, targetPath, "junction");
34942
34985
  } else {
@@ -35780,14 +35823,14 @@ var Y2 = ({ indicator: t = "dots" } = {}) => {
35780
35823
  // src/lib/agents-unifier.ts
35781
35824
  var import_fs_extra13 = __toESM(require_lib4(), 1);
35782
35825
  import crypto from "crypto";
35783
- import os15 from "os";
35826
+ import os16 from "os";
35784
35827
  import path17 from "path";
35785
35828
 
35786
35829
  // src/lib/backup-utils.ts
35787
35830
  var import_fs_extra12 = __toESM(require_lib4(), 1);
35788
35831
  import path16 from "path";
35789
- import os14 from "os";
35790
- var BACKUP_BASE_DIR = path16.join(os14.homedir(), ".config", "aiblueprint", "backup");
35832
+ import os15 from "os";
35833
+ var BACKUP_BASE_DIR = path16.join(os15.homedir(), ".config", "aiblueprint", "backup");
35791
35834
  function getBackupDir() {
35792
35835
  return process.env.AIBLUEPRINT_BACKUP_DIR || BACKUP_BASE_DIR;
35793
35836
  }
@@ -35834,7 +35877,7 @@ var MANAGED_FOLDERS = [".claude", ".codex", ".agents"];
35834
35877
  async function copyForBackup(sourcePath, destPath) {
35835
35878
  await import_fs_extra12.default.copy(sourcePath, destPath, {
35836
35879
  overwrite: true,
35837
- dereference: os14.platform() === "win32"
35880
+ dereference: os15.platform() === "win32"
35838
35881
  });
35839
35882
  }
35840
35883
  async function hasMeaningfulContent(dir) {
@@ -36560,7 +36603,7 @@ async function ensureBackupPath(result, dryRun = false) {
36560
36603
  }
36561
36604
  async function createDirectorySymlink(source, target) {
36562
36605
  await import_fs_extra13.default.ensureDir(path17.dirname(target));
36563
- if (os15.platform() === "win32") {
36606
+ if (os16.platform() === "win32") {
36564
36607
  await import_fs_extra13.default.symlink(source, target, "junction");
36565
36608
  return;
36566
36609
  }
@@ -36568,7 +36611,7 @@ async function createDirectorySymlink(source, target) {
36568
36611
  }
36569
36612
  async function createFileSymlink(source, target) {
36570
36613
  await import_fs_extra13.default.ensureDir(path17.dirname(target));
36571
- if (os15.platform() === "win32") {
36614
+ if (os16.platform() === "win32") {
36572
36615
  await import_fs_extra13.default.symlink(source, target, "file");
36573
36616
  return;
36574
36617
  }
@@ -37274,7 +37317,7 @@ Codex agents render failed:`), error);
37274
37317
  // src/lib/session-unifier.ts
37275
37318
  var import_fs_extra14 = __toESM(require_lib4(), 1);
37276
37319
  import crypto2 from "crypto";
37277
- import os16 from "os";
37320
+ import os17 from "os";
37278
37321
  import path18 from "path";
37279
37322
  var MANAGED_FOLDERS2 = [".claude", ".codex", ".agents"];
37280
37323
  var SESSION_PATHS = {
@@ -37298,7 +37341,7 @@ async function collectSnapshotSources(folders) {
37298
37341
  ...await listSnapshotSources(storePaths.configsDir, "config"),
37299
37342
  ...await listSnapshotSources(storePaths.backupsDir, "backup")
37300
37343
  ];
37301
- if (path18.resolve(folders.rootDir) === os16.homedir()) {
37344
+ if (path18.resolve(folders.rootDir) === os17.homedir()) {
37302
37345
  sources.push(...await listSnapshotSources(getBackupDir(), "legacy-backup"));
37303
37346
  }
37304
37347
  return sources.sort((a, b) => a.name.localeCompare(b.name));
@@ -37571,7 +37614,7 @@ import path21 from "path";
37571
37614
 
37572
37615
  // src/lib/pro-installer.ts
37573
37616
  var import_fs_extra15 = __toESM(require_lib4(), 1);
37574
- import os17 from "os";
37617
+ import os18 from "os";
37575
37618
  import path19 from "path";
37576
37619
  import { exec as exec3, execFile } from "child_process";
37577
37620
  import { promisify as promisify2 } from "util";
@@ -37604,7 +37647,7 @@ function routePath(relativePath) {
37604
37647
  return { kind: "claude", relativePath };
37605
37648
  }
37606
37649
  function getCacheRepoDir() {
37607
- return path19.join(os17.homedir(), ".config", "aiblueprint", "pro-repos", "aiblueprint-cli-premium");
37650
+ return path19.join(os18.homedir(), ".config", "aiblueprint", "pro-repos", "aiblueprint-cli-premium");
37608
37651
  }
37609
37652
  async function execGitWithAuth(command, token, repoUrl, cwd) {
37610
37653
  const authenticatedUrl = `https://x-access-token:${token}@${repoUrl.replace(/^https?:\/\//, "")}`;
@@ -37775,7 +37818,7 @@ async function installProConfigs(options) {
37775
37818
  } catch (error) {
37776
37819
  console.warn("Git caching failed, falling back to API download");
37777
37820
  }
37778
- const tempDir = path19.join(os17.tmpdir(), `aiblueprint-premium-${Date.now()}`);
37821
+ const tempDir = path19.join(os18.tmpdir(), `aiblueprint-premium-${Date.now()}`);
37779
37822
  try {
37780
37823
  let success = false;
37781
37824
  for (const candidate of CONFIG_FOLDER_CANDIDATES2) {
@@ -37809,7 +37852,7 @@ async function syncAllAgentSymlinks(agentsDir, claudeDir) {
37809
37852
  }
37810
37853
  }
37811
37854
  function getAssistantProCacheDir() {
37812
- return path19.join(os17.homedir(), ".config", "aiblueprint", "pro-repos", "assistant-pro-skills");
37855
+ return path19.join(os18.homedir(), ".config", "aiblueprint", "pro-repos", "assistant-pro-skills");
37813
37856
  }
37814
37857
  async function runAuthenticatedGit(args, token, cwd) {
37815
37858
  const authorization = Buffer.from(`x-access-token:${token}`).toString("base64");
@@ -37880,7 +37923,7 @@ function isYamlContentLine(line) {
37880
37923
  async function ensureHermesExternalSkillsDir(hermesDir, agentsSkillsDir) {
37881
37924
  const configPath = path19.join(hermesDir, "config.yaml");
37882
37925
  const resolvedSkillsDir = path19.resolve(agentsSkillsDir);
37883
- const defaultSkillsDir = path19.join(os17.homedir(), ".agents", "skills");
37926
+ const defaultSkillsDir = path19.join(os18.homedir(), ".agents", "skills");
37884
37927
  const configuredPath = resolvedSkillsDir === defaultSkillsDir ? "~/.agents/skills" : resolvedSkillsDir;
37885
37928
  const yamlEntry = ` - ${JSON.stringify(configuredPath)}`;
37886
37929
  await import_fs_extra15.default.ensureDir(hermesDir);
@@ -37969,15 +38012,15 @@ async function configureAssistantProConsumers(options) {
37969
38012
 
37970
38013
  // src/lib/token-storage.ts
37971
38014
  var import_fs_extra16 = __toESM(require_lib4(), 1);
37972
- import os18 from "os";
38015
+ import os19 from "os";
37973
38016
  import path20 from "path";
37974
38017
  function getConfigDir() {
37975
- const platform = os18.platform();
38018
+ const platform = os19.platform();
37976
38019
  if (platform === "win32") {
37977
- const appData = process.env.APPDATA || path20.join(os18.homedir(), "AppData", "Roaming");
38020
+ const appData = process.env.APPDATA || path20.join(os19.homedir(), "AppData", "Roaming");
37978
38021
  return path20.join(appData, "aiblueprint");
37979
38022
  } else {
37980
- const configHome = process.env.XDG_CONFIG_HOME || path20.join(os18.homedir(), ".config");
38023
+ const configHome = process.env.XDG_CONFIG_HOME || path20.join(os19.homedir(), ".config");
37981
38024
  return path20.join(configHome, "aiblueprint");
37982
38025
  }
37983
38026
  }
@@ -38033,13 +38076,13 @@ async function getAssistantProToken() {
38033
38076
  function getTokenInfo() {
38034
38077
  return {
38035
38078
  path: getTokenFilePath2(),
38036
- platform: os18.platform()
38079
+ platform: os19.platform()
38037
38080
  };
38038
38081
  }
38039
38082
  function getAssistantProTokenInfo() {
38040
38083
  return {
38041
38084
  path: getAssistantProTokenFilePath(),
38042
- platform: os18.platform()
38085
+ platform: os19.platform()
38043
38086
  };
38044
38087
  }
38045
38088
 
@@ -39219,19 +39262,19 @@ async function configsBackupsCleanCommand(options = {}) {
39219
39262
  }
39220
39263
 
39221
39264
  // src/commands/openclaw-pro.ts
39222
- import os21 from "os";
39265
+ import os22 from "os";
39223
39266
  import path25 from "path";
39224
39267
 
39225
39268
  // src/lib/openclaw-installer.ts
39226
39269
  var import_fs_extra19 = __toESM(require_lib4(), 1);
39227
- import os19 from "os";
39270
+ import os20 from "os";
39228
39271
  import path23 from "path";
39229
39272
  import { exec as exec4 } from "child_process";
39230
39273
  import { promisify as promisify3 } from "util";
39231
39274
  var execAsync3 = promisify3(exec4);
39232
39275
  var OPENCLAW_PRO_REPO = "Melvynx/openclawpro";
39233
39276
  function getCacheRepoDir2() {
39234
- return path23.join(os19.homedir(), ".config", "openclaw", "pro-repos", "openclawpro");
39277
+ return path23.join(os20.homedir(), ".config", "openclaw", "pro-repos", "openclawpro");
39235
39278
  }
39236
39279
  async function execGitWithAuth2(command, token, repoUrl, cwd) {
39237
39280
  const authenticatedUrl = `https://x-access-token:${token}@${repoUrl.replace(/^https?:\/\//, "")}`;
@@ -39280,7 +39323,7 @@ async function copyConfigFromCache2(cacheConfigDir, targetDir, onProgress) {
39280
39323
  }
39281
39324
  async function installOpenclawProConfigs(options) {
39282
39325
  const { githubToken, openclawFolder, onProgress } = options;
39283
- const targetFolder = openclawFolder || path23.join(os19.homedir(), ".openclaw");
39326
+ const targetFolder = openclawFolder || path23.join(os20.homedir(), ".openclaw");
39284
39327
  try {
39285
39328
  const cacheConfigDir = await cloneOrUpdateRepo2(githubToken);
39286
39329
  await copyConfigFromCache2(cacheConfigDir, targetFolder, onProgress);
@@ -39292,14 +39335,14 @@ async function installOpenclawProConfigs(options) {
39292
39335
 
39293
39336
  // src/lib/openclaw-token-storage.ts
39294
39337
  var import_fs_extra20 = __toESM(require_lib4(), 1);
39295
- import os20 from "os";
39338
+ import os21 from "os";
39296
39339
  import path24 from "path";
39297
39340
  function getConfigDir2() {
39298
- const platform = os20.platform();
39341
+ const platform = os21.platform();
39299
39342
  if (platform === "win32") {
39300
- return path24.join(process.env.APPDATA || os20.homedir(), "openclaw");
39343
+ return path24.join(process.env.APPDATA || os21.homedir(), "openclaw");
39301
39344
  }
39302
- return path24.join(os20.homedir(), ".config", "openclaw");
39345
+ return path24.join(os21.homedir(), ".config", "openclaw");
39303
39346
  }
39304
39347
  function getTokenPath() {
39305
39348
  return path24.join(getConfigDir2(), "token.txt");
@@ -39320,7 +39363,7 @@ async function getOpenclawToken() {
39320
39363
  function getOpenclawTokenInfo() {
39321
39364
  return {
39322
39365
  path: getTokenPath(),
39323
- platform: os20.platform()
39366
+ platform: os21.platform()
39324
39367
  };
39325
39368
  }
39326
39369
 
@@ -39432,7 +39475,7 @@ async function openclawProSetupCommand(options = {}) {
39432
39475
  Se(source_default.red("❌ Not activated"));
39433
39476
  process.exit(1);
39434
39477
  }
39435
- const openclawDir = options.folder ? path25.resolve(options.folder) : path25.join(os21.homedir(), ".openclaw");
39478
+ const openclawDir = options.folder ? path25.resolve(options.folder) : path25.join(os22.homedir(), ".openclaw");
39436
39479
  const spinner = Y2();
39437
39480
  const onProgress = (file, type) => {
39438
39481
  spinner.message(`Installing: ${source_default.cyan(file)} ${source_default.gray(`(${type})`)}`);
@@ -39606,10 +39649,10 @@ var import_fs_extra23 = __toESM(require_lib4(), 1);
39606
39649
  import { spawn as spawn2 } from "child_process";
39607
39650
  import { execSync as execSync4 } from "child_process";
39608
39651
  import path27 from "path";
39609
- import os22 from "os";
39652
+ import os23 from "os";
39610
39653
  function checkCommand2(cmd) {
39611
39654
  try {
39612
- const isWindows = os22.platform() === "win32";
39655
+ const isWindows = os23.platform() === "win32";
39613
39656
  const whichCmd = isWindows ? `where ${cmd}` : `which ${cmd}`;
39614
39657
  execSync4(whichCmd, { stdio: "ignore" });
39615
39658
  return true;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiblueprint-cli",
3
- "version": "1.4.108",
3
+ "version": "1.4.109",
4
4
  "description": "AIBlueprint CLI for setting up AI coding configurations",
5
5
  "author": "AIBlueprint",
6
6
  "license": "MIT",