@caliber-ai/cli 0.1.0 → 0.2.0
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/dist/bin.js +164 -12
- package/dist/bin.js.map +1 -1
- package/package.json +19 -5
package/dist/bin.js
CHANGED
|
@@ -51,6 +51,7 @@ var init_constants = __esm({
|
|
|
51
51
|
|
|
52
52
|
// src/cli.ts
|
|
53
53
|
import { Command } from "commander";
|
|
54
|
+
import fs12 from "fs";
|
|
54
55
|
|
|
55
56
|
// src/commands/init.ts
|
|
56
57
|
import chalk2 from "chalk";
|
|
@@ -314,7 +315,7 @@ import crypto2 from "crypto";
|
|
|
314
315
|
import { execSync } from "child_process";
|
|
315
316
|
function getGitRemoteUrl() {
|
|
316
317
|
try {
|
|
317
|
-
return execSync("git remote get-url origin", { encoding: "utf-8" }).trim();
|
|
318
|
+
return execSync("git remote get-url origin", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
|
|
318
319
|
} catch {
|
|
319
320
|
return void 0;
|
|
320
321
|
}
|
|
@@ -373,8 +374,8 @@ var WORKSPACE_GLOBS = [
|
|
|
373
374
|
];
|
|
374
375
|
function detectNodeFrameworks(pkgPath) {
|
|
375
376
|
try {
|
|
376
|
-
const
|
|
377
|
-
const allDeps = { ...
|
|
377
|
+
const pkg4 = JSON.parse(fs3.readFileSync(pkgPath, "utf-8"));
|
|
378
|
+
const allDeps = { ...pkg4.dependencies, ...pkg4.devDependencies };
|
|
378
379
|
const frameworks = [];
|
|
379
380
|
for (const [dep, framework] of Object.entries(NODE_FRAMEWORK_DEPS)) {
|
|
380
381
|
if (allDeps[dep]) frameworks.push(framework);
|
|
@@ -412,9 +413,9 @@ function analyzePackageJson(dir) {
|
|
|
412
413
|
const languages = [];
|
|
413
414
|
if (fs3.existsSync(rootPkgPath)) {
|
|
414
415
|
try {
|
|
415
|
-
const
|
|
416
|
-
name =
|
|
417
|
-
const allDeps = { ...
|
|
416
|
+
const pkg4 = JSON.parse(fs3.readFileSync(rootPkgPath, "utf-8"));
|
|
417
|
+
name = pkg4.name;
|
|
418
|
+
const allDeps = { ...pkg4.dependencies, ...pkg4.devDependencies };
|
|
418
419
|
allFrameworks.push(...detectNodeFrameworks(rootPkgPath));
|
|
419
420
|
if (allDeps.typescript || allDeps["@types/node"]) {
|
|
420
421
|
languages.push("TypeScript");
|
|
@@ -428,8 +429,8 @@ function analyzePackageJson(dir) {
|
|
|
428
429
|
for (const pkgPath of matches) {
|
|
429
430
|
allFrameworks.push(...detectNodeFrameworks(pkgPath));
|
|
430
431
|
try {
|
|
431
|
-
const
|
|
432
|
-
const deps = { ...
|
|
432
|
+
const pkg4 = JSON.parse(fs3.readFileSync(pkgPath, "utf-8"));
|
|
433
|
+
const deps = { ...pkg4.dependencies, ...pkg4.devDependencies };
|
|
433
434
|
if (deps.typescript || deps["@types/node"]) {
|
|
434
435
|
languages.push("TypeScript");
|
|
435
436
|
}
|
|
@@ -883,6 +884,62 @@ function ensureGitignore() {
|
|
|
883
884
|
}
|
|
884
885
|
}
|
|
885
886
|
|
|
887
|
+
// src/utils/spinner-messages.ts
|
|
888
|
+
var GENERATION_MESSAGES = [
|
|
889
|
+
"Analyzing your project structure and dependencies...",
|
|
890
|
+
"Mapping out build commands and test workflows...",
|
|
891
|
+
"Reviewing coding patterns and conventions...",
|
|
892
|
+
"Crafting permission rules for safe tool usage...",
|
|
893
|
+
"Designing skills tailored to your codebase...",
|
|
894
|
+
"Evaluating MCP server integrations...",
|
|
895
|
+
"Optimizing settings for your development workflow...",
|
|
896
|
+
"Building coding guidelines from your project style...",
|
|
897
|
+
"Setting up pre-commit hooks and quality gates...",
|
|
898
|
+
"Assembling your complete agent configuration..."
|
|
899
|
+
];
|
|
900
|
+
var REFINE_MESSAGES = [
|
|
901
|
+
"Applying your feedback to the configuration...",
|
|
902
|
+
"Adjusting coding guidelines...",
|
|
903
|
+
"Rebalancing permissions and tool settings...",
|
|
904
|
+
"Refining skills and workflows...",
|
|
905
|
+
"Updating rules to match your preferences...",
|
|
906
|
+
"Finalizing the revised setup..."
|
|
907
|
+
];
|
|
908
|
+
var SpinnerMessages = class {
|
|
909
|
+
spinner;
|
|
910
|
+
messages;
|
|
911
|
+
index = 0;
|
|
912
|
+
timer = null;
|
|
913
|
+
constructor(spinner, messages) {
|
|
914
|
+
this.spinner = spinner;
|
|
915
|
+
this.messages = messages;
|
|
916
|
+
}
|
|
917
|
+
start() {
|
|
918
|
+
this.index = 0;
|
|
919
|
+
this.spinner.text = this.messages[0];
|
|
920
|
+
this.timer = setInterval(() => {
|
|
921
|
+
this.index = (this.index + 1) % this.messages.length;
|
|
922
|
+
this.spinner.text = this.messages[this.index];
|
|
923
|
+
}, 3e3);
|
|
924
|
+
}
|
|
925
|
+
handleServerStatus(status) {
|
|
926
|
+
this.spinner.text = status;
|
|
927
|
+
if (this.timer) {
|
|
928
|
+
clearInterval(this.timer);
|
|
929
|
+
this.timer = setInterval(() => {
|
|
930
|
+
this.index = (this.index + 1) % this.messages.length;
|
|
931
|
+
this.spinner.text = this.messages[this.index];
|
|
932
|
+
}, 3e3);
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
stop() {
|
|
936
|
+
if (this.timer) {
|
|
937
|
+
clearInterval(this.timer);
|
|
938
|
+
this.timer = null;
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
};
|
|
942
|
+
|
|
886
943
|
// src/commands/init.ts
|
|
887
944
|
async function initCommand(options) {
|
|
888
945
|
console.log(chalk2.bold.hex("#6366f1")(`
|
|
@@ -953,6 +1010,8 @@ async function initCommand(options) {
|
|
|
953
1010
|
trackEvent("generation_started", { target_agent: targetAgent });
|
|
954
1011
|
const generationStart = Date.now();
|
|
955
1012
|
const genSpinner = ora2("Generating setup...").start();
|
|
1013
|
+
const genMessages = new SpinnerMessages(genSpinner, GENERATION_MESSAGES);
|
|
1014
|
+
genMessages.start();
|
|
956
1015
|
await apiStream(
|
|
957
1016
|
"/api/setups/generate",
|
|
958
1017
|
{
|
|
@@ -967,13 +1026,15 @@ async function initCommand(options) {
|
|
|
967
1026
|
setupExplanation = payload.explanation;
|
|
968
1027
|
},
|
|
969
1028
|
(error) => {
|
|
1029
|
+
genMessages.stop();
|
|
970
1030
|
trackEvent("error_occurred", { error_type: "generation_failed", error_message: error });
|
|
971
1031
|
genSpinner.fail(`Generation error: ${error}`);
|
|
972
1032
|
},
|
|
973
1033
|
(status) => {
|
|
974
|
-
|
|
1034
|
+
genMessages.handleServerStatus(status);
|
|
975
1035
|
}
|
|
976
1036
|
);
|
|
1037
|
+
genMessages.stop();
|
|
977
1038
|
if (!generatedSetup) {
|
|
978
1039
|
genSpinner.fail("Failed to generate setup.");
|
|
979
1040
|
process.exit(1);
|
|
@@ -1079,6 +1140,8 @@ async function refineLoop(currentSetup, _targetAgent) {
|
|
|
1079
1140
|
trackEvent("refinement_message_sent", { refinement_round: refinementRound });
|
|
1080
1141
|
let refined = null;
|
|
1081
1142
|
const refineSpinner = ora2("Refining setup...").start();
|
|
1143
|
+
const refineMessages = new SpinnerMessages(refineSpinner, REFINE_MESSAGES);
|
|
1144
|
+
refineMessages.start();
|
|
1082
1145
|
await apiStream(
|
|
1083
1146
|
"/api/setups/refine",
|
|
1084
1147
|
{ currentSetup, message, conversationHistory: history },
|
|
@@ -1088,12 +1151,14 @@ async function refineLoop(currentSetup, _targetAgent) {
|
|
|
1088
1151
|
refined = payload.setup;
|
|
1089
1152
|
},
|
|
1090
1153
|
(error) => {
|
|
1154
|
+
refineMessages.stop();
|
|
1091
1155
|
refineSpinner.fail(`Refinement error: ${error}`);
|
|
1092
1156
|
},
|
|
1093
1157
|
(status) => {
|
|
1094
|
-
|
|
1158
|
+
refineMessages.handleServerStatus(status);
|
|
1095
1159
|
}
|
|
1096
1160
|
);
|
|
1161
|
+
refineMessages.stop();
|
|
1097
1162
|
if (refined) {
|
|
1098
1163
|
currentSetup = refined;
|
|
1099
1164
|
history.push({ role: "user", content: message });
|
|
@@ -1299,6 +1364,8 @@ async function updateCommand(options) {
|
|
|
1299
1364
|
trackEvent("generation_started", { target_agent: "both" });
|
|
1300
1365
|
const generationStart = Date.now();
|
|
1301
1366
|
const genSpinner = ora4("Regenerating setup...").start();
|
|
1367
|
+
const genMessages = new SpinnerMessages(genSpinner, GENERATION_MESSAGES);
|
|
1368
|
+
genMessages.start();
|
|
1302
1369
|
await apiStream(
|
|
1303
1370
|
"/api/setups/generate",
|
|
1304
1371
|
{
|
|
@@ -1311,13 +1378,15 @@ async function updateCommand(options) {
|
|
|
1311
1378
|
generatedSetup = payload.setup;
|
|
1312
1379
|
},
|
|
1313
1380
|
(error) => {
|
|
1381
|
+
genMessages.stop();
|
|
1314
1382
|
trackEvent("error_occurred", { error_type: "generation_failed", error_message: error });
|
|
1315
1383
|
genSpinner.fail(`Generation error: ${error}`);
|
|
1316
1384
|
},
|
|
1317
1385
|
(status) => {
|
|
1318
|
-
|
|
1386
|
+
genMessages.handleServerStatus(status);
|
|
1319
1387
|
}
|
|
1320
1388
|
);
|
|
1389
|
+
genMessages.stop();
|
|
1321
1390
|
if (!generatedSetup) {
|
|
1322
1391
|
genSpinner.fail("Failed to regenerate setup.");
|
|
1323
1392
|
process.exit(1);
|
|
@@ -1367,8 +1436,11 @@ function logoutCommand() {
|
|
|
1367
1436
|
}
|
|
1368
1437
|
|
|
1369
1438
|
// src/cli.ts
|
|
1439
|
+
var pkg2 = JSON.parse(
|
|
1440
|
+
fs12.readFileSync(new URL("../package.json", import.meta.url), "utf-8")
|
|
1441
|
+
);
|
|
1370
1442
|
var program = new Command();
|
|
1371
|
-
program.name("caliber").description("Configure your coding agent environment").version(
|
|
1443
|
+
program.name("caliber").description("Configure your coding agent environment").version(pkg2.version);
|
|
1372
1444
|
program.command("init").description("Initialize coding agent setup for this project").option("--agent <type>", "Target agent: claude, cursor, or both").option("--dry-run", "Preview changes without writing files").option("--force", "Overwrite existing setup without prompting").action(initCommand);
|
|
1373
1445
|
program.command("undo").description("Revert all config changes made by Caliber").action(undoCommand);
|
|
1374
1446
|
program.command("status").description("Show current Caliber setup status").option("--json", "Output as JSON").action(statusCommand);
|
|
@@ -1376,6 +1448,85 @@ program.command("update").description("Re-analyze project and update setup").opt
|
|
|
1376
1448
|
program.command("login").description("Authenticate with Caliber").action(loginCommand);
|
|
1377
1449
|
program.command("logout").description("Clear stored credentials").action(logoutCommand);
|
|
1378
1450
|
|
|
1451
|
+
// src/utils/version-check.ts
|
|
1452
|
+
import fs13 from "fs";
|
|
1453
|
+
import readline3 from "readline";
|
|
1454
|
+
import { execSync as execSync2 } from "child_process";
|
|
1455
|
+
import chalk7 from "chalk";
|
|
1456
|
+
import ora5 from "ora";
|
|
1457
|
+
var pkg3 = JSON.parse(
|
|
1458
|
+
fs13.readFileSync(new URL("../package.json", import.meta.url), "utf-8")
|
|
1459
|
+
);
|
|
1460
|
+
function promptYesNo(question) {
|
|
1461
|
+
const rl = readline3.createInterface({ input: process.stdin, output: process.stdout });
|
|
1462
|
+
return new Promise((resolve) => {
|
|
1463
|
+
rl.question(chalk7.cyan(`${question} `), (answer) => {
|
|
1464
|
+
rl.close();
|
|
1465
|
+
const normalized = answer.trim().toLowerCase();
|
|
1466
|
+
resolve(normalized === "" || normalized === "y" || normalized === "yes");
|
|
1467
|
+
});
|
|
1468
|
+
});
|
|
1469
|
+
}
|
|
1470
|
+
async function checkForUpdates() {
|
|
1471
|
+
try {
|
|
1472
|
+
const controller = new AbortController();
|
|
1473
|
+
const timeout = setTimeout(() => controller.abort(), 2e3);
|
|
1474
|
+
const res = await fetch("https://registry.npmjs.org/@caliber-ai/cli/latest", {
|
|
1475
|
+
signal: controller.signal
|
|
1476
|
+
});
|
|
1477
|
+
clearTimeout(timeout);
|
|
1478
|
+
if (!res.ok) return;
|
|
1479
|
+
const data = await res.json();
|
|
1480
|
+
const latest = data.version;
|
|
1481
|
+
if (!latest) return;
|
|
1482
|
+
const current = pkg3.version;
|
|
1483
|
+
if (current === latest) return;
|
|
1484
|
+
const isInteractive = process.stdin.isTTY === true;
|
|
1485
|
+
if (!isInteractive) {
|
|
1486
|
+
console.log(
|
|
1487
|
+
chalk7.yellow(
|
|
1488
|
+
`
|
|
1489
|
+
Update available: ${current} -> ${latest}
|
|
1490
|
+
Run ${chalk7.bold("npm install -g @caliber-ai/cli")} to upgrade.
|
|
1491
|
+
`
|
|
1492
|
+
)
|
|
1493
|
+
);
|
|
1494
|
+
return;
|
|
1495
|
+
}
|
|
1496
|
+
console.log(
|
|
1497
|
+
chalk7.yellow(`
|
|
1498
|
+
Update available: ${current} -> ${latest}`)
|
|
1499
|
+
);
|
|
1500
|
+
const shouldUpdate = await promptYesNo("Would you like to update now? (Y/n)");
|
|
1501
|
+
if (!shouldUpdate) {
|
|
1502
|
+
console.log();
|
|
1503
|
+
return;
|
|
1504
|
+
}
|
|
1505
|
+
const spinner = ora5("Updating @caliber-ai/cli...").start();
|
|
1506
|
+
try {
|
|
1507
|
+
execSync2("npm install -g @caliber-ai/cli", { stdio: "pipe" });
|
|
1508
|
+
spinner.succeed(chalk7.green(`Updated to ${latest}`));
|
|
1509
|
+
const args = process.argv.slice(2);
|
|
1510
|
+
console.log(chalk7.dim(`
|
|
1511
|
+
Restarting: caliber ${args.join(" ")}
|
|
1512
|
+
`));
|
|
1513
|
+
execSync2(`caliber ${args.map((a) => JSON.stringify(a)).join(" ")}`, {
|
|
1514
|
+
stdio: "inherit"
|
|
1515
|
+
});
|
|
1516
|
+
process.exit(0);
|
|
1517
|
+
} catch {
|
|
1518
|
+
spinner.fail("Update failed");
|
|
1519
|
+
console.log(
|
|
1520
|
+
chalk7.yellow(
|
|
1521
|
+
`Run ${chalk7.bold("npm install -g @caliber-ai/cli")} manually to upgrade.
|
|
1522
|
+
`
|
|
1523
|
+
)
|
|
1524
|
+
);
|
|
1525
|
+
}
|
|
1526
|
+
} catch {
|
|
1527
|
+
}
|
|
1528
|
+
}
|
|
1529
|
+
|
|
1379
1530
|
// src/bin.ts
|
|
1380
1531
|
var firstRun = isFirstRun();
|
|
1381
1532
|
getDeviceId();
|
|
@@ -1386,6 +1537,7 @@ var auth = getStoredAuth();
|
|
|
1386
1537
|
if (auth) {
|
|
1387
1538
|
identifyUser(auth.userId, auth.email);
|
|
1388
1539
|
}
|
|
1540
|
+
await checkForUpdates();
|
|
1389
1541
|
process.on("SIGINT", () => process.exit(130));
|
|
1390
1542
|
process.on("SIGTERM", () => process.exit(143));
|
|
1391
1543
|
program.parseAsync().finally(async () => {
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/cli.ts","../src/commands/init.ts","../src/auth/token-store.ts","../src/commands/login.ts","../src/auth/pkce.ts","../src/auth/callback-server.ts","../src/telemetry.ts","../src/fingerprint/index.ts","../src/fingerprint/git.ts","../src/fingerprint/package-json.ts","../src/fingerprint/file-tree.ts","../src/fingerprint/languages.ts","../src/fingerprint/existing-config.ts","../src/api/client.ts","../src/writers/index.ts","../src/writers/claude/index.ts","../src/writers/cursor/index.ts","../src/writers/backup.ts","../src/writers/manifest.ts","../src/commands/undo.ts","../src/commands/status.ts","../src/commands/update.ts","../src/commands/logout.ts","../src/bin.ts"],"sourcesContent":["import path from 'path';\nimport os from 'os';\n\nexport const API_URL = process.env.CALIBER_API_URL || 'https://caliber-backend.up.railway.app';\nexport const FRONTEND_URL = process.env.CALIBER_FRONTEND_URL || 'https://caliber-app.up.railway.app';\nexport const CLI_CALLBACK_PORT = 19284;\nexport const AUTH_DIR = path.join(os.homedir(), '.caliber');\nexport const AUTH_FILE = path.join(AUTH_DIR, 'auth.json');\nexport const CALIBER_DIR = '.caliber';\nexport const MANIFEST_FILE = path.join(CALIBER_DIR, 'manifest.json');\nexport const BACKUPS_DIR = path.join(CALIBER_DIR, 'backups');\n","import { Command } from 'commander';\nimport { initCommand } from './commands/init.js';\nimport { undoCommand } from './commands/undo.js';\nimport { statusCommand } from './commands/status.js';\nimport { updateCommand } from './commands/update.js';\nimport { loginCommand } from './commands/login.js';\nimport { logoutCommand } from './commands/logout.js';\n\nconst program = new Command();\n\nprogram\n .name('caliber')\n .description('Configure your coding agent environment')\n .version('0.1.0');\n\nprogram\n .command('init')\n .description('Initialize coding agent setup for this project')\n .option('--agent <type>', 'Target agent: claude, cursor, or both')\n .option('--dry-run', 'Preview changes without writing files')\n .option('--force', 'Overwrite existing setup without prompting')\n .action(initCommand);\n\nprogram\n .command('undo')\n .description('Revert all config changes made by Caliber')\n .action(undoCommand);\n\nprogram\n .command('status')\n .description('Show current Caliber setup status')\n .option('--json', 'Output as JSON')\n .action(statusCommand);\n\nprogram\n .command('update')\n .description('Re-analyze project and update setup')\n .option('--dry-run', 'Preview changes without writing files')\n .action(updateCommand);\n\nprogram\n .command('login')\n .description('Authenticate with Caliber')\n .action(loginCommand);\n\nprogram\n .command('logout')\n .description('Clear stored credentials')\n .action(logoutCommand);\n\nexport { program };\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport readline from 'readline';\nimport path from 'path';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { loginCommand } from './login.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { apiRequest, apiStream } from '../api/client.js';\nimport { writeSetup } from '../writers/index.js';\nimport { trackEvent, countSuggestedFiles } from '../telemetry.js';\n\ntype TargetAgent = 'claude' | 'cursor' | 'both';\n\ninterface InitOptions {\n agent?: TargetAgent;\n dryRun?: boolean;\n force?: boolean;\n}\n\nexport async function initCommand(options: InitOptions) {\n // Banner\n console.log(chalk.bold.hex('#6366f1')(`\n ██████╗ █████╗ ██╗ ██╗██████╗ ███████╗██████╗\n ██╔════╝██╔══██╗██║ ██║██╔══██╗██╔════╝██╔══██╗\n ██║ ███████║██║ ██║██████╔╝█████╗ ██████╔╝\n ██║ ██╔══██║██║ ██║██╔══██╗██╔══╝ ██╔══██╗\n ╚██████╗██║ ██║███████╗██║██████╔╝███████╗██║ ██║\n ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝╚═════╝ ╚══════╝╚═╝ ╚═╝\n `));\n console.log(chalk.dim(' Configure your coding agent environment\\n'));\n\n // Step 1: Auth check\n let auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.yellow('Not logged in. Starting authentication...\\n'));\n await loginCommand();\n auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Authentication required. Exiting.'));\n process.exit(1);\n }\n }\n console.log(chalk.dim(`Authenticated as ${auth.email}\\n`));\n\n // Step 2: Collect fingerprint\n const spinner = ora('Analyzing project...').start();\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n spinner.succeed('Project analyzed');\n\n trackEvent('scan_completed', {\n languages: fingerprint.languages,\n frameworks: fingerprint.frameworks,\n has_existing_config: !!(fingerprint.existingConfigs.claudeMd || fingerprint.existingConfigs.cursorrules),\n has_claude_md: !!fingerprint.existingConfigs.claudeMd,\n has_claude_settings: !!fingerprint.existingConfigs.claudeSettings,\n has_cursorrules: !!fingerprint.existingConfigs.cursorrules,\n cursor_rules_count: fingerprint.existingConfigs.cursorRules?.length ?? 0,\n skills_count: fingerprint.existingConfigs.claudeSkills?.length ?? 0,\n file_count: fingerprint.fileTree.length,\n });\n\n console.log(chalk.dim(` Languages: ${fingerprint.languages.join(', ') || 'none detected'}`));\n console.log(chalk.dim(` Frameworks: ${fingerprint.frameworks.join(', ') || 'none detected'}`));\n console.log(chalk.dim(` Files: ${fingerprint.fileTree.length} found\\n`));\n\n // Step 3: Check for existing project\n const matchSpinner = ora('Checking for existing setup...').start();\n let existingSetup = null;\n try {\n const match = await apiRequest<{ project: unknown; setup: unknown }>('/api/projects/match', {\n method: 'POST',\n body: { fingerprintHash: hash },\n });\n if (match.setup) {\n existingSetup = match.setup;\n trackEvent('existing_config_detected');\n matchSpinner.succeed('Found existing setup');\n } else {\n matchSpinner.info('No existing setup found');\n }\n } catch {\n matchSpinner.info('No existing setup found');\n }\n\n // Step 4: Determine target agent\n const targetAgent = options.agent || await promptAgent();\n trackEvent('target_agent_selected', { target_agent: targetAgent });\n\n // Step 5: Get project description if empty directory\n const isEmpty = fingerprint.fileTree.length < 3;\n if (isEmpty) {\n fingerprint.description = await promptInput('What will you build in this project?');\n }\n\n // Step 6: Generate setup via AI\n let generatedSetup: Record<string, unknown> | null = null;\n let setupExplanation: string | undefined;\n\n trackEvent('generation_started', { target_agent: targetAgent });\n const generationStart = Date.now();\n\n const genSpinner = ora('Generating setup...').start();\n\n await apiStream(\n '/api/setups/generate',\n {\n fingerprint,\n targetAgent,\n prompt: fingerprint.description,\n },\n () => {},\n (payload) => {\n generatedSetup = payload.setup as Record<string, unknown>;\n setupExplanation = payload.explanation;\n },\n (error) => {\n trackEvent('error_occurred', { error_type: 'generation_failed', error_message: error });\n genSpinner.fail(`Generation error: ${error}`);\n },\n (status) => { genSpinner.text = status; }\n );\n\n if (!generatedSetup) {\n genSpinner.fail('Failed to generate setup.');\n process.exit(1);\n }\n\n trackEvent('generation_completed', {\n target_agent: targetAgent,\n duration_ms: Date.now() - generationStart,\n files_suggested: countSuggestedFiles(generatedSetup),\n });\n\n genSpinner.succeed('Setup generated');\n printSetupSummary(generatedSetup);\n\n // Step 7: Accept / Refine / Explain / Decline\n let action = await promptAction();\n\n while (action === 'explain') {\n if (setupExplanation) {\n console.log(chalk.bold('\\nWhy this setup?\\n'));\n console.log(chalk.dim(setupExplanation));\n console.log('');\n } else {\n console.log(chalk.dim('\\nNo explanation available for this setup.\\n'));\n }\n action = await promptAction();\n }\n\n if (action === 'decline') {\n trackEvent('setup_declined');\n console.log(chalk.dim('Setup declined. No files were modified.'));\n return;\n }\n\n if (action === 'refine') {\n generatedSetup = await refineLoop(generatedSetup, targetAgent);\n if (!generatedSetup) {\n trackEvent('generation_cancelled');\n console.log(chalk.dim('Refinement cancelled. No files were modified.'));\n return;\n }\n }\n\n // Step 8: Write files\n if (options.dryRun) {\n console.log(chalk.yellow('\\n[Dry run] Would write the following files:'));\n console.log(JSON.stringify(generatedSetup, null, 2));\n return;\n }\n\n const writeSpinner = ora('Writing config files...').start();\n try {\n const result = writeSetup(generatedSetup as Parameters<typeof writeSetup>[0]);\n writeSpinner.succeed('Config files written');\n\n trackEvent('setup_applied', { files_written: result.written.length, target_agent: targetAgent });\n for (const file of result.written) {\n trackEvent('config_file_written', { file_type: path.extname(file) || path.basename(file) });\n }\n\n console.log(chalk.bold('\\nFiles created/updated:'));\n for (const file of result.written) {\n console.log(` ${chalk.green('✓')} ${file}`);\n }\n if (result.backupDir) {\n console.log(chalk.dim(`\\n Backups saved to ${result.backupDir}`));\n }\n } catch (err) {\n writeSpinner.fail('Failed to write files');\n console.error(chalk.red(err instanceof Error ? err.message : 'Unknown error'));\n process.exit(1);\n }\n\n // Step 9: Save to server\n try {\n const project = await apiRequest<{ id: string }>('/api/projects', {\n method: 'POST',\n body: {\n fingerprintHash: hash,\n name: fingerprint.packageName || 'untitled',\n gitRemoteUrl: fingerprint.gitRemoteUrl,\n description: fingerprint.description,\n },\n });\n\n trackEvent('project_created', { project_name: fingerprint.packageName || 'untitled' });\n\n await apiRequest(`/api/setups/project/${project.id}`, {\n method: 'POST',\n body: {\n targetAgent,\n config: generatedSetup,\n isMaster: true,\n },\n });\n } catch (err) {\n console.log(chalk.yellow(`\\n Warning: Could not save project to server.`));\n console.log(chalk.dim(` ${err instanceof Error ? err.message : String(err)}`));\n console.log(chalk.dim(` Your local setup is unaffected.\\n`));\n }\n\n console.log(chalk.bold.green('\\nSetup complete! Your coding agent is now configured.'));\n console.log(chalk.dim('Run `caliber undo` to revert changes.\\n'));\n}\n\nasync function refineLoop(\n currentSetup: Record<string, unknown>,\n _targetAgent: string\n): Promise<Record<string, unknown> | null> {\n const history: Array<{ role: 'user' | 'assistant'; content: string }> = [];\n let refinementRound = 0;\n\n while (true) {\n const message = await promptInput('\\nWhat would you like to change?');\n if (!message || message.toLowerCase() === 'done' || message.toLowerCase() === 'accept') {\n return currentSetup;\n }\n if (message.toLowerCase() === 'cancel') {\n return null;\n }\n\n refinementRound++;\n trackEvent('refinement_message_sent', { refinement_round: refinementRound });\n\n let refined: Record<string, unknown> | null = null;\n const refineSpinner = ora('Refining setup...').start();\n\n await apiStream(\n '/api/setups/refine',\n { currentSetup, message, conversationHistory: history },\n () => {},\n (payload) => { refined = payload.setup as Record<string, unknown>; },\n (error) => { refineSpinner.fail(`Refinement error: ${error}`); },\n (status) => { refineSpinner.text = status; }\n );\n\n if (refined) {\n currentSetup = refined;\n history.push({ role: 'user', content: message });\n history.push({ role: 'assistant', content: JSON.stringify(refined) });\n refineSpinner.succeed('Setup updated');\n printSetupSummary(refined);\n console.log(chalk.dim('Type \"done\" to accept, or describe more changes.'));\n }\n }\n}\n\nfunction promptInput(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(chalk.cyan(`${question} `), (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction promptAgent(): Promise<TargetAgent> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n console.log(chalk.bold('Which coding agent are you using?'));\n console.log(' 1. Claude Code');\n console.log(' 2. Cursor');\n console.log(' 3. Both');\n rl.question(chalk.cyan('\\nChoose (1-3): '), (answer) => {\n rl.close();\n const map: Record<string, TargetAgent> = { '1': 'claude', '2': 'cursor', '3': 'both' };\n resolve(map[answer.trim()] || 'claude');\n });\n });\n}\n\nfunction promptAction(): Promise<'accept' | 'refine' | 'explain' | 'decline'> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n console.log(chalk.bold('What would you like to do?'));\n console.log(' 1. Accept and apply');\n console.log(' 2. Refine via chat');\n console.log(' 3. Explain recommendations');\n console.log(' 4. Decline');\n rl.question(chalk.cyan('\\nChoose (1-4): '), (answer) => {\n rl.close();\n const map: Record<string, 'accept' | 'refine' | 'explain' | 'decline'> = {\n '1': 'accept', '2': 'refine', '3': 'explain', '4': 'decline',\n };\n resolve(map[answer.trim()] || 'accept');\n });\n });\n}\n\nfunction printSetupSummary(setup: Record<string, unknown>) {\n const claude = setup.claude as Record<string, unknown> | undefined;\n const cursor = setup.cursor as Record<string, unknown> | undefined;\n\n console.log('');\n\n if (claude) {\n if (claude.claudeMd) {\n console.log(` ${chalk.green('+')} CLAUDE.md ${chalk.dim('— project guidelines, commands, conventions')}`);\n }\n if (claude.settings) {\n console.log(` ${chalk.green('+')} .claude/settings.json ${chalk.dim('— tool permissions & hooks')}`);\n }\n if (claude.settingsLocal) {\n console.log(` ${chalk.green('+')} .claude/settings.local.json ${chalk.dim('— local dev permissions')}`);\n }\n\n const skills = claude.skills as Array<{ name: string; content: string }> | undefined;\n if (Array.isArray(skills) && skills.length > 0) {\n console.log(` ${chalk.green('+')} ${skills.length} skill${skills.length > 1 ? 's' : ''}:`);\n for (const skill of skills) {\n console.log(` ${chalk.dim('•')} ${skill.name}`);\n }\n }\n\n const mcpServers = claude.mcpServers as Record<string, unknown> | undefined;\n if (mcpServers && Object.keys(mcpServers).length > 0) {\n const names = Object.keys(mcpServers);\n console.log(` ${chalk.green('+')} ${names.length} MCP server${names.length > 1 ? 's' : ''}:`);\n for (const name of names) {\n console.log(` ${chalk.dim('•')} ${name}`);\n }\n }\n }\n\n if (cursor) {\n if (cursor.cursorrules) {\n console.log(` ${chalk.green('+')} .cursorrules ${chalk.dim('— coding rules for Cursor')}`);\n }\n\n const rules = cursor.rules as Array<{ filename: string }> | undefined;\n if (Array.isArray(rules) && rules.length > 0) {\n console.log(` ${chalk.green('+')} ${rules.length} Cursor rule${rules.length > 1 ? 's' : ''}:`);\n for (const rule of rules) {\n console.log(` ${chalk.dim('•')} ${rule.filename}`);\n }\n }\n\n const mcpServers = cursor.mcpServers as Record<string, unknown> | undefined;\n if (mcpServers && Object.keys(mcpServers).length > 0) {\n const names = Object.keys(mcpServers);\n console.log(` ${chalk.green('+')} ${names.length} MCP server${names.length > 1 ? 's' : ''}:`);\n for (const name of names) {\n console.log(` ${chalk.dim('•')} ${name}`);\n }\n }\n }\n\n console.log('');\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { AUTH_DIR, AUTH_FILE } from '../constants.js';\n\ninterface StoredAuth {\n accessToken: string;\n refreshToken: string;\n expiresAt: number;\n userId: string;\n email: string;\n}\n\nexport function getStoredAuth(): StoredAuth | null {\n try {\n if (!fs.existsSync(AUTH_FILE)) return null;\n const data = JSON.parse(fs.readFileSync(AUTH_FILE, 'utf-8'));\n return data as StoredAuth;\n } catch {\n return null;\n }\n}\n\nexport function storeAuth(auth: {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n user: { id: string; email: string };\n}) {\n if (!fs.existsSync(AUTH_DIR)) {\n fs.mkdirSync(AUTH_DIR, { recursive: true });\n }\n\n const data: StoredAuth = {\n accessToken: auth.accessToken,\n refreshToken: auth.refreshToken,\n expiresAt: Date.now() + auth.expiresIn * 1000,\n userId: auth.user.id,\n email: auth.user.email,\n };\n\n fs.writeFileSync(AUTH_FILE, JSON.stringify(data, null, 2), { mode: 0o600 });\n}\n\nexport function clearAuth() {\n try {\n if (fs.existsSync(AUTH_FILE)) fs.unlinkSync(AUTH_FILE);\n } catch {\n // ignore\n }\n}\n\nexport function isTokenExpired(): boolean {\n const auth = getStoredAuth();\n if (!auth) return true;\n return Date.now() >= auth.expiresAt - 60_000; // 1 min buffer\n}\n","import open from 'open';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { generatePKCE } from '../auth/pkce.js';\nimport { startCallbackServer } from '../auth/callback-server.js';\nimport { storeAuth, getStoredAuth } from '../auth/token-store.js';\nimport { FRONTEND_URL, CLI_CALLBACK_PORT } from '../constants.js';\nimport { identifyUser, trackEvent } from '../telemetry.js';\n\nexport async function loginCommand() {\n const existing = getStoredAuth();\n if (existing) {\n console.log(chalk.dim(`Already logged in as ${existing.email}`));\n console.log(chalk.dim('Run `caliber logout` first to switch accounts.'));\n return;\n }\n\n const { state } = generatePKCE();\n const redirectUri = `http://127.0.0.1:${CLI_CALLBACK_PORT}/callback`;\n\n const authUrl = `${FRONTEND_URL}/auth/cli?redirect_uri=${encodeURIComponent(redirectUri)}&state=${state}`;\n\n console.log(chalk.bold('\\nOpening browser for authentication...\\n'));\n console.log(chalk.dim(`If the browser doesn't open, visit:\\n${authUrl}\\n`));\n\n const serverPromise = startCallbackServer(state);\n\n await open(authUrl);\n\n const spinner = ora('Waiting for authentication...').start();\n\n try {\n const result = await serverPromise;\n\n storeAuth({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n expiresIn: result.expiresIn,\n user: result.user,\n });\n\n identifyUser(result.user.id, result.user.email);\n trackEvent('signin', { method: 'cli_pkce' });\n\n spinner.succeed(chalk.green(`Logged in as ${result.user.email}`));\n } catch (err) {\n spinner.fail(chalk.red(`Authentication failed: ${err instanceof Error ? err.message : 'Unknown error'}`));\n process.exit(1);\n }\n}\n","import crypto from 'crypto';\n\nexport function generatePKCE() {\n const verifier = crypto.randomBytes(32).toString('base64url');\n const challenge = crypto\n .createHash('sha256')\n .update(verifier)\n .digest('base64url');\n const state = crypto.randomBytes(16).toString('hex');\n\n return { verifier, challenge, state };\n}\n","import http from 'http';\nimport { URL } from 'url';\nimport { CLI_CALLBACK_PORT } from '../constants.js';\n\nexport interface CallbackResult {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n user: {\n id: string;\n email: string;\n };\n}\n\nexport function startCallbackServer(expectedState: string): Promise<CallbackResult> {\n return new Promise((resolve, reject) => {\n const server = http.createServer((req, res) => {\n if (!req.url?.startsWith('/callback')) {\n res.writeHead(404);\n res.end();\n return;\n }\n\n const url = new URL(req.url, `http://127.0.0.1:${CLI_CALLBACK_PORT}`);\n const error = url.searchParams.get('error');\n\n if (error) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end('<html><body><h2>Authentication failed</h2><p>You can close this tab.</p></body></html>');\n server.close();\n reject(new Error(`Auth failed: ${error}`));\n return;\n }\n\n const state = url.searchParams.get('state');\n const accessToken = url.searchParams.get('access_token');\n const refreshToken = url.searchParams.get('refresh_token');\n const expiresIn = url.searchParams.get('expires_in');\n const userId = url.searchParams.get('user_id');\n const email = url.searchParams.get('email');\n\n if (!accessToken || !refreshToken || !userId || state !== expectedState) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end('<html><body><h2>Invalid callback</h2></body></html>');\n server.close();\n reject(new Error('Invalid callback: missing token data or state mismatch'));\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`<html><body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #09090b; color: #fafafa;\">\n <div style=\"text-align: center;\">\n <h2 style=\"color: #6366f1;\">Authentication successful!</h2>\n <p>You can close this tab and return to your terminal.</p>\n </div>\n </body></html>`);\n\n server.close();\n resolve({\n accessToken,\n refreshToken,\n expiresIn: parseInt(expiresIn || '3600', 10),\n user: { id: userId, email: email || '' },\n });\n });\n\n server.listen(CLI_CALLBACK_PORT, '127.0.0.1', () => {\n // Server ready\n });\n\n server.on('error', (err) => {\n reject(new Error(`Failed to start callback server: ${err.message}`));\n });\n\n setTimeout(() => {\n server.close();\n reject(new Error('Authentication timed out'));\n }, 5 * 60 * 1000);\n });\n}\n","import { PostHog } from 'posthog-node';\nimport fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { randomUUID } from 'crypto';\nimport { AUTH_DIR } from './constants.js';\nimport { getStoredAuth } from './auth/token-store.js';\n\nconst POSTHOG_API_KEY = process.env.CALIBER_POSTHOG_KEY || 'phc_XXrV0pSX4s2QVxVoOaeuyXDvtlRwPAjovt1ttMGVMPp';\nconst DEVICE_ID_FILE = path.join(AUTH_DIR, 'device-id');\n\nlet client: PostHog | null = null;\n\nfunction getClient(): PostHog {\n if (!client) {\n client = new PostHog(POSTHOG_API_KEY, { flushAt: 1, flushInterval: 0 });\n }\n return client;\n}\n\nexport function getDeviceId(): string {\n try {\n if (fs.existsSync(DEVICE_ID_FILE)) {\n return fs.readFileSync(DEVICE_ID_FILE, 'utf-8').trim();\n }\n } catch {}\n\n const id = randomUUID();\n try {\n if (!fs.existsSync(AUTH_DIR)) {\n fs.mkdirSync(AUTH_DIR, { recursive: true });\n }\n fs.writeFileSync(DEVICE_ID_FILE, id, { mode: 0o600 });\n } catch {}\n return id;\n}\n\nexport function isFirstRun(): boolean {\n return !fs.existsSync(DEVICE_ID_FILE);\n}\n\nexport function getDistinctId(): string {\n const auth = getStoredAuth();\n return auth?.userId || getDeviceId();\n}\n\nconst pkg = JSON.parse(\n fs.readFileSync(new URL('../package.json', import.meta.url), 'utf-8')\n);\n\nfunction baseProperties() {\n return {\n source: 'cli',\n cli_version: pkg.version,\n os: os.platform(),\n };\n}\n\nexport function trackEvent(event: string, properties: Record<string, unknown> = {}) {\n try {\n getClient().capture({\n distinctId: getDistinctId(),\n event,\n properties: { ...baseProperties(), ...properties },\n });\n } catch {}\n}\n\nexport function identifyUser(userId: string, email: string) {\n try {\n const ph = getClient();\n const deviceId = getDeviceId();\n\n ph.identify({ distinctId: userId, properties: { email, source: 'cli' } });\n\n if (deviceId !== userId) {\n ph.alias({ distinctId: userId, alias: deviceId });\n }\n } catch {}\n}\n\nexport function countSuggestedFiles(setup: Record<string, unknown>): number {\n let count = 0;\n const claude = setup.claude as Record<string, unknown> | undefined;\n const cursor = setup.cursor as Record<string, unknown> | undefined;\n if (claude) {\n if (claude.claudeMd) count++;\n if (claude.settings) count++;\n if (claude.settingsLocal) count++;\n if (Array.isArray(claude.skills)) count += claude.skills.length;\n if (claude.mcpServers && Object.keys(claude.mcpServers as object).length > 0) count++;\n }\n if (cursor) {\n if (cursor.cursorrules) count++;\n if (Array.isArray(cursor.rules)) count += cursor.rules.length;\n if (cursor.mcpServers && Object.keys(cursor.mcpServers as object).length > 0) count++;\n }\n return count;\n}\n\nexport async function shutdownTelemetry() {\n try {\n await Promise.race([\n client?.shutdown(),\n new Promise((resolve) => setTimeout(resolve, 2000)),\n ]);\n } catch {}\n}\n","import crypto from 'crypto';\nimport { getGitRemoteUrl } from './git.js';\nimport { analyzePackageJson } from './package-json.js';\nimport { getFileTree } from './file-tree.js';\nimport { detectLanguages } from './languages.js';\nimport { readExistingConfigs } from './existing-config.js';\n\nexport interface Fingerprint {\n gitRemoteUrl?: string;\n packageName?: string;\n languages: string[];\n frameworks: string[];\n fileTree: string[];\n existingConfigs: ReturnType<typeof readExistingConfigs>;\n description?: string;\n}\n\nexport function collectFingerprint(dir: string): Fingerprint {\n const gitRemoteUrl = getGitRemoteUrl();\n const pkgInfo = analyzePackageJson(dir);\n const fileTree = getFileTree(dir);\n const fileLangs = detectLanguages(fileTree);\n const existingConfigs = readExistingConfigs(dir);\n\n const languages = [...new Set([...pkgInfo.languages, ...fileLangs])];\n\n return {\n gitRemoteUrl,\n packageName: pkgInfo.name,\n languages,\n frameworks: pkgInfo.frameworks,\n fileTree,\n existingConfigs,\n };\n}\n\nexport function computeFingerprintHash(fingerprint: Fingerprint): string {\n const key = [\n fingerprint.gitRemoteUrl || '',\n fingerprint.packageName || '',\n ].join('::');\n\n return crypto.createHash('sha256').update(key).digest('hex');\n}\n","import { execSync } from 'child_process';\n\nexport function getGitRemoteUrl(): string | undefined {\n try {\n return execSync('git remote get-url origin', { encoding: 'utf-8' }).trim();\n } catch {\n return undefined;\n }\n}\n\nexport function isGitRepo(): boolean {\n try {\n execSync('git rev-parse --is-inside-work-tree', { encoding: 'utf-8' });\n return true;\n } catch {\n return false;\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { globSync } from 'glob';\n\ninterface PackageInfo {\n name?: string;\n frameworks: string[];\n languages: string[];\n}\n\nconst NODE_FRAMEWORK_DEPS: Record<string, string> = {\n react: 'React',\n next: 'Next.js',\n vue: 'Vue',\n nuxt: 'Nuxt',\n svelte: 'Svelte',\n '@sveltejs/kit': 'SvelteKit',\n angular: 'Angular',\n '@angular/core': 'Angular',\n express: 'Express',\n fastify: 'Fastify',\n hono: 'Hono',\n nestjs: 'NestJS',\n '@nestjs/core': 'NestJS',\n tailwindcss: 'Tailwind CSS',\n prisma: 'Prisma',\n drizzle: 'Drizzle',\n 'drizzle-orm': 'Drizzle',\n '@supabase/supabase-js': 'Supabase',\n mongoose: 'MongoDB',\n typeorm: 'TypeORM',\n sequelize: 'Sequelize',\n 'better-auth': 'Better Auth',\n};\n\nconst PYTHON_FRAMEWORK_DEPS: Record<string, string> = {\n fastapi: 'FastAPI',\n django: 'Django',\n flask: 'Flask',\n sqlalchemy: 'SQLAlchemy',\n pydantic: 'Pydantic',\n celery: 'Celery',\n pytest: 'pytest',\n uvicorn: 'Uvicorn',\n starlette: 'Starlette',\n httpx: 'HTTPX',\n alembic: 'Alembic',\n tortoise: 'Tortoise ORM',\n 'google-cloud-pubsub': 'Google Pub/Sub',\n stripe: 'Stripe',\n redis: 'Redis',\n};\n\nconst WORKSPACE_GLOBS = [\n 'apps/*/package.json',\n 'packages/*/package.json',\n 'services/*/package.json',\n 'libs/*/package.json',\n];\n\nfunction detectNodeFrameworks(pkgPath: string): string[] {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n const frameworks: string[] = [];\n for (const [dep, framework] of Object.entries(NODE_FRAMEWORK_DEPS)) {\n if (allDeps[dep]) frameworks.push(framework);\n }\n return frameworks;\n } catch {\n return [];\n }\n}\n\nfunction detectPythonFrameworks(dir: string): string[] {\n const frameworks: string[] = [];\n const candidates = [\n path.join(dir, 'pyproject.toml'),\n path.join(dir, 'requirements.txt'),\n ...globSync('apps/*/pyproject.toml', { cwd: dir, absolute: true }),\n ...globSync('apps/*/requirements.txt', { cwd: dir, absolute: true }),\n ...globSync('services/*/pyproject.toml', { cwd: dir, absolute: true }),\n ];\n\n for (const filePath of candidates) {\n if (!fs.existsSync(filePath)) continue;\n try {\n const content = fs.readFileSync(filePath, 'utf-8').toLowerCase();\n for (const [dep, framework] of Object.entries(PYTHON_FRAMEWORK_DEPS)) {\n if (content.includes(dep)) frameworks.push(framework);\n }\n } catch {}\n }\n\n return frameworks;\n}\n\nexport function analyzePackageJson(dir: string): PackageInfo {\n const rootPkgPath = path.join(dir, 'package.json');\n let name: string | undefined;\n const allFrameworks: string[] = [];\n const languages: string[] = [];\n\n if (fs.existsSync(rootPkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(rootPkgPath, 'utf-8'));\n name = pkg.name;\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n allFrameworks.push(...detectNodeFrameworks(rootPkgPath));\n\n if (allDeps.typescript || allDeps['@types/node']) {\n languages.push('TypeScript');\n }\n languages.push('JavaScript');\n } catch {}\n }\n\n for (const glob of WORKSPACE_GLOBS) {\n const matches = globSync(glob, { cwd: dir, absolute: true });\n for (const pkgPath of matches) {\n allFrameworks.push(...detectNodeFrameworks(pkgPath));\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (deps.typescript || deps['@types/node']) {\n languages.push('TypeScript');\n }\n } catch {}\n }\n }\n\n allFrameworks.push(...detectPythonFrameworks(dir));\n\n return {\n name,\n frameworks: [...new Set(allFrameworks)],\n languages: [...new Set(languages)],\n };\n}\n","import fs from 'fs';\nimport path from 'path';\n\nconst IGNORE_DIRS = new Set([\n 'node_modules', '.git', '.next', 'dist', 'build', '.cache',\n '.turbo', 'coverage', '.caliber', '__pycache__', '.venv',\n 'vendor', 'target',\n]);\n\nexport function getFileTree(dir: string, maxDepth = 3): string[] {\n const files: string[] = [];\n scan(dir, '', 0, maxDepth, files);\n return files;\n}\n\nfunction scan(base: string, rel: string, depth: number, maxDepth: number, result: string[]) {\n if (depth > maxDepth) return;\n\n const fullPath = path.join(base, rel);\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(fullPath, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (entry.name.startsWith('.') && depth === 0 && entry.isDirectory()) continue;\n if (IGNORE_DIRS.has(entry.name)) continue;\n\n const relPath = rel ? `${rel}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n result.push(`${relPath}/`);\n scan(base, relPath, depth + 1, maxDepth, result);\n } else {\n result.push(relPath);\n }\n }\n}\n","import path from 'path';\n\nconst EXT_TO_LANG: Record<string, string> = {\n '.ts': 'TypeScript',\n '.tsx': 'TypeScript',\n '.js': 'JavaScript',\n '.jsx': 'JavaScript',\n '.py': 'Python',\n '.go': 'Go',\n '.rs': 'Rust',\n '.rb': 'Ruby',\n '.java': 'Java',\n '.kt': 'Kotlin',\n '.swift': 'Swift',\n '.cs': 'C#',\n '.cpp': 'C++',\n '.c': 'C',\n '.php': 'PHP',\n '.dart': 'Dart',\n '.ex': 'Elixir',\n '.exs': 'Elixir',\n '.scala': 'Scala',\n '.zig': 'Zig',\n};\n\nexport function detectLanguages(fileTree: string[]): string[] {\n const langs = new Set<string>();\n\n for (const file of fileTree) {\n const ext = path.extname(file).toLowerCase();\n if (EXT_TO_LANG[ext]) {\n langs.add(EXT_TO_LANG[ext]);\n }\n }\n\n return [...langs];\n}\n","import fs from 'fs';\nimport path from 'path';\n\nexport function readExistingConfigs(dir: string) {\n const configs: {\n claudeMd?: string;\n claudeSettings?: Record<string, unknown>;\n claudeSkills?: Array<{ filename: string; content: string }>;\n cursorrules?: string;\n cursorRules?: Array<{ filename: string; content: string }>;\n } = {};\n\n // CLAUDE.md\n const claudeMdPath = path.join(dir, 'CLAUDE.md');\n if (fs.existsSync(claudeMdPath)) {\n configs.claudeMd = fs.readFileSync(claudeMdPath, 'utf-8');\n }\n\n // .claude/settings.json\n const claudeSettingsPath = path.join(dir, '.claude', 'settings.json');\n if (fs.existsSync(claudeSettingsPath)) {\n try {\n configs.claudeSettings = JSON.parse(fs.readFileSync(claudeSettingsPath, 'utf-8'));\n } catch {\n // ignore\n }\n }\n\n // .claude/skills/*.md\n const skillsDir = path.join(dir, '.claude', 'skills');\n if (fs.existsSync(skillsDir)) {\n try {\n const files = fs.readdirSync(skillsDir).filter(f => f.endsWith('.md'));\n configs.claudeSkills = files.map(f => ({\n filename: f,\n content: fs.readFileSync(path.join(skillsDir, f), 'utf-8'),\n }));\n } catch {\n // ignore\n }\n }\n\n // .cursorrules\n const cursorrulesPath = path.join(dir, '.cursorrules');\n if (fs.existsSync(cursorrulesPath)) {\n configs.cursorrules = fs.readFileSync(cursorrulesPath, 'utf-8');\n }\n\n // .cursor/rules/*.mdc\n const cursorRulesDir = path.join(dir, '.cursor', 'rules');\n if (fs.existsSync(cursorRulesDir)) {\n try {\n const files = fs.readdirSync(cursorRulesDir).filter(f => f.endsWith('.mdc'));\n configs.cursorRules = files.map(f => ({\n filename: f,\n content: fs.readFileSync(path.join(cursorRulesDir, f), 'utf-8'),\n }));\n } catch {\n // ignore\n }\n }\n\n return configs;\n}\n","import { getStoredAuth, storeAuth, isTokenExpired } from '../auth/token-store.js';\nimport { API_URL } from '../constants.js';\n\nasync function refreshTokenIfNeeded(): Promise<string | null> {\n const auth = getStoredAuth();\n if (!auth) return null;\n\n if (!isTokenExpired()) return auth.accessToken;\n\n try {\n const resp = await fetch(`${API_URL}/api/auth/refresh`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refreshToken: auth.refreshToken }),\n });\n\n if (!resp.ok) return null;\n\n const { data } = await resp.json();\n storeAuth({\n accessToken: data.accessToken,\n refreshToken: data.refreshToken,\n expiresIn: data.expiresIn,\n user: { id: auth.userId, email: auth.email },\n });\n\n return data.accessToken;\n } catch {\n return null;\n }\n}\n\nexport async function apiRequest<T = unknown>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n } = {}\n): Promise<T> {\n const token = await refreshTokenIfNeeded();\n if (!token) {\n throw new Error('Not authenticated. Run `caliber login` first.');\n }\n\n const resp = await fetch(`${API_URL}${path}`, {\n method: options.method || 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (!resp.ok) {\n const error = await resp.json().catch(() => ({ error: resp.statusText }));\n throw new Error(error.error || `API error: ${resp.status}`);\n }\n\n const json = await resp.json();\n return json.data as T;\n}\n\nexport interface StreamCompletePayload {\n setup: unknown;\n explanation?: string;\n}\n\nexport async function apiStream(\n path: string,\n body: unknown,\n onChunk: (text: string) => void,\n onComplete: (payload: StreamCompletePayload) => void,\n onError: (error: string) => void,\n onStatus?: (message: string) => void\n): Promise<void> {\n const token = await refreshTokenIfNeeded();\n if (!token) {\n throw new Error('Not authenticated. Run `caliber login` first.');\n }\n\n const resp = await fetch(`${API_URL}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!resp.ok || !resp.body) {\n throw new Error(`API error: ${resp.status}`);\n }\n\n const reader = resp.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const data = line.slice(6);\n if (data === '[DONE]') return;\n\n try {\n const parsed = JSON.parse(data);\n if (parsed.type === 'chunk') onChunk(parsed.content);\n else if (parsed.type === 'status' && onStatus) onStatus(parsed.message);\n else if (parsed.type === 'complete') onComplete({ setup: parsed.setup, explanation: parsed.explanation });\n else if (parsed.type === 'error') onError(parsed.message);\n } catch {\n // Skip unparseable lines\n }\n }\n }\n}\n","import fs from 'fs';\nimport { writeClaudeConfig } from './claude/index.js';\nimport { writeCursorConfig } from './cursor/index.js';\nimport { createBackup, restoreBackup } from './backup.js';\nimport {\n readManifest,\n writeManifest,\n fileChecksum,\n type Manifest,\n type ManifestEntry,\n} from './manifest.js';\n\ninterface AgentSetup {\n targetAgent: 'claude' | 'cursor' | 'both';\n claude?: Parameters<typeof writeClaudeConfig>[0];\n cursor?: Parameters<typeof writeCursorConfig>[0];\n}\n\nexport function writeSetup(setup: AgentSetup): { written: string[]; backupDir?: string } {\n // Collect all files that will be written\n const filesToWrite = getFilesToWrite(setup);\n\n // Backup existing files\n const existingFiles = filesToWrite.filter(f => fs.existsSync(f));\n const backupDir = existingFiles.length > 0 ? createBackup(existingFiles) : undefined;\n\n const written: string[] = [];\n\n // Write Claude configs\n if ((setup.targetAgent === 'claude' || setup.targetAgent === 'both') && setup.claude) {\n written.push(...writeClaudeConfig(setup.claude));\n }\n\n // Write Cursor configs\n if ((setup.targetAgent === 'cursor' || setup.targetAgent === 'both') && setup.cursor) {\n written.push(...writeCursorConfig(setup.cursor));\n }\n\n // Ensure .caliber/ is in .gitignore\n ensureGitignore();\n\n // Write manifest\n const entries: ManifestEntry[] = written.map(file => ({\n path: file,\n action: existingFiles.includes(file) ? 'modified' as const : 'created' as const,\n checksum: fileChecksum(file),\n timestamp: new Date().toISOString(),\n }));\n\n writeManifest({ version: 1, backupDir, entries });\n\n return { written, backupDir };\n}\n\nexport function undoSetup(): { restored: string[]; removed: string[] } {\n const manifest = readManifest();\n if (!manifest) {\n throw new Error('No manifest found. Nothing to undo.');\n }\n\n const restored: string[] = [];\n const removed: string[] = [];\n\n for (const entry of manifest.entries) {\n if (entry.action === 'created') {\n // Remove files we created\n if (fs.existsSync(entry.path)) {\n fs.unlinkSync(entry.path);\n removed.push(entry.path);\n }\n } else if (entry.action === 'modified' && manifest.backupDir) {\n // Restore from backup\n if (restoreBackup(manifest.backupDir, entry.path)) {\n restored.push(entry.path);\n }\n }\n }\n\n // Clean up manifest\n const { MANIFEST_FILE } = require('../constants.js');\n if (fs.existsSync(MANIFEST_FILE)) {\n fs.unlinkSync(MANIFEST_FILE);\n }\n\n return { restored, removed };\n}\n\nfunction getFilesToWrite(setup: AgentSetup): string[] {\n const files: string[] = [];\n\n if ((setup.targetAgent === 'claude' || setup.targetAgent === 'both') && setup.claude) {\n files.push('CLAUDE.md', '.claude/settings.json', '.claude/settings.local.json');\n if (setup.claude.mcpServers) files.push('.mcp.json');\n if (setup.claude.skills) {\n for (const s of setup.claude.skills) {\n files.push(`.claude/skills/${s.name.replace(/[^a-z0-9-]/gi, '-').toLowerCase()}.md`);\n }\n }\n }\n\n if ((setup.targetAgent === 'cursor' || setup.targetAgent === 'both') && setup.cursor) {\n if (setup.cursor.cursorrules) files.push('.cursorrules');\n if (setup.cursor.rules) {\n for (const r of setup.cursor.rules) files.push(`.cursor/rules/${r.filename}`);\n }\n if (setup.cursor.mcpServers) files.push('.cursor/mcp.json');\n }\n\n return files;\n}\n\nfunction ensureGitignore() {\n const gitignorePath = '.gitignore';\n if (fs.existsSync(gitignorePath)) {\n const content = fs.readFileSync(gitignorePath, 'utf-8');\n if (!content.includes('.caliber/')) {\n fs.appendFileSync(gitignorePath, '\\n# Caliber local state\\n.caliber/\\n');\n }\n } else {\n fs.writeFileSync(gitignorePath, '# Caliber local state\\n.caliber/\\n');\n }\n}\n","import fs from 'fs';\nimport path from 'path';\n\ninterface ClaudeConfig {\n claudeMd: string;\n settings: {\n permissions: { allow: string[] };\n hooks?: Record<string, Array<{ command: string; description?: string }>>;\n };\n settingsLocal: {\n permissions: { allow: string[] };\n };\n skills?: Array<{ name: string; content: string }>;\n mcpServers?: Record<string, { command: string; args?: string[]; env?: Record<string, string> }>;\n}\n\nexport function writeClaudeConfig(config: ClaudeConfig): string[] {\n const written: string[] = [];\n\n // CLAUDE.md\n fs.writeFileSync('CLAUDE.md', config.claudeMd);\n written.push('CLAUDE.md');\n\n // .claude/settings.json\n const claudeDir = '.claude';\n if (!fs.existsSync(claudeDir)) fs.mkdirSync(claudeDir, { recursive: true });\n\n fs.writeFileSync(\n path.join(claudeDir, 'settings.json'),\n JSON.stringify(config.settings, null, 2)\n );\n written.push(path.join(claudeDir, 'settings.json'));\n\n // .claude/settings.local.json\n fs.writeFileSync(\n path.join(claudeDir, 'settings.local.json'),\n JSON.stringify(config.settingsLocal, null, 2)\n );\n written.push(path.join(claudeDir, 'settings.local.json'));\n\n // Skills\n if (config.skills?.length) {\n const skillsDir = path.join(claudeDir, 'skills');\n if (!fs.existsSync(skillsDir)) fs.mkdirSync(skillsDir, { recursive: true });\n\n for (const skill of config.skills) {\n const filename = `${skill.name.replace(/[^a-z0-9-]/gi, '-').toLowerCase()}.md`;\n const skillPath = path.join(skillsDir, filename);\n fs.writeFileSync(skillPath, skill.content);\n written.push(skillPath);\n }\n }\n\n // MCP servers (.mcp.json)\n if (config.mcpServers && Object.keys(config.mcpServers).length > 0) {\n const mcpConfig = { mcpServers: config.mcpServers };\n fs.writeFileSync('.mcp.json', JSON.stringify(mcpConfig, null, 2));\n written.push('.mcp.json');\n }\n\n return written;\n}\n","import fs from 'fs';\nimport path from 'path';\n\ninterface CursorConfig {\n cursorrules?: string;\n rules?: Array<{ filename: string; content: string }>;\n mcpServers?: Record<string, { command: string; args?: string[]; env?: Record<string, string> }>;\n}\n\nexport function writeCursorConfig(config: CursorConfig): string[] {\n const written: string[] = [];\n\n // .cursorrules\n if (config.cursorrules) {\n fs.writeFileSync('.cursorrules', config.cursorrules);\n written.push('.cursorrules');\n }\n\n // .cursor/rules/*.mdc\n if (config.rules?.length) {\n const rulesDir = path.join('.cursor', 'rules');\n if (!fs.existsSync(rulesDir)) fs.mkdirSync(rulesDir, { recursive: true });\n\n for (const rule of config.rules) {\n const rulePath = path.join(rulesDir, rule.filename);\n fs.writeFileSync(rulePath, rule.content);\n written.push(rulePath);\n }\n }\n\n // .cursor/mcp.json\n if (config.mcpServers && Object.keys(config.mcpServers).length > 0) {\n const cursorDir = '.cursor';\n if (!fs.existsSync(cursorDir)) fs.mkdirSync(cursorDir, { recursive: true });\n\n const mcpConfig = { mcpServers: config.mcpServers };\n fs.writeFileSync(\n path.join(cursorDir, 'mcp.json'),\n JSON.stringify(mcpConfig, null, 2)\n );\n written.push(path.join(cursorDir, 'mcp.json'));\n }\n\n return written;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { BACKUPS_DIR } from '../constants.js';\n\nexport function createBackup(files: string[]): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupDir = path.join(BACKUPS_DIR, timestamp);\n\n for (const file of files) {\n if (!fs.existsSync(file)) continue;\n\n const dest = path.join(backupDir, file);\n const destDir = path.dirname(dest);\n if (!fs.existsSync(destDir)) {\n fs.mkdirSync(destDir, { recursive: true });\n }\n fs.copyFileSync(file, dest);\n }\n\n return backupDir;\n}\n\nexport function restoreBackup(backupDir: string, file: string): boolean {\n const backupFile = path.join(backupDir, file);\n if (!fs.existsSync(backupFile)) return false;\n\n const destDir = path.dirname(file);\n if (!fs.existsSync(destDir)) {\n fs.mkdirSync(destDir, { recursive: true });\n }\n fs.copyFileSync(backupFile, file);\n return true;\n}\n","import fs from 'fs';\nimport crypto from 'crypto';\nimport { CALIBER_DIR, MANIFEST_FILE } from '../constants.js';\n\nexport interface ManifestEntry {\n path: string;\n action: 'created' | 'modified';\n checksum: string;\n timestamp: string;\n}\n\nexport interface Manifest {\n version: 1;\n backupDir?: string;\n entries: ManifestEntry[];\n}\n\nexport function readManifest(): Manifest | null {\n try {\n if (!fs.existsSync(MANIFEST_FILE)) return null;\n return JSON.parse(fs.readFileSync(MANIFEST_FILE, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nexport function writeManifest(manifest: Manifest) {\n if (!fs.existsSync(CALIBER_DIR)) {\n fs.mkdirSync(CALIBER_DIR, { recursive: true });\n }\n fs.writeFileSync(MANIFEST_FILE, JSON.stringify(manifest, null, 2));\n}\n\nexport function fileChecksum(filePath: string): string {\n const content = fs.readFileSync(filePath);\n return crypto.createHash('sha256').update(content).digest('hex');\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { undoSetup } from '../writers/index.js';\nimport { trackEvent } from '../telemetry.js';\n\nexport function undoCommand() {\n const spinner = ora('Reverting setup...').start();\n\n try {\n const { restored, removed } = undoSetup();\n\n if (restored.length === 0 && removed.length === 0) {\n spinner.info('Nothing to undo.');\n return;\n }\n\n spinner.succeed('Setup reverted successfully.\\n');\n trackEvent('setup_undone', { restored: restored.length, removed: removed.length });\n\n if (restored.length > 0) {\n console.log(chalk.cyan(' Restored from backup:'));\n for (const file of restored) {\n console.log(` ${chalk.green('↩')} ${file}`);\n }\n }\n\n if (removed.length > 0) {\n console.log(chalk.cyan(' Removed:'));\n for (const file of removed) {\n console.log(` ${chalk.red('✗')} ${file}`);\n }\n }\n\n console.log('');\n } catch (err) {\n spinner.fail(chalk.red(err instanceof Error ? err.message : 'Undo failed'));\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport fs from 'fs';\nimport { readManifest } from '../writers/manifest.js';\nimport { getStoredAuth } from '../auth/token-store.js';\n\nexport function statusCommand(options: { json?: boolean }) {\n const auth = getStoredAuth();\n const manifest = readManifest();\n\n if (options.json) {\n console.log(JSON.stringify({\n authenticated: !!auth,\n email: auth?.email,\n manifest: manifest,\n }, null, 2));\n return;\n }\n\n console.log(chalk.bold('\\nCaliber Status\\n'));\n\n // Auth status\n if (auth) {\n console.log(` Auth: ${chalk.green('Logged in')} as ${auth.email}`);\n } else {\n console.log(` Auth: ${chalk.yellow('Not logged in')}`);\n }\n\n // Config status\n if (!manifest) {\n console.log(` Setup: ${chalk.dim('No setup applied')}`);\n console.log(chalk.dim('\\n Run `caliber init` to get started.\\n'));\n return;\n }\n\n console.log(` Files managed: ${chalk.cyan(manifest.entries.length.toString())}`);\n for (const entry of manifest.entries) {\n const exists = fs.existsSync(entry.path);\n const icon = exists ? chalk.green('✓') : chalk.red('✗');\n console.log(` ${icon} ${entry.path} (${entry.action})`);\n }\n console.log('');\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { apiStream } from '../api/client.js';\nimport { writeSetup } from '../writers/index.js';\nimport { readManifest } from '../writers/manifest.js';\nimport readline from 'readline';\nimport { trackEvent, countSuggestedFiles } from '../telemetry.js';\n\nexport async function updateCommand(options: { dryRun?: boolean }) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not logged in. Run `caliber login` first.'));\n process.exit(1);\n }\n\n const manifest = readManifest();\n if (!manifest) {\n console.log(chalk.yellow('No existing setup found. Run `caliber init` first.'));\n process.exit(1);\n }\n\n const spinner = ora('Re-analyzing project...').start();\n const fingerprint = collectFingerprint(process.cwd());\n spinner.succeed('Project re-analyzed');\n\n trackEvent('scan_completed', {\n languages: fingerprint.languages,\n frameworks: fingerprint.frameworks,\n has_existing_config: !!(fingerprint.existingConfigs.claudeMd || fingerprint.existingConfigs.cursorrules),\n has_claude_md: !!fingerprint.existingConfigs.claudeMd,\n has_claude_settings: !!fingerprint.existingConfigs.claudeSettings,\n has_cursorrules: !!fingerprint.existingConfigs.cursorrules,\n cursor_rules_count: fingerprint.existingConfigs.cursorRules?.length ?? 0,\n skills_count: fingerprint.existingConfigs.claudeSkills?.length ?? 0,\n file_count: fingerprint.fileTree.length,\n });\n\n let generatedSetup: Record<string, unknown> | null = null;\n\n trackEvent('generation_started', { target_agent: 'both' });\n const generationStart = Date.now();\n\n const genSpinner = ora('Regenerating setup...').start();\n\n await apiStream(\n '/api/setups/generate',\n {\n fingerprint,\n targetAgent: 'both',\n },\n () => {},\n (payload) => { generatedSetup = payload.setup as Record<string, unknown>; },\n (error) => {\n trackEvent('error_occurred', { error_type: 'generation_failed', error_message: error });\n genSpinner.fail(`Generation error: ${error}`);\n },\n (status) => { genSpinner.text = status; }\n );\n\n if (!generatedSetup) {\n genSpinner.fail('Failed to regenerate setup.');\n process.exit(1);\n }\n\n genSpinner.succeed('Setup regenerated');\n\n trackEvent('generation_completed', {\n target_agent: 'both',\n duration_ms: Date.now() - generationStart,\n files_suggested: countSuggestedFiles(generatedSetup),\n });\n\n if (options.dryRun) {\n console.log(chalk.yellow('\\n[Dry run] Would write:'));\n console.log(JSON.stringify(generatedSetup, null, 2));\n return;\n }\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(chalk.cyan('\\n\\nApply updated setup? (y/n): '), resolve);\n });\n rl.close();\n\n if (answer.trim().toLowerCase() !== 'y') {\n trackEvent('generation_cancelled');\n console.log(chalk.dim('Update cancelled.'));\n return;\n }\n\n const writeSpinner = ora('Updating config files...').start();\n const result = writeSetup(generatedSetup as Parameters<typeof writeSetup>[0]);\n writeSpinner.succeed('Config files updated');\n\n trackEvent('setup_updated', { files_written: result.written.length });\n\n for (const file of result.written) {\n console.log(` ${chalk.green('✓')} ${file}`);\n }\n console.log('');\n}\n\n","import chalk from 'chalk';\nimport { clearAuth, getStoredAuth } from '../auth/token-store.js';\nimport { trackEvent } from '../telemetry.js';\n\nexport function logoutCommand() {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.dim('Not currently logged in.'));\n return;\n }\n\n clearAuth();\n trackEvent('logout');\n console.log(chalk.green('Logged out successfully.'));\n}\n","import { program } from './cli.js';\nimport { getStoredAuth } from './auth/token-store.js';\nimport { isFirstRun, getDeviceId, trackEvent, identifyUser, shutdownTelemetry } from './telemetry.js';\n\nconst firstRun = isFirstRun();\ngetDeviceId();\nif (firstRun) {\n trackEvent('cli_installed');\n}\n\nconst auth = getStoredAuth();\nif (auth) {\n identifyUser(auth.userId, auth.email);\n}\n\nprocess.on('SIGINT', () => process.exit(130));\nprocess.on('SIGTERM', () => process.exit(143));\n\nprogram.parseAsync().finally(async () => {\n await shutdownTelemetry();\n process.exit(0);\n});\n"],"mappings":"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","names":["chalk","ora","path","auth","URL","fs","path","os","path","fs","auth","os","crypto","fs","path","pkg","fs","path","path","fs","path","crypto","auth","path","fs","fs","path","fs","path","fs","path","fs","crypto","fs","MANIFEST_FILE","chalk","auth","ora","path","chalk","ora","ora","chalk","chalk","fs","auth","chalk","fs","chalk","ora","readline","auth","chalk","ora","readline","chalk","auth","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/cli.ts","../src/commands/init.ts","../src/auth/token-store.ts","../src/commands/login.ts","../src/auth/pkce.ts","../src/auth/callback-server.ts","../src/telemetry.ts","../src/fingerprint/index.ts","../src/fingerprint/git.ts","../src/fingerprint/package-json.ts","../src/fingerprint/file-tree.ts","../src/fingerprint/languages.ts","../src/fingerprint/existing-config.ts","../src/api/client.ts","../src/writers/index.ts","../src/writers/claude/index.ts","../src/writers/cursor/index.ts","../src/writers/backup.ts","../src/writers/manifest.ts","../src/utils/spinner-messages.ts","../src/commands/undo.ts","../src/commands/status.ts","../src/commands/update.ts","../src/commands/logout.ts","../src/utils/version-check.ts","../src/bin.ts"],"sourcesContent":["import path from 'path';\nimport os from 'os';\n\nexport const API_URL = process.env.CALIBER_API_URL || 'https://caliber-backend.up.railway.app';\nexport const FRONTEND_URL = process.env.CALIBER_FRONTEND_URL || 'https://caliber-app.up.railway.app';\nexport const CLI_CALLBACK_PORT = 19284;\nexport const AUTH_DIR = path.join(os.homedir(), '.caliber');\nexport const AUTH_FILE = path.join(AUTH_DIR, 'auth.json');\nexport const CALIBER_DIR = '.caliber';\nexport const MANIFEST_FILE = path.join(CALIBER_DIR, 'manifest.json');\nexport const BACKUPS_DIR = path.join(CALIBER_DIR, 'backups');\n","import { Command } from 'commander';\nimport fs from 'fs';\nimport { initCommand } from './commands/init.js';\nimport { undoCommand } from './commands/undo.js';\nimport { statusCommand } from './commands/status.js';\nimport { updateCommand } from './commands/update.js';\nimport { loginCommand } from './commands/login.js';\nimport { logoutCommand } from './commands/logout.js';\n\nconst pkg = JSON.parse(\n fs.readFileSync(new URL('../package.json', import.meta.url), 'utf-8')\n);\n\nconst program = new Command();\n\nprogram\n .name('caliber')\n .description('Configure your coding agent environment')\n .version(pkg.version);\n\nprogram\n .command('init')\n .description('Initialize coding agent setup for this project')\n .option('--agent <type>', 'Target agent: claude, cursor, or both')\n .option('--dry-run', 'Preview changes without writing files')\n .option('--force', 'Overwrite existing setup without prompting')\n .action(initCommand);\n\nprogram\n .command('undo')\n .description('Revert all config changes made by Caliber')\n .action(undoCommand);\n\nprogram\n .command('status')\n .description('Show current Caliber setup status')\n .option('--json', 'Output as JSON')\n .action(statusCommand);\n\nprogram\n .command('update')\n .description('Re-analyze project and update setup')\n .option('--dry-run', 'Preview changes without writing files')\n .action(updateCommand);\n\nprogram\n .command('login')\n .description('Authenticate with Caliber')\n .action(loginCommand);\n\nprogram\n .command('logout')\n .description('Clear stored credentials')\n .action(logoutCommand);\n\nexport { program };\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport readline from 'readline';\nimport path from 'path';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { loginCommand } from './login.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { apiRequest, apiStream } from '../api/client.js';\nimport { writeSetup } from '../writers/index.js';\nimport { trackEvent, countSuggestedFiles } from '../telemetry.js';\nimport { SpinnerMessages, GENERATION_MESSAGES, REFINE_MESSAGES } from '../utils/spinner-messages.js';\n\ntype TargetAgent = 'claude' | 'cursor' | 'both';\n\ninterface InitOptions {\n agent?: TargetAgent;\n dryRun?: boolean;\n force?: boolean;\n}\n\nexport async function initCommand(options: InitOptions) {\n // Banner\n console.log(chalk.bold.hex('#6366f1')(`\n ██████╗ █████╗ ██╗ ██╗██████╗ ███████╗██████╗\n ██╔════╝██╔══██╗██║ ██║██╔══██╗██╔════╝██╔══██╗\n ██║ ███████║██║ ██║██████╔╝█████╗ ██████╔╝\n ██║ ██╔══██║██║ ██║██╔══██╗██╔══╝ ██╔══██╗\n ╚██████╗██║ ██║███████╗██║██████╔╝███████╗██║ ██║\n ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝╚═════╝ ╚══════╝╚═╝ ╚═╝\n `));\n console.log(chalk.dim(' Configure your coding agent environment\\n'));\n\n // Step 1: Auth check\n let auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.yellow('Not logged in. Starting authentication...\\n'));\n await loginCommand();\n auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Authentication required. Exiting.'));\n process.exit(1);\n }\n }\n console.log(chalk.dim(`Authenticated as ${auth.email}\\n`));\n\n // Step 2: Collect fingerprint\n const spinner = ora('Analyzing project...').start();\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n spinner.succeed('Project analyzed');\n\n trackEvent('scan_completed', {\n languages: fingerprint.languages,\n frameworks: fingerprint.frameworks,\n has_existing_config: !!(fingerprint.existingConfigs.claudeMd || fingerprint.existingConfigs.cursorrules),\n has_claude_md: !!fingerprint.existingConfigs.claudeMd,\n has_claude_settings: !!fingerprint.existingConfigs.claudeSettings,\n has_cursorrules: !!fingerprint.existingConfigs.cursorrules,\n cursor_rules_count: fingerprint.existingConfigs.cursorRules?.length ?? 0,\n skills_count: fingerprint.existingConfigs.claudeSkills?.length ?? 0,\n file_count: fingerprint.fileTree.length,\n });\n\n console.log(chalk.dim(` Languages: ${fingerprint.languages.join(', ') || 'none detected'}`));\n console.log(chalk.dim(` Frameworks: ${fingerprint.frameworks.join(', ') || 'none detected'}`));\n console.log(chalk.dim(` Files: ${fingerprint.fileTree.length} found\\n`));\n\n // Step 3: Check for existing project\n const matchSpinner = ora('Checking for existing setup...').start();\n let existingSetup = null;\n try {\n const match = await apiRequest<{ project: unknown; setup: unknown }>('/api/projects/match', {\n method: 'POST',\n body: { fingerprintHash: hash },\n });\n if (match.setup) {\n existingSetup = match.setup;\n trackEvent('existing_config_detected');\n matchSpinner.succeed('Found existing setup');\n } else {\n matchSpinner.info('No existing setup found');\n }\n } catch {\n matchSpinner.info('No existing setup found');\n }\n\n // Step 4: Determine target agent\n const targetAgent = options.agent || await promptAgent();\n trackEvent('target_agent_selected', { target_agent: targetAgent });\n\n // Step 5: Get project description if empty directory\n const isEmpty = fingerprint.fileTree.length < 3;\n if (isEmpty) {\n fingerprint.description = await promptInput('What will you build in this project?');\n }\n\n // Step 6: Generate setup via AI\n let generatedSetup: Record<string, unknown> | null = null;\n let setupExplanation: string | undefined;\n\n trackEvent('generation_started', { target_agent: targetAgent });\n const generationStart = Date.now();\n\n const genSpinner = ora('Generating setup...').start();\n const genMessages = new SpinnerMessages(genSpinner, GENERATION_MESSAGES);\n genMessages.start();\n\n await apiStream(\n '/api/setups/generate',\n {\n fingerprint,\n targetAgent,\n prompt: fingerprint.description,\n },\n () => {},\n (payload) => {\n generatedSetup = payload.setup as Record<string, unknown>;\n setupExplanation = payload.explanation;\n },\n (error) => {\n genMessages.stop();\n trackEvent('error_occurred', { error_type: 'generation_failed', error_message: error });\n genSpinner.fail(`Generation error: ${error}`);\n },\n (status) => { genMessages.handleServerStatus(status); }\n );\n\n genMessages.stop();\n\n if (!generatedSetup) {\n genSpinner.fail('Failed to generate setup.');\n process.exit(1);\n }\n\n trackEvent('generation_completed', {\n target_agent: targetAgent,\n duration_ms: Date.now() - generationStart,\n files_suggested: countSuggestedFiles(generatedSetup),\n });\n\n genSpinner.succeed('Setup generated');\n printSetupSummary(generatedSetup);\n\n // Step 7: Accept / Refine / Explain / Decline\n let action = await promptAction();\n\n while (action === 'explain') {\n if (setupExplanation) {\n console.log(chalk.bold('\\nWhy this setup?\\n'));\n console.log(chalk.dim(setupExplanation));\n console.log('');\n } else {\n console.log(chalk.dim('\\nNo explanation available for this setup.\\n'));\n }\n action = await promptAction();\n }\n\n if (action === 'decline') {\n trackEvent('setup_declined');\n console.log(chalk.dim('Setup declined. No files were modified.'));\n return;\n }\n\n if (action === 'refine') {\n generatedSetup = await refineLoop(generatedSetup, targetAgent);\n if (!generatedSetup) {\n trackEvent('generation_cancelled');\n console.log(chalk.dim('Refinement cancelled. No files were modified.'));\n return;\n }\n }\n\n // Step 8: Write files\n if (options.dryRun) {\n console.log(chalk.yellow('\\n[Dry run] Would write the following files:'));\n console.log(JSON.stringify(generatedSetup, null, 2));\n return;\n }\n\n const writeSpinner = ora('Writing config files...').start();\n try {\n const result = writeSetup(generatedSetup as Parameters<typeof writeSetup>[0]);\n writeSpinner.succeed('Config files written');\n\n trackEvent('setup_applied', { files_written: result.written.length, target_agent: targetAgent });\n for (const file of result.written) {\n trackEvent('config_file_written', { file_type: path.extname(file) || path.basename(file) });\n }\n\n console.log(chalk.bold('\\nFiles created/updated:'));\n for (const file of result.written) {\n console.log(` ${chalk.green('✓')} ${file}`);\n }\n if (result.backupDir) {\n console.log(chalk.dim(`\\n Backups saved to ${result.backupDir}`));\n }\n } catch (err) {\n writeSpinner.fail('Failed to write files');\n console.error(chalk.red(err instanceof Error ? err.message : 'Unknown error'));\n process.exit(1);\n }\n\n // Step 9: Save to server\n try {\n const project = await apiRequest<{ id: string }>('/api/projects', {\n method: 'POST',\n body: {\n fingerprintHash: hash,\n name: fingerprint.packageName || 'untitled',\n gitRemoteUrl: fingerprint.gitRemoteUrl,\n description: fingerprint.description,\n },\n });\n\n trackEvent('project_created', { project_name: fingerprint.packageName || 'untitled' });\n\n await apiRequest(`/api/setups/project/${project.id}`, {\n method: 'POST',\n body: {\n targetAgent,\n config: generatedSetup,\n isMaster: true,\n },\n });\n } catch (err) {\n console.log(chalk.yellow(`\\n Warning: Could not save project to server.`));\n console.log(chalk.dim(` ${err instanceof Error ? err.message : String(err)}`));\n console.log(chalk.dim(` Your local setup is unaffected.\\n`));\n }\n\n console.log(chalk.bold.green('\\nSetup complete! Your coding agent is now configured.'));\n console.log(chalk.dim('Run `caliber undo` to revert changes.\\n'));\n}\n\nasync function refineLoop(\n currentSetup: Record<string, unknown>,\n _targetAgent: string\n): Promise<Record<string, unknown> | null> {\n const history: Array<{ role: 'user' | 'assistant'; content: string }> = [];\n let refinementRound = 0;\n\n while (true) {\n const message = await promptInput('\\nWhat would you like to change?');\n if (!message || message.toLowerCase() === 'done' || message.toLowerCase() === 'accept') {\n return currentSetup;\n }\n if (message.toLowerCase() === 'cancel') {\n return null;\n }\n\n refinementRound++;\n trackEvent('refinement_message_sent', { refinement_round: refinementRound });\n\n let refined: Record<string, unknown> | null = null;\n const refineSpinner = ora('Refining setup...').start();\n const refineMessages = new SpinnerMessages(refineSpinner, REFINE_MESSAGES);\n refineMessages.start();\n\n await apiStream(\n '/api/setups/refine',\n { currentSetup, message, conversationHistory: history },\n () => {},\n (payload) => { refined = payload.setup as Record<string, unknown>; },\n (error) => { refineMessages.stop(); refineSpinner.fail(`Refinement error: ${error}`); },\n (status) => { refineMessages.handleServerStatus(status); }\n );\n\n refineMessages.stop();\n\n if (refined) {\n currentSetup = refined;\n history.push({ role: 'user', content: message });\n history.push({ role: 'assistant', content: JSON.stringify(refined) });\n refineSpinner.succeed('Setup updated');\n printSetupSummary(refined);\n console.log(chalk.dim('Type \"done\" to accept, or describe more changes.'));\n }\n }\n}\n\nfunction promptInput(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(chalk.cyan(`${question} `), (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction promptAgent(): Promise<TargetAgent> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n console.log(chalk.bold('Which coding agent are you using?'));\n console.log(' 1. Claude Code');\n console.log(' 2. Cursor');\n console.log(' 3. Both');\n rl.question(chalk.cyan('\\nChoose (1-3): '), (answer) => {\n rl.close();\n const map: Record<string, TargetAgent> = { '1': 'claude', '2': 'cursor', '3': 'both' };\n resolve(map[answer.trim()] || 'claude');\n });\n });\n}\n\nfunction promptAction(): Promise<'accept' | 'refine' | 'explain' | 'decline'> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n console.log(chalk.bold('What would you like to do?'));\n console.log(' 1. Accept and apply');\n console.log(' 2. Refine via chat');\n console.log(' 3. Explain recommendations');\n console.log(' 4. Decline');\n rl.question(chalk.cyan('\\nChoose (1-4): '), (answer) => {\n rl.close();\n const map: Record<string, 'accept' | 'refine' | 'explain' | 'decline'> = {\n '1': 'accept', '2': 'refine', '3': 'explain', '4': 'decline',\n };\n resolve(map[answer.trim()] || 'accept');\n });\n });\n}\n\nfunction printSetupSummary(setup: Record<string, unknown>) {\n const claude = setup.claude as Record<string, unknown> | undefined;\n const cursor = setup.cursor as Record<string, unknown> | undefined;\n\n console.log('');\n\n if (claude) {\n if (claude.claudeMd) {\n console.log(` ${chalk.green('+')} CLAUDE.md ${chalk.dim('— project guidelines, commands, conventions')}`);\n }\n if (claude.settings) {\n console.log(` ${chalk.green('+')} .claude/settings.json ${chalk.dim('— tool permissions & hooks')}`);\n }\n if (claude.settingsLocal) {\n console.log(` ${chalk.green('+')} .claude/settings.local.json ${chalk.dim('— local dev permissions')}`);\n }\n\n const skills = claude.skills as Array<{ name: string; content: string }> | undefined;\n if (Array.isArray(skills) && skills.length > 0) {\n console.log(` ${chalk.green('+')} ${skills.length} skill${skills.length > 1 ? 's' : ''}:`);\n for (const skill of skills) {\n console.log(` ${chalk.dim('•')} ${skill.name}`);\n }\n }\n\n const mcpServers = claude.mcpServers as Record<string, unknown> | undefined;\n if (mcpServers && Object.keys(mcpServers).length > 0) {\n const names = Object.keys(mcpServers);\n console.log(` ${chalk.green('+')} ${names.length} MCP server${names.length > 1 ? 's' : ''}:`);\n for (const name of names) {\n console.log(` ${chalk.dim('•')} ${name}`);\n }\n }\n }\n\n if (cursor) {\n if (cursor.cursorrules) {\n console.log(` ${chalk.green('+')} .cursorrules ${chalk.dim('— coding rules for Cursor')}`);\n }\n\n const rules = cursor.rules as Array<{ filename: string }> | undefined;\n if (Array.isArray(rules) && rules.length > 0) {\n console.log(` ${chalk.green('+')} ${rules.length} Cursor rule${rules.length > 1 ? 's' : ''}:`);\n for (const rule of rules) {\n console.log(` ${chalk.dim('•')} ${rule.filename}`);\n }\n }\n\n const mcpServers = cursor.mcpServers as Record<string, unknown> | undefined;\n if (mcpServers && Object.keys(mcpServers).length > 0) {\n const names = Object.keys(mcpServers);\n console.log(` ${chalk.green('+')} ${names.length} MCP server${names.length > 1 ? 's' : ''}:`);\n for (const name of names) {\n console.log(` ${chalk.dim('•')} ${name}`);\n }\n }\n }\n\n console.log('');\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { AUTH_DIR, AUTH_FILE } from '../constants.js';\n\ninterface StoredAuth {\n accessToken: string;\n refreshToken: string;\n expiresAt: number;\n userId: string;\n email: string;\n}\n\nexport function getStoredAuth(): StoredAuth | null {\n try {\n if (!fs.existsSync(AUTH_FILE)) return null;\n const data = JSON.parse(fs.readFileSync(AUTH_FILE, 'utf-8'));\n return data as StoredAuth;\n } catch {\n return null;\n }\n}\n\nexport function storeAuth(auth: {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n user: { id: string; email: string };\n}) {\n if (!fs.existsSync(AUTH_DIR)) {\n fs.mkdirSync(AUTH_DIR, { recursive: true });\n }\n\n const data: StoredAuth = {\n accessToken: auth.accessToken,\n refreshToken: auth.refreshToken,\n expiresAt: Date.now() + auth.expiresIn * 1000,\n userId: auth.user.id,\n email: auth.user.email,\n };\n\n fs.writeFileSync(AUTH_FILE, JSON.stringify(data, null, 2), { mode: 0o600 });\n}\n\nexport function clearAuth() {\n try {\n if (fs.existsSync(AUTH_FILE)) fs.unlinkSync(AUTH_FILE);\n } catch {\n // ignore\n }\n}\n\nexport function isTokenExpired(): boolean {\n const auth = getStoredAuth();\n if (!auth) return true;\n return Date.now() >= auth.expiresAt - 60_000; // 1 min buffer\n}\n","import open from 'open';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { generatePKCE } from '../auth/pkce.js';\nimport { startCallbackServer } from '../auth/callback-server.js';\nimport { storeAuth, getStoredAuth } from '../auth/token-store.js';\nimport { FRONTEND_URL, CLI_CALLBACK_PORT } from '../constants.js';\nimport { identifyUser, trackEvent } from '../telemetry.js';\n\nexport async function loginCommand() {\n const existing = getStoredAuth();\n if (existing) {\n console.log(chalk.dim(`Already logged in as ${existing.email}`));\n console.log(chalk.dim('Run `caliber logout` first to switch accounts.'));\n return;\n }\n\n const { state } = generatePKCE();\n const redirectUri = `http://127.0.0.1:${CLI_CALLBACK_PORT}/callback`;\n\n const authUrl = `${FRONTEND_URL}/auth/cli?redirect_uri=${encodeURIComponent(redirectUri)}&state=${state}`;\n\n console.log(chalk.bold('\\nOpening browser for authentication...\\n'));\n console.log(chalk.dim(`If the browser doesn't open, visit:\\n${authUrl}\\n`));\n\n const serverPromise = startCallbackServer(state);\n\n await open(authUrl);\n\n const spinner = ora('Waiting for authentication...').start();\n\n try {\n const result = await serverPromise;\n\n storeAuth({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n expiresIn: result.expiresIn,\n user: result.user,\n });\n\n identifyUser(result.user.id, result.user.email);\n trackEvent('signin', { method: 'cli_pkce' });\n\n spinner.succeed(chalk.green(`Logged in as ${result.user.email}`));\n } catch (err) {\n spinner.fail(chalk.red(`Authentication failed: ${err instanceof Error ? err.message : 'Unknown error'}`));\n process.exit(1);\n }\n}\n","import crypto from 'crypto';\n\nexport function generatePKCE() {\n const verifier = crypto.randomBytes(32).toString('base64url');\n const challenge = crypto\n .createHash('sha256')\n .update(verifier)\n .digest('base64url');\n const state = crypto.randomBytes(16).toString('hex');\n\n return { verifier, challenge, state };\n}\n","import http from 'http';\nimport { URL } from 'url';\nimport { CLI_CALLBACK_PORT } from '../constants.js';\n\nexport interface CallbackResult {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n user: {\n id: string;\n email: string;\n };\n}\n\nexport function startCallbackServer(expectedState: string): Promise<CallbackResult> {\n return new Promise((resolve, reject) => {\n const server = http.createServer((req, res) => {\n if (!req.url?.startsWith('/callback')) {\n res.writeHead(404);\n res.end();\n return;\n }\n\n const url = new URL(req.url, `http://127.0.0.1:${CLI_CALLBACK_PORT}`);\n const error = url.searchParams.get('error');\n\n if (error) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end('<html><body><h2>Authentication failed</h2><p>You can close this tab.</p></body></html>');\n server.close();\n reject(new Error(`Auth failed: ${error}`));\n return;\n }\n\n const state = url.searchParams.get('state');\n const accessToken = url.searchParams.get('access_token');\n const refreshToken = url.searchParams.get('refresh_token');\n const expiresIn = url.searchParams.get('expires_in');\n const userId = url.searchParams.get('user_id');\n const email = url.searchParams.get('email');\n\n if (!accessToken || !refreshToken || !userId || state !== expectedState) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end('<html><body><h2>Invalid callback</h2></body></html>');\n server.close();\n reject(new Error('Invalid callback: missing token data or state mismatch'));\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`<html><body style=\"font-family: system-ui; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #09090b; color: #fafafa;\">\n <div style=\"text-align: center;\">\n <h2 style=\"color: #6366f1;\">Authentication successful!</h2>\n <p>You can close this tab and return to your terminal.</p>\n </div>\n </body></html>`);\n\n server.close();\n resolve({\n accessToken,\n refreshToken,\n expiresIn: parseInt(expiresIn || '3600', 10),\n user: { id: userId, email: email || '' },\n });\n });\n\n server.listen(CLI_CALLBACK_PORT, '127.0.0.1', () => {\n // Server ready\n });\n\n server.on('error', (err) => {\n reject(new Error(`Failed to start callback server: ${err.message}`));\n });\n\n setTimeout(() => {\n server.close();\n reject(new Error('Authentication timed out'));\n }, 5 * 60 * 1000);\n });\n}\n","import { PostHog } from 'posthog-node';\nimport fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { randomUUID } from 'crypto';\nimport { AUTH_DIR } from './constants.js';\nimport { getStoredAuth } from './auth/token-store.js';\n\nconst POSTHOG_API_KEY = process.env.CALIBER_POSTHOG_KEY || 'phc_XXrV0pSX4s2QVxVoOaeuyXDvtlRwPAjovt1ttMGVMPp';\nconst DEVICE_ID_FILE = path.join(AUTH_DIR, 'device-id');\n\nlet client: PostHog | null = null;\n\nfunction getClient(): PostHog {\n if (!client) {\n client = new PostHog(POSTHOG_API_KEY, { flushAt: 1, flushInterval: 0 });\n }\n return client;\n}\n\nexport function getDeviceId(): string {\n try {\n if (fs.existsSync(DEVICE_ID_FILE)) {\n return fs.readFileSync(DEVICE_ID_FILE, 'utf-8').trim();\n }\n } catch {}\n\n const id = randomUUID();\n try {\n if (!fs.existsSync(AUTH_DIR)) {\n fs.mkdirSync(AUTH_DIR, { recursive: true });\n }\n fs.writeFileSync(DEVICE_ID_FILE, id, { mode: 0o600 });\n } catch {}\n return id;\n}\n\nexport function isFirstRun(): boolean {\n return !fs.existsSync(DEVICE_ID_FILE);\n}\n\nexport function getDistinctId(): string {\n const auth = getStoredAuth();\n return auth?.userId || getDeviceId();\n}\n\nconst pkg = JSON.parse(\n fs.readFileSync(new URL('../package.json', import.meta.url), 'utf-8')\n);\n\nfunction baseProperties() {\n return {\n source: 'cli',\n cli_version: pkg.version,\n os: os.platform(),\n };\n}\n\nexport function trackEvent(event: string, properties: Record<string, unknown> = {}) {\n try {\n getClient().capture({\n distinctId: getDistinctId(),\n event,\n properties: { ...baseProperties(), ...properties },\n });\n } catch {}\n}\n\nexport function identifyUser(userId: string, email: string) {\n try {\n const ph = getClient();\n const deviceId = getDeviceId();\n\n ph.identify({ distinctId: userId, properties: { email, source: 'cli' } });\n\n if (deviceId !== userId) {\n ph.alias({ distinctId: userId, alias: deviceId });\n }\n } catch {}\n}\n\nexport function countSuggestedFiles(setup: Record<string, unknown>): number {\n let count = 0;\n const claude = setup.claude as Record<string, unknown> | undefined;\n const cursor = setup.cursor as Record<string, unknown> | undefined;\n if (claude) {\n if (claude.claudeMd) count++;\n if (claude.settings) count++;\n if (claude.settingsLocal) count++;\n if (Array.isArray(claude.skills)) count += claude.skills.length;\n if (claude.mcpServers && Object.keys(claude.mcpServers as object).length > 0) count++;\n }\n if (cursor) {\n if (cursor.cursorrules) count++;\n if (Array.isArray(cursor.rules)) count += cursor.rules.length;\n if (cursor.mcpServers && Object.keys(cursor.mcpServers as object).length > 0) count++;\n }\n return count;\n}\n\nexport async function shutdownTelemetry() {\n try {\n await Promise.race([\n client?.shutdown(),\n new Promise((resolve) => setTimeout(resolve, 2000)),\n ]);\n } catch {}\n}\n","import crypto from 'crypto';\nimport { getGitRemoteUrl } from './git.js';\nimport { analyzePackageJson } from './package-json.js';\nimport { getFileTree } from './file-tree.js';\nimport { detectLanguages } from './languages.js';\nimport { readExistingConfigs } from './existing-config.js';\n\nexport interface Fingerprint {\n gitRemoteUrl?: string;\n packageName?: string;\n languages: string[];\n frameworks: string[];\n fileTree: string[];\n existingConfigs: ReturnType<typeof readExistingConfigs>;\n description?: string;\n}\n\nexport function collectFingerprint(dir: string): Fingerprint {\n const gitRemoteUrl = getGitRemoteUrl();\n const pkgInfo = analyzePackageJson(dir);\n const fileTree = getFileTree(dir);\n const fileLangs = detectLanguages(fileTree);\n const existingConfigs = readExistingConfigs(dir);\n\n const languages = [...new Set([...pkgInfo.languages, ...fileLangs])];\n\n return {\n gitRemoteUrl,\n packageName: pkgInfo.name,\n languages,\n frameworks: pkgInfo.frameworks,\n fileTree,\n existingConfigs,\n };\n}\n\nexport function computeFingerprintHash(fingerprint: Fingerprint): string {\n const key = [\n fingerprint.gitRemoteUrl || '',\n fingerprint.packageName || '',\n ].join('::');\n\n return crypto.createHash('sha256').update(key).digest('hex');\n}\n","import { execSync } from 'child_process';\n\nexport function getGitRemoteUrl(): string | undefined {\n try {\n return execSync('git remote get-url origin', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return undefined;\n }\n}\n\nexport function isGitRepo(): boolean {\n try {\n execSync('git rev-parse --is-inside-work-tree', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n return true;\n } catch {\n return false;\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { globSync } from 'glob';\n\ninterface PackageInfo {\n name?: string;\n frameworks: string[];\n languages: string[];\n}\n\nconst NODE_FRAMEWORK_DEPS: Record<string, string> = {\n react: 'React',\n next: 'Next.js',\n vue: 'Vue',\n nuxt: 'Nuxt',\n svelte: 'Svelte',\n '@sveltejs/kit': 'SvelteKit',\n angular: 'Angular',\n '@angular/core': 'Angular',\n express: 'Express',\n fastify: 'Fastify',\n hono: 'Hono',\n nestjs: 'NestJS',\n '@nestjs/core': 'NestJS',\n tailwindcss: 'Tailwind CSS',\n prisma: 'Prisma',\n drizzle: 'Drizzle',\n 'drizzle-orm': 'Drizzle',\n '@supabase/supabase-js': 'Supabase',\n mongoose: 'MongoDB',\n typeorm: 'TypeORM',\n sequelize: 'Sequelize',\n 'better-auth': 'Better Auth',\n};\n\nconst PYTHON_FRAMEWORK_DEPS: Record<string, string> = {\n fastapi: 'FastAPI',\n django: 'Django',\n flask: 'Flask',\n sqlalchemy: 'SQLAlchemy',\n pydantic: 'Pydantic',\n celery: 'Celery',\n pytest: 'pytest',\n uvicorn: 'Uvicorn',\n starlette: 'Starlette',\n httpx: 'HTTPX',\n alembic: 'Alembic',\n tortoise: 'Tortoise ORM',\n 'google-cloud-pubsub': 'Google Pub/Sub',\n stripe: 'Stripe',\n redis: 'Redis',\n};\n\nconst WORKSPACE_GLOBS = [\n 'apps/*/package.json',\n 'packages/*/package.json',\n 'services/*/package.json',\n 'libs/*/package.json',\n];\n\nfunction detectNodeFrameworks(pkgPath: string): string[] {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n const frameworks: string[] = [];\n for (const [dep, framework] of Object.entries(NODE_FRAMEWORK_DEPS)) {\n if (allDeps[dep]) frameworks.push(framework);\n }\n return frameworks;\n } catch {\n return [];\n }\n}\n\nfunction detectPythonFrameworks(dir: string): string[] {\n const frameworks: string[] = [];\n const candidates = [\n path.join(dir, 'pyproject.toml'),\n path.join(dir, 'requirements.txt'),\n ...globSync('apps/*/pyproject.toml', { cwd: dir, absolute: true }),\n ...globSync('apps/*/requirements.txt', { cwd: dir, absolute: true }),\n ...globSync('services/*/pyproject.toml', { cwd: dir, absolute: true }),\n ];\n\n for (const filePath of candidates) {\n if (!fs.existsSync(filePath)) continue;\n try {\n const content = fs.readFileSync(filePath, 'utf-8').toLowerCase();\n for (const [dep, framework] of Object.entries(PYTHON_FRAMEWORK_DEPS)) {\n if (content.includes(dep)) frameworks.push(framework);\n }\n } catch {}\n }\n\n return frameworks;\n}\n\nexport function analyzePackageJson(dir: string): PackageInfo {\n const rootPkgPath = path.join(dir, 'package.json');\n let name: string | undefined;\n const allFrameworks: string[] = [];\n const languages: string[] = [];\n\n if (fs.existsSync(rootPkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(rootPkgPath, 'utf-8'));\n name = pkg.name;\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n allFrameworks.push(...detectNodeFrameworks(rootPkgPath));\n\n if (allDeps.typescript || allDeps['@types/node']) {\n languages.push('TypeScript');\n }\n languages.push('JavaScript');\n } catch {}\n }\n\n for (const glob of WORKSPACE_GLOBS) {\n const matches = globSync(glob, { cwd: dir, absolute: true });\n for (const pkgPath of matches) {\n allFrameworks.push(...detectNodeFrameworks(pkgPath));\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (deps.typescript || deps['@types/node']) {\n languages.push('TypeScript');\n }\n } catch {}\n }\n }\n\n allFrameworks.push(...detectPythonFrameworks(dir));\n\n return {\n name,\n frameworks: [...new Set(allFrameworks)],\n languages: [...new Set(languages)],\n };\n}\n","import fs from 'fs';\nimport path from 'path';\n\nconst IGNORE_DIRS = new Set([\n 'node_modules', '.git', '.next', 'dist', 'build', '.cache',\n '.turbo', 'coverage', '.caliber', '__pycache__', '.venv',\n 'vendor', 'target',\n]);\n\nexport function getFileTree(dir: string, maxDepth = 3): string[] {\n const files: string[] = [];\n scan(dir, '', 0, maxDepth, files);\n return files;\n}\n\nfunction scan(base: string, rel: string, depth: number, maxDepth: number, result: string[]) {\n if (depth > maxDepth) return;\n\n const fullPath = path.join(base, rel);\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(fullPath, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (entry.name.startsWith('.') && depth === 0 && entry.isDirectory()) continue;\n if (IGNORE_DIRS.has(entry.name)) continue;\n\n const relPath = rel ? `${rel}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n result.push(`${relPath}/`);\n scan(base, relPath, depth + 1, maxDepth, result);\n } else {\n result.push(relPath);\n }\n }\n}\n","import path from 'path';\n\nconst EXT_TO_LANG: Record<string, string> = {\n '.ts': 'TypeScript',\n '.tsx': 'TypeScript',\n '.js': 'JavaScript',\n '.jsx': 'JavaScript',\n '.py': 'Python',\n '.go': 'Go',\n '.rs': 'Rust',\n '.rb': 'Ruby',\n '.java': 'Java',\n '.kt': 'Kotlin',\n '.swift': 'Swift',\n '.cs': 'C#',\n '.cpp': 'C++',\n '.c': 'C',\n '.php': 'PHP',\n '.dart': 'Dart',\n '.ex': 'Elixir',\n '.exs': 'Elixir',\n '.scala': 'Scala',\n '.zig': 'Zig',\n};\n\nexport function detectLanguages(fileTree: string[]): string[] {\n const langs = new Set<string>();\n\n for (const file of fileTree) {\n const ext = path.extname(file).toLowerCase();\n if (EXT_TO_LANG[ext]) {\n langs.add(EXT_TO_LANG[ext]);\n }\n }\n\n return [...langs];\n}\n","import fs from 'fs';\nimport path from 'path';\n\nexport function readExistingConfigs(dir: string) {\n const configs: {\n claudeMd?: string;\n claudeSettings?: Record<string, unknown>;\n claudeSkills?: Array<{ filename: string; content: string }>;\n cursorrules?: string;\n cursorRules?: Array<{ filename: string; content: string }>;\n } = {};\n\n // CLAUDE.md\n const claudeMdPath = path.join(dir, 'CLAUDE.md');\n if (fs.existsSync(claudeMdPath)) {\n configs.claudeMd = fs.readFileSync(claudeMdPath, 'utf-8');\n }\n\n // .claude/settings.json\n const claudeSettingsPath = path.join(dir, '.claude', 'settings.json');\n if (fs.existsSync(claudeSettingsPath)) {\n try {\n configs.claudeSettings = JSON.parse(fs.readFileSync(claudeSettingsPath, 'utf-8'));\n } catch {\n // ignore\n }\n }\n\n // .claude/skills/*.md\n const skillsDir = path.join(dir, '.claude', 'skills');\n if (fs.existsSync(skillsDir)) {\n try {\n const files = fs.readdirSync(skillsDir).filter(f => f.endsWith('.md'));\n configs.claudeSkills = files.map(f => ({\n filename: f,\n content: fs.readFileSync(path.join(skillsDir, f), 'utf-8'),\n }));\n } catch {\n // ignore\n }\n }\n\n // .cursorrules\n const cursorrulesPath = path.join(dir, '.cursorrules');\n if (fs.existsSync(cursorrulesPath)) {\n configs.cursorrules = fs.readFileSync(cursorrulesPath, 'utf-8');\n }\n\n // .cursor/rules/*.mdc\n const cursorRulesDir = path.join(dir, '.cursor', 'rules');\n if (fs.existsSync(cursorRulesDir)) {\n try {\n const files = fs.readdirSync(cursorRulesDir).filter(f => f.endsWith('.mdc'));\n configs.cursorRules = files.map(f => ({\n filename: f,\n content: fs.readFileSync(path.join(cursorRulesDir, f), 'utf-8'),\n }));\n } catch {\n // ignore\n }\n }\n\n return configs;\n}\n","import { getStoredAuth, storeAuth, isTokenExpired } from '../auth/token-store.js';\nimport { API_URL } from '../constants.js';\n\nasync function refreshTokenIfNeeded(): Promise<string | null> {\n const auth = getStoredAuth();\n if (!auth) return null;\n\n if (!isTokenExpired()) return auth.accessToken;\n\n try {\n const resp = await fetch(`${API_URL}/api/auth/refresh`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refreshToken: auth.refreshToken }),\n });\n\n if (!resp.ok) return null;\n\n const { data } = await resp.json();\n storeAuth({\n accessToken: data.accessToken,\n refreshToken: data.refreshToken,\n expiresIn: data.expiresIn,\n user: { id: auth.userId, email: auth.email },\n });\n\n return data.accessToken;\n } catch {\n return null;\n }\n}\n\nexport async function apiRequest<T = unknown>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n } = {}\n): Promise<T> {\n const token = await refreshTokenIfNeeded();\n if (!token) {\n throw new Error('Not authenticated. Run `caliber login` first.');\n }\n\n const resp = await fetch(`${API_URL}${path}`, {\n method: options.method || 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (!resp.ok) {\n const error = await resp.json().catch(() => ({ error: resp.statusText }));\n throw new Error(error.error || `API error: ${resp.status}`);\n }\n\n const json = await resp.json();\n return json.data as T;\n}\n\nexport interface StreamCompletePayload {\n setup: unknown;\n explanation?: string;\n}\n\nexport async function apiStream(\n path: string,\n body: unknown,\n onChunk: (text: string) => void,\n onComplete: (payload: StreamCompletePayload) => void,\n onError: (error: string) => void,\n onStatus?: (message: string) => void\n): Promise<void> {\n const token = await refreshTokenIfNeeded();\n if (!token) {\n throw new Error('Not authenticated. Run `caliber login` first.');\n }\n\n const resp = await fetch(`${API_URL}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!resp.ok || !resp.body) {\n throw new Error(`API error: ${resp.status}`);\n }\n\n const reader = resp.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const data = line.slice(6);\n if (data === '[DONE]') return;\n\n try {\n const parsed = JSON.parse(data);\n if (parsed.type === 'chunk') onChunk(parsed.content);\n else if (parsed.type === 'status' && onStatus) onStatus(parsed.message);\n else if (parsed.type === 'complete') onComplete({ setup: parsed.setup, explanation: parsed.explanation });\n else if (parsed.type === 'error') onError(parsed.message);\n } catch {\n // Skip unparseable lines\n }\n }\n }\n}\n","import fs from 'fs';\nimport { writeClaudeConfig } from './claude/index.js';\nimport { writeCursorConfig } from './cursor/index.js';\nimport { createBackup, restoreBackup } from './backup.js';\nimport {\n readManifest,\n writeManifest,\n fileChecksum,\n type Manifest,\n type ManifestEntry,\n} from './manifest.js';\n\ninterface AgentSetup {\n targetAgent: 'claude' | 'cursor' | 'both';\n claude?: Parameters<typeof writeClaudeConfig>[0];\n cursor?: Parameters<typeof writeCursorConfig>[0];\n}\n\nexport function writeSetup(setup: AgentSetup): { written: string[]; backupDir?: string } {\n // Collect all files that will be written\n const filesToWrite = getFilesToWrite(setup);\n\n // Backup existing files\n const existingFiles = filesToWrite.filter(f => fs.existsSync(f));\n const backupDir = existingFiles.length > 0 ? createBackup(existingFiles) : undefined;\n\n const written: string[] = [];\n\n // Write Claude configs\n if ((setup.targetAgent === 'claude' || setup.targetAgent === 'both') && setup.claude) {\n written.push(...writeClaudeConfig(setup.claude));\n }\n\n // Write Cursor configs\n if ((setup.targetAgent === 'cursor' || setup.targetAgent === 'both') && setup.cursor) {\n written.push(...writeCursorConfig(setup.cursor));\n }\n\n // Ensure .caliber/ is in .gitignore\n ensureGitignore();\n\n // Write manifest\n const entries: ManifestEntry[] = written.map(file => ({\n path: file,\n action: existingFiles.includes(file) ? 'modified' as const : 'created' as const,\n checksum: fileChecksum(file),\n timestamp: new Date().toISOString(),\n }));\n\n writeManifest({ version: 1, backupDir, entries });\n\n return { written, backupDir };\n}\n\nexport function undoSetup(): { restored: string[]; removed: string[] } {\n const manifest = readManifest();\n if (!manifest) {\n throw new Error('No manifest found. Nothing to undo.');\n }\n\n const restored: string[] = [];\n const removed: string[] = [];\n\n for (const entry of manifest.entries) {\n if (entry.action === 'created') {\n // Remove files we created\n if (fs.existsSync(entry.path)) {\n fs.unlinkSync(entry.path);\n removed.push(entry.path);\n }\n } else if (entry.action === 'modified' && manifest.backupDir) {\n // Restore from backup\n if (restoreBackup(manifest.backupDir, entry.path)) {\n restored.push(entry.path);\n }\n }\n }\n\n // Clean up manifest\n const { MANIFEST_FILE } = require('../constants.js');\n if (fs.existsSync(MANIFEST_FILE)) {\n fs.unlinkSync(MANIFEST_FILE);\n }\n\n return { restored, removed };\n}\n\nfunction getFilesToWrite(setup: AgentSetup): string[] {\n const files: string[] = [];\n\n if ((setup.targetAgent === 'claude' || setup.targetAgent === 'both') && setup.claude) {\n files.push('CLAUDE.md', '.claude/settings.json', '.claude/settings.local.json');\n if (setup.claude.mcpServers) files.push('.mcp.json');\n if (setup.claude.skills) {\n for (const s of setup.claude.skills) {\n files.push(`.claude/skills/${s.name.replace(/[^a-z0-9-]/gi, '-').toLowerCase()}.md`);\n }\n }\n }\n\n if ((setup.targetAgent === 'cursor' || setup.targetAgent === 'both') && setup.cursor) {\n if (setup.cursor.cursorrules) files.push('.cursorrules');\n if (setup.cursor.rules) {\n for (const r of setup.cursor.rules) files.push(`.cursor/rules/${r.filename}`);\n }\n if (setup.cursor.mcpServers) files.push('.cursor/mcp.json');\n }\n\n return files;\n}\n\nfunction ensureGitignore() {\n const gitignorePath = '.gitignore';\n if (fs.existsSync(gitignorePath)) {\n const content = fs.readFileSync(gitignorePath, 'utf-8');\n if (!content.includes('.caliber/')) {\n fs.appendFileSync(gitignorePath, '\\n# Caliber local state\\n.caliber/\\n');\n }\n } else {\n fs.writeFileSync(gitignorePath, '# Caliber local state\\n.caliber/\\n');\n }\n}\n","import fs from 'fs';\nimport path from 'path';\n\ninterface ClaudeConfig {\n claudeMd: string;\n settings: {\n permissions: { allow: string[] };\n hooks?: Record<string, Array<{ command: string; description?: string }>>;\n };\n settingsLocal: {\n permissions: { allow: string[] };\n };\n skills?: Array<{ name: string; content: string }>;\n mcpServers?: Record<string, { command: string; args?: string[]; env?: Record<string, string> }>;\n}\n\nexport function writeClaudeConfig(config: ClaudeConfig): string[] {\n const written: string[] = [];\n\n // CLAUDE.md\n fs.writeFileSync('CLAUDE.md', config.claudeMd);\n written.push('CLAUDE.md');\n\n // .claude/settings.json\n const claudeDir = '.claude';\n if (!fs.existsSync(claudeDir)) fs.mkdirSync(claudeDir, { recursive: true });\n\n fs.writeFileSync(\n path.join(claudeDir, 'settings.json'),\n JSON.stringify(config.settings, null, 2)\n );\n written.push(path.join(claudeDir, 'settings.json'));\n\n // .claude/settings.local.json\n fs.writeFileSync(\n path.join(claudeDir, 'settings.local.json'),\n JSON.stringify(config.settingsLocal, null, 2)\n );\n written.push(path.join(claudeDir, 'settings.local.json'));\n\n // Skills\n if (config.skills?.length) {\n const skillsDir = path.join(claudeDir, 'skills');\n if (!fs.existsSync(skillsDir)) fs.mkdirSync(skillsDir, { recursive: true });\n\n for (const skill of config.skills) {\n const filename = `${skill.name.replace(/[^a-z0-9-]/gi, '-').toLowerCase()}.md`;\n const skillPath = path.join(skillsDir, filename);\n fs.writeFileSync(skillPath, skill.content);\n written.push(skillPath);\n }\n }\n\n // MCP servers (.mcp.json)\n if (config.mcpServers && Object.keys(config.mcpServers).length > 0) {\n const mcpConfig = { mcpServers: config.mcpServers };\n fs.writeFileSync('.mcp.json', JSON.stringify(mcpConfig, null, 2));\n written.push('.mcp.json');\n }\n\n return written;\n}\n","import fs from 'fs';\nimport path from 'path';\n\ninterface CursorConfig {\n cursorrules?: string;\n rules?: Array<{ filename: string; content: string }>;\n mcpServers?: Record<string, { command: string; args?: string[]; env?: Record<string, string> }>;\n}\n\nexport function writeCursorConfig(config: CursorConfig): string[] {\n const written: string[] = [];\n\n // .cursorrules\n if (config.cursorrules) {\n fs.writeFileSync('.cursorrules', config.cursorrules);\n written.push('.cursorrules');\n }\n\n // .cursor/rules/*.mdc\n if (config.rules?.length) {\n const rulesDir = path.join('.cursor', 'rules');\n if (!fs.existsSync(rulesDir)) fs.mkdirSync(rulesDir, { recursive: true });\n\n for (const rule of config.rules) {\n const rulePath = path.join(rulesDir, rule.filename);\n fs.writeFileSync(rulePath, rule.content);\n written.push(rulePath);\n }\n }\n\n // .cursor/mcp.json\n if (config.mcpServers && Object.keys(config.mcpServers).length > 0) {\n const cursorDir = '.cursor';\n if (!fs.existsSync(cursorDir)) fs.mkdirSync(cursorDir, { recursive: true });\n\n const mcpConfig = { mcpServers: config.mcpServers };\n fs.writeFileSync(\n path.join(cursorDir, 'mcp.json'),\n JSON.stringify(mcpConfig, null, 2)\n );\n written.push(path.join(cursorDir, 'mcp.json'));\n }\n\n return written;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { BACKUPS_DIR } from '../constants.js';\n\nexport function createBackup(files: string[]): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupDir = path.join(BACKUPS_DIR, timestamp);\n\n for (const file of files) {\n if (!fs.existsSync(file)) continue;\n\n const dest = path.join(backupDir, file);\n const destDir = path.dirname(dest);\n if (!fs.existsSync(destDir)) {\n fs.mkdirSync(destDir, { recursive: true });\n }\n fs.copyFileSync(file, dest);\n }\n\n return backupDir;\n}\n\nexport function restoreBackup(backupDir: string, file: string): boolean {\n const backupFile = path.join(backupDir, file);\n if (!fs.existsSync(backupFile)) return false;\n\n const destDir = path.dirname(file);\n if (!fs.existsSync(destDir)) {\n fs.mkdirSync(destDir, { recursive: true });\n }\n fs.copyFileSync(backupFile, file);\n return true;\n}\n","import fs from 'fs';\nimport crypto from 'crypto';\nimport { CALIBER_DIR, MANIFEST_FILE } from '../constants.js';\n\nexport interface ManifestEntry {\n path: string;\n action: 'created' | 'modified';\n checksum: string;\n timestamp: string;\n}\n\nexport interface Manifest {\n version: 1;\n backupDir?: string;\n entries: ManifestEntry[];\n}\n\nexport function readManifest(): Manifest | null {\n try {\n if (!fs.existsSync(MANIFEST_FILE)) return null;\n return JSON.parse(fs.readFileSync(MANIFEST_FILE, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nexport function writeManifest(manifest: Manifest) {\n if (!fs.existsSync(CALIBER_DIR)) {\n fs.mkdirSync(CALIBER_DIR, { recursive: true });\n }\n fs.writeFileSync(MANIFEST_FILE, JSON.stringify(manifest, null, 2));\n}\n\nexport function fileChecksum(filePath: string): string {\n const content = fs.readFileSync(filePath);\n return crypto.createHash('sha256').update(content).digest('hex');\n}\n","import type { Ora } from 'ora';\n\nexport const GENERATION_MESSAGES = [\n 'Analyzing your project structure and dependencies...',\n 'Mapping out build commands and test workflows...',\n 'Reviewing coding patterns and conventions...',\n 'Crafting permission rules for safe tool usage...',\n 'Designing skills tailored to your codebase...',\n 'Evaluating MCP server integrations...',\n 'Optimizing settings for your development workflow...',\n 'Building coding guidelines from your project style...',\n 'Setting up pre-commit hooks and quality gates...',\n 'Assembling your complete agent configuration...',\n];\n\nexport const REFINE_MESSAGES = [\n 'Applying your feedback to the configuration...',\n 'Adjusting coding guidelines...',\n 'Rebalancing permissions and tool settings...',\n 'Refining skills and workflows...',\n 'Updating rules to match your preferences...',\n 'Finalizing the revised setup...',\n];\n\nexport class SpinnerMessages {\n private spinner: Ora;\n private messages: string[];\n private index = 0;\n private timer: ReturnType<typeof setInterval> | null = null;\n\n constructor(spinner: Ora, messages: string[]) {\n this.spinner = spinner;\n this.messages = messages;\n }\n\n start(): void {\n this.index = 0;\n this.spinner.text = this.messages[0];\n this.timer = setInterval(() => {\n this.index = (this.index + 1) % this.messages.length;\n this.spinner.text = this.messages[this.index];\n }, 3000);\n }\n\n handleServerStatus(status: string): void {\n this.spinner.text = status;\n // Reset the timer so the server status displays for a full interval\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = setInterval(() => {\n this.index = (this.index + 1) % this.messages.length;\n this.spinner.text = this.messages[this.index];\n }, 3000);\n }\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { undoSetup } from '../writers/index.js';\nimport { trackEvent } from '../telemetry.js';\n\nexport function undoCommand() {\n const spinner = ora('Reverting setup...').start();\n\n try {\n const { restored, removed } = undoSetup();\n\n if (restored.length === 0 && removed.length === 0) {\n spinner.info('Nothing to undo.');\n return;\n }\n\n spinner.succeed('Setup reverted successfully.\\n');\n trackEvent('setup_undone', { restored: restored.length, removed: removed.length });\n\n if (restored.length > 0) {\n console.log(chalk.cyan(' Restored from backup:'));\n for (const file of restored) {\n console.log(` ${chalk.green('↩')} ${file}`);\n }\n }\n\n if (removed.length > 0) {\n console.log(chalk.cyan(' Removed:'));\n for (const file of removed) {\n console.log(` ${chalk.red('✗')} ${file}`);\n }\n }\n\n console.log('');\n } catch (err) {\n spinner.fail(chalk.red(err instanceof Error ? err.message : 'Undo failed'));\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport fs from 'fs';\nimport { readManifest } from '../writers/manifest.js';\nimport { getStoredAuth } from '../auth/token-store.js';\n\nexport function statusCommand(options: { json?: boolean }) {\n const auth = getStoredAuth();\n const manifest = readManifest();\n\n if (options.json) {\n console.log(JSON.stringify({\n authenticated: !!auth,\n email: auth?.email,\n manifest: manifest,\n }, null, 2));\n return;\n }\n\n console.log(chalk.bold('\\nCaliber Status\\n'));\n\n // Auth status\n if (auth) {\n console.log(` Auth: ${chalk.green('Logged in')} as ${auth.email}`);\n } else {\n console.log(` Auth: ${chalk.yellow('Not logged in')}`);\n }\n\n // Config status\n if (!manifest) {\n console.log(` Setup: ${chalk.dim('No setup applied')}`);\n console.log(chalk.dim('\\n Run `caliber init` to get started.\\n'));\n return;\n }\n\n console.log(` Files managed: ${chalk.cyan(manifest.entries.length.toString())}`);\n for (const entry of manifest.entries) {\n const exists = fs.existsSync(entry.path);\n const icon = exists ? chalk.green('✓') : chalk.red('✗');\n console.log(` ${icon} ${entry.path} (${entry.action})`);\n }\n console.log('');\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { apiStream } from '../api/client.js';\nimport { writeSetup } from '../writers/index.js';\nimport { readManifest } from '../writers/manifest.js';\nimport readline from 'readline';\nimport { trackEvent, countSuggestedFiles } from '../telemetry.js';\nimport { SpinnerMessages, GENERATION_MESSAGES } from '../utils/spinner-messages.js';\n\nexport async function updateCommand(options: { dryRun?: boolean }) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not logged in. Run `caliber login` first.'));\n process.exit(1);\n }\n\n const manifest = readManifest();\n if (!manifest) {\n console.log(chalk.yellow('No existing setup found. Run `caliber init` first.'));\n process.exit(1);\n }\n\n const spinner = ora('Re-analyzing project...').start();\n const fingerprint = collectFingerprint(process.cwd());\n spinner.succeed('Project re-analyzed');\n\n trackEvent('scan_completed', {\n languages: fingerprint.languages,\n frameworks: fingerprint.frameworks,\n has_existing_config: !!(fingerprint.existingConfigs.claudeMd || fingerprint.existingConfigs.cursorrules),\n has_claude_md: !!fingerprint.existingConfigs.claudeMd,\n has_claude_settings: !!fingerprint.existingConfigs.claudeSettings,\n has_cursorrules: !!fingerprint.existingConfigs.cursorrules,\n cursor_rules_count: fingerprint.existingConfigs.cursorRules?.length ?? 0,\n skills_count: fingerprint.existingConfigs.claudeSkills?.length ?? 0,\n file_count: fingerprint.fileTree.length,\n });\n\n let generatedSetup: Record<string, unknown> | null = null;\n\n trackEvent('generation_started', { target_agent: 'both' });\n const generationStart = Date.now();\n\n const genSpinner = ora('Regenerating setup...').start();\n const genMessages = new SpinnerMessages(genSpinner, GENERATION_MESSAGES);\n genMessages.start();\n\n await apiStream(\n '/api/setups/generate',\n {\n fingerprint,\n targetAgent: 'both',\n },\n () => {},\n (payload) => { generatedSetup = payload.setup as Record<string, unknown>; },\n (error) => {\n genMessages.stop();\n trackEvent('error_occurred', { error_type: 'generation_failed', error_message: error });\n genSpinner.fail(`Generation error: ${error}`);\n },\n (status) => { genMessages.handleServerStatus(status); }\n );\n\n genMessages.stop();\n\n if (!generatedSetup) {\n genSpinner.fail('Failed to regenerate setup.');\n process.exit(1);\n }\n\n genSpinner.succeed('Setup regenerated');\n\n trackEvent('generation_completed', {\n target_agent: 'both',\n duration_ms: Date.now() - generationStart,\n files_suggested: countSuggestedFiles(generatedSetup),\n });\n\n if (options.dryRun) {\n console.log(chalk.yellow('\\n[Dry run] Would write:'));\n console.log(JSON.stringify(generatedSetup, null, 2));\n return;\n }\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(chalk.cyan('\\n\\nApply updated setup? (y/n): '), resolve);\n });\n rl.close();\n\n if (answer.trim().toLowerCase() !== 'y') {\n trackEvent('generation_cancelled');\n console.log(chalk.dim('Update cancelled.'));\n return;\n }\n\n const writeSpinner = ora('Updating config files...').start();\n const result = writeSetup(generatedSetup as Parameters<typeof writeSetup>[0]);\n writeSpinner.succeed('Config files updated');\n\n trackEvent('setup_updated', { files_written: result.written.length });\n\n for (const file of result.written) {\n console.log(` ${chalk.green('✓')} ${file}`);\n }\n console.log('');\n}\n\n","import chalk from 'chalk';\nimport { clearAuth, getStoredAuth } from '../auth/token-store.js';\nimport { trackEvent } from '../telemetry.js';\n\nexport function logoutCommand() {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.dim('Not currently logged in.'));\n return;\n }\n\n clearAuth();\n trackEvent('logout');\n console.log(chalk.green('Logged out successfully.'));\n}\n","import fs from 'fs';\nimport readline from 'readline';\nimport { execSync } from 'child_process';\nimport chalk from 'chalk';\nimport ora from 'ora';\n\nconst pkg = JSON.parse(\n fs.readFileSync(new URL('../package.json', import.meta.url), 'utf-8')\n);\n\nfunction promptYesNo(question: string): Promise<boolean> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(chalk.cyan(`${question} `), (answer) => {\n rl.close();\n const normalized = answer.trim().toLowerCase();\n resolve(normalized === '' || normalized === 'y' || normalized === 'yes');\n });\n });\n}\n\nexport async function checkForUpdates(): Promise<void> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 2000);\n\n const res = await fetch('https://registry.npmjs.org/@caliber-ai/cli/latest', {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n\n if (!res.ok) return;\n\n const data = (await res.json()) as { version?: string };\n const latest = data.version;\n if (!latest) return;\n\n const current = pkg.version as string;\n if (current === latest) return;\n\n const isInteractive = process.stdin.isTTY === true;\n\n if (!isInteractive) {\n console.log(\n chalk.yellow(\n `\\nUpdate available: ${current} -> ${latest}\\nRun ${chalk.bold('npm install -g @caliber-ai/cli')} to upgrade.\\n`\n )\n );\n return;\n }\n\n console.log(\n chalk.yellow(`\\nUpdate available: ${current} -> ${latest}`)\n );\n\n const shouldUpdate = await promptYesNo('Would you like to update now? (Y/n)');\n if (!shouldUpdate) {\n console.log();\n return;\n }\n\n const spinner = ora('Updating @caliber-ai/cli...').start();\n try {\n execSync('npm install -g @caliber-ai/cli', { stdio: 'pipe' });\n spinner.succeed(chalk.green(`Updated to ${latest}`));\n\n // Re-exec the original command with the new version\n const args = process.argv.slice(2);\n console.log(chalk.dim(`\\nRestarting: caliber ${args.join(' ')}\\n`));\n execSync(`caliber ${args.map((a) => JSON.stringify(a)).join(' ')}`, {\n stdio: 'inherit',\n });\n process.exit(0);\n } catch {\n spinner.fail('Update failed');\n console.log(\n chalk.yellow(\n `Run ${chalk.bold('npm install -g @caliber-ai/cli')} manually to upgrade.\\n`\n )\n );\n }\n } catch {\n // Silently ignore — offline, timeout, registry down, etc.\n }\n}\n","import { program } from './cli.js';\nimport { getStoredAuth } from './auth/token-store.js';\nimport { isFirstRun, getDeviceId, trackEvent, identifyUser, shutdownTelemetry } from './telemetry.js';\nimport { checkForUpdates } from './utils/version-check.js';\n\nconst firstRun = isFirstRun();\ngetDeviceId();\nif (firstRun) {\n trackEvent('cli_installed');\n}\n\nconst auth = getStoredAuth();\nif (auth) {\n identifyUser(auth.userId, auth.email);\n}\n\nawait checkForUpdates();\n\nprocess.on('SIGINT', () => process.exit(130));\nprocess.on('SIGTERM', () => process.exit(143));\n\nprogram.parseAsync().finally(async () => {\n await shutdownTelemetry();\n process.exit(0);\n});\n"],"mappings":"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","names":["fs","chalk","ora","path","auth","URL","fs","path","os","path","fs","auth","os","crypto","fs","path","pkg","fs","path","path","fs","path","crypto","auth","path","fs","fs","path","fs","path","fs","path","fs","crypto","fs","MANIFEST_FILE","chalk","auth","ora","path","chalk","ora","ora","chalk","chalk","fs","auth","chalk","fs","chalk","ora","readline","auth","chalk","ora","readline","chalk","auth","chalk","pkg","fs","fs","readline","execSync","chalk","ora","pkg"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@caliber-ai/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "CLI for configuring coding agent environments",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -18,16 +18,30 @@
|
|
|
18
18
|
"ora": "^8.1.0",
|
|
19
19
|
"posthog-node": "^5.21.2"
|
|
20
20
|
},
|
|
21
|
-
"files": [
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
22
24
|
"license": "MIT",
|
|
23
25
|
"author": "Caliber AI",
|
|
24
|
-
"keywords": [
|
|
25
|
-
|
|
26
|
+
"keywords": [
|
|
27
|
+
"caliber",
|
|
28
|
+
"cli",
|
|
29
|
+
"coding-agent",
|
|
30
|
+
"claude",
|
|
31
|
+
"cursor",
|
|
32
|
+
"ai",
|
|
33
|
+
"developer-tools"
|
|
34
|
+
],
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=20"
|
|
37
|
+
},
|
|
26
38
|
"repository": {
|
|
27
39
|
"type": "git",
|
|
28
40
|
"url": "git+https://github.com/rely-ai-org/caliber-cli.git"
|
|
29
41
|
},
|
|
30
|
-
"bugs": {
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/rely-ai-org/caliber-cli/issues"
|
|
44
|
+
},
|
|
31
45
|
"homepage": "https://github.com/rely-ai-org/caliber-cli#readme",
|
|
32
46
|
"devDependencies": {
|
|
33
47
|
"@types/node": "^22.0.0",
|