pub mod auth;
pub mod config;
pub mod go_ralph;
pub mod run;
use clap::{Parser, Subcommand};
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(name = "codetether")]
#[command(version, about, long_about = None)]
pub struct Cli {
#[arg(global = true)]
pub project: Option<PathBuf>,
#[arg(long, global = true)]
pub print_logs: bool,
#[arg(long, global = true, value_parser = ["DEBUG", "INFO", "WARN", "ERROR"])]
pub log_level: Option<String>,
#[arg(short, long, env = "CODETETHER_SERVER")]
pub server: Option<String>,
#[arg(short, long, env = "CODETETHER_TOKEN")]
pub token: Option<String>,
#[arg(short, long, env = "CODETETHER_WORKER_NAME")]
pub name: Option<String>,
#[command(subcommand)]
pub command: Option<Command>,
}
#[derive(Subcommand, Debug)]
pub enum Command {
Tui(TuiArgs),
Serve(ServeArgs),
Run(RunArgs),
Auth(AuthArgs),
Config(ConfigArgs),
Worker(A2aArgs),
Spawn(SpawnArgs),
Swarm(SwarmArgs),
#[command(hide = true)]
SwarmSubagent(SwarmSubagentArgs),
Rlm(RlmArgs),
Ralph(RalphArgs),
Mcp(McpArgs),
Stats(StatsArgs),
Cleanup(CleanupArgs),
Models(ModelsArgs),
Benchmark(BenchmarkArgs),
Moltbook(MoltbookArgs),
Okr(OkrArgs),
}
#[derive(Parser, Debug)]
pub struct AuthArgs {
#[command(subcommand)]
pub command: AuthCommand,
}
#[derive(Subcommand, Debug)]
pub enum AuthCommand {
Copilot(CopilotAuthArgs),
Register(RegisterAuthArgs),
Login(LoginAuthArgs),
}
#[derive(Parser, Debug)]
pub struct RegisterAuthArgs {
#[arg(short, long, env = "CODETETHER_SERVER")]
pub server: String,
#[arg(short, long)]
pub email: Option<String>,
#[arg(long)]
pub first_name: Option<String>,
#[arg(long)]
pub last_name: Option<String>,
#[arg(long)]
pub referral_source: Option<String>,
}
#[derive(Parser, Debug)]
pub struct LoginAuthArgs {
#[arg(short, long, env = "CODETETHER_SERVER")]
pub server: String,
#[arg(short, long)]
pub email: Option<String>,
}
#[derive(Parser, Debug)]
pub struct CopilotAuthArgs {
#[arg(long)]
pub enterprise_url: Option<String>,
#[arg(long, env = "CODETETHER_COPILOT_OAUTH_CLIENT_ID")]
pub client_id: Option<String>,
}
#[derive(Parser, Debug)]
pub struct TuiArgs {
pub project: Option<PathBuf>,
}
#[derive(Parser, Debug)]
pub struct ServeArgs {
#[arg(short, long, default_value = "4096")]
pub port: u16,
#[arg(long, default_value = "127.0.0.1")]
pub hostname: String,
#[arg(long)]
pub mdns: bool,
}
#[derive(Parser, Debug)]
pub struct RunArgs {
pub message: String,
#[arg(short, long)]
pub continue_session: bool,
#[arg(short, long)]
pub session: Option<String>,
#[arg(short, long)]
pub model: Option<String>,
#[arg(long)]
pub agent: Option<String>,
#[arg(long, default_value = "default", value_parser = ["default", "json"])]
pub format: String,
#[arg(short, long)]
pub file: Vec<PathBuf>,
}
#[derive(Parser, Debug, Clone)]
pub struct WorkerServerArgs {
#[arg(long, default_value = "0.0.0.0")]
pub hostname: String,
#[arg(short, long, default_value = "8080")]
pub port: u16,
}
#[derive(Parser, Debug, Clone)]
pub struct A2aArgs {
#[arg(short, long, env = "CODETETHER_SERVER", default_value = crate::a2a::worker::DEFAULT_A2A_SERVER_URL)]
pub server: String,
#[arg(short, long, env = "CODETETHER_TOKEN")]
pub token: Option<String>,
#[arg(short, long, env = "CODETETHER_WORKER_NAME")]
pub name: Option<String>,
#[arg(short, long, visible_alias = "codebases")]
pub workspaces: Option<String>,
#[arg(long, default_value = "safe", value_parser = ["all", "safe", "none"])]
pub auto_approve: String,
#[arg(short, long)]
pub email: Option<String>,
#[arg(long)]
pub push_url: Option<String>,
#[arg(long, default_value = "0.0.0.0", env = "CODETETHER_WORKER_HOST")]
pub hostname: String,
#[arg(long, default_value = "8080", env = "CODETETHER_WORKER_PORT")]
pub port: u16,
#[arg(long, env = "CODETETHER_WORKER_HTTP_DISABLED")]
pub no_http_server: bool,
}
#[derive(Parser, Debug, Clone)]
pub struct SpawnArgs {
#[arg(short, long)]
pub name: Option<String>,
#[arg(long, default_value = "127.0.0.1")]
pub hostname: String,
#[arg(short, long, default_value = "4097")]
pub port: u16,
#[arg(long)]
pub public_url: Option<String>,
#[arg(short, long)]
pub description: Option<String>,
#[arg(long, value_delimiter = ',', env = "CODETETHER_A2A_PEERS")]
pub peer: Vec<String>,
#[arg(long, default_value = "15")]
pub discovery_interval_secs: u64,
#[arg(long = "no-auto-introduce", action = clap::ArgAction::SetFalse, default_value_t = true)]
pub auto_introduce: bool,
}
#[derive(Parser, Debug)]
pub struct ConfigArgs {
#[arg(long)]
pub show: bool,
#[arg(long)]
pub init: bool,
#[arg(long)]
pub set: Option<String>,
}
#[derive(Parser, Debug)]
pub struct SwarmArgs {
pub task: String,
#[arg(short, long)]
pub model: Option<String>,
#[arg(short = 's', long, default_value = "auto")]
pub strategy: String,
#[arg(long, default_value = "100")]
pub max_subagents: usize,
#[arg(long, default_value = "100")]
pub max_steps: usize,
#[arg(long, default_value = "300")]
pub timeout: u64,
#[arg(long)]
pub json: bool,
#[arg(long, default_value = "local", value_parser = ["local", "k8s", "kubernetes", "kubernetes-pod", "pod"])]
pub execution_mode: String,
#[arg(long, default_value = "8")]
pub k8s_pod_budget: usize,
#[arg(long)]
pub k8s_image: Option<String>,
}
#[derive(Parser, Debug)]
pub struct SwarmSubagentArgs {
#[arg(long)]
pub payload_base64: Option<String>,
#[arg(long, default_value = "CODETETHER_SWARM_SUBTASK_PAYLOAD")]
pub payload_env: String,
}
#[derive(Parser, Debug)]
pub struct RlmArgs {
pub query: String,
#[arg(short, long)]
pub file: Vec<PathBuf>,
#[arg(long)]
pub content: Option<String>,
#[arg(long, default_value = "auto")]
pub content_type: String,
#[arg(long, default_value = "4000")]
pub max_tokens: usize,
#[arg(long)]
pub json: bool,
#[arg(short, long)]
pub verbose: bool,
}
#[derive(Parser, Debug)]
pub struct RalphArgs {
#[arg(value_parser = ["run", "status", "create-prd"])]
pub action: String,
#[arg(short, long, default_value = "prd.json")]
pub prd: PathBuf,
#[arg(short, long)]
pub feature: Option<String>,
#[arg(long = "project-name")]
pub project_name: Option<String>,
#[arg(long, default_value = "10")]
pub max_iterations: usize,
#[arg(short, long)]
pub model: Option<String>,
#[arg(long)]
pub json: bool,
}
#[derive(Parser, Debug)]
pub struct McpArgs {
#[arg(value_parser = ["serve", "connect", "list-tools", "call"])]
pub action: String,
#[arg(short, long)]
pub command: Option<String>,
#[arg(long)]
pub server_name: Option<String>,
#[arg(long)]
pub tool: Option<String>,
#[arg(long)]
pub arguments: Option<String>,
#[arg(long)]
pub json: bool,
#[arg(long)]
pub bus_url: Option<String>,
}
#[derive(Parser, Debug)]
pub struct StatsArgs {
#[arg(short, long)]
pub tools: bool,
#[arg(short, long)]
pub files: bool,
#[arg(long)]
pub tokens: bool,
#[arg(long)]
pub tool: Option<String>,
#[arg(long)]
pub file: Option<String>,
#[arg(short, long, default_value = "20")]
pub limit: usize,
#[arg(long)]
pub json: bool,
#[arg(long)]
pub all: bool,
}
#[derive(Parser, Debug)]
pub struct CleanupArgs {
#[arg(short, long)]
pub dry_run: bool,
#[arg(long)]
pub worktrees_only: bool,
#[arg(long)]
pub json: bool,
}
#[derive(Parser, Debug)]
pub struct ModelsArgs {
#[arg(short, long)]
pub provider: Option<String>,
#[arg(long)]
pub json: bool,
}
#[derive(Parser, Debug)]
pub struct MoltbookArgs {
#[command(subcommand)]
pub command: MoltbookCommand,
}
#[derive(Subcommand, Debug)]
pub enum MoltbookCommand {
Register(MoltbookRegisterArgs),
Status,
Profile,
UpdateProfile(MoltbookUpdateProfileArgs),
Post(MoltbookPostArgs),
Intro,
Heartbeat,
Comment(MoltbookCommentArgs),
Search(MoltbookSearchArgs),
}
#[derive(Parser, Debug)]
pub struct MoltbookRegisterArgs {
pub name: String,
#[arg(short, long)]
pub description: Option<String>,
}
#[derive(Parser, Debug)]
pub struct MoltbookUpdateProfileArgs {
#[arg(short, long)]
pub description: Option<String>,
}
#[derive(Parser, Debug)]
pub struct MoltbookPostArgs {
pub title: String,
#[arg(short, long)]
pub content: String,
#[arg(short, long, default_value = "general")]
pub submolt: String,
}
#[derive(Parser, Debug)]
pub struct MoltbookCommentArgs {
pub post_id: String,
pub content: String,
}
#[derive(Parser, Debug)]
pub struct MoltbookSearchArgs {
pub query: String,
#[arg(short, long, default_value = "10")]
pub limit: usize,
}
#[derive(Parser, Debug)]
pub struct BenchmarkArgs {
#[arg(long, default_value = "benchmarks")]
pub prd_dir: String,
#[arg(short, long, value_delimiter = ',')]
pub models: Vec<String>,
#[arg(long)]
pub tier: Option<u8>,
#[arg(long)]
pub parallel: bool,
#[arg(long, default_value = "10")]
pub max_iterations: usize,
#[arg(long, default_value = "300")]
pub story_timeout: u64,
#[arg(short, long, default_value = "benchmark_results.json")]
pub output: String,
#[arg(long, default_value = "50.0")]
pub cost_ceiling: f64,
#[arg(long)]
pub submit_url: Option<String>,
#[arg(long, env = "BENCHMARK_API_KEY")]
pub submit_key: Option<String>,
#[arg(long)]
pub json: bool,
}
#[derive(Parser, Debug)]
pub struct OkrArgs {
#[arg(value_parser = ["list", "status", "create", "runs", "export", "stats", "report"])]
pub action: String,
#[arg(short, long)]
pub id: Option<String>,
#[arg(short, long)]
pub title: Option<String>,
#[arg(short, long)]
pub description: Option<String>,
#[arg(long)]
pub target: Option<f64>,
#[arg(long, default_value = "%")]
pub unit: String,
#[arg(long)]
pub status: Option<String>,
#[arg(long)]
pub owner: Option<String>,
#[arg(long)]
pub json: bool,
#[arg(long)]
pub evidence: bool,
}