1pub mod auth;
4pub mod config;
5pub mod run;
6
7use clap::{Parser, Subcommand};
8use std::path::PathBuf;
9
10#[derive(Parser, Debug)]
15#[command(name = "codetether")]
16#[command(version, about, long_about = None)]
17pub struct Cli {
18 #[arg(global = true)]
20 pub project: Option<PathBuf>,
21
22 #[arg(long, global = true)]
24 pub print_logs: bool,
25
26 #[arg(long, global = true, value_parser = ["DEBUG", "INFO", "WARN", "ERROR"])]
28 pub log_level: Option<String>,
29
30 #[arg(short, long, env = "CODETETHER_SERVER")]
33 pub server: Option<String>,
34
35 #[arg(short, long, env = "CODETETHER_TOKEN")]
37 pub token: Option<String>,
38
39 #[arg(short, long, env = "CODETETHER_WORKER_NAME")]
41 pub name: Option<String>,
42
43 #[command(subcommand)]
44 pub command: Option<Command>,
45}
46
47#[derive(Subcommand, Debug)]
48pub enum Command {
49 Tui(TuiArgs),
51
52 Serve(ServeArgs),
54
55 Run(RunArgs),
57
58 Auth(AuthArgs),
60
61 Config(ConfigArgs),
63
64 Worker(A2aArgs),
66
67 Swarm(SwarmArgs),
69
70 Rlm(RlmArgs),
72
73 Ralph(RalphArgs),
75
76 Mcp(McpArgs),
78
79 Stats(StatsArgs),
81
82 Cleanup(CleanupArgs),
84
85 Models(ModelsArgs),
87}
88
89#[derive(Parser, Debug)]
90pub struct AuthArgs {
91 #[command(subcommand)]
92 pub command: AuthCommand,
93}
94
95#[derive(Subcommand, Debug)]
96pub enum AuthCommand {
97 Copilot(CopilotAuthArgs),
99}
100
101#[derive(Parser, Debug)]
102pub struct CopilotAuthArgs {
103 #[arg(long)]
105 pub enterprise_url: Option<String>,
106
107 #[arg(long, env = "CODETETHER_COPILOT_OAUTH_CLIENT_ID")]
109 pub client_id: Option<String>,
110}
111
112#[derive(Parser, Debug)]
113pub struct TuiArgs {
114 pub project: Option<PathBuf>,
116}
117
118#[derive(Parser, Debug)]
119pub struct ServeArgs {
120 #[arg(short, long, default_value = "4096")]
122 pub port: u16,
123
124 #[arg(long, default_value = "127.0.0.1")]
126 pub hostname: String,
127
128 #[arg(long)]
130 pub mdns: bool,
131}
132
133#[derive(Parser, Debug)]
134pub struct RunArgs {
135 pub message: String,
137
138 #[arg(short, long)]
140 pub continue_session: bool,
141
142 #[arg(short, long)]
144 pub session: Option<String>,
145
146 #[arg(short, long)]
148 pub model: Option<String>,
149
150 #[arg(long)]
152 pub agent: Option<String>,
153
154 #[arg(long, default_value = "default", value_parser = ["default", "json"])]
156 pub format: String,
157
158 #[arg(short, long)]
160 pub file: Vec<PathBuf>,
161}
162
163#[derive(Parser, Debug, Clone)]
164pub struct A2aArgs {
165 #[arg(short, long, env = "CODETETHER_SERVER")]
167 pub server: String,
168
169 #[arg(short, long, env = "CODETETHER_TOKEN")]
171 pub token: Option<String>,
172
173 #[arg(short, long, env = "CODETETHER_WORKER_NAME")]
175 pub name: Option<String>,
176
177 #[arg(short, long)]
179 pub codebases: Option<String>,
180
181 #[arg(long, default_value = "safe", value_parser = ["all", "safe", "none"])]
183 pub auto_approve: String,
184
185 #[arg(short, long)]
187 pub email: Option<String>,
188
189 #[arg(long)]
191 pub push_url: Option<String>,
192}
193
194#[derive(Parser, Debug)]
195pub struct ConfigArgs {
196 #[arg(long)]
198 pub show: bool,
199
200 #[arg(long)]
202 pub init: bool,
203
204 #[arg(long)]
206 pub set: Option<String>,
207}
208
209#[derive(Parser, Debug)]
210pub struct SwarmArgs {
211 pub task: String,
213
214 #[arg(short, long)]
216 pub model: Option<String>,
217
218 #[arg(short = 's', long, default_value = "auto")]
220 pub strategy: String,
221
222 #[arg(long, default_value = "100")]
224 pub max_subagents: usize,
225
226 #[arg(long, default_value = "100")]
228 pub max_steps: usize,
229
230 #[arg(long, default_value = "300")]
232 pub timeout: u64,
233
234 #[arg(long)]
236 pub json: bool,
237}
238
239#[derive(Parser, Debug)]
240pub struct RlmArgs {
241 pub query: String,
243
244 #[arg(short, long)]
246 pub file: Vec<PathBuf>,
247
248 #[arg(long)]
250 pub content: Option<String>,
251
252 #[arg(long, default_value = "auto")]
254 pub content_type: String,
255
256 #[arg(long, default_value = "4000")]
258 pub max_tokens: usize,
259
260 #[arg(long)]
262 pub json: bool,
263
264 #[arg(short, long)]
266 pub verbose: bool,
267}
268
269#[derive(Parser, Debug)]
270pub struct RalphArgs {
271 #[arg(value_parser = ["run", "status", "create-prd"])]
273 pub action: String,
274
275 #[arg(short, long, default_value = "prd.json")]
277 pub prd: PathBuf,
278
279 #[arg(short, long)]
281 pub feature: Option<String>,
282
283 #[arg(long = "project-name")]
285 pub project_name: Option<String>,
286
287 #[arg(long, default_value = "10")]
289 pub max_iterations: usize,
290
291 #[arg(short, long)]
293 pub model: Option<String>,
294
295 #[arg(long)]
297 pub json: bool,
298}
299
300#[derive(Parser, Debug)]
301pub struct McpArgs {
302 #[arg(value_parser = ["serve", "connect", "list-tools", "call"])]
304 pub action: String,
305
306 #[arg(short, long)]
308 pub command: Option<String>,
309
310 #[arg(long)]
312 pub server_name: Option<String>,
313
314 #[arg(long)]
316 pub tool: Option<String>,
317
318 #[arg(long)]
320 pub arguments: Option<String>,
321
322 #[arg(long)]
324 pub json: bool,
325}
326
327#[derive(Parser, Debug)]
328pub struct StatsArgs {
329 #[arg(short, long)]
331 pub tools: bool,
332
333 #[arg(short, long)]
335 pub files: bool,
336
337 #[arg(long)]
339 pub tokens: bool,
340
341 #[arg(long)]
343 pub tool: Option<String>,
344
345 #[arg(long)]
347 pub file: Option<String>,
348
349 #[arg(short, long, default_value = "20")]
351 pub limit: usize,
352
353 #[arg(long)]
355 pub json: bool,
356
357 #[arg(long)]
359 pub all: bool,
360}
361
362#[derive(Parser, Debug)]
363pub struct CleanupArgs {
364 #[arg(short, long)]
366 pub dry_run: bool,
367
368 #[arg(long)]
370 pub worktrees_only: bool,
371
372 #[arg(long)]
374 pub json: bool,
375}
376
377#[derive(Parser, Debug)]
378pub struct ModelsArgs {
379 #[arg(short, long)]
381 pub provider: Option<String>,
382
383 #[arg(long)]
385 pub json: bool,
386}