parseCliArgs function

CliArgs parseCliArgs(
  1. List<String> args
)

Parse CLI arguments.

Implementation

CliArgs parseCliArgs(List<String> args) {
  String? prompt;
  String? model;
  String? apiKey;
  String? apiEndpoint;
  bool headless = false;
  bool verbose = false;
  bool version = false;
  bool help = false;
  bool noColor = false;
  String? sessionId;
  String? resumeSession;
  String? workingDir;
  final files = <String>[];
  final env = <String, String>{};
  String? outputFormat;
  int? maxTokens;
  bool dangerouslySkipPermissions = false;

  var i = 0;
  final positional = <String>[];

  while (i < args.length) {
    final arg = args[i];

    switch (arg) {
      case '-p' || '--prompt':
        prompt = _nextArg(args, i, 'prompt');
        i += 2;
      case '-m' || '--model':
        model = _nextArg(args, i, 'model');
        i += 2;
      case '-k' || '--api-key':
        apiKey = _nextArg(args, i, 'api-key');
        i += 2;
      case '--api-endpoint':
        apiEndpoint = _nextArg(args, i, 'api-endpoint');
        i += 2;
      case '--headless':
        headless = true;
        i++;
      case '-v' || '--verbose':
        verbose = true;
        i++;
      case '--version':
        version = true;
        i++;
      case '-h' || '--help':
        help = true;
        i++;
      case '--no-color':
        noColor = true;
        i++;
      case '-s' || '--session':
        sessionId = _nextArg(args, i, 'session');
        i += 2;
      case '-r' || '--resume':
        resumeSession = _nextArg(args, i, 'resume');
        i += 2;
      case '-C' || '--directory':
        workingDir = _nextArg(args, i, 'directory');
        i += 2;
      case '-f' || '--file':
        files.add(_nextArg(args, i, 'file'));
        i += 2;
      case '-e' || '--env':
        final kv = _nextArg(args, i, 'env');
        final eq = kv.indexOf('=');
        if (eq > 0) {
          env[kv.substring(0, eq)] = kv.substring(eq + 1);
        }
        i += 2;
      case '-o' || '--output-format':
        outputFormat = _nextArg(args, i, 'output-format');
        i += 2;
      case '--max-tokens':
        maxTokens = int.tryParse(_nextArg(args, i, 'max-tokens'));
        i += 2;
      case '--dangerously-skip-permissions':
        dangerouslySkipPermissions = true;
        i++;
      default:
        if (arg.startsWith('-')) {
          stderr.writeln('Unknown option: $arg');
          i++;
        } else {
          positional.add(arg);
          i++;
        }
    }
  }

  // First positional is the prompt
  if (positional.isNotEmpty && prompt == null) {
    prompt = positional.join(' ');
  }

  // Detect piped stdin
  final stdinPipe = !stdin.hasTerminal;

  return CliArgs(
    prompt: prompt,
    model: model,
    apiKey: apiKey,
    apiEndpoint: apiEndpoint,
    headless: headless,
    verbose: verbose,
    version: version,
    help: help,
    noColor: noColor,
    sessionId: sessionId,
    resumeSession: resumeSession,
    workingDir: workingDir,
    files: files,
    env: env,
    stdinPipe: stdinPipe,
    outputFormat: outputFormat,
    maxTokens: maxTokens,
    dangerouslySkipPermissions: dangerouslySkipPermissions,
  );
}