dbmd-cli 0.3.6

The `dbmd` command-line tool for db.md, the open standard for databases in plain files. A thin wrapper over dbmd-core: validate, search, query, graph, write, index, and log over a db.md store. Zero AI dependencies.
//! Regression: a reader that closes `dbmd`'s stdout early (`dbmd spec | head`)
//! must exit cleanly, never with the broken-pipe panic (exit 101) that the
//! v0.3.3 release smoke test caught.

use std::io::Read;
use std::process::{Command, Stdio};

/// `dbmd spec` writes more than a pipe buffer's worth (the bundled SPEC is tens
/// of KB), so a reader that takes one sip and leaves forces a write to a closed
/// pipe. That must end in a clean exit, not a panic.
#[test]
fn spec_into_a_closed_pipe_exits_clean() {
    let mut child = Command::new(env!("CARGO_BIN_EXE_dbmd"))
        .arg("spec")
        .stdout(Stdio::piped())
        .stderr(Stdio::null())
        .spawn()
        .expect("spawn `dbmd spec`");

    // Read a little, then drop the read end: the consumer has "left", the way
    // `head` exits after its first lines.
    {
        let mut out = child.stdout.take().expect("child stdout");
        let mut buf = [0u8; 64];
        let _ = out.read(&mut buf);
    }

    let status = child.wait().expect("wait on `dbmd spec`");
    assert!(
        status.success(),
        "`dbmd spec` into a closed pipe must exit 0; got {status:?}"
    );
}