# Operation: Review Commit Quality Analyze a commit's quality including message, changes, atomicity, and completeness. ## Parameters from $ARGUMENTS - **commit** (optional): Commit SHA or reference (default: HEAD) Parse as: `review-commit commit:abc123` or `review-commit` (defaults to HEAD) ## Commit Review Workflow ### Step 1: Validate Commit Exists ```bash # Check if commit exists if ! git rev-parse --verify ${commit:-HEAD} >/dev/null 2>&1; then ERROR: "Commit not found: ${commit}" exit 1 fi # Get commit hash commit_sha=$(git rev-parse ${commit:-HEAD}) ``` ### Step 2: Run Commit Reviewer Script Execute comprehensive analysis: ```bash ./.claude/commands/commit-best-practices/.scripts/commit-reviewer.py "${commit_sha}" ``` The script returns JSON: ```json { "commit": "abc123...", "author": "John Doe ", "date": "2025-10-13", "message": { "subject": "feat(auth): add OAuth authentication", "body": "- Implement OAuth2 flow\n- Add providers", "subject_length": 38, "has_body": true, "conventional": true, "type": "feat", "scope": "auth" }, "changes": { "files_changed": 5, "insertions": 234, "deletions": 12, "test_files": 1, "doc_files": 0 }, "quality": { "atomic": true, "message_quality": "excellent", "test_coverage": true, "issues": [] }, "score": 95 } ``` ### Step 3: Analyze Message Quality **Check Subject Line:** - Length ≤ 50 characters ✅ - Imperative mood ("add" not "added") ✅ - Conventional commits format ✅ - Clear and descriptive ✅ **Check Body (if present):** - Wrapped at 72 characters ✅ - Explains WHY (not just what) ✅ - Uses bullet points for clarity ✅ - Blank line after subject ✅ **Check Footer (if present):** - Breaking changes noted ✅ - Issue references included ✅ ### Step 4: Analyze Changes **Atomicity Check:** ``` Atomic commit = Single logical change Check for: ❌ Multiple types mixed (feat + fix) ❌ Multiple scopes mixed (auth + api + docs) ❌ Unrelated changes bundled together Example ATOMIC: feat(auth): add OAuth authentication - 5 files, all auth-related - Single feature implementation Example NON-ATOMIC: feat: add OAuth and fix null pointer - Mixing feat + fix - Should be 2 commits ``` **Completeness Check:** ``` Complete commit includes: ✅ Implementation code ✅ Tests for new code ✅ Documentation if needed ✅ No missing pieces Incomplete examples: ❌ New feature without tests ❌ API change without docs ❌ Partial implementation ``` ### Step 5: Generate Review Report **Excellent Commit (Score 90-100):** ``` ✅ EXCELLENT COMMIT Commit: abc123 (HEAD) Author: John Doe Date: 2025-10-13 Message Quality: EXCELLENT ✅ Subject: "feat(auth): add OAuth authentication" (38 chars) ✅ Conventional commits format ✅ Descriptive body with bullet points ✅ Proper formatting Changes: ✅ Atomic: Single feature (OAuth authentication) ✅ Complete: Implementation + tests ✅ Files: 5 changed (+234 -12 lines) ✅ Test coverage included Score: 95/100 This commit follows all best practices. Safe to push! ``` **Good Commit (Score 70-89):** ``` ✅ GOOD COMMIT (Minor improvements possible) Commit: abc123 (HEAD) Author: John Doe Date: 2025-10-13 Message Quality: GOOD ✅ Subject: "feat(auth): add OAuth authentication" (38 chars) ✅ Conventional commits format ⚠️ Body: Could be more detailed (explains WHAT but not WHY) Changes: ✅ Atomic: Single feature ⚠️ Test coverage: Only integration tests (unit tests missing) ✅ Files: 5 changed (+234 -12 lines) Score: 82/100 Suggestions: 1. Add more context in commit body about WHY this change 2. Consider adding unit tests for edge cases Still a good commit. Safe to push with minor notes. ``` **Needs Improvement (Score 50-69):** ``` ⚠️ NEEDS IMPROVEMENT Commit: abc123 (HEAD) Author: John Doe Date: 2025-10-13 Message Quality: FAIR ⚠️ Subject: "add oauth" (9 chars - too short) ❌ Not conventional commits format (missing type/scope) ❌ No body explaining changes Changes: ⚠️ Atomicity: Questionable (mixes auth + API changes) ❌ Test coverage: No tests included ✅ Files: 8 changed (+312 -45 lines) Score: 58/100 Issues to address: 1. Improve commit message: "feat(auth): add OAuth authentication" 2. Add commit body explaining implementation 3. Add tests for new OAuth functionality 4. Consider splitting auth changes from API changes Recommendation: Amend or rewrite this commit before pushing. ``` **Poor Commit (Score < 50):** ``` ❌ POOR COMMIT - Should be rewritten Commit: abc123 (HEAD) Author: John Doe Date: 2025-10-13 Message Quality: POOR ❌ Subject: "stuff" (5 chars - meaningless) ❌ No type, no scope, no clarity ❌ No body, no context Changes: ❌ Non-atomic: Multiple unrelated changes - Auth system - API refactoring - Documentation - Bug fixes (3 different issues) ❌ No tests ❌ Files: 23 changed (+1,234 -567 lines) Score: 28/100 Critical issues: 1. Commit message is meaningless ("stuff") 2. Bundles 4+ unrelated changes together 3. No tests for significant code changes 4. Too large (23 files) Action required: Reset and split into 4+ atomic commits with proper messages. Use: /commit-split (to split into atomic commits) ``` ### Step 6: Provide Actionable Guidance Based on score, recommend action: **Score ≥ 90**: Safe to push as-is **Score 70-89**: Safe to push, minor suggestions noted **Score 50-69**: Amend recommended before pushing **Score < 50**: Rewrite required, do not push ## Amend Guidance If commit needs improvement and is safe to amend: ``` To amend this commit: 1. Make improvements (add tests, update message, etc.) 2. Stage changes: git add 3. Amend commit: git commit --amend 4. Review again: /commit-best-practices review-commit Note: Only amend if commit not yet pushed to remote! Check: /commit-best-practices amend-guidance ``` ## Split Guidance If commit is non-atomic: ``` This commit should be split into multiple commits: Detected separate concerns: 1. feat(auth): OAuth implementation (5 files) 2. fix(api): null pointer handling (2 files) 3. docs: authentication guide (1 file) Use: /commit-split (for interactive splitting) Or: git reset HEAD~1 (to undo and recommit properly) ``` ## Output Format ``` Commit Review Report =================== Commit: () Author: Date: MESSAGE QUALITY: [EXCELLENT|GOOD|FAIR|POOR] [✅|⚠️|❌] Subject: "" ( chars) [✅|⚠️|❌] Format: [Conventional|Non-conventional] [✅|⚠️|❌] Body: [Present|Missing] [✅|⚠️|❌] Clarity: [Clear|Vague] CHANGES: [✅|⚠️|❌] Atomic: [Yes|Questionable|No] [✅|⚠️|❌] Complete: [Yes|Partial] [✅|⚠️|❌] Tests: [Included|Missing] [✅|⚠️|❌] Size: files (+ - lines) SCORE: /100 [Issues list if any] [Recommendations] VERDICT: [Safe to push|Amend recommended|Rewrite required] ``` ## Error Handling **Commit not found:** ``` ERROR: Commit not found: abc123 Check: git log (to see available commits) ``` **Not a git repository:** ``` ERROR: Not a git repository Run: git init (to initialize) ``` **Script execution error:** ``` ERROR: Commit reviewer script failed Check: .claude/commands/commit-best-practices/.scripts/commit-reviewer.py exists Verify: Script is executable ``` ## Integration with Agent After user creates a commit: 1. Agent automatically runs review (unless disabled) 2. If score < 70, suggest improvements 3. If non-atomic, suggest splitting 4. If excellent (≥90), congratulate and suggest push ## Best Practices Enforced 1. **Meaningful messages** - Clear, descriptive commit messages 2. **Conventional format** - type(scope): description 3. **Atomic commits** - One logical change per commit 4. **Complete commits** - Include tests and docs 5. **Proper formatting** - Subject ≤50 chars, body wrapped at 72 High-quality commits make git history useful for debugging, code review, and collaboration.