name: commit-conventions description: Enforce project-specific Git commit message conventions compatible with commitlint and pre-commit hooks. Use this skill whenever the user asks to write a commit message, create a git commit, stage and commit changes, suggest a commit for their changes, or review/fix an existing commit message. Also trigger when the user says "commitea esto", "hazme un commit", "qué mensaje de commit uso", or any variation of committing code changes.
Commit Conventions
This project enforces strict commit message rules validated by commitlint and a custom pre-commit hook. Every commit message must pass both checks or the commit will be aborted.
Format Rules
Structure
<type>(<scope>): <description>
<scope>is optional but recommended<description>starts after the colon + space- The entire first line must be ≤ 100 characters
- No period at the end of the description
Allowed Types
| Type | Use for |
|---|---|
feat |
New feature or capability |
fix |
Bug fix |
chore |
Maintenance tasks, dependency updates, config |
docs |
Documentation only changes |
test |
Adding or updating tests |
style |
Formatting, missing semicolons (no logic change) |
refactor |
Code restructuring without behavior change |
perf |
Performance improvements |
build |
Build system or tooling changes |
ci |
CI/CD pipeline changes |
revert |
Reverting a previous commit |
Validation Regex (from pre-commit hook)
^(feat|fix|chore|docs|test|style|refactor|perf|build|ci|revert)(\(.+?\))?: .{1,}$
Examples
✅ Valid commits
feat(auth): add JWT refresh token rotation
fix(api): handle null response from payment gateway
chore(deps): upgrade vite to 5.4.0
docs(readme): update local setup instructions
test(cart): add edge cases for empty cart checkout
refactor(user): extract profile validation to separate module
perf(images): lazy load hero images on landing page
build(docker): optimize multi-stage build layers
ci(github): add job to run e2e tests on PR
style(button): fix inconsistent spacing in component
revert: revert "feat(dark-mode): add theme toggle"
❌ Invalid commits (will be rejected by hook)
# Wrong: missing type
updated login page
# Wrong: invalid type
update(auth): fix token expiry
# Wrong: capital letter in type
Fix(api): resolve 500 error
# Wrong: no space after colon
feat(auth):add login page
# Wrong: exceeds 100 characters
feat(user-profile-settings): update the avatar upload component to support multiple image formats including WebP, AVIF, and HEIC
# Wrong: period at the end (bad practice, though not technically blocked)
fix(cart): resolve quantity not updating.
How to Write Good Descriptions
- Use imperative mood: "add", "fix", "update" — not "added", "fixes", "updating"
- Be specific but concise: describe what changed and why if not obvious
- Keep it under 100 characters total (including type and scope)
- Avoid vague terms: "minor changes", "stuff", "wip", "updates"
For complex commits, add a body (optional)
The body goes after a blank line and has no character limit:
feat(payments): integrate Stripe webhook for subscription events
Handle subscription.created, subscription.updated, and
subscription.deleted webhook events. Store raw event payload
for audit trail before processing.
Closes #234
Quick Reference
When generating a commit message:
- Identify the primary change type from the allowed list
- Add scope in parentheses if it targets a specific module/area
- Write a clear imperative description in the same line
- Verify total length is ≤ 100 characters
- If changes are complex, add an optional body after a blank line
For detailed scope naming conventions and multi-package monorepo patterns, see references/scopes.md.