skillhub 0.2.0

CLI for SkillHub - AI Agent Skill Registry
use crate::client::ApiClient;
use crate::config::load;
use crate::error::Result;
use clap::Parser;
use colored::Colorize;

#[derive(Parser, Debug)]
pub struct SearchArgs {
    pub query: String,

    #[arg(short, long, default_value_t = 20)]
    pub limit: i32,

    #[arg(long)]
    pub sort: Option<String>,
}

pub async fn run(args: SearchArgs) -> Result<()> {
    let config = load()?;
    let token = config.auth.token.ok_or(crate::error::CliError::NotAuthenticated)?;

    let client = ApiClient::new(config.registry.url, Some(token));
    let resp = client.search(&args.query, 1, args.limit, args.sort.as_deref()).await?;

    println!(
        "{}\n",
        format!("Found {} skills for \"{}\"", resp.total, args.query.bright_white())
            .bright_cyan()
            .bold()
    );

    for skill in resp.items {
        println!("{} / {}", skill.namespace.cyan(), skill.name.bright_white().bold());
        println!(
            "  {} {}",
            "v:".dimmed(),
            format!(
                "{} | {} | {}",
                skill.version,
                format!("{:.1}", skill.avg_rating).yellow(),
                format!("{} downloads", skill.downloads).dimmed()
            )
        );
        println!("  {}", skill.description.dimmed());
        println!();
    }

    Ok(())
}