agent-coordinator-cli 0.2.0

命令 `ac`:把一个有界任务派给用户自选的 ACP harness,归一事件、守审批与预算、落审计
//! CLI 层参数透传与失败路径。
//!
//! 这里只测「不起 harness 就能判的部分」:参数表、缺参、未知参数、`--resume last` 无记录。
//! 真跑 session/load 的契约在 `ac-runtime-acp/tests/run.rs`(真进程 fake agent)。

use std::path::PathBuf;
use std::process::Command;
use std::time::{SystemTime, UNIX_EPOCH};

fn ac() -> Command {
    Command::new(env!("CARGO_BIN_EXE_ac"))
}

fn temp_ws(tag: &str) -> PathBuf {
    let stamp = SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .map(|d| d.as_nanos())
        .unwrap_or(0);
    let dir = std::env::temp_dir().join(format!("ac-cli-{tag}-{}-{stamp}", std::process::id()));
    std::fs::create_dir_all(&dir).expect("建临时工作区");
    dir
}

#[test]
fn help_lists_resume_and_last() {
    let output = ac().arg("--help").output().expect("跑 --help");
    assert!(output.status.success(), "--help 不该失败");
    let stdout = String::from_utf8_lossy(&output.stdout);
    assert!(stdout.contains("--resume"), "参数表里要有 --resume");
    assert!(stdout.contains("last"), "要说明 last 的语义");
}

#[test]
fn missing_required_flags_exit_2() {
    let output = ac().args(["run", "--task", "x"]).output().expect("跑 run");
    assert_eq!(output.status.code(), Some(2), "缺参按用法错误退出");
    let stderr = String::from_utf8_lossy(&output.stderr);
    assert!(stderr.contains("缺少必需参数"), "stderr: {stderr}");
}

#[test]
fn unknown_flag_exit_2() {
    let output = ac()
        .args(["run", "--nope"])
        .output()
        .expect("跑 run --nope");
    assert_eq!(output.status.code(), Some(2));
    let stderr = String::from_utf8_lossy(&output.stderr);
    assert!(stderr.contains("未知参数"), "stderr: {stderr}");
}

/// 没有可续记录时必须停下:退化成新开会话等于骗调用方"上下文还在"。
#[test]
fn resume_last_without_records_exits_2() {
    let workspace = temp_ws("resume-none");
    let output = ac()
        .args([
            "run",
            "--workspace",
            workspace.to_str().expect("utf8 路径"),
            "--task",
            "续上一次",
            "--harness",
            "no-such-harness",
            "--resume",
            "last",
        ])
        .output()
        .expect("跑 run --resume last");
    assert_eq!(
        output.status.code(),
        Some(2),
        "stderr: {}",
        String::from_utf8_lossy(&output.stderr)
    );
    let stderr = String::from_utf8_lossy(&output.stderr);
    assert!(stderr.contains("找不到可续的会话"), "stderr: {stderr}");
}