@bonesofspring/ai-rules 0.1.36 → 0.1.39
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/README.md +7 -3
- package/bin/cli.js +55 -31
- package/package.json +1 -1
- package/presets/claude/next/CLAUDE.md +24 -5
- package/presets/claude/next/agents/code-reviewer.md +56 -0
- package/presets/claude/next/agents/debugger.md +58 -0
- package/presets/claude/next/agents/feature-developer.md +45 -0
- package/presets/claude/next/agents/qa-tester.md +54 -0
- package/presets/claude/next/agents/solution-architect.md +70 -0
- package/presets/claude/next/agents/task-analyst.md +105 -0
- package/presets/claude/next/agents/task-router.md +105 -0
- package/presets/claude/next/commands/README.md +5 -1
- package/presets/claude/next/commands/feature-continue.md +46 -0
- package/presets/claude/next/commands/feature-start.md +25 -0
- package/presets/claude/next/commands/task-continue.md +43 -0
- package/presets/claude/next/commands/task.md +40 -0
- package/presets/claude/next/commands/technical-retro.md +53 -0
- package/presets/claude/next/rules/README.md +47 -11
- package/presets/claude/next/rules/api-and-data/README.md +7 -1
- package/presets/claude/next/rules/api-and-data/api-services.md +57 -0
- package/presets/claude/next/rules/api-and-data/http-client.md +40 -0
- package/presets/claude/next/rules/api-and-data/store-rtk.md +65 -0
- package/presets/claude/next/rules/architecture/README.md +11 -1
- package/presets/claude/next/rules/architecture/api-public-imports.md +25 -0
- package/presets/claude/next/rules/architecture/architecture-boundaries.md +67 -0
- package/presets/claude/next/rules/architecture/feature-delivery-workflow.md +99 -0
- package/presets/claude/next/rules/architecture/layer-barrel-exports.md +53 -0
- package/presets/claude/next/rules/architecture/types-public-imports.md +28 -0
- package/presets/claude/next/rules/stack/README.md +9 -1
- package/presets/claude/next/rules/stack/arrow-functions.md +40 -0
- package/presets/claude/next/rules/stack/navigation-router.md +56 -0
- package/presets/claude/next/rules/stack/next-app-core.md +83 -0
- package/presets/claude/next/rules/stack/no-type-assertion.md +52 -0
- package/presets/claude/next/rules/stack/types-jsdoc.md +37 -0
- package/presets/claude/next/rules/testing/README.md +9 -1
- package/presets/claude/next/rules/testing/playwright-agents.md +69 -0
- package/presets/claude/next/rules/testing/tests-e2e-structure.md +52 -0
- package/presets/claude/next/rules/testing/tests-unit.md +66 -0
- package/presets/claude/next/rules/tooling-and-review/README.md +12 -1
- package/presets/claude/next/rules/tooling-and-review/agent-team-intake.md +9 -0
- package/presets/claude/next/rules/tooling-and-review/agent-team-orchestrator.md +97 -0
- package/presets/claude/next/rules/tooling-and-review/code-quality.md +50 -0
- package/presets/claude/next/rules/tooling-and-review/code-review-mr.md +67 -0
- package/presets/claude/next/rules/tooling-and-review/package-manager.md +20 -0
- package/presets/claude/next/rules/tooling-and-review/post-change-lint.md +43 -0
- package/presets/claude/next/rules/ui-and-accessibility/README.md +8 -1
- package/presets/claude/next/rules/ui-and-accessibility/component-styles.md +50 -0
- package/presets/claude/next/rules/ui-and-accessibility/css-property-order.md +20 -0
- package/presets/claude/next/rules/ui-and-accessibility/no-props-spread.md +52 -0
- package/presets/claude/next/rules/ui-and-accessibility/react-ui.md +90 -0
- package/presets/claude/next/team/README.md +64 -0
- package/presets/claude/next/team/tasks/.gitkeep +1 -0
- package/presets/cursor/next/agents/README.md +25 -0
- package/presets/cursor/next/agents/code-reviewer.md +57 -0
- package/presets/cursor/next/agents/debugger.md +59 -0
- package/presets/cursor/next/agents/feature-developer.md +46 -0
- package/presets/cursor/next/agents/qa-tester.md +55 -0
- package/presets/cursor/next/agents/solution-architect.md +71 -0
- package/presets/cursor/next/agents/task-analyst.md +111 -0
- package/presets/cursor/next/agents/task-router.md +106 -0
- package/presets/cursor/next/commands/README.md +33 -1
- package/presets/cursor/next/commands/feature-continue.md +14 -0
- package/presets/cursor/next/commands/feature-start.md +28 -0
- package/presets/cursor/next/commands/task-continue.md +43 -0
- package/presets/cursor/next/commands/task.md +40 -0
- package/presets/cursor/next/commands/technical-retro.md +76 -0
- package/presets/cursor/next/hooks/chain-team-phases.sh +216 -0
- package/presets/cursor/next/hooks.json +11 -0
- package/presets/cursor/next/rules/README.md +11 -3
- package/presets/cursor/next/rules/agent-team-intake.mdc +14 -0
- package/presets/cursor/next/rules/agent-team-orchestrator.mdc +102 -0
- package/presets/cursor/next/rules/api-public-imports.mdc +1 -0
- package/presets/cursor/next/rules/api-services.mdc +1 -0
- package/presets/cursor/next/rules/architecture-boundaries.mdc +1 -1
- package/presets/cursor/next/rules/code-quality-and-refactoring.mdc +9 -0
- package/presets/cursor/next/rules/code-review-mr.mdc +6 -7
- package/presets/cursor/next/rules/css-property-order-stylelint.mdc +25 -0
- package/presets/cursor/next/rules/feature-delivery-workflow.mdc +5 -5
- package/presets/cursor/next/rules/layer-barrel-exports.mdc +58 -0
- package/presets/cursor/next/rules/next-app-core.mdc +1 -1
- package/presets/cursor/next/rules/no-cross-component-styles-import.mdc +55 -0
- package/presets/cursor/next/rules/no-props-spread.mdc +26 -3
- package/presets/cursor/next/rules/package-manager.mdc +25 -0
- package/presets/cursor/next/rules/post-change-lint.mdc +48 -0
- package/presets/cursor/next/rules/react-ui.mdc +31 -2
- package/presets/cursor/next/rules/technical-retro.mdc +5 -51
- package/presets/cursor/next/rules/tests-unit.mdc +1 -0
- package/presets/cursor/next/rules/types-public-imports.mdc +1 -0
- package/presets/cursor/next/team/README.md +106 -0
- package/presets/cursor/next/team/tasks/.gitkeep +0 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Границы между слоями
|
|
2
|
+
|
|
3
|
+
## UI (`app/src/ui/**`)
|
|
4
|
+
|
|
5
|
+
- Может импортировать: `@/ui/**`, `@/store/**`, типы из `@/types` и enum из `@/types/enums` (**только как в `architecture/types-public-imports.md`**), контракт к API — **только** `import … from '@/api'` (**`architecture/api-public-imports.md`**).
|
|
6
|
+
- Не должен:
|
|
7
|
+
- обращаться к HTTP‑клиенту напрямую;
|
|
8
|
+
- знать детали DTO backend — только доменные типы.
|
|
9
|
+
|
|
10
|
+
## Store (`app/src/store/**`)
|
|
11
|
+
|
|
12
|
+
- Может импортировать: `@/store/**`, сервисы и публичные сущности API — **только** из `@/api` (**`architecture/api-public-imports.md`**), типы из `@/types` и enum из `@/types/enums` (**`architecture/types-public-imports.md`**).
|
|
13
|
+
- Не должен:
|
|
14
|
+
- зависеть от конкретных UI‑компонентов;
|
|
15
|
+
- напрямую работать с global/window API.
|
|
16
|
+
- Вызовы к backend — только через сервисы, импортируемые из `@/api`; **транспортные** типы ответа и ошибки (из `@/types`, в том же виде, что у прикладного HTTP‑клиента) во thunk допустимы, если так выстроен API‑слой (`api-and-data/http-client.md`, `api-and-data/store-rtk.md`).
|
|
17
|
+
|
|
18
|
+
## API (`app/src/api/**`)
|
|
19
|
+
|
|
20
|
+
Реализация в `services/**`, `clients/**`, реэкспорт в `app/src/api/index.ts`:
|
|
21
|
+
|
|
22
|
+
- Внутри слоя: типы из `@/types` и enum из `@/types/enums` (**`architecture/types-public-imports.md`**); импорты `@/api/services/**`, `@/api/clients/**`, относительные пути между файлами слоя (`api-and-data/http-client.md`, `api-and-data/api-services.md`).
|
|
23
|
+
- Не должен:
|
|
24
|
+
- тянуть в себя UI или store;
|
|
25
|
+
- смешивать HTTP‑слой и доменный слой — использовать мапперы.
|
|
26
|
+
|
|
27
|
+
## UI и обращение к API (`@/api`)
|
|
28
|
+
|
|
29
|
+
- По умолчанию сценарии с **изменением серверного состояния** и координация нескольких шагов — через **store** (`createAsyncThunk`, dispatch, паттерн фичи в репозитории).
|
|
30
|
+
- Прямой вызов методов сервисов, импортированных из **`@/api`**, из UI допустим только в **узких случаях**: преимущественно **чтение** или действие **без необходимости держать результат в Redux**; те же **доменные типы**, что использовал бы thunk; **не** дублировать уже существующий сценарий из store и **не** протаскивать DTO в компоненты.
|
|
31
|
+
- Предпочтительно оформлять такие вызовы так же, как в **соседних фичах** репозитория (хук‑фасад, отдельный хук и т.д.).
|
|
32
|
+
|
|
33
|
+
## Порты и адаптеры (краткая карта)
|
|
34
|
+
|
|
35
|
+
- **Входящий адаптер**: UI — ввод пользователя, отображение; зависит от store и доменных типов, не от транспорта.
|
|
36
|
+
- **Оркестрация сценариев**: store (slices, thunk) — вызывает сервисы, кладёт в state **доменные** модели после маппинга.
|
|
37
|
+
- **Исходящий порт (контракт к backend)**: публичный API **`@/api`** (barrel `app/src/api/index.ts`; реализация — в `app/src/api/services/**` и т.д., см. `architecture/api-public-imports.md`).
|
|
38
|
+
- **Исходящий адаптер**: общая реализация HTTP в **`app/src/lib/clients/**`** и экземпляры в **`app/src/api/clients/**`**.
|
|
39
|
+
|
|
40
|
+
## Фича как срез
|
|
41
|
+
|
|
42
|
+
- Для сложной фичи выравниваются имена и термины (**единый язык** предметной области) в типах, селекторах, сервисах и UI; структура папок — как в соседних фичах репозитория.
|
|
43
|
+
|
|
44
|
+
# Правила импортов
|
|
45
|
+
|
|
46
|
+
- Всегда использовать алиас `@/...` для импортов между слоями.
|
|
47
|
+
- Внутри одного модуля/фичи можно использовать относительные импорты, но **без подъёма выше корня фичи** (избегать `../../../`).
|
|
48
|
+
- При обращении из компонентов, хуков, утилит и других модулей к чужому слою или фиче использовать только **public API** (barrel/index‑файлы и явно экспортируемые сущности), не делать deep‑импорты внутренних файлов других фич; для регламентированных слоёв — **`architecture/layer-barrel-exports.md`** и `architecture/*-public-imports.md`; для API‑слоя снаружи `app/src/api/**` — **`architecture/api-public-imports.md`** (только `@/api`).
|
|
49
|
+
- При добавлении нового кода проверять:
|
|
50
|
+
- если модуль переиспользуемый — он должен зависеть только от более "низких" слоёв (types, utils, api), но не от страниц.
|
|
51
|
+
|
|
52
|
+
# Организация фич
|
|
53
|
+
|
|
54
|
+
- Для сложных фич (например, `OrderCheckout`):
|
|
55
|
+
- Страница: `app/src/ui/pages/OrderCheckoutPage/**`.
|
|
56
|
+
- Локальные компоненты: поддиректории `components/**` внутри страницы.
|
|
57
|
+
- Связанный store: `app/src/store/slices/OrderCheckout/**`.
|
|
58
|
+
- API: `app/src/api/services/OrdersApi/OrderCheckout/**` (имя корневого сервиса взять из принятой в проекте схемы).
|
|
59
|
+
- Типы: `app/src/types/**` с экспортом через barrel **`app/src/types/index.ts`** (`architecture/types-public-imports.md`).
|
|
60
|
+
|
|
61
|
+
# Требование к агенту
|
|
62
|
+
|
|
63
|
+
При добавлении новой функциональности:
|
|
64
|
+
|
|
65
|
+
- Разместить файлы в **соответствующих слоях**.
|
|
66
|
+
- Проверить существующие фичи с аналогичной структурой и **повторить их организацию**.
|
|
67
|
+
- Не "коротить" слои (например, не вызывать API прямо из компонента только ради упрощения).
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Доставка фичи (сквозной порядок)
|
|
2
|
+
|
|
3
|
+
Типичная фича с данными с backend и общим состоянием. Детали слоёв — в `architecture/architecture-boundaries.md`, `stack/next-app-core.md`.
|
|
4
|
+
|
|
5
|
+
Плейсхолдеры: `<FeatureName>`, `<ServiceRoot>`, `<Area>` — нейтральные имена; реальные имена брать из соседних фич того же типа.
|
|
6
|
+
|
|
7
|
+
## Инварианты перед кодом
|
|
8
|
+
|
|
9
|
+
- Найти в том же слое фичу сопоставимой сложности и **повторить структуру каталогов и паттерн именования**.
|
|
10
|
+
- Не добавлять `any`; при необходимости — `unknown` и сужение типа.
|
|
11
|
+
- После правок — **`tooling-and-review/post-change-lint.md`**: `lint:js` + `lint:css` + `type-check`; менеджер пакетов — `tooling-and-review/package-manager.md`.
|
|
12
|
+
|
|
13
|
+
## Чеклист (порядок работ)
|
|
14
|
+
|
|
15
|
+
1. **Доменные типы** — `app/src/types/**`, экспорт через barrel `app/src/types/index.ts` (`architecture/types-public-imports.md`, **`architecture/layer-barrel-exports.md`**); JSDoc полей — `stack/types-jsdoc.md`.
|
|
16
|
+
2. **Контракт API** — DTO ответов/запросов там, где принято в репо; целевые доменные типы в `@/types`.
|
|
17
|
+
3. **Мапперы** — DTO → домен в `*responseMappers.ts` или аналоге; чистые функции (`api-and-data/api-services.md`).
|
|
18
|
+
4. **Сервисы** — `app/src/api/services/<ServiceRoot>/<Segment>/`: вызовы только через прикладные клиенты `app/src/api/clients/**`, public API модуля (`api-and-data/api-services.md`, `api-and-data/http-client.md`, **`architecture/layer-barrel-exports.md`**). Без `fetch` из UI/store. Новые публичные экспорты (фасады, типы, **константы путей** для моков) — в **`app/src/api/index.ts`** (`@/api`).
|
|
19
|
+
5. **Моки (MSW)** — `app/src/mocks/data/<feature>/`: `data.ts`, `handlers.ts`; собрать хендлеры в **`app/src/mocks/handlers.ts`**. В хендлерах — **те же константы путей**, что и в API (импорт из `@/api`), **не дублировать сырые строки URL**. В репозитории могут быть **два контура** (браузерный worker и Node `setupServer` для тестов): общий список хендлеров должен оставаться согласованным — при добавлении проверять входные точки в `app/src/mocks/**`. Точка входа регистрации (например `app/src/mocks/index.js`).
|
|
20
|
+
6. **Состояние** — `app/src/store/slices/<FeatureName>/`: `createSlice` / `createAsyncThunk`, доменные модели в state (`api-and-data/store-rtk.md`); thunk вызывает сервисы из `@/api`. Подключить редюсер в **`app/src/store/reducers.ts`**. Новый **middleware**: `app/src/store/middleware/**`, регистрация в **`app/src/store/index.ts`** в цепочке `configureStore` (порядок `prepend`/`concat` — как у соседних middleware).
|
|
21
|
+
7. **UI** — `app/src/ui/pages/<FeatureName>Page/**` и/или `app/src/ui/components/**`; стили — как в проекте; тонкие компоненты, типы из `@/types`, без DTO (`ui-and-accessibility/react-ui.md`, `architecture/architecture-boundaries.md`, `ui-and-accessibility/no-props-spread.md`). Данные и загрузка — через store/hooks, без прямого HTTP.
|
|
22
|
+
8. **Unit‑тесты** — `*.spec.ts` / `*.spec.tsx` (`testing/tests-unit.md`); мапперы и нетривиальная логика — обязательно; e2e Jest не запускает (см. `jest.config.js`). При смене HTTP‑клиента — behavior‑тесты (`api-and-data/http-client.md`).
|
|
23
|
+
9. **E2E** — план: `app/__tests__/e2e/<Area>/<plan>.cases.md`; реализация: `*.spec.ts` рядом (`testing/tests-e2e-structure.md`, `testing/playwright-agents.md`).
|
|
24
|
+
10. **Завершение** — **`tooling-and-review/post-change-lint.md`**: из `app/` обязательно `lint:js` + `lint:css` (полный прогон), затем `type-check`.
|
|
25
|
+
|
|
26
|
+
## Полный flow (слой за слоем)
|
|
27
|
+
|
|
28
|
+
```mermaid
|
|
29
|
+
flowchart LR
|
|
30
|
+
typesNode["types_domain"]
|
|
31
|
+
apiNode["api_services_mappers"]
|
|
32
|
+
mocksNode["mocks_msw"]
|
|
33
|
+
storeNode["store_slice_thunks"]
|
|
34
|
+
mwNode["middleware_optional"]
|
|
35
|
+
uiNode["ui_pages_components"]
|
|
36
|
+
unitNode["unit_tests"]
|
|
37
|
+
e2eNode["e2e_plans_specs"]
|
|
38
|
+
|
|
39
|
+
typesNode --> apiNode
|
|
40
|
+
apiNode --> mocksNode
|
|
41
|
+
apiNode --> storeNode
|
|
42
|
+
storeNode --> mwNode
|
|
43
|
+
storeNode --> uiNode
|
|
44
|
+
apiNode --> unitNode
|
|
45
|
+
storeNode --> unitNode
|
|
46
|
+
uiNode --> unitNode
|
|
47
|
+
uiNode --> e2eNode
|
|
48
|
+
mocksNode --> e2eNode
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Поток данных (ориентир)
|
|
52
|
+
|
|
53
|
+
```mermaid
|
|
54
|
+
flowchart LR
|
|
55
|
+
subgraph transport [Транспорт]
|
|
56
|
+
HttpClient[HttpClient]
|
|
57
|
+
end
|
|
58
|
+
DTO[DTO] --> Mappers[Мапперы]
|
|
59
|
+
Mappers --> Domain[Доменные типы]
|
|
60
|
+
Domain --> Service[API сервис]
|
|
61
|
+
Service --> HttpClient
|
|
62
|
+
Service --> Thunk[Thunk]
|
|
63
|
+
Thunk --> Store[Store]
|
|
64
|
+
Store --> UI[UI]
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Частичные сценарии (вход с середины)
|
|
68
|
+
|
|
69
|
+
| Задача | Минимум действий |
|
|
70
|
+
|--------|------------------|
|
|
71
|
+
| Только API + типы | Типы в `app/src/types/**`, сервис и мапперы, реэкспорт в `app/src/api/index.ts`; unit на маппер. |
|
|
72
|
+
| Только моки | Константа пути уже в `@/api`; `handlers.ts` + данные; регистрация в `app/src/mocks/handlers.ts`; при необходимости убедиться, что хендлеры подхватываются и в браузерном, и в Node‑контуре MSW. |
|
|
73
|
+
| Только store | Thunk на существующий метод `@/api`; slice + `app/src/store/reducers.ts`. |
|
|
74
|
+
| Только UI | Читать готовое состояние из store; не добавлять HTTP/DTO; `data-testid` при необходимости для e2e. |
|
|
75
|
+
| Только e2e | Синхронизировать `*.cases.md` и спеки; page object и `_shared`. |
|
|
76
|
+
|
|
77
|
+
## Антипаттерны
|
|
78
|
+
|
|
79
|
+
- DTO и структуры ответа бэкенда в UI или в нетипизированных кусках store.
|
|
80
|
+
- Прямой вызов HTTP‑клиента из компонента или thunk’а в обход сервисного слоя.
|
|
81
|
+
- Deep‑импорты в `app/src/api/services/**/…` из UI/store там, где принят импорт из `@/api`.
|
|
82
|
+
- Проброс пропсов в компоненты через `{...props}` — см. `ui-and-accessibility/no-props-spread.md`.
|
|
83
|
+
|
|
84
|
+
## Матрица: что меняю → какие правила перечитать
|
|
85
|
+
|
|
86
|
+
| Зона в репозитории | Правила (`.claude/rules/`) |
|
|
87
|
+
|--------------------|----------------------------|
|
|
88
|
+
| `app/src/api/clients/**`, `app/src/lib/clients/**` | `api-and-data/http-client.md`; при изменении клиента — `testing/tests-unit.md` |
|
|
89
|
+
| `app/src/api/services/**` | `api-and-data/api-services.md`, `architecture/layer-barrel-exports.md`; при необходимости `api-and-data/http-client.md` |
|
|
90
|
+
| `app/src/store/**` | `api-and-data/store-rtk.md`, `architecture/architecture-boundaries.md`, `architecture/api-public-imports.md` |
|
|
91
|
+
| `app/src/ui/**` | `ui-and-accessibility/react-ui.md`, `ui-and-accessibility/no-props-spread.md`, `architecture/types-public-imports.md`, `architecture/api-public-imports.md` |
|
|
92
|
+
| `app/src/types/**` | `architecture/types-public-imports.md`, `stack/types-jsdoc.md`, `architecture/layer-barrel-exports.md` |
|
|
93
|
+
| `app/__tests__/e2e/**` | `testing/tests-e2e-structure.md`, `testing/playwright-agents.md` |
|
|
94
|
+
|
|
95
|
+
Path-scoped правила подгружаются при работе с соответствующими файлами; эта матрица нужна, когда открыт другой файл или идёт общий чат.
|
|
96
|
+
|
|
97
|
+
## Требование к агенту
|
|
98
|
+
|
|
99
|
+
При добавлении или существенном расширении фичи **пройти чеклист сверху** и при правках в зоне из таблицы **ориентироваться на указанные правила**, не смешивать слои и не обходить public API модулей.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Barrel-экспорты слоёв с public API
|
|
2
|
+
|
|
3
|
+
## Когда применять
|
|
4
|
+
|
|
5
|
+
Для **любого слоя** (каталога, пакета, bounded context), у которого:
|
|
6
|
+
|
|
7
|
+
- есть **корневой barrel** — единая точка импорта для внешних потребителей;
|
|
8
|
+
- deep-импорты внутрь слоя **запрещены** снаружи (ESLint `no-restricted-imports`, правила `architecture/*-public-imports.md`).
|
|
9
|
+
|
|
10
|
+
Примеры alias/entry point в разных проектах: `@/api`, `@/types`, `@/core`, `@/store`, `packages/foo`.
|
|
11
|
+
|
|
12
|
+
## Два уровня barrel
|
|
13
|
+
|
|
14
|
+
1. **Локальный** — `index.ts` модуля/фичи внутри слоя.
|
|
15
|
+
2. **Корневой public API** — barrel слоя (например `src/<layer>/index.ts`).
|
|
16
|
+
|
|
17
|
+
**Внутри** слоя — относительные импорты и пути между подмодулями. **Снаружи** — только корневой barrel и **явно разрешённые** вторичные entry points (если зафиксированы в правилах проекта, напр. `@/types/enums`).
|
|
18
|
+
|
|
19
|
+
## Что реэкспортировать наружу
|
|
20
|
+
|
|
21
|
+
Только символы, которые **должны быть доступны** потребителям слоя: публичные функции/сервисы/фасады, типы контракта, константы и helpers, нужные другим слоям или тестам.
|
|
22
|
+
|
|
23
|
+
**Не реэкспортировать:** внутренние адаптеры, мапперы, детали транспорта, промежуточные объекты для сборки фасада внутри слоя.
|
|
24
|
+
|
|
25
|
+
Группировка в корневом barrel — **по конвенции репозитория** (ориентир — соседние модули того же слоя).
|
|
26
|
+
|
|
27
|
+
## Чеклист агента (обязателен)
|
|
28
|
+
|
|
29
|
+
При добавлении или существенном расширении **модуля внутри регламентированного слоя**:
|
|
30
|
+
|
|
31
|
+
1. Определить слой, его **корневой barrel** и доп. entry points (`architecture/*-public-imports.md`).
|
|
32
|
+
2. Создать/обновить **локальный** `index.ts` — только публичные символы.
|
|
33
|
+
3. Если в слое есть **фасад/агрегатор** (`*ApiService.ts`, `rootReducer`, …) — подключить модуль там.
|
|
34
|
+
4. Добавить **реэкспорт** новых публичных символов в **корневой barrel** слоя.
|
|
35
|
+
5. **Проверка:** grep по имени символа или пути `./<Module>` в корневом barrel; снаружи слоя нет deep-импортов.
|
|
36
|
+
|
|
37
|
+
Модуль **не готов**, пока чеклист не пройден.
|
|
38
|
+
|
|
39
|
+
## Как найти регламентированные слои в репозитории
|
|
40
|
+
|
|
41
|
+
1. Правила `architecture/*-public-imports.md` в `.claude/rules/architecture/`.
|
|
42
|
+
2. ESLint `no-restricted-imports` — паттерны `@/<layer>/*` с исключением barrel.
|
|
43
|
+
3. `architecture/architecture-boundaries.md`, README проекта.
|
|
44
|
+
|
|
45
|
+
## В этом репозитории
|
|
46
|
+
|
|
47
|
+
| Слой | Корневой barrel | Правило импортов |
|
|
48
|
+
|------|-----------------|------------------|
|
|
49
|
+
| API | `app/src/api/index.ts` | `architecture/api-public-imports.md` |
|
|
50
|
+
| Types | `app/src/types/index.ts` | `architecture/types-public-imports.md` (+ `@/types/enums`) |
|
|
51
|
+
| Core | `app/src/core/index.ts` | ESLint: `@/core/index` |
|
|
52
|
+
|
|
53
|
+
Иллюстрация двух уровней (API): локальный `services/.../<Feature>/index.ts` → фасад `*ApiService.ts` → `app/src/api/index.ts`.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Импорты из `@/types`
|
|
2
|
+
|
|
3
|
+
- **Публичный API типов** — barrel `app/src/types/index.ts`, импортировать типы и интерфейсы только как `@/types` (или `@/types/index` при необходимости явного пути).
|
|
4
|
+
- **Запрещено** для потребителей слоя обходить barrel: любой импорт вида `@/types/<что‑угодно>`, кроме перечисленного ниже исключения для enum.
|
|
5
|
+
- Отдельно **нельзя** импортировать из вложенных файлов `*.types.ts` по путям `@/types/**/…*.types.ts` (типичный deep‑импорт).
|
|
6
|
+
- **Исключение — enum**: перечисления можно импортировать только из `@/types/enums` / `@/types/enums.ts` (не из других файлов под `@/types`).
|
|
7
|
+
|
|
8
|
+
## Внутри слоя `app/src/types/**`
|
|
9
|
+
|
|
10
|
+
- При реализации и поддержке barrel‑файла допустимы **относительные** импорты между файлами внутри `app/src/types` (например `from './User.types'`). Это не относится к потребителям слоя.
|
|
11
|
+
|
|
12
|
+
## Примеры
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
// ✅ Допустимо — доменные и транспортные сущности с теми именами, что экспортирует barrel
|
|
16
|
+
import type { TUserProfile } from '@/types'
|
|
17
|
+
import { SomeEnum } from '@/types/enums'
|
|
18
|
+
|
|
19
|
+
// ❌ Запрещено (обход публичного API)
|
|
20
|
+
import type { TUserProfile } from '@/types/User.types'
|
|
21
|
+
import { TransportError } from '@/types/TransportError'
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
При ревью и правках кода **не добавлять** новые импорты типов из `@/types/...` кроме `@/types` и `@/types/enums`.
|
|
25
|
+
|
|
26
|
+
- Новые публичные типы — реэкспорт в `app/src/types/index.ts` по **`architecture/layer-barrel-exports.md`**.
|
|
27
|
+
|
|
28
|
+
**Коллизии формулировок:** если в разных правилах расходятся детали **импорта типов**, источник правды — **этот файл** (`@/types`, `@/types/enums`).
|
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
# Stack (Next.js, React, TypeScript)
|
|
2
2
|
|
|
3
|
-
Правила уровня фреймворка и
|
|
3
|
+
Правила уровня фреймворка и языка.
|
|
4
|
+
|
|
5
|
+
| Файл | Содержание | Загрузка |
|
|
6
|
+
|------|------------|----------|
|
|
7
|
+
| `next-app-core.md` | Стек, структура `app/`, слои, принципы агента | session start |
|
|
8
|
+
| `arrow-functions.md` | Стрелочный синтаксис | session start |
|
|
9
|
+
| `no-type-assertion.md` | Ограничение `as` на границах модулей | session start |
|
|
10
|
+
| `navigation-router.md` | Next vs React Router — выбор по репозиторию | session start |
|
|
11
|
+
| `types-jsdoc.md` | JSDoc в `app/src/types` | `paths: app/src/types/**/*.ts` |
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Стрелочные функции
|
|
2
|
+
|
|
3
|
+
При разработке **использовать стрелочный синтаксис** для функций, где это допустимо в TypeScript/JavaScript.
|
|
4
|
+
|
|
5
|
+
## Что делать
|
|
6
|
+
|
|
7
|
+
- Объявлять функции как **`const имя = (...) => { ... }`** вместо **`function имя(...) { ... }`**, если не нужны особенности объявления `function`.
|
|
8
|
+
- Колбэки и обработчики — стрелочные функции: `.map((x) => ...)`, `onClick={() => ...}`.
|
|
9
|
+
- React-компоненты и хуки — как стрелочные функции с явной типизацией пропсов/возврата по принятому в проекте стилю.
|
|
10
|
+
|
|
11
|
+
## Исключения (допустимо не стрелка)
|
|
12
|
+
|
|
13
|
+
- **Генераторы** (`function*`) — стрелкой не выразить.
|
|
14
|
+
- **Методы класса** — если в коде используются классы, допустимы обычные методы (`method() {}`).
|
|
15
|
+
- Когда осознанно нужны **подъём (hoisting)** или **имя функции в стеке** только у `function` — редкие случаи.
|
|
16
|
+
|
|
17
|
+
## Примеры
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
// ❌ Избегать для нового кода
|
|
21
|
+
function formatLabel(id: string): string {
|
|
22
|
+
return id.toUpperCase()
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// ✅ Предпочтительно
|
|
26
|
+
const formatLabel = (id: string): string => {
|
|
27
|
+
return id.toUpperCase()
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
// ✅ Предпочтительно
|
|
33
|
+
const UserCard = ({ name }: { name: string }) => {
|
|
34
|
+
return <span>{name}</span>
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Требование к агенту
|
|
39
|
+
|
|
40
|
+
При генерации и правке кода **по умолчанию выбирать стрелочные функции**; отступать к `function` только в случаях из раздела исключений.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Навигация и роутинг: сначала стек проекта
|
|
2
|
+
|
|
3
|
+
**При любой задаче, связанной с навигацией, переходами между страницами, URL, редиректами, хлебными крошками, защищёнными маршрутами или программной сменой маршрута** — перед предложением кода или импортов **нельзя** опираться на «типичный React» по умолчанию. Нужно **явно свериться со стеком целевого репозитория** и использовать **один** согласованный с проектом механизм.
|
|
4
|
+
|
|
5
|
+
## Зависимости: что проверить в первую очередь
|
|
6
|
+
|
|
7
|
+
1. **`package.json`** в корне приложения (например `app/package.json` в монорепо — тот пакет, который реально собирается и деплоится). Смотреть **`dependencies`** и при необходимости **`peerDependencies`**:
|
|
8
|
+
- **`next`** — Next.js; версия важна для нюансов API (сверяться с документацией под эту major).
|
|
9
|
+
- **`react-router-dom`**, **`@remix-run/*`**, **`@tanstack/react-router`** и т.д. — отдельный роутинг; не подменять их API вызовами Next без проверки, что в проекте действительно используется этот стек.
|
|
10
|
+
- **`next`** и **`react-router-dom`** одновременно — возможно легаси или гибрид; **не** выбирать API по умолчанию — смотреть раздел «Реализация в коде» ниже.
|
|
11
|
+
|
|
12
|
+
2. **Монорепо / workspaces** — роутинг может жить не в корневом `package.json`. Открыть **`package.json` того workspace**, где лежат страницы и `next.config.*` / точка входа SPA.
|
|
13
|
+
|
|
14
|
+
3. **Факт установки** — при сомнениях смотреть lockfile (`bun.lock`, `package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`) или каталог `node_modules` у соответствующего пакета: убедиться, что заявленный пакет реально установлен, а не только прописан в документации.
|
|
15
|
+
|
|
16
|
+
## Реализация роутинга в проекте (код и структура)
|
|
17
|
+
|
|
18
|
+
Перед предложением паттерна навигации **свериться с тем, как уже сделано в репозитории**:
|
|
19
|
+
|
|
20
|
+
1. **Дерево маршрутов**
|
|
21
|
+
- Next **App Router**: каталог **`app/`** (или `src/app/`) с `layout.tsx`, `page.tsx`, сегменты `[id]` и т.п.
|
|
22
|
+
- Next **Pages Router**: каталог **`pages/`** с `_app`, динамические `[slug].tsx`.
|
|
23
|
+
- Наличие **обоих** `app/` и `pages/` — уточнить по `next.config` и документации проекта, какой слой основной.
|
|
24
|
+
|
|
25
|
+
2. **Точки входа и обёртки**
|
|
26
|
+
- Поиск по коду импортов: **`from 'next/navigation'`**, **`from 'next/router'`**, **`from 'next/link'`**, **`from 'react-router-dom'`**, **`createBrowserRouter`**, **`RouterProvider`**, **`BrowserRouter`**.
|
|
27
|
+
- Где объявлены маршруты (файловая структура Next vs конфиг маршрутов / `routes.tsx` в SPA).
|
|
28
|
+
|
|
29
|
+
3. **Общие абстракции проекта**
|
|
30
|
+
- Обертки над ссылками (`@/ui/...`, `Link` из дизайн-системы), хелперы путей, константы роутов — **использовать их**, а не дублировать сырой роутер.
|
|
31
|
+
|
|
32
|
+
4. **Соседние файлы фичи**
|
|
33
|
+
- Новый код навигации — в том же стиле, что страницы/хуки той же области (`next/navigation` vs `react-router-dom` как в соседних импортах).
|
|
34
|
+
|
|
35
|
+
## Как определить, что использовать (сводка)
|
|
36
|
+
|
|
37
|
+
1. **Зависимости** — см. раздел выше; по ним задаётся допустимый набор пакетов.
|
|
38
|
+
2. **Структура** — App Router vs Pages vs SPA по каталогам и конфигу.
|
|
39
|
+
3. **Фактический код** — какие импорты и обёртки уже доминируют в приложении.
|
|
40
|
+
|
|
41
|
+
## Что использовать (краткая матрица)
|
|
42
|
+
|
|
43
|
+
| Стек | Программная навигация / чтение пути | Ссылки |
|
|
44
|
+
|------|-------------------------------------|--------|
|
|
45
|
+
| **Next.js App Router** | `next/navigation` (`useRouter`, `usePathname`, `useSearchParams`, `redirect` и т.д. по документации Next для вашей версии) | `next/link` |
|
|
46
|
+
| **Next.js Pages Router** | `next/router` | `next/link` |
|
|
47
|
+
| **SPA + React Router** | `react-router-dom` (`useNavigate`, `useParams`, `useLocation`, …) | `<Link>` из `react-router-dom` |
|
|
48
|
+
|
|
49
|
+
**Не делать:** подключать `react-router-dom` в проект на Next.js «по привычке»; импортировать хуки из `next/router` в компонентах App Router без проверки; смешивать два роутера в одном приложении без явной архитектурной причины в кодовой базе.
|
|
50
|
+
|
|
51
|
+
## Требование к агенту
|
|
52
|
+
|
|
53
|
+
- Перед генерацией или ревью кода навигации **коротко зафиксировать вывод** (например: «зависимости: `next` без `react-router-dom`; в коде везде `next/navigation` → используем то же») и следовать ему.
|
|
54
|
+
- **Обязательная проверка:** актуальные **`dependencies`** в `package.json` нужного workspace + **как в проекте уже реализованы** маршруты и импорты (поиск по репозиторию, соседние файлы). Не полагаться только на предположение по одному признаку (например, только на наличие папки `app/`).
|
|
55
|
+
- Если стек неочевиден (два роутера в зависимостях, гибрид) — **сверить lockfile / установленные пакеты** и **доминирующие импорты** в `src`/`app`, затем выбрать API.
|
|
56
|
+
- Для **этого** пресета базовый ориентир — **`stack/next-app-core.md`**: Next.js; предпочитать **`next/navigation`** и **`next/link`** там, где используется App Router.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Стек и окружение
|
|
2
|
+
|
|
3
|
+
Конкретные версии пакетов и инструментов — **из `package.json` и конфигов целевого репозитория**. Ниже — рамка preset (Next.js + React + TypeScript), без привязки к конкретному вендору UI, моков или APM:
|
|
4
|
+
|
|
5
|
+
- **Фреймворк:** Next.js, React, TypeScript (strict — если включён в проекте).
|
|
6
|
+
- **Сборка и Node:** как задано в репозитории.
|
|
7
|
+
- **Тесты:** unit/integration — runner и библиотеки проекта; e2e — инструмент проекта (правила для агентов Playwright — в `testing/playwright-agents.md`).
|
|
8
|
+
- **Моки HTTP/API:** если приняты в репо — повторять существующую схему (каталоги, регистрация, точка входа).
|
|
9
|
+
- **Стили и UI:** способ стилизации и **дизайн‑система / токены** — как уже заведено в коде; приоритет общим примитивам и токенам вместо разрозненных «магических» значений.
|
|
10
|
+
- **Наблюдаемость:** только если уже подключена в проекте — централизованно (клиент, обёртки), без дублирования в каждом методе.
|
|
11
|
+
|
|
12
|
+
# Структура проекта (верхний уровень)
|
|
13
|
+
|
|
14
|
+
- `app/` — корень Next.js приложения.
|
|
15
|
+
- `app/src/**` — исходный код приложения.
|
|
16
|
+
- `app/__tests__/e2e/**` — e2e‑тесты и планы.
|
|
17
|
+
- `app/tsconfig.json`:
|
|
18
|
+
- `baseUrl: "."`
|
|
19
|
+
- `paths: { "@/*": ["./src/*"] }`
|
|
20
|
+
|
|
21
|
+
**Требование:** во всех новых изменениях использовать алиас `@/*` вместо относительных импортов выше по дереву.
|
|
22
|
+
|
|
23
|
+
# Архитектурные слои
|
|
24
|
+
|
|
25
|
+
- **UI слой** (`app/src/ui/**`):
|
|
26
|
+
- `app/src/ui/pages/**` — страницы и контейнеры.
|
|
27
|
+
- `app/src/ui/components/**` — переиспользуемые компоненты.
|
|
28
|
+
- **Store слой** (`app/src/store/**`):
|
|
29
|
+
- `app/src/store/slices/**` — модули состояния (Redux Toolkit; подробности в `api-and-data/store-rtk.md`).
|
|
30
|
+
- `app/src/store/middleware/**` — middleware для сайд‑эффектов (например, файлы, аналитика).
|
|
31
|
+
- **API слой** (`app/src/api/**` — прежде всего `services/**`, плюс `clients/**`, корневой barrel `index.ts`):
|
|
32
|
+
- Сервисы и мапперы; **потребители вне каталога** импортируют только через `@/api` (`architecture/api-public-imports.md`).
|
|
33
|
+
- **HTTP‑транспорт** (`app/src/lib/clients/**`, `app/src/api/clients/**`):
|
|
34
|
+
- Один механизм запросов, без разбросанного «сырого» `fetch`/`XMLHttpRequest` по фичам. Детали — **`api-and-data/http-client.md`**.
|
|
35
|
+
- **Типы** (`app/src/types/**`):
|
|
36
|
+
- Доменные модели и транспортные контракты; **потребители** импортируют только через **`architecture/types-public-imports.md`** (`@/types`, `@/types/enums`).
|
|
37
|
+
- **Моки и тестовые данные** (`app/src/mocks/**`):
|
|
38
|
+
- По структуре и назначению — как принято в репозитории.
|
|
39
|
+
|
|
40
|
+
## Порты и адаптеры (сопоставление с каталогами)
|
|
41
|
+
|
|
42
|
+
Та же идея, что в `architecture/architecture-boundaries.md` (раздел **«Порты и адаптеры»**): UI и store зависят от **контракта** к backend (`@/api` + доменные типы), реализация HTTP — в **`app/src/lib/clients/**`** и **`app/src/api/clients/**`**. Детали транспорта — `api-and-data/http-client.md`; импорты `@/api` — `architecture/api-public-imports.md`.
|
|
43
|
+
|
|
44
|
+
# Общие архитектурные принципы
|
|
45
|
+
|
|
46
|
+
- **Чёткое разделение слоёв**:
|
|
47
|
+
- UI знает о доменных типах (из `@/types` / `@/types/enums`) и публичных API store; при необходимости импортирует из **`@/api`** — см. `architecture/api-public-imports.md` и `architecture/architecture-boundaries.md` (**«UI и обращение к API»**).
|
|
48
|
+
- Store знает о доменных типах и вызывает API‑сервисы через **`@/api`**.
|
|
49
|
+
- API‑сервисы знают о DTO, мапперах и вызовах через клиенты из `app/src/api/clients/**` (`api-and-data/http-client.md`).
|
|
50
|
+
- **Никаких «проникновений» слоёв**:
|
|
51
|
+
- UI не вызывает HTTP‑клиент и не работает с DTO; сценарии с записью в общий state — через store; узкие исключения для сервисов из UI — только по `architecture/architecture-boundaries.md`.
|
|
52
|
+
- Store не собирает запросы сам и не обходит API‑сервисы; данные для state — доменные модели после маппинга. Транспортные типы ответа/ошибки во thunk — как в `@/types`, согласованно с `api-and-data/http-client.md`, `api-and-data/store-rtk.md`.
|
|
53
|
+
- **Доменная логика и state**:
|
|
54
|
+
- DTO → домен — в **мапперах** и чистых функциях (`api-and-data/api-services.md`); **редюсеры и селекторы** — узкие. Подробности — `api-and-data/store-rtk.md`.
|
|
55
|
+
- **Типы — источник правды**:
|
|
56
|
+
- При коллизии по **импорту типов** — **`architecture/types-public-imports.md`**.
|
|
57
|
+
- Новые сущности — в `app/src/types/**` с экспортом через barrel.
|
|
58
|
+
- Не использовать `any`; при необходимости — `unknown` + безопасное сужение типа.
|
|
59
|
+
|
|
60
|
+
# Кодстайл и качества кода
|
|
61
|
+
|
|
62
|
+
- Следовать конфигам линтеров и форматтера **проекта** (`eslint`, `prettier`, `stylelint` — какие есть в репо).
|
|
63
|
+
- KISS, DRY, SOLID; модульность; визуальная консистентность через UI‑примитивы и токены.
|
|
64
|
+
- При добавлении нового кода **искать и копировать существующие паттерны**:
|
|
65
|
+
- Для страниц — `app/src/ui/pages/**`.
|
|
66
|
+
- Для блоков — `app/src/ui/components/**`.
|
|
67
|
+
- Для API — `app/src/api/services/**`.
|
|
68
|
+
- Для состояния — `app/src/store/slices/**`.
|
|
69
|
+
|
|
70
|
+
# Работа агента
|
|
71
|
+
|
|
72
|
+
При генерации кода:
|
|
73
|
+
|
|
74
|
+
- При добавлении или существенном расширении фичи — **`architecture/feature-delivery-workflow.md`**.
|
|
75
|
+
- Определить целевой слой (UI/store/API/типизация/тесты).
|
|
76
|
+
- Найти похожие примеры и **копировать архитектурный паттерн** (структура файлов, типы, именование).
|
|
77
|
+
- Не упрощать архитектуру (не тянуть DTO и HTTP в UI; вызовы сервисов из UI — только в рамках `architecture/architecture-boundaries.md`).
|
|
78
|
+
- Избегать `any`; при необходимости — `unknown` с безопасным сужением.
|
|
79
|
+
- После **любых** изменений — **`tooling-and-review/post-change-lint.md`** и **`tooling-and-review/package-manager.md`**.
|
|
80
|
+
|
|
81
|
+
Задачи на **сеть, замену HTTP‑библиотеки, новые эндпоинты**: **`api-and-data/http-client.md`** + **`api-and-data/api-services.md`** + **`api-and-data/store-rtk.md`**.
|
|
82
|
+
|
|
83
|
+
См. также **`rules/README.md`** — полный каталог правил пресета.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Не использовать `as` для приведения типов при экспорте и импорте
|
|
2
|
+
|
|
3
|
+
## О чём речь
|
|
4
|
+
|
|
5
|
+
Речь о **type assertion** в TypeScript: выражение вида `значение as Тип`.
|
|
6
|
+
|
|
7
|
+
**Не относится к правилу** (это не assertion, а синтаксис модулей):
|
|
8
|
+
|
|
9
|
+
- переименование при экспорте: `export { foo as bar }`, `export { default as Baz } from '...'`;
|
|
10
|
+
- переименование при импорте: `import { foo as bar } from '...'`;
|
|
11
|
+
- `import type { Foo as Bar }` — алиас типа в импорте типов.
|
|
12
|
+
|
|
13
|
+
## Требование
|
|
14
|
+
|
|
15
|
+
- На **публичной границе модуля** (экспорт, присваивание импортированным символам с принудительным приведением) **не использовать** `as Тип` для «подгонки» типов, если можно обойтись нормальной типизацией.
|
|
16
|
+
|
|
17
|
+
## Предпочитать вместо `as`
|
|
18
|
+
|
|
19
|
+
- явную аннотацию: `const x: T = ...` / `function f(): T`;
|
|
20
|
+
- **дженерики** у функций и классов;
|
|
21
|
+
- **`satisfies`** (когда нужно проверить совместимость без сужения до `any`);
|
|
22
|
+
- сужение **`unknown`** после проверки (type guards, `zod` и т.п.);
|
|
23
|
+
- правку **исходных типов/DTO/мапперов**, а не assertion на выходе.
|
|
24
|
+
|
|
25
|
+
## Когда `as` допустим
|
|
26
|
+
|
|
27
|
+
- взаимодействие с **не типизированными** или некорректно типизированными внешними модулями;
|
|
28
|
+
- узкие места после **валидации** данных;
|
|
29
|
+
- **`as const`** — литеральные типы;
|
|
30
|
+
- блок **`catch (error)`** после HTTP: по возможности **`instanceof`** на **класс ошибки транспорта** из `@/types`; голый **`as`** — только если `instanceof` недоступен.
|
|
31
|
+
|
|
32
|
+
## Примеры
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
// ❌ Плохо: assertion на экспортируемом API
|
|
36
|
+
export const config = loadRaw() as AppConfig
|
|
37
|
+
|
|
38
|
+
// ✅ Лучше: аннотация + проверка или маппер
|
|
39
|
+
export const config: AppConfig = mapToAppConfig(loadRaw())
|
|
40
|
+
|
|
41
|
+
// ❌ Плохо: сразу после импорта «ломаем» тип
|
|
42
|
+
import { getData } from './api'
|
|
43
|
+
export const data = getData() as MyDto[]
|
|
44
|
+
|
|
45
|
+
// ✅ Лучше: типизировать getData / обернуть типобезопасной функцией
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Требование к агенту
|
|
49
|
+
|
|
50
|
+
При ревью и генерации кода **не добавлять** новые `as Тип` на экспортируемые сущности без явной необходимости.
|
|
51
|
+
|
|
52
|
+
В слайсах и сервисах при обработке ошибок API сначала рассматривать **`instanceof`** на класс ошибки транспорта из `@/types` (`api-and-data/http-client.md`, `api-and-data/store-rtk.md`).
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- app/src/types/**/*.ts
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Документация типов в `app/src/types`
|
|
7
|
+
|
|
8
|
+
При добавлении или существенном изменении типов в этом слое **следовать уже принятому в репозитории стилю JSDoc** (см. примеры: `User.types.ts`, `Common.types.ts`, `ServerValidation.types.ts`, `TreatmentPlan/*.types.ts`).
|
|
9
|
+
|
|
10
|
+
## Язык и форма
|
|
11
|
+
|
|
12
|
+
- Текст комментариев — **на русском**, кратко и по делу.
|
|
13
|
+
- **Не использовать** `@param`, `@returns`, `@see`, `@deprecated` для описания типов — достаточно обычного текста в `/** … */`.
|
|
14
|
+
|
|
15
|
+
## Экспортируемый `type` / `interface`
|
|
16
|
+
|
|
17
|
+
- Сразу **перед объявлением** — блок `/** … */`.
|
|
18
|
+
- Для вложенных объектов — отдельный блок над каждым объявлением.
|
|
19
|
+
|
|
20
|
+
## Поля
|
|
21
|
+
|
|
22
|
+
- У **каждого** публичного свойства — **однострочный** `/** … */` над полем.
|
|
23
|
+
- Если поле **вычисляется на фронте** — префикс **`[computed]`**.
|
|
24
|
+
- Форматы данных указывать **в тексте** (например дата `YYYY-MM-DD`).
|
|
25
|
+
|
|
26
|
+
## Классы и enum
|
|
27
|
+
|
|
28
|
+
- Для **классов** — блок над классом и комментарии к публичным полям.
|
|
29
|
+
- В `enums.ts` исторически часто **без JSDoc** на каждом члене; для новых enum допустимо описание **над enum**.
|
|
30
|
+
|
|
31
|
+
## Практика для агента
|
|
32
|
+
|
|
33
|
+
- Не оставлять новые публичные поля без пояснения, если смысл не равен имени на 100%.
|
|
34
|
+
- Поддерживать **тот же стиль**, что в файле.
|
|
35
|
+
- Одна-две фразы на тип, одна строка на поле — норма.
|
|
36
|
+
|
|
37
|
+
См. также импорты и barrel: `architecture/types-public-imports.md`.
|
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
# Testing
|
|
2
2
|
|
|
3
|
-
Unit
|
|
3
|
+
Unit, e2e, Playwright agents.
|
|
4
|
+
|
|
5
|
+
| Файл | Содержание | Загрузка |
|
|
6
|
+
|------|------------|----------|
|
|
7
|
+
| `playwright-agents.md` | Planner / generator / healer — структура e2e | session start |
|
|
8
|
+
| `tests-unit.md` | Unit/integration, именование на русском | `paths: app/src/**/*.spec.*`, `*.test.*` |
|
|
9
|
+
| `tests-e2e-structure.md` | `*.cases.md`, page objects, data-testid | `paths: app/__tests__/e2e/**` |
|
|
10
|
+
|
|
11
|
+
См. также `.claude/agents/playwright-test-*.md` после `ai-rules init`.
|