#!/usr/bin/env node /** * Cortex CLI - Beautiful command center for Brainy */ // @ts-ignore import { program } from 'commander' import { Cortex } from '../dist/cortex/cortex.js' // @ts-ignore import chalk from 'chalk' import { readFileSync } from 'fs' import { dirname, join } from 'path' import { fileURLToPath } from 'url' const __dirname = dirname(fileURLToPath(import.meta.url)) const packageJson = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf8')) // Create Cortex instance const cortex = new Cortex() // Helper to ensure proper process exit const exitProcess = (code = 0) => { setTimeout(() => { process.exit(code) }, 100) } // Wrap async actions to ensure proper exit const wrapAction = (fn) => { return async (...args) => { try { await fn(...args) // Always exit for non-interactive commands exitProcess(0) } catch (error) { console.error(chalk.red('Error:'), error.message) exitProcess(1) } } } // Wrap interactive actions with explicit exit const wrapInteractive = (fn) => { return async (...args) => { try { await fn(...args) exitProcess(0) } catch (error) { console.error(chalk.red('Error:'), error.message) exitProcess(1) } } } // Setup program program .name('cortex') .description('🧠 Cortex - Command Center for Brainy') .version(packageJson.version) // Initialize command program .command('init') .description('Initialize Cortex in your project') .option('-s, --storage ', 'Storage type (filesystem, s3, r2, gcs, memory)') .option('-e, --encryption', 'Enable encryption for secrets') .action(wrapAction(async (options) => { await cortex.init(options) })) // Chat commands (simplified - just 'chat', no alias) program .command('chat [question]') .description('πŸ’¬ Chat with your data (interactive mode if no question)') .option('-l, --llm ', 'LLM model to use') .action(wrapInteractive(async (question, options) => { await cortex.chat(question) })) // Data management commands program .command('add [data]') .description('πŸ“Š Add data to Brainy') .option('-m, --metadata ', 'Metadata as JSON') .option('-i, --id ', 'Custom ID') .action(async (data, options) => { let metadata = {} if (options.metadata) { try { metadata = JSON.parse(options.metadata) } catch { console.error(chalk.red('Invalid JSON metadata')) process.exit(1) } } if (options.id) { metadata.id = options.id } await cortex.add(data, metadata) exitProcess(0) }) program .command('search ') .description('πŸ” Search your database with advanced options') .option('-l, --limit ', 'Number of results', '10') .option('-f, --filter ', 'MongoDB-style metadata filters') .option('-v, --verbs ', 'Graph verb types to traverse (comma-separated)') .option('-d, --depth ', 'Graph traversal depth', '1') .action(async (query, options) => { const searchOptions = { limit: parseInt(options.limit) } if (options.filter) { try { searchOptions.filter = JSON.parse(options.filter) } catch { console.error(chalk.red('Invalid filter JSON')) process.exit(1) } } if (options.verbs) { searchOptions.verbs = options.verbs.split(',').map(v => v.trim()) searchOptions.depth = parseInt(options.depth) } await cortex.search(query, searchOptions) exitProcess(0) }) program .command('find') .description('πŸ” Interactive advanced search with filters and graph traversal') .action(wrapInteractive(async () => { await cortex.advancedSearch() })) program .command('update ') .description('✏️ Update existing data') .option('-m, --metadata ', 'New metadata as JSON') .action(async (id, data, options) => { let metadata = {} if (options.metadata) { try { metadata = JSON.parse(options.metadata) } catch { console.error(chalk.red('Invalid metadata JSON')) process.exit(1) } } await cortex.update(id, data, metadata) exitProcess(0) }) program .command('delete ') .description('πŸ—‘οΈ Delete data by ID') .action(wrapAction(async (id) => { await cortex.delete(id) })) // Graph commands program .command('verb ') .description('πŸ”— Add graph relationship between nodes') .option('-m, --metadata ', 'Relationship metadata') .action(async (subject, verb, object, options) => { let metadata = {} if (options.metadata) { try { metadata = JSON.parse(options.metadata) } catch { console.error(chalk.red('Invalid metadata JSON')) process.exit(1) } } await cortex.addVerb(subject, verb, object, metadata) exitProcess(0) }) program .command('explore [nodeId]') .description('πŸ—ΊοΈ Interactively explore graph connections') .action(wrapInteractive(async (nodeId) => { await cortex.explore(nodeId) })) // Configuration commands const config = program.command('config') .description('βš™οΈ Manage configuration') config .command('set ') .description('Set configuration value') .option('-e, --encrypt', 'Encrypt this value') .action(wrapAction(async (key, value, options) => { await cortex.configSet(key, value, options) })) config .command('get ') .description('Get configuration value') .action(async (key) => { const value = await cortex.configGet(key) if (value) { console.log(chalk.green(`${key}: ${value}`)) } else { console.log(chalk.yellow(`Key not found: ${key}`)) } exitProcess(0) }) config .command('list') .description('List all configuration') .action(wrapAction(async () => { await cortex.configList() })) config .command('import ') .description('Import configuration from .env file') .action(wrapAction(async (file) => { await cortex.importEnv(file) })) config .command('export ') .description('Export configuration to .env file') .action(wrapAction(async (file) => { await cortex.exportEnv(file) })) config .command('key-rotate') .description('πŸ”„ Rotate master encryption key') .action(wrapInteractive(async () => { await cortex.resetMasterKey() })) config .command('secrets-patterns') .description('πŸ›‘οΈ List secret detection patterns') .action(wrapAction(async () => { await cortex.listSecretPatterns() })) config .command('secrets-add ') .description('βž• Add custom secret detection pattern') .action(wrapAction(async (pattern) => { await cortex.addSecretPattern(pattern) })) config .command('secrets-remove ') .description('βž– Remove custom secret detection pattern') .action(wrapAction(async (pattern) => { await cortex.removeSecretPattern(pattern) })) // Migration commands program .command('migrate') .description('πŸ“¦ Migrate to different storage') .requiredOption('-t, --to ', 'Target storage type (filesystem, s3, r2, gcs, memory)') .option('-b, --bucket ', 'Bucket name for cloud storage') .option('-s, --strategy ', 'Migration strategy', 'immediate') .action(wrapInteractive(async (options) => { await cortex.migrate(options) })) // Database operations program .command('stats') .description('πŸ“Š Show database statistics') .option('-d, --detailed', 'Show detailed field statistics') .action(wrapAction(async (options) => { await cortex.stats(options.detailed) })) program .command('fields') .description('πŸ“‹ List all searchable fields with samples') .action(wrapAction(async () => { await cortex.listFields() })) // LLM setup program .command('llm [provider]') .description('πŸ€– Setup or change LLM provider') .action(wrapInteractive(async (provider) => { await cortex.setupLLM(provider) })) // Embedding utilities program .command('embed ') .description('✨ Generate embedding vector for text') .action(wrapAction(async (text) => { await cortex.embed(text) })) program .command('similarity ') .description('πŸ” Calculate semantic similarity between texts') .action(wrapAction(async (text1, text2) => { await cortex.similarity(text1, text2) })) program .command('backup') .description('πŸ’Ύ Create database backup') .option('-c, --compress', 'Compress backup') .option('-o, --output ', 'Output file') .action(wrapAction(async (options) => { await cortex.backup(options) })) program .command('restore ') .description('♻️ Restore from backup') .action(wrapInteractive(async (file) => { await cortex.restore(file) })) program .command('health') .description('πŸ₯ Check database health') .action(wrapAction(async () => { await cortex.health() })) // Backup & Restore commands program .command('backup') .description('πŸ’Ύ Create atomic vault backup') .option('-c, --compress', 'Enable quantum compression') .option('-o, --output ', 'Output file path') .option('--password ', 'Encrypt backup with password') .action(wrapAction(async (options) => { await cortex.backup(options) })) program .command('restore ') .description('♻️ Restore from atomic vault') .option('--password ', 'Decrypt backup with password') .option('--dry-run', 'Simulate restore without making changes') .action(wrapInteractive(async (file, options) => { await cortex.restore(file, options) })) program .command('backups') .description('πŸ“‹ List available atomic vault backups') .option('-d, --directory ', 'Backup directory', './backups') .action(wrapAction(async (options) => { await cortex.listBackups(options.directory) })) // Augmentation Management commands program .command('augmentations') .description('🧠 Show augmentation status and management') .option('-v, --verbose', 'Show detailed augmentation information') .action(wrapInteractive(async (options) => { await cortex.augmentations(options) })) // Performance Monitoring & Health Check commands program .command('monitor') .description('πŸ“Š Monitor vector + graph database performance') .option('-d, --dashboard', 'Launch interactive performance dashboard') .action(wrapInteractive(async (options) => { await cortex.monitor(options) })) program .command('health') .description('πŸ”‹ Check system health and diagnostics') .option('--auto-fix', 'Automatically apply safe repairs') .action(wrapAction(async (options) => { await cortex.health(options) })) program .command('performance') .description('⚑ Analyze database performance metrics') .option('--analyze', 'Deep performance analysis with trends') .action(wrapAction(async (options) => { await cortex.performance(options) })) // Premium Licensing commands const license = program.command('license') .description('πŸ‘‘ Manage premium licenses and features') license .command('catalog') .description('πŸ“‹ Browse premium features catalog') .action(wrapAction(async () => { await cortex.licenseCatalog() })) license .command('status [license-id]') .description('πŸ“Š Check license status and usage') .action(wrapAction(async (licenseId) => { await cortex.licenseStatus(licenseId) })) license .command('trial ') .description('⏰ Start free trial for premium feature') .option('--name ', 'Your name') .option('--email ', 'Your email address') .action(wrapAction(async (feature, options) => { await cortex.licenseTrial(feature, options.name, options.email) })) license .command('validate ') .description('βœ… Validate feature license availability') .action(wrapAction(async (feature) => { await cortex.licenseValidate(feature) })) // Augmentation management commands const augment = program.command('augment') .description('🧩 Manage augmentation pipeline') augment .command('list') .description('πŸ“‹ List all augmentations and pipeline status') .action(wrapAction(async () => { await cortex.listAugmentations() })) augment .command('add ') .description('βž• Add augmentation to pipeline') .option('-p, --position ', 'Pipeline position') .option('-c, --config ', 'Configuration as JSON') .action(wrapAction(async (type, options) => { let config = {} if (options.config) { try { config = JSON.parse(options.config) } catch { console.error(chalk.red('Invalid JSON configuration')) process.exit(1) } } await cortex.addAugmentation(type, options.position ? parseInt(options.position) : undefined, config) })) augment .command('remove ') .description('βž– Remove augmentation from pipeline') .action(wrapAction(async (type) => { await cortex.removeAugmentation(type) })) augment .command('configure ') .description('βš™οΈ Configure existing augmentation') .action(wrapAction(async (type, configJson) => { let config = {} try { config = JSON.parse(configJson) } catch { console.error(chalk.red('Invalid JSON configuration')) process.exit(1) } await cortex.configureAugmentation(type, config) })) augment .command('reset') .description('πŸ”„ Reset pipeline to defaults') .action(wrapInteractive(async () => { await cortex.resetPipeline() })) augment .command('execute [data]') .description('⚑ Execute specific pipeline step') .action(wrapAction(async (step, data) => { const inputData = data ? JSON.parse(data) : { test: true } await cortex.executePipelineStep(step, inputData) })) // Neural Import commands - The AI-Powered Data Understanding System const neural = program.command('neural') .description('🧠 AI-powered data analysis and import') neural .command('import ') .description('🧠 Smart import with AI analysis') .option('-c, --confidence ', 'Confidence threshold (0-1)', '0.7') .option('-a, --auto-apply', 'Auto-apply without confirmation') .option('-w, --enable-weights', 'Enable relationship weights', true) .option('--skip-duplicates', 'Skip duplicate detection', true) .action(wrapInteractive(async (file, options) => { const importOptions = { confidenceThreshold: parseFloat(options.confidence), autoApply: options.autoApply, enableWeights: options.enableWeights, skipDuplicates: options.skipDuplicates } await cortex.neuralImport(file, importOptions) })) neural .command('analyze ') .description('πŸ”¬ Analyze data structure without importing') .action(wrapAction(async (file) => { await cortex.neuralAnalyze(file) })) neural .command('validate ') .description('βœ… Validate data import compatibility') .action(wrapAction(async (file) => { await cortex.neuralValidate(file) })) neural .command('types') .description('πŸ“‹ Show available noun and verb types') .action(wrapAction(async () => { await cortex.neuralTypes() })) // Service integration commands const service = program.command('service') .description('πŸ› οΈ Service integration and management') service .command('discover') .description('πŸ” Discover Brainy services in environment') .action(wrapAction(async () => { console.log('πŸ” Discovering services...') // This would call CortexServiceIntegration.discoverBrainyInstances() console.log('πŸ“‹ Service discovery complete (placeholder)') })) service .command('health-all') .description('🩺 Health check all discovered services') .action(wrapAction(async () => { console.log('🩺 Running health checks on all services...') // This would call CortexServiceIntegration.healthCheckAll() console.log('βœ… Health checks complete (placeholder)') })) service .command('migrate-all') .description('πŸš€ Migrate all services to new storage') .requiredOption('-t, --to ', 'Target storage type') .option('-s, --strategy ', 'Migration strategy', 'immediate') .action(wrapInteractive(async (options) => { console.log(`πŸš€ Planning migration to ${options.to}...`) // This would call CortexServiceIntegration.migrateAll() console.log('βœ… Migration complete (placeholder)') })) // Interactive shell program .command('shell') .description('🐚 Interactive Cortex shell') .action(async () => { console.log(chalk.cyan('🧠 Cortex Interactive Shell')) console.log(chalk.dim('Type "help" for commands, "exit" to quit\n')) // Start interactive mode await cortex.chat() exitProcess(0) }) // Parse arguments program.parse(process.argv) // Show help if no command if (!process.argv.slice(2).length) { program.outputHelp() }