use clap::{Parser, Subcommand};
#[derive(Parser)]
#[command(name = "cargo-kimi")]
#[command(about = "Initialize, check, and verify Rust projects with kimi-dotfiles guidelines")]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand)]
pub enum Commands {
Init {
#[arg(short, long, value_name = "NAME", default_value = "rust-only")]
template: String,
#[arg(short, long, value_name = "LEVEL", default_value = "standard")]
strictness: String,
#[arg(short, long, value_name = "PATH", default_value = "auto")]
location: String,
#[arg(short, long)]
yes: bool,
},
Check {
#[arg(short, long, value_name = "LEVEL", default_value = "standard")]
strictness: String,
#[arg(short, long, value_name = "FORMAT", default_value = "text")]
format: String,
},
Verify,
GenerateTests {
#[arg(short, long)]
output: Option<String>,
},
Upgrade,
InitSkill {
name: String,
#[arg(short, long)]
description: Option<String>,
},
Mcp,
Trend {
#[arg(short, long, default_value_t = 30)]
days: u32,
},
Fix {
#[arg(long)]
dry_run: bool,
#[arg(short, long, value_name = "LEVEL", default_value = "standard")]
strictness: String,
},
}
pub fn run() -> anyhow::Result<()> {
let args = std::env::args().collect::<Vec<_>>();
let args = if args.get(1).map(|s| s.as_str()) == Some("kimi") {
let mut filtered = vec![args[0].clone()];
filtered.extend(args.into_iter().skip(2));
filtered
} else {
args
};
let cli = Cli::parse_from(args);
match cli.command {
Commands::Init {
template,
strictness,
location,
yes,
} => crate::init::cmd_init(&template, &strictness, &location, yes),
Commands::Check { strictness, format } => crate::cmd_check(&strictness, &format),
Commands::Verify => crate::cmd_verify(),
Commands::GenerateTests { output } => crate::cmd_generate_tests(output.as_deref()),
Commands::Upgrade => crate::cmd_upgrade(),
Commands::InitSkill { name, description } => {
crate::skills::cmd_skill_init(&name, description.as_deref())
}
Commands::Mcp => crate::mcp::run_server(),
Commands::Trend { days } => crate::trend::show_trend(days),
Commands::Fix { dry_run, strictness } => crate::fix::run_fix(dry_run, &strictness),
}
}