parse method
Parse command-line arguments into a CliConfig.
Implementation
CliConfig parse(List<String> args) {
String? command;
final positional = <String>[];
final flags = <String, String>{};
final options = <String, String>{};
bool verbose = false;
bool quiet = false;
bool jsonOutput = false;
String? model;
String? apiKey;
int? maxTokens;
String? systemPrompt;
List<String> allowedTools = [];
PermissionMode? permissionMode;
String? workDir;
String? sessionId;
bool continueSession = false;
bool printOnly = false;
bool dangerouslySkipPermissions = false;
final mcpServers = <String>[];
bool listen = false;
int? listenPort;
String? outputFormat;
int i = 0;
while (i < args.length) {
final arg = args[i];
if (arg == '--') {
// Everything after -- is positional.
positional.addAll(args.sublist(i + 1));
break;
}
if (arg.startsWith('-')) {
final flagDef = CliFlags.lookup(arg);
if (flagDef == null) {
flags[arg.replaceFirst(RegExp(r'^-{1,2}'), '')] = 'true';
i++;
continue;
}
String? value;
if (flagDef.takesValue) {
if (i + 1 >= args.length) {
throw ArgumentError('Flag $arg requires a value');
}
value = args[++i];
}
switch (flagDef.long) {
case 'model':
model = value;
case 'api-key':
apiKey = value;
case 'max-tokens':
maxTokens = int.tryParse(value ?? '');
case 'system-prompt':
systemPrompt = value;
case 'permission-mode':
permissionMode = _parsePermissionMode(value!);
case 'allowed-tools':
allowedTools = value!.split(',').map((s) => s.trim()).toList();
case 'work-dir':
workDir = value;
case 'session':
sessionId = value;
case 'continue':
continueSession = true;
case 'json':
jsonOutput = true;
case 'verbose':
verbose = true;
case 'quiet':
quiet = true;
case 'print':
printOnly = true;
case 'dangerous-skip-permissions':
dangerouslySkipPermissions = true;
case 'mcp':
mcpServers.add(value!);
case 'listen':
listen = true;
case 'listen-port':
listenPort = int.tryParse(value ?? '');
case 'output-format':
outputFormat = value;
case 'version':
flags['version'] = 'true';
case 'help':
flags['help'] = 'true';
default:
if (value != null) {
options[flagDef.long] = value;
} else {
flags[flagDef.long] = 'true';
}
}
} else {
// First non-flag is treated as a subcommand if no command yet.
if (command == null && _isSubcommand(arg)) {
command = arg;
} else {
positional.add(arg);
}
}
i++;
}
return CliConfig(
command: command,
positionalArgs: positional,
flags: flags,
options: options,
verbose: verbose,
quiet: quiet,
jsonOutput: jsonOutput,
model: model,
apiKey: apiKey,
maxTokens: maxTokens,
systemPrompt: systemPrompt,
allowedTools: allowedTools,
permissionMode: permissionMode,
workDir: workDir,
sessionId: sessionId,
continueSession: continueSession,
printOnly: printOnly,
dangerouslySkipPermissions: dangerouslySkipPermissions,
mcpServers: mcpServers,
listen: listen,
listenPort: listenPort,
outputFormat: outputFormat,
);
}