UNPKG

claude-flow-tbowman01

Version:

Enterprise-grade AI agent orchestration with ruv-swarm integration (Alpha Release)

144 lines (126 loc) 4.62 kB
#!/usr/bin/env node /** * Claude-Flow Migration Tool * Helps existing projects migrate to optimized prompts and configurations */ import { Command } from '@cliffy/command'; import { MigrationRunner } from './migration-runner.js'; import { MigrationAnalyzer } from './migration-analyzer.js'; import type { MigrationStrategy } from './types.js'; import { logger } from './logger.js'; import * as chalk from 'chalk'; import * as path from 'path'; const program = new Command(); program .name('claude-flow-migrate') .description('Migrate existing claude-flow projects to optimized prompts') .version('1.0.0'); program .command('analyze [path]') .description('Analyze existing project for migration readiness') .option('-d, --detailed', 'Show detailed analysis') .option('-o, --output <file>', 'Output analysis to file') .action(async (projectPath = '.', options) => { try { const analyzer = new MigrationAnalyzer(); const analysis = await analyzer.analyze(path.resolve(projectPath)); if (options.output) { await analyzer.saveAnalysis(analysis, options.output); logger.success(`Analysis saved to ${options.output}`); } analyzer.printAnalysis(analysis, options.detailed); } catch (error) { logger.error('Analysis failed:', error); process.exit(1); } }); program .command('migrate [path]') .description('Migrate project to optimized prompts') .option('-s, --strategy <type>', 'Migration strategy: full, selective, merge', 'selective') .option('-b, --backup <dir>', 'Backup directory', '.claude-backup') .option('-f, --force', 'Force migration without prompts') .option('--dry-run', 'Simulate migration without making changes') .option('--preserve-custom', 'Preserve custom commands and configurations') .option('--skip-validation', 'Skip post-migration validation') .action(async (projectPath = '.', options) => { try { const runner = new MigrationRunner({ projectPath: path.resolve(projectPath), strategy: options.strategy as MigrationStrategy, backupDir: options.backup, force: options.force, dryRun: options.dryRun, preserveCustom: options.preserveCustom, skipValidation: options.skipValidation, }); await runner.run(); } catch (error) { logger.error('Migration failed:', error); process.exit(1); } }); program .command('rollback [path]') .description('Rollback to previous configuration') .option('-b, --backup <dir>', 'Backup directory to restore from', '.claude-backup') .option('-t, --timestamp <time>', 'Restore from specific timestamp') .option('-f, --force', 'Force rollback without prompts') .action(async (projectPath = '.', options) => { try { const runner = new MigrationRunner({ projectPath: path.resolve(projectPath), strategy: 'full', backupDir: options.backup, force: options.force, }); await runner.rollback(options.timestamp); } catch (error) { logger.error('Rollback failed:', error); process.exit(1); } }); program .command('validate [path]') .description('Validate migration was successful') .option('-v, --verbose', 'Show detailed validation results') .action(async (projectPath = '.', options) => { try { const runner = new MigrationRunner({ projectPath: path.resolve(projectPath), strategy: 'full', }); const isValid = await runner.validate(options.verbose); if (isValid) { logger.success('Migration validated successfully!'); } else { logger.error('Migration validation failed'); process.exit(1); } } catch (error) { logger.error('Validation failed:', error); process.exit(1); } }); program .command('list-backups [path]') .description('List available backups') .option('-b, --backup <dir>', 'Backup directory', '.claude-backup') .action(async (projectPath = '.', options) => { try { const runner = new MigrationRunner({ projectPath: path.resolve(projectPath), strategy: 'full', backupDir: options.backup, }); await runner.listBackups(); } catch (error) { logger.error('Failed to list backups:', error); process.exit(1); } }); // Show help if no command provided if (!process.argv.slice(2).length) { program.outputHelp(); } program.parse(process.argv);