
n8n:create-community-node-lint-rule
Create new ESLint rules for the @n8n/eslint-plugin-community-nodes package. Use when adding a lint rule, creating a community node lint, or working on eslint-plugin-community-nodes. Guides rule implementation, tests, docs, and plugin registration.
- Installs
- 236
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/n8n-io/n8n --skill n8n:create-community-node-lint-rule- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads n8n:create-community-node-lint-rule automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Create Community Node Lint Rule
Guide for adding new ESLint rules to packages/@n8n/eslint-plugin-community-nodes/.
All paths below are relative to packages/@n8n/eslint-plugin-community-nodes/.
Step 1: Understand the Rule
Before writing code, clarify:
- What does the rule detect? (missing property, wrong pattern, bad value)
- Where does it apply? (
.node.tsfiles, credential classes, both) - Severity:
error(must fix) orwarn(should fix)? - Fixable? Can it be auto-fixed safely, or only suggest?
- Scope: Both
recommendedconfigs, or exclude fromrecommendedWithoutN8nCloudSupport?
Step 2: Implement the Rule
Create src/rules/<rule-name>.ts:
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
import {
isNodeTypeClass, // or isCredentialTypeClass
findClassProperty,
findObjectProperty,
createRule,
} from '../utils/index.js';
export const YourRuleNameRule = createRule({
name: 'rule-name',
meta: {
type: 'problem', // or 'suggestion'
docs: {
description: 'One-line description of what the rule enforces',
},
messages: {
messageId: 'Human-readable message. Use {{placeholder}} for dynamic data.',
},
fixable: 'code', // omit if not auto-fixable
hasSuggestions: true, // omit if no suggestions
schema: [], // add options schema if configurable
},
defaultOptions: [],
create(context) {
return {
ClassDeclaration(node) {
if (!isNodeTypeClass(node)) return;
const descriptionProperty = findClassProperty(node, 'description');
if (!descriptionProperty) return;
const descriptionValue = descriptionProperty.value;
if (descriptionValue?.type !== AST_NODE_TYPES.ObjectExpression) return;
// Rule logic here — use findObjectProperty(), getLiteralValue(), etc.
context.report({
node: targetNode,
messageId: 'messageId',
data: { /* template vars */ },
fix(fixer) {
return fixer.replaceText(targetNode, 'replacement');
},
});
},
};
},
});
Naming: Export as PascalCaseRule (e.g. MissingPairedItemRule). The name field is kebab-case.
Available AST helpers — see reference.md for the full catalog of ast-utils and file-utils exports.
Step 3: Write Tests
Create src/rules/<rule-name>.test.ts:
import { RuleTester } from '@typescript-eslint/rule-tester';
import { YourRuleNameRule } from './rule-name.js';
const ruleTester = new RuleTester();
// Helper to generate test code — keeps test cases readable
function createNodeCode(/* parameterize the varying parts */): string {
return `
import type { INodeType, INodeTypeDescription } from 'n8n-workflow';
export class TestNode implements INodeType {
description: INodeTypeDescription = {
displayName: 'Test Node',
name: 'testNode',
group: ['input'],
version: 1,
description: 'A test node',
defaults: { name: 'Test Node' },
inputs: [],
outputs: [],
properties: [],
};
}`;
}
ruleTester.run('rule-name', YourRuleNameRule, {
valid: [
{ name: 'class that does not implement INodeType', code: '...' },
{ name: 'node with correct pattern', code: createNodeCode(/* correct */) },
],
invalid: [
{
name: 'descriptive case name',
code: createNodeCode(/* incorrect */),
errors: [{ messageId: 'messageId', data: { /* expected template vars */ } }],
output: createNodeCode(/* expected after fix */), // or `output: null` if no fix
},
],
});
Test guidelines:
- Always test that non-INodeType classes are skipped (valid case)
- Test both the error message and the fixed output for fixable rules
- For rules with options, test each option combination
- For rules using filesystem, mock with
vi.mock('../utils/file-utils.js') - For suggestion-only rules, use
errors: [{ messageId, suggestions: [...] }]
Step 4: Register the Rule
4a. Add to src/rules/index.ts
import { YourRuleNameRule } from './rule-name.js';
// Add to the rules object:
export const rules = {
// ... existing rules
'rule-name': YourRuleNameRule,
} satisfies Record<string, AnyRuleModule>;
4b. Add to src/plugin.ts configs
Add to both config objects (unless the rule depends on n8n cloud features):
'@n8n/community-nodes/rule-name': 'error', // or 'warn'
- Use
errorfor rules that catch bugs or required patterns - Use
warnfor style/convention rules (likeoptions-sorted-alphabetically) - If the rule uses
no-restricted-globalsorno-restricted-importspatterns, only add torecommended(notrecommendedWithoutN8nCloudSupport)
Step 5: Write Documentation
Create docs/rules/<rule-name>.md:
# Description of what the rule does (`@n8n/community-nodes/rule-name`)
<!-- end auto-generated rule header -->
## Rule Details
Explain why this rule exists and what problem it prevents.
## Examples
### Incorrect
\`\`\`typescript
// code that triggers the rule
\`\`\`
### Correct
\`\`\`typescript
// code that passes the rule
\`\`\`
The header above <!-- end auto-generated rule header --> will be regenerated by pnpm build:docs. Write a reasonable first version — it gets overwritten.
Step 6: Verify
Run from packages/@n8n/eslint-plugin-community-nodes/:
pushd packages/@n8n/eslint-plugin-community-nodes
pnpm test <rule-name>.test.ts # tests pass
pnpm typecheck # types are clean
pnpm build # compiles
pnpm build:docs # regenerates doc headers and README table
pnpm lint:docs # docs match schema
popd
Checklist
- Rule file:
src/rules/<rule-name>.ts - Test file:
src/rules/<rule-name>.test.ts - Registered in
src/rules/index.ts - Added to configs in
src/plugin.ts - Doc file:
docs/rules/<rule-name>.md - README table updated via
pnpm build:docs - All verification commands pass
FAQ
What does the n8n:create-community-node-lint-rule skill do?
Create new ESLint rules for the @n8n/eslint-plugin-community-nodes package. Use when adding a lint rule, creating a community node lint, or working on eslint-plugin-community-nodes. Guides rule implementation, tests, docs, and plugin registration.
How do I install n8n:create-community-node-lint-rule?
Run npx skills add https://github.com/n8n-io/n8n --skill n8n:create-community-node-lint-rule in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/n8n:create-community-node-lint-rule/ (personal) or .claude/skills/n8n:create-community-node-lint-rule/ (project).
Which AI agents can use n8n:create-community-node-lint-rule?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is n8n:create-community-node-lint-rule safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains n8n:create-community-node-lint-rule?
It is published by n8n-io in n8n-io/n8n. It has 236 recorded installs.
More from n8n-io/n8n
create-pr
n8n-io/n8n
Creates GitHub pull requests with properly formatted titles that pass the check-pr-title CI validation. Use when creating PRs, submitting changes for review, or when the user says /pr or asks to create a pull request.
content-design
n8n-io/n8n
Product content designer for UI copy. Use when writing, reviewing, or auditing user-facing text: button labels, error messages, tooltips, empty states, modal copy, placeholder text, confirmation dialogs, onboarding flows, or i18n strings. Also use when the user says /copy, /content, or /ux-copy.
reproduce-bug
n8n-io/n8n
Open the skill to read its SKILL.md instructions.
linear-issue
n8n-io/n8n
Fetch and analyze Linear issue with all related context. Use when starting work on a Linear ticket, analyzing issues, or gathering context about a Linear issue.
Popular code quality & workflow skills
grill-me
mattpocock/skills
A relentless interview to sharpen a plan or design.
improve-codebase-architecture
mattpocock/skills
Scan a codebase for deepening opportunities, present them as a visual HTML report, then grill through whichever one you pick.
handoff
mattpocock/skills
Compact the current conversation into a handoff document for another agent to pick up.
domain-modeling
mattpocock/skills
Build and sharpen a project's domain model. Use when discussing codebase terminology, writing or editing a GLOSSARY.md, or recording or editing an ADR.
codebase-design
mattpocock/skills
Shared vocabulary for designing deep modules. Use when the user wants to design or improve a module's interface, find deepening opportunities, decide where a seam goes, make code more testable or AI-navigable, or when another skill needs the deep-module vocabulary.
diagnosing-bugs
mattpocock/skills
Diagnosis loop for hard bugs and performance regressions. Use when the user says "diagnose"/"debug this", or reports something broken/throwing/failing/slow.