From fa5f7660c7a5bcdcbf78e2df2691ab42a194cd5a Mon Sep 17 00:00:00 2001 From: Ku6epXBOCTuK Date: Fri, 11 Sep 2026 07:39:51 +0500 Subject: [PATCH] chore: update lint rules --- AGENTS.md | 66 +++------ docs/backlog.md | 14 +- .../__tests__/design-tokens.test.ts | 60 ++++---- web/eslint-plugins/__tests__/helpers.ts | 16 +++ .../__tests__/interface-props.test.ts | 99 +++++++++++++ .../__tests__/no-mixed-imports.test.ts | 8 +- .../__tests__/no-string-union-alias.test.ts | 78 ++++++++++ web/eslint-plugins/conventions/index.js | 28 ++++ .../conventions/interface-props.js | 135 ++++++++++++++++++ .../conventions/no-string-union-alias.js | 64 +++++++++ web/eslint-plugins/conventions/utils.js | 15 ++ web/eslint.config.js | 28 ++++ 12 files changed, 532 insertions(+), 79 deletions(-) create mode 100644 web/eslint-plugins/__tests__/interface-props.test.ts create mode 100644 web/eslint-plugins/__tests__/no-string-union-alias.test.ts create mode 100644 web/eslint-plugins/conventions/index.js create mode 100644 web/eslint-plugins/conventions/interface-props.js create mode 100644 web/eslint-plugins/conventions/no-string-union-alias.js create mode 100644 web/eslint-plugins/conventions/utils.js diff --git a/AGENTS.md b/AGENTS.md index 8c18b1e..01daecd 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -24,66 +24,40 @@ ## Правила кода -### Svelte 5: типизация props через `interface Props` +Синтаксические ограничения описывать не нужно — они проверяются линтером +(весь список правил и токены-префиксы в `web/eslint-plugins/README.md`, +прогон: `pnpm --dir web lint` / `pnpm --dir web lint:all`). Здесь — только то, +что линтер не умеет. -Все типизированные пропсы компонентов описываются через локальный -`interface Props`, а деструктуризация идёт через аннотацию типа при `$props()`: +### Svelte 5 -```svelte - -``` +Новая константа или тип не заводится, пока не произведён поиск существующего +определения (по ключу в соседних модулях и по всему `web/src/`). Это правило +в первую очередь для ИИ-агентов: дублирующее определение ухудшает правки в +нескольких местах и запутывает. (Синтаксис самих определений — под линтером: +строка `conventions/no-string-union-alias` и т.д.) -Не использовать инлайн-дженерик `$props<{ ... }>()` — он тяжело читается и -разносит тип и деструктуризацию по разным местам. Также **не использовать -инлайн-импорты в типах** (`children?: import('svelte').Snippet;`) — все -`import type` поднимаются наверх файла. +### Дизайн -> Правило «всегда `interface Props` + `let {...}: Props = $props()`» стандартным -> ESLint-правилом не покрывается — остаётся конвенцией. - -### Дизайн: новый визуальный язык - -Описание дизайна — в `docs/plan-redesign.md`. Общие правила: +Описание нового визуального языка — в `docs/plan-redesign.md`. Общие правила, +которые линтер не проверяет: - Новый дизайн живёт в `web/src/app.css` (корневые маршруты), старый — в `web/src/app_v1.css` (маршруты `/v1/*`). - Все повторяющиеся визуальные элементы — отдельные компоненты в `web/src/lib/components/`, даже «просто div с двумя стилями». - -### Линтинг дизайн-токенов - -Запрещено «захардкоживать» дизайн: цвета, размеры, длительности и z-index -обязаны приходить из CSS-переменных. Прогон: `pnpm --dir web lint:all`. - -- **Цвета**: только `hct(...)` в `app.css`, seed-токены - (`--brand-main`/`--brand-alt`) и `color-mix(...)` — исключения. - `oklch()/rgb()/#hex` в `--color-*` запрещены. -- **Размеры**: `--space-*`, `--text-*`, `--radius-*`, `--size-*`. -- **Breakpoints**: `@custom-media --bp-*` (объявления в `app.css`, используются - как `@media (--bp-*)`). -- **z-index**: `--z-*`; **длительности**: `--duration-*`, `--ease-*`. -- В `