run method
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);
}
}