The repo guide already prescribed the seven-rules format but did not rule out the Conventional-Commits alternative, and recent history has drifted into mixing both styles. Several existing commits use a "fix(scope): ..." prefix that the project does not consume for any tooling (no changelog generator, no semantic release, no commit-lint), so the prefix only adds noise and hurts log readability. Add an alwaysApply Cursor rule that explicitly bans Conventional Commits and restates the seven-rules format with concrete good and bad examples. Update contrib/claude/commit.md with the same prohibition so the documentation and the rule agree, and cross-link both from the existing signing rule so an agent reading git-commit-signing.mdc lands on the style rule too. Signed-off-by: Émile Ré <emile@probo.com>
61 lines
2.5 KiB
Plaintext
61 lines
2.5 KiB
Plaintext
---
|
|
description: Git commit message style — seven rules, no Conventional Commits
|
|
alwaysApply: true
|
|
---
|
|
|
|
# Git commit message style
|
|
|
|
This repository follows the [seven rules of a great Git commit message](https://cbea.ms/git-commit/) (see [`contrib/claude/commit.md`](../../contrib/claude/commit.md)). **Do not use Conventional Commits** (`type(scope): summary`); the contrib guide explicitly prescribes the seven-rules format, and Conventional-Commits-style messages in the history are drift, not precedent.
|
|
|
|
## The seven rules
|
|
|
|
1. Separate subject from body with a blank line
|
|
2. Limit the subject line to 50 characters
|
|
3. Capitalize the subject line
|
|
4. Do not end the subject line with a period
|
|
5. Use the imperative mood in the subject line
|
|
6. Wrap the body at 72 characters
|
|
7. Use the body to explain *what* and *why* vs. *how*
|
|
|
|
The subject must complete the sentence "If applied, this commit will …".
|
|
|
|
## Good vs bad
|
|
|
|
```text
|
|
# GOOD — capitalized imperative subject, no type prefix, body explains why
|
|
Promote glob source and trigger draft on adoption
|
|
|
|
The pattern-analysis worker dropped two signals on every run. ...
|
|
|
|
# GOOD — single-line is fine when the change is self-explanatory
|
|
Fix typo in third-party assessment prompt
|
|
|
|
# BAD — Conventional Commits prefix
|
|
fix(cookie-banner): disconnect observer in load() error path
|
|
|
|
# BAD — Conventional Commits prefix without scope
|
|
feat: add detection for browser-extension frames
|
|
|
|
# BAD — lowercased subject
|
|
promote glob source and trigger draft on adoption
|
|
|
|
# BAD — subject ends with a period
|
|
Promote glob source and trigger draft on adoption.
|
|
|
|
# BAD — past tense / non-imperative subject
|
|
Promoted glob source and triggered draft on adoption
|
|
```
|
|
|
|
## Why no Conventional Commits
|
|
|
|
- The project does not consume the `type(scope):` prefix for tooling (no changelog generator, no semantic-release, no commit-lint).
|
|
- Mixing the two styles in `git log` hurts readability for humans skimming history.
|
|
- The seven-rules style carries strictly more information when written well, because the subject is a real sentence rather than a typed token.
|
|
|
|
If a future need for machine-readable commit types arises, raise it in a separate change that updates [`contrib/claude/commit.md`](../../contrib/claude/commit.md) first, then this rule. Do not start drifting unilaterally.
|
|
|
|
## Related
|
|
|
|
- [`.cursor/rules/git-commit-signing.mdc`](git-commit-signing.mdc) — every commit must be signed with `-s -S`.
|
|
- [`contrib/claude/commit.md`](../../contrib/claude/commit.md) — full commit conventions.
|