muthr 0.1.16

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

pub async fn rebase(yes: bool) -> Result<(), color_eyre::Report> {
    println!("[PROC] Starting Master Host Update Chain...");
    let flake_target = format!("{}/dotfiles/nix", std::env::var("HOME")?);

    if !yes {
        println!("[WARN] Previewing changes (--dry-run):");
        println!();

        let output = Command::new("sudo")
            .args([
                "darwin-rebuild",
                "switch",
                "--flake",
                &format!("{}#system", flake_target),
                "--dry-run",
            ])
            .stdin(Stdio::inherit())
            .output()
            .await?;

        if !output.status.success() {
            eprintln!("Dry run failed. Proceeding anyway...");
        }

        println!();
        let confirm = crate::ui::confirm("[WARN] Proceed with rebuild?");
        if !confirm {
            println!("[WARN] Rebuild cancelled.");
            return Ok(());
        }
    }

    Command::new("sudo")
        .args([
            "darwin-rebuild",
            "switch",
            "--flake",
            &format!("{}#system", flake_target),
        ])
        .stdin(Stdio::inherit())
        .status()
        .await?;

    println!();
    println!("[PROC] Synchronizing Editor Environment (Neovim)...");
    Command::new("nvim")
        .args(["--headless", "+Lazy! sync", "+qa"])
        .status()
        .await?;

    println!();
    println!("[PROC] Cleaning workspace metadata...");
    clean().await?;

    println!();
    println!("[ OK ] Update complete.");
    println!("   Run 'muthr services restart' to upgrade sandboxed VMs.");

    Ok(())
}

pub async fn clean() -> Result<(), color_eyre::Report> {
    let output = Command::new("which").arg("fd").output().await?;

    if !output.status.success() {
        eprintln!("[WARN] 'fd' not installed. Skipping .DS_Store cleanup.");
        return Ok(());
    }

    let home = std::env::var("HOME")?;
    let dirs = [
        format!("{}/src", home),
        format!("{}/opt", home),
        format!("{}/.config", home),
        format!("{}/dotfiles", home),
    ];

    let args = vec!["-H", "-I", "^[.]DS_Store$"];

    for dir in &dirs {
        let mut child_args = args.clone();
        child_args.push(dir);
        child_args.push("-t");
        child_args.push("f");
        child_args.push("-X");
        child_args.push("rm");
        child_args.push("-f");

        Command::new("fd").args(&child_args).status().await?;
    }

    println!("[ OK ] Cleanup complete.");
    Ok(())
}