@bonesofspring/ai-rules 0.1.37 → 0.1.40

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.
Files changed (90) hide show
  1. package/README.md +7 -3
  2. package/bin/cli.js +56 -31
  3. package/package.json +3 -3
  4. package/presets/claude/next/CLAUDE.md +25 -5
  5. package/presets/claude/next/README.md +10 -0
  6. package/presets/claude/next/agents/README.md +15 -0
  7. package/presets/claude/next/agents/code-reviewer.md +56 -0
  8. package/presets/claude/next/agents/debugger.md +58 -0
  9. package/presets/claude/next/agents/feature-developer.md +45 -0
  10. package/presets/claude/next/agents/qa-tester.md +54 -0
  11. package/presets/claude/next/agents/solution-architect.md +70 -0
  12. package/presets/claude/next/agents/task-analyst.md +105 -0
  13. package/presets/claude/next/agents/task-router.md +105 -0
  14. package/presets/claude/next/commands/README.md +10 -2
  15. package/presets/claude/next/commands/feature-continue.md +46 -0
  16. package/presets/claude/next/commands/feature-start.md +25 -0
  17. package/presets/claude/next/commands/task-continue.md +43 -0
  18. package/presets/claude/next/commands/task.md +40 -0
  19. package/presets/claude/next/commands/technical-retro.md +53 -0
  20. package/presets/claude/next/hooks/README.md +6 -0
  21. package/presets/claude/next/hooks/chain-team-phases.sh +123 -0
  22. package/presets/claude/next/rules/README.md +49 -11
  23. package/presets/claude/next/rules/api-and-data/README.md +7 -1
  24. package/presets/claude/next/rules/api-and-data/api-services.md +57 -0
  25. package/presets/claude/next/rules/api-and-data/http-client.md +40 -0
  26. package/presets/claude/next/rules/api-and-data/store-rtk.md +65 -0
  27. package/presets/claude/next/rules/architecture/README.md +11 -1
  28. package/presets/claude/next/rules/architecture/api-public-imports.md +25 -0
  29. package/presets/claude/next/rules/architecture/architecture-boundaries.md +67 -0
  30. package/presets/claude/next/rules/architecture/feature-delivery-workflow.md +99 -0
  31. package/presets/claude/next/rules/architecture/layer-barrel-exports.md +53 -0
  32. package/presets/claude/next/rules/architecture/types-public-imports.md +28 -0
  33. package/presets/claude/next/rules/stack/README.md +9 -1
  34. package/presets/claude/next/rules/stack/arrow-functions.md +40 -0
  35. package/presets/claude/next/rules/stack/navigation-router.md +56 -0
  36. package/presets/claude/next/rules/stack/next-app-core.md +83 -0
  37. package/presets/claude/next/rules/stack/no-type-assertion.md +52 -0
  38. package/presets/claude/next/rules/stack/types-jsdoc.md +37 -0
  39. package/presets/claude/next/rules/testing/README.md +9 -1
  40. package/presets/claude/next/rules/testing/playwright-agents.md +69 -0
  41. package/presets/claude/next/rules/testing/tests-e2e-structure.md +52 -0
  42. package/presets/claude/next/rules/testing/tests-unit.md +66 -0
  43. package/presets/claude/next/rules/tooling-and-review/README.md +14 -1
  44. package/presets/claude/next/rules/tooling-and-review/agent-team-intake.md +9 -0
  45. package/presets/claude/next/rules/tooling-and-review/agent-team-orchestrator.md +97 -0
  46. package/presets/claude/next/rules/tooling-and-review/code-quality.md +50 -0
  47. package/presets/claude/next/rules/tooling-and-review/code-review-mr.md +67 -0
  48. package/presets/claude/next/rules/tooling-and-review/package-manager.md +20 -0
  49. package/presets/claude/next/rules/tooling-and-review/post-change-lint.md +43 -0
  50. package/presets/claude/next/rules/ui-and-accessibility/README.md +8 -1
  51. package/presets/claude/next/rules/ui-and-accessibility/component-styles.md +50 -0
  52. package/presets/claude/next/rules/ui-and-accessibility/css-property-order.md +20 -0
  53. package/presets/claude/next/rules/ui-and-accessibility/no-props-spread.md +52 -0
  54. package/presets/claude/next/rules/ui-and-accessibility/react-ui.md +90 -0
  55. package/presets/claude/next/team/README.md +64 -0
  56. package/presets/claude/next/team/tasks/.gitkeep +1 -0
  57. package/presets/cursor/next/agents/README.md +25 -0
  58. package/presets/cursor/next/agents/code-reviewer.md +57 -0
  59. package/presets/cursor/next/agents/debugger.md +59 -0
  60. package/presets/cursor/next/agents/feature-developer.md +46 -0
  61. package/presets/cursor/next/agents/qa-tester.md +55 -0
  62. package/presets/cursor/next/agents/solution-architect.md +71 -0
  63. package/presets/cursor/next/agents/task-analyst.md +111 -0
  64. package/presets/cursor/next/agents/task-router.md +106 -0
  65. package/presets/cursor/next/commands/README.md +33 -1
  66. package/presets/cursor/next/commands/feature-continue.md +14 -0
  67. package/presets/cursor/next/commands/feature-start.md +28 -0
  68. package/presets/cursor/next/commands/task-continue.md +43 -0
  69. package/presets/cursor/next/commands/task.md +40 -0
  70. package/presets/cursor/next/commands/technical-retro.md +76 -0
  71. package/presets/cursor/next/hooks/chain-team-phases.sh +216 -0
  72. package/presets/cursor/next/hooks.json +11 -0
  73. package/presets/cursor/next/rules/README.md +10 -3
  74. package/presets/cursor/next/rules/agent-team-intake.mdc +14 -0
  75. package/presets/cursor/next/rules/agent-team-orchestrator.mdc +102 -0
  76. package/presets/cursor/next/rules/api-public-imports.mdc +1 -0
  77. package/presets/cursor/next/rules/api-services.mdc +1 -0
  78. package/presets/cursor/next/rules/architecture-boundaries.mdc +1 -1
  79. package/presets/cursor/next/rules/code-quality-and-refactoring.mdc +5 -2
  80. package/presets/cursor/next/rules/code-review-mr.mdc +6 -7
  81. package/presets/cursor/next/rules/feature-delivery-workflow.mdc +5 -5
  82. package/presets/cursor/next/rules/layer-barrel-exports.mdc +58 -0
  83. package/presets/cursor/next/rules/next-app-core.mdc +1 -1
  84. package/presets/cursor/next/rules/package-manager.mdc +25 -0
  85. package/presets/cursor/next/rules/post-change-lint.mdc +48 -0
  86. package/presets/cursor/next/rules/react-ui.mdc +10 -0
  87. package/presets/cursor/next/rules/technical-retro.mdc +5 -51
  88. package/presets/cursor/next/rules/types-public-imports.mdc +1 -0
  89. package/presets/cursor/next/team/README.md +106 -0
  90. package/presets/cursor/next/team/tasks/.gitkeep +0 -0
@@ -0,0 +1,40 @@
1
+ ---
2
+ paths:
3
+ - app/src/lib/clients/**/*.ts
4
+ - app/src/api/clients/**/*.ts
5
+ ---
6
+
7
+ # HTTP-транспорт
8
+
9
+ **Имена** фабрик, классов ошибок, типов ответа и конфига — **как в текущем коде репозитория** и в barrel `app/src/types/index.ts`. Ниже — **архитектурные правила**, а не спецификация переименований.
10
+
11
+ ## Роль слоя
12
+
13
+ - Обычные REST‑вызовы к backend идут через **одну реализацию** в `app/src/lib/clients/**` (модуль общего клиента) и **преднастроенные экземпляры** в `app/src/api/clients/**`, по тому же паттерну, что уже принят в проекте.
14
+ - Место транспорта в общей картине **порты и адаптеры** — в `architecture/architecture-boundaries.md` (раздел **«Порты и адаптеры»**).
15
+ - **Не** вызывать `fetch` напрямую из `app/src/api/services/**`, store и UI (см. `architecture/architecture-boundaries.md`, `api-and-data/api-services.md`); из store/UI — только вызовы через сервисы из `@/api` (`architecture/api-public-imports.md`).
16
+ - **Исключения** (узкие протоколы, отдельный транспорт) — только там, где в репозитории уже есть образец; повторять его, не плодить произвольные обходы общего клиента.
17
+
18
+ ## Типы
19
+
20
+ - Всё, что относится к **контракту запроса/ответа/ошибки** приложения и реэкспортируется для HTTP‑слоя, импортировать **только** из barrel `@/types`, без deep‑импортов из внутренних файлов `app/src/types/**` (см. `architecture/types-public-imports.md`).
21
+ - Не поднимать в новом коде **типы и зависимости от внешнего HTTP‑клиента**, от которого проект ушёл; ориентир — **`package.json`** и существующие вызовы.
22
+
23
+ ## Контракт ошибок
24
+
25
+ - Ошибки сети и HTTP должны приходить в **едином виде**, который задаёт общий клиент (обычно класс/обёртка с полем вроде `response` для тела и статуса).
26
+ - В **`catch`** ориентироваться на **фактическую форму** ошибки в этом репозитории (как в соседних слайсах/сервисах): доступ к телу ошибки, статусу, диагностическому коду — **по полям текущей реализации**, без выдумывания второго формата.
27
+
28
+ ## Поведение, которое остаётся в клиенте
29
+
30
+ - Общие заголовки, `credentials`, загрузка файлов (**FormData** / снятие лишних заголовков), бинарные ответы (**blob** и аналоги), единообразный разбор JSON и прочих тел.
31
+ - Перехват **401 / refresh**, обработка **404** и т.п. — **централизованно**, если так уже сделано в клиенте; не дублировать ту же логику в каждом сервисе.
32
+
33
+ ## Связь со store
34
+
35
+ - Thunk может возвращать **тип обёртки успешного ответа**, если сервис так устроен; в **state** по возможности класть **доменные** типы после маппинга. Подробнее — `api-and-data/store-rtk.md`.
36
+
37
+ ## Требование к агенту
38
+
39
+ - Меняя реализацию общего клиента — **обновить или добавить behavior‑тесты** рядом с модулем клиента (`testing/tests-unit.md`).
40
+ - Не вводить **второй полноценный HTTP‑стек** без явной задачи и согласования с архитектурой репозитория.
@@ -0,0 +1,65 @@
1
+ ---
2
+ paths:
3
+ - app/src/store/**/*.ts
4
+ ---
5
+
6
+ # Общие принципы
7
+
8
+ - Использовать **Redux Toolkit**:
9
+ - `createSlice`, `createAsyncThunk`, RTK Query (если используется).
10
+ - Хранить в store **доменные модели**, не «сырые» DTO из API.
11
+ - Все вычисления и преобразования данных (включая вычисляемые поля, булевые флаги, агрегаты, человеко‑читаемые строки и т.п.) должны выполняться **между ответом API и записью в store** — в мапперах или отдельном слое подготовки данных. Store хранит уже подготовленную доменную модель.
12
+ - Разделять:
13
+ - «серверное» состояние (данные из API) и
14
+ - локальное UI‑состояние (выбор/фильтры/флаги).
15
+
16
+ # Структура слайсов
17
+
18
+ - Каждый доменный модуль — свой слайс в `app/src/store/slices/**`.
19
+ - Слайс экспортирует:
20
+ - `reducer` по умолчанию;
21
+ - `actions` именованным экспортом;
22
+ - селекторы `selectSomething(state: RootState): Type`.
23
+ - Состояние:
24
+ - явный тип для state;
25
+ - аккуратная инициализация initialState.
26
+
27
+ # Асинхронность и сайд‑эффекты
28
+
29
+ - Асинхронные запросы:
30
+ - через `createAsyncThunk` или RTK Query.
31
+ - внутри thunk:
32
+ - вызывать API через сервисы, импортированные из `@/api` (**`architecture/api-public-imports.md`**);
33
+ - не вызывать HTTP‑клиент напрямую — только через эти сервисы.
34
+ - Сайд‑эффекты (логирование, аналитика, работа с файлами):
35
+ - выносить в middleware (`app/src/store/middleware/**`) или специализированные слайсы.
36
+
37
+ # Типизация
38
+
39
+ - Использовать `RootState`, `AppDispatch` и типизированные хуки `useAppDispatch`, `useAppSelector` (если есть).
40
+ - **HTTP и ошибки API**:
41
+ - не импортировать типы **сторонних HTTP‑библиотек**, которых нет в актуальных зависимостях и существующих слайсах (ориентир — **`package.json`** и соседние файлы);
42
+ - когда сервис возвращает **обёртку ответа** прикладного клиента — использовать **соответствующий тип из `@/types`** (как в barrel и в аналогичных thunk’ах);
43
+ - при ошибках после вызова сервиса — опираться на **тот же класс/контракт ошибки транспорта**, что использует общий клиент (из `@/types`), и разбирать тело/статус **по полям текущей реализации**, а не по воображаемому API;
44
+ - в **`catch`** предпочитать **`instanceof`** на класс ошибки транспорта из `@/types` (если он есть в коде) вместо голого `as`, когда это выразимо без шума (см. `stack/no-type-assertion.md`).
45
+ - Для сущностей:
46
+ - доменные типы (включая вычисляемые поля) определять в `app/src/types/**`, экспортировать через barrel и импортировать в слайсы из `@/types` как **источник правды** (`architecture/types-public-imports.md`);
47
+ - избегать дублирования описаний сущностей в нескольких местах.
48
+ - **Граница домена**: в **state** хранить доменные модели; тип **обёртки ответа клиента** допустим как тип **возвращаемого значения thunk** или промежуточно до маппинга — без дублирования DTO в полях state без нужды (согласовано с `api-and-data/api-services.md` и `api-and-data/http-client.md`).
49
+
50
+ # Тестирование слайсов
51
+
52
+ - Для важных слайсов:
53
+ - тестировать редюсеры (инициализация, основные переходы состояний);
54
+ - тестировать селекторы (включая edge cases).
55
+ - Thunk’и:
56
+ - по возможности покрывать тестами с моками API‑слоя.
57
+
58
+ # Требование к агенту
59
+
60
+ При изменении/создании слайса:
61
+
62
+ - Не класть логику API внутрь редюсеров/компонентов.
63
+ - Строго типизировать state и actions.
64
+ - Использовать **единый стиль именования actions и селекторов**, как в существующих слайсах.
65
+ - При работе с ошибками и ответами HTTP опираться на **`api-and-data/http-client.md`** и контракты из `@/types`, а не на типы внешних HTTP‑библиотек вне зависимостей проекта.
@@ -1,3 +1,13 @@
1
1
  # Architecture
2
2
 
3
- Границы модулей, слоёв и зависимостей (аналог темы architecture / boundaries в Cursor-пресете).
3
+ Границы модулей, слоёв, зависимостей и сквозная доставка фич.
4
+
5
+ | Файл | Содержание |
6
+ |------|------------|
7
+ | `architecture-boundaries.md` | UI / store / API, порты и адаптеры, организация фич |
8
+ | `layer-barrel-exports.md` | Двухуровневые barrel и чеклист public API |
9
+ | `types-public-imports.md` | Импорт типов только через `@/types` |
10
+ | `api-public-imports.md` | Импорт API только через `@/api` |
11
+ | `feature-delivery-workflow.md` | Чеклист новой фичи, матрица зона → правило |
12
+
13
+ Все файлы — **session start** (без `paths:`).
@@ -0,0 +1,25 @@
1
+ # Импорты из `@/api`
2
+
3
+ - **Публичный API слоя API** — barrel `app/src/api/index.ts`. Для файлов **вне** `app/src/api/**` импортировать сервисы, клиенты, эндпоинты и публичные типы API **только** как `import … from '@/api'` (или `from '@/api/index'` при необходимости явного пути).
4
+ - **Запрещено** для таких потребителей обходить barrel: любой импорт вида `@/api/<что‑угодно>`, кроме `@/api/index`. Это дублирует правило ESLint `no-restricted-imports` в `app/eslint.config.mjs` (паттерн `@/api/*` с исключением `@/api/index`).
5
+ - При **добавлении** публичного символа в регламентированный слой — реэкспорт в корневой barrel по **`architecture/layer-barrel-exports.md`**.
6
+
7
+ ## Внутри слоя `app/src/api/**`
8
+
9
+ - При реализации сервисов, клиентов и barrel допустимы **относительные** импорты и пути вида `@/api/services/**`, `@/api/clients/**` между файлами этого слоя. Это не относится к потребителям снаружи `app/src/api/**`.
10
+
11
+ ## Примеры
12
+
13
+ ```typescript
14
+ // ✅ Допустимо в store, UI, lib вне app/src/api — только barrel
15
+ import { MedcardApiService, MarketplaceApiService } from '@/api'
16
+ import type { TReferenceRequest } from '@/api'
17
+
18
+ // ❌ Запрещено снаружи app/src/api (сработает ESLint)
19
+ import { MedcardApiService } from '@/api/services/MedcardApiService/MedcardApiService'
20
+ import { MedcardApiClient } from '@/api/clients/MedcardApiClient'
21
+ ```
22
+
23
+ При ревью и правках кода **не добавлять** новые импорты из `@/api/...` кроме `@/api` / `@/api/index` в файлах вне `app/src/api/**`.
24
+
25
+ **Коллизии формулировок:** по **импорту из API‑слоя** (store, UI, прочий код вне `app/src/api/**`) — источник правды — **этот файл** (`@/api`).
@@ -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
- Правила уровня фреймворка и языка для пресета `next`.
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`** — полный каталог правил пресета.