beads_viewer_rust 0.2.1

Spec-first Rust port of beads_viewer (bv) — graph-aware triage for beads issue trackers (CLI binary: bvr)
Documentation
use std::fs;
use std::path::Path;

use assert_cmd::Command;
use predicates::prelude::*;
use serde_json::Value;

fn write_test_beads(repo_dir: &Path) {
    fs::create_dir_all(repo_dir.join(".beads")).expect("create .beads");
    fs::write(
        repo_dir.join(".beads/beads.jsonl"),
        "{\"id\":\"BD-1\",\"title\":\"Issue\",\"status\":\"open\",\"priority\":1,\"issue_type\":\"task\"}\n",
    )
    .expect("write beads file");
}

fn bvr_cmd(repo_dir: &Path) -> Command {
    let bvr_bin = std::env::var("CARGO_BIN_EXE_bvr").expect("CARGO_BIN_EXE_bvr env var");
    let mut command = Command::new(bvr_bin);
    command.current_dir(repo_dir);
    command
}

fn run_robot_triage(repo_dir: &Path, extra_args: &[&str]) -> Value {
    let mut command = bvr_cmd(repo_dir);
    command.arg("--robot-triage");
    command.args(extra_args);
    let output = command.assert().success().get_output().stdout.clone();
    serde_json::from_slice::<Value>(&output).expect("robot-triage json output")
}

#[test]
fn background_mode_flags_are_accepted_for_robot_commands() {
    let temp = tempfile::tempdir().expect("tempdir");
    let repo_dir = temp.path();
    write_test_beads(repo_dir);

    let baseline = run_robot_triage(repo_dir, &[]);
    let with_background = run_robot_triage(repo_dir, &["--background-mode"]);
    let with_no_background = run_robot_triage(repo_dir, &["--no-background-mode"]);

    assert_eq!(baseline["data_hash"], with_background["data_hash"]);
    assert_eq!(baseline["data_hash"], with_no_background["data_hash"]);
}

#[test]
fn background_mode_flags_are_mutually_exclusive() {
    let temp = tempfile::tempdir().expect("tempdir");
    let repo_dir = temp.path();
    write_test_beads(repo_dir);

    bvr_cmd(repo_dir)
        .args(["--background-mode", "--no-background-mode", "--robot-next"])
        .assert()
        .failure()
        .code(2)
        .stderr(predicate::str::contains("mutually exclusive"));
}