Generates conventional-commit messages from staged changes: type prefix + English imperative subject (≤50 chars) + optional body explaining why. Use when the user asks to write, generate, or polish a git commit message.
Start a fresh conversation. Replace the highlighted placeholders.
Use git-commit-message to inspect [staged changes] and provide one ready-to-run conventional-commit command with an imperative subject and a why-focused body; ask for intent if the diff does not establish it.
Required inputs
[staged changes]
User-approved starter prompt based on a pinned source version; check current skill requirements before running. Task evidence ↗
SKILL.md
name: git-commit-messagedescription: "Generates conventional-commit messages from staged changes: type prefix + English imperative subject (≤50 chars) + optional body explaining why. Use when the user asks to write, generate, or polish a git commit message."category: developmentrisk: safesource: https://github.com/alapha888/agent-skills-ensource_repo: alapha888/agent-skills-ensource_type: communitydate_added: "2026-10-01"author: alapha888tags: [git, commit-messages, conventional-commits]tools: [claude, cursor, gemini, codex]license: MITlicense_source: https://github.com/alapha888/agent-skills-en/blob/main/LICENSE
Git Commit Message Generation
Generate a commit message from the actual staged changes (git diff --cached). The message must let a reader know "what changed and why" without opening the diff.
When to Use
Use when the user asks to write, generate, or polish a git commit message.
Use when staged changes need a conventional-commit message with a why-focused body.
Workflow
Look at the changes: run git status --short, git diff --cached --stat, and git diff --cached to confirm there is something staged. If staging is empty, use an explicitly supplied diff or change description when available and label that evidence; otherwise request the intended changes. Do not stage files implicitly.
Pick a type: choose exactly one type prefix based on the changes (if one commit mixes types, ask the user to split it):
feat: new feature
fix: bug fix
docs: documentation only
refactor: refactor (behavior unchanged)
test: add or change tests
chore: build, dependencies, misc
Write the subject: format type: English imperative phrase, ≤50 characters. Start with a verb: "Add…", "Fix…", "Remove…", "Unify…". Ban empty subjects like "update code", "some changes", "fix bug".
Write the body (optional but recommended): 1–3 lines explaining why, not a play-by-play of how. Bug fixes must state the trigger conditions; features should describe the user-visible change.
Output: return the message in the format requested. If supplying a shell command, quote it safely: commit text containing $(), backticks, or quotes must not execute as shell code. For a multiline message prefer writing it verbatim to a temporary file and using git commit -F <message-file>.
Rules
The subject is for skimmers; the body is for future-you in three months. Keep the two jobs separate.
A change mixing a feature and a refactor should become two commits, not one feat that papers over the mess.
No meta-commentary in the message ("generated by AI", etc.) — the message is about the change, nothing else.
Minimal example (runnable)
# 1. Look at the changes first
git status --short
git diff --cached --stat
# 2. Suppose the change: added CAPTCHA verification to the login endpoint
# Generated commit:
git commit -m "feat: add CAPTCHA verification to login endpoint" -m "Blocks automated credential stuffing; CAPTCHA valid 5 minutes, account locks 10 minutes after 3 failures."
Another example (bug fixes must state trigger conditions):
git commit -m "fix: keep order-list filters across pagination" -m "Trigger: filter first, then turn the page. Cause: page turns dropped the query params."
Limitations
Only writes the message. Staging, splitting, committing and pushing remain the user's decision, and the skill never runs git commit on its own.
The 50-character subject and imperative-mood conventions are the common default; repositories with their own commit convention (Gitmoji, Jira prefixes, project overrides) take precedence over this skill.
It reads the staged diff, so it cannot describe intent that the diff alone does not show. When the "why" is not inferable, the skill asks instead of inventing it.
Generated or vendored changes (lockfiles, minified output) are summarized collectively rather than listed line by line.
Anti-patterns
❌ Writing a message for an empty staging area: no git diff --cached, no commit message.
❌ Catch-all chore: labeling every feat and fix as chore until the type system means nothing.
❌ Novel-length subjects: feat: add a really useful feature that greatly improves the user experience — the subject says what, leave praise to the user.
❌ Body as implementation log: "first changed line 20 of a.py, then b.py…" — the diff already shows that; the body explains why.