102 lines
2.6 KiB
Rust
102 lines
2.6 KiB
Rust
use anyhow::Result;
|
|
use clap::{Parser, Subcommand};
|
|
use tracing::debug;
|
|
|
|
mod commands;
|
|
mod config;
|
|
mod generator;
|
|
mod git;
|
|
mod i18n;
|
|
mod llm;
|
|
mod utils;
|
|
|
|
use commands::{
|
|
changelog::ChangelogCommand, commit::CommitCommand, config::ConfigCommand,
|
|
init::InitCommand, profile::ProfileCommand, tag::TagCommand,
|
|
};
|
|
|
|
/// QuiCommit - AI-powered Git assistant
|
|
///
|
|
/// A powerful tool that helps you generate conventional commits, tags, and changelogs
|
|
/// using AI (LLM APIs or local Ollama models). Manage multiple Git profiles for different
|
|
/// work contexts seamlessly.
|
|
#[derive(Parser)]
|
|
#[command(name = "quicommit")]
|
|
#[command(about = "AI-powered Git assistant for conventional commits, tags, and changelogs")]
|
|
#[command(version = env!("CARGO_PKG_VERSION"))]
|
|
#[command(propagate_version = true)]
|
|
#[command(arg_required_else_help = true)]
|
|
struct Cli {
|
|
/// Enable verbose output
|
|
#[arg(short, long, global = true, action = clap::ArgAction::Count)]
|
|
verbose: u8,
|
|
|
|
/// Configuration file path
|
|
#[arg(short, long, global = true, env = "QUICOMMIT_CONFIG")]
|
|
config: Option<String>,
|
|
|
|
/// Disable colored output
|
|
#[arg(long, global = true, env = "NO_COLOR")]
|
|
no_color: bool,
|
|
|
|
#[command(subcommand)]
|
|
command: Commands,
|
|
}
|
|
|
|
#[derive(Subcommand)]
|
|
enum Commands {
|
|
/// Initialize quicommit configuration
|
|
#[command(alias = "i")]
|
|
Init(InitCommand),
|
|
|
|
/// Generate and execute conventional commits
|
|
#[command(alias = "c")]
|
|
Commit(CommitCommand),
|
|
|
|
/// Generate and create Git tags
|
|
#[command(alias = "t")]
|
|
Tag(TagCommand),
|
|
|
|
/// Generate changelog
|
|
#[command(alias = "cl")]
|
|
Changelog(ChangelogCommand),
|
|
|
|
/// Manage Git profiles (user info, SSH, GPG)
|
|
#[command(alias = "p")]
|
|
Profile(ProfileCommand),
|
|
|
|
/// Manage configuration settings
|
|
#[command(alias = "cfg")]
|
|
Config(ConfigCommand),
|
|
}
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<()> {
|
|
let cli = Cli::parse();
|
|
|
|
// Initialize logging
|
|
let log_level = match cli.verbose {
|
|
0 => "warn",
|
|
1 => "info",
|
|
2 => "debug",
|
|
_ => "trace",
|
|
};
|
|
|
|
tracing_subscriber::fmt()
|
|
.with_env_filter(log_level)
|
|
.with_target(false)
|
|
.init();
|
|
|
|
debug!("Starting quicommit v{}", env!("CARGO_PKG_VERSION"));
|
|
|
|
// Execute command
|
|
match cli.command {
|
|
Commands::Init(cmd) => cmd.execute().await,
|
|
Commands::Commit(cmd) => cmd.execute().await,
|
|
Commands::Tag(cmd) => cmd.execute().await,
|
|
Commands::Changelog(cmd) => cmd.execute().await,
|
|
Commands::Profile(cmd) => cmd.execute().await,
|
|
Commands::Config(cmd) => cmd.execute().await,
|
|
}
|
|
}
|