bps-kit 1.2.2 → 1.3.1

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 (51) hide show
  1. package/.bps-kit.json +4 -4
  2. package/README.md +3 -0
  3. package/implementation_plan.md.resolved +37 -0
  4. package/package.json +2 -2
  5. package/templates/agents-template/ARCHITECTURE.md +21 -9
  6. package/templates/agents-template/agents/automation-specialist.md +157 -0
  7. package/templates/agents-template/rules/GEMINI.md +2 -10
  8. package/templates/agents-template/workflows/automate.md +153 -0
  9. package/templates/skills_normal/n8n-code-javascript/BUILTIN_FUNCTIONS.md +764 -0
  10. package/templates/skills_normal/n8n-code-javascript/COMMON_PATTERNS.md +1110 -0
  11. package/templates/skills_normal/n8n-code-javascript/DATA_ACCESS.md +782 -0
  12. package/templates/skills_normal/n8n-code-javascript/ERROR_PATTERNS.md +763 -0
  13. package/templates/skills_normal/n8n-code-javascript/README.md +350 -0
  14. package/templates/skills_normal/n8n-code-javascript/SKILL.md +699 -0
  15. package/templates/skills_normal/n8n-code-python/COMMON_PATTERNS.md +794 -0
  16. package/templates/skills_normal/n8n-code-python/DATA_ACCESS.md +702 -0
  17. package/templates/skills_normal/n8n-code-python/ERROR_PATTERNS.md +601 -0
  18. package/templates/skills_normal/n8n-code-python/README.md +386 -0
  19. package/templates/skills_normal/n8n-code-python/SKILL.md +748 -0
  20. package/templates/skills_normal/n8n-code-python/STANDARD_LIBRARY.md +974 -0
  21. package/templates/skills_normal/n8n-expression-syntax/COMMON_MISTAKES.md +393 -0
  22. package/templates/skills_normal/n8n-expression-syntax/EXAMPLES.md +483 -0
  23. package/templates/skills_normal/n8n-expression-syntax/README.md +93 -0
  24. package/templates/skills_normal/n8n-expression-syntax/SKILL.md +516 -0
  25. package/templates/skills_normal/n8n-mcp-tools-expert/README.md +99 -0
  26. package/templates/skills_normal/n8n-mcp-tools-expert/SEARCH_GUIDE.md +374 -0
  27. package/templates/skills_normal/n8n-mcp-tools-expert/SKILL.md +642 -0
  28. package/templates/skills_normal/n8n-mcp-tools-expert/VALIDATION_GUIDE.md +442 -0
  29. package/templates/skills_normal/n8n-mcp-tools-expert/WORKFLOW_GUIDE.md +618 -0
  30. package/templates/skills_normal/n8n-node-configuration/DEPENDENCIES.md +789 -0
  31. package/templates/skills_normal/n8n-node-configuration/OPERATION_PATTERNS.md +913 -0
  32. package/templates/skills_normal/n8n-node-configuration/README.md +364 -0
  33. package/templates/skills_normal/n8n-node-configuration/SKILL.md +785 -0
  34. package/templates/skills_normal/n8n-validation-expert/ERROR_CATALOG.md +943 -0
  35. package/templates/skills_normal/n8n-validation-expert/FALSE_POSITIVES.md +720 -0
  36. package/templates/skills_normal/n8n-validation-expert/README.md +290 -0
  37. package/templates/skills_normal/n8n-validation-expert/SKILL.md +689 -0
  38. package/templates/skills_normal/n8n-workflow-patterns/README.md +251 -0
  39. package/templates/skills_normal/n8n-workflow-patterns/SKILL.md +411 -0
  40. package/templates/skills_normal/n8n-workflow-patterns/ai_agent_workflow.md +784 -0
  41. package/templates/skills_normal/n8n-workflow-patterns/database_operations.md +785 -0
  42. package/templates/skills_normal/n8n-workflow-patterns/http_api_integration.md +734 -0
  43. package/templates/skills_normal/n8n-workflow-patterns/scheduled_tasks.md +773 -0
  44. package/templates/skills_normal/n8n-workflow-patterns/webhook_processing.md +545 -0
  45. package/templates/vault/n8n-code-javascript/SKILL.md +10 -10
  46. package/templates/vault/n8n-code-python/SKILL.md +11 -11
  47. package/templates/vault/n8n-expression-syntax/SKILL.md +4 -4
  48. package/templates/vault/n8n-mcp-tools-expert/SKILL.md +9 -9
  49. package/templates/vault/n8n-node-configuration/SKILL.md +2 -2
  50. package/templates/vault/n8n-validation-expert/SKILL.md +3 -3
  51. package/templates/vault/n8n-workflow-patterns/SKILL.md +11 -11
@@ -0,0 +1,785 @@
1
+ ---
2
+ name: n8n-node-configuration
3
+ description: Operation-aware node configuration guidance. Use when configuring nodes, understanding property dependencies, determining required fields, choosing between get_node detail levels, or learning common configuration patterns by node type.
4
+ ---
5
+
6
+ # n8n Node Configuration
7
+
8
+ Expert guidance for operation-aware node configuration with property dependencies.
9
+
10
+ ---
11
+
12
+ ## Configuration Philosophy
13
+
14
+ **Progressive disclosure**: Start minimal, add complexity as needed
15
+
16
+ Configuration best practices:
17
+ - `get_node` with `detail: "standard"` is the most used discovery pattern
18
+ - 56 seconds average between configuration edits
19
+ - Covers 95% of use cases with 1-2K tokens response
20
+
21
+ **Key insight**: Most configurations need only standard detail, not full schema!
22
+
23
+ ---
24
+
25
+ ## Core Concepts
26
+
27
+ ### 1. Operation-Aware Configuration
28
+
29
+ **Not all fields are always required** - it depends on operation!
30
+
31
+ **Example**: Slack node
32
+ ```javascript
33
+ // For operation='post'
34
+ {
35
+ "resource": "message",
36
+ "operation": "post",
37
+ "channel": "#general", // Required for post
38
+ "text": "Hello!" // Required for post
39
+ }
40
+
41
+ // For operation='update'
42
+ {
43
+ "resource": "message",
44
+ "operation": "update",
45
+ "messageId": "123", // Required for update (different!)
46
+ "text": "Updated!" // Required for update
47
+ // channel NOT required for update
48
+ }
49
+ ```
50
+
51
+ **Key**: Resource + operation determine which fields are required!
52
+
53
+ ### 2. Property Dependencies
54
+
55
+ **Fields appear/disappear based on other field values**
56
+
57
+ **Example**: HTTP Request node
58
+ ```javascript
59
+ // When method='GET'
60
+ {
61
+ "method": "GET",
62
+ "url": "https://api.example.com"
63
+ // sendBody not shown (GET doesn't have body)
64
+ }
65
+
66
+ // When method='POST'
67
+ {
68
+ "method": "POST",
69
+ "url": "https://api.example.com",
70
+ "sendBody": true, // Now visible!
71
+ "body": { // Required when sendBody=true
72
+ "contentType": "json",
73
+ "content": {...}
74
+ }
75
+ }
76
+ ```
77
+
78
+ **Mechanism**: displayOptions control field visibility
79
+
80
+ ### 3. Progressive Discovery
81
+
82
+ **Use the right detail level**:
83
+
84
+ 1. **get_node({detail: "standard"})** - DEFAULT
85
+ - Quick overview (~1-2K tokens)
86
+ - Required fields + common options
87
+ - **Use first** - covers 95% of needs
88
+
89
+ 2. **get_node({mode: "search_properties", propertyQuery: "..."})** (for finding specific fields)
90
+ - Find properties by name
91
+ - Use when looking for auth, body, headers, etc.
92
+
93
+ 3. **get_node({detail: "full"})** (complete schema)
94
+ - All properties (~3-8K tokens)
95
+ - Use only when standard detail is insufficient
96
+
97
+ ---
98
+
99
+ ## Configuration Workflow
100
+
101
+ ### Standard Process
102
+
103
+ ```
104
+ 1. Identify node type and operation
105
+
106
+ 2. Use get_node (standard detail is default)
107
+
108
+ 3. Configure required fields
109
+
110
+ 4. Validate configuration
111
+
112
+ 5. If field unclear → get_node({mode: "search_properties"})
113
+
114
+ 6. Add optional fields as needed
115
+
116
+ 7. Validate again
117
+
118
+ 8. Deploy
119
+ ```
120
+
121
+ ### Example: Configuring HTTP Request
122
+
123
+ **Step 1**: Identify what you need
124
+ ```javascript
125
+ // Goal: POST JSON to API
126
+ ```
127
+
128
+ **Step 2**: Get node info
129
+ ```javascript
130
+ const info = get_node({
131
+ nodeType: "nodes-base.httpRequest"
132
+ });
133
+
134
+ // Returns: method, url, sendBody, body, authentication required/optional
135
+ ```
136
+
137
+ **Step 3**: Minimal config
138
+ ```javascript
139
+ {
140
+ "method": "POST",
141
+ "url": "https://api.example.com/create",
142
+ "authentication": "none"
143
+ }
144
+ ```
145
+
146
+ **Step 4**: Validate
147
+ ```javascript
148
+ validate_node({
149
+ nodeType: "nodes-base.httpRequest",
150
+ config,
151
+ profile: "runtime"
152
+ });
153
+ // → Error: "sendBody required for POST"
154
+ ```
155
+
156
+ **Step 5**: Add required field
157
+ ```javascript
158
+ {
159
+ "method": "POST",
160
+ "url": "https://api.example.com/create",
161
+ "authentication": "none",
162
+ "sendBody": true
163
+ }
164
+ ```
165
+
166
+ **Step 6**: Validate again
167
+ ```javascript
168
+ validate_node({...});
169
+ // → Error: "body required when sendBody=true"
170
+ ```
171
+
172
+ **Step 7**: Complete configuration
173
+ ```javascript
174
+ {
175
+ "method": "POST",
176
+ "url": "https://api.example.com/create",
177
+ "authentication": "none",
178
+ "sendBody": true,
179
+ "body": {
180
+ "contentType": "json",
181
+ "content": {
182
+ "name": "={{$json.name}}",
183
+ "email": "={{$json.email}}"
184
+ }
185
+ }
186
+ }
187
+ ```
188
+
189
+ **Step 8**: Final validation
190
+ ```javascript
191
+ validate_node({...});
192
+ // → Valid! ✅
193
+ ```
194
+
195
+ ---
196
+
197
+ ## get_node Detail Levels
198
+
199
+ ### Standard Detail (DEFAULT - Use This!)
200
+
201
+ **✅ Starting configuration**
202
+ ```javascript
203
+ get_node({
204
+ nodeType: "nodes-base.slack"
205
+ });
206
+ // detail="standard" is the default
207
+ ```
208
+
209
+ **Returns** (~1-2K tokens):
210
+ - Required fields
211
+ - Common options
212
+ - Operation list
213
+ - Metadata
214
+
215
+ **Use**: 95% of configuration needs
216
+
217
+ ### Full Detail (Use Sparingly)
218
+
219
+ **✅ When standard isn't enough**
220
+ ```javascript
221
+ get_node({
222
+ nodeType: "nodes-base.slack",
223
+ detail: "full"
224
+ });
225
+ ```
226
+
227
+ **Returns** (~3-8K tokens):
228
+ - Complete schema
229
+ - All properties
230
+ - All nested options
231
+
232
+ **Warning**: Large response, use only when standard insufficient
233
+
234
+ ### Search Properties Mode
235
+
236
+ **✅ Looking for specific field**
237
+ ```javascript
238
+ get_node({
239
+ nodeType: "nodes-base.httpRequest",
240
+ mode: "search_properties",
241
+ propertyQuery: "auth"
242
+ });
243
+ ```
244
+
245
+ **Use**: Find authentication, headers, body fields, etc.
246
+
247
+ ### Decision Tree
248
+
249
+ ```
250
+ ┌─────────────────────────────────┐
251
+ │ Starting new node config? │
252
+ ├─────────────────────────────────┤
253
+ │ YES → get_node (standard) │
254
+ └─────────────────────────────────┘
255
+
256
+ ┌─────────────────────────────────┐
257
+ │ Standard has what you need? │
258
+ ├─────────────────────────────────┤
259
+ │ YES → Configure with it │
260
+ │ NO → Continue │
261
+ └─────────────────────────────────┘
262
+
263
+ ┌─────────────────────────────────┐
264
+ │ Looking for specific field? │
265
+ ├─────────────────────────────────┤
266
+ │ YES → search_properties mode │
267
+ │ NO → Continue │
268
+ └─────────────────────────────────┘
269
+
270
+ ┌─────────────────────────────────┐
271
+ │ Still need more details? │
272
+ ├─────────────────────────────────┤
273
+ │ YES → get_node({detail: "full"})│
274
+ └─────────────────────────────────┘
275
+ ```
276
+
277
+ ---
278
+
279
+ ## Property Dependencies Deep Dive
280
+
281
+ ### displayOptions Mechanism
282
+
283
+ **Fields have visibility rules**:
284
+
285
+ ```javascript
286
+ {
287
+ "name": "body",
288
+ "displayOptions": {
289
+ "show": {
290
+ "sendBody": [true],
291
+ "method": ["POST", "PUT", "PATCH"]
292
+ }
293
+ }
294
+ }
295
+ ```
296
+
297
+ **Translation**: "body" field shows when:
298
+ - sendBody = true AND
299
+ - method = POST, PUT, or PATCH
300
+
301
+ ### Common Dependency Patterns
302
+
303
+ #### Pattern 1: Boolean Toggle
304
+
305
+ **Example**: HTTP Request sendBody
306
+ ```javascript
307
+ // sendBody controls body visibility
308
+ {
309
+ "sendBody": true // → body field appears
310
+ }
311
+ ```
312
+
313
+ #### Pattern 2: Operation Switch
314
+
315
+ **Example**: Slack resource/operation
316
+ ```javascript
317
+ // Different operations → different fields
318
+ {
319
+ "resource": "message",
320
+ "operation": "post"
321
+ // → Shows: channel, text, attachments, etc.
322
+ }
323
+
324
+ {
325
+ "resource": "message",
326
+ "operation": "update"
327
+ // → Shows: messageId, text (different fields!)
328
+ }
329
+ ```
330
+
331
+ #### Pattern 3: Type Selection
332
+
333
+ **Example**: IF node conditions
334
+ ```javascript
335
+ {
336
+ "type": "string",
337
+ "operation": "contains"
338
+ // → Shows: value1, value2
339
+ }
340
+
341
+ {
342
+ "type": "boolean",
343
+ "operation": "equals"
344
+ // → Shows: value1, value2, different operators
345
+ }
346
+ ```
347
+
348
+ ### Finding Property Dependencies
349
+
350
+ **Use get_node with search_properties mode**:
351
+ ```javascript
352
+ get_node({
353
+ nodeType: "nodes-base.httpRequest",
354
+ mode: "search_properties",
355
+ propertyQuery: "body"
356
+ });
357
+
358
+ // Returns property paths matching "body" with descriptions
359
+ ```
360
+
361
+ **Or use full detail for complete schema**:
362
+ ```javascript
363
+ get_node({
364
+ nodeType: "nodes-base.httpRequest",
365
+ detail: "full"
366
+ });
367
+
368
+ // Returns complete schema with displayOptions rules
369
+ ```
370
+
371
+ **Use this when**: Validation fails and you don't understand why field is missing/required
372
+
373
+ ---
374
+
375
+ ## Common Node Patterns
376
+
377
+ ### Pattern 1: Resource/Operation Nodes
378
+
379
+ **Examples**: Slack, Google Sheets, Airtable
380
+
381
+ **Structure**:
382
+ ```javascript
383
+ {
384
+ "resource": "<entity>", // What type of thing
385
+ "operation": "<action>", // What to do with it
386
+ // ... operation-specific fields
387
+ }
388
+ ```
389
+
390
+ **How to configure**:
391
+ 1. Choose resource
392
+ 2. Choose operation
393
+ 3. Use get_node to see operation-specific requirements
394
+ 4. Configure required fields
395
+
396
+ ### Pattern 2: HTTP-Based Nodes
397
+
398
+ **Examples**: HTTP Request, Webhook
399
+
400
+ **Structure**:
401
+ ```javascript
402
+ {
403
+ "method": "<HTTP_METHOD>",
404
+ "url": "<endpoint>",
405
+ "authentication": "<type>",
406
+ // ... method-specific fields
407
+ }
408
+ ```
409
+
410
+ **Dependencies**:
411
+ - POST/PUT/PATCH → sendBody available
412
+ - sendBody=true → body required
413
+ - authentication != "none" → credentials required
414
+
415
+ ### Pattern 3: Database Nodes
416
+
417
+ **Examples**: Postgres, MySQL, MongoDB
418
+
419
+ **Structure**:
420
+ ```javascript
421
+ {
422
+ "operation": "<query|insert|update|delete>",
423
+ // ... operation-specific fields
424
+ }
425
+ ```
426
+
427
+ **Dependencies**:
428
+ - operation="executeQuery" → query required
429
+ - operation="insert" → table + values required
430
+ - operation="update" → table + values + where required
431
+
432
+ ### Pattern 4: Conditional Logic Nodes
433
+
434
+ **Examples**: IF, Switch, Merge
435
+
436
+ **Structure**:
437
+ ```javascript
438
+ {
439
+ "conditions": {
440
+ "<type>": [
441
+ {
442
+ "operation": "<operator>",
443
+ "value1": "...",
444
+ "value2": "..." // Only for binary operators
445
+ }
446
+ ]
447
+ }
448
+ }
449
+ ```
450
+
451
+ **Dependencies**:
452
+ - Binary operators (equals, contains, etc.) → value1 + value2
453
+ - Unary operators (isEmpty, isNotEmpty) → value1 only + singleValue: true
454
+
455
+ ---
456
+
457
+ ## Operation-Specific Configuration
458
+
459
+ ### Slack Node Examples
460
+
461
+ #### Post Message
462
+ ```javascript
463
+ {
464
+ "resource": "message",
465
+ "operation": "post",
466
+ "channel": "#general", // Required
467
+ "text": "Hello!", // Required
468
+ "attachments": [], // Optional
469
+ "blocks": [] // Optional
470
+ }
471
+ ```
472
+
473
+ #### Update Message
474
+ ```javascript
475
+ {
476
+ "resource": "message",
477
+ "operation": "update",
478
+ "messageId": "1234567890", // Required (different from post!)
479
+ "text": "Updated!", // Required
480
+ "channel": "#general" // Optional (can be inferred)
481
+ }
482
+ ```
483
+
484
+ #### Create Channel
485
+ ```javascript
486
+ {
487
+ "resource": "channel",
488
+ "operation": "create",
489
+ "name": "new-channel", // Required
490
+ "isPrivate": false // Optional
491
+ // Note: text NOT required for this operation
492
+ }
493
+ ```
494
+
495
+ ### HTTP Request Node Examples
496
+
497
+ #### GET Request
498
+ ```javascript
499
+ {
500
+ "method": "GET",
501
+ "url": "https://api.example.com/users",
502
+ "authentication": "predefinedCredentialType",
503
+ "nodeCredentialType": "httpHeaderAuth",
504
+ "sendQuery": true, // Optional
505
+ "queryParameters": { // Shows when sendQuery=true
506
+ "parameters": [
507
+ {
508
+ "name": "limit",
509
+ "value": "100"
510
+ }
511
+ ]
512
+ }
513
+ }
514
+ ```
515
+
516
+ #### POST with JSON
517
+ ```javascript
518
+ {
519
+ "method": "POST",
520
+ "url": "https://api.example.com/users",
521
+ "authentication": "none",
522
+ "sendBody": true, // Required for POST
523
+ "body": { // Required when sendBody=true
524
+ "contentType": "json",
525
+ "content": {
526
+ "name": "John Doe",
527
+ "email": "john@example.com"
528
+ }
529
+ }
530
+ }
531
+ ```
532
+
533
+ ### IF Node Examples
534
+
535
+ #### String Comparison (Binary)
536
+ ```javascript
537
+ {
538
+ "conditions": {
539
+ "string": [
540
+ {
541
+ "value1": "={{$json.status}}",
542
+ "operation": "equals",
543
+ "value2": "active" // Binary: needs value2
544
+ }
545
+ ]
546
+ }
547
+ }
548
+ ```
549
+
550
+ #### Empty Check (Unary)
551
+ ```javascript
552
+ {
553
+ "conditions": {
554
+ "string": [
555
+ {
556
+ "value1": "={{$json.email}}",
557
+ "operation": "isEmpty",
558
+ // No value2 - unary operator
559
+ "singleValue": true // Auto-added by sanitization
560
+ }
561
+ ]
562
+ }
563
+ }
564
+ ```
565
+
566
+ ---
567
+
568
+ ## Handling Conditional Requirements
569
+
570
+ ### Example: HTTP Request Body
571
+
572
+ **Scenario**: body field required, but only sometimes
573
+
574
+ **Rule**:
575
+ ```
576
+ body is required when:
577
+ - sendBody = true AND
578
+ - method IN (POST, PUT, PATCH, DELETE)
579
+ ```
580
+
581
+ **How to discover**:
582
+ ```javascript
583
+ // Option 1: Read validation error
584
+ validate_node({...});
585
+ // Error: "body required when sendBody=true"
586
+
587
+ // Option 2: Search for the property
588
+ get_node({
589
+ nodeType: "nodes-base.httpRequest",
590
+ mode: "search_properties",
591
+ propertyQuery: "body"
592
+ });
593
+ // Shows: body property with displayOptions rules
594
+
595
+ // Option 3: Try minimal config and iterate
596
+ // Start without body, validation will tell you if needed
597
+ ```
598
+
599
+ ### Example: IF Node singleValue
600
+
601
+ **Scenario**: singleValue property appears for unary operators
602
+
603
+ **Rule**:
604
+ ```
605
+ singleValue should be true when:
606
+ - operation IN (isEmpty, isNotEmpty, true, false)
607
+ ```
608
+
609
+ **Good news**: Auto-sanitization fixes this!
610
+
611
+ **Manual check**:
612
+ ```javascript
613
+ get_node({
614
+ nodeType: "nodes-base.if",
615
+ detail: "full"
616
+ });
617
+ // Shows complete schema with operator-specific rules
618
+ ```
619
+
620
+ ---
621
+
622
+ ## Configuration Anti-Patterns
623
+
624
+ ### ❌ Don't: Over-configure Upfront
625
+
626
+ **Bad**:
627
+ ```javascript
628
+ // Adding every possible field
629
+ {
630
+ "method": "GET",
631
+ "url": "...",
632
+ "sendQuery": false,
633
+ "sendHeaders": false,
634
+ "sendBody": false,
635
+ "timeout": 10000,
636
+ "ignoreResponseCode": false,
637
+ // ... 20 more optional fields
638
+ }
639
+ ```
640
+
641
+ **Good**:
642
+ ```javascript
643
+ // Start minimal
644
+ {
645
+ "method": "GET",
646
+ "url": "...",
647
+ "authentication": "none"
648
+ }
649
+ // Add fields only when needed
650
+ ```
651
+
652
+ ### ❌ Don't: Skip Validation
653
+
654
+ **Bad**:
655
+ ```javascript
656
+ // Configure and deploy without validating
657
+ const config = {...};
658
+ n8n_update_partial_workflow({...}); // YOLO
659
+ ```
660
+
661
+ **Good**:
662
+ ```javascript
663
+ // Validate before deploying
664
+ const config = {...};
665
+ const result = validate_node({...});
666
+ if (result.valid) {
667
+ n8n_update_partial_workflow({...});
668
+ }
669
+ ```
670
+
671
+ ### ❌ Don't: Ignore Operation Context
672
+
673
+ **Bad**:
674
+ ```javascript
675
+ // Same config for all Slack operations
676
+ {
677
+ "resource": "message",
678
+ "operation": "post",
679
+ "channel": "#general",
680
+ "text": "..."
681
+ }
682
+
683
+ // Then switching operation without updating config
684
+ {
685
+ "resource": "message",
686
+ "operation": "update", // Changed
687
+ "channel": "#general", // Wrong field for update!
688
+ "text": "..."
689
+ }
690
+ ```
691
+
692
+ **Good**:
693
+ ```javascript
694
+ // Check requirements when changing operation
695
+ get_node({
696
+ nodeType: "nodes-base.slack"
697
+ });
698
+ // See what update operation needs (messageId, not channel)
699
+ ```
700
+
701
+ ---
702
+
703
+ ## Best Practices
704
+
705
+ ### ✅ Do
706
+
707
+ 1. **Start with get_node (standard detail)**
708
+ - ~1-2K tokens response
709
+ - Covers 95% of configuration needs
710
+ - Default detail level
711
+
712
+ 2. **Validate iteratively**
713
+ - Configure → Validate → Fix → Repeat
714
+ - Average 2-3 iterations is normal
715
+ - Read validation errors carefully
716
+
717
+ 3. **Use search_properties mode when stuck**
718
+ - If field seems missing, search for it
719
+ - Understand what controls field visibility
720
+ - `get_node({mode: "search_properties", propertyQuery: "..."})`
721
+
722
+ 4. **Respect operation context**
723
+ - Different operations = different requirements
724
+ - Always check get_node when changing operation
725
+ - Don't assume configs are transferable
726
+
727
+ 5. **Trust auto-sanitization**
728
+ - Operator structure fixed automatically
729
+ - Don't manually add/remove singleValue
730
+ - IF/Switch metadata added on save
731
+
732
+ ### ❌ Don't
733
+
734
+ 1. **Jump to detail="full" immediately**
735
+ - Try standard detail first
736
+ - Only escalate if needed
737
+ - Full schema is 3-8K tokens
738
+
739
+ 2. **Configure blindly**
740
+ - Always validate before deploying
741
+ - Understand why fields are required
742
+ - Use search_properties for conditional fields
743
+
744
+ 3. **Copy configs without understanding**
745
+ - Different operations need different fields
746
+ - Validate after copying
747
+ - Adjust for new context
748
+
749
+ 4. **Manually fix auto-sanitization issues**
750
+ - Let auto-sanitization handle operator structure
751
+ - Focus on business logic
752
+ - Save and let system fix structure
753
+
754
+ ---
755
+
756
+ ## Detailed References
757
+
758
+ For comprehensive guides on specific topics:
759
+
760
+ - **[DEPENDENCIES.md](DEPENDENCIES.md)** - Deep dive into property dependencies and displayOptions
761
+ - **[OPERATION_PATTERNS.md](OPERATION_PATTERNS.md)** - Common configuration patterns by node type
762
+
763
+ ---
764
+
765
+ ## Summary
766
+
767
+ **Configuration Strategy**:
768
+ 1. Start with `get_node` (standard detail is default)
769
+ 2. Configure required fields for operation
770
+ 3. Validate configuration
771
+ 4. Search properties if stuck
772
+ 5. Iterate until valid (avg 2-3 cycles)
773
+ 6. Deploy with confidence
774
+
775
+ **Key Principles**:
776
+ - **Operation-aware**: Different operations = different requirements
777
+ - **Progressive disclosure**: Start minimal, add as needed
778
+ - **Dependency-aware**: Understand field visibility rules
779
+ - **Validation-driven**: Let validation guide configuration
780
+
781
+ **Related Skills**:
782
+ - **n8n MCP Tools Expert** - How to use discovery tools correctly
783
+ - **n8n Validation Expert** - Interpret validation errors
784
+ - **n8n Expression Syntax** - Configure expression fields
785
+ - **n8n Workflow Patterns** - Apply patterns with proper configuration