malvin 0.2.4

Non-interactive research and coding agent
use super::Commands;

pub const fn ensure_malvin_checks_for_command(_cmd: &Commands) {}

pub fn ensure_malvin_checks_for_gates_only_route() -> Result<(), String> {
    let cwd = std::env::current_dir().map_err(|e| e.to_string())?;
    crate::repo_gates::ensure_default_malvin_config_file(&cwd)
}

pub fn ensure_malvin_checks_for_do_workflow() -> Result<(), String> {
    let cwd = std::env::current_dir().map_err(|e| e.to_string())?;
    crate::repo_gates::ensure_default_malvin_config_file(&cwd)
}

pub fn ensure_malvin_checks_for_default_route() -> Result<(), String> {
    let cwd = std::env::current_dir().map_err(|e| e.to_string())?;
    crate::repo_gates::ensure_default_malvin_config_file(&cwd)
}

#[cfg(test)]
mod tests {
    use super::{
        ensure_malvin_checks_for_command, ensure_malvin_checks_for_do_workflow,
        ensure_malvin_checks_for_gates_only_route,
    };
    use crate::cli::Commands;
    use crate::cli::args::ModelsArgs;

    #[test]
    fn ensure_malvin_checks_for_command_writes_config_not_checks() {
        crate::test_utils::with_isolated_home(|work| {
            assert!(
                std::process::Command::new("git")
                    .args(["init"])
                    .current_dir(work)
                    .status()
                    .expect("git init")
                    .success()
            );
            let cwd = std::env::current_dir().expect("cwd");
            std::env::set_current_dir(work).expect("chdir");
            let checks = crate::malvin_checks_path(work);
            let config = crate::malvin_config_path(work);
            assert!(!checks.exists());
            assert!(!config.exists());

            ensure_malvin_checks_for_gates_only_route().expect("gates-only route should materialize config only");
            assert!(!checks.is_file());
            assert!(config.is_file());
            assert!(
                std::fs::read_to_string(&config)
                    .expect("read config")
                    .contains("[agent]")
            );

            std::fs::remove_file(&config).expect("remove config");
            ensure_malvin_checks_for_do_workflow().expect("do must materialize home config");
            assert!(!checks.exists());
            assert!(config.is_file());
            assert!(
                std::fs::read_to_string(&config)
                    .expect("read config")
                    .contains("[agent]")
            );

            std::fs::remove_file(&config).expect("remove config for models test");

            ensure_malvin_checks_for_command(&Commands::Models(ModelsArgs::default()));
            assert!(!checks.exists());
            assert!(!config.exists());

            std::env::set_current_dir(cwd).expect("restore cwd");
        });
    }
}