[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-n8n-io-n8n-.claude-skills-n8n-conventions":3},{"error":4,"detail":5,"metadata":24,"markdownContent":25,"rawMarkdown":21},false,{"repo_full_name":6,"owner":7,"repo_name":8,"repo_forks":9,"skill_path":10,"repo_stars":11,"name":12,"category_id":13,"description":14,"file_tree":15,"skill_md_content":21,"skill_id":22,"skill_key":23},"n8n-io/n8n","n8n-io","n8n",55946,".claude/skills/n8n-conventions",179914,"n8n-conventions",1,"Quick reference for n8n patterns. Full docs /AGENTS.md",[16],{"name":17,"path":18,"size":19,"type":20},"SKILL.md",".claude/skills/n8n-conventions/SKILL.md",2407,"file","---\nname: n8n-conventions\ndescription: Quick reference for n8n patterns. Full docs /AGENTS.md\n---\n\n# n8n Quick Reference\n\n**📚 Full Documentation:**\n- **General:** `/AGENTS.md` - Architecture, commands, workflows\n- **Frontend:** `/packages/frontend/AGENTS.md` - CSS variables, timing\n\nUse this skill when you need quick reminders on critical patterns.\n\n## Critical Rules (Must Follow)\n\n**TypeScript:**\n- Never `any` → use `unknown`\n- Prefer `satisfies` over `as` (except tests)\n- Shared types in `@n8n/api-types`\n\n**Error Handling:**\n```typescript\nimport { UnexpectedError } from 'n8n-workflow';\nthrow new UnexpectedError('message', { extra: { context } });\n// DON'T use deprecated ApplicationError\n```\n\n**Frontend:**\n- Vue 3 Composition API (`\u003Cscript setup lang=\"ts\">`)\n- CSS variables (never hardcode px) - see `/packages/frontend/AGENTS.md`\n- All text via i18n (`$t('key')`)\n- `data-testid` for E2E (single value, no spaces)\n\n**Backend:**\n- Controller → Service → Repository\n- Dependency injection via `@n8n/di`\n- Config via `@n8n/config`\n- Zod schemas for validation\n\n**Testing:**\n- Vitest (unit), Playwright (E2E)\n- Mock external dependencies\n- Work from package directory: `pushd packages/cli && pnpm test`\n\n**Database:**\n- SQLite/PostgreSQL only (app DB)\n- Exception: DB nodes (MySQL Node, etc.) can use DB-specific features\n\n**Commands:**\n```bash\npnpm build > build.log 2>&1  # Always redirect\npnpm typecheck               # Before commit\npnpm lint                    # Before commit\n```\n\n## Key Packages\n\n| Package | Purpose |\n|---------|---------|\n| `packages/cli` | Backend API |\n| `packages/frontend/editor-ui` | Vue 3 frontend |\n| `packages/@n8n/api-types` | Shared types |\n| `packages/@n8n/db` | TypeORM entities |\n| `packages/workflow` | Core interfaces |\n\n## Common Patterns\n\n**Pinia Store:**\n```typescript\nimport { STORES } from '@n8n/stores';\nexport const useMyStore = defineStore(STORES.MY_STORE, () => {\n  const state = shallowRef([]);\n  return { state };\n});\n```\n\n**Vue Component:**\n```vue\n\u003Cscript setup lang=\"ts\">\ntype Props = { title: string };\nconst props = defineProps\u003CProps>();\n\u003C/script>\n```\n\n**Service:**\n```typescript\nimport { Service } from '@n8n/di';\nimport { Config } from '@n8n/config';\n\n@Service()\nexport class MyService {\n  constructor(private readonly config: Config) {}\n}\n```\n\n---\n\n📖 **Need more details?** Read `/AGENTS.md` and `/packages/frontend/AGENTS.md`\n","5f602591-5a9b-5d2c-8d73-0ace48e232e3","n8n-io-n8n-.claude-skills-n8n-conventions",{"name":12,"description":14},"\u003Ch1>n8n Quick Reference\u003C/h1>\n\u003Cp>\u003Cstrong>📚 Full Documentation:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>General:\u003C/strong> \u003Ccode>/AGENTS.md\u003C/code> - Architecture, commands, workflows\u003C/li>\n\u003Cli>\u003Cstrong>Frontend:\u003C/strong> \u003Ccode>/packages/frontend/AGENTS.md\u003C/code> - CSS variables, timing\u003C/li>\n\u003C/ul>\n\u003Cp>Use this skill when you need quick reminders on critical patterns.\u003C/p>\n\u003Ch2>Critical Rules (Must Follow)\u003C/h2>\n\u003Cp>\u003Cstrong>TypeScript:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Never \u003Ccode>any\u003C/code> → use \u003Ccode>unknown\u003C/code>\u003C/li>\n\u003Cli>Prefer \u003Ccode>satisfies\u003C/code> over \u003Ccode>as\u003C/code> (except tests)\u003C/li>\n\u003Cli>Shared types in \u003Ccode>@n8n/api-types\u003C/code>\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Cstrong>Error Handling:\u003C/strong>\u003C/p>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">typescript\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-typescript\">\u003Cspan class=\"hljs-keyword\">import\u003C/span> { \u003Cspan class=\"hljs-title class_\">UnexpectedError\u003C/span> } \u003Cspan class=\"hljs-keyword\">from\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;n8n-workflow&#x27;\u003C/span>;\n\u003Cspan class=\"hljs-keyword\">throw\u003C/span> \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">UnexpectedError\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;message&#x27;\u003C/span>, { \u003Cspan class=\"hljs-attr\">extra\u003C/span>: { context } });\n\u003Cspan class=\"hljs-comment\">// DON&#x27;T use deprecated ApplicationError\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003Cp>\u003Cstrong>Frontend:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Vue 3 Composition API (\u003Ccode>&lt;script setup lang=&quot;ts&quot;&gt;\u003C/code>)\u003C/li>\n\u003Cli>CSS variables (never hardcode px) - see \u003Ccode>/packages/frontend/AGENTS.md\u003C/code>\u003C/li>\n\u003Cli>All text via i18n (\u003Ccode>$t(&#39;key&#39;)\u003C/code>)\u003C/li>\n\u003Cli>\u003Ccode>data-testid\u003C/code> for E2E (single value, no spaces)\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Cstrong>Backend:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Controller → Service → Repository\u003C/li>\n\u003Cli>Dependency injection via \u003Ccode>@n8n/di\u003C/code>\u003C/li>\n\u003Cli>Config via \u003Ccode>@n8n/config\u003C/code>\u003C/li>\n\u003Cli>Zod schemas for validation\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Cstrong>Testing:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Vitest (unit), Playwright (E2E)\u003C/li>\n\u003Cli>Mock external dependencies\u003C/li>\n\u003Cli>Work from package directory: \u003Ccode>pushd packages/cli &amp;&amp; pnpm test\u003C/code>\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Cstrong>Database:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>SQLite/PostgreSQL only (app DB)\u003C/li>\n\u003Cli>Exception: DB nodes (MySQL Node, etc.) can use DB-specific features\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Cstrong>Commands:\u003C/strong>\u003C/p>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">bash\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-bash\">pnpm build &gt; build.log 2&gt;&amp;1  \u003Cspan class=\"hljs-comment\"># Always redirect\u003C/span>\npnpm typecheck               \u003Cspan class=\"hljs-comment\"># Before commit\u003C/span>\npnpm lint                    \u003Cspan class=\"hljs-comment\"># Before commit\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003Ch2>Key Packages\u003C/h2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Package\u003C/th>\n\u003Cth>Purpose\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>packages/cli\u003C/code>\u003C/td>\n\u003Ctd>Backend API\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>packages/frontend/editor-ui\u003C/code>\u003C/td>\n\u003Ctd>Vue 3 frontend\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>packages/@n8n/api-types\u003C/code>\u003C/td>\n\u003Ctd>Shared types\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>packages/@n8n/db\u003C/code>\u003C/td>\n\u003Ctd>TypeORM entities\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>packages/workflow\u003C/code>\u003C/td>\n\u003Ctd>Core interfaces\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\n\u003Ch2>Common Patterns\u003C/h2>\n\u003Cp>\u003Cstrong>Pinia Store:\u003C/strong>\u003C/p>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">typescript\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-typescript\">\u003Cspan class=\"hljs-keyword\">import\u003C/span> { \u003Cspan class=\"hljs-variable constant_\">STORES\u003C/span> } \u003Cspan class=\"hljs-keyword\">from\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;@n8n/stores&#x27;\u003C/span>;\n\u003Cspan class=\"hljs-keyword\">export\u003C/span> \u003Cspan class=\"hljs-keyword\">const\u003C/span> useMyStore = \u003Cspan class=\"hljs-title function_\">defineStore\u003C/span>(\u003Cspan class=\"hljs-variable constant_\">STORES\u003C/span>.\u003Cspan class=\"hljs-property\">MY_STORE\u003C/span>, \u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> {\n  \u003Cspan class=\"hljs-keyword\">const\u003C/span> state = \u003Cspan class=\"hljs-title function_\">shallowRef\u003C/span>([]);\n  \u003Cspan class=\"hljs-keyword\">return\u003C/span> { state };\n});\u003C/code>\u003C/pre>\u003C/div>\u003Cp>\u003Cstrong>Vue Component:\u003C/strong>\u003C/p>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">vue\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-plaintext\">&lt;script setup lang=&quot;ts&quot;&gt;\ntype Props = { title: string };\nconst props = defineProps&lt;Props&gt;();\n&lt;/script&gt;\u003C/code>\u003C/pre>\u003C/div>\u003Cp>\u003Cstrong>Service:\u003C/strong>\u003C/p>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">typescript\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-typescript\">\u003Cspan class=\"hljs-keyword\">import\u003C/span> { \u003Cspan class=\"hljs-title class_\">Service\u003C/span> } \u003Cspan class=\"hljs-keyword\">from\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;@n8n/di&#x27;\u003C/span>;\n\u003Cspan class=\"hljs-keyword\">import\u003C/span> { \u003Cspan class=\"hljs-title class_\">Config\u003C/span> } \u003Cspan class=\"hljs-keyword\">from\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;@n8n/config&#x27;\u003C/span>;\n\n\u003Cspan class=\"hljs-meta\">@Service\u003C/span>()\n\u003Cspan class=\"hljs-keyword\">export\u003C/span> \u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">MyService\u003C/span> {\n  \u003Cspan class=\"hljs-title function_\">constructor\u003C/span>(\u003Cspan class=\"hljs-params\">\u003Cspan class=\"hljs-keyword\">private\u003C/span> \u003Cspan class=\"hljs-keyword\">readonly\u003C/span> \u003Cspan class=\"hljs-attr\">config\u003C/span>: \u003Cspan class=\"hljs-title class_\">Config\u003C/span>\u003C/span>) {}\n}\u003C/code>\u003C/pre>\u003C/div>\u003Chr>\n\u003Cp>📖 \u003Cstrong>Need more details?\u003C/strong> Read \u003Ccode>/AGENTS.md\u003C/code> and \u003Ccode>/packages/frontend/AGENTS.md\u003C/code>\u003C/p>\n"]