@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.
- package/dist/index.js +204 -8
- package/package.json +2 -2
- package/skill/awesomate-app-builder/SKILL.md +5 -1
- package/skill/awesomate-credentials/SKILL.md +1 -1
- package/skill/awesomate-hosting/SKILL.md +50 -159
- package/skill/awesomate-hosting/references/connect-troubleshooting.md +77 -0
- package/skill/awesomate-hosting/references/multi-account.md +33 -0
- package/skill/awesomate-hosting/references/rest-fallback.md +30 -0
- package/skill/awesomate-hosting/scripts/bootstrap.mjs +27 -7
- package/skill/awesomate-n8n/SKILL.md +153 -147
- package/skill/awesomate-n8n/evals/ai-agent-build/graders/grader.md +31 -0
- package/skill/awesomate-n8n/evals/ai-agent-build/prompt.md +1 -0
- package/skill/awesomate-n8n/evals/build-form-email/graders/grader.md +30 -0
- package/skill/awesomate-n8n/evals/build-form-email/prompt.md +1 -0
- package/skill/awesomate-n8n/evals/datatable-dedupe/graders/grader.md +32 -0
- package/skill/awesomate-n8n/evals/datatable-dedupe/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/diagnose-failure/graders/grader.md +27 -0
- package/skill/awesomate-n8n/evals/diagnose-failure/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/essentials-upsell/graders/grader.md +27 -0
- package/skill/awesomate-n8n/evals/essentials-upsell/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/live-change-promote/graders/grader.md +35 -0
- package/skill/awesomate-n8n/evals/live-change-promote/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/possibilities-grounded/graders/grader.md +28 -0
- package/skill/awesomate-n8n/evals/possibilities-grounded/prompt.md +1 -0
- package/skill/awesomate-n8n/evals/validated-not-done/graders/grader.md +27 -0
- package/skill/awesomate-n8n/evals/validated-not-done/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/vars-not-env/graders/grader.md +26 -0
- package/skill/awesomate-n8n/evals/vars-not-env/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/webhook-body-fix/graders/grader.md +26 -0
- package/skill/awesomate-n8n/evals/webhook-body-fix/prompt.md +3 -0
- package/skill/awesomate-n8n/references/ai-agents.md +135 -0
- package/skill/awesomate-n8n/references/datatables.md +105 -0
- package/skill/awesomate-n8n/references/{node-recipes.md → platform-notes.md} +56 -7
- package/skill/awesomate-n8n/references/possibilities.md +83 -0
- package/skill/awesomate-n8n/references/testing-policy.md +115 -0
- package/skill/awesomate-n8n/references/troubleshooting.md +69 -0
- package/skill/awesomate-n8n/references/upgrade-loop.md +98 -0
- package/skill/awesomate-n8n/references/vendor/MANIFEST.json +26 -0
- package/skill/awesomate-n8n/references/vendor/code-node/BUILTIN_FUNCTIONS.md +779 -0
- package/skill/awesomate-n8n/references/vendor/code-node/COMMON_PATTERNS.md +1123 -0
- package/skill/awesomate-n8n/references/vendor/code-node/DATA_ACCESS.md +797 -0
- package/skill/awesomate-n8n/references/vendor/code-node/ERROR_PATTERNS.md +776 -0
- package/skill/awesomate-n8n/references/vendor/code-node/SKILL.md +703 -0
- package/skill/awesomate-n8n/references/vendor/expressions/COMMON_MISTAKES.md +406 -0
- package/skill/awesomate-n8n/references/vendor/expressions/EXAMPLES.md +496 -0
- package/skill/awesomate-n8n/references/vendor/expressions/SKILL.md +525 -0
- package/skill/awesomate-n8n/references/vendor/node-configuration/DEPENDENCIES.md +743 -0
- package/skill/awesomate-n8n/references/vendor/node-configuration/OPERATION_PATTERNS.md +926 -0
- package/skill/awesomate-n8n/references/vendor/node-configuration/SKILL.md +583 -0
- package/skill/awesomate-n8n/references/vendor/validation/ERROR_CATALOG.md +781 -0
- package/skill/awesomate-n8n/references/vendor/validation/FALSE_POSITIVES.md +695 -0
- package/skill/awesomate-n8n/references/vendor/validation/SKILL.md +414 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/SKILL.md +413 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/ai_agent_workflow.md +797 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/database_operations.md +798 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/http_api_integration.md +747 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/scheduled_tasks.md +786 -0
- 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
|