Openclacky commit
Smart Git commit helper that analyzes changes and creates semantic commits
git clone https://github.com/clacky-ai/openclacky
T=$(mktemp -d) && git clone --depth=1 https://github.com/clacky-ai/openclacky "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.clacky/skills/commit" ~/.claude/skills/clacky-ai-openclacky-commit && rm -rf "$T"
.clacky/skills/commit/SKILL.mdSmart Commit Skill
This skill helps users create well-structured, semantic git commits by analyzing changes and suggesting appropriate commit messages.
CRITICAL REQUIREMENT: SINGLE-LINE COMMITS ONLY
ALL commit messages created by this skill MUST be single-line only.
- DO:
git commit -m "feat: add user authentication" - DON'T: Multi-line commits with body text
- DON'T: Multiple
flags-m - DON'T: Commit messages with
or additional paragraphs\n
Keep commits concise and focused. If more detail is needed, suggest adding it separately in PR descriptions or documentation.
Overview
This skill automates the process of reviewing git changes and creating meaningful, conventional commits following the semantic commit format (feat/fix/chore/test).
Core Philosophy
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:
- Understand what the developer is trying to achieve
- Group all related changes into meaningful, purpose-driven commits
- Prefer fewer, cohesive commits over many fragmented ones
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.
Usage
To use this skill, simply say:
- "Help me commit my changes"
- "Create semantic commits"
- "Review and commit changes"
- Use the command:
/commit
Process Steps
1. Analyze Git Status
First, check the current git status to understand:
- What files have been modified, added, or deleted
- Which files are staged vs unstaged
- Overall state of the working directory
git status git diff --stat
2. HOLISTIC ANALYSIS - Understand the Overall Purpose
CRITICAL: Before diving into file-by-file analysis, step back and ask:
- What is the developer trying to achieve overall? (e.g., "Add authentication feature", "Fix login bugs", "Refactor database layer")
- Is there a common theme or goal across these changes?
- Can multiple changes be explained by a single higher-level purpose?
Think strategically, not tactically:
- BAD: "Changed auth.rb, changed user.rb, changed session.rb" -> 3 separate commits
- GOOD: "These are all part of implementing user authentication" -> 1 commit
Review ALL changes together first:
# Get overview of all changes git diff --stat git diff
Look for patterns:
- Do multiple files serve the same feature?
- Are there related bug fixes across files?
- Is there a refactoring that touches multiple files?
- Are tests accompanying their implementation?
3. Review Changes in Detail
Now examine each file to understand specifics:
- The nature of changes (new feature, bug fix, refactoring, tests, documentation)
- How it connects to the overall purpose identified in step 2
- Whether it's part of the main change or a separate concern
git diff <file>
4. INTELLIGENT GROUPING - Merge Similar Changes
CRITICAL PRINCIPLE: Prefer fewer, meaningful commits over many small commits
Grouping Strategy:
-
Same Feature/Purpose = One Commit
- All files contributing to the same feature should be in ONE commit
- Tests for a feature belong with the feature implementation
- Related configuration changes belong with the feature
-
Ask: "Would I explain these separately in a code review?"
- If you'd say "I added X, Y, and Z as part of feature F" -> ONE commit
- If you'd say "I added X, and separately I fixed Y" -> TWO commits
-
Look for these grouping opportunities:
- Feature + Tests: Always together
- Implementation across multiple files: One commit if same feature
- Bug fix + Test: Together if addressing same issue
- Refactoring across modules: One commit if same refactoring goal
- Documentation + Code: Together if documenting the same change
- Configuration + Code: Together if config is required for the code
-
Only split when:
- Changes serve genuinely different purposes
- Mixing would make the commit unclear or too broad
- One change is risky and should be isolated
- Different semantic types that shouldn't mix (feat vs fix vs chore)
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.rb
BAD - 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.rb
Decision 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 combined
5. Generate Commit Messages
Based on the holistic analysis, generate commit messages following the conventional commit format:
Format:
<type>: <description>
Types:
: New features or functionalityfeat
: Bug fixesfix
: Routine tasks, maintenance, dependencieschore
: Adding or modifying tests (only if standalone)test
: Documentation changes (only if standalone)docs
: Code refactoring without changing functionalityrefactor
: Code style changes (formatting, whitespace)style
: Performance improvementsperf
CRITICAL GUIDELINES:
- MUST BE SINGLE-LINE: Commit messages MUST be a single line only. DO NOT create multi-line commit messages.
- Keep messages concise (ideally under 50 characters)
- Use imperative mood ("add feature" not "added feature")
- Don't end with a period
- Be specific but brief
- One logical PURPOSE per commit (not one file per commit)
- Describe the overall goal, not implementation details
- If more detail is needed, suggest adding it in PR description or commit body separately, but the initial commit MUST be single-line
Examples:
(not "add authenticator.rb, user.rb, session.rb")feat: add user authentication
(not "fix auth.rb timeout")fix: resolve login timeout issues
(not separate commits for each gem)chore: update dependencies
(not one commit per file)refactor: simplify database connection logic
(only if pure documentation change)docs: update API documentation
6. Execute Commits Immediately
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:
- Use ONLY
formatgit commit -m "single line message" - DO NOT use multi-line commits with additional body text
- DO NOT use
flag multiple times-m - Keep the commit message as a single, concise line
7. Final Summary
After all commits, show:
- Total number of commits created
- Each commit hash + message
- Suggest next steps (e.g., git push)
Commands Used
# 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 5
Workflow Example
BAD 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'
Best Practices
Commit Message Rules
- MUST be single-line only - Never use multi-line commit messages
- Start with lowercase (except proper nouns)
- Use present tense imperative
- Be specific but concise
- Focus on "what" and "why", not "how"
- Maximum 72 characters for the single line
Commit Organization - THINK PURPOSE, NOT FILES
GOLDEN RULE: One logical PURPOSE per commit, not one FILE per commit
When to COMBINE Changes (Default Approach)
- Feature implementation + its tests (ALWAYS together)
- Multiple files serving the same feature (one commit)
- Bug fix + its test (ALWAYS together)
- Code + required configuration (together if config enables the code)
- Refactoring across multiple files (one commit if same refactoring goal)
- Documentation + code it documents (together if part of same change)
- Related files in same module/feature (one commit)
When to SPLIT Commits (Exception Cases)
- Truly different purposes: e.g., "add feature X" vs "fix bug Y"
- Different semantic types: feat vs fix vs chore (usually)
- Risky changes: isolate if one change is experimental
- Independent concerns: changes that could be deployed separately
- Too broad scope: if one commit does too many unrelated things
Anti-Patterns to Avoid
- NEVER split implementation and tests into separate commits
- NEVER create one commit per file unless files are truly independent
- NEVER split configuration from the code that requires it
- NEVER fragment a feature into multiple commits just because it touches multiple files
Decision Framework
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)
Error Handling
- No changes detected: Inform user and exit gracefully
- Merge conflicts: Warn user to resolve conflicts first
- Detached HEAD: Alert user about repository state
- Uncommitted changes during conflict: Suggest stashing or committing
- Empty commit message: Request user input for clarification
Safety Features
- Always review changes before committing (read diffs first)
- Execute commits immediately after analysis — no confirmation step
- Preserve git history integrity
Integration with Workflow
This skill works best:
- After completing a feature or fix
- Before pushing to remote
- During code review preparation
- When cleaning up messy commit history (use with
first)git reset
Notes
- This skill does NOT push commits (user controls when to push)
- Follows conventional commits specification
- Encourages atomic, well-documented commits
- Helps maintain clean git history
- Useful for both beginners and experienced developers
Dependencies
- Git installed and configured
- Working directory is a git repository
- User has permissions to commit
- Changes exist to commit
Version History
- Created: 2025-02-01
- Purpose: Improve commit quality and development workflow
- Compatible with: Any git repository