git_adr/cli/
init.rs

1//! Initialize git-adr in a repository.
2
3use anyhow::Result;
4use clap::Args as ClapArgs;
5use colored::Colorize;
6
7use crate::core::{ConfigManager, Git};
8
9/// Arguments for the init command.
10#[derive(ClapArgs, Debug)]
11pub struct Args {
12    /// Notes namespace (default: adr).
13    #[arg(long, default_value = "adr")]
14    pub namespace: String,
15
16    /// Default ADR template format.
17    #[arg(long, short, default_value = "madr")]
18    pub template: String,
19
20    /// ADR ID prefix.
21    #[arg(long, default_value = "ADR-")]
22    pub prefix: String,
23
24    /// Number of digits in ADR ID.
25    #[arg(long, default_value = "4")]
26    pub digits: u8,
27
28    /// Force reinitialization.
29    #[arg(long, short)]
30    pub force: bool,
31}
32
33/// Run the init command.
34///
35/// # Errors
36///
37/// Returns an error if initialization fails.
38pub fn run(args: Args) -> Result<()> {
39    let git = Git::new();
40
41    // Verify we're in a git repository
42    git.check_repository()?;
43
44    let config_manager = ConfigManager::new(git.clone());
45
46    // Check if already initialized
47    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    // Build configuration
58    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    // Save configuration
67    config_manager.save(&config)?;
68
69    // Configure notes fetch/push refspecs for automatic sync
70    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}