On this page
Changelog¶
Notable changes to the commit-check CLI, one line each, newest first. Every change, including maintenance, is in the GitHub releases.
Highlights¶
The releases worth knowing about. Each links to its entry below and to the page that documents it.
| Version | What changed | Documented in |
|---|---|---|
| 2.20.5 | The author checks cover a repository's first commit; a run takes about half the time to start; releases on PyPI carry provenance | Checking the committer · CC017 |
| 2.20.3 | Failures print a one-line header and an indented block per check, in place of the ASCII banner; an agent skill for coding agents | Getting started · With AI coding agents |
| 2.20.1 | --ai-attribution-only checks a pull request description against your AI policy; JSON lists the AI tools found; more AI marks recognised |
Checking a pull request description · CC013 |
| 2.20.0 | Commits authored by an AI tool rejected; subject length 0 turns the rule off; Python 3.11+ required |
CC017 · CC013 · CC004 |
| 2.19.5 | GitHub merge queue branches accepted by default; aider's default co-author trailer recognised; exit 2 when git cannot read the repository | CC201 · CC013 · Exit codes |
| 2.19.4 | agents/ branches accepted by default; Cursor's Made-with: Cursor trailer recognised |
CC201 · CC013 |
| 2.19.3 | A quoted "false" for a true/false setting refused instead of read as true |
Every option |
| 2.19.2 | Copilot coding agent recognised; config values of the wrong type refused; commit text printed safely | CC013 · Every option · Color and links |
| 2.19.1 | develop accepted by default; stricter merge-subject, fixup, WIP and sign-off checks |
CC201 · CC001 · CC009 |
| 2.19.0 | Branch descriptions held to the Conventional Branch grammar; Amp, OpenHands, Factory Droid and Jules recognised | CC201 · CC013 |
| 2.18.3 | --fix corrects a message in place; --branch reads GitLab, Bitbucket, Azure and Jenkins variables |
Fixing a message in place · Other CI |
| 2.18.0 | AI disclosure policy: three rules, and the correction written for you | Policy guides · CC014 |
| 2.17.0 | Concrete corrections for mechanical slips; a warn level per rule |
Reading the JSON · Report without enforcing |
| 2.16.0 | Tag name validation, and file size, path and pattern policies | CC401 · CC302–CC304 |
| 2.15.1 | Color and rule-ID links appear only where they render; NO_COLOR honoured |
Color and links |
| 2.15.0 | --rev names the commit under test; skipped checks are named on stderr |
Command-line recipes |
| 2.14.0 | CC003 judges imperative mood by a word's form, not by a list of verbs | CC003 |
| 2.13.1 | JSON output reports the checked value for passing checks | Output for scripts and CI |
| 2.13.0 | Stable rule IDs in terminal output and JSON | Rules reference |
| 2.12.0 | Author name and email patterns became configurable | CC101 · CC102 |
| 2.11.0 | AI attribution policy | Policy guides |
| 2.10.0 | dependabot/ and renovate/ branches accepted by default |
CC201 |
| 2.9.0 | AI agent branch prefixes accepted by default | CC201 |
| 2.8.0 | Custom message_pattern; Python 3.9 dropped |
CC001 |
| 2.7.0 | Force push blocking | CC301 |
| 2.6.0 | --format json and the Python API; --compact, --no-banner |
Command-line recipes |
| 2.5.0 | Organization-wide config with inherit_from |
Across an organization |
| 2.0.0 | Configuration moved from YAML to TOML — breaking | Migrating from v1 |
v2.20.5 (2026-11-11)¶
Changed¶
- A run takes about half the time to start: the AI signature patterns are compiled when first used. (#693)
- Releases on PyPI carry provenance attestations. (#691)
Fixed¶
--author-nameand--author-emailcheck a repository's first commit, instead of being skipped until a commit exists. (Checking the committer, #692)- CC017's advice for a message not yet committed names
author.nameandauthor.emailamong the settings to unset. (CC017, #692)
v2.20.4 (2026-11-10)¶
Fixed¶
require_bodyno longer takes trailers alone, such as theSigned-off-by:line fromgit commit -s, for a body. (CC011, #689)ignore_authorswritten as one string is split on commas, instead of skipping any author whose name is part of it. (Every option, #689)--author-nameand--author-emailhonourgit commit --authorand theauthor.nameandauthor.emailsettings. (Checking the committer, #689)
v2.20.3 (2026-11-10)¶
Added¶
- An agent skill teaches coding agents to check a message before they commit. (With AI coding agents, #679, #686)
Changed¶
- A failure prints a one-line header and an indented block per check, in place of the ASCII banner. (Getting started, #682)
Fixed¶
- CC017 on a message that is not committed yet suggests setting your own
user.nameanduser.email, not amending. (CC017, #685) --ai-attribution-onlywith no text piped in passes, instead of judgingHEAD. (Guide, #684)
v2.20.2 (2026-11-08)¶
Changed¶
v2.20.1 (2026-11-08)¶
Added¶
--ai-onlychecks a pull request description against your AI policy, without the commit message rules. (Guide, #673)--format jsonlists the AI tools it found inai_tools, even underignore. (Reading the JSON, #673)- More AI marks are recognised: Warp, Crush, the Claude Code notice without the emoji,
Reviewed-by:and similar trailers naming a tool, and Codex, Devin, Jules and Cursor run links. (CC013, #672, #673)
v2.20.0 (2026-11-08)¶
Breaking¶
- Python 3.11 or newer is required. On
ubuntu-22.04, addactions/setup-pythonbefore the Action. (GitHub Action, #662)
Added¶
- A commit authored by an AI tool, such as
claude[bot], fails underforbidanddisclose. (CC017, #661) - Continue, Mistral Vibe and Qwen Code are recognised. (CC013, #657, #659)
Changed¶
Fixed¶
[commit] require_verified, read by the GitHub App, no longer warns as an unknown setting. (#656)
v2.19.5 (2026-11-04)¶
Fixed¶
- GitHub merge queue branches (
gh-readonly-queue/…) pass the branch check by default. (CC201, #653) - aider's default co-author trailer is recognised. (CC013, #652)
- When git cannot read the repository, for example "dubious ownership", the run exits 2 instead of passing without checking. (Exit codes, #654)
v2.19.4 (2026-10-29)¶
Changed¶
Fixed¶
v2.19.3 (2026-10-21)¶
Fixed¶
- A quoted true/false value such as
"false"is a config error (exit 2) instead of being read as true. (Every option, #636)
v2.19.2 (2026-10-18)¶
Changed¶
- A setting of the wrong type, such as
subject_max_length = "50", is a config error (exit 2) instead of being misread. Check your config when you upgrade. (Every option, #624) - The rebase check reports a skip, not a pass, when its target branch does not exist. (CC202, #617)
- The tag check in a pre-push hook checks the tag name the remote receives. (CC401, #615)
Fixed¶
- The Copilot coding agent is recognised. (CC013, #632)
- Commit text is printed safely: control characters are escaped, and a line starting with
::can no longer act as a GitHub Actions command. (Color and links, #620) - Three slow patterns now run in linear time. (#626)
v2.19.1 (2026-10-16)¶
Changed¶
developpasses the branch check by default. (CC201, #612)- Only merge subjects written by git or a forge skip the message rules;
Merge the parser rewriteis now checked. (CC001, #619) - The
commit-msghook drops git's comment lines and thegit commit -vdiff before checking. (#618)
Fixed¶
squash!andamend!commits are rejected likefixup!when fixup commits are not allowed. (CC009, #613)- Every WIP form is caught, such as
WIPfollowed by a tab or a dash. (CC010, #616) - The sign-off check needs a real
Signed-off-by:trailer with a name and an address. (CC012, #621) - A
word:prefix skips the case and mood checks only when it is an allowed commit type. (CC002, #622) - Two more AI co-author forms are recognised, including Cursor Agent's. (CC013, #623)
- The config file is found when you run from a subdirectory. (Where the config file lives, #625)
- A parent config from
inherit_fromlarger than 1 MiB is skipped. (Across an organization, #614)
v2.19.0 (2026-10-14)¶
Added¶
require_description_grammaralso checks the part after<type>/, sofeature/Add_Loginfails. (CC201, #581)- Amp, OpenHands, Factory Droid and Jules are recognised. (CC013, #606)
--format jsonsays why a check was skipped. (When a check is skipped, #605)
Fixed¶
- The
check-taghook checks the tags the push sends, not the tags onHEAD. (#603) - A tag build on GitHub Actions no longer fails the branch check on the tag name. (#603)
v2.18.3 (2026-10-07)¶
Added¶
--fixcorrects mechanical slips in the message file, such asFix:tofix:. (Fixing a message in place, #594)--branchreads the branch name on GitLab, Bitbucket, Azure and Jenkins. (Other CI, #600)- A misspelt setting is reported with the closest real name. (Settings nothing reads, #593)
v2.18.2 (2026-09-28)¶
Fixed¶
- With
--message --branch, piped input is read only as the message. (#579) - The force-push check reports a skip, not a pass, when it has nothing to compare. (CC301, #591)
v2.18.1 (2026-09-24)¶
Changed¶
- Python 3.15 is supported. Thanks @itzzdev09. (#583)
v2.18.0 (2026-09-13)¶
Added¶
ai_attribution = "disclose"accepts AI help disclosed withAssisted-by:and writes the fix for you. (Asking for disclosure instead, #575)- A failed check names the rejected value, such as "Subject is 96 characters; it must be at most 80". (#571)
- Spec names in errors are links in terminals that support them. (#568)
Changed¶
Fixed¶
main,masteranddevelopmust match exactly, somain-backupfails. (CC201, #569)- Only subjects git writes itself, such as
Mergeandfixup!, skip the message format check. (CC001, #569) - A regex setting that does not compile names the setting and exits 2. (Exit codes, #574)
- A config error exits 2 and names the file;
--dry-runnow runs the checks. (#570) - An
inherit_fromthat cannot be loaded is reported on stderr. (#569)
v2.17.0 (2026-09-06)¶
Added¶
- A failed check gives the exact fix when there is only one, such as
Use "fix: add x", also asfixin JSON. (Reading the JSON, #564) warn = [...]reports a rule without failing the run. (Report a rule without enforcing it, #565)
Fixed¶
v2.16.0 (2026-08-31)¶
Added¶
--tagchecks tag names, SemVer by default. (CC401, #559)--fileschecks committed file size, forbidden paths and path length. (CC302–CC304, #560)
v2.15.1 (2026-08-16)¶
Fixed¶
- Color is printed only to a terminal, and
NO_COLORandFORCE_COLORare honoured. Thanks @larsch. (Color and links, #551, #552)
v2.15.0 (2026-08-13)¶
Added¶
--revchecks a given commit, with its recorded author. (Checking a range of commits, #544)
Changed¶
- Skipped checks are named on stderr instead of passing in silence. (When a check is skipped, #544)
- Only git's own
Mergeandfixup!prefixes skip the subject rules.
Fixed¶
- The CLI no longer hangs in CI when stdin is open but empty. (#544)
v2.14.0 (2026-08-12)¶
Changed¶
- The imperative check rejects only
fixed,addingorfixesforms, so any imperative verb passes. (CC003, #540)
v2.13.1 (2026-08-05)¶
Added¶
--format jsonshows the checked value for passing checks too. (#522)
v2.13.0 (2026-08-04)¶
Added¶
- Every rule has a stable ID such as
CC003, shown in the output and the JSON with a docs link. (Rules reference, #512) docs/,ci/,test/,refactor/,build/,perf/andstyle/branches pass by default. (#505)
Changed¶
- Rule IDs are clickable where the terminal supports links. (#520)
- The docs moved to commit-check.com;
docs.commit-check.comlinks redirect. (#514)
v2.12.2 (2026-08-01)¶
Fixed¶
- AI model names with spaces in co-author trailers are recognised. (#506)
- More imperative verbs are recognised. (#496)
v2.12.1 (2026-07-31)¶
Fixed¶
- No crash when the package version cannot be read. (#483)
v2.12.0 (2026-07-24)¶
Added¶
Fixed¶
- No crash on Chinese Windows. (#475)
- The author checks read
git configfirst, the identity your next commit will use. (#461)
v2.11.1 (2026-07-09)¶
Fixed¶
v2.11.0 (2026-07-06)¶
Added¶
ai_attribution = "forbid"rejects commits with known AI tool signatures. (Policy guides, #456)
Fixed¶
- The rebase check no longer takes
main-stagingformain. (#451)
v2.10.1 (2026-06-30)¶
Fixed¶
- WIP is detected in any case. (#448)
- Brackets and other special characters are allowed in a commit description. (#447)
v2.10.0 (2026-06-26)¶
Added¶
dependabot/andrenovate/branches pass by default. (#442)
v2.9.0 (2026-06-22)¶
Added¶
- AI agent branches
ai/,claude/,codex/,copilot/andcursor/pass by default. (#438)
v2.8.1 (2026-06-22)¶
Added¶
- Editors autocomplete
cchk.tomlthrough SchemaStore. (#433)
v2.8.0 (2026-06-13)¶
Breaking¶
- Python 3.10 or newer is required. (#424)
Added¶
v2.7.1 (2026-06-08)¶
Fixed¶
autois accepted as an imperative verb. (#417)
v2.7.0 (2026-05-16)¶
Added¶
--no-force-pushand thecheck-no-force-pushhook block force pushes. (CC301, #412)validate_push()runs the same check from Python. (#412)- 156 more imperative verbs are recognised. (#414)
v2.6.0 (2026-04-20)¶
Added¶
--format jsonand the Python API, for scripts and AI agents. (Output for scripts and CI, #396)--compactprints one line per failure, and--no-bannerhides the banner. (#402)
v2.5.0 (2026-04-03)¶
Added¶
inherit_fromloads a shared config from GitHub, a file or an HTTPS URL. (Across an organization)ignore_authorsalso skips a commit whose co-author is listed.- The author checks read
git configbefore the last commit.
v2.0.0 (2025-10-01)¶
Warning
Breaking release. Read Migrating from v1 before you upgrade.
Breaking¶
- The config moved from
.commit-check.ymltocchk.tomlorcommit-check.toml. (Migrating from v1) - The hooks
check-commit-signoff,check-merge-baseandcheck-imperativeand the flags--signoff,--merge-baseand--imperativeare removed. Use the matchingcchk.tomlsettings. - The modules
author.py,branch.py,commit.pyanderror.pyare removed. (#280)
v0.10.2 (2025-08-26)¶
Last release before the big v2.0 changes.
v0.1.0 (2022-11-02)¶
Initial release of commit-check.