| name | committing-changes |
| description | Commit via feature branch + PR + git hooks; never push main, never merge. |
| allowed-tools | Read, Edit, Write, Bash(git status *), Bash(git diff *), Bash(git log *), Bash(git add *), Bash(git commit *), Bash(git push *), Bash(git checkout *), Bash(git branch *), Bash(git merge *), Bash(git fetch *), Bash(git rev-parse *), Bash(gh pr *), Bash(gh repo *), Bash(bash scripts/install-hooks.sh), Bash(bash scripts/install-pr-size-workflow.sh) |
Workflow
-
Install hooks (once per repo).
From inside the repo, run the installer that ships with this skill:
bash <skills>/committing-changes/scripts/install-hooks.sh
This copies commit-msg and pre-push into .git/hooks/ and makes them executable. Idempotent.
Then install the PR-size CI workflow:
bash <skills>/committing-changes/scripts/install-pr-size-workflow.sh
This drops .github/workflows/pr-size.yml and appends .gitattributes exclusions. Idempotent.
-
Branch check. If on main, switch to a feature branch:
git checkout -b <type>/<description>
Valid type prefixes: feat, fix, refactor, docs, test, chore, infra, ai-native.
-
Auto-fix before commit. Run the project's linter/formatter (e.g., ruff format && ruff check for Python, golangci-lint run for Go, forge fmt && solhint for Solidity). The pre-commit hook (if installed) runs the project's full quality gate.
-
Commit & push.
git add <specific paths>
git commit -m "<subject conforming to rules below>"
git push -u origin <branch>
-
Sync with main.
git fetch origin main
git merge origin/main
Resolve conflicts; commit the merge; push.
-
PR creation (first push only).
gh pr list --head <branch>
gh pr create --fill # if no PR exists yet
-
Branch cleanup (after the user has merged).
git fetch --prune
git branch --merged main | grep -v '^\*\|main' | xargs -r git branch -d
Rules
- Never push directly to
main. Always feature branches + PRs. The pre-push hook blocks this.
- Never merge branches or PRs. Always let the user merge.
- Never force-push. No
--force, no --force-with-lease. Create new commits instead.
- One logical change per commit.
- PR size: ≤1000 changed lines per PR (excluding tests, docs, lockfiles, generated). Enforced by
.github/workflows/pr-size.yml.
- Commit-message subject (enforced by
commit-msg hook):
- Capital start (imperative mood: "Add", "Fix", "Refactor", not "added"/"adds").
- ≤ 72 chars.
- No trailing period.
- No
Co-Authored-By: lines.
Why this discipline
Each rule traces to a specific failure mode:
- No direct push to main → no broken
main, every change is reviewable.
- No agent-side merge → the human keeps the merge decision; agents never close the loop unilaterally.
- No force-push → preserves history; reviewers can trust commit hashes.
- One logical change per commit → bisect works; reverts are surgical.
- Subject rules → consistent log readability; no noisy attribution lines.
Cross-references
shell-discipline — issue these git/gh commands one per call, no && chains.
engineering-philosophy — "Small Steps" and "Investigate, Don't Mask" map directly to one-logical-change-per-commit and don't-disable-failing-hooks.
Reference