@caliber-ai/cli 0.21.0 → 0.21.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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/lib/sentry.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/fingerprint/code-analysis.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/writers/staging.ts","../src/utils/editor.ts","../src/lib/hooks.ts","../src/lib/state.ts","../src/utils/spinner-messages.ts","../src/commands/undo.ts","../src/commands/status.ts","../src/scanner/index.ts","../src/commands/regenerate.ts","../src/commands/logout.ts","../src/commands/recommend.ts","../src/commands/sync.ts","../src/commands/diff.ts","../src/commands/refresh.ts","../src/lib/git-diff.ts","../src/writers/refresh.ts","../src/commands/hooks.ts","../src/commands/review.ts","../src/utils/version-check.ts","../src/bin.ts"],"sourcesContent":["import path from 'path';\nimport os from 'os';\n\nexport const API_URL = process.env.CALIBER_API_URL || 'https://caliber-backend.up.railway.app';\nexport const FRONTEND_URL = process.env.CALIBER_FRONTEND_URL || 'https://caliber-app.up.railway.app';\nexport const CLI_CALLBACK_PORT = 19284;\nexport const AUTH_DIR = path.join(os.homedir(), '.caliber');\nexport const AUTH_FILE = path.join(AUTH_DIR, 'auth.json');\nexport const CALIBER_DIR = '.caliber';\nexport const MANIFEST_FILE = path.join(CALIBER_DIR, 'manifest.json');\nexport const BACKUPS_DIR = path.join(CALIBER_DIR, 'backups');\n","import * as Sentry from '@sentry/node';\nimport os from 'os';\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst dsn = process.env.CALIBER_SENTRY_DSN || 'https://e988132485fced78d7d60202f97942b3@o4510975175622656.ingest.us.sentry.io/4510975226347520';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n fs.readFileSync(path.resolve(__dirname, '..', 'package.json'), 'utf-8')\n);\n\nif (dsn) {\n Sentry.init({\n dsn,\n release: `caliber-cli@${pkg.version}`,\n environment: process.env.NODE_ENV || 'production',\n tracesSampleRate: 0,\n beforeSend(event) {\n event.tags = { ...event.tags, source: 'cli', os: os.platform() };\n return event;\n },\n });\n}\n\nexport { Sentry };\n","import { Command } from 'commander';\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { initCommand } from './commands/init.js';\nimport { undoCommand } from './commands/undo.js';\nimport { statusCommand } from './commands/status.js';\nimport { regenerateCommand } from './commands/regenerate.js';\nimport { loginCommand } from './commands/login.js';\nimport { logoutCommand } from './commands/logout.js';\nimport { recommendCommand } from './commands/recommend.js';\n// import { healthCommand } from './commands/health.js';\nimport { syncCommand } from './commands/sync.js';\nimport { diffCommand } from './commands/diff.js';\nimport { refreshCommand } from './commands/refresh.js';\nimport { hooksInstallCommand, hooksRemoveCommand, hooksStatusCommand } from './commands/hooks.js';\nimport { reviewCommand } from './commands/review.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n fs.readFileSync(path.resolve(__dirname, '..', 'package.json'), 'utf-8')\n);\n\nconst program = new Command();\n\nconst displayVersion = process.env.CALIBER_LOCAL ? `${pkg.version}-local` : pkg.version;\n\nprogram\n .name(process.env.CALIBER_LOCAL ? 'caloc' : 'caliber')\n .description('Configure your coding agent environment')\n .version(displayVersion);\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('regenerate')\n .alias('regen')\n .alias('re')\n .alias('update')\n .description('Re-analyze project and regenerate setup')\n .option('--dry-run', 'Preview changes without writing files')\n .action(regenerateCommand);\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\nprogram\n .command('recommend')\n .description('Discover and manage skill recommendations')\n .option('--generate', 'Force fresh recommendation generation')\n .option('--status <status>', 'View recommendations by status: pending, accepted, dismissed')\n .action(recommendCommand);\n\n// Health command disabled — feature not ready\n// program\n// .command('health')\n// .description('Analyze context health and quality')\n// .option('--fix', 'Generate and execute a fix plan')\n// .option('--json', 'Output as JSON')\n// .action(healthCommand);\n\nprogram\n .command('sync')\n .description('Sync local config with server state')\n .option('--platform <platform>', 'Target platform: claude, cursor, or both')\n .option('--dry-run', 'Preview changes without writing files')\n .action(syncCommand);\n\nprogram\n .command('diff')\n .description('Compare local config with server state')\n .option('--platform <platform>', 'Target platform: claude, cursor, or both')\n .action(diffCommand);\n\nprogram\n .command('refresh')\n .description('Update docs based on recent code changes')\n .option('--quiet', 'Suppress output (for use in hooks)')\n .option('--dry-run', 'Preview changes without writing files')\n .action(refreshCommand);\n\nprogram\n .command('review [message]')\n .description('Share feedback on Caliber (e.g. caliber review \"love it!\")')\n .option('-r, --rating <number>', 'Rating from 1-5')\n .action(reviewCommand);\n\nconst hooks = program\n .command('hooks')\n .description('Manage Claude Code session hooks');\n\nhooks\n .command('install')\n .description('Install auto-refresh SessionEnd hook')\n .action(hooksInstallCommand);\n\nhooks\n .command('remove')\n .description('Remove auto-refresh SessionEnd hook')\n .action(hooksRemoveCommand);\n\nhooks\n .command('status')\n .description('Check if auto-refresh hook is installed')\n .action(hooksStatusCommand);\n\nexport { program };\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport readline from 'readline';\nimport select from '@inquirer/select';\nimport fs from 'fs';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { loginCommand } from './login.js';\nimport { collectFingerprint, computeFingerprintHash, enrichFingerprintWithLLM } from '../fingerprint/index.js';\nimport { apiRequest, apiStream } from '../api/client.js';\nimport { writeSetup } from '../writers/index.js';\nimport { stageFiles, cleanupStaging } from '../writers/staging.js';\nimport type { StagedFile } from '../writers/staging.js';\nimport { detectAvailableEditors, openDiffsInEditor } from '../utils/editor.js';\nimport type { ReviewMethod } from '../utils/editor.js';\nimport { createTwoFilesPatch } from 'diff';\nimport { trackEvent } from '../telemetry.js';\nimport { installHook } from '../lib/hooks.js';\nimport { writeState, getCurrentHeadSha } from '../lib/state.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 console.log(chalk.bold(' What is Caliber?\\n'));\n console.log(chalk.dim(' Caliber audits your AI agent configurations and suggests targeted'));\n console.log(chalk.dim(' improvements. It analyzes CLAUDE.md, .cursorrules, and skills'));\n console.log(chalk.dim(' against your actual codebase — keeping what works, fixing'));\n console.log(chalk.dim(' what\\'s stale, and adding what\\'s missing.\\n'));\n\n console.log(chalk.bold(' How it works:\\n'));\n console.log(chalk.dim(' 1. Scan Analyze your code, dependencies, and file structure'));\n console.log(chalk.dim(' 2. Match Detect existing configs and check for teammate setups'));\n console.log(chalk.dim(' 3. Generate AI creates config files tailored to your project'));\n console.log(chalk.dim(' 4. Review You accept, refine, or decline the generated setup'));\n console.log(chalk.dim(' 5. Apply Config files are written to your project'));\n console.log(chalk.dim(' 6. Sync Setup is saved so teammates get the same config\\n'));\n\n // Step 1: Auth check\n console.log(chalk.hex('#6366f1').bold(' Step 1/6 — Authenticate\\n'));\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 throw new Error('__exit__');\n }\n }\n console.log(chalk.dim(`Authenticated as ${auth.email}\\n`));\n\n // Step 2: Collect fingerprint\n console.log(chalk.hex('#6366f1').bold(' Step 2/6 — Scan project\\n'));\n console.log(chalk.dim(' Detecting languages, frameworks, file structure, and existing configs.\\n'));\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 const enrichmentPromise = enrichFingerprintWithLLM(fingerprint, process.cwd());\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 cursor_skills_count: fingerprint.existingConfigs.cursorSkills?.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: Detect existing setup (local configs + teammate)\n console.log(chalk.hex('#6366f1').bold(' Step 3/6 — Match project\\n'));\n console.log(chalk.dim(' Scanning for existing rules, skills, and teammate setups.\\n'));\n const matchSpinner = ora('Scanning for existing setup...').start();\n\n // Build list of existing local config files\n const localConfigs: string[] = [];\n const ec = fingerprint.existingConfigs;\n if (ec.claudeMd) localConfigs.push('CLAUDE.md');\n if (ec.claudeSettings) localConfigs.push('.claude/settings.json');\n if (Array.isArray(ec.claudeSkills)) {\n for (const skill of ec.claudeSkills) {\n localConfigs.push(`.claude/skills/${skill.filename}`);\n }\n }\n if (ec.cursorrules) localConfigs.push('.cursorrules');\n if (Array.isArray(ec.cursorRules)) {\n for (const rule of ec.cursorRules) {\n localConfigs.push(`.cursor/rules/${rule.filename}`);\n }\n }\n if (Array.isArray(ec.cursorSkills)) {\n for (const skill of ec.cursorSkills) {\n localConfigs.push(`.cursor/skills/${skill.slug}/SKILL.md`);\n }\n }\n\n\n // Check server for teammate setup\n let existingSetup = null;\n let existingProjectId: string | null = null;\n let hasTeammateSetup = false;\n try {\n const match = await apiRequest<{ project: { id: string } | null; setup: unknown }>('/api/projects/match', {\n method: 'POST',\n body: { fingerprintHash: hash },\n });\n if (match.project) {\n existingProjectId = match.project.id;\n }\n if (match.setup) {\n existingSetup = match.setup;\n hasTeammateSetup = true;\n trackEvent('existing_config_detected', {\n has_claude_md: !!fingerprint.existingConfigs.claudeMd,\n has_cursorrules: !!fingerprint.existingConfigs.cursorrules,\n has_cursor_rules: (fingerprint.existingConfigs.cursorRules?.length ?? 0) > 0,\n has_skills: (fingerprint.existingConfigs.claudeSkills?.length ?? 0) > 0,\n });\n }\n } catch {\n // Server check failed — continue with local-only results\n }\n\n // Display results\n matchSpinner.stop();\n\n // Local configs section\n console.log(chalk.dim(' Local configs:'));\n if (localConfigs.length > 0) {\n for (const config of localConfigs) {\n console.log(` ${chalk.green('✓')} ${config}`);\n }\n } else {\n console.log(` ${chalk.dim('ℹ None found')}`);\n }\n\n // Teammate setup section\n console.log('');\n console.log(chalk.dim(' Teammate setup:'));\n if (hasTeammateSetup) {\n console.log(` ${chalk.green('✓')} Found on Caliber`);\n } else {\n console.log(` ${chalk.dim('ℹ None found')}`);\n }\n console.log('');\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 // Await LLM enrichment before generation\n await enrichmentPromise;\n\n // Step 6: Generate setup via AI\n console.log(chalk.hex('#6366f1').bold(' Step 4/6 — Auditing your configs\\n'));\n console.log(chalk.dim(' AI is auditing your CLAUDE.md, skills, and rules against your'));\n console.log(chalk.dim(' project\\'s actual codebase and conventions.\\n'));\n console.log(chalk.dim(' This usually takes 1–3 minutes on first run.\\n'));\n let generatedSetup: Record<string, unknown> | null = null;\n let rawOutput: string | undefined;\n\n trackEvent('generation_started', { target_agent: targetAgent });\n\n // Determine if we're improving an existing setup or creating from scratch\n const hasExistingConfig = !!(\n ec.claudeMd || ec.claudeSettings || ec.claudeSkills?.length ||\n ec.cursorrules || ec.cursorRules?.length\n );\n\n const genStartTime = Date.now();\n const genSpinner = ora('Generating setup...').start();\n const genMessages = new SpinnerMessages(genSpinner, GENERATION_MESSAGES, { showElapsedTime: true });\n genMessages.start();\n\n try {\n await apiStream(\n '/api/setups/generate',\n {\n fingerprint,\n targetAgent,\n prompt: fingerprint.description,\n mode: hasExistingConfig ? 'improve' : 'create',\n },\n () => {},\n (payload) => {\n generatedSetup = payload.setup as Record<string, unknown>;\n rawOutput = payload.raw;\n },\n (error) => {\n genMessages.stop();\n trackEvent('error_occurred', { error_type: 'generation_failed', error_message: error, command: 'init' });\n genSpinner.fail(`Generation error: ${error}`);\n },\n (status) => { genMessages.handleServerStatus(status); }\n );\n } catch (err) {\n genMessages.stop();\n const msg = err instanceof Error ? err.message : 'Unknown error';\n trackEvent('error_occurred', { error_type: 'generation_request_failed', error_message: msg, command: 'init' });\n genSpinner.fail(`Generation failed: ${msg}`);\n throw new Error('__exit__');\n }\n\n genMessages.stop();\n\n if (!generatedSetup) {\n genSpinner.fail('Failed to generate setup.');\n if (rawOutput) {\n console.log(chalk.dim('\\nRaw LLM output (JSON parse failed):'));\n console.log(chalk.dim(rawOutput.slice(0, 500)));\n }\n throw new Error('__exit__');\n }\n\n const elapsedMs = Date.now() - genStartTime;\n const mins = Math.floor(elapsedMs / 60000);\n const secs = Math.floor((elapsedMs % 60000) / 1000);\n const timeStr = mins > 0 ? `${mins}m ${secs}s` : `${secs}s`;\n genSpinner.succeed(`Setup generated ${chalk.dim(`in ${timeStr}`)}`);\n printSetupSummary(generatedSetup);\n\n // Step 7: Accept / Refine / Decline with staging\n console.log(chalk.hex('#6366f1').bold(' Step 5/6 — Review\\n'));\n\n const setupFiles = collectSetupFiles(generatedSetup);\n const staged = stageFiles(setupFiles, process.cwd());\n\n console.log(chalk.dim(` ${chalk.green(`${staged.newFiles} new`)} / ${chalk.yellow(`${staged.modifiedFiles} modified`)} file${staged.newFiles + staged.modifiedFiles !== 1 ? 's' : ''}\\n`));\n\n const reviewMethod = await promptReviewMethod();\n openReview(reviewMethod, staged.stagedFiles);\n\n let action = await promptReviewAction();\n\n while (action === 'refine') {\n generatedSetup = await refineLoop(generatedSetup, targetAgent);\n if (!generatedSetup) {\n cleanupStaging();\n trackEvent('refinement_cancelled');\n console.log(chalk.dim('Refinement cancelled. No files were modified.'));\n return;\n }\n const updatedFiles = collectSetupFiles(generatedSetup);\n const restaged = stageFiles(updatedFiles, process.cwd());\n console.log(chalk.dim(` ${chalk.green(`${restaged.newFiles} new`)} / ${chalk.yellow(`${restaged.modifiedFiles} modified`)} file${restaged.newFiles + restaged.modifiedFiles !== 1 ? 's' : ''}\\n`));\n openReview(reviewMethod, restaged.stagedFiles);\n printSetupSummary(generatedSetup);\n action = await promptReviewAction();\n }\n\n cleanupStaging();\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 // Step 8: Write files\n console.log(chalk.hex('#6366f1').bold(' Step 6/6 — Apply & sync\\n'));\n console.log(chalk.dim(' Writing config files to your project and syncing to Caliber so'));\n console.log(chalk.dim(' teammates get the same setup when they run `caliber init`.\\n'));\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', {\n files_written: result.written.length,\n files_deleted: result.deleted.length,\n target_agent: targetAgent,\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.deleted.length > 0) {\n console.log(chalk.bold('\\nFiles removed:'));\n for (const file of result.deleted) {\n console.log(` ${chalk.red('✗')} ${file}`);\n }\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 throw new Error('__exit__');\n }\n\n // Auto-install refresh hook for Claude Code users\n if (targetAgent === 'claude' || targetAgent === 'both') {\n const hookResult = installHook();\n if (hookResult.installed) {\n console.log(` ${chalk.green('✓')} Auto-refresh hook installed — docs update on Claude Code session end`);\n console.log(chalk.dim(' Run `caliber hooks remove` to disable'));\n const sha = getCurrentHeadSha();\n if (sha) {\n writeState({ lastRefreshSha: sha, lastRefreshTimestamp: new Date().toISOString() });\n }\n } else if (hookResult.alreadyInstalled) {\n console.log(chalk.dim(' Auto-refresh hook already installed'));\n }\n }\n\n // Step 9: Save to server\n try {\n let projectId = existingProjectId;\n\n if (!projectId) {\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 projectId = project.id;\n }\n\n await apiRequest(`/api/setups/project/${projectId}`, {\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 console.log(chalk.bold(' Next steps:\\n'));\n console.log(` ${chalk.hex('#6366f1')('caliber recommend')} Discover additional skills for your stack`);\n console.log(` ${chalk.hex('#6366f1')('caliber undo')} Revert all changes from this run`);\n console.log('');\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 let streamError: string | 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) => { streamError = error; },\n (status) => { refineMessages.handleServerStatus(status); }\n );\n\n refineMessages.stop();\n\n if (streamError) {\n refineSpinner.fail(`Refinement failed: ${streamError}`);\n console.log(chalk.dim('Try rephrasing your request, or type \"done\" to keep the current setup.'));\n } else 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 } else {\n refineSpinner.fail('Refinement failed — could not parse AI response.');\n console.log(chalk.dim('Try rephrasing your request, or type \"done\" to keep the current setup.'));\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\nasync function promptAgent(): Promise<TargetAgent> {\n return select({\n message: 'Which coding agent are you using?',\n choices: [\n { name: 'Claude Code', value: 'claude' as const },\n { name: 'Cursor', value: 'cursor' as const },\n { name: 'Both', value: 'both' as const },\n ],\n });\n}\n\nasync function promptReviewMethod(): Promise<ReviewMethod> {\n const available = detectAvailableEditors();\n if (available.length === 1) return 'terminal';\n\n const choices = available.map(method => {\n switch (method) {\n case 'cursor': return { name: 'Cursor (diff view)', value: 'cursor' as const };\n case 'vscode': return { name: 'VS Code (diff view)', value: 'vscode' as const };\n case 'terminal': return { name: 'Terminal', value: 'terminal' as const };\n }\n });\n\n return select({ message: 'How would you like to review the changes?', choices });\n}\n\nfunction openReview(method: ReviewMethod, stagedFiles: StagedFile[]): void {\n if (method === 'cursor' || method === 'vscode') {\n openDiffsInEditor(method, stagedFiles.map(f => ({\n originalPath: f.originalPath,\n proposedPath: f.proposedPath,\n })));\n console.log(chalk.dim(' Diffs opened in your editor.\\n'));\n } else {\n for (const file of stagedFiles) {\n console.log(chalk.bold(` ${file.relativePath}`));\n if (file.currentPath) {\n const current = fs.readFileSync(file.currentPath, 'utf-8');\n const proposed = fs.readFileSync(file.proposedPath, 'utf-8');\n const patch = createTwoFilesPatch(file.relativePath, file.relativePath, current, proposed, 'current', 'proposed');\n for (const line of patch.split('\\n').slice(2)) {\n if (line.startsWith('+')) console.log(chalk.green(` ${line}`));\n else if (line.startsWith('-')) console.log(chalk.red(` ${line}`));\n else console.log(chalk.dim(` ${line}`));\n }\n } else {\n console.log(chalk.green(' (new file)'));\n const content = fs.readFileSync(file.proposedPath, 'utf-8');\n const preview = content.split('\\n').slice(0, 20);\n for (const line of preview) console.log(chalk.green(` +${line}`));\n if (content.split('\\n').length > 20) console.log(chalk.dim(` ... ${content.split('\\n').length - 20} more lines`));\n }\n console.log('');\n }\n }\n}\n\nasync function promptReviewAction(): Promise<'accept' | 'refine' | 'decline'> {\n return select({\n message: 'What would you like to do?',\n choices: [\n { name: 'Accept and apply', value: 'accept' as const },\n { name: 'Refine via chat', value: 'refine' as const },\n { name: 'Decline', value: 'decline' as const },\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 const fileDescriptions = setup.fileDescriptions as Record<string, string> | undefined;\n const deletions = setup.deletions as Array<{ filePath: string; reason: string }> | undefined;\n\n console.log('');\n console.log(chalk.bold(' Proposed changes:\\n'));\n\n const getDescription = (filePath: string): string | undefined => {\n return fileDescriptions?.[filePath];\n };\n\n if (claude) {\n if (claude.claudeMd) {\n const icon = fs.existsSync('CLAUDE.md') ? chalk.yellow('~') : chalk.green('+');\n const desc = getDescription('CLAUDE.md');\n console.log(` ${icon} ${chalk.bold('CLAUDE.md')}`);\n if (desc) {\n console.log(chalk.dim(` ${desc}`));\n }\n console.log('');\n }\n\n const skills = claude.skills as Array<{ name: string; content: string }> | undefined;\n if (Array.isArray(skills) && skills.length > 0) {\n for (const skill of skills) {\n const skillPath = `.claude/skills/${skill.name.replace(/[^a-z0-9-]/gi, '-').toLowerCase()}.md`;\n const icon = fs.existsSync(skillPath) ? chalk.yellow('~') : chalk.green('+');\n const desc = getDescription(skillPath);\n console.log(` ${icon} ${chalk.bold(skillPath)}`);\n console.log(chalk.dim(` ${desc || summarizeSkill(skill)}`));\n console.log('');\n }\n }\n\n }\n\n if (cursor) {\n if (cursor.cursorrules) {\n const icon = fs.existsSync('.cursorrules') ? chalk.yellow('~') : chalk.green('+');\n const desc = getDescription('.cursorrules');\n console.log(` ${icon} ${chalk.bold('.cursorrules')}`);\n if (desc) console.log(chalk.dim(` ${desc}`));\n console.log('');\n }\n\n const cursorSkills = cursor.skills as Array<{ name: string; slug: string; content: string }> | undefined;\n if (Array.isArray(cursorSkills) && cursorSkills.length > 0) {\n for (const skill of cursorSkills) {\n const skillPath = `.cursor/skills/${skill.slug}/SKILL.md`;\n const icon = fs.existsSync(skillPath) ? chalk.yellow('~') : chalk.green('+');\n const desc = getDescription(skillPath);\n console.log(` ${icon} ${chalk.bold(skillPath)}`);\n if (desc) {\n console.log(chalk.dim(` ${desc}`));\n } else {\n const firstLine = skill.content.split('\\n').filter(l => l.trim() && !l.trim().startsWith('#') && !l.trim().startsWith('---'))[0];\n if (firstLine) console.log(chalk.dim(` ${firstLine.trim().slice(0, 80)}`));\n }\n console.log('');\n }\n }\n\n const rules = cursor.rules as Array<{ filename: string; content: string }> | undefined;\n if (Array.isArray(rules) && rules.length > 0) {\n for (const rule of rules) {\n const rulePath = `.cursor/rules/${rule.filename}`;\n const icon = fs.existsSync(rulePath) ? chalk.yellow('~') : chalk.green('+');\n const desc = getDescription(rulePath);\n console.log(` ${icon} ${chalk.bold(rulePath)}`);\n if (desc) {\n console.log(chalk.dim(` ${desc}`));\n } else {\n const firstLine = rule.content.split('\\n').filter(l => l.trim() && !l.trim().startsWith('#'))[0];\n if (firstLine) console.log(chalk.dim(` ${firstLine.trim().slice(0, 80)}`));\n }\n console.log('');\n }\n }\n\n }\n\n if (Array.isArray(deletions) && deletions.length > 0) {\n for (const del of deletions) {\n console.log(` ${chalk.red('-')} ${chalk.bold(del.filePath)}`);\n console.log(chalk.dim(` ${del.reason}`));\n console.log('');\n }\n }\n\n console.log(` ${chalk.green('+')} ${chalk.dim('new')} ${chalk.yellow('~')} ${chalk.dim('modified')} ${chalk.red('-')} ${chalk.dim('removed')}`);\n console.log('');\n}\n\nfunction summarizeSkill(skill: { name: string; content: string }): string {\n const lines = skill.content.split('\\n').filter(l => l.trim() && !l.trim().startsWith('#'));\n return lines[0]?.trim().slice(0, 80) || skill.name;\n}\n\nfunction collectSetupFiles(setup: Record<string, unknown>): Array<{ path: string; content: string }> {\n const files: Array<{ path: string; content: string }> = [];\n const claude = setup.claude as Record<string, unknown> | undefined;\n const cursor = setup.cursor as Record<string, unknown> | undefined;\n\n if (claude) {\n if (claude.claudeMd) files.push({ path: 'CLAUDE.md', content: claude.claudeMd as string });\n const skills = claude.skills as Array<{ name: string; content: string }> | undefined;\n if (Array.isArray(skills)) {\n for (const skill of skills) {\n const skillPath = `.claude/skills/${skill.name.replace(/[^a-z0-9-]/gi, '-').toLowerCase()}.md`;\n files.push({ path: skillPath, content: skill.content });\n }\n }\n }\n\n if (cursor) {\n if (cursor.cursorrules) files.push({ path: '.cursorrules', content: cursor.cursorrules as string });\n const cursorSkills = cursor.skills as Array<{ name: string; slug: string; content: string }> | undefined;\n if (Array.isArray(cursorSkills)) {\n for (const skill of cursorSkills) {\n files.push({ path: `.cursor/skills/${skill.slug}/SKILL.md`, content: skill.content });\n }\n }\n const rules = cursor.rules as Array<{ filename: string; content: string }> | undefined;\n if (Array.isArray(rules)) {\n for (const rule of rules) {\n files.push({ path: `.cursor/rules/${rule.filename}`, content: rule.content });\n }\n }\n }\n\n return files;\n}\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\n console.log('');\n console.log(chalk.bold(' Next step:'));\n console.log('');\n console.log(` ${chalk.hex('#6366f1')('caliber init')} ${chalk.dim('Run this inside a project to generate your agent config')}`);\n console.log('');\n } catch (err) {\n trackEvent('error_occurred', { error_type: 'auth_failed', error_message: err instanceof Error ? err.message : 'Unknown error', command: 'login' });\n spinner.fail(chalk.red(`Authentication failed: ${err instanceof Error ? err.message : 'Unknown error'}`));\n throw new Error('__exit__');\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 { fileURLToPath } from 'url';\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 __dirname_telemetry = path.dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n fs.readFileSync(path.resolve(__dirname_telemetry, '..', 'package.json'), '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 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 fs from 'fs';\nimport path from 'path';\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';\nimport { analyzeCode, CodeAnalysis } from './code-analysis.js';\nimport { apiRequest } from '../api/client.js';\n\nexport type { CodeAnalysis };\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 codeAnalysis?: CodeAnalysis;\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 const codeAnalysis = analyzeCode(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 codeAnalysis,\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\nconst DEP_FILE_PATTERNS = [\n 'package.json',\n 'pyproject.toml',\n 'requirements.txt',\n 'setup.py',\n 'Pipfile',\n 'Cargo.toml',\n 'go.mod',\n 'Gemfile',\n 'build.gradle',\n 'pom.xml',\n 'composer.json',\n];\n\nconst MAX_CONTENT_SIZE = 50 * 1024;\n\nexport async function enrichFingerprintWithLLM(fingerprint: Fingerprint, dir: string): Promise<void> {\n try {\n const fileContents: Record<string, string> = {};\n let totalSize = 0;\n\n for (const treePath of fingerprint.fileTree) {\n const basename = path.basename(treePath);\n if (!DEP_FILE_PATTERNS.includes(basename)) continue;\n\n const fullPath = path.join(dir, treePath);\n if (!fs.existsSync(fullPath)) continue;\n\n try {\n const content = fs.readFileSync(fullPath, 'utf-8');\n if (totalSize + content.length > MAX_CONTENT_SIZE) break;\n fileContents[treePath] = content;\n totalSize += content.length;\n } catch {\n continue;\n }\n }\n\n if (Object.keys(fileContents).length === 0 && fingerprint.fileTree.length === 0) return;\n\n const result = await apiRequest<{ languages: string[]; frameworks: string[] }>(\n '/api/fingerprint/detect',\n {\n method: 'POST',\n body: { fileTree: fingerprint.fileTree, fileContents },\n }\n );\n\n if (result.languages?.length) {\n const langSet = new Set(fingerprint.languages);\n for (const lang of result.languages) langSet.add(lang);\n fingerprint.languages = [...langSet];\n }\n\n if (result.frameworks?.length) {\n const fwSet = new Set(fingerprint.frameworks);\n for (const fw of result.frameworks) fwSet.add(fw);\n fingerprint.frameworks = [...fwSet];\n }\n } catch {\n // Silently fall back to local detection\n }\n}\n","import { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { resolve, dirname } from 'path';\n\nfunction isInsideGitRepo(): boolean {\n let dir = process.cwd();\n while (true) {\n if (existsSync(resolve(dir, '.git'))) return true;\n const parent = dirname(dir);\n if (parent === dir) return false;\n dir = parent;\n }\n}\n\nexport function getGitRemoteUrl(): string | undefined {\n if (!isInsideGitRepo()) return 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 return isInsideGitRepo();\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 readmeMd?: string;\n claudeSettings?: Record<string, unknown>;\n claudeSkills?: Array<{ filename: string; content: string }>;\n cursorrules?: string;\n cursorRules?: Array<{ filename: string; content: string }>;\n cursorSkills?: Array<{ slug: string; filename: string; content: string }>;\n claudeMcpServers?: Record<string, unknown>;\n cursorMcpServers?: Record<string, unknown>;\n } = {};\n\n // README.md\n const readmeMdPath = path.join(dir, 'README.md');\n if (fs.existsSync(readmeMdPath)) {\n configs.readmeMd = fs.readFileSync(readmeMdPath, 'utf-8');\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 // .cursor/skills/*/SKILL.md\n const cursorSkillsDir = path.join(dir, '.cursor', 'skills');\n if (fs.existsSync(cursorSkillsDir)) {\n try {\n const slugs = fs.readdirSync(cursorSkillsDir).filter(f => {\n return fs.statSync(path.join(cursorSkillsDir, f)).isDirectory();\n });\n configs.cursorSkills = slugs\n .filter(slug => fs.existsSync(path.join(cursorSkillsDir, slug, 'SKILL.md')))\n .map(slug => ({\n slug,\n filename: 'SKILL.md',\n content: fs.readFileSync(path.join(cursorSkillsDir, slug, 'SKILL.md'), 'utf-8'),\n }));\n } catch {\n // ignore\n }\n }\n\n // .mcp.json (Claude MCP servers)\n const mcpJsonPath = path.join(dir, '.mcp.json');\n if (fs.existsSync(mcpJsonPath)) {\n try {\n const mcpJson = JSON.parse(fs.readFileSync(mcpJsonPath, 'utf-8'));\n if (mcpJson.mcpServers) {\n configs.claudeMcpServers = mcpJson.mcpServers;\n }\n } catch {\n // ignore\n }\n }\n\n // .cursor/mcp.json (Cursor MCP servers)\n const cursorMcpPath = path.join(dir, '.cursor', 'mcp.json');\n if (fs.existsSync(cursorMcpPath)) {\n try {\n const cursorMcpJson = JSON.parse(fs.readFileSync(cursorMcpPath, 'utf-8'));\n if (cursorMcpJson.mcpServers) {\n configs.cursorMcpServers = cursorMcpJson.mcpServers;\n }\n } catch {\n // ignore\n }\n }\n\n return configs;\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\nconst SOURCE_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.py']);\n\nconst CONFIG_FILE_NAMES = new Set([\n 'Dockerfile', 'docker-compose.yml', 'docker-compose.yaml',\n 'Makefile', 'tsconfig.json', 'pyproject.toml', 'turbo.json',\n 'next.config.js', 'next.config.mjs', 'next.config.ts',\n 'vite.config.ts', 'vite.config.js', 'vite.config.mjs',\n 'drizzle.config.ts', 'drizzle.config.js',\n 'jest.config.ts', 'jest.config.js', 'jest.config.mjs',\n 'vitest.config.ts', 'vitest.config.js', 'vitest.config.mts',\n 'alembic.ini', 'setup.cfg', 'tox.ini',\n]);\n\nconst CONFIG_GLOBS_DIRS: Array<{ dir: string; pattern: RegExp }> = [\n { dir: '.github/workflows', pattern: /\\.ya?ml$/ },\n];\n\nconst TOTAL_BUDGET = 50_000;\nconst CONFIG_BUDGET = Math.floor(TOTAL_BUDGET * 0.3);\nconst SOURCE_BUDGET = Math.floor(TOTAL_BUDGET * 0.7);\n\nexport interface FileSummary {\n path: string;\n language: 'ts' | 'js' | 'py';\n imports: string[];\n exports: string[];\n functions: string[];\n classes: string[];\n types: string[];\n routes: string[];\n}\n\nexport interface ConfigFileContent {\n path: string;\n content: string;\n}\n\nexport interface CodeAnalysis {\n fileSummaries: FileSummary[];\n configFiles: ConfigFileContent[];\n truncated: boolean;\n}\n\nexport function analyzeCode(dir: string): CodeAnalysis {\n const sourceFiles: string[] = [];\n const configFiles: ConfigFileContent[] = [];\n\n walkDir(dir, '', 0, 10, sourceFiles, configFiles, dir);\n\n sortByPriority(sourceFiles);\n\n let configChars = 0;\n const trimmedConfigs: ConfigFileContent[] = [];\n for (const cfg of configFiles) {\n const size = cfg.path.length + cfg.content.length;\n if (configChars + size > CONFIG_BUDGET) break;\n trimmedConfigs.push(cfg);\n configChars += size;\n }\n\n let sourceChars = 0;\n let truncated = false;\n const fileSummaries: FileSummary[] = [];\n\n for (const relPath of sourceFiles) {\n const fullPath = path.join(dir, relPath);\n let content: string;\n try {\n content = fs.readFileSync(fullPath, 'utf-8');\n } catch {\n continue;\n }\n\n const lineCount = content.split('\\n').length;\n if (lineCount > 500) continue;\n\n const ext = path.extname(relPath);\n const language = resolveLanguage(ext);\n if (!language) continue;\n\n const summary = language === 'py'\n ? extractPython(relPath, content)\n : extractTypeScriptJavaScript(relPath, content, language);\n\n const summarySize = estimateSummarySize(summary);\n if (sourceChars + summarySize > SOURCE_BUDGET) {\n truncated = true;\n break;\n }\n\n fileSummaries.push(summary);\n sourceChars += summarySize;\n }\n\n return { fileSummaries, configFiles: trimmedConfigs, truncated };\n}\n\nfunction walkDir(\n base: string,\n rel: string,\n depth: number,\n maxDepth: number,\n sourceFiles: string[],\n configFiles: ConfigFileContent[],\n rootDir: string\n) {\n if (depth > maxDepth) return;\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 (IGNORE_DIRS.has(entry.name)) continue;\n if (entry.name.startsWith('.') && depth === 0 && entry.isDirectory()) continue;\n\n const relPath = rel ? `${rel}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n const matchedGlobDir = CONFIG_GLOBS_DIRS.find(\n (g) => relPath === g.dir || relPath.endsWith(`/${g.dir}`)\n );\n if (matchedGlobDir) {\n collectConfigsFromDir(base, relPath, matchedGlobDir.pattern, configFiles);\n }\n walkDir(base, relPath, depth + 1, maxDepth, sourceFiles, configFiles, rootDir);\n } else {\n if (CONFIG_FILE_NAMES.has(entry.name)) {\n try {\n const content = fs.readFileSync(path.join(base, relPath), 'utf-8');\n configFiles.push({ path: relPath, content });\n } catch {}\n }\n\n const ext = path.extname(entry.name);\n if (SOURCE_EXTENSIONS.has(ext) && !entry.name.endsWith('.d.ts')) {\n sourceFiles.push(relPath);\n }\n }\n }\n}\n\nfunction collectConfigsFromDir(\n base: string,\n relDir: string,\n pattern: RegExp,\n configFiles: ConfigFileContent[]\n) {\n const fullDir = path.join(base, relDir);\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(fullDir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n if (entry.isFile() && pattern.test(entry.name)) {\n const relPath = `${relDir}/${entry.name}`;\n try {\n const content = fs.readFileSync(path.join(base, relPath), 'utf-8');\n configFiles.push({ path: relPath, content });\n } catch {}\n }\n }\n}\n\nfunction sortByPriority(files: string[]) {\n const entryPointNames = new Set(['index.ts', 'index.js', 'main.py', 'app.ts', 'app.js', 'server.ts', 'server.js']);\n const routePattern = /(route|api|controller)/i;\n const schemaPattern = /(types|schema|models)/i;\n const servicePattern = /(service|lib|utils)/i;\n const testPattern = /(test|spec|__tests__)/i;\n\n function priority(filePath: string): number {\n const base = path.basename(filePath);\n if (entryPointNames.has(base)) return 0;\n if (routePattern.test(filePath)) return 1;\n if (schemaPattern.test(filePath)) return 2;\n if (servicePattern.test(filePath)) return 3;\n if (testPattern.test(filePath)) return 5;\n return 4;\n }\n\n files.sort((a, b) => priority(a) - priority(b));\n}\n\nfunction resolveLanguage(ext: string): 'ts' | 'js' | 'py' | null {\n if (ext === '.ts' || ext === '.tsx') return 'ts';\n if (ext === '.js' || ext === '.jsx') return 'js';\n if (ext === '.py') return 'py';\n return null;\n}\n\nfunction extractTypeScriptJavaScript(\n filePath: string,\n content: string,\n language: 'ts' | 'js'\n): FileSummary {\n const lines = content.split('\\n');\n const imports: string[] = [];\n const exports: string[] = [];\n const functions: string[] = [];\n const classes: string[] = [];\n const types: string[] = [];\n const routes: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (/^import\\s+/.test(trimmed)) {\n imports.push(trimmed);\n continue;\n }\n\n const exportMatch = trimmed.match(\n /^export\\s+(?:default\\s+)?(?:async\\s+)?(function|const|class|interface|type|enum)\\s+(\\w+)/\n );\n if (exportMatch) {\n exports.push(`${exportMatch[1]} ${exportMatch[2]}`);\n if (exportMatch[1] === 'class') classes.push(exportMatch[2]);\n if (exportMatch[1] === 'interface' || exportMatch[1] === 'type') types.push(exportMatch[2]);\n if (exportMatch[1] === 'function') functions.push(exportMatch[2]);\n continue;\n }\n\n const fnMatch = trimmed.match(/^(?:async\\s+)?function\\s+(\\w+)/);\n if (fnMatch && !trimmed.startsWith('export')) {\n functions.push(fnMatch[1]);\n continue;\n }\n\n const arrowMatch = trimmed.match(/^(?:export\\s+)?const\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\(/);\n if (arrowMatch && !exports.some((e) => e.endsWith(arrowMatch[1]))) {\n functions.push(arrowMatch[1]);\n }\n\n const classMatch = trimmed.match(/^class\\s+(\\w+)/);\n if (classMatch && !trimmed.startsWith('export')) {\n classes.push(classMatch[1]);\n continue;\n }\n\n const ifaceMatch = trimmed.match(/^(?:interface|type)\\s+(\\w+)/);\n if (ifaceMatch && !trimmed.startsWith('export')) {\n types.push(ifaceMatch[1]);\n continue;\n }\n\n const routeMatch = trimmed.match(\n /(?:router|app|server)\\.(get|post|put|patch|delete|all|use)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/\n );\n if (routeMatch) {\n routes.push(`${routeMatch[1].toUpperCase()} ${routeMatch[2]}`);\n }\n }\n\n return { path: filePath, language, imports, exports, functions, classes, types, routes };\n}\n\nfunction extractPython(filePath: string, content: string): FileSummary {\n const lines = content.split('\\n');\n const imports: string[] = [];\n const functions: string[] = [];\n const classes: string[] = [];\n const routes: string[] = [];\n\n let prevLine = '';\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (/^import\\s+/.test(trimmed) || /^from\\s+/.test(trimmed)) {\n imports.push(trimmed);\n continue;\n }\n\n const defMatch = trimmed.match(/^def\\s+(\\w+)\\s*\\(([^)]*)\\)/);\n if (defMatch) {\n functions.push(`${defMatch[1]}(${defMatch[2]})`);\n }\n\n const classMatch = trimmed.match(/^class\\s+(\\w+)/);\n if (classMatch) {\n classes.push(classMatch[1]);\n }\n\n const decoratorRoute = prevLine.match(\n /@(?:app|router)\\.(get|post|put|patch|delete|options|head)\\s*\\(\\s*['\"]([^'\"]+)['\"]/\n );\n if (decoratorRoute && defMatch) {\n routes.push(`${decoratorRoute[1].toUpperCase()} ${decoratorRoute[2]}`);\n }\n\n const includeRouter = trimmed.match(\n /include_router\\s*\\([^,]+,\\s*prefix\\s*=\\s*['\"]([^'\"]+)['\"]/\n );\n if (includeRouter) {\n routes.push(`ROUTER ${includeRouter[1]}`);\n }\n\n prevLine = trimmed;\n }\n\n return {\n path: filePath,\n language: 'py',\n imports,\n exports: [],\n functions,\n classes,\n types: [],\n routes,\n };\n}\n\nfunction estimateSummarySize(summary: FileSummary): number {\n return (\n summary.path.length +\n summary.imports.reduce((s, i) => s + i.length, 0) +\n summary.exports.reduce((s, e) => s + e.length, 0) +\n summary.functions.reduce((s, f) => s + f.length, 0) +\n summary.classes.reduce((s, c) => s + c.length, 0) +\n summary.types.reduce((s, t) => s + t.length, 0) +\n summary.routes.reduce((s, r) => s + r.length, 0)\n );\n}\n","import { getStoredAuth, storeAuth, isTokenExpired } from '../auth/token-store.js';\nimport { API_URL } from '../constants.js';\n\nasync function forceRefreshToken(): Promise<string | null> {\n const auth = getStoredAuth();\n if (!auth) return null;\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\nasync function getValidToken(): Promise<string> {\n const auth = getStoredAuth();\n if (!auth) {\n throw new Error('Not authenticated. Run `caliber login` first.');\n }\n\n if (!isTokenExpired()) return auth.accessToken;\n\n const refreshed = await forceRefreshToken();\n if (!refreshed) {\n throw new Error('Session expired. Run `caliber login` to re-authenticate.');\n }\n return refreshed;\n}\n\nexport async function apiRequest<T = unknown>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n } = {}\n): Promise<T> {\n let token = await getValidToken();\n\n let 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.status === 401) {\n const refreshed = await forceRefreshToken();\n if (!refreshed) {\n throw new Error('Session expired. Run `caliber login` to re-authenticate.');\n }\n token = refreshed;\n 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\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 raw?: 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 let token = await getValidToken();\n\n let 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.status === 401) {\n const refreshed = await forceRefreshToken();\n if (!refreshed) {\n throw new Error('Session expired. Run `caliber login` to re-authenticate.');\n }\n token = refreshed;\n 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\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, raw: parsed.raw });\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 deletions?: Array<{ filePath: string; reason: string }>;\n claude?: Parameters<typeof writeClaudeConfig>[0];\n cursor?: Parameters<typeof writeCursorConfig>[0];\n}\n\nexport function writeSetup(setup: AgentSetup): { written: string[]; deleted: string[]; backupDir?: string } {\n const filesToWrite = getFilesToWrite(setup);\n const filesToDelete = (setup.deletions || [])\n .map(d => d.filePath)\n .filter(f => fs.existsSync(f));\n\n const existingFiles = [\n ...filesToWrite.filter(f => fs.existsSync(f)),\n ...filesToDelete,\n ];\n const backupDir = existingFiles.length > 0 ? createBackup(existingFiles) : undefined;\n\n const written: string[] = [];\n\n if ((setup.targetAgent === 'claude' || setup.targetAgent === 'both') && setup.claude) {\n written.push(...writeClaudeConfig(setup.claude));\n }\n\n if ((setup.targetAgent === 'cursor' || setup.targetAgent === 'both') && setup.cursor) {\n written.push(...writeCursorConfig(setup.cursor));\n }\n\n const deleted: string[] = [];\n for (const filePath of filesToDelete) {\n fs.unlinkSync(filePath);\n deleted.push(filePath);\n }\n\n ensureGitignore();\n\n const entries: ManifestEntry[] = [\n ...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 ...deleted.map(file => ({\n path: file,\n action: 'deleted' as const,\n checksum: '',\n timestamp: new Date().toISOString(),\n })),\n ];\n\n writeManifest({ version: 1, backupDir, entries });\n\n return { written, deleted, 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 if (fs.existsSync(entry.path)) {\n fs.unlinkSync(entry.path);\n removed.push(entry.path);\n }\n } else if ((entry.action === 'modified' || entry.action === 'deleted') && manifest.backupDir) {\n if (restoreBackup(manifest.backupDir, entry.path)) {\n restored.push(entry.path);\n }\n }\n }\n\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');\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.skills) {\n for (const s of setup.cursor.skills) files.push(`.cursor/skills/${s.slug}/SKILL.md`);\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 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 fs.writeFileSync('CLAUDE.md', config.claudeMd);\n written.push('CLAUDE.md');\n\n if (config.skills?.length) {\n const skillsDir = path.join('.claude', '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 if (config.mcpServers && Object.keys(config.mcpServers).length > 0) {\n let existingServers: Record<string, unknown> = {};\n try {\n if (fs.existsSync('.mcp.json')) {\n const existing = JSON.parse(fs.readFileSync('.mcp.json', 'utf-8'));\n if (existing.mcpServers) existingServers = existing.mcpServers;\n }\n } catch {}\n const mergedServers = { ...existingServers, ...config.mcpServers };\n fs.writeFileSync('.mcp.json', JSON.stringify({ mcpServers: mergedServers }, 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 skills?: Array<{ name: string; slug: 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/skills/{slug}/SKILL.md\n if (config.skills?.length) {\n for (const skill of config.skills) {\n const skillDir = path.join('.cursor', 'skills', skill.slug);\n if (!fs.existsSync(skillDir)) fs.mkdirSync(skillDir, { recursive: true });\n const skillPath = path.join(skillDir, 'SKILL.md');\n fs.writeFileSync(skillPath, skill.content);\n written.push(skillPath);\n }\n }\n\n // .cursor/mcp.json — merge with existing\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 mcpPath = path.join(cursorDir, 'mcp.json');\n let existingServers: Record<string, unknown> = {};\n try {\n if (fs.existsSync(mcpPath)) {\n const existing = JSON.parse(fs.readFileSync(mcpPath, 'utf-8'));\n if (existing.mcpServers) {\n existingServers = existing.mcpServers;\n }\n }\n } catch {\n // ignore parse errors\n }\n const mergedServers = { ...existingServers, ...config.mcpServers };\n fs.writeFileSync(mcpPath, JSON.stringify({ mcpServers: mergedServers }, null, 2));\n written.push(mcpPath);\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' | 'deleted';\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 fs from 'fs';\nimport path from 'path';\nimport { CALIBER_DIR } from '../constants.js';\n\nconst STAGED_DIR = path.join(CALIBER_DIR, 'staged');\nconst PROPOSED_DIR = path.join(STAGED_DIR, 'proposed');\nconst CURRENT_DIR = path.join(STAGED_DIR, 'current');\n\nexport interface StagedFile {\n relativePath: string;\n proposedPath: string;\n currentPath?: string;\n originalPath?: string;\n isNew: boolean;\n}\n\nexport interface StageResult {\n newFiles: number;\n modifiedFiles: number;\n stagedFiles: StagedFile[];\n}\n\nexport function stageFiles(\n files: Array<{ path: string; content: string }>,\n projectDir: string\n): StageResult {\n cleanupStaging();\n\n let newFiles = 0;\n let modifiedFiles = 0;\n const stagedFiles: StagedFile[] = [];\n\n for (const file of files) {\n const proposedPath = path.join(PROPOSED_DIR, file.path);\n fs.mkdirSync(path.dirname(proposedPath), { recursive: true });\n fs.writeFileSync(proposedPath, file.content);\n\n const originalPath = path.join(projectDir, file.path);\n if (fs.existsSync(originalPath)) {\n const currentPath = path.join(CURRENT_DIR, file.path);\n fs.mkdirSync(path.dirname(currentPath), { recursive: true });\n fs.copyFileSync(originalPath, currentPath);\n modifiedFiles++;\n stagedFiles.push({ relativePath: file.path, proposedPath, currentPath, originalPath, isNew: false });\n } else {\n newFiles++;\n stagedFiles.push({ relativePath: file.path, proposedPath, isNew: true });\n }\n }\n\n return { newFiles, modifiedFiles, stagedFiles };\n}\n\nexport function getStagedProposedDir(): string {\n return PROPOSED_DIR;\n}\n\nexport function cleanupStaging(): void {\n if (fs.existsSync(STAGED_DIR)) {\n fs.rmSync(STAGED_DIR, { recursive: true, force: true });\n }\n}\n","import { execSync, spawn } from 'child_process';\n\nexport type ReviewMethod = 'cursor' | 'vscode' | 'terminal';\n\nfunction commandExists(cmd: string): boolean {\n try {\n execSync(`which ${cmd}`, { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function detectAvailableEditors(): ReviewMethod[] {\n const methods: ReviewMethod[] = [];\n if (commandExists('cursor')) methods.push('cursor');\n if (commandExists('code')) methods.push('vscode');\n methods.push('terminal');\n return methods;\n}\n\nexport function openDiffsInEditor(\n editor: 'cursor' | 'vscode',\n files: Array<{ originalPath?: string; proposedPath: string }>\n): void {\n const cmd = editor === 'cursor' ? 'cursor' : 'code';\n\n for (const file of files) {\n try {\n if (file.originalPath) {\n spawn(cmd, ['--diff', file.originalPath, file.proposedPath], {\n stdio: 'ignore',\n detached: true,\n }).unref();\n } else {\n spawn(cmd, [file.proposedPath], {\n stdio: 'ignore',\n detached: true,\n }).unref();\n }\n } catch {\n continue;\n }\n }\n}\n","import fs from 'fs';\nimport path from 'path';\n\nconst SETTINGS_PATH = path.join('.claude', 'settings.json');\nconst HOOK_COMMAND = 'caliber refresh --quiet';\nconst HOOK_DESCRIPTION = 'Caliber: auto-refreshing docs based on code changes';\n\ninterface HookEntry {\n type: string;\n command: string;\n description?: string;\n}\n\ninterface HookMatcher {\n matcher: string;\n hooks: HookEntry[];\n}\n\ninterface ClaudeSettings {\n hooks?: {\n SessionEnd?: HookMatcher[];\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\n\nfunction readSettings(): ClaudeSettings {\n if (!fs.existsSync(SETTINGS_PATH)) return {};\n try {\n return JSON.parse(fs.readFileSync(SETTINGS_PATH, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nfunction writeSettings(settings: ClaudeSettings): void {\n const dir = path.dirname(SETTINGS_PATH);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2));\n}\n\nfunction findHookIndex(sessionEnd: HookMatcher[]): number {\n return sessionEnd.findIndex(entry =>\n entry.hooks?.some(h => h.command === HOOK_COMMAND)\n );\n}\n\nexport function isHookInstalled(): boolean {\n const settings = readSettings();\n const sessionEnd = settings.hooks?.SessionEnd;\n if (!Array.isArray(sessionEnd)) return false;\n return findHookIndex(sessionEnd) !== -1;\n}\n\nexport function installHook(): { installed: boolean; alreadyInstalled: boolean } {\n const settings = readSettings();\n\n if (!settings.hooks) settings.hooks = {};\n if (!Array.isArray(settings.hooks.SessionEnd)) settings.hooks.SessionEnd = [];\n\n if (findHookIndex(settings.hooks.SessionEnd) !== -1) {\n return { installed: false, alreadyInstalled: true };\n }\n\n settings.hooks.SessionEnd.push({\n matcher: '',\n hooks: [{ type: 'command', command: HOOK_COMMAND, description: HOOK_DESCRIPTION }],\n });\n\n writeSettings(settings);\n return { installed: true, alreadyInstalled: false };\n}\n\nexport function removeHook(): { removed: boolean; notFound: boolean } {\n const settings = readSettings();\n const sessionEnd = settings.hooks?.SessionEnd;\n\n if (!Array.isArray(sessionEnd)) {\n return { removed: false, notFound: true };\n }\n\n const idx = findHookIndex(sessionEnd);\n if (idx === -1) {\n return { removed: false, notFound: true };\n }\n\n sessionEnd.splice(idx, 1);\n if (sessionEnd.length === 0) {\n delete settings.hooks!.SessionEnd;\n }\n if (settings.hooks && Object.keys(settings.hooks).length === 0) {\n delete settings.hooks;\n }\n\n writeSettings(settings);\n return { removed: true, notFound: false };\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { execSync } from 'child_process';\nimport { CALIBER_DIR } from '../constants.js';\n\nconst STATE_FILE = path.join(CALIBER_DIR, '.caliber-state.json');\n\ninterface CaliberState {\n lastRefreshSha: string;\n lastRefreshTimestamp: string;\n}\n\nexport function readState(): CaliberState | null {\n try {\n if (!fs.existsSync(STATE_FILE)) return null;\n return JSON.parse(fs.readFileSync(STATE_FILE, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nexport function writeState(state: CaliberState): void {\n if (!fs.existsSync(CALIBER_DIR)) {\n fs.mkdirSync(CALIBER_DIR, { recursive: true });\n }\n fs.writeFileSync(STATE_FILE, JSON.stringify(state, null, 2));\n}\n\nexport function getCurrentHeadSha(): string | null {\n try {\n return execSync('git rev-parse HEAD', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n } catch {\n return null;\n }\n}\n","import chalk from 'chalk';\nimport 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 private startTime = 0;\n private showElapsedTime: boolean;\n private currentBaseMessage = '';\n\n constructor(spinner: Ora, messages: string[], options?: { showElapsedTime?: boolean }) {\n this.spinner = spinner;\n this.messages = messages;\n this.showElapsedTime = options?.showElapsedTime ?? false;\n }\n\n private formatElapsed(): string {\n const seconds = Math.floor((Date.now() - this.startTime) / 1000);\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n }\n\n private updateSpinnerText(): void {\n this.spinner.text = this.currentBaseMessage;\n }\n\n start(): void {\n this.index = 0;\n this.startTime = Date.now();\n this.currentBaseMessage = this.messages[0];\n this.updateSpinnerText();\n if (this.showElapsedTime) {\n this.spinner.suffixText = () => chalk.dim(`(${this.formatElapsed()})`);\n }\n this.timer = setInterval(() => {\n this.index = (this.index + 1) % this.messages.length;\n this.currentBaseMessage = this.messages[this.index];\n this.updateSpinnerText();\n }, 3000);\n }\n\n handleServerStatus(status: string): void {\n this.currentBaseMessage = status;\n this.updateSpinnerText();\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.currentBaseMessage = this.messages[this.index];\n this.updateSpinnerText();\n }, 3000);\n }\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n this.spinner.suffixText = '';\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 throw new Error('__exit__');\n }\n}\n","import chalk from 'chalk';\nimport fs from 'fs';\nimport { readManifest } from '../writers/manifest.js';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { apiRequest } from '../api/client.js';\nimport { scanLocalState, compareState, type ServerItem } from '../scanner/index.js';\n\nexport async 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 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 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\n if (auth) {\n try {\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n const match = await apiRequest<{ project: { id: string } | null }>(\n '/api/projects/match',\n { method: 'POST', body: { fingerprintHash: hash } }\n );\n\n if (match?.project) {\n const serverItems = await apiRequest<ServerItem[]>(\n `/api/sync/project/${match.project.id}/items`\n );\n\n if (serverItems?.length) {\n const localItems = scanLocalState(process.cwd());\n const diff = compareState(serverItems, localItems);\n\n console.log(chalk.bold('\\n Sync'));\n console.log(` ${chalk.green('✓')} Installed: ${diff.installed.length}`);\n if (diff.missing.length) console.log(` ${chalk.red('✗')} Missing: ${diff.missing.length}`);\n if (diff.outdated.length) console.log(` ${chalk.yellow('~')} Outdated: ${diff.outdated.length}`);\n }\n }\n } catch {\n // sync info is non-critical\n }\n }\n\n console.log('');\n}\n","import fs from 'fs';\nimport path from 'path';\nimport crypto from 'crypto';\nimport os from 'os';\n\nexport interface LocalItem {\n type: 'mcp' | 'rule' | 'skill' | 'config';\n platform: 'claude' | 'cursor';\n name: string;\n contentHash: string;\n path: string;\n}\n\nexport interface PlatformDetection {\n claude: boolean;\n cursor: boolean;\n}\n\nexport function detectPlatforms(): PlatformDetection {\n const home = os.homedir();\n return {\n claude: fs.existsSync(path.join(home, '.claude')),\n cursor: fs.existsSync(getCursorConfigDir()),\n };\n}\n\nexport function scanLocalState(dir: string): LocalItem[] {\n const items: LocalItem[] = [];\n\n // Claude: CLAUDE.md\n const claudeMdPath = path.join(dir, 'CLAUDE.md');\n if (fs.existsSync(claudeMdPath)) {\n items.push({\n type: 'rule',\n platform: 'claude',\n name: 'CLAUDE.md',\n contentHash: hashFile(claudeMdPath),\n path: claudeMdPath,\n });\n }\n\n // Claude: .claude/skills/*.md\n const skillsDir = path.join(dir, '.claude', 'skills');\n if (fs.existsSync(skillsDir)) {\n for (const file of fs.readdirSync(skillsDir).filter(f => f.endsWith('.md'))) {\n const filePath = path.join(skillsDir, file);\n items.push({\n type: 'skill',\n platform: 'claude',\n name: file,\n contentHash: hashFile(filePath),\n path: filePath,\n });\n }\n }\n\n // Claude: .mcp.json mcpServers\n const mcpJsonPath = path.join(dir, '.mcp.json');\n if (fs.existsSync(mcpJsonPath)) {\n try {\n const mcpJson = JSON.parse(fs.readFileSync(mcpJsonPath, 'utf-8'));\n if (mcpJson.mcpServers) {\n for (const name of Object.keys(mcpJson.mcpServers)) {\n items.push({\n type: 'mcp',\n platform: 'claude',\n name,\n contentHash: hashJson(mcpJson.mcpServers[name]),\n path: mcpJsonPath,\n });\n }\n }\n } catch { /* ignore */ }\n }\n\n // Cursor: .cursorrules\n const cursorrulesPath = path.join(dir, '.cursorrules');\n if (fs.existsSync(cursorrulesPath)) {\n items.push({\n type: 'rule',\n platform: 'cursor',\n name: '.cursorrules',\n contentHash: hashFile(cursorrulesPath),\n path: cursorrulesPath,\n });\n }\n\n // Cursor: .cursor/rules/*.mdc\n const cursorRulesDir = path.join(dir, '.cursor', 'rules');\n if (fs.existsSync(cursorRulesDir)) {\n for (const file of fs.readdirSync(cursorRulesDir).filter(f => f.endsWith('.mdc'))) {\n const filePath = path.join(cursorRulesDir, file);\n items.push({\n type: 'rule',\n platform: 'cursor',\n name: file,\n contentHash: hashFile(filePath),\n path: filePath,\n });\n }\n }\n\n // Cursor: .cursor/skills/*/SKILL.md\n const cursorSkillsDir = path.join(dir, '.cursor', 'skills');\n if (fs.existsSync(cursorSkillsDir)) {\n try {\n for (const slug of fs.readdirSync(cursorSkillsDir)) {\n const skillFile = path.join(cursorSkillsDir, slug, 'SKILL.md');\n if (fs.existsSync(skillFile)) {\n items.push({\n type: 'skill',\n platform: 'cursor',\n name: `${slug}/SKILL.md`,\n contentHash: hashFile(skillFile),\n path: skillFile,\n });\n }\n }\n } catch { /* ignore */ }\n }\n\n // Cursor: .cursor/mcp.json mcpServers\n const cursorMcpPath = path.join(dir, '.cursor', 'mcp.json');\n if (fs.existsSync(cursorMcpPath)) {\n try {\n const mcpJson = JSON.parse(fs.readFileSync(cursorMcpPath, 'utf-8'));\n if (mcpJson.mcpServers) {\n for (const name of Object.keys(mcpJson.mcpServers)) {\n items.push({\n type: 'mcp',\n platform: 'cursor',\n name,\n contentHash: hashJson(mcpJson.mcpServers[name]),\n path: cursorMcpPath,\n });\n }\n }\n } catch { /* ignore */ }\n }\n\n return items;\n}\n\nexport interface ServerItem {\n id: string;\n type: string;\n platform: string;\n name: string;\n content_hash: string;\n content: Record<string, unknown>;\n}\n\nexport function compareState(\n serverItems: ServerItem[],\n localItems: LocalItem[]\n) {\n const installed: Array<{ server: ServerItem; local: LocalItem }> = [];\n const missing: ServerItem[] = [];\n const outdated: Array<{ server: ServerItem; local: LocalItem }> = [];\n const extra: LocalItem[] = [];\n\n const localMap = new Map<string, LocalItem>();\n for (const item of localItems) {\n localMap.set(`${item.type}:${item.platform}:${item.name}`, item);\n }\n\n for (const server of serverItems) {\n const key = `${server.type}:${server.platform}:${server.name}`;\n const local = localMap.get(key);\n localMap.delete(key);\n\n if (!local) {\n missing.push(server);\n } else if (local.contentHash !== server.content_hash) {\n outdated.push({ server, local });\n } else {\n installed.push({ server, local });\n }\n }\n\n for (const local of localMap.values()) {\n extra.push(local);\n }\n\n return { installed, missing, outdated, extra };\n}\n\nfunction hashFile(filePath: string): string {\n const text = fs.readFileSync(filePath, 'utf-8');\n return crypto.createHash('sha256').update(JSON.stringify({ text })).digest('hex');\n}\n\nfunction hashJson(obj: unknown): string {\n return crypto.createHash('sha256').update(JSON.stringify(obj)).digest('hex');\n}\n\nfunction getCursorConfigDir(): string {\n const home = os.homedir();\n if (process.platform === 'darwin') {\n return path.join(home, 'Library', 'Application Support', 'Cursor');\n }\n if (process.platform === 'win32') {\n return path.join(home, 'AppData', 'Roaming', 'Cursor');\n }\n return path.join(home, '.config', 'Cursor');\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 confirm from '@inquirer/confirm';\nimport { trackEvent } from '../telemetry.js';\nimport { SpinnerMessages, GENERATION_MESSAGES } from '../utils/spinner-messages.js';\n\nexport async function regenerateCommand(options: { dryRun?: boolean }) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not logged in. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n const manifest = readManifest();\n if (!manifest) {\n console.log(chalk.yellow('No existing setup found. Run `caliber init` first.'));\n throw new Error('__exit__');\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\n const genSpinner = ora('Regenerating setup...').start();\n const genMessages = new SpinnerMessages(genSpinner, GENERATION_MESSAGES);\n genMessages.start();\n\n try {\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, command: 'regenerate' });\n genSpinner.fail(`Generation error: ${error}`);\n },\n (status) => { genMessages.handleServerStatus(status); }\n );\n } catch (err) {\n genMessages.stop();\n const msg = err instanceof Error ? err.message : 'Unknown error';\n trackEvent('error_occurred', { error_type: 'generation_request_failed', error_message: msg, command: 'regenerate' });\n genSpinner.fail(`Regeneration failed: ${msg}`);\n throw new Error('__exit__');\n }\n\n genMessages.stop();\n\n if (!generatedSetup) {\n genSpinner.fail('Failed to regenerate setup.');\n throw new Error('__exit__');\n }\n\n genSpinner.succeed('Setup regenerated');\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 shouldApply = await confirm({ message: 'Apply regenerated setup?', default: true });\n if (!shouldApply) {\n trackEvent('regenerate_declined');\n console.log(chalk.dim('Regeneration 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_regenerated', { 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 chalk from 'chalk';\nimport ora from 'ora';\nimport { mkdirSync, writeFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { apiRequest } from '../api/client.js';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { scanLocalState } from '../scanner/index.js';\n\ntype Platform = 'claude' | 'cursor';\n\ninterface Recommendation {\n id: string;\n skill_name: string;\n skill_slug: string;\n source_url: string;\n score: number;\n reason: string;\n detected_technology: string;\n status: string;\n}\n\nfunction detectLocalPlatforms(): Platform[] {\n const items = scanLocalState(process.cwd());\n const platforms = new Set<Platform>();\n for (const item of items) {\n platforms.add(item.platform);\n }\n return platforms.size > 0 ? Array.from(platforms) : ['claude'];\n}\n\nfunction getSkillPath(platform: Platform, slug: string): string {\n if (platform === 'cursor') {\n return join('.cursor', 'skills', slug, 'SKILL.md');\n }\n return join('.claude', 'skills', `${slug}.md`);\n}\n\nexport async function recommendCommand(options: {\n generate?: boolean;\n status?: string;\n}) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not authenticated. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n\n const match = await apiRequest<{ project: { id: string } | null }>(\n '/api/projects/match',\n { method: 'POST', body: { fingerprintHash: hash } }\n );\n\n if (!match?.project) {\n console.log(chalk.yellow('No project found. Run `caliber init` first.'));\n throw new Error('__exit__');\n }\n\n const projectId = match.project.id;\n const platforms = detectLocalPlatforms();\n\n if (options.status) {\n const recs = await apiRequest<Recommendation[]>(\n `/api/recommendations/project/${projectId}?status=${options.status}`\n );\n if (!recs?.length) {\n console.log(chalk.dim(`\\nNo ${options.status} recommendations.\\n`));\n return;\n }\n printRecommendations(recs);\n return;\n }\n\n if (options.generate) {\n const recs = await generateRecommendations(projectId);\n if (recs?.length) {\n const selected = await interactiveSelect(recs);\n if (selected?.length) {\n await installSkills(selected, platforms);\n }\n }\n return;\n }\n\n let recs: Recommendation[] | undefined = await apiRequest<Recommendation[]>(\n `/api/recommendations/project/${projectId}?status=pending`\n );\n\n if (!recs?.length) {\n recs = await generateRecommendations(projectId);\n }\n\n if (!recs?.length) {\n console.log(chalk.dim('\\nNo recommendations found for this project.\\n'));\n return;\n }\n\n const selected = await interactiveSelect(recs);\n if (selected?.length) {\n await installSkills(selected, platforms);\n }\n}\n\nasync function generateRecommendations(projectId: string): Promise<Recommendation[] | undefined> {\n const spinner = ora('Detecting technologies and searching for skills...').start();\n try {\n const generated = await apiRequest<Recommendation[]>(\n `/api/recommendations/project/${projectId}/generate`,\n { method: 'POST' }\n );\n spinner.succeed(`Found ${generated?.length || 0} recommendations`);\n\n if (!generated?.length) return generated;\n\n const recs = await apiRequest<Recommendation[]>(\n `/api/recommendations/project/${projectId}?status=pending`\n );\n return recs;\n } catch (err) {\n spinner.fail('Failed to generate recommendations');\n throw err;\n }\n}\n\nasync function interactiveSelect(recs: Recommendation[]): Promise<Recommendation[] | null> {\n if (!process.stdin.isTTY) {\n printRecommendations(recs);\n return null;\n }\n\n const selected = new Set<number>();\n let cursor = 0;\n const { stdin, stdout } = process;\n let lineCount = 0;\n\n function render(): string {\n const lines: string[] = [];\n lines.push(chalk.bold(' Skill Recommendations'));\n lines.push('');\n lines.push(` ${chalk.dim('Name'.padEnd(30))} ${chalk.dim('Score'.padEnd(8))} ${chalk.dim('Technology')}`);\n lines.push(chalk.dim(' ' + '─'.repeat(55)));\n\n for (let i = 0; i < recs.length; i++) {\n const rec = recs[i];\n const check = selected.has(i) ? chalk.green('[x]') : '[ ]';\n const ptr = i === cursor ? chalk.cyan('❯') : ' ';\n const scoreColor = rec.score >= 90 ? chalk.green : rec.score >= 70 ? chalk.blue : chalk.yellow;\n lines.push(` ${ptr} ${check} ${rec.skill_name.padEnd(26)} ${scoreColor(`${rec.score}%`.padEnd(8))} ${rec.detected_technology}`);\n }\n\n lines.push('');\n lines.push(chalk.dim(' ↑↓ navigate ⎵ toggle a all n none ⏎ install q cancel'));\n return lines.join('\\n');\n }\n\n function draw(initial: boolean) {\n if (!initial && lineCount > 0) {\n stdout.write(`\\x1b[${lineCount}A`);\n }\n stdout.write('\\x1b[0J');\n const output = render();\n stdout.write(output + '\\n');\n lineCount = output.split('\\n').length;\n }\n\n return new Promise((resolve) => {\n console.log('');\n draw(true);\n\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding('utf8');\n\n function cleanup() {\n stdin.removeListener('data', onData);\n stdin.setRawMode(false);\n stdin.pause();\n }\n\n function onData(key: string) {\n switch (key) {\n case '\\x1b[A':\n cursor = (cursor - 1 + recs.length) % recs.length;\n draw(false);\n break;\n case '\\x1b[B':\n cursor = (cursor + 1) % recs.length;\n draw(false);\n break;\n case ' ':\n selected.has(cursor) ? selected.delete(cursor) : selected.add(cursor);\n draw(false);\n break;\n case 'a':\n recs.forEach((_, i) => selected.add(i));\n draw(false);\n break;\n case 'n':\n selected.clear();\n draw(false);\n break;\n case '\\r':\n case '\\n':\n cleanup();\n if (selected.size === 0) {\n console.log(chalk.dim('\\n No skills selected.\\n'));\n resolve(null);\n } else {\n resolve(Array.from(selected).sort().map(i => recs[i]));\n }\n break;\n case 'q':\n case '\\x1b':\n case '\\x03':\n cleanup();\n console.log(chalk.dim('\\n Cancelled.\\n'));\n resolve(null);\n break;\n }\n }\n\n stdin.on('data', onData);\n });\n}\n\nasync function fetchSkillContent(rec: Recommendation): Promise<string | null> {\n if (rec.id) {\n try {\n const result = await apiRequest<{ content: string }>(\n `/api/recommendations/${rec.id}/content`\n );\n if (result?.content) return result.content;\n } catch {}\n }\n\n if (rec.source_url && rec.skill_slug) {\n try {\n const url = `https://raw.githubusercontent.com/${rec.source_url}/HEAD/skills/${rec.skill_slug}/SKILL.md`;\n const resp = await fetch(url);\n if (resp.ok) return await resp.text();\n } catch {}\n }\n\n return null;\n}\n\nasync function installSkills(recs: Recommendation[], platforms: Platform[]): Promise<void> {\n const spinner = ora(`Installing ${recs.length} skill${recs.length > 1 ? 's' : ''}...`).start();\n\n const installed: string[] = [];\n const warnings: string[] = [];\n\n for (const rec of recs) {\n const content = await fetchSkillContent(rec);\n\n if (!content) {\n warnings.push(`No content available for ${rec.skill_name}`);\n continue;\n }\n\n for (const platform of platforms) {\n const skillPath = getSkillPath(platform, rec.skill_slug);\n const fullPath = join(process.cwd(), skillPath);\n mkdirSync(dirname(fullPath), { recursive: true });\n writeFileSync(fullPath, content, 'utf-8');\n installed.push(`[${platform}] ${skillPath}`);\n }\n\n if (rec.id) {\n try {\n await apiRequest(`/api/recommendations/${rec.id}/status`, {\n method: 'PUT',\n body: { status: 'accepted' },\n });\n } catch {}\n }\n }\n\n if (installed.length > 0) {\n spinner.succeed(`Installed ${installed.length} file${installed.length > 1 ? 's' : ''}`);\n for (const p of installed) {\n console.log(chalk.green(` ✓ ${p}`));\n }\n } else {\n spinner.fail('No skills were installed');\n }\n\n for (const w of warnings) {\n console.log(chalk.yellow(` ⚠ ${w}`));\n }\n\n console.log('');\n}\n\nfunction printRecommendations(recs: Recommendation[]) {\n console.log(chalk.bold('\\n Skill Recommendations\\n'));\n console.log(\n ` ${chalk.dim('Name'.padEnd(30))} ${chalk.dim('Score'.padEnd(8))} ${chalk.dim('Technology'.padEnd(15))} ${chalk.dim('Status')}`\n );\n console.log(chalk.dim(' ' + '─'.repeat(70)));\n\n for (const rec of recs) {\n const scoreColor = rec.score >= 90 ? chalk.green : rec.score >= 70 ? chalk.blue : chalk.yellow;\n console.log(\n ` ${rec.skill_name.padEnd(30)} ${scoreColor(`${rec.score}%`.padEnd(8))} ${rec.detected_technology.padEnd(15)} ${rec.status}`\n );\n if (rec.reason) {\n console.log(` ${chalk.dim(rec.reason)}`);\n }\n }\n console.log('');\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { apiRequest } from '../api/client.js';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { scanLocalState, compareState, type ServerItem } from '../scanner/index.js';\nimport { writeSetup } from '../writers/index.js';\n\nexport async function syncCommand(options: {\n platform?: string;\n dryRun?: boolean;\n}) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not authenticated. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n\n const match = await apiRequest<{ project: { id: string } | null }>(\n '/api/projects/match',\n { method: 'POST', body: { fingerprintHash: hash } }\n );\n\n if (!match?.project) {\n console.log(chalk.yellow('No project found. Run `caliber init` first.'));\n throw new Error('__exit__');\n }\n\n const projectId = match.project.id;\n\n const spinner = ora('Scanning local state...').start();\n const localItems = scanLocalState(process.cwd());\n spinner.text = 'Fetching server items...';\n\n const serverItems = await apiRequest<ServerItem[]>(\n `/api/sync/project/${projectId}/items`\n );\n spinner.succeed(`Found ${localItems.length} local items, ${serverItems?.length || 0} server items`);\n\n if (!serverItems?.length) {\n console.log(chalk.dim('\\nNo items configured on server. Run `caliber init` to set up your project.\\n'));\n return;\n }\n\n const platformFilter = options.platform;\n const filteredServer = platformFilter\n ? serverItems.filter(i => i.platform === platformFilter || i.platform === 'both')\n : serverItems;\n const filteredLocal = platformFilter\n ? localItems.filter(i => i.platform === platformFilter)\n : localItems;\n\n const diff = compareState(filteredServer, filteredLocal);\n\n printDiff(diff);\n\n if (diff.missing.length === 0 && diff.outdated.length === 0) {\n console.log(chalk.green('\\nAll items synced.\\n'));\n await reportToServer(projectId, filteredServer, diff);\n return;\n }\n\n if (options.dryRun) {\n console.log(chalk.dim('\\nDry run — no changes made.\\n'));\n return;\n }\n\n const installSpinner = ora('Installing missing and outdated items...').start();\n try {\n const setup = buildSetupFromItems([...diff.missing, ...diff.outdated.map(o => o.server)]);\n if (setup) {\n writeSetup(setup);\n }\n installSpinner.succeed('Items synced successfully');\n } catch (err) {\n installSpinner.fail('Sync failed');\n throw err;\n }\n\n await reportToServer(projectId, filteredServer, diff);\n}\n\nasync function reportToServer(\n projectId: string,\n serverItems: ServerItem[],\n diff: ReturnType<typeof compareState>\n) {\n const items = [\n ...diff.installed.map(i => ({\n itemId: i.server.id,\n state: 'installed' as const,\n localHash: i.local.contentHash,\n })),\n ...diff.missing.map(i => ({\n itemId: i.id,\n state: 'missing' as const,\n })),\n ...diff.outdated.map(i => ({\n itemId: i.server.id,\n state: 'outdated' as const,\n localHash: i.local.contentHash,\n })),\n ...diff.extra.map(i => ({\n itemId: i.name,\n state: 'extra' as const,\n localHash: i.contentHash,\n })),\n ];\n\n const platforms = new Set(serverItems.map(i => i.platform));\n for (const platform of platforms) {\n try {\n await apiRequest(`/api/sync/project/${projectId}/report`, {\n method: 'POST',\n body: {\n platform,\n items: items.filter(i => {\n const match = serverItems.find(s => s.id === i.itemId);\n return match?.platform === platform;\n }),\n },\n });\n } catch {\n // non-critical\n }\n }\n}\n\nfunction printDiff(diff: ReturnType<typeof compareState>) {\n console.log(chalk.bold('\\n Sync Status\\n'));\n\n if (diff.installed.length) {\n console.log(` ${chalk.green('✓')} Installed: ${diff.installed.length}`);\n }\n if (diff.missing.length) {\n console.log(` ${chalk.red('✗')} Missing: ${diff.missing.length}`);\n for (const item of diff.missing) {\n console.log(` ${chalk.red('-')} ${item.name} (${item.type}/${item.platform})`);\n }\n }\n if (diff.outdated.length) {\n console.log(` ${chalk.yellow('~')} Outdated: ${diff.outdated.length}`);\n for (const item of diff.outdated) {\n console.log(` ${chalk.yellow('~')} ${item.server.name} (${item.server.type}/${item.server.platform})`);\n }\n }\n if (diff.extra.length) {\n console.log(` ${chalk.dim('+')} Extra (local only): ${diff.extra.length}`);\n for (const item of diff.extra) {\n console.log(` ${chalk.dim('+')} ${item.name} (${item.type}/${item.platform})`);\n }\n }\n console.log('');\n}\n\nfunction buildSetupFromItems(items: ServerItem[]): Parameters<typeof writeSetup>[0] | null {\n if (!items.length) return null;\n\n const claude: Record<string, unknown> = {};\n const cursor: Record<string, unknown> = {};\n let hasAny = false;\n\n for (const item of items) {\n const content = item.content as Record<string, unknown>;\n\n if (item.platform === 'claude' || item.platform === 'both') {\n if (item.type === 'rule' && item.name === 'CLAUDE.md') {\n claude.claudeMd = content.text;\n hasAny = true;\n } else if (item.type === 'config' && item.name === 'settings.json') {\n claude.settings = content;\n hasAny = true;\n } else if (item.type === 'skill') {\n if (!claude.skills) claude.skills = [];\n (claude.skills as Array<{ name: string; content: string }>).push({\n name: item.name,\n content: (content.text as string) || '',\n });\n hasAny = true;\n } else if (item.type === 'mcp') {\n if (!claude.mcpServers) claude.mcpServers = {};\n (claude.mcpServers as Record<string, unknown>)[item.name] = content;\n hasAny = true;\n }\n }\n\n if (item.platform === 'cursor' || item.platform === 'both') {\n if (item.type === 'rule' && item.name === '.cursorrules') {\n cursor.cursorrules = content.text;\n hasAny = true;\n } else if (item.type === 'rule') {\n if (!cursor.rules) cursor.rules = [];\n (cursor.rules as Array<{ filename: string; content: string }>).push({\n filename: item.name,\n content: (content.text as string) || '',\n });\n hasAny = true;\n } else if (item.type === 'mcp') {\n if (!cursor.mcpServers) cursor.mcpServers = {};\n (cursor.mcpServers as Record<string, unknown>)[item.name] = content;\n hasAny = true;\n }\n }\n }\n\n if (!hasAny) return null;\n\n const hasClaude = Object.keys(claude).length > 0;\n const hasCursor = Object.keys(cursor).length > 0;\n\n return {\n targetAgent: hasClaude && hasCursor ? 'both' : hasClaude ? 'claude' : 'cursor',\n ...(hasClaude ? { claude: claude as never } : {}),\n ...(hasCursor ? { cursor: cursor as never } : {}),\n };\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { apiRequest } from '../api/client.js';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { scanLocalState, compareState, type ServerItem } from '../scanner/index.js';\n\nexport async function diffCommand(options: { platform?: string }) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not authenticated. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n\n const match = await apiRequest<{ project: { id: string } | null }>(\n '/api/projects/match',\n { method: 'POST', body: { fingerprintHash: hash } }\n );\n\n if (!match?.project) {\n console.log(chalk.yellow('No project found. Run `caliber init` first.'));\n throw new Error('__exit__');\n }\n\n const projectId = match.project.id;\n\n const spinner = ora('Comparing local and server state...').start();\n const localItems = scanLocalState(process.cwd());\n const serverItems = await apiRequest<ServerItem[]>(\n `/api/sync/project/${projectId}/items`\n );\n spinner.stop();\n\n if (!serverItems?.length) {\n console.log(chalk.dim('\\nNo items configured on server.\\n'));\n return;\n }\n\n const platformFilter = options.platform;\n const filteredServer = platformFilter\n ? serverItems.filter(i => i.platform === platformFilter || i.platform === 'both')\n : serverItems;\n const filteredLocal = platformFilter\n ? localItems.filter(i => i.platform === platformFilter)\n : localItems;\n\n const diff = compareState(filteredServer, filteredLocal);\n\n console.log(chalk.bold('\\n Config Diff\\n'));\n\n if (diff.installed.length) {\n console.log(` ${chalk.green('✓')} In sync: ${diff.installed.length}`);\n }\n if (diff.missing.length) {\n console.log(` ${chalk.red('✗')} Missing locally: ${diff.missing.length}`);\n for (const item of diff.missing) {\n console.log(` ${chalk.red('-')} ${item.name} (${item.type}/${item.platform})`);\n }\n }\n if (diff.outdated.length) {\n console.log(` ${chalk.yellow('~')} Outdated: ${diff.outdated.length}`);\n for (const item of diff.outdated) {\n console.log(` ${chalk.yellow('~')} ${item.server.name} (${item.server.type}/${item.server.platform})`);\n }\n }\n if (diff.extra.length) {\n console.log(` ${chalk.dim('+')} Local only: ${diff.extra.length}`);\n for (const item of diff.extra) {\n console.log(` ${chalk.dim('+')} ${item.name} (${item.type}/${item.platform})`);\n }\n }\n\n if (diff.missing.length === 0 && diff.outdated.length === 0) {\n console.log(chalk.green('\\n Everything is in sync.\\n'));\n } else {\n console.log(chalk.dim('\\n Run `caliber sync` to apply changes.\\n'));\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { apiRequest } from '../api/client.js';\nimport { isGitRepo } from '../fingerprint/git.js';\nimport { readExistingConfigs } from '../fingerprint/existing-config.js';\nimport { collectDiff } from '../lib/git-diff.js';\nimport { readState, writeState, getCurrentHeadSha } from '../lib/state.js';\nimport { writeRefreshDocs } from '../writers/refresh.js';\nimport { collectFingerprint } from '../fingerprint/index.js';\nimport { trackEvent } from '../telemetry.js';\n\ninterface RefreshOptions {\n quiet?: boolean;\n dryRun?: boolean;\n}\n\ninterface RefreshResponse {\n updatedDocs: {\n claudeMd?: string | null;\n readmeMd?: string | null;\n cursorrules?: string | null;\n cursorRules?: Array<{ filename: string; content: string }> | null;\n claudeSkills?: Array<{ filename: string; content: string }> | null;\n };\n changesSummary: string;\n docsUpdated: string[];\n}\n\nfunction log(quiet: boolean, ...args: unknown[]) {\n if (!quiet) console.log(...args);\n}\n\nfunction discoverGitRepos(parentDir: string): string[] {\n const repos: string[] = [];\n try {\n const entries = fs.readdirSync(parentDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) continue;\n const childPath = path.join(parentDir, entry.name);\n if (fs.existsSync(path.join(childPath, '.git'))) {\n repos.push(childPath);\n }\n }\n } catch {\n // can't read directory\n }\n return repos.sort();\n}\n\nasync function refreshSingleRepo(repoDir: string, options: RefreshOptions & { label?: string }): Promise<void> {\n const quiet = !!options.quiet;\n const prefix = options.label ? `${chalk.bold(options.label)} ` : '';\n\n const state = readState();\n const lastSha = state?.lastRefreshSha ?? null;\n\n const diff = collectDiff(lastSha);\n const currentSha = getCurrentHeadSha();\n\n if (!diff.hasChanges) {\n if (currentSha) {\n writeState({ lastRefreshSha: currentSha, lastRefreshTimestamp: new Date().toISOString() });\n }\n log(quiet, chalk.dim(`${prefix}No changes since last refresh.`));\n return;\n }\n\n const spinner = quiet ? null : ora(`${prefix}Analyzing changes...`).start();\n\n const existingDocs = readExistingConfigs(repoDir);\n\n const fingerprint = collectFingerprint(repoDir);\n const projectContext = {\n languages: fingerprint.languages,\n frameworks: fingerprint.frameworks,\n packageName: fingerprint.packageName,\n };\n\n const response = await apiRequest<RefreshResponse>('/api/setups/refresh', {\n method: 'POST',\n body: {\n diff: {\n committed: diff.committedDiff,\n staged: diff.stagedDiff,\n unstaged: diff.unstagedDiff,\n changedFiles: diff.changedFiles,\n summary: diff.summary,\n },\n existingDocs,\n projectContext,\n },\n });\n\n if (!response.docsUpdated || response.docsUpdated.length === 0) {\n spinner?.succeed(`${prefix}No doc updates needed`);\n if (currentSha) {\n writeState({ lastRefreshSha: currentSha, lastRefreshTimestamp: new Date().toISOString() });\n }\n return;\n }\n\n if (options.dryRun) {\n spinner?.info(`${prefix}Dry run — would update:`);\n for (const doc of response.docsUpdated) {\n console.log(` ${chalk.yellow('~')} ${doc}`);\n }\n if (response.changesSummary) {\n console.log(chalk.dim(`\\n ${response.changesSummary}`));\n }\n return;\n }\n\n const written = writeRefreshDocs(response.updatedDocs);\n spinner?.succeed(`${prefix}Updated ${written.length} doc${written.length === 1 ? '' : 's'}`);\n\n for (const file of written) {\n log(quiet, ` ${chalk.green('✓')} ${file}`);\n }\n\n if (response.changesSummary) {\n log(quiet, chalk.dim(`\\n ${response.changesSummary}`));\n }\n\n if (currentSha) {\n writeState({ lastRefreshSha: currentSha, lastRefreshTimestamp: new Date().toISOString() });\n }\n\n trackEvent('refresh_completed', {\n docs_updated: written.length,\n changed_files: diff.changedFiles.length,\n updated_files: written,\n });\n}\n\nexport async function refreshCommand(options: RefreshOptions) {\n const quiet = !!options.quiet;\n\n try {\n const auth = getStoredAuth();\n if (!auth) {\n if (quiet) return;\n console.log(chalk.red('Not authenticated. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n if (isGitRepo()) {\n await refreshSingleRepo(process.cwd(), options);\n return;\n }\n\n const repos = discoverGitRepos(process.cwd());\n if (repos.length === 0) {\n if (quiet) return;\n console.log(chalk.red('Not inside a git repository and no git repos found in child directories.'));\n throw new Error('__exit__');\n }\n\n log(quiet, chalk.dim(`Found ${repos.length} git repo${repos.length === 1 ? '' : 's'}\\n`));\n\n const originalDir = process.cwd();\n for (const repo of repos) {\n const repoName = path.basename(repo);\n try {\n process.chdir(repo);\n await refreshSingleRepo(repo, { ...options, label: repoName });\n } catch (err) {\n if (err instanceof Error && err.message === '__exit__') continue;\n log(quiet, chalk.yellow(`${repoName}: refresh failed — ${err instanceof Error ? err.message : 'unknown error'}`));\n }\n }\n process.chdir(originalDir);\n } catch (err) {\n if (err instanceof Error && err.message === '__exit__') throw err;\n if (quiet) return;\n const msg = err instanceof Error ? err.message : 'Unknown error';\n console.log(chalk.red(`Refresh failed: ${msg}`));\n throw new Error('__exit__');\n }\n}\n","import { execSync } from 'child_process';\n\nconst MAX_DIFF_BYTES = 100_000;\n\nconst DOC_PATTERNS = [\n 'CLAUDE.md',\n 'README.md',\n '.cursorrules',\n '.cursor/rules/',\n '.claude/skills/',\n];\n\nfunction excludeArgs(): string[] {\n return DOC_PATTERNS.flatMap(p => ['--', `:!${p}`]);\n}\n\nfunction safeExec(cmd: string): string {\n try {\n return execSync(cmd, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n maxBuffer: 10 * 1024 * 1024,\n }).trim();\n } catch {\n return '';\n }\n}\n\nexport interface DiffResult {\n hasChanges: boolean;\n committedDiff: string;\n stagedDiff: string;\n unstagedDiff: string;\n changedFiles: string[];\n summary: string;\n}\n\nexport function collectDiff(lastSha: string | null): DiffResult {\n let committedDiff = '';\n let stagedDiff = '';\n let unstagedDiff = '';\n let changedFiles: string[] = [];\n\n if (lastSha) {\n committedDiff = safeExec(`git diff ${lastSha}..HEAD ${excludeArgs().join(' ')}`);\n const committedFiles = safeExec(`git diff --name-only ${lastSha}..HEAD`);\n if (committedFiles) {\n changedFiles.push(...committedFiles.split('\\n').filter(Boolean));\n }\n } else {\n committedDiff = safeExec('git log --oneline -20');\n }\n\n stagedDiff = safeExec(`git diff --cached ${excludeArgs().join(' ')}`);\n unstagedDiff = safeExec(`git diff ${excludeArgs().join(' ')}`);\n\n const stagedFiles = safeExec('git diff --cached --name-only');\n if (stagedFiles) {\n changedFiles.push(...stagedFiles.split('\\n').filter(Boolean));\n }\n const unstagedFiles = safeExec('git diff --name-only');\n if (unstagedFiles) {\n changedFiles.push(...unstagedFiles.split('\\n').filter(Boolean));\n }\n\n const untrackedFiles = safeExec('git ls-files --others --exclude-standard');\n if (untrackedFiles) {\n changedFiles.push(...untrackedFiles.split('\\n').filter(Boolean));\n }\n\n changedFiles = [...new Set(changedFiles)].filter(\n f => !DOC_PATTERNS.some(p => f === p || f.startsWith(p))\n );\n\n const totalSize = committedDiff.length + stagedDiff.length + unstagedDiff.length;\n if (totalSize > MAX_DIFF_BYTES) {\n const ratio = MAX_DIFF_BYTES / totalSize;\n committedDiff = committedDiff.slice(0, Math.floor(committedDiff.length * ratio));\n stagedDiff = stagedDiff.slice(0, Math.floor(stagedDiff.length * ratio));\n unstagedDiff = unstagedDiff.slice(0, Math.floor(unstagedDiff.length * ratio));\n }\n\n const hasChanges = !!(committedDiff || stagedDiff || unstagedDiff || changedFiles.length);\n\n const parts: string[] = [];\n if (changedFiles.length) parts.push(`${changedFiles.length} files changed`);\n if (committedDiff) parts.push('committed changes');\n if (stagedDiff) parts.push('staged changes');\n if (unstagedDiff) parts.push('unstaged changes');\n const summary = parts.join(', ') || 'no changes';\n\n return { hasChanges, committedDiff, stagedDiff, unstagedDiff, changedFiles, summary };\n}\n","import fs from 'fs';\nimport path from 'path';\n\ninterface RefreshDocs {\n claudeMd?: string | null;\n readmeMd?: string | null;\n cursorrules?: string | null;\n cursorRules?: Array<{ filename: string; content: string }> | null;\n claudeSkills?: Array<{ filename: string; content: string }> | null;\n}\n\nexport function writeRefreshDocs(docs: RefreshDocs): string[] {\n const written: string[] = [];\n\n if (docs.claudeMd) {\n fs.writeFileSync('CLAUDE.md', docs.claudeMd);\n written.push('CLAUDE.md');\n }\n\n if (docs.readmeMd) {\n fs.writeFileSync('README.md', docs.readmeMd);\n written.push('README.md');\n }\n\n if (docs.cursorrules) {\n fs.writeFileSync('.cursorrules', docs.cursorrules);\n written.push('.cursorrules');\n }\n\n if (docs.cursorRules) {\n const rulesDir = path.join('.cursor', 'rules');\n if (!fs.existsSync(rulesDir)) fs.mkdirSync(rulesDir, { recursive: true });\n for (const rule of docs.cursorRules) {\n const filePath = path.join(rulesDir, rule.filename);\n fs.writeFileSync(filePath, rule.content);\n written.push(filePath);\n }\n }\n\n if (docs.claudeSkills) {\n const skillsDir = path.join('.claude', 'skills');\n if (!fs.existsSync(skillsDir)) fs.mkdirSync(skillsDir, { recursive: true });\n for (const skill of docs.claudeSkills) {\n const filePath = path.join(skillsDir, skill.filename);\n fs.writeFileSync(filePath, skill.content);\n written.push(filePath);\n }\n }\n\n return written;\n}\n","import chalk from 'chalk';\nimport { isHookInstalled, installHook, removeHook } from '../lib/hooks.js';\n\nexport async function hooksInstallCommand() {\n const result = installHook();\n if (result.alreadyInstalled) {\n console.log(chalk.dim('Hook already installed.'));\n return;\n }\n console.log(chalk.green('✓') + ' SessionEnd hook installed in .claude/settings.json');\n console.log(chalk.dim(' Docs will auto-refresh when Claude Code sessions end.'));\n}\n\nexport async function hooksRemoveCommand() {\n const result = removeHook();\n if (result.notFound) {\n console.log(chalk.dim('Hook not found.'));\n return;\n }\n console.log(chalk.green('✓') + ' SessionEnd hook removed from .claude/settings.json');\n}\n\nexport async function hooksStatusCommand() {\n const installed = isHookInstalled();\n if (installed) {\n console.log(chalk.green('✓') + ' Auto-refresh hook is ' + chalk.green('installed'));\n } else {\n console.log(chalk.dim('✗') + ' Auto-refresh hook is ' + chalk.yellow('not installed'));\n console.log(chalk.dim(' Run `caliber hooks install` to enable auto-refresh on session end.'));\n }\n}\n","import chalk from 'chalk';\nimport readline from 'readline';\nimport ora from 'ora';\nimport select from '@inquirer/select';\nimport confirm from '@inquirer/confirm';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { apiRequest } from '../api/client.js';\nimport { trackEvent } from '../telemetry.js';\n\ninterface ReviewOptions {\n rating?: string;\n}\n\nfunction prompt(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nasync function promptRating(): Promise<number> {\n return select({\n message: 'How helpful was Caliber in setting up your coding agent?',\n choices: [\n { name: 'Not helpful at all', value: 1 },\n { name: 'Slightly helpful', value: 2 },\n { name: 'Moderately helpful', value: 3 },\n { name: 'Very helpful', value: 4 },\n { name: 'Extremely helpful', value: 5 },\n ],\n });\n}\n\nasync function promptRecommend(): Promise<'yes' | 'no' | 'maybe'> {\n return select({\n message: 'Would you recommend Caliber to a colleague?',\n choices: [\n { name: 'Yes', value: 'yes' as const },\n { name: 'No', value: 'no' as const },\n { name: 'Maybe', value: 'maybe' as const },\n ],\n });\n}\n\nfunction starRating(rating: number): string {\n return '★'.repeat(rating) + '☆'.repeat(5 - rating);\n}\n\nasync function submitReview(body: { rating: number; bestPart: string; biggestGap: string; wouldRecommend: string }) {\n const spinner = ora('Submitting review...').start();\n try {\n await apiRequest('/api/reviews', { method: 'POST', body });\n spinner.succeed('Review submitted');\n trackEvent('review_submitted', { rating: body.rating, would_recommend: body.wouldRecommend });\n console.log(chalk.green.bold('\\n Thank you for your feedback!\\n'));\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Unknown error';\n spinner.fail(`Failed to submit review: ${msg}`);\n trackEvent('error_occurred', { error_type: 'review_submit_failed', error_message: msg, command: 'review' });\n throw new Error('__exit__');\n }\n}\n\nexport async function reviewCommand(message: string | undefined, options: ReviewOptions) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('\\n Not authenticated. Run `caliber login` first.\\n'));\n throw new Error('__exit__');\n }\n\n // Quick mode: caliber review \"love it!\" [-r 5]\n if (message) {\n const rating = options.rating ? parseInt(options.rating, 10) : 5;\n if (rating < 1 || rating > 5 || isNaN(rating)) {\n console.log(chalk.red('Rating must be between 1 and 5.'));\n throw new Error('__exit__');\n }\n console.log(chalk.dim(`\\n ${starRating(rating)} \"${message}\"\\n`));\n await submitReview({ rating, bestPart: message, biggestGap: '', wouldRecommend: 'yes' });\n return;\n }\n\n // Interactive mode\n console.log(chalk.hex('#6366f1').bold('\\n Share your feedback\\n'));\n console.log(chalk.dim(' We\\'d love to hear how Caliber is working for you.'));\n console.log(chalk.dim(' This takes under 2 minutes.\\n'));\n console.log(chalk.dim(' Tip: use `caliber review \"your feedback\"` for a quick review.\\n'));\n\n const rating = await promptRating();\n const bestPart = await prompt(chalk.cyan('\\n What did you find most useful? '));\n const biggestGap = await prompt(chalk.cyan('\\n What was missing or could be better? '));\n const wouldRecommend = await promptRecommend();\n\n console.log(chalk.bold('\\n Your review:\\n'));\n console.log(` Rating: ${starRating(rating)} (${rating}/5)`);\n console.log(` Most useful: ${bestPart || chalk.dim('(skipped)')}`);\n console.log(` Could be better: ${biggestGap || chalk.dim('(skipped)')}`);\n console.log(` Would recommend: ${wouldRecommend}`);\n\n const shouldSubmit = await confirm({ message: 'Submit this review?', default: true });\n if (!shouldSubmit) {\n console.log(chalk.dim('\\n Review cancelled.\\n'));\n return;\n }\n\n await submitReview({ rating, bestPart, biggestGap, wouldRecommend });\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { execSync } from 'child_process';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport confirm from '@inquirer/confirm';\n\nconst __dirname_vc = path.dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n fs.readFileSync(path.resolve(__dirname_vc, '..', 'package.json'), 'utf-8')\n);\n\nfunction getInstalledVersion(): string | null {\n try {\n const globalRoot = execSync('npm root -g', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n const pkgPath = path.join(globalRoot, '@caliber-ai', 'cli', 'package.json');\n return JSON.parse(fs.readFileSync(pkgPath, 'utf-8')).version;\n } catch {\n return null;\n }\n}\n\nexport async function checkForUpdates(): Promise<void> {\n if (process.env.CALIBER_SKIP_UPDATE_CHECK) return;\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 2000);\n\n const res = await fetch('https://registry.npmjs.org/@caliber-ai/cli/latest', {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n\n if (!res.ok) return;\n\n const data = (await res.json()) as { version?: string };\n const latest = data.version;\n if (!latest) return;\n\n const current = pkg.version as string;\n if (current === latest) return;\n\n const isInteractive = process.stdin.isTTY === true;\n\n if (!isInteractive) {\n console.log(\n chalk.yellow(\n `\\nUpdate available: ${current} -> ${latest}\\nRun ${chalk.bold('npm install -g @caliber-ai/cli')} to upgrade.\\n`\n )\n );\n return;\n }\n\n console.log(\n chalk.yellow(`\\nUpdate available: ${current} -> ${latest}`)\n );\n\n const shouldUpdate = await confirm({ message: 'Would you like to update now? (Y/n)', default: true });\n if (!shouldUpdate) {\n console.log();\n return;\n }\n\n const spinner = ora('Updating @caliber-ai/cli...').start();\n try {\n execSync(`npm install -g @caliber-ai/cli@${latest} --prefer-online`, { stdio: 'pipe', timeout: 60_000 });\n\n const installed = getInstalledVersion();\n if (installed !== latest) {\n spinner.fail(`Update incomplete — got ${installed ?? 'unknown'}, expected ${latest}`);\n console.log(chalk.yellow(`Run ${chalk.bold(`npm install -g @caliber-ai/cli@${latest}`)} manually.\\n`));\n return;\n }\n\n spinner.succeed(chalk.green(`Updated to ${latest}`));\n\n const args = process.argv.slice(2);\n console.log(chalk.dim(`\\nRestarting: caliber ${args.join(' ')}\\n`));\n execSync(`caliber ${args.map((a) => JSON.stringify(a)).join(' ')}`, {\n stdio: 'inherit',\n env: { ...process.env, CALIBER_SKIP_UPDATE_CHECK: '1' },\n });\n process.exit(0);\n } catch (err) {\n spinner.fail('Update failed');\n const msg = err instanceof Error ? err.message : '';\n if (msg && !msg.includes('SIGTERM')) console.log(chalk.dim(` ${msg.split('\\n')[0]}`));\n console.log(\n chalk.yellow(\n `Run ${chalk.bold(`npm install -g @caliber-ai/cli@${latest}`)} manually to upgrade.\\n`\n )\n );\n }\n } catch {\n // Silently ignore — offline, timeout, registry down, etc.\n }\n}\n","import path from 'path';\nimport { Sentry } from './lib/sentry.js';\nimport { program } from './cli.js';\nimport { getStoredAuth } from './auth/token-store.js';\nimport { isFirstRun, getDeviceId, trackEvent, identifyUser, shutdownTelemetry } from './telemetry.js';\nimport { checkForUpdates } from './utils/version-check.js';\n\nif (process.env.CALIBER_LOCAL) {\n process.env.CALIBER_SKIP_UPDATE_CHECK = '1';\n}\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 Sentry.setUser({ id: auth.userId, email: auth.email });\n}\n\nawait checkForUpdates();\n\nasync function gracefulExit(code: number) {\n await Promise.all([\n shutdownTelemetry(),\n Sentry.flush(2000),\n ]);\n process.exit(code);\n}\n\nprocess.on('SIGINT', () => gracefulExit(130));\nprocess.on('SIGTERM', () => gracefulExit(143));\n\nprogram.parseAsync()\n .catch((err) => {\n const msg = err instanceof Error ? err.message : 'Unexpected error';\n if (msg !== '__exit__') {\n console.error(msg);\n Sentry.captureException(err, {\n tags: { command: process.argv[2] || 'unknown' },\n contexts: { cli: { args: process.argv.slice(2).join(' '), cwd: process.cwd() } },\n });\n }\n trackEvent('error_occurred', { error_type: 'cli_crash', error_message: msg, command: process.argv[2] || 'unknown' });\n process.exitCode = 1;\n })\n .finally(() => gracefulExit(Number(process.exitCode ?? 0)));\n"],"mappings":"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","names":["path","os","fs","path","fileURLToPath","chalk","ora","fs","fs","auth","resolve","fs","path","os","fileURLToPath","path","fs","auth","fileURLToPath","pkg","os","resolve","crypto","fs","path","fs","path","pkg","fs","path","path","fs","path","fs","path","IGNORE_DIRS","auth","path","crypto","path","fs","fs","fs","path","fs","path","fs","path","fs","crypto","fs","MANIFEST_FILE","fs","path","fs","execSync","fs","path","fs","path","execSync","chalk","chalk","auth","ora","resolve","fs","chalk","ora","ora","chalk","chalk","fs","fs","path","crypto","path","fs","crypto","auth","chalk","fs","chalk","ora","auth","chalk","ora","chalk","auth","chalk","chalk","ora","dirname","auth","chalk","recs","selected","ora","resolve","dirname","chalk","ora","auth","chalk","ora","chalk","ora","auth","chalk","ora","fs","path","chalk","ora","execSync","fs","path","fs","path","chalk","ora","auth","chalk","chalk","chalk","readline","ora","select","confirm","readline","resolve","select","ora","chalk","auth","rating","confirm","__dirname","path","fileURLToPath","pkg","fs","fs","path","fileURLToPath","execSync","chalk","ora","confirm","pkg"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/lib/sentry.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/fingerprint/code-analysis.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/writers/staging.ts","../src/utils/editor.ts","../src/lib/hooks.ts","../src/lib/state.ts","../src/utils/spinner-messages.ts","../src/commands/undo.ts","../src/commands/status.ts","../src/scanner/index.ts","../src/commands/regenerate.ts","../src/commands/logout.ts","../src/commands/recommend.ts","../src/commands/sync.ts","../src/commands/diff.ts","../src/commands/refresh.ts","../src/lib/git-diff.ts","../src/writers/refresh.ts","../src/commands/hooks.ts","../src/commands/review.ts","../src/utils/version-check.ts","../src/bin.ts"],"sourcesContent":["import path from 'path';\nimport os from 'os';\n\nexport const API_URL = process.env.CALIBER_API_URL || 'https://caliber-backend.up.railway.app';\nexport const FRONTEND_URL = process.env.CALIBER_FRONTEND_URL || 'https://caliber-app.up.railway.app';\nexport const CLI_CALLBACK_PORT = 19284;\nexport const AUTH_DIR = path.join(os.homedir(), '.caliber');\nexport const AUTH_FILE = path.join(AUTH_DIR, 'auth.json');\nexport const CALIBER_DIR = '.caliber';\nexport const MANIFEST_FILE = path.join(CALIBER_DIR, 'manifest.json');\nexport const BACKUPS_DIR = path.join(CALIBER_DIR, 'backups');\n","import * as Sentry from '@sentry/node';\nimport os from 'os';\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst dsn = process.env.CALIBER_SENTRY_DSN || 'https://e988132485fced78d7d60202f97942b3@o4510975175622656.ingest.us.sentry.io/4510975226347520';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n fs.readFileSync(path.resolve(__dirname, '..', 'package.json'), 'utf-8')\n);\n\nif (dsn) {\n Sentry.init({\n dsn,\n release: `caliber-cli@${pkg.version}`,\n environment: process.env.NODE_ENV || 'production',\n tracesSampleRate: 0,\n beforeSend(event) {\n event.tags = { ...event.tags, source: 'cli', os: os.platform() };\n return event;\n },\n });\n}\n\nexport { Sentry };\n","import { Command } from 'commander';\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { initCommand } from './commands/init.js';\nimport { undoCommand } from './commands/undo.js';\nimport { statusCommand } from './commands/status.js';\nimport { regenerateCommand } from './commands/regenerate.js';\nimport { loginCommand } from './commands/login.js';\nimport { logoutCommand } from './commands/logout.js';\nimport { recommendCommand } from './commands/recommend.js';\n// import { healthCommand } from './commands/health.js';\nimport { syncCommand } from './commands/sync.js';\nimport { diffCommand } from './commands/diff.js';\nimport { refreshCommand } from './commands/refresh.js';\nimport { hooksInstallCommand, hooksRemoveCommand, hooksStatusCommand } from './commands/hooks.js';\nimport { reviewCommand } from './commands/review.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n fs.readFileSync(path.resolve(__dirname, '..', 'package.json'), 'utf-8')\n);\n\nconst program = new Command();\n\nconst displayVersion = process.env.CALIBER_LOCAL ? `${pkg.version}-local` : pkg.version;\n\nprogram\n .name(process.env.CALIBER_LOCAL ? 'caloc' : 'caliber')\n .description('Configure your coding agent environment')\n .version(displayVersion);\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('regenerate')\n .alias('regen')\n .alias('re')\n .alias('update')\n .description('Re-analyze project and regenerate setup')\n .option('--dry-run', 'Preview changes without writing files')\n .action(regenerateCommand);\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\nprogram\n .command('recommend')\n .description('Discover and manage skill recommendations')\n .option('--generate', 'Force fresh recommendation generation')\n .option('--status <status>', 'View recommendations by status: pending, accepted, dismissed')\n .action(recommendCommand);\n\n// Health command disabled — feature not ready\n// program\n// .command('health')\n// .description('Analyze context health and quality')\n// .option('--fix', 'Generate and execute a fix plan')\n// .option('--json', 'Output as JSON')\n// .action(healthCommand);\n\nprogram\n .command('sync')\n .description('Sync local config with server state')\n .option('--platform <platform>', 'Target platform: claude, cursor, or both')\n .option('--dry-run', 'Preview changes without writing files')\n .action(syncCommand);\n\nprogram\n .command('diff')\n .description('Compare local config with server state')\n .option('--platform <platform>', 'Target platform: claude, cursor, or both')\n .action(diffCommand);\n\nprogram\n .command('refresh')\n .description('Update docs based on recent code changes')\n .option('--quiet', 'Suppress output (for use in hooks)')\n .option('--dry-run', 'Preview changes without writing files')\n .action(refreshCommand);\n\nprogram\n .command('review [message]')\n .description('Share feedback on Caliber (e.g. caliber review \"love it!\")')\n .option('-r, --rating <number>', 'Rating from 1-5')\n .action(reviewCommand);\n\nconst hooks = program\n .command('hooks')\n .description('Manage Claude Code session hooks');\n\nhooks\n .command('install')\n .description('Install auto-refresh SessionEnd hook')\n .action(hooksInstallCommand);\n\nhooks\n .command('remove')\n .description('Remove auto-refresh SessionEnd hook')\n .action(hooksRemoveCommand);\n\nhooks\n .command('status')\n .description('Check if auto-refresh hook is installed')\n .action(hooksStatusCommand);\n\nexport { program };\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport readline from 'readline';\nimport select from '@inquirer/select';\nimport fs from 'fs';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { loginCommand } from './login.js';\nimport { collectFingerprint, computeFingerprintHash, enrichFingerprintWithLLM } from '../fingerprint/index.js';\nimport { apiRequest, apiStream } from '../api/client.js';\nimport { writeSetup } from '../writers/index.js';\nimport { stageFiles, cleanupStaging } from '../writers/staging.js';\nimport type { StagedFile } from '../writers/staging.js';\nimport { detectAvailableEditors, openDiffsInEditor } from '../utils/editor.js';\nimport type { ReviewMethod } from '../utils/editor.js';\nimport { createTwoFilesPatch } from 'diff';\nimport { trackEvent } from '../telemetry.js';\nimport { installHook } from '../lib/hooks.js';\nimport { writeState, getCurrentHeadSha } from '../lib/state.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 console.log(chalk.bold(' What is Caliber?\\n'));\n console.log(chalk.dim(' Caliber audits your AI agent configurations and suggests targeted'));\n console.log(chalk.dim(' improvements. It analyzes CLAUDE.md, .cursorrules, and skills'));\n console.log(chalk.dim(' against your actual codebase — keeping what works, fixing'));\n console.log(chalk.dim(' what\\'s stale, and adding what\\'s missing.\\n'));\n\n console.log(chalk.bold(' How it works:\\n'));\n console.log(chalk.dim(' 1. Scan Analyze your code, dependencies, and file structure'));\n console.log(chalk.dim(' 2. Match Detect existing configs and check for teammate setups'));\n console.log(chalk.dim(' 3. Generate AI creates config files tailored to your project'));\n console.log(chalk.dim(' 4. Review You accept, refine, or decline the generated setup'));\n console.log(chalk.dim(' 5. Apply Config files are written to your project'));\n console.log(chalk.dim(' 6. Sync Setup is saved so teammates get the same config\\n'));\n\n // Step 1: Auth check\n console.log(chalk.hex('#6366f1').bold(' Step 1/6 — Authenticate\\n'));\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 throw new Error('__exit__');\n }\n }\n console.log(chalk.dim(`Authenticated as ${auth.email}\\n`));\n\n // Step 2: Collect fingerprint\n console.log(chalk.hex('#6366f1').bold(' Step 2/6 — Scan project\\n'));\n console.log(chalk.dim(' Detecting languages, frameworks, file structure, and existing configs.\\n'));\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 const enrichmentPromise = enrichFingerprintWithLLM(fingerprint, process.cwd());\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 cursor_skills_count: fingerprint.existingConfigs.cursorSkills?.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: Detect existing setup (local configs + teammate)\n console.log(chalk.hex('#6366f1').bold(' Step 3/6 — Match project\\n'));\n console.log(chalk.dim(' Scanning for existing rules, skills, and teammate setups.\\n'));\n const matchSpinner = ora('Scanning for existing setup...').start();\n\n // Build list of existing local config files\n const localConfigs: string[] = [];\n const ec = fingerprint.existingConfigs;\n if (ec.claudeMd) localConfigs.push('CLAUDE.md');\n if (ec.claudeSettings) localConfigs.push('.claude/settings.json');\n if (Array.isArray(ec.claudeSkills)) {\n for (const skill of ec.claudeSkills) {\n localConfigs.push(`.claude/skills/${skill.filename}`);\n }\n }\n if (ec.cursorrules) localConfigs.push('.cursorrules');\n if (Array.isArray(ec.cursorRules)) {\n for (const rule of ec.cursorRules) {\n localConfigs.push(`.cursor/rules/${rule.filename}`);\n }\n }\n if (Array.isArray(ec.cursorSkills)) {\n for (const skill of ec.cursorSkills) {\n localConfigs.push(`.cursor/skills/${skill.slug}/SKILL.md`);\n }\n }\n\n\n // Check server for teammate setup\n let existingSetup = null;\n let existingProjectId: string | null = null;\n let hasTeammateSetup = false;\n try {\n const match = await apiRequest<{ project: { id: string } | null; setup: unknown }>('/api/projects/match', {\n method: 'POST',\n body: { fingerprintHash: hash },\n });\n if (match.project) {\n existingProjectId = match.project.id;\n }\n if (match.setup) {\n existingSetup = match.setup;\n hasTeammateSetup = true;\n trackEvent('existing_config_detected', {\n has_claude_md: !!fingerprint.existingConfigs.claudeMd,\n has_cursorrules: !!fingerprint.existingConfigs.cursorrules,\n has_cursor_rules: (fingerprint.existingConfigs.cursorRules?.length ?? 0) > 0,\n has_skills: (fingerprint.existingConfigs.claudeSkills?.length ?? 0) > 0,\n });\n }\n } catch {\n // Server check failed — continue with local-only results\n }\n\n // Display results\n matchSpinner.stop();\n\n // Local configs section\n console.log(chalk.dim(' Local configs:'));\n if (localConfigs.length > 0) {\n for (const config of localConfigs) {\n console.log(` ${chalk.green('✓')} ${config}`);\n }\n } else {\n console.log(` ${chalk.dim('ℹ None found')}`);\n }\n\n // Teammate setup section\n console.log('');\n console.log(chalk.dim(' Teammate setup:'));\n if (hasTeammateSetup) {\n console.log(` ${chalk.green('✓')} Found on Caliber`);\n } else {\n console.log(` ${chalk.dim('ℹ None found')}`);\n }\n console.log('');\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 // Await LLM enrichment before generation\n await enrichmentPromise;\n\n // Step 6: Generate setup via AI\n console.log(chalk.hex('#6366f1').bold(' Step 4/6 — Auditing your configs\\n'));\n console.log(chalk.dim(' AI is auditing your CLAUDE.md, skills, and rules against your'));\n console.log(chalk.dim(' project\\'s actual codebase and conventions.\\n'));\n console.log(chalk.dim(' This usually takes 1–3 minutes on first run.\\n'));\n let generatedSetup: Record<string, unknown> | null = null;\n let rawOutput: string | undefined;\n\n trackEvent('generation_started', { target_agent: targetAgent });\n\n // Determine if we're improving an existing setup or creating from scratch\n const hasExistingConfig = !!(\n ec.claudeMd || ec.claudeSettings || ec.claudeSkills?.length ||\n ec.cursorrules || ec.cursorRules?.length\n );\n\n const genStartTime = Date.now();\n const genSpinner = ora('Generating setup...').start();\n const genMessages = new SpinnerMessages(genSpinner, GENERATION_MESSAGES, { showElapsedTime: true });\n genMessages.start();\n\n try {\n await apiStream(\n '/api/setups/generate',\n {\n fingerprint,\n targetAgent,\n prompt: fingerprint.description,\n mode: hasExistingConfig ? 'improve' : 'create',\n },\n () => {},\n (payload) => {\n generatedSetup = payload.setup as Record<string, unknown>;\n rawOutput = payload.raw;\n },\n (error) => {\n genMessages.stop();\n trackEvent('error_occurred', { error_type: 'generation_failed', error_message: error, command: 'init' });\n genSpinner.fail(`Generation error: ${error}`);\n },\n (status) => { genMessages.handleServerStatus(status); }\n );\n } catch (err) {\n genMessages.stop();\n const msg = err instanceof Error ? err.message : 'Unknown error';\n trackEvent('error_occurred', { error_type: 'generation_request_failed', error_message: msg, command: 'init' });\n genSpinner.fail(`Generation failed: ${msg}`);\n throw new Error('__exit__');\n }\n\n genMessages.stop();\n\n if (!generatedSetup) {\n genSpinner.fail('Failed to generate setup.');\n if (rawOutput) {\n console.log(chalk.dim('\\nRaw LLM output (JSON parse failed):'));\n console.log(chalk.dim(rawOutput.slice(0, 500)));\n }\n throw new Error('__exit__');\n }\n\n const elapsedMs = Date.now() - genStartTime;\n const mins = Math.floor(elapsedMs / 60000);\n const secs = Math.floor((elapsedMs % 60000) / 1000);\n const timeStr = mins > 0 ? `${mins}m ${secs}s` : `${secs}s`;\n genSpinner.succeed(`Setup generated ${chalk.dim(`in ${timeStr}`)}`);\n printSetupSummary(generatedSetup);\n\n // Step 7: Accept / Refine / Decline with staging\n console.log(chalk.hex('#6366f1').bold(' Step 5/6 — Review\\n'));\n\n const setupFiles = collectSetupFiles(generatedSetup);\n const staged = stageFiles(setupFiles, process.cwd());\n\n console.log(chalk.dim(` ${chalk.green(`${staged.newFiles} new`)} / ${chalk.yellow(`${staged.modifiedFiles} modified`)} file${staged.newFiles + staged.modifiedFiles !== 1 ? 's' : ''}\\n`));\n\n const reviewMethod = await promptReviewMethod();\n openReview(reviewMethod, staged.stagedFiles);\n\n let action = await promptReviewAction();\n\n while (action === 'refine') {\n generatedSetup = await refineLoop(generatedSetup, targetAgent);\n if (!generatedSetup) {\n cleanupStaging();\n trackEvent('refinement_cancelled');\n console.log(chalk.dim('Refinement cancelled. No files were modified.'));\n return;\n }\n const updatedFiles = collectSetupFiles(generatedSetup);\n const restaged = stageFiles(updatedFiles, process.cwd());\n console.log(chalk.dim(` ${chalk.green(`${restaged.newFiles} new`)} / ${chalk.yellow(`${restaged.modifiedFiles} modified`)} file${restaged.newFiles + restaged.modifiedFiles !== 1 ? 's' : ''}\\n`));\n openReview(reviewMethod, restaged.stagedFiles);\n printSetupSummary(generatedSetup);\n action = await promptReviewAction();\n }\n\n cleanupStaging();\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 // Step 8: Write files\n console.log(chalk.hex('#6366f1').bold(' Step 6/6 — Apply & sync\\n'));\n console.log(chalk.dim(' Writing config files to your project and syncing to Caliber so'));\n console.log(chalk.dim(' teammates get the same setup when they run `caliber init`.\\n'));\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', {\n files_written: result.written.length,\n files_deleted: result.deleted.length,\n target_agent: targetAgent,\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.deleted.length > 0) {\n console.log(chalk.bold('\\nFiles removed:'));\n for (const file of result.deleted) {\n console.log(` ${chalk.red('✗')} ${file}`);\n }\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 throw new Error('__exit__');\n }\n\n // Auto-install refresh hook for Claude Code users\n if (targetAgent === 'claude' || targetAgent === 'both') {\n const hookResult = installHook();\n if (hookResult.installed) {\n console.log(` ${chalk.green('✓')} Auto-refresh hook installed — docs update on Claude Code session end`);\n console.log(chalk.dim(' Run `caliber hooks remove` to disable'));\n const sha = getCurrentHeadSha();\n if (sha) {\n writeState({ lastRefreshSha: sha, lastRefreshTimestamp: new Date().toISOString() });\n }\n } else if (hookResult.alreadyInstalled) {\n console.log(chalk.dim(' Auto-refresh hook already installed'));\n }\n }\n\n // Step 9: Save to server\n try {\n let projectId = existingProjectId;\n\n if (!projectId) {\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 projectId = project.id;\n }\n\n await apiRequest(`/api/setups/project/${projectId}`, {\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 console.log(chalk.bold(' Next steps:\\n'));\n console.log(` ${chalk.hex('#6366f1')('caliber recommend')} Discover additional skills for your stack`);\n console.log(` ${chalk.hex('#6366f1')('caliber undo')} Revert all changes from this run`);\n console.log('');\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 let streamError: string | 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) => { streamError = error; },\n (status) => { refineMessages.handleServerStatus(status); }\n );\n\n refineMessages.stop();\n\n if (streamError) {\n refineSpinner.fail(`Refinement failed: ${streamError}`);\n console.log(chalk.dim('Try rephrasing your request, or type \"done\" to keep the current setup.'));\n } else 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 } else {\n refineSpinner.fail('Refinement failed — could not parse AI response.');\n console.log(chalk.dim('Try rephrasing your request, or type \"done\" to keep the current setup.'));\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\nasync function promptAgent(): Promise<TargetAgent> {\n return select({\n message: 'Which coding agent are you using?',\n choices: [\n { name: 'Claude Code', value: 'claude' as const },\n { name: 'Cursor', value: 'cursor' as const },\n { name: 'Both', value: 'both' as const },\n ],\n });\n}\n\nasync function promptReviewMethod(): Promise<ReviewMethod> {\n const available = detectAvailableEditors();\n if (available.length === 1) return 'terminal';\n\n const choices = available.map(method => {\n switch (method) {\n case 'cursor': return { name: 'Cursor (diff view)', value: 'cursor' as const };\n case 'vscode': return { name: 'VS Code (diff view)', value: 'vscode' as const };\n case 'terminal': return { name: 'Terminal', value: 'terminal' as const };\n }\n });\n\n return select({ message: 'How would you like to review the changes?', choices });\n}\n\nfunction openReview(method: ReviewMethod, stagedFiles: StagedFile[]): void {\n if (method === 'cursor' || method === 'vscode') {\n openDiffsInEditor(method, stagedFiles.map(f => ({\n originalPath: f.originalPath,\n proposedPath: f.proposedPath,\n })));\n console.log(chalk.dim(' Diffs opened in your editor.\\n'));\n } else {\n for (const file of stagedFiles) {\n if (file.currentPath) {\n const currentLines = fs.readFileSync(file.currentPath, 'utf-8').split('\\n');\n const proposedLines = fs.readFileSync(file.proposedPath, 'utf-8').split('\\n');\n const patch = createTwoFilesPatch(file.relativePath, file.relativePath, currentLines.join('\\n'), proposedLines.join('\\n'));\n let added = 0, removed = 0;\n for (const line of patch.split('\\n')) {\n if (line.startsWith('+') && !line.startsWith('+++')) added++;\n if (line.startsWith('-') && !line.startsWith('---')) removed++;\n }\n console.log(` ${chalk.yellow('~')} ${file.relativePath} ${chalk.green(`+${added}`)} ${chalk.red(`-${removed}`)}`);\n } else {\n const lines = fs.readFileSync(file.proposedPath, 'utf-8').split('\\n').length;\n console.log(` ${chalk.green('+')} ${file.relativePath} ${chalk.dim(`${lines} lines`)}`);\n }\n }\n console.log('');\n console.log(chalk.dim(` Files staged at .caliber/staged/ for manual inspection.\\n`));\n }\n}\n\nasync function promptReviewAction(): Promise<'accept' | 'refine' | 'decline'> {\n return select({\n message: 'What would you like to do?',\n choices: [\n { name: 'Accept and apply', value: 'accept' as const },\n { name: 'Refine via chat', value: 'refine' as const },\n { name: 'Decline', value: 'decline' as const },\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 const fileDescriptions = setup.fileDescriptions as Record<string, string> | undefined;\n const deletions = setup.deletions as Array<{ filePath: string; reason: string }> | undefined;\n\n console.log('');\n console.log(chalk.bold(' Proposed changes:\\n'));\n\n const getDescription = (filePath: string): string | undefined => {\n return fileDescriptions?.[filePath];\n };\n\n if (claude) {\n if (claude.claudeMd) {\n const icon = fs.existsSync('CLAUDE.md') ? chalk.yellow('~') : chalk.green('+');\n const desc = getDescription('CLAUDE.md');\n console.log(` ${icon} ${chalk.bold('CLAUDE.md')}`);\n if (desc) {\n console.log(chalk.dim(` ${desc}`));\n }\n console.log('');\n }\n\n const skills = claude.skills as Array<{ name: string; content: string }> | undefined;\n if (Array.isArray(skills) && skills.length > 0) {\n for (const skill of skills) {\n const skillPath = `.claude/skills/${skill.name.replace(/[^a-z0-9-]/gi, '-').toLowerCase()}.md`;\n const icon = fs.existsSync(skillPath) ? chalk.yellow('~') : chalk.green('+');\n const desc = getDescription(skillPath);\n console.log(` ${icon} ${chalk.bold(skillPath)}`);\n console.log(chalk.dim(` ${desc || summarizeSkill(skill)}`));\n console.log('');\n }\n }\n\n }\n\n if (cursor) {\n if (cursor.cursorrules) {\n const icon = fs.existsSync('.cursorrules') ? chalk.yellow('~') : chalk.green('+');\n const desc = getDescription('.cursorrules');\n console.log(` ${icon} ${chalk.bold('.cursorrules')}`);\n if (desc) console.log(chalk.dim(` ${desc}`));\n console.log('');\n }\n\n const cursorSkills = cursor.skills as Array<{ name: string; slug: string; content: string }> | undefined;\n if (Array.isArray(cursorSkills) && cursorSkills.length > 0) {\n for (const skill of cursorSkills) {\n const skillPath = `.cursor/skills/${skill.slug}/SKILL.md`;\n const icon = fs.existsSync(skillPath) ? chalk.yellow('~') : chalk.green('+');\n const desc = getDescription(skillPath);\n console.log(` ${icon} ${chalk.bold(skillPath)}`);\n if (desc) {\n console.log(chalk.dim(` ${desc}`));\n } else {\n const firstLine = skill.content.split('\\n').filter(l => l.trim() && !l.trim().startsWith('#') && !l.trim().startsWith('---'))[0];\n if (firstLine) console.log(chalk.dim(` ${firstLine.trim().slice(0, 80)}`));\n }\n console.log('');\n }\n }\n\n const rules = cursor.rules as Array<{ filename: string; content: string }> | undefined;\n if (Array.isArray(rules) && rules.length > 0) {\n for (const rule of rules) {\n const rulePath = `.cursor/rules/${rule.filename}`;\n const icon = fs.existsSync(rulePath) ? chalk.yellow('~') : chalk.green('+');\n const desc = getDescription(rulePath);\n console.log(` ${icon} ${chalk.bold(rulePath)}`);\n if (desc) {\n console.log(chalk.dim(` ${desc}`));\n } else {\n const firstLine = rule.content.split('\\n').filter(l => l.trim() && !l.trim().startsWith('#'))[0];\n if (firstLine) console.log(chalk.dim(` ${firstLine.trim().slice(0, 80)}`));\n }\n console.log('');\n }\n }\n\n }\n\n if (Array.isArray(deletions) && deletions.length > 0) {\n for (const del of deletions) {\n console.log(` ${chalk.red('-')} ${chalk.bold(del.filePath)}`);\n console.log(chalk.dim(` ${del.reason}`));\n console.log('');\n }\n }\n\n console.log(` ${chalk.green('+')} ${chalk.dim('new')} ${chalk.yellow('~')} ${chalk.dim('modified')} ${chalk.red('-')} ${chalk.dim('removed')}`);\n console.log('');\n}\n\nfunction summarizeSkill(skill: { name: string; content: string }): string {\n const lines = skill.content.split('\\n').filter(l => l.trim() && !l.trim().startsWith('#'));\n return lines[0]?.trim().slice(0, 80) || skill.name;\n}\n\nfunction collectSetupFiles(setup: Record<string, unknown>): Array<{ path: string; content: string }> {\n const files: Array<{ path: string; content: string }> = [];\n const claude = setup.claude as Record<string, unknown> | undefined;\n const cursor = setup.cursor as Record<string, unknown> | undefined;\n\n if (claude) {\n if (claude.claudeMd) files.push({ path: 'CLAUDE.md', content: claude.claudeMd as string });\n const skills = claude.skills as Array<{ name: string; content: string }> | undefined;\n if (Array.isArray(skills)) {\n for (const skill of skills) {\n const skillPath = `.claude/skills/${skill.name.replace(/[^a-z0-9-]/gi, '-').toLowerCase()}.md`;\n files.push({ path: skillPath, content: skill.content });\n }\n }\n }\n\n if (cursor) {\n if (cursor.cursorrules) files.push({ path: '.cursorrules', content: cursor.cursorrules as string });\n const cursorSkills = cursor.skills as Array<{ name: string; slug: string; content: string }> | undefined;\n if (Array.isArray(cursorSkills)) {\n for (const skill of cursorSkills) {\n files.push({ path: `.cursor/skills/${skill.slug}/SKILL.md`, content: skill.content });\n }\n }\n const rules = cursor.rules as Array<{ filename: string; content: string }> | undefined;\n if (Array.isArray(rules)) {\n for (const rule of rules) {\n files.push({ path: `.cursor/rules/${rule.filename}`, content: rule.content });\n }\n }\n }\n\n return files;\n}\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\n console.log('');\n console.log(chalk.bold(' Next step:'));\n console.log('');\n console.log(` ${chalk.hex('#6366f1')('caliber init')} ${chalk.dim('Run this inside a project to generate your agent config')}`);\n console.log('');\n } catch (err) {\n trackEvent('error_occurred', { error_type: 'auth_failed', error_message: err instanceof Error ? err.message : 'Unknown error', command: 'login' });\n spinner.fail(chalk.red(`Authentication failed: ${err instanceof Error ? err.message : 'Unknown error'}`));\n throw new Error('__exit__');\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 { fileURLToPath } from 'url';\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 __dirname_telemetry = path.dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n fs.readFileSync(path.resolve(__dirname_telemetry, '..', 'package.json'), '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 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 fs from 'fs';\nimport path from 'path';\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';\nimport { analyzeCode, CodeAnalysis } from './code-analysis.js';\nimport { apiRequest } from '../api/client.js';\n\nexport type { CodeAnalysis };\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 codeAnalysis?: CodeAnalysis;\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 const codeAnalysis = analyzeCode(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 codeAnalysis,\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\nconst DEP_FILE_PATTERNS = [\n 'package.json',\n 'pyproject.toml',\n 'requirements.txt',\n 'setup.py',\n 'Pipfile',\n 'Cargo.toml',\n 'go.mod',\n 'Gemfile',\n 'build.gradle',\n 'pom.xml',\n 'composer.json',\n];\n\nconst MAX_CONTENT_SIZE = 50 * 1024;\n\nexport async function enrichFingerprintWithLLM(fingerprint: Fingerprint, dir: string): Promise<void> {\n try {\n const fileContents: Record<string, string> = {};\n let totalSize = 0;\n\n for (const treePath of fingerprint.fileTree) {\n const basename = path.basename(treePath);\n if (!DEP_FILE_PATTERNS.includes(basename)) continue;\n\n const fullPath = path.join(dir, treePath);\n if (!fs.existsSync(fullPath)) continue;\n\n try {\n const content = fs.readFileSync(fullPath, 'utf-8');\n if (totalSize + content.length > MAX_CONTENT_SIZE) break;\n fileContents[treePath] = content;\n totalSize += content.length;\n } catch {\n continue;\n }\n }\n\n if (Object.keys(fileContents).length === 0 && fingerprint.fileTree.length === 0) return;\n\n const result = await apiRequest<{ languages: string[]; frameworks: string[] }>(\n '/api/fingerprint/detect',\n {\n method: 'POST',\n body: { fileTree: fingerprint.fileTree, fileContents },\n }\n );\n\n if (result.languages?.length) {\n const langSet = new Set(fingerprint.languages);\n for (const lang of result.languages) langSet.add(lang);\n fingerprint.languages = [...langSet];\n }\n\n if (result.frameworks?.length) {\n const fwSet = new Set(fingerprint.frameworks);\n for (const fw of result.frameworks) fwSet.add(fw);\n fingerprint.frameworks = [...fwSet];\n }\n } catch {\n // Silently fall back to local detection\n }\n}\n","import { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { resolve, dirname } from 'path';\n\nfunction isInsideGitRepo(): boolean {\n let dir = process.cwd();\n while (true) {\n if (existsSync(resolve(dir, '.git'))) return true;\n const parent = dirname(dir);\n if (parent === dir) return false;\n dir = parent;\n }\n}\n\nexport function getGitRemoteUrl(): string | undefined {\n if (!isInsideGitRepo()) return 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 return isInsideGitRepo();\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 readmeMd?: string;\n claudeSettings?: Record<string, unknown>;\n claudeSkills?: Array<{ filename: string; content: string }>;\n cursorrules?: string;\n cursorRules?: Array<{ filename: string; content: string }>;\n cursorSkills?: Array<{ slug: string; filename: string; content: string }>;\n claudeMcpServers?: Record<string, unknown>;\n cursorMcpServers?: Record<string, unknown>;\n } = {};\n\n // README.md\n const readmeMdPath = path.join(dir, 'README.md');\n if (fs.existsSync(readmeMdPath)) {\n configs.readmeMd = fs.readFileSync(readmeMdPath, 'utf-8');\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 // .cursor/skills/*/SKILL.md\n const cursorSkillsDir = path.join(dir, '.cursor', 'skills');\n if (fs.existsSync(cursorSkillsDir)) {\n try {\n const slugs = fs.readdirSync(cursorSkillsDir).filter(f => {\n return fs.statSync(path.join(cursorSkillsDir, f)).isDirectory();\n });\n configs.cursorSkills = slugs\n .filter(slug => fs.existsSync(path.join(cursorSkillsDir, slug, 'SKILL.md')))\n .map(slug => ({\n slug,\n filename: 'SKILL.md',\n content: fs.readFileSync(path.join(cursorSkillsDir, slug, 'SKILL.md'), 'utf-8'),\n }));\n } catch {\n // ignore\n }\n }\n\n // .mcp.json (Claude MCP servers)\n const mcpJsonPath = path.join(dir, '.mcp.json');\n if (fs.existsSync(mcpJsonPath)) {\n try {\n const mcpJson = JSON.parse(fs.readFileSync(mcpJsonPath, 'utf-8'));\n if (mcpJson.mcpServers) {\n configs.claudeMcpServers = mcpJson.mcpServers;\n }\n } catch {\n // ignore\n }\n }\n\n // .cursor/mcp.json (Cursor MCP servers)\n const cursorMcpPath = path.join(dir, '.cursor', 'mcp.json');\n if (fs.existsSync(cursorMcpPath)) {\n try {\n const cursorMcpJson = JSON.parse(fs.readFileSync(cursorMcpPath, 'utf-8'));\n if (cursorMcpJson.mcpServers) {\n configs.cursorMcpServers = cursorMcpJson.mcpServers;\n }\n } catch {\n // ignore\n }\n }\n\n return configs;\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\nconst SOURCE_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.py']);\n\nconst CONFIG_FILE_NAMES = new Set([\n 'Dockerfile', 'docker-compose.yml', 'docker-compose.yaml',\n 'Makefile', 'tsconfig.json', 'pyproject.toml', 'turbo.json',\n 'next.config.js', 'next.config.mjs', 'next.config.ts',\n 'vite.config.ts', 'vite.config.js', 'vite.config.mjs',\n 'drizzle.config.ts', 'drizzle.config.js',\n 'jest.config.ts', 'jest.config.js', 'jest.config.mjs',\n 'vitest.config.ts', 'vitest.config.js', 'vitest.config.mts',\n 'alembic.ini', 'setup.cfg', 'tox.ini',\n]);\n\nconst CONFIG_GLOBS_DIRS: Array<{ dir: string; pattern: RegExp }> = [\n { dir: '.github/workflows', pattern: /\\.ya?ml$/ },\n];\n\nconst TOTAL_BUDGET = 50_000;\nconst CONFIG_BUDGET = Math.floor(TOTAL_BUDGET * 0.3);\nconst SOURCE_BUDGET = Math.floor(TOTAL_BUDGET * 0.7);\n\nexport interface FileSummary {\n path: string;\n language: 'ts' | 'js' | 'py';\n imports: string[];\n exports: string[];\n functions: string[];\n classes: string[];\n types: string[];\n routes: string[];\n}\n\nexport interface ConfigFileContent {\n path: string;\n content: string;\n}\n\nexport interface CodeAnalysis {\n fileSummaries: FileSummary[];\n configFiles: ConfigFileContent[];\n truncated: boolean;\n}\n\nexport function analyzeCode(dir: string): CodeAnalysis {\n const sourceFiles: string[] = [];\n const configFiles: ConfigFileContent[] = [];\n\n walkDir(dir, '', 0, 10, sourceFiles, configFiles, dir);\n\n sortByPriority(sourceFiles);\n\n let configChars = 0;\n const trimmedConfigs: ConfigFileContent[] = [];\n for (const cfg of configFiles) {\n const size = cfg.path.length + cfg.content.length;\n if (configChars + size > CONFIG_BUDGET) break;\n trimmedConfigs.push(cfg);\n configChars += size;\n }\n\n let sourceChars = 0;\n let truncated = false;\n const fileSummaries: FileSummary[] = [];\n\n for (const relPath of sourceFiles) {\n const fullPath = path.join(dir, relPath);\n let content: string;\n try {\n content = fs.readFileSync(fullPath, 'utf-8');\n } catch {\n continue;\n }\n\n const lineCount = content.split('\\n').length;\n if (lineCount > 500) continue;\n\n const ext = path.extname(relPath);\n const language = resolveLanguage(ext);\n if (!language) continue;\n\n const summary = language === 'py'\n ? extractPython(relPath, content)\n : extractTypeScriptJavaScript(relPath, content, language);\n\n const summarySize = estimateSummarySize(summary);\n if (sourceChars + summarySize > SOURCE_BUDGET) {\n truncated = true;\n break;\n }\n\n fileSummaries.push(summary);\n sourceChars += summarySize;\n }\n\n return { fileSummaries, configFiles: trimmedConfigs, truncated };\n}\n\nfunction walkDir(\n base: string,\n rel: string,\n depth: number,\n maxDepth: number,\n sourceFiles: string[],\n configFiles: ConfigFileContent[],\n rootDir: string\n) {\n if (depth > maxDepth) return;\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 (IGNORE_DIRS.has(entry.name)) continue;\n if (entry.name.startsWith('.') && depth === 0 && entry.isDirectory()) continue;\n\n const relPath = rel ? `${rel}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n const matchedGlobDir = CONFIG_GLOBS_DIRS.find(\n (g) => relPath === g.dir || relPath.endsWith(`/${g.dir}`)\n );\n if (matchedGlobDir) {\n collectConfigsFromDir(base, relPath, matchedGlobDir.pattern, configFiles);\n }\n walkDir(base, relPath, depth + 1, maxDepth, sourceFiles, configFiles, rootDir);\n } else {\n if (CONFIG_FILE_NAMES.has(entry.name)) {\n try {\n const content = fs.readFileSync(path.join(base, relPath), 'utf-8');\n configFiles.push({ path: relPath, content });\n } catch {}\n }\n\n const ext = path.extname(entry.name);\n if (SOURCE_EXTENSIONS.has(ext) && !entry.name.endsWith('.d.ts')) {\n sourceFiles.push(relPath);\n }\n }\n }\n}\n\nfunction collectConfigsFromDir(\n base: string,\n relDir: string,\n pattern: RegExp,\n configFiles: ConfigFileContent[]\n) {\n const fullDir = path.join(base, relDir);\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(fullDir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n if (entry.isFile() && pattern.test(entry.name)) {\n const relPath = `${relDir}/${entry.name}`;\n try {\n const content = fs.readFileSync(path.join(base, relPath), 'utf-8');\n configFiles.push({ path: relPath, content });\n } catch {}\n }\n }\n}\n\nfunction sortByPriority(files: string[]) {\n const entryPointNames = new Set(['index.ts', 'index.js', 'main.py', 'app.ts', 'app.js', 'server.ts', 'server.js']);\n const routePattern = /(route|api|controller)/i;\n const schemaPattern = /(types|schema|models)/i;\n const servicePattern = /(service|lib|utils)/i;\n const testPattern = /(test|spec|__tests__)/i;\n\n function priority(filePath: string): number {\n const base = path.basename(filePath);\n if (entryPointNames.has(base)) return 0;\n if (routePattern.test(filePath)) return 1;\n if (schemaPattern.test(filePath)) return 2;\n if (servicePattern.test(filePath)) return 3;\n if (testPattern.test(filePath)) return 5;\n return 4;\n }\n\n files.sort((a, b) => priority(a) - priority(b));\n}\n\nfunction resolveLanguage(ext: string): 'ts' | 'js' | 'py' | null {\n if (ext === '.ts' || ext === '.tsx') return 'ts';\n if (ext === '.js' || ext === '.jsx') return 'js';\n if (ext === '.py') return 'py';\n return null;\n}\n\nfunction extractTypeScriptJavaScript(\n filePath: string,\n content: string,\n language: 'ts' | 'js'\n): FileSummary {\n const lines = content.split('\\n');\n const imports: string[] = [];\n const exports: string[] = [];\n const functions: string[] = [];\n const classes: string[] = [];\n const types: string[] = [];\n const routes: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (/^import\\s+/.test(trimmed)) {\n imports.push(trimmed);\n continue;\n }\n\n const exportMatch = trimmed.match(\n /^export\\s+(?:default\\s+)?(?:async\\s+)?(function|const|class|interface|type|enum)\\s+(\\w+)/\n );\n if (exportMatch) {\n exports.push(`${exportMatch[1]} ${exportMatch[2]}`);\n if (exportMatch[1] === 'class') classes.push(exportMatch[2]);\n if (exportMatch[1] === 'interface' || exportMatch[1] === 'type') types.push(exportMatch[2]);\n if (exportMatch[1] === 'function') functions.push(exportMatch[2]);\n continue;\n }\n\n const fnMatch = trimmed.match(/^(?:async\\s+)?function\\s+(\\w+)/);\n if (fnMatch && !trimmed.startsWith('export')) {\n functions.push(fnMatch[1]);\n continue;\n }\n\n const arrowMatch = trimmed.match(/^(?:export\\s+)?const\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\(/);\n if (arrowMatch && !exports.some((e) => e.endsWith(arrowMatch[1]))) {\n functions.push(arrowMatch[1]);\n }\n\n const classMatch = trimmed.match(/^class\\s+(\\w+)/);\n if (classMatch && !trimmed.startsWith('export')) {\n classes.push(classMatch[1]);\n continue;\n }\n\n const ifaceMatch = trimmed.match(/^(?:interface|type)\\s+(\\w+)/);\n if (ifaceMatch && !trimmed.startsWith('export')) {\n types.push(ifaceMatch[1]);\n continue;\n }\n\n const routeMatch = trimmed.match(\n /(?:router|app|server)\\.(get|post|put|patch|delete|all|use)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/\n );\n if (routeMatch) {\n routes.push(`${routeMatch[1].toUpperCase()} ${routeMatch[2]}`);\n }\n }\n\n return { path: filePath, language, imports, exports, functions, classes, types, routes };\n}\n\nfunction extractPython(filePath: string, content: string): FileSummary {\n const lines = content.split('\\n');\n const imports: string[] = [];\n const functions: string[] = [];\n const classes: string[] = [];\n const routes: string[] = [];\n\n let prevLine = '';\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (/^import\\s+/.test(trimmed) || /^from\\s+/.test(trimmed)) {\n imports.push(trimmed);\n continue;\n }\n\n const defMatch = trimmed.match(/^def\\s+(\\w+)\\s*\\(([^)]*)\\)/);\n if (defMatch) {\n functions.push(`${defMatch[1]}(${defMatch[2]})`);\n }\n\n const classMatch = trimmed.match(/^class\\s+(\\w+)/);\n if (classMatch) {\n classes.push(classMatch[1]);\n }\n\n const decoratorRoute = prevLine.match(\n /@(?:app|router)\\.(get|post|put|patch|delete|options|head)\\s*\\(\\s*['\"]([^'\"]+)['\"]/\n );\n if (decoratorRoute && defMatch) {\n routes.push(`${decoratorRoute[1].toUpperCase()} ${decoratorRoute[2]}`);\n }\n\n const includeRouter = trimmed.match(\n /include_router\\s*\\([^,]+,\\s*prefix\\s*=\\s*['\"]([^'\"]+)['\"]/\n );\n if (includeRouter) {\n routes.push(`ROUTER ${includeRouter[1]}`);\n }\n\n prevLine = trimmed;\n }\n\n return {\n path: filePath,\n language: 'py',\n imports,\n exports: [],\n functions,\n classes,\n types: [],\n routes,\n };\n}\n\nfunction estimateSummarySize(summary: FileSummary): number {\n return (\n summary.path.length +\n summary.imports.reduce((s, i) => s + i.length, 0) +\n summary.exports.reduce((s, e) => s + e.length, 0) +\n summary.functions.reduce((s, f) => s + f.length, 0) +\n summary.classes.reduce((s, c) => s + c.length, 0) +\n summary.types.reduce((s, t) => s + t.length, 0) +\n summary.routes.reduce((s, r) => s + r.length, 0)\n );\n}\n","import { getStoredAuth, storeAuth, isTokenExpired } from '../auth/token-store.js';\nimport { API_URL } from '../constants.js';\n\nasync function forceRefreshToken(): Promise<string | null> {\n const auth = getStoredAuth();\n if (!auth) return null;\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\nasync function getValidToken(): Promise<string> {\n const auth = getStoredAuth();\n if (!auth) {\n throw new Error('Not authenticated. Run `caliber login` first.');\n }\n\n if (!isTokenExpired()) return auth.accessToken;\n\n const refreshed = await forceRefreshToken();\n if (!refreshed) {\n throw new Error('Session expired. Run `caliber login` to re-authenticate.');\n }\n return refreshed;\n}\n\nexport async function apiRequest<T = unknown>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n } = {}\n): Promise<T> {\n let token = await getValidToken();\n\n let 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.status === 401) {\n const refreshed = await forceRefreshToken();\n if (!refreshed) {\n throw new Error('Session expired. Run `caliber login` to re-authenticate.');\n }\n token = refreshed;\n 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\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 raw?: 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 let token = await getValidToken();\n\n let 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.status === 401) {\n const refreshed = await forceRefreshToken();\n if (!refreshed) {\n throw new Error('Session expired. Run `caliber login` to re-authenticate.');\n }\n token = refreshed;\n 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\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, raw: parsed.raw });\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 deletions?: Array<{ filePath: string; reason: string }>;\n claude?: Parameters<typeof writeClaudeConfig>[0];\n cursor?: Parameters<typeof writeCursorConfig>[0];\n}\n\nexport function writeSetup(setup: AgentSetup): { written: string[]; deleted: string[]; backupDir?: string } {\n const filesToWrite = getFilesToWrite(setup);\n const filesToDelete = (setup.deletions || [])\n .map(d => d.filePath)\n .filter(f => fs.existsSync(f));\n\n const existingFiles = [\n ...filesToWrite.filter(f => fs.existsSync(f)),\n ...filesToDelete,\n ];\n const backupDir = existingFiles.length > 0 ? createBackup(existingFiles) : undefined;\n\n const written: string[] = [];\n\n if ((setup.targetAgent === 'claude' || setup.targetAgent === 'both') && setup.claude) {\n written.push(...writeClaudeConfig(setup.claude));\n }\n\n if ((setup.targetAgent === 'cursor' || setup.targetAgent === 'both') && setup.cursor) {\n written.push(...writeCursorConfig(setup.cursor));\n }\n\n const deleted: string[] = [];\n for (const filePath of filesToDelete) {\n fs.unlinkSync(filePath);\n deleted.push(filePath);\n }\n\n ensureGitignore();\n\n const entries: ManifestEntry[] = [\n ...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 ...deleted.map(file => ({\n path: file,\n action: 'deleted' as const,\n checksum: '',\n timestamp: new Date().toISOString(),\n })),\n ];\n\n writeManifest({ version: 1, backupDir, entries });\n\n return { written, deleted, 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 if (fs.existsSync(entry.path)) {\n fs.unlinkSync(entry.path);\n removed.push(entry.path);\n }\n } else if ((entry.action === 'modified' || entry.action === 'deleted') && manifest.backupDir) {\n if (restoreBackup(manifest.backupDir, entry.path)) {\n restored.push(entry.path);\n }\n }\n }\n\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');\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.skills) {\n for (const s of setup.cursor.skills) files.push(`.cursor/skills/${s.slug}/SKILL.md`);\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 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 fs.writeFileSync('CLAUDE.md', config.claudeMd);\n written.push('CLAUDE.md');\n\n if (config.skills?.length) {\n const skillsDir = path.join('.claude', '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 if (config.mcpServers && Object.keys(config.mcpServers).length > 0) {\n let existingServers: Record<string, unknown> = {};\n try {\n if (fs.existsSync('.mcp.json')) {\n const existing = JSON.parse(fs.readFileSync('.mcp.json', 'utf-8'));\n if (existing.mcpServers) existingServers = existing.mcpServers;\n }\n } catch {}\n const mergedServers = { ...existingServers, ...config.mcpServers };\n fs.writeFileSync('.mcp.json', JSON.stringify({ mcpServers: mergedServers }, 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 skills?: Array<{ name: string; slug: 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/skills/{slug}/SKILL.md\n if (config.skills?.length) {\n for (const skill of config.skills) {\n const skillDir = path.join('.cursor', 'skills', skill.slug);\n if (!fs.existsSync(skillDir)) fs.mkdirSync(skillDir, { recursive: true });\n const skillPath = path.join(skillDir, 'SKILL.md');\n fs.writeFileSync(skillPath, skill.content);\n written.push(skillPath);\n }\n }\n\n // .cursor/mcp.json — merge with existing\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 mcpPath = path.join(cursorDir, 'mcp.json');\n let existingServers: Record<string, unknown> = {};\n try {\n if (fs.existsSync(mcpPath)) {\n const existing = JSON.parse(fs.readFileSync(mcpPath, 'utf-8'));\n if (existing.mcpServers) {\n existingServers = existing.mcpServers;\n }\n }\n } catch {\n // ignore parse errors\n }\n const mergedServers = { ...existingServers, ...config.mcpServers };\n fs.writeFileSync(mcpPath, JSON.stringify({ mcpServers: mergedServers }, null, 2));\n written.push(mcpPath);\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' | 'deleted';\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 fs from 'fs';\nimport path from 'path';\nimport { CALIBER_DIR } from '../constants.js';\n\nconst STAGED_DIR = path.join(CALIBER_DIR, 'staged');\nconst PROPOSED_DIR = path.join(STAGED_DIR, 'proposed');\nconst CURRENT_DIR = path.join(STAGED_DIR, 'current');\n\nexport interface StagedFile {\n relativePath: string;\n proposedPath: string;\n currentPath?: string;\n originalPath?: string;\n isNew: boolean;\n}\n\nexport interface StageResult {\n newFiles: number;\n modifiedFiles: number;\n stagedFiles: StagedFile[];\n}\n\nexport function stageFiles(\n files: Array<{ path: string; content: string }>,\n projectDir: string\n): StageResult {\n cleanupStaging();\n\n let newFiles = 0;\n let modifiedFiles = 0;\n const stagedFiles: StagedFile[] = [];\n\n for (const file of files) {\n const proposedPath = path.join(PROPOSED_DIR, file.path);\n fs.mkdirSync(path.dirname(proposedPath), { recursive: true });\n fs.writeFileSync(proposedPath, file.content);\n\n const originalPath = path.join(projectDir, file.path);\n if (fs.existsSync(originalPath)) {\n const currentPath = path.join(CURRENT_DIR, file.path);\n fs.mkdirSync(path.dirname(currentPath), { recursive: true });\n fs.copyFileSync(originalPath, currentPath);\n modifiedFiles++;\n stagedFiles.push({ relativePath: file.path, proposedPath, currentPath, originalPath, isNew: false });\n } else {\n newFiles++;\n stagedFiles.push({ relativePath: file.path, proposedPath, isNew: true });\n }\n }\n\n return { newFiles, modifiedFiles, stagedFiles };\n}\n\nexport function getStagedProposedDir(): string {\n return PROPOSED_DIR;\n}\n\nexport function cleanupStaging(): void {\n if (fs.existsSync(STAGED_DIR)) {\n fs.rmSync(STAGED_DIR, { recursive: true, force: true });\n }\n}\n","import { execSync, spawn } from 'child_process';\n\nexport type ReviewMethod = 'cursor' | 'vscode' | 'terminal';\n\nfunction commandExists(cmd: string): boolean {\n try {\n execSync(`which ${cmd}`, { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function detectAvailableEditors(): ReviewMethod[] {\n const methods: ReviewMethod[] = [];\n if (commandExists('cursor')) methods.push('cursor');\n if (commandExists('code')) methods.push('vscode');\n methods.push('terminal');\n return methods;\n}\n\nexport function openDiffsInEditor(\n editor: 'cursor' | 'vscode',\n files: Array<{ originalPath?: string; proposedPath: string }>\n): void {\n const cmd = editor === 'cursor' ? 'cursor' : 'code';\n\n for (const file of files) {\n try {\n if (file.originalPath) {\n spawn(cmd, ['--diff', file.originalPath, file.proposedPath], {\n stdio: 'ignore',\n detached: true,\n }).unref();\n } else {\n spawn(cmd, [file.proposedPath], {\n stdio: 'ignore',\n detached: true,\n }).unref();\n }\n } catch {\n continue;\n }\n }\n}\n","import fs from 'fs';\nimport path from 'path';\n\nconst SETTINGS_PATH = path.join('.claude', 'settings.json');\nconst HOOK_COMMAND = 'caliber refresh --quiet';\nconst HOOK_DESCRIPTION = 'Caliber: auto-refreshing docs based on code changes';\n\ninterface HookEntry {\n type: string;\n command: string;\n description?: string;\n}\n\ninterface HookMatcher {\n matcher: string;\n hooks: HookEntry[];\n}\n\ninterface ClaudeSettings {\n hooks?: {\n SessionEnd?: HookMatcher[];\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\n\nfunction readSettings(): ClaudeSettings {\n if (!fs.existsSync(SETTINGS_PATH)) return {};\n try {\n return JSON.parse(fs.readFileSync(SETTINGS_PATH, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nfunction writeSettings(settings: ClaudeSettings): void {\n const dir = path.dirname(SETTINGS_PATH);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2));\n}\n\nfunction findHookIndex(sessionEnd: HookMatcher[]): number {\n return sessionEnd.findIndex(entry =>\n entry.hooks?.some(h => h.command === HOOK_COMMAND)\n );\n}\n\nexport function isHookInstalled(): boolean {\n const settings = readSettings();\n const sessionEnd = settings.hooks?.SessionEnd;\n if (!Array.isArray(sessionEnd)) return false;\n return findHookIndex(sessionEnd) !== -1;\n}\n\nexport function installHook(): { installed: boolean; alreadyInstalled: boolean } {\n const settings = readSettings();\n\n if (!settings.hooks) settings.hooks = {};\n if (!Array.isArray(settings.hooks.SessionEnd)) settings.hooks.SessionEnd = [];\n\n if (findHookIndex(settings.hooks.SessionEnd) !== -1) {\n return { installed: false, alreadyInstalled: true };\n }\n\n settings.hooks.SessionEnd.push({\n matcher: '',\n hooks: [{ type: 'command', command: HOOK_COMMAND, description: HOOK_DESCRIPTION }],\n });\n\n writeSettings(settings);\n return { installed: true, alreadyInstalled: false };\n}\n\nexport function removeHook(): { removed: boolean; notFound: boolean } {\n const settings = readSettings();\n const sessionEnd = settings.hooks?.SessionEnd;\n\n if (!Array.isArray(sessionEnd)) {\n return { removed: false, notFound: true };\n }\n\n const idx = findHookIndex(sessionEnd);\n if (idx === -1) {\n return { removed: false, notFound: true };\n }\n\n sessionEnd.splice(idx, 1);\n if (sessionEnd.length === 0) {\n delete settings.hooks!.SessionEnd;\n }\n if (settings.hooks && Object.keys(settings.hooks).length === 0) {\n delete settings.hooks;\n }\n\n writeSettings(settings);\n return { removed: true, notFound: false };\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { execSync } from 'child_process';\nimport { CALIBER_DIR } from '../constants.js';\n\nconst STATE_FILE = path.join(CALIBER_DIR, '.caliber-state.json');\n\ninterface CaliberState {\n lastRefreshSha: string;\n lastRefreshTimestamp: string;\n}\n\nexport function readState(): CaliberState | null {\n try {\n if (!fs.existsSync(STATE_FILE)) return null;\n return JSON.parse(fs.readFileSync(STATE_FILE, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nexport function writeState(state: CaliberState): void {\n if (!fs.existsSync(CALIBER_DIR)) {\n fs.mkdirSync(CALIBER_DIR, { recursive: true });\n }\n fs.writeFileSync(STATE_FILE, JSON.stringify(state, null, 2));\n}\n\nexport function getCurrentHeadSha(): string | null {\n try {\n return execSync('git rev-parse HEAD', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n } catch {\n return null;\n }\n}\n","import chalk from 'chalk';\nimport 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 private startTime = 0;\n private showElapsedTime: boolean;\n private currentBaseMessage = '';\n\n constructor(spinner: Ora, messages: string[], options?: { showElapsedTime?: boolean }) {\n this.spinner = spinner;\n this.messages = messages;\n this.showElapsedTime = options?.showElapsedTime ?? false;\n }\n\n private formatElapsed(): string {\n const seconds = Math.floor((Date.now() - this.startTime) / 1000);\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n }\n\n private updateSpinnerText(): void {\n this.spinner.text = this.currentBaseMessage;\n }\n\n start(): void {\n this.index = 0;\n this.startTime = Date.now();\n this.currentBaseMessage = this.messages[0];\n this.updateSpinnerText();\n if (this.showElapsedTime) {\n this.spinner.suffixText = () => chalk.dim(`(${this.formatElapsed()})`);\n }\n this.timer = setInterval(() => {\n this.index = (this.index + 1) % this.messages.length;\n this.currentBaseMessage = this.messages[this.index];\n this.updateSpinnerText();\n }, 3000);\n }\n\n handleServerStatus(status: string): void {\n this.currentBaseMessage = status;\n this.updateSpinnerText();\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.currentBaseMessage = this.messages[this.index];\n this.updateSpinnerText();\n }, 3000);\n }\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n this.spinner.suffixText = '';\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 throw new Error('__exit__');\n }\n}\n","import chalk from 'chalk';\nimport fs from 'fs';\nimport { readManifest } from '../writers/manifest.js';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { apiRequest } from '../api/client.js';\nimport { scanLocalState, compareState, type ServerItem } from '../scanner/index.js';\n\nexport async 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 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 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\n if (auth) {\n try {\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n const match = await apiRequest<{ project: { id: string } | null }>(\n '/api/projects/match',\n { method: 'POST', body: { fingerprintHash: hash } }\n );\n\n if (match?.project) {\n const serverItems = await apiRequest<ServerItem[]>(\n `/api/sync/project/${match.project.id}/items`\n );\n\n if (serverItems?.length) {\n const localItems = scanLocalState(process.cwd());\n const diff = compareState(serverItems, localItems);\n\n console.log(chalk.bold('\\n Sync'));\n console.log(` ${chalk.green('✓')} Installed: ${diff.installed.length}`);\n if (diff.missing.length) console.log(` ${chalk.red('✗')} Missing: ${diff.missing.length}`);\n if (diff.outdated.length) console.log(` ${chalk.yellow('~')} Outdated: ${diff.outdated.length}`);\n }\n }\n } catch {\n // sync info is non-critical\n }\n }\n\n console.log('');\n}\n","import fs from 'fs';\nimport path from 'path';\nimport crypto from 'crypto';\nimport os from 'os';\n\nexport interface LocalItem {\n type: 'mcp' | 'rule' | 'skill' | 'config';\n platform: 'claude' | 'cursor';\n name: string;\n contentHash: string;\n path: string;\n}\n\nexport interface PlatformDetection {\n claude: boolean;\n cursor: boolean;\n}\n\nexport function detectPlatforms(): PlatformDetection {\n const home = os.homedir();\n return {\n claude: fs.existsSync(path.join(home, '.claude')),\n cursor: fs.existsSync(getCursorConfigDir()),\n };\n}\n\nexport function scanLocalState(dir: string): LocalItem[] {\n const items: LocalItem[] = [];\n\n // Claude: CLAUDE.md\n const claudeMdPath = path.join(dir, 'CLAUDE.md');\n if (fs.existsSync(claudeMdPath)) {\n items.push({\n type: 'rule',\n platform: 'claude',\n name: 'CLAUDE.md',\n contentHash: hashFile(claudeMdPath),\n path: claudeMdPath,\n });\n }\n\n // Claude: .claude/skills/*.md\n const skillsDir = path.join(dir, '.claude', 'skills');\n if (fs.existsSync(skillsDir)) {\n for (const file of fs.readdirSync(skillsDir).filter(f => f.endsWith('.md'))) {\n const filePath = path.join(skillsDir, file);\n items.push({\n type: 'skill',\n platform: 'claude',\n name: file,\n contentHash: hashFile(filePath),\n path: filePath,\n });\n }\n }\n\n // Claude: .mcp.json mcpServers\n const mcpJsonPath = path.join(dir, '.mcp.json');\n if (fs.existsSync(mcpJsonPath)) {\n try {\n const mcpJson = JSON.parse(fs.readFileSync(mcpJsonPath, 'utf-8'));\n if (mcpJson.mcpServers) {\n for (const name of Object.keys(mcpJson.mcpServers)) {\n items.push({\n type: 'mcp',\n platform: 'claude',\n name,\n contentHash: hashJson(mcpJson.mcpServers[name]),\n path: mcpJsonPath,\n });\n }\n }\n } catch { /* ignore */ }\n }\n\n // Cursor: .cursorrules\n const cursorrulesPath = path.join(dir, '.cursorrules');\n if (fs.existsSync(cursorrulesPath)) {\n items.push({\n type: 'rule',\n platform: 'cursor',\n name: '.cursorrules',\n contentHash: hashFile(cursorrulesPath),\n path: cursorrulesPath,\n });\n }\n\n // Cursor: .cursor/rules/*.mdc\n const cursorRulesDir = path.join(dir, '.cursor', 'rules');\n if (fs.existsSync(cursorRulesDir)) {\n for (const file of fs.readdirSync(cursorRulesDir).filter(f => f.endsWith('.mdc'))) {\n const filePath = path.join(cursorRulesDir, file);\n items.push({\n type: 'rule',\n platform: 'cursor',\n name: file,\n contentHash: hashFile(filePath),\n path: filePath,\n });\n }\n }\n\n // Cursor: .cursor/skills/*/SKILL.md\n const cursorSkillsDir = path.join(dir, '.cursor', 'skills');\n if (fs.existsSync(cursorSkillsDir)) {\n try {\n for (const slug of fs.readdirSync(cursorSkillsDir)) {\n const skillFile = path.join(cursorSkillsDir, slug, 'SKILL.md');\n if (fs.existsSync(skillFile)) {\n items.push({\n type: 'skill',\n platform: 'cursor',\n name: `${slug}/SKILL.md`,\n contentHash: hashFile(skillFile),\n path: skillFile,\n });\n }\n }\n } catch { /* ignore */ }\n }\n\n // Cursor: .cursor/mcp.json mcpServers\n const cursorMcpPath = path.join(dir, '.cursor', 'mcp.json');\n if (fs.existsSync(cursorMcpPath)) {\n try {\n const mcpJson = JSON.parse(fs.readFileSync(cursorMcpPath, 'utf-8'));\n if (mcpJson.mcpServers) {\n for (const name of Object.keys(mcpJson.mcpServers)) {\n items.push({\n type: 'mcp',\n platform: 'cursor',\n name,\n contentHash: hashJson(mcpJson.mcpServers[name]),\n path: cursorMcpPath,\n });\n }\n }\n } catch { /* ignore */ }\n }\n\n return items;\n}\n\nexport interface ServerItem {\n id: string;\n type: string;\n platform: string;\n name: string;\n content_hash: string;\n content: Record<string, unknown>;\n}\n\nexport function compareState(\n serverItems: ServerItem[],\n localItems: LocalItem[]\n) {\n const installed: Array<{ server: ServerItem; local: LocalItem }> = [];\n const missing: ServerItem[] = [];\n const outdated: Array<{ server: ServerItem; local: LocalItem }> = [];\n const extra: LocalItem[] = [];\n\n const localMap = new Map<string, LocalItem>();\n for (const item of localItems) {\n localMap.set(`${item.type}:${item.platform}:${item.name}`, item);\n }\n\n for (const server of serverItems) {\n const key = `${server.type}:${server.platform}:${server.name}`;\n const local = localMap.get(key);\n localMap.delete(key);\n\n if (!local) {\n missing.push(server);\n } else if (local.contentHash !== server.content_hash) {\n outdated.push({ server, local });\n } else {\n installed.push({ server, local });\n }\n }\n\n for (const local of localMap.values()) {\n extra.push(local);\n }\n\n return { installed, missing, outdated, extra };\n}\n\nfunction hashFile(filePath: string): string {\n const text = fs.readFileSync(filePath, 'utf-8');\n return crypto.createHash('sha256').update(JSON.stringify({ text })).digest('hex');\n}\n\nfunction hashJson(obj: unknown): string {\n return crypto.createHash('sha256').update(JSON.stringify(obj)).digest('hex');\n}\n\nfunction getCursorConfigDir(): string {\n const home = os.homedir();\n if (process.platform === 'darwin') {\n return path.join(home, 'Library', 'Application Support', 'Cursor');\n }\n if (process.platform === 'win32') {\n return path.join(home, 'AppData', 'Roaming', 'Cursor');\n }\n return path.join(home, '.config', 'Cursor');\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 confirm from '@inquirer/confirm';\nimport { trackEvent } from '../telemetry.js';\nimport { SpinnerMessages, GENERATION_MESSAGES } from '../utils/spinner-messages.js';\n\nexport async function regenerateCommand(options: { dryRun?: boolean }) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not logged in. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n const manifest = readManifest();\n if (!manifest) {\n console.log(chalk.yellow('No existing setup found. Run `caliber init` first.'));\n throw new Error('__exit__');\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\n const genSpinner = ora('Regenerating setup...').start();\n const genMessages = new SpinnerMessages(genSpinner, GENERATION_MESSAGES);\n genMessages.start();\n\n try {\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, command: 'regenerate' });\n genSpinner.fail(`Generation error: ${error}`);\n },\n (status) => { genMessages.handleServerStatus(status); }\n );\n } catch (err) {\n genMessages.stop();\n const msg = err instanceof Error ? err.message : 'Unknown error';\n trackEvent('error_occurred', { error_type: 'generation_request_failed', error_message: msg, command: 'regenerate' });\n genSpinner.fail(`Regeneration failed: ${msg}`);\n throw new Error('__exit__');\n }\n\n genMessages.stop();\n\n if (!generatedSetup) {\n genSpinner.fail('Failed to regenerate setup.');\n throw new Error('__exit__');\n }\n\n genSpinner.succeed('Setup regenerated');\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 shouldApply = await confirm({ message: 'Apply regenerated setup?', default: true });\n if (!shouldApply) {\n trackEvent('regenerate_declined');\n console.log(chalk.dim('Regeneration 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_regenerated', { 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 chalk from 'chalk';\nimport ora from 'ora';\nimport { mkdirSync, writeFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { apiRequest } from '../api/client.js';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { scanLocalState } from '../scanner/index.js';\n\ntype Platform = 'claude' | 'cursor';\n\ninterface Recommendation {\n id: string;\n skill_name: string;\n skill_slug: string;\n source_url: string;\n score: number;\n reason: string;\n detected_technology: string;\n status: string;\n}\n\nfunction detectLocalPlatforms(): Platform[] {\n const items = scanLocalState(process.cwd());\n const platforms = new Set<Platform>();\n for (const item of items) {\n platforms.add(item.platform);\n }\n return platforms.size > 0 ? Array.from(platforms) : ['claude'];\n}\n\nfunction getSkillPath(platform: Platform, slug: string): string {\n if (platform === 'cursor') {\n return join('.cursor', 'skills', slug, 'SKILL.md');\n }\n return join('.claude', 'skills', `${slug}.md`);\n}\n\nexport async function recommendCommand(options: {\n generate?: boolean;\n status?: string;\n}) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not authenticated. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n\n const match = await apiRequest<{ project: { id: string } | null }>(\n '/api/projects/match',\n { method: 'POST', body: { fingerprintHash: hash } }\n );\n\n if (!match?.project) {\n console.log(chalk.yellow('No project found. Run `caliber init` first.'));\n throw new Error('__exit__');\n }\n\n const projectId = match.project.id;\n const platforms = detectLocalPlatforms();\n\n if (options.status) {\n const recs = await apiRequest<Recommendation[]>(\n `/api/recommendations/project/${projectId}?status=${options.status}`\n );\n if (!recs?.length) {\n console.log(chalk.dim(`\\nNo ${options.status} recommendations.\\n`));\n return;\n }\n printRecommendations(recs);\n return;\n }\n\n if (options.generate) {\n const recs = await generateRecommendations(projectId);\n if (recs?.length) {\n const selected = await interactiveSelect(recs);\n if (selected?.length) {\n await installSkills(selected, platforms);\n }\n }\n return;\n }\n\n let recs: Recommendation[] | undefined = await apiRequest<Recommendation[]>(\n `/api/recommendations/project/${projectId}?status=pending`\n );\n\n if (!recs?.length) {\n recs = await generateRecommendations(projectId);\n }\n\n if (!recs?.length) {\n console.log(chalk.dim('\\nNo recommendations found for this project.\\n'));\n return;\n }\n\n const selected = await interactiveSelect(recs);\n if (selected?.length) {\n await installSkills(selected, platforms);\n }\n}\n\nasync function generateRecommendations(projectId: string): Promise<Recommendation[] | undefined> {\n const spinner = ora('Detecting technologies and searching for skills...').start();\n try {\n const generated = await apiRequest<Recommendation[]>(\n `/api/recommendations/project/${projectId}/generate`,\n { method: 'POST' }\n );\n spinner.succeed(`Found ${generated?.length || 0} recommendations`);\n\n if (!generated?.length) return generated;\n\n const recs = await apiRequest<Recommendation[]>(\n `/api/recommendations/project/${projectId}?status=pending`\n );\n return recs;\n } catch (err) {\n spinner.fail('Failed to generate recommendations');\n throw err;\n }\n}\n\nasync function interactiveSelect(recs: Recommendation[]): Promise<Recommendation[] | null> {\n if (!process.stdin.isTTY) {\n printRecommendations(recs);\n return null;\n }\n\n const selected = new Set<number>();\n let cursor = 0;\n const { stdin, stdout } = process;\n let lineCount = 0;\n\n function render(): string {\n const lines: string[] = [];\n lines.push(chalk.bold(' Skill Recommendations'));\n lines.push('');\n lines.push(` ${chalk.dim('Name'.padEnd(30))} ${chalk.dim('Score'.padEnd(8))} ${chalk.dim('Technology')}`);\n lines.push(chalk.dim(' ' + '─'.repeat(55)));\n\n for (let i = 0; i < recs.length; i++) {\n const rec = recs[i];\n const check = selected.has(i) ? chalk.green('[x]') : '[ ]';\n const ptr = i === cursor ? chalk.cyan('❯') : ' ';\n const scoreColor = rec.score >= 90 ? chalk.green : rec.score >= 70 ? chalk.blue : chalk.yellow;\n lines.push(` ${ptr} ${check} ${rec.skill_name.padEnd(26)} ${scoreColor(`${rec.score}%`.padEnd(8))} ${rec.detected_technology}`);\n }\n\n lines.push('');\n lines.push(chalk.dim(' ↑↓ navigate ⎵ toggle a all n none ⏎ install q cancel'));\n return lines.join('\\n');\n }\n\n function draw(initial: boolean) {\n if (!initial && lineCount > 0) {\n stdout.write(`\\x1b[${lineCount}A`);\n }\n stdout.write('\\x1b[0J');\n const output = render();\n stdout.write(output + '\\n');\n lineCount = output.split('\\n').length;\n }\n\n return new Promise((resolve) => {\n console.log('');\n draw(true);\n\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding('utf8');\n\n function cleanup() {\n stdin.removeListener('data', onData);\n stdin.setRawMode(false);\n stdin.pause();\n }\n\n function onData(key: string) {\n switch (key) {\n case '\\x1b[A':\n cursor = (cursor - 1 + recs.length) % recs.length;\n draw(false);\n break;\n case '\\x1b[B':\n cursor = (cursor + 1) % recs.length;\n draw(false);\n break;\n case ' ':\n selected.has(cursor) ? selected.delete(cursor) : selected.add(cursor);\n draw(false);\n break;\n case 'a':\n recs.forEach((_, i) => selected.add(i));\n draw(false);\n break;\n case 'n':\n selected.clear();\n draw(false);\n break;\n case '\\r':\n case '\\n':\n cleanup();\n if (selected.size === 0) {\n console.log(chalk.dim('\\n No skills selected.\\n'));\n resolve(null);\n } else {\n resolve(Array.from(selected).sort().map(i => recs[i]));\n }\n break;\n case 'q':\n case '\\x1b':\n case '\\x03':\n cleanup();\n console.log(chalk.dim('\\n Cancelled.\\n'));\n resolve(null);\n break;\n }\n }\n\n stdin.on('data', onData);\n });\n}\n\nasync function fetchSkillContent(rec: Recommendation): Promise<string | null> {\n if (rec.id) {\n try {\n const result = await apiRequest<{ content: string }>(\n `/api/recommendations/${rec.id}/content`\n );\n if (result?.content) return result.content;\n } catch {}\n }\n\n if (rec.source_url && rec.skill_slug) {\n try {\n const url = `https://raw.githubusercontent.com/${rec.source_url}/HEAD/skills/${rec.skill_slug}/SKILL.md`;\n const resp = await fetch(url);\n if (resp.ok) return await resp.text();\n } catch {}\n }\n\n return null;\n}\n\nasync function installSkills(recs: Recommendation[], platforms: Platform[]): Promise<void> {\n const spinner = ora(`Installing ${recs.length} skill${recs.length > 1 ? 's' : ''}...`).start();\n\n const installed: string[] = [];\n const warnings: string[] = [];\n\n for (const rec of recs) {\n const content = await fetchSkillContent(rec);\n\n if (!content) {\n warnings.push(`No content available for ${rec.skill_name}`);\n continue;\n }\n\n for (const platform of platforms) {\n const skillPath = getSkillPath(platform, rec.skill_slug);\n const fullPath = join(process.cwd(), skillPath);\n mkdirSync(dirname(fullPath), { recursive: true });\n writeFileSync(fullPath, content, 'utf-8');\n installed.push(`[${platform}] ${skillPath}`);\n }\n\n if (rec.id) {\n try {\n await apiRequest(`/api/recommendations/${rec.id}/status`, {\n method: 'PUT',\n body: { status: 'accepted' },\n });\n } catch {}\n }\n }\n\n if (installed.length > 0) {\n spinner.succeed(`Installed ${installed.length} file${installed.length > 1 ? 's' : ''}`);\n for (const p of installed) {\n console.log(chalk.green(` ✓ ${p}`));\n }\n } else {\n spinner.fail('No skills were installed');\n }\n\n for (const w of warnings) {\n console.log(chalk.yellow(` ⚠ ${w}`));\n }\n\n console.log('');\n}\n\nfunction printRecommendations(recs: Recommendation[]) {\n console.log(chalk.bold('\\n Skill Recommendations\\n'));\n console.log(\n ` ${chalk.dim('Name'.padEnd(30))} ${chalk.dim('Score'.padEnd(8))} ${chalk.dim('Technology'.padEnd(15))} ${chalk.dim('Status')}`\n );\n console.log(chalk.dim(' ' + '─'.repeat(70)));\n\n for (const rec of recs) {\n const scoreColor = rec.score >= 90 ? chalk.green : rec.score >= 70 ? chalk.blue : chalk.yellow;\n console.log(\n ` ${rec.skill_name.padEnd(30)} ${scoreColor(`${rec.score}%`.padEnd(8))} ${rec.detected_technology.padEnd(15)} ${rec.status}`\n );\n if (rec.reason) {\n console.log(` ${chalk.dim(rec.reason)}`);\n }\n }\n console.log('');\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { apiRequest } from '../api/client.js';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { scanLocalState, compareState, type ServerItem } from '../scanner/index.js';\nimport { writeSetup } from '../writers/index.js';\n\nexport async function syncCommand(options: {\n platform?: string;\n dryRun?: boolean;\n}) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not authenticated. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n\n const match = await apiRequest<{ project: { id: string } | null }>(\n '/api/projects/match',\n { method: 'POST', body: { fingerprintHash: hash } }\n );\n\n if (!match?.project) {\n console.log(chalk.yellow('No project found. Run `caliber init` first.'));\n throw new Error('__exit__');\n }\n\n const projectId = match.project.id;\n\n const spinner = ora('Scanning local state...').start();\n const localItems = scanLocalState(process.cwd());\n spinner.text = 'Fetching server items...';\n\n const serverItems = await apiRequest<ServerItem[]>(\n `/api/sync/project/${projectId}/items`\n );\n spinner.succeed(`Found ${localItems.length} local items, ${serverItems?.length || 0} server items`);\n\n if (!serverItems?.length) {\n console.log(chalk.dim('\\nNo items configured on server. Run `caliber init` to set up your project.\\n'));\n return;\n }\n\n const platformFilter = options.platform;\n const filteredServer = platformFilter\n ? serverItems.filter(i => i.platform === platformFilter || i.platform === 'both')\n : serverItems;\n const filteredLocal = platformFilter\n ? localItems.filter(i => i.platform === platformFilter)\n : localItems;\n\n const diff = compareState(filteredServer, filteredLocal);\n\n printDiff(diff);\n\n if (diff.missing.length === 0 && diff.outdated.length === 0) {\n console.log(chalk.green('\\nAll items synced.\\n'));\n await reportToServer(projectId, filteredServer, diff);\n return;\n }\n\n if (options.dryRun) {\n console.log(chalk.dim('\\nDry run — no changes made.\\n'));\n return;\n }\n\n const installSpinner = ora('Installing missing and outdated items...').start();\n try {\n const setup = buildSetupFromItems([...diff.missing, ...diff.outdated.map(o => o.server)]);\n if (setup) {\n writeSetup(setup);\n }\n installSpinner.succeed('Items synced successfully');\n } catch (err) {\n installSpinner.fail('Sync failed');\n throw err;\n }\n\n await reportToServer(projectId, filteredServer, diff);\n}\n\nasync function reportToServer(\n projectId: string,\n serverItems: ServerItem[],\n diff: ReturnType<typeof compareState>\n) {\n const items = [\n ...diff.installed.map(i => ({\n itemId: i.server.id,\n state: 'installed' as const,\n localHash: i.local.contentHash,\n })),\n ...diff.missing.map(i => ({\n itemId: i.id,\n state: 'missing' as const,\n })),\n ...diff.outdated.map(i => ({\n itemId: i.server.id,\n state: 'outdated' as const,\n localHash: i.local.contentHash,\n })),\n ...diff.extra.map(i => ({\n itemId: i.name,\n state: 'extra' as const,\n localHash: i.contentHash,\n })),\n ];\n\n const platforms = new Set(serverItems.map(i => i.platform));\n for (const platform of platforms) {\n try {\n await apiRequest(`/api/sync/project/${projectId}/report`, {\n method: 'POST',\n body: {\n platform,\n items: items.filter(i => {\n const match = serverItems.find(s => s.id === i.itemId);\n return match?.platform === platform;\n }),\n },\n });\n } catch {\n // non-critical\n }\n }\n}\n\nfunction printDiff(diff: ReturnType<typeof compareState>) {\n console.log(chalk.bold('\\n Sync Status\\n'));\n\n if (diff.installed.length) {\n console.log(` ${chalk.green('✓')} Installed: ${diff.installed.length}`);\n }\n if (diff.missing.length) {\n console.log(` ${chalk.red('✗')} Missing: ${diff.missing.length}`);\n for (const item of diff.missing) {\n console.log(` ${chalk.red('-')} ${item.name} (${item.type}/${item.platform})`);\n }\n }\n if (diff.outdated.length) {\n console.log(` ${chalk.yellow('~')} Outdated: ${diff.outdated.length}`);\n for (const item of diff.outdated) {\n console.log(` ${chalk.yellow('~')} ${item.server.name} (${item.server.type}/${item.server.platform})`);\n }\n }\n if (diff.extra.length) {\n console.log(` ${chalk.dim('+')} Extra (local only): ${diff.extra.length}`);\n for (const item of diff.extra) {\n console.log(` ${chalk.dim('+')} ${item.name} (${item.type}/${item.platform})`);\n }\n }\n console.log('');\n}\n\nfunction buildSetupFromItems(items: ServerItem[]): Parameters<typeof writeSetup>[0] | null {\n if (!items.length) return null;\n\n const claude: Record<string, unknown> = {};\n const cursor: Record<string, unknown> = {};\n let hasAny = false;\n\n for (const item of items) {\n const content = item.content as Record<string, unknown>;\n\n if (item.platform === 'claude' || item.platform === 'both') {\n if (item.type === 'rule' && item.name === 'CLAUDE.md') {\n claude.claudeMd = content.text;\n hasAny = true;\n } else if (item.type === 'config' && item.name === 'settings.json') {\n claude.settings = content;\n hasAny = true;\n } else if (item.type === 'skill') {\n if (!claude.skills) claude.skills = [];\n (claude.skills as Array<{ name: string; content: string }>).push({\n name: item.name,\n content: (content.text as string) || '',\n });\n hasAny = true;\n } else if (item.type === 'mcp') {\n if (!claude.mcpServers) claude.mcpServers = {};\n (claude.mcpServers as Record<string, unknown>)[item.name] = content;\n hasAny = true;\n }\n }\n\n if (item.platform === 'cursor' || item.platform === 'both') {\n if (item.type === 'rule' && item.name === '.cursorrules') {\n cursor.cursorrules = content.text;\n hasAny = true;\n } else if (item.type === 'rule') {\n if (!cursor.rules) cursor.rules = [];\n (cursor.rules as Array<{ filename: string; content: string }>).push({\n filename: item.name,\n content: (content.text as string) || '',\n });\n hasAny = true;\n } else if (item.type === 'mcp') {\n if (!cursor.mcpServers) cursor.mcpServers = {};\n (cursor.mcpServers as Record<string, unknown>)[item.name] = content;\n hasAny = true;\n }\n }\n }\n\n if (!hasAny) return null;\n\n const hasClaude = Object.keys(claude).length > 0;\n const hasCursor = Object.keys(cursor).length > 0;\n\n return {\n targetAgent: hasClaude && hasCursor ? 'both' : hasClaude ? 'claude' : 'cursor',\n ...(hasClaude ? { claude: claude as never } : {}),\n ...(hasCursor ? { cursor: cursor as never } : {}),\n };\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport { apiRequest } from '../api/client.js';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { collectFingerprint, computeFingerprintHash } from '../fingerprint/index.js';\nimport { scanLocalState, compareState, type ServerItem } from '../scanner/index.js';\n\nexport async function diffCommand(options: { platform?: string }) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('Not authenticated. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n const fingerprint = collectFingerprint(process.cwd());\n const hash = computeFingerprintHash(fingerprint);\n\n const match = await apiRequest<{ project: { id: string } | null }>(\n '/api/projects/match',\n { method: 'POST', body: { fingerprintHash: hash } }\n );\n\n if (!match?.project) {\n console.log(chalk.yellow('No project found. Run `caliber init` first.'));\n throw new Error('__exit__');\n }\n\n const projectId = match.project.id;\n\n const spinner = ora('Comparing local and server state...').start();\n const localItems = scanLocalState(process.cwd());\n const serverItems = await apiRequest<ServerItem[]>(\n `/api/sync/project/${projectId}/items`\n );\n spinner.stop();\n\n if (!serverItems?.length) {\n console.log(chalk.dim('\\nNo items configured on server.\\n'));\n return;\n }\n\n const platformFilter = options.platform;\n const filteredServer = platformFilter\n ? serverItems.filter(i => i.platform === platformFilter || i.platform === 'both')\n : serverItems;\n const filteredLocal = platformFilter\n ? localItems.filter(i => i.platform === platformFilter)\n : localItems;\n\n const diff = compareState(filteredServer, filteredLocal);\n\n console.log(chalk.bold('\\n Config Diff\\n'));\n\n if (diff.installed.length) {\n console.log(` ${chalk.green('✓')} In sync: ${diff.installed.length}`);\n }\n if (diff.missing.length) {\n console.log(` ${chalk.red('✗')} Missing locally: ${diff.missing.length}`);\n for (const item of diff.missing) {\n console.log(` ${chalk.red('-')} ${item.name} (${item.type}/${item.platform})`);\n }\n }\n if (diff.outdated.length) {\n console.log(` ${chalk.yellow('~')} Outdated: ${diff.outdated.length}`);\n for (const item of diff.outdated) {\n console.log(` ${chalk.yellow('~')} ${item.server.name} (${item.server.type}/${item.server.platform})`);\n }\n }\n if (diff.extra.length) {\n console.log(` ${chalk.dim('+')} Local only: ${diff.extra.length}`);\n for (const item of diff.extra) {\n console.log(` ${chalk.dim('+')} ${item.name} (${item.type}/${item.platform})`);\n }\n }\n\n if (diff.missing.length === 0 && diff.outdated.length === 0) {\n console.log(chalk.green('\\n Everything is in sync.\\n'));\n } else {\n console.log(chalk.dim('\\n Run `caliber sync` to apply changes.\\n'));\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { apiRequest } from '../api/client.js';\nimport { isGitRepo } from '../fingerprint/git.js';\nimport { readExistingConfigs } from '../fingerprint/existing-config.js';\nimport { collectDiff } from '../lib/git-diff.js';\nimport { readState, writeState, getCurrentHeadSha } from '../lib/state.js';\nimport { writeRefreshDocs } from '../writers/refresh.js';\nimport { collectFingerprint } from '../fingerprint/index.js';\nimport { trackEvent } from '../telemetry.js';\n\ninterface RefreshOptions {\n quiet?: boolean;\n dryRun?: boolean;\n}\n\ninterface RefreshResponse {\n updatedDocs: {\n claudeMd?: string | null;\n readmeMd?: string | null;\n cursorrules?: string | null;\n cursorRules?: Array<{ filename: string; content: string }> | null;\n claudeSkills?: Array<{ filename: string; content: string }> | null;\n };\n changesSummary: string;\n docsUpdated: string[];\n}\n\nfunction log(quiet: boolean, ...args: unknown[]) {\n if (!quiet) console.log(...args);\n}\n\nfunction discoverGitRepos(parentDir: string): string[] {\n const repos: string[] = [];\n try {\n const entries = fs.readdirSync(parentDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) continue;\n const childPath = path.join(parentDir, entry.name);\n if (fs.existsSync(path.join(childPath, '.git'))) {\n repos.push(childPath);\n }\n }\n } catch {\n // can't read directory\n }\n return repos.sort();\n}\n\nasync function refreshSingleRepo(repoDir: string, options: RefreshOptions & { label?: string }): Promise<void> {\n const quiet = !!options.quiet;\n const prefix = options.label ? `${chalk.bold(options.label)} ` : '';\n\n const state = readState();\n const lastSha = state?.lastRefreshSha ?? null;\n\n const diff = collectDiff(lastSha);\n const currentSha = getCurrentHeadSha();\n\n if (!diff.hasChanges) {\n if (currentSha) {\n writeState({ lastRefreshSha: currentSha, lastRefreshTimestamp: new Date().toISOString() });\n }\n log(quiet, chalk.dim(`${prefix}No changes since last refresh.`));\n return;\n }\n\n const spinner = quiet ? null : ora(`${prefix}Analyzing changes...`).start();\n\n const existingDocs = readExistingConfigs(repoDir);\n\n const fingerprint = collectFingerprint(repoDir);\n const projectContext = {\n languages: fingerprint.languages,\n frameworks: fingerprint.frameworks,\n packageName: fingerprint.packageName,\n };\n\n const response = await apiRequest<RefreshResponse>('/api/setups/refresh', {\n method: 'POST',\n body: {\n diff: {\n committed: diff.committedDiff,\n staged: diff.stagedDiff,\n unstaged: diff.unstagedDiff,\n changedFiles: diff.changedFiles,\n summary: diff.summary,\n },\n existingDocs,\n projectContext,\n },\n });\n\n if (!response.docsUpdated || response.docsUpdated.length === 0) {\n spinner?.succeed(`${prefix}No doc updates needed`);\n if (currentSha) {\n writeState({ lastRefreshSha: currentSha, lastRefreshTimestamp: new Date().toISOString() });\n }\n return;\n }\n\n if (options.dryRun) {\n spinner?.info(`${prefix}Dry run — would update:`);\n for (const doc of response.docsUpdated) {\n console.log(` ${chalk.yellow('~')} ${doc}`);\n }\n if (response.changesSummary) {\n console.log(chalk.dim(`\\n ${response.changesSummary}`));\n }\n return;\n }\n\n const written = writeRefreshDocs(response.updatedDocs);\n spinner?.succeed(`${prefix}Updated ${written.length} doc${written.length === 1 ? '' : 's'}`);\n\n for (const file of written) {\n log(quiet, ` ${chalk.green('✓')} ${file}`);\n }\n\n if (response.changesSummary) {\n log(quiet, chalk.dim(`\\n ${response.changesSummary}`));\n }\n\n if (currentSha) {\n writeState({ lastRefreshSha: currentSha, lastRefreshTimestamp: new Date().toISOString() });\n }\n\n trackEvent('refresh_completed', {\n docs_updated: written.length,\n changed_files: diff.changedFiles.length,\n updated_files: written,\n });\n}\n\nexport async function refreshCommand(options: RefreshOptions) {\n const quiet = !!options.quiet;\n\n try {\n const auth = getStoredAuth();\n if (!auth) {\n if (quiet) return;\n console.log(chalk.red('Not authenticated. Run `caliber login` first.'));\n throw new Error('__exit__');\n }\n\n if (isGitRepo()) {\n await refreshSingleRepo(process.cwd(), options);\n return;\n }\n\n const repos = discoverGitRepos(process.cwd());\n if (repos.length === 0) {\n if (quiet) return;\n console.log(chalk.red('Not inside a git repository and no git repos found in child directories.'));\n throw new Error('__exit__');\n }\n\n log(quiet, chalk.dim(`Found ${repos.length} git repo${repos.length === 1 ? '' : 's'}\\n`));\n\n const originalDir = process.cwd();\n for (const repo of repos) {\n const repoName = path.basename(repo);\n try {\n process.chdir(repo);\n await refreshSingleRepo(repo, { ...options, label: repoName });\n } catch (err) {\n if (err instanceof Error && err.message === '__exit__') continue;\n log(quiet, chalk.yellow(`${repoName}: refresh failed — ${err instanceof Error ? err.message : 'unknown error'}`));\n }\n }\n process.chdir(originalDir);\n } catch (err) {\n if (err instanceof Error && err.message === '__exit__') throw err;\n if (quiet) return;\n const msg = err instanceof Error ? err.message : 'Unknown error';\n console.log(chalk.red(`Refresh failed: ${msg}`));\n throw new Error('__exit__');\n }\n}\n","import { execSync } from 'child_process';\n\nconst MAX_DIFF_BYTES = 100_000;\n\nconst DOC_PATTERNS = [\n 'CLAUDE.md',\n 'README.md',\n '.cursorrules',\n '.cursor/rules/',\n '.claude/skills/',\n];\n\nfunction excludeArgs(): string[] {\n return DOC_PATTERNS.flatMap(p => ['--', `:!${p}`]);\n}\n\nfunction safeExec(cmd: string): string {\n try {\n return execSync(cmd, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n maxBuffer: 10 * 1024 * 1024,\n }).trim();\n } catch {\n return '';\n }\n}\n\nexport interface DiffResult {\n hasChanges: boolean;\n committedDiff: string;\n stagedDiff: string;\n unstagedDiff: string;\n changedFiles: string[];\n summary: string;\n}\n\nexport function collectDiff(lastSha: string | null): DiffResult {\n let committedDiff = '';\n let stagedDiff = '';\n let unstagedDiff = '';\n let changedFiles: string[] = [];\n\n if (lastSha) {\n committedDiff = safeExec(`git diff ${lastSha}..HEAD ${excludeArgs().join(' ')}`);\n const committedFiles = safeExec(`git diff --name-only ${lastSha}..HEAD`);\n if (committedFiles) {\n changedFiles.push(...committedFiles.split('\\n').filter(Boolean));\n }\n } else {\n committedDiff = safeExec('git log --oneline -20');\n }\n\n stagedDiff = safeExec(`git diff --cached ${excludeArgs().join(' ')}`);\n unstagedDiff = safeExec(`git diff ${excludeArgs().join(' ')}`);\n\n const stagedFiles = safeExec('git diff --cached --name-only');\n if (stagedFiles) {\n changedFiles.push(...stagedFiles.split('\\n').filter(Boolean));\n }\n const unstagedFiles = safeExec('git diff --name-only');\n if (unstagedFiles) {\n changedFiles.push(...unstagedFiles.split('\\n').filter(Boolean));\n }\n\n const untrackedFiles = safeExec('git ls-files --others --exclude-standard');\n if (untrackedFiles) {\n changedFiles.push(...untrackedFiles.split('\\n').filter(Boolean));\n }\n\n changedFiles = [...new Set(changedFiles)].filter(\n f => !DOC_PATTERNS.some(p => f === p || f.startsWith(p))\n );\n\n const totalSize = committedDiff.length + stagedDiff.length + unstagedDiff.length;\n if (totalSize > MAX_DIFF_BYTES) {\n const ratio = MAX_DIFF_BYTES / totalSize;\n committedDiff = committedDiff.slice(0, Math.floor(committedDiff.length * ratio));\n stagedDiff = stagedDiff.slice(0, Math.floor(stagedDiff.length * ratio));\n unstagedDiff = unstagedDiff.slice(0, Math.floor(unstagedDiff.length * ratio));\n }\n\n const hasChanges = !!(committedDiff || stagedDiff || unstagedDiff || changedFiles.length);\n\n const parts: string[] = [];\n if (changedFiles.length) parts.push(`${changedFiles.length} files changed`);\n if (committedDiff) parts.push('committed changes');\n if (stagedDiff) parts.push('staged changes');\n if (unstagedDiff) parts.push('unstaged changes');\n const summary = parts.join(', ') || 'no changes';\n\n return { hasChanges, committedDiff, stagedDiff, unstagedDiff, changedFiles, summary };\n}\n","import fs from 'fs';\nimport path from 'path';\n\ninterface RefreshDocs {\n claudeMd?: string | null;\n readmeMd?: string | null;\n cursorrules?: string | null;\n cursorRules?: Array<{ filename: string; content: string }> | null;\n claudeSkills?: Array<{ filename: string; content: string }> | null;\n}\n\nexport function writeRefreshDocs(docs: RefreshDocs): string[] {\n const written: string[] = [];\n\n if (docs.claudeMd) {\n fs.writeFileSync('CLAUDE.md', docs.claudeMd);\n written.push('CLAUDE.md');\n }\n\n if (docs.readmeMd) {\n fs.writeFileSync('README.md', docs.readmeMd);\n written.push('README.md');\n }\n\n if (docs.cursorrules) {\n fs.writeFileSync('.cursorrules', docs.cursorrules);\n written.push('.cursorrules');\n }\n\n if (docs.cursorRules) {\n const rulesDir = path.join('.cursor', 'rules');\n if (!fs.existsSync(rulesDir)) fs.mkdirSync(rulesDir, { recursive: true });\n for (const rule of docs.cursorRules) {\n const filePath = path.join(rulesDir, rule.filename);\n fs.writeFileSync(filePath, rule.content);\n written.push(filePath);\n }\n }\n\n if (docs.claudeSkills) {\n const skillsDir = path.join('.claude', 'skills');\n if (!fs.existsSync(skillsDir)) fs.mkdirSync(skillsDir, { recursive: true });\n for (const skill of docs.claudeSkills) {\n const filePath = path.join(skillsDir, skill.filename);\n fs.writeFileSync(filePath, skill.content);\n written.push(filePath);\n }\n }\n\n return written;\n}\n","import chalk from 'chalk';\nimport { isHookInstalled, installHook, removeHook } from '../lib/hooks.js';\n\nexport async function hooksInstallCommand() {\n const result = installHook();\n if (result.alreadyInstalled) {\n console.log(chalk.dim('Hook already installed.'));\n return;\n }\n console.log(chalk.green('✓') + ' SessionEnd hook installed in .claude/settings.json');\n console.log(chalk.dim(' Docs will auto-refresh when Claude Code sessions end.'));\n}\n\nexport async function hooksRemoveCommand() {\n const result = removeHook();\n if (result.notFound) {\n console.log(chalk.dim('Hook not found.'));\n return;\n }\n console.log(chalk.green('✓') + ' SessionEnd hook removed from .claude/settings.json');\n}\n\nexport async function hooksStatusCommand() {\n const installed = isHookInstalled();\n if (installed) {\n console.log(chalk.green('✓') + ' Auto-refresh hook is ' + chalk.green('installed'));\n } else {\n console.log(chalk.dim('✗') + ' Auto-refresh hook is ' + chalk.yellow('not installed'));\n console.log(chalk.dim(' Run `caliber hooks install` to enable auto-refresh on session end.'));\n }\n}\n","import chalk from 'chalk';\nimport readline from 'readline';\nimport ora from 'ora';\nimport select from '@inquirer/select';\nimport confirm from '@inquirer/confirm';\nimport { getStoredAuth } from '../auth/token-store.js';\nimport { apiRequest } from '../api/client.js';\nimport { trackEvent } from '../telemetry.js';\n\ninterface ReviewOptions {\n rating?: string;\n}\n\nfunction prompt(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nasync function promptRating(): Promise<number> {\n return select({\n message: 'How helpful was Caliber in setting up your coding agent?',\n choices: [\n { name: 'Not helpful at all', value: 1 },\n { name: 'Slightly helpful', value: 2 },\n { name: 'Moderately helpful', value: 3 },\n { name: 'Very helpful', value: 4 },\n { name: 'Extremely helpful', value: 5 },\n ],\n });\n}\n\nasync function promptRecommend(): Promise<'yes' | 'no' | 'maybe'> {\n return select({\n message: 'Would you recommend Caliber to a colleague?',\n choices: [\n { name: 'Yes', value: 'yes' as const },\n { name: 'No', value: 'no' as const },\n { name: 'Maybe', value: 'maybe' as const },\n ],\n });\n}\n\nfunction starRating(rating: number): string {\n return '★'.repeat(rating) + '☆'.repeat(5 - rating);\n}\n\nasync function submitReview(body: { rating: number; bestPart: string; biggestGap: string; wouldRecommend: string }) {\n const spinner = ora('Submitting review...').start();\n try {\n await apiRequest('/api/reviews', { method: 'POST', body });\n spinner.succeed('Review submitted');\n trackEvent('review_submitted', { rating: body.rating, would_recommend: body.wouldRecommend });\n console.log(chalk.green.bold('\\n Thank you for your feedback!\\n'));\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Unknown error';\n spinner.fail(`Failed to submit review: ${msg}`);\n trackEvent('error_occurred', { error_type: 'review_submit_failed', error_message: msg, command: 'review' });\n throw new Error('__exit__');\n }\n}\n\nexport async function reviewCommand(message: string | undefined, options: ReviewOptions) {\n const auth = getStoredAuth();\n if (!auth) {\n console.log(chalk.red('\\n Not authenticated. Run `caliber login` first.\\n'));\n throw new Error('__exit__');\n }\n\n // Quick mode: caliber review \"love it!\" [-r 5]\n if (message) {\n const rating = options.rating ? parseInt(options.rating, 10) : 5;\n if (rating < 1 || rating > 5 || isNaN(rating)) {\n console.log(chalk.red('Rating must be between 1 and 5.'));\n throw new Error('__exit__');\n }\n console.log(chalk.dim(`\\n ${starRating(rating)} \"${message}\"\\n`));\n await submitReview({ rating, bestPart: message, biggestGap: '', wouldRecommend: 'yes' });\n return;\n }\n\n // Interactive mode\n console.log(chalk.hex('#6366f1').bold('\\n Share your feedback\\n'));\n console.log(chalk.dim(' We\\'d love to hear how Caliber is working for you.'));\n console.log(chalk.dim(' This takes under 2 minutes.\\n'));\n console.log(chalk.dim(' Tip: use `caliber review \"your feedback\"` for a quick review.\\n'));\n\n const rating = await promptRating();\n const bestPart = await prompt(chalk.cyan('\\n What did you find most useful? '));\n const biggestGap = await prompt(chalk.cyan('\\n What was missing or could be better? '));\n const wouldRecommend = await promptRecommend();\n\n console.log(chalk.bold('\\n Your review:\\n'));\n console.log(` Rating: ${starRating(rating)} (${rating}/5)`);\n console.log(` Most useful: ${bestPart || chalk.dim('(skipped)')}`);\n console.log(` Could be better: ${biggestGap || chalk.dim('(skipped)')}`);\n console.log(` Would recommend: ${wouldRecommend}`);\n\n const shouldSubmit = await confirm({ message: 'Submit this review?', default: true });\n if (!shouldSubmit) {\n console.log(chalk.dim('\\n Review cancelled.\\n'));\n return;\n }\n\n await submitReview({ rating, bestPart, biggestGap, wouldRecommend });\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { execSync } from 'child_process';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport confirm from '@inquirer/confirm';\n\nconst __dirname_vc = path.dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(\n fs.readFileSync(path.resolve(__dirname_vc, '..', 'package.json'), 'utf-8')\n);\n\nfunction getInstalledVersion(): string | null {\n try {\n const globalRoot = execSync('npm root -g', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n const pkgPath = path.join(globalRoot, '@caliber-ai', 'cli', 'package.json');\n return JSON.parse(fs.readFileSync(pkgPath, 'utf-8')).version;\n } catch {\n return null;\n }\n}\n\nexport async function checkForUpdates(): Promise<void> {\n if (process.env.CALIBER_SKIP_UPDATE_CHECK) return;\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 2000);\n\n const res = await fetch('https://registry.npmjs.org/@caliber-ai/cli/latest', {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n\n if (!res.ok) return;\n\n const data = (await res.json()) as { version?: string };\n const latest = data.version;\n if (!latest) return;\n\n const current = pkg.version as string;\n if (current === latest) return;\n\n const isInteractive = process.stdin.isTTY === true;\n\n if (!isInteractive) {\n console.log(\n chalk.yellow(\n `\\nUpdate available: ${current} -> ${latest}\\nRun ${chalk.bold('npm install -g @caliber-ai/cli')} to upgrade.\\n`\n )\n );\n return;\n }\n\n console.log(\n chalk.yellow(`\\nUpdate available: ${current} -> ${latest}`)\n );\n\n const shouldUpdate = await confirm({ message: 'Would you like to update now? (Y/n)', default: true });\n if (!shouldUpdate) {\n console.log();\n return;\n }\n\n const spinner = ora('Updating @caliber-ai/cli...').start();\n try {\n execSync(`npm install -g @caliber-ai/cli@${latest} --prefer-online`, { stdio: 'pipe', timeout: 60_000 });\n\n const installed = getInstalledVersion();\n if (installed !== latest) {\n spinner.fail(`Update incomplete — got ${installed ?? 'unknown'}, expected ${latest}`);\n console.log(chalk.yellow(`Run ${chalk.bold(`npm install -g @caliber-ai/cli@${latest}`)} manually.\\n`));\n return;\n }\n\n spinner.succeed(chalk.green(`Updated to ${latest}`));\n\n const args = process.argv.slice(2);\n console.log(chalk.dim(`\\nRestarting: caliber ${args.join(' ')}\\n`));\n execSync(`caliber ${args.map((a) => JSON.stringify(a)).join(' ')}`, {\n stdio: 'inherit',\n env: { ...process.env, CALIBER_SKIP_UPDATE_CHECK: '1' },\n });\n process.exit(0);\n } catch (err) {\n spinner.fail('Update failed');\n const msg = err instanceof Error ? err.message : '';\n if (msg && !msg.includes('SIGTERM')) console.log(chalk.dim(` ${msg.split('\\n')[0]}`));\n console.log(\n chalk.yellow(\n `Run ${chalk.bold(`npm install -g @caliber-ai/cli@${latest}`)} manually to upgrade.\\n`\n )\n );\n }\n } catch {\n // Silently ignore — offline, timeout, registry down, etc.\n }\n}\n","import path from 'path';\nimport { Sentry } from './lib/sentry.js';\nimport { program } from './cli.js';\nimport { getStoredAuth } from './auth/token-store.js';\nimport { isFirstRun, getDeviceId, trackEvent, identifyUser, shutdownTelemetry } from './telemetry.js';\nimport { checkForUpdates } from './utils/version-check.js';\n\nif (process.env.CALIBER_LOCAL) {\n process.env.CALIBER_SKIP_UPDATE_CHECK = '1';\n}\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 Sentry.setUser({ id: auth.userId, email: auth.email });\n}\n\nawait checkForUpdates();\n\nasync function gracefulExit(code: number) {\n await Promise.all([\n shutdownTelemetry(),\n Sentry.flush(2000),\n ]);\n process.exit(code);\n}\n\nprocess.on('SIGINT', () => gracefulExit(130));\nprocess.on('SIGTERM', () => gracefulExit(143));\n\nprogram.parseAsync()\n .catch((err) => {\n const msg = err instanceof Error ? err.message : 'Unexpected error';\n if (msg !== '__exit__') {\n console.error(msg);\n Sentry.captureException(err, {\n tags: { command: process.argv[2] || 'unknown' },\n contexts: { cli: { args: process.argv.slice(2).join(' '), cwd: process.cwd() } },\n });\n }\n trackEvent('error_occurred', { error_type: 'cli_crash', error_message: msg, command: process.argv[2] || 'unknown' });\n process.exitCode = 1;\n })\n .finally(() => gracefulExit(Number(process.exitCode ?? 0)));\n"],"mappings":"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","names":["path","os","fs","path","fileURLToPath","chalk","ora","fs","fs","auth","resolve","fs","path","os","fileURLToPath","path","fs","auth","fileURLToPath","pkg","os","resolve","crypto","fs","path","fs","path","pkg","fs","path","path","fs","path","fs","path","IGNORE_DIRS","auth","path","crypto","path","fs","fs","fs","path","fs","path","fs","path","fs","crypto","fs","MANIFEST_FILE","fs","path","fs","execSync","fs","path","fs","path","execSync","chalk","chalk","auth","ora","resolve","fs","chalk","ora","ora","chalk","chalk","fs","fs","path","crypto","path","fs","crypto","auth","chalk","fs","chalk","ora","auth","chalk","ora","chalk","auth","chalk","chalk","ora","dirname","auth","chalk","recs","selected","ora","resolve","dirname","chalk","ora","auth","chalk","ora","chalk","ora","auth","chalk","ora","fs","path","chalk","ora","execSync","fs","path","fs","path","chalk","ora","auth","chalk","chalk","chalk","readline","ora","select","confirm","readline","resolve","select","ora","chalk","auth","rating","confirm","__dirname","path","fileURLToPath","pkg","fs","fs","path","fileURLToPath","execSync","chalk","ora","confirm","pkg"]}