This skill should be used when the user asks to "change the commit attribution", "remove the co-authored by", "stop adding the co-authored by", "change Claude's name", "configure the PR attribution", "update attribution settings", "show that Claude is helping write commits", or "reset co-authored by settings". Manages git commit and pull request attribution in Claude Code settings.
From settings-presetsnpx claudepluginhub aaronbassett/agent-foundry --plugin settings-presetsThis skill uses the workspace's default tool permissions.
examples/README.mdexamples/custom-pr.jsonexamples/name-change.jsonexamples/partial-update.jsonexamples/remove-all.jsonexamples/remove-model.jsonreferences/attribution-formats.mdreferences/git-trailers.mdGuides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Analyzes BMad project state from catalog CSV, configs, artifacts, and query to recommend next skills or answer questions. Useful for help requests, 'what next', or starting BMad.
Manage Claude Code's attribution settings for git commits and pull requests. Configure the Co-Authored-By git trailer and PR description attribution in .claude/settings.local.json. Handle customization of Claude's name, model information, and complete removal of attribution while preserving other settings.
Activate when users want to:
Follow this safe, confirmable workflow for all attribution changes:
Parse the user's request to determine:
Always check current settings before making changes:
# Check if .claude directory exists
if [ ! -d ".claude" ]; then
mkdir -p .claude
fi
# Read existing settings if present
if [ -f ".claude/settings.local.json" ]; then
cat .claude/settings.local.json
fi
Extract current attribution values if they exist:
# Get current commit attribution
CURRENT_COMMIT=$(jq -r '.attribution.commit // empty' .claude/settings.local.json 2>/dev/null)
# Get current PR attribution
CURRENT_PR=$(jq -r '.attribution.pr // empty' .claude/settings.local.json 2>/dev/null)
Before any modifications, create backup with .backup extension:
if [ -f ".claude/settings.local.json" ]; then
cp .claude/settings.local.json .claude/settings.local.json.backup
fi
If settings file exists, verify it contains valid JSON:
if [ -f ".claude/settings.local.json" ]; then
if ! jq empty .claude/settings.local.json 2>/dev/null; then
echo "ERROR: .claude/settings.local.json contains invalid JSON"
exit 1
fi
fi
On validation failure: Abort and ask user to fix the malformed JSON before proceeding.
When user requests name changes, determine model handling:
User says: "Change Claude's name to Big Dawg"
Ask user:
I'll update Claude's name to "Big Dawg" in the commit attribution.
Do you want to:
1. Keep the model name (e.g., "Big Dawg Sonnet 4.5")
2. Remove the model name (e.g., "Big Dawg")
What would you prefer?
Parse existing format to understand current structure:
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
[NAME] [MODEL] [EMAIL]
Preserve email address unless user explicitly requests changing it.
When user requests removing attribution, confirm scope:
User says: "Remove the co-authored by"
If user specified only commit attribution:
I'll remove the commit attribution. Do you also want me to remove the PR attribution?
Current PR attribution: "🤖 Generated with [Claude Code](https://claude.com/claude-code)"
Wait for user response before proceeding.
If user says remove both or confirms:
commit to ""pr to ""If user says keep PR attribution:
commit to ""pr valueCreate the new attribution configuration based on user request:
Preserve other settings: Only modify the attribution object, preserve everything else.
Example merge logic:
# Read existing settings or create empty object
EXISTING=$(cat .claude/settings.local.json 2>/dev/null || echo '{}')
# Merge with new attribution (example: change name)
echo "$EXISTING" | jq '. + {
"attribution": {
"commit": "Co-Authored-By: Big Dawg Sonnet 4.5 <noreply@anthropic.com>",
"pr": (.attribution.pr // "🤖 Generated with [Claude Code](https://claude.com/claude-code)")
}
}' > .claude/settings.local.json
Critical: When updating one field (commit or pr), explicitly preserve the other using (.attribution.commit // "default") or (.attribution.pr // "default").
Write the updated .claude/settings.local.json:
# If settings doesn't exist, create it
if [ ! -f ".claude/settings.local.json" ]; then
echo '{}' > .claude/settings.local.json
fi
# Use jq to merge attribution settings
jq '. + {
"attribution": {
"commit": "...",
"pr": "..."
}
}' .claude/settings.local.json > .claude/settings.local.json.tmp
mv .claude/settings.local.json.tmp .claude/settings.local.json
After writing new configuration, show what changed:
I've updated your attribution settings:
Commit attribution:
OLD: Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
NEW: Co-Authored-By: Big Dawg <noreply@anthropic.com>
PR attribution: (unchanged)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Do the changes work as expected?
If user confirms changes work:
rm -f .claude/settings.local.json.backup
If user says changes don't work or wants to revert:
if [ -f ".claude/settings.local.json.backup" ]; then
mv .claude/settings.local.json.backup .claude/settings.local.json
fi
rm -f .claude/settings.local.json.backup
Always ensure backup file is removed regardless of outcome.
Git commit attribution uses git trailers format:
Standard format:
Co-Authored-By: Name <email@example.com>
With model:
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Custom name:
Co-Authored-By: Big Dawg <noreply@anthropic.com>
With custom message:
Generated with AI
Co-Authored-By: AI Assistant <ai@example.com>
Empty (no attribution):
""
Notes:
Pull request attribution is plain text in PR descriptions:
Standard format:
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Custom message:
🤖 Generated with ✨ Style ✨ and [Big Dawg](https://claude.com/claude-code)
Simple text:
Created with Claude Code
Empty (no attribution):
""
Notes:
Name changes:
Attribution removal:
Customization:
Partial updates:
Before writing configuration, validate:
On validation failure: Inform user of issue and suggest corrections.
Critical principle: Only modify attribution object, preserve everything else.
When updating .claude/settings.local.json:
attribution objectstatusLine, model, hooks, etc.)commit, preserve existing prpr, preserve existing commitExample merging logic (update commit only):
jq --arg newCommit "Co-Authored-By: Big Dawg <noreply@anthropic.com>" \
'. + {
"attribution": {
"commit": $newCommit,
"pr": (.attribution.pr // "🤖 Generated with [Claude Code](https://claude.com/claude-code)")
}
}' .claude/settings.local.json
When user updates one field:
Default values if field doesn't exist:
"Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>""🤖 Generated with [Claude Code](https://claude.com/claude-code)"See examples/ directory for complete working examples:
examples/name-change.json - Changing Claude's nameexamples/remove-model.json - Removing model from attributionexamples/custom-pr.json - Custom PR attributionexamples/remove-all.json - Removing all attributionexamples/partial-update.json - Updating only one fieldFor detailed information:
references/attribution-formats.md - Complete attribution format guideIf .claude/ doesn't exist, create it automatically:
mkdir -p .claude
If settings file doesn't exist, create with empty object:
echo '{}' > .claude/settings.local.json
If existing file contains invalid JSON:
jq emptyIf user wants to revert:
When removing attribution:
"") completely hide attribution