@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
|
@@ -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,70 +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
|
-
### UI edit bundle (consolidated globs)
|
|
28
|
-
|
|
29
|
-
При правке `app/src/ui/**/*.tsx` подгружается **уменьшенный** набор (не весь `app/src/**`):
|
|
30
|
-
|
|
31
|
-
| Rule | Globs | Назначение |
|
|
32
|
-
|------|-------|------------|
|
|
33
|
-
| `react-ui.mdc` | `app/src/ui/**` | Структура, стили, пропсы |
|
|
34
|
-
| `architecture-boundaries-ui.mdc` | `app/src/ui/**` | Slim границы UI-слоя |
|
|
35
|
-
| `react-a11y-coding.mdc` | `app/src/ui/**` | A11y |
|
|
36
|
-
| `navigation-router-ui.mdc` | `app/src/ui/**/*.tsx` | Краткий ориентир навигации |
|
|
37
|
-
| `no-props-spread.mdc` | `app/src/**/*.tsx` | Явные пропсы |
|
|
38
|
-
| `arrow-functions.mdc` | `app/src/**` | Синтаксис |
|
|
39
|
-
|
|
40
|
-
**Не грузятся на типичный UI edit:** `architecture-boundaries` (api/store/types/lib), `layer-barrel-exports` (только `index.ts`), `navigation-router-stack` (только `app/src/app/**`), `no-cross-component-styles-import` (consolidated в `react-ui`).
|
|
41
|
-
|
|
42
|
-
`css-property-order-stylelint.mdc` — только на `styles.ts` / `.css`.
|
|
43
|
-
|
|
44
|
-
### Эталонные фичи
|
|
45
|
-
|
|
46
|
-
Заполните **`reference-features.mdc`** (TBD → реальные пути) после `init` в целевом репо.
|
|
47
|
-
|
|
48
|
-
### Каталог ключевых правил
|
|
49
|
-
|
|
50
|
-
| Файл | Назначение |
|
|
51
|
-
|------|------------|
|
|
52
|
-
| `reference-features.mdc` | Эталонные пути UI/store/API/types/tests |
|
|
53
|
-
| `next-app-router.mdc` | App Router, RSC, loading/error |
|
|
54
|
-
| `react-a11y-coding.mdc` | A11y при написании UI |
|
|
55
|
-
| `feature-delivery-workflow.mdc` | Сквозной чеклист (on-demand, не always-on) |
|
|
56
|
-
| `agent-team-intake.mdc` | Подсказка `/task` при work-запросе (on-demand, через orchestrator) |
|
|
57
|
-
| `package-manager.mdc` | Перед `install` / `run` в терминале определить менеджер пакетов репо (lockfile, `packageManager`) и использовать только его |
|
|
58
|
-
| `agent-team-orchestrator.mdc` | `/task`, router, `pipeline.json`, build-verifier, parallel steps |
|
|
59
|
-
| `next-app-core.mdc` | Стек, слои, карта каталогов (alwaysApply) |
|
|
60
|
-
| `post-change-lint.mdc` | **Обязательный** прогон ESLint + Stylelint после любых изменений кода |
|
|
61
|
-
| `architecture-boundaries-ui.mdc` | Slim границы UI при правках компонентов |
|
|
62
|
-
| `architecture-boundaries.mdc` | Полная карта UI / store / API (api, store, types, lib) |
|
|
63
|
-
| `navigation-router-ui.mdc` | Навигация в UI-компонентах (slim) |
|
|
64
|
-
| `navigation-router-stack.mdc` | Полный аудит стека навигации (App Router / SPA) |
|
|
65
|
-
| `http-client.mdc` | Один HTTP‑стек, контракты из `@/types`, без разбросанного низкоуровневого API |
|
|
66
|
-
| `api-services.mdc` | Сервисы, мапперы, вызовы через прикладные API‑клиенты |
|
|
67
|
-
| `store-rtk.mdc` | Redux Toolkit, thunk’и, типизация ошибок/ответов как в коде репо |
|
|
68
|
-
| `public-imports.mdc` | Импорты `@/types`, `@/types/enums`, `@/api` (вне `app/src/api/**`); stubs: `types-public-imports.mdc`, `api-public-imports.mdc` |
|
|
69
|
-
| `layer-barrel-exports.mdc` | Двухуровневые barrel для слоёв с public API (`@/api`, `@/types`, `@/core`, …) |
|
|
70
|
-
| `types-jsdoc.mdc` | JSDoc для типов в `app/src/types` (русский текст, `[computed]`, без `@param`/`@returns`) |
|
|
71
|
-
| `no-type-assertion-as-import-export.mdc` | Ограничение `as`, в т.ч. `instanceof` для ошибок транспорта в `catch` |
|
|
72
|
-
| `code-review-mr.mdc` | Чеклист ревью MR, в т.ч. HTTP‑клиент и тесты |
|
|
73
|
-
| `tests-unit.mdc` | Unit‑тесты и behavior‑тесты HTTP‑клиента |
|
|
74
|
-
| `playwright-agents.mdc`, `tests-e2e-structure.mdc` | E2E |
|
|
75
|
-
| `react-ui.mdc` | React/Next UI: структура компонентов, соседние `ComponentName.data.ts` / `.utils.ts`, стили, пропсы |
|
|
76
|
-
|
|
77
|
-
**Коллизии формулировок:** импорт типов и API — источник правды **`public-imports.mdc`**; дублирует ESLint `no-restricted-imports` в `app/eslint.config.mjs`.
|
|
78
|
-
|
|
79
|
-
Задачи на **сеть, замену 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
|
|
|
@@ -1,61 +1,42 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Архитектурные границы и правила импортов
|
|
3
|
-
|
|
4
|
-
alwaysApply: false
|
|
3
|
+
alwaysApply: true
|
|
5
4
|
---
|
|
6
5
|
|
|
7
6
|
# Границы между слоями
|
|
8
7
|
|
|
9
|
-
- **UI (
|
|
10
|
-
- Может импортировать: `@/ui/**`, `@/store/**`,
|
|
8
|
+
- **UI (src/ui/**)**:
|
|
9
|
+
- Может импортировать: `@/ui/**`, `@/store/**`, `@/types/**`, `@/api/services/**` (через публичные интерфейсы).
|
|
11
10
|
- Не должен:
|
|
12
11
|
- обращаться к HTTP‑клиенту напрямую;
|
|
13
12
|
- знать детали DTO backend — только доменные типы.
|
|
14
|
-
- **Store (
|
|
15
|
-
- Может импортировать: `@/store/**`,
|
|
13
|
+
- **Store (src/store/**)**:
|
|
14
|
+
- Может импортировать: `@/store/**`, `@/api/services/**`, `@/types/**`.
|
|
16
15
|
- Не должен:
|
|
17
16
|
- зависеть от конкретных UI‑компонентов;
|
|
18
17
|
- напрямую работать с global/window API.
|
|
19
|
-
|
|
20
|
-
-
|
|
21
|
-
- Внутри слоя: типы из `@/types` и enum из `@/types/enums` (**`public-imports.mdc`**); импорты `@/api/services/**`, `@/api/clients/**`, относительные пути между файлами слоя (`http-client.mdc`, `api-services.mdc`).
|
|
18
|
+
- **API (src/api/services/**)**:
|
|
19
|
+
- Может импортировать: `@/types/**`, общие утилиты.
|
|
22
20
|
- Не должен:
|
|
23
21
|
- тянуть в себя UI или store;
|
|
24
22
|
- смешивать HTTP‑слой и доменный слой — использовать мапперы.
|
|
25
23
|
|
|
26
|
-
## UI и обращение к API (`@/api`)
|
|
27
|
-
|
|
28
|
-
- По умолчанию сценарии с **изменением серверного состояния** и координация нескольких шагов — через **store** (`createAsyncThunk`, dispatch, паттерн фичи в репозитории).
|
|
29
|
-
- Прямой вызов методов сервисов, импортированных из **`@/api`**, из UI допустим только в **узких случаях**: преимущественно **чтение** или действие **без необходимости держать результат в Redux**; те же **доменные типы**, что использовал бы thunk; **не** дублировать уже существующий сценарий из store и **не** протаскивать DTO в компоненты.
|
|
30
|
-
- Предпочтительно оформлять такие вызовы так же, как в **соседних фичах** репозитория (хук‑фасад, отдельный хук и т.д.).
|
|
31
|
-
|
|
32
|
-
## Порты и адаптеры (краткая карта)
|
|
33
|
-
|
|
34
|
-
- **Входящий адаптер**: UI — ввод пользователя, отображение; зависит от store и доменных типов, не от транспорта.
|
|
35
|
-
- **Оркестрация сценариев**: store (slices, thunk) — вызывает сервисы, кладёт в state **доменные** модели после маппинга.
|
|
36
|
-
- **Исходящий порт (контракт к backend)**: публичный API **`@/api`** (barrel `app/src/api/index.ts`; реализация — в `app/src/api/services/**` и т.д., см. `public-imports.mdc`).
|
|
37
|
-
- **Исходящий адаптер**: общая реализация HTTP в **`app/src/lib/clients/**`** и экземпляры в **`app/src/api/clients/**`**.
|
|
38
|
-
|
|
39
|
-
## Фича как срез
|
|
40
|
-
|
|
41
|
-
- Для сложной фичи выравниваются имена и термины (**единый язык** предметной области) в типах, селекторах, сервисах и UI; структура папок — как в соседних фичах репозитория.
|
|
42
|
-
|
|
43
24
|
# Правила импортов
|
|
44
25
|
|
|
45
26
|
- Всегда использовать алиас `@/...` для импортов между слоями.
|
|
46
27
|
- Внутри одного модуля/фичи можно использовать относительные импорты, но **без подъёма выше корня фичи** (избегать `../../../`).
|
|
47
|
-
- При обращении из компонентов, хуков, утилит и других модулей к чужому слою или фиче использовать только **public API** (barrel/index‑файлы и явно экспортируемые сущности), не делать deep‑импорты внутренних файлов других
|
|
28
|
+
- При обращении из компонентов, хуков, утилит и других модулей к чужому слою или фиче использовать только **public API** (barrel/index‑файлы и явно экспортируемые сущности), не делать deep‑импорты внутренних файлов других фич.
|
|
48
29
|
- При добавлении нового кода проверять:
|
|
49
30
|
- если модуль переиспользуемый — он должен зависеть только от более "низких" слоёв (types, utils, api), но не от страниц.
|
|
50
31
|
|
|
51
32
|
# Организация фич
|
|
52
33
|
|
|
53
34
|
- Для сложных фич (например, `OrderCheckout`):
|
|
54
|
-
- Страница: `
|
|
35
|
+
- Страница: `src/ui/pages/OrderCheckoutPage/**`.
|
|
55
36
|
- Локальные компоненты: поддиректории `components/**` внутри страницы.
|
|
56
|
-
- Связанный store: `
|
|
57
|
-
- API: `
|
|
58
|
-
- Типы: `
|
|
37
|
+
- Связанный store: `src/store/slices/OrderCheckout/**`.
|
|
38
|
+
- API: `src/api/services/OrdersApi/OrderCheckout/**` (имя корневого сервиса взять из принятой в проекте схемы).
|
|
39
|
+
- Типы: `src/types/OrderCheckout.types.ts` или аналогичный файл.
|
|
59
40
|
|
|
60
41
|
# Требование к агенту
|
|
61
42
|
|
|
@@ -35,11 +35,10 @@ alwaysApply: true
|
|
|
35
35
|
- сначала локально улучшить архитектуру минимальными шагами;
|
|
36
36
|
- оставить код в консистентном состоянии.
|
|
37
37
|
|
|
38
|
-
# Линтеры
|
|
39
|
-
|
|
40
|
-
Lint/stylelint — только **`post-change-lint.mdc`**; ESLint config: `app/eslint.config.mjs`. Отключение правила (`eslint-disable`) — только **точечно** (строка/небольшой блок) с кратким комментарием «зачем».
|
|
41
|
-
|
|
42
38
|
# Требование к агенту
|
|
43
39
|
|
|
44
|
-
|
|
40
|
+
При каждом изменении:
|
|
41
|
+
- Поддерживать принцип **“boy scout rule”**:
|
|
42
|
+
- оставлять модуль в немного лучшем состоянии, чем до изменения (простые, безопасные улучшения).
|
|
45
43
|
- Не жертвовать архитектурой и слоями ради краткости реализации.
|
|
44
|
+
|
|
@@ -1,28 +1,47 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Требования к code review агентами Cursor для merge requests
|
|
3
|
-
alwaysApply:
|
|
3
|
+
alwaysApply: true
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Code review merge requests
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
- **Когда применять**
|
|
9
|
+
- Если пользователь просит: "проведи ревью", "оценить MR/ветку/дифф", "посмотри изменения".
|
|
10
|
+
- Опираться на локальный репозиторий: текущую ветку, `git diff` и открытые файлы, а не на данные внешнего API хостинга.
|
|
11
|
+
|
|
12
|
+
- **Что обязан проверить агент**
|
|
13
|
+
- **Архитектура и слои**:
|
|
14
|
+
- Соблюдение правил из `architecture-boundaries.mdc` и `next-app-core.mdc`:
|
|
15
|
+
- UI (`src/ui/**`) не ходит напрямую в HTTP‑клиент и не знает DTO.
|
|
16
|
+
- Store (`src/store/**`) не зависит от UI и не работает с "сырыми" HTTP.
|
|
17
|
+
- API (`src/api/services/**`) не тянет UI/store, использует мапперы.
|
|
18
|
+
- **Импорты и организация кода**:
|
|
19
|
+
- Использование алиаса `@/...` вместо относительных импортов выше по дереву.
|
|
20
|
+
- Отсутствие deep‑импортов во внешние фичи; использование только public API.
|
|
21
|
+
- Размещение новых файлов в корректных слоях и директориях фич.
|
|
22
|
+
- **Типы и TS‑строгость**:
|
|
23
|
+
- Не допускать новых `any`; предпочитать доменные типы из `src/types/**`.
|
|
24
|
+
- Проверять корректность пропсов/возвращаемых типов, особенно в UI и API‑слое.
|
|
25
|
+
- **UI и стили**:
|
|
26
|
+
- Для компонентов и стилей сверяться с `react-ui.mdc` и `next-app-core.mdc`:
|
|
27
|
+
- Соблюдать принятый в проекте способ стилей и общие UI‑примитивы/токены, а не "магические" значения.
|
|
28
|
+
- Сохранять консистентность с существующими компонентами и паттернами.
|
|
29
|
+
- **Тесты**:
|
|
30
|
+
- Проверять, что для нетривиальных изменений:
|
|
31
|
+
- либо обновлены/добавлены unit‑тесты (`tests-unit.mdc`),
|
|
32
|
+
- либо e2e‑сценарии/спеки отражают новую логику (`playwright-agents.mdc`, `tests-e2e-structure.mdc`).
|
|
33
|
+
- Указывать, какие именно тесты стоит добавить или поправить.
|
|
34
|
+
|
|
35
|
+
- **Глубина и формат ревью**
|
|
36
|
+
- Фокус на **изменениях MR** (дифф относительно целевой ветки), а не на всём проекте.
|
|
37
|
+
- Сначала дать **высокоуровневый обзор** (что делает MR, риски, архитектурные замечания), затем список конкретных комментариев.
|
|
38
|
+
- Каждый комментарий делать:
|
|
39
|
+
- **конкретным** (указать файл/участок и проблему),
|
|
40
|
+
- **практичным** (предложить вариант исправления, опираясь на существующие паттерны),
|
|
41
|
+
- без "больших рефакторингов" в духе `code-quality-and-refactoring.mdc`, если задача локальная.
|
|
42
|
+
|
|
43
|
+
- **Ограничения для агента**
|
|
44
|
+
- Не придумывать несуществующие метаданные из хостинга (лейблы MR, авторов, статусы CI), если их нет в локальных данных.
|
|
45
|
+
- Не менять общую архитектуру фичи без прямого запроса пользователя.
|
|
46
|
+
- Следовать принципу "boy scout rule": предлагать улучшения, которые реально можно внести в рамках MR.
|
|
9
47
|
|
|
10
|
-
## Checklist references
|
|
11
|
-
|
|
12
|
-
- Architecture layers: `architecture-boundaries.mdc`, `next-app-core.mdc`; network: `http-client.mdc`
|
|
13
|
-
- Imports: `public-imports.mdc`, `layer-barrel-exports.mdc`
|
|
14
|
-
- UI: `react-ui.mdc`
|
|
15
|
-
- Tests: `tests-unit.mdc`, `playwright-agents.mdc`, `tests-e2e-structure.mdc`
|
|
16
|
-
- Lint gate before final report: `post-change-lint.mdc`
|
|
17
|
-
|
|
18
|
-
## When to load
|
|
19
|
-
|
|
20
|
-
- User asks for review/MR/diff
|
|
21
|
-
- Pipeline step `code-reviewer`
|
|
22
|
-
- BUGBOT automated review
|
|
23
|
-
|
|
24
|
-
## Constraints
|
|
25
|
-
|
|
26
|
-
- Focus on MR diff, not the whole repo.
|
|
27
|
-
- Use local `git diff` — do not invent hosting metadata.
|
|
28
|
-
- Boy scout rule: suggest fixes feasible within the MR scope.
|
|
@@ -5,30 +5,73 @@ alwaysApply: true
|
|
|
5
5
|
|
|
6
6
|
# Стек и окружение
|
|
7
7
|
|
|
8
|
-
Конкретные версии — **из `package.json` и конфигов целевого репозитория**.
|
|
8
|
+
Конкретные версии пакетов и инструментов — **из `package.json` и конфигов целевого репозитория**. Ниже — рамка preset (Next.js + React + TypeScript), без привязки к конкретному вендору UI, моков или APM:
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
- **Фреймворк:** Next.js, React, TypeScript (strict — если включён в проекте).
|
|
11
|
+
- **Сборка и Node:** как задано в репозитории.
|
|
12
|
+
- **Тесты:** unit/integration — runner и библиотеки проекта; e2e — инструмент проекта (правила для агентов Playwright — в отдельных файлах preset).
|
|
13
|
+
- **Моки HTTP/API:** если приняты в репо — повторять существующую схему (каталоги, регистрация, точка входа).
|
|
14
|
+
- **Стили и UI:** способ стилизации и **дизайн‑система / токены** — как уже заведено в коде; приоритет общим примитивам и токенам вместо разрозненных «магических» значений.
|
|
15
|
+
- **Наблюдаемость:** только если уже подключена в проекте — централизованно (клиент, обёртки), без дублирования в каждом методе.
|
|
11
16
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
-
|
|
17
|
+
# Структура проекта (верхний уровень)
|
|
18
|
+
|
|
19
|
+
- `app/` — корень Next.js приложения.
|
|
20
|
+
- `app/src/**` — исходный код приложения.
|
|
21
|
+
- `app/__tests__/e2e/**` — e2e‑тесты и планы.
|
|
22
|
+
- `app/tsconfig.json`:
|
|
23
|
+
- `baseUrl: "."`
|
|
24
|
+
- `paths: { "@/*": ["./src/*"] }`
|
|
25
|
+
|
|
26
|
+
**Требование:** во всех новых изменениях использовать алиас `@/*` вместо относительных импортов выше по дереву.
|
|
15
27
|
|
|
16
28
|
# Архитектурные слои
|
|
17
29
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
30
|
+
- **UI слой** (`src/ui/**`):
|
|
31
|
+
- `src/ui/pages/**` — страницы и контейнеры.
|
|
32
|
+
- `src/ui/components/**` — переиспользуемые компоненты.
|
|
33
|
+
- **Store слой** (`src/store/**`):
|
|
34
|
+
- `src/store/slices/**` — модули состояния (в этом preset — Redux Toolkit; подробности в `store-rtk.mdc`).
|
|
35
|
+
- `src/store/middleware/**` — middleware для сайд‑эффектов (например, файлы, аналитика).
|
|
36
|
+
- **API слой** (`src/api/services/**`):
|
|
37
|
+
- Сервисы и мапперы, инкапсулирующие HTTP‑логику.
|
|
38
|
+
- **Типы** (`src/types/**`):
|
|
39
|
+
- Общие доменные типы продукта (сущности предметной области, агрегаты и т.д.).
|
|
40
|
+
- **Моки и тестовые данные** (`src/mocks/**`):
|
|
41
|
+
- По структуре и назначению — как принято в репозитории.
|
|
42
|
+
|
|
43
|
+
# Общие архитектурные принципы
|
|
26
44
|
|
|
27
|
-
|
|
45
|
+
- **Чёткое разделение слоёв**:
|
|
46
|
+
- UI знает только о доменных типах и публичных интерфейсах store/API.
|
|
47
|
+
- Store знает о доменных типах и API‑сервисах.
|
|
48
|
+
- API знает о транспортном слое (HTTP, выбранный клиент) и DTO.
|
|
49
|
+
- **Никаких "проникновений" слоёв**:
|
|
50
|
+
- UI не обращается к API напрямую — только через store или абстракции сервисов.
|
|
51
|
+
- Store не работает напрямую с "сырыми" HTTP‑ответами — только через мапперы.
|
|
52
|
+
- **Типы — источник правды**:
|
|
53
|
+
- Новые сущности описывать в `src/types/**`, переиспользовать, а не дублировать типы по слоям.
|
|
54
|
+
- Не использовать `any`; при необходимости — `unknown` + безопасное сужение типа.
|
|
55
|
+
|
|
56
|
+
# Кодстайл и качества кода
|
|
57
|
+
|
|
58
|
+
- Следовать конфигам линтеров и форматтера **проекта** (`eslint`, `prettier`, `stylelint` — какие есть в репо).
|
|
59
|
+
- Поддерживать:
|
|
60
|
+
- KISS, DRY, SOLID (в разумных пределах для фронта).
|
|
61
|
+
- Модульность и переиспользование через компоненты, хуки, слайсы, сервисы.
|
|
62
|
+
- Визуальную консистентность за счёт принятых в проекте UI‑примитивов и токенов, а не разовых литералов в стилях.
|
|
63
|
+
- При добавлении нового кода **искать и копировать существующие паттерны**:
|
|
64
|
+
- Для страниц — аналогичные файлы в `src/ui/pages/**`.
|
|
65
|
+
- Для блоков — компоненты в `src/ui/components/**`.
|
|
66
|
+
- Для API — сервисы в `src/api/services/**`.
|
|
67
|
+
- Для состояния — слайсы в `src/store/slices/**`.
|
|
28
68
|
|
|
29
69
|
# Работа агента
|
|
30
70
|
|
|
31
|
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
71
|
+
При генерации кода:
|
|
72
|
+
- Определить целевой слой (UI/store/API/типизация/тесты).
|
|
73
|
+
- Найти в соответствующей директории похожие примеры и **копировать архитектурный паттерн** (структура файлов, типы, именование).
|
|
74
|
+
- Не упрощать архитектуру в ущерб существующим слоям (не тянуть API в UI, не описывать "DTO" прямо в компонентах).
|
|
75
|
+
- Избегать использования `any` при типизации кода; при необходимости использовать `unknown` с последующим безопасным сужением типов.
|
|
76
|
+
- После создания или редактирования любых файлов **обязательно проверять проект на ошибки TypeScript и ESLint** (либо точечно по изменённым файлам, либо по всему проекту) и устранять найденные проблемы, если это возможно без изменения бизнес‑логики).
|
|
77
|
+
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Избегать спред-а пропов при передаче в компоненты
|
|
3
|
-
|
|
4
|
-
alwaysApply: false
|
|
3
|
+
alwaysApply: true
|
|
5
4
|
---
|
|
6
5
|
|
|
7
6
|
# Не использовать спред пропов при передаче в компоненты
|
|
8
7
|
|
|
9
|
-
При вызове
|
|
10
|
-
|
|
11
|
-
**Агентам и при ревью:** не «упрощать» JSX через объект с последующим spread — это нарушение. Если ветвление по пропам длинное, используйте два явных JSX-блока (`condition ? <A … /> : <B … />`) или отдельные маленькие компоненты, а не `{...mergedProps}`.
|
|
8
|
+
При вызове React-компонентов **передавать пропы явно**, а не через spread (`{...props}`).
|
|
12
9
|
|
|
13
10
|
## Почему
|
|
14
11
|
|
|
@@ -16,11 +13,6 @@ alwaysApply: false
|
|
|
16
13
|
- Упрощает рефакторинг и поиск использований.
|
|
17
14
|
- Снижает риск случайно пробросить лишние или устаревшие пропы.
|
|
18
15
|
|
|
19
|
-
## Проверка в репозитории
|
|
20
|
-
|
|
21
|
-
- Для файлов `app/src/ui/**/*.tsx` включено ESLint-правило `react/jsx-props-no-spreading` (`app/eslint.config.mjs`): несоблюдение увидит линтер и CI.
|
|
22
|
-
- Легитимное исключение в конкретном месте — **однострочный** `eslint-disable-next-line react/jsx-props-no-spreading` с кратким комментарием «почему»; для редких обёрток допустим disable на файл (как в `PromocodeInput`).
|
|
23
|
-
|
|
24
16
|
## Примеры
|
|
25
17
|
|
|
26
18
|
```tsx
|
|
@@ -31,10 +23,6 @@ return <Child {...commonProps} />
|
|
|
31
23
|
// ❌ Плохо
|
|
32
24
|
return <Child {...props} />
|
|
33
25
|
|
|
34
|
-
// ❌ Плохо (spread из соседнего модуля стилей тоже не оправдание)
|
|
35
|
-
const iconProps = cond ? { name, size: 'm' } : { name, size: 'm', ...styles.IconBoxAccent }
|
|
36
|
-
return <IconBox {...iconProps} />
|
|
37
|
-
|
|
38
26
|
// ✅ Хорошо
|
|
39
27
|
return (
|
|
40
28
|
<Child
|
|
@@ -43,20 +31,9 @@ return (
|
|
|
43
31
|
c={c}
|
|
44
32
|
/>
|
|
45
33
|
)
|
|
46
|
-
|
|
47
|
-
// ✅ Хорошо — явные пропсы по веткам
|
|
48
|
-
return cond ? (
|
|
49
|
-
<IconBox name={name} size="m" variant="warning" />
|
|
50
|
-
) : (
|
|
51
|
-
<IconBox
|
|
52
|
-
customColors={styles.IconBoxAccent.customColors}
|
|
53
|
-
name={name}
|
|
54
|
-
size="m"
|
|
55
|
-
/>
|
|
56
|
-
)
|
|
57
34
|
```
|
|
58
35
|
|
|
59
36
|
## Исключения
|
|
60
37
|
|
|
61
|
-
- Передача пропов в
|
|
62
|
-
- Делегирование пропов в обёртку (wrapper) допустимо, если это явно документировано и
|
|
38
|
+
- Передача всех пропов в нативный DOM-элемент (`<div {...rest} />`) допустима, если `rest` содержит только валидные HTML-атрибуты.
|
|
39
|
+
- Делегирование пропов в обёртку (wrapper) допустимо, если это явно документировано и обосновано.
|