@bonesofspring/ai-rules 0.1.33 → 0.1.35

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.33",
3
+ "version": "0.1.35",
4
4
  "description": "Presets of Cursor and Claude rules/commands for Revy Ross personal use",
5
5
  "license": "MIT",
6
6
  "author": "Revy Ross",
@@ -11,10 +11,19 @@
11
11
 
12
12
  - То есть .mdc = “markdown + config для Cursor”, .md = просто текст без управляющего смысла для ассистента.
13
13
 
14
+ ### С чего начать новую фичу
15
+
16
+ См. **`feature-delivery-workflow.mdc`** (сквозной чеклист слоёв и матрица «зона репозитория → какое правило перечитать»).
17
+
18
+ ### Эталонные фичи (заполняет команда)
19
+
20
+ Имена папок в `app/src/ui/pages/**`, `app/src/store/slices/**`, `app/src/api/services/**`, которые считаются образцом структуры — **TBD** (заменить на реальные пути после договорённости в команде).
21
+
14
22
  ### Каталог ключевых правил
15
23
 
16
24
  | Файл | Назначение |
17
25
  |------|------------|
26
+ | `feature-delivery-workflow.mdc` | Сквозной порядок работ по фиче, mermaid‑поток, матрица слой → правило `.mdc` |
18
27
  | `next-app-core.mdc` | Стек, слои, порты‑адаптеры (кратко), доменная логика vs state, общие требования к агенту и линтам |
19
28
  | `architecture-boundaries.mdc` | Границы UI / store / API, импорты (`@/types` по `types-public-imports`), UI→services, порты‑адаптеры, фича как срез |
20
29
  | `http-client.mdc` | Один HTTP‑стек, контракты из `@/types`, без разбросанного низкоуровневого API |
@@ -0,0 +1,45 @@
1
+ ---
2
+ description: Предпочитать стрелочные функции при написании кода
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # Стрелочные функции
7
+
8
+ При разработке **использовать стрелочный синтаксис** для функций, где это допустимо в TypeScript/JavaScript.
9
+
10
+ ## Что делать
11
+
12
+ - Объявлять функции как **`const имя = (...) => { ... }`** вместо **`function имя(...) { ... }`**, если не нужны особенности объявления `function`.
13
+ - Колбэки и обработчики — стрелочные функции: `.map((x) => ...)`, `onClick={() => ...}`.
14
+ - React-компоненты и хуки — как стрелочные функции с явной типизацией пропсов/возврата по принятому в проекте стилю.
15
+
16
+ ## Исключения (допустимо не стрелка)
17
+
18
+ - **Генераторы** (`function*`) — стрелкой не выразить.
19
+ - **Методы класса** — если в коде используются классы, допустимы обычные методы (`method() {}`), а не стрелки в теле класса (из‑за `this`).
20
+ - Когда осознанно нужны **подъём (hoisting)** или **имя функции в стеке** только у `function` — редкие случаи; иначе предпочитать стрелку.
21
+
22
+ ## Примеры
23
+
24
+ ```typescript
25
+ // ❌ Избегать для нового кода
26
+ function formatLabel(id: string): string {
27
+ return id.toUpperCase()
28
+ }
29
+
30
+ // ✅ Предпочтительно
31
+ const formatLabel = (id: string): string => {
32
+ return id.toUpperCase()
33
+ }
34
+ ```
35
+
36
+ ```tsx
37
+ // ✅ Предпочтительно
38
+ const UserCard = ({ name }: { name: string }) => {
39
+ return <span>{name}</span>
40
+ }
41
+ ```
42
+
43
+ ## Требование к агенту
44
+
45
+ При генерации и правке кода **по умолчанию выбирать стрелочные функции**; отступать к `function` только в случаях из раздела исключений.
@@ -0,0 +1,53 @@
1
+ ---
2
+ description: Сквозной чеклист новой фичи и матрица «слой → правило Cursor»
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # Доставка фичи (сквозной порядок)
7
+
8
+ Типичная фича с данными с backend и общим состоянием. Детали слоёв — в `architecture-boundaries.mdc`, `next-app-core.mdc`.
9
+
10
+ ## Чеклист (порядок работ)
11
+
12
+ 1. **Доменные типы** — `app/src/types/**`, экспорт через barrel `app/src/types/index.ts` (`types-public-imports.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`). Без `fetch` из UI/store.
16
+ 5. **Состояние** — `createSlice` / `createAsyncThunk`, доменные модели в state (`store-rtk.mdc`); thunk вызывает сервисы из `@/api/services/**`.
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. **Завершение** — из каталога `app/`: `yarn lint:js`, при стилях `yarn lint:css`, `yarn type-check` (`next-app-core.mdc`).
21
+
22
+ ## Поток данных (ориентир)
23
+
24
+ ```mermaid
25
+ flowchart LR
26
+ subgraph transport [Транспорт]
27
+ HttpClient[HttpClient]
28
+ end
29
+ DTO[DTO] --> Mappers[Мапперы]
30
+ Mappers --> Domain[Доменные типы]
31
+ Domain --> Service[API сервис]
32
+ Service --> HttpClient
33
+ Service --> Thunk[Thunk]
34
+ Thunk --> Store[Store]
35
+ Store --> UI[UI]
36
+ ```
37
+
38
+ ## Матрица: что меняю → какие правила перечитать
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`; при необходимости `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` |
46
+ | `app/src/types/**` | `types-public-imports.mdc`, `types-jsdoc.mdc` |
47
+ | `app/__tests__/e2e/**` | `tests-e2e-structure.mdc`, `playwright-agents.mdc` |
48
+
49
+ Специализированные `.mdc` с `globs` подмешиваются при работе с соответствующими файлами; эта матрица нужна, когда открыт другой файл или идёт общий чат.
50
+
51
+ ## Требование к агенту
52
+
53
+ При добавлении или существенном расширении фичи **пройти чеклист сверху** и при правках в зоне из таблицы **ориентироваться на указанные правила**, не смешивать слои и не обходить public API модулей.
@@ -78,6 +78,7 @@ alwaysApply: true
78
78
  # Работа агента
79
79
 
80
80
  При генерации кода:
81
+ - При добавлении или существенном расширении фичи следовать **`feature-delivery-workflow.mdc`** (чеклист слоёв и матрица «зона → правило»).
81
82
  - Определить целевой слой (UI/store/API/типизация/тесты).
82
83
  - Найти в соответствующей директории похожие примеры и **копировать архитектурный паттерн** (структура файлов, типы, именование).
83
84
  - Не упрощать архитектуру в ущерб существующим слоям (не тянуть DTO и HTTP в UI; вызовы сервисов из UI — только в рамках `architecture-boundaries.mdc`).
@@ -1,11 +1,14 @@
1
1
  ---
2
2
  description: Unit и интеграционные тесты (Testing Library и runner проекта)
3
- globs: app/src/**/*.{spec,test}.{ts,tsx}
3
+ globs:
4
+ - app/src/**/*.spec.{ts,tsx}
5
+ - app/src/**/*.test.{ts,tsx}
4
6
  alwaysApply: false
5
7
  ---
6
8
 
7
9
  # Общие правила тестирования
8
10
 
11
+ - **Имена файлов:** для **новых** тестов использовать суффикс **`*.spec.ts` / `*.spec.tsx`**. Существующие **`*.test.ts` / `*.test.tsx`** не переименовывать без отдельной задачи (легаси).
9
12
  - **Runner и матчеры** — как в проекте (часто Jest или Vitest); для компонентов — **@testing-library/react**.
10
13
  - Основная цель тестов:
11
14
  - проверять **поведение и бизнес‑правила**, а не реализацию или внутренние детали.
@@ -39,7 +42,7 @@ it('Returns empty list when user is guest', () => {})
39
42
 
40
43
  # HTTP‑клиент
41
44
 
42
- - При изменении **реализации общего HTTP‑клиента** (разбор тел, заголовки, ветки ошибок, 401/refresh, `FormData`, `blob` и т.п.) — **обновить или добавить behavior‑тесты** рядом с модулем клиента в `app/src/lib/clients/**` (`*.spec.ts` / `*.test.ts` — как принято в репо).
45
+ - При изменении **реализации общего HTTP‑клиента** (разбор тел, заголовки, ветки ошибок, 401/refresh, `FormData`, `blob` и т.п.) — **обновить или добавить behavior‑тесты** рядом с модулем клиента в `app/src/lib/clients/**` (предпочтительно `*.spec.ts`; легаси `*.test.ts` — не трогать без задачи).
43
46
  - Проверять смысловые ветки: успешный JSON, HTTP‑ошибка, сеть, релевантные для проекта сценарии авторизации.
44
47
 
45
48
  # Мапперы и преобразование данных
@@ -50,12 +53,13 @@ it('Returns empty list when user is guest', () => {})
50
53
  # Требование к агенту
51
54
 
52
55
  При добавлении тестов:
53
- - Следовать существующей структуре и паттернам тестов в `app/src/**/__tests__/**` или рядом с компонентом.
56
+ - Следовать существующей структуре и паттернам тестов в репозитории: файл `*.spec.ts(x)` рядом с модулем или в общем каталоге тестов — как в соседних фичах.
54
57
  - Добавлять тесты для критичных веток логики и edge‑кейсов.
55
58
  - При работе с данными:
56
59
  - использовать **типы респонса** из API (DTO‑типы), а также **целевые доменные типы** из `@/types`, не дублировать интерфейсы в тестах;
57
60
  - по возможности опираться на данные и обработчики из `app/src/mocks/**` (или аналог в репо), а не плодить случайные тестовые данные "с нуля".
58
- - При написании unit‑тестов рядом с компонентом или модулем:
59
- - **не создавать** поддиректорию `__tests__` внутри папки компонента;
60
- - именовать файлы тестов с суффиксом `*.spec.ts` / `*.spec.tsx`, а не `*.test.ts` / `*.test.tsx`.
61
+ - Размещение:
62
+ - для **компонентов UI** — **не создавать** поддиректорию `__tests__` внутри папки компонента; тест — соседний `*.spec.tsx`.
63
+ - в **других модулях** (например `api/services`) допустима уже существующая схема с `__tests__` не ломать ради единообразия с UI.
64
+ - **новые** файлы — `*.spec.ts` / `*.spec.tsx` (см. блок «Имена файлов» выше).
61
65