agentic-qe 2.5.6 → 2.5.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/n8n/n8n-base-agent.md +376 -0
- package/.claude/agents/n8n/n8n-bdd-scenario-tester.md +613 -0
- package/.claude/agents/n8n/n8n-chaos-tester.md +654 -0
- package/.claude/agents/n8n/n8n-ci-orchestrator.md +850 -0
- package/.claude/agents/n8n/n8n-compliance-validator.md +685 -0
- package/.claude/agents/n8n/n8n-expression-validator.md +560 -0
- package/.claude/agents/n8n/n8n-integration-test.md +602 -0
- package/.claude/agents/n8n/n8n-monitoring-validator.md +589 -0
- package/.claude/agents/n8n/n8n-node-validator.md +455 -0
- package/.claude/agents/n8n/n8n-performance-tester.md +630 -0
- package/.claude/agents/n8n/n8n-security-auditor.md +786 -0
- package/.claude/agents/n8n/n8n-trigger-test.md +500 -0
- package/.claude/agents/n8n/n8n-unit-tester.md +633 -0
- package/.claude/agents/n8n/n8n-version-comparator.md +567 -0
- package/.claude/agents/n8n/n8n-workflow-executor.md +392 -0
- package/.claude/skills/n8n-expression-testing/SKILL.md +434 -0
- package/.claude/skills/n8n-integration-testing-patterns/SKILL.md +540 -0
- package/.claude/skills/n8n-security-testing/SKILL.md +599 -0
- package/.claude/skills/n8n-trigger-testing-strategies/SKILL.md +541 -0
- package/.claude/skills/n8n-workflow-testing-fundamentals/SKILL.md +447 -0
- package/CHANGELOG.md +127 -0
- package/README.md +7 -4
- package/dist/agents/BaseAgent.d.ts +142 -0
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +372 -2
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/agents/TestGeneratorAgent.d.ts +5 -0
- package/dist/agents/TestGeneratorAgent.d.ts.map +1 -1
- package/dist/agents/TestGeneratorAgent.js +38 -0
- package/dist/agents/TestGeneratorAgent.js.map +1 -1
- package/dist/agents/index.d.ts +1 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/n8n/N8nAPIClient.d.ts +121 -0
- package/dist/agents/n8n/N8nAPIClient.d.ts.map +1 -0
- package/dist/agents/n8n/N8nAPIClient.js +367 -0
- package/dist/agents/n8n/N8nAPIClient.js.map +1 -0
- package/dist/agents/n8n/N8nAuditPersistence.d.ts +120 -0
- package/dist/agents/n8n/N8nAuditPersistence.d.ts.map +1 -0
- package/dist/agents/n8n/N8nAuditPersistence.js +473 -0
- package/dist/agents/n8n/N8nAuditPersistence.js.map +1 -0
- package/dist/agents/n8n/N8nBDDScenarioTesterAgent.d.ts +159 -0
- package/dist/agents/n8n/N8nBDDScenarioTesterAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nBDDScenarioTesterAgent.js +697 -0
- package/dist/agents/n8n/N8nBDDScenarioTesterAgent.js.map +1 -0
- package/dist/agents/n8n/N8nBaseAgent.d.ts +126 -0
- package/dist/agents/n8n/N8nBaseAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nBaseAgent.js +446 -0
- package/dist/agents/n8n/N8nBaseAgent.js.map +1 -0
- package/dist/agents/n8n/N8nCIOrchestratorAgent.d.ts +164 -0
- package/dist/agents/n8n/N8nCIOrchestratorAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nCIOrchestratorAgent.js +610 -0
- package/dist/agents/n8n/N8nCIOrchestratorAgent.js.map +1 -0
- package/dist/agents/n8n/N8nChaosTesterAgent.d.ts +205 -0
- package/dist/agents/n8n/N8nChaosTesterAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nChaosTesterAgent.js +729 -0
- package/dist/agents/n8n/N8nChaosTesterAgent.js.map +1 -0
- package/dist/agents/n8n/N8nComplianceValidatorAgent.d.ts +228 -0
- package/dist/agents/n8n/N8nComplianceValidatorAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nComplianceValidatorAgent.js +986 -0
- package/dist/agents/n8n/N8nComplianceValidatorAgent.js.map +1 -0
- package/dist/agents/n8n/N8nContractTesterAgent.d.ts +213 -0
- package/dist/agents/n8n/N8nContractTesterAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nContractTesterAgent.js +989 -0
- package/dist/agents/n8n/N8nContractTesterAgent.js.map +1 -0
- package/dist/agents/n8n/N8nExpressionValidatorAgent.d.ts +99 -0
- package/dist/agents/n8n/N8nExpressionValidatorAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nExpressionValidatorAgent.js +632 -0
- package/dist/agents/n8n/N8nExpressionValidatorAgent.js.map +1 -0
- package/dist/agents/n8n/N8nFailureModeTesterAgent.d.ts +238 -0
- package/dist/agents/n8n/N8nFailureModeTesterAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nFailureModeTesterAgent.js +956 -0
- package/dist/agents/n8n/N8nFailureModeTesterAgent.js.map +1 -0
- package/dist/agents/n8n/N8nIdempotencyTesterAgent.d.ts +242 -0
- package/dist/agents/n8n/N8nIdempotencyTesterAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nIdempotencyTesterAgent.js +992 -0
- package/dist/agents/n8n/N8nIdempotencyTesterAgent.js.map +1 -0
- package/dist/agents/n8n/N8nIntegrationTestAgent.d.ts +104 -0
- package/dist/agents/n8n/N8nIntegrationTestAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nIntegrationTestAgent.js +653 -0
- package/dist/agents/n8n/N8nIntegrationTestAgent.js.map +1 -0
- package/dist/agents/n8n/N8nMonitoringValidatorAgent.d.ts +210 -0
- package/dist/agents/n8n/N8nMonitoringValidatorAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nMonitoringValidatorAgent.js +669 -0
- package/dist/agents/n8n/N8nMonitoringValidatorAgent.js.map +1 -0
- package/dist/agents/n8n/N8nNodeValidatorAgent.d.ts +142 -0
- package/dist/agents/n8n/N8nNodeValidatorAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nNodeValidatorAgent.js +1090 -0
- package/dist/agents/n8n/N8nNodeValidatorAgent.js.map +1 -0
- package/dist/agents/n8n/N8nPerformanceTesterAgent.d.ts +198 -0
- package/dist/agents/n8n/N8nPerformanceTesterAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nPerformanceTesterAgent.js +653 -0
- package/dist/agents/n8n/N8nPerformanceTesterAgent.js.map +1 -0
- package/dist/agents/n8n/N8nReplayabilityTesterAgent.d.ts +245 -0
- package/dist/agents/n8n/N8nReplayabilityTesterAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nReplayabilityTesterAgent.js +952 -0
- package/dist/agents/n8n/N8nReplayabilityTesterAgent.js.map +1 -0
- package/dist/agents/n8n/N8nSecretsHygieneAuditorAgent.d.ts +325 -0
- package/dist/agents/n8n/N8nSecretsHygieneAuditorAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nSecretsHygieneAuditorAgent.js +1187 -0
- package/dist/agents/n8n/N8nSecretsHygieneAuditorAgent.js.map +1 -0
- package/dist/agents/n8n/N8nSecurityAuditorAgent.d.ts +91 -0
- package/dist/agents/n8n/N8nSecurityAuditorAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nSecurityAuditorAgent.js +825 -0
- package/dist/agents/n8n/N8nSecurityAuditorAgent.js.map +1 -0
- package/dist/agents/n8n/N8nTestHarness.d.ts +131 -0
- package/dist/agents/n8n/N8nTestHarness.d.ts.map +1 -0
- package/dist/agents/n8n/N8nTestHarness.js +456 -0
- package/dist/agents/n8n/N8nTestHarness.js.map +1 -0
- package/dist/agents/n8n/N8nTriggerTestAgent.d.ts +119 -0
- package/dist/agents/n8n/N8nTriggerTestAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nTriggerTestAgent.js +652 -0
- package/dist/agents/n8n/N8nTriggerTestAgent.js.map +1 -0
- package/dist/agents/n8n/N8nUnitTesterAgent.d.ts +130 -0
- package/dist/agents/n8n/N8nUnitTesterAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nUnitTesterAgent.js +522 -0
- package/dist/agents/n8n/N8nUnitTesterAgent.js.map +1 -0
- package/dist/agents/n8n/N8nVersionComparatorAgent.d.ts +201 -0
- package/dist/agents/n8n/N8nVersionComparatorAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nVersionComparatorAgent.js +645 -0
- package/dist/agents/n8n/N8nVersionComparatorAgent.js.map +1 -0
- package/dist/agents/n8n/N8nWorkflowExecutorAgent.d.ts +120 -0
- package/dist/agents/n8n/N8nWorkflowExecutorAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nWorkflowExecutorAgent.js +347 -0
- package/dist/agents/n8n/N8nWorkflowExecutorAgent.js.map +1 -0
- package/dist/agents/n8n/index.d.ts +119 -0
- package/dist/agents/n8n/index.d.ts.map +1 -0
- package/dist/agents/n8n/index.js +298 -0
- package/dist/agents/n8n/index.js.map +1 -0
- package/dist/agents/n8n/types.d.ts +486 -0
- package/dist/agents/n8n/types.d.ts.map +1 -0
- package/dist/agents/n8n/types.js +8 -0
- package/dist/agents/n8n/types.js.map +1 -0
- package/dist/cli/init/agents.d.ts.map +1 -1
- package/dist/cli/init/agents.js +29 -0
- package/dist/cli/init/agents.js.map +1 -1
- package/dist/cli/init/skills.d.ts.map +1 -1
- package/dist/cli/init/skills.js +7 -1
- package/dist/cli/init/skills.js.map +1 -1
- package/dist/core/memory/HNSWVectorMemory.js +1 -1
- package/dist/core/memory/RuVectorPatternStore.d.ts +90 -0
- package/dist/core/memory/RuVectorPatternStore.d.ts.map +1 -1
- package/dist/core/memory/RuVectorPatternStore.js +209 -0
- package/dist/core/memory/RuVectorPatternStore.js.map +1 -1
- package/dist/learning/FederatedManager.d.ts +232 -0
- package/dist/learning/FederatedManager.d.ts.map +1 -0
- package/dist/learning/FederatedManager.js +489 -0
- package/dist/learning/FederatedManager.js.map +1 -0
- package/dist/learning/HNSWPatternAdapter.d.ts +117 -0
- package/dist/learning/HNSWPatternAdapter.d.ts.map +1 -0
- package/dist/learning/HNSWPatternAdapter.js +262 -0
- package/dist/learning/HNSWPatternAdapter.js.map +1 -0
- package/dist/learning/LearningEngine.d.ts +27 -0
- package/dist/learning/LearningEngine.d.ts.map +1 -1
- package/dist/learning/LearningEngine.js +75 -1
- package/dist/learning/LearningEngine.js.map +1 -1
- package/dist/learning/PatternCurator.d.ts +217 -0
- package/dist/learning/PatternCurator.d.ts.map +1 -0
- package/dist/learning/PatternCurator.js +393 -0
- package/dist/learning/PatternCurator.js.map +1 -0
- package/dist/learning/index.d.ts +6 -0
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +16 -1
- package/dist/learning/index.js.map +1 -1
- package/dist/learning/types.d.ts +4 -0
- package/dist/learning/types.d.ts.map +1 -1
- package/dist/mcp/server-instructions.d.ts +1 -1
- package/dist/mcp/server-instructions.js +1 -1
- package/dist/memory/HNSWPatternStore.d.ts +176 -0
- package/dist/memory/HNSWPatternStore.d.ts.map +1 -0
- package/dist/memory/HNSWPatternStore.js +392 -0
- package/dist/memory/HNSWPatternStore.js.map +1 -0
- package/dist/memory/index.d.ts +8 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +13 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/providers/HybridRouter.d.ts +85 -4
- package/dist/providers/HybridRouter.d.ts.map +1 -1
- package/dist/providers/HybridRouter.js +332 -10
- package/dist/providers/HybridRouter.js.map +1 -1
- package/dist/providers/LLMBaselineTracker.d.ts +120 -0
- package/dist/providers/LLMBaselineTracker.d.ts.map +1 -0
- package/dist/providers/LLMBaselineTracker.js +305 -0
- package/dist/providers/LLMBaselineTracker.js.map +1 -0
- package/dist/providers/OpenRouterProvider.d.ts +26 -0
- package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/providers/OpenRouterProvider.js +75 -6
- package/dist/providers/OpenRouterProvider.js.map +1 -1
- package/dist/providers/RuVectorClient.d.ts +259 -0
- package/dist/providers/RuVectorClient.d.ts.map +1 -0
- package/dist/providers/RuVectorClient.js +416 -0
- package/dist/providers/RuVectorClient.js.map +1 -0
- package/dist/providers/RuvllmPatternCurator.d.ts +116 -0
- package/dist/providers/RuvllmPatternCurator.d.ts.map +1 -0
- package/dist/providers/RuvllmPatternCurator.js +323 -0
- package/dist/providers/RuvllmPatternCurator.js.map +1 -0
- package/dist/providers/RuvllmProvider.d.ts +233 -1
- package/dist/providers/RuvllmProvider.d.ts.map +1 -1
- package/dist/providers/RuvllmProvider.js +781 -11
- package/dist/providers/RuvllmProvider.js.map +1 -1
- package/dist/providers/index.d.ts +5 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +12 -2
- package/dist/providers/index.js.map +1 -1
- package/dist/utils/ruvllm-loader.d.ts +98 -1
- package/dist/utils/ruvllm-loader.d.ts.map +1 -1
- package/dist/utils/ruvllm-loader.js.map +1 -1
- package/docs/reference/agents.md +91 -2
- package/docs/reference/skills.md +97 -2
- package/package.json +2 -2
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: n8n-workflow-testing-fundamentals
|
|
3
|
+
description: "Comprehensive n8n workflow testing including execution lifecycle, node connection patterns, data flow validation, and error handling strategies. Use when testing n8n workflow automation applications."
|
|
4
|
+
category: n8n-testing
|
|
5
|
+
priority: high
|
|
6
|
+
tokenEstimate: 1200
|
|
7
|
+
agents: [n8n-workflow-executor, n8n-node-validator, n8n-trigger-test]
|
|
8
|
+
implementation_status: production
|
|
9
|
+
optimization_version: 1.0
|
|
10
|
+
last_optimized: 2025-12-15
|
|
11
|
+
dependencies: []
|
|
12
|
+
quick_reference_card: true
|
|
13
|
+
tags: [n8n, workflow, automation, testing, data-flow, nodes, triggers]
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# n8n Workflow Testing Fundamentals
|
|
17
|
+
|
|
18
|
+
<default_to_action>
|
|
19
|
+
When testing n8n workflows:
|
|
20
|
+
1. VALIDATE workflow structure before execution
|
|
21
|
+
2. TEST with realistic test data
|
|
22
|
+
3. VERIFY node-to-node data flow
|
|
23
|
+
4. CHECK error handling paths
|
|
24
|
+
5. MEASURE execution performance
|
|
25
|
+
|
|
26
|
+
**Quick n8n Testing Checklist:**
|
|
27
|
+
- All nodes properly connected (no orphans)
|
|
28
|
+
- Trigger node correctly configured
|
|
29
|
+
- Data mappings between nodes valid
|
|
30
|
+
- Error workflows defined
|
|
31
|
+
- Credentials properly referenced
|
|
32
|
+
|
|
33
|
+
**Critical Success Factors:**
|
|
34
|
+
- Test each execution path separately
|
|
35
|
+
- Validate data transformations at each node
|
|
36
|
+
- Check retry and error handling behavior
|
|
37
|
+
- Verify integrations with external services
|
|
38
|
+
</default_to_action>
|
|
39
|
+
|
|
40
|
+
## Quick Reference Card
|
|
41
|
+
|
|
42
|
+
### When to Use
|
|
43
|
+
- Testing new n8n workflows
|
|
44
|
+
- Validating workflow changes
|
|
45
|
+
- Debugging failed executions
|
|
46
|
+
- Performance optimization
|
|
47
|
+
- Pre-deployment validation
|
|
48
|
+
|
|
49
|
+
### n8n Workflow Components
|
|
50
|
+
|
|
51
|
+
| Component | Purpose | Testing Focus |
|
|
52
|
+
|-----------|---------|---------------|
|
|
53
|
+
| **Trigger** | Starts workflow | Reliable activation, payload handling |
|
|
54
|
+
| **Action Nodes** | Process data | Configuration, data mapping |
|
|
55
|
+
| **Logic Nodes** | Control flow | Conditional routing, branches |
|
|
56
|
+
| **Integration Nodes** | External APIs | Auth, rate limits, errors |
|
|
57
|
+
| **Error Workflow** | Handle failures | Recovery, notifications |
|
|
58
|
+
|
|
59
|
+
### Workflow Execution States
|
|
60
|
+
|
|
61
|
+
| State | Meaning | Test Action |
|
|
62
|
+
|-------|---------|-------------|
|
|
63
|
+
| `running` | Currently executing | Monitor progress |
|
|
64
|
+
| `success` | Completed successfully | Validate outputs |
|
|
65
|
+
| `failed` | Execution failed | Analyze error |
|
|
66
|
+
| `waiting` | Waiting for trigger | Test trigger mechanism |
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Workflow Structure Validation
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
// Validate workflow structure before execution
|
|
74
|
+
async function validateWorkflowStructure(workflowId: string) {
|
|
75
|
+
const workflow = await getWorkflow(workflowId);
|
|
76
|
+
|
|
77
|
+
// Check for trigger node
|
|
78
|
+
const triggerNode = workflow.nodes.find(n =>
|
|
79
|
+
n.type.includes('trigger') || n.type.includes('webhook')
|
|
80
|
+
);
|
|
81
|
+
if (!triggerNode) {
|
|
82
|
+
throw new Error('Workflow must have a trigger node');
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Check for orphan nodes (no connections)
|
|
86
|
+
const connectedNodes = new Set();
|
|
87
|
+
for (const [source, targets] of Object.entries(workflow.connections)) {
|
|
88
|
+
connectedNodes.add(source);
|
|
89
|
+
for (const outputs of Object.values(targets)) {
|
|
90
|
+
for (const connections of outputs) {
|
|
91
|
+
for (const conn of connections) {
|
|
92
|
+
connectedNodes.add(conn.node);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const orphans = workflow.nodes.filter(n => !connectedNodes.has(n.name));
|
|
99
|
+
if (orphans.length > 0) {
|
|
100
|
+
console.warn('Orphan nodes detected:', orphans.map(n => n.name));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Validate credentials
|
|
104
|
+
for (const node of workflow.nodes) {
|
|
105
|
+
if (node.credentials) {
|
|
106
|
+
for (const [type, ref] of Object.entries(node.credentials)) {
|
|
107
|
+
if (!await credentialExists(ref.id)) {
|
|
108
|
+
throw new Error(`Missing credential: ${type} for node ${node.name}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return { valid: true, orphans, triggerNode };
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Execution Testing
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
// Test workflow execution with various inputs
|
|
124
|
+
async function testWorkflowExecution(workflowId: string, testCases: TestCase[]) {
|
|
125
|
+
const results: TestResult[] = [];
|
|
126
|
+
|
|
127
|
+
for (const testCase of testCases) {
|
|
128
|
+
const startTime = Date.now();
|
|
129
|
+
|
|
130
|
+
// Execute workflow
|
|
131
|
+
const execution = await executeWorkflow(workflowId, testCase.input);
|
|
132
|
+
|
|
133
|
+
// Wait for completion
|
|
134
|
+
const result = await waitForCompletion(execution.id, testCase.timeout || 30000);
|
|
135
|
+
|
|
136
|
+
// Validate output
|
|
137
|
+
const outputValid = validateOutput(result.data, testCase.expected);
|
|
138
|
+
|
|
139
|
+
results.push({
|
|
140
|
+
testCase: testCase.name,
|
|
141
|
+
success: result.status === 'success' && outputValid,
|
|
142
|
+
duration: Date.now() - startTime,
|
|
143
|
+
actualOutput: result.data,
|
|
144
|
+
expectedOutput: testCase.expected
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return results;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Example test cases
|
|
152
|
+
const testCases = [
|
|
153
|
+
{
|
|
154
|
+
name: 'Valid customer data',
|
|
155
|
+
input: { name: 'John Doe', email: 'john@example.com' },
|
|
156
|
+
expected: { processed: true, customerId: /^cust_/ },
|
|
157
|
+
timeout: 10000
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
name: 'Missing email',
|
|
161
|
+
input: { name: 'Jane Doe' },
|
|
162
|
+
expected: { error: 'Email required' },
|
|
163
|
+
timeout: 5000
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
name: 'Invalid email format',
|
|
167
|
+
input: { name: 'Bob', email: 'not-an-email' },
|
|
168
|
+
expected: { error: 'Invalid email' },
|
|
169
|
+
timeout: 5000
|
|
170
|
+
}
|
|
171
|
+
];
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Data Flow Validation
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
// Trace data through workflow nodes
|
|
180
|
+
async function validateDataFlow(executionId: string) {
|
|
181
|
+
const execution = await getExecution(executionId);
|
|
182
|
+
const nodeResults = execution.data.resultData.runData;
|
|
183
|
+
|
|
184
|
+
const dataFlow: DataFlowStep[] = [];
|
|
185
|
+
|
|
186
|
+
for (const [nodeName, runs] of Object.entries(nodeResults)) {
|
|
187
|
+
for (const run of runs) {
|
|
188
|
+
dataFlow.push({
|
|
189
|
+
node: nodeName,
|
|
190
|
+
input: run.data?.main?.[0]?.[0]?.json || {},
|
|
191
|
+
output: run.data?.main?.[0]?.[0]?.json || {},
|
|
192
|
+
executionTime: run.executionTime,
|
|
193
|
+
status: run.executionStatus
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Validate data transformations
|
|
199
|
+
for (let i = 1; i < dataFlow.length; i++) {
|
|
200
|
+
const prev = dataFlow[i - 1];
|
|
201
|
+
const curr = dataFlow[i];
|
|
202
|
+
|
|
203
|
+
// Check if expected data passed through
|
|
204
|
+
validateDataMapping(prev.output, curr.input);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return dataFlow;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Validate data mapping between nodes
|
|
211
|
+
function validateDataMapping(sourceOutput: any, targetInput: any) {
|
|
212
|
+
// Check all required fields are present
|
|
213
|
+
const missingFields: string[] = [];
|
|
214
|
+
|
|
215
|
+
for (const [key, value] of Object.entries(targetInput)) {
|
|
216
|
+
if (value === undefined && sourceOutput[key] === undefined) {
|
|
217
|
+
missingFields.push(key);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (missingFields.length > 0) {
|
|
222
|
+
console.warn('Missing fields in data mapping:', missingFields);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
return missingFields.length === 0;
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Error Handling Testing
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
// Test error handling paths
|
|
235
|
+
async function testErrorHandling(workflowId: string) {
|
|
236
|
+
const errorScenarios = [
|
|
237
|
+
{
|
|
238
|
+
name: 'API timeout',
|
|
239
|
+
inject: { delay: 35000 }, // Trigger timeout
|
|
240
|
+
expectedError: 'timeout'
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
name: 'Invalid data',
|
|
244
|
+
inject: { invalidField: true },
|
|
245
|
+
expectedError: 'validation'
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
name: 'Missing credentials',
|
|
249
|
+
inject: { removeCredentials: true },
|
|
250
|
+
expectedError: 'authentication'
|
|
251
|
+
}
|
|
252
|
+
];
|
|
253
|
+
|
|
254
|
+
const results: ErrorTestResult[] = [];
|
|
255
|
+
|
|
256
|
+
for (const scenario of errorScenarios) {
|
|
257
|
+
// Execute with error injection
|
|
258
|
+
const execution = await executeWithErrorInjection(workflowId, scenario.inject);
|
|
259
|
+
|
|
260
|
+
// Check error was caught
|
|
261
|
+
const result = await waitForCompletion(execution.id);
|
|
262
|
+
|
|
263
|
+
// Validate error handling
|
|
264
|
+
results.push({
|
|
265
|
+
scenario: scenario.name,
|
|
266
|
+
errorCaught: result.status === 'failed',
|
|
267
|
+
errorType: result.data?.resultData?.error?.type,
|
|
268
|
+
expectedError: scenario.expectedError,
|
|
269
|
+
errorWorkflowTriggered: await checkErrorWorkflowTriggered(execution.id),
|
|
270
|
+
alertSent: await checkAlertSent(execution.id)
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
return results;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Verify error workflow was triggered
|
|
278
|
+
async function checkErrorWorkflowTriggered(executionId: string): Promise<boolean> {
|
|
279
|
+
const errorExecutions = await getExecutions({
|
|
280
|
+
filter: {
|
|
281
|
+
metadata: { errorTriggeredBy: executionId }
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
return errorExecutions.length > 0;
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Node Connection Patterns
|
|
292
|
+
|
|
293
|
+
### Linear Flow
|
|
294
|
+
```
|
|
295
|
+
Trigger → Process → Transform → Output
|
|
296
|
+
```
|
|
297
|
+
**Testing:** Execute once, validate each node output
|
|
298
|
+
|
|
299
|
+
### Branching Flow
|
|
300
|
+
```
|
|
301
|
+
Trigger → IF → [Branch A] → Merge → Output
|
|
302
|
+
→ [Branch B] →
|
|
303
|
+
```
|
|
304
|
+
**Testing:** Test both branches separately, verify merge behavior
|
|
305
|
+
|
|
306
|
+
### Parallel Flow
|
|
307
|
+
```
|
|
308
|
+
Trigger → Split → [Process A] → Merge → Output
|
|
309
|
+
→ [Process B] →
|
|
310
|
+
```
|
|
311
|
+
**Testing:** Validate parallel execution, check merge timing
|
|
312
|
+
|
|
313
|
+
### Loop Flow
|
|
314
|
+
```
|
|
315
|
+
Trigger → SplitInBatches → Process → [Loop back until done] → Output
|
|
316
|
+
```
|
|
317
|
+
**Testing:** Test with varying batch sizes, verify all items processed
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
## Common Testing Patterns
|
|
322
|
+
|
|
323
|
+
### Test Data Generation
|
|
324
|
+
|
|
325
|
+
```typescript
|
|
326
|
+
// Generate test data for common n8n patterns
|
|
327
|
+
const testDataGenerators = {
|
|
328
|
+
webhook: () => ({
|
|
329
|
+
body: { event: 'test', timestamp: new Date().toISOString() },
|
|
330
|
+
headers: { 'Content-Type': 'application/json' },
|
|
331
|
+
query: { source: 'test' }
|
|
332
|
+
}),
|
|
333
|
+
|
|
334
|
+
slack: () => ({
|
|
335
|
+
type: 'message',
|
|
336
|
+
channel: 'C123456',
|
|
337
|
+
user: 'U789012',
|
|
338
|
+
text: 'Test message'
|
|
339
|
+
}),
|
|
340
|
+
|
|
341
|
+
github: () => ({
|
|
342
|
+
action: 'opened',
|
|
343
|
+
issue: {
|
|
344
|
+
number: 1,
|
|
345
|
+
title: 'Test Issue',
|
|
346
|
+
body: 'Test body'
|
|
347
|
+
},
|
|
348
|
+
repository: {
|
|
349
|
+
full_name: 'test/repo'
|
|
350
|
+
}
|
|
351
|
+
}),
|
|
352
|
+
|
|
353
|
+
stripe: () => ({
|
|
354
|
+
type: 'payment_intent.succeeded',
|
|
355
|
+
data: {
|
|
356
|
+
object: {
|
|
357
|
+
id: 'pi_test123',
|
|
358
|
+
amount: 1000,
|
|
359
|
+
currency: 'usd'
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
})
|
|
363
|
+
};
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
### Execution Assertions
|
|
367
|
+
|
|
368
|
+
```typescript
|
|
369
|
+
// Common assertions for workflow execution
|
|
370
|
+
const workflowAssertions = {
|
|
371
|
+
// Assert workflow completed
|
|
372
|
+
assertCompleted: (execution) => {
|
|
373
|
+
expect(execution.finished).toBe(true);
|
|
374
|
+
expect(execution.status).toBe('success');
|
|
375
|
+
},
|
|
376
|
+
|
|
377
|
+
// Assert specific node executed
|
|
378
|
+
assertNodeExecuted: (execution, nodeName) => {
|
|
379
|
+
const nodeData = execution.data.resultData.runData[nodeName];
|
|
380
|
+
expect(nodeData).toBeDefined();
|
|
381
|
+
expect(nodeData[0].executionStatus).toBe('success');
|
|
382
|
+
},
|
|
383
|
+
|
|
384
|
+
// Assert data transformation
|
|
385
|
+
assertDataTransformed: (execution, nodeName, expectedData) => {
|
|
386
|
+
const nodeOutput = execution.data.resultData.runData[nodeName][0].data.main[0][0].json;
|
|
387
|
+
expect(nodeOutput).toMatchObject(expectedData);
|
|
388
|
+
},
|
|
389
|
+
|
|
390
|
+
// Assert execution time
|
|
391
|
+
assertExecutionTime: (execution, maxMs) => {
|
|
392
|
+
const duration = new Date(execution.stoppedAt) - new Date(execution.startedAt);
|
|
393
|
+
expect(duration).toBeLessThan(maxMs);
|
|
394
|
+
}
|
|
395
|
+
};
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
---
|
|
399
|
+
|
|
400
|
+
## Agent Coordination Hints
|
|
401
|
+
|
|
402
|
+
### Memory Namespace
|
|
403
|
+
```
|
|
404
|
+
aqe/n8n/
|
|
405
|
+
├── workflows/* - Cached workflow definitions
|
|
406
|
+
├── test-results/* - Test execution results
|
|
407
|
+
├── validations/* - Validation reports
|
|
408
|
+
├── patterns/* - Discovered testing patterns
|
|
409
|
+
└── executions/* - Execution tracking
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### Fleet Coordination
|
|
413
|
+
```typescript
|
|
414
|
+
// Comprehensive n8n testing with fleet
|
|
415
|
+
const n8nFleet = await FleetManager.coordinate({
|
|
416
|
+
strategy: 'n8n-testing',
|
|
417
|
+
agents: [
|
|
418
|
+
'n8n-workflow-executor', // Execute and validate
|
|
419
|
+
'n8n-node-validator', // Validate configurations
|
|
420
|
+
'n8n-trigger-test', // Test triggers
|
|
421
|
+
'n8n-expression-validator', // Validate expressions
|
|
422
|
+
'n8n-integration-test' // Test integrations
|
|
423
|
+
],
|
|
424
|
+
topology: 'parallel'
|
|
425
|
+
});
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
---
|
|
429
|
+
|
|
430
|
+
## Related Skills
|
|
431
|
+
- [n8n-expression-testing](../n8n-expression-testing/) - Expression validation
|
|
432
|
+
- [n8n-trigger-testing-strategies](../n8n-trigger-testing-strategies/) - Trigger testing
|
|
433
|
+
- [n8n-integration-testing-patterns](../n8n-integration-testing-patterns/) - Integration testing
|
|
434
|
+
- [n8n-security-testing](../n8n-security-testing/) - Security validation
|
|
435
|
+
|
|
436
|
+
---
|
|
437
|
+
|
|
438
|
+
## Remember
|
|
439
|
+
|
|
440
|
+
**n8n workflows are JSON-based execution flows** that connect 400+ services. Testing requires validating:
|
|
441
|
+
- Workflow structure (nodes, connections)
|
|
442
|
+
- Trigger reliability (webhooks, schedules)
|
|
443
|
+
- Data flow (transformations between nodes)
|
|
444
|
+
- Error handling (retry, fallback, notifications)
|
|
445
|
+
- Performance (execution time, resource usage)
|
|
446
|
+
|
|
447
|
+
**With Agents:** Use n8n-workflow-executor for execution testing, n8n-node-validator for configuration validation, and coordinate multiple agents for comprehensive workflow testing.
|
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,133 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.5.8] - 2025-12-18
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
#### Phase 0: LLM Independence Foundation
|
|
15
|
+
|
|
16
|
+
Major milestone implementing the foundation for reduced LLM dependency through pattern learning and vector similarity search.
|
|
17
|
+
|
|
18
|
+
**M0.3: HNSW Pattern Store Integration**
|
|
19
|
+
- **HNSWPatternAdapter** (`src/learning/HNSWPatternAdapter.ts`) - Bridge between LearningEngine and HNSWPatternStore
|
|
20
|
+
- O(log n) similarity search with <1ms p95 latency
|
|
21
|
+
- Converts LearnedPattern ↔ QEPattern formats
|
|
22
|
+
- Fallback hash-based embeddings when RuvLLM unavailable
|
|
23
|
+
- 768-dimension vector embeddings
|
|
24
|
+
- **LearningEngine HNSW Integration** - Added `enableHNSW` config option
|
|
25
|
+
- `searchSimilarPatterns()` - Vector similarity search across learned patterns
|
|
26
|
+
- `getHNSWStats()` - Pattern count, embedding dimension, RuvLLM status
|
|
27
|
+
- `isHNSWEnabled()` - Check HNSW availability
|
|
28
|
+
- Dual storage: SQLite (primary) + HNSW (vector search)
|
|
29
|
+
|
|
30
|
+
**M0.5: Federated Learning**
|
|
31
|
+
- **FederatedManager** (`src/learning/FederatedManager.ts`) - Cross-agent pattern sharing
|
|
32
|
+
- Register agents with team for collective learning
|
|
33
|
+
- Share learned patterns across agent instances
|
|
34
|
+
- Sync with team knowledge on initialization
|
|
35
|
+
|
|
36
|
+
**M0.6: Pattern Curation**
|
|
37
|
+
- **PatternCurator** (`src/learning/PatternCurator.ts`) - Manual curation workflow
|
|
38
|
+
- `findLowConfidencePatterns()` - Identify patterns needing review
|
|
39
|
+
- `reviewPattern()` - Approve/reject patterns with feedback
|
|
40
|
+
- `autoCurate()` - Automatic curation based on confidence thresholds
|
|
41
|
+
- `forceLearning()` - Trigger learning consolidation
|
|
42
|
+
- Interactive curation generator for batch review
|
|
43
|
+
- **RuvllmPatternCurator** (`src/providers/RuvllmPatternCurator.ts`) - RuvLLM integration
|
|
44
|
+
- Implements IPatternSource using HNSWPatternAdapter
|
|
45
|
+
- Implements ILearningTrigger using RuvllmProvider
|
|
46
|
+
- Enables 20% better routing through curated patterns
|
|
47
|
+
|
|
48
|
+
**RuvllmProvider Enhancements**
|
|
49
|
+
- **Session Management** - Multi-turn context preservation (50% latency reduction)
|
|
50
|
+
- `createSession()`, `getSession()`, `endSession()`
|
|
51
|
+
- Session timeout: 30 minutes, max 100 concurrent sessions
|
|
52
|
+
- **Batch API** - Parallel request processing (4x throughput)
|
|
53
|
+
- `batchComplete()` for multiple prompts
|
|
54
|
+
- Rate limiting and queue management
|
|
55
|
+
- **TRM (Test-time Reasoning & Metacognition)** - Iterative refinement
|
|
56
|
+
- Up to 7 iterations with 95% convergence threshold
|
|
57
|
+
- **SONA (Self-Organizing Neural Architecture)** - Continuous adaptation
|
|
58
|
+
- LoRA rank: 8, alpha: 16, EWC lambda: 2000
|
|
59
|
+
- **Learning Methods** - Pattern feedback and consolidation
|
|
60
|
+
- `searchMemory()`, `provideFeedback()`, `forceLearn()`, `getMetrics()`
|
|
61
|
+
|
|
62
|
+
**HybridRouter Enhancements**
|
|
63
|
+
- **RuVector Cache Integration** - Semantic caching with vector similarity
|
|
64
|
+
- **Cost Optimization Routing** - Smart provider selection based on task complexity
|
|
65
|
+
|
|
66
|
+
**New Components**
|
|
67
|
+
- **RuVectorClient** (`src/providers/RuVectorClient.ts`) - Vector database client
|
|
68
|
+
- **LLMBaselineTracker** (`src/providers/LLMBaselineTracker.ts`) - Performance baseline tracking
|
|
69
|
+
|
|
70
|
+
#### Integration Tests
|
|
71
|
+
- **phase0-integration.test.ts** - 18 comprehensive tests covering:
|
|
72
|
+
- HNSWPatternStore direct usage (4 tests)
|
|
73
|
+
- HNSWPatternAdapter with LearningEngine (3 tests)
|
|
74
|
+
- LearningEngine + HNSW integration (3 tests)
|
|
75
|
+
- PatternCurator session/curation workflow (7 tests)
|
|
76
|
+
- End-to-end: execute → learn → store → retrieve (1 test)
|
|
77
|
+
|
|
78
|
+
#### Documentation
|
|
79
|
+
- **agent-learning-system.md** - Complete architecture documentation
|
|
80
|
+
- Agent lifecycle with all integration points
|
|
81
|
+
- LLM provider selection matrix
|
|
82
|
+
- Learning from execution flow diagrams
|
|
83
|
+
- Pattern retrieval and acceleration explanation
|
|
84
|
+
- Ruv solutions integration summary
|
|
85
|
+
|
|
86
|
+
### Changed
|
|
87
|
+
- Updated `LearnedPattern` type with optional `agentId` and `averageReward` fields
|
|
88
|
+
- Extended `src/learning/index.ts` with HNSWPatternAdapter exports
|
|
89
|
+
- Extended `src/providers/index.ts` with RuvllmPatternCurator and RuVectorClient exports
|
|
90
|
+
- Extended `src/memory/index.ts` with HNSWPatternStore exports
|
|
91
|
+
|
|
92
|
+
### Fixed
|
|
93
|
+
- Test isolation in HNSWPatternAdapter tests (unique temp directories per test)
|
|
94
|
+
- TypeScript compilation errors in pattern conversion methods
|
|
95
|
+
|
|
96
|
+
## [2.5.7] - 2025-12-17
|
|
97
|
+
|
|
98
|
+
### Added
|
|
99
|
+
|
|
100
|
+
#### n8n Workflow Testing Agents (PR #151)
|
|
101
|
+
*Contributed by [@fndlalit](https://github.com/fndlalit)*
|
|
102
|
+
|
|
103
|
+
Comprehensive suite of **15 n8n workflow testing agents** for production-ready workflow automation testing:
|
|
104
|
+
|
|
105
|
+
- **N8nWorkflowExecutorAgent** - Execute workflows with data flow validation and assertions
|
|
106
|
+
- **N8nPerformanceTesterAgent** - Load/stress testing with timing metrics and percentiles
|
|
107
|
+
- **N8nChaosTesterAgent** - Fault injection using N8nTestHarness for real failure simulation
|
|
108
|
+
- **N8nBDDScenarioTesterAgent** - Cucumber-style BDD testing with real execution
|
|
109
|
+
- **N8nSecurityAuditorAgent** - 40+ secret patterns, runtime leak detection
|
|
110
|
+
- **N8nExpressionValidatorAgent** - Safe expression validation using pattern matching
|
|
111
|
+
- **N8nIntegrationTestAgent** - Real API connectivity testing via workflow execution
|
|
112
|
+
- **N8nTriggerTestAgent** - Webhook testing with correct n8n URL patterns
|
|
113
|
+
- **N8nComplianceValidatorAgent** - GDPR/HIPAA/SOC2/PCI-DSS compliance with runtime PII tracing
|
|
114
|
+
- **N8nMonitoringValidatorAgent** - SLA compliance checking with runtime metrics
|
|
115
|
+
- Plus 5 additional n8n agents (node-validator, unit-tester, version-comparator, ci-orchestrator, base-agent)
|
|
116
|
+
|
|
117
|
+
**5 new n8n testing skills:**
|
|
118
|
+
- `n8n-workflow-testing-fundamentals` - Core workflow testing concepts
|
|
119
|
+
- `n8n-security-testing` - Credential and secret management testing
|
|
120
|
+
- `n8n-integration-testing-patterns` - API and webhook testing strategies
|
|
121
|
+
- `n8n-expression-testing` - Safe expression validation
|
|
122
|
+
- `n8n-trigger-testing-strategies` - Trigger testing patterns
|
|
123
|
+
|
|
124
|
+
**Key Design Decisions:**
|
|
125
|
+
- Runtime execution is DEFAULT (not opt-in)
|
|
126
|
+
- Safe expression evaluation using pattern matching (no unsafe eval)
|
|
127
|
+
- Correct n8n webhook URL patterns (production + test mode)
|
|
128
|
+
- Dual authentication support (API key + session cookie fallback)
|
|
129
|
+
|
|
130
|
+
### Changed
|
|
131
|
+
|
|
132
|
+
- Updated skill count from 41 to 46 (added 5 n8n skills)
|
|
133
|
+
- Updated agent documentation with n8n workflow testing section
|
|
134
|
+
- Updated `aqe init` to copy n8n agent definitions to user projects
|
|
135
|
+
- Added Smithery badge to README (PR #152 by @gurdasnijor)
|
|
136
|
+
|
|
10
137
|
## [2.5.6] - 2025-12-16
|
|
11
138
|
|
|
12
139
|
### Changed
|
package/README.md
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# Agentic Quality Engineering Fleet
|
|
2
2
|
|
|
3
|
+
|
|
3
4
|
<div align="center">
|
|
4
5
|
|
|
5
6
|
[](https://www.npmjs.com/package/agentic-qe)
|
|
@@ -7,13 +8,14 @@
|
|
|
7
8
|
[](https://www.typescriptlang.org/)
|
|
8
9
|
[](https://nodejs.org/)
|
|
9
10
|
<img alt="NPM Downloads" src="https://img.shields.io/npm/dw/agentic-qe">
|
|
11
|
+
[](https://smithery.ai/skills?ns=proffesor-for-testing&utm_source=github&utm_medium=badge)
|
|
10
12
|
|
|
11
13
|
|
|
12
|
-
**Version 2.5.
|
|
14
|
+
**Version 2.5.8** | [Changelog](CHANGELOG.md) | [Contributors](CONTRIBUTORS.md) | [Issues](https://github.com/proffesor-for-testing/agentic-qe/issues) | [Discussions](https://github.com/proffesor-for-testing/agentic-qe/discussions)
|
|
13
15
|
|
|
14
16
|
> AI-powered test automation that learns from every task, switches between 300+ AI models on-the-fly, scores code testability, visualizes agent activity in real-time, and improves autonomously overnight — with built-in safety guardrails and full observability.
|
|
15
17
|
|
|
16
|
-
🎨 **Real-Time Visualization** | 📊 **Testability Scoring** | 🧠 **QE Agent Learning** | 🚀 **QUIC Transport** | 📋 **Constitution System** | 📚 **
|
|
18
|
+
🎨 **Real-Time Visualization** | 📊 **Testability Scoring** | 🧠 **QE Agent Learning** | 🚀 **QUIC Transport** | 📋 **Constitution System** | 📚 **46 QE Skills** | 🎯 **Flaky Detection** | 💰 **Multi-Model Router** | 🔄 **n8n Workflow Testing**
|
|
17
19
|
|
|
18
20
|
</div>
|
|
19
21
|
|
|
@@ -60,9 +62,10 @@ claude "Use qe-flaky-test-hunter to analyze the last 100 test runs and identify
|
|
|
60
62
|
- ✅ Learning System (20% improvement target)
|
|
61
63
|
- ✅ Pattern Bank (cross-project reuse)
|
|
62
64
|
- ✅ ML Flaky Detection (90%+ accuracy with root cause analysis)
|
|
63
|
-
- ✅ 19 Specialized agent definitions (including qe-code-complexity)
|
|
65
|
+
- ✅ 19 Specialized QE agent definitions (including qe-code-complexity)
|
|
66
|
+
- ✅ 15 n8n workflow testing agents (workflow execution, chaos, compliance, security, performance by [@fndlalit](https://github.com/fndlalit))
|
|
64
67
|
- ✅ 11 TDD subagent definitions (RED/GREEN/REFACTOR phases + specialized)
|
|
65
|
-
- ✅
|
|
68
|
+
- ✅ 46 World-class QE skills library (accessibility, shift-left/right, verification, visual testing, XP practices, n8n testing, **testability-scoring** by [@fndlalit](https://github.com/fndlalit))
|
|
66
69
|
- ✅ 8 AQE slash commands
|
|
67
70
|
- ✅ Modular init system with comprehensive project setup
|
|
68
71
|
|