@bonesofspring/ai-rules 0.1.42 → 0.2.1

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 (103) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/CONTRIBUTING.md +102 -0
  3. package/README.md +2 -0
  4. package/bin/cli.js +4 -2
  5. package/fragments/BUGBOT.md +23 -0
  6. package/package.json +10 -2
  7. package/presets/claude/next/BUGBOT.md +16 -0
  8. package/presets/claude/next/CLAUDE.md +6 -2
  9. package/presets/claude/next/agents/README.md +77 -15
  10. package/presets/claude/next/agents/api-contract-reviewer.md +1 -1
  11. package/presets/claude/next/agents/build-verifier.md +2 -0
  12. package/presets/claude/next/agents/code-reviewer.md +1 -1
  13. package/presets/claude/next/agents/feature-developer.md +8 -21
  14. package/presets/claude/next/agents/playwright-test-generator.md +16 -65
  15. package/presets/claude/next/agents/playwright-test-healer.md +16 -51
  16. package/presets/claude/next/agents/playwright-test-planner.md +15 -55
  17. package/presets/claude/next/agents/task-analyst.md +1 -1
  18. package/presets/claude/next/agents/task-router.md +50 -128
  19. package/presets/claude/next/agents/tech-writer.md +1 -1
  20. package/presets/claude/next/commands/task.md +1 -1
  21. package/presets/claude/next/hooks.json +17 -0
  22. package/presets/claude/next/rules/README.md +7 -3
  23. package/presets/claude/next/rules/api-and-data/api-services.md +3 -3
  24. package/presets/claude/next/rules/api-and-data/http-client.md +2 -2
  25. package/presets/claude/next/rules/api-and-data/store-rtk.md +2 -2
  26. package/presets/claude/next/rules/architecture/README.md +9 -11
  27. package/presets/claude/next/rules/architecture/api-public-imports.md +3 -26
  28. package/presets/claude/next/rules/architecture/architecture-boundaries-ui.md +15 -0
  29. package/presets/claude/next/rules/architecture/architecture-boundaries.md +10 -7
  30. package/presets/claude/next/rules/architecture/feature-delivery-workflow.md +44 -69
  31. package/presets/claude/next/rules/architecture/layer-barrel-exports.md +6 -6
  32. package/presets/claude/next/rules/architecture/public-imports.md +46 -0
  33. package/presets/claude/next/rules/architecture/reference-features.md +4 -1
  34. package/presets/claude/next/rules/architecture/types-public-imports.md +3 -29
  35. package/presets/claude/next/rules/stack/README.md +2 -1
  36. package/presets/claude/next/rules/stack/navigation-router-ui.md +15 -0
  37. package/presets/claude/next/rules/stack/navigation-router.md +2 -1
  38. package/presets/claude/next/rules/stack/next-app-core.md +20 -70
  39. package/presets/claude/next/rules/stack/no-type-assertion.md +3 -2
  40. package/presets/claude/next/rules/stack/types-jsdoc.md +1 -1
  41. package/presets/claude/next/rules/tooling-and-review/agent-team-intake.md +6 -0
  42. package/presets/claude/next/rules/tooling-and-review/agent-team-orchestrator.md +20 -1
  43. package/presets/claude/next/rules/tooling-and-review/code-quality.md +3 -11
  44. package/presets/claude/next/rules/tooling-and-review/code-review-mr.md +22 -59
  45. package/presets/claude/next/rules/tooling-and-review/package-manager.md +6 -15
  46. package/presets/claude/next/rules/tooling-and-review/post-change-lint.md +14 -24
  47. package/presets/claude/next/rules/ui-and-accessibility/README.md +1 -2
  48. package/presets/claude/next/rules/ui-and-accessibility/css-property-order.md +6 -18
  49. package/presets/claude/next/rules/ui-and-accessibility/react-ui.md +5 -4
  50. package/presets/claude/next/skills/feature-delivery/SKILL.md +5 -20
  51. package/presets/claude/next/team/README.md +1 -0
  52. package/presets/claude/next/team/fixtures/bugfix-standard.json +15 -0
  53. package/presets/claude/next/team/fixtures/feature-full.json +16 -0
  54. package/presets/claude/next/team/fixtures/feature-light.json +17 -0
  55. package/presets/cursor/next/AGENTS.md +3 -10
  56. package/presets/cursor/next/BUGBOT.md +2 -0
  57. package/presets/cursor/next/agents/README.md +97 -15
  58. package/presets/cursor/next/agents/api-contract-reviewer.md +1 -1
  59. package/presets/cursor/next/agents/build-verifier.md +2 -0
  60. package/presets/cursor/next/agents/code-reviewer.md +2 -2
  61. package/presets/cursor/next/agents/feature-developer.md +9 -30
  62. package/presets/cursor/next/agents/task-analyst.md +1 -1
  63. package/presets/cursor/next/agents/task-router.md +49 -127
  64. package/presets/cursor/next/agents/tech-writer.md +1 -1
  65. package/presets/cursor/next/commands/task.md +1 -1
  66. package/presets/cursor/next/rules/README.md +27 -8
  67. package/presets/cursor/next/rules/agent-team-intake.mdc +2 -2
  68. package/presets/cursor/next/rules/agent-team-orchestrator.mdc +14 -1
  69. package/presets/cursor/next/rules/api-public-imports.mdc +3 -24
  70. package/presets/cursor/next/rules/api-services.mdc +3 -3
  71. package/presets/cursor/next/rules/architecture-boundaries-ui.mdc +15 -0
  72. package/presets/cursor/next/rules/architecture-boundaries.mdc +7 -7
  73. package/presets/cursor/next/rules/code-quality-and-refactoring.mdc +3 -11
  74. package/presets/cursor/next/rules/code-review-mr.mdc +20 -46
  75. package/presets/cursor/next/rules/css-property-order-stylelint.mdc +6 -18
  76. package/presets/cursor/next/rules/feature-delivery-workflow.mdc +45 -22
  77. package/presets/cursor/next/rules/http-client.mdc +2 -2
  78. package/presets/cursor/next/rules/layer-barrel-exports.mdc +6 -6
  79. package/presets/cursor/next/rules/navigation-router-stack.mdc +1 -1
  80. package/presets/cursor/next/rules/navigation-router-ui.mdc +16 -0
  81. package/presets/cursor/next/rules/next-app-core.mdc +18 -71
  82. package/presets/cursor/next/rules/no-cross-component-styles-import.mdc +3 -53
  83. package/presets/cursor/next/rules/no-type-assertion-as-import-export.mdc +4 -1
  84. package/presets/cursor/next/rules/package-manager.mdc +6 -15
  85. package/presets/cursor/next/rules/post-change-lint.mdc +14 -24
  86. package/presets/cursor/next/rules/public-imports.mdc +48 -0
  87. package/presets/cursor/next/rules/react-ui.mdc +5 -4
  88. package/presets/cursor/next/rules/reference-features.mdc +5 -1
  89. package/presets/cursor/next/rules/store-rtk.mdc +2 -2
  90. package/presets/cursor/next/rules/types-jsdoc.mdc +1 -1
  91. package/presets/cursor/next/rules/types-public-imports.mdc +3 -26
  92. package/presets/cursor/next/skills/feature-delivery/SKILL.md +5 -20
  93. package/presets/cursor/next/team/README.md +1 -0
  94. package/presets/cursor/next/team/fixtures/bugfix-standard.json +15 -0
  95. package/presets/cursor/next/team/fixtures/feature-full.json +16 -0
  96. package/presets/cursor/next/team/fixtures/feature-light.json +17 -0
  97. package/scripts/README.md +84 -0
  98. package/scripts/golden-prompts.json +276 -0
  99. package/scripts/preset-manifest.json +72 -0
  100. package/scripts/regression-results/.gitkeep +0 -0
  101. package/scripts/validate-preset.sh +484 -0
  102. package/presets/claude/next/rules/ui-and-accessibility/component-styles.md +0 -56
  103. package/presets/cursor/next/rules/feature-delivery-flow.mdc +0 -74
@@ -1,28 +1,16 @@
1
1
  ---
2
2
  description: Порядок CSS-свойств по Stylelint (idiomatic-order) — для любых стилей в проекте
3
3
  globs:
4
- - app/src/**/*.{css,ts,tsx}
4
+ - app/src/ui/**/*.styles.ts
5
+ - app/src/ui/**/*.styles.tsx
6
+ - app/src/ui/**/styles.ts
7
+ - app/src/ui/**/styles.tsx
5
8
  - app/**/*.css
6
9
  alwaysApply: false
7
10
  ---
8
11
 
9
12
  # Порядок CSS-свойств (как в Stylelint)
10
13
 
11
- Действует для **любого** CSS в репозитории: `.css`, стилевые блоки в `styles.ts` / `styles.tsx`, `styled` / Linaria и другой CSS-in-JS в `.ts` / `.tsx`, если этот код попадает под `yarn lint:css`.
14
+ Для CSS в `.css`, `styles.ts(x)`, `styled` / Linaria порядок свойств как в **`app/.stylelintrc`** (`@sh/stylelint-config-react` `stylelint-config-idiomatic-order`).
12
15
 
13
- Источник: `app/.stylelintrc` `@sh/stylelint-config-react` пакет **`stylelint-config-idiomatic-order`** (правило `order/properties-order`). Свойства, не попавшие в список, идут **в конце блока в алфавитном порядке** (`unspecified: bottomAlphabetical`).
14
-
15
- Пиши объявления в **одном** блоке в такой последовательности групп:
16
-
17
- 1. **`composes`** — только для CSS Modules (если есть).
18
- 2. **`all`**
19
- 3. **Позиционирование:** `position`, `z-index`, затем `top`, `right`, `bottom`, `left`.
20
- 4. **Отображение и раскладка:** `display`, `overflow`.
21
- 5. **Размеры:** `width`, `min-width`, `max-width`, `height`, `min-height`, `max-height`, `box-sizing`.
22
- 6. **Flex:** `flex`, `flex-basis`, `flex-direction`, `flex-flow`, `flex-grow`, `flex-shrink`, `flex-wrap`, `align-content`, `align-items`, `align-self`, `justify-content`, `order`.
23
- 7. **Внутренние отступы:** `padding-top`, `padding-right`, `padding-bottom`, `padding-left`.
24
- 8. **Рамка:** общие `border`, `border-width`, `border-style`, `border-color`, `border-radius`; затем для сторон **сверху по часовой** — `border-top` и его `-width`, `-style`, `-color`, `-radius`, то же для `right`, `bottom`, `left`.
25
- 9. **Внешние отступы:** `margin-top`, `margin-right`, `margin-bottom`, `margin-left`.
26
- 10. **Остальные свойства** — после перечисленных, **по алфавиту** (типографика, фон, анимации, `cursor`, и т.д.).
27
-
28
- Автоисправление из каталога `app`: `yarn lint:css --fix` (проверяет `**/*.{css,ts}`).
16
+ Не дублировать список свойств вручную. Автоисправление из `app/`: **`yarn lint:css --fix`** (или менеджер пакетов репо). Полный прогон **`post-change-lint.mdc`**.
@@ -5,19 +5,19 @@ alwaysApply: false
5
5
 
6
6
  # Доставка фичи (сквозной порядок)
7
7
 
8
- Типичная фича с данными с backend и общим состоянием. Детали слоёв — в `architecture-boundaries.mdc`, `next-app-core.mdc`.
8
+ Типичная фича с данными с backend и общим состоянием. Детали слоёв — `architecture-boundaries.mdc`, `next-app-core.mdc`.
9
9
 
10
10
  ## Чеклист (порядок работ)
11
11
 
12
- 1. **Доменные типы** — `app/src/types/**`, экспорт через barrel `app/src/types/index.ts` (`types-public-imports.mdc`, **`layer-barrel-exports.mdc`**); JSDoc полей — `types-jsdoc.mdc`.
13
- 2. **Контракт API** — DTO ответов/запросов там, где принято в репо; целевые доменные типы в `@/types`.
14
- 3. **Мапперы** — DTO → домен в `*responseMappers.ts` или аналоге; чистые функции (`api-services.mdc`).
15
- 4. **Сервисы** — вызовы только через прикладные клиенты `app/src/api/clients/**`, public API модуля (`api-services.mdc`, `http-client.mdc`, **`layer-barrel-exports.mdc`**). Без `fetch` из UI/store.
16
- 5. **Состояние** — `createSlice` / `createAsyncThunk`, доменные модели в state (`store-rtk.mdc`); thunk вызывает сервисы, импортированные из `@/api` (`api-public-imports.mdc`).
17
- 6. **UI** — тонкие компоненты, типы из `@/types`, без DTO (`react-ui.mdc`, `architecture-boundaries.mdc`, `no-props-spread.mdc`).
18
- 7. **Моки** — по схеме репозитория, точка входа регистрации моков (например `app/src/mocks/index.js`).
19
- 8. **Тесты** — unit для мапперов и критичной логики (`tests-unit.mdc`); при смене HTTP‑клиента — behavior‑тесты клиента (`http-client.mdc`); e2e по `*.cases.md` (`tests-e2e-structure.mdc`, `playwright-agents.mdc`).
20
- 9. **Завершение** — **`post-change-lint.mdc`**: из каталога `app/` обязательно `lint:js` + `lint:css` (полный прогон, исправить срабатывания), затем `type-check`; менеджер пакетов — `package-manager.mdc`.
12
+ 1. **Доменные типы** — `app/src/types/**`, экспорт через barrel (`public-imports.mdc`, **`layer-barrel-exports.mdc`**); JSDoc — `types-jsdoc.mdc`.
13
+ 2. **Контракт API** — DTO там, где принято; доменные типы в `@/types`.
14
+ 3. **Мапперы** — DTO → домен в `*responseMappers.ts` (`api-services.mdc`).
15
+ 4. **Сервисы** — клиенты `app/src/api/clients/**`, barrel `@/api` (`api-services.mdc`, `http-client.mdc`, **`layer-barrel-exports.mdc`**). Без `fetch` из UI/store.
16
+ 5. **Состояние** — `createSlice` / `createAsyncThunk` (`store-rtk.mdc`); thunk сервисы из `@/api`.
17
+ 6. **UI** — типы из `@/types`, без DTO (`react-ui.mdc`, `architecture-boundaries-ui.mdc`, `no-props-spread.mdc`).
18
+ 7. **Моки** — по схеме репо; регистрация в `app/src/mocks/handlers.ts` (см. ниже).
19
+ 8. **Тесты** — unit для мапперов (`tests-unit.mdc`); e2e по `*.cases.md` (`tests-e2e-structure.mdc`, `playwright-agents.mdc`).
20
+ 9. **Завершение** — **`post-change-lint.mdc`**: `lint:js` + `lint:css` + `type-check`; менеджер — `package-manager.mdc`.
21
21
 
22
22
  ## Поток данных (ориентир)
23
23
 
@@ -35,19 +35,42 @@ flowchart LR
35
35
  Store --> UI[UI]
36
36
  ```
37
37
 
38
- ## Матрица: что меняю → какие правила перечитать
38
+ ## Регистрация по слоям
39
39
 
40
- | Зона в репозитории | Правила Cursor (`.cursor/rules/`) |
41
- |--------------------|-----------------------------------|
42
- | `app/src/api/clients/**`, `app/src/lib/clients/**` | `http-client.mdc`; при изменении клиента `tests-unit.mdc` (behavior‑тесты) |
43
- | `app/src/api/services/**` | `api-services.mdc`, `layer-barrel-exports.mdc`; при необходимости `http-client.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
- | `app/src/types/**` | `types-public-imports.mdc`, `types-jsdoc.mdc`, `layer-barrel-exports.mdc` |
47
- | `app/__tests__/e2e/**` | `tests-e2e-structure.mdc`, `playwright-agents.mdc` |
40
+ 1. **Типы** `app/src/types/**`; доменная модель источник правды для UI и store.
41
+ 2. **API** — `app/src/api/services/<ServiceRoot>/<Segment>/`; публичные экспорты (в т.ч. **константы путей** для моков) → **`app/src/api/index.ts`**.
42
+ 3. **Моки (MSW)** — `app/src/mocks/data/<feature>/`; хендлеры в **`app/src/mocks/handlers.ts`**. Пути из `@/api`, не дублировать URL-строки. Проверить браузерный worker и Node `setupServer`, если оба используются.
43
+ 4. **Store** — `app/src/store/slices/<FeatureName>/`; редюсер в **`app/src/store/reducers.ts`**. Middleware → `app/src/store/middleware/**`, регистрация в **`app/src/store/index.ts`**.
44
+ 5. **UI** — `app/src/ui/pages/<FeatureName>Page/**` и/или `components/**`; данные через store/hooks.
45
+ 6. **Unit** `*.spec.ts(x)`; мапперы и нетривиальная логика — обязательно.
46
+ 7. **E2E** — `app/__tests__/e2e/<Area>/<plan>.cases.md` + `*.spec.ts`.
47
+
48
+ ## Частичные сценарии
49
+
50
+ | Задача | Минимум действий |
51
+ |--------|------------------|
52
+ | Только API + типы | Типы, сервис, мапперы, `@/api` barrel; unit на маппер. |
53
+ | Только моки | Путь в `@/api`; handlers + `mocks/handlers.ts`. |
54
+ | Только store | Thunk на `@/api`; slice + `reducers.ts`. |
55
+ | Только UI | Store state; без HTTP/DTO. |
56
+ | Только e2e | `*.cases.md` + spec; page object. |
48
57
 
49
- Специализированные `.mdc` с `globs` подмешиваются при работе с соответствующими файлами; эта матрица нужна, когда открыт другой файл или идёт общий чат.
58
+ ## Антипаттерны
50
59
 
51
- ## Требование к агенту
60
+ - DTO в UI или нетипизированном store.
61
+ - HTTP-клиент из компонента/thunk в обход сервиса.
62
+ - Deep-import `@/api/services/**` из UI/store.
63
+ - `{...props}` в компоненты — `no-props-spread.mdc`.
64
+
65
+ ## Матрица: зона → правила
66
+
67
+ | Зона | Правила |
68
+ |------|---------|
69
+ | `app/src/api/clients/**`, `app/src/lib/clients/**` | `http-client.mdc`, `tests-unit.mdc` (behavior) |
70
+ | `app/src/api/services/**` | `api-services.mdc`, `layer-barrel-exports.mdc`, `http-client.mdc` |
71
+ | `app/src/store/**` | `store-rtk.mdc`, `architecture-boundaries.mdc`, `public-imports.mdc` |
72
+ | `app/src/ui/**` | `react-ui.mdc`, `no-props-spread.mdc`, `public-imports.mdc` |
73
+ | `app/src/types/**` | `public-imports.mdc`, `types-jsdoc.mdc`, `layer-barrel-exports.mdc` |
74
+ | `app/__tests__/e2e/**` | `tests-e2e-structure.mdc`, `playwright-agents.mdc` |
52
75
 
53
- При добавлении или существенном расширении фичи **пройти чеклист сверху** и при правках в зоне из таблицы **ориентироваться на указанные правила**, не смешивать слои и не обходить public API модулей.
76
+ При добавлении или расширении фичи **пройти чеклист** и правила из таблицы для затронутых зон.
@@ -14,12 +14,12 @@ alwaysApply: false
14
14
 
15
15
  - Обычные REST‑вызовы к backend идут через **одну реализацию** в `app/src/lib/clients/**` (модуль общего клиента) и **преднастроенные экземпляры** в `app/src/api/clients/**`, по тому же паттерну, что уже принят в проекте.
16
16
  - Место транспорта в общей картине **порты и адаптеры** — в `architecture-boundaries.mdc` (раздел **«Порты и адаптеры»**).
17
- - **Не** вызывать `fetch` напрямую из `app/src/api/services/**`, store и UI (см. `architecture-boundaries.mdc`, `api-services.mdc`); из store/UI — только вызовы через сервисы из `@/api` (`api-public-imports.mdc`).
17
+ - **Не** вызывать `fetch` напрямую из `app/src/api/services/**`, store и UI (см. `architecture-boundaries.mdc`, `api-services.mdc`); из store/UI — только вызовы через сервисы из `@/api` (`public-imports.mdc`).
18
18
  - **Исключения** (узкие протоколы, отдельный транспорт) — только там, где в репозитории уже есть образец; повторять его, не плодить произвольные обходы общего клиента.
19
19
 
20
20
  ## Типы
21
21
 
22
- - Всё, что относится к **контракту запроса/ответа/ошибки** приложения и реэкспортируется для HTTP‑слоя, импортировать **только** из barrel `@/types`, без deep‑импортов из внутренних файлов `app/src/types/**` (см. `types-public-imports.mdc`).
22
+ - Всё, что относится к **контракту запроса/ответа/ошибки** приложения и реэкспортируется для HTTP‑слоя, импортировать **только** из barrel `@/types`, без deep‑импортов из внутренних файлов `app/src/types/**` (см. `public-imports.mdc`).
23
23
  - Не поднимать в новом коде **типы и зависимости от внешнего HTTP‑клиента**, от которого проект ушёл; ориентир — **`package.json`** и существующие вызовы.
24
24
 
25
25
  ## Контракт ошибок
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Двухуровневые barrel-экспорты для слоёв с регламентированным public API
3
- globs: app/src/**/*
3
+ globs: app/src/**/index.ts
4
4
  alwaysApply: false
5
5
  ---
6
6
 
@@ -11,7 +11,7 @@ alwaysApply: false
11
11
  Для **любого слоя** (каталога, пакета, bounded context), у которого:
12
12
 
13
13
  - есть **корневой barrel** — единая точка импорта для внешних потребителей;
14
- - deep-импорты внутрь слоя **запрещены** снаружи (ESLint `no-restricted-imports`, правила `*-public-imports.mdc`).
14
+ - deep-импорты внутрь слоя **запрещены** снаружи (ESLint `no-restricted-imports`, правила `public-imports.mdc`).
15
15
 
16
16
  Примеры alias/entry point в разных проектах: `@/api`, `@/types`, `@/core`, `@/store`, `packages/foo`.
17
17
 
@@ -34,7 +34,7 @@ alwaysApply: false
34
34
 
35
35
  При добавлении или существенном расширении **модуля внутри регламентированного слоя**:
36
36
 
37
- 1. Определить слой, его **корневой barrel** и доп. entry points (`*-public-imports.mdc`).
37
+ 1. Определить слой, его **корневой barrel** и доп. entry points (`public-imports.mdc`).
38
38
  2. Создать/обновить **локальный** `index.ts` — только публичные символы.
39
39
  3. Если в слое есть **фасад/агрегатор** (`*ApiService.ts`, `rootReducer`, …) — подключить модуль там.
40
40
  4. Добавить **реэкспорт** новых публичных символов в **корневой barrel** слоя.
@@ -44,7 +44,7 @@ alwaysApply: false
44
44
 
45
45
  ## Как найти регламентированные слои в репозитории
46
46
 
47
- 1. Правила `*-public-imports.mdc` в `.cursor/rules/`.
47
+ 1. Правила `public-imports.mdc` в `.cursor/rules/`.
48
48
  2. ESLint `no-restricted-imports` — паттерны `@/<layer>/*` с исключением barrel.
49
49
  3. `architecture-boundaries.mdc`, README проекта.
50
50
 
@@ -52,8 +52,8 @@ alwaysApply: false
52
52
 
53
53
  | Слой | Корневой barrel | Правило импортов |
54
54
  |------|-------------------|------------------|
55
- | API | `app/src/api/index.ts` | `api-public-imports.mdc` |
56
- | Types | `app/src/types/index.ts` | `types-public-imports.mdc` (+ `@/types/enums`) |
55
+ | API | `app/src/api/index.ts` | `public-imports.mdc` |
56
+ | Types | `app/src/types/index.ts` | `public-imports.mdc` (+ `@/types/enums`) |
57
57
  | Core | `app/src/core/index.ts` | ESLint: `@/core/index` |
58
58
 
59
59
  Иллюстрация двух уровней (API): локальный `services/.../<Feature>/index.ts` → фасад `*ApiService.ts` → `app/src/api/index.ts`.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Выбор API навигации по стеку проекта (Next.js vs React Router)
3
- globs: app/src/ui/**/*
3
+ globs: app/src/app/**/*,app/**/app/**/*
4
4
  alwaysApply: false
5
5
  ---
6
6
 
@@ -0,0 +1,16 @@
1
+ ---
2
+ description: Навигация в UI-компонентах — краткий ориентир (полный аудит стека — navigation-router-stack.mdc)
3
+ globs: app/src/ui/**/*.tsx
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Navigation in UI components
8
+
9
+ Перед ссылками, программной навигацией или работой с URL в UI:
10
+
11
+ 1. **`package.json`** workspace приложения — `next` vs `react-router-dom`.
12
+ 2. **Соседние импорты** той же фичи (`next/navigation`, `next/link` vs `react-router-dom`).
13
+ 3. **Обёртки проекта** (`@/ui/...` Link) — предпочтительнее сырого API роутера.
14
+ 4. **По умолчанию (preset):** Next.js App Router → `next/navigation` + `next/link` (`next-app-core.mdc`, `next-app-router.mdc`).
15
+
16
+ Полный аудит (дерево маршрутов, гибриды, lockfile): **`navigation-router-stack.mdc`** — при правках `app/src/app/**`.
@@ -5,83 +5,30 @@ alwaysApply: true
5
5
 
6
6
  # Стек и окружение
7
7
 
8
- Конкретные версии пакетов и инструментов — **из `package.json` и конфигов целевого репозитория**. Ниже — рамка preset (Next.js + React + TypeScript), без привязки к конкретному вендору UI, моков или APM:
8
+ Конкретные версии — **из `package.json` и конфигов целевого репозитория**. Рамка preset: Next.js, React, TypeScript; runner/e2e/mocks/UI/APM как заведено в репо.
9
9
 
10
- - **Фреймворк:** Next.js, React, TypeScript (strict — если включён в проекте).
11
- - **Сборка и Node:** как задано в репозитории.
12
- - **Тесты:** unit/integration — runner и библиотеки проекта; e2e — инструмент проекта (правила для агентов Playwright — в отдельных файлах preset).
13
- - **Моки HTTP/API:** если приняты в репо — повторять существующую схему (каталоги, регистрация, точка входа).
14
- - **Стили и UI:** способ стилизации и **дизайн‑система / токены** — как уже заведено в коде; приоритет общим примитивам и токенам вместо разрозненных «магических» значений.
15
- - **Наблюдаемость:** только если уже подключена в проекте — централизованно (клиент, обёртки), без дублирования в каждом методе.
10
+ # Структура проекта
16
11
 
17
- # Структура проекта (верхний уровень)
18
-
19
- - `app/` корень Next.js приложения.
20
- - `app/src/**` — исходный код приложения.
21
- - `app/__tests__/e2e/**` — e2e‑тесты и планы.
22
- - `app/tsconfig.json`:
23
- - `baseUrl: "."`
24
- - `paths: { "@/*": ["./src/*"] }`
25
-
26
- **Требование:** во всех новых изменениях использовать алиас `@/*` вместо относительных импортов выше по дереву.
12
+ - `app/` корень Next.js; `app/src/**` — код; `app/__tests__/e2e/**` — e2e.
13
+ - `app/tsconfig.json`: `baseUrl: "."`, `paths: { "@/*": ["./src/*"] }`.
14
+ - **Требование:** `@/*` вместо относительных импортов выше по дереву.
27
15
 
28
16
  # Архитектурные слои
29
17
 
30
- - **UI слой** (`app/src/ui/**`):
31
- - `app/src/ui/pages/**` — страницы и контейнеры.
32
- - `app/src/ui/components/**` переиспользуемые компоненты.
33
- - **Store слой** (`app/src/store/**`):
34
- - `app/src/store/slices/**` — модули состояния (в этом preset Redux Toolkit; подробности в `store-rtk.mdc`).
35
- - `app/src/store/middleware/**` middleware для сайд‑эффектов (например, файлы, аналитика).
36
- - **API слой** (`app/src/api/**` прежде всего `services/**`, плюс `clients/**`, корневой barrel `index.ts`):
37
- - Сервисы и мапперы, инкапсулирующие HTTP‑логику; **потребители вне этого каталога** импортируют только через `@/api` (`api-public-imports.mdc`).
38
- - **HTTP‑транспорт** (модуль общего клиента под `app/src/lib/clients/**`, экземпляры под `app/src/api/clients/**` — как в репозитории):
39
- - Один механизм запросов, без разбросанного «сырого» `fetch`/`XMLHttpRequest` по фичам. Детали и исключения — **`http-client.mdc`**.
40
- - **Типы** (`app/src/types/**`):
41
- - Доменные модели и при необходимости транспортные контракты; **потребители** импортируют только через **`types-public-imports.mdc`** (`@/types`, `@/types/enums`).
42
- - **Моки и тестовые данные** (`app/src/mocks/**`):
43
- - По структуре и назначению — как принято в репозитории.
44
-
45
- ## Порты и адаптеры (сопоставление с каталогами)
46
-
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`.
18
+ | Слой | Каталог | Детали |
19
+ |------|---------|--------|
20
+ | UI | `app/src/ui/**` (pages, components) | `react-ui.mdc`, `architecture-boundaries-ui.mdc` |
21
+ | Store | `app/src/store/**` (slices, middleware) | `store-rtk.mdc` |
22
+ | API | `app/src/api/**` (services, clients, barrel) | `api-services.mdc`, `http-client.mdc` |
23
+ | HTTP | `app/src/lib/clients/**`, `app/src/api/clients/**` | `http-client.mdc` |
24
+ | Types | `app/src/types/**` | `public-imports.mdc`, `types-jsdoc.mdc` |
25
+ | Mocks | `app/src/mocks/**` | по схеме репозитория |
48
26
 
49
- # Общие архитектурные принципы
50
-
51
- - **Чёткое разделение слоёв**:
52
- - UI знает о доменных типах (из `@/types` / `@/types/enums`) и публичных API store и при необходимости импортирует из **`@/api`** — см. `api-public-imports.mdc` и `architecture-boundaries.mdc` (**«UI и обращение к API»**).
53
- - Store знает о доменных типах и вызывает API‑сервисы через импорты из **`@/api`**.
54
- - API‑сервисы знают о DTO, мапперах и вызовах через клиенты из `app/src/api/clients/**` (`http-client.mdc`).
55
- - **Никаких "проникновений" слоёв**:
56
- - UI не вызывает HTTP‑клиент и не работает с DTO; сценарии с записью в общий state — через store; узкие исключения для вызова сервисов из UI — только по правилам `architecture-boundaries.mdc`.
57
- - Store не собирает запросы сам и не обходит API‑сервисы; данные для state — доменные модели после маппинга. Допустимые **транспортные** типы ответа/ошибки во thunk — как в `@/types` и согласованно с `http-client.mdc`, `store-rtk.mdc`.
58
- - **Доменная логика и state**:
59
- - Нетривиальные правила предметной области и преобразования **DTO → домен** — в **мапперах** и чистых функциях/модулях фичи (`api-services.mdc`); **редюсеры и селекторы** держать узкими (обновление state и проекции), без дублирования тяжёлой бизнес‑логики, если её место в маппере или доменном помощнике. Подробности — `store-rtk.mdc`.
60
- - **Типы — источник правды**:
61
- - При коллизии с другими правилами по **импорту типов** — ориентир **`types-public-imports.mdc`**.
62
- - Новые сущности описывать в `app/src/types/**` и экспортировать через barrel; потребители не обходят `types-public-imports.mdc`.
63
- - Не использовать `any`; при необходимости — `unknown` + безопасное сужение типа.
64
-
65
- # Кодстайл и качества кода
66
-
67
- - Следовать конфигам линтеров и форматтера **проекта** (`eslint`, `prettier`, `stylelint` — какие есть в репо).
68
- - Поддерживать:
69
- - KISS, DRY, SOLID (в разумных пределах для фронта).
70
- - Модульность и переиспользование через компоненты, хуки, слайсы, сервисы.
71
- - Визуальную консистентность за счёт принятых в проекте UI‑примитивов и токенов, а не разовых литералов в стилях.
72
- - При добавлении нового кода **искать и копировать существующие паттерны**:
73
- - Для страниц — аналогичные файлы в `app/src/ui/pages/**`.
74
- - Для блоков — компоненты в `app/src/ui/components/**`.
75
- - Для API — сервисы в `app/src/api/services/**`.
76
- - Для состояния — слайсы в `app/src/store/slices/**`.
27
+ Границы слоёв, порты/адаптеры, UI→API — **`architecture-boundaries.mdc`**. Импорты `@/types`, `@/api` — **`public-imports.mdc`**.
77
28
 
78
29
  # Работа агента
79
30
 
80
- При генерации кода:
81
- - При добавлении или существенном расширении фичи следовать **`feature-delivery-workflow.mdc`** (чеклист слоёв и матрица «зона → правило»).
82
- - Определить целевой слой (UI/store/API/типизация/тесты).
83
- - Найти в соответствующей директории похожие примеры и **копировать архитектурный паттерн** (структура файлов, типы, именование).
84
- - Не упрощать архитектуру в ущерб существующим слоям (не тянуть DTO и HTTP в UI; вызовы сервисов из UI — только в рамках `architecture-boundaries.mdc`).
85
- - Избегать использования `any` при типизации кода; при необходимости использовать `unknown` с последующим безопасным сужением типов.
86
- - После **любых** изменений кода — **`post-change-lint.mdc`**: из каталога `app/` обязательно запустить **`lint:js`** и **`lint:css`** (полный прогон), проанализировать вывод, исправить errors/warnings в зоне задачи; задача не завершена, пока оба линтера не проходят. Дополнительно — **`type-check`** при правках TypeScript. Менеджер пакетов — **`package-manager.mdc`**.
87
-
31
+ - Архитектура и импорты: `architecture-boundaries.mdc`, `public-imports.mdc`
32
+ - Фичи: `feature-delivery-workflow.mdc` + skill `feature-delivery`
33
+ - После правок: `post-change-lint.mdc`; менеджер пакетов: `package-manager.mdc`
34
+ - Копировать паттерны соседних файлов в целевом слое; не использовать `any` (предпочитать `unknown` + сужение)
@@ -1,58 +1,8 @@
1
1
  ---
2
- description: Стили компонентов — колокация, импорты, корневой styled как Root
3
- globs:
4
- - app/src/ui/**/*.ts
5
- - app/src/ui/**/*.tsx
2
+ description: Стили компонентов — consolidated into react-ui.mdc
6
3
  alwaysApply: false
7
4
  ---
8
5
 
9
- # Стили только рядом с компонентом
6
+ # Moved to react-ui.mdc
10
7
 
11
- ## Имя корневого styled-элемента: `Root`
12
-
13
- - В `styles.ts` (или аналоге) **корневой** styled-элемент — тот, что оборачивает весь JSX компонента — экспортируется как **`Root`**.
14
- - В разметке: `<s.Root>...</s.Root>` при `import * as s from './styles'`.
15
- - Вложенные и соседние примитивы именуются по смыслу: `Title`, `List`, `Item`, `Header` и т.д.
16
- - Если нет одной styled-обёртки на весь компонент (только фрагмент или один нативный тег без своего styled), экспорта `Root` может не быть. Когда вводится **одна** внешняя styled-обёртка всего JSX — она называется **`Root`**, а не `Container`, `Wrapper`, `Block` и т.п.
17
-
18
- ```tsx
19
- // ✅ Хорошо
20
- export const Root = styled.div` ... `
21
- // в компоненте: <s.Root>...</s.Root>
22
-
23
- // ❌ Плохо для единственной обёртки всего компонента
24
- export const Service = styled.div` ... `
25
- ```
26
-
27
- ## Правило
28
-
29
- **Запрещено** импортировать модули стилей, которые лежат в каталоге **другого** UI-компонента или блока (не в том же каталоге, что и текущий файл).
30
-
31
- Под «модулями стилей» имеются в виду в первую очередь:
32
-
33
- - `styles.ts` / `styles.tsx` рядом с компонентом;
34
- - `*.module.css`, `*.module.scss` и аналоги, принадлежащие конкретному компоненту;
35
- - любые файлы, которые **экспортируют только styled-примитивы** для одного компонента.
36
-
37
- ## Разрешено
38
-
39
- - `import * as s from './styles'` — стили **в той же папке**, что и компонент.
40
- - Импорты **общих** примитивов дизайн-системы, токенов, общих UI из `@/ui/components/...` или пакетов, если это **не** приватный `styles` чужой фичи.
41
- - Повторное использование визуала через **сам компонент** (композиция), а не через его `styles`.
42
-
43
- ## Примеры
44
-
45
- ```tsx
46
- // ✅ Хорошо — локальный styles
47
- import * as s from './styles'
48
-
49
- // ❌ Плохо — стили родителя/соседа
50
- import * as s from '../../styles'
51
- import * as s from '../RequestForAnalysisServices/styles'
52
- ```
53
-
54
- ## Почему
55
-
56
- - Единое имя **`Root`** ускоряет чтение: сразу видно входную точку разметки компонента.
57
- - Стили и разметка компонента должны меняться вместе, без скрытой связи через чужие файлы.
58
- - Упрощается рефакторинг и поиск владельца стилей.
8
+ Правила колокации стилей, имени **`Root`** и запрета импорта чужих `styles` — в **`react-ui.mdc`** § «Стили и дизайн‑токены». Правило подгружается автоматически при правках `app/src/ui/**`.
@@ -1,6 +1,9 @@
1
1
  ---
2
2
  description: Избегать приведения типов через as на границах модулей (импорт/экспорт)
3
- globs: app/src/**/*.ts,app/src/**/*.tsx
3
+ globs:
4
+ - app/src/api/**/*
5
+ - app/src/store/**/*
6
+ - app/src/types/**/*
4
7
  alwaysApply: false
5
8
  ---
6
9
 
@@ -5,21 +5,12 @@ alwaysApply: true
5
5
 
6
6
  # Менеджер пакетов (терминал)
7
7
 
8
- Перед **`npm install` / `yarn` / `pnpm` / `bun`** и любыми **`… run …`** (lint, test, dev, build) **сначала определи**, какой менеджер закреплён в этом репозитории, и **используй только его** — не подставляй npm или другой инструмент «по привычке».
8
+ Перед **`npm install` / `yarn` / `pnpm` / `bun`** и **`… run …`** определи менеджер репозитория и **используй только его**.
9
9
 
10
- ## Как определить (по убыванию надёжности)
10
+ ## Как определить
11
11
 
12
- 1. Поле **`packageManager`** в `package.json` у корня монорепо или в каталоге приложения (например `app/package.json`) — строка вида `yarn@…`, `pnpm@…`, `npm@…`, `bun@…` (Corepack).
13
- 2. **Lockfile** рядом с тем `package.json`, откуда ставятся зависимости:
14
- - `yarn.lock` **yarn**
15
- - `pnpm-lock.yaml` → **pnpm**
16
- - `package-lock.json` → **npm**
17
- - `bun.lock` / `bun.lockb` → **bun**
18
- 3. Если структура неоднозначна — критерий: где лежат **`node_modules`** и какой lockfile обновляют в CI / документации репо.
12
+ 1. **`packageManager`** в `package.json` (корень или `app/package.json`).
13
+ 2. **Lockfile** рядом: `yarn.lock` yarn; `pnpm-lock.yaml` → pnpm; `package-lock.json` npm; `bun.lock(b)` → bun.
14
+ 3. Если неоднозначно — где `node_modules` и какой lockfile в CI.
19
15
 
20
- ## Как запускать
21
-
22
- - Рабочий каталог — тот, где **`package.json`** с нужными **scripts** (в этом репозитории зависимости и скрипты в **`app/`**).
23
- - Примеры: `yarn lint`, `pnpm run test` — **в соответствии с обнаруженным менеджером**, без смешения разных CLI в одной задаче.
24
-
25
- Если менеджер неочевиден — **посмотри файлы** (`package.json`, lockfile) инструментами чтения/списка каталога, **не угадывай**.
16
+ Рабочий каталог для scripts — **`app/`**. Примеры: `yarn lint`, `pnpm run test`. Не угадывай — проверь файлы.
@@ -7,42 +7,32 @@ alwaysApply: true
7
7
 
8
8
  ## Когда применять
9
9
 
10
- После **любого** изменения исходников в репозитории: правка, создание или удаление файлов в `app/**` (TS/TSX/JS/MJS, CSS, styled/Linaria в `.ts`/`.tsx`, markdown с ESLint и т.д.).
10
+ После **любого** изменения исходников в `app/**` (TS/TSX/JS/MJS, CSS, styled/Linaria в `.ts`/`.tsx`).
11
11
 
12
- Исключения без прогона линтеров: только правки **документации вне `app/`**, конфигов CI, `.cursor/rules/**`, если **не** менялся исполняемый код приложения.
12
+ Исключения: правки документации вне `app/`, конфигов CI, `.cursor/rules/**`, если исполняемый код приложения не менялся.
13
+
14
+ **Pipeline exception:** если задача идёт через agent team и следующий шаг — `build-verifier`, developer может ограничиться lint/type-check **изменённых файлов**; полный прогон — обязанность `build-verifier`. В single-agent режиме (без pipeline) — всегда полный прогон.
13
15
 
14
16
  ## Обязательные команды
15
17
 
16
- Рабочий каталог — **`app/`** (там `package.json` со скриптами). Менеджер пакетов — **`package-manager.mdc`**.
18
+ Рабочий каталог — **`app/`**. Менеджер пакетов — **`package-manager.mdc`**.
17
19
 
18
- 1. **`lint:js`** — полный ESLint по проекту (`eslint .` с расширениями из скрипта).
20
+ 1. **`lint:js`** — полный ESLint по проекту.
19
21
  2. **`lint:css`** — полный Stylelint (`**/*.{css,ts}`).
20
22
 
21
- **Всегда запускать обе команды**, даже если задача не касалась стилей: Stylelint проверяет и CSS-in-JS в `.ts`.
22
-
23
- Точечный ESLint/Stylelint только на один файл **не заменяет** полный прогон перед завершением задачи.
23
+ Точечный lint на один файл **не заменяет** полный прогон перед завершением задачи (кроме pipeline exception выше).
24
24
 
25
- ## Алгоритм для агента
25
+ ## Алгоритм
26
26
 
27
27
  1. Завершить правки кода.
28
- 2. Запустить **`lint:js`** и **`lint:css`** из `app/` (через терминал, не «на глаз»).
29
- 3. **Проанализировать весь вывод**: errors и warnings.
30
- 4. **Исправить** все срабатывания в **изменённых файлах** и связанных с задачей; для Stylelint сначала пробовать **`lint:css --fix`**, если правило автоисправимо.
31
- 5. При ненулевом exit code повторить шаги 2–4 до успешного прогона или явного блокера.
32
- 6. **Не считать задачу выполненной**, пока оба линтера не завершились с кодом 0 **или** в ответе пользователю не зафиксирован блокер (например, легаси вне скоупа) с перечислением оставшихся замечаний.
28
+ 2. Запустить **`lint:js`** и **`lint:css`** из `app/`.
29
+ 3. Проанализировать весь вывод; исправить errors/warnings в изменённых файлах; для Stylelint — **`lint:css --fix`** если автоисправимо.
30
+ 4. Повторить до exit code 0 или зафиксировать блокер в ответе пользователю.
31
+ 5. **`type-check`** при изменениях TypeScript. CI-уровень: **`lint`** (= `lint:js` + `lint:css` + `type-check`).
33
32
 
34
33
  ## Что исправлять
35
34
 
36
35
  - **Errors** — обязательно.
37
- - **Warnings** — обязательно в файлах из текущей задачи; вне скоупа — не чинить «заодно», но **упомянуть** в ответе, если мешают нулевому exit code.
38
- - **`eslint-disable`** — только точечно, с кратким комментарием «зачем» (`code-quality-and-refactoring.mdc`).
39
-
40
- ## Связанные проверки
41
-
42
- - **`type-check`** — обязателен при изменениях TypeScript (`next-app-core.mdc`); не подменяет ESLint/Stylelint.
43
- - Полная валидация как в CI: **`lint`** (= `lint:js` + `lint:css` + `type-check`) — уместна перед крупным MR.
44
-
45
- ## Конфиги
36
+ - **Warnings** — обязательно в файлах задачи; вне скоупа — упомянуть, если мешают нулевому exit code.
46
37
 
47
- - ESLint: `app/eslint.config.mjs`
48
- - Stylelint: `app/.stylelintrc` (порядок свойств — `css-property-order-stylelint.mdc`)
38
+ Конфиги: `app/eslint.config.mjs`, `app/.stylelintrc` (порядок CSS — `css-property-order-stylelint.mdc`).
@@ -0,0 +1,48 @@
1
+ ---
2
+ description: Импорт доменных типов и API только через публичные barrel @/types и @/api
3
+ globs:
4
+ - app/src/ui/**/*
5
+ - app/src/store/**/*
6
+ - app/src/lib/**/*
7
+ - app/src/types/**/*
8
+ - app/src/api/**/*
9
+ alwaysApply: false
10
+ ---
11
+
12
+ # Публичные импорты (`@/types`, `@/api`)
13
+
14
+ **Коллизии:** импорт типов — раздел `@/types` ниже; API вне `app/src/api/**` — раздел `@/api` ниже (дублирует ESLint `no-restricted-imports` в `app/eslint.config.mjs`).
15
+
16
+ ## `@/types`
17
+
18
+ - **Публичный API типов** — barrel `app/src/types/index.ts`; импортировать типы только как `@/types` (или `@/types/index`).
19
+ - **Запрещено** обходить barrel: `@/types/<что‑угодно>`, кроме enum.
20
+ - **Enum** — только `@/types/enums` / `@/types/enums.ts`.
21
+ - Внутри `app/src/types/**` — относительные импорты между файлами слоя.
22
+
23
+ ```typescript
24
+ // ✅
25
+ import type { TUserProfile } from '@/types'
26
+ import { SomeEnum } from '@/types/enums'
27
+
28
+ // ❌
29
+ import type { TUserProfile } from '@/types/User.types'
30
+ ```
31
+
32
+ Новые публичные типы — реэкспорт в `app/src/types/index.ts` по **`layer-barrel-exports.mdc`**.
33
+
34
+ ## `@/api`
35
+
36
+ - **Публичный API** — barrel `app/src/api/index.ts`. Вне `app/src/api/**` — только `import … from '@/api'` (или `@/api/index`).
37
+ - **Запрещено** снаружи слоя: `@/api/<что‑угодно>`, кроме `@/api/index`.
38
+ - Внутри `app/src/api/**` — относительные импорты и `@/api/services/**`, `@/api/clients/**`.
39
+
40
+ ```typescript
41
+ // ✅ в store, UI, lib вне app/src/api
42
+ import { MedcardApiService } from '@/api'
43
+
44
+ // ❌ снаружи app/src/api
45
+ import { MedcardApiService } from '@/api/services/MedcardApiService/MedcardApiService'
46
+ ```
47
+
48
+ Новые публичные символы API — реэкспорт в `app/src/api/index.ts` по **`layer-barrel-exports.mdc`**.
@@ -27,7 +27,7 @@ alwaysApply: false
27
27
  - Локальные подкомпоненты, используемые только этим блоком, выносятся в **`./components/<ComponentName>/`** относительно папки родительского компонента (не оставлять крупные куски JSX и «внутренние» компоненты в том же файле, что и родитель).
28
28
  - У каждого такого подкомпонента — **своя** папка с тем же именем, что и публичное имя компонента:
29
29
  - `ComponentName.tsx` — разметка и композиция;
30
- - `styles.ts` — только стили этого подкомпонента (см. `no-cross-component-styles-import.mdc`: не тянуть `styles` соседних компонентов);
30
+ - `styles.ts` — только стили этого подкомпонента (не тянуть `styles` соседних компонентов — см. § Стили ниже);
31
31
  - при необходимости — `ComponentName.data.ts`, `ComponentName.utils.ts`, `ComponentName.hooks.ts` по тем же правилам префикса, что и у родителя;
32
32
  - опционально `index.ts` с реэкспортом.
33
33
  - Родитель импортирует подкомпонент из `./components/...`, а не держит его реализацию inline.
@@ -56,8 +56,9 @@ alwaysApply: false
56
56
 
57
57
  # Стили и дизайн‑токены
58
58
 
59
- - **Корневой** styled-элемент компонента в соседнем `styles` — **`Root`** (`<s.Root>`). Подробнее: `no-cross-component-styles-import.mdc`.
60
- - Порядок объявлений в CSS / `styled` как требует Stylelint: см. `css-property-order-stylelint.mdc`.
59
+ - **Корневой** styled в соседнем `styles` — экспорт **`Root`**; в JSX: `<s.Root>` при `import * as s from './styles'`. Вложенные — `Title`, `List` и т.д. Не `Container`/`Wrapper` для единственной обёртки.
60
+ - **Запрещено** импортировать `styles` другого компонента (`../Other/styles`, `../../styles`). Разрешено: `./styles`, общие примитивы из `@/ui/components/...` или пакетов дизайн-системы.
61
+ - Порядок CSS / `styled` — Stylelint idiomatic-order: `css-property-order-stylelint.mdc` (грузится на `styles.ts` / `.css`).
61
62
  - Для визуала использовать **тот стек стилей и токенов, который уже в проекте** (переменные, тема, общие классы, дизайн‑пакет).
62
63
  - Избегать:
63
64
  - inline‑стилей, кроме простых случаев;
@@ -71,7 +72,7 @@ alwaysApply: false
71
72
  - Описывать пропсы через `type Props = { ... }` или `interface Props { ... }`.
72
73
  - Не использовать `any`; при необходимости:
73
74
  - обобщения (`<T>`), `unknown`, тип‑предикаты и user‑defined type guards.
74
- - Для доменных сущностей использовать типы из `@/types` (и enum из `@/types/enums`), а не описывать их заново (`types-public-imports.mdc`).
75
+ - Для доменных сущностей использовать типы из `@/types` (и enum из `@/types/enums`), а не описывать их заново (`public-imports.mdc`).
75
76
 
76
77
  # Логика и side effects
77
78
 
@@ -1,6 +1,10 @@
1
1
  ---
2
2
  description: Эталонные фичи репозитория — копировать структуру при реализации новых задач. Заполните пути после init в целевом репо.
3
- globs: app/src/**/*
3
+ globs:
4
+ - app/src/ui/**/*
5
+ - app/src/store/**/*
6
+ - app/src/api/**/*
7
+ - app/src/types/**/*
4
8
  alwaysApply: false
5
9
  ---
6
10