@bonesofspring/ai-rules 0.2.1 → 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 -20
- package/bin/cli.js +73 -260
- package/package.json +4 -13
- 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 -33
- package/presets/claude/next/README.md +0 -10
- package/presets/claude/next/agents/README.md +0 -126
- package/presets/claude/next/agents/playwright-test-generator.md +65 -16
- package/presets/claude/next/agents/playwright-test-healer.md +51 -16
- package/presets/claude/next/agents/playwright-test-planner.md +55 -15
- 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 -29
- package/presets/claude/next/rules/api-and-data/README.md +1 -7
- package/presets/claude/next/rules/architecture/README.md +2 -10
- package/presets/claude/next/rules/stack/README.md +1 -10
- 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 -7
- 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 -67
- 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 +40 -21
- 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 -33
- 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/CONTRIBUTING.md +0 -102
- package/fragments/BUGBOT.md +0 -23
- package/presets/claude/next/BUGBOT.md +0 -16
- 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 -94
- 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/hooks.json +0 -17
- 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-ui.md +0 -15
- package/presets/claude/next/rules/architecture/architecture-boundaries.md +0 -75
- 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-ui.md +0 -15
- package/presets/claude/next/rules/stack/navigation-router.md +0 -62
- 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 -140
- 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 -30
- 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/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 -91
- 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 -47
- package/presets/claude/next/team/fixtures/bugfix-standard.json +0 -15
- package/presets/claude/next/team/fixtures/feature-full.json +0 -16
- package/presets/claude/next/team/fixtures/feature-light.json +0 -17
- package/presets/claude/next/team/tasks/.gitkeep +0 -1
- package/presets/cursor/next/AGENTS.md +0 -36
- package/presets/cursor/next/BUGBOT.md +0 -16
- package/presets/cursor/next/agents/README.md +0 -159
- 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 -95
- 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/architecture-boundaries-ui.mdc +0 -15
- 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/navigation-router-ui.mdc +0 -16
- package/presets/cursor/next/rules/next-app-router.mdc +0 -36
- package/presets/cursor/next/rules/no-cross-component-styles-import.mdc +0 -8
- 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 -105
- package/presets/cursor/next/team/fixtures/bugfix-standard.json +0 -15
- package/presets/cursor/next/team/fixtures/feature-full.json +0 -16
- package/presets/cursor/next/team/fixtures/feature-light.json +0 -17
- package/presets/cursor/next/team/tasks/.gitkeep +0 -0
- package/scripts/README.md +0 -84
- package/scripts/golden-prompts.json +0 -276
- package/scripts/preset-manifest.json +0 -72
- package/scripts/regression-results/.gitkeep +0 -0
- package/scripts/validate-preset.sh +0 -484
|
@@ -1,16 +1,3 @@
|
|
|
1
1
|
# Tooling and review
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
| Файл | Содержание |
|
|
6
|
-
|------|------------|
|
|
7
|
-
| `package-manager.md` | yarn / pnpm / npm / bun — определить по lockfile |
|
|
8
|
-
| `agent-team-intake.md` | Когда предлагать `/task` и router pipeline |
|
|
9
|
-
| `agent-team-orchestrator.md` | Dynamic agent team workflow: router, pipeline, gates |
|
|
10
|
-
| `post-change-lint.md` | Обязательный `lint:js` + `lint:css` после изменений |
|
|
11
|
-
| `code-quality.md` | Boy scout rule, рефакторинг, ESLint |
|
|
12
|
-
| `code-review-mr.md` | Чеклист ревью merge request |
|
|
13
|
-
|
|
14
|
-
Все — **session start**.
|
|
15
|
-
|
|
16
|
-
On-demand: **`commands/technical-retro.md`** (фасилитация ретро, не грузится как rule).
|
|
3
|
+
Рефакторинг, качество кода, процесс ревью MR.
|
|
@@ -1,9 +1,3 @@
|
|
|
1
1
|
# UI and accessibility
|
|
2
2
|
|
|
3
|
-
Компоненты, стили,
|
|
4
|
-
|
|
5
|
-
| Файл | Содержание | Загрузка |
|
|
6
|
-
|------|------------|----------|
|
|
7
|
-
| `no-props-spread.md` | Явные пропсы, без `{...props}` | session start |
|
|
8
|
-
| `css-property-order.md` | Порядок CSS (Stylelint idiomatic-order) | `paths: styles.ts`, `.css` |
|
|
9
|
-
| `react-ui.md` | Структура компонентов, `.data.ts`, хуки | `paths: app/src/ui/**` |
|
|
3
|
+
Компоненты, стили, доступность, паттерны React UI.
|
|
@@ -1,15 +1,5 @@
|
|
|
1
1
|
# `.claude/skills` (preset next)
|
|
2
2
|
|
|
3
|
-
[Skills](https://code.claude.com/docs/en/skills) в Claude Code — сценарии, которые подгружаются по необходимости, а не в каждой сессии целиком.
|
|
4
|
-
|
|
5
|
-
| Skill | Когда использовать |
|
|
6
|
-
|-------|--------------------|
|
|
7
|
-
| `feature-delivery` | End-to-end feature work across types, API, store, UI, tests |
|
|
8
|
-
| `code-review` | MR/diff review using project architecture and test standards |
|
|
9
|
-
| `debug-investigation` | Reproducing and fixing bugs with root-cause evidence |
|
|
10
|
-
| `ci-investigation` | Diagnosing and fixing failing CI checks on PRs/branches |
|
|
11
|
-
| `unit-testing` | Planning, generating, or healing unit test coverage |
|
|
12
|
-
| `playwright-e2e` | Planning, generating, or healing Playwright e2e coverage |
|
|
13
|
-
| `technical-retro` | Technical retrospective for a task, sprint, incident, or agent pipeline |
|
|
3
|
+
[Skills](https://code.claude.com/docs/en/skills) в Claude Code — сценарии, которые подгружаются по необходимости, а не в каждой сессии целиком. Добавьте сюда `SKILL.md` или структуру skills по документации инструмента.
|
|
14
4
|
|
|
15
5
|
Папка копируется в `.claude/skills/` при `ai-rules init claude --preset next`, если существует.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# iOS Swift preset (Cursor)
|
|
2
|
+
|
|
3
|
+
Правила для разработки iOS-приложений на Swift (SwiftUI, MVVM/Clean Architecture).
|
|
4
|
+
|
|
5
|
+
Установка:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npx @bonesofspring/ai-rules init cursor --preset ios-swift
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
См. `rules/README.md` — карта `.mdc` и бюджет alwaysApply.
|
|
12
|
+
|
|
13
|
+
Ключевые requestable-правила доставки:
|
|
14
|
+
|
|
15
|
+
- `feature-delivery-workflow.mdc` — порядок слоёв при реализации фичи
|
|
16
|
+
- `post-change-build.mdc` — сборка / lint после правок Swift
|
|
17
|
+
- `code-review-mr.mdc` — ревью MR/diff (не always-on)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
### Разница .mdc и .md в .cursor/rules
|
|
2
|
+
|
|
3
|
+
#### .md
|
|
4
|
+
Обычный markdown‑файл. Cursor видит его как документацию/контент, но не как правило, которое нужно автоматически применять.
|
|
5
|
+
|
|
6
|
+
#### .mdc
|
|
7
|
+
Специальный формат Cursor Rule:
|
|
8
|
+
- сверху обязателен YAML‑frontmatter с полями вроде description, globs, alwaysApply;
|
|
9
|
+
- файл лежит в .cursor/rules/;
|
|
10
|
+
- Cursor интерпретирует его как конфигурацию поведения ассистента для этого репо (автоматически подмешивает содержимое в контекст, когда правило подходит).
|
|
11
|
+
|
|
12
|
+
- То есть .mdc = “markdown + config для Cursor”, .md = просто текст без управляющего смысла для ассистента.
|
|
13
|
+
|
|
14
|
+
### Пресет ios-swift — карта правил
|
|
15
|
+
|
|
16
|
+
**alwaysApply budget:** целевой потолок — **≤3** always-on правила и **≤130** строк тела (после YAML) суммарно. Новые alwaysApply только вместе с сокращением существующего бюджета.
|
|
17
|
+
|
|
18
|
+
| Файл | Скоуп | Тема |
|
|
19
|
+
|------|--------|------|
|
|
20
|
+
| `ios-app-core.mdc` | always | Стек, структура проекта, tips агента |
|
|
21
|
+
| `architecture-boundaries.mdc` | always | Границы Presentation / Domain / Data, DI |
|
|
22
|
+
| `code-quality-and-refactoring.mdc` | always | Качество и лёгкий refactor |
|
|
23
|
+
| `code-review-mr.mdc` | requestable / on review | Ревью MR/diff/PR |
|
|
24
|
+
| `feature-delivery-workflow.mdc` | requestable / on feature | Чеклист доставки фичи |
|
|
25
|
+
| `post-change-build.mdc` | requestable / after Swift edits | Сборка, SwiftLint/Format |
|
|
26
|
+
| `swiftui-ui.mdc` | Presentation, DesignSystem | SwiftUI, a11y, Design System |
|
|
27
|
+
| `networking-services.mdc` | Data, Network | API, DTO, mappers |
|
|
28
|
+
| `state-and-viewmodels.mdc` | ViewModels | State, use cases, DI |
|
|
29
|
+
| `swift-conventions.mdc` | `**/*.swift` | Swift style, concurrency |
|
|
30
|
+
| `tests-unit.mdc` | `*Tests` | Unit / integration |
|
|
31
|
+
| `tests-ui.mdc` | `*UITests` | XCUITest |
|
|
32
|
+
|
|
33
|
+
Установка: `npx @bonesofspring/ai-rules init cursor --preset ios-swift`
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Архитектурные границы и правила зависимостей iOS приложения
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Границы между слоями
|
|
7
|
+
|
|
8
|
+
- **Presentation** (Views, ViewModels, DesignSystem):
|
|
9
|
+
- Может: Domain (entities, use case protocols), DesignSystem, Core (без UI).
|
|
10
|
+
- Не должен: импортировать Data (репозитории, DTO, API-клиенты); знать HTTP/Codable/эндпоинты; маппить DTO → domain.
|
|
11
|
+
- **Domain**:
|
|
12
|
+
- Может: Core (базовые типы, протоколы).
|
|
13
|
+
- Не должен: импортировать SwiftUI, UIKit, сеть; знать конкретные реализации репозиториев.
|
|
14
|
+
- **Data**:
|
|
15
|
+
- Может: Domain (протоколы, entities), Core.
|
|
16
|
+
- Не должен: импортировать SwiftUI/UIKit; зависеть от View/ViewModel.
|
|
17
|
+
|
|
18
|
+
# Зависимости и модули
|
|
19
|
+
|
|
20
|
+
- Направление: **Presentation → Domain ← Data**.
|
|
21
|
+
- Переиспользуемое — в Core / DesignSystem; к другой фиче — только **public API** (протокол, facade, coordinator), не deep-import.
|
|
22
|
+
- SPM: Domain не линкуется с Data; реализации Data подключаются через DI в `App/`.
|
|
23
|
+
- Раскладка фичи — как в `ios-app-core.mdc` / соседних `Features/*` репо (Presentation / Domain / Data + тесты).
|
|
24
|
+
|
|
25
|
+
# DI и composition root
|
|
26
|
+
|
|
27
|
+
- Сборка графа — в `App/` (или `DI/` / CompositionRoot), не во View.
|
|
28
|
+
- ViewModel получает **протоколы** (use case / repository), не конкретные Data-типы.
|
|
29
|
+
- Preview и тесты — mock/stub реализаций.
|
|
30
|
+
|
|
31
|
+
# Требование к агенту
|
|
32
|
+
|
|
33
|
+
- Файлы — в соответствующих слоях; протоколы репозиториев в Domain, реализации в Data.
|
|
34
|
+
- Не «коротить» слои (API из View «ради скорости»).
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Поддержка и улучшение качества кода и архитектуры iOS
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Поддержка существующего стиля
|
|
7
|
+
|
|
8
|
+
- Новые изменения должны:
|
|
9
|
+
- следовать существующим паттернам (имена, структура, DI, error handling);
|
|
10
|
+
- минимизировать «стилистический шум» (лишний reformat, rename без нужды).
|
|
11
|
+
- Перед новым решением:
|
|
12
|
+
- искать аналог в коде и **повторять подход**;
|
|
13
|
+
- проверять DesignSystem и существующие компоненты перед новым UI-контролом;
|
|
14
|
+
- обращаться к другим фичам только через public API (протоколы, facades).
|
|
15
|
+
|
|
16
|
+
# Рефакторинг при изменениях
|
|
17
|
+
|
|
18
|
+
- Допустим лёгкий refactor, если он:
|
|
19
|
+
- уменьшает дублирование;
|
|
20
|
+
- повышает читаемость;
|
|
21
|
+
- не ломает публичные контракты.
|
|
22
|
+
- Примеры:
|
|
23
|
+
- вынести дублирующийся mapper или validation;
|
|
24
|
+
- заменить force unwrap на безопасные конструкции;
|
|
25
|
+
- разбить перегруженный ViewModel на use cases;
|
|
26
|
+
- заменить magic numbers/colors на design tokens;
|
|
27
|
+
- убрать прямую зависимость View от Data в пользу протокола.
|
|
28
|
+
|
|
29
|
+
# Ограничения
|
|
30
|
+
|
|
31
|
+
- Не делать «большой» рефакторинг при точечной задаче:
|
|
32
|
+
- не менять структуру модулей/таргетов;
|
|
33
|
+
- не переименовывать public API без запроса.
|
|
34
|
+
- Крупные изменения — минимальными шагами, код остаётся компилируемым.
|
|
35
|
+
|
|
36
|
+
# Требование к агенту
|
|
37
|
+
|
|
38
|
+
- **Boy scout rule:** оставлять модуль чуть лучше (безопасность optional, typed errors, tests).
|
|
39
|
+
- Не жертвовать слоями ради краткости.
|
|
@@ -0,0 +1,42 @@
|
|
|
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
|
+
alwaysApply: false
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Code review merge requests
|
|
7
|
+
|
|
8
|
+
On-demand правило для review-потоков (не always-on).
|
|
9
|
+
|
|
10
|
+
- **Когда применять**
|
|
11
|
+
- Запросы: «проведи ревью», «оцени MR/ветку/дифф», «посмотри изменения».
|
|
12
|
+
- Опираться на локальный репозиторий: ветка, `git diff`, открытые файлы.
|
|
13
|
+
|
|
14
|
+
- **Что обязан проверить агент**
|
|
15
|
+
- **Архитектура и слои** (`architecture-boundaries.mdc`, `ios-app-core.mdc`):
|
|
16
|
+
- View не вызывает API и не знает DTO.
|
|
17
|
+
- ViewModel не зависит от Data-реализаций напрямую.
|
|
18
|
+
- Domain не импортирует SwiftUI/UIKit.
|
|
19
|
+
- Data не тянет Presentation.
|
|
20
|
+
- **Зависимости и модули**:
|
|
21
|
+
- DI через протоколы; composition root в App.
|
|
22
|
+
- Нет deep-import между фичами.
|
|
23
|
+
- Файлы в правильных слоях (`Presentation`, `Domain`, `Data`, `DesignSystem`).
|
|
24
|
+
- **Swift и concurrency** (`swift-conventions.mdc`):
|
|
25
|
+
- `@MainActor` на UI; нет необоснованных force unwrap.
|
|
26
|
+
- Typed errors; корректная отмена Task где нужно.
|
|
27
|
+
- **UI** (`swiftui-ui.mdc`):
|
|
28
|
+
- Тонкие Views; Design System tokens; accessibility identifiers для тестируемых элементов.
|
|
29
|
+
- **Сеть и data** (`networking-services.mdc`):
|
|
30
|
+
- DTO отделены от domain; mappers покрывают edge cases.
|
|
31
|
+
- **Тесты**:
|
|
32
|
+
- Нетривиальная логика — unit (`tests-unit.mdc`); пользовательские потоки — UI (`tests-ui.mdc`).
|
|
33
|
+
- Указать, какие тесты добавить или обновить.
|
|
34
|
+
|
|
35
|
+
- **Глубина и формат**
|
|
36
|
+
- Фокус на **диффе MR**, не на всём проекте.
|
|
37
|
+
- Сначала обзор (цель MR, риски), затем конкретные комментарии с файлом и предложением fix по паттернам репо.
|
|
38
|
+
- Без «больших рефакторингов» без запроса (`code-quality-and-refactoring.mdc`).
|
|
39
|
+
|
|
40
|
+
- **Ограничения**
|
|
41
|
+
- Не выдумывать метаданные CI/MR с хостинга без локальных данных.
|
|
42
|
+
- Boy scout rule в рамках MR.
|
|
@@ -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 как эталону.
|