use clap::Args; use clap::Parser; use codex_common::CliConfigOverrides; #[derive(Parser, Debug, Default)] #[command(version)] pub struct Cli { #[clap(skip)] pub config_overrides: CliConfigOverrides, #[command(subcommand)] pub command: Option, } #[derive(Debug, clap::Subcommand)] pub enum Command { /// Submit a new Codex Cloud task without launching the TUI. Exec(ExecCommand), /// Show the status of a Codex Cloud task. Status(StatusCommand), /// List Codex Cloud tasks. List(ListCommand), /// Apply the diff for a Codex Cloud task locally. Apply(ApplyCommand), /// Show the unified diff for a Codex Cloud task. Diff(DiffCommand), } #[derive(Debug, Args)] pub struct ExecCommand { /// Task prompt to run in Codex Cloud. #[arg(value_name = "QUERY")] pub query: Option, /// Target environment identifier (see `codex cloud` to browse). #[arg(long = "env", value_name = "ENV_ID")] pub environment: String, /// Number of assistant attempts (best-of-N). #[arg( long = "attempts", default_value_t = 1usize, value_parser = parse_attempts )] pub attempts: usize, /// Git branch to run in Codex Cloud (defaults to current branch). #[arg(long = "branch", value_name = "BRANCH")] pub branch: Option, } fn parse_attempts(input: &str) -> Result { let value: usize = input .parse() .map_err(|_| "attempts must be an integer between 1 and 4".to_string())?; if (1..=4).contains(&value) { Ok(value) } else { Err("attempts must be between 1 and 4".to_string()) } } fn parse_limit(input: &str) -> Result { let value: i64 = input .parse() .map_err(|_| "limit must be an integer between 1 and 20".to_string())?; if (1..=20).contains(&value) { Ok(value) } else { Err("limit must be between 1 and 20".to_string()) } } #[derive(Debug, Args)] pub struct StatusCommand { /// Codex Cloud task identifier to inspect. #[arg(value_name = "TASK_ID")] pub task_id: String, } #[derive(Debug, Args)] pub struct ListCommand { /// Filter tasks by environment identifier. #[arg(long = "env", value_name = "ENV_ID")] pub environment: Option, /// Maximum number of tasks to return (1-20). #[arg(long = "limit", default_value_t = 20, value_parser = parse_limit, value_name = "N")] pub limit: i64, /// Pagination cursor returned by a previous call. #[arg(long = "cursor", value_name = "CURSOR")] pub cursor: Option, /// Emit JSON instead of plain text. #[arg(long = "json", default_value_t = false)] pub json: bool, } #[derive(Debug, Args)] pub struct ApplyCommand { /// Codex Cloud task identifier to apply. #[arg(value_name = "TASK_ID")] pub task_id: String, /// Attempt number to apply (1-based). #[arg(long = "attempt", value_parser = parse_attempts, value_name = "N")] pub attempt: Option, } #[derive(Debug, Args)] pub struct DiffCommand { /// Codex Cloud task identifier to display. #[arg(value_name = "TASK_ID")] pub task_id: String, /// Attempt number to display (1-based). #[arg(long = "attempt", value_parser = parse_attempts, value_name = "N")] pub attempt: Option, }