aiblueprint-cli 1.4.53 → 1.4.55

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.
@@ -0,0 +1,6 @@
1
+ # Codex CLI defaults installed by aiblueprint-cli.
2
+ # This file is only written when ~/.codex/config.toml is absent — your own
3
+ # config (project trust list, model preferences, etc.) is never overwritten.
4
+
5
+ approval_policy = "never"
6
+ sandbox_mode = "danger-full-access"
package/dist/cli.js CHANGED
@@ -32263,9 +32263,9 @@ var inquirer = {
32263
32263
  var lib_default = inquirer;
32264
32264
 
32265
32265
  // src/commands/setup.ts
32266
- var import_fs_extra8 = __toESM(require_lib4(), 1);
32267
- import path12 from "path";
32268
- import os12 from "os";
32266
+ var import_fs_extra7 = __toESM(require_lib4(), 1);
32267
+ import path11 from "path";
32268
+ import os11 from "os";
32269
32269
 
32270
32270
  // node_modules/chalk/source/vendor/ansi-styles/index.js
32271
32271
  var ANSI_BACKGROUND_OFFSET = 10;
@@ -32820,122 +32820,11 @@ function ccc { claude --dangerously-skip-permissions -c $args }
32820
32820
  }
32821
32821
  }
32822
32822
 
32823
- // src/commands/setup/symlinks.ts
32824
- var import_fs_extra2 = __toESM(require_lib4(), 1);
32825
- import path3 from "path";
32826
- import os4 from "os";
32827
- async function getToolPaths(tool, customFolder) {
32828
- let baseDir;
32829
- switch (tool) {
32830
- case "claude-code":
32831
- baseDir = customFolder ? path3.resolve(customFolder) : path3.join(os4.homedir(), ".claude");
32832
- return {
32833
- baseDir,
32834
- commandsPath: path3.join(baseDir, "commands"),
32835
- agentsPath: path3.join(baseDir, "agents")
32836
- };
32837
- case "codex":
32838
- baseDir = customFolder ? path3.resolve(customFolder) : path3.join(os4.homedir(), ".codex");
32839
- return {
32840
- baseDir,
32841
- commandsPath: path3.join(baseDir, "prompts")
32842
- };
32843
- case "opencode":
32844
- baseDir = customFolder ? path3.resolve(customFolder) : path3.join(os4.homedir(), ".config", "opencode");
32845
- return {
32846
- baseDir,
32847
- commandsPath: path3.join(baseDir, "command")
32848
- };
32849
- case "factoryai":
32850
- baseDir = customFolder ? path3.resolve(customFolder) : path3.join(os4.homedir(), ".factory");
32851
- return {
32852
- baseDir,
32853
- commandsPath: path3.join(baseDir, "commands"),
32854
- agentsPath: path3.join(baseDir, "droids")
32855
- };
32856
- default:
32857
- throw new Error(`Unknown tool type: ${tool}`);
32858
- }
32859
- }
32860
- async function createSymlink(sourcePath, targetPath, options = {}) {
32861
- try {
32862
- const sourceExists = await import_fs_extra2.default.pathExists(sourcePath);
32863
- if (!sourceExists) {
32864
- console.log(source_default.yellow(` Source path ${sourcePath} does not exist. Skipping symlink creation...`));
32865
- return false;
32866
- }
32867
- const targetDir = path3.dirname(targetPath);
32868
- await import_fs_extra2.default.ensureDir(targetDir);
32869
- const targetExists = await import_fs_extra2.default.pathExists(targetPath);
32870
- if (targetExists) {
32871
- const stat = await import_fs_extra2.default.lstat(targetPath);
32872
- if (stat.isSymbolicLink()) {
32873
- await import_fs_extra2.default.remove(targetPath);
32874
- } else {
32875
- console.log(source_default.yellow(options.skipMessage || ` ${targetPath} already exists and is not a symlink. Skipping...`));
32876
- return false;
32877
- }
32878
- }
32879
- const isWindows = os4.platform() === "win32";
32880
- if (isWindows) {
32881
- await import_fs_extra2.default.symlink(sourcePath, targetPath, "junction");
32882
- } else {
32883
- await import_fs_extra2.default.symlink(sourcePath, targetPath);
32884
- }
32885
- return true;
32886
- } catch (error) {
32887
- console.error(source_default.red(options.errorPrefix || "Error creating symlink:"), error);
32888
- throw error;
32889
- }
32890
- }
32891
- async function setupCodexSymlink(claudeDir, customCodexFolder, customClaudeCodeFolder) {
32892
- try {
32893
- let codexDir;
32894
- if (customCodexFolder) {
32895
- codexDir = path3.resolve(customCodexFolder);
32896
- } else if (customClaudeCodeFolder) {
32897
- const parentDir = path3.dirname(claudeDir);
32898
- codexDir = path3.join(parentDir, "codex");
32899
- } else {
32900
- codexDir = path3.join(os4.homedir(), ".codex");
32901
- }
32902
- const promptsPath = path3.join(codexDir, "prompts");
32903
- const commandsPath = path3.join(claudeDir, "commands");
32904
- await createSymlink(commandsPath, promptsPath, {
32905
- skipMessage: " ~/.codex/prompts already exists and is not a symlink. Skipping...",
32906
- errorPrefix: "Error setting up Codex symlink:"
32907
- });
32908
- } catch (error) {
32909
- console.error(source_default.red("Error setting up Codex symlink:"), error);
32910
- }
32911
- }
32912
- async function setupOpenCodeSymlink(claudeDir, customOpenCodeFolder, customClaudeCodeFolder) {
32913
- try {
32914
- let openCodeDir;
32915
- if (customOpenCodeFolder) {
32916
- openCodeDir = path3.resolve(customOpenCodeFolder);
32917
- } else if (customClaudeCodeFolder) {
32918
- const parentDir = path3.dirname(claudeDir);
32919
- openCodeDir = path3.join(parentDir, ".opencode");
32920
- } else {
32921
- openCodeDir = path3.join(os4.homedir(), ".config", "opencode");
32922
- }
32923
- const commandPath = path3.join(openCodeDir, "command");
32924
- const commandsPath = path3.join(claudeDir, "commands");
32925
- await createSymlink(commandsPath, commandPath, {
32926
- skipMessage: " ~/.config/opencode/command already exists and is not a symlink. Skipping...",
32927
- errorPrefix: "Error setting up OpenCode symlink:"
32928
- });
32929
- } catch (error) {
32930
- console.error(source_default.red("Error setting up OpenCode symlink:"), error);
32931
- }
32932
- }
32933
-
32934
32823
  // src/commands/setup/dependencies.ts
32935
32824
  import { execSync } from "child_process";
32936
- import path4 from "path";
32937
- import os5 from "os";
32938
- var isWindows = os5.platform() === "win32";
32825
+ import path3 from "path";
32826
+ import os4 from "os";
32827
+ var isWindows = os4.platform() === "win32";
32939
32828
  function checkCommand(cmd) {
32940
32829
  try {
32941
32830
  const whichCmd = isWindows ? `where ${cmd}` : `which ${cmd}`;
@@ -33011,7 +32900,7 @@ async function checkAndInstallDependencies() {
33011
32900
  }
33012
32901
  }
33013
32902
  async function installScriptsDependencies(claudeDir) {
33014
- const scriptsDir = path4.join(claudeDir, "scripts");
32903
+ const scriptsDir = path3.join(claudeDir, "scripts");
33015
32904
  console.log(source_default.yellow(`
33016
32905
  Installing scripts dependencies...`));
33017
32906
  try {
@@ -33039,15 +32928,15 @@ async function installStatuslineDependencies(claudeDir) {
33039
32928
  }
33040
32929
 
33041
32930
  // src/commands/setup/settings.ts
33042
- var import_fs_extra3 = __toESM(require_lib4(), 1);
33043
- import path5 from "path";
32931
+ var import_fs_extra2 = __toESM(require_lib4(), 1);
32932
+ import path4 from "path";
33044
32933
  function toPosixPath(p) {
33045
32934
  return p.replace(/\\/g, "/");
33046
32935
  }
33047
32936
  async function hasExistingStatusLine(claudeDir) {
33048
- const settingsPath = path5.join(claudeDir, "settings.json");
32937
+ const settingsPath = path4.join(claudeDir, "settings.json");
33049
32938
  try {
33050
- const existingSettings = await import_fs_extra3.default.readFile(settingsPath, "utf-8");
32939
+ const existingSettings = await import_fs_extra2.default.readFile(settingsPath, "utf-8");
33051
32940
  const settings = JSON.parse(existingSettings);
33052
32941
  return !!settings.statusLine;
33053
32942
  } catch {
@@ -33055,10 +32944,10 @@ async function hasExistingStatusLine(claudeDir) {
33055
32944
  }
33056
32945
  }
33057
32946
  async function updateSettings(options, claudeDir) {
33058
- const settingsPath = path5.join(claudeDir, "settings.json");
32947
+ const settingsPath = path4.join(claudeDir, "settings.json");
33059
32948
  let settings = {};
33060
32949
  try {
33061
- const existingSettings = await import_fs_extra3.default.readFile(settingsPath, "utf-8");
32950
+ const existingSettings = await import_fs_extra2.default.readFile(settingsPath, "utf-8");
33062
32951
  settings = JSON.parse(existingSettings);
33063
32952
  } catch {}
33064
32953
  if (options.customStatusline) {
@@ -33066,7 +32955,7 @@ async function updateSettings(options, claudeDir) {
33066
32955
  if (shouldReplace) {
33067
32956
  settings.statusLine = {
33068
32957
  type: "command",
33069
- command: `bun ${toPosixPath(path5.join(claudeDir, "scripts/statusline/src/index.ts"))}`,
32958
+ command: `bun ${toPosixPath(path4.join(claudeDir, "scripts/statusline/src/index.ts"))}`,
33070
32959
  padding: 0
33071
32960
  };
33072
32961
  }
@@ -33091,13 +32980,13 @@ async function updateSettings(options, claudeDir) {
33091
32980
  settings.permissions.deny.push(rule);
33092
32981
  }
33093
32982
  }
33094
- await import_fs_extra3.default.writeJson(settingsPath, settings, { spaces: 2 });
32983
+ await import_fs_extra2.default.writeJson(settingsPath, settings, { spaces: 2 });
33095
32984
  }
33096
32985
 
33097
32986
  // src/commands/setup/utils.ts
33098
- var import_fs_extra4 = __toESM(require_lib4(), 1);
33099
- import path6 from "path";
33100
- import os6 from "os";
32987
+ var import_fs_extra3 = __toESM(require_lib4(), 1);
32988
+ import path5 from "path";
32989
+ import os5 from "os";
33101
32990
  import { exec } from "child_process";
33102
32991
  import { promisify } from "util";
33103
32992
  var execAsync = promisify(exec);
@@ -33114,20 +33003,20 @@ class SimpleSpinner {
33114
33003
  }
33115
33004
  var GITHUB_REPO = "https://github.com/Melvynx/aiblueprint.git";
33116
33005
  async function cloneRepository() {
33117
- const tmpDir = path6.join(os6.tmpdir(), `aiblueprint-${Date.now()}`);
33006
+ const tmpDir = path5.join(os5.tmpdir(), `aiblueprint-${Date.now()}`);
33118
33007
  try {
33119
- await import_fs_extra4.default.ensureDir(tmpDir);
33008
+ await import_fs_extra3.default.ensureDir(tmpDir);
33120
33009
  await execAsync(`git clone --depth 1 --quiet ${GITHUB_REPO} "${tmpDir}"`);
33121
33010
  return tmpDir;
33122
33011
  } catch (error) {
33123
33012
  console.error(source_default.yellow(` Warning: Failed to clone repository: ${error instanceof Error ? error.message : String(error)}`));
33124
- await import_fs_extra4.default.remove(tmpDir).catch(() => {});
33013
+ await import_fs_extra3.default.remove(tmpDir).catch(() => {});
33125
33014
  return null;
33126
33015
  }
33127
33016
  }
33128
33017
  async function cleanupRepository(repoPath) {
33129
33018
  try {
33130
- await import_fs_extra4.default.remove(repoPath);
33019
+ await import_fs_extra3.default.remove(repoPath);
33131
33020
  } catch (error) {
33132
33021
  console.error(source_default.yellow(` Warning: Failed to cleanup temporary directory: ${error instanceof Error ? error.message : String(error)}`));
33133
33022
  }
@@ -33135,8 +33024,8 @@ async function cleanupRepository(repoPath) {
33135
33024
  async function resolveConfigDir(repoPath) {
33136
33025
  const candidates = CONFIG_FOLDER_CANDIDATES;
33137
33026
  for (const name of candidates) {
33138
- const candidate = path6.join(repoPath, name);
33139
- if (await import_fs_extra4.default.pathExists(candidate)) {
33027
+ const candidate = path5.join(repoPath, name);
33028
+ if (await import_fs_extra3.default.pathExists(candidate)) {
33140
33029
  return candidate;
33141
33030
  }
33142
33031
  }
@@ -33163,20 +33052,20 @@ function getVersion() {
33163
33052
  }
33164
33053
 
33165
33054
  // src/lib/backup-utils.ts
33166
- var import_fs_extra5 = __toESM(require_lib4(), 1);
33167
- import path7 from "path";
33168
- import os7 from "os";
33169
- var BACKUP_BASE_DIR = path7.join(os7.homedir(), ".config", "aiblueprint", "backup");
33055
+ var import_fs_extra4 = __toESM(require_lib4(), 1);
33056
+ import path6 from "path";
33057
+ import os6 from "os";
33058
+ var BACKUP_BASE_DIR = path6.join(os6.homedir(), ".config", "aiblueprint", "backup");
33170
33059
  function formatDate(date) {
33171
33060
  const pad = (n) => n.toString().padStart(2, "0");
33172
33061
  return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}-${pad(date.getHours())}-${pad(date.getMinutes())}-${pad(date.getSeconds())}`;
33173
33062
  }
33174
33063
  async function listBackups() {
33175
- const exists = await import_fs_extra5.default.pathExists(BACKUP_BASE_DIR);
33064
+ const exists = await import_fs_extra4.default.pathExists(BACKUP_BASE_DIR);
33176
33065
  if (!exists) {
33177
33066
  return [];
33178
33067
  }
33179
- const entries = await import_fs_extra5.default.readdir(BACKUP_BASE_DIR, { withFileTypes: true });
33068
+ const entries = await import_fs_extra4.default.readdir(BACKUP_BASE_DIR, { withFileTypes: true });
33180
33069
  const backups = [];
33181
33070
  for (const entry of entries) {
33182
33071
  if (!entry.isDirectory())
@@ -33188,7 +33077,7 @@ async function listBackups() {
33188
33077
  const date = new Date(parseInt(year), parseInt(month) - 1, parseInt(day), parseInt(hour), parseInt(minute), parseInt(second));
33189
33078
  backups.push({
33190
33079
  name: entry.name,
33191
- path: path7.join(BACKUP_BASE_DIR, entry.name),
33080
+ path: path6.join(BACKUP_BASE_DIR, entry.name),
33192
33081
  date
33193
33082
  });
33194
33083
  }
@@ -33197,12 +33086,12 @@ async function listBackups() {
33197
33086
  var AGENTS_BACKUP_SUBDIR = ".agents";
33198
33087
  var CLAUDE_ITEMS = ["commands", "agents", "skills", "scripts", "settings.json"];
33199
33088
  async function copyForBackup(sourcePath, destPath) {
33200
- await import_fs_extra5.default.copy(sourcePath, destPath, {
33089
+ await import_fs_extra4.default.copy(sourcePath, destPath, {
33201
33090
  overwrite: true,
33202
33091
  dereference: false,
33203
33092
  filter: async (src) => {
33204
33093
  try {
33205
- const stat = await import_fs_extra5.default.lstat(src);
33094
+ const stat = await import_fs_extra4.default.lstat(src);
33206
33095
  return !stat.isSymbolicLink();
33207
33096
  } catch {
33208
33097
  return true;
@@ -33211,28 +33100,28 @@ async function copyForBackup(sourcePath, destPath) {
33211
33100
  });
33212
33101
  }
33213
33102
  async function hasMeaningfulContent(dir) {
33214
- if (!await import_fs_extra5.default.pathExists(dir))
33103
+ if (!await import_fs_extra4.default.pathExists(dir))
33215
33104
  return false;
33216
- const files = await import_fs_extra5.default.readdir(dir);
33105
+ const files = await import_fs_extra4.default.readdir(dir);
33217
33106
  return files.some((f) => f !== ".DS_Store");
33218
33107
  }
33219
33108
  async function loadBackup(backupPath, claudeDir, agentsDir) {
33220
- const exists = await import_fs_extra5.default.pathExists(backupPath);
33109
+ const exists = await import_fs_extra4.default.pathExists(backupPath);
33221
33110
  if (!exists) {
33222
33111
  throw new Error(`Backup not found: ${backupPath}`);
33223
33112
  }
33224
- await import_fs_extra5.default.ensureDir(claudeDir);
33113
+ await import_fs_extra4.default.ensureDir(claudeDir);
33225
33114
  for (const item of CLAUDE_ITEMS) {
33226
- const sourcePath = path7.join(backupPath, item);
33227
- const destPath = path7.join(claudeDir, item);
33228
- if (await import_fs_extra5.default.pathExists(sourcePath)) {
33115
+ const sourcePath = path6.join(backupPath, item);
33116
+ const destPath = path6.join(claudeDir, item);
33117
+ if (await import_fs_extra4.default.pathExists(sourcePath)) {
33229
33118
  await copyForBackup(sourcePath, destPath);
33230
33119
  }
33231
33120
  }
33232
33121
  if (agentsDir) {
33233
- const agentsBackupPath = path7.join(backupPath, AGENTS_BACKUP_SUBDIR);
33234
- if (await import_fs_extra5.default.pathExists(agentsBackupPath)) {
33235
- await import_fs_extra5.default.ensureDir(agentsDir);
33122
+ const agentsBackupPath = path6.join(backupPath, AGENTS_BACKUP_SUBDIR);
33123
+ if (await import_fs_extra4.default.pathExists(agentsBackupPath)) {
33124
+ await import_fs_extra4.default.ensureDir(agentsDir);
33236
33125
  await copyForBackup(agentsBackupPath, agentsDir);
33237
33126
  }
33238
33127
  }
@@ -33244,28 +33133,28 @@ async function createBackup(claudeDir, agentsDir) {
33244
33133
  return null;
33245
33134
  }
33246
33135
  const timestamp = formatDate(new Date);
33247
- const backupPath = path7.join(BACKUP_BASE_DIR, timestamp);
33248
- await import_fs_extra5.default.ensureDir(backupPath);
33136
+ const backupPath = path6.join(BACKUP_BASE_DIR, timestamp);
33137
+ await import_fs_extra4.default.ensureDir(backupPath);
33249
33138
  if (claudeHasContent) {
33250
33139
  for (const item of CLAUDE_ITEMS) {
33251
- const sourcePath = path7.join(claudeDir, item);
33252
- const destPath = path7.join(backupPath, item);
33253
- if (await import_fs_extra5.default.pathExists(sourcePath)) {
33140
+ const sourcePath = path6.join(claudeDir, item);
33141
+ const destPath = path6.join(backupPath, item);
33142
+ if (await import_fs_extra4.default.pathExists(sourcePath)) {
33254
33143
  await copyForBackup(sourcePath, destPath);
33255
33144
  }
33256
33145
  }
33257
33146
  }
33258
33147
  if (agentsHasContent && agentsDir) {
33259
- const destPath = path7.join(backupPath, AGENTS_BACKUP_SUBDIR);
33148
+ const destPath = path6.join(backupPath, AGENTS_BACKUP_SUBDIR);
33260
33149
  await copyForBackup(agentsDir, destPath);
33261
33150
  }
33262
33151
  return backupPath;
33263
33152
  }
33264
33153
 
33265
33154
  // src/lib/platform.ts
33266
- var import_fs_extra6 = __toESM(require_lib4(), 1);
33267
- import os8 from "os";
33268
- import path8 from "path";
33155
+ var import_fs_extra5 = __toESM(require_lib4(), 1);
33156
+ import os7 from "os";
33157
+ import path7 from "path";
33269
33158
  import { execSync as execSync2 } from "child_process";
33270
33159
  function escapeShellArg(arg) {
33271
33160
  return "'" + arg.replace(/'/g, "'\\''") + "'";
@@ -33273,15 +33162,15 @@ function escapeShellArg(arg) {
33273
33162
  var cachedPlatformInfo = null;
33274
33163
  var cachedAudioPlayer = undefined;
33275
33164
  function isWSL() {
33276
- if (os8.platform() !== "linux")
33165
+ if (os7.platform() !== "linux")
33277
33166
  return false;
33278
- const release = os8.release().toLowerCase();
33167
+ const release = os7.release().toLowerCase();
33279
33168
  return release.includes("microsoft") || release.includes("wsl");
33280
33169
  }
33281
33170
  function getPlatformInfo() {
33282
33171
  if (cachedPlatformInfo)
33283
33172
  return cachedPlatformInfo;
33284
- const platform = os8.platform();
33173
+ const platform = os7.platform();
33285
33174
  const wsl = isWSL();
33286
33175
  cachedPlatformInfo = {
33287
33176
  platform,
@@ -33289,14 +33178,14 @@ function getPlatformInfo() {
33289
33178
  isMacOS: platform === "darwin",
33290
33179
  isLinux: platform === "linux" && !wsl,
33291
33180
  isWSL: wsl,
33292
- homeDir: os8.homedir()
33181
+ homeDir: os7.homedir()
33293
33182
  };
33294
33183
  return cachedPlatformInfo;
33295
33184
  }
33296
33185
  function detectAudioPlayer() {
33297
33186
  if (cachedAudioPlayer !== undefined)
33298
33187
  return cachedAudioPlayer;
33299
- const platform = os8.platform();
33188
+ const platform = os7.platform();
33300
33189
  if (platform === "darwin") {
33301
33190
  cachedAudioPlayer = "afplay";
33302
33191
  return cachedAudioPlayer;
@@ -33335,7 +33224,7 @@ function getPlaySoundCommand(soundPath) {
33335
33224
  const player = detectAudioPlayer();
33336
33225
  if (!player)
33337
33226
  return null;
33338
- const platform = os8.platform();
33227
+ const platform = os7.platform();
33339
33228
  const safePath = escapeShellArg(soundPath);
33340
33229
  if (platform === "darwin") {
33341
33230
  return `afplay -v 0.1 ${safePath}`;
@@ -33418,16 +33307,16 @@ function replaceClaudePathPlaceholder(content, claudeDir) {
33418
33307
  return content.replaceAll("{CLAUDE_PATH}", claudeDir);
33419
33308
  }
33420
33309
  async function replacePathPlaceholdersInDir(dir, claudeDir) {
33421
- const entries = await import_fs_extra6.default.readdir(dir, { withFileTypes: true });
33310
+ const entries = await import_fs_extra5.default.readdir(dir, { withFileTypes: true });
33422
33311
  for (const entry of entries) {
33423
- const fullPath = path8.join(dir, entry.name);
33312
+ const fullPath = path7.join(dir, entry.name);
33424
33313
  if (entry.isDirectory()) {
33425
33314
  await replacePathPlaceholdersInDir(fullPath, claudeDir);
33426
33315
  } else if (isTextFile(entry.name)) {
33427
- const content = await import_fs_extra6.default.readFile(fullPath, "utf-8");
33316
+ const content = await import_fs_extra5.default.readFile(fullPath, "utf-8");
33428
33317
  const replaced = replaceClaudePathPlaceholder(content, claudeDir);
33429
33318
  if (replaced !== content) {
33430
- await import_fs_extra6.default.writeFile(fullPath, replaced, "utf-8");
33319
+ await import_fs_extra5.default.writeFile(fullPath, replaced, "utf-8");
33431
33320
  }
33432
33321
  }
33433
33322
  }
@@ -33457,40 +33346,40 @@ function transformFileContent(content, claudeDir) {
33457
33346
  }
33458
33347
 
33459
33348
  // src/lib/telemetry.ts
33460
- import os9 from "os";
33461
- import fs7 from "fs";
33462
- import path9 from "path";
33349
+ import os8 from "os";
33350
+ import fs6 from "fs";
33351
+ import path8 from "path";
33463
33352
  var TELEMETRY_URL = "https://codelynx.dev/api/cli/events";
33464
33353
  var isDisabled = () => {
33465
33354
  return process.env.AIBLUEPRINT_TELEMETRY_DISABLED === "1";
33466
33355
  };
33467
33356
  var getBasePayload = () => ({
33468
33357
  cliVersion: getVersion(),
33469
- platform: os9.platform(),
33470
- arch: os9.arch(),
33358
+ platform: os8.platform(),
33359
+ arch: os8.arch(),
33471
33360
  nodeVersion: process.version
33472
33361
  });
33473
33362
  function getTokenFilePath() {
33474
- const homeDir = os9.homedir();
33475
- if (os9.platform() === "win32") {
33476
- const appData = process.env.APPDATA || path9.join(homeDir, "AppData", "Roaming");
33477
- return path9.join(appData, "aiblueprint", "token.txt");
33363
+ const homeDir = os8.homedir();
33364
+ if (os8.platform() === "win32") {
33365
+ const appData = process.env.APPDATA || path8.join(homeDir, "AppData", "Roaming");
33366
+ return path8.join(appData, "aiblueprint", "token.txt");
33478
33367
  }
33479
- const configHome = process.env.XDG_CONFIG_HOME || path9.join(homeDir, ".config");
33480
- return path9.join(configHome, "aiblueprint", "token.txt");
33368
+ const configHome = process.env.XDG_CONFIG_HOME || path8.join(homeDir, ".config");
33369
+ return path8.join(configHome, "aiblueprint", "token.txt");
33481
33370
  }
33482
33371
  function getSystemInfo() {
33483
33372
  let hasProToken = false;
33484
33373
  try {
33485
- hasProToken = fs7.existsSync(getTokenFilePath());
33374
+ hasProToken = fs6.existsSync(getTokenFilePath());
33486
33375
  } catch {}
33487
33376
  return {
33488
- osVersion: os9.release(),
33489
- osType: os9.type(),
33490
- totalMemory: `${Math.round(os9.totalmem() / (1024 * 1024 * 1024))}GB`,
33491
- cpus: os9.cpus().length,
33377
+ osVersion: os8.release(),
33378
+ osType: os8.type(),
33379
+ totalMemory: `${Math.round(os8.totalmem() / (1024 * 1024 * 1024))}GB`,
33380
+ cpus: os8.cpus().length,
33492
33381
  shell: process.env.SHELL || process.env.COMSPEC || "unknown",
33493
- homeDir: os9.homedir(),
33382
+ homeDir: os8.homedir(),
33494
33383
  locale: process.env.LANG || process.env.LC_ALL || "unknown",
33495
33384
  hasProToken
33496
33385
  };
@@ -33532,32 +33421,43 @@ async function flushTelemetry() {
33532
33421
  }
33533
33422
 
33534
33423
  // src/lib/agents-installer.ts
33535
- var import_fs_extra7 = __toESM(require_lib4(), 1);
33536
- import os10 from "os";
33537
- import path10 from "path";
33424
+ var import_fs_extra6 = __toESM(require_lib4(), 1);
33425
+ import os9 from "os";
33426
+ import path9 from "path";
33538
33427
  async function applyPathPlaceholders(target, claudeDir) {
33539
- const stat = await import_fs_extra7.default.stat(target).catch(() => null);
33428
+ const stat = await import_fs_extra6.default.stat(target).catch(() => null);
33540
33429
  if (!stat)
33541
33430
  return;
33542
33431
  if (stat.isDirectory()) {
33543
33432
  await replacePathPlaceholdersInDir(target, claudeDir);
33544
33433
  } else if (isTextFile(target)) {
33545
- const content = await import_fs_extra7.default.readFile(target, "utf-8");
33434
+ const content = await import_fs_extra6.default.readFile(target, "utf-8");
33546
33435
  const replaced = replaceClaudePathPlaceholder(content, claudeDir);
33547
33436
  if (replaced !== content) {
33548
- await import_fs_extra7.default.writeFile(target, replaced, "utf-8");
33437
+ await import_fs_extra6.default.writeFile(target, replaced, "utf-8");
33549
33438
  }
33550
33439
  }
33551
33440
  }
33552
33441
  var AGENT_CATEGORIES = ["skills", "agents"];
33553
33442
  async function platformSymlink(source, target) {
33554
- await import_fs_extra7.default.ensureDir(path10.dirname(target));
33555
- const isWindows2 = os10.platform() === "win32";
33556
- const sourceStat = await import_fs_extra7.default.stat(source).catch(() => null);
33557
- if (isWindows2 && sourceStat?.isDirectory()) {
33558
- await import_fs_extra7.default.symlink(source, target, "junction");
33559
- } else {
33560
- await import_fs_extra7.default.symlink(source, target);
33443
+ await import_fs_extra6.default.ensureDir(path9.dirname(target));
33444
+ const isWindows2 = os9.platform() === "win32";
33445
+ const sourceStat = await import_fs_extra6.default.stat(source).catch(() => null);
33446
+ const isDir = sourceStat?.isDirectory() ?? false;
33447
+ if (isWindows2 && isDir) {
33448
+ await import_fs_extra6.default.symlink(source, target, "junction");
33449
+ return;
33450
+ }
33451
+ try {
33452
+ await import_fs_extra6.default.symlink(source, target);
33453
+ } catch (error) {
33454
+ if (!isWindows2 || isDir)
33455
+ throw error;
33456
+ try {
33457
+ await import_fs_extra6.default.link(source, target);
33458
+ } catch {
33459
+ await import_fs_extra6.default.copy(source, target, { overwrite: true });
33460
+ }
33561
33461
  }
33562
33462
  }
33563
33463
  async function installCategoryToAgents(sourceCategoryDir, category, agentsDir, claudeDir, options = {}) {
@@ -33567,37 +33467,37 @@ async function installCategoryToAgents(sourceCategoryDir, category, agentsDir, c
33567
33467
  symlinked: [],
33568
33468
  skipped: []
33569
33469
  };
33570
- if (!await import_fs_extra7.default.pathExists(sourceCategoryDir)) {
33470
+ if (!await import_fs_extra6.default.pathExists(sourceCategoryDir)) {
33571
33471
  return result;
33572
33472
  }
33573
- const agentsCategoryDir = path10.join(agentsDir, category);
33574
- await import_fs_extra7.default.ensureDir(agentsCategoryDir);
33575
- const entries = await import_fs_extra7.default.readdir(sourceCategoryDir, { withFileTypes: true });
33473
+ const agentsCategoryDir = path9.join(agentsDir, category);
33474
+ await import_fs_extra6.default.ensureDir(agentsCategoryDir);
33475
+ const entries = await import_fs_extra6.default.readdir(sourceCategoryDir, { withFileTypes: true });
33576
33476
  for (const entry of entries) {
33577
33477
  if (entry.name === ".DS_Store" || entry.name === "node_modules")
33578
33478
  continue;
33579
- const sourcePath = path10.join(sourceCategoryDir, entry.name);
33580
- const agentsTarget = path10.join(agentsCategoryDir, entry.name);
33581
- const claudeTarget = path10.join(claudeDir, category, entry.name);
33582
- const agentsExists = await import_fs_extra7.default.pathExists(agentsTarget);
33479
+ const sourcePath = path9.join(sourceCategoryDir, entry.name);
33480
+ const agentsTarget = path9.join(agentsCategoryDir, entry.name);
33481
+ const claudeTarget = path9.join(claudeDir, category, entry.name);
33482
+ const agentsExists = await import_fs_extra6.default.pathExists(agentsTarget);
33583
33483
  if (!agentsExists) {
33584
33484
  let migrated = false;
33585
33485
  if (options.migrateClaudeDirs) {
33586
- const claudeStat = await import_fs_extra7.default.lstat(claudeTarget).catch(() => null);
33486
+ const claudeStat = await import_fs_extra6.default.lstat(claudeTarget).catch(() => null);
33587
33487
  if (claudeStat && !claudeStat.isSymbolicLink()) {
33588
- await import_fs_extra7.default.move(claudeTarget, agentsTarget);
33488
+ await import_fs_extra6.default.move(claudeTarget, agentsTarget);
33589
33489
  result.migrated.push(entry.name);
33590
33490
  migrated = true;
33591
33491
  }
33592
33492
  }
33593
33493
  if (!migrated) {
33594
- await import_fs_extra7.default.copy(sourcePath, agentsTarget, { overwrite: false });
33494
+ await import_fs_extra6.default.copy(sourcePath, agentsTarget, { overwrite: false });
33595
33495
  await applyPathPlaceholders(agentsTarget, claudeDir);
33596
33496
  result.copied.push(entry.name);
33597
33497
  }
33598
33498
  } else if (options.overwrite) {
33599
- await import_fs_extra7.default.remove(agentsTarget);
33600
- await import_fs_extra7.default.copy(sourcePath, agentsTarget, { overwrite: false });
33499
+ await import_fs_extra6.default.remove(agentsTarget);
33500
+ await import_fs_extra6.default.copy(sourcePath, agentsTarget, { overwrite: false });
33601
33501
  await applyPathPlaceholders(agentsTarget, claudeDir);
33602
33502
  result.copied.push(entry.name);
33603
33503
  }
@@ -33606,24 +33506,24 @@ async function installCategoryToAgents(sourceCategoryDir, category, agentsDir, c
33606
33506
  return result;
33607
33507
  }
33608
33508
  async function syncCategorySymlinks(category, agentsDir, claudeDir, result, silent = false) {
33609
- const agentsCategoryDir = path10.join(agentsDir, category);
33610
- const claudeCategoryDir = path10.join(claudeDir, category);
33611
- if (!await import_fs_extra7.default.pathExists(agentsCategoryDir)) {
33509
+ const agentsCategoryDir = path9.join(agentsDir, category);
33510
+ const claudeCategoryDir = path9.join(claudeDir, category);
33511
+ if (!await import_fs_extra6.default.pathExists(agentsCategoryDir)) {
33612
33512
  return;
33613
33513
  }
33614
- await import_fs_extra7.default.ensureDir(claudeCategoryDir);
33615
- const entries = await import_fs_extra7.default.readdir(agentsCategoryDir, { withFileTypes: true });
33514
+ await import_fs_extra6.default.ensureDir(claudeCategoryDir);
33515
+ const entries = await import_fs_extra6.default.readdir(agentsCategoryDir, { withFileTypes: true });
33616
33516
  for (const entry of entries) {
33617
33517
  if (entry.name === ".DS_Store")
33618
33518
  continue;
33619
- const agentsTarget = path10.join(agentsCategoryDir, entry.name);
33620
- const claudeTarget = path10.join(claudeCategoryDir, entry.name);
33621
- const claudeStat = await import_fs_extra7.default.lstat(claudeTarget).catch(() => null);
33519
+ const agentsTarget = path9.join(agentsCategoryDir, entry.name);
33520
+ const claudeTarget = path9.join(claudeCategoryDir, entry.name);
33521
+ const claudeStat = await import_fs_extra6.default.lstat(claudeTarget).catch(() => null);
33622
33522
  if (!claudeStat) {
33623
33523
  await platformSymlink(agentsTarget, claudeTarget);
33624
33524
  result?.symlinked.push(entry.name);
33625
33525
  } else if (claudeStat.isSymbolicLink()) {
33626
- await import_fs_extra7.default.remove(claudeTarget);
33526
+ await import_fs_extra6.default.remove(claudeTarget);
33627
33527
  await platformSymlink(agentsTarget, claudeTarget);
33628
33528
  result?.symlinked.push(entry.name);
33629
33529
  } else {
@@ -33634,15 +33534,15 @@ async function syncCategorySymlinks(category, agentsDir, claudeDir, result, sile
33634
33534
  }
33635
33535
  }
33636
33536
  }
33637
- if (await import_fs_extra7.default.pathExists(claudeCategoryDir)) {
33638
- const claudeEntries = await import_fs_extra7.default.readdir(claudeCategoryDir, { withFileTypes: true });
33537
+ if (await import_fs_extra6.default.pathExists(claudeCategoryDir)) {
33538
+ const claudeEntries = await import_fs_extra6.default.readdir(claudeCategoryDir, { withFileTypes: true });
33639
33539
  for (const entry of claudeEntries) {
33640
- const claudeTarget = path10.join(claudeCategoryDir, entry.name);
33641
- const stat = await import_fs_extra7.default.lstat(claudeTarget).catch(() => null);
33540
+ const claudeTarget = path9.join(claudeCategoryDir, entry.name);
33541
+ const stat = await import_fs_extra6.default.lstat(claudeTarget).catch(() => null);
33642
33542
  if (stat?.isSymbolicLink()) {
33643
- const exists = await import_fs_extra7.default.pathExists(claudeTarget);
33543
+ const exists = await import_fs_extra6.default.pathExists(claudeTarget);
33644
33544
  if (!exists) {
33645
- await import_fs_extra7.default.remove(claudeTarget);
33545
+ await import_fs_extra6.default.remove(claudeTarget);
33646
33546
  }
33647
33547
  }
33648
33548
  }
@@ -33653,13 +33553,13 @@ function isAgentCategory(category) {
33653
33553
  }
33654
33554
 
33655
33555
  // src/lib/folder-paths.ts
33656
- import os11 from "os";
33657
- import path11 from "path";
33556
+ import os10 from "os";
33557
+ import path10 from "path";
33658
33558
  function resolveFolders(options = {}) {
33659
- const rootDir = options.folder ? path11.resolve(options.folder) : os11.homedir();
33660
- const claudeDir = options.claudeCodeFolder ? path11.resolve(options.claudeCodeFolder) : path11.join(rootDir, ".claude");
33661
- const codexDir = options.codexFolder ? path11.resolve(options.codexFolder) : path11.join(rootDir, ".codex");
33662
- const agentsDir = options.agentsFolder ? path11.resolve(options.agentsFolder) : path11.join(rootDir, ".agents");
33559
+ const rootDir = options.folder ? path10.resolve(options.folder) : os10.homedir();
33560
+ const claudeDir = options.claudeCodeFolder ? path10.resolve(options.claudeCodeFolder) : path10.join(rootDir, ".claude");
33561
+ const codexDir = options.codexFolder ? path10.resolve(options.codexFolder) : path10.join(rootDir, ".codex");
33562
+ const agentsDir = options.agentsFolder ? path10.resolve(options.agentsFolder) : path10.join(rootDir, ".agents");
33663
33563
  return { rootDir, claudeDir, codexDir, agentsDir };
33664
33564
  }
33665
33565
 
@@ -33668,11 +33568,11 @@ var __filename2 = fileURLToPath2(import.meta.url);
33668
33568
  var __dirname2 = dirname2(__filename2);
33669
33569
  async function resolveClaudeAssetPath(sourceDir, name) {
33670
33570
  const candidates = [
33671
- path12.join(sourceDir, "claude-config", name),
33672
- path12.join(sourceDir, name)
33571
+ path11.join(sourceDir, "claude-config", name),
33572
+ path11.join(sourceDir, name)
33673
33573
  ];
33674
33574
  for (const candidate of candidates) {
33675
- if (await import_fs_extra8.default.pathExists(candidate))
33575
+ if (await import_fs_extra7.default.pathExists(candidate))
33676
33576
  return candidate;
33677
33577
  }
33678
33578
  return null;
@@ -33682,7 +33582,6 @@ async function setupCommand(params = {}) {
33682
33582
  folder,
33683
33583
  claudeCodeFolder,
33684
33584
  codexFolder,
33685
- openCodeFolder,
33686
33585
  agentsFolder,
33687
33586
  skipInteractive
33688
33587
  } = params;
@@ -33697,11 +33596,9 @@ async function setupCommand(params = {}) {
33697
33596
  features = [
33698
33597
  "shellShortcuts",
33699
33598
  "customStatusline",
33700
- "aiblueprintCommands",
33701
33599
  "aiblueprintAgents",
33702
33600
  "aiblueprintSkills",
33703
- "codexSymlink",
33704
- "openCodeSymlink"
33601
+ "installCodex"
33705
33602
  ];
33706
33603
  console.log(source_default.green("✓ Installing all features (--skip mode)"));
33707
33604
  } else {
@@ -33721,11 +33618,6 @@ async function setupCommand(params = {}) {
33721
33618
  name: "Custom statusline - Shows git, costs, tokens info",
33722
33619
  checked: true
33723
33620
  },
33724
- {
33725
- value: "aiblueprintCommands",
33726
- name: "AIBlueprint commands - Pre-configured command templates",
33727
- checked: true
33728
- },
33729
33621
  {
33730
33622
  value: "aiblueprintAgents",
33731
33623
  name: "AIBlueprint agents - Specialized AI agents",
@@ -33737,14 +33629,9 @@ async function setupCommand(params = {}) {
33737
33629
  checked: true
33738
33630
  },
33739
33631
  {
33740
- value: "codexSymlink",
33741
- name: "Codex symlink - Link commands/skills/agents to ~/.codex",
33742
- checked: false
33743
- },
33744
- {
33745
- value: "openCodeSymlink",
33746
- name: "OpenCode symlink - Link commands to ~/.config/opencode/command",
33747
- checked: false
33632
+ value: "installCodex",
33633
+ name: "Codex setup - Starter config + share skills/agents with ~/.codex",
33634
+ checked: true
33748
33635
  }
33749
33636
  ]
33750
33637
  }
@@ -33758,11 +33645,9 @@ async function setupCommand(params = {}) {
33758
33645
  const options = {
33759
33646
  shellShortcuts: features.includes("shellShortcuts"),
33760
33647
  customStatusline: features.includes("customStatusline"),
33761
- aiblueprintCommands: features.includes("aiblueprintCommands"),
33762
33648
  aiblueprintAgents: features.includes("aiblueprintAgents"),
33763
33649
  aiblueprintSkills: features.includes("aiblueprintSkills"),
33764
- codexSymlink: features.includes("codexSymlink"),
33765
- openCodeSymlink: features.includes("openCodeSymlink"),
33650
+ installCodex: features.includes("installCodex"),
33766
33651
  skipInteractive
33767
33652
  };
33768
33653
  const s = new SimpleSpinner;
@@ -33775,8 +33660,8 @@ async function setupCommand(params = {}) {
33775
33660
  console.log(source_default.gray(`Claude: ${claudeDir}`));
33776
33661
  console.log(source_default.gray(`Codex: ${codexDir}`));
33777
33662
  console.log(source_default.gray(`Agents: ${agentsDir}`));
33778
- await import_fs_extra8.default.ensureDir(claudeDir);
33779
- await import_fs_extra8.default.ensureDir(agentsDir);
33663
+ await import_fs_extra7.default.ensureDir(claudeDir);
33664
+ await import_fs_extra7.default.ensureDir(agentsDir);
33780
33665
  s.start("Creating backup of existing configuration");
33781
33666
  const backupPath = await createBackup(claudeDir, agentsDir);
33782
33667
  if (backupPath) {
@@ -33804,33 +33689,20 @@ async function setupCommand(params = {}) {
33804
33689
  s.start("Setting up scripts");
33805
33690
  const scriptsSource = await resolveClaudeAssetPath(sourceDir, "scripts");
33806
33691
  if (scriptsSource) {
33807
- await import_fs_extra8.default.copy(scriptsSource, path12.join(claudeDir, "scripts"), {
33692
+ await import_fs_extra7.default.copy(scriptsSource, path11.join(claudeDir, "scripts"), {
33808
33693
  overwrite: true
33809
33694
  });
33810
- await replacePathPlaceholdersInDir(path12.join(claudeDir, "scripts"), claudeDir);
33811
- await import_fs_extra8.default.ensureDir(path12.join(claudeDir, "scripts/statusline/data"));
33695
+ await replacePathPlaceholdersInDir(path11.join(claudeDir, "scripts"), claudeDir);
33696
+ await import_fs_extra7.default.ensureDir(path11.join(claudeDir, "scripts/statusline/data"));
33812
33697
  s.stop("Scripts installed");
33813
33698
  } else {
33814
33699
  s.stop("Scripts not available in repository");
33815
33700
  }
33816
33701
  }
33817
- if (options.aiblueprintCommands) {
33818
- s.start("Setting up AIBlueprint commands");
33819
- const commandsSource = await resolveClaudeAssetPath(sourceDir, "commands");
33820
- if (commandsSource) {
33821
- await import_fs_extra8.default.copy(commandsSource, path12.join(claudeDir, "commands"), {
33822
- overwrite: true
33823
- });
33824
- await replacePathPlaceholdersInDir(path12.join(claudeDir, "commands"), claudeDir);
33825
- s.stop("Commands installed");
33826
- } else {
33827
- s.stop("Commands not available in repository");
33828
- }
33829
- }
33830
33702
  if (options.aiblueprintAgents) {
33831
33703
  s.start("Setting up AIBlueprint agents");
33832
- const agentsSource = path12.join(sourceDir, "agents");
33833
- if (await import_fs_extra8.default.pathExists(agentsSource)) {
33704
+ const agentsSource = path11.join(sourceDir, "agents");
33705
+ if (await import_fs_extra7.default.pathExists(agentsSource)) {
33834
33706
  const installResult = await installCategoryToAgents(agentsSource, "agents", agentsDir, claudeDir, { migrateClaudeDirs: true, silent: true });
33835
33707
  const summary = [
33836
33708
  installResult.copied.length && `${installResult.copied.length} copied`,
@@ -33845,8 +33717,8 @@ async function setupCommand(params = {}) {
33845
33717
  }
33846
33718
  if (options.aiblueprintSkills) {
33847
33719
  s.start("Setting up AIBlueprint Skills");
33848
- const skillsSourcePath = path12.join(sourceDir, "skills");
33849
- if (await import_fs_extra8.default.pathExists(skillsSourcePath)) {
33720
+ const skillsSourcePath = path11.join(sourceDir, "skills");
33721
+ if (await import_fs_extra7.default.pathExists(skillsSourcePath)) {
33850
33722
  const installResult = await installCategoryToAgents(skillsSourcePath, "skills", agentsDir, claudeDir, { migrateClaudeDirs: true, silent: true });
33851
33723
  const summary = [
33852
33724
  installResult.copied.length && `${installResult.copied.length} copied`,
@@ -33864,14 +33736,12 @@ async function setupCommand(params = {}) {
33864
33736
  s.stop("Skills not available in repository");
33865
33737
  }
33866
33738
  }
33867
- if (options.codexSymlink) {
33868
- s.start("Setting up Codex configuration");
33869
- const codexConfigSource = path12.join(sourceDir, "codex-config");
33870
- if (await import_fs_extra8.default.pathExists(codexConfigSource)) {
33871
- await import_fs_extra8.default.copy(codexConfigSource, codexDir, { overwrite: false });
33872
- }
33873
- if (options.aiblueprintCommands) {
33874
- await setupCodexSymlink(claudeDir, codexDir, claudeCodeFolder);
33739
+ if (options.installCodex) {
33740
+ s.start("Setting up Codex");
33741
+ await import_fs_extra7.default.ensureDir(codexDir);
33742
+ const codexConfigSource = path11.join(sourceDir, "codex-config");
33743
+ if (await import_fs_extra7.default.pathExists(codexConfigSource)) {
33744
+ await import_fs_extra7.default.copy(codexConfigSource, codexDir, { overwrite: false });
33875
33745
  }
33876
33746
  if (options.aiblueprintSkills) {
33877
33747
  await syncCategorySymlinks("skills", agentsDir, codexDir, undefined, true);
@@ -33881,11 +33751,6 @@ async function setupCommand(params = {}) {
33881
33751
  }
33882
33752
  s.stop("Codex configured");
33883
33753
  }
33884
- if (options.openCodeSymlink && options.aiblueprintCommands) {
33885
- s.start("Setting up OpenCode symlink");
33886
- await setupOpenCodeSymlink(claudeDir, openCodeFolder, claudeCodeFolder);
33887
- s.stop("OpenCode symlink configured");
33888
- }
33889
33754
  if (options.customStatusline) {
33890
33755
  s.start("Checking dependencies");
33891
33756
  await checkAndInstallDependencies();
@@ -33922,7 +33787,7 @@ async function setupCommand(params = {}) {
33922
33787
  console.log(source_default.gray(`
33923
33788
  Next steps:`));
33924
33789
  if (options.shellShortcuts) {
33925
- const platform = os12.platform();
33790
+ const platform = os11.platform();
33926
33791
  if (platform === "win32") {
33927
33792
  console.log(source_default.gray(" • Restart PowerShell to load the new functions"));
33928
33793
  } else {
@@ -33948,9 +33813,9 @@ Next steps:`));
33948
33813
  }
33949
33814
 
33950
33815
  // src/commands/setup-terminal.ts
33951
- var import_fs_extra9 = __toESM(require_lib4(), 1);
33952
- import path13 from "path";
33953
- import os13 from "os";
33816
+ var import_fs_extra8 = __toESM(require_lib4(), 1);
33817
+ import path12 from "path";
33818
+ import os12 from "os";
33954
33819
  import { execSync as execSync3, exec as exec2 } from "child_process";
33955
33820
  var OHMYZSH_INSTALL_URL = "https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh";
33956
33821
  var INSTALL_TIMEOUT = 120000;
@@ -33984,16 +33849,16 @@ function commandExists(cmd) {
33984
33849
  }
33985
33850
  }
33986
33851
  function isOhMyZshInstalled(homeDir) {
33987
- const ohMyZshDir = path13.join(homeDir, ".oh-my-zsh");
33988
- return import_fs_extra9.default.existsSync(ohMyZshDir);
33852
+ const ohMyZshDir = path12.join(homeDir, ".oh-my-zsh");
33853
+ return import_fs_extra8.default.existsSync(ohMyZshDir);
33989
33854
  }
33990
33855
  function backupFile(filePath) {
33991
- if (!import_fs_extra9.default.existsSync(filePath))
33856
+ if (!import_fs_extra8.default.existsSync(filePath))
33992
33857
  return null;
33993
33858
  const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
33994
33859
  const backupPath = `${filePath}.backup-${timestamp}`;
33995
33860
  try {
33996
- import_fs_extra9.default.copyFileSync(filePath, backupPath);
33861
+ import_fs_extra8.default.copyFileSync(filePath, backupPath);
33997
33862
  return backupPath;
33998
33863
  } catch (error) {
33999
33864
  throw new Error(`Failed to create backup: ${error.message}`);
@@ -34032,7 +33897,7 @@ function installPrerequisiteSync(packageName, installCmd) {
34032
33897
  async function installOhMyZsh(homeDir) {
34033
33898
  return new Promise((resolve, reject) => {
34034
33899
  const installCmd = `sh -c "$(curl -fsSL ${OHMYZSH_INSTALL_URL})" "" --unattended`;
34035
- const env2 = { ...process.env, HOME: homeDir, ZSH: path13.join(homeDir, ".oh-my-zsh") };
33900
+ const env2 = { ...process.env, HOME: homeDir, ZSH: path12.join(homeDir, ".oh-my-zsh") };
34036
33901
  exec2(installCmd, { timeout: INSTALL_TIMEOUT, env: env2 }, (error, stdout, stderr) => {
34037
33902
  if (error) {
34038
33903
  if ("killed" in error && error.killed) {
@@ -34053,8 +33918,8 @@ async function installPlugin(pluginName, repoUrl, homeDir) {
34053
33918
  if (!/^https:\/\/github\.com\/[\w-]+\/[\w-]+$/.test(repoUrl)) {
34054
33919
  throw new Error(`Invalid repository URL: ${repoUrl}`);
34055
33920
  }
34056
- const customPluginsDir = path13.join(homeDir, ".oh-my-zsh/custom/plugins", pluginName);
34057
- if (import_fs_extra9.default.existsSync(customPluginsDir)) {
33921
+ const customPluginsDir = path12.join(homeDir, ".oh-my-zsh/custom/plugins", pluginName);
33922
+ if (import_fs_extra8.default.existsSync(customPluginsDir)) {
34058
33923
  return;
34059
33924
  }
34060
33925
  return new Promise((resolve, reject) => {
@@ -34072,20 +33937,20 @@ async function installPlugin(pluginName, repoUrl, homeDir) {
34072
33937
  });
34073
33938
  }
34074
33939
  function updateZshrcTheme(theme, homeDir) {
34075
- const zshrcPath = path13.join(homeDir, ".zshrc");
33940
+ const zshrcPath = path12.join(homeDir, ".zshrc");
34076
33941
  const sanitizedTheme = sanitizeThemeName(theme);
34077
- if (!import_fs_extra9.default.existsSync(zshrcPath)) {
33942
+ if (!import_fs_extra8.default.existsSync(zshrcPath)) {
34078
33943
  throw new Error(".zshrc file not found. Please ensure Oh My ZSH is installed correctly.");
34079
33944
  }
34080
33945
  try {
34081
- let content = import_fs_extra9.default.readFileSync(zshrcPath, "utf-8");
33946
+ let content = import_fs_extra8.default.readFileSync(zshrcPath, "utf-8");
34082
33947
  if (content.match(/^ZSH_THEME=/m)) {
34083
33948
  content = content.replace(/^ZSH_THEME=.*/m, `ZSH_THEME="${sanitizedTheme}"`);
34084
33949
  } else {
34085
33950
  content = `ZSH_THEME="${sanitizedTheme}"
34086
33951
  ${content}`;
34087
33952
  }
34088
- import_fs_extra9.default.writeFileSync(zshrcPath, content);
33953
+ import_fs_extra8.default.writeFileSync(zshrcPath, content);
34089
33954
  } catch (error) {
34090
33955
  if (error.message.includes(".zshrc file not found")) {
34091
33956
  throw error;
@@ -34094,12 +33959,12 @@ ${content}`;
34094
33959
  }
34095
33960
  }
34096
33961
  function updateZshrcPlugins(plugins, homeDir) {
34097
- const zshrcPath = path13.join(homeDir, ".zshrc");
34098
- if (!import_fs_extra9.default.existsSync(zshrcPath)) {
33962
+ const zshrcPath = path12.join(homeDir, ".zshrc");
33963
+ if (!import_fs_extra8.default.existsSync(zshrcPath)) {
34099
33964
  throw new Error(".zshrc file not found. Please ensure Oh My ZSH is installed correctly.");
34100
33965
  }
34101
33966
  try {
34102
- let content = import_fs_extra9.default.readFileSync(zshrcPath, "utf-8");
33967
+ let content = import_fs_extra8.default.readFileSync(zshrcPath, "utf-8");
34103
33968
  const pluginsString = plugins.join(" ");
34104
33969
  if (content.match(/^plugins=\(/m)) {
34105
33970
  content = content.replace(/^plugins=\([^)]*\)/m, `plugins=(${pluginsString})`);
@@ -34107,7 +33972,7 @@ function updateZshrcPlugins(plugins, homeDir) {
34107
33972
  content = `${content}
34108
33973
  plugins=(${pluginsString})`;
34109
33974
  }
34110
- import_fs_extra9.default.writeFileSync(zshrcPath, content);
33975
+ import_fs_extra8.default.writeFileSync(zshrcPath, content);
34111
33976
  } catch (error) {
34112
33977
  if (error.message.includes(".zshrc file not found")) {
34113
33978
  throw error;
@@ -34117,7 +33982,7 @@ plugins=(${pluginsString})`;
34117
33982
  }
34118
33983
  async function setupTerminalCommand(options = {}) {
34119
33984
  const { skipInteractive, homeDir: customHomeDir } = options;
34120
- const homeDir = customHomeDir || os13.homedir();
33985
+ const homeDir = customHomeDir || os12.homedir();
34121
33986
  try {
34122
33987
  console.log(source_default.blue.bold(`
34123
33988
  \uD83D\uDDA5️ AIBlueprint Terminal Setup ${source_default.gray(`v${getVersion()}`)}
@@ -34214,8 +34079,8 @@ Installing missing prerequisites: ${missingPrereqs.join(", ")}`));
34214
34079
  selectedTheme = themeAnswer.theme;
34215
34080
  }
34216
34081
  }
34217
- const zshrcPath = path13.join(homeDir, ".zshrc");
34218
- if (import_fs_extra9.default.existsSync(zshrcPath)) {
34082
+ const zshrcPath = path12.join(homeDir, ".zshrc");
34083
+ if (import_fs_extra8.default.existsSync(zshrcPath)) {
34219
34084
  s.start("Backing up .zshrc");
34220
34085
  const backupPath = backupFile(zshrcPath);
34221
34086
  if (backupPath) {
@@ -34264,30 +34129,99 @@ Next steps:`));
34264
34129
  }
34265
34130
  }
34266
34131
 
34132
+ // src/commands/setup/symlinks.ts
34133
+ var import_fs_extra9 = __toESM(require_lib4(), 1);
34134
+ import path13 from "path";
34135
+ import os13 from "os";
34136
+ async function getToolPaths(tool, customFolder) {
34137
+ let baseDir;
34138
+ switch (tool) {
34139
+ case "claude-code":
34140
+ baseDir = customFolder ? path13.resolve(customFolder) : path13.join(os13.homedir(), ".claude");
34141
+ return {
34142
+ baseDir,
34143
+ commandsPath: path13.join(baseDir, "commands"),
34144
+ agentsPath: path13.join(baseDir, "agents")
34145
+ };
34146
+ case "codex":
34147
+ baseDir = customFolder ? path13.resolve(customFolder) : path13.join(os13.homedir(), ".codex");
34148
+ return {
34149
+ baseDir,
34150
+ agentsPath: path13.join(baseDir, "agents")
34151
+ };
34152
+ case "opencode":
34153
+ baseDir = customFolder ? path13.resolve(customFolder) : path13.join(os13.homedir(), ".config", "opencode");
34154
+ return {
34155
+ baseDir,
34156
+ commandsPath: path13.join(baseDir, "command")
34157
+ };
34158
+ case "factoryai":
34159
+ baseDir = customFolder ? path13.resolve(customFolder) : path13.join(os13.homedir(), ".factory");
34160
+ return {
34161
+ baseDir,
34162
+ commandsPath: path13.join(baseDir, "commands"),
34163
+ agentsPath: path13.join(baseDir, "droids")
34164
+ };
34165
+ default:
34166
+ throw new Error(`Unknown tool type: ${tool}`);
34167
+ }
34168
+ }
34169
+ async function createSymlink(sourcePath, targetPath, options = {}) {
34170
+ try {
34171
+ const sourceExists = await import_fs_extra9.default.pathExists(sourcePath);
34172
+ if (!sourceExists) {
34173
+ console.log(source_default.yellow(` Source path ${sourcePath} does not exist. Skipping symlink creation...`));
34174
+ return false;
34175
+ }
34176
+ const targetDir = path13.dirname(targetPath);
34177
+ await import_fs_extra9.default.ensureDir(targetDir);
34178
+ const targetExists = await import_fs_extra9.default.pathExists(targetPath);
34179
+ if (targetExists) {
34180
+ const stat = await import_fs_extra9.default.lstat(targetPath);
34181
+ if (stat.isSymbolicLink()) {
34182
+ await import_fs_extra9.default.remove(targetPath);
34183
+ } else {
34184
+ console.log(source_default.yellow(options.skipMessage || ` ${targetPath} already exists and is not a symlink. Skipping...`));
34185
+ return false;
34186
+ }
34187
+ }
34188
+ const isWindows2 = os13.platform() === "win32";
34189
+ if (isWindows2) {
34190
+ await import_fs_extra9.default.symlink(sourcePath, targetPath, "junction");
34191
+ } else {
34192
+ await import_fs_extra9.default.symlink(sourcePath, targetPath);
34193
+ }
34194
+ return true;
34195
+ } catch (error) {
34196
+ console.error(source_default.red(options.errorPrefix || "Error creating symlink:"), error);
34197
+ throw error;
34198
+ }
34199
+ }
34200
+
34267
34201
  // src/commands/symlink.ts
34268
34202
  var TOOLS = [
34269
34203
  {
34270
34204
  name: "Claude Code",
34271
34205
  value: "claude-code",
34272
- supportsCommands: true,
34206
+ supportsCommands: false,
34273
34207
  supportsAgents: true
34274
34208
  },
34275
34209
  {
34276
34210
  name: "Codex",
34277
34211
  value: "codex",
34278
- supportsCommands: true,
34279
- supportsAgents: false
34212
+ supportsCommands: false,
34213
+ supportsAgents: true
34280
34214
  },
34281
34215
  {
34282
34216
  name: "OpenCode",
34283
34217
  value: "opencode",
34284
- supportsCommands: true,
34218
+ supportsCommands: false,
34285
34219
  supportsAgents: false
34286
34220
  },
34287
34221
  {
34288
34222
  name: "FactoryAI",
34289
34223
  value: "factoryai",
34290
- supportsCommands: true,
34224
+ supportsCommands: false,
34291
34225
  supportsAgents: true
34292
34226
  }
34293
34227
  ];
@@ -34389,8 +34323,8 @@ async function symlinkCommand(params = {}) {
34389
34323
  const customFolders = {
34390
34324
  "claude-code": claudeDir,
34391
34325
  codex: codexDir,
34392
- opencode: params.openCodeFolder,
34393
- factoryai: params.factoryAiFolder
34326
+ opencode: undefined,
34327
+ factoryai: undefined
34394
34328
  };
34395
34329
  const sourcePaths = await getToolPaths(sourceTool, customFolders[sourceTool]);
34396
34330
  console.log(source_default.blue(`
@@ -35440,19 +35374,9 @@ var API_URL = "https://codeline.app/api/products";
35440
35374
  var PRODUCT_IDS = ["prd_XJVgxVPbGG", "prd_NKabAkdOkw"];
35441
35375
  async function countInstalledItems(claudeDir) {
35442
35376
  const counts = {
35443
- commands: 0,
35444
35377
  agents: 0,
35445
35378
  skills: 0
35446
35379
  };
35447
- try {
35448
- const commandsDir = path16.join(claudeDir, "commands");
35449
- if (await import_fs_extra12.default.pathExists(commandsDir)) {
35450
- const files = await import_fs_extra12.default.readdir(commandsDir);
35451
- counts.commands = files.filter((f) => f.endsWith(".md")).length;
35452
- }
35453
- } catch (error) {
35454
- console.error("Failed to count commands:", error instanceof Error ? error.message : error);
35455
- }
35456
35380
  try {
35457
35381
  const agentsDir = path16.join(claudeDir, "agents");
35458
35382
  if (await import_fs_extra12.default.pathExists(agentsDir)) {
@@ -35611,24 +35535,20 @@ async function proSetupCommand(options = {}) {
35611
35535
  await updateSettings({
35612
35536
  shellShortcuts: false,
35613
35537
  customStatusline: true,
35614
- aiblueprintCommands: false,
35615
35538
  aiblueprintAgents: false,
35616
35539
  aiblueprintSkills: false,
35617
- codexSymlink: false,
35618
- openCodeSymlink: false
35540
+ installCodex: false
35619
35541
  }, claudeDir);
35620
35542
  spinner.stop("Settings.json updated");
35621
35543
  spinner.start("Counting installed items...");
35622
35544
  const counts = await countInstalledItems(claudeDir);
35623
35545
  spinner.stop("Installation summary ready");
35624
35546
  trackEvent("pro-setup", {
35625
- commands: counts.commands,
35626
35547
  agents: counts.agents,
35627
35548
  skills: counts.skills
35628
35549
  });
35629
35550
  M2.success("✅ Setup complete!");
35630
35551
  M2.info("Installed:");
35631
- M2.info(` • Commands (${counts.commands})`);
35632
35552
  M2.info(` • Agents (${counts.agents})`);
35633
35553
  M2.info(` • Premium Skills (${counts.skills})`);
35634
35554
  M2.info(" • Premium statusline (advanced)");
@@ -35897,7 +35817,6 @@ async function analyzeCategory(category, claudeDir, agentsDir, githubToken) {
35897
35817
  async function analyzeSyncChanges(claudeDir, githubToken, agentsDir) {
35898
35818
  const allItems = [];
35899
35819
  const categories = [
35900
- "commands",
35901
35820
  "agents",
35902
35821
  "skills",
35903
35822
  "scripts"
@@ -36897,14 +36816,13 @@ var packageJson = JSON.parse(readFileSync3(join2(__dirname3, "../package.json"),
36897
36816
  var program2 = new Command;
36898
36817
  program2.name("aiblueprint").description("AIBlueprint CLI for setting up AI coding configurations").version(packageJson.version);
36899
36818
  function registerAgentsCommands(cmd) {
36900
- cmd.option("-f, --folder <path>", "Root folder that contains .claude/, .codex/, .agents/ (default: $HOME)").option("--claudeCodeFolder <path>", "Override Claude Code folder (default: {folder}/.claude)").option("--codexFolder <path>", "Override Codex folder (default: {folder}/.codex)").option("--openCodeFolder <path>", "Override OpenCode folder (default: ~/.config/opencode)").option("--factoryAiFolder <path>", "Override FactoryAI folder (default: ~/.factory)").option("--agentsFolder <path>", "Override shared agents folder (default: {folder}/.agents)").option("-s, --skip", "Skip interactive prompts and install all features");
36819
+ cmd.option("-f, --folder <path>", "Root folder that contains .claude/, .codex/, .agents/ (default: $HOME)").option("--claudeCodeFolder <path>", "Override Claude Code folder (default: {folder}/.claude)").option("--codexFolder <path>", "Override Codex folder (default: {folder}/.codex)").option("--agentsFolder <path>", "Override shared agents folder (default: {folder}/.agents)").option("-s, --skip", "Skip interactive prompts and install all features");
36901
36820
  cmd.command("setup").description("Setup AI coding configuration with AIBlueprint defaults").action((options, command) => {
36902
36821
  const parentOptions = command.parent.opts();
36903
36822
  setupCommand({
36904
36823
  folder: parentOptions.folder,
36905
36824
  claudeCodeFolder: parentOptions.claudeCodeFolder,
36906
36825
  codexFolder: parentOptions.codexFolder,
36907
- openCodeFolder: parentOptions.openCodeFolder,
36908
36826
  agentsFolder: parentOptions.agentsFolder,
36909
36827
  skipInteractive: parentOptions.skip
36910
36828
  });
@@ -36921,9 +36839,7 @@ function registerAgentsCommands(cmd) {
36921
36839
  symlinkCommand({
36922
36840
  folder: parentOptions.folder,
36923
36841
  claudeCodeFolder: parentOptions.claudeCodeFolder,
36924
- codexFolder: parentOptions.codexFolder,
36925
- openCodeFolder: parentOptions.openCodeFolder,
36926
- factoryAiFolder: parentOptions.factoryAiFolder
36842
+ codexFolder: parentOptions.codexFolder
36927
36843
  });
36928
36844
  });
36929
36845
  const proCmd = cmd.command("pro").description("Manage AIBlueprint CLI Premium features");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiblueprint-cli",
3
- "version": "1.4.53",
3
+ "version": "1.4.55",
4
4
  "description": "AIBlueprint CLI for setting up AI coding configurations",
5
5
  "author": "AIBlueprint",
6
6
  "license": "MIT",