opencode-ralph-loop-cli 0.1.0

Scaffolder CLI for OpenCode Ralph Loop plugin — one command setup
Documentation
use assert_cmd::Command;

fn cmd() -> Command {
    Command::cargo_bin("opencode-ralph-loop-cli").unwrap()
}

#[test]
fn scenario_10_doctor_json_output_structured() {
    let output = cmd().args(["doctor", "--output", "json"]).output().unwrap();

    let json: serde_json::Value = serde_json::from_slice(&output.stdout).unwrap();
    assert!(json["status"].is_string(), "status missing in JSON: {json}");
    assert!(
        json["dependencies"].is_array(),
        "dependencies missing: {json}"
    );

    let deps = json["dependencies"].as_array().unwrap();
    assert!(!deps.is_empty(), "dependency list is empty");
    for dep in deps {
        assert!(dep["name"].is_string());
        assert!(dep["available"].is_boolean());
    }
}

#[test]
fn scenario_10_doctor_reports_bun_and_node() {
    let output = cmd().args(["doctor", "--output", "json"]).output().unwrap();

    let json: serde_json::Value = serde_json::from_slice(&output.stdout).unwrap();
    let deps = json["dependencies"].as_array().unwrap();

    let names: Vec<&str> = deps.iter().map(|d| d["name"].as_str().unwrap()).collect();
    assert!(names.contains(&"bun"), "bun should be listed");
    assert!(names.contains(&"node"), "node should be listed");
    assert!(names.contains(&"opencode"), "opencode should be listed");
}