Git Conventions
Enforce consistent commit messages and branch naming using Conventional Commits and kebab-case branch names.
Commit Workflow
Name branches by type — Follow the branch naming format in the
git-namingrule. If no rule is installed, see branch-naming.md.Check existing conventions — Before applying defaults, look for
.commitlintrc,commitlint.config.js,.czrc,CONTRIBUTING.md, or recent commit history. If the repo has established conventions, follow those instead.Review changes — Run
git statusandgit diff.Verify atomicity — One logical change per commit. If you need "and" in the message, split into multiple commits. When asked to "commit all" or "commit everything", first review the diff for unrelated changes. If multiple logical changes are present, propose a split with one commit per concern and confirm the grouping before proceeding.
Stage specific files — Do not use
git add .orgit add -A. Stage each file individually to avoid committing unrelated changes.Include generated files — If the project uses code generation (e.g.,
templ generate), ensure generated output files are staged alongside their source files. Run the generator before staging if unsure.Write the commit message — Follow the
git-namingrule for format. If no rule is installed, see commit-format.md.Key rules:
- Imperative mood, lowercase, no trailing period
- Max 72 characters for the header
- Body required when the reasoning matters — decisions, refactors, non-trivial fixes
- Header-only is fine when the diff tells the full story
- Breaking changes always require a body explaining the impact and migration path
- Separate header, body, and footer with blank lines
Commit.
Validate — Run
git log -1to confirm the format. If incorrect, rungit commit --amendto fix.
Branch Workflow
Check existing conventions — Look for branch protection rules, CI config, or existing branch patterns.
Create the branch — Follow the
git-namingrule for format. If no rule is installed, see branch-naming.md.Create from main, delete after merge.
Checkpoint Cleanup
Before pushing, check for WIP or checkpoint commits:
- Run
git log --oneline origin/main..HEAD - If any commits are checkpoints (prefixed "checkpoint",
"wip", "temp"):
git reset --soft origin/mainto unstage all changes- Review with
git diff --cached - Re-stage selectively and create logical, atomic commits
- Do NOT squash everything into one commit
- If history is clean, skip this step
Example Scenario
User: "commit these changes"
- Skill checks for
.commitlintrc— none found, uses defaults - Runs
git statusandgit diffto understand the changes - Changes touch auth middleware — suggests scope
auth - Writes:
fix(auth): handle expired tokens during reconnect - Stages specific files, commits, validates with
git log -1
Common Failures
- Repo already has conventions — applying Conventional Commits over an existing format creates inconsistent history. Always check first (step 1).
- Scope too broad or missing —
fix: stufftells nothing.fix(auth): resolve token expiry race conditiontells the story. - Body on trivial commits — a one-line typo fix doesn't need three paragraphs of reasoning.
- Non-atomic commits — bundling unrelated changes makes history useless. If you need "and", split.
Gotchas
- No "WIP" or "temp" commits — use
git commit --amendorgit rebase -ito clean up before opening a pull request - Use
git mvfor file renames to preserve history
Boundaries
- DOES stage and commit changes
- DOES validate commit message format
- DOES restructure checkpoint commits
- DOES suggest branch names
- Does NOT push to remote
- Does NOT modify source code
- Does NOT create pull/merge requests