@bonesofspring/ai-rules 0.1.35 → 0.1.36

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bonesofspring/ai-rules",
3
- "version": "0.1.35",
3
+ "version": "0.1.36",
4
4
  "description": "Presets of Cursor and Claude rules/commands for Revy Ross personal use",
5
5
  "license": "MIT",
6
6
  "author": "Revy Ross",
@@ -25,17 +25,18 @@
25
25
  |------|------------|
26
26
  | `feature-delivery-workflow.mdc` | Сквозной порядок работ по фиче, mermaid‑поток, матрица слой → правило `.mdc` |
27
27
  | `next-app-core.mdc` | Стек, слои, порты‑адаптеры (кратко), доменная логика vs state, общие требования к агенту и линтам |
28
- | `architecture-boundaries.mdc` | Границы UI / store / API, импорты (`@/types` по `types-public-imports`), UI→services, порты‑адаптеры, фича как срез |
28
+ | `architecture-boundaries.mdc` | Границы UI / store / API, импорты (`@/types`, `@/api`), порты‑адаптеры, фича как срез |
29
29
  | `http-client.mdc` | Один HTTP‑стек, контракты из `@/types`, без разбросанного низкоуровневого API |
30
30
  | `api-services.mdc` | Сервисы, мапперы, вызовы через прикладные API‑клиенты |
31
31
  | `store-rtk.mdc` | Redux Toolkit, thunk’и, типизация ошибок/ответов как в коде репо |
32
32
  | `types-public-imports.mdc` | Импорты только через barrel `@/types` |
33
+ | `api-public-imports.mdc` | Импорты только через barrel `@/api` (вне `app/src/api/**`) |
33
34
  | `types-jsdoc.mdc` | JSDoc для типов в `app/src/types` (русский текст, `[computed]`, без `@param`/`@returns`) |
34
35
  | `no-type-assertion-as-import-export.mdc` | Ограничение `as`, в т.ч. `instanceof` для ошибок транспорта в `catch` |
35
36
  | `code-review-mr.mdc` | Чеклист ревью MR, в т.ч. HTTP‑клиент и тесты |
36
37
  | `tests-unit.mdc` | Unit‑тесты и behavior‑тесты HTTP‑клиента |
37
38
  | `playwright-agents.mdc`, `tests-e2e-structure.mdc` | E2E |
38
39
 
39
- **Коллизии формулировок:** если в разных `.mdc` расходятся детали **импорта типов**, источник правды — **`types-public-imports.mdc`** (`@/types`, `@/types/enums`).
40
+ **Коллизии формулировок:** если в разных `.mdc` расходятся детали **импорта типов**, источник правды — **`types-public-imports.mdc`** (`@/types`, `@/types/enums`); по **импорту из API‑слоя** (store, UI, прочий код вне `app/src/api/**`) — **`api-public-imports.mdc`** (`@/api`), в том же смысле что правило ESLint `no-restricted-imports` в `app/eslint.config.mjs`.
40
41
 
41
42
  Задачи на **сеть, замену HTTP‑библиотеки, новые эндпоинты**: опираться на **`http-client.mdc`** + **`api-services.mdc`** + **`store-rtk.mdc`**.
@@ -0,0 +1,27 @@
1
+ ---
2
+ description: Импорт из API-слоя только через публичный barrel @/api
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # Импорты из `@/api`
7
+
8
+ - **Публичный API слоя API** — barrel `app/src/api/index.ts`. Для файлов **вне** `app/src/api/**` импортировать сервисы, клиенты, эндпоинты и публичные типы API **только** как `import … from '@/api'` (или `from '@/api/index'` при необходимости явного пути).
9
+ - **Запрещено** для таких потребителей обходить barrel: любой импорт вида `@/api/<что‑угодно>`, кроме `@/api/index`. Это дублирует правило ESLint `no-restricted-imports` в `app/eslint.config.mjs` (паттерн `@/api/*` с исключением `@/api/index`).
10
+
11
+ ## Внутри слоя `app/src/api/**`
12
+
13
+ - При реализации сервисов, клиентов и barrel допустимы **относительные** импорты и пути вида `@/api/services/**`, `@/api/clients/**` между файлами этого слоя. Это не относится к потребителям снаружи `app/src/api/**`.
14
+
15
+ ## Примеры
16
+
17
+ ```typescript
18
+ // ✅ Допустимо в store, UI, lib вне app/src/api — только barrel
19
+ import { MedcardApiService, MarketplaceApiService } from '@/api'
20
+ import type { TReferenceRequest } from '@/api'
21
+
22
+ // ❌ Запрещено снаружи app/src/api (сработает ESLint)
23
+ import { MedcardApiService } from '@/api/services/MedcardApiService/MedcardApiService'
24
+ import { MedcardApiClient } from '@/api/clients/MedcardApiClient'
25
+ ```
26
+
27
+ При ревью и правках кода **не добавлять** новые импорты из `@/api/...` кроме `@/api` / `@/api/index` в файлах вне `app/src/api/**`.
@@ -23,7 +23,7 @@ alwaysApply: false
23
23
  - файлы с вызовами API (`index.ts` или `*.service.ts`);
24
24
  - файлы мапперов (`*responseMappers.ts`);
25
25
  - специфичные типы запросов/ответов (если не вынесены в `app/src/types/**` с экспортом через barrel `@/types`).
26
- - один или несколько **public API** файлов (`index.ts` или barrel‑файлы), через которые к модулю обращаются UI, store и другие слои.
26
+ - при необходимости локальные `index.ts` / barrel внутри модуля для структуры **внутри** `app/src/api/**`; **снаружи** этого слоя UI, store и остальной код импортируют только из корневого barrel `app/src/api/index.ts` (`import … from '@/api'`, **`api-public-imports.mdc`**).
27
27
 
28
28
  # Мапперы и типы
29
29
 
@@ -53,5 +53,5 @@ alwaysApply: false
53
53
  - Не смешивать слой API и UI/store:
54
54
  - компоненты не должны зависеть от DTO;
55
55
  - store не должен сам собирать URL/коды эндпоинтов и не обходить сервисы; **транспортный тип ответа** и **контракт ошибки** из `@/types` (как у прикладного клиента) допустимы во thunk при разборе `catch`/payload, если так выстроен сервис (см. `store-rtk.mdc`, `http-client.mdc`).
56
- - При использовании API‑сервисов в UI, store и утилитах импортировать только из public API файлов модуля (например, `@/api/services/OrdersApi/.../index`), а не из внутренних файлов‑реализаций.
56
+ - При использовании API‑сервисов в UI, store и утилитах **вне** `app/src/api/**` импортировать **только** из `@/api` (корневой barrel), см. **`api-public-imports.mdc`**; внутри слоя API по относительным путям или `@/api/services/**` / `@/api/clients/**`, не дублируя публичный контракт мимо корневого barrel для внешних потребителей.
57
57
 
@@ -6,33 +6,33 @@ alwaysApply: true
6
6
  # Границы между слоями
7
7
 
8
8
  - **UI (app/src/ui/**)**:
9
- - Может импортировать: `@/ui/**`, `@/store/**`, типы из `@/types` и enum из `@/types/enums` (**только как в `types-public-imports.mdc`**), `@/api/services/**` только через **public API** модулей сервисов.
9
+ - Может импортировать: `@/ui/**`, `@/store/**`, типы из `@/types` и enum из `@/types/enums` (**только как в `types-public-imports.mdc`**), контракт к API **только** `import … from '@/api'` (**`api-public-imports.mdc`**).
10
10
  - Не должен:
11
11
  - обращаться к HTTP‑клиенту напрямую;
12
12
  - знать детали DTO backend — только доменные типы.
13
13
  - **Store (app/src/store/**)**:
14
- - Может импортировать: `@/store/**`, `@/api/services/**` (public API), типы из `@/types` и enum из `@/types/enums` (**`types-public-imports.mdc`**).
14
+ - Может импортировать: `@/store/**`, сервисы и публичные сущности API — **только** из `@/api` (**`api-public-imports.mdc`**), типы из `@/types` и enum из `@/types/enums` (**`types-public-imports.mdc`**).
15
15
  - Не должен:
16
16
  - зависеть от конкретных UI‑компонентов;
17
17
  - напрямую работать с global/window API.
18
- - Вызовы к backend — только через сервисы; **транспортные** типы ответа и ошибки (из `@/types`, в том же виде, что у прикладного HTTP‑клиента) во thunk допустимы, если так выстроен API‑слой (`http-client.mdc`, `store-rtk.mdc`).
19
- - **API (app/src/api/services/**)**:
20
- - Может импортировать: типы из `@/types` и enum из `@/types/enums` (**`types-public-imports.mdc`**); **`@/api/clients/**`** преднастроенные экземпляры HTTP‑клиента (`http-client.mdc`); общие утилиты проекта (как в соседних сервисах репозитория).
18
+ - Вызовы к backend — только через сервисы, импортируемые из `@/api`; **транспортные** типы ответа и ошибки (из `@/types`, в том же виде, что у прикладного HTTP‑клиента) во thunk допустимы, если так выстроен API‑слой (`http-client.mdc`, `store-rtk.mdc`).
19
+ - **API (`app/src/api/**`)** — реализация в `services/**`, `clients/**`, реэкспорт в `app/src/api/index.ts`:
20
+ - Внутри слоя: типы из `@/types` и enum из `@/types/enums` (**`types-public-imports.mdc`**); импорты `@/api/services/**`, `@/api/clients/**`, относительные пути между файлами слоя (`http-client.mdc`, `api-services.mdc`).
21
21
  - Не должен:
22
22
  - тянуть в себя UI или store;
23
23
  - смешивать HTTP‑слой и доменный слой — использовать мапперы.
24
24
 
25
- ## UI и обращение к `@/api/services`
25
+ ## UI и обращение к API (`@/api`)
26
26
 
27
27
  - По умолчанию сценарии с **изменением серверного состояния** и координация нескольких шагов — через **store** (`createAsyncThunk`, dispatch, паттерн фичи в репозитории).
28
- - Прямой вызов функций из **`@/api/services/**` из UI допустим только в **узких случаях**: преимущественно **чтение** или действие **без необходимости держать результат в Redux**; тот же **public API** сервиса и те же **доменные типы**, что использовал бы thunk; **не** дублировать уже существующий сценарий из store и **не** протаскивать DTO в компоненты.
28
+ - Прямой вызов методов сервисов, импортированных из **`@/api`**, из UI допустим только в **узких случаях**: преимущественно **чтение** или действие **без необходимости держать результат в Redux**; те же **доменные типы**, что использовал бы thunk; **не** дублировать уже существующий сценарий из store и **не** протаскивать DTO в компоненты.
29
29
  - Предпочтительно оформлять такие вызовы так же, как в **соседних фичах** репозитория (хук‑фасад, отдельный хук и т.д.).
30
30
 
31
31
  ## Порты и адаптеры (краткая карта)
32
32
 
33
33
  - **Входящий адаптер**: UI — ввод пользователя, отображение; зависит от store и доменных типов, не от транспорта.
34
34
  - **Оркестрация сценариев**: store (slices, thunk) — вызывает сервисы, кладёт в state **доменные** модели после маппинга.
35
- - **Исходящий порт (контракт к backend)**: публичный API **`@/api/services/...`**.
35
+ - **Исходящий порт (контракт к backend)**: публичный API **`@/api`** (barrel `app/src/api/index.ts`; реализация — в `app/src/api/services/**` и т.д., см. `api-public-imports.mdc`).
36
36
  - **Исходящий адаптер**: общая реализация HTTP в **`app/src/lib/clients/**`** и экземпляры в **`app/src/api/clients/**`**.
37
37
 
38
38
  ## Фича как срез
@@ -43,7 +43,7 @@ alwaysApply: true
43
43
 
44
44
  - Всегда использовать алиас `@/...` для импортов между слоями.
45
45
  - Внутри одного модуля/фичи можно использовать относительные импорты, но **без подъёма выше корня фичи** (избегать `../../../`).
46
- - При обращении из компонентов, хуков, утилит и других модулей к чужому слою или фиче использовать только **public API** (barrel/index‑файлы и явно экспортируемые сущности), не делать deep‑импорты внутренних файлов других фич.
46
+ - При обращении из компонентов, хуков, утилит и других модулей к чужому слою или фиче использовать только **public API** (barrel/index‑файлы и явно экспортируемые сущности), не делать deep‑импорты внутренних файлов других фич; для API‑слоя снаружи `app/src/api/**` — **`api-public-imports.mdc`** (только `@/api`).
47
47
  - При добавлении нового кода проверять:
48
48
  - если модуль переиспользуемый — он должен зависеть только от более "низких" слоёв (types, utils, api), но не от страниц.
49
49
 
@@ -14,10 +14,10 @@ alwaysApply: true
14
14
  - Соблюдение правил из `architecture-boundaries.mdc`, `next-app-core.mdc` и при сетевых изменениях — `http-client.mdc`:
15
15
  - UI (`app/src/ui/**`) не ходит напрямую в HTTP‑клиент и не знает DTO.
16
16
  - Store (`app/src/store/**`) не зависит от UI; границы транспортных типов и ошибок — `store-rtk.mdc` / `http-client.mdc`.
17
- - API (`app/src/api/services/**`) не тянет UI/store, использует мапперы; без прямого `fetch` в сервисах (кроме оговорённых исключений).
17
+ - API (`app/src/api/**`) не тянет UI/store, использует мапперы; без прямого `fetch` в сервисах (кроме оговорённых исключений).
18
18
  - **Импорты и организация кода**:
19
19
  - Использование алиаса `@/...` вместо относительных импортов выше по дереву.
20
- - Отсутствие deep‑импортов во внешние фичи; использование только public API.
20
+ - Отсутствие deep‑импортов во внешние фичи; использование только public API; в файлах вне `app/src/api/**` импорты из API — только `from '@/api'` (`api-public-imports.mdc`, дублирует ESLint).
21
21
  - Размещение новых файлов в корректных слоях и директориях фич.
22
22
  - **Типы и TS‑строгость**:
23
23
  - Не допускать новых `any`; предпочитать доменные типы из `@/types` (barrel, см. `types-public-imports.mdc`).
@@ -34,11 +34,11 @@ alwaysApply: true
34
34
  - Указывать, какие именно тесты стоит добавить или поправить.
35
35
  - **Линтеры (обязательно)**:
36
36
  - Рабочий каталог: `app/` (там `package.json` с скриптами линта).
37
- - Перед финализацией отчёта по ревью **запустить полный прогон** ESLint по проекту: `yarn lint:js` (эквивалент `eslint .` с расширениями из скрипта — без точечного запуска только на один файл, чтобы не пропустить косвенные срабатывания).
38
- - Если в MR менялись стили (css/linaria и т.п.) — дополнительно `yarn lint:css`.
39
- - В отчёт включить **все сообщения ESLint (errors и warnings)** по файлам, попадающим в дифф MR/ветки; если полный вывод огромный, сфокусироваться на диффе, но **не** пропускать проверку из‑за «только изменённые файлы» на этапе запуска — сначала полный `yarn lint:js`, затем фильтрация вывода к путям из `git diff`.
40
- - При **имплементации правок** по итогам ревью или любой работе «как к MR»: после изменений снова выполнить `yarn lint:js` (и при необходимости `yarn lint:css`); не считать задачу завершённой, пока в изменённых файлах остаются исправимые предупреждения ESLint, которые относятся к этой задаче (исключение — явно устаревший легаси вне скоупа, с пометкой в ответе).
41
- - При желании полной валидации, как в CI: `yarn lint` (ESLint + Stylelint + `type-check`) — уместно перед итогом крупного MR.
37
+ - Перед финализацией отчёта по ревью **запустить полный прогон** ESLint по проекту: `bun run lint:js` (эквивалент `eslint .` с расширениями из скрипта — без точечного запуска только на один файл, чтобы не пропустить косвенные срабатывания).
38
+ - Если в MR менялись стили (css/linaria и т.п.) — дополнительно `bun run lint:css`.
39
+ - В отчёт включить **все сообщения ESLint (errors и warnings)** по файлам, попадающим в дифф MR/ветки; если полный вывод огромный, сфокусироваться на диффе, но **не** пропускать проверку из‑за «только изменённые файлы» на этапе запуска — сначала полный `bun run lint:js`, затем фильтрация вывода к путям из `git diff`.
40
+ - При **имплементации правок** по итогам ревью или любой работе «как к MR»: после изменений снова выполнить `bun run lint:js` (и при необходимости `bun run lint:css`); не считать задачу завершённой, пока в изменённых файлах остаются исправимые предупреждения ESLint, которые относятся к этой задаче (исключение — явно устаревший легаси вне скоупа, с пометкой в ответе).
41
+ - При желании полной валидации, как в CI: `bun run lint` (ESLint + Stylelint + `type-check`) — уместно перед итогом крупного MR.
42
42
 
43
43
  - **Глубина и формат ревью**
44
44
  - Фокус на **изменениях MR** (дифф относительно целевой ветки), а не на всём проекте.
@@ -13,11 +13,11 @@ alwaysApply: true
13
13
  2. **Контракт API** — DTO ответов/запросов там, где принято в репо; целевые доменные типы в `@/types`.
14
14
  3. **Мапперы** — DTO → домен в `*responseMappers.ts` или аналоге; чистые функции (`api-services.mdc`).
15
15
  4. **Сервисы** — вызовы только через прикладные клиенты `app/src/api/clients/**`, public API модуля (`api-services.mdc`, `http-client.mdc`). Без `fetch` из UI/store.
16
- 5. **Состояние** — `createSlice` / `createAsyncThunk`, доменные модели в state (`store-rtk.mdc`); thunk вызывает сервисы из `@/api/services/**`.
16
+ 5. **Состояние** — `createSlice` / `createAsyncThunk`, доменные модели в state (`store-rtk.mdc`); thunk вызывает сервисы, импортированные из `@/api` (`api-public-imports.mdc`).
17
17
  6. **UI** — тонкие компоненты, типы из `@/types`, без DTO (`react-ui.mdc`, `architecture-boundaries.mdc`, `no-props-spread.mdc`).
18
18
  7. **Моки** — по схеме репозитория, точка входа регистрации моков (например `app/src/mocks/index.js`).
19
19
  8. **Тесты** — unit для мапперов и критичной логики (`tests-unit.mdc`); при смене HTTP‑клиента — behavior‑тесты клиента (`http-client.mdc`); e2e по `*.cases.md` (`tests-e2e-structure.mdc`, `playwright-agents.mdc`).
20
- 9. **Завершение** — из каталога `app/`: `yarn lint:js`, при стилях `yarn lint:css`, `yarn type-check` (`next-app-core.mdc`).
20
+ 9. **Завершение** — из каталога `app/`: `bun run lint:js`, при стилях `bun run lint:css`, `bun run type-check` (`next-app-core.mdc`).
21
21
 
22
22
  ## Поток данных (ориентир)
23
23
 
@@ -41,8 +41,8 @@ flowchart LR
41
41
  |--------------------|-----------------------------------|
42
42
  | `app/src/api/clients/**`, `app/src/lib/clients/**` | `http-client.mdc`; при изменении клиента — `tests-unit.mdc` (behavior‑тесты) |
43
43
  | `app/src/api/services/**` | `api-services.mdc`; при необходимости `http-client.mdc` |
44
- | `app/src/store/**` | `store-rtk.mdc`, `architecture-boundaries.mdc` |
45
- | `app/src/ui/**` | `react-ui.mdc`, `no-props-spread.mdc`, `types-public-imports.mdc` |
44
+ | `app/src/store/**` | `store-rtk.mdc`, `architecture-boundaries.mdc`, `api-public-imports.mdc` |
45
+ | `app/src/ui/**` | `react-ui.mdc`, `no-props-spread.mdc`, `types-public-imports.mdc`, `api-public-imports.mdc` |
46
46
  | `app/src/types/**` | `types-public-imports.mdc`, `types-jsdoc.mdc` |
47
47
  | `app/__tests__/e2e/**` | `tests-e2e-structure.mdc`, `playwright-agents.mdc` |
48
48
 
@@ -14,7 +14,7 @@ alwaysApply: false
14
14
 
15
15
  - Обычные REST‑вызовы к backend идут через **одну реализацию** в `app/src/lib/clients/**` (модуль общего клиента) и **преднастроенные экземпляры** в `app/src/api/clients/**`, по тому же паттерну, что уже принят в проекте.
16
16
  - Место транспорта в общей картине **порты и адаптеры** — в `architecture-boundaries.mdc` (раздел **«Порты и адаптеры»**).
17
- - **Не** вызывать `fetch` напрямую из `api/services`, store и UI (см. `architecture-boundaries.mdc`, `api-services.mdc`).
17
+ - **Не** вызывать `fetch` напрямую из `app/src/api/services/**`, store и UI (см. `architecture-boundaries.mdc`, `api-services.mdc`); из store/UI — только вызовы через сервисы из `@/api` (`api-public-imports.mdc`).
18
18
  - **Исключения** (узкие протоколы, отдельный транспорт) — только там, где в репозитории уже есть образец; повторять его, не плодить произвольные обходы общего клиента.
19
19
 
20
20
  ## Типы
@@ -0,0 +1,61 @@
1
+ ---
2
+ description: Выбор API навигации по стеку проекта (Next.js vs React Router)
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # Навигация и роутинг: сначала стек проекта
7
+
8
+ **При любой задаче, связанной с навигацией, переходами между страницами, URL, редиректами, хлебными крошками, защищёнными маршрутами или программной сменой маршрута** — перед предложением кода или импортов **нельзя** опираться на «типичный React» по умолчанию. Нужно **явно свериться со стеком целевого репозитория** и использовать **один** согласованный с проектом механизм.
9
+
10
+ ## Зависимости: что проверить в первую очередь
11
+
12
+ 1. **`package.json`** в корне приложения (например `app/package.json` в монорепо — тот пакет, который реально собирается и деплоится). Смотреть **`dependencies`** и при необходимости **`peerDependencies`**:
13
+ - **`next`** — Next.js; версия важна для нюансов API (сверяться с документацией под эту major).
14
+ - **`react-router-dom`**, **`@remix-run/*`**, **`@tanstack/react-router`** и т.д. — отдельный роутинг; не подменять их API вызовами Next без проверки, что в проекте действительно используется этот стек.
15
+ - **`next`** и **`react-router-dom`** одновременно — возможно легаси или гибрид; **не** выбирать API по умолчанию — смотреть раздел «Реализация в коде» ниже.
16
+
17
+ 2. **Монорепо / workspaces** — роутинг может жить не в корневом `package.json`. Открыть **`package.json` того workspace**, где лежат страницы и `next.config.*` / точка входа SPA.
18
+
19
+ 3. **Факт установки** — при сомнениях смотреть lockfile (`bun.lock`, `package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`) или каталог `node_modules` у соответствующего пакета: убедиться, что заявленный пакет реально установлен, а не только прописан в документации.
20
+
21
+ ## Реализация роутинга в проекте (код и структура)
22
+
23
+ Перед предложением паттерна навигации **свериться с тем, как уже сделано в репозитории**:
24
+
25
+ 1. **Дерево маршрутов**
26
+ - Next **App Router**: каталог **`app/`** (или `src/app/`) с `layout.tsx`, `page.tsx`, сегменты `[id]` и т.п.
27
+ - Next **Pages Router**: каталог **`pages/`** с `_app`, динамические `[slug].tsx`.
28
+ - Наличие **обоих** `app/` и `pages/` — уточнить по `next.config` и документации проекта, какой слой основной.
29
+
30
+ 2. **Точки входа и обёртки**
31
+ - Поиск по коду импортов: **`from 'next/navigation'`**, **`from 'next/router'`**, **`from 'next/link'`**, **`from 'react-router-dom'`**, **`createBrowserRouter`**, **`RouterProvider`**, **`BrowserRouter`**.
32
+ - Где объявлены маршруты (файловая структура Next vs конфиг маршрутов / `routes.tsx` в SPA).
33
+
34
+ 3. **Общие абстракции проекта**
35
+ - Обертки над ссылками (`@/ui/...`, `Link` из дизайн-системы), хелперы путей, константы роутов — **использовать их**, а не дублировать сырой роутер.
36
+
37
+ 4. **Соседние файлы фичи**
38
+ - Новый код навигации — в том же стиле, что страницы/хуки той же области (`next/navigation` vs `react-router-dom` как в соседних импортах).
39
+
40
+ ## Как определить, что использовать (сводка)
41
+
42
+ 1. **Зависимости** — см. раздел выше; по ним задаётся допустимый набор пакетов.
43
+ 2. **Структура** — App Router vs Pages vs SPA по каталогам и конфигу.
44
+ 3. **Фактический код** — какие импорты и обёртки уже доминируют в приложении.
45
+
46
+ ## Что использовать (краткая матрица)
47
+
48
+ | Стек | Программная навигация / чтение пути | Ссылки |
49
+ |------|-------------------------------------|--------|
50
+ | **Next.js App Router** | `next/navigation` (`useRouter`, `usePathname`, `useSearchParams`, `redirect` и т.д. по документации Next для вашей версии) | `next/link` |
51
+ | **Next.js Pages Router** | `next/router` | `next/link` |
52
+ | **SPA + React Router** | `react-router-dom` (`useNavigate`, `useParams`, `useLocation`, …) | `<Link>` из `react-router-dom` |
53
+
54
+ **Не делать:** подключать `react-router-dom` в проект на Next.js «по привычке»; импортировать хуки из `next/router` в компонентах App Router без проверки; смешивать два роутера в одном приложении без явной архитектурной причины в кодовой базе.
55
+
56
+ ## Требование к агенту
57
+
58
+ - Перед генерацией или ревью кода навигации **коротко зафиксировать вывод** (например: «зависимости: `next` без `react-router-dom`; в коде везде `next/navigation` → используем то же») и следовать ему.
59
+ - **Обязательная проверка:** актуальные **`dependencies`** в `package.json` нужного workspace + **как в проекте уже реализованы** маршруты и импорты (поиск по репозиторию, соседние файлы). Не полагаться только на предположение по одному признаку (например, только на наличие папки `app/`).
60
+ - Если стек неочевиден (два роутера в зависимостях, гибрид) — **сверить lockfile / установленные пакеты** и **доминирующие импорты** в `src`/`app`, затем выбрать API.
61
+ - Для **этого** репозитория базовый ориентир — **`next-app-core.mdc`**: Next.js; предпочитать **`next/navigation`** и **`next/link`** там, где используется App Router.
@@ -33,8 +33,8 @@ alwaysApply: true
33
33
  - **Store слой** (`app/src/store/**`):
34
34
  - `app/src/store/slices/**` — модули состояния (в этом preset — Redux Toolkit; подробности в `store-rtk.mdc`).
35
35
  - `app/src/store/middleware/**` — middleware для сайд‑эффектов (например, файлы, аналитика).
36
- - **API слой** (`app/src/api/services/**`):
37
- - Сервисы и мапперы, инкапсулирующие HTTP‑логику.
36
+ - **API слой** (`app/src/api/**` — прежде всего `services/**`, плюс `clients/**`, корневой barrel `index.ts`):
37
+ - Сервисы и мапперы, инкапсулирующие HTTP‑логику; **потребители вне этого каталога** импортируют только через `@/api` (`api-public-imports.mdc`).
38
38
  - **HTTP‑транспорт** (модуль общего клиента под `app/src/lib/clients/**`, экземпляры под `app/src/api/clients/**` — как в репозитории):
39
39
  - Один механизм запросов, без разбросанного «сырого» `fetch`/`XMLHttpRequest` по фичам. Детали и исключения — **`http-client.mdc`**.
40
40
  - **Типы** (`app/src/types/**`):
@@ -44,13 +44,13 @@ alwaysApply: true
44
44
 
45
45
  ## Порты и адаптеры (сопоставление с каталогами)
46
46
 
47
- Та же идея, что в `architecture-boundaries.mdc` (раздел **«Порты и адаптеры»**): UI и store зависят от **контракта** к backend (сервисы + доменные типы), а **реализация HTTP** изолирована в **`app/src/lib/clients/**`** и **`app/src/api/clients/**`**. Детали транспорта — `http-client.mdc`.
47
+ Та же идея, что в `architecture-boundaries.mdc` (раздел **«Порты и адаптеры»**): UI и store зависят от **контракта** к backend (публичный API `@/api` + доменные типы), а **реализация HTTP** изолирована в **`app/src/lib/clients/**`** и **`app/src/api/clients/**`**. Детали транспорта — `http-client.mdc`; импорты `@/api` — `api-public-imports.mdc`.
48
48
 
49
49
  # Общие архитектурные принципы
50
50
 
51
51
  - **Чёткое разделение слоёв**:
52
- - UI знает о доменных типах (из `@/types` / `@/types/enums`) и публичных API store и при необходимости **`@/api/services`** — см. политику в `architecture-boundaries.mdc` (**«UI и обращение к `@/api/services`»**).
53
- - Store знает о доменных типах и API‑сервисах.
52
+ - UI знает о доменных типах (из `@/types` / `@/types/enums`) и публичных API store и при необходимости импортирует из **`@/api`** — см. `api-public-imports.mdc` и `architecture-boundaries.mdc` (**«UI и обращение к API»**).
53
+ - Store знает о доменных типах и вызывает API‑сервисы через импорты из **`@/api`**.
54
54
  - API‑сервисы знают о DTO, мапперах и вызовах через клиенты из `app/src/api/clients/**` (`http-client.mdc`).
55
55
  - **Никаких "проникновений" слоёв**:
56
56
  - UI не вызывает HTTP‑клиент и не работает с DTO; сценарии с записью в общий state — через store; узкие исключения для вызова сервисов из UI — только по правилам `architecture-boundaries.mdc`.
@@ -83,5 +83,5 @@ alwaysApply: true
83
83
  - Найти в соответствующей директории похожие примеры и **копировать архитектурный паттерн** (структура файлов, типы, именование).
84
84
  - Не упрощать архитектуру в ущерб существующим слоям (не тянуть DTO и HTTP в UI; вызовы сервисов из UI — только в рамках `architecture-boundaries.mdc`).
85
85
  - Избегать использования `any` при типизации кода; при необходимости использовать `unknown` с последующим безопасным сужением типов.
86
- - После создания или редактирования файлов **обязательно** устранять проблемы линтера и типов: из каталога `app/` минимум **`yarn lint:js`** (полный прогон ESLint по проекту, как в `package.json`), при правках стилей — ещё **`yarn lint:css`**; для проверки типов — **`yarn type-check`**. Точечный ESLint только на один файл не заменяет полный прогон при завершении задачи/MR. Устранять найденное в зоне изменений, если это возможно без искажения бизнес‑логики.
86
+ - После создания или редактирования файлов **обязательно** устранять проблемы линтера и типов: из каталога `app/` минимум **`bun run lint:js`** (полный прогон ESLint по проекту, как в `package.json`), при правках стилей — ещё **`bun run lint:css`**; для проверки типов — **`bun run type-check`**. Точечный ESLint только на один файл не заменяет полный прогон при завершении задачи/MR. Устранять найденное в зоне изменений, если это возможно без искажения бизнес‑логики.
87
87
 
@@ -30,8 +30,8 @@ alwaysApply: false
30
30
  - Асинхронные запросы:
31
31
  - через `createAsyncThunk` или RTK Query.
32
32
  - внутри thunk:
33
- - вызывать API через сервисы из `@/api/services/**`;
34
- - не вызывать HTTP‑клиент напрямую — только через сервисы `@/api/services/**`.
33
+ - вызывать API через сервисы, импортированные из `@/api` (**`api-public-imports.mdc`**);
34
+ - не вызывать HTTP‑клиент напрямую — только через эти сервисы.
35
35
  - Сайд‑эффекты (логирование, аналитика, работа с файлами):
36
36
  - выносить в middleware (`app/src/store/middleware/**`) или специализированные слайсы.
37
37