muthr 0.1.18

A zero-trust orchestrator that automates secure inference and isolated execution of local AI agents.
use std::path::PathBuf;
use std::process::Command;

pub struct InitCommands {
    pub git_url: Option<String>,
    pub force: bool,
}

pub fn run(cmd: InitCommands) -> Result<(), color_eyre::Report> {
    let config_dir = get_config_dir()?;

    if cmd.force {
        println!("[INIT] Overwriting existing muthr configs...");
        if config_dir.exists() {
            remove_dir_all(&config_dir)?;
        }
    } else if config_dir.exists() {
        let entries: Vec<_> = std::fs::read_dir(&config_dir)?
            .filter_map(|e| e.ok())
            .collect();

        if !entries.is_empty() {
            println!(
                "[INIT] muthr configs already exist at {}",
                config_dir.display()
            );
            println!(
                "[INIT] Use --force to overwrite, or skip if you want to keep your customizations."
            );
            return Ok(());
        }
    }

    let repo_url = cmd
        .git_url
        .unwrap_or_else(|| "https://github.com/tappunk/muthr-configs.git".to_string());

    println!(
        "[INIT] Cloning muthr-configs into {}...",
        config_dir.display()
    );
    println!("[INIT] Source: {}", repo_url);

    let status = Command::new("git")
        .args([
            "clone",
            "--depth",
            "1",
            &repo_url,
            config_dir.to_str().unwrap(),
        ])
        .status()?;

    if !status.success() {
        eprintln!("[ERR] Failed to clone muthr-configs repository.");
        std::process::exit(1);
    }

    println!("[OK] muthr configs installed successfully.");
    println!();
    println!("Next steps:");
    println!("  muthr list  — view available preset profiles");
    println!("  muthr serve — start llama-server engine context daemon");
    println!("  muthr up    — full isolated development VM workflow container spin-up");

    Ok(())
}

fn get_config_dir() -> Result<PathBuf, color_eyre::Report> {
    let home = dirs::home_dir()
        .ok_or_else(|| color_eyre::eyre::eyre!("Could not determine home directory"))?;
    Ok(home.join(".config/muthr"))
}

fn remove_dir_all(path: &PathBuf) -> Result<(), color_eyre::Report> {
    std::fs::remove_dir_all(path)?;
    Ok(())
}