@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,743 @@
1
+ <!--
2
+ VENDORED from n8n-builder@d293559 (n8n-node-configuration/DEPENDENCIES.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
+ # Property Dependencies Guide
15
+
16
+ Deep dive into n8n property dependencies and displayOptions mechanism.
17
+
18
+ ---
19
+
20
+ ## What Are Property Dependencies?
21
+
22
+ **Definition**: Rules that control when fields are visible or required based on other field values.
23
+
24
+ **Mechanism**: `displayOptions` in node schema
25
+
26
+ **Purpose**:
27
+ - Show relevant fields only
28
+ - Hide irrelevant fields
29
+ - Simplify configuration UX
30
+ - Prevent invalid configurations
31
+
32
+ ---
33
+
34
+ ## displayOptions Structure
35
+
36
+ ### Basic Format
37
+
38
+ ```javascript
39
+ {
40
+ "name": "fieldName",
41
+ "type": "string",
42
+ "displayOptions": {
43
+ "show": {
44
+ "otherField": ["value1", "value2"]
45
+ }
46
+ }
47
+ }
48
+ ```
49
+
50
+ **Translation**: Show `fieldName` when `otherField` equals "value1" OR "value2"
51
+
52
+ ### Show vs Hide
53
+
54
+ #### show (Most Common)
55
+
56
+ **Show field when condition matches**:
57
+ ```javascript
58
+ {
59
+ "name": "body",
60
+ "displayOptions": {
61
+ "show": {
62
+ "sendBody": [true]
63
+ }
64
+ }
65
+ }
66
+ ```
67
+
68
+ **Meaning**: Show `body` when `sendBody = true`
69
+
70
+ #### hide (Less Common)
71
+
72
+ **Hide field when condition matches**:
73
+ ```javascript
74
+ {
75
+ "name": "advanced",
76
+ "displayOptions": {
77
+ "hide": {
78
+ "simpleMode": [true]
79
+ }
80
+ }
81
+ }
82
+ ```
83
+
84
+ **Meaning**: Hide `advanced` when `simpleMode = true`
85
+
86
+ ### Multiple Conditions (AND Logic)
87
+
88
+ ```javascript
89
+ {
90
+ "name": "body",
91
+ "displayOptions": {
92
+ "show": {
93
+ "sendBody": [true],
94
+ "method": ["POST", "PUT", "PATCH"]
95
+ }
96
+ }
97
+ }
98
+ ```
99
+
100
+ **Meaning**: Show `body` when:
101
+ - `sendBody = true` AND
102
+ - `method IN (POST, PUT, PATCH)`
103
+
104
+ **All conditions must match** (AND logic)
105
+
106
+ ### Multiple Values (OR Logic)
107
+
108
+ ```javascript
109
+ {
110
+ "name": "someField",
111
+ "displayOptions": {
112
+ "show": {
113
+ "method": ["POST", "PUT", "PATCH"]
114
+ }
115
+ }
116
+ }
117
+ ```
118
+
119
+ **Meaning**: Show `someField` when:
120
+ - `method = POST` OR
121
+ - `method = PUT` OR
122
+ - `method = PATCH`
123
+
124
+ **Any value matches** (OR logic)
125
+
126
+ ---
127
+
128
+ ## Common Dependency Patterns
129
+
130
+ ### Pattern 1: Boolean Toggle
131
+
132
+ **Use case**: Optional feature flag
133
+
134
+ **Example**: HTTP Request sendBody
135
+ ```javascript
136
+ // Field: sendBody (boolean)
137
+ {
138
+ "name": "sendBody",
139
+ "type": "boolean",
140
+ "default": false
141
+ }
142
+
143
+ // Field: body (depends on sendBody)
144
+ {
145
+ "name": "body",
146
+ "displayOptions": {
147
+ "show": {
148
+ "sendBody": [true]
149
+ }
150
+ }
151
+ }
152
+ ```
153
+
154
+ **Flow**:
155
+ 1. User sees sendBody checkbox
156
+ 2. When checked → body field appears
157
+ 3. When unchecked → body field hides
158
+
159
+ ### Pattern 2: Resource/Operation Cascade
160
+
161
+ **Use case**: Different operations show different fields
162
+
163
+ **Example**: Slack message operations
164
+ ```javascript
165
+ // Operation: post
166
+ {
167
+ "name": "channel",
168
+ "displayOptions": {
169
+ "show": {
170
+ "resource": ["message"],
171
+ "operation": ["post"]
172
+ }
173
+ }
174
+ }
175
+
176
+ // Operation: update
177
+ {
178
+ "name": "messageId",
179
+ "displayOptions": {
180
+ "show": {
181
+ "resource": ["message"],
182
+ "operation": ["update"]
183
+ }
184
+ }
185
+ }
186
+ ```
187
+
188
+ **Flow**:
189
+ 1. User selects resource="message"
190
+ 2. User selects operation="post" → sees channel
191
+ 3. User changes to operation="update" → channel hides, messageId shows
192
+
193
+ ### Pattern 3: Type-Specific Configuration
194
+
195
+ **Use case**: Different types need different fields
196
+
197
+ **Example**: IF node conditions
198
+ ```javascript
199
+ // String operations
200
+ {
201
+ "name": "value2",
202
+ "displayOptions": {
203
+ "show": {
204
+ "conditions.string.0.operation": ["equals", "notEquals", "contains"]
205
+ }
206
+ }
207
+ }
208
+
209
+ // Unary operations (isEmpty) don't show value2
210
+ {
211
+ "displayOptions": {
212
+ "hide": {
213
+ "conditions.string.0.operation": ["isEmpty", "isNotEmpty"]
214
+ }
215
+ }
216
+ }
217
+ ```
218
+
219
+ ### Pattern 4: Method-Specific Fields
220
+
221
+ **Use case**: HTTP methods have different options
222
+
223
+ **Example**: HTTP Request
224
+ ```javascript
225
+ // Query parameters (all methods can have)
226
+ {
227
+ "name": "queryParameters",
228
+ "displayOptions": {
229
+ "show": {
230
+ "sendQuery": [true]
231
+ }
232
+ }
233
+ }
234
+
235
+ // Body (only certain methods)
236
+ {
237
+ "name": "body",
238
+ "displayOptions": {
239
+ "show": {
240
+ "sendBody": [true],
241
+ "method": ["POST", "PUT", "PATCH", "DELETE"]
242
+ }
243
+ }
244
+ }
245
+ ```
246
+
247
+ ---
248
+
249
+ ## Finding Property Dependencies
250
+
251
+ Without live schema access, use these approaches:
252
+
253
+ ### The n8n Editor (Ground Truth)
254
+
255
+ Add the node in the editor and toggle the controlling field (`sendBody`, `operation`, `mode`, ...). Fields appearing and disappearing in the parameter panel are the displayOptions rules in action. The panel also warns when a visible required field is empty.
256
+
257
+ ### Official Docs
258
+
259
+ docs.n8n.io documents each node's fields per operation — the per-operation field lists mirror the displayOptions rules.
260
+
261
+ ### When to Dig In
262
+
263
+ **✅ Investigate dependencies when**:
264
+ - The editor warns about a "missing field" you don't see in the panel
265
+ - A field appears/disappears unexpectedly
266
+ - You need to understand what controls field visibility
267
+
268
+ **❌ Don't bother when**:
269
+ - Simple configuration with a known pattern (see [OPERATION_PATTERNS.md](OPERATION_PATTERNS.md))
270
+ - Field requirements are obvious
271
+
272
+ ---
273
+
274
+ ## Complex Dependency Examples
275
+
276
+ ### Example 1: HTTP Request Complete Flow
277
+
278
+ **Scenario**: Configuring POST with JSON body
279
+
280
+ **Step 1**: Set method
281
+ ```javascript
282
+ {
283
+ "method": "POST"
284
+ // → sendBody becomes visible
285
+ }
286
+ ```
287
+
288
+ **Step 2**: Enable body
289
+ ```javascript
290
+ {
291
+ "method": "POST",
292
+ "sendBody": true
293
+ // → body field becomes visible AND required
294
+ }
295
+ ```
296
+
297
+ **Step 3**: Configure body
298
+ ```javascript
299
+ {
300
+ "method": "POST",
301
+ "sendBody": true,
302
+ "body": {
303
+ "contentType": "json"
304
+ // → content field becomes visible AND required
305
+ }
306
+ }
307
+ ```
308
+
309
+ **Step 4**: Add content
310
+ ```javascript
311
+ {
312
+ "method": "POST",
313
+ "sendBody": true,
314
+ "body": {
315
+ "contentType": "json",
316
+ "content": {
317
+ "name": "John",
318
+ "email": "john@example.com"
319
+ }
320
+ }
321
+ }
322
+ // ✅ Valid!
323
+ ```
324
+
325
+ **Dependency chain**:
326
+ ```
327
+ method=POST
328
+ → sendBody visible
329
+ → sendBody=true
330
+ → body visible + required
331
+ → body.contentType=json
332
+ → body.content visible + required
333
+ ```
334
+
335
+ ### Example 2: IF Node Operator Dependencies
336
+
337
+ **Scenario**: String comparison with different operators
338
+
339
+ **Binary operator** (equals):
340
+ ```javascript
341
+ {
342
+ "conditions": {
343
+ "string": [
344
+ {
345
+ "operation": "equals"
346
+ // → value1 required
347
+ // → value2 required
348
+ // → singleValue should NOT be set
349
+ }
350
+ ]
351
+ }
352
+ }
353
+ ```
354
+
355
+ **Unary operator** (isEmpty):
356
+ ```javascript
357
+ {
358
+ "conditions": {
359
+ "string": [
360
+ {
361
+ "operation": "isEmpty"
362
+ // → value1 required
363
+ // → value2 should NOT be set
364
+ // → singleValue should be true
365
+ }
366
+ ]
367
+ }
368
+ }
369
+ ```
370
+
371
+ **Dependency table**:
372
+
373
+ | Operator | value1 | value2 | singleValue |
374
+ |---|---|---|---|
375
+ | equals | Required | Required | false |
376
+ | notEquals | Required | Required | false |
377
+ | contains | Required | Required | false |
378
+ | isEmpty | Required | Hidden | true |
379
+ | isNotEmpty | Required | Hidden | true |
380
+
381
+ ### Example 3: Slack Operation Matrix
382
+
383
+ **Scenario**: Different Slack operations show different fields
384
+
385
+ ```javascript
386
+ // post message
387
+ {
388
+ "resource": "message",
389
+ "operation": "post"
390
+ // Shows: channel (required), text (required), attachments, blocks
391
+ }
392
+
393
+ // update message
394
+ {
395
+ "resource": "message",
396
+ "operation": "update"
397
+ // Shows: messageId (required), text (required), channel (optional)
398
+ }
399
+
400
+ // delete message
401
+ {
402
+ "resource": "message",
403
+ "operation": "delete"
404
+ // Shows: messageId (required), channel (required)
405
+ // Hides: text, attachments, blocks
406
+ }
407
+
408
+ // get message
409
+ {
410
+ "resource": "message",
411
+ "operation": "get"
412
+ // Shows: messageId (required), channel (required)
413
+ // Hides: text, attachments, blocks
414
+ }
415
+ ```
416
+
417
+ **Field visibility matrix**:
418
+
419
+ | Field | post | update | delete | get |
420
+ |---|---|---|---|---|
421
+ | channel | Required | Optional | Required | Required |
422
+ | text | Required | Required | Hidden | Hidden |
423
+ | messageId | Hidden | Required | Required | Required |
424
+ | attachments | Optional | Optional | Hidden | Hidden |
425
+ | blocks | Optional | Optional | Hidden | Hidden |
426
+
427
+ ---
428
+
429
+ ## Nested Dependencies
430
+
431
+ ### What Are They?
432
+
433
+ **Definition**: Dependencies within object properties
434
+
435
+ **Example**: HTTP Request body.contentType controls body.content structure
436
+
437
+ ```javascript
438
+ {
439
+ "body": {
440
+ "contentType": "json",
441
+ // → content expects JSON object
442
+ "content": {
443
+ "key": "value"
444
+ }
445
+ }
446
+ }
447
+
448
+ {
449
+ "body": {
450
+ "contentType": "form-data",
451
+ // → content expects form fields array
452
+ "content": [
453
+ {
454
+ "name": "field1",
455
+ "value": "value1"
456
+ }
457
+ ]
458
+ }
459
+ }
460
+ ```
461
+
462
+ ### How to Handle
463
+
464
+ **Strategy**: Configure parent first, then children
465
+
466
+ ```javascript
467
+ // Step 1: Parent
468
+ {
469
+ "body": {
470
+ "contentType": "json" // Set parent first
471
+ }
472
+ }
473
+
474
+ // Step 2: Children (structure determined by parent)
475
+ {
476
+ "body": {
477
+ "contentType": "json",
478
+ "content": { // JSON object format
479
+ "key": "value"
480
+ }
481
+ }
482
+ }
483
+ ```
484
+
485
+ ---
486
+
487
+ ## Editor Normalization and Dependencies
488
+
489
+ ### What the Editor Fixes
490
+
491
+ **Operator structure issues** (IF/Switch nodes): configuring the node through the UI normalizes operator metadata such as `singleValue`.
492
+
493
+ ```javascript
494
+ // Missing singleValue on a unary operator
495
+ {
496
+ "type": "boolean",
497
+ "operation": "isEmpty"
498
+ }
499
+
500
+ // After configuring in the editor
501
+ {
502
+ "type": "boolean",
503
+ "operation": "isEmpty",
504
+ "singleValue": true // ✅ Normalized
505
+ }
506
+ ```
507
+
508
+ When producing JSON for import, include `singleValue: true` for unary operators yourself so the config is correct as pasted.
509
+
510
+ ### What It Doesn't Fix
511
+
512
+ **Missing required fields**:
513
+ ```javascript
514
+ // Missing channel
515
+ {
516
+ "resource": "message",
517
+ "operation": "post",
518
+ "text": "Hello"
519
+ // Missing required field: channel
520
+ }
521
+
522
+ // The editor warns, but you must add it yourself
523
+ {
524
+ "resource": "message",
525
+ "operation": "post",
526
+ "channel": "#general", // ← You must add
527
+ "text": "Hello"
528
+ }
529
+ ```
530
+
531
+ ---
532
+
533
+ ## Troubleshooting Dependencies
534
+
535
+ ### Problem 1: "Field X is required but not visible"
536
+
537
+ **Symptom**: The editor complains a field is required, but you don't see it in the parameter panel.
538
+
539
+ **Why**: The field is hidden by displayOptions — its controlling field isn't set.
540
+
541
+ **Solution**:
542
+ ```javascript
543
+ // body only shows when sendBody=true (see Pattern 4 above)
544
+ // Add the controlling field
545
+ {
546
+ "method": "POST",
547
+ "sendBody": true, // ← Now body appears!
548
+ "body": {...}
549
+ }
550
+ ```
551
+
552
+ ### Problem 2: "Field disappears when I change operation"
553
+
554
+ **Scenario**:
555
+ ```javascript
556
+ // Working configuration
557
+ {
558
+ "resource": "message",
559
+ "operation": "post",
560
+ "channel": "#general",
561
+ "text": "Hello"
562
+ }
563
+
564
+ // Change operation
565
+ {
566
+ "resource": "message",
567
+ "operation": "update", // Changed
568
+ "channel": "#general", // Still here
569
+ "text": "Updated" // Still here
570
+ // Missing: messageId (required for update!)
571
+ }
572
+ ```
573
+
574
+ **Editor warning**: "messageId is required"
575
+
576
+ **Why**: Different operation = different required fields
577
+
578
+ **Solution**:
579
+ ```javascript
580
+ // Check the new operation's requirements (Slack matrix above, or docs.n8n.io)
581
+ {
582
+ "resource": "message",
583
+ "operation": "update",
584
+ "messageId": "1234567890", // Required for update
585
+ "text": "Updated",
586
+ "channel": "#general" // Optional for update
587
+ }
588
+ ```
589
+
590
+ ### Problem 3: "Field doesn't save"
591
+
592
+ **Scenario**: Field hidden by dependencies is stripped on save
593
+
594
+ **Example**:
595
+ ```javascript
596
+ // Configure
597
+ {
598
+ "method": "GET",
599
+ "sendBody": true, // ❌ GET doesn't support body
600
+ "body": {...} // This will be stripped
601
+ }
602
+
603
+ // After save
604
+ {
605
+ "method": "GET"
606
+ // body removed because method=GET hides it
607
+ }
608
+ ```
609
+
610
+ **Solution**: Respect dependencies from the start — body only shows for POST/PUT/PATCH/DELETE, so use a method that supports it:
611
+
612
+ ```javascript
613
+ {
614
+ "method": "POST",
615
+ "sendBody": true,
616
+ "body": {...}
617
+ }
618
+ ```
619
+
620
+ ---
621
+
622
+ ## Advanced Patterns
623
+
624
+ ### Pattern 1: Conditional Required with Fallback
625
+
626
+ **Example**: Channel can be string OR expression
627
+
628
+ ```javascript
629
+ // Option 1: String
630
+ {
631
+ "channel": "#general"
632
+ }
633
+
634
+ // Option 2: Expression
635
+ {
636
+ "channel": "={{$json.channelName}}"
637
+ }
638
+
639
+ // Both are accepted
640
+ ```
641
+
642
+ ### Pattern 2: Mutually Exclusive Fields
643
+
644
+ **Example**: Use either ID or name, not both
645
+
646
+ ```javascript
647
+ // Use messageId
648
+ {
649
+ "messageId": "1234567890"
650
+ // name not needed
651
+ }
652
+
653
+ // OR use messageName
654
+ {
655
+ "messageName": "thread-name"
656
+ // messageId not needed
657
+ }
658
+
659
+ // Dependencies ensure only one is required
660
+ ```
661
+
662
+ ### Pattern 3: Progressive Complexity
663
+
664
+ **Example**: Simple mode vs advanced mode
665
+
666
+ ```javascript
667
+ // Simple mode
668
+ {
669
+ "mode": "simple",
670
+ "text": "{{$json.message}}"
671
+ // Advanced fields hidden
672
+ }
673
+
674
+ // Advanced mode
675
+ {
676
+ "mode": "advanced",
677
+ "attachments": [...],
678
+ "blocks": [...],
679
+ "metadata": {...}
680
+ // Simple field hidden, advanced fields shown
681
+ }
682
+ ```
683
+
684
+ ---
685
+
686
+ ## Best Practices
687
+
688
+ ### ✅ Do
689
+
690
+ 1. **Check dependencies when stuck** — toggle the controlling field in the n8n editor, or read the node's docs on docs.n8n.io
691
+
692
+ 2. **Configure parent properties first**
693
+ ```javascript
694
+ // First: method, resource, operation
695
+ // Then: dependent fields
696
+ ```
697
+
698
+ 3. **Re-check requirements after changing operation** — open the node in the editor; warnings flag what the new operation needs
699
+
700
+ 4. **Read editor warnings for dependency hints**
701
+ ```
702
+ Warning: "body required when sendBody=true"
703
+ → Hint: Set sendBody=true to enable body
704
+ ```
705
+
706
+ ### ❌ Don't
707
+
708
+ 1. **Don't ignore dependency warnings** — a "required but not visible" field means its controlling field isn't set
709
+
710
+ 2. **Don't hardcode all possible fields** — fields hidden by dependencies get stripped on save
711
+
712
+ 3. **Don't assume operations are identical** — each operation has unique requirements
713
+
714
+ ---
715
+
716
+ ## Summary
717
+
718
+ **Key Concepts**:
719
+ - `displayOptions` control field visibility
720
+ - `show` = field appears when conditions match
721
+ - `hide` = field disappears when conditions match
722
+ - Multiple conditions = AND logic
723
+ - Multiple values = OR logic
724
+
725
+ **Common Patterns**:
726
+ 1. Boolean toggle (sendBody → body)
727
+ 2. Resource/operation cascade (different operations → different fields)
728
+ 3. Type-specific config (string vs boolean conditions)
729
+ 4. Method-specific fields (GET vs POST)
730
+
731
+ **Troubleshooting**:
732
+ - Field required but not visible → Check dependencies
733
+ - Field disappears after change → Operation changed requirements
734
+ - Field doesn't save → Hidden by dependencies
735
+
736
+ **Tools**:
737
+ - The n8n editor's parameter panel — toggle fields to see visibility rules live
738
+ - docs.n8n.io — per-operation field documentation
739
+ - Editor warnings — hints about dependencies
740
+
741
+ **Related Files**:
742
+ - **[SKILL.md](SKILL.md)** - Main configuration guide
743
+ - **[OPERATION_PATTERNS.md](OPERATION_PATTERNS.md)** - Common patterns by node type