Rules
April 7, 2026 · View on GitHub
body-case
-
condition:
bodyis in casevalue -
rule:
always -
value
'lower-case' -
possible values
[ "lower-case", // default "upper-case", // UPPERCASE "camel-case", // camelCase "kebab-case", // kebab-case "pascal-case", // PascalCase "sentence-case", // Sentence case "snake-case", // snake_case "start-case", // Start Case ];
body-empty
- condition:
bodyis empty - rule:
never
body-full-stop
-
condition:
bodyends withvalue -
rule:
never -
value
'.'
body-leading-blank
- condition:
bodybegins with blank line - rule:
always
body-max-length
-
condition:
bodyhasvalueor less characters -
rule:
always -
value
Infinity
body-max-line-length
-
condition:
bodylines havevalueor less characters, or contain a URL -
rule:
always -
value
Infinity
body-min-length
-
condition:
bodyhasvalueor more characters -
rule:
always -
value
0
breaking-change-exclamation-mark
- condition: Either both or neither
headerhas an exclamation mark before the:marker and a line infootermatches the regular expression^BREAKING[ -]CHANGE: - rule:
always
Note
This rule enforces that breaking changes are marked by both a ! in the header
and BREAKING CHANGE in the footer. The behavior is that of an XNOR operation:
- It passes when either both are present or both are not.
- It fails when one is present and the other is not.
footer-empty
- condition:
footeris empty - rule:
never
footer-leading-blank
- condition:
footerbegins with blank line - rule:
always
footer-max-length
-
condition:
footerhasvalueor less characters -
rule:
always -
value
Infinity
footer-max-line-length
-
condition:
footerlines havevalueor less characters -
rule:
always -
value
Infinity
footer-min-length
-
condition:
footerhasvalueor more characters -
rule:
always -
value
0
header-case
-
condition:
headeris in casevalue -
rule:
always -
value
'lower-case' -
possible values
[ "lower-case", // default "upper-case", // UPPERCASE "camel-case", // camelCase "kebab-case", // kebab-case "pascal-case", // PascalCase "sentence-case", // Sentence case "snake-case", // snake_case "start-case", // Start Case ];
header-full-stop
-
condition:
headerends withvalue -
rule:
never -
value
'.'
header-max-length
-
condition:
headerhasvalueor less characters -
rule:
always -
value
72
header-min-length
-
condition:
headerhasvalueor more characters -
rule:
always -
value
0
header-trim
- condition:
headermust not have initial or trailing whitespaces - rule:
always
references-empty
- condition:
referenceshas at least one entry - rule:
never
scope-case
-
condition:
scopeis in casevalue -
rule:
always -
value
'lower-case' -
possible values
[ "lower-case", // default "upper-case", // UPPERCASE "camel-case", // camelCase "kebab-case", // kebab-case "pascal-case", // PascalCase "sentence-case", // Sentence case "snake-case", // snake_case "start-case", // Start Case ]; -
extended value (object based)
{ cases: ["kebab-case"], delimiters: ["/"] }cases— list of allowed case formatsdelimiters— optional list of delimiter strings used to split multi-segment scopes (default:["/", "\", ","])
scope-delimiter-style
-
condition: all delimiters found in
scopemust matchvalue -
rule:
always -
value
["/", "\", ","]
Note
- When using this rule together with scope-enum or scope-case, make sure to provide the same
delimitersconfiguration in those rules as well. Otherwise scope parsing may become inconsistent.
scope-empty
- condition:
scopeis empty - rule:
never
scope-enum
-
condition:
scopeis found in value -
rule:
always -
value
[] -
extended value (object based)
{ scopes: ["foo", "bar"], delimiters: ["/"] }scopes— list of allowed scope valuesdelimiters— optional list of delimiter strings used to split multi-segment scopes (default:["/", "\", ","])
Note
- This rule always passes if no scopes are provided in the message or the value > is an empty array.
- When set to
always, all message scopes must be found in the value. - When set to
never, none of the message scopes can be found in the value.
scope-max-length
-
condition:
scopehasvalueor less characters -
rule:
always -
value
Infinity
scope-min-length
-
condition:
scopehasvalueor more characters -
rule:
always -
value
0
signed-off-by
-
condition:
messagehasvalue -
rule:
always -
value
'Signed-off-by:'
subject-case
-
condition:
subjectis in casevalue -
rule:
never -
value
["sentence-case", "start-case", "pascal-case", "upper-case"]; -
possible values
[ "lower-case", // lower case "upper-case", // UPPERCASE "camel-case", // camelCase "kebab-case", // kebab-case "pascal-case", // PascalCase "sentence-case", // Sentence case "snake-case", // snake_case "start-case", // Start Case ];
subject-empty
- condition:
subjectis empty - rule:
never
subject-exclamation-mark
- condition:
subjecthas exclamation before the:marker - rule:
never
subject-full-stop
-
condition:
subjectends withvalue -
rule:
never -
value
'.'
subject-max-length
-
condition:
subjecthasvalueor less characters -
rule:
always -
value
Infinity
subject-min-length
-
condition:
subjecthasvalueor more characters -
rule:
always -
value
0
trailer-exists
-
condition:
messagehas trailervalue -
rule:
always -
value
'Signed-off-by:'
type-case
-
description:
typeis in casevalue -
rule:
always -
value
'lower-case' -
possible values
[ "lower-case", // default "upper-case", // UPPERCASE "camel-case", // camelCase "kebab-case", // kebab-case "pascal-case", // PascalCase "sentence-case", // Sentence case "snake-case", // snake_case "start-case", // Start Case ];
type-empty
- condition:
typeis empty - rule:
never
type-enum
-
condition:
typeis found in value -
rule:
always -
value
[ "build", "chore", "ci", "docs", "feat", "fix", "perf", "refactor", "revert", "style", "test", ];
type-max-length
-
condition:
typehasvalueor less characters -
rule:
always -
value
Infinity
type-min-length
-
condition:
typehasvalueor more characters -
rule:
always -
value
0