chore: cursor agents, rules, hooks and workspace docs

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Ivan Fontosh
2026-05-11 22:20:28 +08:00
parent 01cde7476c
commit a58732f78a
25 changed files with 1016 additions and 261 deletions
+23
View File
@@ -0,0 +1,23 @@
# Правила Cursor (`cursorAi`)
Постоянные AI-правила воркспейса **DNDGamePlayer / dnd_project**. Обзор экосистемы: **`AGENTS.md`**, пути и сборка: **`WORKSPACE.md`**.
## Ядро воркспейса
- **`project.mdc`** — карта репо, пайплайн, verify по каждому репозиторию.
- **`agents-pipeline-order.mdc`** — обязательный порядок этапов: фронтенд → UI-автотесты → ревью кода → верификация (UI или API).
- **`pipeline-execution-template.mdc`** — единый формат краткого отчёта по каждому этапу.
## Стандарты кода и документации
- **`frontend-agent-core.mdc`** — базовая миссия и дисциплина агента (`alwaysApply`).
- **`frontend-development-standards.mdc`** — архитектура, состояние, UI, TS, комментарии, модалки; **i18n только для `dnd_player`** (`alwaysApply`).
- **`agent-core-contracts-and-quality.mdc`** — контракты модулей, type-first, интеграция, комментарии про намерение (`alwaysApply`).
- **`agent-test-gates-mandatory.mdc`** — обязательные тестовые гейты и верификация (`alwaysApply`).
## Роли пайплайна (чек-листы; под-агенты в `.cursor/agents/`)
- **`agent-1-frontend-developer.mdc`** — этап 1.
- **`agent-2-ui-test-developer.mdc`** — этап 2 (для **`dnd_player`** см. секцию про фактический стек тестов в конце файла).
- **`agent-2-code-reviewer.mdc`** — этап 3 (имя файла из шаблона Cubekit; роль = ревьювер кода).
- **`agent-3-ui-tester.mdc`** — этап 4 (UI или эквивалент для headless).
@@ -0,0 +1,47 @@
---
description: Роль 1 — фронтэнд разработчик в агентном пайплайне
alwaysApply: true
---
# Агент 1: Фронтэнд разработчик
## Роль в пайплайне
Первый обязательный этап реализации задачи. Агент выполняет разработку и подготавливает результат к проверке.
## Артефакт этапа
- Внесенные изменения в код.
- Краткое описание, что и зачем изменено.
- Инструкция, как проверить результат локально.
- Явная фиксация рисков и ограничений, если они есть.
## Чек-лист реализации
- Архитектура фичи соответствует доменной структуре папок; экран не перегружен бизнес-логикой.
- Пути, роли, статусы и перечислимые значения вынесены в константы/типы; магические строки не размножаются.
- Локальный и глобальный стейт разделены прозрачно; скрытые синглтоны в компонентах не используются.
- HTTP-логика, базовые URL и окружение берутся из конфигурации и общего слоя API.
- Для форм используется единый стек валидации проекта; параллельный стек без решения команды не вводится.
- Для тяжелых форм применяются декомпозиция, `memo` и вынос схем в утилиты.
- UI строится на базе **существующих** общих компонентов и канона репозитория; дубли базовых примитивов без причины не добавляются.
- Модалки и подтверждения действий — только через внутренние компоненты приложения; `alert`/`confirm`/`prompt` и аналоги в новом коде **renderer** не используются.
- У модалок — минимум две кнопки: отмена и основное действие с подписью по смыслу (см. стандарты; **в `dnd_player`** после задачи на i18n — через ключи **ru**/**en**).
- Повторяющаяся логика и UI выносятся в переиспользуемые модули; необоснованные дубли не вводятся.
- Формы создания и редактирования одной сущности — одна общая форма с условиями для различий режимов.
- Новый стиль UI следует канону репозитория; устаревшие способы стилизации не применяются в новых экранах.
- TypeScript соблюдает `strict` (в TS-репозиториях); новые `any` и `@ts-ignore` не добавляются.
- **Только в `dnd_player`:** после внедрения i18n (**ru**, **en**) — пользовательский текст UI в ключи; до внедрения — литералы в стиле репозитория.
- Над нетривиальными публичными сущностями есть краткие смысловые комментарии в стиле репозитория.
- Diff минимальный и сфокусированный; изменения не выходят за рамки задачи без необходимости.
## Критерий передачи в этап 2
Этап считается готовым к передаче разработчику UI-автотестов только если все пункты чек-листа выполнены или есть явно задокументированные исключения с причиной.
## Связь с тестовыми гейтами
- Этап 1 **не закрывает задачу целиком**. Завершение возможно только после этапов тестирования и UI‑верификации.
- Если при подготовке реализации обнаружены неоднозначности в контракте интеграции (границы модулей, публичные props, ожидания окружения), агент обязан:
- зафиксировать контракт письменно (кратко),
- и реализовывать строго в его рамках до передачи в этап 2.
+53
View File
@@ -0,0 +1,53 @@
---
description: Роль 3 — ревьювер кода в агентном пайплайне (файл agent-2-* — имя из шаблона Cubekit)
alwaysApply: true
---
# Агент 3: Ревьювер кода
## Роль в пайплайне
Третий обязательный этап после разработки и UI-автотестов. Агент анализирует изменения в коде и тестах, затем выдает замечания по качеству и рискам.
## Артефакт этапа
- Список найденных проблем и рисков.
- Статус: можно передавать в UI-тестирование или нужно вернуть на доработку.
- Краткое резюме по критичности замечаний.
- Явная ссылка на нарушенные пункты стандартов.
## Чек-лист ревью
- Проверена архитектурная целостность: доменные границы, тонкие страницы, вынос API/утилит/типов из разметки.
- Проверено отсутствие новых магических строк в маршрутах, ролях, статусах и других доменных перечислениях.
- Проверено разделение ответственности между стором, запросами и HTTP-слоем.
- Проверено, что формы не вводят второй стек валидации и не дублируют правила в JSX.
- Проверено использование **общих компонентов и паттернов** репозитория и отсутствие необоснованного дублирования примитивов.
- Проверено: модалки и подтверждения через дизайн-систему, без `alert`/`confirm`/`prompt` в изменённом коде; у модалок две кнопки (отмена + смысловая основная).
- Проверено: нет дублирования форм создания/редактирования одной сущности без общей формы и условий; нет необоснованного копипаста вместо общих компонентов/хуков.
- Проверено соблюдение канона стилизации репозитория в новом коде.
- Проверено соблюдение `strict` и отсутствие новых `any`/`@ts-ignore` без обоснования.
- Проверено, что измененное поведение покрыто релевантными unit/component/e2e/a11y-тестами по риску изменения.
- Проверено, что тесты используют принятый стек проекта и не завязаны на хрупкие детали реализации.
- Проверено, что новый код не снижает покрытие без явно согласованной причины.
- Проверено вынесение пользовательских строк в i18n **только для `dnd_player`** после внедрения мультиязычности (**ru**, **en**); до внедрения — допустимы литералы без противоречия задаче.
- Проверено, что изменения минимальны, сфокусированы и не ослабляют линтер/форматтер/pre-commit/политику компилятора.
- Для изменений в shared-зависимостях и контрактах модульной федерации проведена повышенная проверка рисков.
## Формат замечаний
- Замечания группируются по критичности: блокирующие, важные, рекомендательные.
- Каждое замечание содержит: что нарушено, где нарушено, как исправить.
- Если нарушений нет, фиксируется явный вердикт: «ревью пройдено».
## Критерий передачи в этап 4
В UI-тестирование передаются только изменения со статусом «ревью пройдено» или с согласованным списком неблокирующих замечаний.
## Усиление гейта по тестам и интеграции
- Если отсутствуют обязательные тесты по риску (unit/component/e2e/a11y) или они нестабильны/падают — ревью считается **не пройдено**.
- Если изменение затрагивает интеграционные контракты (подключаемые модули, публичные API, маршрутизация), ревьювер обязан требовать:
- явной фиксации контракта,
- проверки интеграционного сценария,
- и подтверждения browser verification на этапе 4.
@@ -0,0 +1,85 @@
---
description: Роль 2 — разработчик UI-автотестов в агентном пайплайне
alwaysApply: true
---
# Агент 2: Разработчик UI-автотестов
## Роль в пайплайне
Второй обязательный этап после фронтэнд-разработки. Агент добавляет или обновляет автотесты для измененного поведения до передачи задачи на код-ревью.
## Репозиторий `dnd_player` (фактический стек)
- Тесты выполняются через **`npm run test`** в корне **`dnd_player/`**: список файлов на **Node test runner** + **`tsx --test`** и **`node --test`** (см. `dnd_player/package.json`).
- Новые тесты пиши **в том же стиле и том же раннере**, что уже приняты в репозитории (имена `*.test.ts`, `*.test.mjs`, существующие импорты и паттерны).
- Блок «Базовый стек» ниже (Vitest, RTL, MSW, Playwright) — **ориентир для проектов, где это уже заведено**. Не добавляй эти зависимости только ради этих правил; миграция инфраструктуры — отдельное решение команды.
- Числовые пороги coverage применяй **если в репозитории есть отчёт coverage**; иначе критерий — осмысленное покрытие изменённого поведения и зелёный `npm run test`.
## Остальные репозитории (`project-converter`, `DndGamePlayerLicenseServer`)
- **Политика вариант A:** при любом изменении поведения в **том же PR** — скрипт **`test`** в **`package.json`** (если ещё нет) и автотесты на изменённое поведение; **`npm run test`** обязан быть green. Не откладывать на отдельный эпик после merge.
- Используй **`npm test`** и остальные скрипты из **`package.json`** этого репо.
- Стиль и раннер — как принято после добавления; отсутствие инфраструктуры **не** оправдывает merge без тестов (только явное согласование владельца при объективной блокировке).
## Обязательный гейт этапа (нельзя пропускать)
- Автотесты **обязательны**. Нельзя передавать задачу дальше “без тестов”, “потом добавим”, “и так понятно”.
- Если тест не добавлен, это считается **незавершённостью этапа**, пока:
- не зафиксирована объективная причина (например, отсутствует инфраструктура),
- не описан риск,
- и не согласовано компенсирующее покрытие (альтернативный тест/проверка).
## Базовый стек (для проектов с Vitest / Playwright; в `dnd_player` см. выше)
- Unit и component-тесты: `Vitest`.
- Тестирование React UI: `React Testing Library` и `@testing-library/user-event`.
- Моки HTTP/API: `MSW`.
- E2E и UI-сценарии: `Playwright`.
- Accessibility smoke: `axe` через Playwright или Vitest-совместимый инструмент.
Если в репозитории уже принят другой стек, новый код следует существующему стеку. Миграция тестовой инфраструктуры выполняется только отдельным решением.
## Базовое покрытие (при наличии coverage в проекте)
- `statements`: не ниже 70%.
- `lines`: не ниже 70%.
- `functions`: не ниже 70%.
- `branches`: не ниже 60%.
- Критичные зоны должны стремиться к 85%+:
- валидаторы,
- API/DTO-мапперы,
- бизнес-утилиты,
- shared-компоненты,
- сложные формы.
Новый код не должен снижать общее покрытие. Критичная логика не принимается без релевантного теста.
## Чек-лист автотестов
- Для pure-логики добавлены unit-тесты: утилиты, мапперы, форматтеры, валидаторы, доменные правила.
- Для UI добавлены component/integration-тесты на поведение, а не на внутреннюю реализацию (если инфраструктура это поддерживает).
- Проверены состояния `loading`, `empty`, `error`, `success` для асинхронных UI-путей.
- Для форм проверены ввод, валидация, ошибки, `submit` и `reset`; для общей формы создания/редактирования — оба режима, если затронуты.
- Для изменённых модалок и подтверждений — сценарии с двумя действиями (отмена и основная кнопка) по ролям/доступному тексту, без опоры на нативные диалоги.
- HTTP-сценарии покрыты через принятый в проекте способ моков (например `MSW`, если есть).
- Для критичных пользовательских потоков добавлен или обновлён e2e/smoke-тест **если в репозитории уже есть Playwright или аналог**.
- Для ключевых экранов добавлена базовая accessibility-проверка, если это поддержано тестовым стеком.
- Тесты не завязаны на хрупкие детали реализации и используют пользовательские селекторы/роли там, где это возможно.
## Артефакт этапа
- Список добавленных или обновленных тестов.
- Список покрытых сценариев.
- Команды для запуска релевантных проверок.
- Отчет о влиянии на покрытие, если покрытие доступно.
## Критерий передачи в этап 3
Этап считается пройденным только если:
- изменённое поведение покрыто релевантными автотестами (unit/component/integration и e2e по риску и по возможностям репозитория), **и**
- тесты выполняются успешно в CI/локально на доступной инфраструктуре, **и**
- для всех обязательных состояний (`loading`, `empty`, `error`, `success`) есть проверки там, где они затронуты.
Если тест не добавлен по объективной причине — этап **не пройден**, пока не согласована альтернатива и не зафиксирован риск.
+54
View File
@@ -0,0 +1,54 @@
---
description: Роль 4 — верификация сценариев (UI или API) в агентном пайплайне
alwaysApply: true
---
# Агент 4: Верификация сценариев (UI / API)
## Роль в пайплайне
Четвертый обязательный этап после разработки, автотестов и код-ревью. Проверка **как у потребителя** функционала: графический UI или **HTTP/API** для headless-сервисов.
## Обязательный гейт этапа
### Репозитории с UI (`dnd_player`, `project-converter`)
- Проверка в **окне Electron** или в **браузере** (если применимо к сценарию) — не только чтение кода и вывод тест-раннера.
- При невозможности выполнить проверку этап **не пройден**, пока не зафиксирована причина и не согласован эквивалент (см. **`agents-pipeline-order.mdc`**).
### Репозиторий без UI (`DndGamePlayerLicenseServer`)
- Проверка **живых HTTP-сценариев** (локальный сервер, `curl`/скрипт/интеграционные тесты) по затронутым маршрутам и телам ответов.
- Нельзя завершать этап только сверкой исходников без запросов к работающему процессу (или явно согласованного стенда).
## Артефакт этапа
- Результаты проверки сценариев (UI или API).
- Перечень дефектов и шаги воспроизведения (для API: запрос, ответ, ожидание).
- Статус: принято | возврат в разработку.
- Окружения/режимы (если применимо).
## Чек-лист (UI)
- Ключевые сценарии, затронутые изменением; loading / empty / error / success где уместно.
- Базовая доступность: фокус, клавиатура, labels, семантика.
- **Только `dnd_player`:** после внедрения i18n (**ru**, **en**) — корректность ключей и переключения языка в затронутых местах.
- Согласованность с **существующими** паттернами UI репозитория (без отсылки к внешнему «UI-kit из правил»).
- Модалки: отмена + основная кнопка, без нативных `alert`/`confirm`/`prompt` в сценариях **renderer**.
- Формы, навигация (если есть), регрессии по затронутым потокам.
## Чек-лист (API, license server)
- Успех и ошибки по затронутым эндпоинтам; граничные случаи (невалидное тело, отзыв, лимиты устройств — по смыслу задачи).
- Соответствие контракту JSON полей клиенту.
## Формат дефекта
- Предусловия, шаги, фактический и ожидаемый результат; критичность: блокирующий | важный | минорный.
## Критерий завершения пайплайна
- Для UI: сценарии проверены в Electron/браузере; нет блокирующих/важных дефектов.
- Для API: сценарии проверены запросами к сервису; нет блокирующих/важных расхождений с ожиданием.
При дефектах — возврат на этап 1 и повтор пайплайна по порядку.
@@ -0,0 +1,69 @@
---
description: Universal engineering guardrails (contracts, type gates, integration first)
alwaysApply: true
---
# Универсальные guardrails качества (без привязки к стеку)
## 1) Контракты и границы — прежде реализации
- Любой модуль/пакет/экспортируемый компонент, который может подключаться отдельно, обязан иметь **явный публичный контракт**:
- что экспортирует и в каком формате,
- какие входы/выходы (props, события, параметры),
- какие сайд‑эффекты,
- какие зависимости и ожидания окружения.
- Запрещено строить реализацию, если контракт не определён или противоречив.
## 2) Самодостаточность отдельно подключаемых частей
- Любая отдельно подключаемая часть (экспорт/плагин/remote/виджет) должна быть **самодостаточной**:
- не зависеть от контекстов/сторов/инициализаций, созданных в другом отдельно подключаемом модуле,
- если эта зависимость не гарантирована контрактом.
- Если нужно общее состояние между отдельно подключаемыми частями, оно должно быть:
- вынесено в общий стабильный слой, **или**
- передано через входные параметры, **или**
- инициализироваться одинаково в каждой части (явно и по контракту).
## 3) Type-first дисциплина
- Ошибки статической типизации — это дефекты качества. Их нельзя оставлять “на потом”.
- Публичные интерфейсы обязаны быть строгими: “unknown/any” допускаются только с явной валидацией/преобразованием и описанием причины.
## 4) Спецификация — единственный источник правды
- Запрещено угадывать сигнатуры, параметры и типы “по аналогии”.
- При интеграции внешних API/SDK/компонентов необходимо опираться на их спецификацию/интерфейсы и приводить типы и колбэки строго к ожидаемым.
## 5) Разделение UI и операций (слой данных/операций)
- Запрещено “размазывать” IO‑операции (HTTP/Storage/side-effects) по UI‑обработчикам.
- Все операции должны быть выделены в отдельный слой (API/Service/UseCase/Store), а UI только вызывает методы слоя.
- Один endpoint/операция = один метод в слое данных. Дубли запрещены.
## 6) Единые имена и единые точки экспорта
- Публичные типы и контракты экспортируются из одного очевидного места (public API/index).
- Запрещены почти одинаковые имена и параллельные версии интерфейсов. Один контракт = один источник правды.
## 7) Комментарии — про намерение и ограничения
- Комментарии должны объяснять **зачем** и **какие ограничения** (а не пересказывать код).
- Нетривиальные функции/эффекты/обработчики должны иметь краткий смысловой комментарий, если это требование команды/репозитория.
## 8) Интеграция важнее локальной работоспособности
- Если модуль предназначен для работы в составе хоста/контейнера/платформы — обязательна проверка именно в этом режиме.
- “Собирается локально” не считается завершением, если интеграционный сценарий не проверен.
## 9) Минимальный diff и контроль отклонений
- Изменения должны быть минимальными и сфокусированными на задаче.
- Любое отклонение (временный обход, известный риск, упрощение) фиксируется письменно: что, почему, риск, как закрыть.
## 10) Запрет бездумного переноса паттернов
- Перенос примера/паттерна из другого места допустим только после проверки совместимости:
- контракты,
- ожидания типов,
- окружение/инициализации,
- интеграционный сценарий.
@@ -0,0 +1,48 @@
---
description: Mandatory testing gates for all code repos (same rigor)
alwaysApply: true
---
# Обязательные тестовые гейты
## Политика **вариант A** (репозитории без полного CI как у плеера)
Для **`project-converter`** и **`DndGamePlayerLicenseServer`**: любое изменение поведения сопровождается в **том же PR** скриптом **`npm test`** (если его ещё не было) и автотестами; merge без этого **запрещён** правилами (исключение — только явное согласование при объективной блокировке). См. **`project.mdc`**.
## 1) Запрет «готово без тестов»
- Любая задача, влияющая на поведение, **не считается выполненной**, пока:
- не написаны требуемые тесты **в рамках стека этого репозитория**,
- тесты не проходят,
- и не выполнена **верификация этапа 4** (см. `agent-3-ui-tester.mdc`, `agents-pipeline-order.mdc`): UI (Electron/браузер) или HTTP-сценарии для сервера.
## 2) Какие виды тестов обязательны
Подбирать по риску. Минимум:
- **Unit** для чистой логики (утилиты, валидаторы, мапперы, подпись, canonical JSON и т.д.).
- **Component/integration** для UI — если инфраструктура в репозитории есть (`dnd_player`: см. `npm run test`).
- **E2E** — если в репозитории уже есть стек и изменение затрагивает сквозные потоки.
- **A11y smoke** — если инструменты есть в репо.
Если тип теста объективно недоступен — зафиксировать причину, риск, эквивалент; **не закрывать** без согласования (та же планка для всех репозиториев).
## 3) UI: сценарии
Для затронутого UI (где применимо): loading / empty / error / success; формы; модалки (cancel + primary); таблицы — по наличию в UI.
## 4) Верификация «как у пользователя»
- **`dnd_player`**: Electron renderer или браузер; см. также `npm run dev` / сценарии задачи.
- **`project-converter`**: окно Electron, выбор файла, конвертация.
- **`DndGamePlayerLicenseServer`**: запросы к запущенному серверу, проверка статусов и тел ответов.
## 5) i18n
Проверка ключей и текстов в UI — **только для `dnd_player`**, после задачи на i18n (**ru**, **en**). До неё — согласованность литералов и UX.
## 6) Критерий завершения задачи
- Тесты написаны и зелёные (включая e2e по риску, если стек есть).
- Верификация этапа 4 выполнена (UI или API).
- В ответе — краткий test plan и результат.
+45
View File
@@ -0,0 +1,45 @@
---
description: Обязательный порядок выполнения агентного пайплайна (все кодовые репозитории)
alwaysApply: true
---
# Пайплайн агентной разработки
## Область действия
Полный пайплайн ниже применяется к **любым** изменениям **кода/конфигов/тестов** в репозиториях **`dnd_player`**, **`project-converter`**, **`DndGamePlayerLicenseServer`**. **Одинаковая жёсткость:** те же этапы, те же гейты «не готово без тестов и без верификации», без ослабления «потому что не плеер».
Репозиторий **`cursorAi`** (только правила и документация воркспейса) **не входит** в обязательный четырёхэтапный пайплайн и **не** является целью хука **`stop`**: для задач только в `cursorAi` выставь в **`.cursor/pipeline-state.json`** поле **`"verify_repo": "none"`** — хук завершится без прогона `npm` в других репо (см. **`project.mdc`**).
## Обязательный триггер запуска пайплайна
Любое сообщение пользователя, которое приводит к правке кода в перечисленных репозиториях, обязано проходить полный пайплайн (если пользователь явно не сузил scope до «только совет / только текст»).
## Обязательная последовательность
1. Фронтэнд разработчик (или **разработчик** для headless/JS — тот же чек-лист по смыслу: реализация, контракты, minimal diff).
2. Разработчик автотестов (UI или unit/integration по стеку репозитория).
3. Ревьювер кода.
4. Верификация «как у пользователя» или **эквивалент** (см. ниже).
## Этап 4 по типу репозитория
- **`dnd_player`**: браузер или окно **Electron** (renderer), затем verify-скрипты репозитория.
- **`project-converter`**: окно **Electron** утилиты, сценарии выбора файла и конвертации; затем **`npm run test`** и прочие скрипты из `package.json` этого репо. **Вариант A:** при изменении поведения скрипт `test` и тесты — **в том же PR** (см. **`project.mdc`**).
- **`DndGamePlayerLicenseServer`**: нет графического UI — этап 4 = **проверка HTTP-сценариев** (локальный запуск, запросы к эндпоинтам, разбор ответов) с отчётом по **`pipeline-execution-template.mdc`**; не считать достаточным только чтение кода.
## Правила перехода между этапами
- Нельзя запускать следующий этап, пока предыдущий не завершен.
- Замечания на этапе 2 возвращают на этап 1 при необходимости смены реализации.
- Замечания ревьювера — на этап 1 или 2 по зоне ответственности.
- Замечания этапа 4 — на этап 1, затем снова 2 → 3 → 4.
- Задача завершена только после всех четырёх этапов и **успешной verify** целевого репозитория (см. **`project.mdc`**, поле **`verify_repo`** в **`pipeline-state.json`**). Хук **`stop`** (`.cursor/hooks/final-verify.cjs`) гоняет проверки для **`dnd_player`**, **`project-converter`** или **`DndGamePlayerLicenseServer`** в зависимости от **`verify_repo`**; для **`cursorAi`** используй **`verify_repo`: `none`**.
## Отчётность
На каждом этапе используй формат из **`pipeline-execution-template.mdc`**.
## Детали по стекам
Чек-листы этапов: **`agent-1-*` … `agent-3-ui-tester.mdc`**, под-агенты: **`.cursor/agents/`**, skill: **`feature-pipeline`**.
+37
View File
@@ -0,0 +1,37 @@
---
description: Базовые стандарты для агентной frontend-разработки
alwaysApply: true
---
# Базовые правила frontend-агента
## Миссия
Создавать поддерживаемые frontend-функции с предсказуемым поведением, явными предположениями и проверяемым результатом.
## Рабочий процесс
- Начинай с уточнения цели, ограничений и ожидаемого влияния на UX.
- Предпочитай небольшие инкрементальные изменения вместо широких переписываний.
- Сохраняй действующие конвенции проекта, если нет явной причины их менять.
- После существенных правок выполняй релевантные проверки и фиксируй результаты.
## Качество кода
- Ставь читаемость и явные имена выше «умных» сокращений.
- Держи компоненты сфокусированными: одна четкая ответственность на компонент/модуль.
- Выноси повторяющуюся логику в хуки или утилиты, когда появляется дублирование; не размножай копии форм и модалок, если достаточно одной параметризованной реализации.
- Не добавляй мертвый код, неиспользуемые экспорты и закомментированные блоки.
## Надежность и совместимость
- Не ломай публичные API компонентов без документирования шагов миграции.
- Сохраняй базовую доступность (labels, клавиатурная навигация, семантические элементы).
- Обрабатывай состояния загрузки, пустого результата и ошибок в асинхронных UI-путях; подтверждения и модалки — через UI приложения, не через нативные диалоги браузера (в Electron renderer — аналогично: внутренние модалки приложения).
- Добавляй или обновляй тесты при изменении поведения критичных пользовательских сценариев.
## Взаимодействие с агентом
- Явно указывай, что изменено, зачем это изменено и как это проверить.
- Прямо фиксируй риски и компромиссы при нетривиальных решениях.
- Если требования неоднозначны, остановись и уточни перед реализацией предположений.
@@ -0,0 +1,93 @@
---
description: Унифицированные стандарты разработки для репозиториев воркспейса dnd_project
alwaysApply: true
---
# Унифицированные стандарты разработки
## Область применения
- Разделы про **React / renderer UI / формы / модалки** относятся к репозиториям с пользовательским интерфейсом (**`dnd_player`**, **`project-converter`** и т.п.). Для **headless** кода (**`DndGamePlayerLicenseServer`**) применимы блоки про слои данных, контракты, тесты и дисциплину изменений; требования к модалкам и renderer UI к такому коду **не предъявляются**.
- **i18n** (ключи пользовательских строк и т.д.) — **только для продукта DNDGamePlayer**, репозиторий **`dnd_player`**; планируемые локали: **ru**, **en**. В **`project-converter`**, **`DndGamePlayerLicenseServer`**, **`cursorAi`** отдельных требований по i18n **нет**.
- Репозитории **без TypeScript**: требования раздела «TypeScript и качество» выполняются после внедрения TS; до этого — **эквивалентная строгость**: `node --check` по согласованным входным файлам, явные контракты (JSDoc при необходимости), отсутствие необоснованного ослабления проверок, тесты на изменённое поведение в доступном стеке.
## Архитектура и папки
- Фичи организуются по папкам: один доменный блок = одна директория.
- Публичный вход фичи обычно размещается в `index.tsx` (или в согласованном с репозиторием входном файле).
- Рядом с фичей допустимы локальные конфиги таблиц, схем модалок и подпапки `Modals`, `Components` по необходимости.
- Страницы и составные экраны остаются тонкими: сторы, HTTP/API, утилиты и типы контрактов выносятся отдельно.
- Типы API и DTO держатся в выделенной зоне (`interfaces`, `api-types` и т.п.).
- Исторические опечатки и неудачные имена в путях не размножаются; при правках в зоне их нужно по возможности исправлять.
## Маршруты и доменные строки
- Пути маршрутов берутся из единого модуля констант приложения (если в проекте есть маршрутизация).
- Строковые литералы не дублируются в `Route`, `Link`, `navigate`.
- Роли, статусы и иные перечислимые значения задаются через `const` + `as const` и производный union-тип (или согласованный `enum`).
- Магические строки в доменных значениях не допускаются.
## Состояние и данные
- Локальный UI-стейт ведется предсказуемо, включая выбранную библиотеку реактивности, если она принята в проекте.
- Доступ к глобальному стору делается через явный контекст или согласованный DI.
- Скрытые синглтоны в компонентах не используются.
- При сочетании библиотеки запросов и стора зоны ответственности разделяются явно:
- кэш и запросы,
- конфиг, базовые URL, навигация, сессия.
- HTTP работает через общий слой (клиент, перехватчики, обработка ошибок).
- Базовые URL и окружение берутся из конфигурации, а не из JSX.
## Формы и валидация
- На проекте используется один канон валидации и резолвера для форм (например `react-hook-form`, если принят в репозитории).
- Новый код не должен создавать параллельный стек валидации без решения команды и плана миграции.
- Для тяжелых форм используются:
- `memo`,
- декомпозиция на подкомпоненты,
- вынос генерации схем в утилиты.
- Дублирование правил валидации в разметке не допускается.
- Создание и редактирование одной и той же сущности реализуются **одной общей формой** (один компонент/модуль формы, общая схема по возможности). Отдельные «форма создания» и «форма редактирования» как копии друг друга не допускаются.
- Если поведение полей отличается между режимами создания и редактирования, различия задаются условно: условный рендеринг блоков полей, условная обязательность и правила в схеме валидации, различие дефолтов и `defaultValues`, флаги режима (`mode`, `isEdit` и т.п.) — без дублирования разметки и правил там, где достаточно параметризации.
## UI и стили
- **Единый источник** визуальных примитивов и отступов — **существующие общие компоненты и соглашения этого репозитория** (не внешняя «дизайн-система из правил»). Перед добавлением нового примитива ищи аналог в кодовой базе; дубли без причины не вводятся.
- Новый UI создаётся по **канону репозитория** (например CSS Modules или другой зафиксированный способ).
- Токены темы хранятся в согласованном месте проекта (если принято).
- Устаревший подход стилизации допускается только в наследуемых зонах; новые экраны на нем не строятся без решения команды.
## Модальные окна и подтверждения действий
- Любые модальные окна и запросы подтверждения в **renderer** реализуются **только** через **внутренние** компоненты приложения и паттерны **этого** репозитория (не нативные блокирующие диалоги ОС в зоне UI продукта).
- Использование **`alert` / `confirm` / `prompt`** в новом и изменяемом коде **renderer** запрещено (исключения — только явно зафиксированные в самом репозитории, например отдельный отладочный путь).
- **Продукт DNDGamePlayer** (`dnd_player`): после внедрения i18n (план: **ru**, **en**) подписи модалок и UI — через **ключи**; до внедрения — литералы в стиле репо.
- Повторяющаяся разметка и логика модалок выносится в переиспользуемые обёртки/конфиги, а не копируется между фичами.
## Переиспользование кода и дублирование
- Новый код проектируется с максимальным переиспользованием: общие компоненты, хуки, утилиты, схемы валидации и типы — единственный источник правды для повторяющегося поведения.
- Необоснованное дублирование блоков UI и бизнес-логики в новом коде не допускается: при появлении второго такого же фрагмента выносится общий модуль; при правках смежных дублей по возможности консолидируют реализацию.
- Наследуемый дублирующийся код при точечных задачах не обязан переписываться целиком, но расширять дубли вместо выноса общего решения не следует без явной причины (объём/риск миграции фиксируется в задаче или ревью).
## TypeScript и качество
- В репозиториях на TypeScript обязателен **`strict`**; новые `any` и `@ts-ignore` не добавляются.
- Ослабления возможны только точечно, с комментарием причины и ссылкой на задачу.
- Границы модулей (роутинг, внешние библиотеки) типизируются осмысленно.
- Практика «везде any» как норма запрещена.
## Локализация (только **`dnd_player`**) и комментарии
- **Продукт DNDGamePlayer** (`dnd_player`): планируется отдельная задача на **мультиязычность** — языки **русский (ru)** и **английский (en)**. После внедрения i18n пользовательские строки интерфейса выносятся в **ключи**; префиксы и соглашения по ключам — единые для приложения; новые строки без ключей не добавляются. До внедрения стека i18n действуют литералы в текущем стиле репозитория.
- **Вне `dnd_player`:** отдельных требований к i18n нет; строки — в принятом для репозитория виде.
- Над нетривиальными функциями, эффектами и публичными сущностями добавляется краткий смысловой комментарий там, где это принято в репозитории.
- Стиль комментариев и кодировка файлов соответствуют стандарту репозитория (UTF-8, читаемый язык команды).
## Инженерная дисциплина
- Изменения должны быть минимальными и сфокусированными (`minimal diff`).
- Предсказуемость решения приоритетнее «хитрости».
- Изменения контрактов модульной федерации и shared-зависимостей проходят с повышенным вниманием на ревью.
- Линтер, форматтер, pre-commit и политика компилятора (включая React Compiler, если включен) соблюдаются как в репозитории; если скрипта ещё нет — не ослаблять дисциплину «отмазкой репозитория», а фиксировать проверки в задаче (**одинаковая жёсткость** ожиданий по всем проектам воркспейса).
- Запрещено ослаблять правила только ради быстрого прохождения проверок.
@@ -0,0 +1,28 @@
---
description: Единый короткий шаблон отчета для этапов пайплайна
alwaysApply: true
---
# Шаблон отчета по этапу пайплайна
Использовать этот формат на каждом этапе:
1. Фронтэнд разработчик
2. Разработчик UI-автотестов
3. Ревьювер кода
4. UI-тестировщик
## Формат
- Этап: `<название роли>`
- Статус: `пройдено | пройдено с замечаниями | не пройдено`
- Что проверено: `<3-6 кратких пунктов>`
- Найдено: `<нет | список замечаний/дефектов>`
- Решение по этапу: `<передать дальше | вернуть на этап 1>`
- Следующее действие: `<кто и что делает дальше>`
## Правила заполнения
- Формулировки краткие и проверяемые.
- Для замечаний указывать критичность: `блокирующий | важный | минорный`.
- Если этап не пройден, обязательно указывать условие повторной проверки.
+54 -20
View File
@@ -3,38 +3,72 @@ description: Workspace-wide workflow and conventions (dnd_project)
alwaysApply: true
---
# DNDGamePlayer / `dnd_project` — правила работы над задачами (future-pipeline)
# DNDGamePlayer / `dnd_project` — правила работы над задачами
**Перед первой задачей в сессии по коду, архитектуре или продукту** открой и учти **`AGENTS.md`** в корне репозитория **`cursorAi`** — там обязательный обзор экосистемы и карта репозиториев. Детали путей и сборки: **`WORKSPACE.md`**.
**Перед первой задачей в сессии по коду, архитектуре или продукту** открой и учти **`AGENTS.md`** в корне репозитория **`cursorAi`** — там обзор экосистемы и карта репозиториев. Детали путей и сборки: **`WORKSPACE.md`**.
Эти правила применяются **только** когда запрос пользователя требует **изменений в репозитории** (код/конфиги/тесты). Для чисто текстовых задач (описания, маркетинг, переписка) pipeline не запускаем.
Эти правила применяются **только** когда запрос пользователя требует **изменений в репозитории** (код/конфиги/тесты). Для чисто текстовых задач (описания, маркетинг, переписка) пайплайн не запускаем.
**Корень воркспейса Cursor** — обычно каталог `cursorAi` с единым `.cursor/`. Исходники плеера — в соседнем репозитории **`dnd_player/`** (см. `WORKSPACE.md`).
## future-pipeline (обязательный порядок)
## Стандарты кода, комментариев и документации
### 1) Implementation
- Прочитать релевантный код (минимум 1 файл), найти реальную причину бага/задачи.
- Делать **minimal, review-friendly diff** и следовать текущим паттернам проекта.
- Не добавлять зависимости без явной причины.
Помимо этого файла действуют правила в той же папке:
### 2) Review
- Самопроверка изменений: edge-cases, состояние UI (loading/error/empty/disabled), a11y, регрессии.
- Если задача нетривиальная: запустить внутренний «строгий ревью» (под-агент reviewer).
- **`frontend-agent-core.mdc`**, **`frontend-development-standards.mdc`** — стиль кода, UI, формы, модалки, TS, комментарии; **i18n — только в `dnd_player`** (планируются языки **ru** и **en** — см. `frontend-development-standards.mdc`).
- **`agent-core-contracts-and-quality.mdc`**, **`agent-test-gates-mandatory.mdc`** — контракты, тестовые гейты, верификация.
### 3) Tests
- Обновить/добавить тест(ы), если поведение изменилось или был баг.
- Для мелких правок допускается «облегчённый режим» без под-агентов, но тесты всё равно должны проходить там, где они есть.
## Пайплайн (кодовые репозитории)
### 4) Verify (всегда, перед ответом — для **`dnd_player`**)
Порядок этапов: **`agents-pipeline-order.mdc`**. Отчёт по этапу: **`pipeline-execution-template.mdc`**. Чек-листы: **`agent-1-frontend-developer.mdc`** … **`agent-3-ui-tester.mdc`**. Под-агенты: **`.cursor/skills/feature-pipeline/SKILL.md`**.
Из каталога **`dnd_player/`** (или через хук из корня воркспейса, см. `.cursor/hooks/final-verify.cjs`):
**Не входит в обязательный пайплайн:** репозиторий **`cursorAi`** (только `.md` / `.mdc` правил и описаний). Для таких правок полный цикл из четырёх этапов **не требуется**; хук **`stop`**: **`verify_repo`: `none`**.
- `npm run lint`
- `npm run typecheck`
- `npm run test`
Последовательность для **`dnd_player`**, **`project-converter`**, **`DndGamePlayerLicenseServer`**:
Если задача касалась **только** `project-converter` или **DndGamePlayerLicenseServer** — выполни адекватную проверку для этого репозитория (`node --check`, локальный прогон) и явно укажи в ответе, что полный набор команд плеера не запускался (если он не нужен по смыслу).
1. Реализация (minimal diff, паттерны **целевого** репозитория).
2. Автотесты на изменённое поведение (стек репозитория).
3. Ревью кода.
4. Верификация: UI (Electron/браузер) или HTTP-сценарии для сервера.
### `.cursor/pipeline-state.json`
Обязательные ключи: `frontend_development`, `ui_autotests`, `code_review`, `ui_browser_verification` — все **`"done"`** перед успешным хуком (кроме режима **`verify_repo`: `none`**).
Поле **`verify_repo`** (цель хука **`stop`** и автоматической verify):
| Значение | Когда ставить | Что делает хук `final-verify.cjs` |
|----------|----------------|-----------------------------------|
| **`dnd_player`** | Задача по плееру (по умолчанию) | `npm run lint`, `typecheck`, `test` в **`dnd_player/`** |
| **`project-converter`** | Задача по конвертеру | `npm run lint`, `node --check` по `src/`, обязательный **`npm run test`** (скрипт и тесты — по политике A в том же PR, что и правки поведения) |
| **`DndGamePlayerLicenseServer`** | Задача по серверу лицензий | `node --check` по `src/`, `lib/`, обязательный **`npm run test`** |
| **`none`** | Только правки в **`cursorAi`** | Сразу **exit 0**, четыре ключа пайплайна **не проверяются** |
Переопределение без правки файла: переменная окружения **`VERIFY_REPO`** (те же значения). Корни соседних репо: родитель каталога `cursorAi` (см. **`WORKSPACE.md`**); для плеера дополнительно **`DND_PLAYER_ROOT`**; для всех соседей — **`DND_PROJECT_ROOT`** (абсолютный путь к папке `dnd_project`).
## Verify перед ответом (по репозиторию задачи)
Перед ответом пользователю все проверки **целевого** репозитория должны быть **зелёными**; не подменять verify другим репо.
### Политика тестов **вариант A** (`project-converter`, `DndGamePlayerLicenseServer`)
Любая задача, которая **меняет поведение** этих репозиториев, в **том же PR** обязана: добавить или расширить **`npm test`** в **`package.json`**, добавить автотесты на затронутое поведение и довести **`npm run test`** до green. Откладывать появление скрипта `test` или тестов «отдельным эпиком» после merge **нельзя**. Исключение только при объективной блокировке (тогда — запись в задаче, риск, согласование с владельцем процесса), а не «пока не дошли руки».
### `dnd_player`
`npm run lint`, `npm run typecheck`, `npm run test` из корня репозитория.
### `project-converter`
`npm run lint`, **`node --check`** по entrypoints в `src/`, **`npm run test`** (обязателен — политика **вариант A**). Реальные lint/typecheck — по мере появления скриптов; до этого не ослаблять требование **тестов в том же PR**, что и изменение поведения.
### `DndGamePlayerLicenseServer`
**`node --check`** по модулям, **`npm run test`** (обязателен — политика **вариант A**). Скрипт `start` для ручного запуска сервера не заменяет автотесты.
### `cursorAi`
Обязательный 4-этапный пайплайн **не применяется**. Согласованность ссылок и имён файлов — по усмотрению задачи; для хука **`stop`** выставь **`verify_repo`: `none`**.
Если что-то упало — исправить и повторить до green.