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.
- package/README.md +18 -1
- package/dist/cli.js +299 -280
- 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
|
|
33195
|
-
const
|
|
33194
|
+
async function installScriptsDependencies(claudeDir) {
|
|
33195
|
+
const scriptsDir = path4.join(claudeDir, "scripts");
|
|
33196
33196
|
console.log(source_default.yellow(`
|
|
33197
|
-
Installing
|
|
33197
|
+
Installing scripts dependencies...`));
|
|
33198
33198
|
try {
|
|
33199
33199
|
execSync("bun install", {
|
|
33200
|
-
cwd:
|
|
33200
|
+
cwd: scriptsDir,
|
|
33201
33201
|
stdio: "inherit"
|
|
33202
33202
|
});
|
|
33203
|
-
console.log(source_default.green(" ✓
|
|
33203
|
+
console.log(source_default.green(" ✓ Scripts dependencies installed"));
|
|
33204
33204
|
} catch (error) {
|
|
33205
|
-
console.log(source_default.red(" Failed to install
|
|
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 =
|
|
33399
|
-
var
|
|
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(
|
|
33517
|
-
path7.join(
|
|
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
|
|
33679
|
-
import { dirname as
|
|
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
|
|
33685
|
-
import { dirname as
|
|
33686
|
-
var __filename3 =
|
|
33687
|
-
var
|
|
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(
|
|
33715
|
-
path8.join(
|
|
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 =
|
|
33847
|
-
var
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
35027
|
+
} catch {
|
|
35002
35028
|
}
|
|
35003
35029
|
}
|
|
35004
35030
|
}
|
|
35005
35031
|
|
|
35006
|
-
// src/lib/
|
|
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
|
-
|
|
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 =
|
|
35037
|
+
const platform = os9.platform();
|
|
35032
35038
|
if (platform === "win32") {
|
|
35033
|
-
const appData = process.env.APPDATA ||
|
|
35034
|
-
return
|
|
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 ||
|
|
35037
|
-
return
|
|
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
|
|
35047
|
+
return path15.join(getConfigDir(), "token.txt");
|
|
35042
35048
|
}
|
|
35043
35049
|
async function saveToken(githubToken) {
|
|
35044
35050
|
const tokenFile = getTokenFilePath();
|
|
35045
|
-
await
|
|
35046
|
-
await
|
|
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
|
|
35056
|
+
if (!await import_fs_extra13.default.pathExists(tokenFile)) {
|
|
35051
35057
|
return null;
|
|
35052
35058
|
}
|
|
35053
35059
|
try {
|
|
35054
|
-
const token = await
|
|
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:
|
|
35069
|
+
platform: os9.platform()
|
|
35064
35070
|
};
|
|
35065
35071
|
}
|
|
35066
35072
|
|
|
35067
35073
|
// src/commands/pro.ts
|
|
35068
|
-
var
|
|
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 =
|
|
35080
|
-
if (await
|
|
35081
|
-
const files = await
|
|
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 =
|
|
35088
|
-
if (await
|
|
35089
|
-
const files = await
|
|
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 =
|
|
35096
|
-
if (await
|
|
35097
|
-
const items = await
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
35208
|
-
|
|
35209
|
-
|
|
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(
|
|
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
|
|
35289
|
+
import path18 from "path";
|
|
35277
35290
|
|
|
35278
35291
|
// src/lib/sync-utils.ts
|
|
35279
|
-
var
|
|
35280
|
-
import
|
|
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
|
|
35311
|
-
|
|
35312
|
-
|
|
35313
|
-
|
|
35314
|
-
|
|
35315
|
-
|
|
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
|
|
35338
|
+
async function computeLocalFileSha(filePath) {
|
|
35319
35339
|
try {
|
|
35320
|
-
|
|
35321
|
-
|
|
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
|
|
35346
|
+
async function listLocalFiles(dir) {
|
|
35338
35347
|
const files = [];
|
|
35339
|
-
|
|
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 =
|
|
35342
|
-
const stat = await
|
|
35353
|
+
const fullPath = path17.join(dir, item);
|
|
35354
|
+
const stat = await import_fs_extra15.default.stat(fullPath);
|
|
35343
35355
|
if (stat.isDirectory()) {
|
|
35344
|
-
|
|
35356
|
+
files.push(item);
|
|
35357
|
+
const subFiles = await listLocalFilesRecursive(fullPath, item);
|
|
35345
35358
|
files.push(...subFiles);
|
|
35346
35359
|
} else {
|
|
35347
|
-
files.push(
|
|
35360
|
+
files.push(item);
|
|
35348
35361
|
}
|
|
35349
35362
|
}
|
|
35350
35363
|
return files;
|
|
35351
35364
|
}
|
|
35352
|
-
async function
|
|
35353
|
-
const
|
|
35354
|
-
await
|
|
35355
|
-
|
|
35356
|
-
|
|
35357
|
-
}
|
|
35358
|
-
|
|
35359
|
-
|
|
35360
|
-
|
|
35361
|
-
|
|
35362
|
-
|
|
35363
|
-
} else
|
|
35364
|
-
|
|
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
|
|
35382
|
+
async function analyzeCategory(category, claudeDir, githubToken) {
|
|
35369
35383
|
const items = [];
|
|
35370
|
-
const
|
|
35371
|
-
|
|
35372
|
-
|
|
35373
|
-
|
|
35374
|
-
|
|
35375
|
-
|
|
35376
|
-
|
|
35377
|
-
|
|
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:
|
|
35381
|
-
relativePath:
|
|
35382
|
-
|
|
35383
|
-
|
|
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
|
-
|
|
35396
|
-
|
|
35397
|
-
|
|
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
|
|
35411
|
-
|
|
35412
|
-
|
|
35413
|
-
|
|
35414
|
-
|
|
35415
|
-
|
|
35416
|
-
|
|
35417
|
-
|
|
35418
|
-
|
|
35419
|
-
|
|
35420
|
-
|
|
35421
|
-
|
|
35422
|
-
|
|
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
|
-
|
|
35429
|
-
|
|
35430
|
-
|
|
35431
|
-
|
|
35432
|
-
|
|
35433
|
-
|
|
35434
|
-
|
|
35435
|
-
|
|
35436
|
-
|
|
35437
|
-
|
|
35438
|
-
|
|
35439
|
-
|
|
35440
|
-
|
|
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:
|
|
35449
|
-
modifiedCount:
|
|
35450
|
-
|
|
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
|
|
35467
|
-
await
|
|
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
|
|
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 =
|
|
35496
|
-
if (item.
|
|
35497
|
-
|
|
35498
|
-
|
|
35499
|
-
|
|
35500
|
-
|
|
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
|
-
|
|
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(
|
|
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 ?
|
|
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
|
-
|
|
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
|
-
|
|
35538
|
-
|
|
35539
|
-
const
|
|
35540
|
-
|
|
35541
|
-
|
|
35542
|
-
|
|
35543
|
-
|
|
35544
|
-
|
|
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
|
-
|
|
35550
|
-
|
|
35551
|
-
|
|
35552
|
-
|
|
35553
|
-
|
|
35554
|
-
|
|
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: `
|
|
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(
|
|
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
|
-
|
|
35586
|
-
|
|
35587
|
-
|
|
35588
|
-
|
|
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
|
|
35618
|
-
import { dirname as
|
|
35619
|
-
import { fileURLToPath as
|
|
35620
|
-
var
|
|
35621
|
-
var packageJson = JSON.parse(
|
|
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");
|