# Commander.js: what changed from 14 to 15 - Product: Commander.js (https://whatsnew.fyi/product/commander) - Vendor: TJ Holowaychuk - Range: changelog entries numbered after 14.0.3 up to and including 15.0.0, stable releases only - Entries below: 1 release (newest first) - Resolved: 14 is 14.0.3 and 15 is 15.0.0, the newest stable release of each major we track - Carrying security changes: 0 · CVEs mentioned: 0 · Mentioning breaking changes: 0 · Removing or deprecating something: 1 - Page: https://whatsnew.fyi/product/commander/compare/14...15 What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## What changed (5 changes, grouped by kind) ### Added #### 15.0.0 (2026-05-29) - Show excess command-arguments in error message ### Changed #### 15.0.0 (2026-05-29) - Migrate Commander implementation from CommonJS to ESM - Commander 15 requires Node.js v22.12.0 or higher ### Fixed #### 15.0.0 (2026-05-29) - Only lone `--no-*` option sets default option value to `true`, default not implicitly set when defining both positive and negative option in either order ### Removed #### 15.0.0 (2026-05-29) - Remove deprecated export of `commander/esm.mjs` ## Release notes ### 15.0.0 - Date: 2026-05-29 - Version: 15.0.0 - Original notes: https://www.npmjs.com/package/commander/v/15.0.0 - Permalink: https://whatsnew.fyi/product/commander/releases/15.0.0 - **added** — Show excess command-arguments in error message - **fixed** — Only lone `--no-*` option sets default option value to `true`, default not implicitly set when defining both positive and negative option in either order - **changed** — Migrate Commander implementation from CommonJS to ESM - **changed** — Commander 15 requires Node.js v22.12.0 or higher - **removed** — Remove deprecated export of `commander/esm.mjs` Commander 15 is ESM only. This is expected to be seamless for ESM consumers, but some CommonJS consumers may hit issues with tooling requiring configuration for ESM-only dependencies. See Migration Tips below. The release of Commander 15 moves Commander 14 into maintenance. Commander 14 will get security updates for 12 months (to May 2027). For more info see [Release Policy](./docs/release-policy.md). ###### Added - show excess command-arguments in error message ([#2384]) ###### Fixed - *Breaking:* only lone `--no-*` option sets default option value to `true`, default not implicitly set when define both positive and negative option in either order ([#2405]) - update example to use compatible character for MINGW64 ([#2475]) ###### Changed - *Breaking:* migrated Commander implementation from CommonJS to ESM ([#2464]) - *Breaking:* Commander 15 requires Node.js v22.12.0 or higher (for `require(esm)`). - dev: switch tests from Jest to `node:test` test runner ([#2463]) ###### Deleted - *Breaking:* removed deprecated export of `commander/esm.mjs` ([#2464]) ###### Migration Tips Commander 15 is ESM only, but this does not mean you need to migrate to ESM to use it. Importing ESM from CommonJS is supported by Node.js, and Bun, and Deno. Hopefully it Just Works for you! However, you may be using a different runtime or some other part of your setup that may not yet natively support importing ESM from CommonJS, such as your testing framework or bundler. If you have problems using Commander 15 in your environment, one option is stay on Commander 14 for now. Commander 14 will get security updates until May 2027 and things will hopefully improve for your setup in the meantime.