with one click
n8n-architect
// Use when the user explicitly wants to create, edit, validate, sync, or troubleshoot n8n workflows, asks about n8n nodes or automation, or wants to use n8n-as-code in the current context root.
// Use when the user explicitly wants to create, edit, validate, sync, or troubleshoot n8n workflows, asks about n8n nodes or automation, or wants to use n8n-as-code in the current context root.
| name | n8n-architect |
| description | Use when the user explicitly wants to create, edit, validate, sync, or troubleshoot n8n workflows, asks about n8n nodes or automation, or wants to use n8n-as-code in the current context root. |
Use this skill for all n8n-as-code work: workspace readiness, migration, environments, managed local instances, tunnels, workflow authoring, validation, sync, push, and pull.
Use {{N8NAC_CMD}} as the primary interface. Use {{N8N_MANAGER_CMD}} only for local managed runtime lifecycle, tunnels, and workflow presentation commands that are explicitly exposed by n8n-manager.
n8nac-config.json, AGENTS.md, .agents/skills, and the configured workflowsPath.{{N8NAC_CMD}} update-ai from the context root, then read AGENTS.md. update-ai is designed to create or refresh the n8n-as-code block without destroying existing user or agent instructions.n8nac command and n8n-manager command listed in AGENTS.md. Those context-root commands override the portable examples in this skill.{{N8NAC_CMD}} env ..., {{N8NAC_CMD}} workspace ..., {{N8NAC_CMD}} list, pull, push, validate, test, and update-ai command from the context root unless the user explicitly gives another context root.AGENTS.md is bootstrap context only, not a source of configuration truth.workflowsPath from AGENTS.md.{{N8NAC_CMD}} env status --json
workflowsPath for workflow files. It is the configured workflow directory for the active environment.workflowsPath from environment name/id, instanceIdentifier, instanceUserIdentifier, projectId, projectName, or legacy sync fields.n8nac-config.json, ~/.n8n-manager, or n8n-manager secret files by hand.Use the unified migration preflight before resolving the effective environment. The dry-run is safe and reports whether any workspace migration is required:
{{N8NAC_CMD}} workspace migrate --json
{{N8NAC_CMD}} env status --json
workspace migrate --json as the source of migration need.env status --json as the source of effective workspace readiness only after migration is not required or has been applied.Migration is one user-facing command. Do not reason about internal migration phases directly; summarize the report operations array when explaining what will change.
{{N8NAC_CMD}} workspace migrate --json
status: "dry-run", required: true, or otherwise indicates pending changes, stop and ask once before applying it. Do not run workspace migrate --write unless the user already directly requested applying migration.{{N8NAC_CMD}} workspace migrate --write
{{N8NAC_CMD}} workspace migrate --json
{{N8NAC_CMD}} env status --json
workspace migrate --write without explicit confirmation unless the user already directly requested applying migration.operations list and ask for exactly one confirmation for {{N8NAC_CMD}} workspace migrate --write.{{N8NAC_CMD}} workspace migrate --write applies the required migration as one operation.workspace migrate --json still reports migration required.{{N8NAC_CMD}} env ....cd to the context root.{{N8NAC_CMD}} update-ai, then read AGENTS.md.{{N8NAC_CMD}} workspace migrate --json.{{N8NAC_CMD}} workspace migrate --write unless the user already requested applying migration.{{N8NAC_CMD}} env status --json after migration is not required or has been applied.{{N8N_MANAGER_CMD}} instance list.{{N8NAC_CMD}} env add <name> --base-url <url> --workflows-path workflows/<name>
{{N8NAC_CMD}} env auth set <name> --api-key-stdin
{{N8NAC_CMD}} env use <name>
For a managed local instance:
{{N8NAC_CMD}} env add Local --managed-instance <id> --workflows-path workflows/local
{{N8NAC_CMD}} env use Local
{{N8NAC_CMD}} update-ai after changing environments when the facade does not do it automatically.Use {{N8NAC_CMD}} env ... for workspace environments, remote URLs, active environment, API-key binding, projects, and workflow paths.
{{N8NAC_CMD}} env status --json
{{N8NAC_CMD}} env list
{{N8NAC_CMD}} env add <name> --base-url <url> --workflows-path workflows/<name>
{{N8NAC_CMD}} env auth set <name> --api-key-stdin
{{N8NAC_CMD}} env use <name>
--api-key-stdin for API keys.{{N8NAC_CMD}} env --help or {{N8NAC_CMD}} env <subcommand> --help.Attach a managed local instance to the workspace with {{N8NAC_CMD}} env ...:
{{N8NAC_CMD}} env add Local --managed-instance <id> --workflows-path workflows/local
{{N8NAC_CMD}} env use Local
Use {{N8N_MANAGER_CMD}} only for local managed instance lifecycle, tunnels, and workflow presentation commands that are part of the local runtime layer.
Inspect existing managed instances before changing local machine state:
{{N8N_MANAGER_CMD}} instance list
{{N8N_MANAGER_CMD}} instance --help
{{N8N_MANAGER_CMD}} config get
Do not invent n8n-manager subcommands. Use {{N8N_MANAGER_CMD}} <subcommand> --help when unsure.
When the context root is not configured and no suitable existing instance is available, stop and ask the user to choose. Do not create infrastructure by default.
Present these choices clearly:
{{N8NAC_CMD}} env.If the user chooses a managed local Docker instance, ask the tunnel question separately:
Do not enable, refresh, or start a public tunnel unless the user explicitly requested public access, webhook testing, or approved the tunnel option. If public access is not needed, create/start the managed instance without --tunnel.
Only run these commands after the user has explicitly chosen the corresponding option.
Managed local instance without public tunnel:
{{N8N_MANAGER_CMD}} instance create
{{N8N_MANAGER_CMD}} instance start <id>
{{N8N_MANAGER_CMD}} instance list
Managed local instance with public tunnel:
{{N8N_MANAGER_CMD}} instance create
{{N8N_MANAGER_CMD}} instance start <id>
{{N8N_MANAGER_CMD}} tunnel start <id>
Instance and tunnel operations are per managed local instance:
{{N8N_MANAGER_CMD}} instance start <id>
{{N8N_MANAGER_CMD}} instance stop <id>
{{N8N_MANAGER_CMD}} instance remove <id>
{{N8N_MANAGER_CMD}} tunnel start <id>
{{N8N_MANAGER_CMD}} tunnel stop <id>
list to inspect workflow IDs, file paths, and sync status.{{N8NAC_CMD}} list
{{N8NAC_CMD}} pull <workflowId>
{{N8NAC_CMD}} push <path-to-workflow.workflow.ts> --verify
push requires the full workflow file path, either absolute or context-root-relative. Do not pass a bare filename.workflowsPath returned by env status --json, then confirm it with {{N8NAC_CMD}} list --local.pull and conflict resolution operate on a single workflow ID.list is the lightweight command that covers all workflows at once.If push or pull reports a conflict, stop and inspect the conflict. Use explicit resolution commands only after choosing the intended direction:
{{N8NAC_CMD}} resolve <workflowId> --mode keep-current
{{N8NAC_CMD}} resolve <workflowId> --mode keep-incoming
keep-current force-pushes the local version.keep-incoming force-pulls the remote version.Never guess n8n node parameters.
{{N8NAC_SKILLS_CMD}} examples search "<workflow pattern>"
{{N8NAC_SKILLS_CMD}} search "<node or capability>"
{{N8NAC_SKILLS_CMD}} node-info <nodeName>
{{N8NAC_SKILLS_CMD}} validate <workflow.workflow.ts>
type and valid typeVersion values from node-info.typeVersion returned by schema output.node-info output before writing values.Use these commands instead of guessing:
{{N8NAC_SKILLS_CMD}} search "<node or capability>"
{{N8NAC_SKILLS_CMD}} node-info <nodeName>
{{N8NAC_SKILLS_CMD}} node-schema <nodeName>
{{N8NAC_SKILLS_CMD}} docs "<topic>"
{{N8NAC_SKILLS_CMD}} guides "<topic>"
{{N8NAC_SKILLS_CMD}} examples search "<workflow pattern>"
{{N8NAC_SKILLS_CMD}} examples info <id>
{{N8NAC_SKILLS_CMD}} examples download <id>
examples search when the user asks for a common automation pattern.{{N8NAC_CMD}} <subcommand> --help; do not invent flags.@n8n-as-code/transformer.source.out(0).to(target.in(0))..uses(), never .out().to().ai_tool and ai_document connections are arrays: ai_tool: [this.Tool.output].ai_languageModel: this.Model.output.node-info for connection-dependent boolean flags before declaring .uses() connections.Every .workflow.ts file starts with a <workflow-map> block. Read that map first, locate the property name you need, then read only the relevant class section.
import { workflow, node, links } from '@n8n-as-code/transformer';
@workflow({
name: 'Workflow Name',
active: false
})
export class MyWorkflow {
@node({
name: 'Descriptive Name',
type: '/* exact type from node-info */',
version: 4,
position: [250, 300]
})
MyNode = {
/* parameters from node-info */
};
@node({
name: 'Next Node',
type: '/* exact type from node-info */',
version: 3,
position: [520, 300]
})
NextNode = {};
@links()
defineRouting() {
this.MyNode.out(0).to(this.NextNode.in(0));
}
}
{{ $json.fieldName }}.{{ $('Node Name').item.json.field }}.$node["Name"].json.field unless you are preserving an existing workflow and have a reason.value1 is the expression being evaluated and value2 is the literal comparison value.Get Customers, Send Slack Alert, or Normalize Payload.Node1, HTTP Request, or Code when a more specific name is available.Use the <workflow-map> block as the index before loading large workflow files.
// <workflow-map>
// Workflow : My Workflow
// Nodes : 12 | Connections: 14
//
// NODE INDEX
// Property name Node type (short) Flags
// ScheduleTrigger scheduleTrigger
// AgentGenerateApplication agent [AI] [creds]
// OpenaiChatModel lmChatOpenAi [creds] [ai_languageModel]
// Memory memoryBufferWindow [ai_memory]
// GithubCheckBranchRef httpRequest [onError->out(1)]
//
// ROUTING MAP
// ScheduleTrigger
// -> Configuration
// -> BuildProfileSources -> LoopOverProfileSources
//
// AI CONNECTIONS
// AgentGenerateApplication.uses({ ai_languageModel: OpenaiChatModel, ai_memory: Memory })
// </workflow-map>
Navigation rule:
<workflow-map> first.AI sub-nodes are not regular data-flow nodes.
@links()
defineRouting() {
this.ChatTrigger.out(0).to(this.AiAgent.in(0));
this.AiAgent.uses({
ai_languageModel: this.OpenaiModel.output,
ai_memory: this.Memory.output,
ai_outputParser: this.OutputParser.output,
ai_tool: [this.SearchTool.output],
});
}
.uses() for language models, memory, tools, parsers, embeddings, vector stores, retrievers, and other AI sub-nodes..out().to().ai_tool and ai_document must be arrays.node-info before declaring .uses()..out().to().ai_tool: this.Tool.output instead of ai_tool: [this.Tool.output].value1 and value2.formFieldsUi.fieldItems when the current schema expects formFields: { values: [...] }.push.After pushing:
{{N8NAC_CMD}} verify <workflowId>
{{N8NAC_CMD}} test-plan <workflowId> --json
For webhook, chat, or form workflows, prefer the production test sequence:
{{N8NAC_CMD}} workflow activate <workflowId>
{{N8NAC_CMD}} test <workflowId> --prod
{{N8NAC_CMD}} workflow present is the standard way to show a workflow to the user. It is v4-environment aware and part of the workflow authoring loop.
Run it whenever one of these is true:
{{N8NAC_CMD}} workflow present <workflowId> --json
Rules:
url returned by workflow present --json as the user-facing URL.{{N8NAC_CMD}} list first and select the matching workflow.{{N8N_MANAGER_CMD}} presentWorkflowResult; it is a legacy runtime command and is not workspace-environment aware.workflow present fails, report the backend diagnostic and then provide the best direct n8n URL only as a fallback.For webhook, chat, or form workflows:
test-plan to inspect trigger type, endpoint, and suggested payload.--prod by default.{{N8NAC_CMD}} push <path-to-workflow.workflow.ts> --verify
{{N8NAC_CMD}} test-plan <workflowId> --json
{{N8NAC_CMD}} workflow activate <workflowId>
{{N8NAC_CMD}} test <workflowId> --prod
Use bare {{N8NAC_CMD}} test <workflowId> only when a test URL was intentionally armed in the n8n editor.
For GET/HEAD webhooks that read from $json.query, prefer:
{{N8NAC_CMD}} test <workflowId> --query '{"key":"value"}' --prod
If a webhook returns success but the workflow behavior is wrong, inspect executions instead of guessing:
{{N8NAC_CMD}} execution list --workflow-id <workflowId> --limit 5 --json
{{N8NAC_CMD}} execution get <executionId> --include-data --json
When a workflow is blocked by missing credentials, resolve the credential gap without rewriting unrelated workflow logic.
{{N8NAC_CMD}} workflow credential-required <workflowId> --json
{{N8NAC_CMD}} credential schema <type>
{{N8NAC_CMD}} credential list --json
{{N8NAC_CMD}} credential create --type <type> --name <name> --file cred.json --json
{{N8NAC_CMD}} workflow activate <workflowId>
workflow credential-required exits non-zero when at least one credential is missing. Treat that as a signal to act, not as a workflow-code failure.credential schema to discover required fields.--file for credential creation. Do not pass secrets inline in shell arguments.For most workflow tasks:
env status --json.workflowsPath from the backend response.list..workflow.ts file.--verify.{{N8NAC_CMD}} workflow present <workflowId> --json.{{N8NAC_CMD}} workflow present <workflowId> --json instead of composing a URL manually.n8nac env ... for workspace environments and n8n-manager only for managed local instances.Use when the user explicitly wants to create, edit, validate, sync, or troubleshoot n8n workflows, asks about n8n nodes or automation, or wants to use n8n-as-code in the current context root.
Use when the user explicitly wants to create, edit, validate, sync, or troubleshoot n8n workflows, asks about n8n nodes or automation, or wants to use n8n-as-code in the current context root.