About node-lint
node-lint is a coding skill for configuring and migrating lint and formatting in Node.js projects. It helps keep tool choices, explicit rules, scripts, and verification aligned without confusing linting with type checking.
Key features
- 01Chooses Biome or ESLint with Prettier
- 02Writes explicit lint and format configuration
- 03Migrates existing setups while preserving custom rules
- 04Wires package scripts and validates the setup
Use cases
- 01Setting up linting for a new TypeScript project
- 02Migrating from legacy ESLint configuration
- 03Checking that formatting tools and scripts are consistent
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ paldom/ node-skills --skill node-lintAfter installing, type/node-lintin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
evals/evals.jsonreferences/lint-playbook.mdscripts/check_lint_setup.pyDetails
From the project READMEnode-lint
Sets up lint + format so they catch real defects instead of fighting each other.
The failures this skill fixes: models write legacy .eslintrc configs that current
ESLint majors no longer load, mix two formatters, claim Biome replaces type
checking, and reset intentional rule customizations during migrations.
When NOT to use
- Next.js apps →
nextjs-qualityownseslint-config-nextand RSC rules. - Type checking / tsconfig →
node-typescript(Biome's type-aware rules are not atscreplacement — never claim otherwise). - Test setup →
node-testing; CI workflow authoring →node-ci.
Workflow
- Detect before choosing. Package manager (lockfile), existing configs
(
.eslintrc*,eslint.config.*,biome.json*,.prettierrc*), framework, and plugin needs (a11y, imports, framework-specific). Plugin needs decide the tool: read the decision table inreferences/lint-playbook.md.- Biome — one tool for lint+format, fastest path for TS libraries/apps without exotic plugin needs.
- ESLint (flat config only — modern majors do not load eslintrc) + Prettier — when the plugin ecosystem is required.
- Never two formatters; never ESLint stylistic rules alongside a formatter.
- Write the explicit config from the playbook's starter blocks — full config,
no reliance on version-varying defaults. Wire
package.jsonscripts (lint,format,lint:fix) with--max-warnings=0for CI use. - Migrations (when an old setup exists): follow the playbook's path —
official flat-config migrator or
biome migrate eslint. Diff the effective rule set; preserve intentional customizations; run on the whole codebase and triage new findings before deleting the old config. - Verify:
plus a clean run of the chosen tool over the repo (python3 "${CLAUDE_SKILL_DIR}/scripts/check_lint_setup.py"npx biome check .ornpx eslint . --max-warnings=0). - Report the tool choice rationale, rules deliberately disabled, and where
CI should call the scripts (route the workflow wiring to
node-ci).
Output spec
One linter + one formatter, explicit committed config, scripts wired, zero errors/warnings on the current codebase (or a documented triage list), no leftover legacy config files, editor settings noted.
Gotchas
- Flat config resolves relative to each linted file's directory in current ESLint majors — monorepo packages can carry their own config layers.
biome migrate eslintmaps what it can; rules without Biome equivalents are dropped silently — always diff and list them.- Version-gate everything: tool majors move fast; the playbook marks claims that must be re-verified against official docs at use time.
- A lint pass that only silences rules is a failure — tune by fixing signal.
Files
references/lint-playbook.md— decision table, explicit starter configs, migration paths, tuning discipline.scripts/check_lint_setup.py— deterministic sanity checks (single formatter, no legacy+flat config coexistence, scripts wired); non-zero exit on violations.