@mycontxt/cli 0.1.7 → 0.1.8

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin/contxt.ts","../src/commands/init.ts","../src/utils/project.ts","../src/utils/output.ts","../src/commands/decision.ts","../src/commands/pattern.ts","../src/commands/context.ts","../src/commands/status.ts","../src/commands/doc.ts","../src/commands/session.ts","../src/commands/search.ts","../src/commands/export.ts","../src/commands/auth.ts","../src/config.ts","../src/commands/sync.ts","../src/commands/branch.ts","../src/commands/history.ts","../src/commands/load.ts","../src/commands/scan.ts","../src/commands/review.ts","../src/commands/rules.ts","../src/commands/capture.ts","../src/commands/hook.ts","../src/hooks/post-commit.ts","../src/hooks/pre-push.ts","../src/hooks/post-checkout.ts","../src/hooks/prepare-commit-msg.ts","../src/commands/watch.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * Contxt CLI Entry Point\n */\n\nimport { Command } from 'commander';\nimport { initCommand } from '../commands/init.js';\nimport { decisionCommand } from '../commands/decision.js';\nimport { patternCommand } from '../commands/pattern.js';\nimport { contextCommand } from '../commands/context.js';\nimport { statusCommand } from '../commands/status.js';\nimport { docCommand } from '../commands/doc.js';\nimport { sessionCommand } from '../commands/session.js';\nimport { searchCommand } from '../commands/search.js';\nimport { exportCommand, importCommand } from '../commands/export.js';\nimport { authCommand } from '../commands/auth.js';\nimport { syncCommand } from '../commands/sync.js';\nimport { branchCommand } from '../commands/branch.js';\nimport { historyCommand } from '../commands/history.js';\nimport { loadCommand } from '../commands/load.js';\nimport { scanCommand } from '../commands/scan.js';\nimport { reviewCommand } from '../commands/review.js';\nimport { rulesCommand } from '../commands/rules.js';\nimport { captureCommand } from '../commands/capture.js';\nimport { hookCommand } from '../commands/hook.js';\nimport { watchCommand } from '../commands/watch.js';\n\nconst program = new Command();\n\nprogram\n .name('contxt')\n .description('GitHub for AI Context - Persistent memory for AI coding agents')\n .version('0.1.0');\n\n// Project commands\nprogram\n .command('init')\n .description('Initialize a Contxt project in the current directory')\n .option('-n, --name <name>', 'Project name')\n .action(initCommand);\n\nprogram\n .command('status')\n .description('Show project status and memory summary')\n .action(statusCommand);\n\n// Decision commands\nconst decision = program\n .command('decision')\n .description('Manage architectural decisions');\n\ndecision\n .command('add')\n .description('Add a new decision')\n .requiredOption('-t, --title <title>', 'Decision title')\n .requiredOption('-r, --rationale <rationale>', 'Decision rationale')\n .option('-a, --alternatives <alternatives...>', 'Alternative approaches considered')\n .option('-c, --consequences <consequences...>', 'Consequences of this decision')\n .option('--tags <tags...>', 'Tags for categorization')\n .action(decisionCommand.add);\n\ndecision\n .command('list')\n .description('List all decisions')\n .option('-b, --branch <branch>', 'Filter by branch')\n .action(decisionCommand.list);\n\ndecision\n .command('show <id>')\n .description('Show a specific decision')\n .action(decisionCommand.show);\n\n// Pattern commands\nconst pattern = program\n .command('pattern')\n .description('Manage code patterns and conventions');\n\npattern\n .command('add')\n .description('Add a new pattern')\n .requiredOption('-t, --title <title>', 'Pattern title')\n .requiredOption('-c, --content <content>', 'Pattern content/code')\n .option('--category <category>', 'Pattern category')\n .option('--tags <tags...>', 'Tags for categorization')\n .action(patternCommand.add);\n\npattern\n .command('list')\n .description('List all patterns')\n .option('-b, --branch <branch>', 'Filter by branch')\n .action(patternCommand.list);\n\npattern\n .command('show <id>')\n .description('Show a specific pattern')\n .action(patternCommand.show);\n\n// Context commands\nconst context = program\n .command('context')\n .description('Manage project working context');\n\ncontext\n .command('set')\n .description('Set current working context')\n .option('-f, --feature <feature>', 'Current feature being worked on')\n .option('-b, --blockers <blockers...>', 'Current blockers')\n .option('-n, --next <steps...>', 'Next steps')\n .option('--files <files...>', 'Active files')\n .action(contextCommand.set);\n\ncontext\n .command('show')\n .description('Show current context')\n .action(contextCommand.show);\n\ncontext\n .command('clear')\n .description('Clear current context')\n .action(contextCommand.clear);\n\n// Document commands\nconst doc = program\n .command('doc')\n .description('Manage documentation and reference materials');\n\ndoc\n .command('add')\n .description('Add a new document')\n .requiredOption('-t, --title <title>', 'Document title')\n .option('-c, --content <content>', 'Document content')\n .option('-f, --file <file>', 'Read content from file')\n .option('-u, --url <url>', 'Source URL')\n .option('--tags <tags...>', 'Tags for categorization')\n .action(docCommand.add);\n\ndoc\n .command('list')\n .description('List all documents')\n .option('-b, --branch <branch>', 'Filter by branch')\n .action(docCommand.list);\n\ndoc\n .command('show <id>')\n .description('Show a specific document')\n .action(docCommand.show);\n\n// Session commands\nconst session = program\n .command('session')\n .description('Manage development sessions');\n\nsession\n .command('start')\n .description('Start a new development session')\n .requiredOption('-f, --feature <feature>', 'Feature being worked on')\n .option('-d, --description <description>', 'Session description')\n .action(sessionCommand.start);\n\nsession\n .command('end')\n .description('End the current session')\n .option('-s, --summary <summary>', 'Session summary')\n .action(sessionCommand.end);\n\nsession\n .command('list')\n .description('List all sessions')\n .option('-b, --branch <branch>', 'Filter by branch')\n .action(sessionCommand.list);\n\nsession\n .command('current')\n .description('Show current active session')\n .action(sessionCommand.current);\n\n// Search command\nprogram\n .command('search <query>')\n .description('Search memory entries')\n .option('-b, --branch <branch>', 'Filter by branch')\n .option('-t, --type <type>', 'Filter by type (decision, pattern, context, document, session)')\n .option('-l, --limit <limit>', 'Limit number of results', parseInt)\n .action(searchCommand);\n\n// Export command\nprogram\n .command('export')\n .description('Export memory entries to JSON')\n .option('-o, --output <file>', 'Output file (defaults to stdout)')\n .option('-b, --branch <branch>', 'Export specific branch')\n .action(exportCommand);\n\n// Import command\nprogram\n .command('import')\n .description('Import memory entries from JSON')\n .requiredOption('-f, --file <file>', 'Input file to import')\n .option('-m, --merge', 'Merge with existing entries (default: replace)')\n .action(importCommand);\n\n// Auth commands\nconst auth = program\n .command('auth')\n .description('Manage authentication');\n\nauth\n .command('login')\n .description('Authenticate with GitHub or email')\n .option('-e, --email <email>', 'Login with magic link (email)')\n .action(authCommand.login);\n\nauth\n .command('logout')\n .description('Logout from Contxt')\n .action(authCommand.logout);\n\nauth\n .command('status')\n .description('Check authentication status')\n .action(authCommand.status);\n\n// Sync commands\nprogram\n .command('push')\n .description('Push local changes to cloud')\n .option('-f, --force', 'Force push (override conflicts)')\n .option('-d, --dry-run', 'Show what would be pushed without actually pushing')\n .action(syncCommand.push);\n\nprogram\n .command('pull')\n .description('Pull remote changes to local')\n .option('-f, --force', 'Force pull (override conflicts)')\n .option('-d, --dry-run', 'Show what would be pulled without actually pulling')\n .action(syncCommand.pull);\n\nprogram\n .command('sync')\n .description('Full bidirectional sync (pull + push)')\n .option('-f, --force', 'Force sync (override conflicts)')\n .option('-d, --dry-run', 'Show what would be synced without actually syncing')\n .action(syncCommand.sync);\n\n// Branch commands\nconst branch = program\n .command('branch')\n .description('Manage branches');\n\nbranch\n .command('create <name>')\n .description('Create a new branch')\n .option('-f, --from <branch>', 'Create from specific branch')\n .action(branchCommand.create);\n\nbranch\n .command('list')\n .description('List all branches')\n .action(branchCommand.list);\n\nbranch\n .command('switch <name>')\n .description('Switch to a different branch')\n .action(branchCommand.switch);\n\nbranch\n .command('delete <name>')\n .description('Delete a branch')\n .action(branchCommand.delete);\n\nbranch\n .command('merge <source>')\n .description('Merge a branch into current branch')\n .action(branchCommand.merge);\n\n// History commands\nconst history = program\n .command('history')\n .description('View and restore version history');\n\nhistory\n .command('show <entry-id>')\n .description('Show version history for an entry')\n .action(historyCommand.show);\n\nhistory\n .command('restore <entry-id>')\n .description('Restore an entry to a previous version')\n .requiredOption('-v, --version <version>', 'Version number to restore', parseInt)\n .action(historyCommand.restore);\n\n// Load command\nprogram\n .command('load')\n .description('Generate context payload for AI prompts')\n .option('-t, --task <description>', 'Task-based context (smart relevance ranking)')\n .option('-f, --files <files...>', 'File-based context (filter by file mentions)')\n .option('-a, --all', 'All context (everything, sorted by recency)')\n .option('--max-tokens <tokens>', 'Maximum tokens for context', parseInt)\n .option('--type <type>', 'Filter by entry type (decision, pattern, etc.)')\n .option('-s, --summary', 'Show context summary instead of full context')\n .action(loadCommand);\n\n// Scan command\nprogram\n .command('scan')\n .description('Scan codebase for tagged comments (@decision, @pattern, @context)')\n .option('--path <path>', 'Specific directory to scan')\n .option('--dry-run', 'Show what would be captured without saving')\n .option('--auto-confirm', 'Skip draft queue, save directly as active')\n .action(scanCommand);\n\n// Review command\nprogram\n .command('review')\n .description('Review and confirm draft entries')\n .option('--source <source>', 'Filter by source (scan, hooks, mcp, import)')\n .option('--confirm-all', 'Confirm all pending drafts')\n .option('--discard-all', 'Discard all pending drafts')\n .option('--count', 'Show draft count only')\n .action(reviewCommand);\n\n// Rules commands\nconst rules = program\n .command('rules')\n .description('Manage .contxt/rules.md file');\n\nrules\n .command('sync')\n .description('Sync rules.md into memory store')\n .option('--dry-run', 'Show what would be synced without saving')\n .option('-f, --force', 'Force sync even if conflicts exist')\n .action(rulesCommand.sync);\n\nrules\n .command('generate')\n .description('Generate rules.md from memory store')\n .option('--dry-run', 'Show what would be generated without writing')\n .option('-f, --force', 'Overwrite existing rules.md')\n .action(rulesCommand.generate);\n\nrules\n .command('diff')\n .description('Show differences between rules.md and memory')\n .action(rulesCommand.diff);\n\n// Capture command\nprogram\n .command('capture')\n .description('Extract context from existing project files')\n .option('--source <source>', 'Source to capture from (readme, cursor, claude, adr, commits, package, all)')\n .option('--dry-run', 'Show what would be captured without saving')\n .option('--auto-confirm', 'Skip draft queue, save directly as active')\n .option('--limit <limit>', 'Limit number of commits to scan (default: 50)', parseInt)\n .action(captureCommand);\n\n// Hook commands\nconst hook = program\n .command('hook')\n .description('Manage git hooks for automatic context capture');\n\nhook\n .command('install')\n .description('Install git hooks')\n .option('--hooks <hooks>', 'Comma-separated hooks to install (post-commit, pre-push, post-checkout, prepare-commit-msg)')\n .action(hookCommand.install);\n\nhook\n .command('uninstall')\n .description('Uninstall git hooks')\n .option('--hooks <hooks>', 'Comma-separated hooks to remove')\n .action(hookCommand.uninstall);\n\nhook\n .command('status')\n .description('Show installed hook status')\n .action(hookCommand.status);\n\nhook\n .command('run <hook-name>')\n .description('Run a specific hook (called internally by git)')\n .action(hookCommand.run);\n\n// Watch commands\nprogram\n .command('watch')\n .description('Start background file watcher for passive context capture')\n .option('--daemon', 'Run as background process')\n .action(watchCommand.start);\n\nprogram\n .command('watch:stop')\n .description('Stop the background watch daemon')\n .action(watchCommand.stop);\n\nprogram\n .command('watch:status')\n .description('Show watch daemon status')\n .action(watchCommand.status);\n\n// Parse arguments\nprogram.parse();\n","/**\n * Init command - Initialize a Contxt project\n */\n\nimport { mkdirSync, existsSync } from 'fs';\nimport { basename } from 'path';\nimport { SQLiteDatabase } from '@mycontxt/adapters/sqlite';\nimport { getContxtDir, getDbPath, isContxtProject } from '../utils/project.js';\nimport { success, error, info } from '../utils/output.js';\n\ninterface InitOptions {\n name?: string;\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n try {\n const cwd = process.cwd();\n\n // Check if already initialized\n if (isContxtProject(cwd)) {\n error('This directory is already a Contxt project');\n process.exit(1);\n }\n\n // Create .contxt directory\n const contxtDir = getContxtDir(cwd);\n mkdirSync(contxtDir, { recursive: true });\n\n // Initialize database\n const dbPath = getDbPath(cwd);\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n // Create project\n const projectName = options.name || basename(cwd);\n const project = await db.initProject({\n name: projectName,\n path: cwd,\n stack: [], // TODO: Auto-detect stack\n });\n\n success(`Initialized Contxt project: ${project.name}`);\n info(`Project ID: ${project.id}`);\n info(`Database: ${dbPath}`);\n console.log();\n console.log('Get started:');\n console.log(' contxt decision add -t \"...\" -r \"...\"');\n console.log(' contxt pattern add -t \"...\" -c \"...\"');\n console.log(' contxt status');\n\n await db.close();\n } catch (err) {\n error(`Failed to initialize project: ${(err as Error).message}`);\n process.exit(1);\n }\n}\n","/**\n * Project utilities\n */\n\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { SQLiteDatabase } from '@mycontxt/adapters/sqlite';\nimport { MemoryEngine } from '@mycontxt/core';\n\nexport interface ProjectContext {\n db: SQLiteDatabase;\n engine: MemoryEngine;\n projectId: string;\n projectPath: string;\n}\n\n/**\n * Get the .contxt directory path\n */\nexport function getContxtDir(cwd: string = process.cwd()): string {\n return join(cwd, '.contxt');\n}\n\n/**\n * Get the database file path\n */\nexport function getDbPath(cwd: string = process.cwd()): string {\n return join(getContxtDir(cwd), 'local.db');\n}\n\n/**\n * Check if current directory is a Contxt project\n */\nexport function isContxtProject(cwd: string = process.cwd()): boolean {\n const dbPath = getDbPath(cwd);\n return existsSync(dbPath);\n}\n\n/**\n * Load project context\n */\nexport async function loadProject(cwd: string = process.cwd()): Promise<ProjectContext> {\n if (!isContxtProject(cwd)) {\n throw new Error(\n 'Not a Contxt project. Run \"contxt init\" to initialize.'\n );\n }\n\n const dbPath = getDbPath(cwd);\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n const project = await db.getProjectByPath(cwd);\n if (!project) {\n throw new Error('Project not found in database');\n }\n\n const engine = new MemoryEngine(db);\n\n return {\n db,\n engine,\n projectId: project.id,\n projectPath: cwd,\n };\n}\n\n/**\n * Get project database instance\n */\nexport async function getProjectDb(cwd: string = process.cwd()): Promise<SQLiteDatabase> {\n if (!isContxtProject(cwd)) {\n throw new Error(\n 'Not a Contxt project. Run \"contxt init\" to initialize.'\n );\n }\n\n const dbPath = getDbPath(cwd);\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n return db;\n}\n\n/**\n * Format date for display\n */\nexport function formatDate(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days}d ago`;\n if (hours > 0) return `${hours}h ago`;\n if (minutes > 0) return `${minutes}m ago`;\n return 'just now';\n}\n","/**\n * Output formatting utilities\n */\n\nimport chalk from 'chalk';\nimport type { MemoryEntry } from '@mycontxt/core';\nimport { formatDate } from './project.js';\n\n/**\n * Log success message\n */\nexport function success(message: string): void {\n console.log(chalk.green('✓'), message);\n}\n\n/**\n * Log error message\n */\nexport function error(message: string): void {\n console.error(chalk.red('✗'), message);\n}\n\n/**\n * Log info message\n */\nexport function info(message: string): void {\n console.log(chalk.blue('ℹ'), message);\n}\n\n/**\n * Log warning message\n */\nexport function warn(message: string): void {\n console.log(chalk.yellow('⚠'), message);\n}\n\n/**\n * Format entry for display\n */\nexport function formatEntry(entry: MemoryEntry): string {\n const lines: string[] = [];\n\n // Header\n lines.push(chalk.bold(entry.title));\n lines.push(\n chalk.dim(\n `${entry.type} • ${entry.id.substring(0, 8)} • ${formatDate(entry.updatedAt)}`\n )\n );\n lines.push('');\n\n // Content\n lines.push(entry.content);\n\n // Metadata\n if (Object.keys(entry.metadata).length > 0) {\n lines.push('');\n lines.push(chalk.dim('Metadata:'));\n for (const [key, value] of Object.entries(entry.metadata)) {\n if (Array.isArray(value) && value.length > 0) {\n lines.push(chalk.dim(` ${key}: ${value.join(', ')}`));\n } else if (value) {\n lines.push(chalk.dim(` ${key}: ${value}`));\n }\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format entry list for display\n */\nexport function formatEntryList(entries: MemoryEntry[]): string {\n if (entries.length === 0) {\n return chalk.dim('No entries found');\n }\n\n return entries\n .map((entry) => {\n const id = chalk.dim(entry.id.substring(0, 8));\n const time = chalk.dim(formatDate(entry.updatedAt));\n const title = entry.title;\n return ` ${id} ${title} ${time}`;\n })\n .join('\\n');\n}\n\n/**\n * Create a section header\n */\nexport function section(title: string): string {\n return chalk.bold.underline(title);\n}\n\n/**\n * Create a divider\n */\nexport function divider(): string {\n return chalk.dim('─'.repeat(60));\n}\n","/**\n * Decision commands\n */\n\nimport type { DecisionInput } from '@mycontxt/core';\nimport { loadProject } from '../utils/project.js';\nimport { success, error, formatEntry, formatEntryList, section } from '../utils/output.js';\n\ninterface AddOptions {\n title: string;\n rationale: string;\n alternatives?: string[];\n consequences?: string[];\n tags?: string[];\n}\n\ninterface ListOptions {\n branch?: string;\n}\n\nasync function add(options: AddOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const input: DecisionInput = {\n title: options.title,\n rationale: options.rationale,\n alternatives: options.alternatives,\n consequences: options.consequences,\n tags: options.tags,\n };\n\n const entry = await engine.addDecision(projectId, input);\n\n success(`Added decision: ${entry.title}`);\n console.log(`ID: ${entry.id}`);\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function list(options: ListOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const decisions = await engine.listDecisions(projectId, options.branch);\n\n console.log(section('Decisions'));\n console.log();\n console.log(formatEntryList(decisions));\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function show(id: string): Promise<void> {\n try {\n const { engine, db } = await loadProject();\n\n const decision = await engine.getDecision(id);\n\n console.log(formatEntry(decision));\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nexport const decisionCommand = {\n add,\n list,\n show,\n};\n","/**\n * Pattern commands\n */\n\nimport type { PatternInput } from '@mycontxt/core';\nimport { loadProject } from '../utils/project.js';\nimport { success, error, formatEntry, formatEntryList, section } from '../utils/output.js';\n\ninterface AddOptions {\n title: string;\n content: string;\n category?: string;\n tags?: string[];\n}\n\ninterface ListOptions {\n branch?: string;\n}\n\nasync function add(options: AddOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const input: PatternInput = {\n title: options.title,\n content: options.content,\n category: options.category,\n tags: options.tags,\n };\n\n const entry = await engine.addPattern(projectId, input);\n\n success(`Added pattern: ${entry.title}`);\n console.log(`ID: ${entry.id}`);\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function list(options: ListOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const patterns = await engine.listPatterns(projectId, options.branch);\n\n console.log(section('Patterns'));\n console.log();\n console.log(formatEntryList(patterns));\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function show(id: string): Promise<void> {\n try {\n const { engine, db } = await loadProject();\n\n const pattern = await engine.getPattern(id);\n\n console.log(formatEntry(pattern));\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nexport const patternCommand = {\n add,\n list,\n show,\n};\n","/**\n * Context commands\n */\n\nimport type { ContextInput } from '@mycontxt/core';\nimport { loadProject } from '../utils/project.js';\nimport { success, error, formatEntry, info } from '../utils/output.js';\n\ninterface SetOptions {\n feature?: string;\n blockers?: string[];\n next?: string[];\n files?: string[];\n}\n\nasync function set(options: SetOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const input: ContextInput = {\n feature: options.feature,\n blockers: options.blockers,\n nextSteps: options.next,\n activeFiles: options.files,\n };\n\n const entry = await engine.setContext(projectId, input);\n\n success('Updated project context');\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function show(): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const context = await engine.getContext(projectId);\n\n if (!context) {\n info('No context set. Use \"contxt context set\" to set context.');\n await db.close();\n return;\n }\n\n console.log(formatEntry(context));\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function clear(): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const context = await engine.getContext(projectId);\n\n if (context) {\n await engine.deleteEntry(context.id);\n success('Cleared project context');\n } else {\n info('No context to clear');\n }\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nexport const contextCommand = {\n set,\n show,\n clear,\n};\n","/**\n * Status command - Show project overview\n */\n\nimport chalk from 'chalk';\nimport { loadProject } from '../utils/project.js';\nimport { error, section, divider } from '../utils/output.js';\n\nexport async function statusCommand(): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const project = await db.getProject(projectId);\n if (!project) {\n throw new Error('Project not found');\n }\n\n const activeBranch = await db.getActiveBranch(projectId);\n const branches = await db.listBranches(projectId);\n\n // Get entry counts by type\n const decisions = await engine.listDecisions(projectId);\n const patterns = await engine.listPatterns(projectId);\n const documents = await engine.listDocuments(projectId);\n const sessions = await engine.listSessions(projectId);\n const context = await engine.getContext(projectId);\n\n // Get unsynced count\n const unsynced = await db.getUnsyncedEntries(projectId);\n\n console.log();\n console.log(section('Project Status'));\n console.log();\n console.log(chalk.bold('Name:'), project.name);\n console.log(chalk.bold('Path:'), project.path);\n console.log(chalk.bold('ID:'), project.id);\n console.log();\n\n console.log(section('Branches'));\n console.log();\n for (const branch of branches) {\n const marker = branch.name === activeBranch ? chalk.green('●') : ' ';\n console.log(` ${marker} ${branch.name}`);\n }\n console.log();\n\n console.log(section('Memory Entries'));\n console.log();\n console.log(` Decisions: ${decisions.length}`);\n console.log(` Patterns: ${patterns.length}`);\n console.log(` Documents: ${documents.length}`);\n console.log(` Sessions: ${sessions.length}`);\n console.log(` Total: ${decisions.length + patterns.length + documents.length + sessions.length}`);\n console.log();\n\n if (context) {\n console.log(section('Current Context'));\n console.log();\n if (context.metadata.feature) {\n console.log(chalk.bold('Feature:'), context.metadata.feature);\n }\n if (context.metadata.blockers?.length > 0) {\n console.log(chalk.bold('Blockers:'));\n context.metadata.blockers.forEach((b: string) => console.log(` - ${b}`));\n }\n if (context.metadata.nextSteps?.length > 0) {\n console.log(chalk.bold('Next Steps:'));\n context.metadata.nextSteps.forEach((s: string) => console.log(` - ${s}`));\n }\n console.log();\n }\n\n if (unsynced.length > 0) {\n console.log(chalk.yellow(`⚠ ${unsynced.length} unsynced entries`));\n console.log(chalk.dim(' Run \"contxt push\" to sync'));\n console.log();\n }\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n","/**\n * Document commands\n */\n\nimport { readFileSync } from 'fs';\nimport type { DocumentInput } from '@mycontxt/core';\nimport { loadProject } from '../utils/project.js';\nimport { success, error, formatEntry, formatEntryList, section } from '../utils/output.js';\n\ninterface AddOptions {\n title: string;\n content?: string;\n file?: string;\n url?: string;\n tags?: string[];\n}\n\ninterface ListOptions {\n branch?: string;\n}\n\nasync function add(options: AddOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n let content = options.content || '';\n\n // If file is provided, read it\n if (options.file) {\n try {\n content = readFileSync(options.file, 'utf-8');\n } catch (err) {\n error(`Failed to read file: ${(err as Error).message}`);\n process.exit(1);\n }\n }\n\n if (!content) {\n error('Either --content or --file is required');\n process.exit(1);\n }\n\n const input: DocumentInput = {\n title: options.title,\n content,\n url: options.url,\n tags: options.tags,\n };\n\n const entry = await engine.addDocument(projectId, input);\n\n success(`Added document: ${entry.title}`);\n console.log(`ID: ${entry.id}`);\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function list(options: ListOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const documents = await engine.listDocuments(projectId, options.branch);\n\n console.log(section('Documents'));\n console.log();\n console.log(formatEntryList(documents));\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function show(id: string): Promise<void> {\n try {\n const { engine, db } = await loadProject();\n\n const document = await engine.getDocument(id);\n\n console.log(formatEntry(document));\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nexport const docCommand = {\n add,\n list,\n show,\n};\n","/**\n * Session commands\n */\n\nimport type { SessionInput } from '@mycontxt/core';\nimport { loadProject } from '../utils/project.js';\nimport { success, error, info, formatEntry, formatEntryList, section } from '../utils/output.js';\n\ninterface StartOptions {\n feature: string;\n description?: string;\n}\n\ninterface EndOptions {\n summary?: string;\n}\n\ninterface ListOptions {\n branch?: string;\n}\n\nasync function start(options: StartOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const input: SessionInput = {\n feature: options.feature,\n description: options.description,\n };\n\n const session = await engine.startSession(projectId, input);\n\n success(`Started session: ${session.title}`);\n console.log(`ID: ${session.id}`);\n info('Run \"contxt session end\" when done');\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function end(options: EndOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const session = await engine.endSession(projectId, options.summary);\n\n success(`Ended session: ${session.title}`);\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function list(options: ListOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const sessions = await engine.listSessions(projectId, options.branch);\n\n console.log(section('Sessions'));\n console.log();\n console.log(formatEntryList(sessions));\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function current(): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const session = await engine.getActiveSession(projectId);\n\n if (!session) {\n info('No active session');\n await db.close();\n return;\n }\n\n console.log(formatEntry(session));\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nexport const sessionCommand = {\n start,\n end,\n list,\n current,\n};\n","/**\n * Search command\n */\n\nimport { loadProject } from '../utils/project.js';\nimport { error, formatEntryList, section } from '../utils/output.js';\n\ninterface SearchOptions {\n branch?: string;\n type?: string;\n limit?: number;\n}\n\nexport async function searchCommand(\n query: string,\n options: SearchOptions\n): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const results = await engine.searchEntries(projectId, query, {\n branch: options.branch,\n type: options.type,\n });\n\n // Apply limit if specified\n const limited = options.limit ? results.slice(0, options.limit) : results;\n\n console.log(section(`Search Results for \"${query}\"`));\n console.log();\n console.log(formatEntryList(limited));\n console.log();\n console.log(`Found ${results.length} result(s)`);\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n","/**\n * Export/Import commands\n */\n\nimport { writeFileSync, readFileSync } from 'fs';\nimport { loadProject } from '../utils/project.js';\nimport { success, error, info } from '../utils/output.js';\n\ninterface ExportOptions {\n output?: string;\n branch?: string;\n}\n\ninterface ImportOptions {\n file: string;\n merge?: boolean;\n}\n\nexport async function exportCommand(options: ExportOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n // Get all entries\n const entries = await engine.getAllEntries({\n projectId,\n branch: options.branch,\n isArchived: false,\n });\n\n const exportData = {\n version: '1.0',\n exportedAt: new Date().toISOString(),\n projectId,\n branch: options.branch || 'main',\n entries: entries.map((e) => ({\n id: e.id,\n type: e.type,\n title: e.title,\n content: e.content,\n metadata: e.metadata,\n branch: e.branch,\n createdAt: e.createdAt.toISOString(),\n updatedAt: e.updatedAt.toISOString(),\n })),\n };\n\n const json = JSON.stringify(exportData, null, 2);\n\n if (options.output) {\n writeFileSync(options.output, json, 'utf-8');\n success(`Exported ${entries.length} entries to ${options.output}`);\n } else {\n // Output to stdout\n console.log(json);\n }\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nexport async function importCommand(options: ImportOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n // Read import file\n let data: any;\n try {\n const json = readFileSync(options.file, 'utf-8');\n data = JSON.parse(json);\n } catch (err) {\n error(`Failed to read import file: ${(err as Error).message}`);\n process.exit(1);\n }\n\n if (!data.entries || !Array.isArray(data.entries)) {\n error('Invalid import file format');\n process.exit(1);\n }\n\n info(`Importing ${data.entries.length} entries...`);\n\n let imported = 0;\n for (const entry of data.entries) {\n try {\n // Create new entry with imported data\n await db.createEntry({\n projectId,\n type: entry.type,\n title: entry.title,\n content: entry.content,\n metadata: entry.metadata,\n branch: entry.branch,\n });\n imported++;\n } catch (err) {\n console.error(`Failed to import entry \"${entry.title}\": ${(err as Error).message}`);\n }\n }\n\n success(`Imported ${imported} of ${data.entries.length} entries`);\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n","/**\n * Auth Commands - Handle authentication with Supabase\n */\n\nimport { SupabaseAuth } from '@mycontxt/adapters/supabase-auth';\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { getSupabaseConfig } from '../config.js';\n\nconst CONFIG_DIR = join(homedir(), '.contxt');\nconst AUTH_FILE = join(CONFIG_DIR, 'auth.json');\n\ninterface AuthData {\n accessToken: string;\n userId: string;\n email: string;\n githubUsername?: string;\n expiresAt?: string;\n}\n\n/**\n * Save auth data to disk\n */\nfunction saveAuthData(data: AuthData): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n\n writeFileSync(AUTH_FILE, JSON.stringify(data, null, 2), 'utf-8');\n}\n\n/**\n * Load auth data from disk\n */\nfunction loadAuthData(): AuthData | null {\n if (!existsSync(AUTH_FILE)) {\n return null;\n }\n\n try {\n const content = readFileSync(AUTH_FILE, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\n/**\n * Login command\n */\nexport const authCommand = {\n async login(options: { email?: string }) {\n try {\n const config = getSupabaseConfig();\n const auth = new SupabaseAuth(config);\n\n console.log('🔐 Contxt Authentication\\n');\n\n if (options.email) {\n // Magic link flow\n await auth.loginWithMagicLink(options.email);\n console.log('\\n✅ Magic link sent! Check your email and click the link.');\n console.log(' Then run `contxt auth status` to verify.');\n } else {\n // GitHub OAuth flow\n console.log('Opening browser for GitHub authentication...\\n');\n\n const result = await auth.loginWithGitHub();\n\n saveAuthData({\n accessToken: result.accessToken,\n userId: result.user.id,\n email: result.user.email,\n githubUsername: result.user.githubUsername,\n });\n\n console.log('\\n✅ Successfully authenticated!');\n console.log(` Email: ${result.user.email}`);\n if (result.user.githubUsername) {\n console.log(` GitHub: @${result.user.githubUsername}`);\n }\n console.log('\\nYou can now use `contxt push` and `contxt pull` to sync your memory.');\n }\n } catch (error) {\n console.error(\n '❌ Authentication failed:',\n error instanceof Error ? error.message : error\n );\n process.exit(1);\n }\n },\n\n async logout() {\n try {\n const config = getSupabaseConfig();\n const auth = new SupabaseAuth(config);\n\n await auth.logout();\n\n // Remove local auth file\n if (existsSync(AUTH_FILE)) {\n const fs = await import('fs/promises');\n await fs.unlink(AUTH_FILE);\n }\n\n console.log('✅ Logged out successfully');\n } catch (error) {\n console.error(\n '❌ Logout failed:',\n error instanceof Error ? error.message : error\n );\n process.exit(1);\n }\n },\n\n async status() {\n try {\n const authData = loadAuthData();\n\n if (!authData) {\n console.log('❌ Not authenticated');\n console.log('\\nRun `contxt auth login` to authenticate.');\n process.exit(1);\n }\n\n console.log('✅ Authenticated');\n console.log(` Email: ${authData.email}`);\n if (authData.githubUsername) {\n console.log(` GitHub: @${authData.githubUsername}`);\n }\n console.log(` User ID: ${authData.userId}`);\n\n // Try to refresh session to check if still valid\n const config = getSupabaseConfig();\n const auth = new SupabaseAuth(config);\n\n try {\n await auth.refreshSession();\n console.log('\\n✅ Session is valid');\n } catch {\n console.log('\\n⚠️ Session expired. Run `contxt auth login` to re-authenticate.');\n }\n } catch (error) {\n console.error(\n '❌ Status check failed:',\n error instanceof Error ? error.message : error\n );\n process.exit(1);\n }\n },\n};\n\n/**\n * Get access token for API calls\n */\nexport function getAccessToken(): string | null {\n const authData = loadAuthData();\n return authData?.accessToken || null;\n}\n","/**\n * Contxt CLI Configuration\n *\n * Supabase credentials are injected at build time via tsup esbuildOptions.define,\n * so end users never need to set environment variables.\n *\n * For local development / CI builds, set:\n * CONTXT_SUPABASE_URL=https://your-project.supabase.co\n * CONTXT_SUPABASE_ANON_KEY=your-anon-key\n */\n\n// These string literals are replaced at build time by tsup's esbuildOptions.define.\n// At runtime they fall back to process.env for local development.\nexport const SUPABASE_URL: string = process.env.CONTXT_SUPABASE_URL ?? '';\nexport const SUPABASE_ANON_KEY: string = process.env.CONTXT_SUPABASE_ANON_KEY ?? '';\n\nexport function getSupabaseConfig(): { url: string; anonKey: string } {\n if (!SUPABASE_URL || !SUPABASE_ANON_KEY) {\n throw new Error(\n 'Contxt is not configured for cloud sync.\\n' +\n 'If you installed via npm, please reinstall the latest version.\\n' +\n 'If building locally, set CONTXT_SUPABASE_URL and CONTXT_SUPABASE_ANON_KEY before running `pnpm build`.'\n );\n }\n return { url: SUPABASE_URL, anonKey: SUPABASE_ANON_KEY };\n}\n","/**\n * Sync Commands - Push/pull memory to/from cloud\n */\n\nimport { SQLiteDatabase } from '@mycontxt/adapters/sqlite';\nimport { SupabaseDatabase } from '@mycontxt/adapters/supabase';\nimport { SyncEngine } from '@mycontxt/core';\nimport { getDbPath } from '../utils/project.js';\nimport { getAccessToken } from './auth.js';\nimport { getSupabaseConfig } from '../config.js';\n\nexport const syncCommand = {\n /**\n * Push local changes to cloud\n */\n async push(options: { force?: boolean; dryRun?: boolean }) {\n try {\n // Check authentication\n const accessToken = getAccessToken();\n if (!accessToken) {\n console.error('❌ Not authenticated. Run `contxt auth login` first.');\n process.exit(1);\n }\n\n // Get local database\n const dbPath = getDbPath();\n const localDb = new SQLiteDatabase(dbPath);\n await localDb.initialize();\n\n try {\n // Get project\n const cwd = process.cwd();\n const project = await localDb.getProjectByPath(cwd);\n\n if (!project) {\n console.error('❌ No Contxt project found. Run `contxt init` first.');\n process.exit(1);\n }\n\n // Initialize remote database\n const supabaseConfig = getSupabaseConfig();\n const remoteDb = new SupabaseDatabase({\n ...supabaseConfig,\n accessToken,\n });\n await remoteDb.initialize();\n\n // Create sync engine\n const syncEngine = new SyncEngine(localDb, remoteDb);\n\n console.log('🔄 Pushing local changes to cloud...\\n');\n\n // Push changes\n const result = await syncEngine.push(project.id, {\n force: options.force,\n dryRun: options.dryRun,\n });\n\n if (result.errors.length > 0) {\n console.error('❌ Push failed:');\n result.errors.forEach((err) => console.error(` ${err}`));\n process.exit(1);\n }\n\n if (options.dryRun) {\n console.log(`📋 Dry run - would push ${result.pushed} entries`);\n } else {\n console.log(`✅ Successfully pushed ${result.pushed} entries`);\n }\n\n if (result.conflicts > 0) {\n console.log(\n `⚠️ ${result.conflicts} conflict(s) detected. Use --force to override.`\n );\n }\n\n await remoteDb.close();\n } finally {\n await localDb.close();\n }\n } catch (error) {\n console.error(\n '❌ Push failed:',\n error instanceof Error ? error.message : error\n );\n process.exit(1);\n }\n },\n\n /**\n * Pull remote changes to local\n */\n async pull(options: { force?: boolean; dryRun?: boolean }) {\n try {\n // Check authentication\n const accessToken = getAccessToken();\n if (!accessToken) {\n console.error('❌ Not authenticated. Run `contxt auth login` first.');\n process.exit(1);\n }\n\n // Get local database\n const dbPath = getDbPath();\n const localDb = new SQLiteDatabase(dbPath);\n await localDb.initialize();\n\n try {\n // Get project\n const cwd = process.cwd();\n const project = await localDb.getProjectByPath(cwd);\n\n if (!project) {\n console.error('❌ No Contxt project found. Run `contxt init` first.');\n process.exit(1);\n }\n\n // Initialize remote database\n const supabaseConfig = getSupabaseConfig();\n const remoteDb = new SupabaseDatabase({\n ...supabaseConfig,\n accessToken,\n });\n await remoteDb.initialize();\n\n // Create sync engine\n const syncEngine = new SyncEngine(localDb, remoteDb);\n\n console.log('🔄 Pulling remote changes to local...\\n');\n\n // Pull changes\n const result = await syncEngine.pull(project.id, {\n force: options.force,\n dryRun: options.dryRun,\n });\n\n if (result.errors.length > 0) {\n console.error('❌ Pull failed:');\n result.errors.forEach((err) => console.error(` ${err}`));\n process.exit(1);\n }\n\n if (options.dryRun) {\n console.log(`📋 Dry run - would pull ${result.pulled} entries`);\n } else {\n console.log(`✅ Successfully pulled ${result.pulled} entries`);\n }\n\n if (result.conflicts > 0) {\n console.log(\n `⚠️ ${result.conflicts} conflict(s) detected. Use --force to override.`\n );\n }\n\n await remoteDb.close();\n } finally {\n await localDb.close();\n }\n } catch (error) {\n console.error(\n '❌ Pull failed:',\n error instanceof Error ? error.message : error\n );\n process.exit(1);\n }\n },\n\n /**\n * Full bidirectional sync\n */\n async sync(options: { force?: boolean; dryRun?: boolean }) {\n try {\n // Check authentication\n const accessToken = getAccessToken();\n if (!accessToken) {\n console.error('❌ Not authenticated. Run `contxt auth login` first.');\n process.exit(1);\n }\n\n // Get local database\n const dbPath = getDbPath();\n const localDb = new SQLiteDatabase(dbPath);\n await localDb.initialize();\n\n try {\n // Get project\n const cwd = process.cwd();\n const project = await localDb.getProjectByPath(cwd);\n\n if (!project) {\n console.error('❌ No Contxt project found. Run `contxt init` first.');\n process.exit(1);\n }\n\n // Initialize remote database\n const supabaseConfig = getSupabaseConfig();\n const remoteDb = new SupabaseDatabase({\n ...supabaseConfig,\n accessToken,\n });\n await remoteDb.initialize();\n\n // Create sync engine\n const syncEngine = new SyncEngine(localDb, remoteDb);\n\n console.log('🔄 Syncing with cloud (pull + push)...\\n');\n\n // Full sync\n const result = await syncEngine.sync(project.id, {\n force: options.force,\n dryRun: options.dryRun,\n });\n\n if (result.errors.length > 0) {\n console.error('❌ Sync failed:');\n result.errors.forEach((err) => console.error(` ${err}`));\n process.exit(1);\n }\n\n if (options.dryRun) {\n console.log(\n `📋 Dry run - would pull ${result.pulled} and push ${result.pushed} entries`\n );\n } else {\n console.log(`✅ Successfully synced`);\n console.log(` Pulled: ${result.pulled} entries`);\n console.log(` Pushed: ${result.pushed} entries`);\n }\n\n if (result.conflicts > 0) {\n console.log(\n `⚠️ ${result.conflicts} conflict(s) detected. Use --force to override.`\n );\n }\n\n await remoteDb.close();\n } finally {\n await localDb.close();\n }\n } catch (error) {\n console.error(\n '❌ Sync failed:',\n error instanceof Error ? error.message : error\n );\n process.exit(1);\n }\n },\n};\n","/**\n * Branch Commands - Git-like branching for memory\n */\n\nimport { SQLiteDatabase } from '@mycontxt/adapters/sqlite';\nimport { getDbPath } from '../utils/project.js';\n\nexport const branchCommand = {\n /**\n * Create a new branch\n */\n async create(name: string, options: { from?: string }) {\n try {\n const dbPath = getDbPath();\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n try {\n const cwd = process.cwd();\n const project = await db.getProjectByPath(cwd);\n\n if (!project) {\n console.error('❌ No Contxt project found. Run `contxt init` first.');\n process.exit(1);\n }\n\n const fromBranch = options.from || (await db.getActiveBranch(project.id));\n\n await db.createBranch(project.id, name, fromBranch);\n\n console.log(`✅ Created branch '${name}' from '${fromBranch}'`);\n } finally {\n await db.close();\n }\n } catch (error) {\n console.error(\n '❌ Branch create failed:',\n error instanceof Error ? error.message : error\n );\n process.exit(1);\n }\n },\n\n /**\n * List all branches\n */\n async list() {\n try {\n const dbPath = getDbPath();\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n try {\n const cwd = process.cwd();\n const project = await db.getProjectByPath(cwd);\n\n if (!project) {\n console.error('❌ No Contxt project found. Run `contxt init` first.');\n process.exit(1);\n }\n\n const branches = await db.listBranches(project.id);\n const activeBranch = await db.getActiveBranch(project.id);\n\n console.log('Branches:');\n for (const branch of branches) {\n const prefix = branch.name === activeBranch ? '* ' : ' ';\n const parent = branch.parentBranch ? ` (from ${branch.parentBranch})` : '';\n console.log(`${prefix}${branch.name}${parent}`);\n }\n } finally {\n await db.close();\n }\n } catch (error) {\n console.error(\n '❌ Branch list failed:',\n error instanceof Error ? error.message : error\n );\n process.exit(1);\n }\n },\n\n /**\n * Switch to a different branch\n */\n async switch(name: string) {\n try {\n const dbPath = getDbPath();\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n try {\n const cwd = process.cwd();\n const project = await db.getProjectByPath(cwd);\n\n if (!project) {\n console.error('❌ No Contxt project found. Run `contxt init` first.');\n process.exit(1);\n }\n\n await db.switchBranch(project.id, name);\n\n console.log(`✅ Switched to branch '${name}'`);\n } finally {\n await db.close();\n }\n } catch (error) {\n console.error(\n '❌ Branch switch failed:',\n error instanceof Error ? error.message : error\n );\n process.exit(1);\n }\n },\n\n /**\n * Delete a branch\n */\n async delete(name: string) {\n try {\n const dbPath = getDbPath();\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n try {\n const cwd = process.cwd();\n const project = await db.getProjectByPath(cwd);\n\n if (!project) {\n console.error('❌ No Contxt project found. Run `contxt init` first.');\n process.exit(1);\n }\n\n const activeBranch = await db.getActiveBranch(project.id);\n\n if (name === activeBranch) {\n console.error('❌ Cannot delete active branch. Switch to another branch first.');\n process.exit(1);\n }\n\n if (name === 'main') {\n console.error('❌ Cannot delete main branch.');\n process.exit(1);\n }\n\n await db.deleteBranch(project.id, name);\n\n console.log(`✅ Deleted branch '${name}'`);\n } finally {\n await db.close();\n }\n } catch (error) {\n console.error(\n '❌ Branch delete failed:',\n error instanceof Error ? error.message : error\n );\n process.exit(1);\n }\n },\n\n /**\n * Merge a branch into current branch\n */\n async merge(sourceBranch: string) {\n try {\n const dbPath = getDbPath();\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n try {\n const cwd = process.cwd();\n const project = await db.getProjectByPath(cwd);\n\n if (!project) {\n console.error('❌ No Contxt project found. Run `contxt init` first.');\n process.exit(1);\n }\n\n const targetBranch = await db.getActiveBranch(project.id);\n\n if (sourceBranch === targetBranch) {\n console.error('❌ Cannot merge a branch into itself.');\n process.exit(1);\n }\n\n // Get entries from source branch\n const sourceEntries = await db.listEntries({\n projectId: project.id,\n branch: sourceBranch,\n isArchived: false,\n });\n\n if (sourceEntries.length === 0) {\n console.log(`No entries to merge from '${sourceBranch}'.`);\n process.exit(0);\n }\n\n // Copy entries to target branch (last-write-wins)\n let merged = 0;\n for (const entry of sourceEntries) {\n // Check if entry exists in target branch\n const existing = await db.getEntry(entry.id);\n\n if (!existing || existing.branch !== targetBranch) {\n // Create new entry in target branch\n await db.createEntry({\n id: entry.id,\n projectId: entry.projectId,\n type: entry.type,\n title: entry.title,\n content: entry.content,\n metadata: entry.metadata,\n branch: targetBranch,\n });\n merged++;\n } else if (entry.updatedAt > existing.updatedAt) {\n // Update existing entry if source is newer\n await db.updateEntry(entry.id, {\n title: entry.title,\n content: entry.content,\n metadata: entry.metadata,\n updatedAt: entry.updatedAt,\n });\n merged++;\n }\n }\n\n console.log(\n `✅ Merged ${merged} entries from '${sourceBranch}' into '${targetBranch}'`\n );\n } finally {\n await db.close();\n }\n } catch (error) {\n console.error(\n '❌ Branch merge failed:',\n error instanceof Error ? error.message : error\n );\n process.exit(1);\n }\n },\n};\n","/**\n * History Commands - Version history and time travel\n */\n\nimport { SQLiteDatabase } from '@mycontxt/adapters/sqlite';\nimport { getDbPath } from '../utils/project.js';\n\nexport const historyCommand = {\n /**\n * Show version history for an entry\n */\n async show(entryId: string) {\n try {\n const dbPath = getDbPath();\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n try {\n const entry = await db.getEntry(entryId);\n\n if (!entry) {\n console.error('❌ Entry not found.');\n process.exit(1);\n }\n\n const versions = await db.getVersionHistory(entryId);\n\n console.log(`📜 Version History: ${entry.title}\\n`);\n console.log(`Current (v${entry.version}):`);\n console.log(` Updated: ${entry.updatedAt.toLocaleString()}`);\n console.log(` Title: ${entry.title}`);\n console.log(` Content: ${entry.content.substring(0, 100)}${entry.content.length > 100 ? '...' : ''}\\n`);\n\n if (versions.length > 0) {\n console.log('Previous versions:');\n for (const version of versions) {\n console.log(`\\nv${version.version}:`);\n console.log(` Updated: ${version.updatedAt.toLocaleString()}`);\n console.log(` Title: ${version.title}`);\n console.log(\n ` Content: ${version.content.substring(0, 100)}${version.content.length > 100 ? '...' : ''}`\n );\n }\n } else {\n console.log('No previous versions.');\n }\n } finally {\n await db.close();\n }\n } catch (error) {\n console.error(\n '❌ History failed:',\n error instanceof Error ? error.message : error\n );\n process.exit(1);\n }\n },\n\n /**\n * Restore an entry to a previous version\n */\n async restore(entryId: string, options: { version: number }) {\n try {\n const dbPath = getDbPath();\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n try {\n const restored = await db.restoreVersion(entryId, options.version);\n\n console.log(`✅ Restored '${restored.title}' to version ${options.version}`);\n console.log(` Current version is now: v${restored.version}`);\n } finally {\n await db.close();\n }\n } catch (error) {\n console.error(\n '❌ Restore failed:',\n error instanceof Error ? error.message : error\n );\n process.exit(1);\n }\n },\n};\n","/**\n * Load Command - Generate context payload for AI prompts\n */\n\nimport { SQLiteDatabase } from '@mycontxt/adapters/sqlite';\nimport { buildContextPayload, buildContextSummary } from '@mycontxt/core';\nimport { getDbPath } from '../utils/project.js';\n\ninterface LoadOptions {\n task?: string;\n files?: string[];\n all?: boolean;\n maxTokens?: number;\n type?: string;\n summary?: boolean;\n}\n\nexport async function loadCommand(options: LoadOptions) {\n try {\n const dbPath = getDbPath();\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n try {\n const cwd = process.cwd();\n const project = await db.getProjectByPath(cwd);\n\n if (!project) {\n console.error('❌ No Contxt project found. Run `contxt init` first.');\n process.exit(1);\n }\n\n // Get active branch\n const branch = await db.getActiveBranch(project.id);\n\n // Fetch all non-archived entries for current branch\n const entries = await db.listEntries({\n projectId: project.id,\n branch,\n isArchived: false,\n });\n\n if (entries.length === 0) {\n console.log('No memory entries found. Add some context first!');\n process.exit(0);\n }\n\n // Summary mode\n if (options.summary) {\n const summary = buildContextSummary(entries);\n\n console.log(`📊 Context Summary\\n`);\n console.log(`Total entries: ${summary.totalEntries}`);\n console.log(`Branch: ${branch}\\n`);\n\n console.log('By type:');\n for (const [type, count] of Object.entries(summary.byType)) {\n console.log(` ${type}: ${count}`);\n }\n\n if (summary.recentActivity.length > 0) {\n console.log(`\\nRecent activity:`);\n summary.recentActivity.forEach((activity) => {\n console.log(` • ${activity}`);\n });\n }\n\n if (summary.oldestEntry && summary.newestEntry) {\n console.log(\n `\\nDate range: ${summary.oldestEntry.toLocaleDateString()} - ${summary.newestEntry.toLocaleDateString()}`\n );\n }\n\n process.exit(0);\n }\n\n // Determine context mode\n let mode: 'task' | 'files' | 'all' = 'all';\n if (options.task) {\n mode = 'task';\n } else if (options.files && options.files.length > 0) {\n mode = 'files';\n } else if (options.all) {\n mode = 'all';\n }\n\n // Build context\n const result = buildContextPayload(entries, {\n projectId: project.id,\n type: mode,\n taskDescription: options.task,\n activeFiles: options.files,\n maxTokens: options.maxTokens || 4000,\n includeTypes: options.type ? [options.type] : undefined,\n });\n\n // Output context\n console.log(result.context);\n\n // Print stats to stderr so they don't pollute the context\n console.error(\n `\\n📦 Context: ${result.entriesIncluded} entries, ${result.tokensUsed}/${result.budget} tokens`\n );\n } finally {\n await db.close();\n }\n } catch (error) {\n console.error(\n '❌ Load failed:',\n error instanceof Error ? error.message : error\n );\n process.exit(1);\n }\n}\n","/**\n * Scan command - Extract tagged comments from code\n */\n\nimport { readFileSync, existsSync } from 'fs';\nimport { join, relative } from 'path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { parseFile, scanCommentToEntry, type ScanComment } from '@mycontxt/core';\nimport { getProjectDb } from '../utils/project.js';\nimport { glob } from 'glob';\n\ninterface ScanOptions {\n path?: string;\n dryRun?: boolean;\n autoConfirm?: boolean;\n watch?: boolean;\n}\n\nexport async function scanCommand(options: ScanOptions = {}) {\n const spinner = ora('Scanning project...').start();\n\n try {\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n\n if (!project) {\n spinner.fail('Not a Contxt project. Run `contxt init` first.');\n return;\n }\n\n // File patterns to scan\n const patterns = [\n '**/*.ts',\n '**/*.tsx',\n '**/*.js',\n '**/*.jsx',\n '**/*.py',\n '**/*.rb',\n '**/*.go',\n '**/*.rs',\n '**/*.sql',\n '**/*.sh',\n ];\n\n // Ignore patterns\n const ignore = [\n '**/node_modules/**',\n '**/.git/**',\n '**/dist/**',\n '**/build/**',\n '**/.next/**',\n '**/*.min.js',\n '**/*.lock',\n '.contxt/**',\n ];\n\n // Add .contxtignore patterns if file exists\n const contxtIgnorePath = join(process.cwd(), '.contxtignore');\n if (existsSync(contxtIgnorePath)) {\n const contxtIgnore = readFileSync(contxtIgnorePath, 'utf-8')\n .split('\\n')\n .filter((line) => line.trim() && !line.startsWith('#'));\n ignore.push(...contxtIgnore);\n }\n\n // Get files to scan\n const searchPath = options.path || process.cwd();\n const files = await glob(patterns, {\n cwd: searchPath,\n ignore,\n absolute: true,\n nodir: true,\n });\n\n spinner.text = `Scanning ${files.length} files...`;\n\n // Parse all files\n const allComments: ScanComment[] = [];\n for (const file of files) {\n const content = readFileSync(file, 'utf-8');\n const comments = parseFile(content, relative(process.cwd(), file));\n allComments.push(...comments);\n }\n\n spinner.succeed(`Found ${allComments.length} tagged comments across ${files.length} files`);\n\n if (allComments.length === 0) {\n console.log(chalk.gray('\\nNo tagged comments found. Try adding @decision, @pattern, or @context tags to your code.'));\n return;\n }\n\n // Load existing scanned entries to detect changes\n const existingEntries = await db.listEntries({\n projectId: project.id,\n branch: await db.getActiveBranch(project.id),\n });\n\n const existingHashes = new Map(\n existingEntries\n .filter((e) => e.metadata.source === 'scan' && e.metadata.hash)\n .map((e) => [e.metadata.hash, e])\n );\n\n // Categorize comments\n const newComments: ScanComment[] = [];\n const updatedComments: ScanComment[] = [];\n const unchangedComments: ScanComment[] = [];\n\n for (const comment of allComments) {\n const existing = existingHashes.get(comment.hash);\n if (!existing) {\n newComments.push(comment);\n } else {\n // Check if content actually changed\n const entry = scanCommentToEntry(comment, project.id);\n if (\n existing.title !== entry.title ||\n existing.content !== entry.content\n ) {\n updatedComments.push(comment);\n } else {\n unchangedComments.push(comment);\n }\n existingHashes.delete(comment.hash); // Mark as still present\n }\n }\n\n // Remaining hashes are stale (source removed)\n const staleEntries = Array.from(existingHashes.values());\n\n // Display results\n console.log('');\n if (newComments.length > 0) {\n console.log(chalk.bold('NEW'));\n for (const comment of newComments) {\n const icon = getTypeIcon(comment.tag);\n console.log(\n ` ${chalk.green('+')} ${icon} ${chalk.bold(comment.title.substring(0, 50))} ${chalk.gray(comment.file + ':' + comment.line)}`\n );\n }\n console.log('');\n }\n\n if (updatedComments.length > 0) {\n console.log(chalk.bold('UPDATED'));\n for (const comment of updatedComments) {\n const icon = getTypeIcon(comment.tag);\n console.log(\n ` ${chalk.yellow('~')} ${icon} ${chalk.bold(comment.title.substring(0, 50))} ${chalk.gray(comment.file + ':' + comment.line)}`\n );\n }\n console.log('');\n }\n\n if (unchangedComments.length > 0) {\n console.log(chalk.bold('UNCHANGED'));\n for (const comment of unchangedComments.slice(0, 3)) {\n const icon = getTypeIcon(comment.tag);\n console.log(\n ` ${chalk.gray('·')} ${icon} ${chalk.gray(comment.title.substring(0, 50))} ${chalk.gray(comment.file + ':' + comment.line)}`\n );\n }\n if (unchangedComments.length > 3) {\n console.log(chalk.gray(` ... and ${unchangedComments.length - 3} more`));\n }\n console.log('');\n }\n\n if (staleEntries.length > 0) {\n console.log(chalk.bold('STALE (source comment removed)'));\n for (const entry of staleEntries) {\n const icon = getTypeIcon(entry.type);\n console.log(\n ` ${chalk.red('?')} ${icon} ${chalk.gray(entry.title.substring(0, 50))} ${chalk.gray('was: ' + entry.metadata.file + ':' + entry.metadata.line)}`\n );\n }\n console.log('');\n }\n\n // Handle dry run\n if (options.dryRun) {\n console.log(chalk.yellow('Dry run - no changes saved.'));\n return;\n }\n\n // Save new and updated entries as drafts\n const toSave = [...newComments, ...updatedComments];\n if (toSave.length > 0) {\n const saveSpinner = ora('Saving entries...').start();\n\n for (const comment of toSave) {\n const entry = scanCommentToEntry(comment, project.id);\n const existing = existingHashes.get(comment.hash);\n\n if (existing) {\n // Update existing\n await db.updateEntry(existing.id, {\n title: entry.title,\n content: entry.content,\n metadata: entry.metadata,\n });\n } else {\n // Create new as draft\n await db.createEntry({\n projectId: project.id,\n type: entry.type,\n title: entry.title,\n content: entry.content,\n metadata: entry.metadata,\n status: options.autoConfirm ? 'active' : 'draft',\n });\n }\n }\n\n saveSpinner.succeed(\n options.autoConfirm\n ? `Saved ${toSave.length} entries.`\n : `${toSave.length} new entries saved as drafts.`\n );\n }\n\n // Mark stale entries\n if (staleEntries.length > 0) {\n for (const entry of staleEntries) {\n await db.updateEntry(entry.id, { status: 'stale' });\n }\n console.log(chalk.gray(`Marked ${staleEntries.length} entries as stale.`));\n }\n\n // Show next steps\n if (!options.autoConfirm && toSave.length > 0) {\n console.log('');\n console.log(chalk.cyan(`Run ${chalk.bold('contxt review')} to confirm drafts.`));\n }\n\n await db.close();\n } catch (error) {\n spinner.fail('Scan failed');\n console.error(chalk.red(error instanceof Error ? error.message : String(error)));\n process.exit(1);\n }\n}\n\nfunction getTypeIcon(type: string): string {\n const icons: Record<string, string> = {\n decision: chalk.blue('DECISION'),\n pattern: chalk.magenta('PATTERN'),\n context: chalk.green('CONTEXT'),\n };\n return icons[type] || type.toUpperCase();\n}\n","/**\n * Review command - Interactive draft review queue\n */\n\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { getProjectDb } from '../utils/project.js';\nimport type { MemoryEntry } from '@mycontxt/core';\n\ninterface ReviewOptions {\n source?: string;\n confirmAll?: boolean;\n discardAll?: boolean;\n count?: boolean;\n}\n\nexport async function reviewCommand(options: ReviewOptions = {}) {\n try {\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n\n if (!project) {\n console.log(chalk.red('Not a Contxt project. Run `contxt init` first.'));\n return;\n }\n\n // Get all draft entries\n let drafts = await db.listEntries({\n projectId: project.id,\n branch: await db.getActiveBranch(project.id),\n });\n\n drafts = drafts.filter((e) => e.status === 'draft');\n\n // Filter by source if specified\n if (options.source) {\n drafts = drafts.filter((e) => {\n const source = e.metadata.source || '';\n return source.includes(options.source!);\n });\n }\n\n if (drafts.length === 0) {\n console.log(chalk.green('✓ No drafts pending review'));\n return;\n }\n\n // Show count only\n if (options.count) {\n console.log(`${drafts.length} drafts pending review`);\n return;\n }\n\n console.log(chalk.bold(`\\n${drafts.length} drafts pending review\\n`));\n\n // Confirm all\n if (options.confirmAll) {\n const spinner = ora('Confirming all drafts...').start();\n for (const draft of drafts) {\n await db.updateEntry(draft.id, { status: 'active' });\n }\n spinner.succeed(`Confirmed ${drafts.length} drafts`);\n await db.close();\n return;\n }\n\n // Discard all\n if (options.discardAll) {\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: `Discard all ${drafts.length} drafts?`,\n default: false,\n },\n ]);\n\n if (confirm) {\n const spinner = ora('Discarding all drafts...').start();\n for (const draft of drafts) {\n await db.deleteEntry(draft.id);\n }\n spinner.succeed(`Discarded ${drafts.length} drafts`);\n }\n await db.close();\n return;\n }\n\n // Interactive review\n let confirmed = 0;\n let discarded = 0;\n let skipped = 0;\n\n for (const draft of drafts) {\n console.log(chalk.gray('─'.repeat(50)));\n console.log('');\n displayDraft(draft);\n console.log('');\n\n const { action } = await inquirer.prompt([\n {\n type: 'list',\n name: 'action',\n message: 'Action?',\n choices: [\n { name: 'Confirm', value: 'confirm' },\n { name: 'Edit then confirm', value: 'edit' },\n { name: 'Discard', value: 'discard' },\n { name: 'Skip (review later)', value: 'skip' },\n ],\n },\n ]);\n\n if (action === 'confirm') {\n await db.updateEntry(draft.id, { status: 'active' });\n console.log(chalk.green('✓ Confirmed'));\n confirmed++;\n } else if (action === 'edit') {\n const edited = await editDraft(draft);\n await db.updateEntry(draft.id, {\n title: edited.title,\n content: edited.content,\n metadata: edited.metadata,\n status: 'active',\n });\n console.log(chalk.green('✓ Edited and confirmed'));\n confirmed++;\n } else if (action === 'discard') {\n await db.deleteEntry(draft.id);\n console.log(chalk.red('✗ Discarded'));\n discarded++;\n } else {\n console.log(chalk.gray('○ Skipped'));\n skipped++;\n }\n\n console.log('');\n }\n\n console.log(chalk.gray('─'.repeat(50)));\n console.log('');\n console.log(chalk.bold('Review complete'));\n console.log(` ${chalk.green(confirmed)} confirmed`);\n console.log(` ${chalk.red(discarded)} discarded`);\n console.log(` ${chalk.gray(skipped)} skipped`);\n console.log('');\n\n await db.close();\n } catch (error) {\n console.error(chalk.red(error instanceof Error ? error.message : String(error)));\n process.exit(1);\n }\n}\n\nfunction displayDraft(draft: MemoryEntry) {\n const icon = getTypeIcon(draft.type);\n const source = draft.metadata.source || 'unknown';\n const file = draft.metadata.file ? ` · ${draft.metadata.file}:${draft.metadata.line}` : '';\n const timeAgo = getTimeAgo(draft.createdAt);\n\n console.log(` ${icon} ${chalk.bold(draft.title)}`);\n console.log(` ${chalk.gray(`Source: ${source}${file} · ${timeAgo}`)}`);\n\n // Show content preview\n const contentPreview = draft.content.split('\\n')[0].substring(0, 80);\n if (contentPreview) {\n console.log(` ${chalk.gray(contentPreview)}${draft.content.length > 80 ? '...' : ''}`);\n }\n\n // Show additional metadata\n if (draft.type === 'decision') {\n if (draft.metadata.rationale) {\n console.log(` ${chalk.dim('Rationale:')} ${draft.metadata.rationale.substring(0, 60)}...`);\n }\n if (draft.metadata.alternatives) {\n console.log(` ${chalk.dim('Alternatives:')} ${draft.metadata.alternatives}`);\n }\n }\n\n if (draft.type === 'pattern') {\n if (draft.metadata.when) {\n console.log(` ${chalk.dim('When:')} ${draft.metadata.when}`);\n }\n }\n}\n\nasync function editDraft(draft: MemoryEntry): Promise<Partial<MemoryEntry>> {\n console.log(chalk.cyan('\\nEdit mode (press Enter to keep current value):\\n'));\n\n const { title, content } = await inquirer.prompt([\n {\n type: 'input',\n name: 'title',\n message: 'Title:',\n default: draft.title,\n },\n {\n type: 'input',\n name: 'content',\n message: 'Content:',\n default: draft.content,\n },\n ]);\n\n return {\n title: title || draft.title,\n content: content || draft.content,\n metadata: draft.metadata,\n };\n}\n\nfunction getTypeIcon(type: string): string {\n const icons: Record<string, string> = {\n decision: chalk.blue('DECISION'),\n pattern: chalk.magenta('PATTERN'),\n context: chalk.green('CONTEXT'),\n document: chalk.yellow('DOCUMENT'),\n session: chalk.cyan('SESSION'),\n };\n return icons[type] || type.toUpperCase();\n}\n\nfunction getTimeAgo(date: Date): string {\n const seconds = Math.floor((Date.now() - date.getTime()) / 1000);\n\n if (seconds < 60) return 'just now';\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;\n if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`;\n return `${Math.floor(seconds / 86400)}d ago`;\n}\n","/**\n * Rules command - Bidirectional sync with .contxt/rules.md\n */\n\nimport { readFileSync, writeFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { parseRulesFile, generateRulesFile } from '@mycontxt/core';\nimport { getProjectDb } from '../utils/project.js';\nimport type { MemoryEntry } from '@mycontxt/core';\n\ninterface RulesOptions {\n force?: boolean;\n dryRun?: boolean;\n}\n\n/**\n * Sync rules.md into memory store\n */\nexport async function syncCommand(options: RulesOptions = {}) {\n const spinner = ora('Reading rules.md...').start();\n\n try {\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n\n if (!project) {\n spinner.fail('Not a Contxt project. Run `contxt init` first.');\n return;\n }\n\n const rulesPath = join(process.cwd(), '.contxt', 'rules.md');\n if (!existsSync(rulesPath)) {\n spinner.fail('No rules.md file found. Run `contxt rules generate` to create one.');\n return;\n }\n\n const content = readFileSync(rulesPath, 'utf-8');\n const parsed = parseRulesFile(content);\n\n spinner.text = 'Processing entries...';\n\n let added = 0;\n let updated = 0;\n let unchanged = 0;\n\n // Get existing entries\n const existingEntries = await db.listEntries({\n projectId: project.id,\n branch: await db.getActiveBranch(project.id),\n });\n\n const existingByTitle = new Map(\n existingEntries.map((e) => [e.title, e])\n );\n\n // Process decisions\n for (const decision of parsed.decisions) {\n const existing = existingByTitle.get(decision.title);\n\n if (!existing) {\n if (!options.dryRun) {\n await db.createEntry({\n projectId: project.id,\n type: 'decision',\n title: decision.title,\n content: decision.content,\n metadata: decision.metadata,\n status: 'active',\n });\n }\n added++;\n } else if (existing.content !== decision.content) {\n if (!options.dryRun) {\n await db.updateEntry(existing.id, {\n content: decision.content,\n metadata: decision.metadata,\n });\n }\n updated++;\n } else {\n unchanged++;\n }\n }\n\n // Process patterns\n for (const pattern of parsed.patterns) {\n const existing = existingByTitle.get(pattern.title);\n\n if (!existing) {\n if (!options.dryRun) {\n await db.createEntry({\n projectId: project.id,\n type: 'pattern',\n title: pattern.title,\n content: pattern.content,\n metadata: pattern.metadata,\n status: 'active',\n });\n }\n added++;\n } else if (existing.content !== pattern.content) {\n if (!options.dryRun) {\n await db.updateEntry(existing.id, {\n content: pattern.content,\n metadata: pattern.metadata,\n });\n }\n updated++;\n } else {\n unchanged++;\n }\n }\n\n // Process context\n if (parsed.context) {\n const existing = existingEntries.find((e) => e.type === 'context' && e.metadata.source === 'rules');\n\n if (!existing) {\n if (!options.dryRun) {\n await db.createEntry({\n projectId: project.id,\n type: 'context',\n title: parsed.context.title,\n content: parsed.context.content,\n metadata: parsed.context.metadata,\n status: 'active',\n });\n }\n added++;\n } else if (existing.content !== parsed.context.content) {\n if (!options.dryRun) {\n await db.updateEntry(existing.id, {\n content: parsed.context.content,\n });\n }\n updated++;\n } else {\n unchanged++;\n }\n }\n\n // Process documents\n for (const doc of parsed.documents) {\n const existing = existingByTitle.get(doc.title);\n\n if (!existing) {\n if (!options.dryRun) {\n await db.createEntry({\n projectId: project.id,\n type: 'document',\n title: doc.title,\n content: doc.content,\n metadata: doc.metadata,\n status: 'active',\n });\n }\n added++;\n } else if (existing.content !== doc.content) {\n if (!options.dryRun) {\n await db.updateEntry(existing.id, {\n content: doc.content,\n metadata: doc.metadata,\n });\n }\n updated++;\n } else {\n unchanged++;\n }\n }\n\n // Update stack in project config\n if (parsed.stack.length > 0 && !options.dryRun) {\n // Store stack in project metadata\n await db.updateProject(project.id, {\n stack: parsed.stack,\n });\n }\n\n spinner.succeed(\n options.dryRun\n ? `Dry run: Would add ${added}, update ${updated}, leave ${unchanged} unchanged`\n : `Synced rules.md: ${added} added, ${updated} updated, ${unchanged} unchanged`\n );\n\n await db.close();\n } catch (error) {\n spinner.fail('Sync failed');\n console.error(chalk.red(error instanceof Error ? error.message : String(error)));\n process.exit(1);\n }\n}\n\n/**\n * Generate rules.md from memory store\n */\nexport async function generateCommand(options: RulesOptions = {}) {\n const spinner = ora('Loading memory entries...').start();\n\n try {\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n\n if (!project) {\n spinner.fail('Not a Contxt project. Run `contxt init` first.');\n return;\n }\n\n const rulesPath = join(process.cwd(), '.contxt', 'rules.md');\n\n if (existsSync(rulesPath) && !options.force) {\n spinner.fail('rules.md already exists. Use --force to overwrite.');\n return;\n }\n\n const branch = await db.getActiveBranch(project.id);\n const allEntries = await db.listEntries({\n projectId: project.id,\n branch,\n });\n\n // Group entries by type\n const decisions = allEntries.filter((e) => e.type === 'decision' && e.status === 'active');\n const patterns = allEntries.filter((e) => e.type === 'pattern' && e.status === 'active');\n const context = allEntries.filter((e) => e.type === 'context' && e.status === 'active');\n const documents = allEntries.filter((e) => e.type === 'document' && e.status === 'active');\n\n spinner.text = 'Generating rules.md...';\n\n const rulesContent = generateRulesFile({\n stack: project.stack || [],\n decisions: decisions.map((d) => ({\n title: d.title,\n content: d.content,\n metadata: d.metadata,\n })),\n patterns: patterns.map((p) => ({\n title: p.title,\n content: p.content,\n metadata: p.metadata,\n })),\n context: context.map((c) => ({\n content: c.content,\n })),\n documents: documents.map((d) => ({\n title: d.title,\n content: d.content,\n })),\n });\n\n if (options.dryRun) {\n spinner.succeed('Generated rules.md (dry run):');\n console.log('');\n console.log(chalk.gray(rulesContent));\n } else {\n writeFileSync(rulesPath, rulesContent, 'utf-8');\n spinner.succeed(`Generated ${rulesPath}`);\n }\n\n await db.close();\n } catch (error) {\n spinner.fail('Generate failed');\n console.error(chalk.red(error instanceof Error ? error.message : String(error)));\n process.exit(1);\n }\n}\n\n/**\n * Show diff between rules.md and memory store\n */\nexport async function diffCommand() {\n const spinner = ora('Comparing rules.md with memory...').start();\n\n try {\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n\n if (!project) {\n spinner.fail('Not a Contxt project. Run `contxt init` first.');\n return;\n }\n\n const rulesPath = join(process.cwd(), '.contxt', 'rules.md');\n if (!existsSync(rulesPath)) {\n spinner.fail('No rules.md file found.');\n return;\n }\n\n // Parse rules.md\n const content = readFileSync(rulesPath, 'utf-8');\n const parsed = parseRulesFile(content);\n\n // Get memory entries\n const branch = await db.getActiveBranch(project.id);\n const allEntries = await db.listEntries({\n projectId: project.id,\n branch,\n });\n\n const existingByTitle = new Map<string, MemoryEntry>(\n allEntries.map((e) => [e.title, e])\n );\n\n spinner.stop();\n\n // Compare\n const toAdd: string[] = [];\n const toUpdate: string[] = [];\n const inSync: string[] = [];\n\n // Check decisions\n for (const decision of parsed.decisions) {\n const existing = existingByTitle.get(decision.title);\n if (!existing) {\n toAdd.push(`${chalk.blue('DECISION')} ${decision.title}`);\n } else if (existing.content !== decision.content) {\n toUpdate.push(`${chalk.blue('DECISION')} ${decision.title}`);\n } else {\n inSync.push(`${chalk.blue('DECISION')} ${decision.title}`);\n }\n }\n\n // Check patterns\n for (const pattern of parsed.patterns) {\n const existing = existingByTitle.get(pattern.title);\n if (!existing) {\n toAdd.push(`${chalk.magenta('PATTERN')} ${pattern.title}`);\n } else if (existing.content !== pattern.content) {\n toUpdate.push(`${chalk.magenta('PATTERN')} ${pattern.title}`);\n } else {\n inSync.push(`${chalk.magenta('PATTERN')} ${pattern.title}`);\n }\n }\n\n // Check documents\n for (const doc of parsed.documents) {\n const existing = existingByTitle.get(doc.title);\n if (!existing) {\n toAdd.push(`${chalk.cyan('DOCUMENT')} ${doc.title}`);\n } else if (existing.content !== doc.content) {\n toUpdate.push(`${chalk.cyan('DOCUMENT')} ${doc.title}`);\n } else {\n inSync.push(`${chalk.cyan('DOCUMENT')} ${doc.title}`);\n }\n }\n\n // Display results\n console.log('');\n if (toAdd.length > 0) {\n console.log(chalk.bold('TO ADD (in rules.md, not in memory):'));\n for (const item of toAdd) {\n console.log(` ${chalk.green('+')} ${item}`);\n }\n console.log('');\n }\n\n if (toUpdate.length > 0) {\n console.log(chalk.bold('TO UPDATE (content differs):'));\n for (const item of toUpdate) {\n console.log(` ${chalk.yellow('~')} ${item}`);\n }\n console.log('');\n }\n\n if (inSync.length > 0) {\n console.log(chalk.bold('IN SYNC:'));\n for (const item of inSync.slice(0, 5)) {\n console.log(` ${chalk.gray('·')} ${chalk.gray(item)}`);\n }\n if (inSync.length > 5) {\n console.log(chalk.gray(` ... and ${inSync.length - 5} more`));\n }\n console.log('');\n }\n\n if (toAdd.length > 0 || toUpdate.length > 0) {\n console.log(chalk.cyan(`Run ${chalk.bold('contxt rules sync')} to apply changes.`));\n } else {\n console.log(chalk.green('✓ Everything in sync!'));\n }\n\n await db.close();\n } catch (error) {\n spinner.fail('Diff failed');\n console.error(chalk.red(error instanceof Error ? error.message : String(error)));\n process.exit(1);\n }\n}\n\nexport const rulesCommand = {\n sync: syncCommand,\n generate: generateCommand,\n diff: diffCommand,\n};\n","/**\n * Capture command - Extract context from existing project files\n */\n\nimport { readFileSync, existsSync, readdirSync, statSync } from 'fs';\nimport { join, basename } from 'path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { getProjectDb } from '../utils/project.js';\nimport type { MemoryEntryType, CreateEntryInput } from '@mycontxt/core';\n\ninterface CaptureOptions {\n source?: 'readme' | 'cursor' | 'claude' | 'adr' | 'commits' | 'package' | 'all';\n dryRun?: boolean;\n autoConfirm?: boolean;\n limit?: number;\n}\n\ninterface CapturedEntry {\n type: MemoryEntryType;\n title: string;\n content: string;\n metadata: Record<string, any>;\n source: string;\n}\n\nexport async function captureCommand(options: CaptureOptions = {}) {\n const spinner = ora('Scanning project files...').start();\n\n try {\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n\n if (!project) {\n spinner.fail('Not a Contxt project. Run `contxt init` first.');\n return;\n }\n\n const entries: CapturedEntry[] = [];\n\n // Determine which sources to import\n const sources = options.source === 'all' || !options.source\n ? ['readme', 'cursor', 'claude', 'adr', 'commits', 'package']\n : [options.source];\n\n // Import from each source\n for (const source of sources) {\n spinner.text = `Importing from ${source}...`;\n\n switch (source) {\n case 'readme':\n entries.push(...importReadme());\n break;\n case 'cursor':\n entries.push(...importCursor());\n break;\n case 'claude':\n entries.push(...importClaude());\n break;\n case 'adr':\n entries.push(...importADR());\n break;\n case 'commits':\n entries.push(...importCommits(options.limit || 50));\n break;\n case 'package':\n entries.push(...importPackageFiles());\n break;\n }\n }\n\n spinner.succeed(`Found ${entries.length} entries across ${sources.length} source(s)`);\n\n if (entries.length === 0) {\n console.log(chalk.gray('\\\\nNo entries found to import.'));\n return;\n }\n\n // Display found entries\n console.log('');\n const grouped = groupBy(entries, 'source');\n for (const [source, items] of Object.entries(grouped)) {\n console.log(chalk.bold(`${source.toUpperCase()} (${items.length})`));\n for (const item of items.slice(0, 3)) {\n const icon = getTypeIcon(item.type);\n console.log(` ${icon} ${chalk.bold(item.title.substring(0, 60))}`);\n }\n if (items.length > 3) {\n console.log(chalk.gray(` ... and ${items.length - 3} more`));\n }\n console.log('');\n }\n\n // Handle dry run\n if (options.dryRun) {\n console.log(chalk.yellow('Dry run - no entries saved.'));\n return;\n }\n\n // Save entries\n const saveSpinner = ora('Saving entries...').start();\n let saved = 0;\n\n for (const entry of entries) {\n await db.createEntry({\n projectId: project.id,\n type: entry.type,\n title: entry.title,\n content: entry.content,\n metadata: {\n ...entry.metadata,\n source: `import:${entry.source}`,\n },\n status: options.autoConfirm ? 'active' : 'draft',\n });\n saved++;\n }\n\n saveSpinner.succeed(\n options.autoConfirm\n ? `Saved ${saved} entries.`\n : `${saved} entries saved as drafts.`\n );\n\n if (!options.autoConfirm) {\n console.log('');\n console.log(chalk.cyan(`Run ${chalk.bold('contxt review')} to confirm drafts.`));\n }\n\n await db.close();\n } catch (error) {\n spinner.fail('Import failed');\n console.error(chalk.red(error instanceof Error ? error.message : String(error)));\n process.exit(1);\n }\n}\n\n/**\n * Import from README.md\n */\nfunction importReadme(): CapturedEntry[] {\n const readmePath = join(process.cwd(), 'README.md');\n if (!existsSync(readmePath)) return [];\n\n try {\n const content = readFileSync(readmePath, 'utf-8');\n const lines = content.split('\\\\n');\n\n const entries: CapturedEntry[] = [];\n let currentSection: string | null = null;\n let currentContent: string[] = [];\n\n for (const line of lines) {\n // Check for headings\n const headingMatch = line.match(/^#+\\\\s+(.+)/);\n if (headingMatch) {\n // Save previous section\n if (currentSection && currentContent.length > 0) {\n const sectionContent = currentContent.join('\\\\n').trim();\n if (sectionContent.length > 50) {\n entries.push({\n type: 'document',\n title: `README: ${currentSection}`,\n content: sectionContent,\n metadata: { section: currentSection },\n source: 'readme',\n });\n }\n }\n\n currentSection = headingMatch[1].trim();\n currentContent = [];\n continue;\n }\n\n if (currentSection) {\n currentContent.push(line);\n }\n }\n\n // Save last section\n if (currentSection && currentContent.length > 0) {\n const sectionContent = currentContent.join('\\\\n').trim();\n if (sectionContent.length > 50) {\n entries.push({\n type: 'document',\n title: `README: ${currentSection}`,\n content: sectionContent,\n metadata: { section: currentSection },\n source: 'readme',\n });\n }\n }\n\n return entries;\n } catch {\n return [];\n }\n}\n\n/**\n * Import from Cursor rules files\n */\nfunction importCursor(): CapturedEntry[] {\n const entries: CapturedEntry[] = [];\n\n // Check .cursorrules\n const cursorrulesPath = join(process.cwd(), '.cursorrules');\n if (existsSync(cursorrulesPath)) {\n try {\n const content = readFileSync(cursorrulesPath, 'utf-8').trim();\n if (content.length > 0) {\n entries.push({\n type: 'document',\n title: 'Cursor Rules',\n content,\n metadata: { file: '.cursorrules' },\n source: 'cursor',\n });\n }\n } catch {\n // Ignore errors\n }\n }\n\n // Check .cursor/rules\n const cursorRulesPath = join(process.cwd(), '.cursor', 'rules');\n if (existsSync(cursorRulesPath)) {\n try {\n const content = readFileSync(cursorRulesPath, 'utf-8').trim();\n if (content.length > 0) {\n entries.push({\n type: 'document',\n title: 'Cursor Rules',\n content,\n metadata: { file: '.cursor/rules' },\n source: 'cursor',\n });\n }\n } catch {\n // Ignore errors\n }\n }\n\n return entries;\n}\n\n/**\n * Import from Claude files\n */\nfunction importClaude(): CapturedEntry[] {\n const entries: CapturedEntry[] = [];\n\n const claudePath = join(process.cwd(), '.claude', 'CLAUDE.md');\n if (existsSync(claudePath)) {\n try {\n const content = readFileSync(claudePath, 'utf-8');\n const lines = content.split('\\\\n');\n\n let currentSection: string | null = null;\n let currentContent: string[] = [];\n\n for (const line of lines) {\n const headingMatch = line.match(/^#+\\\\s+(.+)/);\n if (headingMatch) {\n // Save previous section\n if (currentSection && currentContent.length > 0) {\n const sectionContent = currentContent.join('\\\\n').trim();\n if (sectionContent.length > 50) {\n entries.push({\n type: 'document',\n title: `Claude: ${currentSection}`,\n content: sectionContent,\n metadata: { section: currentSection },\n source: 'claude',\n });\n }\n }\n\n currentSection = headingMatch[1].trim();\n currentContent = [];\n continue;\n }\n\n if (currentSection) {\n currentContent.push(line);\n }\n }\n\n // Save last section\n if (currentSection && currentContent.length > 0) {\n const sectionContent = currentContent.join('\\\\n').trim();\n if (sectionContent.length > 50) {\n entries.push({\n type: 'document',\n title: `Claude: ${currentSection}`,\n content: sectionContent,\n metadata: { section: currentSection },\n source: 'claude',\n });\n }\n }\n } catch {\n // Ignore errors\n }\n }\n\n return entries;\n}\n\n/**\n * Import from Architecture Decision Records\n */\nfunction importADR(): CapturedEntry[] {\n const entries: CapturedEntry[] = [];\n\n const adrDirs = [\n join(process.cwd(), 'docs', 'adr'),\n join(process.cwd(), 'docs', 'architecture'),\n join(process.cwd(), 'adr'),\n ];\n\n for (const adrDir of adrDirs) {\n if (!existsSync(adrDir)) continue;\n\n try {\n const files = readdirSync(adrDir)\n .filter((f) => f.endsWith('.md'))\n .map((f) => join(adrDir, f));\n\n for (const file of files) {\n try {\n const content = readFileSync(file, 'utf-8');\n const title = extractADRTitle(content, basename(file, '.md'));\n\n entries.push({\n type: 'decision',\n title,\n content: content.trim(),\n metadata: { file: file.replace(process.cwd(), '.') },\n source: 'adr',\n });\n } catch {\n // Ignore individual file errors\n }\n }\n } catch {\n // Ignore directory errors\n }\n }\n\n return entries;\n}\n\n/**\n * Extract title from ADR content\n */\nfunction extractADRTitle(content: string, fallback: string): string {\n // Try to find # Title\n const titleMatch = content.match(/^#\\\\s+(.+)/m);\n if (titleMatch) return titleMatch[1].trim();\n\n // Try to find Title: line\n const titleLineMatch = content.match(/^Title:\\\\s+(.+)/m);\n if (titleLineMatch) return titleLineMatch[1].trim();\n\n // Use filename as fallback\n return fallback\n .replace(/^\\\\d+-/, '') // Remove number prefix\n .replace(/-/g, ' ')\n .replace(/\\\\b\\\\w/g, (l) => l.toUpperCase());\n}\n\n/**\n * Import from git commits\n */\nfunction importCommits(limit: number): CapturedEntry[] {\n try {\n const { execSync } = require('child_process');\n\n // Get recent commits\n const output = execSync(\n `git log --pretty=format:\"%H|%an|%ai|%s|%b\" -n ${limit}`,\n { cwd: process.cwd(), encoding: 'utf-8' }\n ).trim();\n\n if (!output) return [];\n\n const entries: CapturedEntry[] = [];\n const commits = output.split('\\\\n');\n\n for (const commit of commits) {\n const [hash, author, date, subject, body] = commit.split('|');\n\n // Skip merge commits and trivial commits\n if (subject.startsWith('Merge ') || subject.length < 10) continue;\n\n // Look for significant commits\n const keywords = ['feat', 'feature', 'add', 'implement', 'refactor', 'breaking', 'major'];\n const isSignificant = keywords.some((kw) =>\n subject.toLowerCase().includes(kw)\n );\n\n if (isSignificant) {\n entries.push({\n type: 'session',\n title: subject.trim(),\n content: body?.trim() || subject.trim(),\n metadata: {\n commit: hash.substring(0, 8),\n author,\n date,\n },\n source: 'commits',\n });\n }\n }\n\n return entries;\n } catch {\n return [];\n }\n}\n\n/**\n * Import from package files\n */\nfunction importPackageFiles(): CapturedEntry[] {\n const entries: CapturedEntry[] = [];\n\n // package.json\n const packagePath = join(process.cwd(), 'package.json');\n if (existsSync(packagePath)) {\n try {\n const pkg = JSON.parse(readFileSync(packagePath, 'utf-8'));\n\n if (pkg.description) {\n entries.push({\n type: 'document',\n title: 'Project Description',\n content: pkg.description,\n metadata: { source_file: 'package.json' },\n source: 'package',\n });\n }\n\n // Extract major dependencies as context\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n const majorDeps = Object.keys(deps).filter((dep) =>\n ['react', 'vue', 'angular', 'express', 'fastify', 'next', 'nuxt'].includes(dep)\n );\n\n if (majorDeps.length > 0) {\n entries.push({\n type: 'context',\n title: 'Tech Stack',\n content: `Using: ${majorDeps.join(', ')}`,\n metadata: { dependencies: majorDeps },\n source: 'package',\n });\n }\n } catch {\n // Ignore errors\n }\n }\n\n // requirements.txt (Python)\n const requirementsPath = join(process.cwd(), 'requirements.txt');\n if (existsSync(requirementsPath)) {\n try {\n const content = readFileSync(requirementsPath, 'utf-8');\n const packages = content\n .split('\\\\n')\n .filter((line) => line.trim() && !line.startsWith('#'))\n .map((line) => line.split('==')[0].split('>=')[0].trim());\n\n if (packages.length > 0) {\n entries.push({\n type: 'context',\n title: 'Python Dependencies',\n content: `Python packages: ${packages.slice(0, 10).join(', ')}${packages.length > 10 ? '...' : ''}`,\n metadata: { packages: packages.slice(0, 20) },\n source: 'package',\n });\n }\n } catch {\n // Ignore errors\n }\n }\n\n // Cargo.toml (Rust)\n const cargoPath = join(process.cwd(), 'Cargo.toml');\n if (existsSync(cargoPath)) {\n try {\n const content = readFileSync(cargoPath, 'utf-8');\n const nameMatch = content.match(/name\\\\s*=\\\\s*\"([^\"]+)\"/);\n const descMatch = content.match(/description\\\\s*=\\\\s*\"([^\"]+)\"/);\n\n if (descMatch) {\n entries.push({\n type: 'document',\n title: `Rust Project: ${nameMatch?.[1] || 'Unknown'}`,\n content: descMatch[1],\n metadata: { source_file: 'Cargo.toml' },\n source: 'package',\n });\n }\n } catch {\n // Ignore errors\n }\n }\n\n return entries;\n}\n\n/**\n * Helper: Group array by key\n */\nfunction groupBy<T>(arr: T[], key: keyof T): Record<string, T[]> {\n return arr.reduce((acc, item) => {\n const group = String(item[key]);\n if (!acc[group]) acc[group] = [];\n acc[group].push(item);\n return acc;\n }, {} as Record<string, T[]>);\n}\n\n/**\n * Helper: Get type icon\n */\nfunction getTypeIcon(type: string): string {\n const icons: Record<string, string> = {\n decision: chalk.blue('DECISION'),\n pattern: chalk.magenta('PATTERN'),\n context: chalk.green('CONTEXT'),\n document: chalk.cyan('DOCUMENT'),\n session: chalk.yellow('SESSION'),\n };\n return icons[type] || type.toUpperCase();\n}\n","/**\n * Hook command — install, uninstall, and run git hooks\n */\n\nimport { readFileSync, writeFileSync, existsSync, chmodSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport chalk from 'chalk';\nimport { runPostCommit } from '../hooks/post-commit.js';\nimport { runPrePush } from '../hooks/pre-push.js';\nimport { runPostCheckout } from '../hooks/post-checkout.js';\nimport { runPrepareCommitMsg } from '../hooks/prepare-commit-msg.js';\n\nconst CONTXT_BLOCK_START = '# --- contxt hook start ---';\nconst CONTXT_BLOCK_END = '# --- contxt hook end ---';\n\nconst ALL_HOOKS = ['post-commit', 'pre-push', 'post-checkout', 'prepare-commit-msg'] as const;\ntype HookName = (typeof ALL_HOOKS)[number];\n\ninterface InstallOptions {\n hooks?: string;\n}\n\ninterface HookStatus {\n name: HookName;\n installed: boolean;\n fileExists: boolean;\n}\n\n/**\n * Install git hooks\n */\nexport async function installCommand(options: InstallOptions = {}) {\n const gitHooksDir = join(process.cwd(), '.git', 'hooks');\n\n if (!existsSync(join(process.cwd(), '.git'))) {\n console.error(chalk.red('Not a git repository.'));\n process.exit(1);\n }\n\n mkdirSync(gitHooksDir, { recursive: true });\n\n const hooksToInstall: HookName[] = options.hooks\n ? (options.hooks.split(',').map((h) => h.trim()) as HookName[])\n : [...ALL_HOOKS];\n\n let installed = 0;\n let updated = 0;\n\n for (const hookName of hooksToInstall) {\n const hookPath = join(gitHooksDir, hookName);\n\n const contxtLine = `contxt hook run ${hookName} \"$@\"`;\n const contxtBlock = `${CONTXT_BLOCK_START}\\n${contxtLine}\\n${CONTXT_BLOCK_END}`;\n\n if (existsSync(hookPath)) {\n const content = readFileSync(hookPath, 'utf-8');\n if (content.includes(CONTXT_BLOCK_START)) {\n // Already installed — update the block\n const updated_content = content.replace(\n new RegExp(`${escapeRegex(CONTXT_BLOCK_START)}[\\\\s\\\\S]*?${escapeRegex(CONTXT_BLOCK_END)}`),\n contxtBlock\n );\n writeFileSync(hookPath, updated_content, 'utf-8');\n updated++;\n } else {\n // Append to existing hook\n const newContent = content.trimEnd() + '\\n\\n' + contxtBlock + '\\n';\n writeFileSync(hookPath, newContent, 'utf-8');\n installed++;\n }\n } else {\n // Create new hook file\n const newContent = `#!/bin/sh\\n\\n${contxtBlock}\\n`;\n writeFileSync(hookPath, newContent, 'utf-8');\n installed++;\n }\n\n // Ensure executable\n chmodSync(hookPath, '755');\n console.log(chalk.green('✓'), `${hookName}`);\n }\n\n console.log('');\n if (installed > 0) console.log(chalk.green(`Installed ${installed} hook${installed !== 1 ? 's' : ''}.`));\n if (updated > 0) console.log(chalk.yellow(`Updated ${updated} existing hook${updated !== 1 ? 's' : ''}.`));\n console.log('');\n console.log(chalk.gray('Hooks will capture context from your git workflow automatically.'));\n}\n\n/**\n * Uninstall git hooks\n */\nexport async function uninstallCommand(options: InstallOptions = {}) {\n const gitHooksDir = join(process.cwd(), '.git', 'hooks');\n\n if (!existsSync(join(process.cwd(), '.git'))) {\n console.error(chalk.red('Not a git repository.'));\n process.exit(1);\n }\n\n const hooksToRemove: HookName[] = options.hooks\n ? (options.hooks.split(',').map((h) => h.trim()) as HookName[])\n : [...ALL_HOOKS];\n\n let removed = 0;\n\n for (const hookName of hooksToRemove) {\n const hookPath = join(gitHooksDir, hookName);\n if (!existsSync(hookPath)) continue;\n\n const content = readFileSync(hookPath, 'utf-8');\n if (!content.includes(CONTXT_BLOCK_START)) continue;\n\n // Remove contxt block\n const cleaned = content\n .replace(\n new RegExp(`\\\\n*${escapeRegex(CONTXT_BLOCK_START)}[\\\\s\\\\S]*?${escapeRegex(CONTXT_BLOCK_END)}\\\\n*`),\n '\\n'\n )\n .trim();\n\n if (cleaned === '#!/bin/sh' || cleaned === '') {\n // Hook was only contxt — remove the file (leave it empty is fine too)\n writeFileSync(hookPath, '#!/bin/sh\\n', 'utf-8');\n } else {\n writeFileSync(hookPath, cleaned + '\\n', 'utf-8');\n }\n\n removed++;\n console.log(chalk.gray('✗'), hookName);\n }\n\n if (removed > 0) {\n console.log('');\n console.log(chalk.green(`Removed ${removed} hook${removed !== 1 ? 's' : ''}.`));\n } else {\n console.log(chalk.gray('No Contxt hooks found to remove.'));\n }\n}\n\n/**\n * Show hook status\n */\nexport async function statusCommand() {\n const gitHooksDir = join(process.cwd(), '.git', 'hooks');\n\n if (!existsSync(join(process.cwd(), '.git'))) {\n console.error(chalk.red('Not a git repository.'));\n process.exit(1);\n }\n\n console.log('');\n console.log(chalk.bold('Git Hook Status'));\n console.log('');\n\n for (const hookName of ALL_HOOKS) {\n const hookPath = join(gitHooksDir, hookName);\n const fileExists = existsSync(hookPath);\n let isInstalled = false;\n\n if (fileExists) {\n const content = readFileSync(hookPath, 'utf-8');\n isInstalled = content.includes(CONTXT_BLOCK_START);\n }\n\n const statusIcon = isInstalled ? chalk.green('✓') : chalk.gray('○');\n const label = isInstalled ? chalk.green(hookName) : chalk.gray(hookName);\n const note = !fileExists ? chalk.gray(' (no hook file)') : isInstalled ? chalk.gray(' installed') : chalk.yellow(' not installed');\n\n console.log(` ${statusIcon} ${label}${note}`);\n }\n\n console.log('');\n\n const installedCount = ALL_HOOKS.filter((h) => {\n const hookPath = join(gitHooksDir, h);\n return existsSync(hookPath) && readFileSync(hookPath, 'utf-8').includes(CONTXT_BLOCK_START);\n }).length;\n\n if (installedCount === 0) {\n console.log(chalk.cyan(`Run ${chalk.bold('contxt hook install')} to enable automatic context capture.`));\n }\n}\n\n/**\n * Run a specific hook (called by the git hook shell script)\n */\nexport async function runCommand(hookName: string) {\n switch (hookName) {\n case 'post-commit':\n await runPostCommit();\n break;\n case 'pre-push':\n await runPrePush();\n break;\n case 'post-checkout':\n await runPostCheckout();\n break;\n case 'prepare-commit-msg':\n await runPrepareCommitMsg();\n break;\n default:\n // Unknown hook — silent\n }\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport const hookCommand = {\n install: installCommand,\n uninstall: uninstallCommand,\n status: statusCommand,\n run: runCommand,\n};\n","/**\n * post-commit hook — scan commit message for decisions / context signals\n * Must complete in <200ms. No network. Local DB only.\n */\n\nimport { execSync } from 'child_process';\nimport { getProjectDb } from '../utils/project.js';\n\nconst DECISION_KEYWORDS = [\n 'decided',\n 'decision',\n 'switched to',\n 'migrated to',\n 'migrated from',\n 'replaced',\n 'chose',\n 'using .+ instead of',\n 'instead of',\n 'over .+ because',\n 'picked',\n];\n\nconst DECISION_PATTERN = new RegExp(DECISION_KEYWORDS.join('|'), 'i');\n\nconst CONTEXT_PREFIXES = ['feat', 'fix', 'refactor', 'arch', 'build', 'ci', 'chore'];\nconst CONTEXT_PATTERN = new RegExp(`^(${CONTEXT_PREFIXES.join('|')})(\\\\(.+\\\\))?:`, 'i');\n\nexport async function runPostCommit(): Promise<void> {\n try {\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n if (!project) return;\n\n // Get the latest commit message\n const message = execSync('git log -1 --pretty=%B', {\n encoding: 'utf-8',\n timeout: 1000,\n }).trim();\n\n if (!message) return;\n\n const firstLine = message.split('\\n')[0].trim();\n\n // Get changed files\n let changedFiles: string[] = [];\n try {\n changedFiles = execSync('git diff-tree --no-commit-id -r --name-only HEAD', {\n encoding: 'utf-8',\n timeout: 1000,\n })\n .trim()\n .split('\\n')\n .filter(Boolean);\n } catch {\n // Ignore if git command fails\n }\n\n const commitHash = execSync('git rev-parse --short HEAD', {\n encoding: 'utf-8',\n timeout: 1000,\n }).trim();\n\n const branch = await db.getActiveBranch(project.id);\n\n if (DECISION_PATTERN.test(firstLine)) {\n // Looks like a decision commit — save as draft\n await db.createEntry({\n projectId: project.id,\n type: 'decision',\n title: stripConventionalPrefix(firstLine),\n content: message,\n metadata: {\n source: 'hooks:post-commit',\n commit: commitHash,\n files: changedFiles,\n },\n status: 'draft',\n });\n process.stdout.write(`contxt: draft saved — \"${firstLine}\" (decision)\\n`);\n } else if (CONTEXT_PATTERN.test(firstLine)) {\n // Conventional commit — update context files\n const existing = await db.listEntries({\n projectId: project.id,\n branch,\n type: 'context',\n });\n\n const activeContext = existing.find((e) => e.status === 'active');\n if (activeContext && changedFiles.length > 0) {\n const currentFiles: string[] = activeContext.metadata.files || [];\n const mergedFiles = Array.from(new Set([...currentFiles, ...changedFiles])).slice(0, 20);\n\n await db.updateEntry(activeContext.id, {\n metadata: {\n ...activeContext.metadata,\n files: mergedFiles,\n lastCommit: commitHash,\n },\n });\n }\n }\n\n await db.close();\n } catch {\n // Hooks must be silent on error\n }\n}\n\nfunction stripConventionalPrefix(msg: string): string {\n return msg.replace(/^(feat|fix|refactor|arch|build|ci|chore)(\\(.+\\))?:\\s*/i, '').trim();\n}\n","/**\n * pre-push hook — summarize session and optionally sync to cloud\n */\n\nimport { execSync } from 'child_process';\nimport { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { getProjectDb } from '../utils/project.js';\n\nexport async function runPrePush(): Promise<void> {\n try {\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n if (!project) return;\n\n // Count commits since last push (approximate via unpushed commits)\n let commitCount = 0;\n let changedFiles: string[] = [];\n\n try {\n const unpushed = execSync('git cherry -v @{upstream} 2>/dev/null || git log --oneline origin/HEAD..HEAD 2>/dev/null', {\n encoding: 'utf-8',\n timeout: 2000,\n }).trim();\n\n commitCount = unpushed ? unpushed.split('\\n').filter(Boolean).length : 0;\n } catch {\n // No upstream or first push\n try {\n commitCount = parseInt(\n execSync('git rev-list --count HEAD', { encoding: 'utf-8', timeout: 1000 }).trim(),\n 10\n );\n } catch {\n commitCount = 0;\n }\n }\n\n try {\n changedFiles = execSync('git diff --name-only @{upstream}..HEAD 2>/dev/null', {\n encoding: 'utf-8',\n timeout: 2000,\n })\n .trim()\n .split('\\n')\n .filter(Boolean);\n } catch {\n // Ignore\n }\n\n // Update context session summary\n const branch = await db.getActiveBranch(project.id);\n const existing = await db.listEntries({\n projectId: project.id,\n branch,\n type: 'context',\n });\n\n const activeContext = existing.find((e) => e.status === 'active');\n if (activeContext) {\n await db.updateEntry(activeContext.id, {\n metadata: {\n ...activeContext.metadata,\n lastPush: new Date().toISOString(),\n commitsPushed: (activeContext.metadata.commitsPushed || 0) + commitCount,\n filesPushed: changedFiles,\n },\n });\n }\n\n process.stdout.write(\n `contxt: session updated — ${commitCount} commit${commitCount !== 1 ? 's' : ''}, ${changedFiles.length} files changed\\n`\n );\n\n // Check if auto-push is enabled\n const configPath = join(process.cwd(), '.contxt', 'config.json');\n if (existsSync(configPath)) {\n try {\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n if (config.hooks?.auto_push_on_push) {\n process.stdout.write('contxt: syncing to cloud...\\n');\n // Sync is async — fire and forget (don't block git push)\n execSync('contxt push --quiet 2>/dev/null', {\n timeout: 10000,\n encoding: 'utf-8',\n });\n process.stdout.write('contxt: ✓ synced\\n');\n }\n } catch {\n // Config parse error or push failure — don't block the push\n }\n }\n\n await db.close();\n } catch {\n // Hooks must be silent on error\n }\n}\n","/**\n * post-checkout hook — switch Contxt branch when git branch changes\n */\n\nimport { execSync } from 'child_process';\nimport { getProjectDb } from '../utils/project.js';\n\nexport async function runPostCheckout(): Promise<void> {\n try {\n // post-checkout args: $1=prev_head, $2=new_head, $3=branch_flag (1=branch, 0=file)\n const isBranchCheckout = process.argv[4] === '1';\n if (!isBranchCheckout) return; // Only care about branch switches\n\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n if (!project) return;\n\n // Get current branch name\n const gitBranch = execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf-8',\n timeout: 1000,\n }).trim();\n\n // Check if Contxt has this branch\n const branches = await db.listBranches(project.id);\n const contxtBranch = branches.find((b) => b.name === gitBranch);\n\n if (contxtBranch) {\n // Switch Contxt to match the git branch\n await db.switchBranch(project.id, gitBranch);\n const entryCount = await db.countEntries({ projectId: project.id, branch: gitBranch });\n process.stdout.write(`contxt: switched to branch ${gitBranch} (${entryCount} entries)\\n`);\n } else {\n // No matching Contxt branch — stay on current, report main\n const currentBranch = await db.getActiveBranch(project.id);\n process.stdout.write(`contxt: no memory branch for ${gitBranch}, using ${currentBranch}\\n`);\n }\n\n await db.close();\n } catch {\n // Silent on error\n }\n}\n","/**\n * prepare-commit-msg hook — inject active context as comments in commit message template\n */\n\nimport { readFileSync, writeFileSync } from 'fs';\nimport { getProjectDb } from '../utils/project.js';\n\nexport async function runPrepareCommitMsg(): Promise<void> {\n try {\n // $1 = path to commit message file, $2 = source (message, template, merge, squash, commit)\n const commitMsgFile = process.argv[4];\n const source = process.argv[5]; // e.g. \"message\", \"template\"\n\n // Only inject for interactive commits (not merge, squash, etc.)\n if (source && source !== 'template' && source !== '') return;\n if (!commitMsgFile) return;\n\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n if (!project) return;\n\n const branch = await db.getActiveBranch(project.id);\n const entries = await db.listEntries({\n projectId: project.id,\n branch,\n });\n\n // Get active context\n const context = entries.find((e) => e.type === 'context' && e.status === 'active');\n // Get 3 most recent decisions\n const recentDecisions = entries\n .filter((e) => e.type === 'decision' && e.status === 'active')\n .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime())\n .slice(0, 3);\n\n if (!context && recentDecisions.length === 0) {\n await db.close();\n return;\n }\n\n // Build the comment block\n const lines: string[] = [\n '',\n '# --- Contxt ---',\n ];\n\n if (context) {\n const feature = context.metadata.feature || context.content.split('\\n')[0];\n lines.push(`# Feature: ${feature}`);\n if (context.metadata.blockers?.length) {\n lines.push(`# Blockers: ${context.metadata.blockers.join(', ')}`);\n }\n }\n\n if (recentDecisions.length > 0) {\n const decisionList = recentDecisions.map((d) => d.title).join(', ');\n lines.push(`# Recent decisions: ${decisionList}`);\n }\n\n // Draft count\n const draftCount = entries.filter((e) => e.status === 'draft').length;\n if (draftCount > 0) {\n lines.push(`# ${draftCount} drafts pending — run \\`contxt review\\``);\n }\n\n lines.push('#');\n\n // Append to commit message file\n const existing = readFileSync(commitMsgFile, 'utf-8');\n writeFileSync(commitMsgFile, existing + lines.join('\\n') + '\\n', 'utf-8');\n\n await db.close();\n } catch {\n // Silent on error — never block a commit\n }\n}\n","/**\n * Watch command — background file watcher for passive context capture\n */\n\nimport { readFileSync, writeFileSync, existsSync, unlinkSync } from 'fs';\nimport { join, relative } from 'path';\nimport { spawn } from 'child_process';\nimport chalk from 'chalk';\nimport chokidar from 'chokidar';\nimport { parseFile, scanCommentToEntry } from '@mycontxt/core';\nimport { getProjectDb } from '../utils/project.js';\n\nconst PID_FILE = '.contxt/.watch.pid';\nconst LOG_FILE = '.contxt/watch.log';\n\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes\nconst DEBOUNCE_MS = 30_000; // 30s batch window\n\ninterface WatchOptions {\n daemon?: boolean;\n}\n\n/**\n * Start the file watcher\n */\nexport async function startCommand(options: WatchOptions = {}) {\n if (options.daemon) {\n return startDaemon();\n }\n\n return runWatcher();\n}\n\n/**\n * Stop the background daemon\n */\nexport async function stopCommand() {\n const pidFile = join(process.cwd(), PID_FILE);\n\n if (!existsSync(pidFile)) {\n console.log(chalk.gray('No watch daemon running.'));\n return;\n }\n\n const pid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10);\n\n try {\n process.kill(pid, 'SIGTERM');\n unlinkSync(pidFile);\n console.log(chalk.green('Watch daemon stopped.'));\n } catch {\n console.log(chalk.yellow('Daemon not found — removing stale PID file.'));\n unlinkSync(pidFile);\n }\n}\n\n/**\n * Show daemon status\n */\nexport async function statusCommand() {\n const pidFile = join(process.cwd(), PID_FILE);\n\n if (!existsSync(pidFile)) {\n console.log(chalk.gray('Watch daemon: not running'));\n return;\n }\n\n const pid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10);\n\n try {\n process.kill(pid, 0); // Signal 0 just checks if the process exists\n console.log(chalk.green(`Watch daemon: running (PID ${pid})`));\n } catch {\n console.log(chalk.yellow('Watch daemon: stale PID file (process not found)'));\n unlinkSync(pidFile);\n }\n}\n\n/**\n * Start as detached background process\n */\nfunction startDaemon() {\n const pidFile = join(process.cwd(), PID_FILE);\n\n if (existsSync(pidFile)) {\n const pid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10);\n try {\n process.kill(pid, 0);\n console.log(chalk.yellow(`Watch daemon already running (PID ${pid}).`));\n return;\n } catch {\n // Stale PID — continue starting\n }\n }\n\n const logPath = join(process.cwd(), LOG_FILE);\n const logStream = require('fs').openSync(logPath, 'a');\n\n const child = spawn(process.execPath, [process.argv[1], 'watch'], {\n env: { ...process.env, CONTXT_WATCH_DAEMON: '1' },\n detached: true,\n stdio: ['ignore', logStream, logStream],\n cwd: process.cwd(),\n });\n\n child.unref();\n writeFileSync(pidFile, String(child.pid), 'utf-8');\n console.log(chalk.green(`Watch daemon started (PID ${child.pid}).`));\n console.log(chalk.gray(`Logs: ${logPath}`));\n}\n\n/**\n * Main watcher loop\n */\nasync function runWatcher() {\n const cwd = process.cwd();\n const isDaemon = process.env.CONTXT_WATCH_DAEMON === '1';\n\n const db = await getProjectDb(cwd);\n const project = await db.getProjectByPath(cwd);\n\n if (!project) {\n if (!isDaemon) console.error(chalk.red('Not a Contxt project.'));\n return;\n }\n\n const branch = await db.getActiveBranch(project.id);\n\n if (!isDaemon) {\n console.log(chalk.bold(`contxt watch`) + ` — monitoring ${project.name} (${branch})`);\n console.log('');\n }\n\n // Pending file batches\n const pendingFiles = new Set<string>();\n let flushTimer: NodeJS.Timeout | null = null;\n let sessionStart: Date | null = null;\n let lastActivityAt: Date | null = null;\n let sessionTimer: NodeJS.Timeout | null = null;\n\n // File patterns to watch\n const watchPatterns = [\n '**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx',\n '**/*.py', '**/*.rb', '**/*.go', '**/*.rs', '**/*.sql',\n ];\n\n const ignored = [\n /(^|[/\\\\])\\../, // dotfiles\n /node_modules/,\n /\\.contxt/,\n /dist/,\n /build/,\n /\\.next/,\n /\\.min\\.js$/,\n ];\n\n const watcher = chokidar.watch(watchPatterns, {\n cwd,\n ignored,\n ignoreInitial: true,\n persistent: true,\n usePolling: false,\n interval: 1000,\n });\n\n // Watch .contxt/rules.md for auto-sync\n const rulesPath = join(cwd, '.contxt', 'rules.md');\n const rulesWatcher = chokidar.watch(rulesPath, { ignoreInitial: true });\n\n // Watch .git/HEAD for branch changes\n const gitHeadPath = join(cwd, '.git', 'HEAD');\n const gitWatcher = chokidar.watch(gitHeadPath, { ignoreInitial: true });\n\n // Source file change\n watcher.on('change', (filePath: string) => {\n pendingFiles.add(filePath);\n touchSession();\n scheduleFlush();\n });\n\n watcher.on('add', (filePath: string) => {\n pendingFiles.add(filePath);\n touchSession();\n scheduleFlush();\n });\n\n // rules.md changed — auto-sync\n rulesWatcher.on('change', async () => {\n log('rules', 'rules.md changed — syncing...');\n try {\n const { parseRulesFile } = await import('@mycontxt/core');\n const content = readFileSync(rulesPath, 'utf-8');\n const parsed = parseRulesFile(content);\n let synced = 0;\n\n const existing = await db.listEntries({ projectId: project.id, branch });\n const byTitle = new Map(existing.map((e) => [e.title, e]));\n\n for (const decision of parsed.decisions) {\n const ex = byTitle.get(decision.title);\n if (!ex) {\n await db.createEntry({ projectId: project.id, type: 'decision', title: decision.title, content: decision.content, metadata: decision.metadata, status: 'active' });\n synced++;\n } else if (ex.content !== decision.content) {\n await db.updateEntry(ex.id, { content: decision.content });\n synced++;\n }\n }\n\n log('rules', `synced ${synced} update${synced !== 1 ? 's' : ''}`);\n } catch {\n log('rules', 'sync failed');\n }\n });\n\n // .git/HEAD changed — branch switch\n gitWatcher.on('change', async () => {\n try {\n const headContent = readFileSync(gitHeadPath, 'utf-8').trim();\n const branchMatch = headContent.match(/^ref: refs\\/heads\\/(.+)$/);\n if (!branchMatch) return;\n\n const newBranch = branchMatch[1];\n const currentBranch = await db.getActiveBranch(project.id);\n if (newBranch === currentBranch) return;\n\n const branches = await db.listBranches(project.id);\n const has = branches.some((b) => b.name === newBranch);\n\n if (has) {\n await db.switchBranch(project.id, newBranch);\n const count = await db.countEntries({ projectId: project.id, branch: newBranch });\n log('branch', `switched to ${newBranch} (${count} entries)`);\n }\n } catch {\n // Ignore\n }\n });\n\n // Flush pending files — update context + scan for tags\n async function flush() {\n if (pendingFiles.size === 0) return;\n\n const files = Array.from(pendingFiles);\n pendingFiles.clear();\n\n // Update context files\n try {\n const entries = await db.listEntries({ projectId: project.id, branch, type: 'context' });\n const activeCtx = entries.find((e) => e.status === 'active');\n if (activeCtx) {\n const currentFiles: string[] = activeCtx.metadata.files || [];\n const relFiles = files.map((f) => relative(cwd, join(cwd, f)));\n const merged = Array.from(new Set([...currentFiles, ...relFiles])).slice(0, 30);\n await db.updateEntry(activeCtx.id, { metadata: { ...activeCtx.metadata, files: merged } });\n }\n } catch {\n // Ignore\n }\n\n // Incremental scan — check each changed file for tags\n let newDrafts = 0;\n for (const file of files) {\n try {\n const absPath = join(cwd, file);\n if (!existsSync(absPath)) continue;\n const content = readFileSync(absPath, 'utf-8');\n const comments = parseFile(content, file);\n if (comments.length === 0) continue;\n\n const existing = await db.listEntries({ projectId: project.id, branch });\n const hashes = new Set(existing.filter((e) => e.metadata.hash).map((e) => e.metadata.hash));\n\n for (const comment of comments) {\n if (!hashes.has(comment.hash)) {\n const entry = scanCommentToEntry(comment, project.id);\n await db.createEntry({ projectId: project.id, type: entry.type, title: entry.title, content: entry.content, metadata: entry.metadata, status: 'draft' });\n newDrafts++;\n }\n }\n } catch {\n // Skip bad files\n }\n }\n\n log('files', `${files.length} file${files.length !== 1 ? 's' : ''} ${newDrafts > 0 ? `· +${newDrafts} draft${newDrafts !== 1 ? 's' : ''}` : ''}`);\n }\n\n function scheduleFlush() {\n if (flushTimer) clearTimeout(flushTimer);\n flushTimer = setTimeout(flush, DEBOUNCE_MS);\n }\n\n function touchSession() {\n const now = new Date();\n lastActivityAt = now;\n\n if (!sessionStart) {\n sessionStart = now;\n log('session', `started`);\n }\n\n if (sessionTimer) clearTimeout(sessionTimer);\n sessionTimer = setTimeout(endSession, SESSION_TIMEOUT_MS);\n }\n\n function endSession() {\n if (!sessionStart || !lastActivityAt) return;\n const durationMin = Math.round((lastActivityAt.getTime() - sessionStart.getTime()) / 60000);\n log('session', `ended — ${durationMin} min`);\n sessionStart = null;\n lastActivityAt = null;\n }\n\n function log(type: string, message: string) {\n const time = new Date().toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' });\n const line = `${time} ${type.padEnd(8)} ${message}`;\n if (!isDaemon) {\n console.log(` ${chalk.gray(time)} ${chalk.cyan(type.padEnd(8))} ${message}`);\n } else {\n try {\n require('fs').appendFileSync(join(cwd, LOG_FILE), line + '\\n');\n } catch {\n // Ignore log write errors\n }\n }\n }\n\n // Graceful shutdown\n const shutdown = async () => {\n if (flushTimer) clearTimeout(flushTimer);\n await flush();\n watcher.close();\n rulesWatcher.close();\n gitWatcher.close();\n await db.close();\n\n const pidFile = join(cwd, PID_FILE);\n if (existsSync(pidFile)) unlinkSync(pidFile);\n\n process.exit(0);\n };\n\n process.on('SIGTERM', shutdown);\n process.on('SIGINT', shutdown);\n\n if (!isDaemon) {\n console.log(chalk.gray('Watching for file changes. Ctrl+C to stop.\\n'));\n }\n}\n\nexport const watchCommand = {\n start: startCommand,\n stop: stopCommand,\n status: statusCommand,\n};\n"],"mappings":"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","names":["SQLiteDatabase","SQLiteDatabase","decision","add","list","show","pattern","show","context","chalk","context","chalk","branch","add","list","show","session","list","readFileSync","readFileSync","existsSync","mkdirSync","writeFileSync","readFileSync","join","join","existsSync","mkdirSync","writeFileSync","readFileSync","auth","error","SQLiteDatabase","SQLiteDatabase","error","SQLiteDatabase","SQLiteDatabase","error","branch","SQLiteDatabase","SQLiteDatabase","error","SQLiteDatabase","SQLiteDatabase","branch","error","readFileSync","existsSync","join","chalk","join","existsSync","readFileSync","chalk","error","chalk","ora","chalk","ora","error","getTypeIcon","readFileSync","writeFileSync","existsSync","join","chalk","ora","syncCommand","ora","join","existsSync","readFileSync","decision","pattern","doc","error","chalk","branch","context","writeFileSync","readFileSync","existsSync","join","basename","chalk","ora","ora","chalk","getTypeIcon","error","join","existsSync","readFileSync","basename","execSync","readFileSync","writeFileSync","existsSync","mkdirSync","join","chalk","branch","execSync","readFileSync","existsSync","join","execSync","branch","join","existsSync","readFileSync","execSync","execSync","readFileSync","writeFileSync","branch","context","readFileSync","writeFileSync","join","existsSync","chalk","mkdirSync","readFileSync","writeFileSync","statusCommand","readFileSync","writeFileSync","existsSync","join","relative","chalk","parseFile","scanCommentToEntry","join","existsSync","chalk","readFileSync","statusCommand","writeFileSync","branch","parseRulesFile","decision","relative","parseFile","scanCommentToEntry"]}
1
+ {"version":3,"sources":["../src/bin/contxt.ts","../src/commands/init.ts","../src/utils/project.ts","../src/utils/output.ts","../src/utils/usage-gate.ts","../src/config.ts","../src/commands/decision.ts","../src/commands/pattern.ts","../src/commands/context.ts","../src/commands/status.ts","../src/commands/doc.ts","../src/commands/session.ts","../src/commands/search.ts","../src/commands/export.ts","../src/commands/auth.ts","../src/commands/sync.ts","../src/commands/branch.ts","../src/commands/history.ts","../src/commands/load.ts","../src/commands/scan.ts","../src/commands/review.ts","../src/commands/rules.ts","../src/commands/capture.ts","../src/commands/hook.ts","../src/hooks/post-commit.ts","../src/hooks/pre-push.ts","../src/hooks/post-checkout.ts","../src/hooks/prepare-commit-msg.ts","../src/commands/watch.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * Contxt CLI Entry Point\n */\n\nimport { Command } from 'commander';\nimport { initCommand } from '../commands/init.js';\nimport { decisionCommand } from '../commands/decision.js';\nimport { patternCommand } from '../commands/pattern.js';\nimport { contextCommand } from '../commands/context.js';\nimport { statusCommand } from '../commands/status.js';\nimport { docCommand } from '../commands/doc.js';\nimport { sessionCommand } from '../commands/session.js';\nimport { searchCommand } from '../commands/search.js';\nimport { exportCommand, importCommand } from '../commands/export.js';\nimport { authCommand } from '../commands/auth.js';\nimport { syncCommand } from '../commands/sync.js';\nimport { branchCommand } from '../commands/branch.js';\nimport { historyCommand } from '../commands/history.js';\nimport { loadCommand } from '../commands/load.js';\nimport { scanCommand } from '../commands/scan.js';\nimport { reviewCommand } from '../commands/review.js';\nimport { rulesCommand } from '../commands/rules.js';\nimport { captureCommand } from '../commands/capture.js';\nimport { hookCommand } from '../commands/hook.js';\nimport { watchCommand } from '../commands/watch.js';\n\nconst program = new Command();\n\nprogram\n .name('contxt')\n .description('GitHub for AI Context - Persistent memory for AI coding agents')\n .version('0.1.0');\n\n// Project commands\nprogram\n .command('init')\n .description('Initialize a Contxt project in the current directory')\n .option('-n, --name <name>', 'Project name')\n .action(initCommand);\n\nprogram\n .command('status')\n .description('Show project status and memory summary')\n .action(statusCommand);\n\n// Decision commands\nconst decision = program\n .command('decision')\n .description('Manage architectural decisions');\n\ndecision\n .command('add')\n .description('Add a new decision')\n .requiredOption('-t, --title <title>', 'Decision title')\n .requiredOption('-r, --rationale <rationale>', 'Decision rationale')\n .option('-a, --alternatives <alternatives...>', 'Alternative approaches considered')\n .option('-c, --consequences <consequences...>', 'Consequences of this decision')\n .option('--tags <tags...>', 'Tags for categorization')\n .action(decisionCommand.add);\n\ndecision\n .command('list')\n .description('List all decisions')\n .option('-b, --branch <branch>', 'Filter by branch')\n .action(decisionCommand.list);\n\ndecision\n .command('show <id>')\n .description('Show a specific decision')\n .action(decisionCommand.show);\n\n// Pattern commands\nconst pattern = program\n .command('pattern')\n .description('Manage code patterns and conventions');\n\npattern\n .command('add')\n .description('Add a new pattern')\n .requiredOption('-t, --title <title>', 'Pattern title')\n .requiredOption('-c, --content <content>', 'Pattern content/code')\n .option('--category <category>', 'Pattern category')\n .option('--tags <tags...>', 'Tags for categorization')\n .action(patternCommand.add);\n\npattern\n .command('list')\n .description('List all patterns')\n .option('-b, --branch <branch>', 'Filter by branch')\n .action(patternCommand.list);\n\npattern\n .command('show <id>')\n .description('Show a specific pattern')\n .action(patternCommand.show);\n\n// Context commands\nconst context = program\n .command('context')\n .description('Manage project working context');\n\ncontext\n .command('set')\n .description('Set current working context')\n .option('-f, --feature <feature>', 'Current feature being worked on')\n .option('-b, --blockers <blockers...>', 'Current blockers')\n .option('-n, --next <steps...>', 'Next steps')\n .option('--files <files...>', 'Active files')\n .action(contextCommand.set);\n\ncontext\n .command('show')\n .description('Show current context')\n .action(contextCommand.show);\n\ncontext\n .command('clear')\n .description('Clear current context')\n .action(contextCommand.clear);\n\n// Document commands\nconst doc = program\n .command('doc')\n .description('Manage documentation and reference materials');\n\ndoc\n .command('add')\n .description('Add a new document')\n .requiredOption('-t, --title <title>', 'Document title')\n .option('-c, --content <content>', 'Document content')\n .option('-f, --file <file>', 'Read content from file')\n .option('-u, --url <url>', 'Source URL')\n .option('--tags <tags...>', 'Tags for categorization')\n .action(docCommand.add);\n\ndoc\n .command('list')\n .description('List all documents')\n .option('-b, --branch <branch>', 'Filter by branch')\n .action(docCommand.list);\n\ndoc\n .command('show <id>')\n .description('Show a specific document')\n .action(docCommand.show);\n\n// Session commands\nconst session = program\n .command('session')\n .description('Manage development sessions');\n\nsession\n .command('start')\n .description('Start a new development session')\n .requiredOption('-f, --feature <feature>', 'Feature being worked on')\n .option('-d, --description <description>', 'Session description')\n .action(sessionCommand.start);\n\nsession\n .command('end')\n .description('End the current session')\n .option('-s, --summary <summary>', 'Session summary')\n .action(sessionCommand.end);\n\nsession\n .command('list')\n .description('List all sessions')\n .option('-b, --branch <branch>', 'Filter by branch')\n .action(sessionCommand.list);\n\nsession\n .command('current')\n .description('Show current active session')\n .action(sessionCommand.current);\n\n// Search command\nprogram\n .command('search <query>')\n .description('Search memory entries')\n .option('-b, --branch <branch>', 'Filter by branch')\n .option('-t, --type <type>', 'Filter by type (decision, pattern, context, document, session)')\n .option('-l, --limit <limit>', 'Limit number of results', parseInt)\n .action(searchCommand);\n\n// Export command\nprogram\n .command('export')\n .description('Export memory entries to JSON')\n .option('-o, --output <file>', 'Output file (defaults to stdout)')\n .option('-b, --branch <branch>', 'Export specific branch')\n .action(exportCommand);\n\n// Import command\nprogram\n .command('import')\n .description('Import memory entries from JSON')\n .requiredOption('-f, --file <file>', 'Input file to import')\n .option('-m, --merge', 'Merge with existing entries (default: replace)')\n .action(importCommand);\n\n// Auth commands\nconst auth = program\n .command('auth')\n .description('Manage authentication');\n\nauth\n .command('login')\n .description('Authenticate with GitHub or email')\n .option('-e, --email <email>', 'Login with magic link (email)')\n .action(authCommand.login);\n\nauth\n .command('logout')\n .description('Logout from Contxt')\n .action(authCommand.logout);\n\nauth\n .command('status')\n .description('Check authentication status')\n .action(authCommand.status);\n\n// Sync commands\nprogram\n .command('push')\n .description('Push local changes to cloud')\n .option('-f, --force', 'Force push (override conflicts)')\n .option('-d, --dry-run', 'Show what would be pushed without actually pushing')\n .action(syncCommand.push);\n\nprogram\n .command('pull')\n .description('Pull remote changes to local')\n .option('-f, --force', 'Force pull (override conflicts)')\n .option('-d, --dry-run', 'Show what would be pulled without actually pulling')\n .action(syncCommand.pull);\n\nprogram\n .command('sync')\n .description('Full bidirectional sync (pull + push)')\n .option('-f, --force', 'Force sync (override conflicts)')\n .option('-d, --dry-run', 'Show what would be synced without actually syncing')\n .action(syncCommand.sync);\n\n// Branch commands\nconst branch = program\n .command('branch')\n .description('Manage branches');\n\nbranch\n .command('create <name>')\n .description('Create a new branch')\n .option('-f, --from <branch>', 'Create from specific branch')\n .action(branchCommand.create);\n\nbranch\n .command('list')\n .description('List all branches')\n .action(branchCommand.list);\n\nbranch\n .command('switch <name>')\n .description('Switch to a different branch')\n .action(branchCommand.switch);\n\nbranch\n .command('delete <name>')\n .description('Delete a branch')\n .action(branchCommand.delete);\n\nbranch\n .command('merge <source>')\n .description('Merge a branch into current branch')\n .action(branchCommand.merge);\n\n// History commands\nconst history = program\n .command('history')\n .description('View and restore version history');\n\nhistory\n .command('show <entry-id>')\n .description('Show version history for an entry')\n .action(historyCommand.show);\n\nhistory\n .command('restore <entry-id>')\n .description('Restore an entry to a previous version')\n .requiredOption('-v, --version <version>', 'Version number to restore', parseInt)\n .action(historyCommand.restore);\n\n// Load command\nprogram\n .command('load')\n .description('Generate context payload for AI prompts')\n .option('-t, --task <description>', 'Task-based context (smart relevance ranking)')\n .option('-f, --files <files...>', 'File-based context (filter by file mentions)')\n .option('-a, --all', 'All context (everything, sorted by recency)')\n .option('--max-tokens <tokens>', 'Maximum tokens for context', parseInt)\n .option('--type <type>', 'Filter by entry type (decision, pattern, etc.)')\n .option('-s, --summary', 'Show context summary instead of full context')\n .action(loadCommand);\n\n// Scan command\nprogram\n .command('scan')\n .description('Scan codebase for tagged comments (@decision, @pattern, @context)')\n .option('--path <path>', 'Specific directory to scan')\n .option('--dry-run', 'Show what would be captured without saving')\n .option('--auto-confirm', 'Skip draft queue, save directly as active')\n .action(scanCommand);\n\n// Review command\nprogram\n .command('review')\n .description('Review and confirm draft entries')\n .option('--source <source>', 'Filter by source (scan, hooks, mcp, import)')\n .option('--confirm-all', 'Confirm all pending drafts')\n .option('--discard-all', 'Discard all pending drafts')\n .option('--count', 'Show draft count only')\n .action(reviewCommand);\n\n// Rules commands\nconst rules = program\n .command('rules')\n .description('Manage .contxt/rules.md file');\n\nrules\n .command('sync')\n .description('Sync rules.md into memory store')\n .option('--dry-run', 'Show what would be synced without saving')\n .option('-f, --force', 'Force sync even if conflicts exist')\n .action(rulesCommand.sync);\n\nrules\n .command('generate')\n .description('Generate rules.md from memory store')\n .option('--dry-run', 'Show what would be generated without writing')\n .option('-f, --force', 'Overwrite existing rules.md')\n .action(rulesCommand.generate);\n\nrules\n .command('diff')\n .description('Show differences between rules.md and memory')\n .action(rulesCommand.diff);\n\n// Capture command\nprogram\n .command('capture')\n .description('Extract context from existing project files')\n .option('--source <source>', 'Source to capture from (readme, cursor, claude, adr, commits, package, all)')\n .option('--dry-run', 'Show what would be captured without saving')\n .option('--auto-confirm', 'Skip draft queue, save directly as active')\n .option('--limit <limit>', 'Limit number of commits to scan (default: 50)', parseInt)\n .action(captureCommand);\n\n// Hook commands\nconst hook = program\n .command('hook')\n .description('Manage git hooks for automatic context capture');\n\nhook\n .command('install')\n .description('Install git hooks')\n .option('--hooks <hooks>', 'Comma-separated hooks to install (post-commit, pre-push, post-checkout, prepare-commit-msg)')\n .action(hookCommand.install);\n\nhook\n .command('uninstall')\n .description('Uninstall git hooks')\n .option('--hooks <hooks>', 'Comma-separated hooks to remove')\n .action(hookCommand.uninstall);\n\nhook\n .command('status')\n .description('Show installed hook status')\n .action(hookCommand.status);\n\nhook\n .command('run <hook-name>')\n .description('Run a specific hook (called internally by git)')\n .action(hookCommand.run);\n\n// Watch commands\nprogram\n .command('watch')\n .description('Start background file watcher for passive context capture')\n .option('--daemon', 'Run as background process')\n .action(watchCommand.start);\n\nprogram\n .command('watch:stop')\n .description('Stop the background watch daemon')\n .action(watchCommand.stop);\n\nprogram\n .command('watch:status')\n .description('Show watch daemon status')\n .action(watchCommand.status);\n\n// Parse arguments\nprogram.parse();\n","/**\n * Init command - Initialize a Contxt project\n */\n\nimport { mkdirSync, existsSync, writeFileSync, readFileSync, chmodSync } from 'fs';\nimport { basename, join } from 'path';\nimport { homedir } from 'os';\nimport { spawn } from 'child_process';\nimport { SQLiteDatabase } from '@mycontxt/adapters/sqlite';\nimport { getContxtDir, getDbPath, isContxtProject } from '../utils/project.js';\nimport { success, error, info } from '../utils/output.js';\nimport { createUsageGate, enforceGate } from '../utils/usage-gate.js';\n\nconst CLAUDE_MD_TEMPLATE = `# Contxt — Active Context Capture\n\nThis project uses [Contxt](https://mycontxt.co) (MCP) to automatically capture technical decisions and patterns from your conversations.\n\n## Your Role\n\nDuring every conversation in this project, actively capture knowledge using the Contxt MCP tools:\n\n- When the developer makes an architectural or technical decision → call \\`contxt_auto_capture_decision\\` or \\`contxt_capture_discussion\\`\n- When a reusable code pattern or convention is established → call \\`contxt_auto_capture_pattern\\`\n- At the end of each conversation → call \\`contxt_update_session\\` with a summary of what was accomplished\n\nUse a consistent \\`conversationId\\` (a UUID you generate at the start of the session) on every tool call so entries from the same conversation are linked.\n\n## When to Capture a Decision\n\nCapture a **decision** when the developer (or you together):\n- Chooses one technology, library, or approach over alternatives\n- Establishes a project structure, naming convention, or architectural boundary\n- Resolves a tradeoff (e.g. performance vs. simplicity, SQL vs. NoSQL)\n- Says \"let's use X\", \"we'll go with Y\", or \"we decided to Z\"\n\nUse \\`contxt_capture_discussion\\` when the decision came out of back-and-forth so you can capture the context and what was rejected.\n\n## When to Capture a Pattern\n\nCapture a **pattern** when:\n- A code shape is established that will be repeated (component structure, API format, hook convention, etc.)\n- A rule is set about how something should always be done in this project\n\n## What NOT to Capture\n\n- One-off debugging steps or experiments\n- Trivial implementation details (e.g. \"added a console.log\")\n- Things the developer explicitly says to ignore\n\n## After Capture\n\nAll entries are saved as **drafts**. The developer reviews and confirms them with:\n\\`\\`\\`\ncontxt review\n\\`\\`\\`\n`;\n\nconst MCP_CONFIG = {\n mcpServers: {\n contxt: {\n command: 'contxt',\n args: ['mcp'],\n env: {},\n },\n },\n};\n\nconst CONTXT_BLOCK_START = '# --- contxt hook start ---';\nconst CONTXT_BLOCK_END = '# --- contxt hook end ---';\nconst ALL_HOOKS = ['post-commit', 'pre-push', 'post-checkout', 'prepare-commit-msg'] as const;\n\ninterface InitOptions {\n name?: string;\n}\n\n/**\n * Write .mcp.json for Claude Code + .cursor/mcp.json for Cursor auto-discovery\n */\nfunction writeMcpConfigs(cwd: string): void {\n const mcpJson = JSON.stringify(MCP_CONFIG, null, 2);\n writeFileSync(join(cwd, '.mcp.json'), mcpJson, 'utf-8');\n\n const cursorDir = join(cwd, '.cursor');\n mkdirSync(cursorDir, { recursive: true });\n writeFileSync(join(cursorDir, 'mcp.json'), mcpJson, 'utf-8');\n}\n\n/**\n * Install git hooks silently — same logic as `contxt hook install`\n */\nfunction installGitHooks(cwd: string): boolean {\n const gitDir = join(cwd, '.git');\n if (!existsSync(gitDir)) return false;\n\n const gitHooksDir = join(gitDir, 'hooks');\n mkdirSync(gitHooksDir, { recursive: true });\n\n for (const hookName of ALL_HOOKS) {\n const hookPath = join(gitHooksDir, hookName);\n const contxtBlock = `${CONTXT_BLOCK_START}\\ncontxt hook run ${hookName} \"$@\"\\n${CONTXT_BLOCK_END}`;\n\n if (existsSync(hookPath)) {\n const content = readFileSync(hookPath, 'utf-8');\n if (!content.includes(CONTXT_BLOCK_START)) {\n writeFileSync(hookPath, content.trimEnd() + '\\n\\n' + contxtBlock + '\\n', 'utf-8');\n }\n } else {\n writeFileSync(hookPath, `#!/bin/sh\\n\\n${contxtBlock}\\n`, 'utf-8');\n }\n\n chmodSync(hookPath, '755');\n }\n\n return true;\n}\n\n/**\n * Spawn the watch daemon in the background — auto-captures file changes and auto-syncs\n */\nfunction startWatchDaemon(cwd: string): void {\n const pidFile = join(cwd, '.contxt', '.watch.pid');\n if (existsSync(pidFile)) return; // Already running\n\n const child = spawn('contxt', ['watch', '--daemon'], {\n detached: true,\n stdio: 'ignore',\n cwd,\n });\n child.unref();\n}\n\n/**\n * Register a UserPromptSubmit hook in ~/.claude/settings.json so context\n * is automatically injected before every Claude Code prompt.\n */\nfunction registerClaudeCodeHook(): void {\n const claudeDir = join(homedir(), '.claude');\n const settingsPath = join(claudeDir, 'settings.json');\n const hookCommand =\n \"bash -c 'PROMPT=$(cat | jq -r \\\".prompt // empty\\\" 2>/dev/null | head -c 300); [ -n \\\"$PROMPT\\\" ] && contxt load --task \\\"$PROMPT\\\" 2>/dev/null || true'\";\n\n let settings: Record<string, any> = {};\n if (existsSync(settingsPath)) {\n try {\n settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));\n } catch {\n // Malformed — start fresh\n }\n }\n\n if (!settings.hooks) settings.hooks = {};\n if (!settings.hooks.UserPromptSubmit) settings.hooks.UserPromptSubmit = [];\n\n const alreadyRegistered = (settings.hooks.UserPromptSubmit as any[]).some((h: any) =>\n h.hooks?.some((hh: any) => typeof hh.command === 'string' && hh.command.includes('contxt load'))\n );\n\n if (!alreadyRegistered) {\n settings.hooks.UserPromptSubmit.push({\n matcher: '',\n hooks: [{ type: 'command', command: hookCommand }],\n });\n mkdirSync(claudeDir, { recursive: true });\n writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');\n }\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n try {\n const cwd = process.cwd();\n\n // Check if already initialized\n if (isContxtProject(cwd)) {\n error('This directory is already a Contxt project');\n process.exit(1);\n }\n\n // Create .contxt directory\n const contxtDir = getContxtDir(cwd);\n mkdirSync(contxtDir, { recursive: true });\n\n // Write CLAUDE.md instruction template\n const claudeMdPath = join(contxtDir, 'CLAUDE.md');\n writeFileSync(claudeMdPath, CLAUDE_MD_TEMPLATE, 'utf-8');\n\n // Initialize database\n const dbPath = getDbPath(cwd);\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n // Check usage limits before creating project\n const gate = await createUsageGate(db);\n const result = await gate.checkProjectCreate();\n enforceGate(result);\n\n // Create project with autoSync enabled by default\n const projectName = options.name || basename(cwd);\n const project = await db.initProject({\n name: projectName,\n path: cwd,\n stack: [],\n config: { autoSync: true },\n });\n\n await db.close();\n\n // Generate MCP configs for Claude Code + Cursor auto-discovery\n writeMcpConfigs(cwd);\n\n // Install git hooks automatically\n const hooksInstalled = installGitHooks(cwd);\n\n // Start watch daemon in background (auto-sync enabled)\n startWatchDaemon(cwd);\n\n // Register Claude Code UserPromptSubmit hook for silent context injection\n registerClaudeCodeHook();\n\n success(`Initialized Contxt project: ${project.name}`);\n console.log();\n info('✓ MCP server configured (.mcp.json + .cursor/mcp.json)');\n if (hooksInstalled) info('✓ Git hooks installed (post-commit, pre-push, post-checkout)');\n info('✓ Watch daemon started (auto-sync enabled)');\n info('✓ Claude Code context hook registered');\n console.log();\n console.log(\"Contxt is running. You won't need to think about it again.\");\n\n } catch (err) {\n error(`Failed to initialize project: ${(err as Error).message}`);\n process.exit(1);\n }\n}\n","/**\n * Project utilities\n */\n\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { SQLiteDatabase } from '@mycontxt/adapters/sqlite';\nimport { MemoryEngine } from '@mycontxt/core';\n\nexport interface ProjectContext {\n db: SQLiteDatabase;\n engine: MemoryEngine;\n projectId: string;\n projectPath: string;\n}\n\n/**\n * Get the .contxt directory path\n */\nexport function getContxtDir(cwd: string = process.cwd()): string {\n return join(cwd, '.contxt');\n}\n\n/**\n * Get the database file path\n */\nexport function getDbPath(cwd: string = process.cwd()): string {\n return join(getContxtDir(cwd), 'local.db');\n}\n\n/**\n * Check if current directory is a Contxt project\n */\nexport function isContxtProject(cwd: string = process.cwd()): boolean {\n const dbPath = getDbPath(cwd);\n return existsSync(dbPath);\n}\n\n/**\n * Load project context\n */\nexport async function loadProject(cwd: string = process.cwd()): Promise<ProjectContext> {\n if (!isContxtProject(cwd)) {\n throw new Error(\n 'Not a Contxt project. Run \"contxt init\" to initialize.'\n );\n }\n\n const dbPath = getDbPath(cwd);\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n const project = await db.getProjectByPath(cwd);\n if (!project) {\n throw new Error('Project not found in database');\n }\n\n const engine = new MemoryEngine(db);\n\n return {\n db,\n engine,\n projectId: project.id,\n projectPath: cwd,\n };\n}\n\n/**\n * Get project database instance\n */\nexport async function getProjectDb(cwd: string = process.cwd()): Promise<SQLiteDatabase> {\n if (!isContxtProject(cwd)) {\n throw new Error(\n 'Not a Contxt project. Run \"contxt init\" to initialize.'\n );\n }\n\n const dbPath = getDbPath(cwd);\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n return db;\n}\n\n/**\n * Format date for display\n */\nexport function formatDate(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days}d ago`;\n if (hours > 0) return `${hours}h ago`;\n if (minutes > 0) return `${minutes}m ago`;\n return 'just now';\n}\n","/**\n * Output formatting utilities\n */\n\nimport chalk from 'chalk';\nimport type { MemoryEntry } from '@mycontxt/core';\nimport { formatDate } from './project.js';\n\n/**\n * Log success message\n */\nexport function success(message: string): void {\n console.log(chalk.green('✓'), message);\n}\n\n/**\n * Log error message\n */\nexport function error(message: string): void {\n console.error(chalk.red('✗'), message);\n}\n\n/**\n * Log info message\n */\nexport function info(message: string): void {\n console.log(chalk.blue('ℹ'), message);\n}\n\n/**\n * Log warning message\n */\nexport function warn(message: string): void {\n console.log(chalk.yellow('⚠'), message);\n}\n\n/**\n * Format entry for display\n */\nexport function formatEntry(entry: MemoryEntry): string {\n const lines: string[] = [];\n\n // Header\n lines.push(chalk.bold(entry.title));\n lines.push(\n chalk.dim(\n `${entry.type} • ${entry.id.substring(0, 8)} • ${formatDate(entry.updatedAt)}`\n )\n );\n lines.push('');\n\n // Content\n lines.push(entry.content);\n\n // Metadata\n if (Object.keys(entry.metadata).length > 0) {\n lines.push('');\n lines.push(chalk.dim('Metadata:'));\n for (const [key, value] of Object.entries(entry.metadata)) {\n if (Array.isArray(value) && value.length > 0) {\n lines.push(chalk.dim(` ${key}: ${value.join(', ')}`));\n } else if (value) {\n lines.push(chalk.dim(` ${key}: ${value}`));\n }\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format entry list for display\n */\nexport function formatEntryList(entries: MemoryEntry[]): string {\n if (entries.length === 0) {\n return chalk.dim('No entries found');\n }\n\n return entries\n .map((entry) => {\n const id = chalk.dim(entry.id.substring(0, 8));\n const time = chalk.dim(formatDate(entry.updatedAt));\n const title = entry.title;\n return ` ${id} ${title} ${time}`;\n })\n .join('\\n');\n}\n\n/**\n * Log loading/progress message\n */\nexport function loading(message: string): void {\n console.log(chalk.cyan('~'), message);\n}\n\n/**\n * Log dry-run message\n */\nexport function dryRun(message: string): void {\n console.log(chalk.dim('→'), chalk.dim(message));\n}\n\n/**\n * Log conflict message\n */\nexport function conflict(message: string): void {\n console.log(chalk.yellow('!'), message);\n}\n\n/**\n * Print a section header\n */\nexport function header(title: string): void {\n console.log(chalk.bold.cyan('›'), chalk.bold(title));\n}\n\n/**\n * Create a section header\n */\nexport function section(title: string): string {\n return chalk.bold.underline(title);\n}\n\n/**\n * Create a divider\n */\nexport function divider(): string {\n return chalk.dim('─'.repeat(60));\n}\n","/**\n * Usage gate utilities for CLI\n * Enforces plan limits on CLI operations\n */\n\nimport { existsSync, readFileSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport chalk from 'chalk';\nimport { UsageGate, type UsageCounts } from '@mycontxt/core/engine/usage';\nimport { resolveUserPlan, type PlanId } from '@mycontxt/core/engine/plan-resolver';\nimport type { ILocalDatabase, IRemoteDatabase } from '@mycontxt/core';\nimport { SupabaseDatabase } from '@mycontxt/adapters/supabase';\nimport { getSupabaseConfig } from '../config.js';\n\nconst AUTH_FILE = join(homedir(), '.contxt', 'auth.json');\n\ninterface AuthData {\n accessToken: string;\n userId: string;\n email: string;\n githubUsername?: string;\n expiresAt?: string;\n}\n\n/**\n * Get current authenticated user ID\n * Returns null if not authenticated\n */\nexport function getCurrentUserId(): string | null {\n if (!existsSync(AUTH_FILE)) {\n return null;\n }\n\n try {\n const content = readFileSync(AUTH_FILE, 'utf-8');\n const auth: AuthData = JSON.parse(content);\n return auth.userId;\n } catch {\n return null;\n }\n}\n\n/**\n * Get authenticated Supabase database instance\n * Returns null if not authenticated\n */\nexport function getRemoteDb(): IRemoteDatabase | null {\n if (!existsSync(AUTH_FILE)) {\n return null;\n }\n\n try {\n const content = readFileSync(AUTH_FILE, 'utf-8');\n const auth: AuthData = JSON.parse(content);\n const config = getSupabaseConfig();\n\n return new SupabaseDatabase({\n url: config.url,\n anonKey: config.anonKey,\n accessToken: auth.accessToken,\n });\n } catch {\n return null;\n }\n}\n\n/**\n * Get usage counts for gate enforcement\n * Note: For SQLite, we count all local data since user_id is optional\n * For accurate cloud limits, use the remote database\n */\nexport async function getUsageCounts(\n localDb: any, // SQLiteDatabase with direct db access\n userId: string | null,\n projectId?: string\n): Promise<UsageCounts> {\n // Count total projects (all local projects)\n const projectCountQuery = 'SELECT COUNT(*) as count FROM projects';\n const projectRow = localDb.db.prepare(projectCountQuery).get() as any;\n const totalProjects = projectRow.count;\n\n // Count total entries across all projects\n const totalEntriesQuery = 'SELECT COUNT(*) as count FROM memory_entries WHERE is_archived = 0';\n const totalEntriesRow = localDb.db.prepare(totalEntriesQuery).get() as any;\n const totalEntries = totalEntriesRow.count;\n\n // Count entries in current project (if specified)\n let entriesInProject = 0;\n if (projectId) {\n const projectEntriesQuery = 'SELECT COUNT(*) as count FROM memory_entries WHERE project_id = ? AND is_archived = 0';\n const projectEntriesRow = localDb.db.prepare(projectEntriesQuery).get(projectId) as any;\n entriesInProject = projectEntriesRow.count;\n }\n\n return {\n totalProjects,\n totalEntries,\n entriesInProject,\n totalSeats: 1, // Single user for now\n };\n}\n\n/**\n * Create a usage gate with current user's plan\n */\nexport async function createUsageGate(\n localDb: any, // SQLiteDatabase instance\n projectId?: string\n): Promise<UsageGate> {\n const userId = getCurrentUserId();\n const remoteDb = getRemoteDb();\n\n const planId = await resolveUserPlan(localDb, remoteDb, userId);\n\n return new UsageGate(planId, () => getUsageCounts(localDb, userId, projectId));\n}\n\n/**\n * Check a gate result and exit with error if blocked\n * @param result The gate check result\n */\nexport function enforceGate(result: { allowed: true } | { allowed: false; reason: string; limit: number | null; current: number; upgradeHint: string }): void {\n if (!result.allowed) {\n console.error(chalk.red(`\\n✖ ${result.reason}`));\n console.error(chalk.dim(` Current: ${result.current} / Limit: ${result.limit === null ? '∞' : result.limit}`));\n console.error(chalk.cyan(`\\n ${result.upgradeHint}\\n`));\n process.exit(1);\n }\n}\n","/**\n * Contxt CLI Configuration\n *\n * Supabase credentials are injected at build time via tsup esbuildOptions.define,\n * so end users never need to set environment variables.\n *\n * For local development / CI builds, set:\n * CONTXT_SUPABASE_URL=https://your-project.supabase.co\n * CONTXT_SUPABASE_ANON_KEY=your-anon-key\n */\n\n// These string literals are replaced at build time by tsup's esbuildOptions.define.\n// At runtime they fall back to process.env for local development.\nexport const SUPABASE_URL: string = process.env.CONTXT_SUPABASE_URL ?? '';\nexport const SUPABASE_ANON_KEY: string = process.env.CONTXT_SUPABASE_ANON_KEY ?? '';\n\nexport function getSupabaseConfig(): { url: string; anonKey: string } {\n if (!SUPABASE_URL || !SUPABASE_ANON_KEY) {\n throw new Error(\n 'Contxt is not configured for cloud sync.\\n' +\n 'If you installed via npm, please reinstall the latest version.\\n' +\n 'If building locally, set CONTXT_SUPABASE_URL and CONTXT_SUPABASE_ANON_KEY before running `pnpm build`.'\n );\n }\n return { url: SUPABASE_URL, anonKey: SUPABASE_ANON_KEY };\n}\n","/**\n * Decision commands\n */\n\nimport type { DecisionInput } from '@mycontxt/core';\nimport { loadProject } from '../utils/project.js';\nimport { success, error, formatEntry, formatEntryList, section } from '../utils/output.js';\nimport { createUsageGate, enforceGate } from '../utils/usage-gate.js';\n\ninterface AddOptions {\n title: string;\n rationale: string;\n alternatives?: string[];\n consequences?: string[];\n tags?: string[];\n}\n\ninterface ListOptions {\n branch?: string;\n}\n\nasync function add(options: AddOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n // Check usage limits before creating entry\n const gate = await createUsageGate(db, projectId);\n const result = await gate.checkEntryCreate();\n enforceGate(result);\n\n const input: DecisionInput = {\n title: options.title,\n rationale: options.rationale,\n alternatives: options.alternatives,\n consequences: options.consequences,\n tags: options.tags,\n };\n\n const entry = await engine.addDecision(projectId, input);\n\n success(`Added decision: ${entry.title}`);\n console.log(`ID: ${entry.id}`);\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function list(options: ListOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const decisions = await engine.listDecisions(projectId, options.branch);\n\n console.log(section('Decisions'));\n console.log();\n console.log(formatEntryList(decisions));\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function show(id: string): Promise<void> {\n try {\n const { engine, db } = await loadProject();\n\n const decision = await engine.getDecision(id);\n\n console.log(formatEntry(decision));\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nexport const decisionCommand = {\n add,\n list,\n show,\n};\n","/**\n * Pattern commands\n */\n\nimport type { PatternInput } from '@mycontxt/core';\nimport { loadProject } from '../utils/project.js';\nimport { success, error, formatEntry, formatEntryList, section } from '../utils/output.js';\nimport { createUsageGate, enforceGate } from '../utils/usage-gate.js';\n\ninterface AddOptions {\n title: string;\n content: string;\n category?: string;\n tags?: string[];\n}\n\ninterface ListOptions {\n branch?: string;\n}\n\nasync function add(options: AddOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n // Check usage limits before creating entry\n const gate = await createUsageGate(db, projectId);\n const result = await gate.checkEntryCreate();\n enforceGate(result);\n\n const input: PatternInput = {\n title: options.title,\n content: options.content,\n category: options.category,\n tags: options.tags,\n };\n\n const entry = await engine.addPattern(projectId, input);\n\n success(`Added pattern: ${entry.title}`);\n console.log(`ID: ${entry.id}`);\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function list(options: ListOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const patterns = await engine.listPatterns(projectId, options.branch);\n\n console.log(section('Patterns'));\n console.log();\n console.log(formatEntryList(patterns));\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function show(id: string): Promise<void> {\n try {\n const { engine, db } = await loadProject();\n\n const pattern = await engine.getPattern(id);\n\n console.log(formatEntry(pattern));\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nexport const patternCommand = {\n add,\n list,\n show,\n};\n","/**\n * Context commands\n */\n\nimport type { ContextInput } from '@mycontxt/core';\nimport { loadProject } from '../utils/project.js';\nimport { success, error, formatEntry, info } from '../utils/output.js';\n\ninterface SetOptions {\n feature?: string;\n blockers?: string[];\n next?: string[];\n files?: string[];\n}\n\nasync function set(options: SetOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const input: ContextInput = {\n feature: options.feature,\n blockers: options.blockers,\n nextSteps: options.next,\n activeFiles: options.files,\n };\n\n const entry = await engine.setContext(projectId, input);\n\n success('Updated project context');\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function show(): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const context = await engine.getContext(projectId);\n\n if (!context) {\n info('No context set. Use \"contxt context set\" to set context.');\n await db.close();\n return;\n }\n\n console.log(formatEntry(context));\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function clear(): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const context = await engine.getContext(projectId);\n\n if (context) {\n await engine.deleteEntry(context.id);\n success('Cleared project context');\n } else {\n info('No context to clear');\n }\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nexport const contextCommand = {\n set,\n show,\n clear,\n};\n","/**\n * Status command - Show project overview\n */\n\nimport chalk from 'chalk';\nimport { loadProject } from '../utils/project.js';\nimport { error, section, divider } from '../utils/output.js';\n\nexport async function statusCommand(): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const project = await db.getProject(projectId);\n if (!project) {\n throw new Error('Project not found');\n }\n\n const activeBranch = await db.getActiveBranch(projectId);\n const branches = await db.listBranches(projectId);\n\n // Get entry counts by type\n const decisions = await engine.listDecisions(projectId);\n const patterns = await engine.listPatterns(projectId);\n const documents = await engine.listDocuments(projectId);\n const sessions = await engine.listSessions(projectId);\n const context = await engine.getContext(projectId);\n\n // Get unsynced count\n const unsynced = await db.getUnsyncedEntries(projectId);\n\n console.log();\n console.log(section('Project Status'));\n console.log();\n console.log(chalk.bold('Name:'), project.name);\n console.log(chalk.bold('Path:'), project.path);\n console.log(chalk.bold('ID:'), project.id);\n console.log();\n\n console.log(section('Branches'));\n console.log();\n for (const branch of branches) {\n const marker = branch.name === activeBranch ? chalk.green('●') : ' ';\n console.log(` ${marker} ${branch.name}`);\n }\n console.log();\n\n console.log(section('Memory Entries'));\n console.log();\n console.log(` Decisions: ${decisions.length}`);\n console.log(` Patterns: ${patterns.length}`);\n console.log(` Documents: ${documents.length}`);\n console.log(` Sessions: ${sessions.length}`);\n console.log(` Total: ${decisions.length + patterns.length + documents.length + sessions.length}`);\n console.log();\n\n if (context) {\n console.log(section('Current Context'));\n console.log();\n if (context.metadata.feature) {\n console.log(chalk.bold('Feature:'), context.metadata.feature);\n }\n if (context.metadata.blockers?.length > 0) {\n console.log(chalk.bold('Blockers:'));\n context.metadata.blockers.forEach((b: string) => console.log(` - ${b}`));\n }\n if (context.metadata.nextSteps?.length > 0) {\n console.log(chalk.bold('Next Steps:'));\n context.metadata.nextSteps.forEach((s: string) => console.log(` - ${s}`));\n }\n console.log();\n }\n\n if (unsynced.length > 0) {\n console.log(chalk.yellow(`⚠ ${unsynced.length} unsynced entries`));\n console.log(chalk.dim(' Run \"contxt push\" to sync'));\n console.log();\n }\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n","/**\n * Document commands\n */\n\nimport { readFileSync } from 'fs';\nimport type { DocumentInput } from '@mycontxt/core';\nimport { loadProject } from '../utils/project.js';\nimport { success, error, formatEntry, formatEntryList, section } from '../utils/output.js';\n\ninterface AddOptions {\n title: string;\n content?: string;\n file?: string;\n url?: string;\n tags?: string[];\n}\n\ninterface ListOptions {\n branch?: string;\n}\n\nasync function add(options: AddOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n let content = options.content || '';\n\n // If file is provided, read it\n if (options.file) {\n try {\n content = readFileSync(options.file, 'utf-8');\n } catch (err) {\n error(`Failed to read file: ${(err as Error).message}`);\n process.exit(1);\n }\n }\n\n if (!content) {\n error('Either --content or --file is required');\n process.exit(1);\n }\n\n const input: DocumentInput = {\n title: options.title,\n content,\n url: options.url,\n tags: options.tags,\n };\n\n const entry = await engine.addDocument(projectId, input);\n\n success(`Added document: ${entry.title}`);\n console.log(`ID: ${entry.id}`);\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function list(options: ListOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const documents = await engine.listDocuments(projectId, options.branch);\n\n console.log(section('Documents'));\n console.log();\n console.log(formatEntryList(documents));\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function show(id: string): Promise<void> {\n try {\n const { engine, db } = await loadProject();\n\n const document = await engine.getDocument(id);\n\n console.log(formatEntry(document));\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nexport const docCommand = {\n add,\n list,\n show,\n};\n","/**\n * Session commands\n */\n\nimport type { SessionInput } from '@mycontxt/core';\nimport { loadProject } from '../utils/project.js';\nimport { success, error, info, formatEntry, formatEntryList, section } from '../utils/output.js';\n\ninterface StartOptions {\n feature: string;\n description?: string;\n}\n\ninterface EndOptions {\n summary?: string;\n}\n\ninterface ListOptions {\n branch?: string;\n}\n\nasync function start(options: StartOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const input: SessionInput = {\n feature: options.feature,\n description: options.description,\n };\n\n const session = await engine.startSession(projectId, input);\n\n success(`Started session: ${session.title}`);\n console.log(`ID: ${session.id}`);\n info('Run \"contxt session end\" when done');\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function end(options: EndOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const session = await engine.endSession(projectId, options.summary);\n\n success(`Ended session: ${session.title}`);\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function list(options: ListOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const sessions = await engine.listSessions(projectId, options.branch);\n\n console.log(section('Sessions'));\n console.log();\n console.log(formatEntryList(sessions));\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function current(): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const session = await engine.getActiveSession(projectId);\n\n if (!session) {\n info('No active session');\n await db.close();\n return;\n }\n\n console.log(formatEntry(session));\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nexport const sessionCommand = {\n start,\n end,\n list,\n current,\n};\n","/**\n * Search command\n */\n\nimport { loadProject } from '../utils/project.js';\nimport { error, formatEntryList, section } from '../utils/output.js';\n\ninterface SearchOptions {\n branch?: string;\n type?: string;\n limit?: number;\n}\n\nexport async function searchCommand(\n query: string,\n options: SearchOptions\n): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n const results = await engine.searchEntries(projectId, query, {\n branch: options.branch,\n type: options.type,\n });\n\n // Apply limit if specified\n const limited = options.limit ? results.slice(0, options.limit) : results;\n\n console.log(section(`Search Results for \"${query}\"`));\n console.log();\n console.log(formatEntryList(limited));\n console.log();\n console.log(`Found ${results.length} result(s)`);\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n","/**\n * Export/Import commands\n */\n\nimport { writeFileSync, readFileSync } from 'fs';\nimport { loadProject } from '../utils/project.js';\nimport { success, error, info } from '../utils/output.js';\n\ninterface ExportOptions {\n output?: string;\n branch?: string;\n}\n\ninterface ImportOptions {\n file: string;\n merge?: boolean;\n}\n\nexport async function exportCommand(options: ExportOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n // Get all entries\n const entries = await engine.getAllEntries({\n projectId,\n branch: options.branch,\n isArchived: false,\n });\n\n const exportData = {\n version: '1.0',\n exportedAt: new Date().toISOString(),\n projectId,\n branch: options.branch || 'main',\n entries: entries.map((e) => ({\n id: e.id,\n type: e.type,\n title: e.title,\n content: e.content,\n metadata: e.metadata,\n branch: e.branch,\n createdAt: e.createdAt.toISOString(),\n updatedAt: e.updatedAt.toISOString(),\n })),\n };\n\n const json = JSON.stringify(exportData, null, 2);\n\n if (options.output) {\n writeFileSync(options.output, json, 'utf-8');\n success(`Exported ${entries.length} entries to ${options.output}`);\n } else {\n // Output to stdout\n console.log(json);\n }\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n\nexport async function importCommand(options: ImportOptions): Promise<void> {\n try {\n const { engine, projectId, db } = await loadProject();\n\n // Read import file\n let data: any;\n try {\n const json = readFileSync(options.file, 'utf-8');\n data = JSON.parse(json);\n } catch (err) {\n error(`Failed to read import file: ${(err as Error).message}`);\n process.exit(1);\n }\n\n if (!data.entries || !Array.isArray(data.entries)) {\n error('Invalid import file format');\n process.exit(1);\n }\n\n info(`Importing ${data.entries.length} entries...`);\n\n let imported = 0;\n for (const entry of data.entries) {\n try {\n // Create new entry with imported data\n await db.createEntry({\n projectId,\n type: entry.type,\n title: entry.title,\n content: entry.content,\n metadata: entry.metadata,\n branch: entry.branch,\n });\n imported++;\n } catch (err) {\n console.error(`Failed to import entry \"${entry.title}\": ${(err as Error).message}`);\n }\n }\n\n success(`Imported ${imported} of ${data.entries.length} entries`);\n\n await db.close();\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n}\n","/**\n * Auth Commands - Handle authentication with Supabase\n */\n\nimport { SupabaseAuth } from '@mycontxt/adapters/supabase-auth';\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { getSupabaseConfig } from '../config.js';\nimport { success, error as outputError, warn, header } from '../utils/output.js';\n\nconst CONFIG_DIR = join(homedir(), '.contxt');\nconst AUTH_FILE = join(CONFIG_DIR, 'auth.json');\n\ninterface AuthData {\n accessToken: string;\n userId: string;\n email: string;\n githubUsername?: string;\n expiresAt?: string;\n}\n\n/**\n * Save auth data to disk\n */\nfunction saveAuthData(data: AuthData): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n\n writeFileSync(AUTH_FILE, JSON.stringify(data, null, 2), 'utf-8');\n}\n\n/**\n * Load auth data from disk\n */\nfunction loadAuthData(): AuthData | null {\n if (!existsSync(AUTH_FILE)) {\n return null;\n }\n\n try {\n const content = readFileSync(AUTH_FILE, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\n/**\n * Login command\n */\nexport const authCommand = {\n async login(options: { email?: string }) {\n try {\n const config = getSupabaseConfig();\n const auth = new SupabaseAuth(config);\n\n header('Contxt Authentication');\n console.log('');\n\n if (options.email) {\n // Magic link flow\n await auth.loginWithMagicLink(options.email);\n console.log('');\n success('Magic link sent! Check your email and click the link.');\n console.log(' Then run `contxt auth status` to verify.');\n } else {\n // GitHub OAuth flow\n console.log('Opening browser for GitHub authentication...\\n');\n\n const result = await auth.loginWithGitHub();\n\n saveAuthData({\n accessToken: result.accessToken,\n userId: result.user.id,\n email: result.user.email,\n githubUsername: result.user.githubUsername,\n });\n\n console.log('');\n success('Successfully authenticated!');\n console.log(` Email: ${result.user.email}`);\n if (result.user.githubUsername) {\n console.log(` GitHub: @${result.user.githubUsername}`);\n }\n console.log('\\nYou can now use `contxt push` and `contxt pull` to sync your memory.');\n }\n } catch (err) {\n outputError(`Authentication failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n },\n\n async logout() {\n try {\n const config = getSupabaseConfig();\n const auth = new SupabaseAuth(config);\n\n await auth.logout();\n\n // Remove local auth file\n if (existsSync(AUTH_FILE)) {\n const fs = await import('fs/promises');\n await fs.unlink(AUTH_FILE);\n }\n\n success('Logged out successfully');\n } catch (err) {\n outputError(`Logout failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n },\n\n async status() {\n try {\n const authData = loadAuthData();\n\n if (!authData) {\n outputError('Not authenticated');\n console.log('\\nRun `contxt auth login` to authenticate.');\n process.exit(1);\n }\n\n success('Authenticated');\n console.log(` Email: ${authData.email}`);\n if (authData.githubUsername) {\n console.log(` GitHub: @${authData.githubUsername}`);\n }\n console.log(` User ID: ${authData.userId}`);\n\n // Try to refresh session to check if still valid\n const config = getSupabaseConfig();\n const auth = new SupabaseAuth(config);\n\n try {\n await auth.refreshSession();\n console.log('');\n success('Session is valid');\n } catch {\n console.log('');\n warn('Session expired. Run `contxt auth login` to re-authenticate.');\n }\n } catch (err) {\n outputError(`Status check failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n },\n};\n\n/**\n * Get access token for API calls\n */\nexport function getAccessToken(): string | null {\n const authData = loadAuthData();\n return authData?.accessToken || null;\n}\n","/**\n * Sync Commands - Push/pull memory to/from cloud\n */\n\nimport { SQLiteDatabase } from '@mycontxt/adapters/sqlite';\nimport { SupabaseDatabase } from '@mycontxt/adapters/supabase';\nimport { SyncEngine } from '@mycontxt/core';\nimport { getDbPath } from '../utils/project.js';\nimport { getAccessToken } from './auth.js';\nimport { getSupabaseConfig } from '../config.js';\nimport { success, error as outputError, warn, loading, dryRun, conflict } from '../utils/output.js';\n\nexport const syncCommand = {\n /**\n * Push local changes to cloud\n */\n async push(options: { force?: boolean; dryRun?: boolean }) {\n try {\n // Check authentication\n const accessToken = getAccessToken();\n if (!accessToken) {\n outputError('Not authenticated. Run `contxt auth login` first.');\n process.exit(1);\n }\n\n // Get local database\n const dbPath = getDbPath();\n const localDb = new SQLiteDatabase(dbPath);\n await localDb.initialize();\n\n try {\n // Get project\n const cwd = process.cwd();\n const project = await localDb.getProjectByPath(cwd);\n\n if (!project) {\n outputError('No Contxt project found. Run `contxt init` first.');\n process.exit(1);\n }\n\n // Initialize remote database\n const supabaseConfig = getSupabaseConfig();\n const remoteDb = new SupabaseDatabase({\n ...supabaseConfig,\n accessToken,\n });\n await remoteDb.initialize();\n\n // Create sync engine\n const syncEngine = new SyncEngine(localDb, remoteDb);\n\n loading('Pushing local changes to cloud...');\n console.log('');\n\n // Push changes\n const result = await syncEngine.push(project.id, {\n force: options.force,\n dryRun: options.dryRun,\n });\n\n if (result.errors.length > 0) {\n outputError('Push failed:');\n result.errors.forEach((err) => console.error(` ${err}`));\n process.exit(1);\n }\n\n if (options.dryRun) {\n dryRun(`Dry run — would push ${result.pushed} entries`);\n } else {\n success(`Pushed ${result.pushed} entries`);\n }\n\n if (result.conflicts > 0) {\n conflict(`${result.conflicts} conflict(s) detected. Use --force to override.`);\n }\n\n await remoteDb.close();\n } finally {\n await localDb.close();\n }\n } catch (err) {\n outputError(`Push failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n },\n\n /**\n * Pull remote changes to local\n */\n async pull(options: { force?: boolean; dryRun?: boolean }) {\n try {\n // Check authentication\n const accessToken = getAccessToken();\n if (!accessToken) {\n outputError('Not authenticated. Run `contxt auth login` first.');\n process.exit(1);\n }\n\n // Get local database\n const dbPath = getDbPath();\n const localDb = new SQLiteDatabase(dbPath);\n await localDb.initialize();\n\n try {\n // Get project\n const cwd = process.cwd();\n const project = await localDb.getProjectByPath(cwd);\n\n if (!project) {\n outputError('No Contxt project found. Run `contxt init` first.');\n process.exit(1);\n }\n\n // Initialize remote database\n const supabaseConfig = getSupabaseConfig();\n const remoteDb = new SupabaseDatabase({\n ...supabaseConfig,\n accessToken,\n });\n await remoteDb.initialize();\n\n // Create sync engine\n const syncEngine = new SyncEngine(localDb, remoteDb);\n\n loading('Pulling remote changes to local...');\n console.log('');\n\n // Pull changes\n const result = await syncEngine.pull(project.id, {\n force: options.force,\n dryRun: options.dryRun,\n });\n\n if (result.errors.length > 0) {\n outputError('Pull failed:');\n result.errors.forEach((err) => console.error(` ${err}`));\n process.exit(1);\n }\n\n if (options.dryRun) {\n dryRun(`Dry run — would pull ${result.pulled} entries`);\n } else {\n success(`Pulled ${result.pulled} entries`);\n }\n\n if (result.conflicts > 0) {\n conflict(`${result.conflicts} conflict(s) detected. Use --force to override.`);\n }\n\n await remoteDb.close();\n } finally {\n await localDb.close();\n }\n } catch (err) {\n outputError(`Pull failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n },\n\n /**\n * Full bidirectional sync\n */\n async sync(options: { force?: boolean; dryRun?: boolean }) {\n try {\n // Check authentication\n const accessToken = getAccessToken();\n if (!accessToken) {\n outputError('Not authenticated. Run `contxt auth login` first.');\n process.exit(1);\n }\n\n // Get local database\n const dbPath = getDbPath();\n const localDb = new SQLiteDatabase(dbPath);\n await localDb.initialize();\n\n try {\n // Get project\n const cwd = process.cwd();\n const project = await localDb.getProjectByPath(cwd);\n\n if (!project) {\n outputError('No Contxt project found. Run `contxt init` first.');\n process.exit(1);\n }\n\n // Initialize remote database\n const supabaseConfig = getSupabaseConfig();\n const remoteDb = new SupabaseDatabase({\n ...supabaseConfig,\n accessToken,\n });\n await remoteDb.initialize();\n\n // Create sync engine\n const syncEngine = new SyncEngine(localDb, remoteDb);\n\n loading('Syncing with cloud (pull + push)...');\n console.log('');\n\n // Full sync\n const result = await syncEngine.sync(project.id, {\n force: options.force,\n dryRun: options.dryRun,\n });\n\n if (result.errors.length > 0) {\n outputError('Sync failed:');\n result.errors.forEach((err) => console.error(` ${err}`));\n process.exit(1);\n }\n\n if (options.dryRun) {\n dryRun(`Dry run — would pull ${result.pulled} and push ${result.pushed} entries`);\n } else {\n success('Synced successfully');\n console.log(` Pulled: ${result.pulled} entries`);\n console.log(` Pushed: ${result.pushed} entries`);\n }\n\n if (result.conflicts > 0) {\n conflict(`${result.conflicts} conflict(s) detected. Use --force to override.`);\n }\n\n await remoteDb.close();\n } finally {\n await localDb.close();\n }\n } catch (err) {\n outputError(`Sync failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n },\n};\n","/**\n * Branch Commands - Git-like branching for memory\n */\n\nimport { SQLiteDatabase } from '@mycontxt/adapters/sqlite';\nimport { getDbPath } from '../utils/project.js';\nimport { success, error as outputError } from '../utils/output.js';\nimport { createUsageGate, enforceGate } from '../utils/usage-gate.js';\n\nexport const branchCommand = {\n /**\n * Create a new branch\n */\n async create(name: string, options: { from?: string }) {\n try {\n const dbPath = getDbPath();\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n try {\n const cwd = process.cwd();\n const project = await db.getProjectByPath(cwd);\n\n if (!project) {\n outputError('No Contxt project found. Run `contxt init` first.');\n process.exit(1);\n }\n\n // Check if branching is enabled\n const gate = await createUsageGate(db, project.id);\n const result = gate.checkFeature('branchingEnabled');\n enforceGate(result);\n\n const fromBranch = options.from || (await db.getActiveBranch(project.id));\n\n await db.createBranch(project.id, name, fromBranch);\n\n success(`Created branch '${name}' from '${fromBranch}'`);\n } finally {\n await db.close();\n }\n } catch (err) {\n outputError(`Branch create failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n },\n\n /**\n * List all branches\n */\n async list() {\n try {\n const dbPath = getDbPath();\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n try {\n const cwd = process.cwd();\n const project = await db.getProjectByPath(cwd);\n\n if (!project) {\n outputError('No Contxt project found. Run `contxt init` first.');\n process.exit(1);\n }\n\n const branches = await db.listBranches(project.id);\n const activeBranch = await db.getActiveBranch(project.id);\n\n console.log('Branches:');\n for (const branch of branches) {\n const prefix = branch.name === activeBranch ? '* ' : ' ';\n const parent = branch.parentBranch ? ` (from ${branch.parentBranch})` : '';\n console.log(`${prefix}${branch.name}${parent}`);\n }\n } finally {\n await db.close();\n }\n } catch (err) {\n outputError(`Branch list failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n },\n\n /**\n * Switch to a different branch\n */\n async switch(name: string) {\n try {\n const dbPath = getDbPath();\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n try {\n const cwd = process.cwd();\n const project = await db.getProjectByPath(cwd);\n\n if (!project) {\n outputError('No Contxt project found. Run `contxt init` first.');\n process.exit(1);\n }\n\n // Check if branching is enabled\n const gate = await createUsageGate(db, project.id);\n const result = gate.checkFeature('branchingEnabled');\n enforceGate(result);\n\n await db.switchBranch(project.id, name);\n\n success(`Switched to branch '${name}'`);\n } finally {\n await db.close();\n }\n } catch (err) {\n outputError(`Branch switch failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n },\n\n /**\n * Delete a branch\n */\n async delete(name: string) {\n try {\n const dbPath = getDbPath();\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n try {\n const cwd = process.cwd();\n const project = await db.getProjectByPath(cwd);\n\n if (!project) {\n outputError('No Contxt project found. Run `contxt init` first.');\n process.exit(1);\n }\n\n const activeBranch = await db.getActiveBranch(project.id);\n\n if (name === activeBranch) {\n outputError('Cannot delete active branch. Switch to another branch first.');\n process.exit(1);\n }\n\n if (name === 'main') {\n outputError('Cannot delete main branch.');\n process.exit(1);\n }\n\n await db.deleteBranch(project.id, name);\n\n success(`Deleted branch '${name}'`);\n } finally {\n await db.close();\n }\n } catch (err) {\n outputError(`Branch delete failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n },\n\n /**\n * Merge a branch into current branch\n */\n async merge(sourceBranch: string) {\n try {\n const dbPath = getDbPath();\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n try {\n const cwd = process.cwd();\n const project = await db.getProjectByPath(cwd);\n\n if (!project) {\n outputError('No Contxt project found. Run `contxt init` first.');\n process.exit(1);\n }\n\n const targetBranch = await db.getActiveBranch(project.id);\n\n if (sourceBranch === targetBranch) {\n outputError('Cannot merge a branch into itself.');\n process.exit(1);\n }\n\n // Get entries from source branch\n const sourceEntries = await db.listEntries({\n projectId: project.id,\n branch: sourceBranch,\n isArchived: false,\n });\n\n if (sourceEntries.length === 0) {\n console.log(`No entries to merge from '${sourceBranch}'.`);\n process.exit(0);\n }\n\n // Copy entries to target branch (last-write-wins)\n let merged = 0;\n for (const entry of sourceEntries) {\n // Check if entry exists in target branch\n const existing = await db.getEntry(entry.id);\n\n if (!existing || existing.branch !== targetBranch) {\n // Create new entry in target branch\n await db.createEntry({\n id: entry.id,\n projectId: entry.projectId,\n type: entry.type,\n title: entry.title,\n content: entry.content,\n metadata: entry.metadata,\n branch: targetBranch,\n });\n merged++;\n } else if (entry.updatedAt > existing.updatedAt) {\n // Update existing entry if source is newer\n await db.updateEntry(entry.id, {\n title: entry.title,\n content: entry.content,\n metadata: entry.metadata,\n updatedAt: entry.updatedAt,\n });\n merged++;\n }\n }\n\n success(`Merged ${merged} entries from '${sourceBranch}' into '${targetBranch}'`);\n } finally {\n await db.close();\n }\n } catch (err) {\n outputError(`Branch merge failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n },\n};\n","/**\n * History Commands - Version history and time travel\n */\n\nimport { SQLiteDatabase } from '@mycontxt/adapters/sqlite';\nimport { getDbPath } from '../utils/project.js';\nimport { success, error as outputError, section } from '../utils/output.js';\n\nexport const historyCommand = {\n /**\n * Show version history for an entry\n */\n async show(entryId: string) {\n try {\n const dbPath = getDbPath();\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n try {\n const entry = await db.getEntry(entryId);\n\n if (!entry) {\n outputError('Entry not found.');\n process.exit(1);\n }\n\n const versions = await db.getVersionHistory(entryId);\n\n console.log(section(`Version History: ${entry.title}`));\n console.log('');\n console.log(`Current (v${entry.version}):`);\n console.log(` Updated: ${entry.updatedAt.toLocaleString()}`);\n console.log(` Title: ${entry.title}`);\n console.log(` Content: ${entry.content.substring(0, 100)}${entry.content.length > 100 ? '...' : ''}`);\n console.log('');\n\n if (versions.length > 0) {\n console.log('Previous versions:');\n for (const version of versions) {\n console.log(`\\nv${version.version}:`);\n console.log(` Updated: ${version.updatedAt.toLocaleString()}`);\n console.log(` Title: ${version.title}`);\n console.log(\n ` Content: ${version.content.substring(0, 100)}${version.content.length > 100 ? '...' : ''}`\n );\n }\n } else {\n console.log('No previous versions.');\n }\n } finally {\n await db.close();\n }\n } catch (err) {\n outputError(`History failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n },\n\n /**\n * Restore an entry to a previous version\n */\n async restore(entryId: string, options: { version: number }) {\n try {\n const dbPath = getDbPath();\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n try {\n const restored = await db.restoreVersion(entryId, options.version);\n\n success(`Restored '${restored.title}' to version ${options.version}`);\n console.log(` Current version is now: v${restored.version}`);\n } finally {\n await db.close();\n }\n } catch (err) {\n outputError(`Restore failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n },\n};\n","/**\n * Load Command - Generate context payload for AI prompts\n */\n\nimport { SQLiteDatabase } from '@mycontxt/adapters/sqlite';\nimport { SupabaseDatabase } from '@mycontxt/adapters/supabase';\nimport { buildContextPayload, buildContextSummary } from '@mycontxt/core';\nimport { getDbPath } from '../utils/project.js';\nimport { getSupabaseConfig } from '../config.js';\nimport { error as outputError, section } from '../utils/output.js';\nimport chalk from 'chalk';\n\nconst MODEL_COSTS_PER_1K: Record<string, number> = {\n 'claude-sonnet': 0.003,\n 'claude-haiku': 0.00025,\n 'claude-opus': 0.015,\n 'gpt-4o': 0.0025,\n 'gpt-4': 0.03,\n 'gpt-3.5': 0.0005,\n};\nconst DEFAULT_MODEL = 'claude-sonnet';\n\nfunction formatCost(tokens: number, model: string): string {\n const costPerK = MODEL_COSTS_PER_1K[model] ?? MODEL_COSTS_PER_1K[DEFAULT_MODEL];\n const cost = (tokens / 1000) * costPerK;\n return `$${cost.toFixed(4)}`;\n}\n\nasync function generateQueryEmbedding(text: string, apiKey: string): Promise<number[] | null> {\n try {\n const res = await fetch('https://api.openai.com/v1/embeddings', {\n method: 'POST',\n headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json' },\n body: JSON.stringify({ model: 'text-embedding-3-small', input: text }),\n });\n const data = await res.json();\n return data.data?.[0]?.embedding ?? null;\n } catch {\n return null;\n }\n}\n\ninterface LoadOptions {\n task?: string;\n files?: string[];\n all?: boolean;\n maxTokens?: number;\n type?: string;\n summary?: boolean;\n}\n\nexport async function loadCommand(options: LoadOptions) {\n try {\n const dbPath = getDbPath();\n const db = new SQLiteDatabase(dbPath);\n await db.initialize();\n\n try {\n const cwd = process.cwd();\n const project = await db.getProjectByPath(cwd);\n\n if (!project) {\n outputError('No Contxt project found. Run `contxt init` first.');\n process.exit(1);\n }\n\n // Get active branch\n const branch = await db.getActiveBranch(project.id);\n\n // Fetch all non-archived entries for current branch\n const entries = await db.listEntries({\n projectId: project.id,\n branch,\n isArchived: false,\n });\n\n if (entries.length === 0) {\n console.log('No memory entries found. Add some context first!');\n process.exit(0);\n }\n\n // Summary mode\n if (options.summary) {\n const summary = buildContextSummary(entries);\n\n console.log(section('Context Summary'));\n console.log('');\n console.log(`Total entries: ${summary.totalEntries}`);\n console.log(`Branch: ${branch}`);\n console.log('');\n\n console.log('By type:');\n for (const [type, count] of Object.entries(summary.byType)) {\n console.log(` ${type}: ${count}`);\n }\n\n if (summary.recentActivity.length > 0) {\n console.log(`\\nRecent activity:`);\n summary.recentActivity.forEach((activity) => {\n console.log(` • ${activity}`);\n });\n }\n\n if (summary.oldestEntry && summary.newestEntry) {\n console.log(\n `\\nDate range: ${summary.oldestEntry.toLocaleDateString()} - ${summary.newestEntry.toLocaleDateString()}`\n );\n }\n\n process.exit(0);\n }\n\n // Determine context mode\n let mode: 'task' | 'files' | 'all' = 'all';\n if (options.task) {\n mode = 'task';\n } else if (options.files && options.files.length > 0) {\n mode = 'files';\n } else if (options.all) {\n mode = 'all';\n }\n\n const totalEntryCount = entries.length;\n\n // In task mode, try semantic search via remote DB before falling back to keyword scoring\n let resolvedEntries = entries;\n if (mode === 'task' && options.task) {\n const apiKey = process.env.OPENAI_API_KEY;\n if (apiKey) {\n try {\n const config = getSupabaseConfig();\n const remoteDb = new SupabaseDatabase(config);\n const embedding = await generateQueryEmbedding(options.task, apiKey);\n if (embedding) {\n const semanticResults = await remoteDb.semanticSearch(project.id, embedding, {\n branch,\n limit: 20,\n minSimilarity: 0.65,\n }).catch(() => []);\n if (semanticResults.length > 0) {\n resolvedEntries = semanticResults;\n }\n }\n } catch {\n // No remote config — use local keyword scoring\n }\n }\n }\n\n // Build context\n const result = buildContextPayload(resolvedEntries, {\n projectId: project.id,\n type: mode,\n taskDescription: options.task,\n activeFiles: options.files,\n maxTokens: options.maxTokens || 4000,\n includeTypes: options.type ? [options.type] : undefined,\n });\n\n // Output context\n console.log(result.context);\n\n // Print stats to stderr so they don't pollute the context\n const model = process.env.CONTXT_MODEL ?? DEFAULT_MODEL;\n const totalFiltered = totalEntryCount - result.entriesIncluded;\n\n if (totalFiltered > 0 && result.tokensSaved > 0) {\n const filteredCost = formatCost(result.tokensUsed, model);\n const fullCost = formatCost(result.tokensUsed + result.tokensSaved, model);\n console.error(\n chalk.dim(\n `\\n→ ${result.entriesIncluded} entries loaded · ${result.tokensUsed} tokens · ` +\n `saved ${result.tokensSaved.toLocaleString()} tokens (${totalFiltered} filtered) · ` +\n `~${filteredCost} vs ${fullCost} full load`\n )\n );\n } else {\n console.error(\n chalk.dim(`\\n→ ${result.entriesIncluded} entries loaded · ${result.tokensUsed}/${result.budget} tokens`)\n );\n }\n } finally {\n await db.close();\n }\n } catch (err) {\n outputError(`Load failed: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n}\n","/**\n * Scan command - Extract tagged comments from code\n */\n\nimport { readFileSync, existsSync } from 'fs';\nimport { join, relative } from 'path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { parseFile, scanCommentToEntry, type ScanComment } from '@mycontxt/core';\nimport { getProjectDb } from '../utils/project.js';\nimport { glob } from 'glob';\n\ninterface ScanOptions {\n path?: string;\n dryRun?: boolean;\n autoConfirm?: boolean;\n watch?: boolean;\n}\n\nexport async function scanCommand(options: ScanOptions = {}) {\n const spinner = ora('Scanning project...').start();\n\n try {\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n\n if (!project) {\n spinner.fail('Not a Contxt project. Run `contxt init` first.');\n return;\n }\n\n // File patterns to scan\n const patterns = [\n '**/*.ts',\n '**/*.tsx',\n '**/*.js',\n '**/*.jsx',\n '**/*.py',\n '**/*.rb',\n '**/*.go',\n '**/*.rs',\n '**/*.sql',\n '**/*.sh',\n ];\n\n // Ignore patterns\n const ignore = [\n '**/node_modules/**',\n '**/.git/**',\n '**/dist/**',\n '**/build/**',\n '**/.next/**',\n '**/*.min.js',\n '**/*.lock',\n '.contxt/**',\n ];\n\n // Add .contxtignore patterns if file exists\n const contxtIgnorePath = join(process.cwd(), '.contxtignore');\n if (existsSync(contxtIgnorePath)) {\n const contxtIgnore = readFileSync(contxtIgnorePath, 'utf-8')\n .split('\\n')\n .filter((line) => line.trim() && !line.startsWith('#'));\n ignore.push(...contxtIgnore);\n }\n\n // Get files to scan\n const searchPath = options.path || process.cwd();\n const files = await glob(patterns, {\n cwd: searchPath,\n ignore,\n absolute: true,\n nodir: true,\n });\n\n spinner.text = `Scanning ${files.length} files...`;\n\n // Parse all files\n const allComments: ScanComment[] = [];\n for (const file of files) {\n const content = readFileSync(file, 'utf-8');\n const comments = parseFile(content, relative(process.cwd(), file));\n allComments.push(...comments);\n }\n\n spinner.succeed(`Found ${allComments.length} tagged comments across ${files.length} files`);\n\n if (allComments.length === 0) {\n console.log(chalk.gray('\\nNo tagged comments found. Try adding @decision, @pattern, or @context tags to your code.'));\n return;\n }\n\n // Load existing scanned entries to detect changes\n const existingEntries = await db.listEntries({\n projectId: project.id,\n branch: await db.getActiveBranch(project.id),\n });\n\n const existingHashes = new Map(\n existingEntries\n .filter((e) => e.metadata.source === 'scan' && e.metadata.hash)\n .map((e) => [e.metadata.hash, e])\n );\n\n // Categorize comments\n const newComments: ScanComment[] = [];\n const updatedComments: ScanComment[] = [];\n const unchangedComments: ScanComment[] = [];\n\n for (const comment of allComments) {\n const existing = existingHashes.get(comment.hash);\n if (!existing) {\n newComments.push(comment);\n } else {\n // Check if content actually changed\n const entry = scanCommentToEntry(comment, project.id);\n if (\n existing.title !== entry.title ||\n existing.content !== entry.content\n ) {\n updatedComments.push(comment);\n } else {\n unchangedComments.push(comment);\n }\n existingHashes.delete(comment.hash); // Mark as still present\n }\n }\n\n // Remaining hashes are stale (source removed)\n const staleEntries = Array.from(existingHashes.values());\n\n // Display results\n console.log('');\n if (newComments.length > 0) {\n console.log(chalk.bold('NEW'));\n for (const comment of newComments) {\n const icon = getTypeIcon(comment.tag);\n console.log(\n ` ${chalk.green('+')} ${icon} ${chalk.bold(comment.title.substring(0, 50))} ${chalk.gray(comment.file + ':' + comment.line)}`\n );\n }\n console.log('');\n }\n\n if (updatedComments.length > 0) {\n console.log(chalk.bold('UPDATED'));\n for (const comment of updatedComments) {\n const icon = getTypeIcon(comment.tag);\n console.log(\n ` ${chalk.yellow('~')} ${icon} ${chalk.bold(comment.title.substring(0, 50))} ${chalk.gray(comment.file + ':' + comment.line)}`\n );\n }\n console.log('');\n }\n\n if (unchangedComments.length > 0) {\n console.log(chalk.bold('UNCHANGED'));\n for (const comment of unchangedComments.slice(0, 3)) {\n const icon = getTypeIcon(comment.tag);\n console.log(\n ` ${chalk.gray('·')} ${icon} ${chalk.gray(comment.title.substring(0, 50))} ${chalk.gray(comment.file + ':' + comment.line)}`\n );\n }\n if (unchangedComments.length > 3) {\n console.log(chalk.gray(` ... and ${unchangedComments.length - 3} more`));\n }\n console.log('');\n }\n\n if (staleEntries.length > 0) {\n console.log(chalk.bold('STALE (source comment removed)'));\n for (const entry of staleEntries) {\n const icon = getTypeIcon(entry.type);\n console.log(\n ` ${chalk.red('?')} ${icon} ${chalk.gray(entry.title.substring(0, 50))} ${chalk.gray('was: ' + entry.metadata.file + ':' + entry.metadata.line)}`\n );\n }\n console.log('');\n }\n\n // Handle dry run\n if (options.dryRun) {\n console.log(chalk.yellow('Dry run - no changes saved.'));\n return;\n }\n\n // Save new and updated entries as drafts\n const toSave = [...newComments, ...updatedComments];\n if (toSave.length > 0) {\n const saveSpinner = ora('Saving entries...').start();\n\n for (const comment of toSave) {\n const entry = scanCommentToEntry(comment, project.id);\n const existing = existingHashes.get(comment.hash);\n\n if (existing) {\n // Update existing\n await db.updateEntry(existing.id, {\n title: entry.title,\n content: entry.content,\n metadata: entry.metadata,\n });\n } else {\n // Create new as draft\n await db.createEntry({\n projectId: project.id,\n type: entry.type,\n title: entry.title,\n content: entry.content,\n metadata: entry.metadata,\n status: options.autoConfirm ? 'active' : 'draft',\n });\n }\n }\n\n saveSpinner.succeed(\n options.autoConfirm\n ? `Saved ${toSave.length} entries.`\n : `${toSave.length} new entries saved as drafts.`\n );\n }\n\n // Mark stale entries\n if (staleEntries.length > 0) {\n for (const entry of staleEntries) {\n await db.updateEntry(entry.id, { status: 'stale' });\n }\n console.log(chalk.gray(`Marked ${staleEntries.length} entries as stale.`));\n }\n\n // Show next steps\n if (!options.autoConfirm && toSave.length > 0) {\n console.log('');\n console.log(chalk.cyan(`Run ${chalk.bold('contxt review')} to confirm drafts.`));\n }\n\n await db.close();\n } catch (error) {\n spinner.fail('Scan failed');\n console.error(chalk.red(error instanceof Error ? error.message : String(error)));\n process.exit(1);\n }\n}\n\nfunction getTypeIcon(type: string): string {\n const icons: Record<string, string> = {\n decision: chalk.blue('DECISION'),\n pattern: chalk.magenta('PATTERN'),\n context: chalk.green('CONTEXT'),\n };\n return icons[type] || type.toUpperCase();\n}\n","/**\n * Review command - Interactive draft review queue\n */\n\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport { getProjectDb } from '../utils/project.js';\nimport type { MemoryEntry } from '@mycontxt/core';\n\ninterface ReviewOptions {\n source?: string;\n confirmAll?: boolean;\n discardAll?: boolean;\n count?: boolean;\n}\n\nexport async function reviewCommand(options: ReviewOptions = {}) {\n try {\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n\n if (!project) {\n console.log(chalk.red('Not a Contxt project. Run `contxt init` first.'));\n return;\n }\n\n // Get all draft entries\n let drafts = await db.listEntries({\n projectId: project.id,\n branch: await db.getActiveBranch(project.id),\n });\n\n drafts = drafts.filter((e) => e.status === 'draft');\n\n // Filter by source if specified\n if (options.source) {\n drafts = drafts.filter((e) => {\n const source = e.metadata.source || '';\n return source.includes(options.source!);\n });\n }\n\n if (drafts.length === 0) {\n console.log(chalk.green('✓ No drafts pending review'));\n return;\n }\n\n // Show count only\n if (options.count) {\n console.log(`${drafts.length} drafts pending review`);\n return;\n }\n\n console.log(chalk.bold(`\\n${drafts.length} drafts pending review\\n`));\n\n // Confirm all\n if (options.confirmAll) {\n const spinner = ora('Confirming all drafts...').start();\n for (const draft of drafts) {\n await db.updateEntry(draft.id, { status: 'active' });\n }\n spinner.succeed(`Confirmed ${drafts.length} drafts`);\n await db.close();\n return;\n }\n\n // Discard all\n if (options.discardAll) {\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: `Discard all ${drafts.length} drafts?`,\n default: false,\n },\n ]);\n\n if (confirm) {\n const spinner = ora('Discarding all drafts...').start();\n for (const draft of drafts) {\n await db.deleteEntry(draft.id);\n }\n spinner.succeed(`Discarded ${drafts.length} drafts`);\n }\n await db.close();\n return;\n }\n\n // Interactive review\n let confirmed = 0;\n let discarded = 0;\n let skipped = 0;\n\n for (const draft of drafts) {\n console.log(chalk.gray('─'.repeat(50)));\n console.log('');\n displayDraft(draft);\n console.log('');\n\n const { action } = await inquirer.prompt([\n {\n type: 'list',\n name: 'action',\n message: 'Action?',\n choices: [\n { name: 'Confirm', value: 'confirm' },\n { name: 'Edit then confirm', value: 'edit' },\n { name: 'Discard', value: 'discard' },\n { name: 'Skip (review later)', value: 'skip' },\n ],\n },\n ]);\n\n if (action === 'confirm') {\n await db.updateEntry(draft.id, { status: 'active' });\n console.log(chalk.green('✓ Confirmed'));\n confirmed++;\n } else if (action === 'edit') {\n const edited = await editDraft(draft);\n await db.updateEntry(draft.id, {\n title: edited.title,\n content: edited.content,\n metadata: edited.metadata,\n status: 'active',\n });\n console.log(chalk.green('✓ Edited and confirmed'));\n confirmed++;\n } else if (action === 'discard') {\n await db.deleteEntry(draft.id);\n console.log(chalk.red('✗ Discarded'));\n discarded++;\n } else {\n console.log(chalk.gray('○ Skipped'));\n skipped++;\n }\n\n console.log('');\n }\n\n console.log(chalk.gray('─'.repeat(50)));\n console.log('');\n console.log(chalk.bold('Review complete'));\n console.log(` ${chalk.green(confirmed)} confirmed`);\n console.log(` ${chalk.red(discarded)} discarded`);\n console.log(` ${chalk.gray(skipped)} skipped`);\n console.log('');\n\n await db.close();\n } catch (error) {\n console.error(chalk.red(error instanceof Error ? error.message : String(error)));\n process.exit(1);\n }\n}\n\nfunction displayDraft(draft: MemoryEntry) {\n const icon = getTypeIcon(draft.type);\n const source = draft.metadata.source || 'unknown';\n const file = draft.metadata.file ? ` · ${draft.metadata.file}:${draft.metadata.line}` : '';\n const timeAgo = getTimeAgo(draft.createdAt);\n\n console.log(` ${icon} ${chalk.bold(draft.title)}`);\n console.log(` ${chalk.gray(`Source: ${source}${file} · ${timeAgo}`)}`);\n\n // Show content preview\n const contentPreview = draft.content.split('\\n')[0].substring(0, 80);\n if (contentPreview) {\n console.log(` ${chalk.gray(contentPreview)}${draft.content.length > 80 ? '...' : ''}`);\n }\n\n // Show additional metadata\n if (draft.type === 'decision') {\n if (draft.metadata.rationale) {\n console.log(` ${chalk.dim('Rationale:')} ${draft.metadata.rationale.substring(0, 60)}...`);\n }\n if (draft.metadata.alternatives) {\n console.log(` ${chalk.dim('Alternatives:')} ${draft.metadata.alternatives}`);\n }\n }\n\n if (draft.type === 'pattern') {\n if (draft.metadata.when) {\n console.log(` ${chalk.dim('When:')} ${draft.metadata.when}`);\n }\n }\n}\n\nasync function editDraft(draft: MemoryEntry): Promise<Partial<MemoryEntry>> {\n console.log(chalk.cyan('\\nEdit mode (press Enter to keep current value):\\n'));\n\n const { title, content } = await inquirer.prompt([\n {\n type: 'input',\n name: 'title',\n message: 'Title:',\n default: draft.title,\n },\n {\n type: 'input',\n name: 'content',\n message: 'Content:',\n default: draft.content,\n },\n ]);\n\n return {\n title: title || draft.title,\n content: content || draft.content,\n metadata: draft.metadata,\n };\n}\n\nfunction getTypeIcon(type: string): string {\n const icons: Record<string, string> = {\n decision: chalk.blue('DECISION'),\n pattern: chalk.magenta('PATTERN'),\n context: chalk.green('CONTEXT'),\n document: chalk.yellow('DOCUMENT'),\n session: chalk.cyan('SESSION'),\n };\n return icons[type] || type.toUpperCase();\n}\n\nfunction getTimeAgo(date: Date): string {\n const seconds = Math.floor((Date.now() - date.getTime()) / 1000);\n\n if (seconds < 60) return 'just now';\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;\n if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`;\n return `${Math.floor(seconds / 86400)}d ago`;\n}\n","/**\n * Rules command - Bidirectional sync with .contxt/rules.md\n */\n\nimport { readFileSync, writeFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { parseRulesFile, generateRulesFile } from '@mycontxt/core';\nimport { getProjectDb } from '../utils/project.js';\nimport type { MemoryEntry } from '@mycontxt/core';\n\ninterface RulesOptions {\n force?: boolean;\n dryRun?: boolean;\n}\n\n/**\n * Sync rules.md into memory store\n */\nexport async function syncCommand(options: RulesOptions = {}) {\n const spinner = ora('Reading rules.md...').start();\n\n try {\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n\n if (!project) {\n spinner.fail('Not a Contxt project. Run `contxt init` first.');\n return;\n }\n\n const rulesPath = join(process.cwd(), '.contxt', 'rules.md');\n if (!existsSync(rulesPath)) {\n spinner.fail('No rules.md file found. Run `contxt rules generate` to create one.');\n return;\n }\n\n const content = readFileSync(rulesPath, 'utf-8');\n const parsed = parseRulesFile(content);\n\n spinner.text = 'Processing entries...';\n\n let added = 0;\n let updated = 0;\n let unchanged = 0;\n\n // Get existing entries\n const existingEntries = await db.listEntries({\n projectId: project.id,\n branch: await db.getActiveBranch(project.id),\n });\n\n const existingByTitle = new Map(\n existingEntries.map((e) => [e.title, e])\n );\n\n // Process decisions\n for (const decision of parsed.decisions) {\n const existing = existingByTitle.get(decision.title);\n\n if (!existing) {\n if (!options.dryRun) {\n await db.createEntry({\n projectId: project.id,\n type: 'decision',\n title: decision.title,\n content: decision.content,\n metadata: decision.metadata,\n status: 'active',\n });\n }\n added++;\n } else if (existing.content !== decision.content) {\n if (!options.dryRun) {\n await db.updateEntry(existing.id, {\n content: decision.content,\n metadata: decision.metadata,\n });\n }\n updated++;\n } else {\n unchanged++;\n }\n }\n\n // Process patterns\n for (const pattern of parsed.patterns) {\n const existing = existingByTitle.get(pattern.title);\n\n if (!existing) {\n if (!options.dryRun) {\n await db.createEntry({\n projectId: project.id,\n type: 'pattern',\n title: pattern.title,\n content: pattern.content,\n metadata: pattern.metadata,\n status: 'active',\n });\n }\n added++;\n } else if (existing.content !== pattern.content) {\n if (!options.dryRun) {\n await db.updateEntry(existing.id, {\n content: pattern.content,\n metadata: pattern.metadata,\n });\n }\n updated++;\n } else {\n unchanged++;\n }\n }\n\n // Process context\n if (parsed.context) {\n const existing = existingEntries.find((e) => e.type === 'context' && e.metadata.source === 'rules');\n\n if (!existing) {\n if (!options.dryRun) {\n await db.createEntry({\n projectId: project.id,\n type: 'context',\n title: parsed.context.title,\n content: parsed.context.content,\n metadata: parsed.context.metadata,\n status: 'active',\n });\n }\n added++;\n } else if (existing.content !== parsed.context.content) {\n if (!options.dryRun) {\n await db.updateEntry(existing.id, {\n content: parsed.context.content,\n });\n }\n updated++;\n } else {\n unchanged++;\n }\n }\n\n // Process documents\n for (const doc of parsed.documents) {\n const existing = existingByTitle.get(doc.title);\n\n if (!existing) {\n if (!options.dryRun) {\n await db.createEntry({\n projectId: project.id,\n type: 'document',\n title: doc.title,\n content: doc.content,\n metadata: doc.metadata,\n status: 'active',\n });\n }\n added++;\n } else if (existing.content !== doc.content) {\n if (!options.dryRun) {\n await db.updateEntry(existing.id, {\n content: doc.content,\n metadata: doc.metadata,\n });\n }\n updated++;\n } else {\n unchanged++;\n }\n }\n\n // Update stack in project config\n if (parsed.stack.length > 0 && !options.dryRun) {\n // Store stack in project metadata\n await db.updateProject(project.id, {\n stack: parsed.stack,\n });\n }\n\n spinner.succeed(\n options.dryRun\n ? `Dry run: Would add ${added}, update ${updated}, leave ${unchanged} unchanged`\n : `Synced rules.md: ${added} added, ${updated} updated, ${unchanged} unchanged`\n );\n\n await db.close();\n } catch (error) {\n spinner.fail('Sync failed');\n console.error(chalk.red(error instanceof Error ? error.message : String(error)));\n process.exit(1);\n }\n}\n\n/**\n * Generate rules.md from memory store\n */\nexport async function generateCommand(options: RulesOptions = {}) {\n const spinner = ora('Loading memory entries...').start();\n\n try {\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n\n if (!project) {\n spinner.fail('Not a Contxt project. Run `contxt init` first.');\n return;\n }\n\n const rulesPath = join(process.cwd(), '.contxt', 'rules.md');\n\n if (existsSync(rulesPath) && !options.force) {\n spinner.fail('rules.md already exists. Use --force to overwrite.');\n return;\n }\n\n const branch = await db.getActiveBranch(project.id);\n const allEntries = await db.listEntries({\n projectId: project.id,\n branch,\n });\n\n // Group entries by type\n const decisions = allEntries.filter((e) => e.type === 'decision' && e.status === 'active');\n const patterns = allEntries.filter((e) => e.type === 'pattern' && e.status === 'active');\n const context = allEntries.filter((e) => e.type === 'context' && e.status === 'active');\n const documents = allEntries.filter((e) => e.type === 'document' && e.status === 'active');\n\n spinner.text = 'Generating rules.md...';\n\n const rulesContent = generateRulesFile({\n stack: project.stack || [],\n decisions: decisions.map((d) => ({\n title: d.title,\n content: d.content,\n metadata: d.metadata,\n })),\n patterns: patterns.map((p) => ({\n title: p.title,\n content: p.content,\n metadata: p.metadata,\n })),\n context: context.map((c) => ({\n content: c.content,\n })),\n documents: documents.map((d) => ({\n title: d.title,\n content: d.content,\n })),\n });\n\n if (options.dryRun) {\n spinner.succeed('Generated rules.md (dry run):');\n console.log('');\n console.log(chalk.gray(rulesContent));\n } else {\n writeFileSync(rulesPath, rulesContent, 'utf-8');\n spinner.succeed(`Generated ${rulesPath}`);\n }\n\n await db.close();\n } catch (error) {\n spinner.fail('Generate failed');\n console.error(chalk.red(error instanceof Error ? error.message : String(error)));\n process.exit(1);\n }\n}\n\n/**\n * Show diff between rules.md and memory store\n */\nexport async function diffCommand() {\n const spinner = ora('Comparing rules.md with memory...').start();\n\n try {\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n\n if (!project) {\n spinner.fail('Not a Contxt project. Run `contxt init` first.');\n return;\n }\n\n const rulesPath = join(process.cwd(), '.contxt', 'rules.md');\n if (!existsSync(rulesPath)) {\n spinner.fail('No rules.md file found.');\n return;\n }\n\n // Parse rules.md\n const content = readFileSync(rulesPath, 'utf-8');\n const parsed = parseRulesFile(content);\n\n // Get memory entries\n const branch = await db.getActiveBranch(project.id);\n const allEntries = await db.listEntries({\n projectId: project.id,\n branch,\n });\n\n const existingByTitle = new Map<string, MemoryEntry>(\n allEntries.map((e) => [e.title, e])\n );\n\n spinner.stop();\n\n // Compare\n const toAdd: string[] = [];\n const toUpdate: string[] = [];\n const inSync: string[] = [];\n\n // Check decisions\n for (const decision of parsed.decisions) {\n const existing = existingByTitle.get(decision.title);\n if (!existing) {\n toAdd.push(`${chalk.blue('DECISION')} ${decision.title}`);\n } else if (existing.content !== decision.content) {\n toUpdate.push(`${chalk.blue('DECISION')} ${decision.title}`);\n } else {\n inSync.push(`${chalk.blue('DECISION')} ${decision.title}`);\n }\n }\n\n // Check patterns\n for (const pattern of parsed.patterns) {\n const existing = existingByTitle.get(pattern.title);\n if (!existing) {\n toAdd.push(`${chalk.magenta('PATTERN')} ${pattern.title}`);\n } else if (existing.content !== pattern.content) {\n toUpdate.push(`${chalk.magenta('PATTERN')} ${pattern.title}`);\n } else {\n inSync.push(`${chalk.magenta('PATTERN')} ${pattern.title}`);\n }\n }\n\n // Check documents\n for (const doc of parsed.documents) {\n const existing = existingByTitle.get(doc.title);\n if (!existing) {\n toAdd.push(`${chalk.cyan('DOCUMENT')} ${doc.title}`);\n } else if (existing.content !== doc.content) {\n toUpdate.push(`${chalk.cyan('DOCUMENT')} ${doc.title}`);\n } else {\n inSync.push(`${chalk.cyan('DOCUMENT')} ${doc.title}`);\n }\n }\n\n // Display results\n console.log('');\n if (toAdd.length > 0) {\n console.log(chalk.bold('TO ADD (in rules.md, not in memory):'));\n for (const item of toAdd) {\n console.log(` ${chalk.green('+')} ${item}`);\n }\n console.log('');\n }\n\n if (toUpdate.length > 0) {\n console.log(chalk.bold('TO UPDATE (content differs):'));\n for (const item of toUpdate) {\n console.log(` ${chalk.yellow('~')} ${item}`);\n }\n console.log('');\n }\n\n if (inSync.length > 0) {\n console.log(chalk.bold('IN SYNC:'));\n for (const item of inSync.slice(0, 5)) {\n console.log(` ${chalk.gray('·')} ${chalk.gray(item)}`);\n }\n if (inSync.length > 5) {\n console.log(chalk.gray(` ... and ${inSync.length - 5} more`));\n }\n console.log('');\n }\n\n if (toAdd.length > 0 || toUpdate.length > 0) {\n console.log(chalk.cyan(`Run ${chalk.bold('contxt rules sync')} to apply changes.`));\n } else {\n console.log(chalk.green('✓ Everything in sync!'));\n }\n\n await db.close();\n } catch (error) {\n spinner.fail('Diff failed');\n console.error(chalk.red(error instanceof Error ? error.message : String(error)));\n process.exit(1);\n }\n}\n\nexport const rulesCommand = {\n sync: syncCommand,\n generate: generateCommand,\n diff: diffCommand,\n};\n","/**\n * Capture command - Extract context from existing project files\n */\n\nimport { readFileSync, existsSync, readdirSync, statSync } from 'fs';\nimport { join, basename } from 'path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { getProjectDb } from '../utils/project.js';\nimport type { MemoryEntryType, CreateEntryInput } from '@mycontxt/core';\n\ninterface CaptureOptions {\n source?: 'readme' | 'cursor' | 'claude' | 'adr' | 'commits' | 'package' | 'all';\n dryRun?: boolean;\n autoConfirm?: boolean;\n limit?: number;\n}\n\ninterface CapturedEntry {\n type: MemoryEntryType;\n title: string;\n content: string;\n metadata: Record<string, any>;\n source: string;\n}\n\nexport async function captureCommand(options: CaptureOptions = {}) {\n const spinner = ora('Scanning project files...').start();\n\n try {\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n\n if (!project) {\n spinner.fail('Not a Contxt project. Run `contxt init` first.');\n return;\n }\n\n const entries: CapturedEntry[] = [];\n\n // Determine which sources to import\n const sources = options.source === 'all' || !options.source\n ? ['readme', 'cursor', 'claude', 'adr', 'commits', 'package']\n : [options.source];\n\n // Import from each source\n for (const source of sources) {\n spinner.text = `Importing from ${source}...`;\n\n switch (source) {\n case 'readme':\n entries.push(...importReadme());\n break;\n case 'cursor':\n entries.push(...importCursor());\n break;\n case 'claude':\n entries.push(...importClaude());\n break;\n case 'adr':\n entries.push(...importADR());\n break;\n case 'commits':\n entries.push(...importCommits(options.limit || 50));\n break;\n case 'package':\n entries.push(...importPackageFiles());\n break;\n }\n }\n\n spinner.succeed(`Found ${entries.length} entries across ${sources.length} source(s)`);\n\n if (entries.length === 0) {\n console.log(chalk.gray('\\\\nNo entries found to import.'));\n return;\n }\n\n // Display found entries\n console.log('');\n const grouped = groupBy(entries, 'source');\n for (const [source, items] of Object.entries(grouped)) {\n console.log(chalk.bold(`${source.toUpperCase()} (${items.length})`));\n for (const item of items.slice(0, 3)) {\n const icon = getTypeIcon(item.type);\n console.log(` ${icon} ${chalk.bold(item.title.substring(0, 60))}`);\n }\n if (items.length > 3) {\n console.log(chalk.gray(` ... and ${items.length - 3} more`));\n }\n console.log('');\n }\n\n // Handle dry run\n if (options.dryRun) {\n console.log(chalk.yellow('Dry run - no entries saved.'));\n return;\n }\n\n // Save entries\n const saveSpinner = ora('Saving entries...').start();\n let saved = 0;\n\n for (const entry of entries) {\n await db.createEntry({\n projectId: project.id,\n type: entry.type,\n title: entry.title,\n content: entry.content,\n metadata: {\n ...entry.metadata,\n source: `import:${entry.source}`,\n },\n status: options.autoConfirm ? 'active' : 'draft',\n });\n saved++;\n }\n\n saveSpinner.succeed(\n options.autoConfirm\n ? `Saved ${saved} entries.`\n : `${saved} entries saved as drafts.`\n );\n\n if (!options.autoConfirm) {\n console.log('');\n console.log(chalk.cyan(`Run ${chalk.bold('contxt review')} to confirm drafts.`));\n }\n\n await db.close();\n } catch (error) {\n spinner.fail('Import failed');\n console.error(chalk.red(error instanceof Error ? error.message : String(error)));\n process.exit(1);\n }\n}\n\n/**\n * Import from README.md\n */\nfunction importReadme(): CapturedEntry[] {\n const readmePath = join(process.cwd(), 'README.md');\n if (!existsSync(readmePath)) return [];\n\n try {\n const content = readFileSync(readmePath, 'utf-8');\n const lines = content.split('\\\\n');\n\n const entries: CapturedEntry[] = [];\n let currentSection: string | null = null;\n let currentContent: string[] = [];\n\n for (const line of lines) {\n // Check for headings\n const headingMatch = line.match(/^#+\\\\s+(.+)/);\n if (headingMatch) {\n // Save previous section\n if (currentSection && currentContent.length > 0) {\n const sectionContent = currentContent.join('\\\\n').trim();\n if (sectionContent.length > 50) {\n entries.push({\n type: 'document',\n title: `README: ${currentSection}`,\n content: sectionContent,\n metadata: { section: currentSection },\n source: 'readme',\n });\n }\n }\n\n currentSection = headingMatch[1].trim();\n currentContent = [];\n continue;\n }\n\n if (currentSection) {\n currentContent.push(line);\n }\n }\n\n // Save last section\n if (currentSection && currentContent.length > 0) {\n const sectionContent = currentContent.join('\\\\n').trim();\n if (sectionContent.length > 50) {\n entries.push({\n type: 'document',\n title: `README: ${currentSection}`,\n content: sectionContent,\n metadata: { section: currentSection },\n source: 'readme',\n });\n }\n }\n\n return entries;\n } catch {\n return [];\n }\n}\n\n/**\n * Import from Cursor rules files\n */\nfunction importCursor(): CapturedEntry[] {\n const entries: CapturedEntry[] = [];\n\n // Check .cursorrules\n const cursorrulesPath = join(process.cwd(), '.cursorrules');\n if (existsSync(cursorrulesPath)) {\n try {\n const content = readFileSync(cursorrulesPath, 'utf-8').trim();\n if (content.length > 0) {\n entries.push({\n type: 'document',\n title: 'Cursor Rules',\n content,\n metadata: { file: '.cursorrules' },\n source: 'cursor',\n });\n }\n } catch {\n // Ignore errors\n }\n }\n\n // Check .cursor/rules\n const cursorRulesPath = join(process.cwd(), '.cursor', 'rules');\n if (existsSync(cursorRulesPath)) {\n try {\n const content = readFileSync(cursorRulesPath, 'utf-8').trim();\n if (content.length > 0) {\n entries.push({\n type: 'document',\n title: 'Cursor Rules',\n content,\n metadata: { file: '.cursor/rules' },\n source: 'cursor',\n });\n }\n } catch {\n // Ignore errors\n }\n }\n\n return entries;\n}\n\n/**\n * Import from Claude files\n */\nfunction importClaude(): CapturedEntry[] {\n const entries: CapturedEntry[] = [];\n\n const claudePath = join(process.cwd(), '.claude', 'CLAUDE.md');\n if (existsSync(claudePath)) {\n try {\n const content = readFileSync(claudePath, 'utf-8');\n const lines = content.split('\\\\n');\n\n let currentSection: string | null = null;\n let currentContent: string[] = [];\n\n for (const line of lines) {\n const headingMatch = line.match(/^#+\\\\s+(.+)/);\n if (headingMatch) {\n // Save previous section\n if (currentSection && currentContent.length > 0) {\n const sectionContent = currentContent.join('\\\\n').trim();\n if (sectionContent.length > 50) {\n entries.push({\n type: 'document',\n title: `Claude: ${currentSection}`,\n content: sectionContent,\n metadata: { section: currentSection },\n source: 'claude',\n });\n }\n }\n\n currentSection = headingMatch[1].trim();\n currentContent = [];\n continue;\n }\n\n if (currentSection) {\n currentContent.push(line);\n }\n }\n\n // Save last section\n if (currentSection && currentContent.length > 0) {\n const sectionContent = currentContent.join('\\\\n').trim();\n if (sectionContent.length > 50) {\n entries.push({\n type: 'document',\n title: `Claude: ${currentSection}`,\n content: sectionContent,\n metadata: { section: currentSection },\n source: 'claude',\n });\n }\n }\n } catch {\n // Ignore errors\n }\n }\n\n return entries;\n}\n\n/**\n * Import from Architecture Decision Records\n */\nfunction importADR(): CapturedEntry[] {\n const entries: CapturedEntry[] = [];\n\n const adrDirs = [\n join(process.cwd(), 'docs', 'adr'),\n join(process.cwd(), 'docs', 'architecture'),\n join(process.cwd(), 'adr'),\n ];\n\n for (const adrDir of adrDirs) {\n if (!existsSync(adrDir)) continue;\n\n try {\n const files = readdirSync(adrDir)\n .filter((f) => f.endsWith('.md'))\n .map((f) => join(adrDir, f));\n\n for (const file of files) {\n try {\n const content = readFileSync(file, 'utf-8');\n const title = extractADRTitle(content, basename(file, '.md'));\n\n entries.push({\n type: 'decision',\n title,\n content: content.trim(),\n metadata: { file: file.replace(process.cwd(), '.') },\n source: 'adr',\n });\n } catch {\n // Ignore individual file errors\n }\n }\n } catch {\n // Ignore directory errors\n }\n }\n\n return entries;\n}\n\n/**\n * Extract title from ADR content\n */\nfunction extractADRTitle(content: string, fallback: string): string {\n // Try to find # Title\n const titleMatch = content.match(/^#\\\\s+(.+)/m);\n if (titleMatch) return titleMatch[1].trim();\n\n // Try to find Title: line\n const titleLineMatch = content.match(/^Title:\\\\s+(.+)/m);\n if (titleLineMatch) return titleLineMatch[1].trim();\n\n // Use filename as fallback\n return fallback\n .replace(/^\\\\d+-/, '') // Remove number prefix\n .replace(/-/g, ' ')\n .replace(/\\\\b\\\\w/g, (l) => l.toUpperCase());\n}\n\n/**\n * Import from git commits\n */\nfunction importCommits(limit: number): CapturedEntry[] {\n try {\n const { execSync } = require('child_process');\n\n // Get recent commits\n const output = execSync(\n `git log --pretty=format:\"%H|%an|%ai|%s|%b\" -n ${limit}`,\n { cwd: process.cwd(), encoding: 'utf-8' }\n ).trim();\n\n if (!output) return [];\n\n const entries: CapturedEntry[] = [];\n const commits = output.split('\\\\n');\n\n for (const commit of commits) {\n const [hash, author, date, subject, body] = commit.split('|');\n\n // Skip merge commits and trivial commits\n if (subject.startsWith('Merge ') || subject.length < 10) continue;\n\n // Look for significant commits\n const keywords = ['feat', 'feature', 'add', 'implement', 'refactor', 'breaking', 'major'];\n const isSignificant = keywords.some((kw) =>\n subject.toLowerCase().includes(kw)\n );\n\n if (isSignificant) {\n entries.push({\n type: 'session',\n title: subject.trim(),\n content: body?.trim() || subject.trim(),\n metadata: {\n commit: hash.substring(0, 8),\n author,\n date,\n },\n source: 'commits',\n });\n }\n }\n\n return entries;\n } catch {\n return [];\n }\n}\n\n/**\n * Import from package files\n */\nfunction importPackageFiles(): CapturedEntry[] {\n const entries: CapturedEntry[] = [];\n\n // package.json\n const packagePath = join(process.cwd(), 'package.json');\n if (existsSync(packagePath)) {\n try {\n const pkg = JSON.parse(readFileSync(packagePath, 'utf-8'));\n\n if (pkg.description) {\n entries.push({\n type: 'document',\n title: 'Project Description',\n content: pkg.description,\n metadata: { source_file: 'package.json' },\n source: 'package',\n });\n }\n\n // Extract major dependencies as context\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n const majorDeps = Object.keys(deps).filter((dep) =>\n ['react', 'vue', 'angular', 'express', 'fastify', 'next', 'nuxt'].includes(dep)\n );\n\n if (majorDeps.length > 0) {\n entries.push({\n type: 'context',\n title: 'Tech Stack',\n content: `Using: ${majorDeps.join(', ')}`,\n metadata: { dependencies: majorDeps },\n source: 'package',\n });\n }\n } catch {\n // Ignore errors\n }\n }\n\n // requirements.txt (Python)\n const requirementsPath = join(process.cwd(), 'requirements.txt');\n if (existsSync(requirementsPath)) {\n try {\n const content = readFileSync(requirementsPath, 'utf-8');\n const packages = content\n .split('\\\\n')\n .filter((line) => line.trim() && !line.startsWith('#'))\n .map((line) => line.split('==')[0].split('>=')[0].trim());\n\n if (packages.length > 0) {\n entries.push({\n type: 'context',\n title: 'Python Dependencies',\n content: `Python packages: ${packages.slice(0, 10).join(', ')}${packages.length > 10 ? '...' : ''}`,\n metadata: { packages: packages.slice(0, 20) },\n source: 'package',\n });\n }\n } catch {\n // Ignore errors\n }\n }\n\n // Cargo.toml (Rust)\n const cargoPath = join(process.cwd(), 'Cargo.toml');\n if (existsSync(cargoPath)) {\n try {\n const content = readFileSync(cargoPath, 'utf-8');\n const nameMatch = content.match(/name\\\\s*=\\\\s*\"([^\"]+)\"/);\n const descMatch = content.match(/description\\\\s*=\\\\s*\"([^\"]+)\"/);\n\n if (descMatch) {\n entries.push({\n type: 'document',\n title: `Rust Project: ${nameMatch?.[1] || 'Unknown'}`,\n content: descMatch[1],\n metadata: { source_file: 'Cargo.toml' },\n source: 'package',\n });\n }\n } catch {\n // Ignore errors\n }\n }\n\n return entries;\n}\n\n/**\n * Helper: Group array by key\n */\nfunction groupBy<T>(arr: T[], key: keyof T): Record<string, T[]> {\n return arr.reduce((acc, item) => {\n const group = String(item[key]);\n if (!acc[group]) acc[group] = [];\n acc[group].push(item);\n return acc;\n }, {} as Record<string, T[]>);\n}\n\n/**\n * Helper: Get type icon\n */\nfunction getTypeIcon(type: string): string {\n const icons: Record<string, string> = {\n decision: chalk.blue('DECISION'),\n pattern: chalk.magenta('PATTERN'),\n context: chalk.green('CONTEXT'),\n document: chalk.cyan('DOCUMENT'),\n session: chalk.yellow('SESSION'),\n };\n return icons[type] || type.toUpperCase();\n}\n","/**\n * Hook command — install, uninstall, and run git hooks\n */\n\nimport { readFileSync, writeFileSync, existsSync, chmodSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport chalk from 'chalk';\nimport { runPostCommit } from '../hooks/post-commit.js';\nimport { runPrePush } from '../hooks/pre-push.js';\nimport { runPostCheckout } from '../hooks/post-checkout.js';\nimport { runPrepareCommitMsg } from '../hooks/prepare-commit-msg.js';\n\nconst CONTXT_BLOCK_START = '# --- contxt hook start ---';\nconst CONTXT_BLOCK_END = '# --- contxt hook end ---';\n\nconst ALL_HOOKS = ['post-commit', 'pre-push', 'post-checkout', 'prepare-commit-msg'] as const;\ntype HookName = (typeof ALL_HOOKS)[number];\n\ninterface InstallOptions {\n hooks?: string;\n}\n\ninterface HookStatus {\n name: HookName;\n installed: boolean;\n fileExists: boolean;\n}\n\n/**\n * Install git hooks\n */\nexport async function installCommand(options: InstallOptions = {}) {\n const gitHooksDir = join(process.cwd(), '.git', 'hooks');\n\n if (!existsSync(join(process.cwd(), '.git'))) {\n console.error(chalk.red('Not a git repository.'));\n process.exit(1);\n }\n\n mkdirSync(gitHooksDir, { recursive: true });\n\n const hooksToInstall: HookName[] = options.hooks\n ? (options.hooks.split(',').map((h) => h.trim()) as HookName[])\n : [...ALL_HOOKS];\n\n let installed = 0;\n let updated = 0;\n\n for (const hookName of hooksToInstall) {\n const hookPath = join(gitHooksDir, hookName);\n\n const contxtLine = `contxt hook run ${hookName} \"$@\"`;\n const contxtBlock = `${CONTXT_BLOCK_START}\\n${contxtLine}\\n${CONTXT_BLOCK_END}`;\n\n if (existsSync(hookPath)) {\n const content = readFileSync(hookPath, 'utf-8');\n if (content.includes(CONTXT_BLOCK_START)) {\n // Already installed — update the block\n const updated_content = content.replace(\n new RegExp(`${escapeRegex(CONTXT_BLOCK_START)}[\\\\s\\\\S]*?${escapeRegex(CONTXT_BLOCK_END)}`),\n contxtBlock\n );\n writeFileSync(hookPath, updated_content, 'utf-8');\n updated++;\n } else {\n // Append to existing hook\n const newContent = content.trimEnd() + '\\n\\n' + contxtBlock + '\\n';\n writeFileSync(hookPath, newContent, 'utf-8');\n installed++;\n }\n } else {\n // Create new hook file\n const newContent = `#!/bin/sh\\n\\n${contxtBlock}\\n`;\n writeFileSync(hookPath, newContent, 'utf-8');\n installed++;\n }\n\n // Ensure executable\n chmodSync(hookPath, '755');\n console.log(chalk.green('✓'), `${hookName}`);\n }\n\n console.log('');\n if (installed > 0) console.log(chalk.green(`Installed ${installed} hook${installed !== 1 ? 's' : ''}.`));\n if (updated > 0) console.log(chalk.yellow(`Updated ${updated} existing hook${updated !== 1 ? 's' : ''}.`));\n console.log('');\n console.log(chalk.gray('Hooks will capture context from your git workflow automatically.'));\n}\n\n/**\n * Uninstall git hooks\n */\nexport async function uninstallCommand(options: InstallOptions = {}) {\n const gitHooksDir = join(process.cwd(), '.git', 'hooks');\n\n if (!existsSync(join(process.cwd(), '.git'))) {\n console.error(chalk.red('Not a git repository.'));\n process.exit(1);\n }\n\n const hooksToRemove: HookName[] = options.hooks\n ? (options.hooks.split(',').map((h) => h.trim()) as HookName[])\n : [...ALL_HOOKS];\n\n let removed = 0;\n\n for (const hookName of hooksToRemove) {\n const hookPath = join(gitHooksDir, hookName);\n if (!existsSync(hookPath)) continue;\n\n const content = readFileSync(hookPath, 'utf-8');\n if (!content.includes(CONTXT_BLOCK_START)) continue;\n\n // Remove contxt block\n const cleaned = content\n .replace(\n new RegExp(`\\\\n*${escapeRegex(CONTXT_BLOCK_START)}[\\\\s\\\\S]*?${escapeRegex(CONTXT_BLOCK_END)}\\\\n*`),\n '\\n'\n )\n .trim();\n\n if (cleaned === '#!/bin/sh' || cleaned === '') {\n // Hook was only contxt — remove the file (leave it empty is fine too)\n writeFileSync(hookPath, '#!/bin/sh\\n', 'utf-8');\n } else {\n writeFileSync(hookPath, cleaned + '\\n', 'utf-8');\n }\n\n removed++;\n console.log(chalk.gray('✗'), hookName);\n }\n\n if (removed > 0) {\n console.log('');\n console.log(chalk.green(`Removed ${removed} hook${removed !== 1 ? 's' : ''}.`));\n } else {\n console.log(chalk.gray('No Contxt hooks found to remove.'));\n }\n}\n\n/**\n * Show hook status\n */\nexport async function statusCommand() {\n const gitHooksDir = join(process.cwd(), '.git', 'hooks');\n\n if (!existsSync(join(process.cwd(), '.git'))) {\n console.error(chalk.red('Not a git repository.'));\n process.exit(1);\n }\n\n console.log('');\n console.log(chalk.bold('Git Hook Status'));\n console.log('');\n\n for (const hookName of ALL_HOOKS) {\n const hookPath = join(gitHooksDir, hookName);\n const fileExists = existsSync(hookPath);\n let isInstalled = false;\n\n if (fileExists) {\n const content = readFileSync(hookPath, 'utf-8');\n isInstalled = content.includes(CONTXT_BLOCK_START);\n }\n\n const statusIcon = isInstalled ? chalk.green('✓') : chalk.gray('○');\n const label = isInstalled ? chalk.green(hookName) : chalk.gray(hookName);\n const note = !fileExists ? chalk.gray(' (no hook file)') : isInstalled ? chalk.gray(' installed') : chalk.yellow(' not installed');\n\n console.log(` ${statusIcon} ${label}${note}`);\n }\n\n console.log('');\n\n const installedCount = ALL_HOOKS.filter((h) => {\n const hookPath = join(gitHooksDir, h);\n return existsSync(hookPath) && readFileSync(hookPath, 'utf-8').includes(CONTXT_BLOCK_START);\n }).length;\n\n if (installedCount === 0) {\n console.log(chalk.cyan(`Run ${chalk.bold('contxt hook install')} to enable automatic context capture.`));\n }\n}\n\n/**\n * Run a specific hook (called by the git hook shell script)\n */\nexport async function runCommand(hookName: string) {\n switch (hookName) {\n case 'post-commit':\n await runPostCommit();\n break;\n case 'pre-push':\n await runPrePush();\n break;\n case 'post-checkout':\n await runPostCheckout();\n break;\n case 'prepare-commit-msg':\n await runPrepareCommitMsg();\n break;\n default:\n // Unknown hook — silent\n }\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport const hookCommand = {\n install: installCommand,\n uninstall: uninstallCommand,\n status: statusCommand,\n run: runCommand,\n};\n","/**\n * post-commit hook — scan commit message for decisions / context signals\n * Must complete in <200ms. No network. Local DB only.\n */\n\nimport { execSync } from 'child_process';\nimport { getProjectDb } from '../utils/project.js';\n\nconst DECISION_KEYWORDS = [\n 'decided',\n 'decision',\n 'switched to',\n 'migrated to',\n 'migrated from',\n 'replaced',\n 'chose',\n 'using .+ instead of',\n 'instead of',\n 'over .+ because',\n 'picked',\n];\n\nconst DECISION_PATTERN = new RegExp(DECISION_KEYWORDS.join('|'), 'i');\n\nconst CONTEXT_PREFIXES = ['feat', 'fix', 'refactor', 'arch', 'build', 'ci', 'chore'];\nconst CONTEXT_PATTERN = new RegExp(`^(${CONTEXT_PREFIXES.join('|')})(\\\\(.+\\\\))?:`, 'i');\n\nexport async function runPostCommit(): Promise<void> {\n try {\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n if (!project) return;\n\n // Get the latest commit message\n const message = execSync('git log -1 --pretty=%B', {\n encoding: 'utf-8',\n timeout: 1000,\n }).trim();\n\n if (!message) return;\n\n const firstLine = message.split('\\n')[0].trim();\n\n // Get changed files\n let changedFiles: string[] = [];\n try {\n changedFiles = execSync('git diff-tree --no-commit-id -r --name-only HEAD', {\n encoding: 'utf-8',\n timeout: 1000,\n })\n .trim()\n .split('\\n')\n .filter(Boolean);\n } catch {\n // Ignore if git command fails\n }\n\n const commitHash = execSync('git rev-parse --short HEAD', {\n encoding: 'utf-8',\n timeout: 1000,\n }).trim();\n\n const branch = await db.getActiveBranch(project.id);\n\n if (DECISION_PATTERN.test(firstLine)) {\n // Looks like a decision commit — save as draft\n await db.createEntry({\n projectId: project.id,\n type: 'decision',\n title: stripConventionalPrefix(firstLine),\n content: message,\n metadata: {\n source: 'hooks:post-commit',\n commit: commitHash,\n files: changedFiles,\n },\n status: 'draft',\n });\n process.stdout.write(`contxt: draft saved — \"${firstLine}\" (decision)\\n`);\n } else if (CONTEXT_PATTERN.test(firstLine)) {\n // Conventional commit — update context files\n const existing = await db.listEntries({\n projectId: project.id,\n branch,\n type: 'context',\n });\n\n const activeContext = existing.find((e) => e.status === 'active');\n if (activeContext && changedFiles.length > 0) {\n const currentFiles: string[] = activeContext.metadata.files || [];\n const mergedFiles = Array.from(new Set([...currentFiles, ...changedFiles])).slice(0, 20);\n\n await db.updateEntry(activeContext.id, {\n metadata: {\n ...activeContext.metadata,\n files: mergedFiles,\n lastCommit: commitHash,\n },\n });\n }\n }\n\n await db.close();\n } catch {\n // Hooks must be silent on error\n }\n}\n\nfunction stripConventionalPrefix(msg: string): string {\n return msg.replace(/^(feat|fix|refactor|arch|build|ci|chore)(\\(.+\\))?:\\s*/i, '').trim();\n}\n","/**\n * pre-push hook — summarize session and optionally sync to cloud\n */\n\nimport { execSync } from 'child_process';\nimport { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { getProjectDb } from '../utils/project.js';\n\nexport async function runPrePush(): Promise<void> {\n try {\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n if (!project) return;\n\n // Count commits since last push (approximate via unpushed commits)\n let commitCount = 0;\n let changedFiles: string[] = [];\n\n try {\n const unpushed = execSync('git cherry -v @{upstream} 2>/dev/null || git log --oneline origin/HEAD..HEAD 2>/dev/null', {\n encoding: 'utf-8',\n timeout: 2000,\n }).trim();\n\n commitCount = unpushed ? unpushed.split('\\n').filter(Boolean).length : 0;\n } catch {\n // No upstream or first push\n try {\n commitCount = parseInt(\n execSync('git rev-list --count HEAD', { encoding: 'utf-8', timeout: 1000 }).trim(),\n 10\n );\n } catch {\n commitCount = 0;\n }\n }\n\n try {\n changedFiles = execSync('git diff --name-only @{upstream}..HEAD 2>/dev/null', {\n encoding: 'utf-8',\n timeout: 2000,\n })\n .trim()\n .split('\\n')\n .filter(Boolean);\n } catch {\n // Ignore\n }\n\n // Update context session summary\n const branch = await db.getActiveBranch(project.id);\n const existing = await db.listEntries({\n projectId: project.id,\n branch,\n type: 'context',\n });\n\n const activeContext = existing.find((e) => e.status === 'active');\n if (activeContext) {\n await db.updateEntry(activeContext.id, {\n metadata: {\n ...activeContext.metadata,\n lastPush: new Date().toISOString(),\n commitsPushed: (activeContext.metadata.commitsPushed || 0) + commitCount,\n filesPushed: changedFiles,\n },\n });\n }\n\n process.stdout.write(\n `contxt: session updated — ${commitCount} commit${commitCount !== 1 ? 's' : ''}, ${changedFiles.length} files changed\\n`\n );\n\n // Check if auto-push is enabled\n const configPath = join(process.cwd(), '.contxt', 'config.json');\n if (existsSync(configPath)) {\n try {\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n if (config.hooks?.auto_push_on_push) {\n process.stdout.write('contxt: syncing to cloud...\\n');\n // Sync is async — fire and forget (don't block git push)\n execSync('contxt push --quiet 2>/dev/null', {\n timeout: 10000,\n encoding: 'utf-8',\n });\n process.stdout.write('contxt: ✓ synced\\n');\n }\n } catch {\n // Config parse error or push failure — don't block the push\n }\n }\n\n await db.close();\n } catch {\n // Hooks must be silent on error\n }\n}\n","/**\n * post-checkout hook — switch Contxt branch when git branch changes\n */\n\nimport { execSync } from 'child_process';\nimport { getProjectDb } from '../utils/project.js';\n\nexport async function runPostCheckout(): Promise<void> {\n try {\n // post-checkout args: $1=prev_head, $2=new_head, $3=branch_flag (1=branch, 0=file)\n const isBranchCheckout = process.argv[4] === '1';\n if (!isBranchCheckout) return; // Only care about branch switches\n\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n if (!project) return;\n\n // Get current branch name\n const gitBranch = execSync('git rev-parse --abbrev-ref HEAD', {\n encoding: 'utf-8',\n timeout: 1000,\n }).trim();\n\n // Check if Contxt has this branch\n const branches = await db.listBranches(project.id);\n const contxtBranch = branches.find((b) => b.name === gitBranch);\n\n if (contxtBranch) {\n // Switch Contxt to match the git branch\n await db.switchBranch(project.id, gitBranch);\n const entryCount = await db.countEntries({ projectId: project.id, branch: gitBranch });\n process.stdout.write(`contxt: switched to branch ${gitBranch} (${entryCount} entries)\\n`);\n } else {\n // No matching Contxt branch — stay on current, report main\n const currentBranch = await db.getActiveBranch(project.id);\n process.stdout.write(`contxt: no memory branch for ${gitBranch}, using ${currentBranch}\\n`);\n }\n\n await db.close();\n } catch {\n // Silent on error\n }\n}\n","/**\n * prepare-commit-msg hook — inject active context as comments in commit message template\n */\n\nimport { readFileSync, writeFileSync } from 'fs';\nimport { getProjectDb } from '../utils/project.js';\n\nexport async function runPrepareCommitMsg(): Promise<void> {\n try {\n // $1 = path to commit message file, $2 = source (message, template, merge, squash, commit)\n const commitMsgFile = process.argv[4];\n const source = process.argv[5]; // e.g. \"message\", \"template\"\n\n // Only inject for interactive commits (not merge, squash, etc.)\n if (source && source !== 'template' && source !== '') return;\n if (!commitMsgFile) return;\n\n const db = await getProjectDb();\n const project = await db.getProjectByPath(process.cwd());\n if (!project) return;\n\n const branch = await db.getActiveBranch(project.id);\n const entries = await db.listEntries({\n projectId: project.id,\n branch,\n });\n\n // Get active context\n const context = entries.find((e) => e.type === 'context' && e.status === 'active');\n // Get 3 most recent decisions\n const recentDecisions = entries\n .filter((e) => e.type === 'decision' && e.status === 'active')\n .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime())\n .slice(0, 3);\n\n if (!context && recentDecisions.length === 0) {\n await db.close();\n return;\n }\n\n // Build the comment block\n const lines: string[] = [\n '',\n '# --- Contxt ---',\n ];\n\n if (context) {\n const feature = context.metadata.feature || context.content.split('\\n')[0];\n lines.push(`# Feature: ${feature}`);\n if (context.metadata.blockers?.length) {\n lines.push(`# Blockers: ${context.metadata.blockers.join(', ')}`);\n }\n }\n\n if (recentDecisions.length > 0) {\n const decisionList = recentDecisions.map((d) => d.title).join(', ');\n lines.push(`# Recent decisions: ${decisionList}`);\n }\n\n // Draft count\n const draftCount = entries.filter((e) => e.status === 'draft').length;\n if (draftCount > 0) {\n lines.push(`# ${draftCount} drafts pending — run \\`contxt review\\``);\n }\n\n lines.push('#');\n\n // Append to commit message file\n const existing = readFileSync(commitMsgFile, 'utf-8');\n writeFileSync(commitMsgFile, existing + lines.join('\\n') + '\\n', 'utf-8');\n\n await db.close();\n } catch {\n // Silent on error — never block a commit\n }\n}\n","/**\n * Watch command — background file watcher for passive context capture\n */\n\nimport { readFileSync, writeFileSync, existsSync, unlinkSync } from 'fs';\nimport { join, relative } from 'path';\nimport { spawn } from 'child_process';\nimport chalk from 'chalk';\nimport chokidar from 'chokidar';\nimport { parseFile, scanCommentToEntry, SyncEngine } from '@mycontxt/core';\nimport { SQLiteDatabase } from '@mycontxt/adapters/sqlite';\nimport { SupabaseDatabase } from '@mycontxt/adapters/supabase';\nimport { getProjectDb, getDbPath } from '../utils/project.js';\nimport { getAccessToken } from './auth.js';\nimport { getSupabaseConfig } from '../config.js';\n\nconst PID_FILE = '.contxt/.watch.pid';\nconst LOG_FILE = '.contxt/watch.log';\n\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes\nconst DEBOUNCE_MS = 30_000; // 30s batch window\n\ninterface WatchOptions {\n daemon?: boolean;\n}\n\n/**\n * Start the file watcher\n */\nexport async function startCommand(options: WatchOptions = {}) {\n if (options.daemon) {\n return startDaemon();\n }\n\n return runWatcher();\n}\n\n/**\n * Stop the background daemon\n */\nexport async function stopCommand() {\n const pidFile = join(process.cwd(), PID_FILE);\n\n if (!existsSync(pidFile)) {\n console.log(chalk.gray('No watch daemon running.'));\n return;\n }\n\n const pid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10);\n\n try {\n process.kill(pid, 'SIGTERM');\n unlinkSync(pidFile);\n console.log(chalk.green('Watch daemon stopped.'));\n } catch {\n console.log(chalk.yellow('Daemon not found — removing stale PID file.'));\n unlinkSync(pidFile);\n }\n}\n\n/**\n * Show daemon status\n */\nexport async function statusCommand() {\n const pidFile = join(process.cwd(), PID_FILE);\n\n if (!existsSync(pidFile)) {\n console.log(chalk.gray('Watch daemon: not running'));\n return;\n }\n\n const pid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10);\n\n try {\n process.kill(pid, 0); // Signal 0 just checks if the process exists\n console.log(chalk.green(`Watch daemon: running (PID ${pid})`));\n } catch {\n console.log(chalk.yellow('Watch daemon: stale PID file (process not found)'));\n unlinkSync(pidFile);\n }\n}\n\n/**\n * Start as detached background process\n */\nfunction startDaemon() {\n const pidFile = join(process.cwd(), PID_FILE);\n\n if (existsSync(pidFile)) {\n const pid = parseInt(readFileSync(pidFile, 'utf-8').trim(), 10);\n try {\n process.kill(pid, 0);\n console.log(chalk.yellow(`Watch daemon already running (PID ${pid}).`));\n return;\n } catch {\n // Stale PID — continue starting\n }\n }\n\n const logPath = join(process.cwd(), LOG_FILE);\n const logStream = require('fs').openSync(logPath, 'a');\n\n const child = spawn(process.execPath, [process.argv[1], 'watch'], {\n env: { ...process.env, CONTXT_WATCH_DAEMON: '1' },\n detached: true,\n stdio: ['ignore', logStream, logStream],\n cwd: process.cwd(),\n });\n\n child.unref();\n writeFileSync(pidFile, String(child.pid), 'utf-8');\n console.log(chalk.green(`Watch daemon started (PID ${child.pid}).`));\n console.log(chalk.gray(`Logs: ${logPath}`));\n}\n\n/**\n * Main watcher loop\n */\nasync function runWatcher() {\n const cwd = process.cwd();\n const isDaemon = process.env.CONTXT_WATCH_DAEMON === '1';\n\n const db = await getProjectDb(cwd);\n const project = await db.getProjectByPath(cwd);\n\n if (!project) {\n if (!isDaemon) console.error(chalk.red('Not a Contxt project.'));\n return;\n }\n\n const branch = await db.getActiveBranch(project.id);\n\n if (!isDaemon) {\n console.log(chalk.bold(`contxt watch`) + ` — monitoring ${project.name} (${branch})`);\n console.log('');\n }\n\n // Pending file batches\n const pendingFiles = new Set<string>();\n let flushTimer: NodeJS.Timeout | null = null;\n let sessionStart: Date | null = null;\n let lastActivityAt: Date | null = null;\n let sessionTimer: NodeJS.Timeout | null = null;\n\n // File patterns to watch\n const watchPatterns = [\n '**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx',\n '**/*.py', '**/*.rb', '**/*.go', '**/*.rs', '**/*.sql',\n ];\n\n const ignored = [\n /(^|[/\\\\])\\../, // dotfiles\n /node_modules/,\n /\\.contxt/,\n /dist/,\n /build/,\n /\\.next/,\n /\\.min\\.js$/,\n ];\n\n const watcher = chokidar.watch(watchPatterns, {\n cwd,\n ignored,\n ignoreInitial: true,\n persistent: true,\n usePolling: false,\n interval: 1000,\n });\n\n // Watch .contxt/rules.md for auto-sync\n const rulesPath = join(cwd, '.contxt', 'rules.md');\n const rulesWatcher = chokidar.watch(rulesPath, { ignoreInitial: true });\n\n // Watch .git/HEAD for branch changes\n const gitHeadPath = join(cwd, '.git', 'HEAD');\n const gitWatcher = chokidar.watch(gitHeadPath, { ignoreInitial: true });\n\n // Source file change\n watcher.on('change', (filePath: string) => {\n pendingFiles.add(filePath);\n touchSession();\n scheduleFlush();\n });\n\n watcher.on('add', (filePath: string) => {\n pendingFiles.add(filePath);\n touchSession();\n scheduleFlush();\n });\n\n // rules.md changed — auto-sync\n rulesWatcher.on('change', async () => {\n log('rules', 'rules.md changed — syncing...');\n try {\n const { parseRulesFile } = await import('@mycontxt/core');\n const content = readFileSync(rulesPath, 'utf-8');\n const parsed = parseRulesFile(content);\n let synced = 0;\n\n const existing = await db.listEntries({ projectId: project.id, branch });\n const byTitle = new Map(existing.map((e) => [e.title, e]));\n\n for (const decision of parsed.decisions) {\n const ex = byTitle.get(decision.title);\n if (!ex) {\n await db.createEntry({ projectId: project.id, type: 'decision', title: decision.title, content: decision.content, metadata: decision.metadata, status: 'active' });\n synced++;\n } else if (ex.content !== decision.content) {\n await db.updateEntry(ex.id, { content: decision.content });\n synced++;\n }\n }\n\n log('rules', `synced ${synced} update${synced !== 1 ? 's' : ''}`);\n } catch {\n log('rules', 'sync failed');\n }\n });\n\n // .git/HEAD changed — branch switch\n gitWatcher.on('change', async () => {\n try {\n const headContent = readFileSync(gitHeadPath, 'utf-8').trim();\n const branchMatch = headContent.match(/^ref: refs\\/heads\\/(.+)$/);\n if (!branchMatch) return;\n\n const newBranch = branchMatch[1];\n const currentBranch = await db.getActiveBranch(project.id);\n if (newBranch === currentBranch) return;\n\n const branches = await db.listBranches(project.id);\n const has = branches.some((b) => b.name === newBranch);\n\n if (has) {\n await db.switchBranch(project.id, newBranch);\n const count = await db.countEntries({ projectId: project.id, branch: newBranch });\n log('branch', `switched to ${newBranch} (${count} entries)`);\n }\n } catch {\n // Ignore\n }\n });\n\n // Flush pending files — update context + scan for tags\n async function flush() {\n if (pendingFiles.size === 0) return;\n\n const files = Array.from(pendingFiles);\n pendingFiles.clear();\n\n // Update context files\n try {\n const entries = await db.listEntries({ projectId: project.id, branch, type: 'context' });\n const activeCtx = entries.find((e) => e.status === 'active');\n if (activeCtx) {\n const currentFiles: string[] = activeCtx.metadata.files || [];\n const relFiles = files.map((f) => relative(cwd, join(cwd, f)));\n const merged = Array.from(new Set([...currentFiles, ...relFiles])).slice(0, 30);\n await db.updateEntry(activeCtx.id, { metadata: { ...activeCtx.metadata, files: merged } });\n }\n } catch {\n // Ignore\n }\n\n // Incremental scan — check each changed file for tags\n let newDrafts = 0;\n for (const file of files) {\n try {\n const absPath = join(cwd, file);\n if (!existsSync(absPath)) continue;\n const content = readFileSync(absPath, 'utf-8');\n const comments = parseFile(content, file);\n if (comments.length === 0) continue;\n\n const existing = await db.listEntries({ projectId: project.id, branch });\n const hashes = new Set(existing.filter((e) => e.metadata.hash).map((e) => e.metadata.hash));\n\n for (const comment of comments) {\n if (!hashes.has(comment.hash)) {\n const entry = scanCommentToEntry(comment, project.id);\n await db.createEntry({ projectId: project.id, type: entry.type, title: entry.title, content: entry.content, metadata: entry.metadata, status: 'draft' });\n newDrafts++;\n }\n }\n } catch {\n // Skip bad files\n }\n }\n\n log('files', `${files.length} file${files.length !== 1 ? 's' : ''} ${newDrafts > 0 ? `· +${newDrafts} draft${newDrafts !== 1 ? 's' : ''}` : ''}`);\n\n // Auto-sync push — re-read project config in case settings changed via web UI\n try {\n const freshProject = await db.getProjectByPath(cwd);\n if (freshProject?.config.autoSync) {\n const accessToken = getAccessToken();\n if (accessToken) {\n const supabaseConfig = getSupabaseConfig();\n const dbPath = getDbPath();\n const localDb = new SQLiteDatabase(dbPath);\n await localDb.initialize();\n const remoteDb = new SupabaseDatabase({ ...supabaseConfig, accessToken });\n await remoteDb.initialize();\n const syncEngine = new SyncEngine(localDb, remoteDb);\n const result = await syncEngine.push(freshProject.id, {});\n await localDb.close();\n log('sync', `pushed ${result.pushed} entr${result.pushed !== 1 ? 'ies' : 'y'} to cloud`);\n }\n }\n } catch {\n // Never crash the watcher on sync errors — they'll retry on next flush\n }\n }\n\n function scheduleFlush() {\n if (flushTimer) clearTimeout(flushTimer);\n flushTimer = setTimeout(flush, DEBOUNCE_MS);\n }\n\n function touchSession() {\n const now = new Date();\n lastActivityAt = now;\n\n if (!sessionStart) {\n sessionStart = now;\n log('session', `started`);\n }\n\n if (sessionTimer) clearTimeout(sessionTimer);\n sessionTimer = setTimeout(endSession, SESSION_TIMEOUT_MS);\n }\n\n function endSession() {\n if (!sessionStart || !lastActivityAt) return;\n const durationMin = Math.round((lastActivityAt.getTime() - sessionStart.getTime()) / 60000);\n log('session', `ended — ${durationMin} min`);\n sessionStart = null;\n lastActivityAt = null;\n }\n\n function log(type: string, message: string) {\n const time = new Date().toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' });\n const line = `${time} ${type.padEnd(8)} ${message}`;\n if (!isDaemon) {\n console.log(` ${chalk.gray(time)} ${chalk.cyan(type.padEnd(8))} ${message}`);\n } else {\n try {\n require('fs').appendFileSync(join(cwd, LOG_FILE), line + '\\n');\n } catch {\n // Ignore log write errors\n }\n }\n }\n\n // Graceful shutdown\n const shutdown = async () => {\n if (flushTimer) clearTimeout(flushTimer);\n await flush();\n watcher.close();\n rulesWatcher.close();\n gitWatcher.close();\n await db.close();\n\n const pidFile = join(cwd, PID_FILE);\n if (existsSync(pidFile)) unlinkSync(pidFile);\n\n process.exit(0);\n };\n\n process.on('SIGTERM', shutdown);\n process.on('SIGINT', shutdown);\n\n if (!isDaemon) {\n console.log(chalk.gray('Watching for file changes. Ctrl+C to stop.\\n'));\n }\n}\n\nexport const watchCommand = {\n start: startCommand,\n stop: stopCommand,\n status: statusCommand,\n};\n"],"mappings":"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","names":["existsSync","readFileSync","join","homedir","SQLiteDatabase","existsSync","join","chalk","join","existsSync","auth","chalk","join","existsSync","readFileSync","homedir","hookCommand","SQLiteDatabase","decision","add","list","show","pattern","show","context","chalk","context","chalk","branch","readFileSync","add","readFileSync","list","show","session","list","writeFileSync","readFileSync","writeFileSync","readFileSync","existsSync","mkdirSync","writeFileSync","readFileSync","homedir","join","join","homedir","AUTH_FILE","existsSync","mkdirSync","writeFileSync","readFileSync","auth","SQLiteDatabase","SupabaseDatabase","SQLiteDatabase","SupabaseDatabase","SQLiteDatabase","SQLiteDatabase","branch","SQLiteDatabase","SQLiteDatabase","SQLiteDatabase","SupabaseDatabase","chalk","SQLiteDatabase","branch","SupabaseDatabase","readFileSync","existsSync","join","chalk","join","existsSync","readFileSync","chalk","error","chalk","ora","chalk","ora","error","getTypeIcon","readFileSync","writeFileSync","existsSync","join","chalk","ora","syncCommand","ora","join","existsSync","readFileSync","decision","pattern","doc","error","chalk","branch","context","writeFileSync","readFileSync","existsSync","join","basename","chalk","ora","ora","chalk","getTypeIcon","error","join","existsSync","readFileSync","basename","execSync","readFileSync","writeFileSync","existsSync","chmodSync","mkdirSync","join","chalk","branch","execSync","readFileSync","existsSync","join","execSync","branch","join","existsSync","readFileSync","execSync","execSync","readFileSync","writeFileSync","branch","context","readFileSync","writeFileSync","CONTXT_BLOCK_START","CONTXT_BLOCK_END","ALL_HOOKS","join","existsSync","chalk","mkdirSync","readFileSync","writeFileSync","chmodSync","statusCommand","readFileSync","writeFileSync","existsSync","join","relative","spawn","chalk","parseFile","scanCommentToEntry","SyncEngine","SQLiteDatabase","SupabaseDatabase","join","existsSync","chalk","readFileSync","statusCommand","spawn","writeFileSync","branch","parseRulesFile","decision","relative","parseFile","scanCommentToEntry","SQLiteDatabase","SupabaseDatabase","SyncEngine"]}