commit type

breaking-change commit template

A commit that introduces an incompatible change to a public API, protocol, or behaviour that requires consumers to make corresponding changes.

feat(scope)!: short description of the new incompatible behaviour - what was removed or changed incompatibly (bullet 1) - what the new behaviour or API is (bullet 2) - what consumers must do to migrate (bullet 3) BREAKING CHANGE: Detailed description of the incompatible change and migration path. Consumers who do X must now do Y instead. Max 72 chars/line.
feat(api)!: replace session cookies with Bearer token authentication - remove Set-Cookie / Cookie session mechanism from all endpoints - require Authorization: Bearer <token> header on all authenticated requests - issue tokens via POST /auth/token and revoke via DELETE /auth/token BREAKING CHANGE: All API clients must migrate from session cookie auth to Bearer token auth. Existing session cookies are no longer accepted. Issue tokens using the new POST /auth/token endpoint before the next release.
feat(config)!: rename DATABASE_URL to DB_CONNECTION_STRING - update all internal config reads to use DB_CONNECTION_STRING - add deprecation error at startup if DATABASE_URL is set without the new key - update documentation and .env.example with the new variable name BREAKING CHANGE: The DATABASE_URL environment variable is no longer recognised. Rename it to DB_CONNECTION_STRING in all deployment environments, CI secrets, and local .env files before upgrading.
refactor(exports)!: remove default export in favour of named exports - change all module files from export default to named exports - update internal import sites throughout the codebase - add migration codemod script at scripts/migrate-imports.ts BREAKING CHANGE: Default imports (import Client from '@example/sdk') no longer work. Replace with named imports: import { Client } from '@example/sdk'. Run the codemod at scripts/migrate-imports.ts to automate the update.
feat(cli)!: remove --output flag; use --format and --destination instead - add --format flag accepting json, yaml, or table - add --destination flag for output file path (default: stdout) - print deprecation error when --output is passed and exit 1 BREAKING CHANGE: The --output flag is removed. Scripts using --output <file> must be updated to --format table --destination <file>. The --format and --destination flags are available from this version onward.

Use feat(scope)!: or fix(scope)!: (a ! immediately before the colon, after optional scope) and add a BREAKING CHANGE: footer whenever you remove a public API, change a method signature incompatibly, rename a required config key, or change a default behaviour that consumers depend on.

git-agent automatically analyzes your changes and infers the correct commit type.

brew install gitagenthq/tap/git-agent
What triggers a MAJOR version bump in semantic-release?
Any commit with a BREAKING CHANGE: footer, or any commit with ! immediately before the colon (feat!, fix!, feat(api)!:, etc.), triggers a MAJOR bump. The ! shorthand and the footer are equivalent.
Should I provide a migration guide in the commit body?
Yes. The BREAKING CHANGE: footer should describe what changed and what consumers must do differently. A specific before/after example in the footer is more useful than a vague notice.
Can a chore or docs commit be a breaking change?
Technically yes — any commit type can carry a BREAKING CHANGE footer. In practice, breaking changes almost always come from feat or fix commits that alter observable behaviour.