1use anyhow::Result;
4use clap::Args as ClapArgs;
5use colored::Colorize;
6
7use crate::core::{ConfigManager, Git};
8
9#[derive(ClapArgs, Debug)]
11pub struct Args {
12 #[arg(long, default_value = "adr")]
14 pub namespace: String,
15
16 #[arg(long, short, default_value = "madr")]
18 pub template: String,
19
20 #[arg(long, default_value = "ADR-")]
22 pub prefix: String,
23
24 #[arg(long, default_value = "4")]
26 pub digits: u8,
27
28 #[arg(long, short)]
30 pub force: bool,
31}
32
33pub fn run(args: Args) -> Result<()> {
39 let git = Git::new();
40
41 git.check_repository()?;
43
44 let config_manager = ConfigManager::new(git.clone());
45
46 if config_manager.is_initialized()? && !args.force {
48 eprintln!(
49 "{} git-adr is already initialized. Use --force to reinitialize.",
50 "!".yellow()
51 );
52 return Ok(());
53 }
54
55 eprintln!("{} Initializing git-adr...", "→".blue());
56
57 let config = crate::core::AdrConfig {
59 prefix: args.prefix,
60 digits: args.digits,
61 template: args.template.clone(),
62 format: args.template,
63 initialized: true,
64 };
65
66 config_manager.save(&config)?;
68
69 let _ = git.config_set("remote.origin.fetch", "+refs/notes/*:refs/notes/*");
71
72 eprintln!(" Prefix: {}", config.prefix);
73 eprintln!(" Digits: {}", config.digits);
74 eprintln!(" Template: {}", config.template);
75
76 eprintln!("{} git-adr initialized successfully!", "✓".green());
77 eprintln!();
78 eprintln!("Next steps:");
79 eprintln!(" git adr new \"Your First Decision\"");
80
81 Ok(())
82}