# What changed in @cucumber/cucumber

> 75 changes in @cucumber/cucumber 8 to 13 from its official release notes, upgrade guides and advisories: 34 breaking, 5 deprecations, 10 new APIs and options. Each one cited. Sources checked 2026-11-03. HTML: https://unstale.sh/npm/@cucumber/cucumber/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## @cucumber/cucumber 13

### Breaking changes

- AfterAll hooks are always executed. (13.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.0.0)
- Deprecated handling of ambiguous formats has been removed. (13.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.0.0)
- The Cli class is no longer exported. Use the runCucumber function from the JavaScript API to run Cucumber programmatically. (13.0.0) — [upgrade guide](https://github.com/cucumber/cucumber-js/blob/HEAD/UPGRADING.md), [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.0.0)
- Additional colons in paths are no longer handled on a best-effort basis when parsing CLI formats. Quote both sides of the delimiter to avoid ambiguity. (13.0.0) — [upgrade guide](https://github.com/cucumber/cucumber-js/blob/HEAD/UPGRADING.md)
- FORCE_COLOR is set based on the deprecated format option. (13.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.0.0)
- Output for summary, progress, progress bar, and pretty formatters has been redesigned. (13.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.0.0)
- BeforeAll and AfterAll hooks always execute, even if other hooks have failed; ensure they can handle potentially incomplete state. (13.0.0) — [upgrade guide](https://github.com/cucumber/cucumber-js/blob/HEAD/UPGRADING.md), [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.0.0)
- The parallel runtime has been reimplemented with worker threads, changing how parallel execution works. (13.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.0.0)

### Deprecations

- willBeRetried is deprecated in After hooks. (13.3.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.3.0)
- The printAttachments format option is deprecated in favour of includeAttachments. (13.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.0.0)
- The legacy ProgressFormatter class is deprecated in favour of the new formatter architecture. (13.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.0.0)
- The legacy SummaryFormatter class is deprecated in favour of the new formatter architecture. (13.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.0.0)

### New APIs and options

- Steps can now use both a data table and a doc string. (13.3.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.3.0)
- Adds an option to choose where global hooks run. (13.2.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.2.0)

### Behavior and default changes

- The Error.cause chain, including stack frames, is surfaced in output. (13.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.0.0)

### Fixes and other changes

- Fixes a hang in the parallel runtime when there are no test cases to run. (13.2.1) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.2.1)
- The ESM entry point now gets all exported types. (13.1.1) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.1.1)
- Prevents a formatter error when a test step result is missing. (13.1.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.1.0)
- Unexpected exits from parallel workers are now handled. (13.1.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.1.0)
- Undefined and ambiguous results are handled correctly when skipped. (13.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.0.0)
- Status colors now match those used by other formatters. (13.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v13.0.0)

## @cucumber/cucumber 12

### Breaking changes

- Support for Node.js 18.x has been removed. (12.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.0.0)
- Support for Node.js 23.x has been removed. (12.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.0.0)
- The publishQuiet option has been removed. (12.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.0.0)

### Deprecations

- The format option is deprecated in favour of environment variables. (12.6.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.6.0)

### New APIs and options

- Plugins can now listen for the new publish:url event. (12.9.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.9.0)
- Adds support for a custom externalising option. (12.8.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.8.0)
- External plugins are now allowed, enabling developers to extend Cucumber with plugins. (12.5.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.5.0)
- Config files can now be loaded in TypeScript format. (12.4.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.4.0)
- BeforeAll and AfterAll hooks can be named. (12.3.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.3.0)
- Messages are emitted for test run hooks. (12.3.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.3.0)
- The After hook parameters now include the original error. (12.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.0.0)
- The AfterStep hook parameters now include the original error. (12.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.0.0)

### Performance

- Report content is compressed with gzip before publishing. (12.4.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.4.0)

### Behavior and default changes

- Assertion info is now included in the stack trace. (12.8.3) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.8.3)
- Cucumber warns about paths merged from config and CLI, helping developers identify configuration overlap. (12.7.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.7.0)
- The HTML report is rendered in a more test case-centric way. (12.3.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.3.0)
- Messages are emitted for suggestions. (12.3.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.3.0)
- Comments are now allowed inside descriptions. (12.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.0.0)
- The HTML formatter header has been redesigned. (12.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.0.0)

### Fixes and other changes

- Thrown strings are now handled correctly. (12.8.3) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.8.3)
- Resolves a dependency issue involving junit-xml-formatter and query. (12.8.1) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.8.1)
- Environment variables now reach child processes when running in parallel mode. (12.7.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.7.0)
- Fixes error type resolution. (12.7.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.7.0)
- Building source references now handles ESM. (12.7.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.7.0)
- Node.js 25.x is supported. (12.3.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.3.0)
- Node.js 24.x is now supported. (12.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v12.0.0)

## @cucumber/cucumber 11

### Breaking changes

- Support for Node.js 21 was removed. (11.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v11.0.0)
- The previously deprecated parseGherkinMessageStream API was removed. (11.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v11.0.0)
- The previously deprecated PickleFilter API was removed. (11.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v11.0.0)
- The previously deprecated Runtime API was removed. (11.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v11.0.0)

## @cucumber/cucumber 10

### Breaking changes

- Configuration files are loaded using the appropriate module loading mechanism. (10.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v10.0.0)
- Custom formatters and snippet syntaxes are loaded with await import(). (10.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v10.0.0)
- Default support code is loaded with await import(). (10.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v10.0.0)
- Attached string literals are base64-encoded in JSON reports. (10.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v10.0.0)
- Support for Node.js 14, 16 and 19 is dropped. (10.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v10.0.0)

### Fixes and other changes

- Node.js 20 is supported. (10.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v10.0.0)

## @cucumber/cucumber 9

### Breaking changes

- The generator snippet interface was removed. (9.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v9.0.0)
- Support for Node.js versions 12 and 17 was removed. (9.0.0) — [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v9.0.0)

## @cucumber/cucumber 8

### Breaking changes

- The Cli constructor now requires env, the environment variables used to detect some configuration options. (8.0.0) — [upgrade guide](https://github.com/cucumber/cucumber-js/blob/main/UPGRADING.md)
- The Cli constructor now requires stderr, a writable stream for warning and error output. (8.0.0) — [upgrade guide](https://github.com/cucumber/cucumber-js/blob/main/UPGRADING.md)
- Absolute paths for custom formatters and snippet syntaxes must be provided as valid file:// URLs. (8.0.0) — [upgrade guide](https://github.com/cucumber/cucumber-js/blob/main/UPGRADING.md)
- Subpath exports restrict which package internals Node.js can resolve, including implicit resolution of /index.js. (8.0.0) — [upgrade guide](https://github.com/cucumber/cucumber-js/blob/main/UPGRADING.md)
- Generator functions in step definitions are no longer natively supported; use async/await or wrap generators with your own dependencies. (8.0.0) — [upgrade guide](https://github.com/cucumber/cucumber-js/blob/main/UPGRADING.md)
- The getConfiguration method is removed from the programmatic Cli API. (8.0.0) — [upgrade guide](https://github.com/cucumber/cucumber-js/blob/main/UPGRADING.md)
- The getSupportCodeLibrary method is removed from the programmatic Cli API. (8.0.0) — [upgrade guide](https://github.com/cucumber/cucumber-js/blob/main/UPGRADING.md)
- The initializeFormatters method is removed from the programmatic Cli API. (8.0.0) — [upgrade guide](https://github.com/cucumber/cucumber-js/blob/main/UPGRADING.md)
- The --predictable-ids CLI option is removed; it was only used for internal testing. (8.0.0) — [upgrade guide](https://github.com/cucumber/cucumber-js/blob/main/UPGRADING.md)
- The --retryTagFilter CLI option is removed; use --retry-tag-filter instead. (8.0.0) — [upgrade guide](https://github.com/cucumber/cucumber-js/blob/main/UPGRADING.md)
- Relative paths for snippet syntaxes must begin with a dot. (8.0.0) — [upgrade guide](https://github.com/cucumber/cucumber-js/blob/main/UPGRADING.md)
- The After hook argument's result no longer contains willBeRetried; the property is available at the top level of the argument. (8.0.0) — [upgrade guide](https://github.com/cucumber/cucumber-js/blob/main/UPGRADING.md)

### Behavior and default changes

- Relative paths for custom formatters must begin with a dot. (8.0.0) — [upgrade guide](https://github.com/cucumber/cucumber-js/blob/main/UPGRADING.md)
- Cucumber emits a warning when run with a Node.js version that has not been tested. (8.0.0) — [upgrade guide](https://github.com/cucumber/cucumber-js/blob/main/CHANGELOG.md), [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v8.0.0)

### Fixes and other changes

- Custom formatters can rely on transpilers loaded with --require-module. (8.0.0) — [upgrade guide](https://github.com/cucumber/cucumber-js/blob/main/CHANGELOG.md), [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v8.0.0)
- Formatter and snippet paths in options can use file:// URLs. (8.0.0) — [upgrade guide](https://github.com/cucumber/cucumber-js/blob/main/CHANGELOG.md), [release notes](https://github.com/cucumber/cucumber-js/releases/tag/v8.0.0)
