372 lines
8.1 KiB
Markdown
372 lines
8.1 KiB
Markdown
---
|
|
description: Add footer with breaking changes and issue references to commit message
|
|
---
|
|
|
|
# Operation: Add Footer
|
|
|
|
Add a properly formatted footer to commit message with breaking changes, issue references, and other metadata.
|
|
|
|
## Parameters from $ARGUMENTS
|
|
|
|
**Optional (at least one required):**
|
|
- `breaking:` - Breaking change description
|
|
- `closes:` - Comma-separated issue numbers to close
|
|
- `fixes:` - Comma-separated issue numbers to fix
|
|
- `refs:` - Comma-separated issue numbers to reference
|
|
- `reviewed:` - Reviewer name(s)
|
|
- `signed:` - Signed-off-by name and email
|
|
|
|
**Format:** `footer breaking:"API changed" closes:123,456`
|
|
|
|
## Workflow
|
|
|
|
### Step 1: Parse Parameters
|
|
|
|
Extract parameters from $ARGUMENTS:
|
|
|
|
```bash
|
|
# Parse footer components
|
|
breaking=$(echo "$ARGUMENTS" | grep -oP 'breaking:"\K[^"]+')
|
|
closes=$(echo "$ARGUMENTS" | grep -oP 'closes:\K[0-9,]+')
|
|
fixes=$(echo "$ARGUMENTS" | grep -oP 'fixes:\K[0-9,]+')
|
|
refs=$(echo "$ARGUMENTS" | grep -oP 'refs:\K[0-9,]+')
|
|
reviewed=$(echo "$ARGUMENTS" | grep -oP 'reviewed:"\K[^"]+')
|
|
signed=$(echo "$ARGUMENTS" | grep -oP 'signed:"\K[^"]+')
|
|
```
|
|
|
|
### Step 2: Validate Parameters
|
|
|
|
**Check at least one parameter provided:**
|
|
```bash
|
|
if [ -z "$breaking" ] && [ -z "$closes" ] && [ -z "$fixes" ] && [ -z "$refs" ] && [ -z "$reviewed" ] && [ -z "$signed" ]; then
|
|
echo "ERROR: At least one footer parameter is required"
|
|
echo "Usage: footer [breaking:\"<desc>\"] [closes:<nums>] [fixes:<nums>] [refs:<nums>]"
|
|
exit 1
|
|
fi
|
|
```
|
|
|
|
### Step 3: Invoke Footer Builder Script
|
|
|
|
Pass parameters to the utility script for proper formatting:
|
|
|
|
```bash
|
|
# Prepare JSON input
|
|
cat <<EOF | /home/danie/projects/plugins/architect/open-plugins/plugins/git-commit-assistant/commands/message-generation/.scripts/footer-builder.py
|
|
{
|
|
"breaking": "$breaking",
|
|
"closes": "$closes",
|
|
"fixes": "$fixes",
|
|
"refs": "$refs",
|
|
"reviewed": "$reviewed",
|
|
"signed": "$signed"
|
|
}
|
|
EOF
|
|
```
|
|
|
|
The script will:
|
|
- Format BREAKING CHANGE properly
|
|
- Convert issue numbers to proper references
|
|
- Order footer elements correctly
|
|
- Ensure proper spacing and formatting
|
|
|
|
### Step 4: Format Output
|
|
|
|
Present the generated footer:
|
|
|
|
```
|
|
FOOTER GENERATED
|
|
═══════════════════════════════════════════════
|
|
|
|
FOOTER:
|
|
───────────────────────────────────────────────
|
|
<blank line>
|
|
<formatted footer content>
|
|
|
|
VALIDATION:
|
|
───────────────────────────────────────────────
|
|
✓ Blank line before footer
|
|
✓ BREAKING CHANGE format correct
|
|
✓ Issue references valid
|
|
✓ Proper formatting
|
|
|
|
COMPONENTS:
|
|
───────────────────────────────────────────────
|
|
Breaking Changes: <yes/no>
|
|
Issues Closed: X
|
|
Issues Fixed: X
|
|
References: X
|
|
Signed-off: <yes/no>
|
|
|
|
═══════════════════════════════════════════════
|
|
```
|
|
|
|
## Output Format
|
|
|
|
Return structured output:
|
|
- Formatted footer text
|
|
- Validation results
|
|
- Component breakdown
|
|
- Suggestions (if any)
|
|
|
|
## Error Handling
|
|
|
|
**No parameters provided:**
|
|
```
|
|
ERROR: At least one footer parameter is required
|
|
Usage: footer [breaking:"<desc>"] [closes:<nums>] [fixes:<nums>]
|
|
|
|
Example: footer breaking:"authentication API changed" closes:123
|
|
```
|
|
|
|
**Invalid issue number format:**
|
|
```
|
|
ERROR: Invalid issue number format
|
|
Expected: closes:123 or closes:123,456
|
|
Received: closes:abc
|
|
```
|
|
|
|
**Missing breaking change description:**
|
|
```
|
|
ERROR: breaking parameter requires description
|
|
Usage: footer breaking:"<description of breaking change>"
|
|
|
|
Example: footer breaking:"API endpoint /auth removed"
|
|
```
|
|
|
|
## Footer Format Rules
|
|
|
|
**Order of Elements:**
|
|
```
|
|
<blank line>
|
|
BREAKING CHANGE: <description>
|
|
Closes #<issue>
|
|
Fixes #<issue>
|
|
Refs #<issue>
|
|
Reviewed-by: <name>
|
|
Signed-off-by: <name> <email>
|
|
```
|
|
|
|
**Breaking Changes:**
|
|
- Always use `BREAKING CHANGE:` (uppercase, singular)
|
|
- Provide clear description
|
|
- Can also use `!` in subject: `feat!: change API`
|
|
|
|
**Issue References:**
|
|
- Use `Closes #123` for issues closed by this commit
|
|
- Use `Fixes #123` for bugs fixed by this commit
|
|
- Use `Refs #123` for related issues
|
|
- Multiple issues: `Closes #123, #456`
|
|
|
|
**Metadata:**
|
|
- `Reviewed-by:` for code review
|
|
- `Signed-off-by:` for DCO compliance
|
|
- Custom trailers as needed
|
|
|
|
## Integration with Agent
|
|
|
|
The commit-assistant agent uses this operation to:
|
|
1. Add breaking change notices
|
|
2. Link commits to issues
|
|
3. Add review metadata
|
|
4. Ensure proper footer formatting
|
|
|
|
## Usage Examples
|
|
|
|
### Example 1: Breaking Change
|
|
|
|
```bash
|
|
# Input
|
|
/message-generation footer breaking:"authentication API endpoint changed from /login to /auth/login"
|
|
|
|
# Output
|
|
FOOTER:
|
|
|
|
BREAKING CHANGE: authentication API endpoint changed from /login to
|
|
/auth/login
|
|
```
|
|
|
|
### Example 2: Close Issues
|
|
|
|
```bash
|
|
# Input
|
|
/message-generation footer closes:123,456,789
|
|
|
|
# Output
|
|
FOOTER:
|
|
|
|
Closes #123, #456, #789
|
|
```
|
|
|
|
### Example 3: Fix and Close
|
|
|
|
```bash
|
|
# Input
|
|
/message-generation footer fixes:42 closes:100
|
|
|
|
# Output
|
|
FOOTER:
|
|
|
|
Fixes #42
|
|
Closes #100
|
|
```
|
|
|
|
### Example 4: Complete Footer
|
|
|
|
```bash
|
|
# Input
|
|
/message-generation footer breaking:"remove deprecated API" closes:200 signed:"John Doe <john@example.com>"
|
|
|
|
# Output
|
|
FOOTER:
|
|
|
|
BREAKING CHANGE: remove deprecated API
|
|
Closes #200
|
|
Signed-off-by: John Doe <john@example.com>
|
|
```
|
|
|
|
### Example 5: Multiple Issue Fixes
|
|
|
|
```bash
|
|
# Input
|
|
/message-generation footer fixes:10,20,30 refs:100
|
|
|
|
# Output
|
|
FOOTER:
|
|
|
|
Fixes #10, #20, #30
|
|
Refs #100
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
**Breaking Changes:**
|
|
- ✅ "BREAKING CHANGE: API endpoint changed"
|
|
- ❌ "Breaking change: api endpoint changed"
|
|
- ✅ Clear description of what broke
|
|
- ❌ Vague "things changed"
|
|
|
|
**Issue References:**
|
|
- ✅ "Closes #123" (actually closes)
|
|
- ❌ "Closes #123" (just mentions)
|
|
- ✅ "Refs #100" (related)
|
|
- ❌ "See issue 100"
|
|
|
|
**Issue Linking Semantics:**
|
|
- `Closes` - Pull request or feature complete
|
|
- `Fixes` - Bug fix
|
|
- `Refs` - Related but not closed
|
|
- `Resolves` - Alternative to Closes
|
|
|
|
## When to Include a Footer
|
|
|
|
**Include footer when:**
|
|
- Breaking changes introduced
|
|
- Closes or fixes issues
|
|
- Multiple reviewers
|
|
- DCO/signing required
|
|
- Related work references
|
|
|
|
**Omit footer when:**
|
|
- No breaking changes
|
|
- No issue tracking
|
|
- No special metadata
|
|
- Simple standalone commit
|
|
|
|
## Breaking Change Detection
|
|
|
|
**Patterns that indicate breaking changes:**
|
|
- API endpoint changes
|
|
- Function signature changes
|
|
- Removed features
|
|
- Changed behavior
|
|
- Dependency major version bumps
|
|
- Configuration format changes
|
|
|
|
**How to communicate breaking changes:**
|
|
```
|
|
BREAKING CHANGE: <brief description>
|
|
|
|
<longer explanation of what changed>
|
|
<migration path if applicable>
|
|
```
|
|
|
|
**Alternative notation:**
|
|
```
|
|
feat!: change API endpoint
|
|
|
|
# The ! indicates breaking change
|
|
```
|
|
|
|
## Footer Templates
|
|
|
|
**Feature with Issue:**
|
|
```
|
|
Closes #<issue>
|
|
```
|
|
|
|
**Bug Fix:**
|
|
```
|
|
Fixes #<issue>
|
|
```
|
|
|
|
**Breaking Change with Migration:**
|
|
```
|
|
BREAKING CHANGE: <what changed>
|
|
|
|
Migration: <how to update>
|
|
Closes #<issue>
|
|
```
|
|
|
|
**Multiple Issues:**
|
|
```
|
|
Fixes #<bug1>, #<bug2>
|
|
Closes #<feature>
|
|
Refs #<related>
|
|
```
|
|
|
|
**Signed Commit:**
|
|
```
|
|
Reviewed-by: <reviewer>
|
|
Signed-off-by: <author> <email>
|
|
```
|
|
|
|
## GitHub/GitLab Integration
|
|
|
|
**GitHub Keywords (auto-close issues):**
|
|
- Closes, Closed, Close
|
|
- Fixes, Fixed, Fix
|
|
- Resolves, Resolved, Resolve
|
|
|
|
**GitLab Keywords:**
|
|
- Closes, Closed, Close (same as GitHub)
|
|
- Fixes, Fixed, Fix
|
|
- Resolves, Resolved, Resolve
|
|
- Implements, Implemented, Implement
|
|
|
|
**Format:**
|
|
```
|
|
Closes #123 # Same repository
|
|
Closes user/repo#123 # Different repository
|
|
Closes https://github.com/... # Full URL
|
|
```
|
|
|
|
## Footer Validation
|
|
|
|
**Valid footer format:**
|
|
```
|
|
✓ Blank line before footer
|
|
✓ BREAKING CHANGE in capitals
|
|
✓ Issue numbers have # prefix
|
|
✓ Proper token format (Closes, Fixes, etc.)
|
|
✓ Valid email in Signed-off-by
|
|
```
|
|
|
|
**Invalid footer format:**
|
|
```
|
|
✗ No blank line before footer
|
|
✗ "Breaking change:" (lowercase)
|
|
✗ "Closes 123" (missing #)
|
|
✗ "Resolves issue 123" (wrong format)
|
|
✗ Invalid email format
|
|
```
|