use clap::{Parser, Subcommand};
use tracing_subscriber::{fmt, EnvFilter};
mod commands;
#[derive(Parser)]
#[command(name = "skm")]
#[command(about = "Agent Skill Engine - Selection, enforcement, and optimization for SKILL.md")]
#[command(version)]
struct Cli {
#[command(subcommand)]
command: Commands,
#[arg(short, long, global = true)]
verbose: bool,
}
#[derive(Subcommand)]
enum Commands {
Init(commands::InitArgs),
Validate(commands::ValidateArgs),
List(commands::ListArgs),
Select(commands::SelectArgs),
Test(commands::TestArgs),
Bench(commands::BenchArgs),
Optimize(commands::OptimizeArgs),
Stats(commands::StatsArgs),
Index(commands::IndexArgs),
Export(commands::ExportArgs),
#[cfg(feature = "http-server")]
Serve(commands::ServeArgs),
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let cli = Cli::parse();
let filter = if cli.verbose {
EnvFilter::new("debug")
} else {
EnvFilter::new("info")
};
fmt().with_env_filter(filter).init();
match cli.command {
Commands::Init(args) => commands::init(args).await,
Commands::Validate(args) => commands::validate(args).await,
Commands::List(args) => commands::list(args).await,
Commands::Select(args) => commands::select(args).await,
Commands::Test(args) => commands::test(args).await,
Commands::Bench(args) => commands::bench(args).await,
Commands::Optimize(args) => commands::optimize(args).await,
Commands::Stats(args) => commands::stats(args).await,
Commands::Index(args) => commands::index(args).await,
Commands::Export(args) => commands::export(args).await,
#[cfg(feature = "http-server")]
Commands::Serve(args) => commands::serve(args).await,
}
}