use clap::{Parser, Subcommand};
use tracing_subscriber::EnvFilter;
pub mod commands;
#[derive(Parser)]
#[command(name = "git-notes", version, about, long_about = None)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand)]
pub enum Commands {
#[command(alias = "a")]
Add(commands::add::AddArgs),
#[command(alias = "r")]
Reply(commands::reply::ReplyArgs),
#[command(alias = "l", alias = "ls")]
List(commands::list::ListArgs),
#[command(alias = "s")]
Show(commands::show::ShowArgs),
#[command(alias = "push", alias = "pull", alias = "p2p")]
Sync(commands::sync::SyncArgs),
#[command(alias = "ok", alias = "close")]
Resolve(commands::resolve::ResolveArgs),
#[command(alias = "exp")]
Export(commands::export::ExportArgs),
#[command(alias = "doc")]
Doctor,
#[command(alias = "b")]
Blame(commands::blame::BlameArgs),
#[command(alias = "pr")]
ImportPr(commands::import_pr::ImportPrArgs),
#[command(alias = "imp")]
Import(commands::import::ImportArgs),
#[command(alias = "sum")]
Summarize(commands::summarize::SummarizeArgs),
#[command(alias = "i")]
Init,
Hook(commands::hook::HookArgs),
#[command(alias = "d")]
Diff(commands::diff::DiffArgs),
#[command(alias = "shortcut", alias = "keys", alias = "quickies")]
Shortcuts(commands::shortcuts::ShortcutsArgs),
Completions(commands::completions::CompletionsArgs),
#[command(alias = "heal")]
RebaseHeal(commands::rebase_heal::RebaseHealArgs),
#[command(alias = "gate")]
Check(commands::check::CheckArgs),
#[command(alias = "sig")]
Verify(commands::verify::VerifyArgs),
#[command(alias = "fsck", alias = "lint")]
Validate(commands::validate::ValidateArgs),
}
pub fn run_cli() -> anyhow::Result<()> {
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.init();
let mut profile = commands::learning::UserBehaviorProfile::load();
let cli = Cli::parse();
let result = match &cli.command {
Commands::Add(args) => {
profile.record_interaction("add", Some(&args.file), Some(&args.namespace));
commands::add::run(args)
}
Commands::Reply(args) => {
profile.record_interaction("reply", None, None);
commands::reply::run(args)
}
Commands::List(args) => {
profile.record_interaction("list", args.file.as_deref(), args.namespace.as_deref());
commands::list::run(args)
}
Commands::Show(args) => {
profile.record_interaction("show", None, None);
commands::show::run(args)
}
Commands::Sync(args) => {
profile.record_interaction("sync", None, None);
commands::sync::run(args)
}
Commands::Resolve(args) => {
profile.record_interaction("resolve", None, None);
commands::resolve::run(args)
}
Commands::Export(args) => {
profile.record_interaction("export", None, None);
commands::export::run(args)
}
Commands::Doctor => {
profile.record_interaction("doctor", None, None);
commands::doctor::run()
}
Commands::Blame(args) => {
profile.record_interaction("blame", Some(&args.file), Some(&args.namespace));
commands::blame::run(args)
}
Commands::ImportPr(args) => {
profile.record_interaction("import-pr", None, Some(&args.namespace));
commands::import_pr::run(args)
}
Commands::Import(args) => {
profile.record_interaction("import", None, None);
commands::import::run(args)
}
Commands::Summarize(args) => {
profile.record_interaction("summarize", None, Some(&args.namespace));
commands::summarize::run(args)
}
Commands::Init => {
profile.record_interaction("init", None, None);
commands::init::run()
}
Commands::Hook(args) => {
profile.record_interaction("hook", None, None);
commands::hook::run(args)
}
Commands::Diff(args) => {
profile.record_interaction("diff", None, Some(&args.namespace));
commands::diff::run(args)
}
Commands::Shortcuts(args) => {
profile.record_interaction("shortcuts", None, None);
commands::shortcuts::run(args)
}
Commands::RebaseHeal(args) => {
profile.record_interaction("rebase-heal", None, args.namespace.as_deref());
commands::rebase_heal::run(args)
}
Commands::Check(args) => {
profile.record_interaction("check", None, args.namespace.as_deref());
commands::check::run(args)
}
Commands::Verify(args) => {
profile.record_interaction("verify", None, args.namespace.as_deref());
commands::verify::run(args)
}
Commands::Validate(args) => {
profile.record_interaction("validate", None, args.namespace.as_deref());
commands::validate::run(args)
}
Commands::Completions(args) => commands::completions::run(args),
};
let is_json = match &cli.command {
Commands::List(a) => a.json,
Commands::Check(a) => a.json,
Commands::Show(a) => a.json,
Commands::Validate(a) => a.json,
_ => false,
};
if !is_json {
if let Some(tip) = profile.suggest_next_action(None) {
println!("{}", tip);
}
}
result
}