use std::path::PathBuf;
use clap::{Parser, ValueEnum};
#[derive(Parser, Debug)]
#[command(name = "locode-exec", version, about)]
#[allow(clippy::struct_excessive_bools)] pub struct Cli {
pub prompt: Option<String>,
#[arg(long)]
pub cwd: Option<PathBuf>,
#[arg(long, value_enum)]
pub harness: Option<Harness>,
#[arg(long, env = "LOCODE_API_SCHEMA")]
pub api_schema: Option<String>,
#[arg(long)]
pub model: Option<String>,
#[arg(long)]
pub settings: Option<String>,
#[arg(long)]
pub no_session_persistence: bool,
#[arg(short = 'c', long = "continue", conflicts_with = "resume")]
pub continue_session: bool,
#[arg(short = 'r', long = "resume", value_name = "SESSION_ID")]
pub resume: Option<String>,
#[arg(long)]
pub max_turns: Option<u32>,
#[arg(long, value_enum, default_value_t = OutputFormat::Json)]
pub output_format: OutputFormat,
#[arg(
long,
visible_alias = "no-yolo",
conflicts_with = "dangerously_skip_permissions"
)]
pub restricted: bool,
#[arg(long, visible_alias = "yolo", hide = true)]
pub dangerously_skip_permissions: bool,
#[arg(long)]
pub strip_identity: bool,
#[arg(long)]
pub stream: bool,
#[arg(long)]
pub no_project_instructions: bool,
#[arg(long = "add-dir", value_name = "DIR")]
pub add_dir: Vec<std::path::PathBuf>,
#[arg(long, value_name = "LEVEL")]
pub effort: Option<EffortArg>,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, ValueEnum)]
#[value(rename_all = "kebab-case")]
pub enum EffortArg {
Low,
Medium,
High,
XHigh,
Max,
}
impl From<EffortArg> for locode_core::Effort {
fn from(arg: EffortArg) -> Self {
match arg {
EffortArg::Low => locode_core::Effort::Low,
EffortArg::Medium => locode_core::Effort::Medium,
EffortArg::High => locode_core::Effort::High,
EffortArg::XHigh => locode_core::Effort::XHigh,
EffortArg::Max => locode_core::Effort::Max,
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, ValueEnum)]
#[value(rename_all = "kebab-case")]
pub enum Harness {
Grok,
Claude,
Codex,
}
impl Harness {
#[must_use]
pub fn as_str(self) -> &'static str {
match self {
Harness::Grok => "grok",
Harness::Claude => "claude",
Harness::Codex => "codex",
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, ValueEnum)]
#[value(rename_all = "kebab-case")]
pub enum OutputFormat {
Json,
Text,
StreamJson,
}