The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml
You MUST have already loaded and processed: {installed_path}/workflow.yaml
Communicate all responses in {communication_language}
đ PUSH-ALL - Stage, commit, and push changes with comprehensive safety validation
⥠PARALLEL AGENT MODE: When {{target_files}} is provided:
- ONLY stage and commit the specified files
- Do NOT use `git add .` or `git add -A`
- Use `git add [specific files]` instead
- This prevents committing work from other parallel agents
đ ALL FILES MODE: When {{target_files}} is empty:
- Stage ALL changes with `git add .`
- Original behavior for single-agent execution
Run git commands in parallel:
- git status - Show modified/added/deleted/untracked files
- git diff --stat - Show change statistics
- git log -1 --oneline - Show recent commit for message style
- git branch --show-current - Confirm current branch
Parse git status output to identify:
- Modified files
- Added files
- Deleted files
- Untracked files
- Total insertion/deletion counts
HALT - No work to do
đ SAFETY CHECKS - Validate changes before committing
Scan all changed files for dangerous patterns:
**Secret Detection:**
Check for files matching secret patterns:
- .env*, *.key, *.pem, credentials.json, secrets.yaml
- id_rsa, *.p12, *.pfx, *.cer
- Any file containing: _API_KEY=, _SECRET=, _TOKEN= with real values (not placeholders)
Validate API keys are placeholders only:
â
Acceptable placeholders:
- API_KEY=your-api-key-here
- SECRET=placeholder
- TOKEN=xxx
- API_KEY=${{YOUR_KEY}}
- SECRET_KEY=<your-key>
â BLOCK real keys:
- OPENAI_API_KEY=sk-proj-xxxxx (real OpenAI key)
- AWS_SECRET_KEY=AKIA... (real AWS key)
- STRIPE_API_KEY=sk_live_... (real Stripe key)
- Any key with recognizable provider prefix + actual value
**File Size Check:**
Check for files >10MB without Git LFS configuration
**Build Artifacts:**
Check for unwanted directories/files that should be gitignored:
- node_modules/, dist/, build/, .next/, __pycache__/, *.pyc, .venv/
- .DS_Store, Thumbs.db, *.swp, *.tmp, *.log (in root)
- *.class, target/, bin/ (Java)
- vendor/ (unless dependency managed)
**Git State:**
Verify:
- .gitignore exists and properly configured
- No unresolved merge conflicts
- Git repository initialized
HALT - Cannot proceed with secrets
Proceed with large files anyway? [y/n]:
HALT
Commit build artifacts anyway? [y/n]:
HALT
Push directly to {{branch_name}}? [y/n]:
HALT
**Proceed with commit and push?**
Options:
[yes] - Proceed with commit and push
[no] - Cancel (leave changes unstaged)
[review] - Show detailed diff first
Execute: git diff --stat
Execute: git diff | head -100 (show first 100 lines of changes)
After reviewing, proceed with commit and push? [yes/no]:
HALT - User cancelled
Execute: git add {{target_files}}
Execute: git status
Execute: git add .
Execute: git status
đ COMMIT MESSAGE - Generate conventional commit format
Analyze changes to determine commit type:
- feat: New features (new files with functionality)
- fix: Bug fixes (fixing broken functionality)
- docs: Documentation only (*.md, comments)
- style: Formatting, missing semicolons (no code change)
- refactor: Code restructuring (no feature/fix)
- test: Adding/updating tests
- chore: Tooling, configs, dependencies
- perf: Performance improvements
Determine scope (optional):
- Component/feature name if changes focused on one area
- Omit if changes span multiple areas
Generate message summary (max 72 chars):
- Use imperative mood: "add feature" not "added feature"
- Lowercase except proper nouns
- No period at end
Generate message body (if changes >5 files):
- List key changes as bullet points
- Max 3-5 bullets
- Keep concise
Reference recent commits for style consistency
**Use this commit message?**
Options:
[yes] - Use generated message
[edit] - Let me write custom message
[cancel] - Cancel push-all (leave staged)
Enter your commit message (use conventional commit format if possible):
Store user input as {{commit_message}}
HALT
Use {{generated_commit_message}} as {{commit_message}}
Execute git commit with heredoc for multi-line message safety:
git commit -m "$(cat <<'EOF'
{{commit_message}}
EOF
)"
HALT - Fix errors before proceeding
Parse commit output for hash
Execute: git push
Execute: git pull --rebase
HALT - Resolve conflicts manually
Execute: git push
Execute: git push -u origin {{current_branch}}
HALT - Use PR workflow for protected branches
HALT - Fix authentication
HALT - Manual push required
Execute: git log -1 --oneline --decorate