commit
Create a git commit with proper message formatting. Use when asked to commit changes, handles sandbox heredoc limitations.
When & Why to Use This Skill
This Claude skill automates the creation of standardized Git commits, ensuring adherence to Conventional Commit specifications and proper message formatting. It is specifically engineered to bypass sandbox environment limitations, such as heredoc restrictions, by utilizing a robust temporary file approach for reliable multi-line commit messages and consistent version control history.
Use Cases
- Standardizing Team Workflows: Enforce the Conventional Commits standard (feat, fix, refactor, etc.) across all AI-generated contributions to maintain a clean and readable project history.
- Automated Ticket Integration: Automatically extract Linear or JIRA-style ticket IDs from active branch names and prepend them to commit headers for seamless project management linking.
- Bypassing Sandbox Constraints: Execute complex, multi-line Git commits in restricted CLI environments where traditional shell heredocs are blocked or fail.
- AI Attribution and Compliance: Automatically append mandatory metadata, including Claude Code attribution and co-author information, to satisfy repository auditing and contribution tracking requirements.
| name | commit |
|---|---|
| description | Create a git commit with proper message formatting. Use when asked to commit changes, handles sandbox heredoc limitations. |
Create Git Commit
Create a git commit with a properly formatted message, working around sandbox heredoc limitations.
Instructions
1. Check what to commit
# See status
git status
# See staged changes
git diff --cached --stat
# See recent commits for style reference
git log --oneline -5
# Extract Linear ticket ID from branch name (if present)
git branch --show-current | grep -oiE 'thr-[0-9]+' | tr '[:lower:]' '[:upper:]'
2. Write the commit message to a temp file
The sandbox blocks heredocs, so write the message to a file first using printf:
# Single-line message
printf '%s\n' 'type: short description' > /tmp/claude/commit-msg.txt
# Multi-line message (each line as a separate argument)
printf '%s\n' \
'type: short description' \
'' \
'- Detail 1' \
'- Detail 2' \
'' \
'🤖 Generated with [Claude Code](https://claude.com/claude-code)' \
'' \
'Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>' \
> /tmp/claude/commit-msg.txt
3. Stage and commit
# Stage specific files (never use git add .)
git add path/to/file1.ts path/to/file2.ts
# Commit using the file
git commit -F /tmp/claude/commit-msg.txt
4. Clean up
rm /tmp/claude/commit-msg.txt
Commit Message Format
Follow conventional commits with Linear ticket ID when available:
feat(THR-XX):- New featurefix(THR-XX):- Bug fixrefactor(THR-XX):- Code restructuringdocs(THR-XX):- Documentationtest(THR-XX):- Testschore(THR-XX):- Maintenance
If no Linear ticket exists, omit the parenthetical: feat: description
Always include the Claude Code attribution at the end:
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Common Issues
Heredoc fails with "can't create temp file": This is expected in sandbox mode. Use printf approach instead.
Special characters in message: Use single quotes to prevent shell expansion. For apostrophes, end the quote, add escaped apostrophe, restart quote:
printf '%s\n' 'Don'\''t do this' > /tmp/claude/commit-msg.txt
Examples
Simple commit:
printf '%s\n' 'fix: correct typo in README' '' '🤖 Generated with [Claude Code](https://claude.com/claude-code)' '' 'Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>' > /tmp/claude/commit-msg.txt
git add README.md && git commit -F /tmp/claude/commit-msg.txt
Multi-line commit:
printf '%s\n' \
'refactor: extract helper function' \
'' \
'- Moved validation logic to separate function' \
'- Added unit tests' \
'- Updated callers' \
'' \
'🤖 Generated with [Claude Code](https://claude.com/claude-code)' \
'' \
'Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>' \
> /tmp/claude/commit-msg.txt
git add src/utils.ts src/utils.test.ts && git commit -F /tmp/claude/commit-msg.txt