commit-with-validation
Create single atomic commit with proper message format, issue linking, and pre-commit hook validation for WescoBar workflows
Packaged view
This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.
Install command
npx @skill-hub/cli install berrykuipers-claude-code-toolkit-commit-with-validation
Repository
Skill path: .claude/skills/git-workflows/commit-with-validation
Create single atomic commit with proper message format, issue linking, and pre-commit hook validation for WescoBar workflows
Open repositoryBest for
Primary workflow: Ship Full Stack.
Technical facets: Full Stack.
Target audience: everyone.
License: Unknown.
Original source
Catalog source: SkillHub Club.
Repository owner: BerryKuipers.
This is still a mirrored public skill entry. Review the repository before installing into production workflows.
What it helps with
- Install commit-with-validation into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
- Review https://github.com/BerryKuipers/claude-code-toolkit before adding commit-with-validation to shared team environments
- Use commit-with-validation for development workflows
Works across
Favorites: 0.
Sub-skills: 0.
Aggregator: No.
Original source / Raw SKILL.md
--- name: commit-with-validation description: Create single atomic commit with proper message format, issue linking, and pre-commit hook validation for WescoBar workflows --- # Commit with Validation ## Purpose Create a single atomic commit with standardized message format, proper GitHub issue linking, and pre-commit hook execution, following WescoBar git discipline. ## When to Use - Conductor workflow Phase 4, Step 2 (after all quality gates pass) - After completing feature implementation - Before creating pull request - When all tests pass and audit score β₯ 8.0 ## Commit Message Format ``` <type>: <subject> <body> Fixes #<issue-number> π€ Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> ``` ### Types - `feat` - New feature - `fix` - Bug fix - `refactor` - Code restructuring - `test` - Test additions/changes - `docs` - Documentation changes - `chore` - Build/tooling changes ## Instructions ### Step 1: Validate Pre-Requisites ```bash echo "β Validating commit prerequisites..." # Check we're on a feature branch CURRENT_BRANCH=$(git branch --show-current) if [[ ! "$CURRENT_BRANCH" =~ ^feature/ ]]; then echo "β Error: Not on feature branch (current: $CURRENT_BRANCH)" exit 1 fi # Check there are staged or unstaged changes if [ -z "$(git status --porcelain)" ]; then echo "β Error: No changes to commit" exit 1 fi # Extract issue number from branch name if [[ "$CURRENT_BRANCH" =~ feature/issue-([0-9]+) ]]; then ISSUE_NUMBER="${BASH_REMATCH[1]}" echo "β Issue number from branch: #$ISSUE_NUMBER" else echo "β οΈ Warning: Cannot extract issue number from branch" echo "Enter issue number manually:" read ISSUE_NUMBER fi ``` ### Step 2: Build Commit Message ```bash # Get commit type echo "Select commit type:" echo " 1. feat - New feature" echo " 2. fix - Bug fix" echo " 3. refactor - Code restructuring" echo " 4. test - Tests" echo " 5. docs - Documentation" read -p "Choose (1-5): " TYPE_CHOICE case $TYPE_CHOICE in 1) COMMIT_TYPE="feat" ;; 2) COMMIT_TYPE="fix" ;; 3) COMMIT_TYPE="refactor" ;; 4) COMMIT_TYPE="test" ;; 5) COMMIT_TYPE="docs" ;; *) COMMIT_TYPE="feat" ;; esac # Get subject (from issue title or manual) ISSUE_TITLE=$1 # Optional parameter if [ -n "$ISSUE_TITLE" ]; then SUBJECT="$ISSUE_TITLE" else echo "Enter commit subject:" read SUBJECT fi # Get body details (from implementation summary or manual) IMPLEMENTATION_SUMMARY=$2 # Optional parameter if [ -n "$IMPLEMENTATION_SUMMARY" ]; then BODY="$IMPLEMENTATION_SUMMARY" else echo "Enter commit body (implementation details):" read BODY fi ``` ### Step 3: Format Commit Message ```bash # Build commit message using heredoc COMMIT_MESSAGE=$(cat <<EOF ${COMMIT_TYPE}: ${SUBJECT} ${BODY} Fixes #${ISSUE_NUMBER} π€ Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> EOF ) # Preview commit message echo "" echo "=== Commit Message Preview ===" echo "$COMMIT_MESSAGE" echo "=============================" echo "" ``` ### Step 4: Stage All Changes ```bash echo "β Staging all changes..." # Stage all changes (modified, new, deleted) git add . # Show what will be committed echo "" echo "Files to be committed:" git diff --cached --name-status echo "" # Count changes FILES_CHANGED=$(git diff --cached --name-only | wc -l) echo "Total files: $FILES_CHANGED" ``` ### Step 5: Validate Pre-Commit Requirements ```bash # CRITICAL: Verify no --no-verify flag will be used echo "β οΈ Pre-commit hooks will run (--no-verify is FORBIDDEN)" # Check if pre-commit hooks exist if [ -f .git/hooks/pre-commit ]; then echo "β Pre-commit hook found - will execute" HAS_HOOKS=true else echo "βΉοΈ No pre-commit hooks configured" HAS_HOOKS=false fi ``` ### Step 6: Create Commit ```bash echo "β Creating commit..." # Create commit with message (hooks run automatically) # NEVER use --no-verify (FORBIDDEN per CLAUDE.md) if git commit -m "$COMMIT_MESSAGE"; then COMMIT_HASH=$(git rev-parse --short HEAD) echo "β Commit created: $COMMIT_HASH" COMMIT_SUCCESS=true else COMMIT_EXIT_CODE=$? echo "β Commit failed (exit code: $COMMIT_EXIT_CODE)" COMMIT_SUCCESS=false fi ``` ### Step 7: Handle Pre-Commit Hook Failures ```bash if [ "$COMMIT_SUCCESS" = false ]; then echo "" echo "β οΈ Pre-commit hooks may have failed or rejected commit" echo "" echo "Common causes:" echo " - Linting errors" echo " - Formatting issues" echo " - Type errors" echo " - Test failures" echo "" echo "Actions:" echo " 1. Check hook output above" echo " 2. Fix issues" echo " 3. Re-run commit-with-validation" echo "" echo "β DO NOT use --no-verify to bypass hooks" exit $COMMIT_EXIT_CODE fi ``` ### Step 8: Handle Hook Auto-Fixes ```bash # If hooks modified files (e.g., prettier, eslint --fix) if [ -n "$(git status --porcelain)" ]; then echo "β οΈ Pre-commit hooks modified files" echo "" echo "Modified files:" git status --short echo "" # Check if we should amend (ONLY if safe) LAST_COMMIT_AUTHOR=$(git log -1 --format='%an %ae') CURRENT_USER="$(git config user.name) $(git config user.email)" if [ "$LAST_COMMIT_AUTHOR" = "$CURRENT_USER" ]; then # Check not pushed if git status | grep -q "Your branch is ahead"; then echo "Options:" echo " 1. Amend last commit (add hook fixes)" echo " 2. Create new commit with hook fixes" read -p "Choose (1/2): " AMEND_CHOICE if [ "$AMEND_CHOICE" = "1" ]; then git add . git commit --amend --no-edit echo "β Commit amended with hook fixes" else git add . git commit -m "chore: Apply pre-commit hook fixes" echo "β Created separate commit for hook fixes" fi else echo "β οΈ Commit already pushed - creating new commit for fixes" git add . git commit -m "chore: Apply pre-commit hook fixes" fi else echo "β οΈ Last commit not by you - creating new commit" git add . git commit -m "chore: Apply pre-commit hook fixes" fi fi ``` ### Step 9: Verify Commit ```bash echo "" echo "=== Commit Summary ===" git log -1 --stat echo "======================" # Return commit info COMMIT_HASH=$(git rev-parse HEAD) COMMIT_SHORT_HASH=$(git rev-parse --short HEAD) echo "" echo "β Commit successful" echo " Hash: $COMMIT_SHORT_HASH" echo " Message: ${COMMIT_TYPE}: ${SUBJECT}" echo " Issue: #${ISSUE_NUMBER}" echo " Files: $FILES_CHANGED" ``` ## Output Format ### Success ```json { "status": "success", "commit": { "hash": "a1b2c3d", "type": "feat", "subject": "Add user dark mode preference toggle", "issue": 137, "filesChanged": 12, "hookRan": true, "hookModified": false } } ``` ### Hooks Modified Files ```json { "status": "success", "commit": { "hash": "a1b2c3d", "amended": true, "hookModified": true, "hookChanges": ["Prettier formatted 3 files", "ESLint fixed 2 issues"] } } ``` ### Commit Failed (Hooks Rejected) ```json { "status": "error", "error": "Pre-commit hooks rejected commit", "issues": [ "Linting errors in src/components/Settings.tsx", "TypeScript errors in src/types/index.ts" ], "action": "Fix issues and retry - DO NOT use --no-verify" } ``` ## Integration with Conductor Used in conductor Phase 4, Step 2: ```markdown ### Phase 4: PR Creation and Documentation **Step 2: Create SINGLE Atomic Commit** β οΈ CRITICAL: This is the ONLY commit step in entire workflow. Use `commit-with-validation` skill: - Input: issue_number, issue_title, implementation_summary - Pre-commit hooks: Will run automatically - Validation: Tests, audit, build already passed (Phase 3) Expected result: - Single atomic commit with all changes - Proper issue linking: Fixes #137 - Pre-commit hooks executed successfully - Commit pushed to feature branch (not yet - push separately) If hooks fail: β Fix issues β Re-run commit-with-validation β NEVER use --no-verify If hooks modify files: β Option to amend commit (if safe) β Or create separate hook-fixes commit ``` ## Git Discipline Rules From CLAUDE.md: ### β MUST Do - Let pre-commit hooks run (they run automatically) - Create single atomic commit per feature - Use proper issue linking: `Fixes #123` - Include co-authoring attribution - Check authorship before amending ### β NEVER Do - `git commit --no-verify` (FORBIDDEN) - Force push to main/development (destructive) - Amend commits already pushed - Amend other developers' commits - Bypass hooks or validation ## Related Skills - `create-pull-request` - PR creation after commit - `push-with-retry` - Push commit with retry logic - `quality-gate` - Pre-commit validation ## Best Practices 1. **One commit per feature** - Atomic changes only 2. **Run quality gates first** - Commit only after validation passes 3. **Let hooks run** - Never bypass with --no-verify 4. **Check authorship** - Before amending commits 5. **Use heredoc for messages** - Ensures proper formatting 6. **Link issues properly** - `Fixes #123` exact format ## Notes - This is the ONLY commit point in conductor workflow - All quality validation happens before this step - Pre-commit hooks must succeed (no bypass) - Amend only if safe (not pushed, your commit) - Commit message format is standardized for consistency