@caoscompanybr/merlin 3.5.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/.claude/CLAUDE.md +216 -0
- package/.claude/hooks/README-license-gate.md +45 -0
- package/.claude/hooks/auto-summarize.js +47 -0
- package/.claude/hooks/context-monitor.js +60 -0
- package/.claude/hooks/doc-sync.js +111 -0
- package/.claude/hooks/license-gate.cjs +59 -0
- package/.claude/hooks/session-reset.js +27 -0
- package/.claude/hooks/thoughts-indexer.js +80 -0
- package/.claude/rules/merlin-constitution.md +27 -0
- package/.merlin-core/commands/README.md +19 -0
- package/.merlin-core/commands/founder-mode.md +51 -0
- package/.merlin-core/commands/git/commit.md +35 -0
- package/.merlin-core/commands/git/describe-pr.md +43 -0
- package/.merlin-core/commands/git/safe-commit.md +182 -0
- package/.merlin-core/commands/implementation/implement-plan.md +129 -0
- package/.merlin-core/commands/implementation/oneshot.md +63 -0
- package/.merlin-core/commands/implementation/tdd.md +152 -0
- package/.merlin-core/commands/planning/create-plan.md +184 -0
- package/.merlin-core/commands/planning/iterate-plan.md +45 -0
- package/.merlin-core/commands/planning/validate-plan.md +48 -0
- package/.merlin-core/commands/research/analyze-issue.md +155 -0
- package/.merlin-core/commands/research/research-codebase.md +157 -0
- package/.merlin-core/commands/review/adversarial-review.md +112 -0
- package/.merlin-core/commands/review/check.md +91 -0
- package/.merlin-core/commands/review/debug.md +135 -0
- package/.merlin-core/commands/review/doubts.md +178 -0
- package/.merlin-core/commands/review/engineering-audit.md +87 -0
- package/.merlin-core/commands/review/local-review.md +48 -0
- package/.merlin-core/commands/review/verify-goals.md +83 -0
- package/.merlin-core/commands/session/capture-feedback.md +74 -0
- package/.merlin-core/commands/session/capture-learning.md +155 -0
- package/.merlin-core/commands/session/check-objectives.md +85 -0
- package/.merlin-core/commands/session/conclude.md +125 -0
- package/.merlin-core/commands/session/create-handoff.md +88 -0
- package/.merlin-core/commands/session/create-objective.md +111 -0
- package/.merlin-core/commands/session/create-process.md +105 -0
- package/.merlin-core/commands/session/create-reminder.md +86 -0
- package/.merlin-core/commands/session/fast-start.md +261 -0
- package/.merlin-core/commands/session/recall-learnings.md +79 -0
- package/.merlin-core/commands/session/recall-processes.md +74 -0
- package/.merlin-core/commands/session/resume-handoff.md +51 -0
- package/.merlin-core/commands/session/run-process.md +53 -0
- package/.merlin-core/commands/special/beauty.md +89 -0
- package/.merlin-core/commands/special/common-ground.md +114 -0
- package/.merlin-core/commands/special/elicit.md +98 -0
- package/.merlin-core/commands/special/party.md +66 -0
- package/.merlin-core/commands/special/scrape.md +78 -0
- package/.merlin-core/commands/special/skill-audit.md +128 -0
- package/.merlin-core/commands/special/start-here.md +132 -0
- package/.merlin-core/constitution.md +442 -0
- package/.merlin-core/core/README.md +19 -0
- package/.merlin-core/core/alkimia/README.md +20 -0
- package/.merlin-core/core/alkimia/context/context-tracker.js +209 -0
- package/.merlin-core/core/alkimia/domain/domain-loader.js +215 -0
- package/.merlin-core/core/alkimia/engine.js +284 -0
- package/.merlin-core/core/alkimia/layers/l0-constitution.js +47 -0
- package/.merlin-core/core/alkimia/layers/l1-global.js +58 -0
- package/.merlin-core/core/alkimia/layers/l2-agent.js +58 -0
- package/.merlin-core/core/alkimia/layers/l3-workflow.js +54 -0
- package/.merlin-core/core/alkimia/layers/l4-task.js +45 -0
- package/.merlin-core/core/alkimia/layers/l5-squad.js +161 -0
- package/.merlin-core/core/alkimia/layers/l6-skill.js +520 -0
- package/.merlin-core/core/alkimia/layers/l7-star-command.js +87 -0
- package/.merlin-core/core/alkimia/layers/layer-processor.js +78 -0
- package/.merlin-core/core/alkimia/mandate.js +46 -0
- package/.merlin-core/core/alkimia/memory/doc-sync.js +201 -0
- package/.merlin-core/core/alkimia/memory/document-sharder.js +272 -0
- package/.merlin-core/core/alkimia/memory/git-history-retriever.js +225 -0
- package/.merlin-core/core/alkimia/memory/memory-bridge.js +97 -0
- package/.merlin-core/core/alkimia/memory/session-analyzer.js +400 -0
- package/.merlin-core/core/alkimia/memory/thoughts-indexer.js +477 -0
- package/.merlin-core/core/alkimia/memory/thoughts-provider.js +603 -0
- package/.merlin-core/core/alkimia/output/formatter.js +464 -0
- package/.merlin-core/core/alkimia/security/content-sanitizer.js +140 -0
- package/.merlin-core/core/alkimia/skill-importer.js +440 -0
- package/.merlin-core/core/alkimia/squads/default/.synapse/manifest +17 -0
- package/.merlin-core/core/alkimia/utils/frontmatter.js +321 -0
- package/.merlin-core/core/alkimia/utils/tokens.js +24 -0
- package/.merlin-core/core/approval/README.md +16 -0
- package/.merlin-core/core/approval/approval-engine.js +380 -0
- package/.merlin-core/core/approval/channels/cli-channel.js +50 -0
- package/.merlin-core/core/config/README.md +17 -0
- package/.merlin-core/core/config/config-cache.js +182 -0
- package/.merlin-core/core/config/config-loader.js +279 -0
- package/.merlin-core/core/config/config-resolver.js +411 -0
- package/.merlin-core/core/config/env-interpolator.js +123 -0
- package/.merlin-core/core/config/merge-utils.js +102 -0
- package/.merlin-core/core/config/schemas/core-config.schema.json +41 -0
- package/.merlin-core/core/config/schemas/framework-config.schema.json +24 -0
- package/.merlin-core/core/config/schemas/local-config.schema.json +23 -0
- package/.merlin-core/core/config/schemas/project-config.schema.json +189 -0
- package/.merlin-core/core/docs-consistency.js +140 -0
- package/.merlin-core/core/events/event-bus.js +344 -0
- package/.merlin-core/core/events/hook-handler.js +419 -0
- package/.merlin-core/core/execution/README.md +17 -0
- package/.merlin-core/core/execution/attempt-journal.js +380 -0
- package/.merlin-core/core/execution/autonomous-build-loop.js +637 -0
- package/.merlin-core/core/execution/build-orchestrator.js +296 -0
- package/.merlin-core/core/execution/build-state-manager.js +196 -0
- package/.merlin-core/core/execution/context-injector.js +204 -0
- package/.merlin-core/core/execution/cron-engine.js +247 -0
- package/.merlin-core/core/execution/cron-expression.js +148 -0
- package/.merlin-core/core/execution/env-preflight.js +423 -0
- package/.merlin-core/core/execution/guardrail-engine.js +745 -0
- package/.merlin-core/core/execution/heartbeat-engine.js +198 -0
- package/.merlin-core/core/execution/model-router.js +282 -0
- package/.merlin-core/core/execution/parallel-executor.js +378 -0
- package/.merlin-core/core/execution/parallel-monitor.js +201 -0
- package/.merlin-core/core/execution/party-session.js +311 -0
- package/.merlin-core/core/execution/rate-limit-manager.js +152 -0
- package/.merlin-core/core/execution/result-aggregator.js +215 -0
- package/.merlin-core/core/execution/semantic-merge-engine.js +320 -0
- package/.merlin-core/core/execution/subagent-dispatcher.js +721 -0
- package/.merlin-core/core/execution/success-verifier.js +227 -0
- package/.merlin-core/core/execution/task-metadata.js +105 -0
- package/.merlin-core/core/execution/team-executor.js +195 -0
- package/.merlin-core/core/execution/two-tier-editor.js +290 -0
- package/.merlin-core/core/execution/version-snapshot.js +294 -0
- package/.merlin-core/core/execution/wave-executor.js +224 -0
- package/.merlin-core/core/health-check/health-engine.js +415 -0
- package/.merlin-core/core/licensing/activation.js +281 -0
- package/.merlin-core/core/licensing/crc.js +103 -0
- package/.merlin-core/core/licensing/entitlement.js +99 -0
- package/.merlin-core/core/licensing/fingerprint.js +104 -0
- package/.merlin-core/core/licensing/gate.js +133 -0
- package/.merlin-core/core/licensing/hmac.js +42 -0
- package/.merlin-core/core/licensing/key.js +144 -0
- package/.merlin-core/core/licensing/license.js +212 -0
- package/.merlin-core/core/mcp/README.md +16 -0
- package/.merlin-core/core/mcp/browser-capability.js +191 -0
- package/.merlin-core/core/mcp/capability-mapper.js +92 -0
- package/.merlin-core/core/mcp/mcp-connector.js +278 -0
- package/.merlin-core/core/mcp/mcp-registry.js +101 -0
- package/.merlin-core/core/orchestration/README.md +17 -0
- package/.merlin-core/core/orchestration/agent-invoker.js +456 -0
- package/.merlin-core/core/orchestration/condition-evaluator.js +250 -0
- package/.merlin-core/core/orchestration/decision-tree.js +192 -0
- package/.merlin-core/core/orchestration/executor-assignment.js +372 -0
- package/.merlin-core/core/orchestration/gate-evaluator.js +653 -0
- package/.merlin-core/core/orchestration/intent-classifier.js +579 -0
- package/.merlin-core/core/orchestration/lock-manager.js +308 -0
- package/.merlin-core/core/orchestration/master-orchestrator.js +363 -0
- package/.merlin-core/core/orchestration/phase-tool-masks.js +194 -0
- package/.merlin-core/core/orchestration/recovery-handler.js +402 -0
- package/.merlin-core/core/orchestration/reflect-checkpoint.js +431 -0
- package/.merlin-core/core/orchestration/session-state.js +430 -0
- package/.merlin-core/core/orchestration/skill-dispatcher.js +255 -0
- package/.merlin-core/core/orchestration/step-loader.js +226 -0
- package/.merlin-core/core/orchestration/workflow-executor.js +864 -0
- package/.merlin-core/core/process/executor.js +231 -0
- package/.merlin-core/core/process/process-file.js +50 -0
- package/.merlin-core/core/process/secret-scan.js +86 -0
- package/.merlin-core/core/process/signature.js +77 -0
- package/.merlin-core/core/quality-gates/README.md +17 -0
- package/.merlin-core/core/quality-gates/layer1-precommit.js +110 -0
- package/.merlin-core/core/quality-gates/layer2-pr-automation.js +116 -0
- package/.merlin-core/core/quality-gates/layer3-human-review.js +133 -0
- package/.merlin-core/core/registry/service-registry.js +140 -0
- package/.merlin-core/core-config.yaml +159 -0
- package/.merlin-core/development/README.md +17 -0
- package/.merlin-core/development/agents/README.md +16 -0
- package/.merlin-core/development/agents/analyst.md +214 -0
- package/.merlin-core/development/agents/architect.md +166 -0
- package/.merlin-core/development/agents/data-engineer.md +154 -0
- package/.merlin-core/development/agents/dev.md +203 -0
- package/.merlin-core/development/agents/devops.md +236 -0
- package/.merlin-core/development/agents/grimorio.md +125 -0
- package/.merlin-core/development/agents/merlin-master.md +173 -0
- package/.merlin-core/development/agents/meta.md +190 -0
- package/.merlin-core/development/agents/pm.md +145 -0
- package/.merlin-core/development/agents/po.md +172 -0
- package/.merlin-core/development/agents/qa.md +275 -0
- package/.merlin-core/development/agents/researcher.md +218 -0
- package/.merlin-core/development/agents/scout.md +179 -0
- package/.merlin-core/development/agents/sm.md +148 -0
- package/.merlin-core/development/agents/ux.md +169 -0
- package/.merlin-core/development/agents/web-researcher.md +203 -0
- package/.merlin-core/development/checklists/adversarial-review-checklist.md +70 -0
- package/.merlin-core/development/checklists/operations-ci-checklist.md +40 -0
- package/.merlin-core/development/checklists/operations-deploy-checklist.md +54 -0
- package/.merlin-core/development/checklists/operations-publish-checklist.md +47 -0
- package/.merlin-core/development/checklists/source-verification-checklist.md +38 -0
- package/.merlin-core/development/templates/HEARTBEAT-template.md +46 -0
- package/.merlin-core/development/templates/ears-requirements-template.md +93 -0
- package/.merlin-core/development/templates/handoff-template.md +50 -0
- package/.merlin-core/development/templates/prd-template.md +62 -0
- package/.merlin-core/development/templates/research-template.md +53 -0
- package/.merlin-core/development/templates/spec-template.md +84 -0
- package/.merlin-core/development/workflows/brownfield-discovery.yaml +166 -0
- package/.merlin-core/development/workflows/brownfield-service.yaml +52 -0
- package/.merlin-core/development/workflows/development-cycle.yaml +57 -0
- package/.merlin-core/development/workflows/epic-orchestration.yaml +47 -0
- package/.merlin-core/development/workflows/folloni-funnel.yaml +177 -0
- package/.merlin-core/development/workflows/greenfield-fullstack.yaml +167 -0
- package/.merlin-core/development/workflows/greenfield-service.yaml +56 -0
- package/.merlin-core/development/workflows/qa-loop.yaml +115 -0
- package/.merlin-core/development/workflows/spec-pipeline.yaml +185 -0
- package/.merlin-core/development/workflows/steps/folloni-01-research.yaml +35 -0
- package/.merlin-core/development/workflows/steps/folloni-02-architecture.yaml +41 -0
- package/.merlin-core/development/workflows/steps/folloni-03-implementation.yaml +52 -0
- package/.merlin-core/development/workflows/story-development-cycle.yaml +67 -0
- package/.merlin-core/docs/GUIDE.md +413 -0
- package/.merlin-core/docs/merlin-commands-guide-pt.md +183 -0
- package/.merlin-core/framework-config.yaml +148 -0
- package/.merlin-core/hooks/README.md +16 -0
- package/.merlin-core/hooks/precompact-memory-flush.js +69 -0
- package/.merlin-core/hooks/pretooluse-remote-approve.js +113 -0
- package/.merlin-core/hooks/spikes/spike-b-hook.js +70 -0
- package/.merlin-core/hooks/spikes/spike-b-stub.js +70 -0
- package/.merlin-core/index.js +91 -0
- package/.merlin-core/local-config.yaml.template +31 -0
- package/.merlin-core/mcp-servers/lsp-bridge/index.js +397 -0
- package/.merlin-core/modules/scraping/module.json +23 -0
- package/.merlin-core/project-config.yaml +89 -0
- package/.merlin-core/schemas/README.md +18 -0
- package/.merlin-core/schemas/agent-hook-schema.json +152 -0
- package/.merlin-core/schemas/agent-schema.json +31 -0
- package/.merlin-core/schemas/command-schema.json +18 -0
- package/.merlin-core/schemas/feedback-schema.json +36 -0
- package/.merlin-core/schemas/handoff-schema.json +19 -0
- package/.merlin-core/schemas/learning-schema.json +51 -0
- package/.merlin-core/schemas/module.schema.json +124 -0
- package/.merlin-core/schemas/must-haves-schema.json +95 -0
- package/.merlin-core/schemas/objective-schema.json +23 -0
- package/.merlin-core/schemas/plan-schema.json +20 -0
- package/.merlin-core/schemas/process-schema.json +82 -0
- package/.merlin-core/schemas/reminder-schema.json +20 -0
- package/.merlin-core/schemas/skill-eval-schema.json +92 -0
- package/.merlin-core/schemas/skill-schema.json +77 -0
- package/.merlin-core/schemas/workflow-schema.json +38 -0
- package/.merlin-core/skills/README.md +16 -0
- package/.merlin-core/skills/domain/azure-cloud/SKILL.md +211 -0
- package/.merlin-core/skills/domain/azure-cloud/references/appinsights-instrumentation.md +63 -0
- package/.merlin-core/skills/domain/azure-cloud/references/azure-compliance.md +99 -0
- package/.merlin-core/skills/domain/azure-cloud/references/azure-cost-optimization.md +419 -0
- package/.merlin-core/skills/domain/azure-cloud/references/azure-deploy.md +82 -0
- package/.merlin-core/skills/domain/azure-cloud/references/azure-diagnostics.md +130 -0
- package/.merlin-core/skills/domain/azure-cloud/references/azure-prepare.md +134 -0
- package/.merlin-core/skills/domain/azure-cloud/references/azure-quotas.md +290 -0
- package/.merlin-core/skills/domain/azure-cloud/references/azure-rbac.md +11 -0
- package/.merlin-core/skills/domain/azure-cloud/references/azure-resource-lookup.md +97 -0
- package/.merlin-core/skills/domain/azure-cloud/references/azure-resource-visualizer.md +178 -0
- package/.merlin-core/skills/domain/azure-cloud/references/azure-storage.md +91 -0
- package/.merlin-core/skills/domain/azure-cloud/references/azure-validate.md +58 -0
- package/.merlin-core/skills/domain/azure-cloud/references/entra-app-registration.md +192 -0
- package/.merlin-core/skills/domain/browser-automation/SKILL.md +311 -0
- package/.merlin-core/skills/domain/browser-automation/references/agent-browser-skill.md +632 -0
- package/.merlin-core/skills/domain/browser-automation/references/authentication.md +308 -0
- package/.merlin-core/skills/domain/browser-automation/references/commands.md +266 -0
- package/.merlin-core/skills/domain/browser-automation/references/profiling.md +120 -0
- package/.merlin-core/skills/domain/browser-automation/references/proxy-support.md +194 -0
- package/.merlin-core/skills/domain/browser-automation/references/session-management.md +194 -0
- package/.merlin-core/skills/domain/browser-automation/references/snapshot-refs.md +196 -0
- package/.merlin-core/skills/domain/browser-automation/references/video-recording.md +173 -0
- package/.merlin-core/skills/domain/browser-automation/templates/authenticated-session.sh +105 -0
- package/.merlin-core/skills/domain/browser-automation/templates/capture-workflow.sh +69 -0
- package/.merlin-core/skills/domain/browser-automation/templates/form-automation.sh +62 -0
- package/.merlin-core/skills/domain/digital-marketing/SKILL.md +292 -0
- package/.merlin-core/skills/domain/digital-marketing/references/content-strategy.md +320 -0
- package/.merlin-core/skills/domain/digital-marketing/references/copy-formats.md +298 -0
- package/.merlin-core/skills/domain/digital-marketing/references/copy-methodology.md +180 -0
- package/.merlin-core/skills/domain/digital-marketing/references/email-sequences.md +135 -0
- package/.merlin-core/skills/domain/digital-marketing/references/launch-strategy.md +213 -0
- package/.merlin-core/skills/domain/digital-marketing/references/pricing-strategy.md +160 -0
- package/.merlin-core/skills/domain/digital-marketing/references/programmatic-seo.md +237 -0
- package/.merlin-core/skills/domain/digital-marketing/references/revops-lifecycle.md +170 -0
- package/.merlin-core/skills/domain/digital-marketing/references/revops-operations.md +167 -0
- package/.merlin-core/skills/domain/digital-marketing/references/schema-markup.md +190 -0
- package/.merlin-core/skills/domain/digital-marketing/references/strategy-frameworks.md +324 -0
- package/.merlin-core/skills/domain/digital-marketing/references/traffic-management.md +350 -0
- package/.merlin-core/skills/domain/expo-native-ui/SKILL.md +348 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/animations.md +220 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/api-routes.md +361 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/cicd-workflows.md +84 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/controls.md +266 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/data-fetching.md +553 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/deployment-stores.md +1353 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/deployment.md +183 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/dev-client.md +166 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/dom-components.md +410 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/form-sheet.md +253 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/gradients.md +117 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/icons.md +218 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/media.md +245 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/platform-native.md +75 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/route-structure.md +229 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/search.md +249 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/storage.md +121 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/tabs.md +433 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/tailwind-native.md +473 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/toolbar-and-headers.md +284 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/upgrading-guides.md +674 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/upgrading.md +127 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/visual-effects.md +199 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/webgpu-three.md +605 -0
- package/.merlin-core/skills/domain/expo-native-ui/references/zoom-transitions.md +161 -0
- package/.merlin-core/skills/domain/marketing-ops/SKILL.md +117 -0
- package/.merlin-core/skills/domain/marketing-ops/references/_index.md +78 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/ad-creative/references/generative-tools.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/ad-creative/references/platform-specs.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/ad-creative.md +251 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/ads/references/ad-copy-templates.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/ads/references/audience-targeting.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/ads/references/conversion-tracking.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/ads/references/platform-setup-checklists.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/ads.md +322 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/ai-seo/references/content-patterns.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/ai-seo/references/content-types.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/ai-seo/references/platform-ranking-factors.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/ai-seo.md +388 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/aso/references/apple-specs.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/aso/references/benchmarks.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/aso/references/google-play-specs.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/aso/references/report-template.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/aso/references/scoring-criteria.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/aso.md +316 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/co-marketing.md +305 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/community-marketing.md +169 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/competitor-profiling/references/templates.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/competitor-profiling/references/tool-reference.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/competitor-profiling.md +442 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/competitors/references/content-architecture.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/competitors/references/templates.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/competitors.md +281 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/content-strategy.md +16 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/directory-submissions/references/directory-list.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/directory-submissions/references/positioning-variations.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/directory-submissions/references/submission-tracker-template.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/directory-submissions.md +396 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/free-tools/references/tool-types.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/free-tools.md +196 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/image/references/ai-image-prompting.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/image.md +352 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/launch.md +18 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/lead-magnets/references/benchmarks.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/lead-magnets/references/format-guide.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/lead-magnets.md +333 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/programmatic-seo.md +16 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/schema.md +16 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/seo-audit/references/ai-writing-detection.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/seo-audit/references/international-seo.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/seo-audit.md +546 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/site-architecture/references/mermaid-templates.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/site-architecture/references/navigation-patterns.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/site-architecture/references/site-type-templates.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/site-architecture.md +371 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/social/references/platform-limits.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/social/references/platforms.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/social/references/post-templates.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/social/references/reverse-engineering.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/social/references/short-form-video.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/social.md +431 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/video/references/ai-video-prompting.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/acquire/video.md +353 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/ab-testing/references/sample-size-guide.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/ab-testing/references/test-templates.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/ab-testing.md +379 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/analytics/references/event-library.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/analytics/references/ga4-implementation.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/analytics/references/gtm-implementation.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/analytics.md +323 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/copy-editing.md +18 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/copywriting.md +18 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/cro/references/experiments.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/cro/references/form.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/cro.md +211 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/emails.md +18 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/paywalls/references/experiments.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/paywalls.md +255 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/popups.md +518 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/pricing.md +18 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/sales-enablement/references/deck-frameworks.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/sales-enablement/references/demo-scripts.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/sales-enablement/references/objection-library.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/sales-enablement/references/one-pager-templates.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/sales-enablement.md +371 -0
- package/.merlin-core/skills/domain/marketing-ops/references/activate/signup.md +406 -0
- package/.merlin-core/skills/domain/marketing-ops/references/expand/co-marketing.md +18 -0
- package/.merlin-core/skills/domain/marketing-ops/references/expand/community-marketing.md +18 -0
- package/.merlin-core/skills/domain/marketing-ops/references/expand/referrals/references/affiliate-programs.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/expand/referrals/references/program-examples.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/expand/referrals.md +278 -0
- package/.merlin-core/skills/domain/marketing-ops/references/foundation/customer-research/references/source-guides.md +425 -0
- package/.merlin-core/skills/domain/marketing-ops/references/foundation/customer-research.md +284 -0
- package/.merlin-core/skills/domain/marketing-ops/references/foundation/marketing-ideas/references/ideas-by-category.md +216 -0
- package/.merlin-core/skills/domain/marketing-ops/references/foundation/marketing-ideas.md +188 -0
- package/.merlin-core/skills/domain/marketing-ops/references/foundation/marketing-psychology.md +532 -0
- package/.merlin-core/skills/domain/marketing-ops/references/foundation/product-marketing.md +276 -0
- package/.merlin-core/skills/domain/marketing-ops/references/retain/churn-prevention/references/cancel-flow-patterns.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/retain/churn-prevention/references/dunning-playbook.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/retain/churn-prevention.md +442 -0
- package/.merlin-core/skills/domain/marketing-ops/references/retain/onboarding/references/experiments.md +19 -0
- package/.merlin-core/skills/domain/marketing-ops/references/retain/onboarding.md +243 -0
- package/.merlin-core/skills/domain/marketing-ops/references/retain/revops-lifecycle.md +18 -0
- package/.merlin-core/skills/domain/marketing-ops/references/retain/revops-operations.md +18 -0
- package/.merlin-core/skills/domain/n8n-automation/SKILL.md +149 -0
- package/.merlin-core/skills/domain/n8n-automation/references/code-javascript.md +3744 -0
- package/.merlin-core/skills/domain/n8n-automation/references/code-python.md +3293 -0
- package/.merlin-core/skills/domain/n8n-automation/references/expression-syntax.md +1662 -0
- package/.merlin-core/skills/domain/n8n-automation/references/mcp-tools-expert.md +2111 -0
- package/.merlin-core/skills/domain/n8n-automation/references/node-configuration.md +2523 -0
- package/.merlin-core/skills/domain/n8n-automation/references/validation-expert.md +2491 -0
- package/.merlin-core/skills/domain/n8n-automation/references/workflow-patterns.md +4624 -0
- package/.merlin-core/skills/domain/ops-manual/SKILL.md +225 -0
- package/.merlin-core/skills/domain/ops-manual/references/elicitation-questions.md +141 -0
- package/.merlin-core/skills/domain/ops-manual/references/external-skills-registry.md +63 -0
- package/.merlin-core/skills/domain/ops-manual/references/operations-template.yaml +132 -0
- package/.merlin-core/skills/domain/remotion-best-practices/SKILL.md +99 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/3d.md +86 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/animations.md +27 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/assets.md +78 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/audio.md +172 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/calculate-metadata.md +131 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/can-decode.md +75 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/charts.md +68 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/compositions.md +154 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/display-captions.md +126 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/extract-frames.md +229 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/fonts.md +152 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/get-audio-duration.md +58 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/get-video-dimensions.md +68 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/get-video-duration.md +58 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/gifs.md +144 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/images.md +134 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/import-srt-captions.md +67 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/lottie.md +70 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/maps.md +414 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/measuring-dom-nodes.md +34 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/measuring-text.md +143 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/parameters.md +109 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/sequencing.md +118 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/tailwind.md +11 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/text-animations.md +20 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/timing.md +179 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/transcribe-captions.md +19 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/transitions.md +137 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/transparent-videos.md +106 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/trimming.md +51 -0
- package/.merlin-core/skills/domain/remotion-best-practices/rules/videos.md +171 -0
- package/.merlin-core/skills/domain/resend-email/SKILL.md +377 -0
- package/.merlin-core/skills/general/adversarial-review/SKILL.md +144 -0
- package/.merlin-core/skills/general/api-design/SKILL.md +513 -0
- package/.merlin-core/skills/general/apify-scrape/SKILL.md +137 -0
- package/.merlin-core/skills/general/apify-scrape/scripts/apify-scrape.sh +68 -0
- package/.merlin-core/skills/general/backup/SKILL.md +87 -0
- package/.merlin-core/skills/general/blkskrn/SKILL.md +392 -0
- package/.merlin-core/skills/general/blkskrn/references/animation-patterns.md +521 -0
- package/.merlin-core/skills/general/blkskrn/references/design-system.md +637 -0
- package/.merlin-core/skills/general/blkskrn/references/html-templates.md +440 -0
- package/.merlin-core/skills/general/blkskrn/references/presenter-template.md +45 -0
- package/.merlin-core/skills/general/blkskrn/references/slide-types.md +424 -0
- package/.merlin-core/skills/general/blkskrn/scripts/canvas-manager.js +502 -0
- package/.merlin-core/skills/general/blkskrn/scripts/presenter.js +90 -0
- package/.merlin-core/skills/general/blkskrn/templates/presenter.html +273 -0
- package/.merlin-core/skills/general/blkskrn/templates/slide-base.html +277 -0
- package/.merlin-core/skills/general/blkskrn/templates/viewer.html +165 -0
- package/.merlin-core/skills/general/browser-takeover/SKILL.md +53 -0
- package/.merlin-core/skills/general/claude-api/SKILL.md +90 -0
- package/.merlin-core/skills/general/code-javascript/SKILL.md +268 -0
- package/.merlin-core/skills/general/code-python/SKILL.md +424 -0
- package/.merlin-core/skills/general/code-style/SKILL.md +97 -0
- package/.merlin-core/skills/general/code-typescript/SKILL.md +361 -0
- package/.merlin-core/skills/general/cold-email/SKILL.md +164 -0
- package/.merlin-core/skills/general/cold-email/references/benchmarks.md +18 -0
- package/.merlin-core/skills/general/cold-email/references/follow-up-sequences.md +18 -0
- package/.merlin-core/skills/general/cold-email/references/frameworks.md +18 -0
- package/.merlin-core/skills/general/cold-email/references/personalization.md +18 -0
- package/.merlin-core/skills/general/cold-email/references/subject-lines.md +18 -0
- package/.merlin-core/skills/general/container-security/SKILL.md +462 -0
- package/.merlin-core/skills/general/context-management/SKILL.md +79 -0
- package/.merlin-core/skills/general/copy-editing/SKILL.md +501 -0
- package/.merlin-core/skills/general/copy-editing/references/checklist.md +18 -0
- package/.merlin-core/skills/general/copy-editing/references/content-refresh.md +18 -0
- package/.merlin-core/skills/general/copy-editing/references/plain-english-alternatives.md +18 -0
- package/.merlin-core/skills/general/copywriting/SKILL.md +294 -0
- package/.merlin-core/skills/general/copywriting/references/copy-frameworks.md +392 -0
- package/.merlin-core/skills/general/copywriting/references/natural-transitions.md +276 -0
- package/.merlin-core/skills/general/database/SKILL.md +561 -0
- package/.merlin-core/skills/general/database/references/postgres-concurrency.md +182 -0
- package/.merlin-core/skills/general/database/references/postgres-connections.md +97 -0
- package/.merlin-core/skills/general/database/references/postgres-data-patterns.md +159 -0
- package/.merlin-core/skills/general/database/references/postgres-monitoring.md +136 -0
- package/.merlin-core/skills/general/database/references/postgres-rls.md +140 -0
- package/.merlin-core/skills/general/database-provision/SKILL.md +56 -0
- package/.merlin-core/skills/general/deploy/SKILL.md +65 -0
- package/.merlin-core/skills/general/design-inspiration/SKILL.md +146 -0
- package/.merlin-core/skills/general/design-palette/SKILL.md +99 -0
- package/.merlin-core/skills/general/design-palette/references/full-palettes.md +144 -0
- package/.merlin-core/skills/general/design-system/SKILL.md +94 -0
- package/.merlin-core/skills/general/design-typography/SKILL.md +115 -0
- package/.merlin-core/skills/general/design-typography/references/full-pairings.md +144 -0
- package/.merlin-core/skills/general/design-ux-patterns/SKILL.md +155 -0
- package/.merlin-core/skills/general/design-ux-patterns/references/charts-data-guidelines.md +197 -0
- package/.merlin-core/skills/general/design-ux-patterns/references/landing-patterns.md +199 -0
- package/.merlin-core/skills/general/design-ux-patterns/references/professional-ui-checklist.md +56 -0
- package/.merlin-core/skills/general/design-ux-patterns/references/style-catalog.md +89 -0
- package/.merlin-core/skills/general/design-ux-patterns/references/ux-guidelines.md +837 -0
- package/.merlin-core/skills/general/discover-cloud/SKILL.md +108 -0
- package/.merlin-core/skills/general/doc-sync/SKILL.md +52 -0
- package/.merlin-core/skills/general/document-sharding/SKILL.md +53 -0
- package/.merlin-core/skills/general/docx/SKILL.md +418 -0
- package/.merlin-core/skills/general/docx/references/windows-setup.md +27 -0
- package/.merlin-core/skills/general/docx/scripts/__init__.py +1 -0
- package/.merlin-core/skills/general/docx/scripts/accept_changes.py +135 -0
- package/.merlin-core/skills/general/docx/scripts/comment.py +318 -0
- package/.merlin-core/skills/general/docx/scripts/office/__init__.py +0 -0
- package/.merlin-core/skills/general/docx/scripts/office/helpers/__init__.py +0 -0
- package/.merlin-core/skills/general/docx/scripts/office/helpers/merge_runs.py +199 -0
- package/.merlin-core/skills/general/docx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/.merlin-core/skills/general/docx/scripts/office/pack.py +159 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/.merlin-core/skills/general/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/.merlin-core/skills/general/docx/scripts/office/soffice.py +183 -0
- package/.merlin-core/skills/general/docx/scripts/office/unpack.py +132 -0
- package/.merlin-core/skills/general/docx/scripts/office/validate.py +111 -0
- package/.merlin-core/skills/general/docx/scripts/office/validators/__init__.py +15 -0
- package/.merlin-core/skills/general/docx/scripts/office/validators/base.py +847 -0
- package/.merlin-core/skills/general/docx/scripts/office/validators/docx.py +446 -0
- package/.merlin-core/skills/general/docx/scripts/office/validators/pptx.py +275 -0
- package/.merlin-core/skills/general/docx/scripts/office/validators/redlining.py +247 -0
- package/.merlin-core/skills/general/docx/scripts/templates/comments.xml +3 -0
- package/.merlin-core/skills/general/docx/scripts/templates/commentsExtended.xml +3 -0
- package/.merlin-core/skills/general/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/.merlin-core/skills/general/docx/scripts/templates/commentsIds.xml +3 -0
- package/.merlin-core/skills/general/docx/scripts/templates/people.xml +3 -0
- package/.merlin-core/skills/general/elicitation/SKILL.md +188 -0
- package/.merlin-core/skills/general/engineering-audit/SKILL.md +122 -0
- package/.merlin-core/skills/general/find-and-edit/SKILL.md +102 -0
- package/.merlin-core/skills/general/first-party-docs/SKILL.md +51 -0
- package/.merlin-core/skills/general/frontend-design/SKILL.md +204 -0
- package/.merlin-core/skills/general/guardrails/SKILL.md +144 -0
- package/.merlin-core/skills/general/image-gen/SKILL.md +49 -0
- package/.merlin-core/skills/general/learning-capture/SKILL.md +192 -0
- package/.merlin-core/skills/general/lgpd-compliance-audit/SKILL.md +448 -0
- package/.merlin-core/skills/general/load-testing/SKILL.md +114 -0
- package/.merlin-core/skills/general/load-testing/docker/Dockerfile.dashboard +21 -0
- package/.merlin-core/skills/general/load-testing/docker/docker-compose.locust.yml +39 -0
- package/.merlin-core/skills/general/load-testing/requirements.txt +1 -0
- package/.merlin-core/skills/general/load-testing/scripts/compare_baseline.py +172 -0
- package/.merlin-core/skills/general/load-testing/scripts/run_local.py +245 -0
- package/.merlin-core/skills/general/load-testing/templates/load_shape_stepped.py +35 -0
- package/.merlin-core/skills/general/load-testing/templates/locustfile_dashboard.py +47 -0
- package/.merlin-core/skills/general/load-testing/templates/threshold_hook.py +36 -0
- package/.merlin-core/skills/general/mage-beauty/SKILL.md +89 -0
- package/.merlin-core/skills/general/mage-beauty/references/anti-patterns.md +148 -0
- package/.merlin-core/skills/general/mage-beauty/references/color-and-contrast.md +87 -0
- package/.merlin-core/skills/general/mage-beauty/references/interaction-design.md +99 -0
- package/.merlin-core/skills/general/mage-beauty/references/motion-design.md +90 -0
- package/.merlin-core/skills/general/mage-beauty/references/remotion-bridge.md +187 -0
- package/.merlin-core/skills/general/mage-beauty/references/responsive-and-multi-format.md +98 -0
- package/.merlin-core/skills/general/mage-beauty/references/spatial-design.md +88 -0
- package/.merlin-core/skills/general/mage-beauty/references/typography.md +60 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-adapt.md +102 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-animate.md +97 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-audit.md +99 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-bolder.md +94 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-cinematic.md +128 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-clarify.md +107 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-colorize.md +106 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-critique.md +88 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-delight.md +98 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-distill.md +97 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-harden.md +79 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-layout.md +104 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-onboard.md +98 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-optimize.md +124 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-overdrive.md +105 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-polish.md +91 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-quieter.md +95 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-rebrand.md +127 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-shape.md +160 -0
- package/.merlin-core/skills/general/mage-beauty/references/verb-typeset.md +109 -0
- package/.merlin-core/skills/general/mage-beauty/references/voice-and-microcopy.md +137 -0
- package/.merlin-core/skills/general/mcp-builder/SKILL.md +92 -0
- package/.merlin-core/skills/general/network-debug/SKILL.md +51 -0
- package/.merlin-core/skills/general/next-best-practices/SKILL.md +177 -0
- package/.merlin-core/skills/general/next-best-practices/references/async-patterns.md +87 -0
- package/.merlin-core/skills/general/next-best-practices/references/bundling.md +182 -0
- package/.merlin-core/skills/general/next-best-practices/references/data-patterns.md +306 -0
- package/.merlin-core/skills/general/next-best-practices/references/debug-tricks.md +125 -0
- package/.merlin-core/skills/general/next-best-practices/references/directives.md +74 -0
- package/.merlin-core/skills/general/next-best-practices/references/error-handling.md +232 -0
- package/.merlin-core/skills/general/next-best-practices/references/file-conventions.md +141 -0
- package/.merlin-core/skills/general/next-best-practices/references/font.md +257 -0
- package/.merlin-core/skills/general/next-best-practices/references/functions.md +108 -0
- package/.merlin-core/skills/general/next-best-practices/references/hydration-error.md +88 -0
- package/.merlin-core/skills/general/next-best-practices/references/image.md +179 -0
- package/.merlin-core/skills/general/next-best-practices/references/metadata.md +296 -0
- package/.merlin-core/skills/general/next-best-practices/references/parallel-routes.md +298 -0
- package/.merlin-core/skills/general/next-best-practices/references/route-handlers.md +146 -0
- package/.merlin-core/skills/general/next-best-practices/references/rsc-boundaries.md +164 -0
- package/.merlin-core/skills/general/next-best-practices/references/runtime-selection.md +40 -0
- package/.merlin-core/skills/general/next-best-practices/references/scripts.md +141 -0
- package/.merlin-core/skills/general/next-best-practices/references/self-hosting.md +384 -0
- package/.merlin-core/skills/general/next-best-practices/references/suspense-boundaries.md +67 -0
- package/.merlin-core/skills/general/next-steps/SKILL.md +43 -0
- package/.merlin-core/skills/general/party-mode/SKILL.md +57 -0
- package/.merlin-core/skills/general/pdf/SKILL.md +298 -0
- package/.merlin-core/skills/general/pdf/references/forms.md +312 -0
- package/.merlin-core/skills/general/pdf/references/reference.md +640 -0
- package/.merlin-core/skills/general/pdf/references/windows-setup.md +40 -0
- package/.merlin-core/skills/general/pdf/scripts/check_bounding_boxes.py +65 -0
- package/.merlin-core/skills/general/pdf/scripts/check_fillable_fields.py +11 -0
- package/.merlin-core/skills/general/pdf/scripts/convert_pdf_to_images.py +33 -0
- package/.merlin-core/skills/general/pdf/scripts/create_validation_image.py +37 -0
- package/.merlin-core/skills/general/pdf/scripts/extract_form_field_info.py +122 -0
- package/.merlin-core/skills/general/pdf/scripts/extract_form_structure.py +115 -0
- package/.merlin-core/skills/general/pdf/scripts/fill_fillable_fields.py +98 -0
- package/.merlin-core/skills/general/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
- package/.merlin-core/skills/general/pptx/SKILL.md +133 -0
- package/.merlin-core/skills/general/pptx/references/editing.md +213 -0
- package/.merlin-core/skills/general/pptx/references/pptxgenjs.md +581 -0
- package/.merlin-core/skills/general/pptx/references/windows-setup.md +27 -0
- package/.merlin-core/skills/general/pptx/scripts/__init__.py +0 -0
- package/.merlin-core/skills/general/pptx/scripts/add_slide.py +195 -0
- package/.merlin-core/skills/general/pptx/scripts/clean.py +286 -0
- package/.merlin-core/skills/general/pptx/scripts/thumbnail.py +289 -0
- package/.merlin-core/skills/general/property-testing/SKILL.md +214 -0
- package/.merlin-core/skills/general/purge-leaked-secret/SKILL.md +383 -0
- package/.merlin-core/skills/general/reflection/SKILL.md +100 -0
- package/.merlin-core/skills/general/secret-safe-commit/SKILL.md +246 -0
- package/.merlin-core/skills/general/secret-safe-commit/templates/.gitleaks.toml +91 -0
- package/.merlin-core/skills/general/secret-safe-commit/templates/.pre-commit-config.yaml +57 -0
- package/.merlin-core/skills/general/secret-safe-commit/templates/secret-scan.yml +48 -0
- package/.merlin-core/skills/general/semantic-search/SKILL.md +79 -0
- package/.merlin-core/skills/general/skill-creator/SKILL.md +342 -0
- package/.merlin-core/skills/general/skill-creator/agents/analyzer.md +283 -0
- package/.merlin-core/skills/general/skill-creator/agents/comparator.md +211 -0
- package/.merlin-core/skills/general/skill-creator/agents/grader.md +227 -0
- package/.merlin-core/skills/general/skill-creator/assets/eval_review.html +146 -0
- package/.merlin-core/skills/general/skill-creator/eval-viewer/generate_review.py +471 -0
- package/.merlin-core/skills/general/skill-creator/eval-viewer/viewer.html +1325 -0
- package/.merlin-core/skills/general/skill-creator/references/schemas.md +439 -0
- package/.merlin-core/skills/general/skill-creator/scripts/__init__.py +0 -0
- package/.merlin-core/skills/general/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/.merlin-core/skills/general/skill-creator/scripts/generate_report.py +326 -0
- package/.merlin-core/skills/general/skill-creator/scripts/improve_description.py +247 -0
- package/.merlin-core/skills/general/skill-creator/scripts/package_skill.py +136 -0
- package/.merlin-core/skills/general/skill-creator/scripts/quick_validate.py +103 -0
- package/.merlin-core/skills/general/skill-creator/scripts/run_eval.py +310 -0
- package/.merlin-core/skills/general/skill-creator/scripts/run_loop.py +328 -0
- package/.merlin-core/skills/general/skill-creator/scripts/utils.py +47 -0
- package/.merlin-core/skills/general/start-here/SKILL.md +63 -0
- package/.merlin-core/skills/general/start-here/recipes.json +758 -0
- package/.merlin-core/skills/general/start-here/recipes.schema.json +57 -0
- package/.merlin-core/skills/general/static-analysis/SKILL.md +151 -0
- package/.merlin-core/skills/general/tailwind-design-system/SKILL.md +201 -0
- package/.merlin-core/skills/general/tailwind-design-system/references/advanced-v4.md +152 -0
- package/.merlin-core/skills/general/tailwind-design-system/references/component-patterns.md +353 -0
- package/.merlin-core/skills/general/teach-method/SKILL.md +86 -0
- package/.merlin-core/skills/general/team-execution/SKILL.md +67 -0
- package/.merlin-core/skills/general/testing/SKILL.md +412 -0
- package/.merlin-core/skills/general/token-economy/SKILL.md +55 -0
- package/.merlin-core/skills/general/vps-security-hardening/SKILL.md +406 -0
- package/.merlin-core/skills/general/web-quality/SKILL.md +180 -0
- package/.merlin-core/skills/general/webapp-testing/SKILL.md +153 -0
- package/.merlin-core/skills/general/webapp-testing/scripts/screenshot_compare.py +72 -0
- package/.merlin-core/skills/general/webapp-testing/scripts/with_server.py +103 -0
- package/.merlin-core/skills/general/xlsx/SKILL.md +167 -0
- package/.merlin-core/skills/general/xlsx/references/nodejs-sheetjs-styled-reports.md +141 -0
- package/.merlin-core/skills/general/xlsx/references/windows-setup.md +17 -0
- package/.merlin-core/skills/general/xlsx/scripts/recalc.py +184 -0
- package/.merlin-core/skills/general/xlsx/scripts/styled-report.js +130 -0
- package/.merlin-core/skills/general/yolo-mode/SKILL.md +60 -0
- package/.merlin-core/skills/general/youtube-transcript/SKILL.md +177 -0
- package/.merlin-core/skills/general/youtube-transcript/scripts/fetch_transcript.py +188 -0
- package/.merlin-core/skills/general/youtube-transcript/scripts/gladia_transcribe.mjs +230 -0
- package/.merlin-core/tools/commands/activate.js +72 -0
- package/.merlin-core/tools/commands/archive-thoughts.js +181 -0
- package/.merlin-core/tools/commands/backup.js +156 -0
- package/.merlin-core/tools/commands/certify-process.js +196 -0
- package/.merlin-core/tools/commands/convert.js +87 -0
- package/.merlin-core/tools/commands/cron.js +147 -0
- package/.merlin-core/tools/commands/disable.js +73 -0
- package/.merlin-core/tools/commands/doc-sync.js +127 -0
- package/.merlin-core/tools/commands/eval-skill.js +193 -0
- package/.merlin-core/tools/commands/frontmatter.js +49 -0
- package/.merlin-core/tools/commands/heartbeat.js +43 -0
- package/.merlin-core/tools/commands/index-thoughts.js +35 -0
- package/.merlin-core/tools/commands/install-remote-approve.js +184 -0
- package/.merlin-core/tools/commands/install.js +81 -0
- package/.merlin-core/tools/commands/lib/__verify__/diff-reports.js +170 -0
- package/.merlin-core/tools/commands/lib/fs-safe.js +186 -0
- package/.merlin-core/tools/commands/lib/preflight.js +607 -0
- package/.merlin-core/tools/commands/lib/preserve.js +232 -0
- package/.merlin-core/tools/commands/lib/project-config.template.yaml +69 -0
- package/.merlin-core/tools/commands/lib/report.js +231 -0
- package/.merlin-core/tools/commands/lib/settings-merge.js +134 -0
- package/.merlin-core/tools/commands/license.js +52 -0
- package/.merlin-core/tools/commands/list.js +125 -0
- package/.merlin-core/tools/commands/migrate-alkimia.js +271 -0
- package/.merlin-core/tools/commands/modules.js +68 -0
- package/.merlin-core/tools/commands/provision.js +83 -0
- package/.merlin-core/tools/commands/prune-feedback.js +114 -0
- package/.merlin-core/tools/commands/run-process.js +28 -0
- package/.merlin-core/tools/commands/state.js +79 -0
- package/.merlin-core/tools/commands/sync-bridges.js +197 -0
- package/.merlin-core/tools/commands/upgrade.js +1135 -0
- package/.merlin-core/tools/commands/validate-recipes.js +218 -0
- package/.merlin-core/tools/commands/validate.js +159 -0
- package/.merlin-core/tools/commands/yolo.js +82 -0
- package/.merlin-core/tools/compose-rules.mjs +179 -0
- package/.merlin-core/tools/disable-module.mjs +150 -0
- package/.merlin-core/tools/lib/deployer.mjs +131 -0
- package/.merlin-core/tools/lib/modules-activation.mjs +225 -0
- package/.merlin-core/tools/merlin-tools.js +153 -0
- package/.merlin-core/tools/migrate-frontmatter-v3.js +192 -0
- package/.merlin-core/tools/modules-catalog.mjs +174 -0
- package/.merlin-core/tools/provision-module.mjs +191 -0
- package/.merlin-core/tools/verify-module.mjs +99 -0
- package/.merlin-core/tools/vps-security-audit.sh +234 -0
- package/INSTALL.md +312 -0
- package/LICENSE +118 -0
- package/PRIVACY-LICENSING.md +65 -0
- package/README.md +391 -0
- package/bin/README.md +15 -0
- package/bin/convert-to-merlin.sh +109 -0
- package/bin/fleet-patch-hooks.sh +144 -0
- package/bin/fleet-patch-v3-fixes.sh +127 -0
- package/bin/merlin-init.js +232 -0
- package/bin/merlin.js +321 -0
- package/package.json +127 -0
|
@@ -0,0 +1,2523 @@
|
|
|
1
|
+
<!-- Adapted from czlonkowski/n8n-skills (MIT). Source files: SKILL.md, DEPENDENCIES.md, OPERATION_PATTERNS.md -->
|
|
2
|
+
|
|
3
|
+
# n8n Node Configuration
|
|
4
|
+
|
|
5
|
+
Expert guidance for operation-aware node configuration with property dependencies.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Configuration Philosophy
|
|
10
|
+
|
|
11
|
+
**Progressive disclosure**: Start minimal, add complexity as needed
|
|
12
|
+
|
|
13
|
+
Configuration best practices:
|
|
14
|
+
|
|
15
|
+
- `get_node` with `detail: "standard"` is the most used discovery pattern
|
|
16
|
+
- 56 seconds average between configuration edits
|
|
17
|
+
- Covers 95% of use cases with 1-2K tokens response
|
|
18
|
+
|
|
19
|
+
**Key insight**: Most configurations need only standard detail, not full schema!
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Core Concepts
|
|
24
|
+
|
|
25
|
+
### 1. Operation-Aware Configuration
|
|
26
|
+
|
|
27
|
+
**Not all fields are always required** - it depends on operation!
|
|
28
|
+
|
|
29
|
+
**Example**: Slack node
|
|
30
|
+
|
|
31
|
+
```javascript
|
|
32
|
+
// For operation='post'
|
|
33
|
+
{
|
|
34
|
+
"resource": "message",
|
|
35
|
+
"operation": "post",
|
|
36
|
+
"channel": "#general", // Required for post
|
|
37
|
+
"text": "Hello!" // Required for post
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// For operation='update'
|
|
41
|
+
{
|
|
42
|
+
"resource": "message",
|
|
43
|
+
"operation": "update",
|
|
44
|
+
"messageId": "123", // Required for update (different!)
|
|
45
|
+
"text": "Updated!" // Required for update
|
|
46
|
+
// channel NOT required for update
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Key**: Resource + operation determine which fields are required!
|
|
51
|
+
|
|
52
|
+
### 2. Property Dependencies
|
|
53
|
+
|
|
54
|
+
**Fields appear/disappear based on other field values**
|
|
55
|
+
|
|
56
|
+
**Example**: HTTP Request node
|
|
57
|
+
|
|
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
|
+
> **Cross-reference**: For detailed `get_node` tool usage, see [mcp-tools-expert.md](../mcp-tools-expert.md).
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Configuration Workflow
|
|
102
|
+
|
|
103
|
+
### Standard Process
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
1. Identify node type and operation
|
|
107
|
+
|
|
|
108
|
+
2. Use get_node (standard detail is default)
|
|
109
|
+
|
|
|
110
|
+
3. Configure required fields
|
|
111
|
+
|
|
|
112
|
+
4. Validate configuration
|
|
113
|
+
|
|
|
114
|
+
5. If field unclear -> get_node({mode: "search_properties"})
|
|
115
|
+
|
|
|
116
|
+
6. Add optional fields as needed
|
|
117
|
+
|
|
|
118
|
+
7. Validate again
|
|
119
|
+
|
|
|
120
|
+
8. Deploy
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
> **Cross-reference**: For validation details, see [validation-expert.md](../validation-expert.md). For where nodes fit in workflow patterns, see [workflow-patterns.md](../workflow-patterns.md).
|
|
124
|
+
|
|
125
|
+
### Example: Configuring HTTP Request
|
|
126
|
+
|
|
127
|
+
**Step 1**: Identify what you need
|
|
128
|
+
|
|
129
|
+
```javascript
|
|
130
|
+
// Goal: POST JSON to API
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**Step 2**: Get node info
|
|
134
|
+
|
|
135
|
+
```javascript
|
|
136
|
+
const info = get_node({
|
|
137
|
+
nodeType: "nodes-base.httpRequest",
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
// Returns: method, url, sendBody, body, authentication required/optional
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**Step 3**: Minimal config
|
|
144
|
+
|
|
145
|
+
```javascript
|
|
146
|
+
{
|
|
147
|
+
"method": "POST",
|
|
148
|
+
"url": "https://api.example.com/create",
|
|
149
|
+
"authentication": "none"
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**Step 4**: Validate
|
|
154
|
+
|
|
155
|
+
```javascript
|
|
156
|
+
validate_node({
|
|
157
|
+
nodeType: "nodes-base.httpRequest",
|
|
158
|
+
config,
|
|
159
|
+
profile: "runtime",
|
|
160
|
+
});
|
|
161
|
+
// -> Error: "sendBody required for POST"
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**Step 5**: Add required field
|
|
165
|
+
|
|
166
|
+
```javascript
|
|
167
|
+
{
|
|
168
|
+
"method": "POST",
|
|
169
|
+
"url": "https://api.example.com/create",
|
|
170
|
+
"authentication": "none",
|
|
171
|
+
"sendBody": true
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
**Step 6**: Validate again
|
|
176
|
+
|
|
177
|
+
```javascript
|
|
178
|
+
validate_node({...});
|
|
179
|
+
// -> Error: "body required when sendBody=true"
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
**Step 7**: Complete configuration
|
|
183
|
+
|
|
184
|
+
```javascript
|
|
185
|
+
{
|
|
186
|
+
"method": "POST",
|
|
187
|
+
"url": "https://api.example.com/create",
|
|
188
|
+
"authentication": "none",
|
|
189
|
+
"sendBody": true,
|
|
190
|
+
"body": {
|
|
191
|
+
"contentType": "json",
|
|
192
|
+
"content": {
|
|
193
|
+
"name": "={{$json.name}}",
|
|
194
|
+
"email": "={{$json.email}}"
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**Step 8**: Final validation
|
|
201
|
+
|
|
202
|
+
```javascript
|
|
203
|
+
validate_node({...});
|
|
204
|
+
// -> Valid!
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## get_node Detail Levels
|
|
210
|
+
|
|
211
|
+
### Standard Detail (DEFAULT - Use This!)
|
|
212
|
+
|
|
213
|
+
```javascript
|
|
214
|
+
get_node({
|
|
215
|
+
nodeType: "nodes-base.slack",
|
|
216
|
+
});
|
|
217
|
+
// detail="standard" is the default
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**Returns** (~1-2K tokens):
|
|
221
|
+
|
|
222
|
+
- Required fields
|
|
223
|
+
- Common options
|
|
224
|
+
- Operation list
|
|
225
|
+
- Metadata
|
|
226
|
+
|
|
227
|
+
**Use**: 95% of configuration needs
|
|
228
|
+
|
|
229
|
+
### Full Detail (Use Sparingly)
|
|
230
|
+
|
|
231
|
+
```javascript
|
|
232
|
+
get_node({
|
|
233
|
+
nodeType: "nodes-base.slack",
|
|
234
|
+
detail: "full",
|
|
235
|
+
});
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
**Returns** (~3-8K tokens):
|
|
239
|
+
|
|
240
|
+
- Complete schema
|
|
241
|
+
- All properties
|
|
242
|
+
- All nested options
|
|
243
|
+
|
|
244
|
+
**Warning**: Large response, use only when standard insufficient
|
|
245
|
+
|
|
246
|
+
### Search Properties Mode
|
|
247
|
+
|
|
248
|
+
```javascript
|
|
249
|
+
get_node({
|
|
250
|
+
nodeType: "nodes-base.httpRequest",
|
|
251
|
+
mode: "search_properties",
|
|
252
|
+
propertyQuery: "auth",
|
|
253
|
+
});
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
**Use**: Find authentication, headers, body fields, etc.
|
|
257
|
+
|
|
258
|
+
> **Cross-reference**: For complete `get_node` modes and parameters, see [mcp-tools-expert.md](../mcp-tools-expert.md).
|
|
259
|
+
|
|
260
|
+
### Decision Tree
|
|
261
|
+
|
|
262
|
+
```
|
|
263
|
+
+-----------------------------------+
|
|
264
|
+
| Starting new node config? |
|
|
265
|
+
+-----------------------------------+
|
|
266
|
+
| YES -> get_node (standard) |
|
|
267
|
+
+-----------------------------------+
|
|
268
|
+
|
|
|
269
|
+
+-----------------------------------+
|
|
270
|
+
| Standard has what you need? |
|
|
271
|
+
+-----------------------------------+
|
|
272
|
+
| YES -> Configure with it |
|
|
273
|
+
| NO -> Continue |
|
|
274
|
+
+-----------------------------------+
|
|
275
|
+
|
|
|
276
|
+
+-----------------------------------+
|
|
277
|
+
| Looking for specific field? |
|
|
278
|
+
+-----------------------------------+
|
|
279
|
+
| YES -> search_properties mode |
|
|
280
|
+
| NO -> Continue |
|
|
281
|
+
+-----------------------------------+
|
|
282
|
+
|
|
|
283
|
+
+-----------------------------------+
|
|
284
|
+
| Still need more details? |
|
|
285
|
+
+-----------------------------------+
|
|
286
|
+
| YES -> get_node({detail: "full"}) |
|
|
287
|
+
+-----------------------------------+
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## Operation Patterns
|
|
293
|
+
|
|
294
|
+
Common node configuration patterns organized by node type and operation.
|
|
295
|
+
|
|
296
|
+
### Overview
|
|
297
|
+
|
|
298
|
+
**Purpose**: Quick reference for common node configurations
|
|
299
|
+
|
|
300
|
+
**Coverage**: Top 20 most-used nodes from 525 available
|
|
301
|
+
|
|
302
|
+
**Pattern format**:
|
|
303
|
+
|
|
304
|
+
- Minimal valid configuration
|
|
305
|
+
- Common options
|
|
306
|
+
- Real-world examples
|
|
307
|
+
- Gotchas and tips
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
### HTTP & API Nodes
|
|
312
|
+
|
|
313
|
+
#### HTTP Request (nodes-base.httpRequest)
|
|
314
|
+
|
|
315
|
+
Most versatile node for HTTP operations
|
|
316
|
+
|
|
317
|
+
##### GET Request
|
|
318
|
+
|
|
319
|
+
**Minimal**:
|
|
320
|
+
|
|
321
|
+
```javascript
|
|
322
|
+
{
|
|
323
|
+
"method": "GET",
|
|
324
|
+
"url": "https://api.example.com/users",
|
|
325
|
+
"authentication": "none"
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
**With query parameters**:
|
|
330
|
+
|
|
331
|
+
```javascript
|
|
332
|
+
{
|
|
333
|
+
"method": "GET",
|
|
334
|
+
"url": "https://api.example.com/users",
|
|
335
|
+
"authentication": "none",
|
|
336
|
+
"sendQuery": true,
|
|
337
|
+
"queryParameters": {
|
|
338
|
+
"parameters": [
|
|
339
|
+
{
|
|
340
|
+
"name": "limit",
|
|
341
|
+
"value": "100"
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
"name": "offset",
|
|
345
|
+
"value": "={{$json.offset}}"
|
|
346
|
+
}
|
|
347
|
+
]
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
**With authentication**:
|
|
353
|
+
|
|
354
|
+
```javascript
|
|
355
|
+
{
|
|
356
|
+
"method": "GET",
|
|
357
|
+
"url": "https://api.example.com/users",
|
|
358
|
+
"authentication": "predefinedCredentialType",
|
|
359
|
+
"nodeCredentialType": "httpHeaderAuth"
|
|
360
|
+
}
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
##### POST with JSON
|
|
364
|
+
|
|
365
|
+
**Minimal**:
|
|
366
|
+
|
|
367
|
+
```javascript
|
|
368
|
+
{
|
|
369
|
+
"method": "POST",
|
|
370
|
+
"url": "https://api.example.com/users",
|
|
371
|
+
"authentication": "none",
|
|
372
|
+
"sendBody": true,
|
|
373
|
+
"body": {
|
|
374
|
+
"contentType": "json",
|
|
375
|
+
"content": {
|
|
376
|
+
"name": "John Doe",
|
|
377
|
+
"email": "john@example.com"
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
**With expressions**:
|
|
384
|
+
|
|
385
|
+
```javascript
|
|
386
|
+
{
|
|
387
|
+
"method": "POST",
|
|
388
|
+
"url": "https://api.example.com/users",
|
|
389
|
+
"authentication": "none",
|
|
390
|
+
"sendBody": true,
|
|
391
|
+
"body": {
|
|
392
|
+
"contentType": "json",
|
|
393
|
+
"content": {
|
|
394
|
+
"name": "={{$json.name}}",
|
|
395
|
+
"email": "={{$json.email}}",
|
|
396
|
+
"metadata": {
|
|
397
|
+
"source": "n8n",
|
|
398
|
+
"timestamp": "={{$now.toISO()}}"
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
**Gotcha**: Remember `sendBody: true` for POST/PUT/PATCH!
|
|
406
|
+
|
|
407
|
+
##### PUT/PATCH Request
|
|
408
|
+
|
|
409
|
+
**Pattern**: Same as POST, but method changes
|
|
410
|
+
|
|
411
|
+
```javascript
|
|
412
|
+
{
|
|
413
|
+
"method": "PUT", // or "PATCH"
|
|
414
|
+
"url": "https://api.example.com/users/123",
|
|
415
|
+
"authentication": "none",
|
|
416
|
+
"sendBody": true,
|
|
417
|
+
"body": {
|
|
418
|
+
"contentType": "json",
|
|
419
|
+
"content": {
|
|
420
|
+
"name": "Updated Name"
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
##### DELETE Request
|
|
427
|
+
|
|
428
|
+
**Minimal** (no body):
|
|
429
|
+
|
|
430
|
+
```javascript
|
|
431
|
+
{
|
|
432
|
+
"method": "DELETE",
|
|
433
|
+
"url": "https://api.example.com/users/123",
|
|
434
|
+
"authentication": "none"
|
|
435
|
+
}
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
**With body** (some APIs allow):
|
|
439
|
+
|
|
440
|
+
```javascript
|
|
441
|
+
{
|
|
442
|
+
"method": "DELETE",
|
|
443
|
+
"url": "https://api.example.com/users",
|
|
444
|
+
"authentication": "none",
|
|
445
|
+
"sendBody": true,
|
|
446
|
+
"body": {
|
|
447
|
+
"contentType": "json",
|
|
448
|
+
"content": {
|
|
449
|
+
"ids": ["123", "456"]
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
---
|
|
456
|
+
|
|
457
|
+
#### Webhook (nodes-base.webhook)
|
|
458
|
+
|
|
459
|
+
Most common trigger - 813 searches!
|
|
460
|
+
|
|
461
|
+
##### Basic Webhook
|
|
462
|
+
|
|
463
|
+
**Minimal**:
|
|
464
|
+
|
|
465
|
+
```javascript
|
|
466
|
+
{
|
|
467
|
+
"path": "my-webhook",
|
|
468
|
+
"httpMethod": "POST",
|
|
469
|
+
"responseMode": "onReceived"
|
|
470
|
+
}
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
**Gotcha**: Webhook data is under `$json.body`, not `$json`!
|
|
474
|
+
|
|
475
|
+
```javascript
|
|
476
|
+
// Wrong
|
|
477
|
+
{
|
|
478
|
+
"text": "={{$json.email}}"
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
// Correct
|
|
482
|
+
{
|
|
483
|
+
"text": "={{$json.body.email}}"
|
|
484
|
+
}
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
##### Webhook with Authentication
|
|
488
|
+
|
|
489
|
+
**Header auth**:
|
|
490
|
+
|
|
491
|
+
```javascript
|
|
492
|
+
{
|
|
493
|
+
"path": "secure-webhook",
|
|
494
|
+
"httpMethod": "POST",
|
|
495
|
+
"responseMode": "onReceived",
|
|
496
|
+
"authentication": "headerAuth",
|
|
497
|
+
"options": {
|
|
498
|
+
"responseCode": 200,
|
|
499
|
+
"responseData": "{\n \"success\": true\n}"
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
##### Webhook Returning Data
|
|
505
|
+
|
|
506
|
+
**Custom response**:
|
|
507
|
+
|
|
508
|
+
```javascript
|
|
509
|
+
{
|
|
510
|
+
"path": "my-webhook",
|
|
511
|
+
"httpMethod": "POST",
|
|
512
|
+
"responseMode": "lastNode", // Return data from last node
|
|
513
|
+
"options": {
|
|
514
|
+
"responseCode": 201,
|
|
515
|
+
"responseHeaders": {
|
|
516
|
+
"entries": [
|
|
517
|
+
{
|
|
518
|
+
"name": "Content-Type",
|
|
519
|
+
"value": "application/json"
|
|
520
|
+
}
|
|
521
|
+
]
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
---
|
|
528
|
+
|
|
529
|
+
### Communication Nodes
|
|
530
|
+
|
|
531
|
+
#### Slack (nodes-base.slack)
|
|
532
|
+
|
|
533
|
+
Popular choice for AI agent workflows
|
|
534
|
+
|
|
535
|
+
##### Post Message
|
|
536
|
+
|
|
537
|
+
**Minimal**:
|
|
538
|
+
|
|
539
|
+
```javascript
|
|
540
|
+
{
|
|
541
|
+
"resource": "message",
|
|
542
|
+
"operation": "post",
|
|
543
|
+
"channel": "#general",
|
|
544
|
+
"text": "Hello from n8n!"
|
|
545
|
+
}
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
**With dynamic content**:
|
|
549
|
+
|
|
550
|
+
```javascript
|
|
551
|
+
{
|
|
552
|
+
"resource": "message",
|
|
553
|
+
"operation": "post",
|
|
554
|
+
"channel": "={{$json.channel}}",
|
|
555
|
+
"text": "New user: {{$json.name}} ({{$json.email}})"
|
|
556
|
+
}
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
**With attachments**:
|
|
560
|
+
|
|
561
|
+
```javascript
|
|
562
|
+
{
|
|
563
|
+
"resource": "message",
|
|
564
|
+
"operation": "post",
|
|
565
|
+
"channel": "#alerts",
|
|
566
|
+
"text": "Error Alert",
|
|
567
|
+
"attachments": [
|
|
568
|
+
{
|
|
569
|
+
"color": "#ff0000",
|
|
570
|
+
"fields": [
|
|
571
|
+
{
|
|
572
|
+
"title": "Error Type",
|
|
573
|
+
"value": "={{$json.errorType}}"
|
|
574
|
+
},
|
|
575
|
+
{
|
|
576
|
+
"title": "Timestamp",
|
|
577
|
+
"value": "={{$now.toLocaleString()}}"
|
|
578
|
+
}
|
|
579
|
+
]
|
|
580
|
+
}
|
|
581
|
+
]
|
|
582
|
+
}
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
**Gotcha**: Channel must start with `#` for public channels or be a channel ID!
|
|
586
|
+
|
|
587
|
+
##### Update Message
|
|
588
|
+
|
|
589
|
+
**Minimal**:
|
|
590
|
+
|
|
591
|
+
```javascript
|
|
592
|
+
{
|
|
593
|
+
"resource": "message",
|
|
594
|
+
"operation": "update",
|
|
595
|
+
"messageId": "1234567890.123456", // From previous message post
|
|
596
|
+
"text": "Updated message content"
|
|
597
|
+
}
|
|
598
|
+
```
|
|
599
|
+
|
|
600
|
+
**Note**: `messageId` required, `channel` optional (can be inferred)
|
|
601
|
+
|
|
602
|
+
##### Create Channel
|
|
603
|
+
|
|
604
|
+
**Minimal**:
|
|
605
|
+
|
|
606
|
+
```javascript
|
|
607
|
+
{
|
|
608
|
+
"resource": "channel",
|
|
609
|
+
"operation": "create",
|
|
610
|
+
"name": "new-project-channel", // Lowercase, no spaces
|
|
611
|
+
"isPrivate": false
|
|
612
|
+
}
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
**Gotcha**: Channel name must be lowercase, no spaces, 1-80 chars!
|
|
616
|
+
|
|
617
|
+
---
|
|
618
|
+
|
|
619
|
+
#### Gmail (nodes-base.gmail)
|
|
620
|
+
|
|
621
|
+
Popular for email automation
|
|
622
|
+
|
|
623
|
+
##### Send Email
|
|
624
|
+
|
|
625
|
+
**Minimal**:
|
|
626
|
+
|
|
627
|
+
```javascript
|
|
628
|
+
{
|
|
629
|
+
"resource": "message",
|
|
630
|
+
"operation": "send",
|
|
631
|
+
"to": "user@example.com",
|
|
632
|
+
"subject": "Hello from n8n",
|
|
633
|
+
"message": "This is the email body"
|
|
634
|
+
}
|
|
635
|
+
```
|
|
636
|
+
|
|
637
|
+
**With dynamic content**:
|
|
638
|
+
|
|
639
|
+
```javascript
|
|
640
|
+
{
|
|
641
|
+
"resource": "message",
|
|
642
|
+
"operation": "send",
|
|
643
|
+
"to": "={{$json.email}}",
|
|
644
|
+
"subject": "Order Confirmation #{{$json.orderId}}",
|
|
645
|
+
"message": "Dear {{$json.name}},\n\nYour order has been confirmed.\n\nThank you!",
|
|
646
|
+
"options": {
|
|
647
|
+
"ccList": "admin@example.com",
|
|
648
|
+
"replyTo": "support@example.com"
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
```
|
|
652
|
+
|
|
653
|
+
##### Get Email
|
|
654
|
+
|
|
655
|
+
**Minimal**:
|
|
656
|
+
|
|
657
|
+
```javascript
|
|
658
|
+
{
|
|
659
|
+
"resource": "message",
|
|
660
|
+
"operation": "getAll",
|
|
661
|
+
"returnAll": false,
|
|
662
|
+
"limit": 10
|
|
663
|
+
}
|
|
664
|
+
```
|
|
665
|
+
|
|
666
|
+
**With filters**:
|
|
667
|
+
|
|
668
|
+
```javascript
|
|
669
|
+
{
|
|
670
|
+
"resource": "message",
|
|
671
|
+
"operation": "getAll",
|
|
672
|
+
"returnAll": false,
|
|
673
|
+
"limit": 50,
|
|
674
|
+
"filters": {
|
|
675
|
+
"q": "is:unread from:important@example.com",
|
|
676
|
+
"labelIds": ["INBOX"]
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
```
|
|
680
|
+
|
|
681
|
+
---
|
|
682
|
+
|
|
683
|
+
### Database Nodes
|
|
684
|
+
|
|
685
|
+
#### Postgres (nodes-base.postgres)
|
|
686
|
+
|
|
687
|
+
Database operations - 456 templates
|
|
688
|
+
|
|
689
|
+
##### Execute Query
|
|
690
|
+
|
|
691
|
+
**Minimal** (SELECT):
|
|
692
|
+
|
|
693
|
+
```javascript
|
|
694
|
+
{
|
|
695
|
+
"operation": "executeQuery",
|
|
696
|
+
"query": "SELECT * FROM users WHERE active = true LIMIT 100"
|
|
697
|
+
}
|
|
698
|
+
```
|
|
699
|
+
|
|
700
|
+
**With parameters** (SQL injection prevention):
|
|
701
|
+
|
|
702
|
+
```javascript
|
|
703
|
+
{
|
|
704
|
+
"operation": "executeQuery",
|
|
705
|
+
"query": "SELECT * FROM users WHERE email = $1 AND active = $2",
|
|
706
|
+
"additionalFields": {
|
|
707
|
+
"mode": "list",
|
|
708
|
+
"queryParameters": "user@example.com,true"
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
```
|
|
712
|
+
|
|
713
|
+
**Gotcha**: ALWAYS use parameterized queries for user input!
|
|
714
|
+
|
|
715
|
+
```javascript
|
|
716
|
+
// BAD - SQL injection risk!
|
|
717
|
+
{
|
|
718
|
+
"query": "SELECT * FROM users WHERE email = '{{$json.email}}'"
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
// GOOD - Parameterized
|
|
722
|
+
{
|
|
723
|
+
"query": "SELECT * FROM users WHERE email = $1",
|
|
724
|
+
"additionalFields": {
|
|
725
|
+
"mode": "list",
|
|
726
|
+
"queryParameters": "={{$json.email}}"
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
```
|
|
730
|
+
|
|
731
|
+
##### Insert
|
|
732
|
+
|
|
733
|
+
**Minimal**:
|
|
734
|
+
|
|
735
|
+
```javascript
|
|
736
|
+
{
|
|
737
|
+
"operation": "insert",
|
|
738
|
+
"table": "users",
|
|
739
|
+
"columns": "name,email,created_at",
|
|
740
|
+
"additionalFields": {
|
|
741
|
+
"mode": "list",
|
|
742
|
+
"queryParameters": "John Doe,john@example.com,NOW()"
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
```
|
|
746
|
+
|
|
747
|
+
**With expressions**:
|
|
748
|
+
|
|
749
|
+
```javascript
|
|
750
|
+
{
|
|
751
|
+
"operation": "insert",
|
|
752
|
+
"table": "users",
|
|
753
|
+
"columns": "name,email,metadata",
|
|
754
|
+
"additionalFields": {
|
|
755
|
+
"mode": "list",
|
|
756
|
+
"queryParameters": "={{$json.name}},={{$json.email}},{{JSON.stringify($json)}}"
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
```
|
|
760
|
+
|
|
761
|
+
##### Update
|
|
762
|
+
|
|
763
|
+
**Minimal**:
|
|
764
|
+
|
|
765
|
+
```javascript
|
|
766
|
+
{
|
|
767
|
+
"operation": "update",
|
|
768
|
+
"table": "users",
|
|
769
|
+
"updateKey": "id",
|
|
770
|
+
"columns": "name,email",
|
|
771
|
+
"additionalFields": {
|
|
772
|
+
"mode": "list",
|
|
773
|
+
"queryParameters": "={{$json.id}},Updated Name,newemail@example.com"
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
```
|
|
777
|
+
|
|
778
|
+
---
|
|
779
|
+
|
|
780
|
+
### Data Transformation Nodes
|
|
781
|
+
|
|
782
|
+
#### Set (nodes-base.set)
|
|
783
|
+
|
|
784
|
+
Most used transformation - 68% of workflows!
|
|
785
|
+
|
|
786
|
+
##### Set Fixed Values
|
|
787
|
+
|
|
788
|
+
**Minimal**:
|
|
789
|
+
|
|
790
|
+
```javascript
|
|
791
|
+
{
|
|
792
|
+
"mode": "manual",
|
|
793
|
+
"duplicateItem": false,
|
|
794
|
+
"assignments": {
|
|
795
|
+
"assignments": [
|
|
796
|
+
{
|
|
797
|
+
"name": "status",
|
|
798
|
+
"value": "active",
|
|
799
|
+
"type": "string"
|
|
800
|
+
},
|
|
801
|
+
{
|
|
802
|
+
"name": "count",
|
|
803
|
+
"value": 100,
|
|
804
|
+
"type": "number"
|
|
805
|
+
}
|
|
806
|
+
]
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
```
|
|
810
|
+
|
|
811
|
+
##### Set from Input Data
|
|
812
|
+
|
|
813
|
+
**Mapping data**:
|
|
814
|
+
|
|
815
|
+
```javascript
|
|
816
|
+
{
|
|
817
|
+
"mode": "manual",
|
|
818
|
+
"duplicateItem": false,
|
|
819
|
+
"assignments": {
|
|
820
|
+
"assignments": [
|
|
821
|
+
{
|
|
822
|
+
"name": "fullName",
|
|
823
|
+
"value": "={{$json.firstName}} {{$json.lastName}}",
|
|
824
|
+
"type": "string"
|
|
825
|
+
},
|
|
826
|
+
{
|
|
827
|
+
"name": "email",
|
|
828
|
+
"value": "={{$json.email.toLowerCase()}}",
|
|
829
|
+
"type": "string"
|
|
830
|
+
},
|
|
831
|
+
{
|
|
832
|
+
"name": "timestamp",
|
|
833
|
+
"value": "={{$now.toISO()}}",
|
|
834
|
+
"type": "string"
|
|
835
|
+
}
|
|
836
|
+
]
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
```
|
|
840
|
+
|
|
841
|
+
**Gotcha**: Use correct `type` for each field!
|
|
842
|
+
|
|
843
|
+
```javascript
|
|
844
|
+
// Wrong type
|
|
845
|
+
{
|
|
846
|
+
"name": "age",
|
|
847
|
+
"value": "25", // String
|
|
848
|
+
"type": "string" // Will be string "25"
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
// Correct type
|
|
852
|
+
{
|
|
853
|
+
"name": "age",
|
|
854
|
+
"value": 25, // Number
|
|
855
|
+
"type": "number" // Will be number 25
|
|
856
|
+
}
|
|
857
|
+
```
|
|
858
|
+
|
|
859
|
+
---
|
|
860
|
+
|
|
861
|
+
#### Code (nodes-base.code)
|
|
862
|
+
|
|
863
|
+
JavaScript execution - 42% of workflows
|
|
864
|
+
|
|
865
|
+
##### Simple Transformation
|
|
866
|
+
|
|
867
|
+
**Minimal**:
|
|
868
|
+
|
|
869
|
+
```javascript
|
|
870
|
+
{
|
|
871
|
+
"mode": "runOnceForAllItems",
|
|
872
|
+
"jsCode": "return $input.all().map(item => ({\n json: {\n name: item.json.name.toUpperCase(),\n email: item.json.email\n }\n}));"
|
|
873
|
+
}
|
|
874
|
+
```
|
|
875
|
+
|
|
876
|
+
**Per-item processing**:
|
|
877
|
+
|
|
878
|
+
```javascript
|
|
879
|
+
{
|
|
880
|
+
"mode": "runOnceForEachItem",
|
|
881
|
+
"jsCode": "// Process each item\nconst data = $input.item.json;\n\nreturn {\n json: {\n fullName: `${data.firstName} ${data.lastName}`,\n email: data.email.toLowerCase(),\n timestamp: new Date().toISOString()\n }\n};"
|
|
882
|
+
}
|
|
883
|
+
```
|
|
884
|
+
|
|
885
|
+
**Gotcha**: In Code nodes, use `$input.item.json` or `$input.all()`, NOT `{{...}}`!
|
|
886
|
+
|
|
887
|
+
```javascript
|
|
888
|
+
// Wrong - expressions don't work in Code nodes
|
|
889
|
+
{
|
|
890
|
+
"jsCode": "const name = '={{$json.name}}';"
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
// Correct - direct access
|
|
894
|
+
{
|
|
895
|
+
"jsCode": "const name = $input.item.json.name;"
|
|
896
|
+
}
|
|
897
|
+
```
|
|
898
|
+
|
|
899
|
+
---
|
|
900
|
+
|
|
901
|
+
### Conditional Nodes
|
|
902
|
+
|
|
903
|
+
#### IF (nodes-base.if)
|
|
904
|
+
|
|
905
|
+
Conditional logic - 38% of workflows
|
|
906
|
+
|
|
907
|
+
##### String Comparison
|
|
908
|
+
|
|
909
|
+
**Equals** (binary):
|
|
910
|
+
|
|
911
|
+
```javascript
|
|
912
|
+
{
|
|
913
|
+
"conditions": {
|
|
914
|
+
"string": [
|
|
915
|
+
{
|
|
916
|
+
"value1": "={{$json.status}}",
|
|
917
|
+
"operation": "equals",
|
|
918
|
+
"value2": "active"
|
|
919
|
+
}
|
|
920
|
+
]
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
```
|
|
924
|
+
|
|
925
|
+
**Contains** (binary):
|
|
926
|
+
|
|
927
|
+
```javascript
|
|
928
|
+
{
|
|
929
|
+
"conditions": {
|
|
930
|
+
"string": [
|
|
931
|
+
{
|
|
932
|
+
"value1": "={{$json.email}}",
|
|
933
|
+
"operation": "contains",
|
|
934
|
+
"value2": "@example.com"
|
|
935
|
+
}
|
|
936
|
+
]
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
```
|
|
940
|
+
|
|
941
|
+
**isEmpty** (unary):
|
|
942
|
+
|
|
943
|
+
```javascript
|
|
944
|
+
{
|
|
945
|
+
"conditions": {
|
|
946
|
+
"string": [
|
|
947
|
+
{
|
|
948
|
+
"value1": "={{$json.email}}",
|
|
949
|
+
"operation": "isEmpty"
|
|
950
|
+
// No value2 - unary operator
|
|
951
|
+
// singleValue: true added by auto-sanitization
|
|
952
|
+
}
|
|
953
|
+
]
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
```
|
|
957
|
+
|
|
958
|
+
**Gotcha**: Unary operators (isEmpty, isNotEmpty) don't need value2!
|
|
959
|
+
|
|
960
|
+
##### Number Comparison
|
|
961
|
+
|
|
962
|
+
**Greater than**:
|
|
963
|
+
|
|
964
|
+
```javascript
|
|
965
|
+
{
|
|
966
|
+
"conditions": {
|
|
967
|
+
"number": [
|
|
968
|
+
{
|
|
969
|
+
"value1": "={{$json.age}}",
|
|
970
|
+
"operation": "larger",
|
|
971
|
+
"value2": 18
|
|
972
|
+
}
|
|
973
|
+
]
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
```
|
|
977
|
+
|
|
978
|
+
##### Boolean Comparison
|
|
979
|
+
|
|
980
|
+
**Is true**:
|
|
981
|
+
|
|
982
|
+
```javascript
|
|
983
|
+
{
|
|
984
|
+
"conditions": {
|
|
985
|
+
"boolean": [
|
|
986
|
+
{
|
|
987
|
+
"value1": "={{$json.isActive}}",
|
|
988
|
+
"operation": "true"
|
|
989
|
+
// Unary - no value2
|
|
990
|
+
}
|
|
991
|
+
]
|
|
992
|
+
}
|
|
993
|
+
}
|
|
994
|
+
```
|
|
995
|
+
|
|
996
|
+
##### Multiple Conditions (AND)
|
|
997
|
+
|
|
998
|
+
**All must match**:
|
|
999
|
+
|
|
1000
|
+
```javascript
|
|
1001
|
+
{
|
|
1002
|
+
"conditions": {
|
|
1003
|
+
"string": [
|
|
1004
|
+
{
|
|
1005
|
+
"value1": "={{$json.status}}",
|
|
1006
|
+
"operation": "equals",
|
|
1007
|
+
"value2": "active"
|
|
1008
|
+
}
|
|
1009
|
+
],
|
|
1010
|
+
"number": [
|
|
1011
|
+
{
|
|
1012
|
+
"value1": "={{$json.age}}",
|
|
1013
|
+
"operation": "larger",
|
|
1014
|
+
"value2": 18
|
|
1015
|
+
}
|
|
1016
|
+
]
|
|
1017
|
+
},
|
|
1018
|
+
"combineOperation": "all" // AND logic
|
|
1019
|
+
}
|
|
1020
|
+
```
|
|
1021
|
+
|
|
1022
|
+
##### Multiple Conditions (OR)
|
|
1023
|
+
|
|
1024
|
+
**Any can match**:
|
|
1025
|
+
|
|
1026
|
+
```javascript
|
|
1027
|
+
{
|
|
1028
|
+
"conditions": {
|
|
1029
|
+
"string": [
|
|
1030
|
+
{
|
|
1031
|
+
"value1": "={{$json.status}}",
|
|
1032
|
+
"operation": "equals",
|
|
1033
|
+
"value2": "active"
|
|
1034
|
+
},
|
|
1035
|
+
{
|
|
1036
|
+
"value1": "={{$json.status}}",
|
|
1037
|
+
"operation": "equals",
|
|
1038
|
+
"value2": "pending"
|
|
1039
|
+
}
|
|
1040
|
+
]
|
|
1041
|
+
},
|
|
1042
|
+
"combineOperation": "any" // OR logic
|
|
1043
|
+
}
|
|
1044
|
+
```
|
|
1045
|
+
|
|
1046
|
+
---
|
|
1047
|
+
|
|
1048
|
+
#### Switch (nodes-base.switch)
|
|
1049
|
+
|
|
1050
|
+
Multi-way routing - 18% of workflows
|
|
1051
|
+
|
|
1052
|
+
##### Basic Switch
|
|
1053
|
+
|
|
1054
|
+
**Minimal**:
|
|
1055
|
+
|
|
1056
|
+
```javascript
|
|
1057
|
+
{
|
|
1058
|
+
"mode": "rules",
|
|
1059
|
+
"rules": {
|
|
1060
|
+
"rules": [
|
|
1061
|
+
{
|
|
1062
|
+
"conditions": {
|
|
1063
|
+
"string": [
|
|
1064
|
+
{
|
|
1065
|
+
"value1": "={{$json.status}}",
|
|
1066
|
+
"operation": "equals",
|
|
1067
|
+
"value2": "active"
|
|
1068
|
+
}
|
|
1069
|
+
]
|
|
1070
|
+
}
|
|
1071
|
+
},
|
|
1072
|
+
{
|
|
1073
|
+
"conditions": {
|
|
1074
|
+
"string": [
|
|
1075
|
+
{
|
|
1076
|
+
"value1": "={{$json.status}}",
|
|
1077
|
+
"operation": "equals",
|
|
1078
|
+
"value2": "pending"
|
|
1079
|
+
}
|
|
1080
|
+
]
|
|
1081
|
+
}
|
|
1082
|
+
}
|
|
1083
|
+
]
|
|
1084
|
+
},
|
|
1085
|
+
"fallbackOutput": "extra" // Catch-all for non-matching
|
|
1086
|
+
}
|
|
1087
|
+
```
|
|
1088
|
+
|
|
1089
|
+
**Gotcha**: Number of rules must match number of outputs!
|
|
1090
|
+
|
|
1091
|
+
---
|
|
1092
|
+
|
|
1093
|
+
### AI Nodes
|
|
1094
|
+
|
|
1095
|
+
#### OpenAI (nodes-langchain.openAi)
|
|
1096
|
+
|
|
1097
|
+
AI operations - 234 templates
|
|
1098
|
+
|
|
1099
|
+
##### Chat Completion
|
|
1100
|
+
|
|
1101
|
+
**Minimal**:
|
|
1102
|
+
|
|
1103
|
+
```javascript
|
|
1104
|
+
{
|
|
1105
|
+
"resource": "chat",
|
|
1106
|
+
"operation": "complete",
|
|
1107
|
+
"messages": {
|
|
1108
|
+
"values": [
|
|
1109
|
+
{
|
|
1110
|
+
"role": "user",
|
|
1111
|
+
"content": "={{$json.prompt}}"
|
|
1112
|
+
}
|
|
1113
|
+
]
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
```
|
|
1117
|
+
|
|
1118
|
+
**With system prompt**:
|
|
1119
|
+
|
|
1120
|
+
```javascript
|
|
1121
|
+
{
|
|
1122
|
+
"resource": "chat",
|
|
1123
|
+
"operation": "complete",
|
|
1124
|
+
"messages": {
|
|
1125
|
+
"values": [
|
|
1126
|
+
{
|
|
1127
|
+
"role": "system",
|
|
1128
|
+
"content": "You are a helpful assistant specialized in customer support."
|
|
1129
|
+
},
|
|
1130
|
+
{
|
|
1131
|
+
"role": "user",
|
|
1132
|
+
"content": "={{$json.userMessage}}"
|
|
1133
|
+
}
|
|
1134
|
+
]
|
|
1135
|
+
},
|
|
1136
|
+
"options": {
|
|
1137
|
+
"temperature": 0.7,
|
|
1138
|
+
"maxTokens": 500
|
|
1139
|
+
}
|
|
1140
|
+
}
|
|
1141
|
+
```
|
|
1142
|
+
|
|
1143
|
+
---
|
|
1144
|
+
|
|
1145
|
+
### Schedule Nodes
|
|
1146
|
+
|
|
1147
|
+
#### Schedule Trigger (nodes-base.scheduleTrigger)
|
|
1148
|
+
|
|
1149
|
+
Time-based workflows - 28% have schedule triggers
|
|
1150
|
+
|
|
1151
|
+
##### Daily at Specific Time
|
|
1152
|
+
|
|
1153
|
+
**Minimal**:
|
|
1154
|
+
|
|
1155
|
+
```javascript
|
|
1156
|
+
{
|
|
1157
|
+
"rule": {
|
|
1158
|
+
"interval": [
|
|
1159
|
+
{
|
|
1160
|
+
"field": "hours",
|
|
1161
|
+
"hoursInterval": 24
|
|
1162
|
+
}
|
|
1163
|
+
],
|
|
1164
|
+
"hour": 9,
|
|
1165
|
+
"minute": 0,
|
|
1166
|
+
"timezone": "America/New_York"
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
```
|
|
1170
|
+
|
|
1171
|
+
**Gotcha**: Always set timezone explicitly!
|
|
1172
|
+
|
|
1173
|
+
```javascript
|
|
1174
|
+
// Bad - uses server timezone
|
|
1175
|
+
{
|
|
1176
|
+
"rule": {
|
|
1177
|
+
"interval": [...]
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1181
|
+
// Good - explicit timezone
|
|
1182
|
+
{
|
|
1183
|
+
"rule": {
|
|
1184
|
+
"interval": [...],
|
|
1185
|
+
"timezone": "America/New_York"
|
|
1186
|
+
}
|
|
1187
|
+
}
|
|
1188
|
+
```
|
|
1189
|
+
|
|
1190
|
+
##### Every N Minutes
|
|
1191
|
+
|
|
1192
|
+
**Minimal**:
|
|
1193
|
+
|
|
1194
|
+
```javascript
|
|
1195
|
+
{
|
|
1196
|
+
"rule": {
|
|
1197
|
+
"interval": [
|
|
1198
|
+
{
|
|
1199
|
+
"field": "minutes",
|
|
1200
|
+
"minutesInterval": 15
|
|
1201
|
+
}
|
|
1202
|
+
]
|
|
1203
|
+
}
|
|
1204
|
+
}
|
|
1205
|
+
```
|
|
1206
|
+
|
|
1207
|
+
##### Cron Expression
|
|
1208
|
+
|
|
1209
|
+
**Advanced scheduling**:
|
|
1210
|
+
|
|
1211
|
+
```javascript
|
|
1212
|
+
{
|
|
1213
|
+
"mode": "cron",
|
|
1214
|
+
"cronExpression": "0 */2 * * *", // Every 2 hours
|
|
1215
|
+
"timezone": "America/New_York"
|
|
1216
|
+
}
|
|
1217
|
+
```
|
|
1218
|
+
|
|
1219
|
+
---
|
|
1220
|
+
|
|
1221
|
+
### Operation Patterns Summary
|
|
1222
|
+
|
|
1223
|
+
**Key Patterns by Category**:
|
|
1224
|
+
|
|
1225
|
+
| Category | Most Common | Key Gotcha |
|
|
1226
|
+
| ------------- | ------------------ | ------------------------- |
|
|
1227
|
+
| HTTP/API | GET, POST JSON | Remember sendBody: true |
|
|
1228
|
+
| Webhooks | POST receiver | Data under $json.body |
|
|
1229
|
+
| Communication | Slack post | Channel format (#name) |
|
|
1230
|
+
| Database | SELECT with params | Use parameterized queries |
|
|
1231
|
+
| Transform | Set assignments | Correct type per field |
|
|
1232
|
+
| Conditional | IF string equals | Unary vs binary operators |
|
|
1233
|
+
| AI | OpenAI chat | System + user messages |
|
|
1234
|
+
| Schedule | Daily at time | Set timezone explicitly |
|
|
1235
|
+
|
|
1236
|
+
**Configuration Approach**:
|
|
1237
|
+
|
|
1238
|
+
1. Use patterns as starting point
|
|
1239
|
+
2. Adapt to your use case
|
|
1240
|
+
3. Validate configuration
|
|
1241
|
+
4. Iterate based on errors
|
|
1242
|
+
5. Deploy when valid
|
|
1243
|
+
|
|
1244
|
+
> **Cross-reference**: For where these node patterns fit within larger workflow compositions, see [workflow-patterns.md](../workflow-patterns.md).
|
|
1245
|
+
|
|
1246
|
+
---
|
|
1247
|
+
|
|
1248
|
+
## Property Dependencies Deep Dive
|
|
1249
|
+
|
|
1250
|
+
### What Are Property Dependencies?
|
|
1251
|
+
|
|
1252
|
+
**Definition**: Rules that control when fields are visible or required based on other field values.
|
|
1253
|
+
|
|
1254
|
+
**Mechanism**: `displayOptions` in node schema
|
|
1255
|
+
|
|
1256
|
+
**Purpose**:
|
|
1257
|
+
|
|
1258
|
+
- Show relevant fields only
|
|
1259
|
+
- Hide irrelevant fields
|
|
1260
|
+
- Simplify configuration UX
|
|
1261
|
+
- Prevent invalid configurations
|
|
1262
|
+
|
|
1263
|
+
---
|
|
1264
|
+
|
|
1265
|
+
### displayOptions Structure
|
|
1266
|
+
|
|
1267
|
+
#### Basic Format
|
|
1268
|
+
|
|
1269
|
+
```javascript
|
|
1270
|
+
{
|
|
1271
|
+
"name": "fieldName",
|
|
1272
|
+
"type": "string",
|
|
1273
|
+
"displayOptions": {
|
|
1274
|
+
"show": {
|
|
1275
|
+
"otherField": ["value1", "value2"]
|
|
1276
|
+
}
|
|
1277
|
+
}
|
|
1278
|
+
}
|
|
1279
|
+
```
|
|
1280
|
+
|
|
1281
|
+
**Translation**: Show `fieldName` when `otherField` equals "value1" OR "value2"
|
|
1282
|
+
|
|
1283
|
+
#### Show vs Hide
|
|
1284
|
+
|
|
1285
|
+
##### show (Most Common)
|
|
1286
|
+
|
|
1287
|
+
**Show field when condition matches**:
|
|
1288
|
+
|
|
1289
|
+
```javascript
|
|
1290
|
+
{
|
|
1291
|
+
"name": "body",
|
|
1292
|
+
"displayOptions": {
|
|
1293
|
+
"show": {
|
|
1294
|
+
"sendBody": [true]
|
|
1295
|
+
}
|
|
1296
|
+
}
|
|
1297
|
+
}
|
|
1298
|
+
```
|
|
1299
|
+
|
|
1300
|
+
**Meaning**: Show `body` when `sendBody = true`
|
|
1301
|
+
|
|
1302
|
+
##### hide (Less Common)
|
|
1303
|
+
|
|
1304
|
+
**Hide field when condition matches**:
|
|
1305
|
+
|
|
1306
|
+
```javascript
|
|
1307
|
+
{
|
|
1308
|
+
"name": "advanced",
|
|
1309
|
+
"displayOptions": {
|
|
1310
|
+
"hide": {
|
|
1311
|
+
"simpleMode": [true]
|
|
1312
|
+
}
|
|
1313
|
+
}
|
|
1314
|
+
}
|
|
1315
|
+
```
|
|
1316
|
+
|
|
1317
|
+
**Meaning**: Hide `advanced` when `simpleMode = true`
|
|
1318
|
+
|
|
1319
|
+
#### Multiple Conditions (AND Logic)
|
|
1320
|
+
|
|
1321
|
+
```javascript
|
|
1322
|
+
{
|
|
1323
|
+
"name": "body",
|
|
1324
|
+
"displayOptions": {
|
|
1325
|
+
"show": {
|
|
1326
|
+
"sendBody": [true],
|
|
1327
|
+
"method": ["POST", "PUT", "PATCH"]
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
```
|
|
1332
|
+
|
|
1333
|
+
**Meaning**: Show `body` when:
|
|
1334
|
+
|
|
1335
|
+
- `sendBody = true` AND
|
|
1336
|
+
- `method IN (POST, PUT, PATCH)`
|
|
1337
|
+
|
|
1338
|
+
**All conditions must match** (AND logic)
|
|
1339
|
+
|
|
1340
|
+
#### Multiple Values (OR Logic)
|
|
1341
|
+
|
|
1342
|
+
```javascript
|
|
1343
|
+
{
|
|
1344
|
+
"name": "someField",
|
|
1345
|
+
"displayOptions": {
|
|
1346
|
+
"show": {
|
|
1347
|
+
"method": ["POST", "PUT", "PATCH"]
|
|
1348
|
+
}
|
|
1349
|
+
}
|
|
1350
|
+
}
|
|
1351
|
+
```
|
|
1352
|
+
|
|
1353
|
+
**Meaning**: Show `someField` when:
|
|
1354
|
+
|
|
1355
|
+
- `method = POST` OR
|
|
1356
|
+
- `method = PUT` OR
|
|
1357
|
+
- `method = PATCH`
|
|
1358
|
+
|
|
1359
|
+
**Any value matches** (OR logic)
|
|
1360
|
+
|
|
1361
|
+
---
|
|
1362
|
+
|
|
1363
|
+
### Common Dependency Patterns
|
|
1364
|
+
|
|
1365
|
+
#### Pattern 1: Boolean Toggle
|
|
1366
|
+
|
|
1367
|
+
**Use case**: Optional feature flag
|
|
1368
|
+
|
|
1369
|
+
**Example**: HTTP Request sendBody
|
|
1370
|
+
|
|
1371
|
+
```javascript
|
|
1372
|
+
// Field: sendBody (boolean)
|
|
1373
|
+
{
|
|
1374
|
+
"name": "sendBody",
|
|
1375
|
+
"type": "boolean",
|
|
1376
|
+
"default": false
|
|
1377
|
+
}
|
|
1378
|
+
|
|
1379
|
+
// Field: body (depends on sendBody)
|
|
1380
|
+
{
|
|
1381
|
+
"name": "body",
|
|
1382
|
+
"displayOptions": {
|
|
1383
|
+
"show": {
|
|
1384
|
+
"sendBody": [true]
|
|
1385
|
+
}
|
|
1386
|
+
}
|
|
1387
|
+
}
|
|
1388
|
+
```
|
|
1389
|
+
|
|
1390
|
+
**Flow**:
|
|
1391
|
+
|
|
1392
|
+
1. User sees sendBody checkbox
|
|
1393
|
+
2. When checked -> body field appears
|
|
1394
|
+
3. When unchecked -> body field hides
|
|
1395
|
+
|
|
1396
|
+
#### Pattern 2: Resource/Operation Cascade
|
|
1397
|
+
|
|
1398
|
+
**Use case**: Different operations show different fields
|
|
1399
|
+
|
|
1400
|
+
**Example**: Slack message operations
|
|
1401
|
+
|
|
1402
|
+
```javascript
|
|
1403
|
+
// Operation: post
|
|
1404
|
+
{
|
|
1405
|
+
"name": "channel",
|
|
1406
|
+
"displayOptions": {
|
|
1407
|
+
"show": {
|
|
1408
|
+
"resource": ["message"],
|
|
1409
|
+
"operation": ["post"]
|
|
1410
|
+
}
|
|
1411
|
+
}
|
|
1412
|
+
}
|
|
1413
|
+
|
|
1414
|
+
// Operation: update
|
|
1415
|
+
{
|
|
1416
|
+
"name": "messageId",
|
|
1417
|
+
"displayOptions": {
|
|
1418
|
+
"show": {
|
|
1419
|
+
"resource": ["message"],
|
|
1420
|
+
"operation": ["update"]
|
|
1421
|
+
}
|
|
1422
|
+
}
|
|
1423
|
+
}
|
|
1424
|
+
```
|
|
1425
|
+
|
|
1426
|
+
**Flow**:
|
|
1427
|
+
|
|
1428
|
+
1. User selects resource="message"
|
|
1429
|
+
2. User selects operation="post" -> sees channel
|
|
1430
|
+
3. User changes to operation="update" -> channel hides, messageId shows
|
|
1431
|
+
|
|
1432
|
+
#### Pattern 3: Type-Specific Configuration
|
|
1433
|
+
|
|
1434
|
+
**Use case**: Different types need different fields
|
|
1435
|
+
|
|
1436
|
+
**Example**: IF node conditions
|
|
1437
|
+
|
|
1438
|
+
```javascript
|
|
1439
|
+
// String operations
|
|
1440
|
+
{
|
|
1441
|
+
"name": "value2",
|
|
1442
|
+
"displayOptions": {
|
|
1443
|
+
"show": {
|
|
1444
|
+
"conditions.string.0.operation": ["equals", "notEquals", "contains"]
|
|
1445
|
+
}
|
|
1446
|
+
}
|
|
1447
|
+
}
|
|
1448
|
+
|
|
1449
|
+
// Unary operations (isEmpty) don't show value2
|
|
1450
|
+
{
|
|
1451
|
+
"displayOptions": {
|
|
1452
|
+
"hide": {
|
|
1453
|
+
"conditions.string.0.operation": ["isEmpty", "isNotEmpty"]
|
|
1454
|
+
}
|
|
1455
|
+
}
|
|
1456
|
+
}
|
|
1457
|
+
```
|
|
1458
|
+
|
|
1459
|
+
#### Pattern 4: Method-Specific Fields
|
|
1460
|
+
|
|
1461
|
+
**Use case**: HTTP methods have different options
|
|
1462
|
+
|
|
1463
|
+
**Example**: HTTP Request
|
|
1464
|
+
|
|
1465
|
+
```javascript
|
|
1466
|
+
// Query parameters (all methods can have)
|
|
1467
|
+
{
|
|
1468
|
+
"name": "queryParameters",
|
|
1469
|
+
"displayOptions": {
|
|
1470
|
+
"show": {
|
|
1471
|
+
"sendQuery": [true]
|
|
1472
|
+
}
|
|
1473
|
+
}
|
|
1474
|
+
}
|
|
1475
|
+
|
|
1476
|
+
// Body (only certain methods)
|
|
1477
|
+
{
|
|
1478
|
+
"name": "body",
|
|
1479
|
+
"displayOptions": {
|
|
1480
|
+
"show": {
|
|
1481
|
+
"sendBody": [true],
|
|
1482
|
+
"method": ["POST", "PUT", "PATCH", "DELETE"]
|
|
1483
|
+
}
|
|
1484
|
+
}
|
|
1485
|
+
}
|
|
1486
|
+
```
|
|
1487
|
+
|
|
1488
|
+
---
|
|
1489
|
+
|
|
1490
|
+
### Finding Property Dependencies
|
|
1491
|
+
|
|
1492
|
+
#### Using get_node with search_properties Mode
|
|
1493
|
+
|
|
1494
|
+
```javascript
|
|
1495
|
+
// Find properties related to "body"
|
|
1496
|
+
get_node({
|
|
1497
|
+
nodeType: "nodes-base.httpRequest",
|
|
1498
|
+
mode: "search_properties",
|
|
1499
|
+
propertyQuery: "body",
|
|
1500
|
+
});
|
|
1501
|
+
```
|
|
1502
|
+
|
|
1503
|
+
#### Using get_node with Full Detail
|
|
1504
|
+
|
|
1505
|
+
```javascript
|
|
1506
|
+
// Get complete schema with displayOptions
|
|
1507
|
+
get_node({
|
|
1508
|
+
nodeType: "nodes-base.httpRequest",
|
|
1509
|
+
detail: "full",
|
|
1510
|
+
});
|
|
1511
|
+
```
|
|
1512
|
+
|
|
1513
|
+
> **Cross-reference**: For full `get_node` usage including all modes and parameters, see [mcp-tools-expert.md](../mcp-tools-expert.md).
|
|
1514
|
+
|
|
1515
|
+
#### When to Use
|
|
1516
|
+
|
|
1517
|
+
**Use when**:
|
|
1518
|
+
|
|
1519
|
+
- Validation fails with "missing field" but you don't see that field
|
|
1520
|
+
- A field appears/disappears unexpectedly
|
|
1521
|
+
- You need to understand what controls field visibility
|
|
1522
|
+
- Building dynamic configuration tools
|
|
1523
|
+
|
|
1524
|
+
**Don't use when**:
|
|
1525
|
+
|
|
1526
|
+
- Simple configuration (use `get_node` with standard detail)
|
|
1527
|
+
- Just starting configuration
|
|
1528
|
+
- Field requirements are obvious
|
|
1529
|
+
|
|
1530
|
+
---
|
|
1531
|
+
|
|
1532
|
+
### Complex Dependency Examples
|
|
1533
|
+
|
|
1534
|
+
#### Example 1: HTTP Request Complete Flow
|
|
1535
|
+
|
|
1536
|
+
**Scenario**: Configuring POST with JSON body
|
|
1537
|
+
|
|
1538
|
+
**Step 1**: Set method
|
|
1539
|
+
|
|
1540
|
+
```javascript
|
|
1541
|
+
{
|
|
1542
|
+
"method": "POST"
|
|
1543
|
+
// -> sendBody becomes visible
|
|
1544
|
+
}
|
|
1545
|
+
```
|
|
1546
|
+
|
|
1547
|
+
**Step 2**: Enable body
|
|
1548
|
+
|
|
1549
|
+
```javascript
|
|
1550
|
+
{
|
|
1551
|
+
"method": "POST",
|
|
1552
|
+
"sendBody": true
|
|
1553
|
+
// -> body field becomes visible AND required
|
|
1554
|
+
}
|
|
1555
|
+
```
|
|
1556
|
+
|
|
1557
|
+
**Step 3**: Configure body
|
|
1558
|
+
|
|
1559
|
+
```javascript
|
|
1560
|
+
{
|
|
1561
|
+
"method": "POST",
|
|
1562
|
+
"sendBody": true,
|
|
1563
|
+
"body": {
|
|
1564
|
+
"contentType": "json"
|
|
1565
|
+
// -> content field becomes visible AND required
|
|
1566
|
+
}
|
|
1567
|
+
}
|
|
1568
|
+
```
|
|
1569
|
+
|
|
1570
|
+
**Step 4**: Add content
|
|
1571
|
+
|
|
1572
|
+
```javascript
|
|
1573
|
+
{
|
|
1574
|
+
"method": "POST",
|
|
1575
|
+
"sendBody": true,
|
|
1576
|
+
"body": {
|
|
1577
|
+
"contentType": "json",
|
|
1578
|
+
"content": {
|
|
1579
|
+
"name": "John",
|
|
1580
|
+
"email": "john@example.com"
|
|
1581
|
+
}
|
|
1582
|
+
}
|
|
1583
|
+
}
|
|
1584
|
+
// Valid!
|
|
1585
|
+
```
|
|
1586
|
+
|
|
1587
|
+
**Dependency chain**:
|
|
1588
|
+
|
|
1589
|
+
```
|
|
1590
|
+
method=POST
|
|
1591
|
+
-> sendBody visible
|
|
1592
|
+
-> sendBody=true
|
|
1593
|
+
-> body visible + required
|
|
1594
|
+
-> body.contentType=json
|
|
1595
|
+
-> body.content visible + required
|
|
1596
|
+
```
|
|
1597
|
+
|
|
1598
|
+
#### Example 2: IF Node Operator Dependencies
|
|
1599
|
+
|
|
1600
|
+
**Scenario**: String comparison with different operators
|
|
1601
|
+
|
|
1602
|
+
**Binary operator** (equals):
|
|
1603
|
+
|
|
1604
|
+
```javascript
|
|
1605
|
+
{
|
|
1606
|
+
"conditions": {
|
|
1607
|
+
"string": [
|
|
1608
|
+
{
|
|
1609
|
+
"operation": "equals"
|
|
1610
|
+
// -> value1 required
|
|
1611
|
+
// -> value2 required
|
|
1612
|
+
// -> singleValue should NOT be set
|
|
1613
|
+
}
|
|
1614
|
+
]
|
|
1615
|
+
}
|
|
1616
|
+
}
|
|
1617
|
+
```
|
|
1618
|
+
|
|
1619
|
+
**Unary operator** (isEmpty):
|
|
1620
|
+
|
|
1621
|
+
```javascript
|
|
1622
|
+
{
|
|
1623
|
+
"conditions": {
|
|
1624
|
+
"string": [
|
|
1625
|
+
{
|
|
1626
|
+
"operation": "isEmpty"
|
|
1627
|
+
// -> value1 required
|
|
1628
|
+
// -> value2 should NOT be set
|
|
1629
|
+
// -> singleValue should be true (auto-added)
|
|
1630
|
+
}
|
|
1631
|
+
]
|
|
1632
|
+
}
|
|
1633
|
+
}
|
|
1634
|
+
```
|
|
1635
|
+
|
|
1636
|
+
**Dependency table**:
|
|
1637
|
+
|
|
1638
|
+
| Operator | value1 | value2 | singleValue |
|
|
1639
|
+
| ---------- | -------- | -------- | ----------- |
|
|
1640
|
+
| equals | Required | Required | false |
|
|
1641
|
+
| notEquals | Required | Required | false |
|
|
1642
|
+
| contains | Required | Required | false |
|
|
1643
|
+
| isEmpty | Required | Hidden | true |
|
|
1644
|
+
| isNotEmpty | Required | Hidden | true |
|
|
1645
|
+
|
|
1646
|
+
#### Example 3: Slack Operation Matrix
|
|
1647
|
+
|
|
1648
|
+
**Scenario**: Different Slack operations show different fields
|
|
1649
|
+
|
|
1650
|
+
```javascript
|
|
1651
|
+
// post message
|
|
1652
|
+
{
|
|
1653
|
+
"resource": "message",
|
|
1654
|
+
"operation": "post"
|
|
1655
|
+
// Shows: channel (required), text (required), attachments, blocks
|
|
1656
|
+
}
|
|
1657
|
+
|
|
1658
|
+
// update message
|
|
1659
|
+
{
|
|
1660
|
+
"resource": "message",
|
|
1661
|
+
"operation": "update"
|
|
1662
|
+
// Shows: messageId (required), text (required), channel (optional)
|
|
1663
|
+
}
|
|
1664
|
+
|
|
1665
|
+
// delete message
|
|
1666
|
+
{
|
|
1667
|
+
"resource": "message",
|
|
1668
|
+
"operation": "delete"
|
|
1669
|
+
// Shows: messageId (required), channel (required)
|
|
1670
|
+
// Hides: text, attachments, blocks
|
|
1671
|
+
}
|
|
1672
|
+
|
|
1673
|
+
// get message
|
|
1674
|
+
{
|
|
1675
|
+
"resource": "message",
|
|
1676
|
+
"operation": "get"
|
|
1677
|
+
// Shows: messageId (required), channel (required)
|
|
1678
|
+
// Hides: text, attachments, blocks
|
|
1679
|
+
}
|
|
1680
|
+
```
|
|
1681
|
+
|
|
1682
|
+
**Field visibility matrix**:
|
|
1683
|
+
|
|
1684
|
+
| Field | post | update | delete | get |
|
|
1685
|
+
| ----------- | -------- | -------- | -------- | -------- |
|
|
1686
|
+
| channel | Required | Optional | Required | Required |
|
|
1687
|
+
| text | Required | Required | Hidden | Hidden |
|
|
1688
|
+
| messageId | Hidden | Required | Required | Required |
|
|
1689
|
+
| attachments | Optional | Optional | Hidden | Hidden |
|
|
1690
|
+
| blocks | Optional | Optional | Hidden | Hidden |
|
|
1691
|
+
|
|
1692
|
+
---
|
|
1693
|
+
|
|
1694
|
+
### Nested Dependencies
|
|
1695
|
+
|
|
1696
|
+
#### What Are They?
|
|
1697
|
+
|
|
1698
|
+
**Definition**: Dependencies within object properties
|
|
1699
|
+
|
|
1700
|
+
**Example**: HTTP Request body.contentType controls body.content structure
|
|
1701
|
+
|
|
1702
|
+
```javascript
|
|
1703
|
+
{
|
|
1704
|
+
"body": {
|
|
1705
|
+
"contentType": "json",
|
|
1706
|
+
// -> content expects JSON object
|
|
1707
|
+
"content": {
|
|
1708
|
+
"key": "value"
|
|
1709
|
+
}
|
|
1710
|
+
}
|
|
1711
|
+
}
|
|
1712
|
+
|
|
1713
|
+
{
|
|
1714
|
+
"body": {
|
|
1715
|
+
"contentType": "form-data",
|
|
1716
|
+
// -> content expects form fields array
|
|
1717
|
+
"content": [
|
|
1718
|
+
{
|
|
1719
|
+
"name": "field1",
|
|
1720
|
+
"value": "value1"
|
|
1721
|
+
}
|
|
1722
|
+
]
|
|
1723
|
+
}
|
|
1724
|
+
}
|
|
1725
|
+
```
|
|
1726
|
+
|
|
1727
|
+
#### How to Handle
|
|
1728
|
+
|
|
1729
|
+
**Strategy**: Configure parent first, then children
|
|
1730
|
+
|
|
1731
|
+
```javascript
|
|
1732
|
+
// Step 1: Parent
|
|
1733
|
+
{
|
|
1734
|
+
"body": {
|
|
1735
|
+
"contentType": "json" // Set parent first
|
|
1736
|
+
}
|
|
1737
|
+
}
|
|
1738
|
+
|
|
1739
|
+
// Step 2: Children (structure determined by parent)
|
|
1740
|
+
{
|
|
1741
|
+
"body": {
|
|
1742
|
+
"contentType": "json",
|
|
1743
|
+
"content": { // JSON object format
|
|
1744
|
+
"key": "value"
|
|
1745
|
+
}
|
|
1746
|
+
}
|
|
1747
|
+
}
|
|
1748
|
+
```
|
|
1749
|
+
|
|
1750
|
+
---
|
|
1751
|
+
|
|
1752
|
+
### Auto-Sanitization and Dependencies
|
|
1753
|
+
|
|
1754
|
+
#### What Auto-Sanitization Fixes
|
|
1755
|
+
|
|
1756
|
+
**Operator structure issues** (IF/Switch nodes):
|
|
1757
|
+
|
|
1758
|
+
**Example**: singleValue property
|
|
1759
|
+
|
|
1760
|
+
```javascript
|
|
1761
|
+
// You configure (missing singleValue)
|
|
1762
|
+
{
|
|
1763
|
+
"type": "boolean",
|
|
1764
|
+
"operation": "isEmpty"
|
|
1765
|
+
// Missing singleValue
|
|
1766
|
+
}
|
|
1767
|
+
|
|
1768
|
+
// Auto-sanitization adds it
|
|
1769
|
+
{
|
|
1770
|
+
"type": "boolean",
|
|
1771
|
+
"operation": "isEmpty",
|
|
1772
|
+
"singleValue": true // Added automatically
|
|
1773
|
+
}
|
|
1774
|
+
```
|
|
1775
|
+
|
|
1776
|
+
#### What It Doesn't Fix
|
|
1777
|
+
|
|
1778
|
+
**Missing required fields**:
|
|
1779
|
+
|
|
1780
|
+
```javascript
|
|
1781
|
+
// You configure (missing channel)
|
|
1782
|
+
{
|
|
1783
|
+
"resource": "message",
|
|
1784
|
+
"operation": "post",
|
|
1785
|
+
"text": "Hello"
|
|
1786
|
+
// Missing required field: channel
|
|
1787
|
+
}
|
|
1788
|
+
|
|
1789
|
+
// Auto-sanitization does NOT add
|
|
1790
|
+
// You must add it yourself
|
|
1791
|
+
{
|
|
1792
|
+
"resource": "message",
|
|
1793
|
+
"operation": "post",
|
|
1794
|
+
"channel": "#general", // You must add
|
|
1795
|
+
"text": "Hello"
|
|
1796
|
+
}
|
|
1797
|
+
```
|
|
1798
|
+
|
|
1799
|
+
---
|
|
1800
|
+
|
|
1801
|
+
### Troubleshooting Dependencies
|
|
1802
|
+
|
|
1803
|
+
#### Problem 1: "Field X is required but not visible"
|
|
1804
|
+
|
|
1805
|
+
**Error**:
|
|
1806
|
+
|
|
1807
|
+
```json
|
|
1808
|
+
{
|
|
1809
|
+
"type": "missing_required",
|
|
1810
|
+
"property": "body",
|
|
1811
|
+
"message": "body is required"
|
|
1812
|
+
}
|
|
1813
|
+
```
|
|
1814
|
+
|
|
1815
|
+
**But you don't see body field in configuration!**
|
|
1816
|
+
|
|
1817
|
+
**Solution**:
|
|
1818
|
+
|
|
1819
|
+
```javascript
|
|
1820
|
+
// Check field dependencies using search_properties
|
|
1821
|
+
get_node({
|
|
1822
|
+
nodeType: "nodes-base.httpRequest",
|
|
1823
|
+
mode: "search_properties",
|
|
1824
|
+
propertyQuery: "body"
|
|
1825
|
+
});
|
|
1826
|
+
|
|
1827
|
+
// Find that body shows when sendBody=true
|
|
1828
|
+
// Add sendBody
|
|
1829
|
+
{
|
|
1830
|
+
"method": "POST",
|
|
1831
|
+
"sendBody": true, // Now body appears!
|
|
1832
|
+
"body": {...}
|
|
1833
|
+
}
|
|
1834
|
+
```
|
|
1835
|
+
|
|
1836
|
+
#### Problem 2: "Field disappears when I change operation"
|
|
1837
|
+
|
|
1838
|
+
**Scenario**:
|
|
1839
|
+
|
|
1840
|
+
```javascript
|
|
1841
|
+
// Working configuration
|
|
1842
|
+
{
|
|
1843
|
+
"resource": "message",
|
|
1844
|
+
"operation": "post",
|
|
1845
|
+
"channel": "#general",
|
|
1846
|
+
"text": "Hello"
|
|
1847
|
+
}
|
|
1848
|
+
|
|
1849
|
+
// Change operation
|
|
1850
|
+
{
|
|
1851
|
+
"resource": "message",
|
|
1852
|
+
"operation": "update", // Changed
|
|
1853
|
+
"channel": "#general", // Still here
|
|
1854
|
+
"text": "Updated" // Still here
|
|
1855
|
+
// Missing: messageId (required for update!)
|
|
1856
|
+
}
|
|
1857
|
+
```
|
|
1858
|
+
|
|
1859
|
+
**Validation error**: "messageId is required"
|
|
1860
|
+
|
|
1861
|
+
**Why**: Different operation = different required fields
|
|
1862
|
+
|
|
1863
|
+
**Solution**:
|
|
1864
|
+
|
|
1865
|
+
```javascript
|
|
1866
|
+
// Check requirements for new operation
|
|
1867
|
+
get_node({
|
|
1868
|
+
nodeType: "nodes-base.slack"
|
|
1869
|
+
});
|
|
1870
|
+
|
|
1871
|
+
// Configure for update operation
|
|
1872
|
+
{
|
|
1873
|
+
"resource": "message",
|
|
1874
|
+
"operation": "update",
|
|
1875
|
+
"messageId": "1234567890", // Required for update
|
|
1876
|
+
"text": "Updated",
|
|
1877
|
+
"channel": "#general" // Optional for update
|
|
1878
|
+
}
|
|
1879
|
+
```
|
|
1880
|
+
|
|
1881
|
+
#### Problem 3: "Validation passes but field doesn't save"
|
|
1882
|
+
|
|
1883
|
+
**Scenario**: Field hidden by dependencies after validation
|
|
1884
|
+
|
|
1885
|
+
**Example**:
|
|
1886
|
+
|
|
1887
|
+
```javascript
|
|
1888
|
+
// Configure
|
|
1889
|
+
{
|
|
1890
|
+
"method": "GET",
|
|
1891
|
+
"sendBody": true, // GET doesn't support body
|
|
1892
|
+
"body": {...} // This will be stripped
|
|
1893
|
+
}
|
|
1894
|
+
|
|
1895
|
+
// After save
|
|
1896
|
+
{
|
|
1897
|
+
"method": "GET"
|
|
1898
|
+
// body removed because method=GET hides it
|
|
1899
|
+
}
|
|
1900
|
+
```
|
|
1901
|
+
|
|
1902
|
+
**Solution**: Respect dependencies from the start
|
|
1903
|
+
|
|
1904
|
+
```javascript
|
|
1905
|
+
// Correct approach - check property dependencies
|
|
1906
|
+
get_node({
|
|
1907
|
+
nodeType: "nodes-base.httpRequest",
|
|
1908
|
+
mode: "search_properties",
|
|
1909
|
+
propertyQuery: "body"
|
|
1910
|
+
});
|
|
1911
|
+
|
|
1912
|
+
// See that body only shows for POST/PUT/PATCH/DELETE
|
|
1913
|
+
// Use correct method
|
|
1914
|
+
{
|
|
1915
|
+
"method": "POST",
|
|
1916
|
+
"sendBody": true,
|
|
1917
|
+
"body": {...}
|
|
1918
|
+
}
|
|
1919
|
+
```
|
|
1920
|
+
|
|
1921
|
+
> **Cross-reference**: For interpreting validation errors and profiles, see [validation-expert.md](../validation-expert.md).
|
|
1922
|
+
|
|
1923
|
+
---
|
|
1924
|
+
|
|
1925
|
+
### Advanced Patterns
|
|
1926
|
+
|
|
1927
|
+
#### Pattern 1: Conditional Required with Fallback
|
|
1928
|
+
|
|
1929
|
+
**Example**: Channel can be string OR expression
|
|
1930
|
+
|
|
1931
|
+
```javascript
|
|
1932
|
+
// Option 1: String
|
|
1933
|
+
{
|
|
1934
|
+
"channel": "#general"
|
|
1935
|
+
}
|
|
1936
|
+
|
|
1937
|
+
// Option 2: Expression
|
|
1938
|
+
{
|
|
1939
|
+
"channel": "={{$json.channelName}}"
|
|
1940
|
+
}
|
|
1941
|
+
|
|
1942
|
+
// Validation accepts both
|
|
1943
|
+
```
|
|
1944
|
+
|
|
1945
|
+
#### Pattern 2: Mutually Exclusive Fields
|
|
1946
|
+
|
|
1947
|
+
**Example**: Use either ID or name, not both
|
|
1948
|
+
|
|
1949
|
+
```javascript
|
|
1950
|
+
// Use messageId
|
|
1951
|
+
{
|
|
1952
|
+
"messageId": "1234567890"
|
|
1953
|
+
// name not needed
|
|
1954
|
+
}
|
|
1955
|
+
|
|
1956
|
+
// OR use messageName
|
|
1957
|
+
{
|
|
1958
|
+
"messageName": "thread-name"
|
|
1959
|
+
// messageId not needed
|
|
1960
|
+
}
|
|
1961
|
+
|
|
1962
|
+
// Dependencies ensure only one is required
|
|
1963
|
+
```
|
|
1964
|
+
|
|
1965
|
+
#### Pattern 3: Progressive Complexity
|
|
1966
|
+
|
|
1967
|
+
**Example**: Simple mode vs advanced mode
|
|
1968
|
+
|
|
1969
|
+
```javascript
|
|
1970
|
+
// Simple mode
|
|
1971
|
+
{
|
|
1972
|
+
"mode": "simple",
|
|
1973
|
+
"text": "{{$json.message}}"
|
|
1974
|
+
// Advanced fields hidden
|
|
1975
|
+
}
|
|
1976
|
+
|
|
1977
|
+
// Advanced mode
|
|
1978
|
+
{
|
|
1979
|
+
"mode": "advanced",
|
|
1980
|
+
"attachments": [...],
|
|
1981
|
+
"blocks": [...],
|
|
1982
|
+
"metadata": {...}
|
|
1983
|
+
// Simple field hidden, advanced fields shown
|
|
1984
|
+
}
|
|
1985
|
+
```
|
|
1986
|
+
|
|
1987
|
+
---
|
|
1988
|
+
|
|
1989
|
+
## AI Connection Types
|
|
1990
|
+
|
|
1991
|
+
### Resource/Operation Nodes
|
|
1992
|
+
|
|
1993
|
+
Nodes like Slack, Gmail, and Google Sheets follow the resource/operation pattern where the `resource` selects the entity type and `operation` selects the action. Each combination produces a unique set of required and optional fields.
|
|
1994
|
+
|
|
1995
|
+
### HTTP-Based Nodes
|
|
1996
|
+
|
|
1997
|
+
HTTP Request and Webhook nodes are method-driven. The HTTP method determines which body, query, and header options are available. Authentication type further controls credential fields.
|
|
1998
|
+
|
|
1999
|
+
### Database Nodes
|
|
2000
|
+
|
|
2001
|
+
Postgres, MySQL, and MongoDB nodes are operation-driven. The operation (executeQuery, insert, update, delete) determines which fields (query, table, columns, values, where) are required.
|
|
2002
|
+
|
|
2003
|
+
### Conditional Logic Nodes
|
|
2004
|
+
|
|
2005
|
+
IF and Switch nodes use condition-type-driven configuration. The condition type (string, number, boolean) and operator (binary vs unary) determine which value fields appear.
|
|
2006
|
+
|
|
2007
|
+
### AI/LangChain Nodes
|
|
2008
|
+
|
|
2009
|
+
OpenAI and other LangChain nodes follow the resource/operation pattern but with AI-specific fields like messages, temperature, and maxTokens. System and user message roles control the prompt structure.
|
|
2010
|
+
|
|
2011
|
+
---
|
|
2012
|
+
|
|
2013
|
+
## Common Node Patterns
|
|
2014
|
+
|
|
2015
|
+
### Pattern 1: Resource/Operation Nodes
|
|
2016
|
+
|
|
2017
|
+
**Examples**: Slack, Google Sheets, Airtable
|
|
2018
|
+
|
|
2019
|
+
**Structure**:
|
|
2020
|
+
|
|
2021
|
+
```javascript
|
|
2022
|
+
{
|
|
2023
|
+
"resource": "<entity>", // What type of thing
|
|
2024
|
+
"operation": "<action>", // What to do with it
|
|
2025
|
+
// ... operation-specific fields
|
|
2026
|
+
}
|
|
2027
|
+
```
|
|
2028
|
+
|
|
2029
|
+
**How to configure**:
|
|
2030
|
+
|
|
2031
|
+
1. Choose resource
|
|
2032
|
+
2. Choose operation
|
|
2033
|
+
3. Use get_node to see operation-specific requirements
|
|
2034
|
+
4. Configure required fields
|
|
2035
|
+
|
|
2036
|
+
### Pattern 2: HTTP-Based Nodes
|
|
2037
|
+
|
|
2038
|
+
**Examples**: HTTP Request, Webhook
|
|
2039
|
+
|
|
2040
|
+
**Structure**:
|
|
2041
|
+
|
|
2042
|
+
```javascript
|
|
2043
|
+
{
|
|
2044
|
+
"method": "<HTTP_METHOD>",
|
|
2045
|
+
"url": "<endpoint>",
|
|
2046
|
+
"authentication": "<type>",
|
|
2047
|
+
// ... method-specific fields
|
|
2048
|
+
}
|
|
2049
|
+
```
|
|
2050
|
+
|
|
2051
|
+
**Dependencies**:
|
|
2052
|
+
|
|
2053
|
+
- POST/PUT/PATCH -> sendBody available
|
|
2054
|
+
- sendBody=true -> body required
|
|
2055
|
+
- authentication != "none" -> credentials required
|
|
2056
|
+
|
|
2057
|
+
### Pattern 3: Database Nodes
|
|
2058
|
+
|
|
2059
|
+
**Examples**: Postgres, MySQL, MongoDB
|
|
2060
|
+
|
|
2061
|
+
**Structure**:
|
|
2062
|
+
|
|
2063
|
+
```javascript
|
|
2064
|
+
{
|
|
2065
|
+
"operation": "<query|insert|update|delete>",
|
|
2066
|
+
// ... operation-specific fields
|
|
2067
|
+
}
|
|
2068
|
+
```
|
|
2069
|
+
|
|
2070
|
+
**Dependencies**:
|
|
2071
|
+
|
|
2072
|
+
- operation="executeQuery" -> query required
|
|
2073
|
+
- operation="insert" -> table + values required
|
|
2074
|
+
- operation="update" -> table + values + where required
|
|
2075
|
+
|
|
2076
|
+
### Pattern 4: Conditional Logic Nodes
|
|
2077
|
+
|
|
2078
|
+
**Examples**: IF, Switch, Merge
|
|
2079
|
+
|
|
2080
|
+
**Structure**:
|
|
2081
|
+
|
|
2082
|
+
```javascript
|
|
2083
|
+
{
|
|
2084
|
+
"conditions": {
|
|
2085
|
+
"<type>": [
|
|
2086
|
+
{
|
|
2087
|
+
"operation": "<operator>",
|
|
2088
|
+
"value1": "...",
|
|
2089
|
+
"value2": "..." // Only for binary operators
|
|
2090
|
+
}
|
|
2091
|
+
]
|
|
2092
|
+
}
|
|
2093
|
+
}
|
|
2094
|
+
```
|
|
2095
|
+
|
|
2096
|
+
**Dependencies**:
|
|
2097
|
+
|
|
2098
|
+
- Binary operators (equals, contains, etc.) -> value1 + value2
|
|
2099
|
+
- Unary operators (isEmpty, isNotEmpty) -> value1 only + singleValue: true
|
|
2100
|
+
|
|
2101
|
+
---
|
|
2102
|
+
|
|
2103
|
+
## Operation-Specific Configuration
|
|
2104
|
+
|
|
2105
|
+
### Slack Node Examples
|
|
2106
|
+
|
|
2107
|
+
#### Post Message
|
|
2108
|
+
|
|
2109
|
+
```javascript
|
|
2110
|
+
{
|
|
2111
|
+
"resource": "message",
|
|
2112
|
+
"operation": "post",
|
|
2113
|
+
"channel": "#general", // Required
|
|
2114
|
+
"text": "Hello!", // Required
|
|
2115
|
+
"attachments": [], // Optional
|
|
2116
|
+
"blocks": [] // Optional
|
|
2117
|
+
}
|
|
2118
|
+
```
|
|
2119
|
+
|
|
2120
|
+
#### Update Message
|
|
2121
|
+
|
|
2122
|
+
```javascript
|
|
2123
|
+
{
|
|
2124
|
+
"resource": "message",
|
|
2125
|
+
"operation": "update",
|
|
2126
|
+
"messageId": "1234567890", // Required (different from post!)
|
|
2127
|
+
"text": "Updated!", // Required
|
|
2128
|
+
"channel": "#general" // Optional (can be inferred)
|
|
2129
|
+
}
|
|
2130
|
+
```
|
|
2131
|
+
|
|
2132
|
+
#### Create Channel
|
|
2133
|
+
|
|
2134
|
+
```javascript
|
|
2135
|
+
{
|
|
2136
|
+
"resource": "channel",
|
|
2137
|
+
"operation": "create",
|
|
2138
|
+
"name": "new-channel", // Required
|
|
2139
|
+
"isPrivate": false // Optional
|
|
2140
|
+
// Note: text NOT required for this operation
|
|
2141
|
+
}
|
|
2142
|
+
```
|
|
2143
|
+
|
|
2144
|
+
### HTTP Request Node Examples
|
|
2145
|
+
|
|
2146
|
+
#### GET Request
|
|
2147
|
+
|
|
2148
|
+
```javascript
|
|
2149
|
+
{
|
|
2150
|
+
"method": "GET",
|
|
2151
|
+
"url": "https://api.example.com/users",
|
|
2152
|
+
"authentication": "predefinedCredentialType",
|
|
2153
|
+
"nodeCredentialType": "httpHeaderAuth",
|
|
2154
|
+
"sendQuery": true, // Optional
|
|
2155
|
+
"queryParameters": { // Shows when sendQuery=true
|
|
2156
|
+
"parameters": [
|
|
2157
|
+
{
|
|
2158
|
+
"name": "limit",
|
|
2159
|
+
"value": "100"
|
|
2160
|
+
}
|
|
2161
|
+
]
|
|
2162
|
+
}
|
|
2163
|
+
}
|
|
2164
|
+
```
|
|
2165
|
+
|
|
2166
|
+
#### POST with JSON
|
|
2167
|
+
|
|
2168
|
+
```javascript
|
|
2169
|
+
{
|
|
2170
|
+
"method": "POST",
|
|
2171
|
+
"url": "https://api.example.com/users",
|
|
2172
|
+
"authentication": "none",
|
|
2173
|
+
"sendBody": true, // Required for POST
|
|
2174
|
+
"body": { // Required when sendBody=true
|
|
2175
|
+
"contentType": "json",
|
|
2176
|
+
"content": {
|
|
2177
|
+
"name": "John Doe",
|
|
2178
|
+
"email": "john@example.com"
|
|
2179
|
+
}
|
|
2180
|
+
}
|
|
2181
|
+
}
|
|
2182
|
+
```
|
|
2183
|
+
|
|
2184
|
+
### IF Node Examples
|
|
2185
|
+
|
|
2186
|
+
#### String Comparison (Binary)
|
|
2187
|
+
|
|
2188
|
+
```javascript
|
|
2189
|
+
{
|
|
2190
|
+
"conditions": {
|
|
2191
|
+
"string": [
|
|
2192
|
+
{
|
|
2193
|
+
"value1": "={{$json.status}}",
|
|
2194
|
+
"operation": "equals",
|
|
2195
|
+
"value2": "active" // Binary: needs value2
|
|
2196
|
+
}
|
|
2197
|
+
]
|
|
2198
|
+
}
|
|
2199
|
+
}
|
|
2200
|
+
```
|
|
2201
|
+
|
|
2202
|
+
#### Empty Check (Unary)
|
|
2203
|
+
|
|
2204
|
+
```javascript
|
|
2205
|
+
{
|
|
2206
|
+
"conditions": {
|
|
2207
|
+
"string": [
|
|
2208
|
+
{
|
|
2209
|
+
"value1": "={{$json.email}}",
|
|
2210
|
+
"operation": "isEmpty",
|
|
2211
|
+
// No value2 - unary operator
|
|
2212
|
+
"singleValue": true // Auto-added by sanitization
|
|
2213
|
+
}
|
|
2214
|
+
]
|
|
2215
|
+
}
|
|
2216
|
+
}
|
|
2217
|
+
```
|
|
2218
|
+
|
|
2219
|
+
---
|
|
2220
|
+
|
|
2221
|
+
## Handling Conditional Requirements
|
|
2222
|
+
|
|
2223
|
+
### Example: HTTP Request Body
|
|
2224
|
+
|
|
2225
|
+
**Scenario**: body field required, but only sometimes
|
|
2226
|
+
|
|
2227
|
+
**Rule**:
|
|
2228
|
+
|
|
2229
|
+
```
|
|
2230
|
+
body is required when:
|
|
2231
|
+
- sendBody = true AND
|
|
2232
|
+
- method IN (POST, PUT, PATCH, DELETE)
|
|
2233
|
+
```
|
|
2234
|
+
|
|
2235
|
+
**How to discover**:
|
|
2236
|
+
|
|
2237
|
+
```javascript
|
|
2238
|
+
// Option 1: Read validation error
|
|
2239
|
+
validate_node({...});
|
|
2240
|
+
// Error: "body required when sendBody=true"
|
|
2241
|
+
|
|
2242
|
+
// Option 2: Search for the property
|
|
2243
|
+
get_node({
|
|
2244
|
+
nodeType: "nodes-base.httpRequest",
|
|
2245
|
+
mode: "search_properties",
|
|
2246
|
+
propertyQuery: "body"
|
|
2247
|
+
});
|
|
2248
|
+
// Shows: body property with displayOptions rules
|
|
2249
|
+
|
|
2250
|
+
// Option 3: Try minimal config and iterate
|
|
2251
|
+
// Start without body, validation will tell you if needed
|
|
2252
|
+
```
|
|
2253
|
+
|
|
2254
|
+
### Example: IF Node singleValue
|
|
2255
|
+
|
|
2256
|
+
**Scenario**: singleValue property appears for unary operators
|
|
2257
|
+
|
|
2258
|
+
**Rule**:
|
|
2259
|
+
|
|
2260
|
+
```
|
|
2261
|
+
singleValue should be true when:
|
|
2262
|
+
- operation IN (isEmpty, isNotEmpty, true, false)
|
|
2263
|
+
```
|
|
2264
|
+
|
|
2265
|
+
**Good news**: Auto-sanitization fixes this!
|
|
2266
|
+
|
|
2267
|
+
**Manual check**:
|
|
2268
|
+
|
|
2269
|
+
```javascript
|
|
2270
|
+
get_node({
|
|
2271
|
+
nodeType: "nodes-base.if",
|
|
2272
|
+
detail: "full",
|
|
2273
|
+
});
|
|
2274
|
+
// Shows complete schema with operator-specific rules
|
|
2275
|
+
```
|
|
2276
|
+
|
|
2277
|
+
---
|
|
2278
|
+
|
|
2279
|
+
## Configuration Anti-Patterns
|
|
2280
|
+
|
|
2281
|
+
### Don't: Over-configure Upfront
|
|
2282
|
+
|
|
2283
|
+
**Bad**:
|
|
2284
|
+
|
|
2285
|
+
```javascript
|
|
2286
|
+
// Adding every possible field
|
|
2287
|
+
{
|
|
2288
|
+
"method": "GET",
|
|
2289
|
+
"url": "...",
|
|
2290
|
+
"sendQuery": false,
|
|
2291
|
+
"sendHeaders": false,
|
|
2292
|
+
"sendBody": false,
|
|
2293
|
+
"timeout": 10000,
|
|
2294
|
+
"ignoreResponseCode": false,
|
|
2295
|
+
// ... 20 more optional fields
|
|
2296
|
+
}
|
|
2297
|
+
```
|
|
2298
|
+
|
|
2299
|
+
**Good**:
|
|
2300
|
+
|
|
2301
|
+
```javascript
|
|
2302
|
+
// Start minimal
|
|
2303
|
+
{
|
|
2304
|
+
"method": "GET",
|
|
2305
|
+
"url": "...",
|
|
2306
|
+
"authentication": "none"
|
|
2307
|
+
}
|
|
2308
|
+
// Add fields only when needed
|
|
2309
|
+
```
|
|
2310
|
+
|
|
2311
|
+
### Don't: Skip Validation
|
|
2312
|
+
|
|
2313
|
+
**Bad**:
|
|
2314
|
+
|
|
2315
|
+
```javascript
|
|
2316
|
+
// Configure and deploy without validating
|
|
2317
|
+
const config = {...};
|
|
2318
|
+
n8n_update_partial_workflow({...}); // YOLO
|
|
2319
|
+
```
|
|
2320
|
+
|
|
2321
|
+
**Good**:
|
|
2322
|
+
|
|
2323
|
+
```javascript
|
|
2324
|
+
// Validate before deploying
|
|
2325
|
+
const config = {...};
|
|
2326
|
+
const result = validate_node({...});
|
|
2327
|
+
if (result.valid) {
|
|
2328
|
+
n8n_update_partial_workflow({...});
|
|
2329
|
+
}
|
|
2330
|
+
```
|
|
2331
|
+
|
|
2332
|
+
> **Cross-reference**: For validation profiles and error interpretation, see [validation-expert.md](../validation-expert.md).
|
|
2333
|
+
|
|
2334
|
+
### Don't: Ignore Operation Context
|
|
2335
|
+
|
|
2336
|
+
**Bad**:
|
|
2337
|
+
|
|
2338
|
+
```javascript
|
|
2339
|
+
// Same config for all Slack operations
|
|
2340
|
+
{
|
|
2341
|
+
"resource": "message",
|
|
2342
|
+
"operation": "post",
|
|
2343
|
+
"channel": "#general",
|
|
2344
|
+
"text": "..."
|
|
2345
|
+
}
|
|
2346
|
+
|
|
2347
|
+
// Then switching operation without updating config
|
|
2348
|
+
{
|
|
2349
|
+
"resource": "message",
|
|
2350
|
+
"operation": "update", // Changed
|
|
2351
|
+
"channel": "#general", // Wrong field for update!
|
|
2352
|
+
"text": "..."
|
|
2353
|
+
}
|
|
2354
|
+
```
|
|
2355
|
+
|
|
2356
|
+
**Good**:
|
|
2357
|
+
|
|
2358
|
+
```javascript
|
|
2359
|
+
// Check requirements when changing operation
|
|
2360
|
+
get_node({
|
|
2361
|
+
nodeType: "nodes-base.slack",
|
|
2362
|
+
});
|
|
2363
|
+
// See what update operation needs (messageId, not channel)
|
|
2364
|
+
```
|
|
2365
|
+
|
|
2366
|
+
---
|
|
2367
|
+
|
|
2368
|
+
## Best Practices
|
|
2369
|
+
|
|
2370
|
+
### Do
|
|
2371
|
+
|
|
2372
|
+
1. **Start with get_node (standard detail)**
|
|
2373
|
+
- ~1-2K tokens response
|
|
2374
|
+
- Covers 95% of configuration needs
|
|
2375
|
+
- Default detail level
|
|
2376
|
+
|
|
2377
|
+
2. **Validate iteratively**
|
|
2378
|
+
- Configure -> Validate -> Fix -> Repeat
|
|
2379
|
+
- Average 2-3 iterations is normal
|
|
2380
|
+
- Read validation errors carefully
|
|
2381
|
+
|
|
2382
|
+
3. **Use search_properties mode when stuck**
|
|
2383
|
+
- If field seems missing, search for it
|
|
2384
|
+
- Understand what controls field visibility
|
|
2385
|
+
- `get_node({mode: "search_properties", propertyQuery: "..."})`
|
|
2386
|
+
|
|
2387
|
+
4. **Respect operation context**
|
|
2388
|
+
- Different operations = different requirements
|
|
2389
|
+
- Always check get_node when changing operation
|
|
2390
|
+
- Don't assume configs are transferable
|
|
2391
|
+
|
|
2392
|
+
5. **Trust auto-sanitization**
|
|
2393
|
+
- Operator structure fixed automatically
|
|
2394
|
+
- Don't manually add/remove singleValue
|
|
2395
|
+
- IF/Switch metadata added on save
|
|
2396
|
+
|
|
2397
|
+
6. **Check dependencies when stuck**
|
|
2398
|
+
|
|
2399
|
+
```javascript
|
|
2400
|
+
get_node({
|
|
2401
|
+
nodeType: "...",
|
|
2402
|
+
mode: "search_properties",
|
|
2403
|
+
propertyQuery: "...",
|
|
2404
|
+
});
|
|
2405
|
+
```
|
|
2406
|
+
|
|
2407
|
+
7. **Configure parent properties first**
|
|
2408
|
+
|
|
2409
|
+
```javascript
|
|
2410
|
+
// First: method, resource, operation
|
|
2411
|
+
// Then: dependent fields
|
|
2412
|
+
```
|
|
2413
|
+
|
|
2414
|
+
8. **Validate after changing operation**
|
|
2415
|
+
|
|
2416
|
+
```javascript
|
|
2417
|
+
// Operation changed -> requirements changed
|
|
2418
|
+
validate_node({nodeType: "...", config: {...}, profile: "runtime"});
|
|
2419
|
+
```
|
|
2420
|
+
|
|
2421
|
+
9. **Read validation errors for dependency hints**
|
|
2422
|
+
```
|
|
2423
|
+
Error: "body required when sendBody=true"
|
|
2424
|
+
-> Hint: Set sendBody=true to enable body
|
|
2425
|
+
```
|
|
2426
|
+
|
|
2427
|
+
### Don't
|
|
2428
|
+
|
|
2429
|
+
1. **Jump to detail="full" immediately**
|
|
2430
|
+
- Try standard detail first
|
|
2431
|
+
- Only escalate if needed
|
|
2432
|
+
- Full schema is 3-8K tokens
|
|
2433
|
+
|
|
2434
|
+
2. **Configure blindly**
|
|
2435
|
+
- Always validate before deploying
|
|
2436
|
+
- Understand why fields are required
|
|
2437
|
+
- Use search_properties for conditional fields
|
|
2438
|
+
|
|
2439
|
+
3. **Copy configs without understanding**
|
|
2440
|
+
- Different operations need different fields
|
|
2441
|
+
- Validate after copying
|
|
2442
|
+
- Adjust for new context
|
|
2443
|
+
|
|
2444
|
+
4. **Manually fix auto-sanitization issues**
|
|
2445
|
+
- Let auto-sanitization handle operator structure
|
|
2446
|
+
- Focus on business logic
|
|
2447
|
+
- Save and let system fix structure
|
|
2448
|
+
|
|
2449
|
+
5. **Ignore dependency errors**
|
|
2450
|
+
|
|
2451
|
+
```javascript
|
|
2452
|
+
// Error: "body not visible" -> Check displayOptions
|
|
2453
|
+
```
|
|
2454
|
+
|
|
2455
|
+
6. **Hardcode all possible fields**
|
|
2456
|
+
|
|
2457
|
+
```javascript
|
|
2458
|
+
// Bad: Adding fields that will be hidden
|
|
2459
|
+
```
|
|
2460
|
+
|
|
2461
|
+
7. **Assume operations are identical**
|
|
2462
|
+
```javascript
|
|
2463
|
+
// Each operation has unique requirements
|
|
2464
|
+
```
|
|
2465
|
+
|
|
2466
|
+
---
|
|
2467
|
+
|
|
2468
|
+
## Property Dependencies Summary
|
|
2469
|
+
|
|
2470
|
+
**Key Concepts**:
|
|
2471
|
+
|
|
2472
|
+
- `displayOptions` control field visibility
|
|
2473
|
+
- `show` = field appears when conditions match
|
|
2474
|
+
- `hide` = field disappears when conditions match
|
|
2475
|
+
- Multiple conditions = AND logic
|
|
2476
|
+
- Multiple values = OR logic
|
|
2477
|
+
|
|
2478
|
+
**Common Patterns**:
|
|
2479
|
+
|
|
2480
|
+
1. Boolean toggle (sendBody -> body)
|
|
2481
|
+
2. Resource/operation cascade (different operations -> different fields)
|
|
2482
|
+
3. Type-specific config (string vs boolean conditions)
|
|
2483
|
+
4. Method-specific fields (GET vs POST)
|
|
2484
|
+
|
|
2485
|
+
**Troubleshooting**:
|
|
2486
|
+
|
|
2487
|
+
- Field required but not visible -> Check dependencies
|
|
2488
|
+
- Field disappears after change -> Operation changed requirements
|
|
2489
|
+
- Field doesn't save -> Hidden by dependencies
|
|
2490
|
+
|
|
2491
|
+
**Tools**:
|
|
2492
|
+
|
|
2493
|
+
- `get_node({mode: "search_properties"})` - Find property dependencies
|
|
2494
|
+
- `get_node({detail: "full"})` - See complete schema with displayOptions
|
|
2495
|
+
- `get_node` - See operation requirements (standard detail)
|
|
2496
|
+
- Validation errors - Hints about dependencies
|
|
2497
|
+
|
|
2498
|
+
---
|
|
2499
|
+
|
|
2500
|
+
## Summary
|
|
2501
|
+
|
|
2502
|
+
**Configuration Strategy**:
|
|
2503
|
+
|
|
2504
|
+
1. Start with `get_node` (standard detail is default)
|
|
2505
|
+
2. Configure required fields for operation
|
|
2506
|
+
3. Validate configuration
|
|
2507
|
+
4. Search properties if stuck
|
|
2508
|
+
5. Iterate until valid (avg 2-3 cycles)
|
|
2509
|
+
6. Deploy with confidence
|
|
2510
|
+
|
|
2511
|
+
**Key Principles**:
|
|
2512
|
+
|
|
2513
|
+
- **Operation-aware**: Different operations = different requirements
|
|
2514
|
+
- **Progressive disclosure**: Start minimal, add as needed
|
|
2515
|
+
- **Dependency-aware**: Understand field visibility rules
|
|
2516
|
+
- **Validation-driven**: Let validation guide configuration
|
|
2517
|
+
|
|
2518
|
+
**Related Skills**:
|
|
2519
|
+
|
|
2520
|
+
- **[mcp-tools-expert.md](../mcp-tools-expert.md)** - How to use discovery tools correctly (get_node modes and parameters)
|
|
2521
|
+
- **[validation-expert.md](../validation-expert.md)** - Interpret validation errors and profiles
|
|
2522
|
+
- **[workflow-patterns.md](../workflow-patterns.md)** - Apply patterns with proper configuration within workflow compositions
|
|
2523
|
+
- **n8n Expression Syntax** - Configure expression fields
|