Claude-skill-registry commit-validator
Validates commit messages against Conventional Commits specification using programmatic validation. Replaces the git-conventional-commit-messages text file with a tool that provides instant feedback.
git clone https://github.com/majiayu000/claude-skill-registry
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/commit-validator" ~/.claude/skills/majiayu000-claude-skill-registry-commit-validator && rm -rf "$T"
skills/data/commit-validator/SKILL.mdStep 1: Validate Commit Message
Validate a commit message string against Conventional Commits format:
Format:
<type>(<scope>): <subject>
Types:
: A new featurefeat
: A bug fixfix
: Documentation only changesdocs
: Code style changes (formatting, etc.)style
: Code refactoringrefactor
: Performance improvementsperf
: Adding or updating teststest
: Maintenance taskschore
: CI/CD changesci
: Build system changesbuild
: Reverting a previous commitrevert
Validation Rules:
- Must start with type (required)
- Scope is optional (in parentheses)
- Subject is required (after colon and space)
- Use imperative, present tense ("add" not "added")
- Don't capitalize first letter
- No period at end
- Can include body and footer (separated by blank line) </execution_process> </instructions>
Use this regex pattern for validation:
const CONVENTIONAL_COMMIT_REGEX = /^(feat|fix|docs|style|refactor|perf|test|chore|ci|build|revert)(\(.+\))?: .{1,72}/; function validateCommitMessage(message) { const lines = message.trim().split('\n'); const header = lines[0]; // Check format if (!CONVENTIONAL_COMMIT_REGEX.test(header)) { return { valid: false, error: 'Commit message does not follow Conventional Commits format', }; } // Check length if (header.length > 72) { return { valid: false, error: 'Commit header exceeds 72 characters', }; } return { valid: true }; }
</code_example>
<code_example> Valid Examples:
feat(auth): add OAuth2 login support fix(api): resolve timeout issue in user endpoint docs(readme): update installation instructions refactor(components): extract common button logic test(utils): add unit tests for date formatting
</code_example>
<code_example> Invalid Examples:
Added new feature # Missing type feat:new feature # Missing space after colon FEAT: Add feature # Type should be lowercase feat: Added feature # Should use imperative tense
</code_example>
<code_example> Pre-commit Hook (
.git/hooks/pre-commit):
#!/bin/bash commit_msg=$(git log -1 --pretty=%B) if ! node .claude/tools/validate-commit.mjs "$commit_msg"; then echo "Commit message validation failed" exit 1 fi
</code_example>
<code_example> CI/CD Integration:
# .github/workflows/validate-commits.yml - name: Validate commit messages run: | git log origin/main..HEAD --pretty=%B | while read msg; do node .claude/tools/validate-commit.mjs "$msg" || exit 1 done
</code_example> </examples>
<examples> <formatting_example> **Output Format**Returns structured validation result:
{ "valid": true, "type": "feat", "scope": "auth", "subject": "add OAuth2 login support", "warnings": [] }
Or for invalid messages:
{ "valid": false, "error": "Commit message does not follow Conventional Commits format", "suggestions": [ "Use format: <type>(<scope>): <subject>", "Valid types: feat, fix, docs, style, refactor, perf, test, chore, ci, build, revert" ] }
</formatting_example> </examples>
<examples> <usage_example> **Example Commands**:# Validate a commit message node .claude/tools/validate-commit.mjs "feat(auth): implement jwt login" # Validate from stdin (e.g. in a hook) echo "fix: incorrect variable name" | node .claude/tools/validate-commit.mjs
</usage_example> </examples>
<instructions> <best_practices> 1. **Validate Early**: Check commit messages before pushing 2. **Provide Feedback**: Show clear error messages with suggestions 3. **Enforce in CI**: Add validation to CI/CD pipelines 4. **Team Training**: Educate team on Conventional Commits format 5. **Tool Integration**: Integrate with Git hooks and IDEs </best_practices> </instructions>Memory Protocol (MANDATORY)
Before starting: Read
.claude/context/memory/learnings.md
After completing:
- New pattern ->
.claude/context/memory/learnings.md - Issue found ->
.claude/context/memory/issues.md - Decision made ->
.claude/context/memory/decisions.md
ASSUME INTERRUPTION: If it's not in memory, it didn't happen.