Full Workflow Structure
Full Workflow Structure¶
For more complex workflows, use the full format with explicit configuration:
# Full format with environment and merge configuration
commands:
- shell: "cargo build"
- claude: "/prodigy-test"
# Global environment variables (available to all commands)
env:
NODE_ENV: production
API_URL: https://api.example.com
# Secret environment variables (masked in logs)
secrets:
API_KEY: "${env:SECRET_API_KEY}"
# Environment files to load (.env format)
env_files:
- .env.production
# Environment profiles (switch contexts easily)
profiles:
development:
NODE_ENV: development
DEBUG: "true"
# Custom merge workflow (for worktree integration)
# Simplified format (direct array of commands)
merge:
- shell: "git fetch origin"
- claude: "/prodigy-merge-worktree ${merge.source_branch} ${merge.target_branch}"
# OR with timeout (use config object format)
merge:
commands:
- shell: "git fetch origin"
- shell: "git merge origin/main"
- shell: "cargo test"
- claude: "/prodigy-merge-worktree ${merge.source_branch} ${merge.target_branch}"
timeout: 600 # Timeout in seconds for entire merge phase
Source: Merge workflow structure from src/config/mapreduce.rs:86-124
Merge Workflow Formats¶
Prodigy supports two formats for merge workflows:
-
Direct Array Format - For simple merge operations without timeout:
-
Config Object Format - When you need to specify a timeout:
When to Use Custom Merge Workflows:
Custom merge workflows execute when merging worktree changes back to the main branch. Use them for: - Pre-merge validation and testing - Automatic conflict resolution - Running CI checks before merge - Cleaning up temporary files
If no custom merge workflow is specified, Prodigy uses default merge behavior.
Source: Deserializer implementation in src/config/mapreduce.rs:96-124
Merge Context Variables¶
The following variables are available in merge workflows:
${merge.worktree}- Name of the worktree being merged${merge.source_branch}- Source branch (worktree branch)${merge.target_branch}- Target branch (your original branch when workflow started)${merge.session_id}- Session ID for correlation and debugging
Example with all variables:
merge:
- shell: |
echo "Merging worktree: ${merge.worktree}"
echo "From: ${merge.source_branch}"
echo "To: ${merge.target_branch}"
echo "Session: ${merge.session_id}"
- claude: "/validate-merge --branch ${merge.source_branch}"
- claude: "/prodigy-merge-worktree ${merge.source_branch} ${merge.target_branch}"
Source: Variable substitution from tests/merge_workflow_integration.rs:274-290
Real-World Examples¶
Example 1: Pre-merge Validation (from workflows/implement.yml:32-42):
merge:
- claude: "/prodigy-merge-master" # Merge main into worktree first
- claude: "/prodigy-ci" # Run CI checks and auto-fix issues
- claude: "/prodigy-merge-worktree ${merge.source_branch} ${merge.target_branch}"
Example 2: Cleanup and Testing (from workflows/workflow-syntax-drift.yml:38-49):
merge:
- shell: "rm -rf .prodigy/syntax-analysis"
- shell: "git add -A && git commit -m 'chore: cleanup temp files' || true"
- shell: "git fetch origin"
- claude: "/prodigy-merge-master"
- claude: "/prodigy-merge-worktree ${merge.source_branch} ${merge.target_branch}"
Example 3: With Environment Variables (from workflows/mapreduce-env-example.yml:82-94):