@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.
Files changed (193) hide show
  1. package/README.md +10 -18
  2. package/bin/cli.js +73 -258
  3. package/package.json +3 -4
  4. package/presets/claude/ios-swift/CLAUDE.md +27 -0
  5. package/presets/claude/ios-swift/README.md +29 -0
  6. package/presets/claude/ios-swift/commands/README.md +3 -0
  7. package/presets/claude/ios-swift/rules/README.md +44 -0
  8. package/presets/claude/ios-swift/rules/api-and-data/README.md +9 -0
  9. package/presets/claude/ios-swift/rules/api-and-data/networking.md +49 -0
  10. package/presets/claude/ios-swift/rules/architecture/README.md +10 -0
  11. package/presets/claude/ios-swift/rules/architecture/boundaries.md +33 -0
  12. package/presets/claude/ios-swift/rules/architecture/feature-delivery.md +60 -0
  13. package/presets/claude/ios-swift/rules/stack/README.md +10 -0
  14. package/presets/claude/ios-swift/rules/stack/ios-app-core.md +42 -0
  15. package/presets/claude/ios-swift/rules/stack/swift-conventions.md +51 -0
  16. package/presets/claude/ios-swift/rules/testing/README.md +10 -0
  17. package/presets/claude/ios-swift/rules/testing/ui.md +41 -0
  18. package/presets/claude/ios-swift/rules/testing/unit.md +41 -0
  19. package/presets/claude/ios-swift/rules/tooling-and-review/README.md +11 -0
  20. package/presets/claude/ios-swift/rules/tooling-and-review/code-quality.md +38 -0
  21. package/presets/claude/ios-swift/rules/tooling-and-review/code-review.md +41 -0
  22. package/presets/claude/ios-swift/rules/tooling-and-review/post-change-build.md +31 -0
  23. package/presets/claude/ios-swift/rules/ui-and-accessibility/README.md +10 -0
  24. package/presets/claude/ios-swift/rules/ui-and-accessibility/swiftui.md +61 -0
  25. package/presets/claude/ios-swift/rules/ui-and-accessibility/viewmodels.md +43 -0
  26. package/presets/claude/next/CLAUDE.md +5 -29
  27. package/presets/claude/next/README.md +0 -10
  28. package/presets/claude/next/agents/README.md +0 -125
  29. package/presets/claude/next/commands/README.md +2 -10
  30. package/presets/claude/next/hooks/README.md +2 -5
  31. package/presets/claude/next/rules/README.md +11 -25
  32. package/presets/claude/next/rules/api-and-data/README.md +1 -7
  33. package/presets/claude/next/rules/architecture/README.md +2 -9
  34. package/presets/claude/next/rules/stack/README.md +1 -9
  35. package/presets/claude/next/rules/testing/README.md +1 -9
  36. package/presets/claude/next/rules/tooling-and-review/README.md +1 -14
  37. package/presets/claude/next/rules/ui-and-accessibility/README.md +1 -8
  38. package/presets/claude/next/skills/README.md +1 -11
  39. package/presets/cursor/ios-swift/README.md +17 -0
  40. package/presets/cursor/ios-swift/commands/README.md +3 -0
  41. package/presets/cursor/ios-swift/rules/README.md +33 -0
  42. package/presets/cursor/ios-swift/rules/architecture-boundaries.mdc +34 -0
  43. package/presets/cursor/ios-swift/rules/code-quality-and-refactoring.mdc +39 -0
  44. package/presets/cursor/ios-swift/rules/code-review-mr.mdc +42 -0
  45. package/presets/cursor/ios-swift/rules/feature-delivery-workflow.mdc +61 -0
  46. package/presets/cursor/ios-swift/rules/ios-app-core.mdc +43 -0
  47. package/presets/cursor/ios-swift/rules/networking-services.mdc +49 -0
  48. package/presets/cursor/ios-swift/rules/post-change-build.mdc +32 -0
  49. package/presets/cursor/ios-swift/rules/state-and-viewmodels.mdc +43 -0
  50. package/presets/cursor/ios-swift/rules/swift-conventions.mdc +51 -0
  51. package/presets/cursor/ios-swift/rules/swiftui-ui.mdc +61 -0
  52. package/presets/cursor/ios-swift/rules/tests-ui.mdc +41 -0
  53. package/presets/cursor/ios-swift/rules/tests-unit.mdc +41 -0
  54. package/presets/cursor/next/commands/README.md +1 -49
  55. package/presets/cursor/next/rules/README.md +0 -47
  56. package/presets/cursor/next/rules/api-services.mdc +10 -12
  57. package/presets/cursor/next/rules/architecture-boundaries.mdc +12 -31
  58. package/presets/cursor/next/rules/code-quality-and-refactoring.mdc +4 -5
  59. package/presets/cursor/next/rules/code-review-mr.mdc +7 -14
  60. package/presets/cursor/next/rules/next-app-core.mdc +61 -18
  61. package/presets/cursor/next/rules/no-props-spread.mdc +4 -27
  62. package/presets/cursor/next/rules/playwright-agents.mdc +1 -2
  63. package/presets/cursor/next/rules/react-ui.mdc +3 -32
  64. package/presets/cursor/next/rules/store-rtk.mdc +6 -13
  65. package/presets/cursor/next/rules/tests-unit.mdc +10 -30
  66. package/CHANGELOG.md +0 -22
  67. package/presets/claude/next/agents/accessibility-reviewer.md +0 -65
  68. package/presets/claude/next/agents/api-contract-reviewer.md +0 -69
  69. package/presets/claude/next/agents/build-verifier.md +0 -64
  70. package/presets/claude/next/agents/ci-investigator.md +0 -62
  71. package/presets/claude/next/agents/code-reviewer.md +0 -62
  72. package/presets/claude/next/agents/debugger.md +0 -63
  73. package/presets/claude/next/agents/feature-developer.md +0 -27
  74. package/presets/claude/next/agents/migration-specialist.md +0 -69
  75. package/presets/claude/next/agents/performance-auditor.md +0 -68
  76. package/presets/claude/next/agents/qa-tester.md +0 -56
  77. package/presets/claude/next/agents/security-reviewer.md +0 -64
  78. package/presets/claude/next/agents/solution-architect.md +0 -70
  79. package/presets/claude/next/agents/task-analyst.md +0 -109
  80. package/presets/claude/next/agents/task-router.md +0 -70
  81. package/presets/claude/next/agents/tech-writer.md +0 -60
  82. package/presets/claude/next/agents/unit-test-generator.md +0 -37
  83. package/presets/claude/next/agents/unit-test-healer.md +0 -38
  84. package/presets/claude/next/agents/unit-test-planner.md +0 -62
  85. package/presets/claude/next/commands/feature-continue.md +0 -51
  86. package/presets/claude/next/commands/feature-start.md +0 -30
  87. package/presets/claude/next/commands/task-continue.md +0 -49
  88. package/presets/claude/next/commands/task.md +0 -50
  89. package/presets/claude/next/commands/technical-retro.md +0 -58
  90. package/presets/claude/next/hooks/chain-team-phases.sh +0 -342
  91. package/presets/claude/next/hooks/guard-shell-command.sh +0 -77
  92. package/presets/claude/next/rules/api-and-data/api-services.md +0 -57
  93. package/presets/claude/next/rules/api-and-data/http-client.md +0 -40
  94. package/presets/claude/next/rules/api-and-data/store-rtk.md +0 -65
  95. package/presets/claude/next/rules/architecture/api-public-imports.md +0 -8
  96. package/presets/claude/next/rules/architecture/architecture-boundaries.md +0 -72
  97. package/presets/claude/next/rules/architecture/feature-delivery-workflow.md +0 -79
  98. package/presets/claude/next/rules/architecture/layer-barrel-exports.md +0 -58
  99. package/presets/claude/next/rules/architecture/public-imports.md +0 -46
  100. package/presets/claude/next/rules/architecture/reference-features.md +0 -37
  101. package/presets/claude/next/rules/architecture/types-public-imports.md +0 -8
  102. package/presets/claude/next/rules/stack/arrow-functions.md +0 -45
  103. package/presets/claude/next/rules/stack/navigation-router.md +0 -61
  104. package/presets/claude/next/rules/stack/next-app-core.md +0 -33
  105. package/presets/claude/next/rules/stack/next-app-router.md +0 -36
  106. package/presets/claude/next/rules/stack/no-type-assertion.md +0 -59
  107. package/presets/claude/next/rules/stack/types-jsdoc.md +0 -37
  108. package/presets/claude/next/rules/testing/playwright-agents.md +0 -74
  109. package/presets/claude/next/rules/testing/tests-e2e-structure.md +0 -52
  110. package/presets/claude/next/rules/testing/tests-unit.md +0 -66
  111. package/presets/claude/next/rules/tooling-and-review/agent-team-intake.md +0 -15
  112. package/presets/claude/next/rules/tooling-and-review/agent-team-orchestrator.md +0 -134
  113. package/presets/claude/next/rules/tooling-and-review/code-quality.md +0 -42
  114. package/presets/claude/next/rules/tooling-and-review/code-review-mr.md +0 -67
  115. package/presets/claude/next/rules/tooling-and-review/package-manager.md +0 -11
  116. package/presets/claude/next/rules/tooling-and-review/post-change-lint.md +0 -33
  117. package/presets/claude/next/rules/ui-and-accessibility/component-styles.md +0 -56
  118. package/presets/claude/next/rules/ui-and-accessibility/css-property-order.md +0 -14
  119. package/presets/claude/next/rules/ui-and-accessibility/no-props-spread.md +0 -57
  120. package/presets/claude/next/rules/ui-and-accessibility/react-a11y-coding.md +0 -37
  121. package/presets/claude/next/rules/ui-and-accessibility/react-ui.md +0 -90
  122. package/presets/claude/next/skills/ci-investigation/SKILL.md +0 -36
  123. package/presets/claude/next/skills/code-review/SKILL.md +0 -26
  124. package/presets/claude/next/skills/debug-investigation/SKILL.md +0 -28
  125. package/presets/claude/next/skills/feature-delivery/SKILL.md +0 -15
  126. package/presets/claude/next/skills/playwright-e2e/SKILL.md +0 -31
  127. package/presets/claude/next/skills/technical-retro/SKILL.md +0 -40
  128. package/presets/claude/next/skills/unit-testing/SKILL.md +0 -32
  129. package/presets/claude/next/team/README.md +0 -46
  130. package/presets/claude/next/team/tasks/.gitkeep +0 -1
  131. package/presets/cursor/next/AGENTS.md +0 -43
  132. package/presets/cursor/next/BUGBOT.md +0 -14
  133. package/presets/cursor/next/agents/README.md +0 -158
  134. package/presets/cursor/next/agents/accessibility-reviewer.md +0 -67
  135. package/presets/cursor/next/agents/api-contract-reviewer.md +0 -71
  136. package/presets/cursor/next/agents/build-verifier.md +0 -66
  137. package/presets/cursor/next/agents/ci-investigator.md +0 -64
  138. package/presets/cursor/next/agents/code-reviewer.md +0 -64
  139. package/presets/cursor/next/agents/debugger.md +0 -64
  140. package/presets/cursor/next/agents/feature-developer.md +0 -27
  141. package/presets/cursor/next/agents/migration-specialist.md +0 -71
  142. package/presets/cursor/next/agents/performance-auditor.md +0 -70
  143. package/presets/cursor/next/agents/playwright-test-generator.md +0 -26
  144. package/presets/cursor/next/agents/playwright-test-healer.md +0 -26
  145. package/presets/cursor/next/agents/playwright-test-planner.md +0 -28
  146. package/presets/cursor/next/agents/qa-tester.md +0 -57
  147. package/presets/cursor/next/agents/security-reviewer.md +0 -66
  148. package/presets/cursor/next/agents/solution-architect.md +0 -71
  149. package/presets/cursor/next/agents/task-analyst.md +0 -112
  150. package/presets/cursor/next/agents/task-router.md +0 -71
  151. package/presets/cursor/next/agents/tech-writer.md +0 -62
  152. package/presets/cursor/next/agents/unit-test-generator.md +0 -39
  153. package/presets/cursor/next/agents/unit-test-healer.md +0 -40
  154. package/presets/cursor/next/agents/unit-test-planner.md +0 -64
  155. package/presets/cursor/next/commands/feature-continue.md +0 -19
  156. package/presets/cursor/next/commands/feature-start.md +0 -33
  157. package/presets/cursor/next/commands/task-continue.md +0 -49
  158. package/presets/cursor/next/commands/task.md +0 -50
  159. package/presets/cursor/next/commands/technical-retro.md +0 -81
  160. package/presets/cursor/next/hooks/README.md +0 -8
  161. package/presets/cursor/next/hooks/chain-team-phases.sh +0 -380
  162. package/presets/cursor/next/hooks/guard-shell-command.sh +0 -77
  163. package/presets/cursor/next/hooks.json +0 -17
  164. package/presets/cursor/next/rules/agent-team-intake.mdc +0 -14
  165. package/presets/cursor/next/rules/agent-team-orchestrator.mdc +0 -139
  166. package/presets/cursor/next/rules/api-public-imports.mdc +0 -8
  167. package/presets/cursor/next/rules/arrow-functions.mdc +0 -46
  168. package/presets/cursor/next/rules/css-property-order-stylelint.mdc +0 -16
  169. package/presets/cursor/next/rules/feature-delivery-workflow.mdc +0 -76
  170. package/presets/cursor/next/rules/http-client.mdc +0 -42
  171. package/presets/cursor/next/rules/layer-barrel-exports.mdc +0 -59
  172. package/presets/cursor/next/rules/navigation-router-stack.mdc +0 -62
  173. package/presets/cursor/next/rules/next-app-router.mdc +0 -36
  174. package/presets/cursor/next/rules/no-cross-component-styles-import.mdc +0 -58
  175. package/presets/cursor/next/rules/no-type-assertion-as-import-export.mdc +0 -60
  176. package/presets/cursor/next/rules/package-manager.mdc +0 -16
  177. package/presets/cursor/next/rules/post-change-lint.mdc +0 -38
  178. package/presets/cursor/next/rules/public-imports.mdc +0 -48
  179. package/presets/cursor/next/rules/react-a11y-coding.mdc +0 -37
  180. package/presets/cursor/next/rules/reference-features.mdc +0 -39
  181. package/presets/cursor/next/rules/technical-retro.mdc +0 -12
  182. package/presets/cursor/next/rules/types-jsdoc.mdc +0 -42
  183. package/presets/cursor/next/rules/types-public-imports.mdc +0 -8
  184. package/presets/cursor/next/skills/README.md +0 -15
  185. package/presets/cursor/next/skills/ci-investigation/SKILL.md +0 -36
  186. package/presets/cursor/next/skills/code-review/SKILL.md +0 -26
  187. package/presets/cursor/next/skills/debug-investigation/SKILL.md +0 -28
  188. package/presets/cursor/next/skills/feature-delivery/SKILL.md +0 -15
  189. package/presets/cursor/next/skills/playwright-e2e/SKILL.md +0 -31
  190. package/presets/cursor/next/skills/technical-retro/SKILL.md +0 -40
  191. package/presets/cursor/next/skills/unit-testing/SKILL.md +0 -32
  192. package/presets/cursor/next/team/README.md +0 -104
  193. package/presets/cursor/next/team/tasks/.gitkeep +0 -0
@@ -0,0 +1,44 @@
1
+ # `.claude/rules` (preset ios-swift)
2
+
3
+ В Claude Code все `.md` под `rules/` **обнаруживаются рекурсивно**. Тела правил **derived** из Cursor SoT; индексы (этот README и папочные) — не второй SoT.
4
+
5
+ ## SoT sync
6
+
7
+ | Principle | Detail |
8
+ |-----------|--------|
9
+ | **SoT** | `presets/cursor/ios-swift/rules/*.mdc` — edit here first |
10
+ | **Derive** | Claude topic `.md` = body of matching `.mdc` + frontmatter `paths:` (from Cursor `globs:`) |
11
+ | **Drop** | Cursor-only keys (`alwaysApply`); keep short `description` where useful |
12
+ | **Do not** | Maintain independent long-form Claude prose that diverges in meaning |
13
+
14
+ **Checklist:** change Cursor `.mdc` → update Claude twin `.md` in the **same PR**.
15
+
16
+ ## Cursor → Claude mapping (12/12)
17
+
18
+ | Cursor `.mdc` (SoT) | Claude topic |
19
+ |---------------------|--------------|
20
+ | `ios-app-core.mdc` | `stack/ios-app-core.md` |
21
+ | `swift-conventions.mdc` | `stack/swift-conventions.md` |
22
+ | `architecture-boundaries.mdc` | `architecture/boundaries.md` |
23
+ | `feature-delivery-workflow.mdc` | `architecture/feature-delivery.md` |
24
+ | `networking-services.mdc` | `api-and-data/networking.md` |
25
+ | `swiftui-ui.mdc` | `ui-and-accessibility/swiftui.md` |
26
+ | `state-and-viewmodels.mdc` | `ui-and-accessibility/viewmodels.md` |
27
+ | `tests-unit.mdc` | `testing/unit.md` |
28
+ | `tests-ui.mdc` | `testing/ui.md` |
29
+ | `code-quality-and-refactoring.mdc` | `tooling-and-review/code-quality.md` |
30
+ | `code-review-mr.mdc` | `tooling-and-review/code-review.md` |
31
+ | `post-change-build.mdc` | `tooling-and-review/post-change-build.md` |
32
+
33
+ ## Folders
34
+
35
+ | Папка | О чём |
36
+ |-------|--------|
37
+ | `stack/` | Стек, структура проекта, Swift conventions |
38
+ | `architecture/` | Границы слоёв / DI, доставка фичи |
39
+ | `api-and-data/` | URLSession, DTO, Codable, mappers, repositories |
40
+ | `testing/` | unit (XCTest), UI (XCUITest) |
41
+ | `ui-and-accessibility/` | SwiftUI, Design System, ViewModels |
42
+ | `tooling-and-review/` | Качество кода, code review, post-change build |
43
+
44
+ Path-scoped rules use frontmatter `paths:` (same patterns as Cursor `globs:`). Rules without `paths:` apply broadly (Claude equivalent of Cursor alwaysApply / requestable).
@@ -0,0 +1,9 @@
1
+ # API and data
2
+
3
+ Сетевой слой, DTO, mappers, repository implementations. Index only — тела в topic `.md`.
4
+
5
+ | File | Cursor SoT |
6
+ |------|------------|
7
+ | [`networking.md`](./networking.md) | `networking-services.mdc` |
8
+
9
+ Sync: change Cursor → update Claude twin same PR. Full map: [`../README.md`](../README.md).
@@ -0,0 +1,49 @@
1
+ ---
2
+ description: Конвенции сетевого слоя, API-клиентов и mappers
3
+ paths:
4
+ - "**/{Data,Network,Networking}/**/*.swift"
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,10 @@
1
+ # Architecture
2
+
3
+ Границы слоёв Presentation / Domain / Data, DI, доставка фичи. Index only — тела в topic `.md`.
4
+
5
+ | File | Cursor SoT |
6
+ |------|------------|
7
+ | [`boundaries.md`](./boundaries.md) | `architecture-boundaries.mdc` |
8
+ | [`feature-delivery.md`](./feature-delivery.md) | `feature-delivery-workflow.mdc` |
9
+
10
+ Sync: change Cursor → update Claude twin same PR. Full map: [`../README.md`](../README.md).
@@ -0,0 +1,33 @@
1
+ ---
2
+ description: Архитектурные границы и правила зависимостей iOS приложения
3
+ ---
4
+
5
+ # Границы между слоями
6
+
7
+ - **Presentation** (Views, ViewModels, DesignSystem):
8
+ - Может: Domain (entities, use case protocols), DesignSystem, Core (без UI).
9
+ - Не должен: импортировать Data (репозитории, DTO, API-клиенты); знать HTTP/Codable/эндпоинты; маппить DTO → domain.
10
+ - **Domain**:
11
+ - Может: Core (базовые типы, протоколы).
12
+ - Не должен: импортировать SwiftUI, UIKit, сеть; знать конкретные реализации репозиториев.
13
+ - **Data**:
14
+ - Может: Domain (протоколы, entities), Core.
15
+ - Не должен: импортировать SwiftUI/UIKit; зависеть от View/ViewModel.
16
+
17
+ # Зависимости и модули
18
+
19
+ - Направление: **Presentation → Domain ← Data**.
20
+ - Переиспользуемое — в Core / DesignSystem; к другой фиче — только **public API** (протокол, facade, coordinator), не deep-import.
21
+ - SPM: Domain не линкуется с Data; реализации Data подключаются через DI в `App/`.
22
+ - Раскладка фичи — как в `stack/ios-app-core.md` / соседних `Features/*` репо (Presentation / Domain / Data + тесты).
23
+
24
+ # DI и composition root
25
+
26
+ - Сборка графа — в `App/` (или `DI/` / CompositionRoot), не во View.
27
+ - ViewModel получает **протоколы** (use case / repository), не конкретные Data-типы.
28
+ - Preview и тесты — mock/stub реализаций.
29
+
30
+ # Требование к агенту
31
+
32
+ - Файлы — в соответствующих слоях; протоколы репозиториев в Domain, реализации в Data.
33
+ - Не «коротить» слои (API из View «ради скорости»).
@@ -0,0 +1,60 @@
1
+ ---
2
+ description: Сквозной чеклист доставки iOS-фичи и матрица «зона → правило». Use when implementing features, adding screens/API, or extending existing iOS flows.
3
+ ---
4
+
5
+ # Доставка фичи (iOS)
6
+
7
+ Типичная фича с данными и UI. Детали слоёв — `architecture/boundaries.md`, `stack/ios-app-core.md`.
8
+
9
+ ## Чеклист (порядок работ)
10
+
11
+ 1. **Domain** — entities, value types, протоколы репозиториев / use cases (`Features/**/Domain/**`).
12
+ 2. **Data** — DTO (`Codable`), mappers Domain ↔ DTO, реализации репозиториев, API-клиент (`api-and-data/networking.md`).
13
+ 3. **ViewModel** — состояние, вызовы use case / протоколов; DI из App; без DTO и URL (`ui-and-accessibility/viewmodels.md`).
14
+ 4. **View / navigation** — тонкие SwiftUI Views, Design System; навигация как в репо (`ui-and-accessibility/swiftui.md`).
15
+ 5. **Тесты** — unit на mappers / use cases / VM (`testing/unit.md`); UI-потоки — XCUITest (`testing/ui.md`).
16
+ 6. **Завершение** — **`tooling-and-review/post-change-build.md`**: сборка затронутых таргетов + lint/format по конфигу репо.
17
+
18
+ ## Поток данных (ориентир)
19
+
20
+ ```mermaid
21
+ flowchart LR
22
+ DTO[DTO] --> Mappers[Mappers]
23
+ Mappers --> Domain[Domain]
24
+ Domain --> Repo[Repository protocol]
25
+ Repo --> VM[ViewModel]
26
+ VM --> View[SwiftUI View]
27
+ DataImpl[Data impl] -.-> Repo
28
+ ```
29
+
30
+ ## Частичные сценарии
31
+
32
+ | Задача | Минимум |
33
+ |--------|---------|
34
+ | Только API / модель | Domain + DTO + mapper + repo impl; unit на mapper. |
35
+ | Только VM / логика | Протоколы Domain; mock в тестах; без HTTP во View. |
36
+ | Только UI | View + существующий VM/state; без DTO. |
37
+ | Только тесты | Specs по конвенции репо; не менять production без нужды. |
38
+
39
+ ## Антипаттерны
40
+
41
+ - DTO / `Codable` transport-типы во View или ViewModel.
42
+ - `URLSession` / конкретный API-клиент в ViewModel или View.
43
+ - Domain импортирует SwiftUI / UIKit.
44
+ - Deep-import внутренних файлов другой фичи.
45
+ - Сборка DI внутри View.
46
+
47
+ ## Матрица: зона → правила
48
+
49
+ | Зона | Правила |
50
+ |------|---------|
51
+ | `Features/**/Domain/**`, `Core/Domain/**` | `architecture/boundaries.md`, `stack/ios-app-core.md` |
52
+ | `Features/**/Data/**`, `**/Network*/**` | `api-and-data/networking.md`, `architecture/boundaries.md` |
53
+ | `*ViewModel*.swift`, Presentation state | `ui-and-accessibility/viewmodels.md` |
54
+ | `Presentation/**`, `DesignSystem/**` | `ui-and-accessibility/swiftui.md`, `architecture/boundaries.md` |
55
+ | `**/*.swift` (стиль) | `stack/swift-conventions.md` |
56
+ | `*Tests/**` | `testing/unit.md` |
57
+ | `*UITests/**` | `testing/ui.md` |
58
+ | После правок Swift | `tooling-and-review/post-change-build.md` |
59
+
60
+ При добавлении или расширении фичи **пройти чеклист** и правила из таблицы для затронутых зон.
@@ -0,0 +1,10 @@
1
+ # Stack
2
+
3
+ Язык, платформа и базовый каркас приложения. Index only — тела в topic `.md`.
4
+
5
+ | File | Cursor SoT |
6
+ |------|------------|
7
+ | [`ios-app-core.md`](./ios-app-core.md) | `ios-app-core.mdc` |
8
+ | [`swift-conventions.md`](./swift-conventions.md) | `swift-conventions.mdc` |
9
+
10
+ Sync: change Cursor → update Claude twin same PR. Full map: [`../README.md`](../README.md).
@@ -0,0 +1,42 @@
1
+ ---
2
+ description: Базовые принципы, стек и структура iOS приложения на Swift (preset)
3
+ ---
4
+
5
+ # Стек и окружение
6
+
7
+ Версии Swift, iOS SDK, зависимостей и инструментов — **из Xcode-проекта, Package.swift и конфигов целевого репозитория**. Рамка preset:
8
+
9
+ - **Язык / платформа:** Swift, iOS (min — из таргета).
10
+ - **UI:** SwiftUI — приоритет для нового кода; UIKit — где уже принято в репо.
11
+ - **Сборка:** Xcode; SPM и/или CocoaPods — как в репозитории.
12
+ - **Concurrency:** `async`/`await`, `Task`, `Actor`; UI — `@MainActor`.
13
+ - **Тесты:** XCTest или Swift Testing; UI — XCUITest.
14
+ - **Сеть:** `URLSession` или клиент репо; DTO через `Codable`.
15
+ - **Дизайн-система:** токены/примитивы из `DesignSystem/` (или аналога); без «магических» значений.
16
+ - **Наблюдаемость:** только если уже в проекте — централизованно.
17
+
18
+ # Структура проекта
19
+
20
+ Ориентир — **feature-first + слои внутри фичи** или **слои на верхнем уровне** (как в репо):
21
+
22
+ - `App/` — `@main`, composition root, DI, навигация верхнего уровня.
23
+ - `Features/<FeatureName>/` — `Presentation/` (Views, ViewModels), `Domain/` (entities, use cases, протоколы), `Data/` (repos, API, DTO, mappers).
24
+ - `Core/` — общие утилиты, extensions, базовые ошибки.
25
+ - `DesignSystem/` — UI-примитивы без бизнес-логики.
26
+ - `Tests/` / `*Tests/` — unit и UI по конвенции Xcode.
27
+
28
+ Новые файлы — в том же слое/модуле, что и аналогичная функциональность.
29
+
30
+ Границы зависимостей и DI — **`architecture/boundaries.md`**.
31
+
32
+ # Swift и качество
33
+
34
+ - Swift API Design Guidelines + SwiftLint/SwiftFormat репо (если есть).
35
+ - Избегать `!` / `try!` в production; `guard` / `if let` / typed errors.
36
+ - Копировать существующие паттерны фичи/слоя.
37
+
38
+ # Работа агента
39
+
40
+ - Определить слой (Presentation / Domain / Data / DesignSystem / Tests); повторить паттерн соседних файлов.
41
+ - Не тянуть `URLSession` во View и DTO во ViewModel — детали в `architecture/boundaries.md`.
42
+ - Доставка фичи — `architecture/feature-delivery.md`; после правок Swift — `tooling-and-review/post-change-build.md`.
@@ -0,0 +1,51 @@
1
+ ---
2
+ description: Swift language conventions and safety (preset)
3
+ paths:
4
+ - "**/*.swift"
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,10 @@
1
+ # Testing
2
+
3
+ Unit (XCTest / Swift Testing) и UI (XCUITest). Index only — тела в topic `.md`.
4
+
5
+ | File | Cursor SoT |
6
+ |------|------------|
7
+ | [`unit.md`](./unit.md) | `tests-unit.mdc` |
8
+ | [`ui.md`](./ui.md) | `tests-ui.mdc` |
9
+
10
+ Sync: change Cursor → update Claude twin same PR. Full map: [`../README.md`](../README.md).
@@ -0,0 +1,41 @@
1
+ ---
2
+ description: UI-тесты XCUITest и accessibility identifiers
3
+ paths:
4
+ - "**/*UITests/**/*.swift"
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-слоем (`ui-and-accessibility/swiftui.md`): `{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
+ paths:
4
+ - "**/*Tests/**/*.swift"
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, не дублировать типы в тестах.
@@ -0,0 +1,11 @@
1
+ # Tooling and review
2
+
3
+ Качество кода, code review MR, сборка/lint после правок. Index only — тела в topic `.md`.
4
+
5
+ | File | Cursor SoT |
6
+ |------|------------|
7
+ | [`code-quality.md`](./code-quality.md) | `code-quality-and-refactoring.mdc` |
8
+ | [`code-review.md`](./code-review.md) | `code-review-mr.mdc` |
9
+ | [`post-change-build.md`](./post-change-build.md) | `post-change-build.mdc` |
10
+
11
+ Sync: change Cursor → update Claude twin same PR. Full map: [`../README.md`](../README.md).
@@ -0,0 +1,38 @@
1
+ ---
2
+ description: Поддержка и улучшение качества кода и архитектуры iOS
3
+ ---
4
+
5
+ # Поддержка существующего стиля
6
+
7
+ - Новые изменения должны:
8
+ - следовать существующим паттернам (имена, структура, DI, error handling);
9
+ - минимизировать «стилистический шум» (лишний reformat, rename без нужды).
10
+ - Перед новым решением:
11
+ - искать аналог в коде и **повторять подход**;
12
+ - проверять DesignSystem и существующие компоненты перед новым UI-контролом;
13
+ - обращаться к другим фичам только через public API (протоколы, facades).
14
+
15
+ # Рефакторинг при изменениях
16
+
17
+ - Допустим лёгкий refactor, если он:
18
+ - уменьшает дублирование;
19
+ - повышает читаемость;
20
+ - не ломает публичные контракты.
21
+ - Примеры:
22
+ - вынести дублирующийся mapper или validation;
23
+ - заменить force unwrap на безопасные конструкции;
24
+ - разбить перегруженный ViewModel на use cases;
25
+ - заменить magic numbers/colors на design tokens;
26
+ - убрать прямую зависимость View от Data в пользу протокола.
27
+
28
+ # Ограничения
29
+
30
+ - Не делать «большой» рефакторинг при точечной задаче:
31
+ - не менять структуру модулей/таргетов;
32
+ - не переименовывать public API без запроса.
33
+ - Крупные изменения — минимальными шагами, код остаётся компилируемым.
34
+
35
+ # Требование к агенту
36
+
37
+ - **Boy scout rule:** оставлять модуль чуть лучше (безопасность optional, typed errors, tests).
38
+ - Не жертвовать слоями ради краткости.
@@ -0,0 +1,41 @@
1
+ ---
2
+ description: Требования к code review для iOS merge requests. Use when reviewing MR/diff/PR, evaluating a branch, or when the user asks for code review.
3
+ ---
4
+
5
+ # Code review merge requests
6
+
7
+ On-demand правило для review-потоков (не always-on).
8
+
9
+ - **Когда применять**
10
+ - Запросы: «проведи ревью», «оцени MR/ветку/дифф», «посмотри изменения».
11
+ - Опираться на локальный репозиторий: ветка, `git diff`, открытые файлы.
12
+
13
+ - **Что обязан проверить агент**
14
+ - **Архитектура и слои** (`architecture/boundaries.md`, `stack/ios-app-core.md`):
15
+ - View не вызывает API и не знает DTO.
16
+ - ViewModel не зависит от Data-реализаций напрямую.
17
+ - Domain не импортирует SwiftUI/UIKit.
18
+ - Data не тянет Presentation.
19
+ - **Зависимости и модули**:
20
+ - DI через протоколы; composition root в App.
21
+ - Нет deep-import между фичами.
22
+ - Файлы в правильных слоях (`Presentation`, `Domain`, `Data`, `DesignSystem`).
23
+ - **Swift и concurrency** (`stack/swift-conventions.md`):
24
+ - `@MainActor` на UI; нет необоснованных force unwrap.
25
+ - Typed errors; корректная отмена Task где нужно.
26
+ - **UI** (`ui-and-accessibility/swiftui.md`):
27
+ - Тонкие Views; Design System tokens; accessibility identifiers для тестируемых элементов.
28
+ - **Сеть и data** (`api-and-data/networking.md`):
29
+ - DTO отделены от domain; mappers покрывают edge cases.
30
+ - **Тесты**:
31
+ - Нетривиальная логика — unit (`testing/unit.md`); пользовательские потоки — UI (`testing/ui.md`).
32
+ - Указать, какие тесты добавить или обновить.
33
+
34
+ - **Глубина и формат**
35
+ - Фокус на **диффе MR**, не на всём проекте.
36
+ - Сначала обзор (цель MR, риски), затем конкретные комментарии с файлом и предложением fix по паттернам репо.
37
+ - Без «больших рефакторингов» без запроса (`tooling-and-review/code-quality.md`).
38
+
39
+ - **Ограничения**
40
+ - Не выдумывать метаданные CI/MR с хостинга без локальных данных.
41
+ - Boy scout rule в рамках MR.
@@ -0,0 +1,31 @@
1
+ ---
2
+ description: Сборка и lint после изменений Swift/iOS кода. Use after editing iOS/Swift sources, Xcode targets, or Package.swift.
3
+ ---
4
+
5
+ # Сборка и lint после изменений
6
+
7
+ ## Когда применять
8
+
9
+ После изменений исходников Swift / проектных файлов Xcode / `Package.swift`, влияющих на компиляцию или стиль.
10
+
11
+ Исключения: только документация, README, `.cursor/rules/**` без правок app-кода.
12
+
13
+ **Pipeline:** если следующий шаг — отдельный verifier/CI-агент, достаточно затронутых таргетов; в single-agent режиме — полный разумный прогон как в репо.
14
+
15
+ ## Как определить команды
16
+
17
+ 1. Схемы / таргеты — из `.xcodeproj` / `.xcworkspace` / `Package.swift` (как в CI или соседних скриптах).
18
+ 2. Lint — `SwiftLint` / `.swiftlint.yml`, если есть.
19
+ 3. Format — `SwiftFormat` / конфиг, если принято в репо.
20
+ 4. Тесты — XCTest или Swift Testing — только если задача их затрагивает.
21
+
22
+ Не угадывать чужой toolchain: копировать флаги/`xcodebuild` из Makefile, scripts, CI.
23
+
24
+ ## Алгоритм
25
+
26
+ 1. Завершить правки.
27
+ 2. Собрать **затронутые** таргеты (`xcodebuild` / `swift build` — как в репо).
28
+ 3. Прогнать lint/format при наличии конфигов; исправить ошибки в файлах задачи.
29
+ 4. Повторить до чистой сборки или зафиксировать блокер пользователю.
30
+
31
+ **Errors** — обязательно; warnings в файлах задачи — по возможности до нуля.
@@ -0,0 +1,10 @@
1
+ # UI and accessibility
2
+
3
+ SwiftUI Views, Design System, ViewModels. Index only — тела в topic `.md`.
4
+
5
+ | File | Cursor SoT |
6
+ |------|------------|
7
+ | [`swiftui.md`](./swiftui.md) | `swiftui-ui.mdc` |
8
+ | [`viewmodels.md`](./viewmodels.md) | `state-and-viewmodels.mdc` |
9
+
10
+ Sync: change Cursor → update Claude twin same PR. Full map: [`../README.md`](../README.md).
@@ -0,0 +1,61 @@
1
+ ---
2
+ description: Паттерны SwiftUI, View и Design System (preset)
3
+ paths:
4
+ - "**/{Presentation,DesignSystem}/**/*.swift"
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` на ключевых элементах (согласовать с `testing/ui.md`).
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 строк или повторяется.