skills/ruvnet/agentic-flow/V3 CLI Modernization

V3 CLI Modernization

SKILL.md

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

# 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

// 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<string, CommandModule>();
  private categories = new Map<CommandCategory, CommandModule[]>();
  private aliases = new Map<string, string>();

  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<CommandResult> {
    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

// 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<CommandResult> {
    if (options.interactive) {
      return this.interactiveSwarmInit(projectName);
    }

    return this.quickSwarmInit(projectName, options);
  }

  private async interactiveSwarmInit(
    projectName: string,
  ): Promise<CommandResult> {
    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<CommandResult> {
    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

// 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<CommandResult> {
    // 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<CommandResult> {
    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<CommandResult> {
    const metrics = await this.learningService.getMetrics();

    // Interactive metrics display
    await this.displayInteractiveMetrics(metrics);

    return CommandResult.success("Metrics displayed");
  }
}

Interactive Prompt System

Advanced Prompt Service

// 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<T>(options: SelectPromptOptions<T>): Promise<T> {
    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<T>(options: MultiSelectPromptOptions<T>): Promise<T[]> {
    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<string> {
    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<T>(
    task: ProgressTask<T>,
    options: ProgressOptions,
  ): Promise<T> {
    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<boolean> {
    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

// 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<string, HookHandler[]> = 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<void> {
    const handlers = this.hooks.get(type) || [];

    await Promise.all(
      handlers.map((handler) => this.executeHookSafely(handler, event)),
    );
  }

  private async generateIntelligentSuggestions(
    event: CLIHookEvent,
  ): Promise<Suggestion[]> {
    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

// src/cli/hooks/learning-hooks-integration.ts
export class LearningHooksIntegration {
  constructor(
    private agenticFlowHooks: AgenticFlowHooksClient,
    private agentDBLearning: AgentDBLearningClient,
  ) {}

  async recordCommandStart(event: CLIHookEvent): Promise<void> {
    // 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<void> {
    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<void> {
    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

// 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<WorkflowResult> {
    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<Workflow> {
    // 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<void> {
    // 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

// src/cli/performance/command-performance.ts
export class CommandPerformanceMonitor {
  private metrics = new Map<string, CommandMetrics>();

  async measureCommand<T>(
    commandName: string,
    executor: () => Promise<T>,
  ): Promise<T> {
    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

// src/cli/completion/intelligent-completion.ts
export class IntelligentCompletion {
  constructor(
    private learningService: LearningService,
    private commandRegistry: ModularCommandRegistry,
  ) {}

  async generateCompletions(
    partial: string,
    context: CompletionContext,
  ): Promise<Completion[]> {
    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<Completion[]> {
    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

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

# Full CLI modernization implementation
Task("CLI modernization implementation",
     "Implement modular commands, interactive prompts, and intelligent workflows",
     "cli-hooks-developer")

Interactive Command Enhancement

# Enhanced interactive commands
claude-flow swarm init --interactive
claude-flow learning start --guided
claude-flow workflow create --from-intent "setup new project"
Weekly Installs
0
GitHub Stars
505
First Seen
Jan 1, 1970