Smart Git commit helper that analyzes changes and creates semantic commits
52
57%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./.clacky/skills/commit/SKILL.mdThis skill helps users create well-structured, semantic git commits by analyzing changes and suggesting appropriate commit messages.
ALL commit messages created by this skill MUST be single-line only.
git commit -m "feat: add user authentication"-m flags\n or additional paragraphsKeep commits concise and focused. If more detail is needed, suggest adding it separately in PR descriptions or documentation.
This skill automates the process of reviewing git changes and creating meaningful, conventional commits following the semantic commit format (feat/fix/chore/test).
THINK IN PURPOSES, NOT FILES
This skill prioritizes understanding the OVERALL GOAL of changes before deciding how to commit them. The default approach is to:
DO NOT commit file-by-file. DO NOT separate tests from implementation. DO NOT fragment features across multiple commits.
Instead, ask: "What story do these changes tell?" and commit accordingly.
To use this skill, simply say:
/commitFirst, check the current git status to understand:
git status
git diff --statCRITICAL: Before diving into file-by-file analysis, step back and ask:
Think strategically, not tactically:
Review ALL changes together first:
# Get overview of all changes
git diff --stat
git diffLook for patterns:
Now examine each file to understand specifics:
git diff <file>CRITICAL PRINCIPLE: Prefer fewer, meaningful commits over many small commits
Grouping Strategy:
Same Feature/Purpose = One Commit
Ask: "Would I explain these separately in a code review?"
Look for these grouping opportunities:
Only split when:
Examples of Good Grouping:
GOOD - Merged into ONE commit:
Commit: feat: add user authentication
- lib/auth/authenticator.rb (new authentication logic)
- lib/user.rb (user model updates)
- lib/session.rb (session management)
- spec/auth/authenticator_spec.rb (tests)
- spec/user_spec.rb (updated tests)
- config/routes.rb (auth routes)GOOD - Different purposes, TWO commits:
Commit 1: feat: add user authentication
- lib/auth/authenticator.rb
- spec/auth/authenticator_spec.rb
Commit 2: fix: resolve database timeout issue
- lib/database/connection.rb
- spec/database/connection_spec.rbBAD - Over-splitting, should be ONE commit:
Commit 1: feat: add authentication logic
- lib/auth/authenticator.rb
Commit 2: feat: update user model for authentication
- lib/user.rb
Commit 3: test: add authentication tests
- spec/auth/authenticator_spec.rb
Commit 4: chore: add authentication routes
- config/routes.rbDecision Tree:
Are changes related to the same goal/feature/purpose?
|-- YES -> Combine into ONE commit
| +-- Even if they touch different files/modules
+-- NO -> Keep as separate commits
+-- Ask: Are they different semantic types (feat/fix/chore)?
|-- YES -> Definitely separate
+-- NO -> Consider if they could still be combinedBased on the holistic analysis, generate commit messages following the conventional commit format:
Format: <type>: <description>
Types:
feat: New features or functionalityfix: Bug fixeschore: Routine tasks, maintenance, dependenciestest: Adding or modifying tests (only if standalone)docs: Documentation changes (only if standalone)refactor: Code refactoring without changing functionalitystyle: Code style changes (formatting, whitespace)perf: Performance improvementsCRITICAL GUIDELINES:
Examples:
feat: add user authentication (not "add authenticator.rb, user.rb, session.rb")fix: resolve login timeout issues (not "fix auth.rb timeout")chore: update dependencies (not separate commits for each gem)refactor: simplify database connection logic (not one commit per file)docs: update API documentation (only if pure documentation change)No confirmation needed — analyze, group, and commit right away.
For each commit group:
# Stage specific files
git add <file1> <file2> ...
# Create commit with SINGLE-LINE message only
git commit -m "<type>: <description>"IMPORTANT:
git commit -m "single line message" format-m flag multiple timesAfter all commits, show:
# Check status
git status
git status --short
# View changes
git diff
git diff --stat
git diff <file>
# Stage files
git add <file>
# Create commit (SINGLE-LINE only)
git commit -m "type: single line description"
# NEVER use multi-line format like:
# git commit -m "title" -m "body" -- DON'T DO THIS
# git commit -m "title\n\nbody" -- DON'T DO THIS
# View commit history
git log --oneline -n 5BAD Example (Over-splitting):
User: /commit
AI (WRONG APPROACH):
Found 5 modified files
Proposed commits:
Commit 1: feat: add user model
- lib/user.rb
Commit 2: test: add user tests
- spec/user_spec.rb
Commit 3: fix: fix auth validation
- lib/auth.rb
Commit 4: test: add auth tests
- spec/auth_spec.rb
Commit 5: chore: update dependencies
- Gemfile
Problem: Too fragmented! Tests separated from code.GOOD Example (Holistic grouping):
User: /commit
AI (CORRECT APPROACH):
1. Analyzing all changes...
Found 5 modified files
2. Identifying overall purpose...
Main goal: Implementing user registration feature
Secondary: Fixing existing auth bug
Maintenance: Dependency updates
3. Holistic analysis:
- lib/user.rb: New user registration feature
- spec/user_spec.rb: Tests for user registration (same feature)
- lib/auth.rb: Fix password validation bug (separate concern)
- spec/auth_spec.rb: Tests for auth fix (same bug fix)
- Gemfile: Updated dependencies (separate maintenance)
4. Proposed commits (grouped by purpose):
Commit 1: feat: add user registration
- lib/user.rb (implementation)
- spec/user_spec.rb (tests)
Reason: Feature and its tests belong together
Commit 2: fix: correct password validation logic
- lib/auth.rb (bug fix)
- spec/auth_spec.rb (tests)
Reason: Fix and its tests belong together
Commit 3: chore: update gem dependencies
- Gemfile
Reason: Unrelated maintenance task
Total: 3 meaningful commits instead of 5 fragmented ones
AI (executes immediately, no confirmation):
Commit 1 created (a1b2c3d): feat: add user registration
Commit 2 created (e4f5g6h): fix: correct password validation logic
Commit 3 created (i7j8k9l): chore: update gem dependencies
Summary: 3 commits created successfully!
Next steps: Review with 'git log' or push with 'git push'GOLDEN RULE: One logical PURPOSE per commit, not one FILE per commit
For each set of changes, ask:
1. "What was I trying to accomplish?" (identify the purpose)
2. "Do these files work together toward that purpose?" (YES -> combine)
3. "Would splitting these make the history harder to understand?" (YES -> combine)
4. "Could these changes be deployed independently?" (NO -> combine)This skill works best:
git reset first)4aea278
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.