Skip to content
Commit Check
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.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.2 (2026-11-08)

Changed

  • --ai-only is renamed --ai-attribution-only; the old name still works. (Guide, #677)

v2.20.1 (2026-11-08)

Added

  • --ai-only checks a pull request description against your AI policy, without the commit message rules. (Guide, #673)
  • --format json lists the AI tools it found in ai_tools, even under ignore. (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, add actions/setup-python before the Action. (GitHub Action, #662)

Added

  • A commit authored by an AI tool, such as claude[bot], fails under forbid and disclose. (CC017, #661)
  • Continue, Mistral Vibe and Qwen Code are recognised. (CC013, #657, #659)

Changed

  • subject_max_length = 0 or subject_min_length = 0 turns that check off. (CC004, #660)

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

  • agents/ branches, made by VS Code's Agents window, pass by default. (CC201, #645)

Fixed

  • Cursor's Made-with: Cursor trailer is recognised. (CC013, #643)

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

  • develop passes the branch check by default. (CC201, #612)
  • Only merge subjects written by git or a forge skip the message rules; Merge the parser rewrite is now checked. (CC001, #619)
  • The commit-msg hook drops git's comment lines and the git commit -v diff before checking. (#618)

Fixed

  • squash! and amend! commits are rejected like fixup! when fixup commits are not allowed. (CC009, #613)
  • Every WIP form is caught, such as WIP followed 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_from larger than 1 MiB is skipped. (Across an organization, #614)

v2.19.0 (2026-10-14)

Added

  • require_description_grammar also checks the part after <type>/, so feature/Add_Login fails. (CC201, #581)
  • Amp, OpenHands, Factory Droid and Jules are recognised. (CC013, #606)
  • --format json says why a check was skipped. (When a check is skipped, #605)

Fixed

  • The check-tag hook checks the tags the push sends, not the tags on HEAD. (#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

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

v2.18.0 (2026-09-13)

Added

  • ai_attribution = "disclose" accepts AI help disclosed with Assisted-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

  • forbid also rejects Assisted-by: and Generated-by: trailers. (CC013, #575)

Fixed

  • main, master and develop must match exactly, so main-backup fails. (CC201, #569)
  • Only subjects git writes itself, such as Merge and fixup!, 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-run now runs the checks. (#570)
  • An inherit_from that cannot be loaded is reported on stderr. (#569)

v2.17.0 (2026-09-06)

Added

Fixed

  • The case check no longer reads the first word of a plain subject as a type. (CC002, #564)

v2.16.0 (2026-08-31)

Added

  • --tag checks tag names, SemVer by default. (CC401, #559)
  • --files checks committed file size, forbidden paths and path length. (CC302–CC304, #560)

v2.15.1 (2026-08-16)

Fixed

v2.15.0 (2026-08-13)

Added

Changed

  • Skipped checks are named on stderr instead of passing in silence. (When a check is skipped, #544)
  • Only git's own Merge and fixup! 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, adding or fixes forms, so any imperative verb passes. (CC003, #540)

v2.13.1 (2026-08-05)

Added

  • --format json shows 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/ and style/ 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.com links 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

  • author_name_pattern and author_email_pattern take your own regex. (CC101, #459)

Fixed

  • No crash on Chinese Windows. (#475)
  • The author checks read git config first, the identity your next commit will use. (#461)

v2.11.1 (2026-07-09)

Fixed

  • require_signed_off_by accepts any name and skips authors in ignore_authors. (#462, #464)

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-staging for main. (#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/ and renovate/ branches pass by default. (#442)

v2.9.0 (2026-06-22)

Added

  • AI agent branches ai/, claude/, codex/, copilot/ and cursor/ pass by default. (#438)

v2.8.1 (2026-06-22)

Added

  • Editors autocomplete cchk.toml through SchemaStore. (#433)

v2.8.0 (2026-06-13)

Breaking

  • Python 3.10 or newer is required. (#424)

Added

  • message_pattern replaces the Conventional Commits check with your own regex. (CC001, #427)

v2.7.1 (2026-06-08)

Fixed

  • auto is accepted as an imperative verb. (#417)

v2.7.0 (2026-05-16)

Added

  • --no-force-push and the check-no-force-push hook 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 json and the Python API, for scripts and AI agents. (Output for scripts and CI, #396)
  • --compact prints one line per failure, and --no-banner hides the banner. (#402)

v2.5.0 (2026-04-03)

Added

  • inherit_from loads a shared config from GitHub, a file or an HTTPS URL. (Across an organization)
  • ignore_authors also skips a commit whose co-author is listed.
  • The author checks read git config before 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.yml to cchk.toml or commit-check.toml. (Migrating from v1)
  • The hooks check-commit-signoff, check-merge-base and check-imperative and the flags --signoff, --merge-base and --imperative are removed. Use the matching cchk.toml settings.
  • The modules author.py, branch.py, commit.py and error.py are 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.

Esc
↵ to open ↑↓ to move Esc to close
Keyboard shortcuts
Ctrl K /
Open search and commands
t
Toggle dark mode
[ ]
Previous / next page
j k
Previous / next heading
?
Show this help