.ai/skills/git-conventions/SKILL.md
Source of truth: CONTRIBUTING.md ("Git Conventions") and .commitlintrc.ts.
type[(scope)]: subject
body
fix(core/core): ..., feat(content-manager): ..., chore(deps): .... Use a real package or feature name (admin, content-manager, database, graphql, upload, i18n, deps, commitlint)body-max-line-length rule is disabled)Merge branch '<x>' into <y> are ignored by commitlintThe full enforced list comes from .commitlintrc.ts:
| Type | Use for |
|---|---|
feat | A new feature |
fix | A bug fix |
enhancement | Improvement to an existing feature (perf, refactor, UX polish) |
chore | Internal cleanup, tooling, refactor with no behavior change, dep bumps |
docs | Documentation only |
test | Adding or updating tests |
ci | CI/CD pipeline changes |
security | Security fixes or hardening (often security(deps): ...) |
revert | Reverting a previous commit |
release | Release commits (reserved for release tooling) |
future | Work behind a future flag |
Types not in the list (and therefore rejected by commitlint): perf, refactor, style, build, improvement, wip.
Note:
refactorandperfare rejected as type prefixes, but the underlying work is still valid — route it throughenhancement(when it improves the product/feature) orchore(when it's internal housekeeping with no product change). See the Decision Guide below.
The subject summarises what the commit is about, not how the code achieves it.
Prefer a scope: type(scope): subject (e.g. fix(core/core): xxx). The scope points at the package or feature area touched and keeps the history easy to filter.
feat(scope): <what the feature is>fix(scope): <what the problem is> — describe the bug, not the fixchore(scope): <what the PR is about>docs(scope): <what is documented>⚠️ For
fixcommits, the subject must describe the bug being fixed, not the solution. e.g.fix: unable to publish documents due to missing permissions— notfix: add permission check.
featfix (describe the bug)enhancementchore (use chore(deps): ... for dep bumps)docstestcisecurityfuture