aiblueprint-cli 1.3.1 → 1.3.3

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 (3) hide show
  1. package/README.md +18 -1
  2. package/dist/cli.js +299 -280
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -547,10 +547,27 @@ aiblueprint claude-code pro setup
547
547
  # Check premium status
548
548
  aiblueprint claude-code pro status
549
549
 
550
- # Update premium configs
550
+ # Update premium configs (overwrites all)
551
551
  aiblueprint claude-code pro update
552
+
553
+ # Sync premium configs (selective update)
554
+ aiblueprint claude-code pro sync
552
555
  ```
553
556
 
557
+ ### Sync Command
558
+
559
+ The `sync` command provides intelligent selective updates:
560
+
561
+ ```bash
562
+ aiblueprint claude-code pro sync
563
+ ```
564
+
565
+ **Features:**
566
+ - 🔍 **Diff Analysis** - Compares your local config with the latest premium version
567
+ - 📝 **Categorized Changes** - Shows NEW and MODIFIED items separately
568
+ - ✅ **Selective Update** - Choose exactly which files/folders to update
569
+ - 📁 **Smart Grouping** - Commands and agents shown individually, skills and scripts grouped as folders
570
+
554
571
  **Learn more:** https://mlv.sh/claude-cli
555
572
 
556
573
  ---
package/dist/cli.js CHANGED
@@ -32983,8 +32983,8 @@ var chalkStderr = createChalk({ level: stderrColor ? stderrColor.level : 0 });
32983
32983
  var source_default = chalk;
32984
32984
 
32985
32985
  // src/commands/setup.ts
32986
- import { fileURLToPath } from "url";
32987
- import { dirname } from "path";
32986
+ import { fileURLToPath as fileURLToPath2 } from "url";
32987
+ import { dirname as dirname2 } from "path";
32988
32988
 
32989
32989
  // src/commands/setup/shell-shortcuts.ts
32990
32990
  var import_fs_extra = __toESM(require_lib4(), 1);
@@ -33191,20 +33191,23 @@ async function checkAndInstallDependencies() {
33191
33191
  }
33192
33192
  }
33193
33193
  }
33194
- async function installStatuslineDependencies(claudeDir) {
33195
- const statuslineDir = path4.join(claudeDir, "scripts/statusline");
33194
+ async function installScriptsDependencies(claudeDir) {
33195
+ const scriptsDir = path4.join(claudeDir, "scripts");
33196
33196
  console.log(source_default.yellow(`
33197
- Installing statusline dependencies...`));
33197
+ Installing scripts dependencies...`));
33198
33198
  try {
33199
33199
  execSync("bun install", {
33200
- cwd: statuslineDir,
33200
+ cwd: scriptsDir,
33201
33201
  stdio: "inherit"
33202
33202
  });
33203
- console.log(source_default.green(" ✓ Statusline dependencies installed"));
33203
+ console.log(source_default.green(" ✓ Scripts dependencies installed"));
33204
33204
  } catch (error) {
33205
- console.log(source_default.red(" Failed to install statusline dependencies. Please run 'bun install' manually in ~/.claude/scripts/statusline"));
33205
+ console.log(source_default.red(" Failed to install scripts dependencies. Please run 'bun install' manually in ~/.claude/scripts"));
33206
33206
  }
33207
33207
  }
33208
+ async function installStatuslineDependencies(claudeDir) {
33209
+ await installScriptsDependencies(claudeDir);
33210
+ }
33208
33211
 
33209
33212
  // src/commands/setup/settings.ts
33210
33213
  var import_fs_extra3 = __toESM(require_lib4(), 1);
@@ -33394,9 +33397,27 @@ async function downloadDirectoryFromGitHub(dirPath, targetDir) {
33394
33397
  }
33395
33398
  }
33396
33399
 
33400
+ // src/lib/version.ts
33401
+ import { readFileSync as readFileSync2 } from "fs";
33402
+ import { dirname, join } from "path";
33403
+ import { fileURLToPath } from "url";
33404
+ var __dirname2 = dirname(fileURLToPath(import.meta.url));
33405
+ var cachedVersion = null;
33406
+ function getVersion() {
33407
+ if (cachedVersion)
33408
+ return cachedVersion;
33409
+ try {
33410
+ const packageJson = JSON.parse(readFileSync2(join(__dirname2, "../../package.json"), "utf8"));
33411
+ cachedVersion = packageJson.version;
33412
+ return cachedVersion;
33413
+ } catch {
33414
+ return "unknown";
33415
+ }
33416
+ }
33417
+
33397
33418
  // src/commands/setup.ts
33398
- var __filename2 = fileURLToPath(import.meta.url);
33399
- var __dirname2 = dirname(__filename2);
33419
+ var __filename2 = fileURLToPath2(import.meta.url);
33420
+ var __dirname3 = dirname2(__filename2);
33400
33421
  var GITHUB_RAW_BASE2 = "https://raw.githubusercontent.com/Melvynx/aiblueprint-cli/main/claude-code-config";
33401
33422
  async function setupCommand(params = {}) {
33402
33423
  const {
@@ -33407,7 +33428,7 @@ async function setupCommand(params = {}) {
33407
33428
  } = params;
33408
33429
  try {
33409
33430
  console.log(source_default.blue.bold(`
33410
- \uD83D\uDE80 AIBlueprint Claude Code Setup
33431
+ \uD83D\uDE80 AIBlueprint Claude Code Setup ${source_default.gray(`v${getVersion()}`)}
33411
33432
  `));
33412
33433
  console.log(source_default.bgBlue(" Setting up your Claude Code environment "));
33413
33434
  let features;
@@ -33513,8 +33534,8 @@ async function setupCommand(params = {}) {
33513
33534
  const currentDir = process.cwd();
33514
33535
  const possiblePaths = [
33515
33536
  path7.join(currentDir, "claude-code-config"),
33516
- path7.join(__dirname2, "../../claude-code-config"),
33517
- path7.join(__dirname2, "../claude-code-config"),
33537
+ path7.join(__dirname3, "../../claude-code-config"),
33538
+ path7.join(__dirname3, "../claude-code-config"),
33518
33539
  path7.join(path7.dirname(process.argv[1]), "../claude-code-config")
33519
33540
  ];
33520
33541
  sourceDir = possiblePaths.find((p) => {
@@ -33675,16 +33696,16 @@ Next steps:`));
33675
33696
  // src/commands/addHook.ts
33676
33697
  var import_fs_extra9 = __toESM(require_lib4(), 1);
33677
33698
  import path11 from "path";
33678
- import { fileURLToPath as fileURLToPath3 } from "url";
33679
- import { dirname as dirname3 } from "path";
33699
+ import { fileURLToPath as fileURLToPath4 } from "url";
33700
+ import { dirname as dirname4 } from "path";
33680
33701
 
33681
33702
  // src/utils/claude-config.ts
33682
33703
  var import_fs_extra6 = __toESM(require_lib4(), 1);
33683
33704
  import path8 from "path";
33684
- import { fileURLToPath as fileURLToPath2 } from "url";
33685
- import { dirname as dirname2 } from "path";
33686
- var __filename3 = fileURLToPath2(import.meta.url);
33687
- var __dirname3 = dirname2(__filename3);
33705
+ import { fileURLToPath as fileURLToPath3 } from "url";
33706
+ import { dirname as dirname3 } from "path";
33707
+ var __filename3 = fileURLToPath3(import.meta.url);
33708
+ var __dirname4 = dirname3(__filename3);
33688
33709
  function parseYamlFrontmatter(content) {
33689
33710
  const lines = content.split(`
33690
33711
  `);
@@ -33711,8 +33732,8 @@ function parseYamlFrontmatter(content) {
33711
33732
  }
33712
33733
  function getLocalConfigPaths(subDir) {
33713
33734
  return [
33714
- path8.join(__dirname3, `../claude-code-config/${subDir}`),
33715
- path8.join(__dirname3, `../../claude-code-config/${subDir}`)
33735
+ path8.join(__dirname4, `../claude-code-config/${subDir}`),
33736
+ path8.join(__dirname4, `../../claude-code-config/${subDir}`)
33716
33737
  ];
33717
33738
  }
33718
33739
  async function findLocalConfigDir(subDir) {
@@ -33843,8 +33864,8 @@ async function getFileContentWithGitHubFallback(sourceDir, fileName) {
33843
33864
  }
33844
33865
 
33845
33866
  // src/commands/addHook.ts
33846
- var __filename4 = fileURLToPath3(import.meta.url);
33847
- var __dirname4 = dirname3(__filename4);
33867
+ var __filename4 = fileURLToPath4(import.meta.url);
33868
+ var __dirname5 = dirname4(__filename4);
33848
33869
 
33849
33870
  class SimpleSpinner2 {
33850
33871
  message = "";
@@ -33868,7 +33889,7 @@ var supportedHooks = {
33868
33889
  }
33869
33890
  };
33870
33891
  async function addHookCommand(hookType, options) {
33871
- console.log(source_default.bgBlue(" aiblueprint-cli "));
33892
+ console.log(source_default.bgBlue(` aiblueprint-cli v${getVersion()} `));
33872
33893
  if (!supportedHooks[hookType]) {
33873
33894
  console.log(source_default.red(`❌ Unsupported hook type: ${hookType}`));
33874
33895
  console.log(source_default.gray("Available hooks:"));
@@ -34042,7 +34063,7 @@ function displayAvailableCommands(commands) {
34042
34063
  console.log(source_default.gray(" aiblueprint claude-code add commands # Show this list"));
34043
34064
  }
34044
34065
  async function addCommandCommand(commandName, options = {}) {
34045
- console.log(source_default.bgBlue(" aiblueprint-cli "));
34066
+ console.log(source_default.bgBlue(` aiblueprint-cli v${getVersion()} `));
34046
34067
  const availableCommands = await discoverAvailableCommands();
34047
34068
  if (!commandName) {
34048
34069
  displayAvailableCommands(availableCommands);
@@ -34134,7 +34155,7 @@ var TOOLS = [
34134
34155
  async function symlinkCommand(params = {}) {
34135
34156
  try {
34136
34157
  console.log(source_default.blue.bold(`
34137
- \uD83D\uDD17 Symlink Manager
34158
+ \uD83D\uDD17 Symlink Manager ${source_default.gray(`v${getVersion()}`)}
34138
34159
  `));
34139
34160
  console.log(source_default.gray("Create symlinks between different CLI tool configurations"));
34140
34161
  const sourceAnswer = await lib_default.prompt([
@@ -34276,7 +34297,7 @@ import path13 from "path";
34276
34297
  import { homedir } from "os";
34277
34298
  async function statuslineCommand(options) {
34278
34299
  const claudeDir = options.folder ? path13.resolve(options.folder) : path13.join(homedir(), ".claude");
34279
- console.log(source_default.blue("\uD83D\uDE80 Setting up AIBlueprint Statusline..."));
34300
+ console.log(source_default.blue(`\uD83D\uDE80 Setting up AIBlueprint Statusline ${source_default.gray(`v${getVersion()}`)}...`));
34280
34301
  console.log(source_default.gray(` Target: ${claudeDir}
34281
34302
  `));
34282
34303
  await import_fs_extra11.default.ensureDir(claudeDir);
@@ -34917,6 +34938,10 @@ var de = () => {
34917
34938
  return process.on("uncaughtExceptionMonitor", () => $2(2)), process.on("unhandledRejection", () => $2(2)), process.on("SIGINT", () => $2(1)), process.on("SIGTERM", () => $2(1)), process.on("exit", $2), { start: l2, stop: u, message: m2 };
34918
34939
  };
34919
34940
 
34941
+ // src/commands/pro.ts
34942
+ import os10 from "os";
34943
+ import path16 from "path";
34944
+
34920
34945
  // src/lib/pro-installer.ts
34921
34946
  var import_fs_extra12 = __toESM(require_lib4(), 1);
34922
34947
  import os8 from "os";
@@ -34945,7 +34970,7 @@ async function downloadFromPrivateGitHub(repo, branch, relativePath, targetPath,
34945
34970
  return false;
34946
34971
  }
34947
34972
  }
34948
- async function downloadDirectoryFromPrivateGitHub(repo, branch, dirPath, targetDir, githubToken) {
34973
+ async function downloadDirectoryFromPrivateGitHub(repo, branch, dirPath, targetDir, githubToken, onProgress) {
34949
34974
  try {
34950
34975
  const apiUrl = `https://api.github.com/repos/${repo}/contents/${dirPath}?ref=${branch}`;
34951
34976
  const response = await fetch(apiUrl, {
@@ -34967,10 +34992,12 @@ async function downloadDirectoryFromPrivateGitHub(repo, branch, dirPath, targetD
34967
34992
  for (const file of files) {
34968
34993
  const relativePath = dirPath ? `${dirPath}/${file.name}` : file.name;
34969
34994
  const targetPath = path14.join(targetDir, file.name);
34995
+ const displayPath = relativePath.replace("claude-code-config/", "");
34970
34996
  if (file.type === "file") {
34997
+ onProgress?.(displayPath, "file");
34971
34998
  await downloadFromPrivateGitHub(repo, branch, relativePath, targetPath, githubToken);
34972
34999
  } else if (file.type === "dir") {
34973
- await downloadDirectoryFromPrivateGitHub(repo, branch, relativePath, targetPath, githubToken);
35000
+ await downloadDirectoryFromPrivateGitHub(repo, branch, relativePath, targetPath, githubToken, onProgress);
34974
35001
  }
34975
35002
  }
34976
35003
  return true;
@@ -34980,11 +35007,11 @@ async function downloadDirectoryFromPrivateGitHub(repo, branch, dirPath, targetD
34980
35007
  }
34981
35008
  }
34982
35009
  async function installProConfigs(options) {
34983
- const { githubToken, claudeCodeFolder } = options;
35010
+ const { githubToken, claudeCodeFolder, onProgress } = options;
34984
35011
  const claudeFolder = claudeCodeFolder || path14.join(os8.homedir(), ".claude");
34985
35012
  const tempDir = path14.join(os8.tmpdir(), `aiblueprint-premium-${Date.now()}`);
34986
35013
  try {
34987
- const success = await downloadDirectoryFromPrivateGitHub(PREMIUM_REPO, PREMIUM_BRANCH, "claude-code-config", tempDir, githubToken);
35014
+ const success = await downloadDirectoryFromPrivateGitHub(PREMIUM_REPO, PREMIUM_BRANCH, "claude-code-config", tempDir, githubToken, onProgress);
34988
35015
  if (!success) {
34989
35016
  throw new Error("Failed to download premium configurations");
34990
35017
  }
@@ -34992,66 +35019,45 @@ async function installProConfigs(options) {
34992
35019
  overwrite: true,
34993
35020
  recursive: true
34994
35021
  });
34995
- console.log(`✓ Premium configurations installed to ${claudeFolder}`);
34996
35022
  } catch (error) {
34997
35023
  throw new Error(`Failed to install premium configs: ${error instanceof Error ? error.message : "Unknown error"}`);
34998
35024
  } finally {
34999
35025
  try {
35000
35026
  await import_fs_extra12.default.remove(tempDir);
35001
- } catch (error) {
35027
+ } catch {
35002
35028
  }
35003
35029
  }
35004
35030
  }
35005
35031
 
35006
- // src/lib/setup-helper.ts
35032
+ // src/lib/token-storage.ts
35007
35033
  var import_fs_extra13 = __toESM(require_lib4(), 1);
35008
- import path15 from "path";
35009
35034
  import os9 from "os";
35010
- async function installBasicConfigs(options = {}, skipStatusline = false) {
35011
- const claudeDir = options.claudeCodeFolder || path15.join(os9.homedir(), ".claude");
35012
- await import_fs_extra13.default.ensureDir(claudeDir);
35013
- console.log(source_default.gray("\uD83D\uDCE6 Installing free configurations..."));
35014
- console.log(source_default.gray(" • Commands..."));
35015
- await downloadDirectoryFromGitHub("commands", path15.join(claudeDir, "commands"));
35016
- console.log(source_default.gray(" • Agents..."));
35017
- await downloadDirectoryFromGitHub("agents", path15.join(claudeDir, "agents"));
35018
- if (!skipStatusline) {
35019
- console.log(source_default.gray(" • Statusline (basic)..."));
35020
- await downloadDirectoryFromGitHub("scripts/statusline", path15.join(claudeDir, "scripts", "statusline"));
35021
- }
35022
- console.log(source_default.green("✓ Free configurations installed"));
35023
- return claudeDir;
35024
- }
35025
-
35026
- // src/lib/token-storage.ts
35027
- var import_fs_extra14 = __toESM(require_lib4(), 1);
35028
- import os10 from "os";
35029
- import path16 from "path";
35035
+ import path15 from "path";
35030
35036
  function getConfigDir() {
35031
- const platform = os10.platform();
35037
+ const platform = os9.platform();
35032
35038
  if (platform === "win32") {
35033
- const appData = process.env.APPDATA || path16.join(os10.homedir(), "AppData", "Roaming");
35034
- return path16.join(appData, "aiblueprint");
35039
+ const appData = process.env.APPDATA || path15.join(os9.homedir(), "AppData", "Roaming");
35040
+ return path15.join(appData, "aiblueprint");
35035
35041
  } else {
35036
- const configHome = process.env.XDG_CONFIG_HOME || path16.join(os10.homedir(), ".config");
35037
- return path16.join(configHome, "aiblueprint");
35042
+ const configHome = process.env.XDG_CONFIG_HOME || path15.join(os9.homedir(), ".config");
35043
+ return path15.join(configHome, "aiblueprint");
35038
35044
  }
35039
35045
  }
35040
35046
  function getTokenFilePath() {
35041
- return path16.join(getConfigDir(), "token.txt");
35047
+ return path15.join(getConfigDir(), "token.txt");
35042
35048
  }
35043
35049
  async function saveToken(githubToken) {
35044
35050
  const tokenFile = getTokenFilePath();
35045
- await import_fs_extra14.default.ensureDir(path16.dirname(tokenFile));
35046
- await import_fs_extra14.default.writeFile(tokenFile, githubToken, { mode: 384 });
35051
+ await import_fs_extra13.default.ensureDir(path15.dirname(tokenFile));
35052
+ await import_fs_extra13.default.writeFile(tokenFile, githubToken, { mode: 384 });
35047
35053
  }
35048
35054
  async function getToken() {
35049
35055
  const tokenFile = getTokenFilePath();
35050
- if (!await import_fs_extra14.default.pathExists(tokenFile)) {
35056
+ if (!await import_fs_extra13.default.pathExists(tokenFile)) {
35051
35057
  return null;
35052
35058
  }
35053
35059
  try {
35054
- const token = await import_fs_extra14.default.readFile(tokenFile, "utf-8");
35060
+ const token = await import_fs_extra13.default.readFile(tokenFile, "utf-8");
35055
35061
  return token.trim();
35056
35062
  } catch (error) {
35057
35063
  return null;
@@ -35060,13 +35066,12 @@ async function getToken() {
35060
35066
  function getTokenInfo() {
35061
35067
  return {
35062
35068
  path: getTokenFilePath(),
35063
- platform: os10.platform()
35069
+ platform: os9.platform()
35064
35070
  };
35065
35071
  }
35066
35072
 
35067
35073
  // src/commands/pro.ts
35068
- var import_fs_extra15 = __toESM(require_lib4(), 1);
35069
- import path17 from "path";
35074
+ var import_fs_extra14 = __toESM(require_lib4(), 1);
35070
35075
  var API_URL = "https://codeline.app/api/products";
35071
35076
  var PRODUCT_ID = "prd_XJVgxVPbGG";
35072
35077
  async function countInstalledItems(claudeDir) {
@@ -35076,27 +35081,27 @@ async function countInstalledItems(claudeDir) {
35076
35081
  skills: 0
35077
35082
  };
35078
35083
  try {
35079
- const commandsDir = path17.join(claudeDir, "commands");
35080
- if (await import_fs_extra15.default.pathExists(commandsDir)) {
35081
- const files = await import_fs_extra15.default.readdir(commandsDir);
35084
+ const commandsDir = path16.join(claudeDir, "commands");
35085
+ if (await import_fs_extra14.default.pathExists(commandsDir)) {
35086
+ const files = await import_fs_extra14.default.readdir(commandsDir);
35082
35087
  counts.commands = files.filter((f3) => f3.endsWith(".md")).length;
35083
35088
  }
35084
35089
  } catch {
35085
35090
  }
35086
35091
  try {
35087
- const agentsDir = path17.join(claudeDir, "agents");
35088
- if (await import_fs_extra15.default.pathExists(agentsDir)) {
35089
- const files = await import_fs_extra15.default.readdir(agentsDir);
35092
+ const agentsDir = path16.join(claudeDir, "agents");
35093
+ if (await import_fs_extra14.default.pathExists(agentsDir)) {
35094
+ const files = await import_fs_extra14.default.readdir(agentsDir);
35090
35095
  counts.agents = files.filter((f3) => f3.endsWith(".md")).length;
35091
35096
  }
35092
35097
  } catch {
35093
35098
  }
35094
35099
  try {
35095
- const skillsDir = path17.join(claudeDir, "skills");
35096
- if (await import_fs_extra15.default.pathExists(skillsDir)) {
35097
- const items = await import_fs_extra15.default.readdir(skillsDir);
35100
+ const skillsDir = path16.join(claudeDir, "skills");
35101
+ if (await import_fs_extra14.default.pathExists(skillsDir)) {
35102
+ const items = await import_fs_extra14.default.readdir(skillsDir);
35098
35103
  const dirs = await Promise.all(items.map(async (item) => {
35099
- const stat = await import_fs_extra15.default.stat(path17.join(skillsDir, item));
35104
+ const stat = await import_fs_extra14.default.stat(path16.join(skillsDir, item));
35100
35105
  return stat.isDirectory();
35101
35106
  }));
35102
35107
  counts.skills = dirs.filter(Boolean).length;
@@ -35106,7 +35111,7 @@ async function countInstalledItems(claudeDir) {
35106
35111
  return counts;
35107
35112
  }
35108
35113
  async function proActivateCommand(userToken) {
35109
- oe(source_default.blue("\uD83D\uDD11 Activate AIBlueprint CLI Premium"));
35114
+ oe(source_default.blue(`\uD83D\uDD11 Activate AIBlueprint CLI Premium ${source_default.gray(`v${getVersion()}`)}`));
35110
35115
  try {
35111
35116
  if (!userToken) {
35112
35117
  const result = await te({
@@ -35170,7 +35175,7 @@ async function proActivateCommand(userToken) {
35170
35175
  }
35171
35176
  }
35172
35177
  async function proStatusCommand() {
35173
- oe(source_default.blue("\uD83D\uDCCA Premium Token Status"));
35178
+ oe(source_default.blue(`\uD83D\uDCCA Premium Token Status ${source_default.gray(`v${getVersion()}`)}`));
35174
35179
  try {
35175
35180
  const token = await getToken();
35176
35181
  if (!token) {
@@ -35194,7 +35199,7 @@ async function proStatusCommand() {
35194
35199
  }
35195
35200
  }
35196
35201
  async function proSetupCommand(options = {}) {
35197
- oe(source_default.blue("⚙️ Setup AIBlueprint CLI Premium"));
35202
+ oe(source_default.blue(`⚙️ Setup AIBlueprint CLI Premium ${source_default.gray(`v${getVersion()}`)}`));
35198
35203
  try {
35199
35204
  const githubToken = await getToken();
35200
35205
  if (!githubToken) {
@@ -35203,16 +35208,24 @@ async function proSetupCommand(options = {}) {
35203
35208
  $e(source_default.red("❌ Not activated"));
35204
35209
  process.exit(1);
35205
35210
  }
35211
+ const claudeDir = options.folder ? path16.resolve(options.folder) : path16.join(os10.homedir(), ".claude");
35206
35212
  const spinner = de();
35207
- spinner.start("Installing free configurations...");
35208
- const claudeDir = await installBasicConfigs({ claudeCodeFolder: options.folder }, true);
35209
- spinner.stop("Free configurations installed");
35213
+ const onProgress = (file, type) => {
35214
+ spinner.message(`Installing: ${source_default.cyan(file)} ${source_default.gray(`(${type})`)}`);
35215
+ };
35210
35216
  spinner.start("Installing premium configurations...");
35211
35217
  await installProConfigs({
35212
35218
  githubToken,
35213
- claudeCodeFolder: claudeDir
35219
+ claudeCodeFolder: claudeDir,
35220
+ onProgress
35214
35221
  });
35215
35222
  spinner.stop("Premium configurations installed");
35223
+ spinner.start("Checking global dependencies...");
35224
+ await checkAndInstallDependencies();
35225
+ spinner.stop("Global dependencies ready");
35226
+ spinner.start("Installing scripts dependencies...");
35227
+ await installScriptsDependencies(claudeDir);
35228
+ spinner.stop("Scripts dependencies installed");
35216
35229
  spinner.start("Setting up shell shortcuts...");
35217
35230
  await setupShellShortcuts();
35218
35231
  spinner.stop("Shell shortcuts configured");
@@ -35245,7 +35258,7 @@ async function proSetupCommand(options = {}) {
35245
35258
  }
35246
35259
  }
35247
35260
  async function proUpdateCommand(options = {}) {
35248
- oe(source_default.blue("\uD83D\uDD04 Update Premium Configs"));
35261
+ oe(source_default.blue(`\uD83D\uDD04 Update Premium Configs ${source_default.gray(`v${getVersion()}`)}`));
35249
35262
  try {
35250
35263
  const githubToken = await getToken();
35251
35264
  if (!githubToken) {
@@ -35273,11 +35286,11 @@ async function proUpdateCommand(options = {}) {
35273
35286
 
35274
35287
  // src/commands/sync.ts
35275
35288
  import os11 from "os";
35276
- import path19 from "path";
35289
+ import path18 from "path";
35277
35290
 
35278
35291
  // src/lib/sync-utils.ts
35279
- var import_fs_extra16 = __toESM(require_lib4(), 1);
35280
- import path18 from "path";
35292
+ var import_fs_extra15 = __toESM(require_lib4(), 1);
35293
+ import path17 from "path";
35281
35294
  import crypto from "crypto";
35282
35295
  var PREMIUM_REPO2 = "Melvynx/aiblueprint-cli-premium";
35283
35296
  var PREMIUM_BRANCH2 = "main";
@@ -35307,147 +35320,140 @@ async function listRemoteDirectory(dirPath, githubToken) {
35307
35320
  }
35308
35321
  return files;
35309
35322
  }
35310
- async function computeLocalFileSha(filePath) {
35311
- try {
35312
- const content = await import_fs_extra16.default.readFile(filePath);
35313
- return computeFileSha(content);
35314
- } catch {
35315
- return null;
35323
+ async function listRemoteFilesRecursive(dirPath, githubToken, basePath = "") {
35324
+ const results = [];
35325
+ const files = await listRemoteDirectory(dirPath, githubToken);
35326
+ for (const file of files) {
35327
+ const relativePath = basePath ? `${basePath}/${file.name}` : file.name;
35328
+ if (file.type === "file") {
35329
+ results.push({ path: relativePath, sha: file.sha, isFolder: false });
35330
+ } else if (file.type === "dir") {
35331
+ results.push({ path: relativePath, sha: "", isFolder: true });
35332
+ const subFiles = await listRemoteFilesRecursive(`${dirPath}/${file.name}`, githubToken, relativePath);
35333
+ results.push(...subFiles);
35334
+ }
35316
35335
  }
35336
+ return results;
35317
35337
  }
35318
- async function computeFolderSha(folderPath) {
35338
+ async function computeLocalFileSha(filePath) {
35319
35339
  try {
35320
- if (!await import_fs_extra16.default.pathExists(folderPath)) {
35321
- return null;
35322
- }
35323
- const files = await getAllFilesRecursive(folderPath);
35324
- if (files.length === 0) {
35325
- return null;
35326
- }
35327
- const hashes = [];
35328
- for (const file of files.sort()) {
35329
- const content = await import_fs_extra16.default.readFile(file);
35330
- hashes.push(computeFileSha(content));
35331
- }
35332
- return crypto.createHash("sha1").update(hashes.join("")).digest("hex");
35340
+ const content = await import_fs_extra15.default.readFile(filePath);
35341
+ return computeFileSha(content);
35333
35342
  } catch {
35334
35343
  return null;
35335
35344
  }
35336
35345
  }
35337
- async function getAllFilesRecursive(dir) {
35346
+ async function listLocalFiles(dir) {
35338
35347
  const files = [];
35339
- const items = await import_fs_extra16.default.readdir(dir);
35348
+ if (!await import_fs_extra15.default.pathExists(dir)) {
35349
+ return files;
35350
+ }
35351
+ const items = await import_fs_extra15.default.readdir(dir);
35340
35352
  for (const item of items) {
35341
- const fullPath = path18.join(dir, item);
35342
- const stat = await import_fs_extra16.default.stat(fullPath);
35353
+ const fullPath = path17.join(dir, item);
35354
+ const stat = await import_fs_extra15.default.stat(fullPath);
35343
35355
  if (stat.isDirectory()) {
35344
- const subFiles = await getAllFilesRecursive(fullPath);
35356
+ files.push(item);
35357
+ const subFiles = await listLocalFilesRecursive(fullPath, item);
35345
35358
  files.push(...subFiles);
35346
35359
  } else {
35347
- files.push(fullPath);
35360
+ files.push(item);
35348
35361
  }
35349
35362
  }
35350
35363
  return files;
35351
35364
  }
35352
- async function computeRemoteFolderSha(dirPath, githubToken) {
35353
- const hashes = [];
35354
- await collectRemoteFolderHashes(dirPath, githubToken, hashes);
35355
- hashes.sort();
35356
- return crypto.createHash("sha1").update(hashes.join("")).digest("hex");
35357
- }
35358
- async function collectRemoteFolderHashes(dirPath, githubToken, hashes) {
35359
- const files = await listRemoteDirectory(dirPath, githubToken);
35360
- for (const file of files) {
35361
- if (file.type === "file") {
35362
- hashes.push(file.sha);
35363
- } else if (file.type === "dir") {
35364
- await collectRemoteFolderHashes(`${dirPath}/${file.name}`, githubToken, hashes);
35365
+ async function listLocalFilesRecursive(dir, basePath) {
35366
+ const files = [];
35367
+ const items = await import_fs_extra15.default.readdir(dir);
35368
+ for (const item of items) {
35369
+ const fullPath = path17.join(dir, item);
35370
+ const relativePath = `${basePath}/${item}`;
35371
+ const stat = await import_fs_extra15.default.stat(fullPath);
35372
+ if (stat.isDirectory()) {
35373
+ files.push(relativePath);
35374
+ const subFiles = await listLocalFilesRecursive(fullPath, relativePath);
35375
+ files.push(...subFiles);
35376
+ } else {
35377
+ files.push(relativePath);
35365
35378
  }
35366
35379
  }
35380
+ return files;
35367
35381
  }
35368
- async function analyzeSyncChanges(claudeDir, githubToken) {
35382
+ async function analyzeCategory(category, claudeDir, githubToken) {
35369
35383
  const items = [];
35370
- const commandsRemote = await listRemoteDirectory("commands", githubToken);
35371
- for (const file of commandsRemote) {
35372
- if (file.type === "file" && file.name.endsWith(".md")) {
35373
- const localPath = path18.join(claudeDir, "commands", file.name);
35374
- const localSha = await computeLocalFileSha(localPath);
35375
- let status = "new";
35376
- if (localSha) {
35377
- status = localSha === file.sha ? "unchanged" : "modified";
35378
- }
35384
+ const localDir = path17.join(claudeDir, category);
35385
+ const remoteFiles = await listRemoteFilesRecursive(category, githubToken);
35386
+ const localFiles = await listLocalFiles(localDir);
35387
+ const remoteSet = new Map;
35388
+ for (const rf of remoteFiles) {
35389
+ remoteSet.set(rf.path, { sha: rf.sha, isFolder: rf.isFolder });
35390
+ }
35391
+ const localSet = new Set(localFiles);
35392
+ for (const [remotePath, { sha, isFolder }] of remoteSet) {
35393
+ const localPath = path17.join(localDir, remotePath);
35394
+ if (isFolder) {
35395
+ continue;
35396
+ }
35397
+ if (!localSet.has(remotePath)) {
35379
35398
  items.push({
35380
- name: file.name.replace(".md", ""),
35381
- relativePath: `commands/${file.name}`,
35382
- type: "file",
35383
- status,
35384
- remoteSha: file.sha,
35385
- localSha: localSha || undefined,
35386
- category: "commands"
35399
+ name: remotePath,
35400
+ relativePath: `${category}/${remotePath}`,
35401
+ status: "new",
35402
+ category
35387
35403
  });
35388
- }
35389
- }
35390
- const agentsRemote = await listRemoteDirectory("agents", githubToken);
35391
- for (const file of agentsRemote) {
35392
- if (file.type === "file" && file.name.endsWith(".md")) {
35393
- const localPath = path18.join(claudeDir, "agents", file.name);
35404
+ } else {
35394
35405
  const localSha = await computeLocalFileSha(localPath);
35395
- let status = "new";
35396
- if (localSha) {
35397
- status = localSha === file.sha ? "unchanged" : "modified";
35406
+ if (localSha !== sha) {
35407
+ items.push({
35408
+ name: remotePath,
35409
+ relativePath: `${category}/${remotePath}`,
35410
+ status: "modified",
35411
+ category
35412
+ });
35413
+ } else {
35414
+ items.push({
35415
+ name: remotePath,
35416
+ relativePath: `${category}/${remotePath}`,
35417
+ status: "unchanged",
35418
+ category
35419
+ });
35398
35420
  }
35399
- items.push({
35400
- name: file.name.replace(".md", ""),
35401
- relativePath: `agents/${file.name}`,
35402
- type: "file",
35403
- status,
35404
- remoteSha: file.sha,
35405
- localSha: localSha || undefined,
35406
- category: "agents"
35407
- });
35408
35421
  }
35409
35422
  }
35410
- const skillsRemote = await listRemoteDirectory("skills", githubToken);
35411
- if (skillsRemote.length > 0) {
35412
- const remoteSha = await computeRemoteFolderSha("skills", githubToken);
35413
- const localSha = await computeFolderSha(path18.join(claudeDir, "skills"));
35414
- let status = "new";
35415
- if (localSha) {
35416
- status = localSha === remoteSha ? "unchanged" : "modified";
35417
- }
35418
- items.push({
35419
- name: "skills",
35420
- relativePath: "skills",
35421
- type: "folder",
35422
- status,
35423
- remoteSha,
35424
- localSha: localSha || undefined,
35425
- category: "skills"
35426
- });
35423
+ for (const localPath of localSet) {
35424
+ if (!remoteSet.has(localPath)) {
35425
+ const fullPath = path17.join(localDir, localPath);
35426
+ const stat = await import_fs_extra15.default.stat(fullPath).catch(() => null);
35427
+ if (stat && !stat.isDirectory()) {
35428
+ items.push({
35429
+ name: localPath,
35430
+ relativePath: `${category}/${localPath}`,
35431
+ status: "deleted",
35432
+ category
35433
+ });
35434
+ }
35435
+ }
35427
35436
  }
35428
- const scriptsRemote = await listRemoteDirectory("scripts", githubToken);
35429
- if (scriptsRemote.length > 0) {
35430
- const remoteSha = await computeRemoteFolderSha("scripts", githubToken);
35431
- const localSha = await computeFolderSha(path18.join(claudeDir, "scripts"));
35432
- let status = "new";
35433
- if (localSha) {
35434
- status = localSha === remoteSha ? "unchanged" : "modified";
35435
- }
35436
- items.push({
35437
- name: "scripts",
35438
- relativePath: "scripts",
35439
- type: "folder",
35440
- status,
35441
- remoteSha,
35442
- localSha: localSha || undefined,
35443
- category: "scripts"
35444
- });
35437
+ return items;
35438
+ }
35439
+ async function analyzeSyncChanges(claudeDir, githubToken) {
35440
+ const allItems = [];
35441
+ const categories = [
35442
+ "commands",
35443
+ "agents",
35444
+ "skills",
35445
+ "scripts"
35446
+ ];
35447
+ for (const category of categories) {
35448
+ const items = await analyzeCategory(category, claudeDir, githubToken);
35449
+ allItems.push(...items);
35445
35450
  }
35446
35451
  return {
35447
- items,
35448
- newCount: items.filter((i) => i.status === "new").length,
35449
- modifiedCount: items.filter((i) => i.status === "modified").length,
35450
- unchangedCount: items.filter((i) => i.status === "unchanged").length
35452
+ items: allItems,
35453
+ newCount: allItems.filter((i) => i.status === "new").length,
35454
+ modifiedCount: allItems.filter((i) => i.status === "modified").length,
35455
+ deletedCount: allItems.filter((i) => i.status === "deleted").length,
35456
+ unchangedCount: allItems.filter((i) => i.status === "unchanged").length
35451
35457
  };
35452
35458
  }
35453
35459
  async function downloadFromPrivateGitHub2(relativePath, targetPath, githubToken) {
@@ -35463,45 +35469,30 @@ async function downloadFromPrivateGitHub2(relativePath, targetPath, githubToken)
35463
35469
  return false;
35464
35470
  }
35465
35471
  const content = await response.arrayBuffer();
35466
- await import_fs_extra16.default.ensureDir(path18.dirname(targetPath));
35467
- await import_fs_extra16.default.writeFile(targetPath, Buffer.from(content));
35472
+ await import_fs_extra15.default.ensureDir(path17.dirname(targetPath));
35473
+ await import_fs_extra15.default.writeFile(targetPath, Buffer.from(content));
35468
35474
  return true;
35469
35475
  } catch {
35470
35476
  return false;
35471
35477
  }
35472
35478
  }
35473
- async function downloadDirectoryFromPrivateGitHub2(dirPath, targetDir, githubToken) {
35474
- try {
35475
- const files = await listRemoteDirectory(dirPath, githubToken);
35476
- await import_fs_extra16.default.ensureDir(targetDir);
35477
- for (const file of files) {
35478
- const relativePath = `${dirPath}/${file.name}`;
35479
- const targetPath = path18.join(targetDir, file.name);
35480
- if (file.type === "file") {
35481
- await downloadFromPrivateGitHub2(relativePath, targetPath, githubToken);
35482
- } else if (file.type === "dir") {
35483
- await downloadDirectoryFromPrivateGitHub2(relativePath, targetPath, githubToken);
35484
- }
35485
- }
35486
- return true;
35487
- } catch {
35488
- return false;
35489
- }
35490
- }
35491
- async function syncSelectedItems(claudeDir, items, githubToken) {
35479
+ async function syncSelectedItems(claudeDir, items, githubToken, onProgress) {
35492
35480
  let success = 0;
35493
35481
  let failed = 0;
35482
+ let deleted = 0;
35494
35483
  for (const item of items) {
35495
- const targetPath = path18.join(claudeDir, item.relativePath);
35496
- if (item.type === "file") {
35497
- const ok = await downloadFromPrivateGitHub2(item.relativePath, targetPath, githubToken);
35498
- if (ok) {
35499
- success++;
35500
- } else {
35484
+ const targetPath = path17.join(claudeDir, item.relativePath);
35485
+ if (item.status === "deleted") {
35486
+ onProgress?.(item.relativePath, "deleting");
35487
+ try {
35488
+ await import_fs_extra15.default.remove(targetPath);
35489
+ deleted++;
35490
+ } catch {
35501
35491
  failed++;
35502
35492
  }
35503
35493
  } else {
35504
- const ok = await downloadDirectoryFromPrivateGitHub2(item.relativePath, targetPath, githubToken);
35494
+ onProgress?.(item.relativePath, item.status === "new" ? "adding" : "updating");
35495
+ const ok = await downloadFromPrivateGitHub2(item.relativePath, targetPath, githubToken);
35505
35496
  if (ok) {
35506
35497
  success++;
35507
35498
  } else {
@@ -35509,12 +35500,36 @@ async function syncSelectedItems(claudeDir, items, githubToken) {
35509
35500
  }
35510
35501
  }
35511
35502
  }
35512
- return { success, failed };
35503
+ return { success, failed, deleted };
35513
35504
  }
35514
35505
 
35515
35506
  // src/commands/sync.ts
35507
+ function formatItem(item) {
35508
+ const icons = {
35509
+ new: "\uD83C\uDD95",
35510
+ modified: "\uD83D\uDCDD",
35511
+ deleted: "\uD83D\uDDD1️",
35512
+ unchanged: "✅"
35513
+ };
35514
+ const colors12 = {
35515
+ new: source_default.green,
35516
+ modified: source_default.yellow,
35517
+ deleted: source_default.red,
35518
+ unchanged: source_default.gray
35519
+ };
35520
+ return `${icons[item.status]} ${colors12[item.status](item.relativePath)}`;
35521
+ }
35522
+ function groupByCategory(items) {
35523
+ const grouped = new Map;
35524
+ for (const item of items) {
35525
+ const existing = grouped.get(item.category) || [];
35526
+ existing.push(item);
35527
+ grouped.set(item.category, existing);
35528
+ }
35529
+ return grouped;
35530
+ }
35516
35531
  async function proSyncCommand(options = {}) {
35517
- oe(source_default.blue("\uD83D\uDD04 Sync Premium Configurations"));
35532
+ oe(source_default.blue(`\uD83D\uDD04 Sync Premium Configurations ${source_default.gray(`v${getVersion()}`)}`));
35518
35533
  try {
35519
35534
  const githubToken = await getToken();
35520
35535
  if (!githubToken) {
@@ -35523,37 +35538,38 @@ async function proSyncCommand(options = {}) {
35523
35538
  $e(source_default.red("❌ Not activated"));
35524
35539
  process.exit(1);
35525
35540
  }
35526
- const claudeDir = options.folder ? path19.resolve(options.folder) : path19.join(os11.homedir(), ".claude");
35541
+ const claudeDir = options.folder ? path18.resolve(options.folder) : path18.join(os11.homedir(), ".claude");
35527
35542
  const spinner = de();
35528
35543
  spinner.start("Analyzing changes...");
35529
35544
  const result = await analyzeSyncChanges(claudeDir, githubToken);
35530
35545
  spinner.stop("Analysis complete");
35531
- if (result.newCount === 0 && result.modifiedCount === 0) {
35546
+ const changedItems = result.items.filter((i) => i.status !== "unchanged");
35547
+ if (changedItems.length === 0) {
35532
35548
  f2.success("Everything is up to date!");
35533
35549
  $e(source_default.green("✅ No changes needed"));
35534
35550
  return;
35535
35551
  }
35536
- f2.info(`Found ${result.newCount} new, ${result.modifiedCount} modified, ${result.unchangedCount} unchanged`);
35537
- const newItems = result.items.filter((i) => i.status === "new");
35538
- const modifiedItems = result.items.filter((i) => i.status === "modified");
35539
- const choices = [];
35540
- if (newItems.length > 0) {
35541
- for (const item of newItems) {
35542
- choices.push({
35543
- value: item,
35544
- label: `\uD83C\uDD95 ${item.name}`,
35545
- hint: `${item.category} (new ${item.type})`
35546
- });
35552
+ f2.info(`Found: ${source_default.green(`${result.newCount} new`)}, ${source_default.yellow(`${result.modifiedCount} modified`)}, ${source_default.red(`${result.deletedCount} to remove`)}, ${source_default.gray(`${result.unchangedCount} unchanged`)}`);
35553
+ f2.message("");
35554
+ f2.message(source_default.bold("Changes by category:"));
35555
+ const grouped = groupByCategory(changedItems);
35556
+ for (const [category, items] of grouped) {
35557
+ f2.message("");
35558
+ f2.message(source_default.cyan.bold(` ${category.toUpperCase()}`));
35559
+ for (const item of items) {
35560
+ f2.message(` ${formatItem(item)}`);
35547
35561
  }
35548
35562
  }
35549
- if (modifiedItems.length > 0) {
35550
- for (const item of modifiedItems) {
35551
- choices.push({
35552
- value: item,
35553
- label: `\uD83D\uDCDD ${item.name}`,
35554
- hint: `${item.category} (modified ${item.type})`
35555
- });
35556
- }
35563
+ f2.message("");
35564
+ const choices = [];
35565
+ for (const item of changedItems) {
35566
+ const icons = { new: "\uD83C\uDD95", modified: "\uD83D\uDCDD", deleted: "\uD83D\uDDD1️", unchanged: "" };
35567
+ const actions = { new: "add", modified: "update", deleted: "remove", unchanged: "" };
35568
+ choices.push({
35569
+ value: item,
35570
+ label: `${icons[item.status]} ${item.relativePath}`,
35571
+ hint: actions[item.status]
35572
+ });
35557
35573
  }
35558
35574
  const selected = await ae({
35559
35575
  message: "Select items to sync:",
@@ -35571,38 +35587,41 @@ async function proSyncCommand(options = {}) {
35571
35587
  $e(source_default.yellow("⚠️ Nothing to sync"));
35572
35588
  return;
35573
35589
  }
35590
+ const toAdd = selectedItems.filter((i) => i.status === "new").length;
35591
+ const toUpdate = selectedItems.filter((i) => i.status === "modified").length;
35592
+ const toRemove = selectedItems.filter((i) => i.status === "deleted").length;
35593
+ const summary = [
35594
+ toAdd > 0 ? `add ${toAdd}` : "",
35595
+ toUpdate > 0 ? `update ${toUpdate}` : "",
35596
+ toRemove > 0 ? `remove ${toRemove}` : ""
35597
+ ].filter(Boolean).join(", ");
35574
35598
  const confirmResult = await se({
35575
- message: `Sync ${selectedItems.length} item(s)?`,
35599
+ message: `Proceed? (${summary})`,
35576
35600
  initialValue: true
35577
35601
  });
35578
35602
  if (lD(confirmResult) || !confirmResult) {
35579
35603
  ue("Sync cancelled");
35580
35604
  process.exit(0);
35581
35605
  }
35582
- spinner.start(`Syncing ${selectedItems.length} item(s)...`);
35583
- const syncResult = await syncSelectedItems(claudeDir, selectedItems, githubToken);
35606
+ spinner.start("Syncing...");
35607
+ const syncResult = await syncSelectedItems(claudeDir, selectedItems, githubToken, (file, action) => {
35608
+ spinner.message(`${action}: ${source_default.cyan(file)}`);
35609
+ });
35584
35610
  spinner.stop("Sync complete");
35585
- if (syncResult.failed > 0) {
35586
- f2.warn(`${syncResult.success} succeeded, ${syncResult.failed} failed`);
35587
- } else {
35588
- f2.success(`${syncResult.success} item(s) synced successfully`);
35611
+ const results = [];
35612
+ if (syncResult.success > 0)
35613
+ results.push(source_default.green(`${syncResult.success} added/updated`));
35614
+ if (syncResult.deleted > 0)
35615
+ results.push(source_default.red(`${syncResult.deleted} removed`));
35616
+ if (syncResult.failed > 0)
35617
+ results.push(source_default.yellow(`${syncResult.failed} failed`));
35618
+ f2.success(results.join(", "));
35619
+ const scriptsWereSynced = selectedItems.some((i) => i.category === "scripts");
35620
+ if (scriptsWereSynced) {
35621
+ spinner.start("Installing scripts dependencies...");
35622
+ await installScriptsDependencies(claudeDir);
35623
+ spinner.stop("Scripts dependencies installed");
35589
35624
  }
35590
- const syncedByCategory = {
35591
- commands: selectedItems.filter((i) => i.category === "commands").length,
35592
- agents: selectedItems.filter((i) => i.category === "agents").length,
35593
- skills: selectedItems.filter((i) => i.category === "skills").length,
35594
- scripts: selectedItems.filter((i) => i.category === "scripts").length
35595
- };
35596
- const summary = [];
35597
- if (syncedByCategory.commands > 0)
35598
- summary.push(`${syncedByCategory.commands} command(s)`);
35599
- if (syncedByCategory.agents > 0)
35600
- summary.push(`${syncedByCategory.agents} agent(s)`);
35601
- if (syncedByCategory.skills > 0)
35602
- summary.push("skills folder");
35603
- if (syncedByCategory.scripts > 0)
35604
- summary.push("scripts folder");
35605
- f2.info(`Synced: ${summary.join(", ")}`);
35606
35625
  $e(source_default.green("✅ Sync completed"));
35607
35626
  } catch (error) {
35608
35627
  if (error instanceof Error) {
@@ -35614,11 +35633,11 @@ async function proSyncCommand(options = {}) {
35614
35633
  }
35615
35634
 
35616
35635
  // src/cli.ts
35617
- import { readFileSync as readFileSync2 } from "fs";
35618
- import { dirname as dirname4, join } from "path";
35619
- import { fileURLToPath as fileURLToPath4 } from "url";
35620
- var __dirname5 = dirname4(fileURLToPath4(import.meta.url));
35621
- var packageJson = JSON.parse(readFileSync2(join(__dirname5, "../package.json"), "utf8"));
35636
+ import { readFileSync as readFileSync3 } from "fs";
35637
+ import { dirname as dirname5, join as join2 } from "path";
35638
+ import { fileURLToPath as fileURLToPath5 } from "url";
35639
+ var __dirname6 = dirname5(fileURLToPath5(import.meta.url));
35640
+ var packageJson = JSON.parse(readFileSync3(join2(__dirname6, "../package.json"), "utf8"));
35622
35641
  var program2 = new Command;
35623
35642
  program2.name("aiblueprint").description("AIBlueprint CLI for setting up Claude Code configurations").version(packageJson.version);
35624
35643
  var claudeCodeCmd = program2.command("claude-code").description("Claude Code configuration commands").option("-f, --folder <path>", "Specify custom Claude Code folder path (default: ~/.claude) - alias for --claudeCodeFolder").option("--claudeCodeFolder <path>", "Specify custom Claude Code folder path (default: ~/.claude)").option("--codexFolder <path>", "Specify custom Codex folder path (default: ~/.codex)").option("--openCodeFolder <path>", "Specify custom OpenCode folder path (default: ~/.config/opencode)").option("--factoryAiFolder <path>", "Specify custom FactoryAI folder path (default: ~/.factory)").option("-s, --skip", "Skip interactive prompts and install all features");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiblueprint-cli",
3
- "version": "1.3.1",
3
+ "version": "1.3.3",
4
4
  "description": "AIBlueprint CLI for setting up Claude Code configurations",
5
5
  "author": "AIBlueprint",
6
6
  "license": "MIT",