commit-guard
+Conventional commit linting with imperative mood detection.
+$ commit-guard --range origin/main..HEAD
+abc1234 feat: add user authentication
+ ✓ all checks passed
+def5678 wip: still working
+ ✗ [subject] unknown type: wip
+ ✗ [body] missing body
+ Install #
+uv tool install git-commit-guard
+ pipx install git-commit-guard
+ pip install git-commit-guard
+ Or via pre-commit.
+Quick start #
+# check HEAD
+$ commit-guard
+
+# check a specific commit
+$ commit-guard abc1234
+
+# check all commits in a PR range
+$ commit-guard --range origin/main..HEAD
+
+# read from a file (for git hooks)
+$ commit-guard --message-file .git/COMMIT_EDITMSG
+
+ Checks
+
+ All checks run by default. Enable or disable individually with
+ --enable / --disable:
+
| Check | +What it verifies | +
|---|---|
subject |
+
+ Format matches type(scope): description, valid
+ type, lowercase start, no trailing period, max 72 chars
+ |
+
imperative |
+ + First word is an imperative verb — uses NLP, not just a regex + | +
body |
+ Body is present after a blank line | +
signed-off |
+ Signed-off-by: trailer is present |
+
signature |
+ GPG or SSH signature is valid | +
Configuration #
+
+ Place .commit-guard.toml in your project root. CLI flags
+ always take precedence over the config file.
+
# .commit-guard.toml
+disable = ["signature", "body"]
+scopes = ["auth", "api", "db"]
+require-scope = true
+types = ["feat", "fix", "chore", "wip"]
+max-subject-length = 100
+min-description-length = 10
+require-trailers = ["Closes", "Reviewed-by"]
+ GitHub Actions #
+Check all commits in a pull request:
+jobs:
+ lint-commits:
+ runs-on: ubuntu-latest
+ env:
+ PR_BASE: ${{ github.event.pull_request.base.sha }}
+ PR_HEAD: ${{ github.event.pull_request.head.sha }}
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - uses: benner/commit-guard@v0.14.1
+ with:
+ range: ${{ env.PR_BASE }}..${{ env.PR_HEAD }}
+ disable: signed-off,signature
+
+
+ All inputs mirror the CLI flags: enable,
+ disable, scopes, require-scope,
+ types, max-subject-length,
+ min-description-length, require-trailer,
+ output-file.
+
pre-commit #
+Add to .pre-commit-config.yaml:
repos:
+ - repo: https://github.com/benner/commit-guard
+ rev: v0.14.1
+ hooks:
+ - id: commit-guard
+ - id: commit-guard-signature
+