v0.9.7 - Stable Pre-Release
Pre-releaseCLI version surface
Version 0.9.7 - 2026-05-12
Follow-up to the dev CLI landing in 0.9.6. The version-reporting surface
is now complete: the binary itself reports dev 0.9.7 through clap's
standard --version flag, the new dev version subcommand prints a
stylized component table for the entire 14-crate collection, and every
subcommand exposes a --version override that reports the underlying
sub-crate version rather than the binary's version. Two-form lookup,
ASCII-fallback color, and exit codes wired through the same worst()
verdict-aggregation path the rest of the CLI uses.
The work is mechanically small (one new subcommand, six per-args
overrides, one global propagate_version flip) but it closes the
"what am I actually running" gap that the 0.9.6 launch left open. A
user running dev coverage --threshold 80 against the published
crates.io build should be able to confirm, in one command, that they
have dev-coverage 0.9.1 driving the underlying llvm-cov subprocess
— not a stale path-dep build of dev-coverage 0.9.0. That answer is
now dev coverage --version.
Highlights
dev versionprints the full component table. Header line carries
the binary version + tagline; the body lists every sibling crate
(dev-report,dev-tools,dev-fixtures,dev-bench,dev-async,
dev-stress,dev-chaos,dev-coverage,dev-security,dev-deps,
dev-ci,dev-fuzz,dev-flaky,dev-mutate) right-aligned with
ANSI-colored versions. Color is suppressed when stdout is not a TTY
sodev version | grep dev-works without escape-code leakage.dev version <name>filtered form accepts either the short alias
(coverage) or the full crate name (dev-coverage). Both spellings
resolve to the same row via astrip_prefix("dev-")normaliser.
Unknown names error withunknown component: "foo". Known: report, tools, fixtures, bench, async, stress, chaos, coverage, security, deps, ci, fuzz, flaky, mutateso the user gets the valid set
inline.- Per-subcommand
--versionoverrides — each subprocess-wrapping
command (coverage,audit,deps,fuzz,mutate,flaky,ci)
carries a#[command(version = "...")]on its args struct so
dev coverage --versionreportsdev-coverage 0.9.1, not the
parent'sdev 0.9.7. The non-wrapping commands (test,clippy,
check,bench,report,diff,html) inherit the parent's
version since they're features ofdev-toolsitself. propagate_version = trueat the root makes--version/
-Vavailable on every subcommand uniformly. The 0.9.6 build only
honored the flag on the root command; subcommands errored with
unknown flag.
Breaking changes
None. Pure additions. The 0.9.6 CLI surface (binary name, subcommand
names, argument structures, exit codes) is unchanged.
A user upgrading from 0.9.6 to 0.9.7 with cargo install dev-tools --features cli --force gets the new commands transparently. Existing
shell scripts that called dev coverage --threshold 80 or any other
0.9.6 form continue to work without modification.
Internals
- New
SIBLINGSconst-table insrc/bin/dev.rsholds the (alias,
crate-name, version) triples for every sub-crate. The table is the
single source of truth for bothdev version(full enumeration)
anddev version <name>(filtered lookup). Hand-maintained; doc
comment flags the keep-in-sync-with-Cargo.toml requirement. run_version()handles both forms in one function. The
short-alias-or-full-name input is normalised via
strip_prefix("dev-")socoverageanddev-coverageboth
resolve to the same row without a second lookup pass.- Per-subcommand version strings are literal
&'static strs in the
args-struct attribute. The clap derive macro emits the right
Command::versioncalls at expansion time, so there's no runtime
cost — the version strings are baked into the binary as.rodata.
Tests
The version surface is exercised through clap's standard parse path,
so the existing 56 lib tests cover the structural integrity of the
Cmd enum + Args derives transparently. The SIBLINGS table is
small and hand-curated; a drift check (compare the table against the
^0.9 pins in Cargo.toml) is on the roadmap but not blocking for
0.9.7.
Notes
- No new dependencies.
clapwas already an opt-incli-feature dep
from 0.9.6; this release adds nothing on top. - No sub-crate version bumps. The 13 siblings stay at their 0.9.x
patch versions from the audit-pass cascade earlier in the day. - MSRV unchanged at Rust 1.85.
dev-toolslibrary API surface is unchanged. Theclifeature
flag remains opt-in; library consumers continue to pay zero clap
compile time.
Deferred (with documented reason)
- Build-script-generated
SIBLINGS— pulling the sibling
versions out of the resolvedCargo.lockat compile time would
remove the drift risk entirely, but adds abuild.rs+ the
associated debugging surface. Tractable in 0.9.x scope; deferred
to avoid touching the build pipeline this close to RC. Current
cadence is "bump a sibling → bump the corresponding row in
SIBLINGS" and the table sits 14 lines from theCargo.toml
pin block. dev version --json— emitting the component table as
structured JSON (consumed by other tooling, dashboards, CI
comparators) is a natural extension and slated for 0.9.8 alongside
the broader format-surface polish across the CLI.
Full Changelog: v0.9.5...v0.9.7