--- description: Validate commit message against conventional commits standard --- # Operation: Validate Message Validate a commit message against the conventional commits standard, checking format, style, and best practices. ## Parameters from $ARGUMENTS **Required:** - `message:` - Full commit message to validate (use quotes for multi-line) **Optional:** - `strict:` - Enable strict mode (true|false, default: false) - `max_subject:` - Maximum subject length (default: 50) - `max_line:` - Maximum body line length (default: 72) **Format:** `validate message:"feat: add feature"` or `validate message:"$(cat commit.txt)"` ## Workflow ### Step 1: Parse Parameters Extract message from $ARGUMENTS: ```bash # Parse message (supports quoted multi-line) message=$(echo "$ARGUMENTS" | sed -n 's/.*message:"\(.*\)".*/\1/p') if [ -z "$message" ]; then message=$(echo "$ARGUMENTS" | sed 's/^validate //') fi strict=$(echo "$ARGUMENTS" | grep -oP 'strict:\K(true|false)' || echo "false") max_subject=$(echo "$ARGUMENTS" | grep -oP 'max_subject:\K[0-9]+' || echo "50") max_line=$(echo "$ARGUMENTS" | grep -oP 'max_line:\K[0-9]+' || echo "72") ``` ### Step 2: Validate Parameters **Check message provided:** ```bash if [ -z "$message" ]; then echo "ERROR: message parameter is required" echo "Usage: validate message:\"\"" exit 1 fi ``` ### Step 3: Invoke Message Validator Script Pass message to validation script: ```bash # Export variables export MESSAGE="$message" export STRICT_MODE="$strict" export MAX_SUBJECT="$max_subject" export MAX_LINE="$max_line" # Run validator /home/danie/projects/plugins/architect/open-plugins/plugins/git-commit-assistant/commands/message-generation/.scripts/message-validator.sh ``` The script performs comprehensive validation: - Format compliance - Type validation - Subject line rules - Body formatting - Footer format - Character limits - Mood and style - Best practices ### Step 4: Format Validation Report Present detailed validation results: ``` COMMIT MESSAGE VALIDATION ═══════════════════════════════════════════════ MESSAGE: ─────────────────────────────────────────────── FORMAT VALIDATION: ─────────────────────────────────────────────── ✓ Conventional commits format ✓ Valid commit type ✓ Scope format correct (if present) ✓ Blank line before body (if present) ✓ Blank line before footer (if present) SUBJECT LINE: ─────────────────────────────────────────────── ✓ Length: XX/50 characters ✓ Imperative mood ✓ No capitalization after colon ✓ No period at end ✓ Clear and descriptive BODY (if present): ─────────────────────────────────────────────── ✓ Blank line after subject ✓ Lines wrapped at 72 characters ✓ Bullet points formatted correctly ✓ Explains what and why FOOTER (if present): ─────────────────────────────────────────────── ✓ Blank line before footer ✓ BREAKING CHANGE format correct ✓ Issue references valid ✓ Metadata formatted properly OVERALL: ─────────────────────────────────────────────── Status: ✓ VALID / ✗ INVALID Score: XX/100 WARNINGS (if any): ─────────────────────────────────────────────── - Subject line is long (consider shortening) - Body line exceeds 72 characters ERRORS (if any): ─────────────────────────────────────────────── - Invalid commit type - Missing imperative mood SUGGESTIONS: ─────────────────────────────────────────────── - - ═══════════════════════════════════════════════ ``` ## Output Format Return structured validation report with: - Format compliance check - Subject line validation - Body validation (if present) - Footer validation (if present) - Overall score - Warnings (non-critical issues) - Errors (critical issues) - Suggestions for improvement ## Error Handling **No message provided:** ``` ERROR: message parameter is required Usage: validate message:"" Example: validate message:"feat: add authentication" ``` **Empty message:** ``` ERROR: Commit message is empty Provide a commit message to validate ``` **Completely invalid format:** ``` VALIDATION FAILED Format does not match conventional commits standard Expected: (): Received: See: https://www.conventionalcommits.org/ ``` ## Validation Rules ### Subject Line Validation **Format:** `(): ` **Type validation:** - ✓ Valid types: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert - ✗ Invalid types: feature, bugfix, update, change **Scope validation:** - ✓ Lowercase alphanumeric - ✓ Hyphen allowed - ✗ Spaces not allowed - ✗ Special characters not allowed **Subject validation:** - ✓ Imperative mood (add, fix, update) - ✗ Past tense (added, fixed) - ✗ Present tense (adds, fixes) - ✓ Lowercase after colon - ✗ Uppercase after colon - ✓ No period at end - ✗ Period at end - ✓ Length ≤ 50 chars (warning if > 50, error if > 72) ### Body Validation **Structure:** - ✓ Blank line after subject - ✓ Lines wrapped at 72 characters - ✓ Bullet points start with `-` or `*` - ✓ Proper paragraph spacing **Content:** - ✓ Explains what and why - ✓ Imperative mood - ✗ Implementation details - ✗ Overly verbose ### Footer Validation **Format:** - ✓ Blank line before footer - ✓ `BREAKING CHANGE:` (uppercase, singular) - ✓ Issue references: `Closes #123` - ✓ Metadata format: `Key: value` **Issue references:** - ✓ `Closes #123` - ✓ `Fixes #42` - ✓ `Refs #100` - ✗ `Closes 123` (missing #) - ✗ `closes #123` (lowercase) ## Integration with Agent The commit-assistant agent uses this operation to: 1. Validate messages before commit 2. Check user-provided messages 3. Verify generated messages 4. Provide improvement suggestions ## Usage Examples ### Example 1: Valid Message ```bash # Input /message-generation validate message:"feat(auth): add OAuth authentication" # Output ✓ VALID Subject: feat(auth): add OAuth authentication (42/50 chars) All checks passed ``` ### Example 2: Message with Warnings ```bash # Input /message-generation validate message:"feat: add a comprehensive OAuth2 authentication system" # Output ⚠ VALID WITH WARNINGS Subject exceeds 50 characters (57 chars) Suggestion: Shorten subject or move details to body Example: "feat: add OAuth2 authentication" ``` ### Example 3: Invalid Type ```bash # Input /message-generation validate message:"feature: add login" # Output ✗ INVALID Invalid commit type: 'feature' Valid types: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert Suggested: feat: add login ``` ### Example 4: Wrong Mood ```bash # Input /message-generation validate message:"fix: fixed login bug" # Output ⚠ VALID WITH WARNINGS Use imperative mood in subject Current: "fixed login bug" Correct: "fix login bug" ``` ### Example 5: Multi-line Message ```bash # Input /message-generation validate message:"feat(auth): add OAuth Implement OAuth2 authentication flow with Google and GitHub providers. BREAKING CHANGE: authentication endpoint changed Closes #123" # Output ✓ VALID Subject: ✓ (28/50 chars) Body: ✓ (proper formatting) Footer: ✓ (BREAKING CHANGE and issue reference) Score: 100/100 ``` ### Example 6: Invalid Footer ```bash # Input /message-generation validate message:"feat: add feature Breaking change: API changed" # Output ✗ INVALID - Footer format incorrect Current: "Breaking change: API changed" Correct: "BREAKING CHANGE: API changed" Footer tokens must be uppercase. ``` ## Validation Scoring **Score breakdown (100 points total):** **Subject (40 points):** - Valid type (10 pts) - Proper format (10 pts) - Imperative mood (10 pts) - Length ≤ 50 chars (10 pts) **Body (30 points, if present):** - Blank line after subject (10 pts) - Proper wrapping (10 pts) - Clear explanation (10 pts) **Footer (15 points, if present):** - Blank line before footer (5 pts) - Proper format (10 pts) **Style (15 points):** - Consistent style (5 pts) - No typos (5 pts) - Professional tone (5 pts) **Scoring thresholds:** - 90-100: Excellent - 75-89: Good - 60-74: Acceptable - Below 60: Needs improvement ## Strict Mode **Normal mode (default):** - Warnings for non-critical issues - Accepts messages with minor issues - Suggests improvements **Strict mode (strict:true):** - Errors for any deviation - Rejects messages with warnings - Enforces all best practices - Useful for pre-commit hooks **Example difference:** Normal mode: ``` ⚠ Subject is 55 characters (warning) Status: VALID ``` Strict mode: ``` ✗ Subject exceeds 50 characters (error) Status: INVALID ``` ## Best Practices Validation **Checks performed:** **Subject best practices:** - Be specific (not "update code") - Focus on what (not how) - Avoid filler words - Use consistent terminology **Body best practices:** - Explain motivation - Describe high-level approach - Mention side effects - Link to related work **Footer best practices:** - Clear breaking change description - Accurate issue references - Proper DCO/sign-off - Relevant metadata only ## Common Validation Failures **Invalid type:** ``` ✗ Type "feature" is not valid → Use "feat" instead ``` **Past tense:** ``` ✗ Use imperative: "add" not "added" → Subject should use present tense ``` **Capitalization:** ``` ✗ Don't capitalize after colon → "feat: Add feature" should be "feat: add feature" ``` **Period at end:** ``` ✗ No period at end of subject → "feat: add feature." should be "feat: add feature" ``` **No blank line:** ``` ✗ Blank line required between subject and body → Add empty line after subject ``` **Line too long:** ``` ✗ Body line exceeds 72 characters → Wrap text at 72 characters ``` **Invalid footer:** ``` ✗ Footer format incorrect → Use "BREAKING CHANGE:" not "Breaking change:" ``` ## Pre-commit Integration This validation can be used in pre-commit hooks: ```bash #!/bin/bash # .git/hooks/commit-msg MESSAGE=$(cat "$1") # Validate message result=$(/message-generation validate message:"$MESSAGE" strict:true) if echo "$result" | grep -q "✗ INVALID"; then echo "$result" exit 1 fi ``` ## Validation vs Generation **Validation:** - Checks existing messages - Identifies problems - Suggests corrections - Pass/fail result **Generation:** - Creates new messages - Follows rules automatically - Optimized output - Always valid (when properly configured) **Workflow:** ``` User writes message → Validate → If invalid → Suggest corrections Agent generates message → Validate → Should always pass ```