feat(n8n-expert): add create-workflow workflow
- Add workflow.yaml with configuration and variables - Add instructions.md with full elicitation and Context7 integration - Add checklist.md for validation - Supports building n8n workflows from scratch with smart elicitation
This commit is contained in:
parent
9edc699a8f
commit
02d07ed254
|
|
@ -0,0 +1,74 @@
|
||||||
|
# Create n8n Workflow - Validation Checklist
|
||||||
|
|
||||||
|
## Workflow Structure
|
||||||
|
|
||||||
|
- [ ] Workflow has a valid name
|
||||||
|
- [ ] Workflow contains at least one trigger node
|
||||||
|
- [ ] All nodes have unique IDs
|
||||||
|
- [ ] All nodes have unique names
|
||||||
|
- [ ] Workflow JSON is valid and parseable
|
||||||
|
|
||||||
|
## Node Configuration
|
||||||
|
|
||||||
|
- [ ] Trigger node is properly configured
|
||||||
|
- [ ] All action nodes have required parameters set
|
||||||
|
- [ ] Node types are valid n8n node types
|
||||||
|
- [ ] Node positions are set and don't overlap
|
||||||
|
- [ ] TypeVersion is set for all nodes (usually 1)
|
||||||
|
|
||||||
|
## Connections
|
||||||
|
|
||||||
|
- [ ] All nodes are connected (no orphaned nodes except trigger)
|
||||||
|
- [ ] All connections reference existing node names
|
||||||
|
- [ ] Connection types are set correctly (usually "main")
|
||||||
|
- [ ] Connection indices are correct (0 for default, 0/1 for IF nodes)
|
||||||
|
- [ ] No circular dependencies (unless intentional loops)
|
||||||
|
|
||||||
|
## Error Handling
|
||||||
|
|
||||||
|
- [ ] Error handling strategy matches requirements
|
||||||
|
- [ ] Critical nodes have retry logic if needed
|
||||||
|
- [ ] continueOnFail is set appropriately
|
||||||
|
- [ ] maxTries and waitBetweenTries are configured if retries enabled
|
||||||
|
|
||||||
|
## Data Flow
|
||||||
|
|
||||||
|
- [ ] Data transformations are properly configured
|
||||||
|
- [ ] Set nodes have correct value mappings
|
||||||
|
- [ ] Code nodes have valid JavaScript/Python code
|
||||||
|
- [ ] Expressions use correct n8n syntax (={{ }})
|
||||||
|
|
||||||
|
## Integrations
|
||||||
|
|
||||||
|
- [ ] All required integrations are included
|
||||||
|
- [ ] Credential placeholders are set for authenticated services
|
||||||
|
- [ ] API endpoints and methods are correct
|
||||||
|
- [ ] Request/response formats are properly configured
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
- [ ] Workflow follows n8n naming conventions
|
||||||
|
- [ ] Nodes are logically organized and positioned
|
||||||
|
- [ ] Complex logic is broken into manageable steps
|
||||||
|
- [ ] Workflow is documented (node names are descriptive)
|
||||||
|
|
||||||
|
## Testing Readiness
|
||||||
|
|
||||||
|
- [ ] Workflow can be imported into n8n without errors
|
||||||
|
- [ ] All required credentials are identified
|
||||||
|
- [ ] Test data requirements are clear
|
||||||
|
- [ ] Expected outputs are defined
|
||||||
|
|
||||||
|
## File Output
|
||||||
|
|
||||||
|
- [ ] File is saved to correct location
|
||||||
|
- [ ] File has .json extension
|
||||||
|
- [ ] File is valid JSON (passes JSON.parse)
|
||||||
|
- [ ] File size is reasonable (not corrupted)
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
- [ ] User has been informed how to import workflow
|
||||||
|
- [ ] Credential requirements have been communicated
|
||||||
|
- [ ] Testing instructions have been provided
|
||||||
|
- [ ] Any special configuration notes have been shared
|
||||||
|
|
@ -0,0 +1,350 @@
|
||||||
|
# Create n8n Workflow - Workflow Instructions
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<critical>The workflow execution engine is governed by: {project_root}/{bmad_folder}/core/tasks/workflow.xml</critical>
|
||||||
|
<critical>You MUST have already loaded and processed: {installed_path}/workflow.yaml</critical>
|
||||||
|
<critical>This workflow creates a new n8n workflow from scratch based on user requirements.</critical>
|
||||||
|
|
||||||
|
<workflow>
|
||||||
|
|
||||||
|
<step n="0" goal="Contextual Analysis (Smart Elicitation)">
|
||||||
|
<critical>Before asking any questions, analyze what the user has already told you</critical>
|
||||||
|
|
||||||
|
<action>Review the user's initial request and conversation history</action>
|
||||||
|
<action>Extract any mentioned: workflow type, trigger, integrations, complexity, requirements</action>
|
||||||
|
|
||||||
|
<check if="ALL requirements are clear from context">
|
||||||
|
<action>Summarize your understanding</action>
|
||||||
|
<action>Skip directly to Step 2 (Check Context7 MCP)</action>
|
||||||
|
</check>
|
||||||
|
|
||||||
|
<check if="SOME requirements are clear">
|
||||||
|
<action>Note what you already know</action>
|
||||||
|
<action>Only ask about missing information in Step 1</action>
|
||||||
|
</check>
|
||||||
|
|
||||||
|
<check if="requirements are unclear or minimal">
|
||||||
|
<action>Proceed with full elicitation in Step 1</action>
|
||||||
|
</check>
|
||||||
|
</step>
|
||||||
|
|
||||||
|
<step n="1" goal="Gather Requirements" elicit="true">
|
||||||
|
<action>Ask Question 1: "What type of automation workflow do you need?"</action>
|
||||||
|
<action>Present numbered options:
|
||||||
|
1. Webhook-based - Receive HTTP requests and process data
|
||||||
|
2. Scheduled - Run on a schedule (cron/interval)
|
||||||
|
3. Event-driven - Trigger from external service events
|
||||||
|
4. Manual - Execute on demand
|
||||||
|
5. Database-driven - Trigger from database changes
|
||||||
|
6. Other - Describe your specific trigger needs
|
||||||
|
</action>
|
||||||
|
<action>WAIT for user selection (1-6)</action>
|
||||||
|
<action>Store selection in {{workflow_type}}</action>
|
||||||
|
|
||||||
|
<check if="selection is 6 (Other)">
|
||||||
|
<action>Ask: "Please describe your trigger requirements"</action>
|
||||||
|
<action>WAIT for user input</action>
|
||||||
|
<action>Store in {{workflow_type}}</action>
|
||||||
|
</check>
|
||||||
|
|
||||||
|
<action>Ask Question 2: "What integrations or services will this workflow use?"</action>
|
||||||
|
<action>Present numbered options:
|
||||||
|
1. HTTP/REST APIs - Generic API calls
|
||||||
|
2. Databases - PostgreSQL, MySQL, MongoDB, etc.
|
||||||
|
3. Cloud Services - Google Sheets, Slack, Notion, Airtable
|
||||||
|
4. Email - Send/receive emails
|
||||||
|
5. CRM - HubSpot, Salesforce, etc.
|
||||||
|
6. Custom Code - JavaScript/Python logic
|
||||||
|
7. Multiple - Combination of above
|
||||||
|
8. Other - Specify integrations
|
||||||
|
</action>
|
||||||
|
<action>WAIT for user selection (1-8)</action>
|
||||||
|
<action>Store selection in {{integrations}}</action>
|
||||||
|
|
||||||
|
<check if="selection is 7 or 8">
|
||||||
|
<action>Ask: "Please list all integrations needed (comma-separated)"</action>
|
||||||
|
<action>WAIT for user input</action>
|
||||||
|
<action>Store in {{integrations}}</action>
|
||||||
|
</check>
|
||||||
|
|
||||||
|
<action>Ask Question 3: "How complex is your workflow logic?"</action>
|
||||||
|
<action>Present numbered options:
|
||||||
|
1. Simple (3-5 nodes) - Linear flow with minimal logic
|
||||||
|
2. Medium (6-10 nodes) - Some conditional logic or branching
|
||||||
|
3. Complex (11-20 nodes) - Multiple branches, loops, or error handling
|
||||||
|
4. Very Complex (20+ nodes) - Advanced logic with parallel processing
|
||||||
|
</action>
|
||||||
|
<action>WAIT for user selection (1-4)</action>
|
||||||
|
<action>Store selection in {{complexity}}</action>
|
||||||
|
|
||||||
|
<action>Ask Question 4: "Do you need error handling and retry logic?"</action>
|
||||||
|
<action>Present numbered options:
|
||||||
|
1. No - Simple workflow without error handling
|
||||||
|
2. Basic - Retry failed operations automatically
|
||||||
|
3. Advanced - Custom error handling with notifications
|
||||||
|
4. Comprehensive - Full error workflow with logging and alerts
|
||||||
|
</action>
|
||||||
|
<action>WAIT for user selection (1-4)</action>
|
||||||
|
<action>Store selection in {{error_handling}}</action>
|
||||||
|
|
||||||
|
<action>Ask Question 5: "What should the workflow be named?"</action>
|
||||||
|
<action>WAIT for user input</action>
|
||||||
|
<action>Store in {{workflow_name}}</action>
|
||||||
|
|
||||||
|
<action>Ask Question 6: "Where should the workflow file be saved?"</action>
|
||||||
|
<action>Present numbered options:
|
||||||
|
1. Default location - workflows/[workflow-name].json
|
||||||
|
2. Custom path - Specify your own file path
|
||||||
|
3. Project root - Save in main project directory
|
||||||
|
4. Specific folder - Choose from existing folders
|
||||||
|
</action>
|
||||||
|
<action>WAIT for user selection (1-4)</action>
|
||||||
|
<check if="selection is 2 or 4">
|
||||||
|
<action>Ask for specific path</action>
|
||||||
|
<action>WAIT for user input</action>
|
||||||
|
</check>
|
||||||
|
<action>Store final path in {{save_location}}</action>
|
||||||
|
|
||||||
|
<action>Ask Question 7: "Any additional requirements or specific logic needed?"</action>
|
||||||
|
<action>Present numbered options:
|
||||||
|
1. No - Proceed with current requirements
|
||||||
|
2. Yes - Describe additional requirements
|
||||||
|
</action>
|
||||||
|
<action>WAIT for user selection (1-2)</action>
|
||||||
|
<check if="selection is 2">
|
||||||
|
<action>Ask: "Please describe additional requirements"</action>
|
||||||
|
<action>WAIT for user input</action>
|
||||||
|
<action>Store in {{additional_requirements}}</action>
|
||||||
|
</check>
|
||||||
|
</step>
|
||||||
|
|
||||||
|
<step n="2" goal="Check Context7 MCP Availability">
|
||||||
|
<action>Check if Context7 MCP server is configured</action>
|
||||||
|
<action>Try to list available MCP tools</action>
|
||||||
|
|
||||||
|
<check if="Context7 MCP is available">
|
||||||
|
<action>Store true in {{context7_available}}</action>
|
||||||
|
<action>Proceed to Step 3</action>
|
||||||
|
</check>
|
||||||
|
|
||||||
|
<check if="Context7 MCP is NOT available">
|
||||||
|
<action>Store false in {{context7_available}}</action>
|
||||||
|
<action>Inform user: "Context7 MCP server is not configured. This provides up-to-date n8n documentation."</action>
|
||||||
|
<action>Ask: "Would you like help setting up Context7 MCP? (yes/no)"</action>
|
||||||
|
<action>WAIT for user response</action>
|
||||||
|
|
||||||
|
<check if="user says yes">
|
||||||
|
<action>Guide user through Context7 MCP setup:</action>
|
||||||
|
<action>1. Inform user: "Context7 MCP requires the 'uvx' command (part of uv Python package manager)"</action>
|
||||||
|
<action>2. Ask: "Do you have 'uv' installed? (yes/no/not sure)"</action>
|
||||||
|
<action>WAIT for response</action>
|
||||||
|
|
||||||
|
<check if="user says no or not sure">
|
||||||
|
<action>Provide installation guidance:</action>
|
||||||
|
<action>- macOS/Linux: curl -LsSf https://astral.sh/uv/install.sh | sh</action>
|
||||||
|
<action>- Windows: powershell -c "irm https://astral.sh/uv/install.ps1 | iex"</action>
|
||||||
|
<action>- Or via pip: pip install uv</action>
|
||||||
|
<action>Ask user to install and confirm when ready</action>
|
||||||
|
<action>WAIT for confirmation</action>
|
||||||
|
</check>
|
||||||
|
|
||||||
|
<action>3. Inform user: "Please configure Context7 MCP in your IDE's MCP settings with:"</action>
|
||||||
|
<action>
|
||||||
|
Server name: context7
|
||||||
|
Command: uvx
|
||||||
|
Args: ["context7"]
|
||||||
|
Auto-approve tools: ["resolve-library-id", "get-library-docs"]
|
||||||
|
</action>
|
||||||
|
<action>4. Ask user to reconnect/restart MCP servers in their IDE</action>
|
||||||
|
<action>5. Wait for user confirmation that MCP is reconnected</action>
|
||||||
|
<action>6. Verify Context7 is now available</action>
|
||||||
|
<action>Store result in {{context7_available}}</action>
|
||||||
|
</check>
|
||||||
|
|
||||||
|
<check if="user says no">
|
||||||
|
<action>Inform: "Proceeding without Context7. Using built-in n8n knowledge."</action>
|
||||||
|
<action>Proceed to Step 4</action>
|
||||||
|
</check>
|
||||||
|
</check>
|
||||||
|
</step>
|
||||||
|
|
||||||
|
<step n="3" goal="Query Context7 for n8n Documentation">
|
||||||
|
<check if="{{context7_available}} is true">
|
||||||
|
<action>Resolve n8n library ID using Context7</action>
|
||||||
|
<action>Query Context7 for relevant n8n documentation based on:</action>
|
||||||
|
<action>- Workflow type: {{workflow_type}}</action>
|
||||||
|
<action>- Integrations: {{integrations}}</action>
|
||||||
|
<action>- Complexity: {{complexity}}</action>
|
||||||
|
<action>Store relevant documentation snippets for reference</action>
|
||||||
|
</check>
|
||||||
|
|
||||||
|
<check if="{{context7_available}} is false">
|
||||||
|
<action>Skip Context7 query</action>
|
||||||
|
<action>Use built-in knowledge and templates</action>
|
||||||
|
</check>
|
||||||
|
</step>
|
||||||
|
|
||||||
|
<step n="4" goal="Plan Workflow Structure">
|
||||||
|
<action>Based on gathered requirements, plan the workflow structure:</action>
|
||||||
|
<action>1. Identify trigger node type</action>
|
||||||
|
<action>2. List all action nodes needed</action>
|
||||||
|
<action>3. Identify conditional logic (IF nodes)</action>
|
||||||
|
<action>4. Plan data transformations (Set/Code nodes)</action>
|
||||||
|
<action>5. Design error handling strategy</action>
|
||||||
|
<action>6. Map node connections</action>
|
||||||
|
|
||||||
|
<action>Present the planned structure to user in clear format:</action>
|
||||||
|
<action>- Trigger: [trigger type]</action>
|
||||||
|
<action>- Nodes: [list of nodes with descriptions]</action>
|
||||||
|
<action>- Logic: [conditional branches, loops]</action>
|
||||||
|
<action>- Error Handling: [strategy]</action>
|
||||||
|
|
||||||
|
<action>Ask: "Does this structure meet your needs?"</action>
|
||||||
|
<action>Present numbered options:
|
||||||
|
1. Yes - Proceed with this structure
|
||||||
|
2. No - Adjust the structure
|
||||||
|
3. Add more details - Provide additional requirements
|
||||||
|
</action>
|
||||||
|
<action>WAIT for user selection (1-3)</action>
|
||||||
|
|
||||||
|
<check if="selection is 2 or 3">
|
||||||
|
<action>Ask: "What changes or additions are needed?"</action>
|
||||||
|
<action>WAIT for user input</action>
|
||||||
|
<action>Adjust structure based on feedback</action>
|
||||||
|
<action>Repeat this step</action>
|
||||||
|
</check>
|
||||||
|
</step>
|
||||||
|
|
||||||
|
<step n="5" goal="Load Templates and Resources">
|
||||||
|
<action>Load {{templates}} file</action>
|
||||||
|
<action>Identify closest matching template based on workflow type</action>
|
||||||
|
<action>Load {{helpers}} for node creation guidelines</action>
|
||||||
|
<action>Extract relevant template sections</action>
|
||||||
|
</step>
|
||||||
|
|
||||||
|
<step n="6" goal="Build Workflow JSON">
|
||||||
|
<critical>Follow guidelines from {{helpers}} for proper node creation</critical>
|
||||||
|
|
||||||
|
<action>Initialize workflow structure:</action>
|
||||||
|
<substep>
|
||||||
|
{
|
||||||
|
"name": "{{workflow_name}}",
|
||||||
|
"nodes": [],
|
||||||
|
"connections": {},
|
||||||
|
"active": false,
|
||||||
|
"settings": {
|
||||||
|
"executionOrder": "v1"
|
||||||
|
},
|
||||||
|
"tags": []
|
||||||
|
}
|
||||||
|
</substep>
|
||||||
|
|
||||||
|
<action>Build nodes ONE at a time following these rules:</action>
|
||||||
|
|
||||||
|
<substep>For Each Node:
|
||||||
|
1. Generate unique node ID
|
||||||
|
2. Set node name (unique, descriptive)
|
||||||
|
3. Set node type (e.g., n8n-nodes-base.webhook)
|
||||||
|
4. Set typeVersion (usually 1)
|
||||||
|
5. Calculate position:
|
||||||
|
- First node (trigger): [250, 300]
|
||||||
|
- Subsequent nodes: add 220 to x for each step
|
||||||
|
- Branches: adjust y by ±100
|
||||||
|
6. Configure parameters based on node type
|
||||||
|
7. Add credentials if needed
|
||||||
|
8. Set error handling options if required:
|
||||||
|
- continueOnFail: true/false
|
||||||
|
- retryOnFail: true/false
|
||||||
|
- maxTries: number
|
||||||
|
- waitBetweenTries: milliseconds
|
||||||
|
</substep>
|
||||||
|
|
||||||
|
<substep>For Each Connection:
|
||||||
|
1. Identify source node name
|
||||||
|
2. Identify target node name
|
||||||
|
3. Create connection entry in connections object:
|
||||||
|
"Source Node Name": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Target Node Name",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
4. For IF nodes:
|
||||||
|
- index 0 = true branch
|
||||||
|
- index 1 = false branch
|
||||||
|
5. Validate all referenced nodes exist
|
||||||
|
</substep>
|
||||||
|
|
||||||
|
<substep>Node Building Order:
|
||||||
|
1. Trigger node
|
||||||
|
2. Main flow action nodes
|
||||||
|
3. Conditional nodes (IF/Switch)
|
||||||
|
4. Branch nodes
|
||||||
|
5. Merge nodes
|
||||||
|
6. Final action nodes
|
||||||
|
7. Connect all nodes
|
||||||
|
</substep>
|
||||||
|
|
||||||
|
<action>Apply error handling based on {{error_handling}} selection</action>
|
||||||
|
<action>Validate all node IDs are unique</action>
|
||||||
|
<action>Validate all node names are unique</action>
|
||||||
|
<action>Validate all connections reference existing nodes</action>
|
||||||
|
</step>
|
||||||
|
|
||||||
|
<step n="7" goal="Optimize and Save">
|
||||||
|
<action>Review workflow for optimization:</action>
|
||||||
|
<action>- Remove any unused nodes</action>
|
||||||
|
<action>- Verify node positions don't overlap</action>
|
||||||
|
<action>- Ensure proper spacing and alignment</action>
|
||||||
|
<action>- Validate all required parameters are set</action>
|
||||||
|
|
||||||
|
<action>Save workflow to {{save_location}}</action>
|
||||||
|
</step>
|
||||||
|
|
||||||
|
<step n="8" goal="Validate JSON Syntax">
|
||||||
|
<critical>NEVER delete the file if validation fails - always fix syntax errors</critical>
|
||||||
|
|
||||||
|
<action>Run: node -e "JSON.parse(require('fs').readFileSync('{{save_location}}', 'utf8')); console.log('✓ Valid JSON')"</action>
|
||||||
|
|
||||||
|
<check if="validation fails (exit code 1)">
|
||||||
|
<action>Read the error message carefully - it shows the syntax error and position</action>
|
||||||
|
<action>Open the file and navigate to the error location</action>
|
||||||
|
<action>Fix the syntax error (add missing comma, bracket, or quote as indicated)</action>
|
||||||
|
<action>Save the file</action>
|
||||||
|
<action>Re-run validation with the same command</action>
|
||||||
|
<action>Repeat until validation passes</action>
|
||||||
|
</check>
|
||||||
|
|
||||||
|
<action>Once validation passes, confirm with user: "n8n workflow created at {{save_location}}"</action>
|
||||||
|
</step>
|
||||||
|
|
||||||
|
<step n="9" goal="Provide Usage Instructions">
|
||||||
|
<action>Inform user how to use the workflow:</action>
|
||||||
|
<action>1. Import the JSON file into n8n</action>
|
||||||
|
<action>2. Configure credentials for integrated services</action>
|
||||||
|
<action>3. Test the workflow with sample data</action>
|
||||||
|
<action>4. Activate the workflow when ready</action>
|
||||||
|
|
||||||
|
<action>Ask: "Would you like me to explain any part of the workflow?"</action>
|
||||||
|
<action>Present numbered options:
|
||||||
|
1. No - I'm good to go
|
||||||
|
2. Yes - Explain specific nodes
|
||||||
|
3. Yes - Explain the overall flow
|
||||||
|
4. Yes - Explain how to test it
|
||||||
|
</action>
|
||||||
|
<action>WAIT for user selection (1-4)</action>
|
||||||
|
|
||||||
|
<check if="selection is 2, 3, or 4">
|
||||||
|
<action>Provide requested explanation</action>
|
||||||
|
</check>
|
||||||
|
</step>
|
||||||
|
|
||||||
|
<step n="10" goal="Validate Content">
|
||||||
|
<invoke-task>Validate against checklist at {{validation}} using {{bmad_folder}}/core/tasks/validate-workflow.xml</invoke-task>
|
||||||
|
</step>
|
||||||
|
|
||||||
|
</workflow>
|
||||||
|
```
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
name: create-workflow
|
||||||
|
description: "Create new n8n workflow from scratch based on requirements"
|
||||||
|
author: "Saif"
|
||||||
|
|
||||||
|
# Workflow components
|
||||||
|
installed_path: "{project-root}/{bmad_folder}/bmm/workflows/n8n-expert/create-workflow"
|
||||||
|
shared_path: "{project-root}/{bmad_folder}/bmm/workflows/n8n-expert/_shared"
|
||||||
|
instructions: "{installed_path}/instructions.md"
|
||||||
|
validation: "{installed_path}/checklist.md"
|
||||||
|
|
||||||
|
# Shared resources
|
||||||
|
helpers: "{shared_path}/n8n-helpers.md"
|
||||||
|
templates: "{shared_path}/n8n-templates.yaml"
|
||||||
|
platform_mappings: "{shared_path}/platform-mappings.yaml"
|
||||||
|
|
||||||
|
# Variables
|
||||||
|
variables:
|
||||||
|
workflow_type: "" # Will be elicited
|
||||||
|
trigger_type: "" # Will be elicited
|
||||||
|
integrations: [] # Will be elicited
|
||||||
|
complexity: "" # Will be elicited
|
||||||
|
error_handling: "" # Will be elicited
|
||||||
|
save_location: "" # Will be elicited
|
||||||
|
workflow_name: "" # Will be elicited
|
||||||
|
additional_requirements: "" # Will be elicited
|
||||||
|
context7_available: false # Will be checked
|
||||||
|
|
||||||
|
default_output_file: "{project-root}/workflows/workflow-{timestamp}.json"
|
||||||
|
|
||||||
|
standalone: true
|
||||||
|
web_bundle: false
|
||||||
Loading…
Reference in New Issue