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