use clap::Parser;
use double_o::{
Action, check_and_clear_learn_status, cmd_forget, cmd_help, cmd_init, cmd_learn, cmd_patterns,
cmd_recall, cmd_run, learn, parse_action,
};
#[derive(Parser)]
#[command(
name = "oo",
version,
about = "Context-efficient command runner for AI coding agents",
long_about = "oo\n\nContext-efficient command runner for AI coding agents."
)]
struct Cli {
#[arg(trailing_var_arg = true, allow_hyphen_values = true)]
args: Vec<String>,
}
fn main() {
let raw_args: Vec<String> = std::env::args().collect();
if raw_args.get(1).is_some_and(|a| a == "_learn_bg") {
if let Some(path) = raw_args.get(2) {
let _ = learn::run_background(path);
}
std::process::exit(0);
}
let cli = Cli::parse();
{
let status_path = learn::learn_status_path();
check_and_clear_learn_status(&status_path);
}
let exit_code = match parse_action(&cli.args) {
Action::Help(None) => {
println!("oo");
println!();
println!("Usage: oo <command> [args...]");
println!(" oo recall <query>");
println!(" oo forget");
println!(" oo learn <command> [args...]");
println!(" oo help <cmd>");
println!(" oo version");
0
}
Action::Help(Some(cmd)) => cmd_help(&cmd),
Action::Version => {
println!("oo {}", env!("CARGO_PKG_VERSION"));
0
}
Action::Run(args) => cmd_run(&args),
Action::Recall(query) => cmd_recall(&query),
Action::Forget => cmd_forget(),
Action::Learn(args) => cmd_learn(&args),
Action::Init(format) => cmd_init(format),
Action::Patterns => cmd_patterns(),
};
std::process::exit(exit_code);
}