N8N EVOL I

A harness to help coding agents build, deploy, maintain, and debug multi-workflow n8n-powered automation systems. No lock-in — work from the agent, continue from the n8n UI, hand back to the agent at any time.

Audits

Pass

Install

openclaw skills install n8n-evol-i

n8n-evol-I skill router

This is the entry point. When the user asks anything n8n-related, route to the matching sub-skill.

Mental model

  • The skill package (this directory) is read-only. You never edit files here.
  • The user's project state lives in ${PWD}/n8n-evol-I-workspace/ (created by init.md).
  • Helpers are Python scripts under helpers/. Invoke them with python3 ${CLAUDE_PLUGIN_ROOT}/helpers/<name>.py [args] (plugin mode) or python3 <path-to-harness>/helpers/<name>.py [args] (skill mode).
  • All helpers default to --workspace ${PWD}/n8n-evol-I-workspace. Pass --workspace <path> if the user runs from elsewhere.
  • Agent memory: read N8N-WORKSPACE-MEMORY.md in the workspace at the start of every session; append a dated entry whenever you learn something durable about this project. Full guidance in AGENTS.md (also in the workspace root).

Lifecycle skills (use when the user wants to do X)

SkillWhen
init.mdFirst-time setup. Creates the workspace at ${PWD}/n8n-evol-I-workspace/.
bootstrap-env.mdConfigure an environment (dev / staging / prod). Creates env YAML + .env, validates, mints placeholder workflow IDs.
doctor.mdHealth check. Run before/after major changes.
create-new-workflow.mdAuthor a brand-new workflow.
register-workflow-to-error-handler.mdWire settings.errorWorkflow.
create-lock.mdFirst-time setup for distributed locking (Redis-backed primitives).
copy-primitive.mdCopy a single primitive (any) into the workspace. General-purpose; doesn't register.
add-lock-to-workflow.mdWrap a workflow's main flow in lock acquire/release.
add-rate-limit-to-workflow.mdGate a workflow's main flow with a Redis-backed fixed-window rate-limit check.
tidy-workflow.mdApply n8n's canvas-layout algorithm to a workflow template to clean up node positions.
deploy.mdDeploy one workflow to one env.
activate-single-workflow-in-env.mdActivate after deploy.
deactivate-single-workflow-in-env.mdPause triggers (commonly during dev).
archive-workflow.mdRetire a deployed workflow (hidden + read-only on the live instance).
unarchive-workflow.mdRestore a previously-archived workflow so it accepts updates again.
deploy_all.mdRoll out an entire env in tier order.
resync.mdPull live state of one workflow back into its template.
resync_all.mdSnapshot a full env back to templates.
dehydrate-workflow.mdConvert raw exported JSON into a template.
validate.mdStructural REST validation before deploy.
run.mdFire a webhook + assert terminal status.
debug.mdInvestigate a failing or missing execution — from vague symptom to root-cause with evidence.
deploy-run-assert.mdOne-shot validate → deploy → run verify.
find-skills.mdWhile authoring, find applicable patterns/integrations.
manage-credentials.mdCreate or link n8n credentials (Path A from .env.<env> / Path B from existing UI credential).
add-cloud-function.mdScaffold a Python serverless function / cloud function / serverless API under <workspace>/cloud-functions/.
iterate-prompt.mdOptimize a prompt against a paired schema + dataset using DSPy.
test.mdRun unit tests over n8n Code-node JS and / or cloud-function Python.

Pattern skills (read-only knowledge)

These are reference docs, not action triggers. Read them while authoring.

Integration skills (per-service quirks)

Placeholder syntax (workflow templates)

Templates use {{@:type:path}} (preferred form) or the canonical long form {{INTERPOLATE:type:path}}. The two are equivalent — @ is an alias for INTERPOLATE. Examples below use the @ form.

TypeSyntaxSource
env{{@:env:key.path}}YAML config value (dot notation)
txt{{@:txt:relative/path.txt}}Text file in workspace
json{{@:json:relative/path.json}}JSON file (stringified)
html{{@:html:relative/path.html}}HTML file
js{{@:js:relative/path.js}}JavaScript file
py{{@:py:relative/path.py}}Python file (Code-node language: python)
uuid{{@:uuid:identifier}}Fresh UUID v4 (consistent within one hydration)