CukeDedup
CukeDedup is a fast static analyzer for duplicate, ambiguous, reusable, and unused Cucumber/Gherkin step definitions. It reads project configuration and test code without executing either one.
It supports:
- JavaScript, JSX, TypeScript, and TSX step definitions.
- Cucumber.js, Playwright-BDD, and Cypress Cucumber projects.
- Classic .feature files and Gherkin Markdown .feature.md files.
- Terminal, JSON, JSON Lines, HTML, and SARIF reports.
- Thresholds, baselines, changed-file analysis, suppressions, and ignore files.
Install
With Cargo:
cargo install cuke-dedupOr in a JavaScript project, using Node.js 24 LTS (recommended):
npm install --save-dev cuke-dedup
npx cuke-dedup .Building from source requires Rust 1.90 or newer:
cargo build --release --lockedQuick start
Run CukeDedup from the root of a test project:
cuke-dedup .No configuration is required. CukeDedup respects .gitignore and .cuke-dedupignore, skips common generated directories, discovers conventional Gherkin and JavaScript/TypeScript files, and recognizes common Given, When, Then, and defineStep registrations and aliases.
Useful commands:
cuke-dedup . --threshold 5
cuke-dedup . --print-config
cuke-dedup . --reporters terminal,json,html,sarif
cuke-dedup . --reporters jsonl
cuke-dedup . --output reports/cuke-dedupcuke-dedup check . is equivalent to cuke-dedup .. The explicit check form requires a path; use cuke-dedup ./check to analyze a directory literally named check.