Terse, conventional commit messages that prioritize reasoning over description.
Enforces Conventional Commits format with type, optional scope, and imperative subject lines capped at 50 characters Omits body text when the diff is self-explanatory; includes it only for non-obvious reasoning, breaking changes, migrations, and issue references Strips noise like "This commit does", first-person language, file name repetition, and AI attribution Triggers on user commands like "write a commit", "commit message", or /caveman-commit , or auto-activates when staging changes Generates message only; does not execute git commands or stage files
Similar popular skills
Related neighbors and high-traction skills in the same topics — useful to compare before installing.
This skill is a safe utility for generating concise commit messages. It contains no code or external dependencies and explicitly prevents the agent from performing git operations.
snykLOW
Analyzed May 11, 2026
No issues detected.
socketScore 0.9000 · 0 alerts
Analyzed May 11, 2026
license1
maintenance1
quality0.9
supply chain1
vulnerability1
0 alerts
Also in this package
Other skills from juliusbrussee/caveman · top by installs.
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
❌ "feat: add a new endpoint to get user profile information from the database"
✅
``` feat(api): add GET /users/:id/profile
Mobile client needs profile data without the full user payload to reduce LTE bandwidth on cold-launch screens.
Closes #128 ```
Diff: breaking API change
✅
``` feat(api)!: rename /v1/orders to /v1/checkout
BREAKING CHANGE: clients on /v1/orders must migrate to /v1/checkout before 2026-06-01. Old route returns 410 after that date. ```
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.