# eslint/eslint — codebase unpack

> Canonical page: https://codevetter.com/unpack/eslint

This is a deterministic Repo Unpack scan of eslint/eslint — a structural map, not a review, security audit, or maintainer-endorsed description.

- Scanned commit: bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7 (2026-10-02)
- Last upstream commit: fix: `prefer-arrow-callback` false positive in conditional test (#21373)
- Generated by codevetter 1.15.0 on 2026-10-02
- 2259 files scanned · 15.8 MB

Source inspection; upstream code and tests were not executed.

## Languages

- JavaScript: 1456 files
- Markdown: 422 files
- JSON: 92 files
- YAML: 54 files
- HTML: 38 files
- Sass: 35 files
- TypeScript: 22 files
- Shell: 1 files

## Repository structure

- tests/ — 1138 files
- docs/ — 604 files
- lib/ — 395 files
- tools/ — 24 files
- packages/ — 23 files
- .github/ — 22 files
- messages/ — 18 files
- templates/ — 5 files

Probable source entrypoint: `lib/` (inferred from the tree, not upstream docs)

## Package

- package.json: eslint v10.11.0 — 80 declared dependencies

## Structural health signals

Average score 7/10 across 96 files; 15 hotspots. These are deterministic review leads, not proof of a bug.

## Recent history

- bc51eee6e3e8 (2026-10-02) fix: `prefer-arrow-callback` false positive in conditional test (#21373)
- bbff86c41521 (2026-10-02) fix: skip lines with multiple comments in `max-lines-per-function` (#21332)
- 152067f0f81f (2026-10-01) chore: update ecosystem plugins (#21362)
- b56d58e0b1f3 (2026-10-01) chore: update github/codeql-action action to v4.38.2 (#21376)
- 67eb586e2eda (2026-10-01) docs: Update README

## Overview

ESLint is a configurable source-code analyzer for developers, editors, and build pipelines, exposed through a Node.js CLI and programmatic APIs. It parses JavaScript into an AST, runs selected rules, reports diagnostics, and can produce or write automatic fixes. This checkout uses flat configuration, supports custom languages, parsers, processors, rules, and formatters, and includes optional worker-thread execution and persistent lint-result caching. This brief reflects bounded source inspection at commit bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7; tests and CI were inspected, not executed.

## System map

The npm package provides both an executable and reusable analysis classes. CLI orchestration, asynchronous file/configuration work, synchronous verification, and JavaScript language support have distinct owners. Persistence consists of local cache and suppression files rather than an application database. Browser packaging and documentation builds are separate from the Node.js runtime.
- package.json publishes eslint 10.11.0 as CommonJS, maps the executable to bin/eslint.js, and exposes lib/api.js with TypeScript declarations. — [package.json#L2-19](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/package.json#L2-L19)
- lib/api.js exports ESLint, Linter, RuleTester, SourceCode, and async loadESLint(), which returns the ESLint constructor. — [lib/api.js#L12-38](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/api.js#L12-L38)
- bin/eslint.js bootstraps execution and sets process.exitCode; cli.execute() interprets arguments and returns status without directly exiting. — [bin/eslint.js#L189-211](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/bin/eslint.js#L189-L211) [lib/cli.js#L8-12](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L8-L12) [lib/cli.js#L199-215](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L199-L215)
- ESLint constructs a Linter, result cache, optional suppression service, and ConfigLoader; architecture documentation reserves asynchronous file operations for the file-oriented layer. — [lib/eslint/eslint.js#L716-760](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L716-L760) [docs/src/contribute/architecture/index.md#L42-80](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/docs/src/contribute/architecture/index.md#L42-L80)
- Flat configuration imports are handled by ConfigLoader, while Config resolves plugin languages/processors and validates language options and rules. — [lib/config/config-loader.js#L568-597](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/config/config-loader.js#L568-L597) [lib/config/config.js#L498-582](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/config/config.js#L498-L582)
- Local persistence uses file-entry-cache through LintResultCache and a JSON suppression file through SuppressionsService. — [lib/cli-engine/lint-result-cache.js#L79-114](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli-engine/lint-result-cache.js#L79-L114) [lib/services/suppressions-service.js#L215-243](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/services/suppressions-service.js#L215-L243)
- webpack.config.js packages Linter as a UMD library with Babel and Node polyfills; docs/package.json separately builds Sass, PostCSS, Eleventy pages, and optimized images. — [webpack.config.js#L9-30](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/webpack.config.js#L9-L30) [webpack.config.js#L56-64](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/webpack.config.js#L56-L64) [docs/package.json#L10-22](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/docs/package.json#L10-L22)
- Repository scripts route lint/test/release tasks through Makefile.js; eslint-config-eslint separately exports base, cjs, and formatting configurations, and version-data changes trigger a Netlify rebuild workflow. — [package.json#L54-79](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/package.json#L54-L79) [packages/eslint-config-eslint/package.json#L9-26](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/packages/eslint-config-eslint/package.json#L9-L26) [.github/workflows/rebuild-docs-sites.yml#L3-20](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/.github/workflows/rebuild-docs-sites.yml#L3-L20)

## Feature catalog

The primary interfaces lint paths or supplied text and return diagnostics with configurable severity. Users can apply fixes, choose report formats, inspect effective configuration, and manage suppression allowances. Optional caching and concurrency change execution strategy. Separate convenience flags delegate setup, MCP serving, and interactive configuration inspection to external packages.
- lintFiles() accepts file/directory/glob inputs; empty inputs default to '.', unless passOnNoPatterns requests an empty result. — [lib/eslint/eslint.js#L959-1002](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L959-L1002) [lib/eslint/eslint-helpers.js#L569-639](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint-helpers.js#L569-L639)
- The CLI supports stdin with --stdin-filename; lintText() matches configuration using a resolved filename or __placeholder__.js and optionally reports ignored input. — [lib/cli.js#L381-387](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L381-L387) [lib/eslint/eslint.js#L1159-1198](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L1159-L1198)
- --fix and --fix-dry-run both enable fix generation, but only --fix invokes outputFixes(); --fix-type restricts fixes and stdin requires dry-run mode. — [lib/shared/translate-cli-options.js#L200-218](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/shared/translate-cli-options.js#L200-L218) [lib/cli.js#L289-305](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L289-L305) [lib/cli.js#L389-392](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L389-L392)
- Reports support built-in, npm, or file-path formatters and an optional output file; formatter calls receive cwd, result metadata, and lazily computed rule metadata. — [lib/eslint/eslint.js#L1246-1273](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L1246-L1273) [lib/eslint/eslint.js#L1300-1315](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L1300-L1315) [lib/cli.js#L108-142](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L108-L142)
- --quiet filters displayed warnings; --max-warnings can still require warning rules to execute and causes failure when the threshold is exceeded. — [lib/shared/translate-cli-options.js#L193-198](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/shared/translate-cli-options.js#L193-L198) [lib/cli.js#L449-457](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L449-L457) [lib/cli.js#L511-515](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L511-L515)
- --print-config calculates and prints one file's configuration; --help, --version, and --env-info return informational output through early CLI branches. — [lib/cli.js#L220-259](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L220-L259)
- Bulk suppression commands create allowances for all or selected rules, prune obsolete allowances, and normally reject leftover unused suppressions with exit status 2. — [lib/cli.js#L418-443](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L418-L443) [lib/cli.js#L497-508](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L497-L508) [lib/services/suppressions-service.js#L57-77](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/services/suppressions-service.js#L57-L77)
- Optional cache strategies are metadata/content and concurrency can choose worker execution; --init, --mcp, and --inspect-config delegate to @eslint/config, @eslint/mcp, and @eslint/config-inspector respectively. — [lib/cli-engine/lint-result-cache.js#L89-110](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli-engine/lint-result-cache.js#L89-L110) [lib/eslint/eslint.js#L1041-1071](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L1041-L1071) [bin/eslint.js#L168-186](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/bin/eslint.js#L168-L186) [lib/cli.js#L262-278](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L262-L278)

## Data flow

CLI arguments become constructor options and appended configuration overrides. File discovery resolves physical paths, while text linting uses a filename for configuration matching. Parsing produces language-owned source representations that rules turn into diagnostics and fix ranges. Results then pass through persistence, suppression, formatting, and exit-status decisions.
- translateOptions() turns globals, parser selection, CLI rules, plugins, and extensions into overrideConfig; fix/dry-run, ignores, cache, flags, and statistics become ESLint options. — [lib/shared/translate-cli-options.js#L128-156](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/shared/translate-cli-options.js#L128-L156) [lib/shared/translate-cli-options.js#L180-218](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/shared/translate-cli-options.js#L180-L218)
- findFiles() resolves inputs against cwd, stats direct paths, loads configuration for explicit files, groups directory/glob searches, and deduplicates the resulting paths. — [lib/eslint/eslint-helpers.js#L569-639](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint-helpers.js#L569-L639)
- ConfigLoader caches lookup promises by starting directory and configuration-array promises by config path, then replaces promises with resolved values for synchronous cached access. — [lib/config/config-loader.js#L324-373](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/config/config-loader.js#L324-L373)
- ParserService.parseSync() calls language.parse(), rejects promise results, creates SourceCode on success, and converts parse failures into severity-2 fatal diagnostics. — [lib/services/parser-service.js#L32-59](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/services/parser-service.js#L32-L59)
- JavaScript parsing requests locations, ranges, tokens, comments, visitor keys, and scope information; parseForESLint() can additionally return parser services and its own scope manager. — [lib/languages/js/index.js#L238-288](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/languages/js/index.js#L238-L288)
- runRules() derives severity/options and FileContext, registers rule selectors, traverses SourceCode synchronously, and forwards context.report() calls into FileReport. — [lib/linter/linter.js#L551-592](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L551-L592) [lib/linter/linter.js#L678-719](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L678-L719)
- verifyText() converts verifyAndFix() output into LintResult with messages, suppressed messages, counts, optional fixed output, original source for unresolved problems, and optional timing statistics. — [lib/eslint/eslint-helpers.js#L1153-1195](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint-helpers.js#L1153-L1195)
- Workers claim file indices through Atomics.add(), return indexed results through parentPort, and the controller restores input ordering before storing cache entries. — [lib/eslint/worker.js#L115-148](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/worker.js#L115-L148) [lib/eslint/worker.js#L159-172](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/worker.js#L159-L172) [lib/eslint/eslint.js#L509-513](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L509-L513) [lib/eslint/eslint.js#L571-594](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L571-L594)

## Behavior traces

The traced flows include startup, physical-file linting, stdin analysis, automatic fixing, cache reuse, and suppression persistence. Their execution order separates analysis from source writes. Configuration selection occurs before verification, and CLI suppressions occur after optional fix writes. These are source-derived walkthroughs, not observed executions.
- Startup: enableCompileCache() and optional debug initialization → main() installs fatal handlers → optional readStdin() → cli.execute() → process.exitCode assignment unless a fatal handler already set status 2. — [bin/eslint.js#L12-20](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/bin/eslint.js#L12-L20) [bin/eslint.js#L164-194](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/bin/eslint.js#L164-L194) [bin/eslint.js#L196-211](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/bin/eslint.js#L196-L211)
- File action: cli.execute() constructs ESLint directly or through fromOptionsModule() → lintFiles() → findFiles() → selected single-thread/worker path → cache reconcile() → report processing. — [lib/cli.js#L369-387](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L369-L387) [lib/eslint/eslint.js#L1024-1031](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L1024-L1031) [lib/eslint/eslint.js#L1041-1082](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L1041-L1082)
- Single-thread verification: lintFilesWithoutMultithreading() retrieves cached configs → lintFile() checks matching config/cache → readAndVerifyFile() reads UTF-8 → verifyText() → Linter.verifyAndFix(). — [lib/eslint/eslint.js#L624-647](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L624-L647) [lib/eslint/eslint-helpers.js#L1242-1276](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint-helpers.js#L1242-L1276) [lib/eslint/eslint-helpers.js#L1282-1309](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint-helpers.js#L1282-L1309) [lib/eslint/eslint-helpers.js#L1153-1170](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint-helpers.js#L1153-L1170)
- Rule execution: verify() normalizes flat config → _verifyWithFlatConfigArray() selects a matching config → processor or no-processor branch → ParserService.parseSync() → runRules() → applyDisableDirectives(). — [lib/linter/linter.js#L862-900](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L862-L900) [lib/linter/linter.js#L1406-1453](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L1406-L1453) [lib/linter/linter.js#L1012-1038](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L1012-L1038) [lib/linter/linter.js#L1294-1347](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L1294-L1347)
- Stdin action: readStdin() accumulates UTF-8 → cli.execute() detects string input → lintText() resolves configuration by virtual filename → verifyText() generates results → printResults(); --fix is rejected for this branch. — [bin/eslint.js#L47-61](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/bin/eslint.js#L47-L61) [lib/cli.js#L295-299](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L295-L299) [lib/cli.js#L381-384](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L381-L384) [lib/eslint/eslint.js#L1159-1198](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L1159-L1198)
- Fix action: verifyAndFix() repeats verify() → SourceCodeFixer.applyFixes(), stops on no fixes, bounded passes, fatal parse failure, or a two-state cycle, then re-verifies final changed text; CLI --fix subsequently calls outputFixes(). — [lib/linter/linter.js#L1547-1586](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L1547-L1586) [lib/linter/linter.js#L1603-1637](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L1603-L1637) [lib/linter/linter.js#L1639-1662](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L1639-L1662) [lib/cli.js#L389-392](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L389-L392)
- Cache persistence: getCachedLintResults() checks file/config validity and hydrates source; cached diagnostics are reprocessed when fixing; setCachedLintResults() skips results with output; lintFiles() calls reconcile() to persist entries. — [lib/cli-engine/lint-result-cache.js#L125-149](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli-engine/lint-result-cache.js#L125-L149) [lib/eslint/eslint-helpers.js#L1252-1271](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint-helpers.js#L1252-L1271) [lib/cli-engine/lint-result-cache.js#L205-235](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli-engine/lint-result-cache.js#L205-L235) [lib/eslint/eslint.js#L1074-1077](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L1074-L1077)
- Suppression persistence: after linting and optional outputFixes(), CLI constructs SuppressionsService → suppress()/prune() → load()/save() → applySuppressions() → counts/formatting → status 2 for unused allowances unless explicitly permitted. — [lib/cli.js#L389-443](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L389-L443) [lib/services/suppressions-service.js#L57-77](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/services/suppressions-service.js#L57-L77) [lib/services/suppressions-service.js#L215-243](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/services/suppressions-service.js#L215-L243) [lib/cli.js#L497-508](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L497-L508)

## Testing signals

Tests and CI were inspected, not executed; no passing result or measured coverage is established here. The inspected suite uses Mocha-style tests, RuleTester, Chai or Node assertions, Sinon, and Proxyquire. CI defines Node, operating-system, browser, type, documentation, and ecosystem checks. Inspection is bounded, and identified limits apply to the specific tests or workflows cited.
- The configured unit runner is Mocha under c8 with --forbid-only; inspected CLI tests use Chai, Node assertions, Sinon, and Proxyquire, while ESLint-class tests also use filesystem fixtures. — [Makefile.js#L632-646](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/Makefile.js#L632-L646) [tests/lib/cli.js#L12-21](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/tests/lib/cli.js#L12-L21) [tests/lib/eslint/eslint.js#L17-41](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/tests/lib/eslint/eslint.js#L17-L41)
- The full test target checks rule files, runs unit tests, fuzzes 150 cases with fuzzBrokenAutofixes false, and checks licenses; coverage thresholds are 99% statements/functions/lines and 98% branches. — [Makefile.js#L638-646](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/Makefile.js#L638-L646) [Makefile.js#L674-678](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/Makefile.js#L674-L678)
- Inspected CLI cases assert stdin lint failure status 1, empty stdin success without log output, and unsupported-option status 2. — [tests/lib/cli.js#L116-154](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/tests/lib/cli.js#L116-L154)
- RuleTester no-undef cases cover explicit globals, global comments, CommonJS require, typeof exemptions, and later syntax; Linter cases assert ECMAScript-version-dependent global availability. — [tests/lib/rules/no-undef.js#L20-60](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/tests/lib/rules/no-undef.js#L20-L60) [tests/lib/rules/no-undef.js#L172-198](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/tests/lib/rules/no-undef.js#L172-L198) [tests/lib/linter/linter.js#L160-231](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/tests/lib/linter/linter.js#L160-L231)
- Inspected persistence tests assert ESLint/Node versions participate in cache hashing and suppression loading handles valid JSON, missing files, and malformed JSON; suppression readFile calls are stubbed in these cases. — [tests/lib/cli-engine/lint-result-cache.js#L163-211](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/tests/lib/cli-engine/lint-result-cache.js#L163-L211) [tests/lib/services/suppressions-service.js#L67-112](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/tests/lib/services/suppressions-service.js#L67-L112)
- ESLint constructor tests assert numeric/auto concurrency rejects uncloneable function/plugin options with ESLINT_UNCLONEABLE_OPTIONS and recommends options modules. — [tests/lib/eslint/eslint.js#L418-451](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/tests/lib/eslint/eslint.js#L418-L451)
- Main CI defines Linux Node 20/22/24/26 runs, minimum Node 20.19.0, Windows/macOS LTS runs, fuzzing and EMFILE checks; Cypress selects only tests/lib/linter/linter.js with a built-bundle alias, so that browser job does not select CLI/file-engine tests. — [.github/workflows/ci.yml#L60-94](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/.github/workflows/ci.yml#L60-L94) [.github/workflows/ci.yml#L96-117](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/.github/workflows/ci.yml#L96-L117) [cypress.config.js#L17-20](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/cypress.config.js#L17-L20) [cypress.config.js#L39-46](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/cypress.config.js#L39-L46)
- CI also defines type/compiler compatibility checks, external-consumer type tests, docs builds/link validation, and ecosystem plugin tests; the ecosystem matrix explicitly disables typescript-eslint pending test updates. — [.github/workflows/ci.yml#L119-147](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/.github/workflows/ci.yml#L119-L147) [.github/workflows/types-integration.yml#L21-42](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/.github/workflows/types-integration.yml#L21-L42) [.github/workflows/docs-ci.yml#L33-43](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/.github/workflows/docs-ci.yml#L33-L43) [.github/workflows/ecosystem-tests.yml#L25-33](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/.github/workflows/ecosystem-tests.yml#L25-L33)

## Risk map

These observations identify execution and persistence boundaries requiring care; they are not confirmed vulnerabilities. Configuration and extension modules execute within the host process, and convenience commands can invoke external package tooling. Filesystem destinations are resolved from caller-controlled paths rather than constrained to a repository root. Fixing, caching, suppressions, and concurrency have conditions that can materially change results or side effects.
- Configuration discovery searches upward from target directories and imports executable modules; explicit config paths resolve against cwd, so config loading can cross the repository boundary. — [lib/config/config-loader.js#L539-550](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/config/config-loader.js#L539-L550) [lib/config/config-loader.js#L184-189](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/config/config-loader.js#L184-L189) [lib/config/config-loader.js#L198-234](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/config/config-loader.js#L198-L234)
- CLI parser/plugin selection and formatter loading import caller-selected modules; imported code therefore participates in the host runtime rather than a separate analysis sandbox. — [lib/shared/translate-cli-options.js#L36-52](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/shared/translate-cli-options.js#L36-L52) [lib/shared/translate-cli-options.js#L145-146](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/shared/translate-cli-options.js#L145-L146) [lib/eslint/eslint.js#L1246-1273](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L1246-L1273)
- --init and --mcp synchronously spawn npm/npx with inherited stdio and propagate status/signals; --inspect-config similarly invokes npx. These paths delegate package acquisition/execution to external tools. — [bin/eslint.js#L71-87](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/bin/eslint.js#L71-L87) [bin/eslint.js#L168-186](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/bin/eslint.js#L168-L186) [lib/cli.js#L267-278](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L267-L278)
- outputFixes() writes any result containing string output and an absolute filePath; report output resolves against process.cwd() and creates parent directories. Neither shown writer enforces a repository-root boundary. — [lib/eslint/eslint.js#L802-824](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L802-L824) [lib/cli.js#L120-136](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L120-L136)
- lintFiles() can delete the resolved cache file when caching is disabled; getCacheFile() accepts absolute or cwd-relative destinations, making cacheLocation relevant even outside cache-enabled runs. — [lib/eslint/eslint.js#L1009-1021](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L1009-L1021) [lib/eslint/eslint-helpers.js#L1009-1017](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint-helpers.js#L1009-L1017)
- Autofix convergence is bounded and detects return to text from two iterations earlier; fix-range application rejects conflicts. The implementation does not establish general convergence or semantic equivalence of rule-provided fixes. — [lib/linter/linter.js#L1547-1554](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L1547-L1554) [lib/linter/linter.js#L1622-1637](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L1622-L1637) [lib/linter/source-code-fixer.js#L86-109](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/source-code-fixer.js#L86-L109)
- Suppression loading performs JSON.parse() without shape validation in load(), and save() directly overwrites the file. Hypothesis: malformed-but-valid JSON or interrupted/concurrent writes merit focused robustness checks; these were not demonstrated failures. (inferred) — [lib/services/suppressions-service.js#L215-243](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/services/suppressions-service.js#L215-L243) [lib/services/suppressions-service.js#L163-174](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/services/suppressions-service.js#L163-L174)
- The low-overhead visitor branch tags listener functions with rule IDs and falls back to wrappers when functions are shared across rules; changes here must preserve attribution for shared visitors, timing, and statistics. — [lib/linter/linter.js#L678-713](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L678-L713)

## Extension points

Extension is centered on flat configuration and explicit plugin objects. Rules, languages, processors, and parsers connect at different stages of verification. Formatters extend the output boundary, while configuration helpers and feature flags provide additional integration surfaces. Built-in rules are registered lazily and follow the same metadata/create contract used by rule tests.
- New built-in rules enter the alphabetized LazyLoadingRuleMap in lib/rules/index.js; defaultConfig exposes that map through a proxy under the internal '@' plugin. — [lib/rules/index.js#L9-23](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/rules/index.js#L9-L23) [lib/config/default-config.js#L34-60](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/config/default-config.js#L34-L60)
- Rule modules provide create(context) and metadata; runRules() rejects missing create(), requires meta.fixable for emitted fixes, and requires meta.hasSuggestions for suggestions. — [lib/rules/no-undef.js#L27-60](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/rules/no-undef.js#L27-L60) [lib/linter/linter.js#L490-505](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L490-L505) [lib/linter/linter.js#L594-615](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L594-L615)
- Plugin rule IDs resolve through config.plugins[pluginName].rules[ruleName]; CLI --plugin normalizes package names and registers default exports under shorthand names. — [lib/config/config.js#L184-187](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/config/config.js#L184-L187) [lib/shared/translate-cli-options.js#L36-52](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/shared/translate-cli-options.js#L36-L52)
- Language plugins register under plugins[namespace].languages[name]; Config merges defaults, validates languageOptions, and optionally normalizes them before parsing. — [lib/config/config.js#L498-542](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/config/config.js#L498-L542) [lib/services/parser-service.js#L32-45](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/services/parser-service.js#L32-L45)
- Custom JavaScript parsers may implement parseForESLint() or parse(); enhanced parser results can supply services, visitor keys, and scopeManager. — [lib/languages/js/index.js#L268-287](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/languages/js/index.js#L268-L287)
- Processors can be plugin-qualified names or objects; verification uses preprocess/postprocess and disables fixes unless supportsAutofix is true. — [lib/config/config.js#L545-575](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/config/config.js#L545-L575) [lib/linter/linter.js#L1425-1437](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L1425-L1437) [lib/linter/linter.js#L926-936](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L926-L936)
- Custom formatters are dynamically imported functions from paths or eslint-formatter packages; their wrapper sorts results and supplies contextual/rule metadata. — [lib/eslint/eslint.js#L1246-1288](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L1246-L1288) [lib/eslint/eslint.js#L1300-1315](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L1300-L1315)
- eslint/config re-exports defineConfig(), globalIgnores(), and includeIgnoreFile(); behavior experiments register in activeFlags/inactiveFlags, including unstable_native_nodejs_ts_config. — [lib/config-api.js#L8-18](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/config-api.js#L8-L18) [lib/shared/flags.js#L28-65](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/shared/flags.js#L28-L65) [package.json#L17-19](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/package.json#L17-L19)

## Contributor handoff

Begin with the actual implementation and nearby tests, then use architecture documentation to preserve ownership boundaries. Tests and CI were inspected, not executed; this brief provides no passing checks or exhaustive coverage assessment. Rule changes couple source, tests, documentation, and generated metadata. Pay particular attention to virtual filenames, executable configuration, cache side effects, suppression counters, and worker option transport.
- Read AGENTS.md, package.json, architecture documentation, and the affected implementation/test first; keep synchronous verification and rules free of asynchronous work, filesystem access, and console output. — [AGENTS.md#L45-60](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/AGENTS.md#L45-L60) [docs/src/contribute/architecture/index.md#L61-96](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/docs/src/contribute/architecture/index.md#L61-L96) [package.json#L54-85](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/package.json#L54-L85)
- Do not treat AGENTS.md's ownership shorthand as a substitute for source: bin/eslint.js sets process.exitCode and spawns tools, while lib/cli.js itself writes reports and orchestrates suppression files. — [AGENTS.md#L51-54](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/AGENTS.md#L51-L54) [bin/eslint.js#L71-87](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/bin/eslint.js#L71-L87) [bin/eslint.js#L208-211](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/bin/eslint.js#L208-L211) [lib/cli.js#L120-136](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/cli.js#L120-L136)
- For a rule change, maintain its source/test/docs trio, register new rules alphabetically, use messageId and metadata schemas, and place reusable AST helpers at module scope. — [AGENTS.md#L65-72](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/AGENTS.md#L65-L72) [lib/rules/no-undef.js#L44-79](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/rules/no-undef.js#L44-L79) [lib/rules/index.js#L9-23](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/rules/index.js#L9-L23)
- Rule edits trigger tooling for all/recommended configurations and rule type headers; rule-doc edits trigger example checks and further-reading data regeneration. Avoid hand-editing these derived outputs. — [AGENTS.md#L43-43](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/AGENTS.md#L43-L43) [package.json#L109-118](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/package.json#L109-L118)
- When test execution is authorized, start with the affected file through npm run test:cli, then choose relevant lint, rule-example, type, or browser checks; full npm test adds coverage, fuzzing, consistency, and license checks. — [AGENTS.md#L25-33](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/AGENTS.md#L25-L33) [package.json#L58-81](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/package.json#L58-L81) [Makefile.js#L674-678](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/Makefile.js#L674-L678)
- Verification expectations here come from inspected definitions, not executed results: c8 thresholds are configured, and the browser suite selects the Linter test file rather than the entire Node suite. — [Makefile.js#L638-646](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/Makefile.js#L638-L646) [cypress.config.js#L39-46](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/cypress.config.js#L39-L46) [.github/workflows/ci.yml#L87-94](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/.github/workflows/ci.yml#L87-L94)
- Concurrency edits must preserve cloneability/options-module transport, atomic file assignment, ordered indexed results, worker-error cancellation, and cache updates in the controlling thread. — [lib/eslint/eslint.js#L716-725](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L716-L725) [lib/eslint/eslint.js#L862-874](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L862-L874) [lib/eslint/eslint.js#L509-521](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L509-L521) [lib/eslint/eslint.js#L571-594](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L571-L594)
- GitHub issues, PRs, and comments require AI disclosure using the actual producing model; AGENTS.md also limits AI-generated PR consideration to accepted issues and expects human responses to maintainer feedback. — [AGENTS.md#L5-21](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/AGENTS.md#L5-L21)

Source repository: https://github.com/eslint/eslint
Full evidence corpus: https://github.com/Codevetter/codevetter/tree/main/benchmarks/repo-unpacks/eslint.json

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
