@caliber-ai/cli 0.1.0 → 0.1.1
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 +72 -4
- package/dist/bin.js.map +1 -1
- package/package.json +19 -5
package/dist/bin.js
CHANGED
|
@@ -314,7 +314,7 @@ import crypto2 from "crypto";
|
|
|
314
314
|
import { execSync } from "child_process";
|
|
315
315
|
function getGitRemoteUrl() {
|
|
316
316
|
try {
|
|
317
|
-
return execSync("git remote get-url origin", { encoding: "utf-8" }).trim();
|
|
317
|
+
return execSync("git remote get-url origin", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
|
|
318
318
|
} catch {
|
|
319
319
|
return void 0;
|
|
320
320
|
}
|
|
@@ -883,6 +883,62 @@ function ensureGitignore() {
|
|
|
883
883
|
}
|
|
884
884
|
}
|
|
885
885
|
|
|
886
|
+
// src/utils/spinner-messages.ts
|
|
887
|
+
var GENERATION_MESSAGES = [
|
|
888
|
+
"Analyzing your project structure and dependencies...",
|
|
889
|
+
"Mapping out build commands and test workflows...",
|
|
890
|
+
"Reviewing coding patterns and conventions...",
|
|
891
|
+
"Crafting permission rules for safe tool usage...",
|
|
892
|
+
"Designing skills tailored to your codebase...",
|
|
893
|
+
"Evaluating MCP server integrations...",
|
|
894
|
+
"Optimizing settings for your development workflow...",
|
|
895
|
+
"Building coding guidelines from your project style...",
|
|
896
|
+
"Setting up pre-commit hooks and quality gates...",
|
|
897
|
+
"Assembling your complete agent configuration..."
|
|
898
|
+
];
|
|
899
|
+
var REFINE_MESSAGES = [
|
|
900
|
+
"Applying your feedback to the configuration...",
|
|
901
|
+
"Adjusting coding guidelines...",
|
|
902
|
+
"Rebalancing permissions and tool settings...",
|
|
903
|
+
"Refining skills and workflows...",
|
|
904
|
+
"Updating rules to match your preferences...",
|
|
905
|
+
"Finalizing the revised setup..."
|
|
906
|
+
];
|
|
907
|
+
var SpinnerMessages = class {
|
|
908
|
+
spinner;
|
|
909
|
+
messages;
|
|
910
|
+
index = 0;
|
|
911
|
+
timer = null;
|
|
912
|
+
constructor(spinner, messages) {
|
|
913
|
+
this.spinner = spinner;
|
|
914
|
+
this.messages = messages;
|
|
915
|
+
}
|
|
916
|
+
start() {
|
|
917
|
+
this.index = 0;
|
|
918
|
+
this.spinner.text = this.messages[0];
|
|
919
|
+
this.timer = setInterval(() => {
|
|
920
|
+
this.index = (this.index + 1) % this.messages.length;
|
|
921
|
+
this.spinner.text = this.messages[this.index];
|
|
922
|
+
}, 3e3);
|
|
923
|
+
}
|
|
924
|
+
handleServerStatus(status) {
|
|
925
|
+
this.spinner.text = status;
|
|
926
|
+
if (this.timer) {
|
|
927
|
+
clearInterval(this.timer);
|
|
928
|
+
this.timer = setInterval(() => {
|
|
929
|
+
this.index = (this.index + 1) % this.messages.length;
|
|
930
|
+
this.spinner.text = this.messages[this.index];
|
|
931
|
+
}, 3e3);
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
stop() {
|
|
935
|
+
if (this.timer) {
|
|
936
|
+
clearInterval(this.timer);
|
|
937
|
+
this.timer = null;
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
};
|
|
941
|
+
|
|
886
942
|
// src/commands/init.ts
|
|
887
943
|
async function initCommand(options) {
|
|
888
944
|
console.log(chalk2.bold.hex("#6366f1")(`
|
|
@@ -953,6 +1009,8 @@ async function initCommand(options) {
|
|
|
953
1009
|
trackEvent("generation_started", { target_agent: targetAgent });
|
|
954
1010
|
const generationStart = Date.now();
|
|
955
1011
|
const genSpinner = ora2("Generating setup...").start();
|
|
1012
|
+
const genMessages = new SpinnerMessages(genSpinner, GENERATION_MESSAGES);
|
|
1013
|
+
genMessages.start();
|
|
956
1014
|
await apiStream(
|
|
957
1015
|
"/api/setups/generate",
|
|
958
1016
|
{
|
|
@@ -967,13 +1025,15 @@ async function initCommand(options) {
|
|
|
967
1025
|
setupExplanation = payload.explanation;
|
|
968
1026
|
},
|
|
969
1027
|
(error) => {
|
|
1028
|
+
genMessages.stop();
|
|
970
1029
|
trackEvent("error_occurred", { error_type: "generation_failed", error_message: error });
|
|
971
1030
|
genSpinner.fail(`Generation error: ${error}`);
|
|
972
1031
|
},
|
|
973
1032
|
(status) => {
|
|
974
|
-
|
|
1033
|
+
genMessages.handleServerStatus(status);
|
|
975
1034
|
}
|
|
976
1035
|
);
|
|
1036
|
+
genMessages.stop();
|
|
977
1037
|
if (!generatedSetup) {
|
|
978
1038
|
genSpinner.fail("Failed to generate setup.");
|
|
979
1039
|
process.exit(1);
|
|
@@ -1079,6 +1139,8 @@ async function refineLoop(currentSetup, _targetAgent) {
|
|
|
1079
1139
|
trackEvent("refinement_message_sent", { refinement_round: refinementRound });
|
|
1080
1140
|
let refined = null;
|
|
1081
1141
|
const refineSpinner = ora2("Refining setup...").start();
|
|
1142
|
+
const refineMessages = new SpinnerMessages(refineSpinner, REFINE_MESSAGES);
|
|
1143
|
+
refineMessages.start();
|
|
1082
1144
|
await apiStream(
|
|
1083
1145
|
"/api/setups/refine",
|
|
1084
1146
|
{ currentSetup, message, conversationHistory: history },
|
|
@@ -1088,12 +1150,14 @@ async function refineLoop(currentSetup, _targetAgent) {
|
|
|
1088
1150
|
refined = payload.setup;
|
|
1089
1151
|
},
|
|
1090
1152
|
(error) => {
|
|
1153
|
+
refineMessages.stop();
|
|
1091
1154
|
refineSpinner.fail(`Refinement error: ${error}`);
|
|
1092
1155
|
},
|
|
1093
1156
|
(status) => {
|
|
1094
|
-
|
|
1157
|
+
refineMessages.handleServerStatus(status);
|
|
1095
1158
|
}
|
|
1096
1159
|
);
|
|
1160
|
+
refineMessages.stop();
|
|
1097
1161
|
if (refined) {
|
|
1098
1162
|
currentSetup = refined;
|
|
1099
1163
|
history.push({ role: "user", content: message });
|
|
@@ -1299,6 +1363,8 @@ async function updateCommand(options) {
|
|
|
1299
1363
|
trackEvent("generation_started", { target_agent: "both" });
|
|
1300
1364
|
const generationStart = Date.now();
|
|
1301
1365
|
const genSpinner = ora4("Regenerating setup...").start();
|
|
1366
|
+
const genMessages = new SpinnerMessages(genSpinner, GENERATION_MESSAGES);
|
|
1367
|
+
genMessages.start();
|
|
1302
1368
|
await apiStream(
|
|
1303
1369
|
"/api/setups/generate",
|
|
1304
1370
|
{
|
|
@@ -1311,13 +1377,15 @@ async function updateCommand(options) {
|
|
|
1311
1377
|
generatedSetup = payload.setup;
|
|
1312
1378
|
},
|
|
1313
1379
|
(error) => {
|
|
1380
|
+
genMessages.stop();
|
|
1314
1381
|
trackEvent("error_occurred", { error_type: "generation_failed", error_message: error });
|
|
1315
1382
|
genSpinner.fail(`Generation error: ${error}`);
|
|
1316
1383
|
},
|
|
1317
1384
|
(status) => {
|
|
1318
|
-
|
|
1385
|
+
genMessages.handleServerStatus(status);
|
|
1319
1386
|
}
|
|
1320
1387
|
);
|
|
1388
|
+
genMessages.stop();
|
|
1321
1389
|
if (!generatedSetup) {
|
|
1322
1390
|
genSpinner.fail("Failed to regenerate setup.");
|
|
1323
1391
|
process.exit(1);
|
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/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';\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 { 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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@caliber-ai/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
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",
|