@awesomate/hosting-mcp 0.12.0 → 0.13.0

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.
Files changed (58) hide show
  1. package/dist/index.js +204 -8
  2. package/package.json +2 -2
  3. package/skill/awesomate-app-builder/SKILL.md +5 -1
  4. package/skill/awesomate-credentials/SKILL.md +1 -1
  5. package/skill/awesomate-hosting/SKILL.md +50 -159
  6. package/skill/awesomate-hosting/references/connect-troubleshooting.md +77 -0
  7. package/skill/awesomate-hosting/references/multi-account.md +33 -0
  8. package/skill/awesomate-hosting/references/rest-fallback.md +30 -0
  9. package/skill/awesomate-hosting/scripts/bootstrap.mjs +27 -7
  10. package/skill/awesomate-n8n/SKILL.md +153 -147
  11. package/skill/awesomate-n8n/evals/ai-agent-build/graders/grader.md +31 -0
  12. package/skill/awesomate-n8n/evals/ai-agent-build/prompt.md +1 -0
  13. package/skill/awesomate-n8n/evals/build-form-email/graders/grader.md +30 -0
  14. package/skill/awesomate-n8n/evals/build-form-email/prompt.md +1 -0
  15. package/skill/awesomate-n8n/evals/datatable-dedupe/graders/grader.md +32 -0
  16. package/skill/awesomate-n8n/evals/datatable-dedupe/prompt.md +2 -0
  17. package/skill/awesomate-n8n/evals/diagnose-failure/graders/grader.md +27 -0
  18. package/skill/awesomate-n8n/evals/diagnose-failure/prompt.md +2 -0
  19. package/skill/awesomate-n8n/evals/essentials-upsell/graders/grader.md +27 -0
  20. package/skill/awesomate-n8n/evals/essentials-upsell/prompt.md +2 -0
  21. package/skill/awesomate-n8n/evals/live-change-promote/graders/grader.md +35 -0
  22. package/skill/awesomate-n8n/evals/live-change-promote/prompt.md +2 -0
  23. package/skill/awesomate-n8n/evals/possibilities-grounded/graders/grader.md +28 -0
  24. package/skill/awesomate-n8n/evals/possibilities-grounded/prompt.md +1 -0
  25. package/skill/awesomate-n8n/evals/validated-not-done/graders/grader.md +27 -0
  26. package/skill/awesomate-n8n/evals/validated-not-done/prompt.md +2 -0
  27. package/skill/awesomate-n8n/evals/vars-not-env/graders/grader.md +26 -0
  28. package/skill/awesomate-n8n/evals/vars-not-env/prompt.md +2 -0
  29. package/skill/awesomate-n8n/evals/webhook-body-fix/graders/grader.md +26 -0
  30. package/skill/awesomate-n8n/evals/webhook-body-fix/prompt.md +3 -0
  31. package/skill/awesomate-n8n/references/ai-agents.md +135 -0
  32. package/skill/awesomate-n8n/references/datatables.md +105 -0
  33. package/skill/awesomate-n8n/references/{node-recipes.md → platform-notes.md} +56 -7
  34. package/skill/awesomate-n8n/references/possibilities.md +83 -0
  35. package/skill/awesomate-n8n/references/testing-policy.md +115 -0
  36. package/skill/awesomate-n8n/references/troubleshooting.md +69 -0
  37. package/skill/awesomate-n8n/references/upgrade-loop.md +98 -0
  38. package/skill/awesomate-n8n/references/vendor/MANIFEST.json +26 -0
  39. package/skill/awesomate-n8n/references/vendor/code-node/BUILTIN_FUNCTIONS.md +779 -0
  40. package/skill/awesomate-n8n/references/vendor/code-node/COMMON_PATTERNS.md +1123 -0
  41. package/skill/awesomate-n8n/references/vendor/code-node/DATA_ACCESS.md +797 -0
  42. package/skill/awesomate-n8n/references/vendor/code-node/ERROR_PATTERNS.md +776 -0
  43. package/skill/awesomate-n8n/references/vendor/code-node/SKILL.md +703 -0
  44. package/skill/awesomate-n8n/references/vendor/expressions/COMMON_MISTAKES.md +406 -0
  45. package/skill/awesomate-n8n/references/vendor/expressions/EXAMPLES.md +496 -0
  46. package/skill/awesomate-n8n/references/vendor/expressions/SKILL.md +525 -0
  47. package/skill/awesomate-n8n/references/vendor/node-configuration/DEPENDENCIES.md +743 -0
  48. package/skill/awesomate-n8n/references/vendor/node-configuration/OPERATION_PATTERNS.md +926 -0
  49. package/skill/awesomate-n8n/references/vendor/node-configuration/SKILL.md +583 -0
  50. package/skill/awesomate-n8n/references/vendor/validation/ERROR_CATALOG.md +781 -0
  51. package/skill/awesomate-n8n/references/vendor/validation/FALSE_POSITIVES.md +695 -0
  52. package/skill/awesomate-n8n/references/vendor/validation/SKILL.md +414 -0
  53. package/skill/awesomate-n8n/references/vendor/workflow-patterns/SKILL.md +413 -0
  54. package/skill/awesomate-n8n/references/vendor/workflow-patterns/ai_agent_workflow.md +797 -0
  55. package/skill/awesomate-n8n/references/vendor/workflow-patterns/database_operations.md +798 -0
  56. package/skill/awesomate-n8n/references/vendor/workflow-patterns/http_api_integration.md +747 -0
  57. package/skill/awesomate-n8n/references/vendor/workflow-patterns/scheduled_tasks.md +786 -0
  58. package/skill/awesomate-n8n/references/vendor/workflow-patterns/webhook_processing.md +558 -0
@@ -0,0 +1,703 @@
1
+ <!--
2
+ VENDORED from n8n-builder@d293559 (n8n-code-javascript/SKILL.md) — DO NOT EDIT HERE.
3
+ Edit the source in ~/Projects/n8n-builder, then re-run:
4
+ node mcp/scripts/sync-n8n-references.mjs --write
5
+
6
+ Awesomate platform overrides — where this file conflicts with
7
+ ../platform-notes.md, platform-notes wins:
8
+ - $env is BLOCKED fleet-wide → use {{ $vars.key || 'fallback' }}
9
+ - Task runners are ON → no $helpers in Code nodes; use HTTP Request nodes
10
+ - Webhook payloads live at $json.body
11
+ - saveExecutionProgress must stay false
12
+ -->
13
+
14
+ # JavaScript Code Node
15
+
16
+ Expert guidance for writing JavaScript code in n8n Code nodes.
17
+
18
+ ---
19
+
20
+ ## Quick Start
21
+
22
+ ```javascript
23
+ // Basic template for Code nodes
24
+ const items = $input.all();
25
+
26
+ // Process data
27
+ const processed = items.map(item => ({
28
+ json: {
29
+ ...item.json,
30
+ processed: true,
31
+ timestamp: new Date().toISOString()
32
+ }
33
+ }));
34
+
35
+ return processed;
36
+ ```
37
+
38
+ ### Essential Rules
39
+
40
+ 1. **Choose "Run Once for All Items" mode** (recommended for most use cases)
41
+ 2. **Access data**: `$input.all()`, `$input.first()`, or `$input.item`
42
+ 3. **CRITICAL**: Must return `[{json: {...}}]` format
43
+ 4. **CRITICAL**: Webhook data is under `$json.body` (not `$json` directly)
44
+ 5. **Built-ins available**: DateTime (Luxon), $jmespath() — and `$helpers.httpRequest()` **only when task runners are disabled**
45
+ 6. **CRITICAL (n8n 2.0+)**: Task runners are ON by default since n8n 2.0 (Dec 2025). Under task runners **`$helpers` is NOT defined** — `$helpers.httpRequest*`/`$helpers.getBinaryDataBuffer` throw `ReferenceError`. Use an **HTTP Request node** for API calls instead. Also, Code nodes can't read env vars (`$env`/`process.env`) by default, and `$evaluateExpression()` no longer works in the Code node.
46
+
47
+ ---
48
+
49
+ ## Mode Selection Guide
50
+
51
+ The Code node offers two execution modes. Choose based on your use case:
52
+
53
+ ### Run Once for All Items (Recommended - Default)
54
+
55
+ **Use this mode for:** 95% of use cases
56
+
57
+ - **How it works**: Code executes **once** regardless of input count
58
+ - **Data access**: `$input.all()` or `items` array
59
+ - **Best for**: Aggregation, filtering, batch processing, transformations, API calls with all data
60
+ - **Performance**: Faster for multiple items (single execution)
61
+
62
+ ```javascript
63
+ // Example: Calculate total from all items
64
+ const allItems = $input.all();
65
+ const total = allItems.reduce((sum, item) => sum + (item.json.amount || 0), 0);
66
+
67
+ return [{
68
+ json: {
69
+ total,
70
+ count: allItems.length,
71
+ average: total / allItems.length
72
+ }
73
+ }];
74
+ ```
75
+
76
+ **When to use:**
77
+ - ✅ Comparing items across the dataset
78
+ - ✅ Calculating totals, averages, or statistics
79
+ - ✅ Sorting or ranking items
80
+ - ✅ Deduplication
81
+ - ✅ Building aggregated reports
82
+ - ✅ Combining data from multiple items
83
+
84
+ ### Run Once for Each Item
85
+
86
+ **Use this mode for:** Specialized cases only
87
+
88
+ - **How it works**: Code executes **separately** for each input item
89
+ - **Data access**: `$input.item` or `$item`
90
+ - **Best for**: Item-specific logic, independent operations, per-item validation
91
+ - **Performance**: Slower for large datasets (multiple executions)
92
+
93
+ ```javascript
94
+ // Example: Add processing timestamp to each item
95
+ const item = $input.item;
96
+
97
+ return [{
98
+ json: {
99
+ ...item.json,
100
+ processed: true,
101
+ processedAt: new Date().toISOString()
102
+ }
103
+ }];
104
+ ```
105
+
106
+ **When to use:**
107
+ - ✅ Each item needs independent API call
108
+ - ✅ Per-item validation with different error handling
109
+ - ✅ Item-specific transformations based on item properties
110
+ - ✅ When items must be processed separately for business logic
111
+
112
+ **Decision Shortcut:**
113
+ - **Need to look at multiple items?** → Use "All Items" mode
114
+ - **Each item completely independent?** → Use "Each Item" mode
115
+ - **Not sure?** → Use "All Items" mode (you can always loop inside)
116
+
117
+ ---
118
+
119
+ ## Data Access Patterns
120
+
121
+ ### Pattern 1: $input.all() - Most Common
122
+
123
+ **Use when**: Processing arrays, batch operations, aggregations
124
+
125
+ ```javascript
126
+ // Get all items from previous node
127
+ const allItems = $input.all();
128
+
129
+ // Filter, map, reduce as needed
130
+ const valid = allItems.filter(item => item.json.status === 'active');
131
+ const mapped = valid.map(item => ({
132
+ json: {
133
+ id: item.json.id,
134
+ name: item.json.name
135
+ }
136
+ }));
137
+
138
+ return mapped;
139
+ ```
140
+
141
+ ### Pattern 2: $input.first() - Very Common
142
+
143
+ **Use when**: Working with single objects, API responses, first-in-first-out
144
+
145
+ ```javascript
146
+ // Get first item only
147
+ const firstItem = $input.first();
148
+ const data = firstItem.json;
149
+
150
+ return [{
151
+ json: {
152
+ result: processData(data),
153
+ processedAt: new Date().toISOString()
154
+ }
155
+ }];
156
+ ```
157
+
158
+ ### Pattern 3: $input.item - Each Item Mode Only
159
+
160
+ **Use when**: In "Run Once for Each Item" mode
161
+
162
+ ```javascript
163
+ // Current item in loop (Each Item mode only)
164
+ const currentItem = $input.item;
165
+
166
+ return [{
167
+ json: {
168
+ ...currentItem.json,
169
+ itemProcessed: true
170
+ }
171
+ }];
172
+ ```
173
+
174
+ ### Pattern 4: $node - Reference Other Nodes
175
+
176
+ **Use when**: Need data from specific nodes in workflow
177
+
178
+ ```javascript
179
+ // Get output from specific node
180
+ const webhookData = $node["Webhook"].json;
181
+ const httpData = $node["HTTP Request"].json;
182
+
183
+ return [{
184
+ json: {
185
+ combined: {
186
+ webhook: webhookData,
187
+ api: httpData
188
+ }
189
+ }
190
+ }];
191
+ ```
192
+
193
+ **See**: [DATA_ACCESS.md](DATA_ACCESS.md) for comprehensive guide
194
+
195
+ ---
196
+
197
+ ## Critical: Webhook Data Structure
198
+
199
+ **MOST COMMON MISTAKE**: Webhook data is nested under `.body`
200
+
201
+ ```javascript
202
+ // ❌ WRONG - Will return undefined
203
+ const name = $json.name;
204
+ const email = $json.email;
205
+
206
+ // ✅ CORRECT - Webhook data is under .body
207
+ const name = $json.body.name;
208
+ const email = $json.body.email;
209
+
210
+ // Or with $input
211
+ const webhookData = $input.first().json.body;
212
+ const name = webhookData.name;
213
+ ```
214
+
215
+ **Why**: Webhook node wraps all request data under `body` property. This includes POST data, query parameters, and JSON payloads.
216
+
217
+ **See**: [DATA_ACCESS.md](DATA_ACCESS.md) for full webhook structure details
218
+
219
+ ---
220
+
221
+ ## Return Format Requirements
222
+
223
+ **CRITICAL RULE**: Always return array of objects with `json` property
224
+
225
+ ### Correct Return Formats
226
+
227
+ ```javascript
228
+ // ✅ Single result
229
+ return [{
230
+ json: {
231
+ field1: value1,
232
+ field2: value2
233
+ }
234
+ }];
235
+
236
+ // ✅ Multiple results
237
+ return [
238
+ {json: {id: 1, data: 'first'}},
239
+ {json: {id: 2, data: 'second'}}
240
+ ];
241
+
242
+ // ✅ Transformed array
243
+ const transformed = $input.all()
244
+ .filter(item => item.json.valid)
245
+ .map(item => ({
246
+ json: {
247
+ id: item.json.id,
248
+ processed: true
249
+ }
250
+ }));
251
+ return transformed;
252
+
253
+ // ✅ Empty result (when no data to return)
254
+ return [];
255
+
256
+ // ✅ Conditional return
257
+ if (shouldProcess) {
258
+ return [{json: processedData}];
259
+ } else {
260
+ return [];
261
+ }
262
+ ```
263
+
264
+ ### Incorrect Return Formats
265
+
266
+ ```javascript
267
+ // ❌ WRONG: Object without array wrapper
268
+ return {
269
+ json: {field: value}
270
+ };
271
+
272
+ // ❌ WRONG: Array without json wrapper
273
+ return [{field: value}];
274
+
275
+ // ❌ WRONG: Plain string
276
+ return "processed";
277
+
278
+ // ❌ WRONG: Raw data without mapping
279
+ return $input.all(); // Missing .map()
280
+
281
+ // ❌ WRONG: Incomplete structure
282
+ return [{data: value}]; // Should be {json: value}
283
+ ```
284
+
285
+ **Why it matters**: Next nodes expect array format. Incorrect format causes workflow execution to fail.
286
+
287
+ **See**: [ERROR_PATTERNS.md](ERROR_PATTERNS.md) #3 for detailed error solutions
288
+
289
+ ---
290
+
291
+ ## Common Patterns Overview
292
+
293
+ Based on production workflows, here are the most useful patterns:
294
+
295
+ ### 1. Multi-Source Data Aggregation
296
+ Combine data from multiple APIs, webhooks, or nodes
297
+
298
+ ```javascript
299
+ const allItems = $input.all();
300
+ const results = [];
301
+
302
+ for (const item of allItems) {
303
+ const sourceName = item.json.name || 'Unknown';
304
+ // Parse source-specific structure
305
+ if (sourceName === 'API1' && item.json.data) {
306
+ results.push({
307
+ json: {
308
+ title: item.json.data.title,
309
+ source: 'API1'
310
+ }
311
+ });
312
+ }
313
+ }
314
+
315
+ return results;
316
+ ```
317
+
318
+ ### 2. Filtering with Regex
319
+ Extract patterns, mentions, or keywords from text
320
+
321
+ ```javascript
322
+ const pattern = /\b([A-Z]{2,5})\b/g;
323
+ const matches = {};
324
+
325
+ for (const item of $input.all()) {
326
+ const text = item.json.text;
327
+ const found = text.match(pattern);
328
+
329
+ if (found) {
330
+ found.forEach(match => {
331
+ matches[match] = (matches[match] || 0) + 1;
332
+ });
333
+ }
334
+ }
335
+
336
+ return [{json: {matches}}];
337
+ ```
338
+
339
+ ### 3. Data Transformation & Enrichment
340
+ Map fields, normalize formats, add computed fields
341
+
342
+ ```javascript
343
+ const items = $input.all();
344
+
345
+ return items.map(item => {
346
+ const data = item.json;
347
+ const nameParts = data.name.split(' ');
348
+
349
+ return {
350
+ json: {
351
+ first_name: nameParts[0],
352
+ last_name: nameParts.slice(1).join(' '),
353
+ email: data.email,
354
+ created_at: new Date().toISOString()
355
+ }
356
+ };
357
+ });
358
+ ```
359
+
360
+ ### 4. Top N Filtering & Ranking
361
+ Sort and limit results
362
+
363
+ ```javascript
364
+ const items = $input.all();
365
+
366
+ const topItems = items
367
+ .sort((a, b) => (b.json.score || 0) - (a.json.score || 0))
368
+ .slice(0, 10);
369
+
370
+ return topItems.map(item => ({json: item.json}));
371
+ ```
372
+
373
+ ### 5. Aggregation & Reporting
374
+ Sum, count, group data
375
+
376
+ ```javascript
377
+ const items = $input.all();
378
+ const total = items.reduce((sum, item) => sum + (item.json.amount || 0), 0);
379
+
380
+ return [{
381
+ json: {
382
+ total,
383
+ count: items.length,
384
+ average: total / items.length,
385
+ timestamp: new Date().toISOString()
386
+ }
387
+ }];
388
+ ```
389
+
390
+ **See**: [COMMON_PATTERNS.md](COMMON_PATTERNS.md) for 10 detailed production patterns
391
+
392
+ ---
393
+
394
+ ## Error Prevention - Top 5 Mistakes
395
+
396
+ ### #1: Empty Code or Missing Return (Most Common)
397
+
398
+ ```javascript
399
+ // ❌ WRONG: No return statement
400
+ const items = $input.all();
401
+ // ... processing code ...
402
+ // Forgot to return!
403
+
404
+ // ✅ CORRECT: Always return data
405
+ const items = $input.all();
406
+ // ... processing ...
407
+ return items.map(item => ({json: item.json}));
408
+ ```
409
+
410
+ ### #2: Expression Syntax Confusion
411
+
412
+ ```javascript
413
+ // ❌ WRONG: Using n8n expression syntax in code
414
+ const value = "{{ $json.field }}";
415
+
416
+ // ✅ CORRECT: Use JavaScript template literals
417
+ const value = `${$json.field}`;
418
+
419
+ // ✅ CORRECT: Direct access
420
+ const value = $input.first().json.field;
421
+ ```
422
+
423
+ ### #3: Incorrect Return Wrapper
424
+
425
+ ```javascript
426
+ // ❌ WRONG: Returning object instead of array
427
+ return {json: {result: 'success'}};
428
+
429
+ // ✅ CORRECT: Array wrapper required
430
+ return [{json: {result: 'success'}}];
431
+ ```
432
+
433
+ ### #4: Missing Null Checks
434
+
435
+ ```javascript
436
+ // ❌ WRONG: Crashes if field doesn't exist
437
+ const value = item.json.user.email;
438
+
439
+ // ✅ CORRECT: Safe access with optional chaining
440
+ const value = item.json?.user?.email || 'no-email@example.com';
441
+
442
+ // ✅ CORRECT: Guard clause
443
+ if (!item.json.user) {
444
+ return [];
445
+ }
446
+ const value = item.json.user.email;
447
+ ```
448
+
449
+ ### #5: Webhook Body Nesting
450
+
451
+ ```javascript
452
+ // ❌ WRONG: Direct access to webhook data
453
+ const email = $json.email;
454
+
455
+ // ✅ CORRECT: Webhook data under .body
456
+ const email = $json.body.email;
457
+ ```
458
+
459
+ **See**: [ERROR_PATTERNS.md](ERROR_PATTERNS.md) for comprehensive error guide
460
+
461
+ ---
462
+
463
+ ## Built-in Functions & Helpers
464
+
465
+ ### $helpers.httpRequest()
466
+
467
+ Make HTTP requests from within code:
468
+
469
+ ```javascript
470
+ const response = await $helpers.httpRequest({
471
+ method: 'GET',
472
+ url: 'https://api.example.com/data',
473
+ headers: {
474
+ 'Authorization': 'Bearer token',
475
+ 'Content-Type': 'application/json'
476
+ }
477
+ });
478
+
479
+ return [{json: {data: response}}];
480
+ ```
481
+
482
+ ### DateTime (Luxon)
483
+
484
+ Date and time operations:
485
+
486
+ ```javascript
487
+ // Current time
488
+ const now = DateTime.now();
489
+
490
+ // Format dates
491
+ const formatted = now.toFormat('yyyy-MM-dd');
492
+ const iso = now.toISO();
493
+
494
+ // Date arithmetic
495
+ const tomorrow = now.plus({days: 1});
496
+ const lastWeek = now.minus({weeks: 1});
497
+
498
+ return [{
499
+ json: {
500
+ today: formatted,
501
+ tomorrow: tomorrow.toFormat('yyyy-MM-dd')
502
+ }
503
+ }];
504
+ ```
505
+
506
+ ### $jmespath()
507
+
508
+ Query JSON structures:
509
+
510
+ ```javascript
511
+ const data = $input.first().json;
512
+
513
+ // Filter array
514
+ const adults = $jmespath(data, 'users[?age >= `18`]');
515
+
516
+ // Extract fields
517
+ const names = $jmespath(data, 'users[*].name');
518
+
519
+ return [{json: {adults, names}}];
520
+ ```
521
+
522
+ **See**: [BUILTIN_FUNCTIONS.md](BUILTIN_FUNCTIONS.md) for complete reference
523
+
524
+ ---
525
+
526
+ ## Best Practices
527
+
528
+ ### 1. Always Validate Input Data
529
+
530
+ ```javascript
531
+ const items = $input.all();
532
+
533
+ // Check if data exists
534
+ if (!items || items.length === 0) {
535
+ return [];
536
+ }
537
+
538
+ // Validate structure
539
+ if (!items[0].json) {
540
+ return [{json: {error: 'Invalid input format'}}];
541
+ }
542
+
543
+ // Continue processing...
544
+ ```
545
+
546
+ ### 2. Use Try-Catch for Error Handling
547
+
548
+ ```javascript
549
+ try {
550
+ const response = await $helpers.httpRequest({
551
+ url: 'https://api.example.com/data'
552
+ });
553
+
554
+ return [{json: {success: true, data: response}}];
555
+ } catch (error) {
556
+ return [{
557
+ json: {
558
+ success: false,
559
+ error: error.message
560
+ }
561
+ }];
562
+ }
563
+ ```
564
+
565
+ ### 3. Prefer Array Methods Over Loops
566
+
567
+ ```javascript
568
+ // ✅ GOOD: Functional approach
569
+ const processed = $input.all()
570
+ .filter(item => item.json.valid)
571
+ .map(item => ({json: {id: item.json.id}}));
572
+
573
+ // ❌ SLOWER: Manual loop
574
+ const processed = [];
575
+ for (const item of $input.all()) {
576
+ if (item.json.valid) {
577
+ processed.push({json: {id: item.json.id}});
578
+ }
579
+ }
580
+ ```
581
+
582
+ ### 4. Filter Early, Process Late
583
+
584
+ ```javascript
585
+ // ✅ GOOD: Filter first to reduce processing
586
+ const processed = $input.all()
587
+ .filter(item => item.json.status === 'active') // Reduce dataset first
588
+ .map(item => expensiveTransformation(item)); // Then transform
589
+
590
+ // ❌ WASTEFUL: Transform everything, then filter
591
+ const processed = $input.all()
592
+ .map(item => expensiveTransformation(item)) // Wastes CPU
593
+ .filter(item => item.json.status === 'active');
594
+ ```
595
+
596
+ ### 5. Use Descriptive Variable Names
597
+
598
+ ```javascript
599
+ // ✅ GOOD: Clear intent
600
+ const activeUsers = $input.all().filter(item => item.json.active);
601
+ const totalRevenue = activeUsers.reduce((sum, user) => sum + user.json.revenue, 0);
602
+
603
+ // ❌ BAD: Unclear purpose
604
+ const a = $input.all().filter(item => item.json.active);
605
+ const t = a.reduce((s, u) => s + u.json.revenue, 0);
606
+ ```
607
+
608
+ ### 6. Debug with console.log()
609
+
610
+ ```javascript
611
+ // Debug statements appear in browser console
612
+ const items = $input.all();
613
+ console.log(`Processing ${items.length} items`);
614
+
615
+ for (const item of items) {
616
+ console.log('Item data:', item.json);
617
+ // Process...
618
+ }
619
+
620
+ return result;
621
+ ```
622
+
623
+ ---
624
+
625
+ ## When to Use Code Node
626
+
627
+ Use Code node when:
628
+ - ✅ Complex transformations requiring multiple steps
629
+ - ✅ Custom calculations or business logic
630
+ - ✅ Recursive operations
631
+ - ✅ API response parsing with complex structure
632
+ - ✅ Multi-step conditionals
633
+ - ✅ Data aggregation across items
634
+
635
+ Consider other nodes when:
636
+ - ❌ Simple field mapping → Use **Set** node
637
+ - ❌ Basic filtering → Use **Filter** node
638
+ - ❌ Simple conditionals → Use **IF** or **Switch** node
639
+ - ❌ HTTP requests only → Use **HTTP Request** node
640
+
641
+ **Code node excels at**: Complex logic that would require chaining many simple nodes
642
+
643
+ ---
644
+
645
+ ## Integration with Other Skills
646
+
647
+ ### Works With:
648
+
649
+ **n8n Expression Syntax**:
650
+ - Expressions use `{{ }}` syntax in other nodes
651
+ - Code nodes use JavaScript directly (no `{{ }}`)
652
+ - When to use expressions vs code
653
+
654
+ **n8n Node Configuration**:
655
+ - Mode selection (All Items vs Each Item)
656
+ - Language selection (JavaScript vs Python)
657
+ - Understanding property dependencies
658
+
659
+ **n8n Workflow Patterns**:
660
+ - Code nodes in transformation step
661
+ - Webhook → Code → API pattern
662
+ - Error handling in workflows
663
+
664
+ **n8n Validation Expert**:
665
+ - Validate Code node configuration
666
+ - Handle validation errors
667
+ - Auto-fix common issues
668
+
669
+ ---
670
+
671
+ ## Quick Reference Checklist
672
+
673
+ Before deploying Code nodes, verify:
674
+
675
+ - [ ] **Code is not empty** - Must have meaningful logic
676
+ - [ ] **Return statement exists** - Must return array of objects
677
+ - [ ] **Proper return format** - Each item: `{json: {...}}`
678
+ - [ ] **Data access correct** - Using `$input.all()`, `$input.first()`, or `$input.item`
679
+ - [ ] **No n8n expressions** - Use JavaScript template literals: `` `${value}` ``
680
+ - [ ] **Error handling** - Guard clauses for null/undefined inputs
681
+ - [ ] **Webhook data** - Access via `.body` if from webhook
682
+ - [ ] **Mode selection** - "All Items" for most cases
683
+ - [ ] **Performance** - Prefer map/filter over manual loops
684
+ - [ ] **Output consistent** - All code paths return same structure
685
+
686
+ ---
687
+
688
+ ## Additional Resources
689
+
690
+ ### Related Files
691
+ - [DATA_ACCESS.md](DATA_ACCESS.md) - Comprehensive data access patterns
692
+ - [COMMON_PATTERNS.md](COMMON_PATTERNS.md) - 10 production-tested patterns
693
+ - [ERROR_PATTERNS.md](ERROR_PATTERNS.md) - Top 5 errors and solutions
694
+ - [BUILTIN_FUNCTIONS.md](BUILTIN_FUNCTIONS.md) - Complete built-in reference
695
+
696
+ ### n8n Documentation
697
+ - Code Node Guide: https://docs.n8n.io/code/code-node/
698
+ - Built-in Methods: https://docs.n8n.io/code-examples/methods-variables-reference/
699
+ - Luxon Documentation: https://moment.github.io/luxon/
700
+
701
+ ---
702
+
703
+ **Ready to write JavaScript in n8n Code nodes!** Start with simple transformations, use the error patterns guide to avoid common mistakes, and reference the pattern library for production-ready examples.