atman-cli 1.9.1

atman command-line interface — AI coding agent runtime with a Turing-complete .at flow DSL
use std::process::{Command, Stdio};

fn atman_bin() -> &'static str {
    env!("CARGO_BIN_EXE_atman")
}

#[test]
fn upgrade_help_documents_supported_controls() {
    let output = Command::new(atman_bin())
        .args(["upgrade", "--help"])
        .output()
        .expect("run atman upgrade --help");
    assert!(output.status.success());
    let stdout = String::from_utf8_lossy(&output.stdout);
    assert!(stdout.contains("--yes"), "stdout: {stdout}");
    assert!(stdout.contains("--verbose"), "stdout: {stdout}");
    assert!(stdout.contains("--no-modify-path"), "stdout: {stdout}");
    assert!(stdout.contains("official installer"), "stdout: {stdout}");
}

#[cfg(unix)]
#[test]
fn rejecting_source_change_exits_before_network_or_installation() {
    let home = tempfile::tempdir().unwrap();
    let legacy_config = home.path().join(".config/atman/config.toml");
    std::fs::create_dir_all(legacy_config.parent().unwrap()).unwrap();
    std::fs::write(&legacy_config, "legacy = true\n").unwrap();
    let data_dir = home.path().join("data");

    let output = Command::new(atman_bin())
        .arg("upgrade")
        .env("HOME", home.path())
        .env("ATMAN_DATA_DIR", &data_dir)
        .env_remove("CARGO_HOME")
        .stdin(Stdio::null())
        .output()
        .expect("run atman upgrade");

    assert!(!output.status.success());
    let stderr = String::from_utf8_lossy(&output.stderr);
    assert!(
        stderr.contains("Official installer target:"),
        "stderr: {stderr}"
    );
    assert!(
        stderr.contains("does not upgrade Homebrew"),
        "stderr: {stderr}"
    );
    assert!(
        stderr.contains("upgrade cancelled before download"),
        "stderr: {stderr}"
    );
    assert!(!home.path().join(".cargo/bin/atman").exists());
    assert!(
        legacy_config.exists(),
        "upgrade must not migrate user config"
    );
    assert!(
        !data_dir.join("config/config.toml").exists(),
        "upgrade must not write migrated config"
    );
}