@bonesofspring/ai-rules 0.2.2 → 0.2.3
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/CHANGELOG.md +63 -0
- package/README.md +26 -4
- package/bin/cli.js +259 -72
- package/package.json +3 -2
- package/presets/claude/ios-swift/CLAUDE.md +28 -20
- package/presets/claude/ios-swift/README.md +16 -15
- package/presets/claude/ios-swift/agents/README.md +55 -0
- package/presets/claude/ios-swift/agents/accessibility-reviewer.md +67 -0
- package/presets/claude/ios-swift/agents/api-contract-reviewer.md +72 -0
- package/presets/claude/ios-swift/agents/build-verifier.md +64 -0
- package/presets/claude/ios-swift/agents/ci-investigator.md +73 -0
- package/presets/claude/ios-swift/agents/code-reviewer.md +75 -0
- package/presets/claude/ios-swift/agents/debugger.md +72 -0
- package/presets/claude/ios-swift/agents/feature-developer.md +35 -0
- package/presets/claude/ios-swift/agents/migration-specialist.md +73 -0
- package/presets/claude/ios-swift/agents/performance-auditor.md +72 -0
- package/presets/claude/ios-swift/agents/qa-tester.md +65 -0
- package/presets/claude/ios-swift/agents/security-reviewer.md +69 -0
- package/presets/claude/ios-swift/agents/solution-architect.md +17 -0
- package/presets/claude/ios-swift/agents/task-analyst.md +25 -0
- package/presets/claude/ios-swift/agents/task-router.md +62 -0
- package/presets/claude/ios-swift/agents/tech-writer.md +63 -0
- package/presets/claude/ios-swift/agents/unit-test-generator.md +54 -0
- package/presets/claude/ios-swift/agents/unit-test-healer.md +53 -0
- package/presets/claude/ios-swift/agents/unit-test-planner.md +64 -0
- package/presets/claude/ios-swift/agents/xcuitest-test-generator.md +47 -0
- package/presets/claude/ios-swift/agents/xcuitest-test-healer.md +47 -0
- package/presets/claude/ios-swift/agents/xcuitest-test-planner.md +67 -0
- package/presets/claude/ios-swift/commands/README.md +12 -2
- package/presets/claude/ios-swift/commands/feature-continue.md +51 -0
- package/presets/claude/ios-swift/commands/feature-start.md +30 -0
- package/presets/claude/ios-swift/commands/task-continue.md +49 -0
- package/presets/claude/ios-swift/commands/task.md +50 -0
- package/presets/claude/ios-swift/commands/technical-retro.md +58 -0
- package/presets/claude/ios-swift/hooks/README.md +10 -0
- package/presets/claude/ios-swift/hooks/chain-team-phases.sh +382 -0
- package/presets/claude/ios-swift/hooks/guard-shell-command.sh +79 -0
- package/presets/claude/ios-swift/rules/README.md +25 -14
- package/presets/claude/ios-swift/rules/api-and-data/README.md +2 -1
- package/presets/claude/ios-swift/rules/api-and-data/networking.md +2 -2
- package/presets/claude/ios-swift/rules/api-and-data/persistence.md +30 -0
- package/presets/claude/ios-swift/rules/architecture/README.md +3 -1
- package/presets/claude/ios-swift/rules/architecture/feature-delivery.md +10 -2
- package/presets/claude/ios-swift/rules/architecture/module-public-api.md +25 -0
- package/presets/claude/ios-swift/rules/architecture/reference-features.md +50 -0
- package/presets/claude/ios-swift/rules/stack/ios-app-core.md +2 -1
- package/presets/claude/ios-swift/rules/testing/ui.md +2 -0
- package/presets/claude/ios-swift/rules/tooling-and-review/README.md +6 -1
- package/presets/claude/ios-swift/rules/tooling-and-review/agent-team-intake.md +18 -0
- package/presets/claude/ios-swift/rules/tooling-and-review/agent-team-orchestrator.md +47 -0
- package/presets/claude/ios-swift/rules/tooling-and-review/code-review.md +5 -0
- package/presets/claude/ios-swift/rules/tooling-and-review/post-change-build.md +5 -0
- package/presets/claude/ios-swift/rules/tooling-and-review/security-ios.md +36 -0
- package/presets/claude/ios-swift/rules/tooling-and-review/technical-retro.md +14 -0
- package/presets/claude/ios-swift/rules/tooling-and-review/xcode-tooling.md +24 -0
- package/presets/claude/ios-swift/rules/ui-and-accessibility/README.md +2 -1
- package/presets/claude/ios-swift/rules/ui-and-accessibility/navigation.md +28 -0
- package/presets/claude/ios-swift/skills/README.md +13 -0
- package/presets/claude/ios-swift/skills/ci-investigation/SKILL.md +39 -0
- package/presets/claude/ios-swift/skills/code-review/SKILL.md +27 -0
- package/presets/claude/ios-swift/skills/debug-investigation/SKILL.md +30 -0
- package/presets/claude/ios-swift/skills/feature-delivery/SKILL.md +27 -0
- package/presets/claude/ios-swift/skills/technical-retro/SKILL.md +10 -0
- package/presets/claude/ios-swift/skills/unit-testing/SKILL.md +32 -0
- package/presets/claude/ios-swift/skills/xcuitest-e2e/SKILL.md +33 -0
- package/presets/claude/ios-swift/team/README.md +27 -0
- package/presets/claude/ios-swift/team/fixtures/bugfix-standard.json +33 -0
- package/presets/claude/ios-swift/team/fixtures/feature-full.json +48 -0
- package/presets/claude/ios-swift/team/fixtures/feature-light.json +36 -0
- package/presets/claude/next/CLAUDE.md +29 -5
- package/presets/claude/next/README.md +10 -0
- package/presets/claude/next/agents/README.md +155 -1
- package/presets/claude/next/agents/accessibility-reviewer.md +65 -0
- package/presets/claude/next/agents/api-contract-reviewer.md +69 -0
- package/presets/claude/next/agents/build-verifier.md +64 -0
- package/presets/claude/next/agents/ci-investigator.md +62 -0
- package/presets/claude/next/agents/code-reviewer.md +63 -0
- package/presets/claude/next/agents/debugger.md +63 -0
- package/presets/claude/next/agents/feature-developer.md +27 -0
- package/presets/claude/next/agents/migration-specialist.md +69 -0
- package/presets/claude/next/agents/performance-auditor.md +68 -0
- package/presets/claude/next/agents/qa-tester.md +56 -0
- package/presets/claude/next/agents/security-reviewer.md +64 -0
- package/presets/claude/next/agents/solution-architect.md +70 -0
- package/presets/claude/next/agents/task-analyst.md +111 -0
- package/presets/claude/next/agents/task-router.md +94 -0
- package/presets/claude/next/agents/tech-writer.md +61 -0
- package/presets/claude/next/agents/unit-test-generator.md +37 -0
- package/presets/claude/next/agents/unit-test-healer.md +38 -0
- package/presets/claude/next/agents/unit-test-planner.md +62 -0
- package/presets/claude/next/commands/README.md +10 -2
- package/presets/claude/next/commands/feature-continue.md +51 -0
- package/presets/claude/next/commands/feature-start.md +30 -0
- package/presets/claude/next/commands/task-continue.md +49 -0
- package/presets/claude/next/commands/task.md +50 -0
- package/presets/claude/next/commands/technical-retro.md +58 -0
- package/presets/claude/next/hooks/README.md +5 -2
- package/presets/claude/next/hooks/chain-team-phases.sh +380 -0
- package/presets/claude/next/hooks/guard-shell-command.sh +77 -0
- package/presets/claude/next/rules/README.md +42 -11
- package/presets/claude/next/rules/api-and-data/README.md +7 -1
- package/presets/claude/next/rules/api-and-data/api-services.md +57 -0
- package/presets/claude/next/rules/api-and-data/http-client.md +40 -0
- package/presets/claude/next/rules/api-and-data/store-rtk.md +65 -0
- package/presets/claude/next/rules/architecture/README.md +11 -2
- package/presets/claude/next/rules/architecture/architecture-boundaries-ui.md +15 -0
- package/presets/claude/next/rules/architecture/architecture-boundaries.md +75 -0
- package/presets/claude/next/rules/architecture/feature-delivery-workflow.md +79 -0
- package/presets/claude/next/rules/architecture/layer-barrel-exports.md +58 -0
- package/presets/claude/next/rules/architecture/public-imports.md +46 -0
- package/presets/claude/next/rules/architecture/reference-features.md +37 -0
- package/presets/claude/next/rules/stack/README.md +10 -1
- package/presets/claude/next/rules/stack/arrow-functions.md +45 -0
- package/presets/claude/next/rules/stack/navigation-router-ui.md +15 -0
- package/presets/claude/next/rules/stack/navigation-router.md +64 -0
- package/presets/claude/next/rules/stack/next-app-core.md +33 -0
- package/presets/claude/next/rules/stack/next-app-router.md +36 -0
- package/presets/claude/next/rules/stack/no-type-assertion.md +59 -0
- package/presets/claude/next/rules/stack/types-jsdoc.md +37 -0
- package/presets/claude/next/rules/testing/README.md +9 -1
- package/presets/claude/next/rules/testing/playwright-agents.md +74 -0
- package/presets/claude/next/rules/testing/tests-e2e-structure.md +52 -0
- package/presets/claude/next/rules/testing/tests-unit.md +66 -0
- package/presets/claude/next/rules/tooling-and-review/README.md +12 -1
- package/presets/claude/next/rules/tooling-and-review/agent-team-intake.md +15 -0
- package/presets/claude/next/rules/tooling-and-review/agent-team-orchestrator.md +141 -0
- package/presets/claude/next/rules/tooling-and-review/code-quality.md +42 -0
- package/presets/claude/next/rules/tooling-and-review/code-review-mr.md +30 -0
- package/presets/claude/next/rules/tooling-and-review/package-manager.md +11 -0
- package/presets/claude/next/rules/tooling-and-review/post-change-lint.md +44 -0
- package/presets/claude/next/rules/ui-and-accessibility/README.md +10 -1
- package/presets/claude/next/rules/ui-and-accessibility/css-property-order.md +14 -0
- package/presets/claude/next/rules/ui-and-accessibility/no-props-spread.md +57 -0
- package/presets/claude/next/rules/ui-and-accessibility/react-a11y-coding.md +37 -0
- package/presets/claude/next/rules/ui-and-accessibility/react-ui.md +91 -0
- package/presets/claude/next/skills/README.md +11 -1
- package/presets/claude/next/skills/ci-investigation/SKILL.md +36 -0
- package/presets/claude/next/skills/code-review/SKILL.md +26 -0
- package/presets/claude/next/skills/debug-investigation/SKILL.md +28 -0
- package/presets/claude/next/skills/feature-delivery/SKILL.md +15 -0
- package/presets/claude/next/skills/playwright-e2e/SKILL.md +31 -0
- package/presets/claude/next/skills/technical-retro/SKILL.md +40 -0
- package/presets/claude/next/skills/unit-testing/SKILL.md +32 -0
- package/presets/claude/next/team/README.md +105 -0
- package/presets/claude/next/team/fixtures/bugfix-standard.json +15 -0
- package/presets/claude/next/team/fixtures/feature-full.json +16 -0
- package/presets/claude/next/team/fixtures/feature-light.json +17 -0
- package/presets/claude/next/team/tasks/.gitkeep +1 -0
- package/presets/cursor/ios-swift/AGENTS.md +47 -0
- package/presets/cursor/ios-swift/BUGBOT.md +15 -0
- package/presets/cursor/ios-swift/README.md +26 -7
- package/presets/cursor/ios-swift/agents/README.md +55 -0
- package/presets/cursor/ios-swift/agents/accessibility-reviewer.md +67 -0
- package/presets/cursor/ios-swift/agents/api-contract-reviewer.md +72 -0
- package/presets/cursor/ios-swift/agents/build-verifier.md +64 -0
- package/presets/cursor/ios-swift/agents/ci-investigator.md +73 -0
- package/presets/cursor/ios-swift/agents/code-reviewer.md +75 -0
- package/presets/cursor/ios-swift/agents/debugger.md +72 -0
- package/presets/cursor/ios-swift/agents/feature-developer.md +35 -0
- package/presets/cursor/ios-swift/agents/migration-specialist.md +73 -0
- package/presets/cursor/ios-swift/agents/performance-auditor.md +72 -0
- package/presets/cursor/ios-swift/agents/qa-tester.md +65 -0
- package/presets/cursor/ios-swift/agents/security-reviewer.md +69 -0
- package/presets/cursor/ios-swift/agents/solution-architect.md +17 -0
- package/presets/cursor/ios-swift/agents/task-analyst.md +25 -0
- package/presets/cursor/ios-swift/agents/task-router.md +62 -0
- package/presets/cursor/ios-swift/agents/tech-writer.md +63 -0
- package/presets/cursor/ios-swift/agents/unit-test-generator.md +54 -0
- package/presets/cursor/ios-swift/agents/unit-test-healer.md +53 -0
- package/presets/cursor/ios-swift/agents/unit-test-planner.md +64 -0
- package/presets/cursor/ios-swift/agents/xcuitest-test-generator.md +47 -0
- package/presets/cursor/ios-swift/agents/xcuitest-test-healer.md +47 -0
- package/presets/cursor/ios-swift/agents/xcuitest-test-planner.md +67 -0
- package/presets/cursor/ios-swift/commands/README.md +49 -1
- package/presets/cursor/ios-swift/commands/feature-continue.md +19 -0
- package/presets/cursor/ios-swift/commands/feature-start.md +33 -0
- package/presets/cursor/ios-swift/commands/task-continue.md +49 -0
- package/presets/cursor/ios-swift/commands/task.md +50 -0
- package/presets/cursor/ios-swift/commands/technical-retro.md +81 -0
- package/presets/cursor/ios-swift/hooks/README.md +8 -0
- package/presets/cursor/ios-swift/hooks/chain-team-phases.sh +382 -0
- package/presets/cursor/ios-swift/hooks/guard-shell-command.sh +79 -0
- package/presets/cursor/ios-swift/hooks.json +17 -0
- package/presets/cursor/ios-swift/rules/README.md +45 -13
- package/presets/cursor/ios-swift/rules/agent-team-intake.mdc +16 -0
- package/presets/cursor/ios-swift/rules/agent-team-orchestrator.mdc +80 -0
- package/presets/cursor/ios-swift/rules/code-review-mr.mdc +1 -0
- package/presets/cursor/ios-swift/rules/feature-delivery-workflow.mdc +1 -1
- package/presets/cursor/ios-swift/rules/ios-app-core.mdc +2 -1
- package/presets/cursor/ios-swift/rules/module-public-api.mdc +26 -0
- package/presets/cursor/ios-swift/rules/navigation-coordinators.mdc +29 -0
- package/presets/cursor/ios-swift/rules/networking-services.mdc +2 -2
- package/presets/cursor/ios-swift/rules/persistence-data.mdc +31 -0
- package/presets/cursor/ios-swift/rules/reference-features.mdc +53 -0
- package/presets/cursor/ios-swift/rules/security-ios.mdc +35 -0
- package/presets/cursor/ios-swift/rules/technical-retro.mdc +12 -0
- package/presets/cursor/ios-swift/rules/tests-ui.mdc +1 -0
- package/presets/cursor/ios-swift/rules/xcode-tooling.mdc +20 -0
- package/presets/cursor/ios-swift/skills/README.md +13 -0
- package/presets/cursor/ios-swift/skills/ci-investigation/SKILL.md +39 -0
- package/presets/cursor/ios-swift/skills/code-review/SKILL.md +27 -0
- package/presets/cursor/ios-swift/skills/debug-investigation/SKILL.md +30 -0
- package/presets/cursor/ios-swift/skills/feature-delivery/SKILL.md +27 -0
- package/presets/cursor/ios-swift/skills/technical-retro/SKILL.md +10 -0
- package/presets/cursor/ios-swift/skills/unit-testing/SKILL.md +32 -0
- package/presets/cursor/ios-swift/skills/xcuitest-e2e/SKILL.md +33 -0
- package/presets/cursor/ios-swift/team/README.md +27 -0
- package/presets/cursor/ios-swift/team/fixtures/bugfix-standard.json +33 -0
- package/presets/cursor/ios-swift/team/fixtures/feature-full.json +48 -0
- package/presets/cursor/ios-swift/team/fixtures/feature-light.json +36 -0
- package/presets/cursor/next/AGENTS.md +36 -0
- package/presets/cursor/next/BUGBOT.md +14 -0
- package/presets/cursor/next/agents/README.md +165 -0
- package/presets/cursor/next/agents/accessibility-reviewer.md +67 -0
- package/presets/cursor/next/agents/api-contract-reviewer.md +71 -0
- package/presets/cursor/next/agents/build-verifier.md +66 -0
- package/presets/cursor/next/agents/ci-investigator.md +64 -0
- package/presets/cursor/next/agents/code-reviewer.md +64 -0
- package/presets/cursor/next/agents/debugger.md +64 -0
- package/presets/cursor/next/agents/feature-developer.md +28 -0
- package/presets/cursor/next/agents/migration-specialist.md +71 -0
- package/presets/cursor/next/agents/performance-auditor.md +70 -0
- package/presets/cursor/next/agents/playwright-test-generator.md +27 -0
- package/presets/cursor/next/agents/playwright-test-healer.md +27 -0
- package/presets/cursor/next/agents/playwright-test-planner.md +28 -0
- package/presets/cursor/next/agents/qa-tester.md +58 -0
- package/presets/cursor/next/agents/security-reviewer.md +66 -0
- package/presets/cursor/next/agents/solution-architect.md +71 -0
- package/presets/cursor/next/agents/task-analyst.md +112 -0
- package/presets/cursor/next/agents/task-router.md +95 -0
- package/presets/cursor/next/agents/tech-writer.md +62 -0
- package/presets/cursor/next/agents/unit-test-generator.md +39 -0
- package/presets/cursor/next/agents/unit-test-healer.md +40 -0
- package/presets/cursor/next/agents/unit-test-planner.md +64 -0
- package/presets/cursor/next/commands/README.md +49 -1
- package/presets/cursor/next/commands/feature-continue.md +19 -0
- package/presets/cursor/next/commands/feature-start.md +33 -0
- package/presets/cursor/next/commands/task-continue.md +49 -0
- package/presets/cursor/next/commands/task.md +50 -0
- package/presets/cursor/next/commands/technical-retro.md +81 -0
- package/presets/cursor/next/hooks/README.md +8 -0
- package/presets/cursor/next/hooks/chain-team-phases.sh +380 -0
- package/presets/cursor/next/hooks/guard-shell-command.sh +77 -0
- package/presets/cursor/next/hooks.json +17 -0
- package/presets/cursor/next/rules/README.md +67 -0
- package/presets/cursor/next/rules/agent-team-intake.mdc +14 -0
- package/presets/cursor/next/rules/agent-team-orchestrator.mdc +141 -0
- package/presets/cursor/next/rules/api-services.mdc +12 -10
- package/presets/cursor/next/rules/architecture-boundaries-ui.mdc +15 -0
- package/presets/cursor/next/rules/architecture-boundaries.mdc +31 -12
- package/presets/cursor/next/rules/arrow-functions.mdc +46 -0
- package/presets/cursor/next/rules/code-quality-and-refactoring.mdc +5 -4
- package/presets/cursor/next/rules/code-review-mr.mdc +21 -40
- package/presets/cursor/next/rules/css-property-order-stylelint.mdc +16 -0
- package/presets/cursor/next/rules/feature-delivery-workflow.mdc +76 -0
- package/presets/cursor/next/rules/http-client.mdc +42 -0
- package/presets/cursor/next/rules/layer-barrel-exports.mdc +59 -0
- package/presets/cursor/next/rules/navigation-router-stack.mdc +62 -0
- package/presets/cursor/next/rules/navigation-router-ui.mdc +16 -0
- package/presets/cursor/next/rules/next-app-core.mdc +18 -61
- package/presets/cursor/next/rules/next-app-router.mdc +36 -0
- package/presets/cursor/next/rules/no-props-spread.mdc +27 -4
- package/presets/cursor/next/rules/no-type-assertion-as-import-export.mdc +60 -0
- package/presets/cursor/next/rules/package-manager.mdc +16 -0
- package/presets/cursor/next/rules/playwright-agents.mdc +2 -1
- package/presets/cursor/next/rules/post-change-lint.mdc +40 -0
- package/presets/cursor/next/rules/public-imports.mdc +48 -0
- package/presets/cursor/next/rules/react-a11y-coding.mdc +37 -0
- package/presets/cursor/next/rules/react-ui.mdc +33 -3
- package/presets/cursor/next/rules/reference-features.mdc +39 -0
- package/presets/cursor/next/rules/store-rtk.mdc +13 -6
- package/presets/cursor/next/rules/technical-retro.mdc +12 -0
- package/presets/cursor/next/rules/tests-unit.mdc +30 -10
- package/presets/cursor/next/rules/types-jsdoc.mdc +42 -0
- package/presets/cursor/next/skills/README.md +15 -0
- package/presets/cursor/next/skills/ci-investigation/SKILL.md +36 -0
- package/presets/cursor/next/skills/code-review/SKILL.md +26 -0
- package/presets/cursor/next/skills/debug-investigation/SKILL.md +28 -0
- package/presets/cursor/next/skills/feature-delivery/SKILL.md +15 -0
- package/presets/cursor/next/skills/playwright-e2e/SKILL.md +31 -0
- package/presets/cursor/next/skills/technical-retro/SKILL.md +40 -0
- package/presets/cursor/next/skills/unit-testing/SKILL.md +32 -0
- package/presets/cursor/next/team/README.md +105 -0
- package/presets/cursor/next/team/fixtures/bugfix-standard.json +15 -0
- package/presets/cursor/next/team/fixtures/feature-full.json +16 -0
- package/presets/cursor/next/team/fixtures/feature-light.json +17 -0
- package/presets/cursor/next/team/tasks/.gitkeep +0 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- app/src/store/**/*.ts
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Общие принципы
|
|
7
|
+
|
|
8
|
+
- Использовать **Redux Toolkit**:
|
|
9
|
+
- `createSlice`, `createAsyncThunk`, RTK Query (если используется).
|
|
10
|
+
- Хранить в store **доменные модели**, не «сырые» DTO из API.
|
|
11
|
+
- Все вычисления и преобразования данных (включая вычисляемые поля, булевые флаги, агрегаты, человеко‑читаемые строки и т.п.) должны выполняться **между ответом API и записью в store** — в мапперах или отдельном слое подготовки данных. Store хранит уже подготовленную доменную модель.
|
|
12
|
+
- Разделять:
|
|
13
|
+
- «серверное» состояние (данные из API) и
|
|
14
|
+
- локальное UI‑состояние (выбор/фильтры/флаги).
|
|
15
|
+
|
|
16
|
+
# Структура слайсов
|
|
17
|
+
|
|
18
|
+
- Каждый доменный модуль — свой слайс в `app/src/store/slices/**`.
|
|
19
|
+
- Слайс экспортирует:
|
|
20
|
+
- `reducer` по умолчанию;
|
|
21
|
+
- `actions` именованным экспортом;
|
|
22
|
+
- селекторы `selectSomething(state: RootState): Type`.
|
|
23
|
+
- Состояние:
|
|
24
|
+
- явный тип для state;
|
|
25
|
+
- аккуратная инициализация initialState.
|
|
26
|
+
|
|
27
|
+
# Асинхронность и сайд‑эффекты
|
|
28
|
+
|
|
29
|
+
- Асинхронные запросы:
|
|
30
|
+
- через `createAsyncThunk` или RTK Query.
|
|
31
|
+
- внутри thunk:
|
|
32
|
+
- вызывать API через сервисы, импортированные из `@/api` (**`architecture/public-imports.md`**);
|
|
33
|
+
- не вызывать HTTP‑клиент напрямую — только через эти сервисы.
|
|
34
|
+
- Сайд‑эффекты (логирование, аналитика, работа с файлами):
|
|
35
|
+
- выносить в middleware (`app/src/store/middleware/**`) или специализированные слайсы.
|
|
36
|
+
|
|
37
|
+
# Типизация
|
|
38
|
+
|
|
39
|
+
- Использовать `RootState`, `AppDispatch` и типизированные хуки `useAppDispatch`, `useAppSelector` (если есть).
|
|
40
|
+
- **HTTP и ошибки API**:
|
|
41
|
+
- не импортировать типы **сторонних HTTP‑библиотек**, которых нет в актуальных зависимостях и существующих слайсах (ориентир — **`package.json`** и соседние файлы);
|
|
42
|
+
- когда сервис возвращает **обёртку ответа** прикладного клиента — использовать **соответствующий тип из `@/types`** (как в barrel и в аналогичных thunk’ах);
|
|
43
|
+
- при ошибках после вызова сервиса — опираться на **тот же класс/контракт ошибки транспорта**, что использует общий клиент (из `@/types`), и разбирать тело/статус **по полям текущей реализации**, а не по воображаемому API;
|
|
44
|
+
- в **`catch`** предпочитать **`instanceof`** на класс ошибки транспорта из `@/types` (если он есть в коде) вместо голого `as`, когда это выразимо без шума (см. `stack/no-type-assertion.md`).
|
|
45
|
+
- Для сущностей:
|
|
46
|
+
- доменные типы (включая вычисляемые поля) определять в `app/src/types/**`, экспортировать через barrel и импортировать в слайсы из `@/types` как **источник правды** (`architecture/public-imports.md`);
|
|
47
|
+
- избегать дублирования описаний сущностей в нескольких местах.
|
|
48
|
+
- **Граница домена**: в **state** хранить доменные модели; тип **обёртки ответа клиента** допустим как тип **возвращаемого значения thunk** или промежуточно до маппинга — без дублирования DTO в полях state без нужды (согласовано с `api-and-data/api-services.md` и `api-and-data/http-client.md`).
|
|
49
|
+
|
|
50
|
+
# Тестирование слайсов
|
|
51
|
+
|
|
52
|
+
- Для важных слайсов:
|
|
53
|
+
- тестировать редюсеры (инициализация, основные переходы состояний);
|
|
54
|
+
- тестировать селекторы (включая edge cases).
|
|
55
|
+
- Thunk’и:
|
|
56
|
+
- по возможности покрывать тестами с моками API‑слоя.
|
|
57
|
+
|
|
58
|
+
# Требование к агенту
|
|
59
|
+
|
|
60
|
+
При изменении/создании слайса:
|
|
61
|
+
|
|
62
|
+
- Не класть логику API внутрь редюсеров/компонентов.
|
|
63
|
+
- Строго типизировать state и actions.
|
|
64
|
+
- Использовать **единый стиль именования actions и селекторов**, как в существующих слайсах.
|
|
65
|
+
- При работе с ошибками и ответами HTTP опираться на **`api-and-data/http-client.md`** и контракты из `@/types`, а не на типы внешних HTTP‑библиотек вне зависимостей проекта.
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
-
# Architecture
|
|
1
|
+
# Architecture rules
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
| Файл | Назначение |
|
|
4
|
+
|------|------------|
|
|
5
|
+
| `public-imports.md` | Импорты `@/types`, `@/types/enums`, `@/api` (вне `app/src/api/**`) |
|
|
6
|
+
| `architecture-boundaries-ui.md` | Slim границы UI при правках компонентов |
|
|
7
|
+
| `architecture-boundaries.md` | Полная карта UI / store / API (api, store, types, lib) |
|
|
8
|
+
| `layer-barrel-exports.md` | Двухуровневые barrel для слоёв с public API |
|
|
9
|
+
| `feature-delivery-workflow.md` | Сквозной чеклист новой фичи |
|
|
10
|
+
| `reference-features.md` | Эталонные пути UI/store/API/types |
|
|
11
|
+
|
|
12
|
+
Deprecated stubs `types-public-imports.md` / `api-public-imports.md` **removed** — use `public-imports.md`.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- app/src/ui/**/*.tsx
|
|
4
|
+
- app/src/ui/**/*.ts
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# UI layer boundaries (slim)
|
|
8
|
+
|
|
9
|
+
- **Импорты:** `@/ui/**`, `@/store/**`, типы из `@/types` и enum из `@/types/enums`, API — только `from '@/api'` (`architecture/public-imports.md`).
|
|
10
|
+
- **Запрещено:** прямой HTTP‑клиент; знание DTO — только доменные типы.
|
|
11
|
+
- **Состояние:** сценарии с записью и координация шагов — через store/thunk; узкие прямые вызовы `@/api` для чтения — только как в соседних фичах.
|
|
12
|
+
- **Организация:** алиас `@/`; без deep‑импортов в чужие фичи; только public API.
|
|
13
|
+
- **Barrel:** при новых публичных символах — реэкспорт по `architecture/layer-barrel-exports.md` (правило грузится на `index.ts`).
|
|
14
|
+
|
|
15
|
+
Полная карта слоёв (store, API, порты‑адаптеры): **`architecture/architecture-boundaries.md`** — при правках `app/src/api`, `store`, `types`, `lib`.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- app/src/api/**/*
|
|
4
|
+
- app/src/store/**/*
|
|
5
|
+
- app/src/types/**/*
|
|
6
|
+
- app/src/lib/**/*
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Границы между слоями
|
|
10
|
+
|
|
11
|
+
## UI (`app/src/ui/**`)
|
|
12
|
+
|
|
13
|
+
- Может импортировать: `@/ui/**`, `@/store/**`, типы из `@/types` и enum из `@/types/enums` (**только как в `architecture/public-imports.md`**), контракт к API — **только** `import … from '@/api'` (**`architecture/public-imports.md`**).
|
|
14
|
+
- Не должен:
|
|
15
|
+
- обращаться к HTTP‑клиенту напрямую;
|
|
16
|
+
- знать детали DTO backend — только доменные типы.
|
|
17
|
+
|
|
18
|
+
## Store (`app/src/store/**`)
|
|
19
|
+
|
|
20
|
+
- Может импортировать: `@/store/**`, сервисы и публичные сущности API — **только** из `@/api` (**`architecture/public-imports.md`**), типы из `@/types` и enum из `@/types/enums` (**`architecture/public-imports.md`**).
|
|
21
|
+
- Не должен:
|
|
22
|
+
- зависеть от конкретных UI‑компонентов;
|
|
23
|
+
- напрямую работать с global/window API.
|
|
24
|
+
- Вызовы к backend — только через сервисы, импортируемые из `@/api`; **транспортные** типы ответа и ошибки (из `@/types`, в том же виде, что у прикладного HTTP‑клиента) во thunk допустимы, если так выстроен API‑слой (`api-and-data/http-client.md`, `api-and-data/store-rtk.md`).
|
|
25
|
+
|
|
26
|
+
## API (`app/src/api/**`)
|
|
27
|
+
|
|
28
|
+
Реализация в `services/**`, `clients/**`, реэкспорт в `app/src/api/index.ts`:
|
|
29
|
+
|
|
30
|
+
- Внутри слоя: типы из `@/types` и enum из `@/types/enums` (**`architecture/public-imports.md`**); импорты `@/api/services/**`, `@/api/clients/**`, относительные пути между файлами слоя (`api-and-data/http-client.md`, `api-and-data/api-services.md`).
|
|
31
|
+
- Не должен:
|
|
32
|
+
- тянуть в себя UI или store;
|
|
33
|
+
- смешивать HTTP‑слой и доменный слой — использовать мапперы.
|
|
34
|
+
|
|
35
|
+
## UI и обращение к API (`@/api`)
|
|
36
|
+
|
|
37
|
+
- По умолчанию сценарии с **изменением серверного состояния** и координация нескольких шагов — через **store** (`createAsyncThunk`, dispatch, паттерн фичи в репозитории).
|
|
38
|
+
- Прямой вызов методов сервисов, импортированных из **`@/api`**, из UI допустим только в **узких случаях**: преимущественно **чтение** или действие **без необходимости держать результат в Redux**; те же **доменные типы**, что использовал бы thunk; **не** дублировать уже существующий сценарий из store и **не** протаскивать DTO в компоненты.
|
|
39
|
+
- Предпочтительно оформлять такие вызовы так же, как в **соседних фичах** репозитория (хук‑фасад, отдельный хук и т.д.).
|
|
40
|
+
|
|
41
|
+
## Порты и адаптеры (краткая карта)
|
|
42
|
+
|
|
43
|
+
- **Входящий адаптер**: UI — ввод пользователя, отображение; зависит от store и доменных типов, не от транспорта.
|
|
44
|
+
- **Оркестрация сценариев**: store (slices, thunk) — вызывает сервисы, кладёт в state **доменные** модели после маппинга.
|
|
45
|
+
- **Исходящий порт (контракт к backend)**: публичный API **`@/api`** (barrel `app/src/api/index.ts`; реализация — в `app/src/api/services/**` и т.д., см. `architecture/public-imports.md`).
|
|
46
|
+
- **Исходящий адаптер**: общая реализация HTTP в **`app/src/lib/clients/**`** и экземпляры в **`app/src/api/clients/**`**.
|
|
47
|
+
|
|
48
|
+
## Фича как срез
|
|
49
|
+
|
|
50
|
+
- Для сложной фичи выравниваются имена и термины (**единый язык** предметной области) в типах, селекторах, сервисах и UI; структура папок — как в соседних фичах репозитория.
|
|
51
|
+
|
|
52
|
+
# Правила импортов
|
|
53
|
+
|
|
54
|
+
- Всегда использовать алиас `@/...` для импортов между слоями.
|
|
55
|
+
- Внутри одного модуля/фичи можно использовать относительные импорты, но **без подъёма выше корня фичи** (избегать `../../../`).
|
|
56
|
+
- При обращении из компонентов, хуков, утилит и других модулей к чужому слою или фиче использовать только **public API** (barrel/index‑файлы и явно экспортируемые сущности), не делать deep‑импорты внутренних файлов других фич; для регламентированных слоёв — **`architecture/layer-barrel-exports.md`** и `architecture/public-imports.md`; для API‑слоя снаружи `app/src/api/**` — **`architecture/public-imports.md`** (только `@/api`).
|
|
57
|
+
- При добавлении нового кода проверять:
|
|
58
|
+
- если модуль переиспользуемый — он должен зависеть только от более "низких" слоёв (types, utils, api), но не от страниц.
|
|
59
|
+
|
|
60
|
+
# Организация фич
|
|
61
|
+
|
|
62
|
+
- Для сложных фич (например, `OrderCheckout`):
|
|
63
|
+
- Страница: `app/src/ui/pages/OrderCheckoutPage/**`.
|
|
64
|
+
- Локальные компоненты: поддиректории `components/**` внутри страницы.
|
|
65
|
+
- Связанный store: `app/src/store/slices/OrderCheckout/**`.
|
|
66
|
+
- API: `app/src/api/services/OrdersApi/OrderCheckout/**` (имя корневого сервиса взять из принятой в проекте схемы).
|
|
67
|
+
- Типы: `app/src/types/**` с экспортом через barrel **`app/src/types/index.ts`** (`architecture/public-imports.md`).
|
|
68
|
+
|
|
69
|
+
# Требование к агенту
|
|
70
|
+
|
|
71
|
+
При добавлении новой функциональности:
|
|
72
|
+
|
|
73
|
+
- Разместить файлы в **соответствующих слоях**.
|
|
74
|
+
- Проверить существующие фичи с аналогичной структурой и **повторить их организацию**.
|
|
75
|
+
- Не "коротить" слои (например, не вызывать API прямо из компонента только ради упрощения).
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- app/src/ui/**/*
|
|
4
|
+
- app/src/store/**/*
|
|
5
|
+
- app/src/api/**/*
|
|
6
|
+
- app/src/types/**/*
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Доставка фичи (сквозной порядок)
|
|
10
|
+
|
|
11
|
+
Типичная фича с данными с backend и общим состоянием. Детали слоёв — `architecture/architecture-boundaries.md`, `stack/next-app-core.md`.
|
|
12
|
+
|
|
13
|
+
## Чеклист (порядок работ)
|
|
14
|
+
|
|
15
|
+
1. **Доменные типы** — `app/src/types/**`, barrel (`architecture/public-imports.md`, **`architecture/layer-barrel-exports.md`**); JSDoc — `stack/types-jsdoc.md`.
|
|
16
|
+
2. **Контракт API** — DTO там, где принято; доменные типы в `@/types`.
|
|
17
|
+
3. **Мапперы** — DTO → домен (`api-and-data/api-services.md`).
|
|
18
|
+
4. **Сервисы** — клиенты `app/src/api/clients/**`, barrel `@/api` (`api-and-data/api-services.md`, `api-and-data/http-client.md`, **`architecture/layer-barrel-exports.md`**).
|
|
19
|
+
5. **Состояние** — slice/thunk (`api-and-data/store-rtk.md`); thunk → `@/api`.
|
|
20
|
+
6. **UI** — `@/types`, без DTO (`ui-and-accessibility/react-ui.md`, `architecture/architecture-boundaries-ui.md`, `ui-and-accessibility/no-props-spread.md`).
|
|
21
|
+
7. **Моки** — `app/src/mocks/**`; регистрация в `handlers.ts` (см. ниже).
|
|
22
|
+
8. **Тесты** — unit (`testing/tests-unit.md`); e2e (`testing/tests-e2e-structure.md`, `testing/playwright-agents.md`).
|
|
23
|
+
9. **Завершение** — **`tooling-and-review/post-change-lint.md`**.
|
|
24
|
+
|
|
25
|
+
## Поток данных
|
|
26
|
+
|
|
27
|
+
```mermaid
|
|
28
|
+
flowchart LR
|
|
29
|
+
subgraph transport [Транспорт]
|
|
30
|
+
HttpClient[HttpClient]
|
|
31
|
+
end
|
|
32
|
+
DTO[DTO] --> Mappers[Мапперы]
|
|
33
|
+
Mappers --> Domain[Доменные типы]
|
|
34
|
+
Domain --> Service[API сервис]
|
|
35
|
+
Service --> HttpClient
|
|
36
|
+
Service --> Thunk[Thunk]
|
|
37
|
+
Thunk --> Store[Store]
|
|
38
|
+
Store --> UI[UI]
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Регистрация по слоям
|
|
42
|
+
|
|
43
|
+
1. **Типы** — `app/src/types/**`.
|
|
44
|
+
2. **API** — `app/src/api/services/<ServiceRoot>/<Segment>/`; публичные экспорты → **`app/src/api/index.ts`**.
|
|
45
|
+
3. **Моки** — `app/src/mocks/data/<feature>/`; **`app/src/mocks/handlers.ts`**; пути из `@/api`.
|
|
46
|
+
4. **Store** — `app/src/store/slices/<FeatureName>/`; **`app/src/store/reducers.ts`**; middleware → **`app/src/store/index.ts`**.
|
|
47
|
+
5. **UI** — pages/components; store/hooks.
|
|
48
|
+
6. **Unit** — `*.spec.ts(x)`; мапперы обязательно.
|
|
49
|
+
7. **E2E** — `app/__tests__/e2e/<Area>/<plan>.cases.md` + spec.
|
|
50
|
+
|
|
51
|
+
## Частичные сценарии
|
|
52
|
+
|
|
53
|
+
| Задача | Минимум действий |
|
|
54
|
+
|--------|------------------|
|
|
55
|
+
| Только API + типы | Типы, сервис, мапперы, `@/api` barrel; unit на маппер. |
|
|
56
|
+
| Только моки | Путь в `@/api`; handlers + `mocks/handlers.ts`. |
|
|
57
|
+
| Только store | Thunk на `@/api`; slice + `reducers.ts`. |
|
|
58
|
+
| Только UI | Store state; без HTTP/DTO. |
|
|
59
|
+
| Только e2e | `*.cases.md` + spec. |
|
|
60
|
+
|
|
61
|
+
## Антипаттерны
|
|
62
|
+
|
|
63
|
+
- DTO в UI или нетипизированном store.
|
|
64
|
+
- HTTP-клиент из компонента/thunk в обход сервиса.
|
|
65
|
+
- Deep-import `@/api/services/**` из UI/store.
|
|
66
|
+
- `{...props}` — `ui-and-accessibility/no-props-spread.md`.
|
|
67
|
+
|
|
68
|
+
## Матрица: зона → правила
|
|
69
|
+
|
|
70
|
+
| Зона | Правила |
|
|
71
|
+
|------|---------|
|
|
72
|
+
| `app/src/api/clients/**`, `app/src/lib/clients/**` | `api-and-data/http-client.md`, `testing/tests-unit.md` |
|
|
73
|
+
| `app/src/api/services/**` | `api-and-data/api-services.md`, `architecture/layer-barrel-exports.md` |
|
|
74
|
+
| `app/src/store/**` | `api-and-data/store-rtk.md`, `architecture/architecture-boundaries.md`, `architecture/public-imports.md` |
|
|
75
|
+
| `app/src/ui/**` | `ui-and-accessibility/react-ui.md`, `ui-and-accessibility/no-props-spread.md`, `architecture/public-imports.md` |
|
|
76
|
+
| `app/src/types/**` | `architecture/public-imports.md`, `stack/types-jsdoc.md`, `architecture/layer-barrel-exports.md` |
|
|
77
|
+
| `app/__tests__/e2e/**` | `testing/tests-e2e-structure.md`, `testing/playwright-agents.md` |
|
|
78
|
+
|
|
79
|
+
При добавлении или расширении фичи **пройти чеклист** и правила из таблицы для затронутых зон.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- app/src/**/index.ts
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Barrel-экспорты слоёв с public API
|
|
7
|
+
|
|
8
|
+
## Когда применять
|
|
9
|
+
|
|
10
|
+
Для **любого слоя** (каталога, пакета, bounded context), у которого:
|
|
11
|
+
|
|
12
|
+
- есть **корневой barrel** — единая точка импорта для внешних потребителей;
|
|
13
|
+
- deep-импорты внутрь слоя **запрещены** снаружи (ESLint `no-restricted-imports`, правила `architecture/public-imports.md`).
|
|
14
|
+
|
|
15
|
+
Примеры alias/entry point в разных проектах: `@/api`, `@/types`, `@/core`, `@/store`, `packages/foo`.
|
|
16
|
+
|
|
17
|
+
## Два уровня barrel
|
|
18
|
+
|
|
19
|
+
1. **Локальный** — `index.ts` модуля/фичи внутри слоя.
|
|
20
|
+
2. **Корневой public API** — barrel слоя (например `src/<layer>/index.ts`).
|
|
21
|
+
|
|
22
|
+
**Внутри** слоя — относительные импорты и пути между подмодулями. **Снаружи** — только корневой barrel и **явно разрешённые** вторичные entry points (если зафиксированы в правилах проекта, напр. `@/types/enums`).
|
|
23
|
+
|
|
24
|
+
## Что реэкспортировать наружу
|
|
25
|
+
|
|
26
|
+
Только символы, которые **должны быть доступны** потребителям слоя: публичные функции/сервисы/фасады, типы контракта, константы и helpers, нужные другим слоям или тестам.
|
|
27
|
+
|
|
28
|
+
**Не реэкспортировать:** внутренние адаптеры, мапперы, детали транспорта, промежуточные объекты для сборки фасада внутри слоя.
|
|
29
|
+
|
|
30
|
+
Группировка в корневом barrel — **по конвенции репозитория** (ориентир — соседние модули того же слоя).
|
|
31
|
+
|
|
32
|
+
## Чеклист агента (обязателен)
|
|
33
|
+
|
|
34
|
+
При добавлении или существенном расширении **модуля внутри регламентированного слоя**:
|
|
35
|
+
|
|
36
|
+
1. Определить слой, его **корневой barrel** и доп. entry points (`architecture/public-imports.md`).
|
|
37
|
+
2. Создать/обновить **локальный** `index.ts` — только публичные символы.
|
|
38
|
+
3. Если в слое есть **фасад/агрегатор** (`*ApiService.ts`, `rootReducer`, …) — подключить модуль там.
|
|
39
|
+
4. Добавить **реэкспорт** новых публичных символов в **корневой barrel** слоя.
|
|
40
|
+
5. **Проверка:** grep по имени символа или пути `./<Module>` в корневом barrel; снаружи слоя нет deep-импортов.
|
|
41
|
+
|
|
42
|
+
Модуль **не готов**, пока чеклист не пройден.
|
|
43
|
+
|
|
44
|
+
## Как найти регламентированные слои в репозитории
|
|
45
|
+
|
|
46
|
+
1. Правила `architecture/public-imports.md` в `.claude/rules/architecture/`.
|
|
47
|
+
2. ESLint `no-restricted-imports` — паттерны `@/<layer>/*` с исключением barrel.
|
|
48
|
+
3. `architecture/architecture-boundaries.md`, README проекта.
|
|
49
|
+
|
|
50
|
+
## В этом репозитории
|
|
51
|
+
|
|
52
|
+
| Слой | Корневой barrel | Правило импортов |
|
|
53
|
+
|------|-----------------|------------------|
|
|
54
|
+
| API | `app/src/api/index.ts` | `architecture/public-imports.md` |
|
|
55
|
+
| Types | `app/src/types/index.ts` | `architecture/public-imports.md` (+ `@/types/enums`) |
|
|
56
|
+
| Core | `app/src/core/index.ts` | ESLint: `@/core/index` |
|
|
57
|
+
|
|
58
|
+
Иллюстрация двух уровней (API): локальный `services/.../<Feature>/index.ts` → фасад `*ApiService.ts` → `app/src/api/index.ts`.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- app/src/ui/**/*
|
|
4
|
+
- app/src/store/**/*
|
|
5
|
+
- app/src/lib/**/*
|
|
6
|
+
- app/src/types/**/*
|
|
7
|
+
- app/src/api/**/*
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Публичные импорты (`@/types`, `@/api`)
|
|
11
|
+
|
|
12
|
+
**Коллизии:** импорт типов — раздел `@/types`; API вне `app/src/api/**` — раздел `@/api` (дублирует ESLint `no-restricted-imports`).
|
|
13
|
+
|
|
14
|
+
## `@/types`
|
|
15
|
+
|
|
16
|
+
- **Публичный API типов** — barrel `app/src/types/index.ts`; импортировать типы только как `@/types` (или `@/types/index`).
|
|
17
|
+
- **Запрещено** обходить barrel: `@/types/<что‑угодно>`, кроме enum.
|
|
18
|
+
- **Enum** — только `@/types/enums` / `@/types/enums.ts`.
|
|
19
|
+
- Внутри `app/src/types/**` — относительные импорты между файлами слоя.
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
// ✅
|
|
23
|
+
import type { TUserProfile } from '@/types'
|
|
24
|
+
import { SomeEnum } from '@/types/enums'
|
|
25
|
+
|
|
26
|
+
// ❌
|
|
27
|
+
import type { TUserProfile } from '@/types/User.types'
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Новые публичные типы — реэкспорт в `app/src/types/index.ts` по **`architecture/layer-barrel-exports.md`**.
|
|
31
|
+
|
|
32
|
+
## `@/api`
|
|
33
|
+
|
|
34
|
+
- **Публичный API** — barrel `app/src/api/index.ts`. Вне `app/src/api/**` — только `import … from '@/api'` (или `@/api/index`).
|
|
35
|
+
- **Запрещено** снаружи слоя: `@/api/<что‑угодно>`, кроме `@/api/index`.
|
|
36
|
+
- Внутри `app/src/api/**` — относительные импорты и `@/api/services/**`, `@/api/clients/**`.
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
// ✅ в store, UI, lib вне app/src/api
|
|
40
|
+
import { MedcardApiService } from '@/api'
|
|
41
|
+
|
|
42
|
+
// ❌ снаружи app/src/api
|
|
43
|
+
import { MedcardApiService } from '@/api/services/MedcardApiService/MedcardApiService'
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Новые публичные символы API — реэкспорт в `app/src/api/index.ts` по **`architecture/layer-barrel-exports.md`**.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- app/src/ui/**/*
|
|
4
|
+
- app/src/store/**/*
|
|
5
|
+
- app/src/api/**/*
|
|
6
|
+
- app/src/types/**/*
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Эталонные фичи (reference features)
|
|
10
|
+
|
|
11
|
+
Перед реализацией найди фичу того же типа и **повтори её структуру**, не изобретая новую организацию файлов.
|
|
12
|
+
|
|
13
|
+
## Таблица эталонов
|
|
14
|
+
|
|
15
|
+
Замени **TBD** на реальные пути после договорённости в команде (или при `ai-rules init` в целевом репо):
|
|
16
|
+
|
|
17
|
+
| Слой | Эталон | Что копировать |
|
|
18
|
+
|------|--------|----------------|
|
|
19
|
+
| UI page | **TBD** `app/src/ui/pages/<Example>/` | `components/`, `*.data.ts`, `styles.ts`, barrel |
|
|
20
|
+
| Store slice | **TBD** `app/src/store/slices/<example>/` | slice, thunks, selectors, types |
|
|
21
|
+
| API service | **TBD** `app/src/api/services/<example>/` | service, mappers, barrel |
|
|
22
|
+
| Types module | **TBD** `app/src/types/<example>/` | domain types, JSDoc, barrel export |
|
|
23
|
+
| Unit tests | **TBD** рядом с эталонным mapper/service | `*.spec.ts`, describe/it naming |
|
|
24
|
+
| E2E area | **TBD** `app/__tests__/e2e/<Area>/` | `*.cases.md`, page objects, `_shared/` |
|
|
25
|
+
|
|
26
|
+
## Как использовать
|
|
27
|
+
|
|
28
|
+
1. Определи затронутые слои из `decomposition.md` или задачи.
|
|
29
|
+
2. Открой эталон из таблицы (после заполнения путей).
|
|
30
|
+
3. Зеркаль именование, порядок файлов, паттерны импортов и тестов.
|
|
31
|
+
4. Если эталона нет — выбери **самую близкую** существующую фичу того же слоя и зафиксируй выбор в handoff.
|
|
32
|
+
|
|
33
|
+
## Связанные правила
|
|
34
|
+
|
|
35
|
+
- `tooling-and-review/code-quality.md` — повторять паттерны, не deep-import.
|
|
36
|
+
- `architecture/feature-delivery-workflow.md` — порядок слоёв.
|
|
37
|
+
- skill `feature-delivery` — end-to-end сценарий.
|
|
@@ -1,3 +1,12 @@
|
|
|
1
1
|
# Stack (Next.js, React, TypeScript)
|
|
2
2
|
|
|
3
|
-
Правила уровня фреймворка и
|
|
3
|
+
Правила уровня фреймворка и языка.
|
|
4
|
+
|
|
5
|
+
| Файл | Содержание | Загрузка |
|
|
6
|
+
|------|------------|----------|
|
|
7
|
+
| `next-app-core.md` | Стек, структура `app/`, слои, принципы агента | session start |
|
|
8
|
+
| `arrow-functions.md` | Стрелочный синтаксис | session start |
|
|
9
|
+
| `no-type-assertion.md` | Ограничение `as` на границах модулей | session start |
|
|
10
|
+
| `navigation-router-ui.md` | Навигация в UI-компонентах (slim) | `paths: app/src/ui/**/*.tsx` |
|
|
11
|
+
| `navigation-router.md` | Полный аудит стека навигации (App Router / SPA) | `paths: app/src/app/**` |
|
|
12
|
+
| `types-jsdoc.md` | JSDoc в `app/src/types` | `paths: app/src/types/**/*.ts` |
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- app/src/**/*.{ts,tsx,js,jsx}
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Стрелочные функции
|
|
7
|
+
|
|
8
|
+
При разработке **использовать стрелочный синтаксис** для функций, где это допустимо в TypeScript/JavaScript.
|
|
9
|
+
|
|
10
|
+
## Что делать
|
|
11
|
+
|
|
12
|
+
- Объявлять функции как **`const имя = (...) => { ... }`** вместо **`function имя(...) { ... }`**, если не нужны особенности объявления `function`.
|
|
13
|
+
- Колбэки и обработчики — стрелочные функции: `.map((x) => ...)`, `onClick={() => ...}`.
|
|
14
|
+
- React-компоненты и хуки — как стрелочные функции с явной типизацией пропсов/возврата по принятому в проекте стилю.
|
|
15
|
+
|
|
16
|
+
## Исключения (допустимо не стрелка)
|
|
17
|
+
|
|
18
|
+
- **Генераторы** (`function*`) — стрелкой не выразить.
|
|
19
|
+
- **Методы класса** — если в коде используются классы, допустимы обычные методы (`method() {}`).
|
|
20
|
+
- Когда осознанно нужны **подъём (hoisting)** или **имя функции в стеке** только у `function` — редкие случаи.
|
|
21
|
+
|
|
22
|
+
## Примеры
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
// ❌ Избегать для нового кода
|
|
26
|
+
function formatLabel(id: string): string {
|
|
27
|
+
return id.toUpperCase()
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// ✅ Предпочтительно
|
|
31
|
+
const formatLabel = (id: string): string => {
|
|
32
|
+
return id.toUpperCase()
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
// ✅ Предпочтительно
|
|
38
|
+
const UserCard = ({ name }: { name: string }) => {
|
|
39
|
+
return <span>{name}</span>
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Требование к агенту
|
|
44
|
+
|
|
45
|
+
При генерации и правке кода **по умолчанию выбирать стрелочные функции**; отступать к `function` только в случаях из раздела исключений.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- app/src/ui/**/*.tsx
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Navigation in UI components
|
|
7
|
+
|
|
8
|
+
Перед ссылками, программной навигацией или работой с URL в UI:
|
|
9
|
+
|
|
10
|
+
1. **`package.json`** workspace приложения — `next` vs `react-router-dom`.
|
|
11
|
+
2. **Соседние импорты** той же фичи (`next/navigation`, `next/link` vs `react-router-dom`).
|
|
12
|
+
3. **Обёртки проекта** (`@/ui/...` Link) — предпочтительнее сырого API роутера.
|
|
13
|
+
4. **По умолчанию (preset):** Next.js App Router → `next/navigation` + `next/link` (`stack/next-app-core.md`, `stack/next-app-router.md`).
|
|
14
|
+
|
|
15
|
+
Полный аудит (дерево маршрутов, гибриды, lockfile): **`stack/navigation-router.md`** — при правках `app/src/app/**`.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- app/src/app/**/*
|
|
4
|
+
- app/**/app/**/*
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Навигация и роутинг: сначала стек проекта
|
|
8
|
+
|
|
9
|
+
Краткий ориентир для UI-компонентов: **`stack/navigation-router-ui.md`**.
|
|
10
|
+
|
|
11
|
+
**При любой задаче, связанной с навигацией, переходами между страницами, URL, редиректами, хлебными крошками, защищёнными маршрутами или программной сменой маршрута** — перед предложением кода или импортов **нельзя** опираться на «типичный React» по умолчанию. Нужно **явно свериться со стеком целевого репозитория** и использовать **один** согласованный с проектом механизм.
|
|
12
|
+
|
|
13
|
+
## Зависимости: что проверить в первую очередь
|
|
14
|
+
|
|
15
|
+
1. **`package.json`** в корне приложения (например `app/package.json` в монорепо — тот пакет, который реально собирается и деплоится). Смотреть **`dependencies`** и при необходимости **`peerDependencies`**:
|
|
16
|
+
- **`next`** — Next.js; версия важна для нюансов API (сверяться с документацией под эту major).
|
|
17
|
+
- **`react-router-dom`**, **`@remix-run/*`**, **`@tanstack/react-router`** и т.д. — отдельный роутинг; не подменять их API вызовами Next без проверки, что в проекте действительно используется этот стек.
|
|
18
|
+
- **`next`** и **`react-router-dom`** одновременно — возможно легаси или гибрид; **не** выбирать API по умолчанию — смотреть раздел «Реализация в коде» ниже.
|
|
19
|
+
|
|
20
|
+
2. **Монорепо / workspaces** — роутинг может жить не в корневом `package.json`. Открыть **`package.json` того workspace**, где лежат страницы и `next.config.*` / точка входа SPA.
|
|
21
|
+
|
|
22
|
+
3. **Факт установки** — при сомнениях смотреть lockfile (`bun.lock`, `package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`) или каталог `node_modules` у соответствующего пакета: убедиться, что заявленный пакет реально установлен, а не только прописан в документации.
|
|
23
|
+
|
|
24
|
+
## Реализация роутинга в проекте (код и структура)
|
|
25
|
+
|
|
26
|
+
Перед предложением паттерна навигации **свериться с тем, как уже сделано в репозитории**:
|
|
27
|
+
|
|
28
|
+
1. **Дерево маршрутов**
|
|
29
|
+
- Next **App Router**: каталог **`app/`** (или `src/app/`) с `layout.tsx`, `page.tsx`, сегменты `[id]` и т.п.
|
|
30
|
+
- Next **Pages Router**: каталог **`pages/`** с `_app`, динамические `[slug].tsx`.
|
|
31
|
+
- Наличие **обоих** `app/` и `pages/` — уточнить по `next.config` и документации проекта, какой слой основной.
|
|
32
|
+
|
|
33
|
+
2. **Точки входа и обёртки**
|
|
34
|
+
- Поиск по коду импортов: **`from 'next/navigation'`**, **`from 'next/router'`**, **`from 'next/link'`**, **`from 'react-router-dom'`**, **`createBrowserRouter`**, **`RouterProvider`**, **`BrowserRouter`**.
|
|
35
|
+
- Где объявлены маршруты (файловая структура Next vs конфиг маршрутов / `routes.tsx` в SPA).
|
|
36
|
+
|
|
37
|
+
3. **Общие абстракции проекта**
|
|
38
|
+
- Обертки над ссылками (`@/ui/...`, `Link` из дизайн-системы), хелперы путей, константы роутов — **использовать их**, а не дублировать сырой роутер.
|
|
39
|
+
|
|
40
|
+
4. **Соседние файлы фичи**
|
|
41
|
+
- Новый код навигации — в том же стиле, что страницы/хуки той же области (`next/navigation` vs `react-router-dom` как в соседних импортах).
|
|
42
|
+
|
|
43
|
+
## Как определить, что использовать (сводка)
|
|
44
|
+
|
|
45
|
+
1. **Зависимости** — см. раздел выше; по ним задаётся допустимый набор пакетов.
|
|
46
|
+
2. **Структура** — App Router vs Pages vs SPA по каталогам и конфигу.
|
|
47
|
+
3. **Фактический код** — какие импорты и обёртки уже доминируют в приложении.
|
|
48
|
+
|
|
49
|
+
## Что использовать (краткая матрица)
|
|
50
|
+
|
|
51
|
+
| Стек | Программная навигация / чтение пути | Ссылки |
|
|
52
|
+
|------|-------------------------------------|--------|
|
|
53
|
+
| **Next.js App Router** | `next/navigation` (`useRouter`, `usePathname`, `useSearchParams`, `redirect` и т.д. по документации Next для вашей версии) | `next/link` |
|
|
54
|
+
| **Next.js Pages Router** | `next/router` | `next/link` |
|
|
55
|
+
| **SPA + React Router** | `react-router-dom` (`useNavigate`, `useParams`, `useLocation`, …) | `<Link>` из `react-router-dom` |
|
|
56
|
+
|
|
57
|
+
**Не делать:** подключать `react-router-dom` в проект на Next.js «по привычке»; импортировать хуки из `next/router` в компонентах App Router без проверки; смешивать два роутера в одном приложении без явной архитектурной причины в кодовой базе.
|
|
58
|
+
|
|
59
|
+
## Требование к агенту
|
|
60
|
+
|
|
61
|
+
- Перед генерацией или ревью кода навигации **коротко зафиксировать вывод** (например: «зависимости: `next` без `react-router-dom`; в коде везде `next/navigation` → используем то же») и следовать ему.
|
|
62
|
+
- **Обязательная проверка:** актуальные **`dependencies`** в `package.json` нужного workspace + **как в проекте уже реализованы** маршруты и импорты (поиск по репозиторию, соседние файлы). Не полагаться только на предположение по одному признаку (например, только на наличие папки `app/`).
|
|
63
|
+
- Если стек неочевиден (два роутера в зависимостях, гибрид) — **сверить lockfile / установленные пакеты** и **доминирующие импорты** в `src`/`app`, затем выбрать API.
|
|
64
|
+
- Для **этого** пресета базовый ориентир — **`stack/next-app-core.md`**: Next.js; предпочитать **`next/navigation`** и **`next/link`** там, где используется App Router.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Стек и окружение
|
|
2
|
+
|
|
3
|
+
Конкретные версии — **из `package.json` и конфигов целевого репозитория**. Рамка preset: Next.js, React, TypeScript; runner/e2e/mocks/UI/APM — как заведено в репо.
|
|
4
|
+
|
|
5
|
+
# Структура проекта
|
|
6
|
+
|
|
7
|
+
- `app/` — корень Next.js; `app/src/**` — код; `app/__tests__/e2e/**` — e2e.
|
|
8
|
+
- `app/tsconfig.json`: `baseUrl: "."`, `paths: { "@/*": ["./src/*"] }`.
|
|
9
|
+
- **Требование:** `@/*` вместо относительных импортов выше по дереву.
|
|
10
|
+
|
|
11
|
+
# Архитектурные слои
|
|
12
|
+
|
|
13
|
+
| Слой | Каталог | Детали |
|
|
14
|
+
|------|---------|--------|
|
|
15
|
+
| UI | `app/src/ui/**` (pages, components) | `ui-and-accessibility/react-ui.md`, `architecture/architecture-boundaries-ui.md` |
|
|
16
|
+
| Store | `app/src/store/**` (slices, middleware) | `api-and-data/store-rtk.md` |
|
|
17
|
+
| API | `app/src/api/**` (services, clients, barrel) | `api-and-data/api-services.md`, `api-and-data/http-client.md` |
|
|
18
|
+
| HTTP | `app/src/lib/clients/**`, `app/src/api/clients/**` | `api-and-data/http-client.md` |
|
|
19
|
+
| Types | `app/src/types/**` | `architecture/public-imports.md`, `stack/types-jsdoc.md` |
|
|
20
|
+
| Mocks | `app/src/mocks/**` | по схеме репозитория |
|
|
21
|
+
|
|
22
|
+
Границы слоёв, порты/адаптеры, UI→API — **`architecture/architecture-boundaries.md`**. Импорты `@/types`, `@/api` — **`architecture/public-imports.md`**.
|
|
23
|
+
|
|
24
|
+
# Работа агента
|
|
25
|
+
|
|
26
|
+
- Архитектура и импорты: `architecture/architecture-boundaries.md`, `architecture/public-imports.md`
|
|
27
|
+
- Фичи: `architecture/feature-delivery-workflow.md` + skill `feature-delivery`
|
|
28
|
+
- После правок: **вызвать** `tooling-and-review/post-change-lint.md` (requestable, обязателен после code edits); менеджер пакетов: `tooling-and-review/package-manager.md`
|
|
29
|
+
- Копировать паттерны соседних файлов в целевом слое; не использовать `any` (предпочитать `unknown` + сужение)
|
|
30
|
+
|
|
31
|
+
Задачи на **сеть, HTTP, новые эндпоинты**: `api-and-data/http-client.md` + `api-and-data/api-services.md` + `api-and-data/store-rtk.md`.
|
|
32
|
+
|
|
33
|
+
См. **`rules/README.md`** — полный каталог.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- app/src/app/**/*
|
|
4
|
+
- app/**/app/**/*
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Next.js App Router
|
|
8
|
+
|
|
9
|
+
Применять при работе с `app/src/app/**` или маршрутами App Router в целевом репо.
|
|
10
|
+
|
|
11
|
+
## Server vs Client
|
|
12
|
+
|
|
13
|
+
- **Server Components по умолчанию** — без `'use client'`, если не нужны hooks, browser API, event handlers.
|
|
14
|
+
- **`'use client'`** — только для интерактива, `useState`/`useEffect`, browser-only API.
|
|
15
|
+
- Не тянуть store/RTK и тяжёлый client-state в Server Components без необходимости.
|
|
16
|
+
|
|
17
|
+
## Data fetching
|
|
18
|
+
|
|
19
|
+
- Предпочитать fetch/data-loader на **server** (RSC, route handlers, server actions — по принятому в репо паттерну).
|
|
20
|
+
- **Не дублировать** один запрос в RSC и client без причины.
|
|
21
|
+
- Кеш и revalidate — как в существующих страницах репо (`fetch` options, `revalidate`, tags).
|
|
22
|
+
|
|
23
|
+
## Маршруты и UX
|
|
24
|
+
|
|
25
|
+
- Для async routes использовать **`loading.tsx`**, **`error.tsx`**, **`not-found.tsx`** по образцу соседних routes.
|
|
26
|
+
- **Suspense** — для медленных client/server секций; fallback согласован с дизайн-системой.
|
|
27
|
+
- Навигация — `stack/navigation-router.md` + router/link паттерны проекта.
|
|
28
|
+
|
|
29
|
+
## Границы слоёв
|
|
30
|
+
|
|
31
|
+
- RSC/route handlers **не импортируют UI-компоненты с client-only зависимостями** напрямую в server tree без `'use client'` границы.
|
|
32
|
+
- Доменные типы — `@/types`; вызовы backend — через `@/api` / services, не raw `fetch` из page.tsx без слоя API.
|
|
33
|
+
|
|
34
|
+
## Эталон
|
|
35
|
+
|
|
36
|
+
Смотри существующий route той же сложности в `app/src/app/**` и повтори структуру (`architecture/reference-features.md`).
|