run method

Future<void> run(
  1. List<String> args
)

Run the CLI app

Implementation

Future<void> run(List<String> args) async {
  try {
    // Check for help flag
    if (args.contains('-h') || args.contains('--help')) {
      _showHelp();
      return;
    }

    // Extract options and find command
    final skillsPath = _extractOption(args, '--skills-path') ?? '.ai/skills';
    final commandName = _findCommandName(args);

    // Check if running as MCP server (default behavior)
    if (commandName == null) {
      await _runMCPServer(args);
      return;
    }

    // Route to command
    final commandFactory = _commands[commandName];

    if (commandFactory == null) {
      stderr.writeln('Unknown command: $commandName');
      stderr.writeln('');
      _showHelp();
      exit(1);
    }

    // Extract command-specific args
    final commandArgs = _extractCommandArgs(commandName, args);

    // Create command with args
    Command command;
    switch (commandName) {
      case 'skill:list':
        command = SkillListCommand(skillsPath: skillsPath);
        break;
      case 'skill:show':
        command = SkillShowCommand(
          skillsPath: skillsPath,
          skillName: commandArgs.isNotEmpty ? commandArgs.first : null,
        );
        break;
      case 'skill:render':
        command = SkillRenderCommand(
          skillsPath: skillsPath,
          skillName: commandArgs.isNotEmpty ? commandArgs[0] : null,
          outputPath: commandArgs.length > 1 ? commandArgs[1] : null,
        );
        break;
      case 'skill:add':
        command = SkillAddCommand(
          skillsPath: skillsPath,
          repo: commandArgs.isNotEmpty ? commandArgs[0] : null,
          skillName: commandArgs.length > 1 ? commandArgs[1] : null,
          force: args.contains('--force'),
        );
        break;
      case 'skill:remove':
        command = SkillRemoveCommand(
          skillsPath: skillsPath,
          skillName: commandArgs.isNotEmpty ? commandArgs.first : null,
          force: args.contains('--force'),
        );
        break;
      default:
        command = commandFactory();
    }

    await command.run();
  } on FormatException catch (e) {
    stderr.writeln('Error: ${e.message}');
    stderr.writeln('');
    _showHelp();
    exit(1);
  } catch (e) {
    stderr.writeln('Error: $e');
    exit(1);
  }
}