use clap::{Parser, Subcommand, Args};
use std::path::PathBuf;
#[derive(Parser)]
#[command(
name = "rustchain",
version = "1.0.0",
about = "🤖 Enterprise AI Agent Framework",
long_about = "RustChain is an enterprise-grade AI agent framework for autonomous mission execution.\n\nInspired by Claude Code's clean interface, RustChain provides:\n• Safe mission execution with validation\n• Enterprise audit trails and compliance\n• Multi-LLM support (OpenAI, Anthropic, Ollama)\n• Comprehensive tool ecosystem\n• Production-ready security and monitoring",
help_template = "{before-help}{name} {version}\n{about}\n\n{usage-heading} {usage}\n\n{all-args}{after-help}"
)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
#[arg(short, long, global = true)]
pub verbose: bool,
#[arg(long, global = true)]
pub no_color: bool,
#[arg(long, global = true, value_name = "DIR")]
pub config_dir: Option<PathBuf>,
}
#[derive(Subcommand)]
pub enum Commands {
#[command(alias = "r")]
Run(RunArgs),
#[command(alias = "new")]
Create(CreateArgs),
#[command(alias = "check")]
Validate(ValidateArgs),
#[command(alias = "llm")]
Llm(LlmArgs),
#[command(alias = "tool")]
Tools(ToolsArgs),
#[command(alias = "audit")]
Audit(AuditArgs),
#[command(alias = "config")]
Config(ConfigArgs),
#[command(alias = "safety")]
Safety(SafetyArgs),
#[command(alias = "init")]
Init(InitArgs),
#[command(alias = "transpile")]
#[cfg(feature = "transpiler")]
Transpile(TranspileArgs),
}
#[derive(Args)]
pub struct RunArgs {
#[arg(value_name = "MISSION")]
pub mission: String,
#[arg(short, long)]
pub dry_run: bool,
#[arg(short, long)]
pub continue_on_error: bool,
#[arg(short = 'D', long = "define", value_name = "KEY=VALUE")]
pub variables: Vec<String>,
#[arg(short = 'C', long = "directory", value_name = "DIR")]
pub directory: Option<PathBuf>,
#[arg(long)]
pub force: bool,
#[arg(short, long)]
pub watch: bool,
}
#[derive(Args)]
pub struct CreateArgs {
#[arg(value_name = "NAME")]
pub name: String,
#[arg(short, long, default_value = "basic")]
pub template: String,
#[arg(short, long, default_value = ".")]
pub output: PathBuf,
#[arg(short, long)]
pub description: Option<String>,
}
#[derive(Args)]
pub struct ValidateArgs {
#[arg(value_name = "MISSIONS")]
pub missions: Vec<String>,
#[arg(long)]
pub syntax_only: bool,
#[arg(short, long)]
pub detailed: bool,
}
#[derive(Args)]
pub struct LlmArgs {
#[command(subcommand)]
pub command: LlmCommands,
}
#[derive(Subcommand)]
pub enum LlmCommands {
#[command(alias = "ls")]
List,
Test(LlmTestArgs),
Add(LlmAddArgs),
#[command(alias = "rm")]
Remove(LlmRemoveArgs),
Default(LlmDefaultArgs),
Chat(LlmChatArgs),
}
#[derive(Args)]
pub struct LlmTestArgs {
#[arg(value_name = "PROVIDER")]
pub provider: Option<String>,
#[arg(short, long, default_value = "Hello, world!")]
pub message: String,
}
#[derive(Args)]
pub struct LlmAddArgs {
#[arg(value_name = "NAME")]
pub name: String,
#[arg(short, long)]
pub provider_type: String,
#[arg(short, long)]
pub url: Option<String>,
#[arg(short, long)]
pub api_key: Option<String>,
#[arg(short, long)]
pub model: Option<String>,
}
#[derive(Args)]
pub struct LlmRemoveArgs {
#[arg(value_name = "NAME")]
pub name: String,
}
#[derive(Args)]
pub struct LlmDefaultArgs {
#[arg(value_name = "NAME")]
pub name: String,
}
#[derive(Args)]
pub struct LlmChatArgs {
#[arg(value_name = "MESSAGE")]
pub message: Option<String>,
#[arg(short, long)]
pub provider: Option<String>,
#[arg(short, long)]
pub model: Option<String>,
#[arg(short, long)]
pub interactive: bool,
}
#[derive(Args)]
pub struct ToolsArgs {
#[command(subcommand)]
pub command: ToolCommands,
}
#[derive(Subcommand)]
pub enum ToolCommands {
#[command(alias = "ls")]
List,
Exec(ToolExecArgs),
Info(ToolInfoArgs),
Test(ToolTestArgs),
}
#[derive(Args)]
pub struct ToolExecArgs {
#[arg(value_name = "TOOL")]
pub tool: String,
#[arg(short, long)]
pub params: Option<String>,
#[arg(short = 'D', long = "define", value_name = "KEY=VALUE")]
pub define: Vec<String>,
}
#[derive(Args)]
pub struct ToolInfoArgs {
#[arg(value_name = "TOOL")]
pub tool: String,
#[arg(short, long)]
pub schema: bool,
}
#[derive(Args)]
pub struct ToolTestArgs {
#[arg(value_name = "TOOL")]
pub tool: String,
}
#[derive(Args)]
pub struct AuditArgs {
#[command(subcommand)]
pub command: AuditCommands,
}
#[derive(Subcommand)]
pub enum AuditCommands {
#[command(alias = "log")]
Show(AuditShowArgs),
Export(AuditExportArgs),
Report(AuditReportArgs),
Verify,
}
#[derive(Args)]
pub struct AuditShowArgs {
#[arg(short, long, default_value = "20")]
pub limit: usize,
#[arg(short, long)]
pub mission: Option<String>,
#[arg(short, long)]
pub event_type: Option<String>,
#[arg(long)]
pub since: Option<String>,
}
#[derive(Args)]
pub struct AuditExportArgs {
#[arg(short, long)]
pub output: PathBuf,
#[arg(short, long, default_value = "json")]
pub format: String,
#[arg(long)]
pub since: Option<String>,
#[arg(long)]
pub until: Option<String>,
}
#[derive(Args)]
pub struct AuditReportArgs {
#[arg(short, long, default_value = "compliance")]
pub report_type: String,
#[arg(short, long)]
pub output: Option<PathBuf>,
#[arg(long)]
pub since: Option<String>,
#[arg(long)]
pub until: Option<String>,
}
#[derive(Args)]
pub struct ConfigArgs {
#[command(subcommand)]
pub command: ConfigCommands,
}
#[derive(Subcommand)]
pub enum ConfigCommands {
Show,
Set(ConfigSetArgs),
Get(ConfigGetArgs),
Reset,
Edit,
}
#[derive(Args)]
pub struct ConfigSetArgs {
#[arg(value_name = "KEY")]
pub key: String,
#[arg(value_name = "VALUE")]
pub value: String,
}
#[derive(Args)]
pub struct ConfigGetArgs {
#[arg(value_name = "KEY")]
pub key: String,
}
#[derive(Args)]
pub struct SafetyArgs {
#[command(subcommand)]
pub command: SafetyCommands,
}
#[derive(Subcommand)]
pub enum SafetyCommands {
Check(SafetyCheckArgs),
#[command(alias = "ls")]
List,
Add(SafetyAddArgs),
#[command(alias = "rm")]
Remove(SafetyRemoveArgs),
Test(SafetyTestArgs),
}
#[derive(Args)]
pub struct SafetyCheckArgs {
#[arg(value_name = "MISSION")]
pub mission: String,
#[arg(short, long)]
pub detailed: bool,
}
#[derive(Args)]
pub struct SafetyAddArgs {
#[arg(value_name = "NAME")]
pub name: String,
#[arg(short, long)]
pub pattern: String,
#[arg(short, long)]
pub description: String,
#[arg(short, long, default_value = "medium")]
pub severity: String,
}
#[derive(Args)]
pub struct SafetyRemoveArgs {
#[arg(value_name = "NAME")]
pub name: String,
}
#[derive(Args)]
pub struct SafetyTestArgs {
#[arg(value_name = "INPUT")]
pub input: String,
}
#[derive(Args)]
pub struct InitArgs {
#[arg(value_name = "NAME")]
pub name: Option<String>,
#[arg(short, long)]
pub directory: Option<PathBuf>,
#[arg(long)]
pub with_examples: bool,
#[arg(long)]
pub enterprise: bool,
}
#[cfg(feature = "transpiler")]
#[derive(Args)]
pub struct TranspileArgs {
#[arg(value_name = "INPUT")]
pub input: PathBuf,
#[arg(short, long, value_name = "OUTPUT")]
pub output: Option<PathBuf>,
#[arg(short = 'f', long, default_value = "langchain")]
pub from: String,
#[arg(short = 't', long, default_value = "rustchain-yaml")]
pub to: String,
#[arg(long)]
pub validate_only: bool,
#[arg(short, long)]
pub verbose: bool,
}