
N8n Expression Testing
- 105 installs
- 433 repo stars
- Updated August 4, 2026
- proffesor-for-testing/agentic-qe
n8n-expression-testing is a Claude Code skill for testing & qa.
About
n8n-expression-testing is a Claude Code skill for testing & qa. It helps solo builders move faster with AI-assisted development.
- n8n-expression-testing
- Testing & QA
- AI-coding skill
N8n Expression Testing by the numbers
- 105 all-time installs (skills.sh)
- +3 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #980 of 2,153 Testing & QA skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/proffesor-for-testing/agentic-qe --skill n8n-expression-testingAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 105 |
|---|---|
| repo stars | ★ 433 |
| Last updated | August 4, 2026 |
| Repository | proffesor-for-testing/agentic-qe ↗ |
How do I helps with testing & qa tasks.?
Helps with testing & qa tasks.
Who is it for?
Best when you're working on testing & qa and need structured help with n8n expression testing.
Skip if: Teams with no testing & qa needs, or anyone wanting a generic chat assistant without this specific workflow.
When should I use this skill?
When you need to helps with testing & qa tasks., or when n8n-expression-testing is a claude code skill for testing & qa.
What you get
Structured output aligned to n8n-expression-testing: n8n-expression-testing, Testing & QA.
Files
n8n Expression Testing
<default_to_action> When testing n8n expressions: 1. VALIDATE syntax before execution 2. TEST with multiple context scenarios 3. CHECK for null/undefined handling 4. VERIFY type safety 5. SCAN for security vulnerabilities
Quick Expression Checklist:
- Valid JavaScript syntax
- Context variables properly referenced ($json, $node)
- Null-safe access patterns (?., ??)
- No dangerous functions (eval, Function)
- Efficient for large data sets
Common Pitfalls:
- Accessing nested properties without null checks
- Type coercion issues
- Missing fallback values
- Inefficient array operations
</default_to_action>
Quick Reference Card
n8n Expression Syntax
| Pattern | Example | Description |
|---|---|---|
| Basic access | {{ $json.field }} | Access JSON field |
| Nested access | {{ $json.user.email }} | Access nested property |
| Array access | {{ $json.items[0] }} | Access array element |
| Node reference | {{ $node["Name"].json.id }} | Access other node's data |
| Method call | {{ $json.name.toLowerCase() }} | Call string method |
| Conditional | {{ $json.x ? "yes" : "no" }} | Ternary expression |
Context Variables
| Variable | Description | Example |
|---|---|---|
$json | Current item data | {{ $json.email }} |
$node["Name"] | Other node's data | {{ $node["HTTP"].json.body }} |
$items() | Multiple items | {{ $items("Node", 0, 0).json }} |
$now | Current timestamp | {{ $now.toISO() }} |
$today | Today's date | {{ $today }} |
$runIndex | Run iteration | {{ $runIndex }} |
$workflow | Workflow info | {{ $workflow.name }} |
---
Expression Syntax Patterns
Safe Data Access
// BAD: Can fail if nested objects are null
{{ $json.user.profile.email }}
// GOOD: Optional chaining with fallback
{{ $json.user?.profile?.email ?? '' }}
// BAD: Array access without bounds check
{{ $json.items[0].name }}
// GOOD: Safe array access
{{ $json.items?.[0]?.name ?? 'No items' }}Type Conversions
// String to Number
{{ parseInt($json.quantity, 10) }}
{{ parseFloat($json.price) }}
{{ Number($json.value) }}
// Number to String
{{ String($json.id) }}
{{ $json.amount.toString() }}
{{ $json.count.toFixed(2) }}
// Date handling
{{ new Date($json.timestamp).toISOString() }}
{{ DateTime.fromISO($json.date).toFormat('yyyy-MM-dd') }}
// Boolean conversion
{{ Boolean($json.active) }}
{{ $json.enabled === 'true' }}String Operations
// Case conversion
{{ $json.name.toLowerCase() }}
{{ $json.name.toUpperCase() }}
{{ $json.name.charAt(0).toUpperCase() + $json.name.slice(1) }}
// String manipulation
{{ $json.text.trim() }}
{{ $json.text.replace(/\s+/g, ' ') }}
{{ $json.text.substring(0, 100) }}
// Template strings
{{ `Hello, ${$json.firstName} ${$json.lastName}!` }}
{{ `Order #${$json.orderId} - ${$json.status}` }}Array Operations
// Mapping
{{ $json.items.map(item => item.name) }}
{{ $json.items.map(item => ({ id: item.id, total: item.price * item.qty })) }}
// Filtering
{{ $json.items.filter(item => item.active) }}
{{ $json.items.filter(item => item.price > 100) }}
// Reducing
{{ $json.items.reduce((sum, item) => sum + item.price, 0) }}
{{ $json.items.reduce((acc, item) => ({ ...acc, [item.id]: item }), {}) }}
// Finding
{{ $json.items.find(item => item.id === $json.targetId) }}
{{ $json.items.findIndex(item => item.name === 'target') }}
// Joining
{{ $json.tags.join(', ') }}
{{ $json.items.map(i => i.name).join(' | ') }}---
Validation Patterns
// Validate expression syntax
function validateExpressionSyntax(expression: string): ValidationResult {
// Remove n8n template markers
const code = expression.replace(/\{\{|\}\}/g, '').trim();
try {
// Check if valid JavaScript
new Function(`return (${code})`);
return { valid: true };
} catch (error) {
return {
valid: false,
error: error.message,
suggestion: suggestFix(error.message, code)
};
}
}
// Validate context variables
function validateContextVariables(expression: string): string[] {
const contextVars = ['$json', '$node', '$items', '$now', '$today', '$runIndex', '$workflow'];
const usedVars = [];
const invalidVars = [];
// Find all $ prefixed variables
const varPattern = /\$\w+/g;
let match;
while ((match = varPattern.exec(expression)) !== null) {
const varName = match[0];
if (contextVars.some(cv => varName.startsWith(cv))) {
usedVars.push(varName);
} else {
invalidVars.push(varName);
}
}
return { usedVars, invalidVars };
}
// Test expression with sample data
function testExpression(expression: string, context: any): TestResult {
const code = expression.replace(/\{\{|\}\}/g, '').trim();
try {
// Create function with context
const fn = new Function('$json', '$node', '$items', '$now', '$today',
`return (${code})`);
const result = fn(
context.$json || {},
context.$node || {},
context.$items || (() => ({})),
context.$now || new Date(),
context.$today || new Date()
);
return { success: true, result };
} catch (error) {
return { success: false, error: error.message };
}
}---
Common Errors and Fixes
Undefined Property Access
// ERROR: Cannot read property 'email' of undefined
{{ $json.user.email }}
// FIX 1: Optional chaining
{{ $json.user?.email }}
// FIX 2: With fallback
{{ $json.user?.email ?? 'no-email@example.com' }}
// FIX 3: Conditional
{{ $json.user ? $json.user.email : '' }}Type Errors
// ERROR: toLowerCase is not a function (when null)
{{ $json.name.toLowerCase() }}
// FIX: Null check first
{{ $json.name?.toLowerCase() ?? '' }}
// ERROR: toFixed is not a function (string instead of number)
{{ $json.price.toFixed(2) }}
// FIX: Parse as number first
{{ parseFloat($json.price).toFixed(2) }}
// ERROR: map is not a function (not an array)
{{ $json.items.map(i => i.name) }}
// FIX: Ensure array
{{ (Array.isArray($json.items) ? $json.items : []).map(i => i.name) }}Node Reference Errors
// ERROR: Node "Previous Node" not found
{{ $node["Previous Node"].json.data }}
// FIX: Use exact node name (case-sensitive)
{{ $node["Previous Node1"].json.data }}
// FIX: Add fallback for safety
{{ $node["Previous Node"]?.json?.data ?? {} }}---
Security Patterns
Dangerous Functions to Avoid
// DANGEROUS: Never use eval
{{ eval($json.code) }}
// DANGEROUS: Dynamic function creation
{{ new Function($json.code)() }}
// DANGEROUS: setTimeout with string
{{ setTimeout($json.code, 1000) }}
// SAFE: Use explicit operations instead
{{ $json.value * 2 }}
{{ JSON.parse($json.jsonString) }}Input Validation
// Validate email format
{{ /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test($json.email) ? $json.email : '' }}
// Sanitize for HTML (basic)
{{ $json.text.replace(/[<>&"']/g, c => ({
'<': '<', '>': '>', '&': '&', '"': '"', "'": '''
}[c])) }}
// Limit string length
{{ $json.input.substring(0, 1000) }}
// Validate number range
{{ Math.min(Math.max(parseInt($json.value), 0), 100) }}---
Performance Optimization
Efficient Array Operations
// SLOW: Multiple iterations
{{ $json.items.filter(i => i.active).map(i => i.name).join(', ') }}
// FASTER: Single reduce
{{ $json.items.reduce((acc, i) => i.active ? (acc ? `${acc}, ${i.name}` : i.name) : acc, '') }}
// SLOW: Nested loops
{{ $json.items.map(i => $json.categories.find(c => c.id === i.categoryId)) }}
// FASTER: Create lookup map first (in Code node)
const categoryMap = Object.fromEntries($json.categories.map(c => [c.id, c]));
return $json.items.map(i => categoryMap[i.categoryId]);Avoid in Expressions
// AVOID: Complex logic in expressions
{{ $json.items.reduce((acc, item) => {
const category = $json.categories.find(c => c.id === item.catId);
if (category && category.active) {
acc.push({ ...item, categoryName: category.name });
}
return acc;
}, []) }}
// BETTER: Move to Code node for complex transformations---
Testing Patterns
// Expression test suite
const expressionTests = [
{
name: 'Basic property access',
expression: '{{ $json.name }}',
context: { $json: { name: 'John' } },
expected: 'John'
},
{
name: 'Nested with optional chaining',
expression: '{{ $json.user?.email ?? "default" }}',
context: { $json: { user: null } },
expected: 'default'
},
{
name: 'Array mapping',
expression: '{{ $json.items.map(i => i.id).join(",") }}',
context: { $json: { items: [{ id: 1 }, { id: 2 }] } },
expected: '1,2'
},
{
name: 'Conditional expression',
expression: '{{ $json.score >= 70 ? "Pass" : "Fail" }}',
context: { $json: { score: 85 } },
expected: 'Pass'
},
{
name: 'Node reference',
expression: '{{ $node["Previous"].json.result }}',
context: { $node: { Previous: { json: { result: 'success' } } } },
expected: 'success'
}
];
// Run tests
for (const test of expressionTests) {
const result = testExpression(test.expression, test.context);
console.log(`${test.name}: ${result.result === test.expected ? 'PASS' : 'FAIL'}`);
}---
Agent Coordination
Memory Namespace
aqe/n8n/expressions/
├── validations/* - Expression validation results
├── patterns/* - Discovered expression patterns
├── errors/* - Common error catalog
└── optimizations/* - Performance suggestionsFleet Coordination
// Coordinate expression validation with workflow testing
await Task("Validate expressions", {
workflowId: "wf-123",
validateAll: true,
testWithSampleData: true
}, "n8n-expression-validator");---
Related Skills
- n8n-workflow-testing-fundamentals - Workflow testing
- n8n-security-testing - Security validation
---
Remember
n8n expressions are JavaScript-like with special context variables ($json, $node, etc.). Testing requires:
- Syntax validation
- Context variable verification
- Null safety checks
- Type compatibility
- Security scanning
Key patterns: Use optional chaining (?.) and nullish coalescing (??) for safety. Move complex logic to Code nodes. Always test with edge cases (null, undefined, empty arrays).
# =============================================================================
# AQE Skill Evaluation Test Suite: n8n Expression Testing v1.0.0
# =============================================================================
#
# Comprehensive evaluation suite for n8n expression testing skill.
# Tests expression syntax validation, context-aware testing, null-safety,
# type safety, performance optimization, and security vulnerability detection.
#
# Schema: .claude/skills/.validation/schemas/skill-eval.schema.json
# Validator: .claude/skills/n8n-expression-testing/scripts/validate-config.json
#
# Coverage:
# - JavaScript expression syntax validation
# - n8n context variable testing ($json, $node)
# - Null-safe access patterns (?., ??)
# - Type safety validation
# - Performance bottleneck detection
# - Security vulnerability scanning
#
# =============================================================================
skill: n8n-expression-testing
version: 1.0.0
description: >
Comprehensive evaluation suite for n8n expression testing skill.
Tests JavaScript expression validation in n8n context, context-aware
variable resolution, null-safety patterns, type handling, performance
optimization, and detection of security vulnerabilities in expressions.
# =============================================================================
# Multi-Model Configuration
# =============================================================================
models_to_test:
- claude-sonnet-4-6 # Primary (high accuracy expected)
- claude-haiku-4-5 # Fast model (minimum quality floor)
# =============================================================================
# MCP Integration Configuration
# =============================================================================
mcp_integration:
enabled: true
namespace: skill-validation
query_patterns: true
track_outcomes: true
store_patterns: true
share_learning: true
update_quality_gate: true
target_agents:
- qe-learning-coordinator
- qe-queen-coordinator
- n8n-expression-validator
# =============================================================================
# ReasoningBank Learning Configuration
# =============================================================================
learning:
store_success_patterns: true
store_failure_patterns: true
pattern_ttl_days: 90
min_confidence_to_store: 0.7
cross_model_comparison: true
# =============================================================================
# Result Format Configuration
# =============================================================================
result_format:
json_output: true
markdown_report: true
include_raw_output: false
include_timing: true
include_token_usage: true
# =============================================================================
# Environment Setup
# =============================================================================
setup:
required_tools:
- jq
environment_variables:
N8N_EXPRESSION_VALIDATION: "true"
CONTEXT_VALIDATION: "strict"
# =============================================================================
# TEST CASES
# =============================================================================
test_cases:
# ---------------------------------------------------------------------------
# CATEGORY: Expression Syntax Validation
# ---------------------------------------------------------------------------
- id: tc001_valid_expression_syntax
description: "Validate correct JavaScript expression syntax"
category: syntax
priority: critical
input:
expressions:
- code: "$json.user.name"
syntax_valid: true
- code: "$json.items.map(item => item.price * 1.1)"
syntax_valid: true
- code: "$node.HTTP Request.json.data[0].id"
syntax_valid: true
context:
language: javascript
engine: n8n
expected_output:
must_contain:
- "syntax"
- "valid"
- "correct"
must_not_contain:
- "syntax error"
severity_classification: info
finding_count:
max: 1
validation:
schema_check: true
keyword_match_threshold: 0.8
reasoning_quality_min: 0.75
timeout_ms: 30000
- id: tc002_invalid_expression_detection
description: "Detect syntax errors in n8n expressions"
category: syntax
priority: critical
input:
expressions:
- code: "$json.user.name.map()"
has_error: true
error_type: "string_not_array"
- code: "$json[invalid bracket"
has_error: true
error_type: "syntax_error"
- code: "$node.Missing.output"
has_error: true
error_type: "undefined_reference"
context:
language: javascript
expected_output:
must_contain:
- "error"
- "detected"
- "syntax"
must_not_contain:
- "valid"
severity_classification: high
validation:
schema_check: true
keyword_match_threshold: 0.8
# ---------------------------------------------------------------------------
# CATEGORY: Context Variable Resolution
# ---------------------------------------------------------------------------
- id: tc003_context_variable_json
description: "Validate $json context variable usage"
category: context
priority: critical
input:
expression: "$json.user.email"
context:
$json:
user:
email: "user@example.com"
name: "John Doe"
expected_result: "user@example.com"
expected_output:
must_contain:
- "context"
- "$json"
- "resolved"
must_not_contain:
- "undefined"
severity_classification: info
validation:
schema_check: true
keyword_match_threshold: 0.8
- id: tc004_context_variable_node_reference
description: "Validate $node reference to other nodes"
category: context
priority: critical
input:
expression: "$node['HTTP Request'].json.status"
references:
- node_name: "HTTP Request"
output_available: true
has_json: true
context:
current_node: "Transform"
upstream_nodes: ["HTTP Request"]
expected_output:
must_contain:
- "$node"
- "reference"
- "valid"
must_not_contain:
- "not found"
severity_classification: info
validation:
schema_check: true
keyword_match_threshold: 0.8
# ---------------------------------------------------------------------------
# CATEGORY: Null-Safety and Type Safety
# ---------------------------------------------------------------------------
- id: tc005_null_safe_access_pattern
description: "Validate null-safe optional chaining (?.) usage"
category: null_safety
priority: critical
input:
expressions:
- code: "$json.user?.name"
pattern: "optional_chaining"
safe: true
- code: "$json.user?.profile?.avatar?.url"
pattern: "chained_optional"
safe: true
context:
validation_mode: strict
expected_output:
must_contain:
- "null-safe"
- "optional chaining"
- "safe"
must_not_contain:
- "unsafe"
severity_classification: info
validation:
schema_check: true
keyword_match_threshold: 0.8
- id: tc006_unsafe_null_access_detection
description: "Detect unsafe property access that could throw"
category: null_safety
priority: critical
input:
expressions:
- code: "$json.user.profile.avatar"
pattern: "unsafe_chaining"
risk: "throws if user/profile/avatar undefined"
context:
validation_mode: strict
expected_output:
must_contain:
- "unsafe"
- "could throw"
- "null"
must_not_contain:
- "safe"
severity_classification: high
validation:
schema_check: true
keyword_match_threshold: 0.8
- id: tc007_type_handling_validation
description: "Validate type conversions in expressions"
category: type_safety
priority: high
input:
expressions:
- code: "$json.price * 1.1"
operands: ["number", "number"]
result_type: "number"
valid: true
- code: "$json.name + ' approved'"
operands: ["string", "string"]
result_type: "string"
valid: true
- code: "$json.items.length"
operands: ["array"]
result_type: "number"
valid: true
context:
type_checking: enabled
expected_output:
must_contain:
- "type"
- "valid"
- "conversion"
must_not_contain:
- "type error"
severity_classification: info
validation:
schema_check: true
keyword_match_threshold: 0.75
# ---------------------------------------------------------------------------
# CATEGORY: Performance Optimization
# ---------------------------------------------------------------------------
- id: tc008_performance_bottleneck_detection
description: "Detect performance issues in expressions"
category: performance
priority: high
input:
expressions:
- code: "$json.items.map(x => x).filter(x => x).map(x => x.price).reduce((a,b) => a+b, 0)"
issue: "multiple chained array operations"
optimizable: true
- code: "JSON.parse(JSON.stringify($json))"
issue: "unnecessary deep clone"
optimizable: true
context:
optimization_check: enabled
expected_output:
must_contain:
- "performance"
- "optimize"
- "bottleneck"
must_not_contain:
- "efficient"
severity_classification: medium
validation:
schema_check: true
keyword_match_threshold: 0.75
# ---------------------------------------------------------------------------
# CATEGORY: Common Pitfalls
# ---------------------------------------------------------------------------
- id: tc009_common_pitfall_detection
description: "Detect common n8n expression pitfalls"
category: pitfalls
priority: high
input:
pitfalls:
- code: "return $json"
issue: "n8n expressions don't use 'return', they evaluate to value"
severity: error
- code: "$json[0]"
issue: "$json is object not array, should use $json.items[0] or similar"
severity: warning
- code: "$env.PASSWORD"
issue: "avoid logging sensitive env vars"
severity: warning
context:
experience_level: beginner
expected_output:
must_contain:
- "pitfall"
- "common"
- "issue"
must_not_contain:
- "no issues"
severity_classification: medium
validation:
schema_check: true
keyword_match_threshold: 0.75
# ---------------------------------------------------------------------------
# CATEGORY: Security Vulnerability Detection
# ---------------------------------------------------------------------------
- id: tc010_security_vulnerability_scanning
description: "Detect security vulnerabilities in expressions"
category: security
priority: critical
input:
expressions:
- code: "eval($json.userCode)"
vulnerability: "eval execution"
severity: critical
- code: "new Function($json.code)()"
vulnerability: "dynamic function execution"
severity: critical
- code: "require('os').system(cmd)"
vulnerability: "system command execution"
severity: critical
context:
security_scanning: enabled
expected_output:
must_contain:
- "vulnerability"
- "security"
- "eval"
- "critical"
must_not_contain:
- "safe"
severity_classification: critical
validation:
schema_check: true
keyword_match_threshold: 0.85
# =============================================================================
# SUCCESS CRITERIA
# =============================================================================
success_criteria:
pass_rate: 0.85
critical_pass_rate: 1.0
avg_reasoning_quality: 0.75
max_execution_time_ms: 300000
cross_model_variance: 0.15
# =============================================================================
# METADATA
# =============================================================================
metadata:
author: "n8n-expression-validator"
created: "2026-02-02"
last_updated: "2026-02-02"
coverage_target: >
n8n expression testing including syntax validation, context variable
resolution ($json, $node), null-safety patterns (?., ??), type safety,
performance optimization, common pitfalls detection, and security
vulnerability scanning (eval, Function, require). 10 test cases with
85% pass rate and 100% critical pass rate.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://agentic-qe.dev/schemas/skills/n8n-expression-testing/output.json",
"title": "N8N Expression Testing Skill Output Schema",
"description": "Schema for n8n-expression-testing skill output. Validates n8n expression syntax, JavaScript evaluation, and data transformation testing.",
"type": "object",
"required": ["skillName", "version", "timestamp", "status", "trustTier", "output"],
"properties": {
"skillName": {
"type": "string",
"const": "n8n-expression-testing"
},
"version": {
"type": "string",
"pattern": "^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9]+)?$"
},
"timestamp": {
"type": "string",
"format": "date-time"
},
"status": {
"type": "string",
"enum": ["success", "partial", "failed", "skipped"]
},
"trustTier": {
"type": "integer",
"const": 3
},
"output": {
"type": "object",
"required": ["summary", "expressionResults", "nodeTests"],
"properties": {
"summary": {
"type": "string",
"minLength": 20,
"maxLength": 2000,
"description": "Summary of expression testing analysis"
},
"expressionResults": {
"type": "array",
"items": {
"$ref": "#/$defs/expressionResult"
},
"minItems": 0,
"maxItems": 500,
"description": "Results of expression evaluations"
},
"nodeTests": {
"type": "array",
"items": {
"$ref": "#/$defs/nodeTest"
},
"maxItems": 200,
"description": "Node-specific test cases"
},
"workflowValidation": {
"$ref": "#/$defs/workflowValidation",
"description": "Workflow-level validation results"
},
"syntaxErrors": {
"type": "array",
"items": {
"$ref": "#/$defs/syntaxError"
},
"description": "Expression syntax errors found"
},
"dataTransformations": {
"type": "array",
"items": {
"$ref": "#/$defs/dataTransformation"
},
"description": "Data transformation test cases"
},
"recommendations": {
"type": "array",
"items": {
"$ref": "#/$defs/recommendation"
},
"maxItems": 50
},
"metrics": {
"$ref": "#/$defs/metrics"
}
}
},
"metadata": {
"$ref": "#/$defs/metadata"
},
"validation": {
"$ref": "#/$defs/validationResult"
},
"learning": {
"$ref": "#/$defs/learningData"
}
},
"$defs": {
"expressionResult": {
"type": "object",
"required": ["id", "expression", "status"],
"properties": {
"id": {
"type": "string",
"pattern": "^EXPR-\\d{3,6}$"
},
"expression": {
"type": "string",
"maxLength": 5000,
"description": "The n8n expression being tested"
},
"expressionType": {
"type": "string",
"enum": ["simple", "javascript", "template", "function", "mixed"],
"description": "Type of n8n expression"
},
"status": {
"type": "string",
"enum": ["valid", "invalid", "warning", "error"]
},
"input": {
"type": "object",
"description": "Input data for expression evaluation"
},
"expectedOutput": {
"description": "Expected result of expression"
},
"actualOutput": {
"description": "Actual result of expression evaluation"
},
"passed": {
"type": "boolean"
},
"errorMessage": {
"type": "string",
"maxLength": 1000
},
"nodeContext": {
"type": "string",
"description": "The node where this expression is used"
},
"dataPath": {
"type": "string",
"description": "JSON path in workflow data"
}
}
},
"nodeTest": {
"type": "object",
"required": ["nodeId", "nodeName", "nodeType"],
"properties": {
"nodeId": {
"type": "string"
},
"nodeName": {
"type": "string"
},
"nodeType": {
"type": "string",
"description": "n8n node type (e.g., n8n-nodes-base.set, n8n-nodes-base.code)"
},
"expressionCount": {
"type": "integer",
"minimum": 0
},
"passedExpressions": {
"type": "integer",
"minimum": 0
},
"failedExpressions": {
"type": "integer",
"minimum": 0
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"issues": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"workflowValidation": {
"type": "object",
"required": ["workflowId", "valid"],
"properties": {
"workflowId": {
"type": "string"
},
"workflowName": {
"type": "string"
},
"valid": {
"type": "boolean"
},
"totalNodes": {
"type": "integer",
"minimum": 0
},
"testedNodes": {
"type": "integer",
"minimum": 0
},
"totalExpressions": {
"type": "integer",
"minimum": 0
},
"validExpressions": {
"type": "integer",
"minimum": 0
},
"invalidExpressions": {
"type": "integer",
"minimum": 0
},
"overallScore": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"grade": {
"type": "string",
"pattern": "^[A-F][+-]?$"
}
}
},
"syntaxError": {
"type": "object",
"required": ["expression", "error"],
"properties": {
"expression": {
"type": "string"
},
"error": {
"type": "string"
},
"line": {
"type": "integer",
"minimum": 1
},
"column": {
"type": "integer",
"minimum": 1
},
"nodeName": {
"type": "string"
},
"severity": {
"type": "string",
"enum": ["error", "warning", "info"]
},
"suggestion": {
"type": "string"
}
}
},
"dataTransformation": {
"type": "object",
"required": ["id", "description", "input", "expectedOutput"],
"properties": {
"id": {
"type": "string",
"pattern": "^TRANS-\\d{3,6}$"
},
"description": {
"type": "string"
},
"input": {
"type": "object"
},
"expectedOutput": {},
"actualOutput": {},
"expression": {
"type": "string"
},
"passed": {
"type": "boolean"
},
"transformationType": {
"type": "string",
"enum": ["map", "filter", "reduce", "split", "merge", "custom"]
}
}
},
"recommendation": {
"type": "object",
"required": ["id", "title", "priority"],
"properties": {
"id": {
"type": "string",
"pattern": "^REC-\\d{3,6}$"
},
"title": {
"type": "string",
"maxLength": 200
},
"description": {
"type": "string",
"maxLength": 2000
},
"priority": {
"type": "string",
"enum": ["critical", "high", "medium", "low"]
},
"category": {
"type": "string",
"enum": ["syntax", "performance", "security", "best-practice", "data-handling"]
},
"codeExample": {
"type": "string",
"maxLength": 5000
}
}
},
"metrics": {
"type": "object",
"properties": {
"totalExpressions": { "type": "integer", "minimum": 0 },
"validExpressions": { "type": "integer", "minimum": 0 },
"invalidExpressions": { "type": "integer", "minimum": 0 },
"passRate": { "type": "number", "minimum": 0, "maximum": 100 },
"nodesAnalyzed": { "type": "integer", "minimum": 0 },
"syntaxErrorCount": { "type": "integer", "minimum": 0 },
"executionTimeMs": { "type": "integer", "minimum": 0 }
}
},
"metadata": {
"type": "object",
"properties": {
"executionTimeMs": { "type": "integer", "minimum": 0 },
"toolsUsed": {
"type": "array",
"items": { "type": "string" }
},
"agentId": {
"type": "string",
"pattern": "^qe-[a-z][a-z0-9-]*$"
},
"n8nVersion": {
"type": "string",
"description": "n8n version being tested against"
},
"workflowPath": {
"type": "string"
}
}
},
"validationResult": {
"type": "object",
"properties": {
"schemaValid": { "type": "boolean" },
"contentValid": { "type": "boolean" },
"confidence": { "type": "number", "minimum": 0, "maximum": 1 }
}
},
"learningData": {
"type": "object",
"properties": {
"patternsDetected": {
"type": "array",
"items": { "type": "string" }
},
"reward": { "type": "number", "minimum": 0, "maximum": 1 }
}
}
}
}
{
"skillName": "n8n-expression-testing",
"skillVersion": "1.0.0",
"requiredTools": [
"jq"
],
"optionalTools": [
"node"
],
"schemaPath": "schemas/output.json",
"requiredFields": [
"skillName",
"status",
"output",
"output.summary",
"output.expressionResults",
"output.nodeTests"
],
"requiredNonEmptyFields": [
"output.summary"
],
"mustContainTerms": [
"expression",
"n8n"
],
"mustNotContainTerms": [
"TODO",
"FIXME",
"placeholder"
],
"enumValidations": {
".status": [
"success",
"partial",
"failed",
"skipped"
]
}
}
Related skills
FAQ
What does n8n-expression-testing do?
n8n-expression-testing is a Claude Code skill for testing & qa.
When should I use n8n-expression-testing?
When you need to helps with testing & qa tasks., or when n8n-expression-testing is a claude code skill for testing & qa.
What are the main capabilities?
n8n-expression-testing; Testing & QA; AI-coding skill.