@bonesofspring/ai-rules 0.1.31 → 0.1.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/presets/claude/next/agents/playwright-test-generator.md +3 -3
- package/presets/claude/next/agents/playwright-test-healer.md +3 -3
- package/presets/claude/next/agents/playwright-test-planner.md +2 -2
- package/presets/cursor/next/rules/api-services.mdc +7 -7
- package/presets/cursor/next/rules/architecture-boundaries.mdc +6 -6
- package/presets/cursor/next/rules/code-quality-and-refactoring.mdc +2 -2
- package/presets/cursor/next/rules/code-review-mr.mdc +8 -8
- package/presets/cursor/next/rules/{emedcard-core.mdc → next-app-core.mdc} +16 -16
- package/presets/cursor/next/rules/playwright-agents.mdc +5 -5
- package/presets/cursor/next/rules/react-ui.mdc +12 -17
- package/presets/cursor/next/rules/store-rtk.mdc +1 -1
- package/presets/cursor/next/rules/tests-e2e-structure.mdc +3 -3
- package/presets/cursor/next/rules/tests-unit.mdc +5 -5
package/package.json
CHANGED
|
@@ -10,7 +10,7 @@ You are a Playwright Test Generator, an expert in browser automation and end-to-
|
|
|
10
10
|
Your specialty is creating robust, reliable Playwright tests that accurately simulate user interactions and validate
|
|
11
11
|
application behavior.
|
|
12
12
|
|
|
13
|
-
## Project-specific test structure (
|
|
13
|
+
## Project-specific test structure (Next.js preset)
|
|
14
14
|
|
|
15
15
|
In this project you MUST respect the existing e2e layout:
|
|
16
16
|
|
|
@@ -22,9 +22,9 @@ In this project you MUST respect the existing e2e layout:
|
|
|
22
22
|
When you generate tests:
|
|
23
23
|
|
|
24
24
|
- Use the corresponding `*.cases.md` file under `app/__tests__/e2e/**` as the source plan (for example,
|
|
25
|
-
`app/__tests__/e2e/
|
|
25
|
+
`app/__tests__/e2e/OrderHistory/order-history.cases.md`).
|
|
26
26
|
- Write or update Playwright test files only under `app/__tests__/e2e/**` (for example,
|
|
27
|
-
`app/__tests__/e2e/
|
|
27
|
+
`app/__tests__/e2e/OrderHistory/order-history.spec.ts`) instead of creating files in a separate `tests/` folder.
|
|
28
28
|
|
|
29
29
|
# For each test you generate
|
|
30
30
|
- Obtain the test plan with all the steps and verification specification
|
|
@@ -10,7 +10,7 @@ You are the Playwright Test Healer, an expert test automation engineer specializ
|
|
|
10
10
|
resolving Playwright test failures. Your mission is to systematically identify, diagnose, and fix
|
|
11
11
|
broken Playwright tests using a methodical approach.
|
|
12
12
|
|
|
13
|
-
## Project-specific test structure (
|
|
13
|
+
## Project-specific test structure (Next.js preset)
|
|
14
14
|
|
|
15
15
|
In this project you MUST respect the existing e2e layout:
|
|
16
16
|
|
|
@@ -23,8 +23,8 @@ When healing tests:
|
|
|
23
23
|
|
|
24
24
|
- Only read and modify `*.spec.ts` files under `app/__tests__/e2e/**`.
|
|
25
25
|
- Use the `*.cases.md` file in the same folder as the failing test as the source of truth for intended behavior
|
|
26
|
-
(for example, `app/__tests__/e2e/
|
|
27
|
-
`app/__tests__/e2e/
|
|
26
|
+
(for example, `app/__tests__/e2e/OrderHistory/order-history.cases.md` for
|
|
27
|
+
`app/__tests__/e2e/OrderHistory/order-history.spec.ts`).
|
|
28
28
|
|
|
29
29
|
Your workflow:
|
|
30
30
|
1. **Initial Execution**: Run all tests using `test_run` tool to identify failing tests
|
|
@@ -10,7 +10,7 @@ You are an expert web test planner with extensive experience in quality assuranc
|
|
|
10
10
|
scenario design. Your expertise includes functional testing, edge case identification, and comprehensive test coverage
|
|
11
11
|
planning.
|
|
12
12
|
|
|
13
|
-
## Project-specific test structure (
|
|
13
|
+
## Project-specific test structure (Next.js preset)
|
|
14
14
|
|
|
15
15
|
In this project you MUST respect the existing e2e layout:
|
|
16
16
|
|
|
@@ -22,7 +22,7 @@ In this project you MUST respect the existing e2e layout:
|
|
|
22
22
|
When you create or update a test plan:
|
|
23
23
|
|
|
24
24
|
- Use the appropriate `*.cases.md` file under `app/__tests__/e2e/**` (for example,
|
|
25
|
-
`app/__tests__/e2e/
|
|
25
|
+
`app/__tests__/e2e/OrderHistory/order-history.cases.md`) instead of creating files in a separate `specs/` folder.
|
|
26
26
|
- Treat these `*.cases.md` files as the canonical, human-readable test plans for the Generator and Healer agents.
|
|
27
27
|
|
|
28
28
|
You will:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Конвенции API сервисов и мапперов
|
|
2
|
+
description: Конвенции API сервисов и мапперов
|
|
3
3
|
globs: src/api/services/**/*.ts
|
|
4
4
|
alwaysApply: false
|
|
5
5
|
---
|
|
@@ -7,7 +7,7 @@ alwaysApply: false
|
|
|
7
7
|
# Роль API слоя
|
|
8
8
|
|
|
9
9
|
- Инкапсулировать всё, что связано с:
|
|
10
|
-
- HTTP
|
|
10
|
+
- HTTP‑запросами (через принятый в проекте клиент),
|
|
11
11
|
- URL/путями,
|
|
12
12
|
- заголовками и кодами ответов,
|
|
13
13
|
- DTO backend.
|
|
@@ -17,8 +17,8 @@ alwaysApply: false
|
|
|
17
17
|
|
|
18
18
|
# Структура модулей
|
|
19
19
|
|
|
20
|
-
- Для каждой доменной области (
|
|
21
|
-
- отдельный каталог в `src/api/services
|
|
20
|
+
- Для каждой доменной области (например, заказы, биллинг, настройки аккаунта):
|
|
21
|
+
- отдельный каталог в `src/api/services/<ИмяСервиса или фичи>/**` по конвенции репозитория.
|
|
22
22
|
- Внутри модуля:
|
|
23
23
|
- файлы с вызовами API (`index.ts` или `*.service.ts`);
|
|
24
24
|
- файлы мапперов (`*responseMappers.ts`);
|
|
@@ -42,8 +42,8 @@ alwaysApply: false
|
|
|
42
42
|
- не должен "глотать" ошибки без следа;
|
|
43
43
|
- либо бросает доменные/унифицированные ошибки;
|
|
44
44
|
- либо возвращает результат в `Result<T, E>`‑подобной форме (если такой паттерн принят в проекте).
|
|
45
|
-
- Интеграция с
|
|
46
|
-
-
|
|
45
|
+
- Интеграция с APM/трассировкой (если есть в проекте):
|
|
46
|
+
- централизованно (HTTP‑клиент, обёртки), а не в каждом методе сервиса.
|
|
47
47
|
|
|
48
48
|
# Требование к агенту
|
|
49
49
|
|
|
@@ -52,5 +52,5 @@ alwaysApply: false
|
|
|
52
52
|
- Не смешивать слой API и UI/store:
|
|
53
53
|
- компоненты не должны зависеть от DTO;
|
|
54
54
|
- store не должен знать о HTTP‑деталях (URL, коды).
|
|
55
|
-
- При использовании API‑сервисов в UI, store и утилитах импортировать только из public API файлов модуля (например, `@/api/services/
|
|
55
|
+
- При использовании API‑сервисов в UI, store и утилитах импортировать только из public API файлов модуля (например, `@/api/services/OrdersApi/.../index`), а не из внутренних файлов‑реализаций.
|
|
56
56
|
|
|
@@ -8,7 +8,7 @@ alwaysApply: true
|
|
|
8
8
|
- **UI (src/ui/**)**:
|
|
9
9
|
- Может импортировать: `@/ui/**`, `@/store/**`, `@/types/**`, `@/api/services/**` (через публичные интерфейсы).
|
|
10
10
|
- Не должен:
|
|
11
|
-
- обращаться к HTTP
|
|
11
|
+
- обращаться к HTTP‑клиенту напрямую;
|
|
12
12
|
- знать детали DTO backend — только доменные типы.
|
|
13
13
|
- **Store (src/store/**)**:
|
|
14
14
|
- Может импортировать: `@/store/**`, `@/api/services/**`, `@/types/**`.
|
|
@@ -31,12 +31,12 @@ alwaysApply: true
|
|
|
31
31
|
|
|
32
32
|
# Организация фич
|
|
33
33
|
|
|
34
|
-
- Для сложных фич (например,
|
|
35
|
-
- Страница: `src/ui/pages/
|
|
34
|
+
- Для сложных фич (например, `OrderCheckout`):
|
|
35
|
+
- Страница: `src/ui/pages/OrderCheckoutPage/**`.
|
|
36
36
|
- Локальные компоненты: поддиректории `components/**` внутри страницы.
|
|
37
|
-
- Связанный store: `src/store/slices/
|
|
38
|
-
- API: `src/api/services/
|
|
39
|
-
- Типы: `src/types/
|
|
37
|
+
- Связанный store: `src/store/slices/OrderCheckout/**`.
|
|
38
|
+
- API: `src/api/services/OrdersApi/OrderCheckout/**` (имя корневого сервиса взять из принятой в проекте схемы).
|
|
39
|
+
- Типы: `src/types/OrderCheckout.types.ts` или аналогичный файл.
|
|
40
40
|
|
|
41
41
|
# Требование к агенту
|
|
42
42
|
|
|
@@ -10,7 +10,7 @@ alwaysApply: true
|
|
|
10
10
|
- минимизировать "стилистический шум" (лишние правки форматирования, rename без нужды).
|
|
11
11
|
- Перед добавлением нового решения:
|
|
12
12
|
- искать аналогичное в коде и **повторять подход**, а не изобретать новый.
|
|
13
|
-
- проверять, нет ли уже подходящего компонента или паттерна в
|
|
13
|
+
- проверять, нет ли уже подходящего компонента или паттерна в существующем UI‑коде и пакетах проекта, прежде чем добавлять новый кастомный контрол.
|
|
14
14
|
- использовать при обращении к чужим модулям только их **public API** (index/barrel‑файлы и явно экспортируемые сущности), а deep‑импорты внутренних файлов рассматривать как повод для рефакторинга.
|
|
15
15
|
|
|
16
16
|
# Рефакторинг при изменениях
|
|
@@ -23,7 +23,7 @@ alwaysApply: true
|
|
|
23
23
|
- вынести дублирующуюся логику в общий хук/утилиту;
|
|
24
24
|
- типизировать `any` и `unknown`, если это безболезненно;
|
|
25
25
|
- разделить слишком крупный компонент на несколько более простых;
|
|
26
|
-
- заменить локальные «магические» CSS‑значения (цвета, отступы, размеры) на
|
|
26
|
+
- заменить локальные «магические» CSS‑значения (цвета, отступы, размеры) на токены/примитивы дизайна проекта;
|
|
27
27
|
- заменить deep‑импорты внутренних файлов других модулей на обращения к их public API.
|
|
28
28
|
|
|
29
29
|
# Ограничения
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Требования к code review агентами Cursor для
|
|
2
|
+
description: Требования к code review агентами Cursor для merge requests
|
|
3
3
|
alwaysApply: true
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -7,12 +7,12 @@ alwaysApply: true
|
|
|
7
7
|
|
|
8
8
|
- **Когда применять**
|
|
9
9
|
- Если пользователь просит: "проведи ревью", "оценить MR/ветку/дифф", "посмотри изменения".
|
|
10
|
-
- Опираться на локальный репозиторий: текущую ветку, `git diff` и открытые файлы, а не на данные
|
|
10
|
+
- Опираться на локальный репозиторий: текущую ветку, `git diff` и открытые файлы, а не на данные внешнего API хостинга.
|
|
11
11
|
|
|
12
12
|
- **Что обязан проверить агент**
|
|
13
13
|
- **Архитектура и слои**:
|
|
14
|
-
- Соблюдение правил из `architecture-boundaries.mdc` и `
|
|
15
|
-
- UI (`src/ui/**`) не ходит напрямую в HTTP
|
|
14
|
+
- Соблюдение правил из `architecture-boundaries.mdc` и `next-app-core.mdc`:
|
|
15
|
+
- UI (`src/ui/**`) не ходит напрямую в HTTP‑клиент и не знает DTO.
|
|
16
16
|
- Store (`src/store/**`) не зависит от UI и не работает с "сырыми" HTTP.
|
|
17
17
|
- API (`src/api/services/**`) не тянет UI/store, использует мапперы.
|
|
18
18
|
- **Импорты и организация кода**:
|
|
@@ -22,9 +22,9 @@ alwaysApply: true
|
|
|
22
22
|
- **Типы и TS‑строгость**:
|
|
23
23
|
- Не допускать новых `any`; предпочитать доменные типы из `src/types/**`.
|
|
24
24
|
- Проверять корректность пропсов/возвращаемых типов, особенно в UI и API‑слое.
|
|
25
|
-
- **UI
|
|
26
|
-
- Для компонентов и стилей сверяться с `react-ui.mdc` и `
|
|
27
|
-
-
|
|
25
|
+
- **UI и стили**:
|
|
26
|
+
- Для компонентов и стилей сверяться с `react-ui.mdc` и `next-app-core.mdc`:
|
|
27
|
+
- Соблюдать принятый в проекте способ стилей и общие UI‑примитивы/токены, а не "магические" значения.
|
|
28
28
|
- Сохранять консистентность с существующими компонентами и паттернами.
|
|
29
29
|
- **Тесты**:
|
|
30
30
|
- Проверять, что для нетривиальных изменений:
|
|
@@ -41,7 +41,7 @@ alwaysApply: true
|
|
|
41
41
|
- без "больших рефакторингов" в духе `code-quality-and-refactoring.mdc`, если задача локальная.
|
|
42
42
|
|
|
43
43
|
- **Ограничения для агента**
|
|
44
|
-
- Не придумывать несуществующие
|
|
44
|
+
- Не придумывать несуществующие метаданные из хостинга (лейблы MR, авторов, статусы CI), если их нет в локальных данных.
|
|
45
45
|
- Не менять общую архитектуру фичи без прямого запроса пользователя.
|
|
46
46
|
- Следовать принципу "boy scout rule": предлагать улучшения, которые реально можно внести в рамках MR.
|
|
47
47
|
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Базовые принципы, стек и архитектура
|
|
2
|
+
description: Базовые принципы, стек и архитектура Next.js приложения (preset)
|
|
3
3
|
alwaysApply: true
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Стек и окружение
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
-
|
|
8
|
+
Конкретные версии пакетов и инструментов — **из `package.json` и конфигов целевого репозитория**. Ниже — рамка preset (Next.js + React + TypeScript), без привязки к конкретному вендору UI, моков или APM:
|
|
9
|
+
|
|
10
|
+
- **Фреймворк:** Next.js, React, TypeScript (strict — если включён в проекте).
|
|
11
|
+
- **Сборка и Node:** как задано в репозитории.
|
|
12
|
+
- **Тесты:** unit/integration — runner и библиотеки проекта; e2e — инструмент проекта (правила для агентов Playwright — в отдельных файлах preset).
|
|
13
|
+
- **Моки HTTP/API:** если приняты в репо — повторять существующую схему (каталоги, регистрация, точка входа).
|
|
14
|
+
- **Стили и UI:** способ стилизации и **дизайн‑система / токены** — как уже заведено в коде; приоритет общим примитивам и токенам вместо разрозненных «магических» значений.
|
|
15
|
+
- **Наблюдаемость:** только если уже подключена в проекте — централизованно (клиент, обёртки), без дублирования в каждом методе.
|
|
16
16
|
|
|
17
17
|
# Структура проекта (верхний уровень)
|
|
18
18
|
|
|
@@ -31,21 +31,21 @@ alwaysApply: true
|
|
|
31
31
|
- `src/ui/pages/**` — страницы и контейнеры.
|
|
32
32
|
- `src/ui/components/**` — переиспользуемые компоненты.
|
|
33
33
|
- **Store слой** (`src/store/**`):
|
|
34
|
-
- `src/store/slices/**` — Redux Toolkit
|
|
34
|
+
- `src/store/slices/**` — модули состояния (в этом preset — Redux Toolkit; подробности в `store-rtk.mdc`).
|
|
35
35
|
- `src/store/middleware/**` — middleware для сайд‑эффектов (например, файлы, аналитика).
|
|
36
36
|
- **API слой** (`src/api/services/**`):
|
|
37
37
|
- Сервисы и мапперы, инкапсулирующие HTTP‑логику.
|
|
38
38
|
- **Типы** (`src/types/**`):
|
|
39
|
-
- Общие доменные типы (
|
|
39
|
+
- Общие доменные типы продукта (сущности предметной области, агрегаты и т.д.).
|
|
40
40
|
- **Моки и тестовые данные** (`src/mocks/**`):
|
|
41
|
-
-
|
|
41
|
+
- По структуре и назначению — как принято в репозитории.
|
|
42
42
|
|
|
43
43
|
# Общие архитектурные принципы
|
|
44
44
|
|
|
45
45
|
- **Чёткое разделение слоёв**:
|
|
46
46
|
- UI знает только о доменных типах и публичных интерфейсах store/API.
|
|
47
47
|
- Store знает о доменных типах и API‑сервисах.
|
|
48
|
-
- API знает о транспортном слое (HTTP,
|
|
48
|
+
- API знает о транспортном слое (HTTP, выбранный клиент) и DTO.
|
|
49
49
|
- **Никаких "проникновений" слоёв**:
|
|
50
50
|
- UI не обращается к API напрямую — только через store или абстракции сервисов.
|
|
51
51
|
- Store не работает напрямую с "сырыми" HTTP‑ответами — только через мапперы.
|
|
@@ -55,11 +55,11 @@ alwaysApply: true
|
|
|
55
55
|
|
|
56
56
|
# Кодстайл и качества кода
|
|
57
57
|
|
|
58
|
-
- Следовать конфигам `eslint
|
|
58
|
+
- Следовать конфигам линтеров и форматтера **проекта** (`eslint`, `prettier`, `stylelint` — какие есть в репо).
|
|
59
59
|
- Поддерживать:
|
|
60
60
|
- KISS, DRY, SOLID (в разумных пределах для фронта).
|
|
61
61
|
- Модульность и переиспользование через компоненты, хуки, слайсы, сервисы.
|
|
62
|
-
-
|
|
62
|
+
- Визуальную консистентность за счёт принятых в проекте UI‑примитивов и токенов, а не разовых литералов в стилях.
|
|
63
63
|
- При добавлении нового кода **искать и копировать существующие паттерны**:
|
|
64
64
|
- Для страниц — аналогичные файлы в `src/ui/pages/**`.
|
|
65
65
|
- Для блоков — компоненты в `src/ui/components/**`.
|
|
@@ -73,5 +73,5 @@ alwaysApply: true
|
|
|
73
73
|
- Найти в соответствующей директории похожие примеры и **копировать архитектурный паттерн** (структура файлов, типы, именование).
|
|
74
74
|
- Не упрощать архитектуру в ущерб существующим слоям (не тянуть API в UI, не описывать "DTO" прямо в компонентах).
|
|
75
75
|
- Избегать использования `any` при типизации кода; при необходимости использовать `unknown` с последующим безопасным сужением типов.
|
|
76
|
-
- После создания или редактирования любых файлов **обязательно проверять проект на ошибки TypeScript и ESLint** (либо точечно по изменённым файлам, либо по всему проекту) и устранять найденные проблемы, если это возможно без изменения
|
|
76
|
+
- После создания или редактирования любых файлов **обязательно проверять проект на ошибки TypeScript и ESLint** (либо точечно по изменённым файлам, либо по всему проекту) и устранять найденные проблемы, если это возможно без изменения бизнес‑логики).
|
|
77
77
|
|
|
@@ -21,8 +21,8 @@ When acting as a **Planner** (or working with the Playwright planner agent):
|
|
|
21
21
|
- **Treat `*.cases.md` as the canonical test plan files**, equivalent to Playwright's `specs/*.md`.
|
|
22
22
|
- **Location**:
|
|
23
23
|
- For a feature/domain, use the corresponding `*.cases.md` file under `app/__tests__/e2e`, e.g.:
|
|
24
|
-
- `app/__tests__/e2e/
|
|
25
|
-
- `app/__tests__/e2e/
|
|
24
|
+
- `app/__tests__/e2e/OrderHistory/order-history.cases.md`
|
|
25
|
+
- `app/__tests__/e2e/BillingReport/invoice-list.cases.md`
|
|
26
26
|
- **Content requirements**:
|
|
27
27
|
- Group scenarios by feature and subfeature using headings.
|
|
28
28
|
- For each scenario include:
|
|
@@ -44,13 +44,13 @@ When acting as a **Generator** (or working with the Playwright generator agent):
|
|
|
44
44
|
- Use the relevant `*.cases.md` file under `app/__tests__/e2e/**` as the test plan.
|
|
45
45
|
- **Target for tests**:
|
|
46
46
|
- Generate or update `*.spec.ts` files under the same folder, e.g.:
|
|
47
|
-
- plan: `app/__tests__/e2e/
|
|
48
|
-
- tests: `app/__tests__/e2e/
|
|
47
|
+
- plan: `app/__tests__/e2e/OrderHistory/order-history.cases.md`
|
|
48
|
+
- tests: `app/__tests__/e2e/OrderHistory/order-history.spec.ts` (or additional `*.spec.ts` in that folder if needed).
|
|
49
49
|
- **Structure**:
|
|
50
50
|
- Use `test.describe` to group by top-level plan sections (feature / user flow).
|
|
51
51
|
- Use `test(...)` titles that match scenario names from the plan.
|
|
52
52
|
- Prefer Page Object and fluent interfaces that already exist in this project, for example:
|
|
53
|
-
- `app/__tests__/e2e/
|
|
53
|
+
- `app/__tests__/e2e/OrderHistory/OrderHistoryPage.ts`
|
|
54
54
|
- shared helpers under `app/__tests__/e2e/_shared/`.
|
|
55
55
|
- **Seed**:
|
|
56
56
|
- If a seed test is needed, use `app/__tests__/e2e/seed.spec.ts` as the reference for environment setup.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Паттерны React/Next UI и
|
|
2
|
+
description: Паттерны React/Next UI и стилей (preset)
|
|
3
3
|
globs: src/ui/**/*.tsx
|
|
4
4
|
alwaysApply: false
|
|
5
5
|
---
|
|
@@ -10,8 +10,8 @@ alwaysApply: false
|
|
|
10
10
|
- Компонент должен:
|
|
11
11
|
- быть максимально "тонким" по бизнес‑логике;
|
|
12
12
|
- делегировать состояние в store/хуки, если оно нужно в нескольких местах;
|
|
13
|
-
-
|
|
14
|
-
- Перед
|
|
13
|
+
- опираться на **общие UI‑примитивы дизайна проекта** (пакеты или локальная библиотека компонентов), если они есть.
|
|
14
|
+
- Перед новым кастомным контролом — поискать готовый или близкий компонент в репозитории / пакетах UI проекта и переиспользовать или расширить его.
|
|
15
15
|
- Для повторяемой логики создавать `useSomething`‑хуки рядом или в `src/ui/hooks/**`.
|
|
16
16
|
- При обращении к store, API, общим хелперам и утилитам компоненты и хуки должны использовать только их **public API** (например, `@/store`, `@/store/slices/Foo`, `@/lib/utils`), а не импортировать внутренние файлы реализации других модулей.
|
|
17
17
|
|
|
@@ -19,28 +19,23 @@ alwaysApply: false
|
|
|
19
19
|
|
|
20
20
|
Для страницы/крупного блока:
|
|
21
21
|
- `FeatureBlock.tsx` — JSX и композиция.
|
|
22
|
-
- `styles.ts` —
|
|
22
|
+
- `styles.ts` или соседний модуль стилей — по конвенции репозитория (CSS Modules, CSS-in-JS, и т.д.).
|
|
23
23
|
- `index.ts` — реэкспорт (если нужно наружу).
|
|
24
24
|
|
|
25
25
|
Для переиспользуемого компонента:
|
|
26
26
|
- Папка с именем компонента:
|
|
27
27
|
- `ComponentName.tsx`
|
|
28
|
-
-
|
|
28
|
+
- файлы стилей по принятой схеме;
|
|
29
29
|
- опционально: `types.ts`, `hooks.ts`.
|
|
30
30
|
|
|
31
|
-
#
|
|
31
|
+
# Стили и дизайн‑токены
|
|
32
32
|
|
|
33
|
-
- Для
|
|
34
|
-
- кнопки, чекбоксы, поля ввода и т.д.
|
|
35
|
-
- Стили:
|
|
36
|
-
- Использовать Linaria (`@linaria/react`, `@linaria/core`) со статическими стилями.
|
|
37
|
-
- Стили располагать в `styles.ts` рядом с компонентом.
|
|
38
|
-
- Применять дизайн‑токены из `@sds/tokens-*`, `@sds/brand-colors` и `@sds/tokens-typography` для цветов, типографики, отступов, размеров, радиусов, теней и т.д., а не “магические” значения.
|
|
33
|
+
- Для визуала использовать **тот стек стилей и токенов, который уже в проекте** (переменные, тема, общие классы, дизайн‑пакет).
|
|
39
34
|
- Избегать:
|
|
40
|
-
- inline‑стилей, кроме
|
|
41
|
-
- дублирования
|
|
42
|
-
-
|
|
43
|
-
|
|
35
|
+
- inline‑стилей, кроме простых случаев;
|
|
36
|
+
- дублирования оформления, уже закрытого общими примитивами;
|
|
37
|
+
- «магических» литералов (`#xxxxxx`, произвольные `17px` / `23px`), если в проекте есть токены или масштаб.
|
|
38
|
+
- Если подходящего токена нет — локальный примитив **в одном месте** с последующим выравниванием под систему дизайна при возможности.
|
|
44
39
|
|
|
45
40
|
# Пропсы и типизация
|
|
46
41
|
|
|
@@ -61,7 +56,7 @@ alwaysApply: false
|
|
|
61
56
|
# Тестирование UI
|
|
62
57
|
|
|
63
58
|
- Для нетривиальных компонентов добавлять тесты:
|
|
64
|
-
-
|
|
59
|
+
- **Testing Library** для React, как принято в проекте;
|
|
65
60
|
- проверять поведение и бизнес‑правила, а не конкретные CSS‑классы.
|
|
66
61
|
- В тестах ориентироваться на текст, роли и aria‑атрибуты.
|
|
67
62
|
|
|
@@ -31,7 +31,7 @@ alwaysApply: false
|
|
|
31
31
|
- через `createAsyncThunk` или RTK Query.
|
|
32
32
|
- внутри thunk:
|
|
33
33
|
- вызывать API через сервисы из `@/api/services/**`;
|
|
34
|
-
- не
|
|
34
|
+
- не вызывать HTTP‑клиент напрямую — только через сервисы `@/api/services/**`.
|
|
35
35
|
- Сайд‑эффекты (логирование, аналитика, работа с файлами):
|
|
36
36
|
- выносить в middleware (`src/store/middleware/**`) или специализированные слайсы.
|
|
37
37
|
|
|
@@ -19,7 +19,7 @@ alwaysApply: false
|
|
|
19
19
|
- Каждый сценарий из `*.cases.md` должен иметь соответствующий тест (или набор тестов).
|
|
20
20
|
- **Нельзя** ослаблять проверки в тестах, если это противоречит бизнес‑ожиданиям из планов.
|
|
21
21
|
- Предпочтительно использовать:
|
|
22
|
-
- page‑objects (например, `
|
|
22
|
+
- page‑objects (например, `OrderHistoryPage.ts`);
|
|
23
23
|
- общие хелперы из `_shared`.
|
|
24
24
|
|
|
25
25
|
# Именование e2e‑тестов
|
|
@@ -29,10 +29,10 @@ alwaysApply: false
|
|
|
29
29
|
- Формат заголовков e2e‑тестов (`test(...)` / `it(...)`):
|
|
30
30
|
- перед текстовым описанием сценария указывается **префикс с номером** в формате: `ПРЕФИКС-XXX Описание сценария`.
|
|
31
31
|
- `ПРЕФИКС` — аббревиатура из **первых букв слов** тестируемой сущности, записанная **латиницей в верхнем регистре**.
|
|
32
|
-
- пример: `
|
|
32
|
+
- пример: `OrderHistory` → `OH`, `BillingReport` → `BR`.
|
|
33
33
|
- `XXX` — порядковый номер теста **с тремя разрядами и лидирующими нулями**: `001`, `002`, `010`, `123` и т.д.
|
|
34
34
|
- пример полного названия e2e‑теста:
|
|
35
|
-
- `test('
|
|
35
|
+
- `test('OH-001 Отображается список заказов', async ({ page }) => { ... })`
|
|
36
36
|
- внутри одной сущности (`ПРЕФИКС`) номера тестов должны образовывать **непротиворечивую последовательность**, без дубликатов номеров.
|
|
37
37
|
|
|
38
38
|
# data-testid для e2e
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Unit и интеграционные тесты (
|
|
2
|
+
description: Unit и интеграционные тесты (Testing Library и runner проекта)
|
|
3
3
|
globs: src/**/*.test.{ts,tsx}
|
|
4
4
|
alwaysApply: false
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Общие правила тестирования
|
|
8
8
|
|
|
9
|
-
-
|
|
9
|
+
- **Runner и матчеры** — как в проекте (часто Jest или Vitest); для компонентов — **@testing-library/react**.
|
|
10
10
|
- Основная цель тестов:
|
|
11
11
|
- проверять **поведение и бизнес‑правила**, а не реализацию или внутренние детали.
|
|
12
12
|
- Именование:
|
|
@@ -17,14 +17,14 @@ alwaysApply: false
|
|
|
17
17
|
|
|
18
18
|
- Использовать `render` из `@testing-library/react`.
|
|
19
19
|
- Ассерты:
|
|
20
|
-
-
|
|
20
|
+
- матчеры DOM для Testing Library, как подключены в проекте (`toBeInTheDocument`, `toHaveTextContent` и т.п.).
|
|
21
21
|
- Взаимодействия:
|
|
22
22
|
- `userEvent` из `@testing-library/user-event`.
|
|
23
23
|
|
|
24
24
|
# Изоляция и моки
|
|
25
25
|
|
|
26
26
|
- Для работы с API/store:
|
|
27
|
-
- мокать store (через test‑store) или использовать
|
|
27
|
+
- мокать store (через test‑store) или использовать принятый в проекте способ моков HTTP/API.
|
|
28
28
|
- Не мокать то, что является частью публичного контракта фичи, если это ломает смысл теста.
|
|
29
29
|
|
|
30
30
|
# Мапперы и преобразование данных
|
|
@@ -39,7 +39,7 @@ alwaysApply: false
|
|
|
39
39
|
- Добавлять тесты для критичных веток логики и edge‑кейсов.
|
|
40
40
|
- При работе с данными:
|
|
41
41
|
- использовать **типы респонса** из API (DTO‑типы), а также **целевые доменные типы** из `@/types/**`, не дублировать интерфейсы в тестах;
|
|
42
|
-
- по возможности опираться на данные и
|
|
42
|
+
- по возможности опираться на данные и обработчики из `src/mocks/**` (или аналог в репо), а не плодить случайные тестовые данные "с нуля".
|
|
43
43
|
- При написании unit‑тестов рядом с компонентом или модулем:
|
|
44
44
|
- **не создавать** поддиректорию `__tests__` внутри папки компонента;
|
|
45
45
|
- именовать файлы тестов с суффиксом `*.spec.ts` / `*.spec.tsx`, а не `*.test.ts` / `*.test.tsx`.
|