Skip to main content

agentstatedeveloper_cli/commands/
test_summary.rs

1//! `asd test-summary` — read test-runner output on stdin and emit a compact,
2//! failures-only summary. Pairs with ASD's test-gap detection: run your tests,
3//! pipe the log in, and hand the agent only the failures + counts.
4//!
5//! Example: `cargo test 2>&1 | asd test-summary`
6
7use std::io::Read;
8
9use anyhow::Result;
10use clap::Args;
11use serde_json::json;
12
13use agentstatedeveloper_core::test_summary::summarize;
14
15use crate::config::Config;
16
17#[derive(Debug, Args)]
18pub struct TestSummaryArgs {
19    /// Machine-readable JSON.
20    #[arg(long)]
21    pub agent: bool,
22}
23
24pub fn run(_cfg: &Config, args: TestSummaryArgs) -> Result<()> {
25    let mut input = String::new();
26    std::io::stdin().read_to_string(&mut input)?;
27    let s = summarize(&input);
28
29    if args.agent {
30        let out = json!({
31            "runner": s.runner,
32            "passed": s.passed,
33            "failed": s.failed,
34            "failures": s.failures.iter().map(|f| json!({
35                "name": f.name,
36                "detail": f.detail,
37            })).collect::<Vec<_>>(),
38        });
39        println!("{}", serde_json::to_string_pretty(&out)?);
40        return Ok(());
41    }
42
43    if s.failed == 0 {
44        println!("✓ {} passed, 0 failed ({})", s.passed, s.runner);
45        return Ok(());
46    }
47    println!("✗ {} failed, {} passed ({})", s.failed, s.passed, s.runner);
48    for f in &s.failures {
49        println!("  {}", f.name);
50        for d in &f.detail {
51            println!("      {}", d);
52        }
53    }
54    Ok(())
55}