Write, format, and review conventional commit messages following the Conventional Commits 1.0.0 spec and this project's house rules. Use this skill whenever the user asks you to write a commit message, format or fix a commit message, check whether a commit message is valid, explain the commit convention, suggest a type or scope, or describe what changes to make before committing. Trigger even when the user doesn't say "conventional commits" explicitly — phrases like "how should I word this commit", "what type is this", "write a commit for", "is this commit message ok", or just pasting a raw description and asking for a commit all count.
Help the user produce correct, clear conventional commit messages for this
project. You should write the message, explain your choices, and flag
anything that needs the user's input (e.g. the right scope word, whether a
change is breaking).
The header (first line) is required. Body and footers are optional, each
separated from the previous section by one blank line.
Allowed types
Type
Use it when…
SemVer
feat
a new user-facing feature or capability is added
MINOR
fix
a bug is fixed (a reproducing test would now pass)
PATCH
refactor
internal code change with zero behavior change
—
docs
documentation only (README, comments, guides, ADRs)
—
test
tests added or updated, no src changes
—
chore
catch-all: dep bumps, build config, CI, formatting, tooling
—
Pick the type that describes the primary intent. When in doubt, prefer
the more specific type — e.g. refactor over chore for internal rewrites.
Header rules
Type must be one of the six above.
Scope (optional) is a short lowercase noun in parentheses:
fix(auth): …, feat(api): …. Use a stable area-of-the-codebase noun.
Don't use issue IDs as scopes.
Description: imperative present tense ("add", not "added" / "adds"),
lowercase first letter, no trailing period, ≤ 72 characters total header.
Read it as "This commit will…"
Breaking changes
Mark breaking changes (consumers must change code/config/env) in either or
both of these ways:
Append ! after the type/scope: feat(api)!: …
Add a BREAKING CHANGE: footer (the one token allowed to contain a space):
BREAKING CHANGE: <what changed and what callers must do>
Breaking changes map to a MAJOR SemVer bump.
Body (optional)
Use the body to explain what and why — not how (the diff shows how).
Separate from the header with exactly one blank line.
Wrap at 72 characters per line.
Imperative present tense.
Issue references belong in the footer, not here.
Footer (optional)
Each footer is Token: value (use - instead of spaces in tokens).
Common footers:
Refs: #123 — related issue
Closes: #123 — closes the issue on merge
Co-authored-by: Name <email>
BREAKING CHANGE: <description>
Merge and revert commits — the one exception
These are the only commits that do NOT use the type: prefix:
Merges: keep Git's raw default subject exactly as generated (e.g.
Merge branch 'feature/x' into main). Add a body only when the merge
needs explanation (conflict decisions, etc.).
Reverts: keep git revert's default subject (Revert "<original>"),
keep the auto-generated This reverts commit <sha>. body line, then add a
body explaining why the revert was needed.
How to apply this skill
Understand the change. Read what the user describes (or shows you in a
diff / list of changes). Identify the primary intent, the affected area,
and whether anything breaks for consumers.
Pick the type. Use the table above. If the change spans multiple types,
split it or pick the dominant intent.
Choose a scope (optional). Only add one if it adds real clarity. If the
user hasn't given you a natural scope, ask — or omit it and note that they
can add one.
Write the header. Imperative, lowercase, ≤ 72 chars, no trailing period.
Decide on body/footer. Add a body when the why isn't obvious from the
header. Add footers for issue refs and breaking changes.
Show your work briefly. After presenting the commit message, explain in
one or two sentences why you chose the type (and scope, if used). This helps
the user learn the convention and spot if you misunderstood the change.
Flag uncertainty. If you're unsure about the type or scope, say so and
offer alternatives.
Examples
Minimal:
fix: prevent crash on empty config file
With scope:
feat(billing): add monthly invoice export
With body and footer:
refactor(auth): extract token validation into its own module
The validation logic was duplicated across the login and refresh
handlers. Centralizing it keeps the two paths in sync and makes
future changes (e.g. adding JWKS rotation) a single edit.
Refs: #482
Breaking change:
feat(api)!: require API key on all public endpoints
BREAKING CHANGE: requests without an `X-API-Key` header now
receive 401. See docs/migration-2026-05.md for migration steps.
Closes: #517
Revert:
Revert "feat(billing): add monthly invoice export"
This reverts commit 3f9a1c2e.
The export job locks the invoices table for ~30s under load,
causing checkout timeouts (incident #INC-204). Reverting while
we move the export to a read replica.
Refs: #INC-204
Quick checklist (verify before presenting)
Type is one of: feat, fix, refactor, docs, test, chore
(or raw Git default for merges/reverts)
Header ≤ 72 chars, imperative, lowercase first letter, no trailing period
Scope (if used) is a short lowercase noun in parentheses
Breaking changes marked with ! and/or BREAKING CHANGE: footer
Body (if present) separated by a blank line, wrapped at 72 cols
Issue refs in the footer, not the description or body
1---2name: conventional-commits3description: Write, format, and review conventional commit messages following the Conventional Commits 1.0.0 spec and this project's house rules. Use this skill whenever the user asks you to write a commit message, format or fix a commit message, check whether a commit message is valid, explain the commit convention, suggest a type or scope, or describe what changes to make before committing. Trigger even when the user doesn't say "conventional commits" explicitly — phrases like "how should I word this commit", "what type is this", "write a commit for", "is this commit message ok", or just pasting a raw description and asking for a commit all count.4license: MIT5---67# Conventional Commits Skill89Help the user produce correct, clear conventional commit messages for this10project. You should write the message, explain your choices, and flag11anything that needs the user's input (e.g. the right scope word, whether a12change is breaking).1314---1516## Message format1718```text19<type>[optional scope][!]: <description>2021[optional body]2223[optional footer(s)]24```2526- The **header** (first line) is required. Body and footers are optional, each27 separated from the previous section by **one blank line**.2829---3031## Allowed types3233| Type | Use it when… | SemVer |34| ---------- | ----------------------------------------------------------- | ------ |35| `feat` | a new user-facing feature or capability is added | MINOR |36| `fix` | a bug is fixed (a reproducing test would now pass) | PATCH |37| `refactor` | internal code change with zero behavior change | — |38| `docs` | documentation only (README, comments, guides, ADRs) | — |39| `test` | tests added or updated, no `src` changes | — |40| `chore` | catch-all: dep bumps, build config, CI, formatting, tooling | — |4142Pick the type that describes the **primary intent**. When in doubt, prefer43the more specific type — e.g. `refactor` over `chore` for internal rewrites.4445---4647## Header rules4849- **Type** must be one of the six above.50- **Scope** (optional) is a short lowercase noun in parentheses:51 `fix(auth): …`, `feat(api): …`. Use a stable area-of-the-codebase noun.52 Don't use issue IDs as scopes.53- **Description**: imperative present tense ("add", not "added" / "adds"),54 lowercase first letter, no trailing period, ≤ 72 characters total header.55 Read it as _"This commit will…"_5657---5859## Breaking changes6061Mark breaking changes (consumers must change code/config/env) in **either or62both** of these ways:63641. Append `!` after the type/scope: `feat(api)!: …`652. Add a `BREAKING CHANGE:` footer (the one token allowed to contain a space):6667 ```text68 BREAKING CHANGE: <what changed and what callers must do>69 ```7071Breaking changes map to a **MAJOR** SemVer bump.7273---7475## Body (optional)7677Use the body to explain **what and why** — not how (the diff shows how).7879- Separate from the header with exactly one blank line.80- Wrap at 72 characters per line.81- Imperative present tense.82- Issue references belong in the footer, not here.8384---8586## Footer (optional)8788Each footer is `Token: value` (use `-` instead of spaces in tokens).8990Common footers:9192- `Refs: #123` — related issue93- `Closes: #123` — closes the issue on merge94- `Co-authored-by: Name <email>`95- `BREAKING CHANGE: <description>`9697---9899## Merge and revert commits — the one exception100101These are the **only** commits that do NOT use the `type:` prefix:102103- **Merges**: keep Git's raw default subject exactly as generated (e.g.104 `Merge branch 'feature/x' into main`). Add a body only when the merge105 needs explanation (conflict decisions, etc.).106- **Reverts**: keep `git revert`'s default subject (`Revert "<original>"`),107 keep the auto-generated `This reverts commit <sha>.` body line, then add a108 body explaining **why** the revert was needed.109110---111112## How to apply this skill1131141. **Understand the change.** Read what the user describes (or shows you in a115 diff / list of changes). Identify the primary intent, the affected area,116 and whether anything breaks for consumers.1171182. **Pick the type.** Use the table above. If the change spans multiple types,119 split it or pick the dominant intent.1201213. **Choose a scope** (optional). Only add one if it adds real clarity. If the122 user hasn't given you a natural scope, ask — or omit it and note that they123 can add one.1241254. **Write the header.** Imperative, lowercase, ≤ 72 chars, no trailing period.1261275. **Decide on body/footer.** Add a body when the _why_ isn't obvious from the128 header. Add footers for issue refs and breaking changes.1291306. **Show your work briefly.** After presenting the commit message, explain in131 one or two sentences why you chose the type (and scope, if used). This helps132 the user learn the convention and spot if you misunderstood the change.1331347. **Flag uncertainty.** If you're unsure about the type or scope, say so and135 offer alternatives.136137---138139## Examples140141**Minimal:**142143```text144fix: prevent crash on empty config file145```146147**With scope:**148149```text150feat(billing): add monthly invoice export151```152153**With body and footer:**154155```text156refactor(auth): extract token validation into its own module157158The validation logic was duplicated across the login and refresh159handlers. Centralizing it keeps the two paths in sync and makes160future changes (e.g. adding JWKS rotation) a single edit.161162Refs: #482163```164165**Breaking change:**166167```text168feat(api)!: require API key on all public endpoints169170BREAKING CHANGE: requests without an `X-API-Key` header now171receive 401. See docs/migration-2026-05.md for migration steps.172173Closes: #517174```175176**Revert:**177178```text179Revert "feat(billing): add monthly invoice export"180181This reverts commit 3f9a1c2e.182183The export job locks the invoices table for ~30s under load,184causing checkout timeouts (incident #INC-204). Reverting while185we move the export to a read replica.186187Refs: #INC-204188```189190---191192## Quick checklist (verify before presenting)193194- [ ] Type is one of: `feat`, `fix`, `refactor`, `docs`, `test`, `chore`195 (or raw Git default for merges/reverts)196- [ ] Header ≤ 72 chars, imperative, lowercase first letter, no trailing period197- [ ] Scope (if used) is a short lowercase noun in parentheses198- [ ] Breaking changes marked with `!` and/or `BREAKING CHANGE:` footer199- [ ] Body (if present) separated by a blank line, wrapped at 72 cols200- [ ] Issue refs in the footer, not the description or body
Run npx skillmds@latest add 46ki75/conventional-commits in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Write, format, and review conventional commit messages following the Conventional Commits 1.0.0 spec and this project's house rules. Use this skill whenever the user asks you to write a commit message, format or fix a commit message, check whether a commit message is valid, explain the commit convention, suggest a type or scope, or describe what changes to make before committing. Trigger even when the user doesn't say "conventional commits" explicitly — phrases like "how should I word this commit", "what type is this", "write a commit for", "is this commit message ok", or just pasting a raw description and asking for a commit all count. It is listed under Docs & Writing on SkillMD.
This skill has not completed SkillMD's automated safety review yet. Capability flags: reads secrets. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free. This skill is licensed under MIT.
46ki75 (@46ki75) published this skill. Their other Agent Skills are listed on their SkillMD profile.