#!/usr/bin/env node const { Command } = require('commander'); const chalk = require('chalk'); const { execSync, spawn } = require('child_process'); const path = require('path'); const fs = require('fs'); const os = require('os'); const program = new Command(); const packageRoot = path.dirname(__dirname); // Helper to run Python scripts function runPythonScript(scriptName, args = []) { const scriptPath = path.join(packageRoot, 'scripts', scriptName); return spawn('python3', [scriptPath, ...args], { stdio: 'inherit', cwd: packageRoot }); } // Helper to check installation status function checkStatus() { const hooksConfig = path.join(os.homedir(), '.config', 'claude', 'hooks.json'); const hasHooks = fs.existsSync(hooksConfig); console.log(chalk.blue('Claude Hooks Status:')); console.log(hasHooks ? chalk.green('✓ Hooks configuration installed') : chalk.red('✗ No hooks configuration found')); try { execSync('python3 --version', { stdio: 'pipe' }); console.log(chalk.green('✓ Python 3 available')); } catch { console.log(chalk.red('✗ Python 3 not found')); } return hasHooks; } program .name('claude-hooks') .description('Intelligent hooks system for Claude Code') .version(require('../package.json').version); program .command('init') .description('Initialize Claude Hooks (run after npm install)') .option('--force', 'Force reinstallation even if already configured') .action((options) => { console.log(chalk.blue('Initializing Claude Hooks...')); if (!options.force && checkStatus()) { console.log(chalk.yellow('⚠️ Claude Hooks already configured. Use --force to reinstall.')); return; } const initScript = runPythonScript('install.py'); initScript.on('close', (code) => { if (code === 0) { console.log(chalk.green('\n🎉 Claude Hooks initialized successfully!')); console.log(chalk.blue('Next steps:')); console.log('1. Restart Claude Code to activate hooks'); console.log('2. Try: claude-hooks test'); } else { console.log(chalk.red('❌ Initialization failed')); process.exit(1); } }); }); program .command('status') .description('Show Claude Hooks installation status') .action(() => { checkStatus(); }); program .command('test') .description('Run Claude Hooks tests') .action(() => { console.log(chalk.blue('Running Claude Hooks tests...')); const testScript = runPythonScript('test.py'); testScript.on('close', (code) => { if (code === 0) { console.log(chalk.green('✅ All tests passed!')); } else { console.log(chalk.red('❌ Some tests failed')); process.exit(1); } }); }); program .command('uninstall') .description('Remove Claude Hooks configuration') .action(() => { console.log(chalk.blue('Uninstalling Claude Hooks...')); const uninstallScript = runPythonScript('uninstall.py'); uninstallScript.on('close', (code) => { if (code === 0) { console.log(chalk.green('✅ Claude Hooks uninstalled successfully')); console.log(chalk.yellow('Note: To completely remove, run: npm uninstall -g claude-hooks')); } else { console.log(chalk.red('❌ Uninstall failed')); process.exit(1); } }); }); program .command('backup') .description('Manually trigger a backup') .action(() => { console.log(chalk.blue('Creating manual backup...')); const backupScript = runPythonScript('manual-backup.py'); backupScript.on('close', (code) => { if (code === 0) { console.log(chalk.green('✅ Backup created successfully')); } else { console.log(chalk.red('❌ Backup failed')); process.exit(1); } }); }); program.parse();