commit-message-creator
Generate standards-compliant commit messages following Conventional Commits with emojis. Use this when creating commits, reviewing commit messages, or ensuring consistent commit history.
SKILL.md
Full skill instructions
Commit Message Creator
This skill guides agents in creating clear, standards-compliant commit messages that follow the Conventional Commits specification with meaningful emojis.
When to Use This Skill
Use this skill when:
- Creating a commit message for code changes
- Reviewing or improving existing commit messages
- Asked to "commit", "write a commit message", or "create a commit"
- Ensuring consistent commit history
- Generating release notes from commits
- Following semantic versioning practices
Prerequisites
- Understanding of the code changes being committed
- Knowledge of related issue numbers or tickets
- Familiarity with the project's scope naming conventions
- Git repository with staged changes
Instructions
1. Identify the Commit Type
Choose the appropriate type with emoji:
| Type | Emoji | Use When |
|---|---|---|
| feat | ✨ | Adding a new feature for users |
| fix | 🐛 | Fixing a bug for users |
| docs | 📚 | Documentation only changes |
| style | 💎 | Code style/formatting (no functional change) |
| refactor | ♻️ | Code change that neither fixes a bug nor adds a feature |
| perf | 🚀 | Performance improvements |
| test | ✅ | Adding or updating tests |
| build | 🔧 | Build system or dependency changes |
| ci | 👷 | CI/CD configuration changes |
| chore | 🔨 | Other changes (tooling, etc.) |
| revert | ⏪ | Reverting a previous commit |
2. Determine the Scope (Optional but Recommended)
Add contextual scope in parentheses:
For this project (nomos-provider-terraform-remote-state):
provider- gRPC provider service implementationbackend- Backend implementations (local, Azure, etc.)state- State parsing and handling logicconfig- Configuration managementdeps- Dependency updatesspec- Specification/documentation in specs/ folderapi- gRPC API contract changes
General common scopes:
auth- Authenticationapi- API endpointsui- User interfacedb- Databasecore- Core functionality
3. Write the Description
Follow these rules:
-
Use imperative, present tense
- ✅ "add feature" NOT "added feature" or "adds feature"
- Think: "This commit will..."
-
Don't capitalize first letter
- ✅ "add two-factor authentication"
- ❌ "Add two-factor authentication"
-
No period at the end
- ✅ "fix race condition in user updates"
- ❌ "fix race condition in user updates."
-
Maximum 72 characters
- Keep it concise and scannable
-
Be specific and descriptive
- ✅ "prevent race condition in user updates"
- ❌ "fix bug"
4. Add Body (When Needed)
Include a body when:
- The change requires explanation beyond the subject
- You need to explain the "why" not the "what"
- Multiple related changes need listing
- Context is important for future maintainers
Body formatting:
- Separate from subject with a blank line
- Wrap at 72 characters
- Use bullet points for multiple items
- Explain what and why, not how
5. Add Footer (When Appropriate)
Include footer for:
Issue references:
Fixes #123
Closes #456, #789
Refs #999
Breaking changes:
BREAKING CHANGE: The /auth/login endpoint now requires email
instead of username. Update all API clients accordingly.
Co-authors:
Co-authored-by: Name <[email protected]>
6. Construct the Complete Message
Format:
<emoji> <type>[optional scope]: <description>
[optional body]
[optional footer]
Examples
Simple Feature
✨ feat(backend): add Azure Blob Storage backend support
Implements Azure backend for remote state storage using
Azure Storage SDK. Supports authentication via environment
variables following Azure standard patterns.
Closes #42
Bug Fix
🐛 fix(state): prevent panic on malformed state files
Add validation for state format version before parsing.
Return proper error instead of panicking when state file
is corrupted or has unsupported version.
Fixes #156
Documentation
📚 docs: update quickstart with Azure backend example
Add step-by-step guide for configuring Azure backend
including required environment variables and permissions.
Refactoring
♻️ refactor(provider): extract port discovery to separate function
Move port printing logic into dedicated function for
better testability and separation of concerns.
Performance
🚀 perf(state): optimize output parsing with lazy evaluation
Defer parsing of nested module outputs until accessed.
Reduces memory usage by 60% for large state files.
Tests
✅ test(backend): add integration tests for local backend
Cover file reading, missing file handling, and workspace
selection. Tests use temporary directories for isolation.
Build/Dependencies
🔧 build(deps): upgrade go to 1.25
Update go.mod and CI workflows to use Go 1.25.
Required for new generics features in state parser.
CI Changes
👷 ci: add race detection to test workflow
Run all tests with -race flag to catch concurrency issues.
Increases test time but catches critical bugs.
Breaking Change
✨ feat(api): change GetOutput to return typed values
BREAKING CHANGE: GetOutput now returns Value message with
type information instead of raw strings. Clients must
handle new Value structure.
Migration: Replace response.value with response.value.string_value
for string outputs. See migration guide in docs/.
Closes #234
Multiple Issues
🐛 fix(provider): resolve gRPC error handling issues
- Return proper gRPC status codes for all error cases
- Add NotFound for missing outputs
- Use InvalidArgument for configuration errors
Fixes #123, #124, #125
Revert
⏪ revert: "feat(backend): add S3 backend support"
This reverts commit abc123def456.
S3 backend implementation caused memory leaks in
long-running processes. Needs redesign before merge.
Refs #999
Best Practices
Do's ✅
- Use emoji prefix for visual context
- Keep subject line under 72 characters
- Use imperative mood ("add" not "added")
- Reference related issues/PRs
- Group related changes in single commit when logical
- Write for future maintainers
- Capitalize proper nouns (OAuth, HTTP, API, gRPC)
- Be specific about what changed and why
Don'ts ❌
- Don't use vague messages ("fix bug", "update code")
- Don't commit multiple unrelated changes together
- Don't use past tense ("fixed", "added")
- Don't capitalize first letter of description
- Don't add period at end of subject
- Don't forget to reference issues
- Don't commit directly to main branch
- Don't include debugging code or commented code
Semantic Versioning Impact
Your commit type affects version bumps:
- feat → Minor version (0.1.0 → 0.2.0)
- fix → Patch version (0.1.0 → 0.1.1)
- BREAKING CHANGE → Major version (0.1.0 → 1.0.0)
Git Workflow
# Stage your changes
git add <files>
# Commit with proper message
git commit -m "✨ feat(provider): add Azure backend support"
# For messages with body and footer, use editor
git commit
# Then write full message following format
Validation
Check your commit message:
- Emoji and type are correct
- Scope is appropriate (if used)
- Description uses imperative mood
- Description is lowercase
- No period at end of subject
- Subject is under 72 characters
- Body explains "why" not "how" (if present)
- Issue references included (if applicable)
- Breaking changes documented (if applicable)
Enforcement
Use commitlint for automated validation:
# Install
npm install --save-dev @commitlint/{config-conventional,cli}
# Configure .commitlintrc.json
{
"extends": ["@commitlint/config-conventional"],
"rules": {
"type-enum": [2, "always", [
"feat", "fix", "docs", "style", "refactor",
"perf", "test", "build", "ci", "chore", "revert"
]]
}
}
# Add to husky pre-commit hook
npx husky add .husky/commit-msg 'npx --no -- commitlint --edit "$1"'
Troubleshooting
Issue: Commit message too long Solution: Move details to body, keep subject focused and under 72 chars
Issue: Unsure which type to use Solution: Use "feat" for user-facing changes, "refactor" for internal improvements
Issue: Multiple unrelated changes Solution: Split into separate commits - one logical change per commit
Issue: Forgot issue number
Solution: Use git commit --amend to update message
