supercode-cli 0.4.19

supercode — a lightweight, fully-customizable AI coding agent CLI in Rust. Any model via OpenRouter; natively continues Claude Code and Codex sessions.
//! ORCH-16: `supercode triggers list` over the committed gateway fixtures; no secret is emitted.
use std::path::PathBuf;
use std::process::Command;

fn fixtures() -> PathBuf {
    PathBuf::from(env!("CARGO_MANIFEST_DIR"))
        .join("../harness/tests/fixtures")
        .canonicalize()
        .unwrap()
}

fn command() -> Command {
    let fixtures = fixtures();
    let mut command = Command::new(env!("CARGO_BIN_EXE_supercode"));
    command
        .env("HERMES_HOME", fixtures.join("hermes_home"))
        .env("OPENCLAW_STATE_DIR", fixtures.join("openclaw_home"));
    command
}

#[test]
fn triggers_list_json_and_table_never_emit_secrets() {
    for args in [
        vec!["triggers", "list", "--json"],
        vec!["triggers", "list"],
        vec!["triggers", "list", "--harness", "openclaw"],
    ] {
        let output = command().args(&args).output().unwrap();
        assert!(
            output.status.success(),
            "{}",
            String::from_utf8_lossy(&output.stderr)
        );
        let text = String::from_utf8_lossy(&output.stdout);
        for secret in [
            "FAKE-WEBHOOK-HMAC-DO-NOT-EMIT",
            "FAKE-HOOK-TOKEN-DO-NOT-EMIT",
        ] {
            assert!(!text.contains(secret), "{text}");
        }
        if args.contains(&"--json") {
            let value: serde_json::Value = serde_json::from_str(&text).unwrap();
            assert_eq!(value["schema"], "supercode.triggers.v1");
            let rows = value["triggers"].as_array().unwrap();
            assert!(rows
                .iter()
                .any(|r| r["name"] == "deploys" && r["harness"] == "hermes"));
            assert!(rows
                .iter()
                .any(|r| r["name"] == "gmail" && r["harness"] == "openclaw"));
        } else {
            assert!(text.contains("deploys") || text.contains("gmail"), "{text}");
        }
    }
}

#[test]
fn a_core_harness_is_refused_not_emptied() {
    let output = command()
        .args(["triggers", "list", "--harness", "claude-code"])
        .output()
        .unwrap();
    assert!(!output.status.success());
    assert!(String::from_utf8_lossy(&output.stderr).contains("triggers.list"));
}