claudy 0.2.1

Modern multi-provider launcher for Claude CLI
use std::io;

use crate::adapters::version;
use crate::ports::ui_ports::OutputPort;
use crate::providers::index::ProviderIndex;

pub fn show_brief(w: &mut dyn OutputPort) -> io::Result<()> {
    w.write_line(&format!(
        "Claudy v{} - Multi-provider launcher for Claude CLI",
        version::VALUE
    ))?;
    w.write_line("")?;
    w.write_line("Usage: claudy [options] <command>")?;
    w.write_line("")?;
    w.write_line("Commands:")?;
    w.write_line("  config       Configure a provider")?;
    w.write_line("  list         List profiles")?;
    w.write_line("  info         Provider details")?;
    w.write_line("  test         Test providers")?;
    w.write_line("  status       Show installation state")?;
    w.write_line("  update       Update to latest version")?;
    w.write_line("  mode         Manage Claude config modes")?;
    w.write_line("  channel       Manage the remote code channel")?;
    w.write_line("  uninstall    Remove Claudy")?;
    w.write_line("")?;
    w.write_line("Tip: add --yolo to a provider command to skip permission prompts.")?;
    w.write_line("")?;
    w.write_line("Run claudy --help for full help.")?;
    Ok(())
}

pub fn show_full(w: &mut dyn OutputPort, catalog: &ProviderIndex) -> io::Result<()> {
    w.write_line(&format!("Claudy v{}", version::VALUE))?;
    w.write_line("Multi-provider launcher for Claude CLI")?;
    w.write_line("")?;
    w.write_line("Usage:")?;
    w.write_line("  claudy [options] <command> [args]")?;
    w.write_line("  claudy <provider> [args]     Launch a provider")?;
    w.write_line("  claudy <provider> <mode>     Launch with a config mode")?;
    w.write_line("")?;
    w.write_line("Commands:")?;
    w.write_line("  config [provider]")?;
    w.write_line("  list")?;
    w.write_line("  info <provider>")?;
    w.write_line("  test [provider]")?;
    w.write_line("  status")?;
    w.write_line("  install")?;
    w.write_line("  update")?;
    w.write_line("  mode create <name>          Create a config mode")?;
    w.write_line("  mode ls                     List modes")?;
    w.write_line("  mode rm <name>              Remove a mode")?;
    w.write_line("  uninstall")?;
    w.write_line("")?;
    w.write_line("Options:")?;
    w.write_line("  -h, --help")?;
    w.write_line("  -V, --version")?;
    w.write_line("")?;
    w.write_line("Examples:")?;
    w.write_line("  claudy zai                  Launch Claude with ZAI provider")?;
    w.write_line("  claudy ollama               Launch Claude with Ollama")?;
    w.write_line("  claudy zai --yolo           Skip permission prompts")?;
    w.write_line("  claudy zai work --yolo      Use 'work' mode with ZAI provider")?;
    w.write_line("  claudy or <alias>           Launch via OpenRouter alias")?;
    w.write_line("")?;
    w.write_line("Providers:")?;
    for category in catalog.categories() {
        w.write_line(&format!("  {}", category))?;
        let providers_in_category = catalog.providers_by_category(&category);
        let mut providers_in_category: Vec<_> = providers_in_category.into_iter().collect();
        providers_in_category.sort_by(|a, b| a.id.cmp(&b.id));
        for provider in providers_in_category {
            w.write_line(&format!("    {:<12} {}", provider.id, provider.description))?;
        }
    }
    w.write_line("")?;
    w.write_line("Advanced:")?;
    w.write_line("    or <alias>    OpenRouter model via native API")?;
    w.write_line("    custom-name   Anthropic-compatible endpoint")?;
    Ok(())
}