@bonesofspring/ai-rules 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -18
- package/bin/cli.js +73 -258
- package/package.json +3 -4
- package/presets/claude/ios-swift/CLAUDE.md +27 -0
- package/presets/claude/ios-swift/README.md +29 -0
- package/presets/claude/ios-swift/commands/README.md +3 -0
- package/presets/claude/ios-swift/rules/README.md +44 -0
- package/presets/claude/ios-swift/rules/api-and-data/README.md +9 -0
- package/presets/claude/ios-swift/rules/api-and-data/networking.md +49 -0
- package/presets/claude/ios-swift/rules/architecture/README.md +10 -0
- package/presets/claude/ios-swift/rules/architecture/boundaries.md +33 -0
- package/presets/claude/ios-swift/rules/architecture/feature-delivery.md +60 -0
- package/presets/claude/ios-swift/rules/stack/README.md +10 -0
- package/presets/claude/ios-swift/rules/stack/ios-app-core.md +42 -0
- package/presets/claude/ios-swift/rules/stack/swift-conventions.md +51 -0
- package/presets/claude/ios-swift/rules/testing/README.md +10 -0
- package/presets/claude/ios-swift/rules/testing/ui.md +41 -0
- package/presets/claude/ios-swift/rules/testing/unit.md +41 -0
- package/presets/claude/ios-swift/rules/tooling-and-review/README.md +11 -0
- package/presets/claude/ios-swift/rules/tooling-and-review/code-quality.md +38 -0
- package/presets/claude/ios-swift/rules/tooling-and-review/code-review.md +41 -0
- package/presets/claude/ios-swift/rules/tooling-and-review/post-change-build.md +31 -0
- package/presets/claude/ios-swift/rules/ui-and-accessibility/README.md +10 -0
- package/presets/claude/ios-swift/rules/ui-and-accessibility/swiftui.md +61 -0
- package/presets/claude/ios-swift/rules/ui-and-accessibility/viewmodels.md +43 -0
- package/presets/claude/next/CLAUDE.md +5 -29
- package/presets/claude/next/README.md +0 -10
- package/presets/claude/next/agents/README.md +0 -125
- package/presets/claude/next/commands/README.md +2 -10
- package/presets/claude/next/hooks/README.md +2 -5
- package/presets/claude/next/rules/README.md +11 -25
- package/presets/claude/next/rules/api-and-data/README.md +1 -7
- package/presets/claude/next/rules/architecture/README.md +2 -9
- package/presets/claude/next/rules/stack/README.md +1 -9
- package/presets/claude/next/rules/testing/README.md +1 -9
- package/presets/claude/next/rules/tooling-and-review/README.md +1 -14
- package/presets/claude/next/rules/ui-and-accessibility/README.md +1 -8
- package/presets/claude/next/skills/README.md +1 -11
- package/presets/cursor/ios-swift/README.md +17 -0
- package/presets/cursor/ios-swift/commands/README.md +3 -0
- package/presets/cursor/ios-swift/rules/README.md +33 -0
- package/presets/cursor/ios-swift/rules/architecture-boundaries.mdc +34 -0
- package/presets/cursor/ios-swift/rules/code-quality-and-refactoring.mdc +39 -0
- package/presets/cursor/ios-swift/rules/code-review-mr.mdc +42 -0
- package/presets/cursor/ios-swift/rules/feature-delivery-workflow.mdc +61 -0
- package/presets/cursor/ios-swift/rules/ios-app-core.mdc +43 -0
- package/presets/cursor/ios-swift/rules/networking-services.mdc +49 -0
- package/presets/cursor/ios-swift/rules/post-change-build.mdc +32 -0
- package/presets/cursor/ios-swift/rules/state-and-viewmodels.mdc +43 -0
- package/presets/cursor/ios-swift/rules/swift-conventions.mdc +51 -0
- package/presets/cursor/ios-swift/rules/swiftui-ui.mdc +61 -0
- package/presets/cursor/ios-swift/rules/tests-ui.mdc +41 -0
- package/presets/cursor/ios-swift/rules/tests-unit.mdc +41 -0
- package/presets/cursor/next/commands/README.md +1 -49
- package/presets/cursor/next/rules/README.md +0 -47
- package/presets/cursor/next/rules/api-services.mdc +10 -12
- package/presets/cursor/next/rules/architecture-boundaries.mdc +12 -31
- package/presets/cursor/next/rules/code-quality-and-refactoring.mdc +4 -5
- package/presets/cursor/next/rules/code-review-mr.mdc +7 -14
- package/presets/cursor/next/rules/next-app-core.mdc +61 -18
- package/presets/cursor/next/rules/no-props-spread.mdc +4 -27
- package/presets/cursor/next/rules/playwright-agents.mdc +1 -2
- package/presets/cursor/next/rules/react-ui.mdc +3 -32
- package/presets/cursor/next/rules/store-rtk.mdc +6 -13
- package/presets/cursor/next/rules/tests-unit.mdc +10 -30
- package/CHANGELOG.md +0 -22
- package/presets/claude/next/agents/accessibility-reviewer.md +0 -65
- package/presets/claude/next/agents/api-contract-reviewer.md +0 -69
- package/presets/claude/next/agents/build-verifier.md +0 -64
- package/presets/claude/next/agents/ci-investigator.md +0 -62
- package/presets/claude/next/agents/code-reviewer.md +0 -62
- package/presets/claude/next/agents/debugger.md +0 -63
- package/presets/claude/next/agents/feature-developer.md +0 -27
- package/presets/claude/next/agents/migration-specialist.md +0 -69
- package/presets/claude/next/agents/performance-auditor.md +0 -68
- package/presets/claude/next/agents/qa-tester.md +0 -56
- package/presets/claude/next/agents/security-reviewer.md +0 -64
- package/presets/claude/next/agents/solution-architect.md +0 -70
- package/presets/claude/next/agents/task-analyst.md +0 -109
- package/presets/claude/next/agents/task-router.md +0 -70
- package/presets/claude/next/agents/tech-writer.md +0 -60
- package/presets/claude/next/agents/unit-test-generator.md +0 -37
- package/presets/claude/next/agents/unit-test-healer.md +0 -38
- package/presets/claude/next/agents/unit-test-planner.md +0 -62
- package/presets/claude/next/commands/feature-continue.md +0 -51
- package/presets/claude/next/commands/feature-start.md +0 -30
- package/presets/claude/next/commands/task-continue.md +0 -49
- package/presets/claude/next/commands/task.md +0 -50
- package/presets/claude/next/commands/technical-retro.md +0 -58
- package/presets/claude/next/hooks/chain-team-phases.sh +0 -342
- package/presets/claude/next/hooks/guard-shell-command.sh +0 -77
- package/presets/claude/next/rules/api-and-data/api-services.md +0 -57
- package/presets/claude/next/rules/api-and-data/http-client.md +0 -40
- package/presets/claude/next/rules/api-and-data/store-rtk.md +0 -65
- package/presets/claude/next/rules/architecture/api-public-imports.md +0 -8
- package/presets/claude/next/rules/architecture/architecture-boundaries.md +0 -72
- package/presets/claude/next/rules/architecture/feature-delivery-workflow.md +0 -79
- package/presets/claude/next/rules/architecture/layer-barrel-exports.md +0 -58
- package/presets/claude/next/rules/architecture/public-imports.md +0 -46
- package/presets/claude/next/rules/architecture/reference-features.md +0 -37
- package/presets/claude/next/rules/architecture/types-public-imports.md +0 -8
- package/presets/claude/next/rules/stack/arrow-functions.md +0 -45
- package/presets/claude/next/rules/stack/navigation-router.md +0 -61
- package/presets/claude/next/rules/stack/next-app-core.md +0 -33
- package/presets/claude/next/rules/stack/next-app-router.md +0 -36
- package/presets/claude/next/rules/stack/no-type-assertion.md +0 -59
- package/presets/claude/next/rules/stack/types-jsdoc.md +0 -37
- package/presets/claude/next/rules/testing/playwright-agents.md +0 -74
- package/presets/claude/next/rules/testing/tests-e2e-structure.md +0 -52
- package/presets/claude/next/rules/testing/tests-unit.md +0 -66
- package/presets/claude/next/rules/tooling-and-review/agent-team-intake.md +0 -15
- package/presets/claude/next/rules/tooling-and-review/agent-team-orchestrator.md +0 -134
- package/presets/claude/next/rules/tooling-and-review/code-quality.md +0 -42
- package/presets/claude/next/rules/tooling-and-review/code-review-mr.md +0 -67
- package/presets/claude/next/rules/tooling-and-review/package-manager.md +0 -11
- package/presets/claude/next/rules/tooling-and-review/post-change-lint.md +0 -33
- package/presets/claude/next/rules/ui-and-accessibility/component-styles.md +0 -56
- package/presets/claude/next/rules/ui-and-accessibility/css-property-order.md +0 -14
- package/presets/claude/next/rules/ui-and-accessibility/no-props-spread.md +0 -57
- package/presets/claude/next/rules/ui-and-accessibility/react-a11y-coding.md +0 -37
- package/presets/claude/next/rules/ui-and-accessibility/react-ui.md +0 -90
- package/presets/claude/next/skills/ci-investigation/SKILL.md +0 -36
- package/presets/claude/next/skills/code-review/SKILL.md +0 -26
- package/presets/claude/next/skills/debug-investigation/SKILL.md +0 -28
- package/presets/claude/next/skills/feature-delivery/SKILL.md +0 -15
- package/presets/claude/next/skills/playwright-e2e/SKILL.md +0 -31
- package/presets/claude/next/skills/technical-retro/SKILL.md +0 -40
- package/presets/claude/next/skills/unit-testing/SKILL.md +0 -32
- package/presets/claude/next/team/README.md +0 -46
- package/presets/claude/next/team/tasks/.gitkeep +0 -1
- package/presets/cursor/next/AGENTS.md +0 -43
- package/presets/cursor/next/BUGBOT.md +0 -14
- package/presets/cursor/next/agents/README.md +0 -158
- package/presets/cursor/next/agents/accessibility-reviewer.md +0 -67
- package/presets/cursor/next/agents/api-contract-reviewer.md +0 -71
- package/presets/cursor/next/agents/build-verifier.md +0 -66
- package/presets/cursor/next/agents/ci-investigator.md +0 -64
- package/presets/cursor/next/agents/code-reviewer.md +0 -64
- package/presets/cursor/next/agents/debugger.md +0 -64
- package/presets/cursor/next/agents/feature-developer.md +0 -27
- package/presets/cursor/next/agents/migration-specialist.md +0 -71
- package/presets/cursor/next/agents/performance-auditor.md +0 -70
- package/presets/cursor/next/agents/playwright-test-generator.md +0 -26
- package/presets/cursor/next/agents/playwright-test-healer.md +0 -26
- package/presets/cursor/next/agents/playwright-test-planner.md +0 -28
- package/presets/cursor/next/agents/qa-tester.md +0 -57
- package/presets/cursor/next/agents/security-reviewer.md +0 -66
- package/presets/cursor/next/agents/solution-architect.md +0 -71
- package/presets/cursor/next/agents/task-analyst.md +0 -112
- package/presets/cursor/next/agents/task-router.md +0 -71
- package/presets/cursor/next/agents/tech-writer.md +0 -62
- package/presets/cursor/next/agents/unit-test-generator.md +0 -39
- package/presets/cursor/next/agents/unit-test-healer.md +0 -40
- package/presets/cursor/next/agents/unit-test-planner.md +0 -64
- package/presets/cursor/next/commands/feature-continue.md +0 -19
- package/presets/cursor/next/commands/feature-start.md +0 -33
- package/presets/cursor/next/commands/task-continue.md +0 -49
- package/presets/cursor/next/commands/task.md +0 -50
- package/presets/cursor/next/commands/technical-retro.md +0 -81
- package/presets/cursor/next/hooks/README.md +0 -8
- package/presets/cursor/next/hooks/chain-team-phases.sh +0 -380
- package/presets/cursor/next/hooks/guard-shell-command.sh +0 -77
- package/presets/cursor/next/hooks.json +0 -17
- package/presets/cursor/next/rules/agent-team-intake.mdc +0 -14
- package/presets/cursor/next/rules/agent-team-orchestrator.mdc +0 -139
- package/presets/cursor/next/rules/api-public-imports.mdc +0 -8
- package/presets/cursor/next/rules/arrow-functions.mdc +0 -46
- package/presets/cursor/next/rules/css-property-order-stylelint.mdc +0 -16
- package/presets/cursor/next/rules/feature-delivery-workflow.mdc +0 -76
- package/presets/cursor/next/rules/http-client.mdc +0 -42
- package/presets/cursor/next/rules/layer-barrel-exports.mdc +0 -59
- package/presets/cursor/next/rules/navigation-router-stack.mdc +0 -62
- package/presets/cursor/next/rules/next-app-router.mdc +0 -36
- package/presets/cursor/next/rules/no-cross-component-styles-import.mdc +0 -58
- package/presets/cursor/next/rules/no-type-assertion-as-import-export.mdc +0 -60
- package/presets/cursor/next/rules/package-manager.mdc +0 -16
- package/presets/cursor/next/rules/post-change-lint.mdc +0 -38
- package/presets/cursor/next/rules/public-imports.mdc +0 -48
- package/presets/cursor/next/rules/react-a11y-coding.mdc +0 -37
- package/presets/cursor/next/rules/reference-features.mdc +0 -39
- package/presets/cursor/next/rules/technical-retro.mdc +0 -12
- package/presets/cursor/next/rules/types-jsdoc.mdc +0 -42
- package/presets/cursor/next/rules/types-public-imports.mdc +0 -8
- package/presets/cursor/next/skills/README.md +0 -15
- package/presets/cursor/next/skills/ci-investigation/SKILL.md +0 -36
- package/presets/cursor/next/skills/code-review/SKILL.md +0 -26
- package/presets/cursor/next/skills/debug-investigation/SKILL.md +0 -28
- package/presets/cursor/next/skills/feature-delivery/SKILL.md +0 -15
- package/presets/cursor/next/skills/playwright-e2e/SKILL.md +0 -31
- package/presets/cursor/next/skills/technical-retro/SKILL.md +0 -40
- package/presets/cursor/next/skills/unit-testing/SKILL.md +0 -32
- package/presets/cursor/next/team/README.md +0 -104
- package/presets/cursor/next/team/tasks/.gitkeep +0 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Сквозной чеклист доставки iOS-фичи и матрица «зона → правило». Use when implementing features, adding screens/API, or extending existing iOS flows.
|
|
3
|
+
alwaysApply: false
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Доставка фичи (iOS)
|
|
7
|
+
|
|
8
|
+
Типичная фича с данными и UI. Детали слоёв — `architecture-boundaries.mdc`, `ios-app-core.mdc`.
|
|
9
|
+
|
|
10
|
+
## Чеклист (порядок работ)
|
|
11
|
+
|
|
12
|
+
1. **Domain** — entities, value types, протоколы репозиториев / use cases (`Features/**/Domain/**`).
|
|
13
|
+
2. **Data** — DTO (`Codable`), mappers Domain ↔ DTO, реализации репозиториев, API-клиент (`networking-services.mdc`).
|
|
14
|
+
3. **ViewModel** — состояние, вызовы use case / протоколов; DI из App; без DTO и URL (`state-and-viewmodels.mdc`).
|
|
15
|
+
4. **View / navigation** — тонкие SwiftUI Views, Design System; навигация как в репо (`swiftui-ui.mdc`).
|
|
16
|
+
5. **Тесты** — unit на mappers / use cases / VM (`tests-unit.mdc`); UI-потоки — XCUITest (`tests-ui.mdc`).
|
|
17
|
+
6. **Завершение** — **`post-change-build.mdc`**: сборка затронутых таргетов + lint/format по конфигу репо.
|
|
18
|
+
|
|
19
|
+
## Поток данных (ориентир)
|
|
20
|
+
|
|
21
|
+
```mermaid
|
|
22
|
+
flowchart LR
|
|
23
|
+
DTO[DTO] --> Mappers[Mappers]
|
|
24
|
+
Mappers --> Domain[Domain]
|
|
25
|
+
Domain --> Repo[Repository protocol]
|
|
26
|
+
Repo --> VM[ViewModel]
|
|
27
|
+
VM --> View[SwiftUI View]
|
|
28
|
+
DataImpl[Data impl] -.-> Repo
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Частичные сценарии
|
|
32
|
+
|
|
33
|
+
| Задача | Минимум |
|
|
34
|
+
|--------|---------|
|
|
35
|
+
| Только API / модель | Domain + DTO + mapper + repo impl; unit на mapper. |
|
|
36
|
+
| Только VM / логика | Протоколы Domain; mock в тестах; без HTTP во View. |
|
|
37
|
+
| Только UI | View + существующий VM/state; без DTO. |
|
|
38
|
+
| Только тесты | Specs по конвенции репо; не менять production без нужды. |
|
|
39
|
+
|
|
40
|
+
## Антипаттерны
|
|
41
|
+
|
|
42
|
+
- DTO / `Codable` transport-типы во View или ViewModel.
|
|
43
|
+
- `URLSession` / конкретный API-клиент в ViewModel или View.
|
|
44
|
+
- Domain импортирует SwiftUI / UIKit.
|
|
45
|
+
- Deep-import внутренних файлов другой фичи.
|
|
46
|
+
- Сборка DI внутри View.
|
|
47
|
+
|
|
48
|
+
## Матрица: зона → правила
|
|
49
|
+
|
|
50
|
+
| Зона | Правила |
|
|
51
|
+
|------|---------|
|
|
52
|
+
| `Features/**/Domain/**`, `Core/Domain/**` | `architecture-boundaries.mdc`, `ios-app-core.mdc` |
|
|
53
|
+
| `Features/**/Data/**`, `**/Network*/**` | `networking-services.mdc`, `architecture-boundaries.mdc` |
|
|
54
|
+
| `*ViewModel*.swift`, Presentation state | `state-and-viewmodels.mdc` |
|
|
55
|
+
| `Presentation/**`, `DesignSystem/**` | `swiftui-ui.mdc`, `architecture-boundaries.mdc` |
|
|
56
|
+
| `**/*.swift` (стиль) | `swift-conventions.mdc` |
|
|
57
|
+
| `*Tests/**` | `tests-unit.mdc` |
|
|
58
|
+
| `*UITests/**` | `tests-ui.mdc` |
|
|
59
|
+
| После правок Swift | `post-change-build.mdc` |
|
|
60
|
+
|
|
61
|
+
При добавлении или расширении фичи **пройти чеклист** и правила из таблицы для затронутых зон.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Базовые принципы, стек и структура iOS приложения на Swift (preset)
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Стек и окружение
|
|
7
|
+
|
|
8
|
+
Версии Swift, iOS SDK, зависимостей и инструментов — **из Xcode-проекта, Package.swift и конфигов целевого репозитория**. Рамка preset:
|
|
9
|
+
|
|
10
|
+
- **Язык / платформа:** Swift, iOS (min — из таргета).
|
|
11
|
+
- **UI:** SwiftUI — приоритет для нового кода; UIKit — где уже принято в репо.
|
|
12
|
+
- **Сборка:** Xcode; SPM и/или CocoaPods — как в репозитории.
|
|
13
|
+
- **Concurrency:** `async`/`await`, `Task`, `Actor`; UI — `@MainActor`.
|
|
14
|
+
- **Тесты:** XCTest или Swift Testing; UI — XCUITest.
|
|
15
|
+
- **Сеть:** `URLSession` или клиент репо; DTO через `Codable`.
|
|
16
|
+
- **Дизайн-система:** токены/примитивы из `DesignSystem/` (или аналога); без «магических» значений.
|
|
17
|
+
- **Наблюдаемость:** только если уже в проекте — централизованно.
|
|
18
|
+
|
|
19
|
+
# Структура проекта
|
|
20
|
+
|
|
21
|
+
Ориентир — **feature-first + слои внутри фичи** или **слои на верхнем уровне** (как в репо):
|
|
22
|
+
|
|
23
|
+
- `App/` — `@main`, composition root, DI, навигация верхнего уровня.
|
|
24
|
+
- `Features/<FeatureName>/` — `Presentation/` (Views, ViewModels), `Domain/` (entities, use cases, протоколы), `Data/` (repos, API, DTO, mappers).
|
|
25
|
+
- `Core/` — общие утилиты, extensions, базовые ошибки.
|
|
26
|
+
- `DesignSystem/` — UI-примитивы без бизнес-логики.
|
|
27
|
+
- `Tests/` / `*Tests/` — unit и UI по конвенции Xcode.
|
|
28
|
+
|
|
29
|
+
Новые файлы — в том же слое/модуле, что и аналогичная функциональность.
|
|
30
|
+
|
|
31
|
+
Границы зависимостей и DI — **`architecture-boundaries.mdc`**.
|
|
32
|
+
|
|
33
|
+
# Swift и качество
|
|
34
|
+
|
|
35
|
+
- Swift API Design Guidelines + SwiftLint/SwiftFormat репо (если есть).
|
|
36
|
+
- Избегать `!` / `try!` в production; `guard` / `if let` / typed errors.
|
|
37
|
+
- Копировать существующие паттерны фичи/слоя.
|
|
38
|
+
|
|
39
|
+
# Работа агента
|
|
40
|
+
|
|
41
|
+
- Определить слой (Presentation / Domain / Data / DesignSystem / Tests); повторить паттерн соседних файлов.
|
|
42
|
+
- Не тянуть `URLSession` во View и DTO во ViewModel — детали в `architecture-boundaries.mdc`.
|
|
43
|
+
- Доставка фичи — `feature-delivery-workflow.mdc`; после правок Swift — `post-change-build.mdc`.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Конвенции сетевого слоя, API-клиентов и mappers
|
|
3
|
+
globs: "**/{Data,Network,Networking}/**/*.swift"
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Роль Data / Network слоя
|
|
8
|
+
|
|
9
|
+
- Инкапсулировать:
|
|
10
|
+
- HTTP-запросы (`URLSession` или клиент проекта),
|
|
11
|
+
- URL, headers, status codes,
|
|
12
|
+
- Codable DTO,
|
|
13
|
+
- persistence (Core Data, SwiftData, Keychain — по репо).
|
|
14
|
+
- Наружу (Domain, ViewModel через repository) отдавать **доменные типы**, не DTO.
|
|
15
|
+
|
|
16
|
+
# Структура модулей
|
|
17
|
+
|
|
18
|
+
- На доменную область — каталог в `Features/<Feature>/Data/` или `Core/Network/<Service>/`.
|
|
19
|
+
- Внутри:
|
|
20
|
+
- `*APIClient.swift` / `*Service.swift` — вызовы эндпоинтов;
|
|
21
|
+
- `*DTO.swift` — транспортные модели (`Codable`);
|
|
22
|
+
- `*Mapper.swift` — DTO ↔ domain;
|
|
23
|
+
- `*RepositoryImpl.swift` — реализация протокола из Domain.
|
|
24
|
+
- Public surface — протоколы репозиториев в Domain; Data-классы не экспортируются во View.
|
|
25
|
+
|
|
26
|
+
# DTO, mappers и типы
|
|
27
|
+
|
|
28
|
+
- DTO **точно** отражают контракт backend (`CodingKeys` при расхождении имён).
|
|
29
|
+
- Доменные entity — в Domain; mapper — **чистые функции** без side effects.
|
|
30
|
+
- В mapper выполнять вычисления (флаги, форматирование, агрегаты), чтобы ViewModel получал готовую модель.
|
|
31
|
+
- Optional и отсутствующие поля обрабатывать явно; не прокидывать «сырой» optional cascade в UI.
|
|
32
|
+
|
|
33
|
+
# Async, errors и retries
|
|
34
|
+
|
|
35
|
+
- Сетевые методы — `async throws` с **typed errors** (`NetworkError`, `APIError`) по конвенции репо.
|
|
36
|
+
- Не глотать ошибки; пробрасывать или маппить в domain errors для ViewModel.
|
|
37
|
+
- Retry, auth refresh, logging — централизованно (interceptor, middleware, `URLProtocol`), не в каждом методе.
|
|
38
|
+
|
|
39
|
+
# Codable и versioning
|
|
40
|
+
|
|
41
|
+
- Избегать `[String: Any]`; для полиморфизма — enum + associated values или явные DTO.
|
|
42
|
+
- `@MainActor` не ставить на Data-типы без необходимости.
|
|
43
|
+
|
|
44
|
+
# Требование к агенту
|
|
45
|
+
|
|
46
|
+
При добавлении/изменении API:
|
|
47
|
+
- Следовать существующим клиентам и mappers как эталону.
|
|
48
|
+
- Добавить/обновить mapper tests для нетривиальных преобразований.
|
|
49
|
+
- ViewModel и View не должны импортировать DTO-файлы.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Сборка и lint после изменений Swift/iOS кода. Use after editing iOS/Swift sources, Xcode targets, or Package.swift.
|
|
3
|
+
alwaysApply: false
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Сборка и lint после изменений
|
|
7
|
+
|
|
8
|
+
## Когда применять
|
|
9
|
+
|
|
10
|
+
После изменений исходников Swift / проектных файлов Xcode / `Package.swift`, влияющих на компиляцию или стиль.
|
|
11
|
+
|
|
12
|
+
Исключения: только документация, README, `.cursor/rules/**` без правок app-кода.
|
|
13
|
+
|
|
14
|
+
**Pipeline:** если следующий шаг — отдельный verifier/CI-агент, достаточно затронутых таргетов; в single-agent режиме — полный разумный прогон как в репо.
|
|
15
|
+
|
|
16
|
+
## Как определить команды
|
|
17
|
+
|
|
18
|
+
1. Схемы / таргеты — из `.xcodeproj` / `.xcworkspace` / `Package.swift` (как в CI или соседних скриптах).
|
|
19
|
+
2. Lint — `SwiftLint` / `.swiftlint.yml`, если есть.
|
|
20
|
+
3. Format — `SwiftFormat` / конфиг, если принято в репо.
|
|
21
|
+
4. Тесты — XCTest или Swift Testing — только если задача их затрагивает.
|
|
22
|
+
|
|
23
|
+
Не угадывать чужой toolchain: копировать флаги/`xcodebuild` из Makefile, scripts, CI.
|
|
24
|
+
|
|
25
|
+
## Алгоритм
|
|
26
|
+
|
|
27
|
+
1. Завершить правки.
|
|
28
|
+
2. Собрать **затронутые** таргеты (`xcodebuild` / `swift build` — как в репо).
|
|
29
|
+
3. Прогнать lint/format при наличии конфигов; исправить ошибки в файлах задачи.
|
|
30
|
+
4. Повторить до чистой сборки или зафиксировать блокер пользователю.
|
|
31
|
+
|
|
32
|
+
**Errors** — обязательно; warnings в файлах задачи — по возможности до нуля.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: ViewModels, состояние экрана и domain flow
|
|
3
|
+
globs: "**/{Presentation,Domain}/**/*ViewModel*.swift"
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Общие принципы
|
|
8
|
+
|
|
9
|
+
- ViewModel — **единственная точка** orchestration для экрана: load, submit, validation, navigation intents.
|
|
10
|
+
- Хранить и отдавать во View **domain models** и UI-specific state (loading, error message, selected tab).
|
|
11
|
+
- `@MainActor` на ViewModel; тяжёлую работу — в use case / repository (`async`), не блокировать main thread.
|
|
12
|
+
- Unidirectional flow: View → intent → ViewModel → use case → state update → View.
|
|
13
|
+
|
|
14
|
+
# State
|
|
15
|
+
|
|
16
|
+
- Явный enum или struct для UI state где уместно:
|
|
17
|
+
- `idle`, `loading`, `loaded(Data)`, `failed(Error)` — или аналог из репо.
|
|
18
|
+
- Избегать множества несинхронизированных `@Published` флагов, если один enum покрывает сценарий.
|
|
19
|
+
- `@Observable` / `ObservableObject` — как в проекте; не смешивать стили в одной фиче без причины.
|
|
20
|
+
|
|
21
|
+
# Use cases и repositories
|
|
22
|
+
|
|
23
|
+
- ViewModel зависит от **протоколов** (`LoadOrdersUseCase`, `OrderRepository`), не от `*RepositoryImpl`.
|
|
24
|
+
- Один use case — одна бизнес-операция; не раздувать ViewModel сотнями строк — выносить use cases в Domain.
|
|
25
|
+
- Кэширование и offline — в repository/Data, не во ViewModel.
|
|
26
|
+
|
|
27
|
+
# Side effects
|
|
28
|
+
|
|
29
|
+
- Analytics, haptics, deep links — через injected services или middleware-паттерн, не hardcode синглтонов.
|
|
30
|
+
- `Task` в ViewModel: отмена при `deinit` / `onDisappear` где нужно (`task(id:)`, хранение `Task?` с cancel).
|
|
31
|
+
|
|
32
|
+
# Тестируемость
|
|
33
|
+
|
|
34
|
+
- Инициализатор ViewModel принимает протоколы (DI); без скрытых singleton для сети/БД.
|
|
35
|
+
- Бизнес-ветки покрывать unit-тестами с mock use cases.
|
|
36
|
+
|
|
37
|
+
# Требование к агенту
|
|
38
|
+
|
|
39
|
+
При создании ViewModel:
|
|
40
|
+
- Не вызывать `URLSession` / API client напрямую.
|
|
41
|
+
- Не парсить JSON и не объявлять DTO во ViewModel.
|
|
42
|
+
- Именование: `FeatureViewModel`, методы — глаголы (`loadOrders()`, `submitOrder()`).
|
|
43
|
+
- Следовать стилю существующих ViewModels в той же фиче.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Swift language conventions and safety (preset)
|
|
3
|
+
globs: "**/*.swift"
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Naming and API design
|
|
8
|
+
|
|
9
|
+
- Types: `UpperCamelCase`; methods, properties, enum cases: `lowerCamelCase`.
|
|
10
|
+
- Protocols, описывающие capability: `-able`, `-ing`, или `Protocol` суффикс — как в репо.
|
|
11
|
+
- Избегать аббревиатур в именах, кроме общепринятых (URL, ID, HTTP).
|
|
12
|
+
|
|
13
|
+
# Optionals and errors
|
|
14
|
+
|
|
15
|
+
```swift
|
|
16
|
+
// ❌ Плохо
|
|
17
|
+
let name = user!.name
|
|
18
|
+
|
|
19
|
+
// ✅ Хорошо
|
|
20
|
+
guard let name = user?.name else { return }
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
- `throws` + typed errors вместо `Result` там, где так принято в слое; быть консistent внутри модуля.
|
|
24
|
+
- `guard` для early exit; не вкладывать глубокие `if let` pyramids.
|
|
25
|
+
|
|
26
|
+
# Concurrency
|
|
27
|
+
|
|
28
|
+
- UI types — `@MainActor`.
|
|
29
|
+
- Shared mutable state — `actor` или isolation через queue; document thread expectations.
|
|
30
|
+
- `Task { }` в ViewModel: учитывать cancellation; `[weak self]` в escaping closures при retain cycles.
|
|
31
|
+
- Prefer `async/await` over completion handlers для нового кода.
|
|
32
|
+
|
|
33
|
+
# Access control
|
|
34
|
+
|
|
35
|
+
- Минимально необходимый уровень: `private` / `fileprivate` по умолчанию для implementation details.
|
|
36
|
+
- Public API фичи — явные types и protocols; не экспортировать DTO наружу модуля.
|
|
37
|
+
|
|
38
|
+
# Value semantics
|
|
39
|
+
|
|
40
|
+
- Предпочитать `struct` для models и state где нет identity semantics.
|
|
41
|
+
- `class` — когда нужен identity, inheritance, или Objective-C interop.
|
|
42
|
+
|
|
43
|
+
# Extensions
|
|
44
|
+
|
|
45
|
+
- Группировать extensions по типу; не складывать unrelated helpers в один `Extensions.swift` без структуры.
|
|
46
|
+
- Protocol extensions для shared default behavior.
|
|
47
|
+
|
|
48
|
+
# Требование к агенту
|
|
49
|
+
|
|
50
|
+
- Не добавлять `// swiftlint:disable` без явной причины.
|
|
51
|
+
- Новый код — Swift Concurrency-ready (`Sendable` где требует компилятор/линтер проекта).
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Паттерны SwiftUI, View и Design System (preset)
|
|
3
|
+
globs: "**/{Presentation,DesignSystem}/**/*.swift"
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Общие правила View
|
|
8
|
+
|
|
9
|
+
- **SwiftUI** — приоритет; UIKit — только по конвенции репо (wrapper, legacy).
|
|
10
|
+
- View должна быть **тонкой**:
|
|
11
|
+
- отображает state из ViewModel;
|
|
12
|
+
- делегирует действия через методы/closures ViewModel;
|
|
13
|
+
- не содержит бизнес-логики, маппинга DTO, сетевых вызовов.
|
|
14
|
+
- Перед новым кастомным контролом — искать компонент в `DesignSystem/` или существующих фичах.
|
|
15
|
+
- Повторяемую UI-логику выносить в `ViewModifier`, `@ViewBuilder` helpers или subviews.
|
|
16
|
+
|
|
17
|
+
# ViewModel и binding
|
|
18
|
+
|
|
19
|
+
- ViewModel — `@MainActor`, `@Observable` (iOS 17+) или `ObservableObject` — как принято в проекте.
|
|
20
|
+
- View читает state и вызывает **явные методы** ViewModel (`submit()`, `load()`), а не мутирует внутреннее состояние напрямую.
|
|
21
|
+
- Для навигации — coordinator/router или enum route в ViewModel, не размазанные `NavigationLink` с бизнес-условиями в View.
|
|
22
|
+
|
|
23
|
+
# Структура файлов
|
|
24
|
+
|
|
25
|
+
Для экрана фичи:
|
|
26
|
+
- `FeatureView.swift` — композиция subviews.
|
|
27
|
+
- `FeatureViewModel.swift` — state + intents.
|
|
28
|
+
- `FeatureView+Subviews.swift` — при большом дереве (опционально).
|
|
29
|
+
- `FeatureRoute.swift` — навигация (если используется).
|
|
30
|
+
|
|
31
|
+
Для компонента Design System:
|
|
32
|
+
- Папка `ComponentName/`:
|
|
33
|
+
- `ComponentName.swift`
|
|
34
|
+
- `ComponentName+Preview.swift` (опционально)
|
|
35
|
+
- `ComponentNameStyle.swift` — стили/варианты (опционально)
|
|
36
|
+
|
|
37
|
+
# Стили и Design System
|
|
38
|
+
|
|
39
|
+
- Цвета, шрифты, отступы — из **токенов/Theme** проекта (`DesignSystem`, `Assets`, generated tokens).
|
|
40
|
+
- Избегать:
|
|
41
|
+
- «магических» литералов (`.padding(17)`, `Color(red: 0.2, ...)`), если есть токены;
|
|
42
|
+
- дублирования стилей, уже закрытых примитивами.
|
|
43
|
+
- `Preview` — для компонентов и экранов с mock ViewModel.
|
|
44
|
+
|
|
45
|
+
# Accessibility
|
|
46
|
+
|
|
47
|
+
- Интерактивные элементы: осмысленные `accessibilityLabel`, `accessibilityHint` где нужно.
|
|
48
|
+
- Для UI-тестов — стабильные `accessibilityIdentifier` на ключевых элементах (согласовать с `tests-ui.mdc`).
|
|
49
|
+
- Поддерживать Dynamic Type и контраст, не ломать layout при крупном шрифте.
|
|
50
|
+
|
|
51
|
+
# Previews и локализация
|
|
52
|
+
|
|
53
|
+
- Строки UI — через `String(localized:)` / `LocalizedStringKey`, не hardcoded в production без причины.
|
|
54
|
+
- `#Preview` с реалистичными mock-данными; для ViewModel — stub use cases.
|
|
55
|
+
|
|
56
|
+
# Требование к агенту
|
|
57
|
+
|
|
58
|
+
При создании/изменении UI:
|
|
59
|
+
- Следовать существующим экранам и компонентам как эталону.
|
|
60
|
+
- Не импортировать Data-слой во View/ViewModel.
|
|
61
|
+
- Subview выделять, когда body превышает ~40–60 строк или повторяется.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: UI-тесты XCUITest и accessibility identifiers
|
|
3
|
+
globs: "**/*UITests/**/*.swift"
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Структура UI-тестов
|
|
8
|
+
|
|
9
|
+
- UI Test target: `*UITests/` — сценарии пользовательских потоков.
|
|
10
|
+
- Page Object (или Screen Object) — класс на экран: селекторы + действия (`LoginScreen`, `OrderHistoryScreen`).
|
|
11
|
+
- Общие хелперы — `UITestSupport/`, base classes, launch arguments.
|
|
12
|
+
|
|
13
|
+
# Селекторы и стабильность
|
|
14
|
+
|
|
15
|
+
- **Приоритет:** `accessibilityIdentifier` для ключевых элементов; затем label/trait где устойчиво.
|
|
16
|
+
- Идентификаторы согласовать с Presentation-слоем (`swiftui-ui.mdc`): `{screen}__{element}`.
|
|
17
|
+
- Пример: `order-history__submit-button`, `login__email-field`.
|
|
18
|
+
- Избегать привязки к абсолютным координатам и хрупким XPath-подобным цепочкам.
|
|
19
|
+
|
|
20
|
+
# Сценарии и именование
|
|
21
|
+
|
|
22
|
+
- Названия тестов — **на русском**, с префиксом сущности:
|
|
23
|
+
- `OH-001 Отображается список заказов` (префикс — первые буквы сущности, номер — три цифры).
|
|
24
|
+
- Один тест — один пользовательский сценарий; не объединять несвязанные проверки.
|
|
25
|
+
|
|
26
|
+
# Launch и окружение
|
|
27
|
+
|
|
28
|
+
- `-UITesting`, mock server URL, сброс state — через `launchArguments` / `launchEnvironment`, как в репо.
|
|
29
|
+
- Не зависеть от прод-backend в CI; использовать staging/mock.
|
|
30
|
+
|
|
31
|
+
# Синхронизация с UI
|
|
32
|
+
|
|
33
|
+
- При изменении UI обновлять identifiers в View и селекторы в page objects.
|
|
34
|
+
- Не ослаблять assertions против бизнес-ожиданий ради «зелёного» CI.
|
|
35
|
+
|
|
36
|
+
# Требование к агенту
|
|
37
|
+
|
|
38
|
+
При добавлении UI-тестов:
|
|
39
|
+
- Переиспользовать page objects, не дублировать query в каждом тесте.
|
|
40
|
+
- Добавлять `accessibilityIdentifier` в SwiftUI через `.accessibilityIdentifier(...)` для новых интерактивных элементов.
|
|
41
|
+
- Следовать существующим UITest files как эталону.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Unit и integration тесты (XCTest / Swift Testing)
|
|
3
|
+
globs: "**/*Tests/**/*.swift"
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Общие правила тестирования
|
|
8
|
+
|
|
9
|
+
- **Framework** — XCTest или Swift Testing, как в проекте.
|
|
10
|
+
- Цель: проверять **поведение и бизнес-правила**, не детали реализации и private API.
|
|
11
|
+
- Именование:
|
|
12
|
+
- `test` / `@Test` descriptions и `XCTContext` — **на русском**, как понятные бизнес-фразы.
|
|
13
|
+
- Описания **с заглавной буквы**.
|
|
14
|
+
|
|
15
|
+
# ViewModel и use case
|
|
16
|
+
|
|
17
|
+
- Mock протоколов repositories / use cases; не поднимать реальную сеть.
|
|
18
|
+
- Проверять переходы state: loading → success/failure, validation errors, edge cases.
|
|
19
|
+
- `@MainActor` ViewModel тестировать с `@MainActor` test methods или `await MainActor.run`.
|
|
20
|
+
|
|
21
|
+
# Mappers и domain
|
|
22
|
+
|
|
23
|
+
- Mapper functions — unit-тесты с таблицами кейсов: nil fields, empty arrays, граничные значения.
|
|
24
|
+
- Regression на бизнес-правила (скидки, статусы, форматирование дат).
|
|
25
|
+
|
|
26
|
+
# Изоляция
|
|
27
|
+
|
|
28
|
+
- Не мокать то, что является предметом теста (например, сам mapper при тесте mapper).
|
|
29
|
+
- Fixtures — в `TestSupport/`, `Mocks/` или рядом по конвенции репо; не дублировать большие JSON inline без нужды.
|
|
30
|
+
|
|
31
|
+
# Структура файлов
|
|
32
|
+
|
|
33
|
+
- `FeatureViewModelTests.swift`, `OrderMapperTests.swift` — суффикс `Tests` в имени типа/файла по стилю Xcode.
|
|
34
|
+
- Не создавать глубокую вложенность `Tests/Tests/`; следовать target structure проекта.
|
|
35
|
+
|
|
36
|
+
# Требование к агенту
|
|
37
|
+
|
|
38
|
+
При добавлении тестов:
|
|
39
|
+
- Копировать паттерны из существующих test files в репо.
|
|
40
|
+
- Добавлять тесты для новых веток логики и регрессий.
|
|
41
|
+
- Использовать DTO fixtures из Data layer и domain types из Domain, не дублировать типы в тестах.
|
|
@@ -1,51 +1,3 @@
|
|
|
1
1
|
# Cursor commands (next preset)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
## Команда агентов
|
|
6
|
-
|
|
7
|
-
| Command | Назначение |
|
|
8
|
-
|---------|------------|
|
|
9
|
-
| **`/task <описание>`** | **Главная точка входа:** router → pipeline.json → нужные роли по порядку |
|
|
10
|
-
| `/task-continue <slug>` | После human gate или паузы |
|
|
11
|
-
| `/feature-start <описание>` | Legacy: только analyst (без router) |
|
|
12
|
-
| `/feature-continue <slug>` | Alias task-continue |
|
|
13
|
-
| `/technical-retro [slug]` | Ретро; с slug — блок «Работа агентов» |
|
|
14
|
-
|
|
15
|
-
## Примеры `/task`
|
|
16
|
-
|
|
17
|
-
```
|
|
18
|
-
/task Добавить фильтр по дате в Order History
|
|
19
|
-
→ analyst → developer → reviewer → QA
|
|
20
|
-
|
|
21
|
-
/task Order History падает при пустом списке
|
|
22
|
-
→ debugger → developer → reviewer → QA (regression)
|
|
23
|
-
|
|
24
|
-
/task CI упал на lint в PR #142
|
|
25
|
-
→ ci-investigator → developer → reviewer
|
|
26
|
-
|
|
27
|
-
/task Миграция на Next.js 15
|
|
28
|
-
→ analyst → migration-specialist → developer → reviewer → QA
|
|
29
|
-
|
|
30
|
-
/task Проверь доступность модалки оплаты
|
|
31
|
-
→ analyst → developer → a11y-reviewer → code-reviewer
|
|
32
|
-
|
|
33
|
-
/task Покрой unit-тестами mapper orders
|
|
34
|
-
→ unit-planner → unit-generator
|
|
35
|
-
|
|
36
|
-
/task Напиши README для новой фичи фильтров
|
|
37
|
-
→ analyst → tech-writer
|
|
38
|
-
|
|
39
|
-
/task Сделай ревью изменений в store/orders
|
|
40
|
-
→ reviewer only
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
## Связанные файлы
|
|
44
|
-
|
|
45
|
-
- Subagents: `../agents/` (20 ролей, включая `task-router.md`)
|
|
46
|
-
- Оркестратор: `../rules/agent-team-orchestrator.mdc`
|
|
47
|
-
- Skills: `../skills/` (`feature-delivery`, `code-review`, `debug-investigation`, `ci-investigation`, `unit-testing`, `playwright-e2e`, `technical-retro`)
|
|
48
|
-
- Артефакты: `../team/README.md` (`pipeline.json`, `status.json`)
|
|
49
|
-
- Hooks: `../hooks.json`, `../hooks/chain-team-phases.sh`
|
|
50
|
-
|
|
51
|
-
Создавать и редактировать команды можно через `/commands` в Cursor или напрямую в этой папке пресета.
|
|
3
|
+
Place command definitions for this preset here. They are copied to `.cursor/commands` when you run `ai-rules init cursor --preset next`.
|
|
@@ -10,50 +10,3 @@
|
|
|
10
10
|
- Cursor интерпретирует его как конфигурацию поведения ассистента для этого репо (автоматически подмешивает содержимое в контекст, когда правило подходит).
|
|
11
11
|
|
|
12
12
|
- То есть .mdc = “markdown + config для Cursor”, .md = просто текст без управляющего смысла для ассистента.
|
|
13
|
-
|
|
14
|
-
### С чего начать новую задачу
|
|
15
|
-
|
|
16
|
-
- **Команда агентов (рекомендуется):** `/task <описание>` — router выберет роли и порядок; при human gate — `/task-continue <slug>`. См. **`agent-team-orchestrator.mdc`** и `.cursor/team/README.md`.
|
|
17
|
-
- **Legacy:** `/feature-start` → `/feature-continue`.
|
|
18
|
-
- **Сквозной чеклист слоёв (для developer):** **`feature-delivery-workflow.mdc`**.
|
|
19
|
-
|
|
20
|
-
### Loading strategy
|
|
21
|
-
|
|
22
|
-
- **`alwaysApply: true`** (Cursor) / **без `paths:`** (Claude) — только базовые инварианты:
|
|
23
|
-
- `next-app-core`, `post-change-lint`, `package-manager`, `code-quality-and-refactoring`
|
|
24
|
-
- **On-demand** — `agent-team-intake` (через orchestrator/commands), `agent-team-orchestrator`, architecture, imports, UI, tests, feature-delivery-workflow, reference-features, next-app-router, react-a11y-coding
|
|
25
|
-
- **Skills** — длинные процедуры (`feature-delivery`, `code-review`, …)
|
|
26
|
-
|
|
27
|
-
### Эталонные фичи
|
|
28
|
-
|
|
29
|
-
Заполните **`reference-features.mdc`** (TBD → реальные пути) после `init` в целевом репо.
|
|
30
|
-
|
|
31
|
-
### Каталог ключевых правил
|
|
32
|
-
|
|
33
|
-
| Файл | Назначение |
|
|
34
|
-
|------|------------|
|
|
35
|
-
| `reference-features.mdc` | Эталонные пути UI/store/API/types/tests |
|
|
36
|
-
| `next-app-router.mdc` | App Router, RSC, loading/error |
|
|
37
|
-
| `react-a11y-coding.mdc` | A11y при написании UI |
|
|
38
|
-
| `feature-delivery-workflow.mdc` | Сквозной чеклист (on-demand, не always-on) |
|
|
39
|
-
| `agent-team-intake.mdc` | Подсказка `/task` при work-запросе (on-demand, через orchestrator) |
|
|
40
|
-
| `package-manager.mdc` | Перед `install` / `run` в терминале определить менеджер пакетов репо (lockfile, `packageManager`) и использовать только его |
|
|
41
|
-
| `agent-team-orchestrator.mdc` | `/task`, router, `pipeline.json`, build-verifier, parallel steps |
|
|
42
|
-
| `next-app-core.mdc` | Стек, слои, карта каталогов (alwaysApply) |
|
|
43
|
-
| `post-change-lint.mdc` | **Обязательный** прогон ESLint + Stylelint после любых изменений кода |
|
|
44
|
-
| `architecture-boundaries.mdc` | Границы UI / store / API, импорты (`@/types`, `@/api`), порты‑адаптеры, фича как срез |
|
|
45
|
-
| `http-client.mdc` | Один HTTP‑стек, контракты из `@/types`, без разбросанного низкоуровневого API |
|
|
46
|
-
| `api-services.mdc` | Сервисы, мапперы, вызовы через прикладные API‑клиенты |
|
|
47
|
-
| `store-rtk.mdc` | Redux Toolkit, thunk’и, типизация ошибок/ответов как в коде репо |
|
|
48
|
-
| `public-imports.mdc` | Импорты `@/types`, `@/types/enums`, `@/api` (вне `app/src/api/**`); stubs: `types-public-imports.mdc`, `api-public-imports.mdc` |
|
|
49
|
-
| `layer-barrel-exports.mdc` | Двухуровневые barrel для слоёв с public API (`@/api`, `@/types`, `@/core`, …) |
|
|
50
|
-
| `types-jsdoc.mdc` | JSDoc для типов в `app/src/types` (русский текст, `[computed]`, без `@param`/`@returns`) |
|
|
51
|
-
| `no-type-assertion-as-import-export.mdc` | Ограничение `as`, в т.ч. `instanceof` для ошибок транспорта в `catch` |
|
|
52
|
-
| `code-review-mr.mdc` | Чеклист ревью MR, в т.ч. HTTP‑клиент и тесты |
|
|
53
|
-
| `tests-unit.mdc` | Unit‑тесты и behavior‑тесты HTTP‑клиента |
|
|
54
|
-
| `playwright-agents.mdc`, `tests-e2e-structure.mdc` | E2E |
|
|
55
|
-
| `react-ui.mdc` | React/Next UI: структура компонентов, соседние `ComponentName.data.ts` / `.utils.ts`, стили, пропсы |
|
|
56
|
-
|
|
57
|
-
**Коллизии формулировок:** импорт типов и API — источник правды **`public-imports.mdc`**; дублирует ESLint `no-restricted-imports` в `app/eslint.config.mjs`.
|
|
58
|
-
|
|
59
|
-
Задачи на **сеть, замену HTTP‑библиотеки, новые эндпоинты**: опираться на **`http-client.mdc`** + **`api-services.mdc`** + **`store-rtk.mdc`**.
|
|
@@ -1,41 +1,40 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Конвенции API сервисов и мапперов
|
|
3
|
-
globs:
|
|
3
|
+
globs: src/api/services/**/*.ts
|
|
4
4
|
alwaysApply: false
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Роль API слоя
|
|
8
8
|
|
|
9
9
|
- Инкапсулировать всё, что связано с:
|
|
10
|
-
- HTTP‑запросами через
|
|
10
|
+
- HTTP‑запросами (через принятый в проекте клиент),
|
|
11
11
|
- URL/путями,
|
|
12
12
|
- заголовками и кодами ответов,
|
|
13
13
|
- DTO backend.
|
|
14
14
|
- Предоставлять UI и store **стабильный доменный интерфейс**:
|
|
15
|
-
- функции, работающие с доменными типами из `@/types
|
|
15
|
+
- функции, работающие с доменными типами из `@/types/**`.
|
|
16
16
|
- мапперы между DTO и доменными типами.
|
|
17
17
|
|
|
18
18
|
# Структура модулей
|
|
19
19
|
|
|
20
20
|
- Для каждой доменной области (например, заказы, биллинг, настройки аккаунта):
|
|
21
|
-
- отдельный каталог в `
|
|
21
|
+
- отдельный каталог в `src/api/services/<ИмяСервиса или фичи>/**` по конвенции репозитория.
|
|
22
22
|
- Внутри модуля:
|
|
23
23
|
- файлы с вызовами API (`index.ts` или `*.service.ts`);
|
|
24
24
|
- файлы мапперов (`*responseMappers.ts`);
|
|
25
|
-
- специфичные типы запросов/ответов (если не вынесены в
|
|
26
|
-
-
|
|
25
|
+
- специфичные типы запросов/ответов (если не вынесены в `@/types/**`).
|
|
26
|
+
- один или несколько **public API** файлов (`index.ts` или barrel‑файлы), через которые к модулю обращаются UI, store и другие слои.
|
|
27
27
|
|
|
28
28
|
# Мапперы и типы
|
|
29
29
|
|
|
30
30
|
- Для каждого запроса/эндпоинта:
|
|
31
31
|
- описывать **response‑тип (DTO)**, точно соответствующий контракту backend;
|
|
32
|
-
- определять **целевой доменный тип** в `
|
|
32
|
+
- определять **целевой доменный тип** в `src/types/**`, с которым будет работать приложение (включая вычисляемые/агрегированные поля).
|
|
33
33
|
- Мапперы (например, `*responseMappers.ts`):
|
|
34
34
|
- чистые функции, без сайд‑эффектов;
|
|
35
35
|
- выполняют все необходимые вычисления и преобразования данных (булевы флаги, склейка строк, агрегаты и т.п.) при переводе из DTO в доменные модели;
|
|
36
36
|
- при необходимости обеспечивают обратное преобразование (доменные модели -> транспортные типы).
|
|
37
|
-
- UI и store работают только с доменными типами (из `@/types
|
|
38
|
-
- **Не вызывать `fetch` напрямую** в теле API‑методов: только через клиент; исключения — узкие модули (например JSON‑RPC), если так уже устроено в репозитории.
|
|
37
|
+
- UI и store работают только с доменными типами (из `@/types/**` или экспортируемыми из API слоя), а не с "сырыми" DTO.
|
|
39
38
|
|
|
40
39
|
# Обработка ошибок
|
|
41
40
|
|
|
@@ -50,9 +49,8 @@ alwaysApply: false
|
|
|
50
49
|
|
|
51
50
|
При добавлении/изменении API‑метода:
|
|
52
51
|
- Следовать существующим сервисам и мапперам как эталону.
|
|
53
|
-
- Пройти чеклист barrel-экспортов (**`layer-barrel-exports.mdc`**): локальный `index.ts` → фасад слоя → корневой barrel.
|
|
54
52
|
- Не смешивать слой API и UI/store:
|
|
55
53
|
- компоненты не должны зависеть от DTO;
|
|
56
|
-
- store не должен
|
|
57
|
-
- При использовании API‑сервисов в UI, store и утилитах
|
|
54
|
+
- store не должен знать о HTTP‑деталях (URL, коды).
|
|
55
|
+
- При использовании API‑сервисов в UI, store и утилитах импортировать только из public API файлов модуля (например, `@/api/services/OrdersApi/.../index`), а не из внутренних файлов‑реализаций.
|
|
58
56
|
|