Commit Message Helper A skill for creating properly formatted Git commit messages following the Conventional Commits specification. When This Skill Activates This skill activates when you: - Ask to commit changes - Mention commit messages - Request git commit formatting - Say "commit" or "git commit" Commit Message Format Types | Type | Description | |------|-------------| | | A new feature | | | A bug fix | | | Documentation only changes | | | Changes that do not affect the meaning of the code (formatting, etc.) | | | A code change that neither fixes a bug nor adds a feature | | | A code cha…

\n if not re.match(pattern, subject):\n return False, (\n \"Invalid format. Expected: type(scope)!: subject\\n\"\n \"- Type must be one of: feat, fix, docs, style, refactor, perf, test, chore, ci, build, revert\\n\"\n \"- Subject must be 1-72 characters\\n\"\n \"- Use imperative mood (e.g., 'add feature' not 'added feature')\"\n )\n\n # Check for period at end of subject\n if subject.endswith('.'):\n return False, \"Subject line should not end with a period\"\n\n # Check subject uses imperative mood (basic check)\n words = subject.split(': ', 1)[1].split() if ': ' in subject else []\n if words:\n first_word = words[0].lower()\n # Common past tense indicators\n if first_word.endswith(('ed', 'ing')):\n suggestion = suggest_imperative(first_word)\n return False, f\"Subject should use imperative mood ('{first_word}' -> '{suggestion}')\"\n\n # Validate body format (if present)\n if len(lines) > 1:\n if lines[1].strip(): # No blank line after subject\n return False, \"Separate subject from body with a blank line\"\n\n body = '\\n'.join(lines[2:])\n for line in body.split('\\n'):\n if len(line) > 72:\n return False, f\"Body lines should wrap at 72 characters (found {len(line)})\"\n\n return True, \"Valid commit message format\"\n\n\nif __name__ == \"__main__\":\n if len(sys.argv) \u003c 2:\n print(\"Usage: python validate_commit.py \\\"commit message\\\"\")\n sys.exit(1)\n\n message = sys.argv[1]\n is_valid, result = validate_commit_message(message)\n\n print(result)\n sys.exit(0 if is_valid else 1)\n","content_type":"text/x-python; charset=utf-8","language":"python","size":2750,"content_sha256":"20b428f0affcbf4f29fcce05af9d478b22fc4cf850b9d912f097a243aa0c1757"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Commit Message Helper","type":"text"}]},{"type":"paragraph","content":[{"text":"A skill for creating properly formatted Git commit messages following the ","type":"text"},{"text":"Conventional Commits","type":"text","marks":[{"type":"link","attrs":{"href":"https://www.conventionalcommits.org/","title":null}}]},{"text":" specification.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When This Skill Activates","type":"text"}]},{"type":"paragraph","content":[{"text":"This skill activates when you:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Ask to commit changes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Mention commit messages","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Request git commit formatting","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Say \"commit\" or \"git commit\"","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Commit Message Format","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"\u003ctype>(\u003cscope>): \u003csubject>\n\n\u003cbody>\n\n\u003cfooter>","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Types","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Type","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Description","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"feat","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"A new feature","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"fix","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"A bug fix","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"docs","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Documentation only changes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"style","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Changes that do not affect the meaning of the code (formatting, etc.)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"refactor","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"A code change that neither fixes a bug nor adds a feature","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"perf","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"A code change that improves performance","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"test","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Adding missing tests or correcting existing tests","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"chore","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Changes to the build process or auxiliary tools","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ci","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Changes to CI configuration files and scripts","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"build","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Changes that affect the build system or external dependencies","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Scope","type":"text"}]},{"type":"paragraph","content":[{"text":"The scope should indicate the area of the codebase affected:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For frontend: ","type":"text"},{"text":"components","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"hooks","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"store","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"styles","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"utils","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For backend: ","type":"text"},{"text":"api","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"models","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"services","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"database","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"auth","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For devops: ","type":"text"},{"text":"ci","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"deploy","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"docker","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Project-specific scopes are also acceptable","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Guidelines","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Subject Line","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use imperative mood (\"add feature\" not \"added feature\" or \"adds feature\")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"No period at the end","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Maximum 50 characters","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Be specific and concise","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Body","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Separate subject from body with a blank line","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use the body to explain ","type":"text"},{"text":"what","type":"text","marks":[{"type":"strong"}]},{"text":" and ","type":"text"},{"text":"why","type":"text","marks":[{"type":"strong"}]},{"text":", not ","type":"text"},{"text":"how","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Wrap at 72 characters per line","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Mention any breaking changes","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Footer","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Reference issues: ","type":"text"},{"text":"Closes #123","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"Fixes #456","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"Refs #789","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Multiple issues: ","type":"text"},{"text":"Closes #123, #456, #789","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Breaking changes: Start with ","type":"text"},{"text":"BREAKING CHANGE:","type":"text","marks":[{"type":"code_inline"}]},{"text":" followed by description","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Examples","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Good Examples","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"feat(auth): add OAuth2 login support\n\nImplement OAuth2 authentication flow to allow users to log in\nwith their Google or GitHub accounts.\n\nThis change adds:\n- New OAuth2 middleware for handling callbacks\n- Updated login UI with social login buttons\n- User profile synchronization\n\nCloses #123","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"fix(api): resolve race condition in user creation\n\nThe concurrent user creation requests could result in duplicate\nemail entries. Added unique constraint and proper error handling.\n\nFixes #456","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"refactor(user): simplify profile update logic\n\nExtracted common validation logic into a reusable function\nto reduce code duplication across profile update endpoints.","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"docs: update API documentation with new endpoints\n\nAdded documentation for the v2 user management endpoints\nincluding request/response examples and error codes.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Bad Examples","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"updated stuff # Too vague, no type/scope\nfixed bug # No context about which bug\nfeat: added feature # Redundant (\"feat\" means new feature)\nFeat(User): Add Login # Incorrect capitalization\nfeat: A really really really long subject line that exceeds the recommended limit # Too long","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Breaking Changes","type":"text"}]},{"type":"paragraph","content":[{"text":"When introducing breaking changes, add ","type":"text"},{"text":"BREAKING CHANGE:","type":"text","marks":[{"type":"code_inline"}]},{"text":" to the footer:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"feat(api): migrate to REST v2\n\nThe API endpoints have been restructured for better consistency.\nOld endpoints are deprecated and will be removed in v3.0.\n\nBREAKING CHANGE: `/api/v1/users` is now `/api/v2/users`.\nAll consumers must update their integration by 2025-03-01.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Workflow","type":"text"}]},{"type":"paragraph","content":[{"text":"When writing a commit message:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Review changes","type":"text","marks":[{"type":"strong"}]},{"text":" - Run ","type":"text"},{"text":"git diff","type":"text","marks":[{"type":"code_inline"}]},{"text":" to understand what changed","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Identify type","type":"text","marks":[{"type":"strong"}]},{"text":" - Determine the type of change","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Identify scope","type":"text","marks":[{"type":"strong"}]},{"text":" - Determine which area is affected","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Write subject","type":"text","marks":[{"type":"strong"}]},{"text":" - Create a clear, concise subject line","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Write body","type":"text","marks":[{"type":"strong"}]},{"text":" - Explain what and why (if needed)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add footer","type":"text","marks":[{"type":"strong"}]},{"text":" - Reference issues or note breaking changes","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Validation","type":"text"}]},{"type":"paragraph","content":[{"text":"Use the validation script to check commit message format:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 scripts/validate_commit.py \"feat(scope): add behavior\"","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Reference Documents","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"See ","type":"text"},{"text":"references/conventional-commits.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" for full specification","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"See ","type":"text"},{"text":"references/examples.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" for more examples","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"See ","type":"text"},{"text":"references/scopes.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" for recommended scope naming","type":"text"}]}]}]}]},"metadata":{"date":"2026-11-02","name":"commit-helper","author":"@skillopedia","source":{"stars":85,"repo_name":"agent-playbook","origin_url":"https://github.com/zhaono1/agent-playbook/blob/HEAD/skills/commit-helper/SKILL.md","repo_owner":"zhaono1","body_sha256":"fbfb8275474e2d5de780c7a24da705a7a771f01a493a95e4152c3c84518d6da5","cluster_key":"41f21f15a16c3cb4b8e133cb313440325df69d6305ab7dc0419fbaa82b479b3e","clean_bundle":{"format":"clean-skill-bundle-v1","source":"zhaono1/agent-playbook/skills/commit-helper/SKILL.md","text_bytes":10321,"source_commit":"be7a9d7d17593abd8cf029d51c87dbd5b445351e","skills_sh_rank":16049,"attachment_count":5,"text_attachments":5,"attachment_storage":"skill_attachments","binary_attachments":0},"cluster_size":1,"skill_md_path":"skills/commit-helper/SKILL.md","import_metadata":{"date":"2026-11-02","author":"@skillopedia","version":"v1","category":"devops-infrastructure","category_label":"DevOps"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"devops-infrastructure","metadata":{"hooks":{"after_complete":[{"mode":"auto","reason":"Log commit activity","trigger":"session-logger"}]}},"import_tag":"skills-sh-top20k-2026-11","description":"Helps write Git commit messages following the Conventional Commits specification. Use this skill when the user asks to commit changes, write commit messages, format commits, or mentions git commits.","allowed-tools":"Read, Write, Edit, Bash, Grep"}},"renderedAt":1793665857052}

Commit Message Helper A skill for creating properly formatted Git commit messages following the Conventional Commits specification. When This Skill Activates This skill activates when you: - Ask to commit changes - Mention commit messages - Request git commit formatting - Say "commit" or "git commit" Commit Message Format Types | Type | Description | |------|-------------| | | A new feature | | | A bug fix | | | Documentation only changes | | | Changes that do not affect the meaning of the code (formatting, etc.) | | | A code change that neither fixes a bug nor adds a feature | | | A code cha…