spellcheck-comments
Targeted pattern scope
This rule checks regular line comments, block comments, and JSDoc-style comment
text with cspell dictionaries.
It uses the plugin's markdown-aware comment projection layer, so inline code spans
such as `eslint.config.mjs` are ignored instead of being spellchecked as
normal prose. Directive comments such as eslint-disable and TypeScript
suppression comments are also skipped.
What this rule reports
The rule reports words that are unknown, misspelled, or explicitly flagged by the imported cspell dictionaries plus the plugin's built-in technical vocabulary.
That means normal prose typos such as documeant or incorect are reported,
while common engineering terms such as eslint, repo, tsconfig, and
Node.js are accepted by default.
Why this rule exists
Typos in comments make documentation look less trustworthy and harder to skim. A lightweight comment-only spellcheck catches those mistakes before they spread through code review, generated docs, or copied snippets.
❌ Incorrect
// This documeant stays incorect after review.
publish();
/**
* Keep this changelog entry acurate and searchable.
*/
save();
✅ Correct
// This document stays correct after review.
publish();
/**
* Keep this changelog entry accurate and searchable.
*/
save();
Behavior and migration notes
- The rule is report only. It does not rewrite comment text for you.
- Built-in cspell imports cover American English, common misspellings, British/Commonwealth English variants, and a broad set of coding dictionaries such as Bash, CSS, Git, HTML, Makefile, MIME types, mnemonics, Node.js, npm, PowerShell, public licenses, scientific terms, shell, software terms, SQL, TypeScript, and Win32 terminology.
- Use
ignoreWordsto add repository-specific jargon, abbreviations, or product names inline in ESLint config. - Use
ignoreWordFilesto load accepted words from cspell-style dictionary text files instead of copying a long allowlist into your ESLint config. - Use
cspellConfigImportsto import extra cspell dictionary packages or local cspell config files. - The three dictionary-related options expect different formats:
ignoreWords: a plain array of accepted tokens written directly in ESLint config.ignoreWordFiles: an array of file paths to cspell-style word lists, resolved from the repository root when ESLint runs.cspellConfigImports: an array of cspell config imports, either local config files such as"./cspell.json"/"./config/cspell/project-terms.yaml"or package dictionary entrypoints such as"@cspell/dict-rust/cspell-ext.json".
- No safe "only spellcheck known words" mode exists. Unknown words are exactly where real typos and repository-specific terms overlap, so extend the accepted vocabulary instead of suppressing all unknowns.
- This rule is intentionally kept out of the
recommendedpreset because spellchecking tends to be more repository-specific than prose quality or task hygiene.
Additional examples
Rule option shape and defaults:
type SpellcheckCommentsOptions = {
cspellConfigImports?: readonly string[];
ignoreDigits?: boolean;
ignoreLiteral?: boolean;
ignoreWordFiles?: readonly string[];
ignoreWords?: readonly string[];
maxSuggestions?: number;
normalizeApostrophes?: boolean;
useDefaultDictionaries?: boolean;
};
const defaults = {
cspellConfigImports: [],
ignoreDigits: true,
ignoreLiteral: true,
ignoreWordFiles: [],
ignoreWords: [],
maxSuggestions: 5,
normalizeApostrophes: true,
useDefaultDictionaries: true,
};
For ignoreWordFiles, use normal cspell word-list formatting:
AcmeCloud
Synclet
WriteGoodComments
Accept local product names and limit each report to three candidates:
import writeGoodComments from "eslint-plugin-write-good-comments-2";
export default [
{
plugins: {
"write-good-comments": writeGoodComments,
},
rules: {
"write-good-comments/spellcheck-comments": [
"error",
{
ignoreWords: ["AcmeCloud", "Synclet"],
maxSuggestions: 3,
},
],
},
},
];
Load repository vocabulary from a cspell-style word list file:
import writeGoodComments from "eslint-plugin-write-good-comments-2";
export default [
{
plugins: {
"write-good-comments": writeGoodComments,
},
rules: {
"write-good-comments/spellcheck-comments": [
"error",
{
ignoreWordFiles: ["./config/cspell/project-words.txt"],
},
],
},
},
];
Import an additional cspell package dictionary for repository-specific terms:
import writeGoodComments from "eslint-plugin-write-good-comments-2";
export default [
{
plugins: {
"write-good-comments": writeGoodComments,
},
rules: {
"write-good-comments/spellcheck-comments": [
"error",
{
cspellConfigImports: ["@cspell/dict-rust/cspell-ext.json"],
},
],
},
},
];
Import a local cspell config file that already groups project-specific dictionaries:
import writeGoodComments from "eslint-plugin-write-good-comments-2";
export default [
{
plugins: {
"write-good-comments": writeGoodComments,
},
rules: {
"write-good-comments/spellcheck-comments": [
"error",
{
cspellConfigImports: ["./config/cspell/project-terms.yaml"],
},
],
},
},
];
ESLint flat config example
import writeGoodComments from "eslint-plugin-write-good-comments-2";
export default [
{
files: ["**/*.{ts,tsx,js,jsx}"],
plugins: {
"write-good-comments": writeGoodComments,
},
rules: {
"write-good-comments/spellcheck-comments": "error",
},
},
];
When not to use it
Do not use this rule when your repository relies heavily on rapidly changing domain language and the team is unwilling to maintain an allowlist of accepted terms.
If the rule is useful but specific terms are noisy, prefer ignoreWords
over disabling the rule entirely.
Package documentation
Upstream package documentation:
Rule catalog ID: R005