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 Okr(OkrArgs),
99}
100
101#[derive(Parser, Debug)]
102pub struct AuthArgs {
103 #[command(subcommand)]
104 pub command: AuthCommand,
105}
106
107#[derive(Subcommand, Debug)]
108pub enum AuthCommand {
109 Copilot(CopilotAuthArgs),
111
112 Register(RegisterAuthArgs),
114
115 Login(LoginAuthArgs),
117}
118
119#[derive(Parser, Debug)]
120pub struct RegisterAuthArgs {
121 #[arg(short, long, env = "CODETETHER_SERVER")]
123 pub server: String,
124
125 #[arg(short, long)]
127 pub email: Option<String>,
128
129 #[arg(long)]
131 pub first_name: Option<String>,
132
133 #[arg(long)]
135 pub last_name: Option<String>,
136
137 #[arg(long)]
139 pub referral_source: Option<String>,
140}
141
142#[derive(Parser, Debug)]
143pub struct LoginAuthArgs {
144 #[arg(short, long, env = "CODETETHER_SERVER")]
146 pub server: String,
147
148 #[arg(short, long)]
150 pub email: Option<String>,
151}
152
153#[derive(Parser, Debug)]
154pub struct CopilotAuthArgs {
155 #[arg(long)]
157 pub enterprise_url: Option<String>,
158
159 #[arg(long, env = "CODETETHER_COPILOT_OAUTH_CLIENT_ID")]
161 pub client_id: Option<String>,
162}
163
164#[derive(Parser, Debug)]
165pub struct TuiArgs {
166 pub project: Option<PathBuf>,
168}
169
170#[derive(Parser, Debug)]
171pub struct ServeArgs {
172 #[arg(short, long, default_value = "4096")]
174 pub port: u16,
175
176 #[arg(long, default_value = "127.0.0.1")]
178 pub hostname: String,
179
180 #[arg(long)]
182 pub mdns: bool,
183}
184
185#[derive(Parser, Debug)]
186pub struct RunArgs {
187 pub message: String,
189
190 #[arg(short, long)]
192 pub continue_session: bool,
193
194 #[arg(short, long)]
196 pub session: Option<String>,
197
198 #[arg(short, long)]
200 pub model: Option<String>,
201
202 #[arg(long)]
204 pub agent: Option<String>,
205
206 #[arg(long, default_value = "default", value_parser = ["default", "json"])]
208 pub format: String,
209
210 #[arg(short, long)]
212 pub file: Vec<PathBuf>,
213}
214
215#[derive(Parser, Debug, Clone)]
217pub struct WorkerServerArgs {
218 #[arg(long, default_value = "0.0.0.0")]
220 pub hostname: String,
221
222 #[arg(short, long, default_value = "8080")]
224 pub port: u16,
225}
226
227#[derive(Parser, Debug, Clone)]
228pub struct A2aArgs {
229 #[arg(short, long, env = "CODETETHER_SERVER", default_value = crate::a2a::worker::DEFAULT_A2A_SERVER_URL)]
231 pub server: String,
232
233 #[arg(short, long, env = "CODETETHER_TOKEN")]
235 pub token: Option<String>,
236
237 #[arg(short, long, env = "CODETETHER_WORKER_NAME")]
239 pub name: Option<String>,
240
241 #[arg(short, long)]
243 pub codebases: Option<String>,
244
245 #[arg(long, default_value = "safe", value_parser = ["all", "safe", "none"])]
247 pub auto_approve: String,
248
249 #[arg(short, long)]
251 pub email: Option<String>,
252
253 #[arg(long)]
255 pub push_url: Option<String>,
256
257 #[arg(long, default_value = "0.0.0.0", env = "CODETETHER_WORKER_HOST")]
259 pub hostname: String,
260
261 #[arg(long, default_value = "8080", env = "CODETETHER_WORKER_PORT")]
263 pub port: u16,
264
265 #[arg(long, env = "CODETETHER_WORKER_HTTP_DISABLED")]
267 pub no_http_server: bool,
268}
269
270#[derive(Parser, Debug, Clone)]
271pub struct SpawnArgs {
272 #[arg(short, long)]
274 pub name: Option<String>,
275
276 #[arg(long, default_value = "127.0.0.1")]
278 pub hostname: String,
279
280 #[arg(short, long, default_value = "4097")]
282 pub port: u16,
283
284 #[arg(long)]
286 pub public_url: Option<String>,
287
288 #[arg(short, long)]
290 pub description: Option<String>,
291
292 #[arg(long, value_delimiter = ',', env = "CODETETHER_A2A_PEERS")]
294 pub peer: Vec<String>,
295
296 #[arg(long, default_value = "15")]
298 pub discovery_interval_secs: u64,
299
300 #[arg(long = "no-auto-introduce", action = clap::ArgAction::SetFalse, default_value_t = true)]
302 pub auto_introduce: bool,
303}
304
305#[derive(Parser, Debug)]
306pub struct ConfigArgs {
307 #[arg(long)]
309 pub show: bool,
310
311 #[arg(long)]
313 pub init: bool,
314
315 #[arg(long)]
317 pub set: Option<String>,
318}
319
320#[derive(Parser, Debug)]
321pub struct SwarmArgs {
322 pub task: String,
324
325 #[arg(short, long)]
327 pub model: Option<String>,
328
329 #[arg(short = 's', long, default_value = "auto")]
331 pub strategy: String,
332
333 #[arg(long, default_value = "100")]
335 pub max_subagents: usize,
336
337 #[arg(long, default_value = "100")]
339 pub max_steps: usize,
340
341 #[arg(long, default_value = "300")]
343 pub timeout: u64,
344
345 #[arg(long)]
347 pub json: bool,
348}
349
350#[derive(Parser, Debug)]
351pub struct RlmArgs {
352 pub query: String,
354
355 #[arg(short, long)]
357 pub file: Vec<PathBuf>,
358
359 #[arg(long)]
361 pub content: Option<String>,
362
363 #[arg(long, default_value = "auto")]
365 pub content_type: String,
366
367 #[arg(long, default_value = "4000")]
369 pub max_tokens: usize,
370
371 #[arg(long)]
373 pub json: bool,
374
375 #[arg(short, long)]
377 pub verbose: bool,
378}
379
380#[derive(Parser, Debug)]
381pub struct RalphArgs {
382 #[arg(value_parser = ["run", "status", "create-prd"])]
384 pub action: String,
385
386 #[arg(short, long, default_value = "prd.json")]
388 pub prd: PathBuf,
389
390 #[arg(short, long)]
392 pub feature: Option<String>,
393
394 #[arg(long = "project-name")]
396 pub project_name: Option<String>,
397
398 #[arg(long, default_value = "10")]
400 pub max_iterations: usize,
401
402 #[arg(short, long)]
404 pub model: Option<String>,
405
406 #[arg(long)]
408 pub json: bool,
409}
410
411#[derive(Parser, Debug)]
412pub struct McpArgs {
413 #[arg(value_parser = ["serve", "connect", "list-tools", "call"])]
415 pub action: String,
416
417 #[arg(short, long)]
419 pub command: Option<String>,
420
421 #[arg(long)]
423 pub server_name: Option<String>,
424
425 #[arg(long)]
427 pub tool: Option<String>,
428
429 #[arg(long)]
431 pub arguments: Option<String>,
432
433 #[arg(long)]
435 pub json: bool,
436}
437
438#[derive(Parser, Debug)]
439pub struct StatsArgs {
440 #[arg(short, long)]
442 pub tools: bool,
443
444 #[arg(short, long)]
446 pub files: bool,
447
448 #[arg(long)]
450 pub tokens: bool,
451
452 #[arg(long)]
454 pub tool: Option<String>,
455
456 #[arg(long)]
458 pub file: Option<String>,
459
460 #[arg(short, long, default_value = "20")]
462 pub limit: usize,
463
464 #[arg(long)]
466 pub json: bool,
467
468 #[arg(long)]
470 pub all: bool,
471}
472
473#[derive(Parser, Debug)]
474pub struct CleanupArgs {
475 #[arg(short, long)]
477 pub dry_run: bool,
478
479 #[arg(long)]
481 pub worktrees_only: bool,
482
483 #[arg(long)]
485 pub json: bool,
486}
487
488#[derive(Parser, Debug)]
489pub struct ModelsArgs {
490 #[arg(short, long)]
492 pub provider: Option<String>,
493
494 #[arg(long)]
496 pub json: bool,
497}
498
499#[derive(Parser, Debug)]
500pub struct MoltbookArgs {
501 #[command(subcommand)]
502 pub command: MoltbookCommand,
503}
504
505#[derive(Subcommand, Debug)]
506pub enum MoltbookCommand {
507 Register(MoltbookRegisterArgs),
509
510 Status,
512
513 Profile,
515
516 UpdateProfile(MoltbookUpdateProfileArgs),
518
519 Post(MoltbookPostArgs),
521
522 Intro,
524
525 Heartbeat,
527
528 Comment(MoltbookCommentArgs),
530
531 Search(MoltbookSearchArgs),
533}
534
535#[derive(Parser, Debug)]
536pub struct MoltbookRegisterArgs {
537 pub name: String,
539
540 #[arg(short, long)]
542 pub description: Option<String>,
543}
544
545#[derive(Parser, Debug)]
546pub struct MoltbookUpdateProfileArgs {
547 #[arg(short, long)]
549 pub description: Option<String>,
550}
551
552#[derive(Parser, Debug)]
553pub struct MoltbookPostArgs {
554 pub title: String,
556
557 #[arg(short, long)]
559 pub content: String,
560
561 #[arg(short, long, default_value = "general")]
563 pub submolt: String,
564}
565
566#[derive(Parser, Debug)]
567pub struct MoltbookCommentArgs {
568 pub post_id: String,
570
571 pub content: String,
573}
574
575#[derive(Parser, Debug)]
576pub struct MoltbookSearchArgs {
577 pub query: String,
579
580 #[arg(short, long, default_value = "10")]
582 pub limit: usize,
583}
584
585#[derive(Parser, Debug)]
586pub struct BenchmarkArgs {
587 #[arg(long, default_value = "benchmarks")]
589 pub prd_dir: String,
590
591 #[arg(short, long, value_delimiter = ',')]
593 pub models: Vec<String>,
594
595 #[arg(long)]
597 pub tier: Option<u8>,
598
599 #[arg(long)]
601 pub parallel: bool,
602
603 #[arg(long, default_value = "10")]
605 pub max_iterations: usize,
606
607 #[arg(long, default_value = "300")]
609 pub story_timeout: u64,
610
611 #[arg(short, long, default_value = "benchmark_results.json")]
613 pub output: String,
614
615 #[arg(long, default_value = "50.0")]
617 pub cost_ceiling: f64,
618
619 #[arg(long)]
621 pub submit_url: Option<String>,
622
623 #[arg(long, env = "BENCHMARK_API_KEY")]
625 pub submit_key: Option<String>,
626
627 #[arg(long)]
629 pub json: bool,
630}
631
632#[derive(Parser, Debug)]
633pub struct OkrArgs {
634 #[arg(value_parser = ["list", "status", "create", "runs", "export", "stats", "report"])]
636 pub action: String,
637
638 #[arg(short, long)]
640 pub id: Option<String>,
641
642 #[arg(short, long)]
644 pub title: Option<String>,
645
646 #[arg(short, long)]
648 pub description: Option<String>,
649
650 #[arg(long)]
652 pub target: Option<f64>,
653
654 #[arg(long, default_value = "%")]
656 pub unit: String,
657
658 #[arg(long)]
660 pub status: Option<String>,
661
662 #[arg(long)]
664 pub owner: Option<String>,
665
666 #[arg(long)]
668 pub json: bool,
669
670 #[arg(long)]
672 pub evidence: bool,
673}