--- source_keys: - conventional-commits-spec - commitlint-config-conventional --- # Conventional Commits Specification (v1.0.0) Conventional Commits is a lightweight convention on top of commit messages that provides a set of rules for creating an explicit commit history. It enables automated tooling (CHANGELOG generation, semantic version bumping) and structured filtering. ## Message Format ```text [optional scope]: [optional body] [optional footer(s)] ``` Each section is separated by a blank line. The header is the only required part. ## Rules | Element | Rule | |---|---| | `type` | Required. Lowercase noun. | | `scope` | Optional. Noun in parentheses directly after type: `feat(api):`. | | `description` | Required. Immediately follows `type/scope: `. Imperative mood, no trailing period. | | `body` | Optional. Begins one blank line after description. Free-form prose, multiple paragraphs allowed. Lines max 100 characters. | | `footer(s)` | Optional. Begins one blank line after body (or description). `: ` format. Lines max 100 characters. | | `BREAKING CHANGE` | Must be uppercase. Either a footer token or signalled by `!` before the colon. | ## Standard Types The spec itself mandates only `feat` and `fix`. The 11-type set below is the de-facto standard from `@commitlint/config-conventional` (Angular commit message guidelines), not a spec requirement — but it is what this skill validates against. ### 11-type set (commitlint/config-conventional) | Type | Meaning | SemVer impact | Appears in CHANGELOG | |---|---|---|---| | `feat` | New user-visible feature | MINOR | Yes | | `fix` | Bug fix | PATCH | Yes | | `perf` | Performance improvement, no API change | PATCH | Yes | | `revert` | Reverts a previous commit | PATCH | Yes | | `docs` | Documentation only | none | No | | `style` | Formatting, whitespace — no logic change | none | No | | `refactor` | Code restructuring — no feature or fix | none | No | | `test` | Adding or fixing tests | none | No | | `build` | Build system or external dependency changes | none | No | | `ci` | CI configuration and scripts | none | No | | `chore` | Anything not fitting above | none | No | A `BREAKING CHANGE` footer or `!` on **any** type always triggers a MAJOR bump. ## Breaking Changes Two equivalent notations: **`!` in header** (preferred — visible in `git log --oneline`): ```text feat!: drop support for Node 6 feat(api)!: remove deprecated endpoint ``` **`BREAKING CHANGE` footer** (machine-readable body): ```text feat: allow config to extend other configs BREAKING CHANGE: `extends` key now used for extending config files ``` **Both together** (most explicit): ```text feat!: drop support for Node 6 BREAKING CHANGE: use JavaScript features not available in Node 6. ``` Rules: - `BREAKING CHANGE` must be all caps. - `BREAKING-CHANGE` (hyphenated) is an accepted synonym. - Any type can carry a breaking change, not just `feat`. - The footer value must describe what broke. ## Footer Token Rules ```text : # # for issue references ``` - Tokens use hyphens for word separation: `Reviewed-by`, `Co-authored-by`, `Refs`. - Exception: `BREAKING CHANGE` (space allowed, uppercase). - Multiple footers allowed, one per line. - Blank line required before the footer block. Valid footer examples: ```text Reviewed-by: Z Refs: #123 Co-authored-by: Alice BREAKING CHANGE: the `--format` flag now requires a value ``` ## Examples Minimal — no body, no footer: ```text docs: correct spelling of CHANGELOG ``` With scope: ```text feat(lang): add Polish language ``` Breaking change via `!`: ```text feat!: send an email to the customer when a product is shipped ``` Breaking change via footer: ```text feat: allow provided config object to extend other configs BREAKING CHANGE: `extends` key in config file is now used for extending other config files ``` Multi-paragraph body with multiple footers: ```text fix: prevent racing of requests Introduce a request id and a reference to latest request. Dismiss incoming responses other than from latest request. Remove timeouts which were used to mitigate the racing issue but are obsolete now. Reviewed-by: Z Refs: #123 ``` Revert: ```text revert: let us never again speak of the noodle incident Refs: 676104e, a215868 ``` ## commitlint Constraints (config-conventional) | Constraint | Value | |---|---| | Header max length | 100 characters | | Subject must not end with `.` | enforced | | Subject must be lowercase (not sentence-case or UPPER-CASE) | enforced | | Body / footer line max length | 100 characters | | Type must be one of the 11 standard types | error if not | | Blank line before body | warning | | Blank line before footer | warning | ## SemVer Mapping Summary | Condition | SemVer bump | |---|---| | `fix`, `perf`, `revert` | PATCH | | `feat` | MINOR | | Any type with `BREAKING CHANGE` or `!` | MAJOR | | All other types (`docs`, `style`, `refactor`, `test`, `build`, `ci`, `chore`) | none |