@codemirror/lint
Linting support for the CodeMirror 6 code editor, with diagnostics, an error gutter, tooltips, and a lint panel.
Repository Health
Technical Analysis
@codemirror/lint is the official linting extension for the CodeMirror 6 code editor. It provides the machinery to attach one or more linters to an editor, collect the diagnostics they produce, and surface those problems to the user through underlines in the document, a color-coded gutter, hover tooltips, and a navigable lint panel.
Linters are plain functions that receive the editor view and return an array of diagnostics (synchronously or via a promise), each carrying a position range, severity, message, and optional quick-fix actions. The package debounces linting on document changes, renders the results, and ships a keymap and commands for opening the panel and jumping between problems, so integrators can wire up rich diagnostic feedback with only a few lines of configuration.
What You Get
- A
linter()extension that runs your lint source (sync or async) with configurable debounce delay and refresh control. - Document decorations, a color-coded lint gutter, and hover tooltips that render each diagnostic in place.
- A lint panel plus a keymap and commands (
openLintPanel,nextDiagnostic,previousDiagnostic) for reviewing and navigating problems. - A typed
Diagnosticmodel with severities, sources, quick-fixActions, and helpers likesetDiagnostics,diagnosticCount, andforEachDiagnostic.
Common Use Cases
- Showing syntax or semantic errors from a language parser inline in a CodeMirror-based editor.
- Surfacing results from an external linter (ESLint, a JSON schema validator, a custom rule engine) as underlines and gutter markers.
- Offering one-click quick-fix actions attached to individual diagnostics.
- Building an in-editor problems panel that users can page through with the keyboard.
Under The Hood
Architecture
The entire package lives in a single ~1,015-line src/lint.ts module built on the CodeMirror 6 extension primitives. Diagnostics are held in a StateField updated through a setDiagnosticsEffect StateEffect, so lint results become part of editor state and are automatically mapped across document changes. A ViewPlugin (LintPlugin) debounces re-linting on updates and dispatches the effect when a lint source resolves; the state field derives a RangeSet of mark decorations, feeds hover tooltips via hoverTooltip, and drives an optional gutter (lintGutter) built from GutterMarkers. The lint panel is a showPanel construction that lists diagnostics and supports keyboard navigation through nextDiagnostic/previousDiagnostic commands.
Tech Stack
Written entirely in TypeScript (100% of the source) and published as dual ESM/CJS output with type declarations via the cm-buildhelper tool. Runtime dependencies are minimal and peer-aligned with the editor: @codemirror/state, @codemirror/view, and crelt (a tiny DOM element-creation helper). It targets CodeMirror 6 and carries no framework coupling beyond the editor core.
Code Quality
The public API is defined through documented TypeScript interfaces (Diagnostic, Action, LintSource) with /// doc comments that feed the generated reference docs. A test/test-lint.ts suite exercises the core behavior (diagnostic mapping, counting, panel navigation) with seven cases run through CodeMirror’s cm-runtests harness. The code is dense but consistently structured, favoring small exported functions and clear separation between state, view, and panel concerns.
API Design
The surface is deliberately small and composable: a single linter() factory returns an extension you drop into your editor config, diagnostics are plain data objects, and everything else (gutter, keymap, panel) is opt-in. Naming is consistent with the wider CodeMirror ecosystem, and the reference documentation on codemirror.net covers every export. Getting a basic linter running takes only a lint function and the linter() call, while advanced needs (filters, custom rendering, quick-fix actions, auto-opening panels) are handled through well-typed configuration options.
Used by 37 apps in this directory
Agent Control
AI Agents
An open-source runtime control plane for AI agents — define safety guardrails once, apply them across agents built on LangChain, CrewAI, Google ADK, or AWS Strands, and update controls without redeploying code.
Cherry Studio
AI Assistants
All-in-one AI desktop client with 300+ assistants and multi-model support
Coroot
Analytics · Monitoring
eBPF-powered observability with AI root cause analysis — zero code changes required, full-stack visibility out of the box.
Dittofeed
Marketing · Automation
Open-source omni-channel customer engagement platform for automating transactional and marketing messages via email, SMS, WhatsApp, Slack, and mobile push.
Enso
Analytics · Data Engineering · Low Code Platforms
A visual and textual programming platform for data prep and analysis where the node graph and the underlying Enso code are always perfectly in sync, built by an Alteryx co-founder on a GraalVM engine.
evidence
Analytics · Data Engineering
Turn SQL queries and markdown files into polished, interactive data apps and business intelligence reports — no drag-and-drop, no GUI, just code.
Flipt
Devops · Developer Tools
Git-native feature flag platform that stores, versions, and deploys feature toggles directly in your own Git repositories with no external database required.
Flowfile
Data Engineering
Visual ETL that compiles to Polars — build pipelines on a canvas, export as standalone Python, and run anywhere without platform lock-in.
Gitea
Devops · Developer Tools · Project Management
Self-hosted DevOps in a single Go binary — Git hosting, GitHub Actions-compatible CI/CD, and 30+ package registries without any SaaS dependency.