v2.78.0: production CodeClimate fix, --explain everywhere, Windows hardening
Highlights
Added
fallow flagscovers 5 more SDKs by default: PostHog, Vercel Flags, ConfigCat, Optimizely, and Eppo. No config required; user-authoredflags.sdkPatternsstill layer on top. (Closes #563)--explainnow works on every invocation shape, not just subcommand+JSON. Human output gains aDescription:line under each rule / metric. Combined-mode JSON gains a top-level_metablock aggregating the per-analysis metadata sofallow --explain --format jsonis a single-call discovery surface for rule docs. (Closes #559)- License clock-skew defense:
fallow-licensenow rejects JWTs whoseiatis more than 24h in the future (a forward-signed token, or a clock-behind-reality runner accepting a long-expired license). NewLicenseError::ClockSkewvariant, tolerance configurable viaFALLOW_LICENSE_SKEW_TOLERANCE_SECONDSenv var, default 24h matchingjsonwebtoken/pyjwt/jjwtconventions. (Closes #453)
Changed
- One persistent progress spinner instead of per-stage flicker. Before, each pipeline stage (discovery, extract, graph, analyze, dupes, health) had its own spinner; on fast machines none of them painted, so
fallowon a moderately-sized project appeared frozen between command issue and final summary. Now a single spinner spawns at the start of the run, updates the stage label in place, and respectsFALLOW_QUIET=1/--quiet/ non-TTY stderr. (Closes #560)
Fixed
fallow --scoreandfallow --trendnow actually render the health score and trend in the terminal in combined mode. Previously the values were computed and emitted to JSON / SARIF / CodeClimate but the human renderer silently skipped them. (Closes #557)fallow check --format codeclimate --productionno longer panics withinternal error: entered unreachable codewhen a--production-suppressed dep / export / member rule resolves toSeverity::Off. Generic CodeClimate helpers now map severity lazily inside the loop body instead of eagerly before iteration. (Closes #452)- Workspace-relative paths instead of bare basenames in the nudge line, refactoring-targets nudge, Angular rollup line, and CRAP-coverage
(inherited from ...)suffix. Nx / Angular / Rust monorepos with many same-named files (index.ts,mod.rs,*.component.ts,template.html) now show enough path context to identify which file fallow is pointing at. (Closes #547) - CSS Modules unused-export findings now report the real source line and column instead of
line: 1, col: 0. LSP "go to definition" jumps to the actual class declaration; SARIF regions anchor to the right line;--diff-fileline-overlap classification works correctly. (Closes #549) - CSS Modules nested cascade-layer sub-names (
@layer foo.bar { ... }) no longer report as unused exports. Thanks @BowlingX for the report. (Closes #540)
Windows CI hardening
The push-to-main Windows CI matrix (added in #447) surfaced a class of long-latent Windows-only path-shape bugs that had been invisible because PR runs were ubuntu-only:
--changed-sinceandfallow auditnow match findings on Windows instead of silently returning zero. Three sites moved fromstd::fs::canonicalize(which adds the\\?\verbatim prefix on Windows) todunce::canonicalizeso canonical paths agree withopts.rootshape. (Closes #561)fallow audit --gate new-onlyno longer reports every inherited finding as freshly introduced on Windows; BASE-vs-HEAD finding-key intersection now strips the\\?\prefix beforestrip_prefix. (Closes #561)- Diff-aware analyses (
--diff-file,--diff-stdin,--changed-since) and the--filefilter onfallow checknow classify POSIX-style absolute paths (/foo/bar) correctly on Windows. Newcrates/cli/src/path_util::is_absolute_path_any_platformrecognizes host-absolute, POSIX-root, and Windows-drive-prefix shapes regardless of host. (Closes #545) - Windows
fallowbinary now links with a 16 MiB main-thread stack (was Windows's 1 MiB default). Audit integration tests crashed withSTATUS_STACK_OVERFLOWon a recursive code path insidefallow auditthat exceeded 1 MiB but stayed under POSIX's 8 MiB default. (Closes #556) - The main Rust
Checkjob now runs on Windows in addition to Linux on every push tomain, catching this class of path-shape bug before the next release rather than at user-report time. PR runs stay ubuntu-only for fast feedback. (Closes #447)
Internal
- Narrowed an import in
crates/mcp/src/server/tests/run.rsso two Unix-only helpers are gated on#[cfg(unix)], silencing a Rust 1.95unused-importsclippy regression on thewindows-latestCI leg.
Install
npm install fallow@2.78.0
# or
cargo install fallow-cli --version 2.78.0
# or via Homebrew / direct binary downloadFull Changelog: v2.77.0...v2.78.0