1pub mod auth;
4pub mod config;
5pub mod go_ralph;
6pub mod run;
7
8use clap::{Parser, Subcommand};
9use std::path::PathBuf;
10
11#[derive(Parser, Debug)]
16#[command(name = "codetether")]
17#[command(version, about, long_about = None)]
18pub struct Cli {
19 #[arg(global = true)]
21 pub project: Option<PathBuf>,
22
23 #[arg(long, global = true)]
25 pub print_logs: bool,
26
27 #[arg(long, global = true, value_parser = ["DEBUG", "INFO", "WARN", "ERROR"])]
29 pub log_level: Option<String>,
30
31 #[arg(short, long, env = "CODETETHER_SERVER")]
34 pub server: Option<String>,
35
36 #[arg(short, long, env = "CODETETHER_TOKEN")]
38 pub token: Option<String>,
39
40 #[arg(short, long, env = "CODETETHER_WORKER_NAME")]
42 pub name: Option<String>,
43
44 #[command(subcommand)]
45 pub command: Option<Command>,
46}
47
48#[derive(Subcommand, Debug)]
49pub enum Command {
50 Tui(TuiArgs),
52
53 Serve(ServeArgs),
55
56 Run(RunArgs),
58
59 Auth(AuthArgs),
61
62 Config(ConfigArgs),
64
65 Worker(A2aArgs),
67
68 Spawn(SpawnArgs),
70
71 Swarm(SwarmArgs),
73
74 #[command(hide = true)]
76 SwarmSubagent(SwarmSubagentArgs),
77
78 Rlm(RlmArgs),
80
81 Ralph(RalphArgs),
83
84 Mcp(McpArgs),
86
87 Stats(StatsArgs),
89
90 Cleanup(CleanupArgs),
92
93 Models(ModelsArgs),
95
96 Benchmark(BenchmarkArgs),
98
99 Moltbook(MoltbookArgs),
101
102 Okr(OkrArgs),
104}
105
106#[derive(Parser, Debug)]
107pub struct AuthArgs {
108 #[command(subcommand)]
109 pub command: AuthCommand,
110}
111
112#[derive(Subcommand, Debug)]
113pub enum AuthCommand {
114 Copilot(CopilotAuthArgs),
116
117 Register(RegisterAuthArgs),
119
120 Login(LoginAuthArgs),
122}
123
124#[derive(Parser, Debug)]
125pub struct RegisterAuthArgs {
126 #[arg(short, long, env = "CODETETHER_SERVER")]
128 pub server: String,
129
130 #[arg(short, long)]
132 pub email: Option<String>,
133
134 #[arg(long)]
136 pub first_name: Option<String>,
137
138 #[arg(long)]
140 pub last_name: Option<String>,
141
142 #[arg(long)]
144 pub referral_source: Option<String>,
145}
146
147#[derive(Parser, Debug)]
148pub struct LoginAuthArgs {
149 #[arg(short, long, env = "CODETETHER_SERVER")]
151 pub server: String,
152
153 #[arg(short, long)]
155 pub email: Option<String>,
156}
157
158#[derive(Parser, Debug)]
159pub struct CopilotAuthArgs {
160 #[arg(long)]
162 pub enterprise_url: Option<String>,
163
164 #[arg(long, env = "CODETETHER_COPILOT_OAUTH_CLIENT_ID")]
166 pub client_id: Option<String>,
167}
168
169#[derive(Parser, Debug)]
170pub struct TuiArgs {
171 pub project: Option<PathBuf>,
173}
174
175#[derive(Parser, Debug)]
176pub struct ServeArgs {
177 #[arg(short, long, default_value = "4096")]
179 pub port: u16,
180
181 #[arg(long, default_value = "127.0.0.1")]
183 pub hostname: String,
184
185 #[arg(long)]
187 pub mdns: bool,
188}
189
190#[derive(Parser, Debug)]
191pub struct RunArgs {
192 pub message: String,
194
195 #[arg(short, long)]
197 pub continue_session: bool,
198
199 #[arg(short, long)]
201 pub session: Option<String>,
202
203 #[arg(short, long)]
205 pub model: Option<String>,
206
207 #[arg(long)]
209 pub agent: Option<String>,
210
211 #[arg(long, default_value = "default", value_parser = ["default", "json"])]
213 pub format: String,
214
215 #[arg(short, long)]
217 pub file: Vec<PathBuf>,
218}
219
220#[derive(Parser, Debug, Clone)]
222pub struct WorkerServerArgs {
223 #[arg(long, default_value = "0.0.0.0")]
225 pub hostname: String,
226
227 #[arg(short, long, default_value = "8080")]
229 pub port: u16,
230}
231
232#[derive(Parser, Debug, Clone)]
233pub struct A2aArgs {
234 #[arg(short, long, env = "CODETETHER_SERVER", default_value = crate::a2a::worker::DEFAULT_A2A_SERVER_URL)]
236 pub server: String,
237
238 #[arg(short, long, env = "CODETETHER_TOKEN")]
240 pub token: Option<String>,
241
242 #[arg(short, long, env = "CODETETHER_WORKER_NAME")]
244 pub name: Option<String>,
245
246 #[arg(short, long, visible_alias = "codebases")]
248 pub workspaces: Option<String>,
249
250 #[arg(long, default_value = "safe", value_parser = ["all", "safe", "none"])]
252 pub auto_approve: String,
253
254 #[arg(short, long)]
256 pub email: Option<String>,
257
258 #[arg(long)]
260 pub push_url: Option<String>,
261
262 #[arg(long, default_value = "0.0.0.0", env = "CODETETHER_WORKER_HOST")]
264 pub hostname: String,
265
266 #[arg(long, default_value = "8080", env = "CODETETHER_WORKER_PORT")]
268 pub port: u16,
269
270 #[arg(long, env = "CODETETHER_WORKER_HTTP_DISABLED")]
272 pub no_http_server: bool,
273}
274
275#[derive(Parser, Debug, Clone)]
276pub struct SpawnArgs {
277 #[arg(short, long)]
279 pub name: Option<String>,
280
281 #[arg(long, default_value = "127.0.0.1")]
283 pub hostname: String,
284
285 #[arg(short, long, default_value = "4097")]
287 pub port: u16,
288
289 #[arg(long)]
291 pub public_url: Option<String>,
292
293 #[arg(short, long)]
295 pub description: Option<String>,
296
297 #[arg(long, value_delimiter = ',', env = "CODETETHER_A2A_PEERS")]
299 pub peer: Vec<String>,
300
301 #[arg(long, default_value = "15")]
303 pub discovery_interval_secs: u64,
304
305 #[arg(long = "no-auto-introduce", action = clap::ArgAction::SetFalse, default_value_t = true)]
307 pub auto_introduce: bool,
308}
309
310#[derive(Parser, Debug)]
311pub struct ConfigArgs {
312 #[arg(long)]
314 pub show: bool,
315
316 #[arg(long)]
318 pub init: bool,
319
320 #[arg(long)]
322 pub set: Option<String>,
323}
324
325#[derive(Parser, Debug)]
326pub struct SwarmArgs {
327 pub task: String,
329
330 #[arg(short, long)]
332 pub model: Option<String>,
333
334 #[arg(short = 's', long, default_value = "auto")]
336 pub strategy: String,
337
338 #[arg(long, default_value = "100")]
340 pub max_subagents: usize,
341
342 #[arg(long, default_value = "100")]
344 pub max_steps: usize,
345
346 #[arg(long, default_value = "300")]
348 pub timeout: u64,
349
350 #[arg(long)]
352 pub json: bool,
353
354 #[arg(long, default_value = "local", value_parser = ["local", "k8s", "kubernetes", "kubernetes-pod", "pod"])]
356 pub execution_mode: String,
357
358 #[arg(long, default_value = "8")]
360 pub k8s_pod_budget: usize,
361
362 #[arg(long)]
364 pub k8s_image: Option<String>,
365}
366
367#[derive(Parser, Debug)]
368pub struct SwarmSubagentArgs {
369 #[arg(long)]
371 pub payload_base64: Option<String>,
372
373 #[arg(long, default_value = "CODETETHER_SWARM_SUBTASK_PAYLOAD")]
375 pub payload_env: String,
376}
377
378#[derive(Parser, Debug)]
379pub struct RlmArgs {
380 pub query: String,
382
383 #[arg(short, long)]
385 pub file: Vec<PathBuf>,
386
387 #[arg(long)]
389 pub content: Option<String>,
390
391 #[arg(long, default_value = "auto")]
393 pub content_type: String,
394
395 #[arg(long, default_value = "4000")]
397 pub max_tokens: usize,
398
399 #[arg(long)]
401 pub json: bool,
402
403 #[arg(short, long)]
405 pub verbose: bool,
406}
407
408#[derive(Parser, Debug)]
409pub struct RalphArgs {
410 #[arg(value_parser = ["run", "status", "create-prd"])]
412 pub action: String,
413
414 #[arg(short, long, default_value = "prd.json")]
416 pub prd: PathBuf,
417
418 #[arg(short, long)]
420 pub feature: Option<String>,
421
422 #[arg(long = "project-name")]
424 pub project_name: Option<String>,
425
426 #[arg(long, default_value = "10")]
428 pub max_iterations: usize,
429
430 #[arg(short, long)]
432 pub model: Option<String>,
433
434 #[arg(long)]
436 pub json: bool,
437}
438
439#[derive(Parser, Debug)]
440pub struct McpArgs {
441 #[arg(value_parser = ["serve", "connect", "list-tools", "call"])]
443 pub action: String,
444
445 #[arg(short, long)]
447 pub command: Option<String>,
448
449 #[arg(long)]
451 pub server_name: Option<String>,
452
453 #[arg(long)]
455 pub tool: Option<String>,
456
457 #[arg(long)]
459 pub arguments: Option<String>,
460
461 #[arg(long)]
463 pub json: bool,
464
465 #[arg(long)]
470 pub bus_url: Option<String>,
471}
472
473#[derive(Parser, Debug)]
474pub struct StatsArgs {
475 #[arg(short, long)]
477 pub tools: bool,
478
479 #[arg(short, long)]
481 pub files: bool,
482
483 #[arg(long)]
485 pub tokens: bool,
486
487 #[arg(long)]
489 pub tool: Option<String>,
490
491 #[arg(long)]
493 pub file: Option<String>,
494
495 #[arg(short, long, default_value = "20")]
497 pub limit: usize,
498
499 #[arg(long)]
501 pub json: bool,
502
503 #[arg(long)]
505 pub all: bool,
506}
507
508#[derive(Parser, Debug)]
509pub struct CleanupArgs {
510 #[arg(short, long)]
512 pub dry_run: bool,
513
514 #[arg(long)]
516 pub worktrees_only: bool,
517
518 #[arg(long)]
520 pub json: bool,
521}
522
523#[derive(Parser, Debug)]
524pub struct ModelsArgs {
525 #[arg(short, long)]
527 pub provider: Option<String>,
528
529 #[arg(long)]
531 pub json: bool,
532}
533
534#[derive(Parser, Debug)]
535pub struct MoltbookArgs {
536 #[command(subcommand)]
537 pub command: MoltbookCommand,
538}
539
540#[derive(Subcommand, Debug)]
541pub enum MoltbookCommand {
542 Register(MoltbookRegisterArgs),
544
545 Status,
547
548 Profile,
550
551 UpdateProfile(MoltbookUpdateProfileArgs),
553
554 Post(MoltbookPostArgs),
556
557 Intro,
559
560 Heartbeat,
562
563 Comment(MoltbookCommentArgs),
565
566 Search(MoltbookSearchArgs),
568}
569
570#[derive(Parser, Debug)]
571pub struct MoltbookRegisterArgs {
572 pub name: String,
574
575 #[arg(short, long)]
577 pub description: Option<String>,
578}
579
580#[derive(Parser, Debug)]
581pub struct MoltbookUpdateProfileArgs {
582 #[arg(short, long)]
584 pub description: Option<String>,
585}
586
587#[derive(Parser, Debug)]
588pub struct MoltbookPostArgs {
589 pub title: String,
591
592 #[arg(short, long)]
594 pub content: String,
595
596 #[arg(short, long, default_value = "general")]
598 pub submolt: String,
599}
600
601#[derive(Parser, Debug)]
602pub struct MoltbookCommentArgs {
603 pub post_id: String,
605
606 pub content: String,
608}
609
610#[derive(Parser, Debug)]
611pub struct MoltbookSearchArgs {
612 pub query: String,
614
615 #[arg(short, long, default_value = "10")]
617 pub limit: usize,
618}
619
620#[derive(Parser, Debug)]
621pub struct BenchmarkArgs {
622 #[arg(long, default_value = "benchmarks")]
624 pub prd_dir: String,
625
626 #[arg(short, long, value_delimiter = ',')]
628 pub models: Vec<String>,
629
630 #[arg(long)]
632 pub tier: Option<u8>,
633
634 #[arg(long)]
636 pub parallel: bool,
637
638 #[arg(long, default_value = "10")]
640 pub max_iterations: usize,
641
642 #[arg(long, default_value = "300")]
644 pub story_timeout: u64,
645
646 #[arg(short, long, default_value = "benchmark_results.json")]
648 pub output: String,
649
650 #[arg(long, default_value = "50.0")]
652 pub cost_ceiling: f64,
653
654 #[arg(long)]
656 pub submit_url: Option<String>,
657
658 #[arg(long, env = "BENCHMARK_API_KEY")]
660 pub submit_key: Option<String>,
661
662 #[arg(long)]
664 pub json: bool,
665}
666
667#[derive(Parser, Debug)]
668pub struct OkrArgs {
669 #[arg(value_parser = ["list", "status", "create", "runs", "export", "stats", "report"])]
671 pub action: String,
672
673 #[arg(short, long)]
675 pub id: Option<String>,
676
677 #[arg(short, long)]
679 pub title: Option<String>,
680
681 #[arg(short, long)]
683 pub description: Option<String>,
684
685 #[arg(long)]
687 pub target: Option<f64>,
688
689 #[arg(long, default_value = "%")]
691 pub unit: String,
692
693 #[arg(long)]
695 pub status: Option<String>,
696
697 #[arg(long)]
699 pub owner: Option<String>,
700
701 #[arg(long)]
703 pub json: bool,
704
705 #[arg(long)]
707 pub evidence: bool,
708}