## Перевірка `.cspell.json` — структура та canonical import

Rego-пакет: `text.cspell`

Цільовий файл: `.cspell.json`

**Що перевіряється:**

- `version` — має відповідати канону (наразі `"0.2"`)
- `useGitignore` — має бути `true`: cspell поважає всі `.gitignore` репо, тож білд-артефакти (`target/`, `dist/` тощо) не потрапляють у прогін і не потребують дублювання в `ignorePaths`
- `gitignoreRoot` — має бути `"."`: обмежує збір `.gitignore` коренем репо. Без цього cspell підіймається каталогами вище і в git-worktree застосовує `.gitignore` основного дерева (патерн на кшталт `.claude/worktrees/` матчить усе) → «Files checked: 0», делта-лінт мовчки зелений при червоному CI
- `language` — поле обов'язкове (presence-only, значення довільне, наприклад `"en,uk"`)
- `ignorePaths` — масив має бути надмножиною канонічних glob-ів, включно з `docs/adr/**`
- `import` — має містити підрядок `@nitra/cspell-dict`; заборонені будь-які записи з підрядком `@cspell/dict-` (використовуй лише `@nitra/cspell-dict`)

**Приклади:**

✓ правильно:

```json
{
  "version": "0.2",
  "language": "en,uk",
  "useGitignore": true,
  "gitignoreRoot": ".",
  "import": ["@nitra/cspell-dict/cspell-ext.json"],
  "ignorePaths": ["**/node_modules/**", "**/.git/**", "docs/adr/**"]
}
```

✗ неправильно:

```json
{
  "version": "0.1",
  "import": ["@cspell/dict-de"],
  "ignorePaths": []
}
```

(відсутнє `language`, застарілий `version`, заборонений `@cspell/dict-`, не всі canonical `ignorePaths`)

## Локальні виключення та мови

Коли **cspell** підсвічує слово, спочатку **виправ текст**, а не розширюй словник:

- виправ **друкарські помилки** та неправильні форми;
- **перефразуй коректною українською** (або англійською, залежно від контексту файлу): заміни кальки й випадкові склади на звичні формулювання зі словників;
- заміни **жаргон**, якщо є природний еквівалент у тому ж стилі документації (наприклад, у коментарях пиши «функція зворотного виклику» замість розмовного запозичення з англійського `callback`).

У секцію `words` у `.cspell.json` додавай записи **лише якщо переписати коректно неможливо** або **недоречно**: власні назви, стабільні технічні терміни без усталеного перекладу в проєкті, ідентифікатори зовнішніх API тощо.

### Інші мови

**`@nitra/cspell-dict`** від `2.0.0` уже містить залежності на типові словники (`@cspell/dict-uk-ua`, `@cspell/dict-ru_ru` та інші) — якщо потрібна мова вже є серед них, додай лише код у поле `language` (наприклад `"en,uk,ru-ru,nitra"`), без окремих `@cspell/dict-*` у споживачі. Порядок у `import` може впливати на пріоритет словників — тримай корпоративний `@nitra/cspell-dict` першим, якщо додаєш інші розширення (рідко). Якщо мови немає в корпоративному пакеті — розширюй `@nitra/cspell-dict`, а не підключай `@cspell/dict-*` у корені репозиторію-споживача. Огляд upstream-словників: [streetsidesoftware/cspell-dicts](https://github.com/streetsidesoftware/cspell-dicts).

### Fix-режим: класифікація через omlx

cspell не має нативного `--fix`. Fix-режим **класифікує** знахідки через локальну LLM: detect → omlx-класифікація distinct-слів (bounded JSON-вихід) → валідні слова авто-дописуються у `.cspell.json#words` (sorted/dedup) → ймовірні одруки лишаються списком на ревʼю (не авто-виправляються). Максимум 80 distinct-слів за прогін.
