Write commit messages terse and exact. Conventional Commits format. No fluff. Why over what.
Rules
Subject line:
<type>(<scope>): <imperative summary> — <scope> optional
- Types:
feat, fix, refactor, perf, docs, test, chore, build, ci, style, revert
- Imperative mood: "add", "fix", "remove" — not "added", "adds", "adding"
- ≤50 chars when possible, hard cap 72
- No trailing period
- Match project convention for capitalization after the colon
Body (only if needed):
- Skip entirely when subject is self-explanatory
- Add body only for: non-obvious why, breaking changes, migration notes, linked issues
- Wrap at 72 chars
- Bullets
- not *
- Reference issues/PRs at end:
Closes #42, Refs #17
What NEVER goes in:
- "This commit does X", "I", "we", "now", "currently" — the diff says what
- "As requested by..." — use Co-authored-by trailer
- "Generated with Claude Code" or any AI attribution — unless the user's own rule requires an
Assisted-by/AI-attribution trailer, then add it as a trailer
- Emoji (unless project convention requires)
- Restating the file name when scope already says it
Examples
Diff: new endpoint for user profile with body explaining the why
Diff: breaking API change
Auto-Clarity
Always include body for: breaking changes, security fixes, data migrations, anything reverting a prior commit. Never compress these into subject-only — future debuggers need the context.
Boundaries
Only generates the commit message. Does not run git commit, does not stage files, does not amend. Output the message as a code block ready to paste. "stop caveman-commit" or "normal mode": revert to verbose commit style.
Source: JuliusBrussee/caveman → skills/caveman-commit/SKILL.md
1---2name: caveman-commit3description: > Ultra-compressed commit message generator. Cuts noise from commit messages while preserving intent and reasoning. Conventional Commits format. Subject ≤50 chars, body only when "why" isn't obvious. Use when user says "write a commit", "commit message", "generate commit", "/commit", or invokes /caveman-commit. Auto-triggers when staging changes.4---5
6
7Write commit messages terse and exact. Conventional Commits format. No fluff. Why over what.
8
9## Rules
10
11**Subject line:**
12- `<type>(<scope>): <imperative summary>` — `<scope>` optional
13- Types: `feat`, `fix`, `refactor`, `perf`, `docs`, `test`, `chore`, `build`, `ci`, `style`, `revert`
14- Imperative mood: "add", "fix", "remove" — not "added", "adds", "adding"
15- ≤50 chars when possible, hard cap 72
16- No trailing period
17- Match project convention for capitalization after the colon
18
19**Body (only if needed):**
20- Skip entirely when subject is self-explanatory
21- Add body only for: non-obvious *why*, breaking changes, migration notes, linked issues
22- Wrap at 72 chars
23- Bullets `-` not `*`
24- Reference issues/PRs at end: `Closes #42`, `Refs #17`
25
26**What NEVER goes in:**
27- "This commit does X", "I", "we", "now", "currently" — the diff says what
28- "As requested by..." — use Co-authored-by trailer
29- "Generated with Claude Code" or any AI attribution — unless the user's own rule requires an `Assisted-by`/AI-attribution trailer, then add it as a trailer
30- Emoji (unless project convention requires)
31- Restating the file name when scope already says it
32
33## Examples
34
35Diff: new endpoint for user profile with body explaining the why
36- ❌ "feat: add a new endpoint to get user profile information from the database"
37- ✅
38 ```
39 feat(api): add GET /users/:id/profile
40
41 Mobile client needs profile data without the full user payload
42 to reduce LTE bandwidth on cold-launch screens.
43
44 Closes #128
45 ```
46
47Diff: breaking API change
48- ✅
49 ```
50 feat(api)!: rename /v1/orders to /v1/checkout
51
52 BREAKING CHANGE: clients on /v1/orders must migrate to /v1/checkout
53 before 2026-06-01. Old route returns 410 after that date.
54 ```
55
56## Auto-Clarity
57
58Always include body for: breaking changes, security fixes, data migrations, anything reverting a prior commit. Never compress these into subject-only — future debuggers need the context.
59
60## Boundaries
61
62Only generates the commit message. Does not run `git commit`, does not stage files, does not amend. Output the message as a code block ready to paste. "stop caveman-commit" or "normal mode": revert to verbose commit style.
63
64---
65
66**Source:** [`JuliusBrussee/caveman`](https://github.com/JuliusBrussee/caveman) → `skills/caveman-commit/SKILL.md`