node-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-quality owns eslint-config-next and RSC rules.
- Type checking / tsconfig →
node-typescript (Biome's type-aware rules are not
a tsc replacement — 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 in references/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.json scripts
(lint, format, lint:fix) with --max-warnings=0 for 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:
python3 "${CLAUDE_SKILL_DIR}/scripts/check_lint_setup.py"
plus a clean run of the chosen tool over the repo (npx biome check . or
npx 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 eslint maps 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.
1---2name: node-lint3description: Sets up and tunes the linter and formatter for Node/TypeScript - Biome as the fast one-tool option or ESLint flat config plus Prettier, rule tuning, import sorting, unused-import removal, eslintrc-to-flat and ESLint-to-Biome migrations. Use when the user asks to set up or fix linting, formatting, a slow linter, ESLint, Biome or Prettier. Not for Next.js apps, type checking, or test setup.4license: MIT5---67# node-lint89Sets up lint + format so they catch real defects instead of fighting each other.10The failures this skill fixes: models write legacy `.eslintrc` configs that current11ESLint majors no longer load, mix two formatters, claim Biome replaces type12checking, and reset intentional rule customizations during migrations.1314## When NOT to use1516- Next.js apps → `nextjs-quality` owns `eslint-config-next` and RSC rules.17- Type checking / tsconfig → `node-typescript` (Biome's type-aware rules are not18 a `tsc` replacement — never claim otherwise).19- Test setup → `node-testing`; CI workflow authoring → `node-ci`.2021## Workflow22231. **Detect before choosing.** Package manager (lockfile), existing configs24 (`.eslintrc*`, `eslint.config.*`, `biome.json*`, `.prettierrc*`), framework,25 and plugin needs (a11y, imports, framework-specific). Plugin needs decide the26 tool: read the decision table in `references/lint-playbook.md`.27 - **Biome** — one tool for lint+format, fastest path for TS libraries/apps28 without exotic plugin needs.29 - **ESLint (flat config only — modern majors do not load eslintrc) +30 Prettier** — when the plugin ecosystem is required.31 - Never two formatters; never ESLint stylistic rules alongside a formatter.322. **Write the explicit config** from the playbook's starter blocks — full config,33 no reliance on version-varying defaults. Wire `package.json` scripts34 (`lint`, `format`, `lint:fix`) with `--max-warnings=0` for CI use.353. **Migrations** (when an old setup exists): follow the playbook's path —36 official flat-config migrator or `biome migrate eslint`. Diff the effective37 rule set; preserve intentional customizations; run on the whole codebase and38 triage new findings before deleting the old config.394. **Verify**:40 ```bash41 python3 "${CLAUDE_SKILL_DIR}/scripts/check_lint_setup.py"42 ```43 plus a clean run of the chosen tool over the repo (`npx biome check .` or44 `npx eslint . --max-warnings=0`).455. **Report** the tool choice rationale, rules deliberately disabled, and where46 CI should call the scripts (route the workflow wiring to `node-ci`).4748## Output spec4950One linter + one formatter, explicit committed config, scripts wired, zero51errors/warnings on the current codebase (or a documented triage list), no52leftover legacy config files, editor settings noted.5354## Gotchas5556- Flat config resolves relative to each linted file's directory in current57 ESLint majors — monorepo packages can carry their own config layers.58- `biome migrate eslint` maps what it can; rules without Biome equivalents are59 dropped silently — always diff and list them.60- Version-gate everything: tool majors move fast; the playbook marks claims that61 must be re-verified against official docs at use time.62- A lint pass that only silences rules is a failure — tune by fixing signal.6364## Files6566- `references/lint-playbook.md` — decision table, explicit starter configs,67 migration paths, tuning discipline.68- `scripts/check_lint_setup.py` — deterministic sanity checks (single formatter,69 no legacy+flat config coexistence, scripts wired); non-zero exit on violations.