--- description: Commit all changes with AI-generated message and push to current branch --- # Commit and Push Changes Automatically stage all changes, generate a comprehensive commit message based on the diff, commit with proper formatting, and push to the current branch. ## Introduction Git Workflow Automation Specialist This command analyzes your changes, generates a meaningful commit message following conventional commit standards, and pushes to your current working branch. ## Prerequisites - Git repository initialized - Changes to commit (tracked or untracked files) - Remote repository configured - Authentication set up for push operations ## Commit Message Override #$ARGUMENTS **Usage**: - `/es-commit` - Auto-generate commit message from changes - `/es-commit "Custom message"` - Use provided message ## Main Tasks ### 1. Pre-Commit Validation Before committing, verify the repository state and ensure we're ready to commit. **Check repository status**: ```bash # Verify we're in a git repository if ! git rev-parse --git-dir > /dev/null 2>&1; then echo "❌ Error: Not a git repository" exit 1 fi # Get current branch CURRENT_BRANCH=$(git branch --show-current) echo "📍 Current branch: $CURRENT_BRANCH" # Check if there are changes to commit if git diff --quiet && git diff --cached --quiet && [ -z "$(git ls-files --others --exclude-standard)" ]; then echo "✅ No changes to commit" exit 0 fi # Show status git status --short ``` ### 2. Analyze Changes Analyze what changed to generate an appropriate commit message. **Gather change information**: ```bash # Count changes ADDED=$(git ls-files --others --exclude-standard | wc -l) MODIFIED=$(git diff --name-only | wc -l) STAGED=$(git diff --cached --name-only | wc -l) DELETED=$(git ls-files --deleted | wc -l) echo "" echo "📊 Change Summary:" echo " Added: $ADDED files" echo " Modified: $MODIFIED files" echo " Staged: $STAGED files" echo " Deleted: $DELETED files" # Get detailed diff for commit message generation git diff --cached --stat git diff --stat ``` ### 3. Generate Commit Message If user didn't provide a message, generate one based on the changes. Use conventional commit format with proper categorization. **If no custom message provided**: Analyze the diff and generate a commit message following this format: ``` : 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude ``` **Commit type selection**: - `feat:` - New features or capabilities - `fix:` - Bug fixes - `refactor:` - Code restructuring without behavior change - `docs:` - Documentation only - `style:` - Formatting, whitespace, etc. - `perf:` - Performance improvements - `test:` - Adding or updating tests - `chore:` - Maintenance tasks, dependencies - `ci:` - CI/CD changes **Message generation guidelines**: 1. **Analyze file changes**: ```bash # Check which directories/files changed git diff --name-only HEAD git diff --cached --name-only git ls-files --others --exclude-standard ``` 2. **Categorize the changes**: - New files → likely `feat:` - Modified existing files → check diff content - Deleted files → `refactor:` or `chore:` - Documentation files → `docs:` - Config files → `chore:` or `ci:` 3. **Generate specific description**: - List key files changed - Explain WHY the change was made (not just WHAT) - Include impact/benefits - Reference related commands, agents, or SKILLs if relevant 4. **Example generated message**: ``` feat: Add automated commit workflow command Created /es-commit command to streamline git workflow by automatically staging changes, generating contextual commit messages, and pushing to the current working branch. Key features: - Auto-detects current branch (PR branches, feature branches, main) - Generates conventional commit messages from diff analysis - Supports custom commit messages via arguments - Validates repository state before committing - Automatically pushes to remote after successful commit Files added: - commands/es-commit.md (workflow automation command) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude ``` ### 4. Stage All Changes Stage all changes including untracked files. ```bash # Stage everything git add -A echo "✅ Staged all changes" ``` ### 5. Create Commit Commit with the generated or provided message. Use heredoc for proper formatting. **If custom message provided**: ```bash git commit -m "$(cat <<'EOF' $CUSTOM_MESSAGE 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude EOF )" ``` **If auto-generated message**: ```bash git commit -m "$(cat <<'EOF' $GENERATED_MESSAGE EOF )" ``` **Verify commit succeeded**: ```bash if [ $? -eq 0 ]; then echo "✅ Commit created successfully" git log -1 --oneline else echo "❌ Commit failed" exit 1 fi ``` ### 6. Push to Current Branch Push to the current branch (whether it's main, a feature branch, or a PR branch). Use -u flag to set upstream if not already set. ```bash # Get current branch again CURRENT_BRANCH=$(git branch --show-current) # Check if branch has upstream if git rev-parse --abbrev-ref @{upstream} > /dev/null 2>&1; then # Upstream exists, just push echo "📤 Pushing to origin/$CURRENT_BRANCH..." git push origin "$CURRENT_BRANCH" else # No upstream, set it with -u echo "📤 Pushing to origin/$CURRENT_BRANCH (setting upstream)..." git push -u origin "$CURRENT_BRANCH" fi if [ $? -eq 0 ]; then echo "✅ Pushed successfully to origin/$CURRENT_BRANCH" else echo "❌ Push failed" exit 1 fi ``` ### 7. Summary Report Final report showing what was committed and pushed ```markdown ## ✅ Commit Complete **Branch**: $CURRENT_BRANCH **Commit**: $(git log -1 --oneline) **Remote**: origin/$CURRENT_BRANCH ### Changes Committed: - Added: $ADDED files - Modified: $MODIFIED files - Deleted: $DELETED files ### Commit Message: ``` $COMMIT_MESSAGE ``` ### Next Steps: - View commit: `git log -1 -p` - View on GitHub: `gh browse` - Create PR: `gh pr create` (if on feature branch) ``` ## Usage Examples ### Auto-generate commit message ```bash /es-commit ``` ### Custom commit message ```bash /es-commit "fix: Resolve authentication timeout issue" ``` ### With detailed custom message ```bash /es-commit "feat: Add Polar.sh billing integration Complete implementation of Polar.sh billing with webhooks, subscription middleware, and D1 database schema." ``` ## Safety Features **Pre-commit checks**: - ✅ Verifies git repository exists - ✅ Shows status before committing - ✅ Validates changes exist - ✅ Confirms commit succeeded before pushing **Branch awareness**: - ✅ Always pushes to current branch (respects PR branches) - ✅ Sets upstream automatically if needed - ✅ Shows clear feedback on branch and remote **Message quality**: - ✅ Follows conventional commit standards - ✅ Includes Claude Code attribution - ✅ Provides detailed context from diff analysis ## Integration with Other Commands **Typical workflow**: 1. `/es-work` - Work on feature 2. `/es-validate` - Validate changes 3. `/es-commit` - Commit and push ← THIS COMMAND 4. `gh pr create` - Create PR (if on feature branch) **Or for quick iterations**: 1. Make changes 2. `/es-commit` - Auto-commit with generated message 3. Continue working ## Best Practices **Do's** ✅: - Run `/es-validate` before committing - Review the generated commit message - Use custom messages for complex changes - Let it auto-detect your current branch - Use on feature branches and main branch **Don'ts** ❌: - Don't commit secrets or credentials (command doesn't check) - Don't use for force pushes (not supported) - Don't amend commits (creates new commit) - Don't bypass hooks (respects all git hooks) ## Troubleshooting **Issue**: "Not a git repository" **Solution**: Run `git init` or navigate to repository root **Issue**: "No changes to commit" **Solution**: Make changes first or check if already committed **Issue**: "Push failed" **Solution**: Check authentication (`gh auth status`), verify remote exists **Issue**: "Commit message too generic" **Solution**: Provide custom message with `/es-commit "your message"` --- **Remember**: This command commits ALL changes (tracked and untracked). Review `git status` if you want to commit selectively.