--- name: "V3 CLI Modernization" description: "CLI modernization and hooks system enhancement for claude-flow v3. Implements interactive prompts, command decomposition, enhanced hooks integration, and intelligent workflow automation." --- # V3 CLI Modernization ## What This Skill Does Modernizes claude-flow v3 CLI with interactive prompts, intelligent command decomposition, enhanced hooks integration, performance optimization, and comprehensive workflow automation capabilities. ## Quick Start ```bash # Initialize CLI modernization analysis Task("CLI architecture", "Analyze current CLI structure and identify optimization opportunities", "cli-hooks-developer") # Modernization implementation (parallel) Task("Command decomposition", "Break down large CLI files into focused modules", "cli-hooks-developer") Task("Interactive prompts", "Implement intelligent interactive CLI experience", "cli-hooks-developer") Task("Hooks enhancement", "Deep integrate hooks with CLI lifecycle", "cli-hooks-developer") ``` ## CLI Architecture Modernization ### Current State Analysis ``` Current CLI Issues: ├── index.ts: 108KB monolithic file ├── enterprise.ts: 68KB feature module ├── Limited interactivity: Basic command parsing ├── Hooks integration: Basic pre/post execution └── No intelligent workflows: Manual command chaining Target Architecture: ├── Modular Commands: <500 lines per command ├── Interactive Prompts: Smart context-aware UX ├── Enhanced Hooks: Deep lifecycle integration ├── Workflow Automation: Intelligent command orchestration └── Performance: <200ms command response time ``` ### Modular Command Architecture ```typescript // src/cli/core/command-registry.ts interface CommandModule { name: string; description: string; category: CommandCategory; handler: CommandHandler; middleware: MiddlewareStack; permissions: Permission[]; examples: CommandExample[]; } export class ModularCommandRegistry { private commands = new Map(); private categories = new Map(); private aliases = new Map(); registerCommand(command: CommandModule): void { this.commands.set(command.name, command); // Register in category index if (!this.categories.has(command.category)) { this.categories.set(command.category, []); } this.categories.get(command.category)!.push(command); } async executeCommand(name: string, args: string[]): Promise { const command = this.resolveCommand(name); if (!command) { throw new CommandNotFoundError(name, this.getSuggestions(name)); } // Execute middleware stack const context = await this.buildExecutionContext(command, args); const result = await command.middleware.execute(context); return result; } private resolveCommand(name: string): CommandModule | undefined { // Try exact match first if (this.commands.has(name)) { return this.commands.get(name); } // Try alias const aliasTarget = this.aliases.get(name); if (aliasTarget) { return this.commands.get(aliasTarget); } // Try fuzzy match return this.findFuzzyMatch(name); } } ``` ## Command Decomposition Strategy ### Swarm Commands Module ```typescript // src/cli/commands/swarm/swarm.command.ts @Command({ name: "swarm", description: "Swarm coordination and management", category: "orchestration", }) export class SwarmCommand { constructor( private swarmCoordinator: UnifiedSwarmCoordinator, private promptService: InteractivePromptService, ) {} @SubCommand("init") @Option("--topology", "Swarm topology (mesh|hierarchical|adaptive)", "hierarchical") @Option("--agents", "Number of agents to spawn", 5) @Option("--interactive", "Interactive agent configuration", false) async init( @Arg("projectName") projectName: string, options: SwarmInitOptions, ): Promise { if (options.interactive) { return this.interactiveSwarmInit(projectName); } return this.quickSwarmInit(projectName, options); } private async interactiveSwarmInit(projectName: string): Promise { console.log(`🚀 Initializing Swarm for ${projectName}`); // Interactive topology selection const topology = await this.promptService.select({ message: "Select swarm topology:", choices: [ { name: "Hierarchical (Queen-led coordination)", value: "hierarchical" }, { name: "Mesh (Peer-to-peer collaboration)", value: "mesh" }, { name: "Adaptive (Dynamic topology switching)", value: "adaptive" }, ], }); // Agent configuration const agents = await this.promptAgentConfiguration(); // Initialize with configuration const swarm = await this.swarmCoordinator.initialize({ name: projectName, topology, agents, hooks: { onAgentSpawn: this.handleAgentSpawn.bind(this), onTaskComplete: this.handleTaskComplete.bind(this), onSwarmComplete: this.handleSwarmComplete.bind(this), }, }); return CommandResult.success({ message: `✅ Swarm ${projectName} initialized with ${agents.length} agents`, data: { swarmId: swarm.id, topology, agentCount: agents.length }, }); } @SubCommand("status") async status(): Promise { const swarms = await this.swarmCoordinator.listActiveSwarms(); if (swarms.length === 0) { return CommandResult.info("No active swarms found"); } // Interactive swarm selection if multiple const selectedSwarm = swarms.length === 1 ? swarms[0] : await this.promptService.select({ message: "Select swarm to inspect:", choices: swarms.map((s) => ({ name: `${s.name} (${s.agents.length} agents, ${s.topology})`, value: s, })), }); return this.displaySwarmStatus(selectedSwarm); } } ``` ### Learning Commands Module ```typescript // src/cli/commands/learning/learning.command.ts @Command({ name: "learning", description: "Learning system management and optimization", category: "intelligence", }) export class LearningCommand { constructor( private learningService: IntegratedLearningService, private promptService: InteractivePromptService, ) {} @SubCommand("start") @Option("--algorithm", "RL algorithm to use", "auto") @Option("--tier", "Learning tier (basic|standard|advanced)", "standard") async start(options: LearningStartOptions): Promise { // Auto-detect optimal algorithm if not specified if (options.algorithm === "auto") { const taskContext = await this.analyzeCurrentContext(); options.algorithm = this.learningService.selectOptimalAlgorithm(taskContext); console.log(`🧠 Auto-selected ${options.algorithm} algorithm based on context`); } const session = await this.learningService.startSession({ algorithm: options.algorithm, tier: options.tier, userId: await this.getCurrentUser(), }); return CommandResult.success({ message: `🚀 Learning session started with ${options.algorithm}`, data: { sessionId: session.id, algorithm: options.algorithm, tier: options.tier }, }); } @SubCommand("feedback") @Arg("reward", "Reward value (0-1)", "number") async feedback( @Arg("reward") reward: number, @Option("--context", "Additional context for learning") context?: string, ): Promise { const activeSession = await this.learningService.getActiveSession(); if (!activeSession) { return CommandResult.error( "No active learning session found. Start one with `learning start`", ); } await this.learningService.submitFeedback({ sessionId: activeSession.id, reward, context, timestamp: new Date(), }); return CommandResult.success({ message: `📊 Feedback recorded (reward: ${reward})`, data: { reward, sessionId: activeSession.id }, }); } @SubCommand("metrics") async metrics(): Promise { const metrics = await this.learningService.getMetrics(); // Interactive metrics display await this.displayInteractiveMetrics(metrics); return CommandResult.success("Metrics displayed"); } } ``` ## Interactive Prompt System ### Advanced Prompt Service ```typescript // src/cli/services/interactive-prompt.service.ts interface PromptOptions { message: string; type: "select" | "multiselect" | "input" | "confirm" | "progress"; choices?: PromptChoice[]; default?: any; validate?: (input: any) => boolean | string; transform?: (input: any) => any; } export class InteractivePromptService { private inquirer: any; // Dynamic import for tree-shaking async select(options: SelectPromptOptions): Promise { const { default: inquirer } = await import("inquirer"); const result = await inquirer.prompt([ { type: "list", name: "selection", message: options.message, choices: options.choices, default: options.default, }, ]); return result.selection; } async multiSelect(options: MultiSelectPromptOptions): Promise { const { default: inquirer } = await import("inquirer"); const result = await inquirer.prompt([ { type: "checkbox", name: "selections", message: options.message, choices: options.choices, validate: (input: T[]) => { if (options.minSelections && input.length < options.minSelections) { return `Please select at least ${options.minSelections} options`; } if (options.maxSelections && input.length > options.maxSelections) { return `Please select at most ${options.maxSelections} options`; } return true; }, }, ]); return result.selections; } async input(options: InputPromptOptions): Promise { const { default: inquirer } = await import("inquirer"); const result = await inquirer.prompt([ { type: "input", name: "input", message: options.message, default: options.default, validate: options.validate, transformer: options.transform, }, ]); return result.input; } async progressTask(task: ProgressTask, options: ProgressOptions): Promise { const { default: cliProgress } = await import("cli-progress"); const progressBar = new cliProgress.SingleBar({ format: `${options.title} |{bar}| {percentage}% | {status}`, barCompleteChar: "█", barIncompleteChar: "░", hideCursor: true, }); progressBar.start(100, 0, { status: "Starting..." }); try { const result = await task({ updateProgress: (percent: number, status?: string) => { progressBar.update(percent, { status: status || "Processing..." }); }, }); progressBar.update(100, { status: "Complete!" }); progressBar.stop(); return result; } catch (error) { progressBar.stop(); throw error; } } async confirmWithDetails(message: string, details: ConfirmationDetails): Promise { console.log("\n" + chalk.bold(message)); console.log(chalk.gray("Details:")); for (const [key, value] of Object.entries(details)) { console.log(chalk.gray(` ${key}: ${value}`)); } return this.confirm("\nProceed?"); } } ``` ## Enhanced Hooks Integration ### Deep CLI Hooks Integration ```typescript // src/cli/hooks/cli-hooks-manager.ts interface CLIHookEvent { type: "command_start" | "command_end" | "command_error" | "agent_spawn" | "task_complete"; command: string; args: string[]; context: ExecutionContext; timestamp: Date; } export class CLIHooksManager { private hooks: Map = new Map(); private learningIntegration: LearningHooksIntegration; constructor() { this.learningIntegration = new LearningHooksIntegration(); this.setupDefaultHooks(); } private setupDefaultHooks(): void { // Learning integration hooks this.registerHook("command_start", async (event: CLIHookEvent) => { await this.learningIntegration.recordCommandStart(event); }); this.registerHook("command_end", async (event: CLIHookEvent) => { await this.learningIntegration.recordCommandSuccess(event); }); this.registerHook("command_error", async (event: CLIHookEvent) => { await this.learningIntegration.recordCommandError(event); }); // Intelligent suggestions this.registerHook("command_start", async (event: CLIHookEvent) => { const suggestions = await this.generateIntelligentSuggestions(event); if (suggestions.length > 0) { this.displaySuggestions(suggestions); } }); // Performance monitoring this.registerHook("command_end", async (event: CLIHookEvent) => { await this.recordPerformanceMetrics(event); }); } async executeHooks(type: string, event: CLIHookEvent): Promise { const handlers = this.hooks.get(type) || []; await Promise.all(handlers.map((handler) => this.executeHookSafely(handler, event))); } private async generateIntelligentSuggestions(event: CLIHookEvent): Promise { const context = await this.learningIntegration.getExecutionContext(event); const patterns = await this.learningIntegration.findSimilarPatterns(context); return patterns.map((pattern) => ({ type: "optimization", message: `Based on similar executions, consider: ${pattern.suggestion}`, confidence: pattern.confidence, })); } } ``` ### Learning Integration ```typescript // src/cli/hooks/learning-hooks-integration.ts export class LearningHooksIntegration { constructor( private agenticFlowHooks: AgenticFlowHooksClient, private agentDBLearning: AgentDBLearningClient, ) {} async recordCommandStart(event: CLIHookEvent): Promise { // Start trajectory tracking await this.agenticFlowHooks.trajectoryStart({ sessionId: event.context.sessionId, command: event.command, args: event.args, context: event.context, }); // Record experience in AgentDB await this.agentDBLearning.recordExperience({ type: "command_execution", state: this.encodeCommandState(event), action: event.command, timestamp: event.timestamp, }); } async recordCommandSuccess(event: CLIHookEvent): Promise { const executionTime = Date.now() - event.timestamp.getTime(); const reward = this.calculateReward(event, executionTime, true); // Complete trajectory await this.agenticFlowHooks.trajectoryEnd({ sessionId: event.context.sessionId, success: true, reward, verdict: "positive", }); // Submit feedback to learning system await this.agentDBLearning.submitFeedback({ sessionId: event.context.learningSessionId, reward, success: true, latencyMs: executionTime, }); // Store successful pattern if (reward > 0.8) { await this.agenticFlowHooks.storePattern({ pattern: event.command, solution: event.context.result, confidence: reward, }); } } async recordCommandError(event: CLIHookEvent): Promise { const executionTime = Date.now() - event.timestamp.getTime(); const reward = this.calculateReward(event, executionTime, false); // Complete trajectory with error await this.agenticFlowHooks.trajectoryEnd({ sessionId: event.context.sessionId, success: false, reward, verdict: "negative", error: event.context.error, }); // Learn from failure await this.agentDBLearning.submitFeedback({ sessionId: event.context.learningSessionId, reward, success: false, latencyMs: executionTime, error: event.context.error, }); } private calculateReward(event: CLIHookEvent, executionTime: number, success: boolean): number { if (!success) return 0; // Base reward for success let reward = 0.5; // Performance bonus (faster execution) const expectedTime = this.getExpectedExecutionTime(event.command); if (executionTime < expectedTime) { reward += 0.3 * (1 - executionTime / expectedTime); } // Complexity bonus const complexity = this.calculateCommandComplexity(event); reward += complexity * 0.2; return Math.min(reward, 1.0); } } ``` ## Intelligent Workflow Automation ### Workflow Orchestrator ```typescript // src/cli/workflows/workflow-orchestrator.ts interface WorkflowStep { id: string; command: string; args: string[]; dependsOn: string[]; condition?: WorkflowCondition; retryPolicy?: RetryPolicy; } export class WorkflowOrchestrator { constructor( private commandRegistry: ModularCommandRegistry, private promptService: InteractivePromptService, ) {} async executeWorkflow(workflow: Workflow): Promise { const context = new WorkflowExecutionContext(workflow); // Display workflow overview await this.displayWorkflowOverview(workflow); const confirmed = await this.promptService.confirm("Execute this workflow?"); if (!confirmed) { return WorkflowResult.cancelled(); } // Execute steps return this.promptService.progressTask( async ({ updateProgress }) => { const steps = this.sortStepsByDependencies(workflow.steps); for (let i = 0; i < steps.length; i++) { const step = steps[i]; updateProgress((i / steps.length) * 100, `Executing ${step.command}`); await this.executeStep(step, context); } return WorkflowResult.success(context.getResults()); }, { title: `Workflow: ${workflow.name}` }, ); } async generateWorkflowFromIntent(intent: string): Promise { // Use learning system to generate workflow const patterns = await this.findWorkflowPatterns(intent); if (patterns.length === 0) { throw new Error("Could not generate workflow for intent"); } // Select best pattern or let user choose const selectedPattern = patterns.length === 1 ? patterns[0] : await this.promptService.select({ message: "Select workflow template:", choices: patterns.map((p) => ({ name: `${p.name} (${p.confidence}% match)`, value: p, })), }); return this.customizeWorkflow(selectedPattern, intent); } private async executeStep(step: WorkflowStep, context: WorkflowExecutionContext): Promise { // Check conditions if (step.condition && !this.evaluateCondition(step.condition, context)) { context.skipStep(step.id, "Condition not met"); return; } // Check dependencies const missingDeps = step.dependsOn.filter((dep) => !context.isStepCompleted(dep)); if (missingDeps.length > 0) { throw new WorkflowError(`Step ${step.id} has unmet dependencies: ${missingDeps.join(", ")}`); } // Execute with retry policy const retryPolicy = step.retryPolicy || { maxAttempts: 1 }; let lastError: Error | null = null; for (let attempt = 1; attempt <= retryPolicy.maxAttempts; attempt++) { try { const result = await this.commandRegistry.executeCommand(step.command, step.args); context.completeStep(step.id, result); return; } catch (error) { lastError = error as Error; if (attempt < retryPolicy.maxAttempts) { await this.delay(retryPolicy.backoffMs || 1000); } } } throw new WorkflowError( `Step ${step.id} failed after ${retryPolicy.maxAttempts} attempts: ${lastError?.message}`, ); } } ``` ## Performance Optimization ### Command Performance Monitoring ```typescript // src/cli/performance/command-performance.ts export class CommandPerformanceMonitor { private metrics = new Map(); async measureCommand(commandName: string, executor: () => Promise): Promise { const start = performance.now(); const memBefore = process.memoryUsage(); try { const result = await executor(); const end = performance.now(); const memAfter = process.memoryUsage(); this.recordMetrics(commandName, { executionTime: end - start, memoryDelta: memAfter.heapUsed - memBefore.heapUsed, success: true, }); return result; } catch (error) { const end = performance.now(); this.recordMetrics(commandName, { executionTime: end - start, memoryDelta: 0, success: false, error: error as Error, }); throw error; } } private recordMetrics(command: string, measurement: PerformanceMeasurement): void { if (!this.metrics.has(command)) { this.metrics.set(command, new CommandMetrics(command)); } const metrics = this.metrics.get(command)!; metrics.addMeasurement(measurement); // Alert if performance degrades if (metrics.getP95ExecutionTime() > 5000) { // 5 seconds console.warn( `⚠️ Command '${command}' is performing slowly (P95: ${metrics.getP95ExecutionTime()}ms)`, ); } } getCommandReport(command: string): PerformanceReport { const metrics = this.metrics.get(command); if (!metrics) { throw new Error(`No metrics found for command: ${command}`); } return { command, totalExecutions: metrics.getTotalExecutions(), successRate: metrics.getSuccessRate(), avgExecutionTime: metrics.getAverageExecutionTime(), p95ExecutionTime: metrics.getP95ExecutionTime(), avgMemoryUsage: metrics.getAverageMemoryUsage(), recommendations: this.generateRecommendations(metrics), }; } } ``` ## Smart Auto-completion ### Intelligent Command Completion ```typescript // src/cli/completion/intelligent-completion.ts export class IntelligentCompletion { constructor( private learningService: LearningService, private commandRegistry: ModularCommandRegistry, ) {} async generateCompletions(partial: string, context: CompletionContext): Promise { const completions: Completion[] = []; // 1. Exact command matches const exactMatches = this.commandRegistry.findCommandsByPrefix(partial); completions.push( ...exactMatches.map((cmd) => ({ value: cmd.name, description: cmd.description, type: "command", confidence: 1.0, })), ); // 2. Learning-based suggestions const learnedSuggestions = await this.learningService.suggestCommands(partial, context); completions.push(...learnedSuggestions); // 3. Context-aware suggestions const contextualSuggestions = await this.generateContextualSuggestions(partial, context); completions.push(...contextualSuggestions); // Sort by confidence and relevance return completions.sort((a, b) => b.confidence - a.confidence).slice(0, 10); // Top 10 suggestions } private async generateContextualSuggestions( partial: string, context: CompletionContext, ): Promise { const suggestions: Completion[] = []; // If in git repository, suggest git-related commands if (context.isGitRepository) { if (partial.startsWith("git")) { suggestions.push({ value: "git commit", description: "Create git commit with generated message", type: "workflow", confidence: 0.8, }); } } // If package.json exists, suggest npm commands if (context.hasPackageJson) { if (partial.startsWith("npm") || partial.startsWith("swarm")) { suggestions.push({ value: "swarm init", description: "Initialize swarm for this project", type: "workflow", confidence: 0.9, }); } } return suggestions; } } ``` ## Success Metrics ### CLI Performance Targets - [ ] **Command Response**: <200ms average command execution time - [ ] **File Decomposition**: index.ts (108KB) → <10KB per command module - [ ] **Interactive UX**: Smart prompts with context awareness - [ ] **Hook Integration**: Deep lifecycle integration with learning - [ ] **Workflow Automation**: Intelligent multi-step command orchestration - [ ] **Auto-completion**: >90% accuracy for command suggestions ### User Experience Improvements ```typescript const cliImprovements = { before: { commandResponse: "~500ms", interactivity: "Basic command parsing", workflows: "Manual command chaining", suggestions: "Static help text", }, after: { commandResponse: "<200ms with caching", interactivity: "Smart context-aware prompts", workflows: "Automated multi-step execution", suggestions: "Learning-based intelligent completion", }, }; ``` ## Related V3 Skills - `v3-core-implementation` - Core domain integration - `v3-memory-unification` - Memory-backed command caching - `v3-swarm-coordination` - CLI swarm management integration - `v3-performance-optimization` - CLI performance monitoring ## Usage Examples ### Complete CLI Modernization ```bash # Full CLI modernization implementation Task("CLI modernization implementation", "Implement modular commands, interactive prompts, and intelligent workflows", "cli-hooks-developer") ``` ### Interactive Command Enhancement ```bash # Enhanced interactive commands claude-flow swarm init --interactive claude-flow learning start --guided claude-flow workflow create --from-intent "setup new project" ```