1use std::path::PathBuf;
2
3use clap::{Parser, Subcommand};
4
5use rho_providers::reasoning::ReasoningLevel;
6
7#[derive(Parser, Debug)]
8#[command(name = "rho")]
9pub struct Cli {
10 #[arg(long)]
11 pub provider: Option<String>,
12 #[arg(long)]
13 pub model: Option<String>,
14 #[arg(long)]
15 pub config: Option<PathBuf>,
16 #[arg(long, value_parser = ["api-key", "codex", "anthropic-api-key", "github-copilot", "xai-api-key", "xai-oauth", "moonshot-api-key", "openrouter-api-key", "kimi-oauth"])]
17 pub auth: Option<String>,
18 #[arg(long)]
20 pub no_system_prompt: bool,
21 #[arg(long)]
23 pub no_tools: bool,
24 #[arg(long, global = true)]
26 pub no_subagents: bool,
27 #[arg(long, global = true, value_name = "ID")]
29 pub agent: Option<String>,
30 #[arg(long)]
32 pub reasoning: Option<ReasoningLevel>,
33 #[arg(short = 'R', long, value_name = "ID", num_args = 0..=1)]
35 pub resume: Option<Option<String>>,
36 #[command(subcommand)]
37 pub command: Option<Command>,
38}
39
40#[derive(Subcommand, Debug)]
41pub enum Command {
42 Run {
44 #[arg(long)]
46 stdin: bool,
47 #[arg(long, value_name = "PATH")]
50 output_file: Option<PathBuf>,
51 #[arg(value_name = "PROMPT", num_args = 0..)]
53 prompt: Vec<String>,
54 },
55 Attach {
57 #[arg(value_name = "ID")]
59 id: String,
60 },
61 Login {
63 #[arg(value_name = "PROVIDER")]
65 provider: String,
66 #[arg(long)]
68 device_auth: bool,
69 },
70 Update,
72}
73
74#[cfg(test)]
75#[path = "cli_tests.rs"]
76mod tests;