Skip to content

v0.9.7 - Stable Pre-Release

Pre-release
Pre-release

Choose a tag to compare

@jamesgober jamesgober released this 12 May 19:30
· 7 commits to main since this release

CLI 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 version prints 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
    so dev 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 a strip_prefix("dev-") normaliser.
    Unknown names error with unknown component: "foo". Known: report, tools, fixtures, bench, async, stress, chaos, coverage, security, deps, ci, fuzz, flaky, mutate so the user gets the valid set
    inline.
  • Per-subcommand --version overrides — each subprocess-wrapping
    command (coverage, audit, deps, fuzz, mutate, flaky, ci)
    carries a #[command(version = "...")] on its args struct so
    dev coverage --version reports dev-coverage 0.9.1, not the
    parent's dev 0.9.7. The non-wrapping commands (test, clippy,
    check, bench, report, diff, html) inherit the parent's
    version since they're features of dev-tools itself.
  • propagate_version = true at the root makes --version /
    -V available 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 SIBLINGS const-table in src/bin/dev.rs holds the (alias,
    crate-name, version) triples for every sub-crate. The table is the
    single source of truth for both dev version (full enumeration)
    and dev 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-") so coverage and dev-coverage both
    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::version calls 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. clap was already an opt-in cli-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-tools library API surface is unchanged. The cli feature
    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 resolved Cargo.lock at compile time would
    remove the drift risk entirely, but adds a build.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 the Cargo.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