noctcore ESLint plugins
Is this for you?
Section titled “Is this for you?”Yes, if you run a TypeScript codebase on ESLint 9 or newer with flat config, and the bugs that reach
review are structural: a component that drills props five levels down, a fetch with no timeout, a
Prisma write outside its transaction, a log line that interpolates a user’s email. These plugins catch
those with high-precision, mostly syntactic rules, and every rule is error or off, never warn
(why).
Probably not, if you are on legacy .eslintrc config (these are flat-config only), you want a
general style guide (use typescript-eslint and a formatter; these plugins assume both), or your
codebase does not share the conventions a plugin encodes. Each package page says when it is a bad fit.
Every package is independently versioned. Install the one that matches the problem you have.
Packages
Section titled “Packages”- @noctcore/eslint-plugin-reactReact architecture and correctness ESLint rules: prop drilling, state colocation, memoized context, effect safety and guarded web storage.
- @noctcore/eslint-plugin-architectureFramework-agnostic ESLint rules for module and folder shape: folder-per-component, barrels, feature boundaries, import depth and colocated tests.
- @noctcore/eslint-plugin-monorepoESLint rules for enforcing workspace / monorepo package boundaries.
- @noctcore/eslint-plugin-contractsESLint rules for IO contracts and config: checked fetch responses, parsed boundary data, error cause and taxonomy, zod schema and wire naming, env access, decimal money and translation keys.
- @noctcore/eslint-plugin-code-qualityPortable code-quality, comment-hygiene and test-discipline ESLint rules: guard clauses, deterministic time, no stray process.exit, and tests that cannot pass vacuously.
- @noctcore/eslint-plugin-async-safetyESLint rules for async correctness: fetch timeouts, AbortSignal forwarding, and shared-state / concurrency races.
- @noctcore/eslint-plugin-observabilityStructured-logging ESLint rules: context objects over interpolated messages, no sensitive fields in logs, no lost error detail, and declared PII in audit payloads.
- @noctcore/eslint-plugin-securitySecurity ESLint rules: shell injection, path traversal, SSRF, open redirects, unsanitized HTML (XSS), timing-unsafe comparisons and server actions that bypass their action client.
- @noctcore/eslint-plugin-prismaPrisma tenancy, data-integrity and transaction guardrails: unscoped-client and raw-SQL fences, client-supplied tenant ids and request bodies, tenant and soft-delete filters, single-writer models, multi-write transactions and audit placement.
- @noctcore/eslint-plugin-rscReact Server Components and App Router correctness rules: control-flow errors that must not be swallowed.
- @noctcore/eslint-plugin-llmESLint rules for code that calls LLM SDKs: model output treated as untrusted input before it reaches a dangerous sink.
- @noctcore/lint-meta-rulesPortable, parameterized lint-meta rules — whole-repo / cross-file invariants ESLint cannot reach — for the @noctcore/harness lint-meta runner.
Looking for one rule? Every rule on one page, across all packages.
Install and configure
Section titled “Install and configure”Pick a package. Each tab is the install command and a working eslint.config.js.
npm install --save-dev @noctcore/eslint-plugin-react @typescript-eslint/parser# or: bun add -D / pnpm add -D @noctcore/eslint-plugin-react @typescript-eslint/parser// eslint.config.jsimport tsParser from '@typescript-eslint/parser';import react from '@noctcore/eslint-plugin-react';
export default [ { ...react.configs.recommended, files: ['**/*.{ts,tsx}'], languageOptions: { parser: tsParser }, },];The recommended preset enables 14 of 14 rules.
npm install --save-dev @noctcore/eslint-plugin-architecture @typescript-eslint/parser# or: bun add -D / pnpm add -D @noctcore/eslint-plugin-architecture @typescript-eslint/parser// eslint.config.jsimport tsParser from '@typescript-eslint/parser';import architecture from '@noctcore/eslint-plugin-architecture';
export default [ { ...architecture.configs.recommended, files: ['**/*.{ts,tsx}'], languageOptions: { parser: tsParser }, },];
// Rules outside the preset are enabled one by one, e.g.// { rules: { 'noctcore-architecture/single-semantic-module': 'error' } }The recommended preset enables 6 of 8 rules.
npm install --save-dev @noctcore/eslint-plugin-monorepo @typescript-eslint/parser# or: bun add -D / pnpm add -D @noctcore/eslint-plugin-monorepo @typescript-eslint/parser// eslint.config.jsimport tsParser from '@typescript-eslint/parser';import monorepo from '@noctcore/eslint-plugin-monorepo';
export default [ { ...monorepo.configs.recommended, files: ['**/*.{ts,tsx}'], languageOptions: { parser: tsParser }, },];
// Rules outside the preset are enabled one by one, e.g.// { rules: { 'noctcore-monorepo/no-deep-package-imports': ['error', { /* see the rule's Options */ }] } }The recommended preset turns none of its 2 rules on: each needs options only your project can give, so the preset alone checks nothing. Enable them with your options, as each rule's page shows.
npm install --save-dev @noctcore/eslint-plugin-contracts @typescript-eslint/parser# or: bun add -D / pnpm add -D @noctcore/eslint-plugin-contracts @typescript-eslint/parser// eslint.config.jsimport tsParser from '@typescript-eslint/parser';import contracts from '@noctcore/eslint-plugin-contracts';
export default [ { ...contracts.configs.recommended, files: ['**/*.{ts,tsx}'], languageOptions: { parser: tsParser }, },];
// Rules outside the preset are enabled one by one, e.g.// { rules: { 'noctcore-contracts/require-schema-parse-at-boundary': 'error' } }The recommended preset enables 9 of 13 rules.
npm install --save-dev @noctcore/eslint-plugin-code-quality @typescript-eslint/parser# or: bun add -D / pnpm add -D @noctcore/eslint-plugin-code-quality @typescript-eslint/parser// eslint.config.jsimport tsParser from '@typescript-eslint/parser';import codeQuality from '@noctcore/eslint-plugin-code-quality';
export default [ { ...codeQuality.configs.recommended, files: ['**/*.{ts,tsx}'], languageOptions: { parser: tsParser }, },];
// Rules outside the preset are enabled one by one, e.g.// { rules: { 'noctcore-code-quality/interface-prefix-i': 'error' } }The recommended preset enables 14 of 16 rules.
npm install --save-dev @noctcore/eslint-plugin-async-safety @typescript-eslint/parser# or: bun add -D / pnpm add -D @noctcore/eslint-plugin-async-safety @typescript-eslint/parser// eslint.config.jsimport tsParser from '@typescript-eslint/parser';import asyncSafety from '@noctcore/eslint-plugin-async-safety';
export default [ { ...asyncSafety.configs.recommended, files: ['**/*.{ts,tsx}'], languageOptions: { parser: tsParser }, },];
// Rules outside the preset are enabled one by one, e.g.// { rules: { 'noctcore-async-safety/prefer-parallel-awaits': 'error' } }The recommended preset enables 6 of 7 rules.
npm install --save-dev @noctcore/eslint-plugin-observability @typescript-eslint/parser# or: bun add -D / pnpm add -D @noctcore/eslint-plugin-observability @typescript-eslint/parser// eslint.config.jsimport tsParser from '@typescript-eslint/parser';import observability from '@noctcore/eslint-plugin-observability';
export default [ { ...observability.configs.recommended, files: ['**/*.{ts,tsx}'], languageOptions: { parser: tsParser }, },];The recommended preset enables 4 of 4 rules.
npm install --save-dev @noctcore/eslint-plugin-security @typescript-eslint/parser# or: bun add -D / pnpm add -D @noctcore/eslint-plugin-security @typescript-eslint/parser// eslint.config.jsimport tsParser from '@typescript-eslint/parser';import security from '@noctcore/eslint-plugin-security';
export default [ { ...security.configs.recommended, files: ['**/*.{ts,tsx}'], languageOptions: { parser: tsParser }, },];
// Rules outside the preset are enabled one by one, e.g.// { rules: { 'noctcore-security/require-path-containment': 'error' } }The recommended preset enables 4 of 7 rules.
npm install --save-dev @noctcore/eslint-plugin-prisma @typescript-eslint/parser# or: bun add -D / pnpm add -D @noctcore/eslint-plugin-prisma @typescript-eslint/parser// eslint.config.jsimport tsParser from '@typescript-eslint/parser';import prisma from '@noctcore/eslint-plugin-prisma';
export default [ { ...prisma.configs.recommended, files: ['**/*.{ts,tsx}'], languageOptions: { parser: tsParser }, },];
// Rules outside the preset are enabled one by one, e.g.// { rules: { 'noctcore-prisma/mutation-entry-must-reach-audit': 'error' } }The recommended preset enables 7 of 12 rules.
npm install --save-dev @noctcore/eslint-plugin-rsc @typescript-eslint/parser# or: bun add -D / pnpm add -D @noctcore/eslint-plugin-rsc @typescript-eslint/parser// eslint.config.jsimport tsParser from '@typescript-eslint/parser';import rsc from '@noctcore/eslint-plugin-rsc';
export default [ { ...rsc.configs.recommended, files: ['**/*.{ts,tsx}'], languageOptions: { parser: tsParser }, },];The recommended preset enables 1 of 1 rule.
npm install --save-dev @noctcore/eslint-plugin-llm @typescript-eslint/parser# or: bun add -D / pnpm add -D @noctcore/eslint-plugin-llm @typescript-eslint/parser// eslint.config.jsimport tsParser from '@typescript-eslint/parser';import llm from '@noctcore/eslint-plugin-llm';
export default [ { ...llm.configs.recommended, files: ['**/*.{ts,tsx}'], languageOptions: { parser: tsParser }, },];The recommended preset enables 1 of 1 rule.
npm install --save-dev @noctcore/lint-meta-rules# or: bun add -D / pnpm add -D @noctcore/lint-meta-rulesimport { createAllRules, createPackageShapeRule } from '@noctcore/lint-meta-rules';
// Every catalog rule with default options:const rules = createAllRules();
// Or one rule, retargeted at your repo:const shape = createPackageShapeRule({ scope: '@acme' });A source catalog for the @noctcore/harness lint-meta runner, not an ESLint plugin. 28 rules.
How these docs are built
Section titled “How these docs are built”Each rule page on this site is generated from the Markdown file that ships inside the npm tarball
(docs/rules/<rule>.md), and the tables are generated from each plugin’s exported rule metadata. The
Incorrect and Correct examples on every rule page are executed by that package’s test suite, so an example that stops
matching the rule fails CI before it can reach this page.