Vitals turns thousands of lines of build-log noise into a structured capsule stream — with a pulse that an AI, CI job, or human reads first. Stop scraping stack traces. Start reading vital signs. Maven today; Gradle and npm are on the table.
$ mvn -Dvitals.out=target/vitals/capsules.ndjson verify // one capsule per line — the Pulse is the one you read first {"kind":"StreamHeader", "schema":"vitals/v0.1", "producer":{"tool":"maven", "impl":"vitals-maven/0.1.0"}} {"kind":"TestCaseFailed", "suite":"demo.CalculatorTest", "test":"adds", "exception":{"type":"org.opentest4j.AssertionFailedError"}} {"kind":"Pulse", "outcome":"failure", "totals":{"units":1, "failed":1, "tests":{"total":1, "failed":1}}, "units":[{"unit":"demo:demo-test-failure", "failed_steps":["surefire:test@default-test"]}]}
A producer watches the build, a stream carries the facts, and any consumer — agent, CLI, CI — reads the pulse instead of the log.
vitals-maven-extension hooks Maven's EventSpy and emits NDJSON capsules — lifecycle spans, diagnostics with precise locations and stable fingerprints, test failures with exact re-run commands. Dependency-free, inert until routed with -Dvitals.out.
The stream ends with a Pulse: outcome, per-unit results, deduped counts, failed steps. Consumers derive the stream's own trustworthiness — COMPLETE, INCOMPLETE, or CORRUPT — instead of trusting a dead producer.
The Maven MCP tool runs any build and returns the pulse — no raw logs. vitals-pulse turns a stream into CI exit codes. Diagnostics arrive layered compile → test → lint, grouped by file, ready to fix in order.
A smaller payload is not the same as a cheaper answer, so the benchmark measures tokens spent to reach a correct fix decision — every figure below is conditional on the model getting the answer right.
| Approach | Accuracy | Tokens | Turns | Tool output |
|---|---|---|---|---|
| Vitals MCP read the pulse | 100% | 151,085 | 4 | 2,472 |
| Shell run & read — baseline | 100% | 188,752 | 7 | 5,434 |
| Shell told to redirect & grep | 99% | 222,379 | 7 | 5,127 |
Median across 7 scenarios × 10 trials per cell (280 graded runs, plus 4 calibration). The widest gap is the boring case: on a build where nothing is wrong, reading the pulse costs 112k tokens against 224k spent confirming it — 2.0×.
Two ways in: let your agent do everything through MCP, or wire the extension into any Maven project directly.
# installs the Maven MCP tool and a hook that # redirects raw mvn calls to the structured path /plugin marketplace add vitals-build/claude-plugin /plugin install vitals-maven@vitals-build
Then just ask: "run the build and tell me what to fix first." Needs Node ≥ 18 and Java. Details: claude-plugin.
# register once in .mvn/extensions.xml, then # route any build that should be agent-readable mvn -Dvitals.out=target/vitals/capsules.ndjson verify # or stream to stderr for piping mvn -Dvitals.out=stderr verify 2> capsules.ndjson
Zero cost when disabled — safe to leave registered permanently. Drop-in XML: vitals-java.
One spec, many producers and consumers — every repo speaks the same capsule stream.
The Java implementation of the spec — capsule records, NDJSON codec, JSON Schema, and the semantic validator — plus the reference Maven core extension (EventSpy) producer.
Runnable Maven demos for every outcome — success, compile error, test failure, PMD/Checkstyle/SpotBugs warnings — with a golden capsule corpus.
MCP server: the Maven drop-in tool, pulse/diagnostics/test-failure tools, and the vitals-pulse CLI for CI.
Claude Code marketplace — installs the MCP server and the raw-mvn-blocking hook in one command.
The npm / pnpm producer — wrapper form factor with reporter-injection and text-parsing scavenger tiers.
Tool-neutral and versioned: vitals/v0.1, revision 0.1-draft.5. Envelope, kind taxonomy, stable fingerprints, pulse semantics, and the consumer repair loop.