Skip to content
CukeDedup

Changelog

Release history

Every published version, newest first. Entries are served from a local fixture (src/data/releases.json) shaped after the GitHub Releases API, so the same page can later consume release data at build time.

v0.13.0

View on GitHub ↗

New --emit-fingerprints flag and faster TypeScript and Ruby extraction on large files. Findings are unchanged from v0.12.2.

Features

  • --emit-fingerprints FILE writes one JSON line per analyzed definition with the matcher and handler evidence the analyzer compared, for test tooling that must tell "no finding" apart from "nothing analyzed". Reports, stdout, stderr and exit codes are unchanged with or without it (#182).

Performance

  • TypeScript evaluates literal module constants once per file instead of once per handler; 4,000 handlers with one constant each in one file: 167 s -> 0.47 s parse (#175).
  • Ruby indexes file-level bindings once per file instead of once per block handler; 8,000 handlers in one file: 150.5 s -> 0.7 s parse (#170).

Fixes

  • Gherkin parse-error messages list the expected tokens in sorted order; the order previously varied between runs on identical input (#173).

Development

  • check:equivalence compares every report and baseline file each invocation writes or deletes, byte for byte, across the corpus, Ruby, language-parity, benchmark and tests/cli.rs suites (#174, #176-#181).
  • The recall corpus verifies declared non-findings against --emit-fingerprints records (#184).
  • The Ruby census pins Rust test names instead of file hashes (#171).

Full Changelog: https://github.com/figueiredoluiz/cuke-dedup/compare/v0.12.2...v0.13.0

v0.12.2

View on GitHub ↗

Faster analysis. Findings and reports are unchanged from v0.12.1.

Performance

  • TypeScript extraction indexes each file's top-level declarations once instead of rescanning the file per handler; extraction time now grows linearly with file size. 10,000 definitions in one file: 37.3 s -> 1.1 s (#158)
  • Matcher similarity uses bit-parallel Levenshtein and Jaro-Winkler for ASCII matchers and computes word lists once per definition; candidate-heavy analysis is about 55% faster (#164)

Documentation

  • Doc comments across the analysis core, model, source-adapter contract, command-line shell and release scripts (#159, #160, #161, #162)

Development

  • check-docstrings.mjs validates doc comments on touched functions in CI and the pre-push hook (#163)
  • benchmark:check gates superlinear growth as a ratio of parse times between two sizes of a profile (#158)

Full Changelog: https://github.com/figueiredoluiz/cuke-dedup/compare/v0.12.1...v0.12.2

v0.12.1

View on GitHub ↗

Dependency updates. Analyzer output is unchanged from v0.12.0.

Dependencies

  • tree-sitter 0.27.1, tree-sitter-language 0.1.9, serde_json 1.0.152 (#151, #152)
  • GitHub Actions: upload-artifact 7.0.2, download-artifact 8.0.2, setup-node 7.1.0, dorny/test-reporter 3.2.0, CodeQL init and analyze 4.38.3 (#150, #153–#156)

Development

  • npm run check:equivalence compares analyzer output against the latest release across the corpus, Ruby, language-parity and benchmark checkers (#149)

Full Changelog: https://github.com/figueiredoluiz/cuke-dedup/compare/v0.12.0...v0.12.1

v0.12.0

View on GitHub ↗

Ruby runs can now report findings on code that 0.11.0 marked incomplete; review exit codes under --fail-on-*.

Ruby (experimental)

  • Oversized dependency-only providers are an incomplete load instead of a run failure (#142)
  • Receiverless literal calls are parameterized in handler comparison (#143)
  • Bounded regexp resource-limit diagnostics, lexical NUL handling, named-handler capture resolution, overlap witnesses for array-form ParameterType (#146)
  • NULs in quoted Ruby symbols no longer drop later registrations (#147)

Gherkin

  • Table budget and escape diagnostics report the precise file and location (#144, #146)

Full Changelog: https://github.com/figueiredoluiz/cuke-dedup/compare/v0.11.0...v0.12.0

v0.11.0

View on GitHub ↗

Experimental Cucumber-Ruby support

CukeDedup 0.11.0 adds experimental, opt-in analysis for Cucumber-Ruby suites. Select definition and feature roots explicitly, include support files, and analyze each suite separately:

cuke-dedup path/to/project --definitions 'features/**/*.rb' --features 'features/**/*.feature'

Supported Ruby inputs include direct step registrations, static Cucumber Expressions and Ruby regexes, bounded local source dependencies, handler comparisons, matcher overlap, ambiguity and unused-definition checks. Ruby projects are parsed statically; no Ruby code is executed and no gems are installed. Default discovery remains JavaScript/TypeScript-only.

Ruby support is incomplete. Reflective rebinding and indirect DSL mutation can escape tracking, NUL-bearing sources are unsupported, array-form ParameterType regexps can miss overlaps, and some resource-limit cases have stricter exits or imprecise diagnostics. Review findings against source. Read the supported subset and trusted Ruby load-path boundary before enabling Ruby checks in CI.

Other changes

  • Improved Ruby registration provenance, syntax diagnostics, handler comparisons and bounded analysis work.
  • Improved Windows verbatim-path normalization.
  • Reused complete feature-match results to reduce repeated matching work, with deterministic performance and memory checks.
  • Added broader behavioral corpus, cross-platform and packaging validation.

Compatibility

Git-revision baselines retain findings from an incomplete historical scan and warn that missed historical findings can appear as new. A historical scan that extracts no definitions while the current scan has definitions still fails; use --fail-on-incomplete to reject any incomplete baseline. See Git revision baselines.

Native archives and npm packages cover Linux glibc/musl, macOS and Windows on x64 and ARM64. The minimum Rust version remains 1.90.

v0.10.1

View on GitHub ↗

What's Changed

Full Changelog: https://github.com/figueiredoluiz/cuke-dedup/compare/v0.10.0...v0.10.1

v0.10.0

View on GitHub ↗

What's Changed

Full Changelog: https://github.com/figueiredoluiz/cuke-dedup/compare/v0.9.0...v0.10.0

v0.9.0

View on GitHub ↗

What's Changed

Full Changelog: https://github.com/figueiredoluiz/cuke-dedup/compare/v0.8.0...v0.9.0

v0.8.0

View on GitHub ↗

What's Changed

Full Changelog: https://github.com/figueiredoluiz/cuke-dedup/compare/v0.7.0...v0.8.0

v0.7.0

View on GitHub ↗

What's Changed

Full Changelog: https://github.com/figueiredoluiz/cuke-dedup/compare/v0.6.0...v0.7.0

v0.6.0

View on GitHub ↗

What's Changed

Full Changelog: https://github.com/figueiredoluiz/cuke-dedup/compare/v0.5.0...v0.6.0

v0.5.0

View on GitHub ↗

What's Changed

Full Changelog: https://github.com/figueiredoluiz/cuke-dedup/compare/v0.4.0...v0.5.0

v0.4.0

View on GitHub ↗

What's Changed

New Contributors

Full Changelog: https://github.com/figueiredoluiz/cuke-dedup/compare/v0.3.0...v0.4.0

v0.3.0

View on GitHub ↗

What's Changed

Full Changelog: https://github.com/figueiredoluiz/cuke-dedup/compare/v0.2.1...v0.3.0

v0.2.1

View on GitHub ↗

What's Changed

Full Changelog: https://github.com/figueiredoluiz/cuke-dedup/compare/v0.2.0...v0.2.1

v0.2.0

View on GitHub ↗

What's Changed

Full Changelog: https://github.com/figueiredoluiz/cuke-dedup/compare/v0.1.1...v0.2.0