commit-push
Create atomic git commits with terse Conventional Commits messages, then push to remote. Subject ≤50 chars, body only when "why" isn't obvious. Never force pushes. Use when the user says "commit and p
SKILL.mdskills/commit-push/SKILL.md
GitHubContext
- Current git status: !
git status --short - Diff summary (file + line counts): !
git diff HEAD --stat - Current branch: !
git branch --show-current - Recent commits (for style matching): !
git log --oneline -10
The full diff is intentionally NOT loaded above. Read hunks on demand with git diff HEAD -- <file> for only the files you need to inspect to write the message and decide splits. Do not run git diff HEAD with no path filter.
Your task
Create atomic, self-contained commits with terse, exact messages, then push to the remote. Conventional Commits format. No fluff. Why over what.
Commit Splitting
Split into multiple commits when changes involve:
- Different concerns — unrelated parts of the codebase
- Different types — mixing feat/fix/refactor/tests/docs/config
- Different file patterns — source vs docs vs config
- Large changesets — break down for reviewability
Each commit must build and make sense on its own. If all changes relate to one concern, a single commit is fine.
Message Rules
Subject line:
<type>(<scope>): <imperative summary>—<scope>optional- Types:
feat,fix,refactor,perf,docs,test,chore,build,ci,style,revert - Imperative mood: "add", "fix", "remove" — not "added", "adds", "adding"
- ≤50 chars when possible, hard cap 72
- No trailing period
- Match project convention for capitalization after the colon (check recent commits above)
Body (only if needed):
- Skip entirely when the subject is self-explanatory
- Add body only for: non-obvious why, breaking changes, migration notes, linked issues
- Wrap at 72 chars
- Bullets
-not* - Reference issues/PRs at end:
Closes #42,Refs #17
Auto-clarity — always include body for: breaking changes, security fixes, data migrations, revert commits.
Breaking changes: mark subject with ! and add a BREAKING CHANGE: footer explaining the migration.
What NEVER goes in:
- "This commit does X", "I", "we", "now", "currently" — the diff says what
- "As requested by..." — use
Co-authored-by:trailer instead - AI attribution: "Generated with Claude Code", co-authorship footers, 🤖 emoji
- Emoji unless project convention requires
- Restating the filename when the scope already covers it
Examples
fix(auth): handle expired refresh token
feat(api): add GET /users/:id/profile
Mobile client needs profile data without the full user payload
to reduce LTE bandwidth on cold-launch screens.
Closes #128
HEREDOC Format
git commit -m "$(cat <<'EOF'
<type>(<scope>): <subject>
<body if needed>
EOF
)"
Staging Rules
- Stage specific files by name — do NOT use
git add -Aorgit add . - NEVER stage files that may contain secrets:
.env,.env.*,credentials.json,*.key,*.pem,*.p12,id_rsa*,token.json,secret*. Warn the user and skip them. - If all changes are already staged, do not re-stage them.
Push Rules
- After all commits are created, push to the remote.
- Use
git push origin <current-branch>. - If the branch has no upstream, use
git push -u origin <current-branch>. - If the push fails due to diverged history, do NOT force push. Inform the user and stop.
Edge Cases
- No changes (nothing staged, nothing modified): say so and stop. Do not create an empty commit.
- Only untracked files that look like generated artifacts (
dist/,node_modules/,*.log): warn the user instead of committing them. - If the user says "normal mode" or "verbose commit": allow a longer, descriptive style for this commit only.