komitto 0.1.3

AI-powered Conventional Commit Message Generator for Git
Documentation
use komitto::{build_prompt, get_ai_commit_message};
use clap::Parser;
use std::process::Command;
use std::{env, time::Duration};
use indicatif::{ProgressBar, ProgressStyle};

#[derive(Parser)]
struct Cli {
    #[arg(long, default_value = "openai/gpt-4.1")]
    model: String,
    #[arg(long)]
    staged: bool,
}

fn main() {
    let args = Cli::parse();
    let (diff_args, info_msg) = if args.staged {
        (vec!["diff", "--staged"], "没有暂存的修改(未执行 git add)。")
    } else {
        (vec!["diff"], "没有工作区的修改。")
    };

    let diff = Command::new("git")
        .args(&diff_args)
        .output()
        .expect("git diff 失败");
    let diff_text = String::from_utf8_lossy(&diff.stdout);

    if diff_text.trim().is_empty() {
        eprintln!("{}", info_msg);
        return;
    }

    let prompt = build_prompt(&diff_text);

    let api_key = env::var("OPENROUTER_API_KEY")
        .expect("请在环境变量设置 OPENROUTER_API_KEY");

    let spinner = ProgressBar::new_spinner();
    spinner.set_style(ProgressStyle::default_spinner()
        .template("{spinner:.cyan} {msg}")
        .unwrap());
    spinner.set_message("Waiting for OpenRouter AI response...");
    spinner.enable_steady_tick(Duration::from_millis(120));

    match get_ai_commit_message(&api_key, &args.model, &prompt) {
        Ok(msg) => {
            spinner.finish_and_clear();
            println!("\n建议 commit message:\n{}", msg);
            println!("\n你可以使用:\n  git commit -m '{}'", msg.replace('\'', "\\'"));
        }
        Err(err) => {
            spinner.finish_and_clear();
            eprintln!("错误: {}", err);
        }
    }
}