Add workflow triggers documentation and default triggers to all workflows

Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-01-10 14:32:47 +00:00
parent f395031366
commit c16f12a6b3
17 changed files with 1447 additions and 193 deletions

306
WORKFLOW_TRIGGERS.md Normal file
View File

@@ -0,0 +1,306 @@
# Workflow Triggers Documentation
## Overview
Workflow triggers define how and when a workflow should be executed. They are part of the n8n workflow schema and provide a standardized way to specify workflow entry points.
## Trigger Schema
According to `n8n_schema.py`, triggers have the following structure:
```json
{
"nodeId": "node_id", // ID of the node to start execution from
"kind": "manual|webhook|...", // Type of trigger
"enabled": true, // Whether trigger is active
"meta": { // Optional metadata
"description": "..."
}
}
```
### Trigger Kinds
Valid trigger types defined in `N8NTrigger.VALID_KINDS`:
- **manual**: Manually initiated workflow (CLI, API call)
- **webhook**: HTTP webhook endpoint
- **schedule**: Cron/scheduled execution
- **queue**: Message queue trigger
- **email**: Email-based trigger
- **poll**: Polling-based trigger
- **other**: Custom trigger types
## Current Usage
### Example: Single Pass Workflow
The `single_pass` workflow package demonstrates trigger usage:
```json
{
"name": "Single Pass",
"nodes": [...],
"connections": {...},
"triggers": [
{
"nodeId": "load_context",
"kind": "manual",
"enabled": true,
"meta": {
"description": "Manually triggered single-pass workflow execution"
}
}
]
}
```
## Potential Use Cases for Different Trigger Types
### 1. Manual Triggers
**Current Implementation**: Default for most workflows
- CLI-initiated workflows
- API-triggered workflows
- Development/testing workflows
### 2. Webhook Triggers (Future)
**Use Cases**:
- GitHub webhook integration (PR creation, issue updates)
- Slack command integration
- Discord bot commands
- External service integrations
**Example Configuration**:
```json
{
"nodeId": "handle_github_event",
"kind": "webhook",
"enabled": true,
"meta": {
"path": "/webhooks/github",
"method": "POST",
"event_types": ["pull_request", "issues"]
}
}
```
### 3. Schedule Triggers (Future)
**Use Cases**:
- Daily roadmap analysis
- Weekly progress reports
- Periodic issue cleanup
- Automated dependency updates
**Example Configuration**:
```json
{
"nodeId": "analyze_roadmap",
"kind": "schedule",
"enabled": true,
"meta": {
"cron": "0 9 * * *",
"timezone": "UTC",
"description": "Daily roadmap analysis at 9 AM UTC"
}
}
```
### 4. Queue Triggers (Future)
**Use Cases**:
- Task queue processing
- Background job execution
- Async workflow execution
- Load balancing
**Example Configuration**:
```json
{
"nodeId": "process_task",
"kind": "queue",
"enabled": true,
"meta": {
"queue_name": "workflow_tasks",
"concurrency": 5
}
}
```
### 5. Email Triggers (Future)
**Use Cases**:
- Email-based task creation
- Support ticket workflows
- Email monitoring
**Example Configuration**:
```json
{
"nodeId": "process_email",
"kind": "email",
"enabled": true,
"meta": {
"filter": "subject:contains('[Task]')",
"folder": "inbox"
}
}
```
### 6. Poll Triggers (Future)
**Use Cases**:
- Monitoring external APIs
- Checking for file changes
- Detecting state changes
**Example Configuration**:
```json
{
"nodeId": "check_api_status",
"kind": "poll",
"enabled": true,
"meta": {
"interval": "5m",
"endpoint": "https://api.example.com/status"
}
}
```
## Implementation Status
### ✅ Implemented
- Trigger schema validation (`N8NTrigger.validate()`)
- Trigger array validation in workflows
- Manual trigger support (default execution)
### 🚧 Partially Implemented
- Trigger metadata storage
- Trigger-based entry point selection
### ❌ Not Yet Implemented
- Webhook trigger handling
- Schedule trigger execution
- Queue trigger processing
- Email trigger monitoring
- Poll trigger execution
- Trigger event routing
## Recommendations for Better Trigger Utilization
### 1. Add Trigger Execution Logic
Create a `TriggerManager` class in the workflow engine:
```python
class TriggerManager:
"""Manage workflow trigger execution."""
def get_enabled_triggers(self, workflow):
"""Return list of enabled triggers."""
return [t for t in workflow.get("triggers", []) if t.get("enabled", True)]
def get_start_nodes(self, workflow, trigger_kind=None):
"""Get start node IDs for given trigger kind."""
triggers = self.get_enabled_triggers(workflow)
if trigger_kind:
triggers = [t for t in triggers if t["kind"] == trigger_kind]
return [t["nodeId"] for t in triggers]
```
### 2. Support Multiple Triggers per Workflow
Current workflows support multiple triggers but execution starts from a fixed point. Enable:
- Trigger-specific entry points
- Parallel trigger execution
- Trigger-specific contexts
### 3. Create Trigger-Specific Workflow Packages
Add workflow packages for different trigger types:
- `webhook_handler/` - HTTP webhook workflows
- `scheduled_tasks/` - Cron-based workflows
- `event_processor/` - Queue-based workflows
### 4. Add Trigger Plugins
Create workflow plugins for trigger management:
- `trigger.register` - Register new triggers
- `trigger.enable` - Enable/disable triggers
- `trigger.list` - List workflow triggers
- `trigger.invoke` - Manually invoke a trigger
### 5. Web UI Integration
Add trigger management to the web interface:
- List all triggers across workflows
- Enable/disable triggers dynamically
- View trigger execution history
- Configure trigger metadata
## Migration Path
For existing workflows without triggers, add default manual trigger:
```json
{
"triggers": [
{
"nodeId": "first_node_id",
"kind": "manual",
"enabled": true
}
]
}
```
## Best Practices
1. **Always define triggers** - Make workflow entry points explicit
2. **Use descriptive metadata** - Document trigger purpose and configuration
3. **Start with manual triggers** - Simplest to implement and test
4. **Plan for multiple triggers** - Design workflows to support different entry points
5. **Validate trigger configuration** - Use `N8NTrigger.validate()` before execution
6. **Document trigger requirements** - List prerequisites in workflow package README
## Example: Multi-Trigger Workflow
```json
{
"name": "CI/CD Pipeline",
"nodes": [...],
"connections": {...},
"triggers": [
{
"nodeId": "webhook_handler",
"kind": "webhook",
"enabled": true,
"meta": {
"description": "Triggered by GitHub PR webhook",
"path": "/webhooks/github/pr"
}
},
{
"nodeId": "scheduled_check",
"kind": "schedule",
"enabled": true,
"meta": {
"description": "Daily scheduled PR review",
"cron": "0 10 * * *"
}
},
{
"nodeId": "manual_run",
"kind": "manual",
"enabled": true,
"meta": {
"description": "Manually triggered pipeline run"
}
}
]
}
```
## Future Enhancements
1. **Trigger History** - Log all trigger executions
2. **Trigger Metrics** - Track trigger performance
3. **Trigger Dependencies** - Define trigger prerequisites
4. **Trigger Chains** - Link triggers across workflows
5. **Conditional Triggers** - Add trigger conditions
6. **Trigger Testing** - Unit test framework for triggers

View File

@@ -145,5 +145,15 @@
]
}
}
}
},
"triggers": [
{
"nodeId": "load_messages",
"kind": "manual",
"enabled": true,
"meta": {
"description": "Initialize backend services and dependencies"
}
}
]
}

View File

@@ -7,7 +7,10 @@
"name": "Create User Data",
"type": "var.set",
"typeVersion": 1,
"position": [0, 100],
"position": [
0,
100
],
"parameters": {
"key": "user",
"value": {
@@ -23,7 +26,10 @@
"name": "Extract Age",
"type": "dict.get",
"typeVersion": 1,
"position": [300, 50],
"position": [
300,
50
],
"parameters": {
"object": "$user",
"key": "age"
@@ -34,7 +40,10 @@
"name": "Check If Adult",
"type": "logic.gte",
"typeVersion": 1,
"position": [600, 100],
"position": [
600,
100
],
"parameters": {
"a": "$age",
"b": 18
@@ -45,7 +54,10 @@
"name": "Format Final Report",
"type": "string.format",
"typeVersion": 1,
"position": [900, 100],
"position": [
900,
100
],
"parameters": {
"template": "User: {name}, Age: {age}, Adult: {is_adult}",
"variables": {
@@ -90,5 +102,15 @@
]
}
}
}
},
"triggers": [
{
"nodeId": "create_user_data",
"kind": "manual",
"enabled": true,
"meta": {
"description": "Manually triggered Conditional Logic Demo workflow execution"
}
}
]
}

View File

@@ -173,5 +173,15 @@
]
}
}
}
}
},
"triggers": [
{
"nodeId": "list_files",
"kind": "manual",
"enabled": true,
"meta": {
"description": "Manually triggered meta.workflow_packages.contextual_iterative_loop.label workflow execution"
}
}
]
}

View File

@@ -7,10 +7,24 @@
"name": "Create Sample Data",
"type": "var.set",
"typeVersion": 1,
"position": [0, 50],
"position": [
0,
50
],
"parameters": {
"key": "numbers",
"value": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
"value": [
1,
2,
3,
4,
5,
6,
7,
8,
9,
10
]
}
},
{
@@ -18,7 +32,10 @@
"name": "Filter Even Numbers",
"type": "utils.filter_list",
"typeVersion": 1,
"position": [300, 50],
"position": [
300,
50
],
"parameters": {
"items": "$numbers",
"mode": "lambda",
@@ -30,7 +47,10 @@
"name": "Square Each Number",
"type": "utils.map_list",
"typeVersion": 1,
"position": [600, 50],
"position": [
600,
50
],
"parameters": {
"items": "$filtered_numbers",
"transform": "lambda x: x * x"
@@ -41,7 +61,10 @@
"name": "Sum All Values",
"type": "math.add",
"typeVersion": 1,
"position": [900, 50],
"position": [
900,
50
],
"parameters": {
"numbers": "$squared_numbers"
}
@@ -51,7 +74,10 @@
"name": "Check If Sum > 50",
"type": "logic.gt",
"typeVersion": 1,
"position": [1200, 50],
"position": [
1200,
50
],
"parameters": {
"a": "$sum",
"b": 50
@@ -62,7 +88,10 @@
"name": "Branch On Result",
"type": "utils.branch_condition",
"typeVersion": 1,
"position": [1500, 50],
"position": [
1500,
50
],
"parameters": {
"condition": "$is_greater"
}
@@ -72,7 +101,10 @@
"name": "Format Success Message",
"type": "string.format",
"typeVersion": 1,
"position": [1800, 0],
"position": [
1800,
0
],
"parameters": {
"template": "Success! Sum is {sum}, which is greater than 50.",
"variables": {
@@ -85,7 +117,10 @@
"name": "Format Failure Message",
"type": "string.format",
"typeVersion": 1,
"position": [1800, 100],
"position": [
1800,
100
],
"parameters": {
"template": "Sum is {sum}, which is not greater than 50.",
"variables": {
@@ -98,7 +133,10 @@
"name": "Store Final Result",
"type": "var.set",
"typeVersion": 1,
"position": [2100, 50],
"position": [
2100,
50
],
"parameters": {
"key": "final_message",
"value": "$message"
@@ -201,5 +239,15 @@
]
}
}
}
},
"triggers": [
{
"nodeId": "create_sample_data",
"kind": "manual",
"enabled": true,
"meta": {
"description": "Manually triggered Data Processing Demo workflow execution"
}
}
]
}

View File

@@ -7,7 +7,10 @@
"name": "Load Messages",
"type": "backend.load_messages",
"typeVersion": 1,
"position": [0, 0],
"position": [
0,
0
],
"parameters": {}
},
{
@@ -15,7 +18,10 @@
"name": "Load Metadata",
"type": "backend.load_metadata",
"typeVersion": 1,
"position": [300, 0],
"position": [
300,
0
],
"parameters": {}
},
{
@@ -23,7 +29,10 @@
"name": "Load Prompt",
"type": "backend.load_prompt",
"typeVersion": 1,
"position": [600, 0],
"position": [
600,
0
],
"parameters": {}
},
{
@@ -31,7 +40,10 @@
"name": "Create GitHub Client",
"type": "backend.create_github",
"typeVersion": 1,
"position": [900, 0],
"position": [
900,
0
],
"parameters": {}
},
{
@@ -39,7 +51,10 @@
"name": "Create OpenAI Client",
"type": "backend.create_openai",
"typeVersion": 1,
"position": [1200, 0],
"position": [
1200,
0
],
"parameters": {}
},
{
@@ -47,7 +62,10 @@
"name": "Load Tools",
"type": "backend.load_tools",
"typeVersion": 1,
"position": [1500, 0],
"position": [
1500,
0
],
"parameters": {}
},
{
@@ -55,7 +73,10 @@
"name": "Build Tool Map",
"type": "backend.build_tool_map",
"typeVersion": 1,
"position": [1800, 0],
"position": [
1800,
0
],
"parameters": {}
},
{
@@ -63,7 +84,10 @@
"name": "Load Plugins",
"type": "backend.load_plugins",
"typeVersion": 1,
"position": [2100, 0],
"position": [
2100,
0
],
"parameters": {}
},
{
@@ -71,7 +95,10 @@
"name": "Load Tool Policies",
"type": "backend.load_tool_policies",
"typeVersion": 1,
"position": [2400, 0],
"position": [
2400,
0
],
"parameters": {}
},
{
@@ -79,7 +106,10 @@
"name": "Load Context",
"type": "core.load_context",
"typeVersion": 1,
"position": [0, 300],
"position": [
0,
300
],
"parameters": {}
},
{
@@ -87,7 +117,10 @@
"name": "Seed Messages",
"type": "core.seed_messages",
"typeVersion": 1,
"position": [300, 300],
"position": [
300,
300
],
"parameters": {}
},
{
@@ -95,7 +128,10 @@
"name": "Append Context",
"type": "core.append_context_message",
"typeVersion": 1,
"position": [600, 300],
"position": [
600,
300
],
"parameters": {}
},
{
@@ -103,7 +139,10 @@
"name": "Append User Instruction",
"type": "core.append_user_instruction",
"typeVersion": 1,
"position": [900, 300],
"position": [
900,
300
],
"parameters": {}
},
{
@@ -111,7 +150,10 @@
"name": "Main Loop",
"type": "control.loop",
"typeVersion": 1,
"position": [1200, 300],
"position": [
1200,
300
],
"parameters": {
"max_iterations": 10,
"stop_when": "$no_tool_calls",
@@ -123,7 +165,10 @@
"name": "AI Request",
"type": "core.ai_request",
"typeVersion": 1,
"position": [1500, 300],
"position": [
1500,
300
],
"parameters": {}
},
{
@@ -131,7 +176,10 @@
"name": "Run Tool Calls",
"type": "core.run_tool_calls",
"typeVersion": 1,
"position": [1800, 300],
"position": [
1800,
300
],
"parameters": {}
},
{
@@ -139,7 +187,10 @@
"name": "Append Tool Results",
"type": "core.append_tool_results",
"typeVersion": 1,
"position": [2100, 300],
"position": [
2100,
300
],
"parameters": {}
}
],
@@ -331,5 +382,15 @@
]
}
}
}
},
"triggers": [
{
"nodeId": "load_messages",
"kind": "manual",
"enabled": true,
"meta": {
"description": "Manually triggered Default Application Workflow workflow execution"
}
}
]
}

View File

@@ -7,114 +7,306 @@
"name": "Test Get",
"type": "dict.get",
"typeVersion": 1,
"position": [0, 0],
"parameters": {"object": {"name": "Alice", "age": 30}, "key": "name"}
"position": [
0,
0
],
"parameters": {
"object": {
"name": "Alice",
"age": 30
},
"key": "name"
}
},
{
"id": "assert_get",
"name": "Assert Get Value",
"type": "test.assert_equals",
"typeVersion": 1,
"position": [300, 0],
"parameters": {"actual": "$test_get.result", "expected": "Alice", "message": "dict.get should retrieve value"}
"position": [
300,
0
],
"parameters": {
"actual": "$test_get.result",
"expected": "Alice",
"message": "dict.get should retrieve value"
}
},
{
"id": "assert_get_found",
"name": "Assert Get Found",
"type": "test.assert_true",
"typeVersion": 1,
"position": [600, 0],
"parameters": {"value": "$test_get.found", "message": "dict.get should set found flag"}
"position": [
600,
0
],
"parameters": {
"value": "$test_get.found",
"message": "dict.get should set found flag"
}
},
{
"id": "test_set",
"name": "Test Set",
"type": "dict.set",
"typeVersion": 1,
"position": [0, 100],
"parameters": {"object": {"a": 1}, "key": "b", "value": 2}
"position": [
0,
100
],
"parameters": {
"object": {
"a": 1
},
"key": "b",
"value": 2
}
},
{
"id": "test_get_new_key",
"name": "Test Get New Key",
"type": "dict.get",
"typeVersion": 1,
"position": [300, 100],
"parameters": {"object": "$test_set.result", "key": "b"}
"position": [
300,
100
],
"parameters": {
"object": "$test_set.result",
"key": "b"
}
},
{
"id": "assert_set",
"name": "Assert Set Value",
"type": "test.assert_equals",
"typeVersion": 1,
"position": [600, 100],
"parameters": {"actual": "$test_get_new_key.result", "expected": 2, "message": "dict.set should add new key"}
"position": [
600,
100
],
"parameters": {
"actual": "$test_get_new_key.result",
"expected": 2,
"message": "dict.set should add new key"
}
},
{
"id": "test_keys",
"name": "Test Keys",
"type": "dict.keys",
"typeVersion": 1,
"position": [0, 200],
"parameters": {"object": {"a": 1, "b": 2, "c": 3}}
"position": [
0,
200
],
"parameters": {
"object": {
"a": 1,
"b": 2,
"c": 3
}
}
},
{
"id": "assert_keys_length",
"name": "Assert Keys Length",
"type": "list.length",
"typeVersion": 1,
"position": [300, 200],
"parameters": {"items": "$test_keys.result"}
"position": [
300,
200
],
"parameters": {
"items": "$test_keys.result"
}
},
{
"id": "assert_keys",
"name": "Assert Keys Count",
"type": "test.assert_equals",
"typeVersion": 1,
"position": [600, 200],
"parameters": {"actual": "$assert_keys_length.result", "expected": 3, "message": "dict.keys should return all keys"}
"position": [
600,
200
],
"parameters": {
"actual": "$assert_keys_length.result",
"expected": 3,
"message": "dict.keys should return all keys"
}
},
{
"id": "test_merge",
"name": "Test Merge",
"type": "dict.merge",
"typeVersion": 1,
"position": [0, 300],
"parameters": {"objects": [{"a": 1}, {"b": 2}, {"c": 3}]}
"position": [
0,
300
],
"parameters": {
"objects": [
{
"a": 1
},
{
"b": 2
},
{
"c": 3
}
]
}
},
{
"id": "test_merged_keys",
"name": "Get Merged Keys",
"type": "dict.keys",
"typeVersion": 1,
"position": [300, 300],
"parameters": {"object": "$test_merge.result"}
"position": [
300,
300
],
"parameters": {
"object": "$test_merge.result"
}
},
{
"id": "assert_merge_length",
"name": "Assert Merge Length",
"type": "list.length",
"typeVersion": 1,
"position": [600, 300],
"parameters": {"items": "$test_merged_keys.result"}
"position": [
600,
300
],
"parameters": {
"items": "$test_merged_keys.result"
}
},
{
"id": "assert_merge",
"name": "Assert Merge",
"type": "test.assert_equals",
"typeVersion": 1,
"position": [900, 300],
"parameters": {"actual": "$assert_merge_length.result", "expected": 3, "message": "dict.merge should merge dicts"}
"position": [
900,
300
],
"parameters": {
"actual": "$assert_merge_length.result",
"expected": 3,
"message": "dict.merge should merge dicts"
}
}
],
"connections": {
"Test Get": {"main": {"0": [{"node": "Assert Get Value", "type": "main", "index": 0}, {"node": "Assert Get Found", "type": "main", "index": 0}]}},
"Test Set": {"main": {"0": [{"node": "Test Get New Key", "type": "main", "index": 0}]}},
"Test Get New Key": {"main": {"0": [{"node": "Assert Set Value", "type": "main", "index": 0}]}},
"Test Keys": {"main": {"0": [{"node": "Assert Keys Length", "type": "main", "index": 0}]}},
"Assert Keys Length": {"main": {"0": [{"node": "Assert Keys Count", "type": "main", "index": 0}]}},
"Test Merge": {"main": {"0": [{"node": "Get Merged Keys", "type": "main", "index": 0}]}},
"Get Merged Keys": {"main": {"0": [{"node": "Assert Merge Length", "type": "main", "index": 0}]}},
"Assert Merge Length": {"main": {"0": [{"node": "Assert Merge", "type": "main", "index": 0}]}}
}
"Test Get": {
"main": {
"0": [
{
"node": "Assert Get Value",
"type": "main",
"index": 0
},
{
"node": "Assert Get Found",
"type": "main",
"index": 0
}
]
}
},
"Test Set": {
"main": {
"0": [
{
"node": "Test Get New Key",
"type": "main",
"index": 0
}
]
}
},
"Test Get New Key": {
"main": {
"0": [
{
"node": "Assert Set Value",
"type": "main",
"index": 0
}
]
}
},
"Test Keys": {
"main": {
"0": [
{
"node": "Assert Keys Length",
"type": "main",
"index": 0
}
]
}
},
"Assert Keys Length": {
"main": {
"0": [
{
"node": "Assert Keys Count",
"type": "main",
"index": 0
}
]
}
},
"Test Merge": {
"main": {
"0": [
{
"node": "Get Merged Keys",
"type": "main",
"index": 0
}
]
}
},
"Get Merged Keys": {
"main": {
"0": [
{
"node": "Assert Merge Length",
"type": "main",
"index": 0
}
]
}
},
"Assert Merge Length": {
"main": {
"0": [
{
"node": "Assert Merge",
"type": "main",
"index": 0
}
]
}
}
},
"triggers": [
{
"nodeId": "test_get",
"kind": "manual",
"enabled": true,
"meta": {
"description": "Manually triggered Dict Plugins Test Suite workflow execution"
}
}
]
}

View File

@@ -109,5 +109,15 @@
]
}
}
}
}
},
"triggers": [
{
"nodeId": "seed_messages",
"kind": "manual",
"enabled": true,
"meta": {
"description": "Manually triggered meta.workflow_packages.game_tick_loop.label workflow execution"
}
}
]
}

View File

@@ -184,5 +184,15 @@
]
}
}
}
}
},
"triggers": [
{
"nodeId": "load_context",
"kind": "manual",
"enabled": true,
"meta": {
"description": "Manually triggered Iterative Agent Loop workflow execution"
}
}
]
}

View File

@@ -7,96 +7,271 @@
"name": "Test Concat",
"type": "list.concat",
"typeVersion": 1,
"position": [0, 0],
"parameters": {"lists": [[1, 2], [3, 4], [5]]}
"position": [
0,
0
],
"parameters": {
"lists": [
[
1,
2
],
[
3,
4
],
[
5
]
]
}
},
{
"id": "assert_concat_length",
"name": "Assert Concat Length",
"type": "list.length",
"typeVersion": 1,
"position": [300, 0],
"parameters": {"items": "$test_concat.result"}
"position": [
300,
0
],
"parameters": {
"items": "$test_concat.result"
}
},
{
"id": "assert_concat",
"name": "Assert Concat",
"type": "test.assert_equals",
"typeVersion": 1,
"position": [600, 0],
"parameters": {"actual": "$assert_concat_length.result", "expected": 5, "message": "list.concat should concatenate lists"}
"position": [
600,
0
],
"parameters": {
"actual": "$assert_concat_length.result",
"expected": 5,
"message": "list.concat should concatenate lists"
}
},
{
"id": "test_length",
"name": "Test Length",
"type": "list.length",
"typeVersion": 1,
"position": [0, 100],
"parameters": {"items": [1, 2, 3, 4, 5]}
"position": [
0,
100
],
"parameters": {
"items": [
1,
2,
3,
4,
5
]
}
},
{
"id": "assert_length",
"name": "Assert Length",
"type": "test.assert_equals",
"typeVersion": 1,
"position": [300, 100],
"parameters": {"actual": "$test_length.result", "expected": 5, "message": "list.length should count items"}
"position": [
300,
100
],
"parameters": {
"actual": "$test_length.result",
"expected": 5,
"message": "list.length should count items"
}
},
{
"id": "test_slice",
"name": "Test Slice",
"type": "list.slice",
"typeVersion": 1,
"position": [0, 200],
"parameters": {"items": [1, 2, 3, 4, 5], "start": 1, "end": 3}
"position": [
0,
200
],
"parameters": {
"items": [
1,
2,
3,
4,
5
],
"start": 1,
"end": 3
}
},
{
"id": "assert_slice_length",
"name": "Assert Slice Length",
"type": "list.length",
"typeVersion": 1,
"position": [300, 200],
"parameters": {"items": "$test_slice.result"}
"position": [
300,
200
],
"parameters": {
"items": "$test_slice.result"
}
},
{
"id": "assert_slice",
"name": "Assert Slice",
"type": "test.assert_equals",
"typeVersion": 1,
"position": [600, 200],
"parameters": {"actual": "$assert_slice_length.result", "expected": 2, "message": "list.slice should extract slice"}
"position": [
600,
200
],
"parameters": {
"actual": "$assert_slice_length.result",
"expected": 2,
"message": "list.slice should extract slice"
}
},
{
"id": "test_find",
"name": "Test Find",
"type": "list.find",
"typeVersion": 1,
"position": [0, 300],
"parameters": {"items": [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}], "key": "name", "value": "Bob"}
"position": [
0,
300
],
"parameters": {
"items": [
{
"id": 1,
"name": "Alice"
},
{
"id": 2,
"name": "Bob"
}
],
"key": "name",
"value": "Bob"
}
},
{
"id": "assert_find",
"name": "Assert Find Result",
"type": "test.assert_exists",
"typeVersion": 1,
"position": [300, 300],
"parameters": {"value": "$test_find.result", "message": "list.find should find item"}
"position": [
300,
300
],
"parameters": {
"value": "$test_find.result",
"message": "list.find should find item"
}
},
{
"id": "assert_find_found",
"name": "Assert Found Flag",
"type": "test.assert_true",
"typeVersion": 1,
"position": [600, 300],
"parameters": {"value": "$test_find.found", "message": "list.find should set found flag"}
"position": [
600,
300
],
"parameters": {
"value": "$test_find.found",
"message": "list.find should set found flag"
}
}
],
"connections": {
"Test Concat": {"main": {"0": [{"node": "Assert Concat Length", "type": "main", "index": 0}]}},
"Assert Concat Length": {"main": {"0": [{"node": "Assert Concat", "type": "main", "index": 0}]}},
"Test Length": {"main": {"0": [{"node": "Assert Length", "type": "main", "index": 0}]}},
"Test Slice": {"main": {"0": [{"node": "Assert Slice Length", "type": "main", "index": 0}]}},
"Assert Slice Length": {"main": {"0": [{"node": "Assert Slice", "type": "main", "index": 0}]}},
"Test Find": {"main": {"0": [{"node": "Assert Find Result", "type": "main", "index": 0}, {"node": "Assert Found Flag", "type": "main", "index": 0}]}}
}
"Test Concat": {
"main": {
"0": [
{
"node": "Assert Concat Length",
"type": "main",
"index": 0
}
]
}
},
"Assert Concat Length": {
"main": {
"0": [
{
"node": "Assert Concat",
"type": "main",
"index": 0
}
]
}
},
"Test Length": {
"main": {
"0": [
{
"node": "Assert Length",
"type": "main",
"index": 0
}
]
}
},
"Test Slice": {
"main": {
"0": [
{
"node": "Assert Slice Length",
"type": "main",
"index": 0
}
]
}
},
"Assert Slice Length": {
"main": {
"0": [
{
"node": "Assert Slice",
"type": "main",
"index": 0
}
]
}
},
"Test Find": {
"main": {
"0": [
{
"node": "Assert Find Result",
"type": "main",
"index": 0
},
{
"node": "Assert Found Flag",
"type": "main",
"index": 0
}
]
}
}
},
"triggers": [
{
"nodeId": "test_concat",
"kind": "manual",
"enabled": true,
"meta": {
"description": "Manually triggered List Plugins Test Suite workflow execution"
}
}
]
}

View File

@@ -7,9 +7,16 @@
"name": "Test AND (all true)",
"type": "logic.and",
"typeVersion": 1,
"position": [0, 0],
"position": [
0,
0
],
"parameters": {
"values": [true, true, true]
"values": [
true,
true,
true
]
}
},
{
@@ -17,7 +24,10 @@
"name": "Assert AND result is true",
"type": "test.assert_true",
"typeVersion": 1,
"position": [300, 0],
"position": [
300,
0
],
"parameters": {
"value": "$test_and_true.result",
"message": "logic.and with all true values should return true"
@@ -28,9 +38,16 @@
"name": "Test AND (with false)",
"type": "logic.and",
"typeVersion": 1,
"position": [0, 100],
"position": [
0,
100
],
"parameters": {
"values": [true, false, true]
"values": [
true,
false,
true
]
}
},
{
@@ -38,7 +55,10 @@
"name": "Assert AND result is false",
"type": "test.assert_false",
"typeVersion": 1,
"position": [300, 100],
"position": [
300,
100
],
"parameters": {
"value": "$test_and_false.result",
"message": "logic.and with any false value should return false"
@@ -49,9 +69,16 @@
"name": "Test OR (with true)",
"type": "logic.or",
"typeVersion": 1,
"position": [0, 200],
"position": [
0,
200
],
"parameters": {
"values": [false, false, true]
"values": [
false,
false,
true
]
}
},
{
@@ -59,7 +86,10 @@
"name": "Assert OR result is true",
"type": "test.assert_true",
"typeVersion": 1,
"position": [300, 200],
"position": [
300,
200
],
"parameters": {
"value": "$test_or_true.result",
"message": "logic.or with any true value should return true"
@@ -70,9 +100,16 @@
"name": "Test OR (all false)",
"type": "logic.or",
"typeVersion": 1,
"position": [0, 300],
"position": [
0,
300
],
"parameters": {
"values": [false, false, false]
"values": [
false,
false,
false
]
}
},
{
@@ -80,7 +117,10 @@
"name": "Assert OR result is false",
"type": "test.assert_false",
"typeVersion": 1,
"position": [300, 300],
"position": [
300,
300
],
"parameters": {
"value": "$test_or_false.result",
"message": "logic.or with all false values should return false"
@@ -91,7 +131,10 @@
"name": "Test Equals (same)",
"type": "logic.equals",
"typeVersion": 1,
"position": [0, 400],
"position": [
0,
400
],
"parameters": {
"a": 42,
"b": 42
@@ -102,7 +145,10 @@
"name": "Assert Equals is true",
"type": "test.assert_true",
"typeVersion": 1,
"position": [300, 400],
"position": [
300,
400
],
"parameters": {
"value": "$test_equals_true.result",
"message": "logic.equals with same values should return true"
@@ -113,7 +159,10 @@
"name": "Test Equals (different)",
"type": "logic.equals",
"typeVersion": 1,
"position": [0, 500],
"position": [
0,
500
],
"parameters": {
"a": 42,
"b": 24
@@ -124,7 +173,10 @@
"name": "Assert Equals is false",
"type": "test.assert_false",
"typeVersion": 1,
"position": [300, 500],
"position": [
300,
500
],
"parameters": {
"value": "$test_equals_false.result",
"message": "logic.equals with different values should return false"
@@ -135,7 +187,10 @@
"name": "Test Greater Than",
"type": "logic.gt",
"typeVersion": 1,
"position": [0, 600],
"position": [
0,
600
],
"parameters": {
"a": 10,
"b": 5
@@ -146,7 +201,10 @@
"name": "Assert GT is true",
"type": "test.assert_true",
"typeVersion": 1,
"position": [300, 600],
"position": [
300,
600
],
"parameters": {
"value": "$test_gt.result",
"message": "logic.gt should return true when a > b"
@@ -157,7 +215,10 @@
"name": "Test Less Than",
"type": "logic.lt",
"typeVersion": 1,
"position": [0, 700],
"position": [
0,
700
],
"parameters": {
"a": 3,
"b": 7
@@ -168,7 +229,10 @@
"name": "Assert LT is true",
"type": "test.assert_true",
"typeVersion": 1,
"position": [300, 700],
"position": [
300,
700
],
"parameters": {
"value": "$test_lt.result",
"message": "logic.lt should return true when a < b"
@@ -264,5 +328,15 @@
]
}
}
}
},
"triggers": [
{
"nodeId": "test_and_true",
"kind": "manual",
"enabled": true,
"meta": {
"description": "Manually triggered Logic Plugins Test Suite workflow execution"
}
}
]
}

View File

@@ -7,104 +7,270 @@
"name": "Test Add",
"type": "math.add",
"typeVersion": 1,
"position": [0, 0],
"parameters": {"numbers": [1, 2, 3, 4, 5]}
"position": [
0,
0
],
"parameters": {
"numbers": [
1,
2,
3,
4,
5
]
}
},
{
"id": "assert_add",
"name": "Assert Add equals 15",
"type": "test.assert_equals",
"typeVersion": 1,
"position": [300, 0],
"parameters": {"actual": "$test_add.result", "expected": 15, "message": "math.add should sum all numbers"}
"position": [
300,
0
],
"parameters": {
"actual": "$test_add.result",
"expected": 15,
"message": "math.add should sum all numbers"
}
},
{
"id": "test_multiply",
"name": "Test Multiply",
"type": "math.multiply",
"typeVersion": 1,
"position": [0, 100],
"parameters": {"numbers": [2, 3, 4]}
"position": [
0,
100
],
"parameters": {
"numbers": [
2,
3,
4
]
}
},
{
"id": "assert_multiply",
"name": "Assert Multiply equals 24",
"type": "test.assert_equals",
"typeVersion": 1,
"position": [300, 100],
"parameters": {"actual": "$test_multiply.result", "expected": 24, "message": "math.multiply should multiply all numbers"}
"position": [
300,
100
],
"parameters": {
"actual": "$test_multiply.result",
"expected": 24,
"message": "math.multiply should multiply all numbers"
}
},
{
"id": "test_subtract",
"name": "Test Subtract",
"type": "math.subtract",
"typeVersion": 1,
"position": [0, 200],
"parameters": {"a": 10, "b": 3}
"position": [
0,
200
],
"parameters": {
"a": 10,
"b": 3
}
},
{
"id": "assert_subtract",
"name": "Assert Subtract equals 7",
"type": "test.assert_equals",
"typeVersion": 1,
"position": [300, 200],
"parameters": {"actual": "$test_subtract.result", "expected": 7, "message": "math.subtract should return a - b"}
"position": [
300,
200
],
"parameters": {
"actual": "$test_subtract.result",
"expected": 7,
"message": "math.subtract should return a - b"
}
},
{
"id": "test_divide",
"name": "Test Divide",
"type": "math.divide",
"typeVersion": 1,
"position": [0, 300],
"parameters": {"a": 20, "b": 4}
"position": [
0,
300
],
"parameters": {
"a": 20,
"b": 4
}
},
{
"id": "assert_divide",
"name": "Assert Divide equals 5",
"type": "test.assert_equals",
"typeVersion": 1,
"position": [300, 300],
"parameters": {"actual": "$test_divide.result", "expected": 5, "message": "math.divide should return a / b"}
"position": [
300,
300
],
"parameters": {
"actual": "$test_divide.result",
"expected": 5,
"message": "math.divide should return a / b"
}
},
{
"id": "test_max",
"name": "Test Max",
"type": "math.max",
"typeVersion": 1,
"position": [0, 400],
"parameters": {"numbers": [3, 7, 2, 9, 1]}
"position": [
0,
400
],
"parameters": {
"numbers": [
3,
7,
2,
9,
1
]
}
},
{
"id": "assert_max",
"name": "Assert Max equals 9",
"type": "test.assert_equals",
"typeVersion": 1,
"position": [300, 400],
"parameters": {"actual": "$test_max.result", "expected": 9, "message": "math.max should return maximum value"}
"position": [
300,
400
],
"parameters": {
"actual": "$test_max.result",
"expected": 9,
"message": "math.max should return maximum value"
}
},
{
"id": "test_min",
"name": "Test Min",
"type": "math.min",
"typeVersion": 1,
"position": [0, 500],
"parameters": {"numbers": [3, 7, 2, 9, 1]}
"position": [
0,
500
],
"parameters": {
"numbers": [
3,
7,
2,
9,
1
]
}
},
{
"id": "assert_min",
"name": "Assert Min equals 1",
"type": "test.assert_equals",
"typeVersion": 1,
"position": [300, 500],
"parameters": {"actual": "$test_min.result", "expected": 1, "message": "math.min should return minimum value"}
"position": [
300,
500
],
"parameters": {
"actual": "$test_min.result",
"expected": 1,
"message": "math.min should return minimum value"
}
}
],
"connections": {
"Test Add": {"main": {"0": [{"node": "Assert Add equals 15", "type": "main", "index": 0}]}},
"Test Multiply": {"main": {"0": [{"node": "Assert Multiply equals 24", "type": "main", "index": 0}]}},
"Test Subtract": {"main": {"0": [{"node": "Assert Subtract equals 7", "type": "main", "index": 0}]}},
"Test Divide": {"main": {"0": [{"node": "Assert Divide equals 5", "type": "main", "index": 0}]}},
"Test Max": {"main": {"0": [{"node": "Assert Max equals 9", "type": "main", "index": 0}]}},
"Test Min": {"main": {"0": [{"node": "Assert Min equals 1", "type": "main", "index": 0}]}}
}
"Test Add": {
"main": {
"0": [
{
"node": "Assert Add equals 15",
"type": "main",
"index": 0
}
]
}
},
"Test Multiply": {
"main": {
"0": [
{
"node": "Assert Multiply equals 24",
"type": "main",
"index": 0
}
]
}
},
"Test Subtract": {
"main": {
"0": [
{
"node": "Assert Subtract equals 7",
"type": "main",
"index": 0
}
]
}
},
"Test Divide": {
"main": {
"0": [
{
"node": "Assert Divide equals 5",
"type": "main",
"index": 0
}
]
}
},
"Test Max": {
"main": {
"0": [
{
"node": "Assert Max equals 9",
"type": "main",
"index": 0
}
]
}
},
"Test Min": {
"main": {
"0": [
{
"node": "Assert Min equals 1",
"type": "main",
"index": 0
}
]
}
}
},
"triggers": [
{
"nodeId": "test_add",
"kind": "manual",
"enabled": true,
"meta": {
"description": "Manually triggered Math Plugins Test Suite workflow execution"
}
}
]
}

View File

@@ -170,5 +170,15 @@
]
}
}
}
}
},
"triggers": [
{
"nodeId": "load_context",
"kind": "manual",
"enabled": true,
"meta": {
"description": "Manually triggered meta.workflow_packages.plan_execute_summarize.label workflow execution"
}
}
]
}

View File

@@ -205,5 +205,15 @@
]
}
}
}
}
},
"triggers": [
{
"nodeId": "list_files",
"kind": "manual",
"enabled": true,
"meta": {
"description": "Manually triggered meta.workflow_packages.repo_scan_context.label workflow execution"
}
}
]
}

View File

@@ -7,96 +7,236 @@
"name": "Test Concat",
"type": "string.concat",
"typeVersion": 1,
"position": [0, 0],
"parameters": {"strings": ["Hello", "World"], "separator": " "}
"position": [
0,
0
],
"parameters": {
"strings": [
"Hello",
"World"
],
"separator": " "
}
},
{
"id": "assert_concat",
"name": "Assert Concat",
"type": "test.assert_equals",
"typeVersion": 1,
"position": [300, 0],
"parameters": {"actual": "$test_concat.result", "expected": "Hello World", "message": "string.concat should join strings"}
"position": [
300,
0
],
"parameters": {
"actual": "$test_concat.result",
"expected": "Hello World",
"message": "string.concat should join strings"
}
},
{
"id": "test_upper",
"name": "Test Upper",
"type": "string.upper",
"typeVersion": 1,
"position": [0, 100],
"parameters": {"text": "hello"}
"position": [
0,
100
],
"parameters": {
"text": "hello"
}
},
{
"id": "assert_upper",
"name": "Assert Upper",
"type": "test.assert_equals",
"typeVersion": 1,
"position": [300, 100],
"parameters": {"actual": "$test_upper.result", "expected": "HELLO", "message": "string.upper should uppercase text"}
"position": [
300,
100
],
"parameters": {
"actual": "$test_upper.result",
"expected": "HELLO",
"message": "string.upper should uppercase text"
}
},
{
"id": "test_lower",
"name": "Test Lower",
"type": "string.lower",
"typeVersion": 1,
"position": [0, 200],
"parameters": {"text": "WORLD"}
"position": [
0,
200
],
"parameters": {
"text": "WORLD"
}
},
{
"id": "assert_lower",
"name": "Assert Lower",
"type": "test.assert_equals",
"typeVersion": 1,
"position": [300, 200],
"parameters": {"actual": "$test_lower.result", "expected": "world", "message": "string.lower should lowercase text"}
"position": [
300,
200
],
"parameters": {
"actual": "$test_lower.result",
"expected": "world",
"message": "string.lower should lowercase text"
}
},
{
"id": "test_split",
"name": "Test Split",
"type": "string.split",
"typeVersion": 1,
"position": [0, 300],
"parameters": {"text": "a,b,c", "separator": ","}
"position": [
0,
300
],
"parameters": {
"text": "a,b,c",
"separator": ","
}
},
{
"id": "assert_split_length",
"name": "Assert Split Length",
"type": "list.length",
"typeVersion": 1,
"position": [300, 300],
"parameters": {"items": "$test_split.result"}
"position": [
300,
300
],
"parameters": {
"items": "$test_split.result"
}
},
{
"id": "assert_split",
"name": "Assert Split Count",
"type": "test.assert_equals",
"typeVersion": 1,
"position": [600, 300],
"parameters": {"actual": "$assert_split_length.result", "expected": 3, "message": "string.split should split into array"}
"position": [
600,
300
],
"parameters": {
"actual": "$assert_split_length.result",
"expected": 3,
"message": "string.split should split into array"
}
},
{
"id": "test_length",
"name": "Test Length",
"type": "string.length",
"typeVersion": 1,
"position": [0, 400],
"parameters": {"text": "Hello"}
"position": [
0,
400
],
"parameters": {
"text": "Hello"
}
},
{
"id": "assert_length",
"name": "Assert Length",
"type": "test.assert_equals",
"typeVersion": 1,
"position": [300, 400],
"parameters": {"actual": "$test_length.result", "expected": 5, "message": "string.length should return character count"}
"position": [
300,
400
],
"parameters": {
"actual": "$test_length.result",
"expected": 5,
"message": "string.length should return character count"
}
}
],
"connections": {
"Test Concat": {"main": {"0": [{"node": "Assert Concat", "type": "main", "index": 0}]}},
"Test Upper": {"main": {"0": [{"node": "Assert Upper", "type": "main", "index": 0}]}},
"Test Lower": {"main": {"0": [{"node": "Assert Lower", "type": "main", "index": 0}]}},
"Test Split": {"main": {"0": [{"node": "Assert Split Length", "type": "main", "index": 0}]}},
"Assert Split Length": {"main": {"0": [{"node": "Assert Split Count", "type": "main", "index": 0}]}},
"Test Length": {"main": {"0": [{"node": "Assert Length", "type": "main", "index": 0}]}}
}
"Test Concat": {
"main": {
"0": [
{
"node": "Assert Concat",
"type": "main",
"index": 0
}
]
}
},
"Test Upper": {
"main": {
"0": [
{
"node": "Assert Upper",
"type": "main",
"index": 0
}
]
}
},
"Test Lower": {
"main": {
"0": [
{
"node": "Assert Lower",
"type": "main",
"index": 0
}
]
}
},
"Test Split": {
"main": {
"0": [
{
"node": "Assert Split Length",
"type": "main",
"index": 0
}
]
}
},
"Assert Split Length": {
"main": {
"0": [
{
"node": "Assert Split Count",
"type": "main",
"index": 0
}
]
}
},
"Test Length": {
"main": {
"0": [
{
"node": "Assert Length",
"type": "main",
"index": 0
}
]
}
}
},
"triggers": [
{
"nodeId": "test_concat",
"kind": "manual",
"enabled": true,
"meta": {
"description": "Manually triggered String Plugins Test Suite workflow execution"
}
}
]
}

View File

@@ -143,5 +143,15 @@
]
}
}
}
}
},
"triggers": [
{
"nodeId": "lint",
"kind": "manual",
"enabled": true,
"meta": {
"description": "Manually triggered meta.workflow_packages.testing_triangle.label workflow execution"
}
}
]
}

View File

@@ -1,7 +1,7 @@
import os
import unittest
from autometabuilder.prompt_loader import load_prompt_yaml
from autometabuilder.loaders.prompt_loader import load_prompt_yaml
class TestMain(unittest.TestCase):
def test_load_prompt_yaml(self):