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 Spawn(SpawnArgs),
69
70 Swarm(SwarmArgs),
72
73 Rlm(RlmArgs),
75
76 Ralph(RalphArgs),
78
79 Mcp(McpArgs),
81
82 Stats(StatsArgs),
84
85 Cleanup(CleanupArgs),
87
88 Models(ModelsArgs),
90
91 Benchmark(BenchmarkArgs),
93
94 Moltbook(MoltbookArgs),
96}
97
98#[derive(Parser, Debug)]
99pub struct AuthArgs {
100 #[command(subcommand)]
101 pub command: AuthCommand,
102}
103
104#[derive(Subcommand, Debug)]
105pub enum AuthCommand {
106 Copilot(CopilotAuthArgs),
108
109 Login(LoginAuthArgs),
111}
112
113#[derive(Parser, Debug)]
114pub struct LoginAuthArgs {
115 #[arg(short, long, env = "CODETETHER_SERVER")]
117 pub server: String,
118
119 #[arg(short, long)]
121 pub email: Option<String>,
122}
123
124#[derive(Parser, Debug)]
125pub struct CopilotAuthArgs {
126 #[arg(long)]
128 pub enterprise_url: Option<String>,
129
130 #[arg(long, env = "CODETETHER_COPILOT_OAUTH_CLIENT_ID")]
132 pub client_id: Option<String>,
133}
134
135#[derive(Parser, Debug)]
136pub struct TuiArgs {
137 pub project: Option<PathBuf>,
139}
140
141#[derive(Parser, Debug)]
142pub struct ServeArgs {
143 #[arg(short, long, default_value = "4096")]
145 pub port: u16,
146
147 #[arg(long, default_value = "127.0.0.1")]
149 pub hostname: String,
150
151 #[arg(long)]
153 pub mdns: bool,
154}
155
156#[derive(Parser, Debug)]
157pub struct RunArgs {
158 pub message: String,
160
161 #[arg(short, long)]
163 pub continue_session: bool,
164
165 #[arg(short, long)]
167 pub session: Option<String>,
168
169 #[arg(short, long)]
171 pub model: Option<String>,
172
173 #[arg(long)]
175 pub agent: Option<String>,
176
177 #[arg(long, default_value = "default", value_parser = ["default", "json"])]
179 pub format: String,
180
181 #[arg(short, long)]
183 pub file: Vec<PathBuf>,
184}
185
186#[derive(Parser, Debug, Clone)]
187pub struct A2aArgs {
188 #[arg(short, long, env = "CODETETHER_SERVER", default_value = crate::a2a::worker::DEFAULT_A2A_SERVER_URL)]
190 pub server: String,
191
192 #[arg(short, long, env = "CODETETHER_TOKEN")]
194 pub token: Option<String>,
195
196 #[arg(short, long, env = "CODETETHER_WORKER_NAME")]
198 pub name: Option<String>,
199
200 #[arg(short, long)]
202 pub codebases: Option<String>,
203
204 #[arg(long, default_value = "safe", value_parser = ["all", "safe", "none"])]
206 pub auto_approve: String,
207
208 #[arg(short, long)]
210 pub email: Option<String>,
211
212 #[arg(long)]
214 pub push_url: Option<String>,
215}
216
217#[derive(Parser, Debug, Clone)]
218pub struct SpawnArgs {
219 #[arg(short, long)]
221 pub name: Option<String>,
222
223 #[arg(long, default_value = "127.0.0.1")]
225 pub hostname: String,
226
227 #[arg(short, long, default_value = "4097")]
229 pub port: u16,
230
231 #[arg(long)]
233 pub public_url: Option<String>,
234
235 #[arg(short, long)]
237 pub description: Option<String>,
238
239 #[arg(long, value_delimiter = ',', env = "CODETETHER_A2A_PEERS")]
241 pub peer: Vec<String>,
242
243 #[arg(long, default_value = "15")]
245 pub discovery_interval_secs: u64,
246
247 #[arg(long = "no-auto-introduce", action = clap::ArgAction::SetFalse, default_value_t = true)]
249 pub auto_introduce: bool,
250}
251
252#[derive(Parser, Debug)]
253pub struct ConfigArgs {
254 #[arg(long)]
256 pub show: bool,
257
258 #[arg(long)]
260 pub init: bool,
261
262 #[arg(long)]
264 pub set: Option<String>,
265}
266
267#[derive(Parser, Debug)]
268pub struct SwarmArgs {
269 pub task: String,
271
272 #[arg(short, long)]
274 pub model: Option<String>,
275
276 #[arg(short = 's', long, default_value = "auto")]
278 pub strategy: String,
279
280 #[arg(long, default_value = "100")]
282 pub max_subagents: usize,
283
284 #[arg(long, default_value = "100")]
286 pub max_steps: usize,
287
288 #[arg(long, default_value = "300")]
290 pub timeout: u64,
291
292 #[arg(long)]
294 pub json: bool,
295}
296
297#[derive(Parser, Debug)]
298pub struct RlmArgs {
299 pub query: String,
301
302 #[arg(short, long)]
304 pub file: Vec<PathBuf>,
305
306 #[arg(long)]
308 pub content: Option<String>,
309
310 #[arg(long, default_value = "auto")]
312 pub content_type: String,
313
314 #[arg(long, default_value = "4000")]
316 pub max_tokens: usize,
317
318 #[arg(long)]
320 pub json: bool,
321
322 #[arg(short, long)]
324 pub verbose: bool,
325}
326
327#[derive(Parser, Debug)]
328pub struct RalphArgs {
329 #[arg(value_parser = ["run", "status", "create-prd"])]
331 pub action: String,
332
333 #[arg(short, long, default_value = "prd.json")]
335 pub prd: PathBuf,
336
337 #[arg(short, long)]
339 pub feature: Option<String>,
340
341 #[arg(long = "project-name")]
343 pub project_name: Option<String>,
344
345 #[arg(long, default_value = "10")]
347 pub max_iterations: usize,
348
349 #[arg(short, long)]
351 pub model: Option<String>,
352
353 #[arg(long)]
355 pub json: bool,
356}
357
358#[derive(Parser, Debug)]
359pub struct McpArgs {
360 #[arg(value_parser = ["serve", "connect", "list-tools", "call"])]
362 pub action: String,
363
364 #[arg(short, long)]
366 pub command: Option<String>,
367
368 #[arg(long)]
370 pub server_name: Option<String>,
371
372 #[arg(long)]
374 pub tool: Option<String>,
375
376 #[arg(long)]
378 pub arguments: Option<String>,
379
380 #[arg(long)]
382 pub json: bool,
383}
384
385#[derive(Parser, Debug)]
386pub struct StatsArgs {
387 #[arg(short, long)]
389 pub tools: bool,
390
391 #[arg(short, long)]
393 pub files: bool,
394
395 #[arg(long)]
397 pub tokens: bool,
398
399 #[arg(long)]
401 pub tool: Option<String>,
402
403 #[arg(long)]
405 pub file: Option<String>,
406
407 #[arg(short, long, default_value = "20")]
409 pub limit: usize,
410
411 #[arg(long)]
413 pub json: bool,
414
415 #[arg(long)]
417 pub all: bool,
418}
419
420#[derive(Parser, Debug)]
421pub struct CleanupArgs {
422 #[arg(short, long)]
424 pub dry_run: bool,
425
426 #[arg(long)]
428 pub worktrees_only: bool,
429
430 #[arg(long)]
432 pub json: bool,
433}
434
435#[derive(Parser, Debug)]
436pub struct ModelsArgs {
437 #[arg(short, long)]
439 pub provider: Option<String>,
440
441 #[arg(long)]
443 pub json: bool,
444}
445
446#[derive(Parser, Debug)]
447pub struct MoltbookArgs {
448 #[command(subcommand)]
449 pub command: MoltbookCommand,
450}
451
452#[derive(Subcommand, Debug)]
453pub enum MoltbookCommand {
454 Register(MoltbookRegisterArgs),
456
457 Status,
459
460 Profile,
462
463 UpdateProfile(MoltbookUpdateProfileArgs),
465
466 Post(MoltbookPostArgs),
468
469 Intro,
471
472 Heartbeat,
474
475 Comment(MoltbookCommentArgs),
477
478 Search(MoltbookSearchArgs),
480}
481
482#[derive(Parser, Debug)]
483pub struct MoltbookRegisterArgs {
484 pub name: String,
486
487 #[arg(short, long)]
489 pub description: Option<String>,
490}
491
492#[derive(Parser, Debug)]
493pub struct MoltbookUpdateProfileArgs {
494 #[arg(short, long)]
496 pub description: Option<String>,
497}
498
499#[derive(Parser, Debug)]
500pub struct MoltbookPostArgs {
501 pub title: String,
503
504 #[arg(short, long)]
506 pub content: String,
507
508 #[arg(short, long, default_value = "general")]
510 pub submolt: String,
511}
512
513#[derive(Parser, Debug)]
514pub struct MoltbookCommentArgs {
515 pub post_id: String,
517
518 pub content: String,
520}
521
522#[derive(Parser, Debug)]
523pub struct MoltbookSearchArgs {
524 pub query: String,
526
527 #[arg(short, long, default_value = "10")]
529 pub limit: usize,
530}
531
532#[derive(Parser, Debug)]
533pub struct BenchmarkArgs {
534 #[arg(long, default_value = "benchmarks")]
536 pub prd_dir: String,
537
538 #[arg(short, long, value_delimiter = ',')]
540 pub models: Vec<String>,
541
542 #[arg(long)]
544 pub tier: Option<u8>,
545
546 #[arg(long)]
548 pub parallel: bool,
549
550 #[arg(long, default_value = "10")]
552 pub max_iterations: usize,
553
554 #[arg(long, default_value = "300")]
556 pub story_timeout: u64,
557
558 #[arg(short, long, default_value = "benchmark_results.json")]
560 pub output: String,
561
562 #[arg(long, default_value = "50.0")]
564 pub cost_ceiling: f64,
565
566 #[arg(long)]
568 pub submit_url: Option<String>,
569
570 #[arg(long, env = "BENCHMARK_API_KEY")]
572 pub submit_key: Option<String>,
573
574 #[arg(long)]
576 pub json: bool,
577}