@bonesofspring/ai-rules 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/README.md +10 -18
  2. package/bin/cli.js +73 -258
  3. package/package.json +3 -4
  4. package/presets/claude/ios-swift/CLAUDE.md +27 -0
  5. package/presets/claude/ios-swift/README.md +29 -0
  6. package/presets/claude/ios-swift/commands/README.md +3 -0
  7. package/presets/claude/ios-swift/rules/README.md +44 -0
  8. package/presets/claude/ios-swift/rules/api-and-data/README.md +9 -0
  9. package/presets/claude/ios-swift/rules/api-and-data/networking.md +49 -0
  10. package/presets/claude/ios-swift/rules/architecture/README.md +10 -0
  11. package/presets/claude/ios-swift/rules/architecture/boundaries.md +33 -0
  12. package/presets/claude/ios-swift/rules/architecture/feature-delivery.md +60 -0
  13. package/presets/claude/ios-swift/rules/stack/README.md +10 -0
  14. package/presets/claude/ios-swift/rules/stack/ios-app-core.md +42 -0
  15. package/presets/claude/ios-swift/rules/stack/swift-conventions.md +51 -0
  16. package/presets/claude/ios-swift/rules/testing/README.md +10 -0
  17. package/presets/claude/ios-swift/rules/testing/ui.md +41 -0
  18. package/presets/claude/ios-swift/rules/testing/unit.md +41 -0
  19. package/presets/claude/ios-swift/rules/tooling-and-review/README.md +11 -0
  20. package/presets/claude/ios-swift/rules/tooling-and-review/code-quality.md +38 -0
  21. package/presets/claude/ios-swift/rules/tooling-and-review/code-review.md +41 -0
  22. package/presets/claude/ios-swift/rules/tooling-and-review/post-change-build.md +31 -0
  23. package/presets/claude/ios-swift/rules/ui-and-accessibility/README.md +10 -0
  24. package/presets/claude/ios-swift/rules/ui-and-accessibility/swiftui.md +61 -0
  25. package/presets/claude/ios-swift/rules/ui-and-accessibility/viewmodels.md +43 -0
  26. package/presets/claude/next/CLAUDE.md +5 -29
  27. package/presets/claude/next/README.md +0 -10
  28. package/presets/claude/next/agents/README.md +0 -125
  29. package/presets/claude/next/commands/README.md +2 -10
  30. package/presets/claude/next/hooks/README.md +2 -5
  31. package/presets/claude/next/rules/README.md +11 -25
  32. package/presets/claude/next/rules/api-and-data/README.md +1 -7
  33. package/presets/claude/next/rules/architecture/README.md +2 -9
  34. package/presets/claude/next/rules/stack/README.md +1 -9
  35. package/presets/claude/next/rules/testing/README.md +1 -9
  36. package/presets/claude/next/rules/tooling-and-review/README.md +1 -14
  37. package/presets/claude/next/rules/ui-and-accessibility/README.md +1 -8
  38. package/presets/claude/next/skills/README.md +1 -11
  39. package/presets/cursor/ios-swift/README.md +17 -0
  40. package/presets/cursor/ios-swift/commands/README.md +3 -0
  41. package/presets/cursor/ios-swift/rules/README.md +33 -0
  42. package/presets/cursor/ios-swift/rules/architecture-boundaries.mdc +34 -0
  43. package/presets/cursor/ios-swift/rules/code-quality-and-refactoring.mdc +39 -0
  44. package/presets/cursor/ios-swift/rules/code-review-mr.mdc +42 -0
  45. package/presets/cursor/ios-swift/rules/feature-delivery-workflow.mdc +61 -0
  46. package/presets/cursor/ios-swift/rules/ios-app-core.mdc +43 -0
  47. package/presets/cursor/ios-swift/rules/networking-services.mdc +49 -0
  48. package/presets/cursor/ios-swift/rules/post-change-build.mdc +32 -0
  49. package/presets/cursor/ios-swift/rules/state-and-viewmodels.mdc +43 -0
  50. package/presets/cursor/ios-swift/rules/swift-conventions.mdc +51 -0
  51. package/presets/cursor/ios-swift/rules/swiftui-ui.mdc +61 -0
  52. package/presets/cursor/ios-swift/rules/tests-ui.mdc +41 -0
  53. package/presets/cursor/ios-swift/rules/tests-unit.mdc +41 -0
  54. package/presets/cursor/next/commands/README.md +1 -49
  55. package/presets/cursor/next/rules/README.md +0 -47
  56. package/presets/cursor/next/rules/api-services.mdc +10 -12
  57. package/presets/cursor/next/rules/architecture-boundaries.mdc +12 -31
  58. package/presets/cursor/next/rules/code-quality-and-refactoring.mdc +4 -5
  59. package/presets/cursor/next/rules/code-review-mr.mdc +7 -14
  60. package/presets/cursor/next/rules/next-app-core.mdc +61 -18
  61. package/presets/cursor/next/rules/no-props-spread.mdc +4 -27
  62. package/presets/cursor/next/rules/playwright-agents.mdc +1 -2
  63. package/presets/cursor/next/rules/react-ui.mdc +3 -32
  64. package/presets/cursor/next/rules/store-rtk.mdc +6 -13
  65. package/presets/cursor/next/rules/tests-unit.mdc +10 -30
  66. package/CHANGELOG.md +0 -22
  67. package/presets/claude/next/agents/accessibility-reviewer.md +0 -65
  68. package/presets/claude/next/agents/api-contract-reviewer.md +0 -69
  69. package/presets/claude/next/agents/build-verifier.md +0 -64
  70. package/presets/claude/next/agents/ci-investigator.md +0 -62
  71. package/presets/claude/next/agents/code-reviewer.md +0 -62
  72. package/presets/claude/next/agents/debugger.md +0 -63
  73. package/presets/claude/next/agents/feature-developer.md +0 -27
  74. package/presets/claude/next/agents/migration-specialist.md +0 -69
  75. package/presets/claude/next/agents/performance-auditor.md +0 -68
  76. package/presets/claude/next/agents/qa-tester.md +0 -56
  77. package/presets/claude/next/agents/security-reviewer.md +0 -64
  78. package/presets/claude/next/agents/solution-architect.md +0 -70
  79. package/presets/claude/next/agents/task-analyst.md +0 -109
  80. package/presets/claude/next/agents/task-router.md +0 -70
  81. package/presets/claude/next/agents/tech-writer.md +0 -60
  82. package/presets/claude/next/agents/unit-test-generator.md +0 -37
  83. package/presets/claude/next/agents/unit-test-healer.md +0 -38
  84. package/presets/claude/next/agents/unit-test-planner.md +0 -62
  85. package/presets/claude/next/commands/feature-continue.md +0 -51
  86. package/presets/claude/next/commands/feature-start.md +0 -30
  87. package/presets/claude/next/commands/task-continue.md +0 -49
  88. package/presets/claude/next/commands/task.md +0 -50
  89. package/presets/claude/next/commands/technical-retro.md +0 -58
  90. package/presets/claude/next/hooks/chain-team-phases.sh +0 -342
  91. package/presets/claude/next/hooks/guard-shell-command.sh +0 -77
  92. package/presets/claude/next/rules/api-and-data/api-services.md +0 -57
  93. package/presets/claude/next/rules/api-and-data/http-client.md +0 -40
  94. package/presets/claude/next/rules/api-and-data/store-rtk.md +0 -65
  95. package/presets/claude/next/rules/architecture/api-public-imports.md +0 -8
  96. package/presets/claude/next/rules/architecture/architecture-boundaries.md +0 -72
  97. package/presets/claude/next/rules/architecture/feature-delivery-workflow.md +0 -79
  98. package/presets/claude/next/rules/architecture/layer-barrel-exports.md +0 -58
  99. package/presets/claude/next/rules/architecture/public-imports.md +0 -46
  100. package/presets/claude/next/rules/architecture/reference-features.md +0 -37
  101. package/presets/claude/next/rules/architecture/types-public-imports.md +0 -8
  102. package/presets/claude/next/rules/stack/arrow-functions.md +0 -45
  103. package/presets/claude/next/rules/stack/navigation-router.md +0 -61
  104. package/presets/claude/next/rules/stack/next-app-core.md +0 -33
  105. package/presets/claude/next/rules/stack/next-app-router.md +0 -36
  106. package/presets/claude/next/rules/stack/no-type-assertion.md +0 -59
  107. package/presets/claude/next/rules/stack/types-jsdoc.md +0 -37
  108. package/presets/claude/next/rules/testing/playwright-agents.md +0 -74
  109. package/presets/claude/next/rules/testing/tests-e2e-structure.md +0 -52
  110. package/presets/claude/next/rules/testing/tests-unit.md +0 -66
  111. package/presets/claude/next/rules/tooling-and-review/agent-team-intake.md +0 -15
  112. package/presets/claude/next/rules/tooling-and-review/agent-team-orchestrator.md +0 -134
  113. package/presets/claude/next/rules/tooling-and-review/code-quality.md +0 -42
  114. package/presets/claude/next/rules/tooling-and-review/code-review-mr.md +0 -67
  115. package/presets/claude/next/rules/tooling-and-review/package-manager.md +0 -11
  116. package/presets/claude/next/rules/tooling-and-review/post-change-lint.md +0 -33
  117. package/presets/claude/next/rules/ui-and-accessibility/component-styles.md +0 -56
  118. package/presets/claude/next/rules/ui-and-accessibility/css-property-order.md +0 -14
  119. package/presets/claude/next/rules/ui-and-accessibility/no-props-spread.md +0 -57
  120. package/presets/claude/next/rules/ui-and-accessibility/react-a11y-coding.md +0 -37
  121. package/presets/claude/next/rules/ui-and-accessibility/react-ui.md +0 -90
  122. package/presets/claude/next/skills/ci-investigation/SKILL.md +0 -36
  123. package/presets/claude/next/skills/code-review/SKILL.md +0 -26
  124. package/presets/claude/next/skills/debug-investigation/SKILL.md +0 -28
  125. package/presets/claude/next/skills/feature-delivery/SKILL.md +0 -15
  126. package/presets/claude/next/skills/playwright-e2e/SKILL.md +0 -31
  127. package/presets/claude/next/skills/technical-retro/SKILL.md +0 -40
  128. package/presets/claude/next/skills/unit-testing/SKILL.md +0 -32
  129. package/presets/claude/next/team/README.md +0 -46
  130. package/presets/claude/next/team/tasks/.gitkeep +0 -1
  131. package/presets/cursor/next/AGENTS.md +0 -43
  132. package/presets/cursor/next/BUGBOT.md +0 -14
  133. package/presets/cursor/next/agents/README.md +0 -158
  134. package/presets/cursor/next/agents/accessibility-reviewer.md +0 -67
  135. package/presets/cursor/next/agents/api-contract-reviewer.md +0 -71
  136. package/presets/cursor/next/agents/build-verifier.md +0 -66
  137. package/presets/cursor/next/agents/ci-investigator.md +0 -64
  138. package/presets/cursor/next/agents/code-reviewer.md +0 -64
  139. package/presets/cursor/next/agents/debugger.md +0 -64
  140. package/presets/cursor/next/agents/feature-developer.md +0 -27
  141. package/presets/cursor/next/agents/migration-specialist.md +0 -71
  142. package/presets/cursor/next/agents/performance-auditor.md +0 -70
  143. package/presets/cursor/next/agents/playwright-test-generator.md +0 -26
  144. package/presets/cursor/next/agents/playwright-test-healer.md +0 -26
  145. package/presets/cursor/next/agents/playwright-test-planner.md +0 -28
  146. package/presets/cursor/next/agents/qa-tester.md +0 -57
  147. package/presets/cursor/next/agents/security-reviewer.md +0 -66
  148. package/presets/cursor/next/agents/solution-architect.md +0 -71
  149. package/presets/cursor/next/agents/task-analyst.md +0 -112
  150. package/presets/cursor/next/agents/task-router.md +0 -71
  151. package/presets/cursor/next/agents/tech-writer.md +0 -62
  152. package/presets/cursor/next/agents/unit-test-generator.md +0 -39
  153. package/presets/cursor/next/agents/unit-test-healer.md +0 -40
  154. package/presets/cursor/next/agents/unit-test-planner.md +0 -64
  155. package/presets/cursor/next/commands/feature-continue.md +0 -19
  156. package/presets/cursor/next/commands/feature-start.md +0 -33
  157. package/presets/cursor/next/commands/task-continue.md +0 -49
  158. package/presets/cursor/next/commands/task.md +0 -50
  159. package/presets/cursor/next/commands/technical-retro.md +0 -81
  160. package/presets/cursor/next/hooks/README.md +0 -8
  161. package/presets/cursor/next/hooks/chain-team-phases.sh +0 -380
  162. package/presets/cursor/next/hooks/guard-shell-command.sh +0 -77
  163. package/presets/cursor/next/hooks.json +0 -17
  164. package/presets/cursor/next/rules/agent-team-intake.mdc +0 -14
  165. package/presets/cursor/next/rules/agent-team-orchestrator.mdc +0 -139
  166. package/presets/cursor/next/rules/api-public-imports.mdc +0 -8
  167. package/presets/cursor/next/rules/arrow-functions.mdc +0 -46
  168. package/presets/cursor/next/rules/css-property-order-stylelint.mdc +0 -16
  169. package/presets/cursor/next/rules/feature-delivery-workflow.mdc +0 -76
  170. package/presets/cursor/next/rules/http-client.mdc +0 -42
  171. package/presets/cursor/next/rules/layer-barrel-exports.mdc +0 -59
  172. package/presets/cursor/next/rules/navigation-router-stack.mdc +0 -62
  173. package/presets/cursor/next/rules/next-app-router.mdc +0 -36
  174. package/presets/cursor/next/rules/no-cross-component-styles-import.mdc +0 -58
  175. package/presets/cursor/next/rules/no-type-assertion-as-import-export.mdc +0 -60
  176. package/presets/cursor/next/rules/package-manager.mdc +0 -16
  177. package/presets/cursor/next/rules/post-change-lint.mdc +0 -38
  178. package/presets/cursor/next/rules/public-imports.mdc +0 -48
  179. package/presets/cursor/next/rules/react-a11y-coding.mdc +0 -37
  180. package/presets/cursor/next/rules/reference-features.mdc +0 -39
  181. package/presets/cursor/next/rules/technical-retro.mdc +0 -12
  182. package/presets/cursor/next/rules/types-jsdoc.mdc +0 -42
  183. package/presets/cursor/next/rules/types-public-imports.mdc +0 -8
  184. package/presets/cursor/next/skills/README.md +0 -15
  185. package/presets/cursor/next/skills/ci-investigation/SKILL.md +0 -36
  186. package/presets/cursor/next/skills/code-review/SKILL.md +0 -26
  187. package/presets/cursor/next/skills/debug-investigation/SKILL.md +0 -28
  188. package/presets/cursor/next/skills/feature-delivery/SKILL.md +0 -15
  189. package/presets/cursor/next/skills/playwright-e2e/SKILL.md +0 -31
  190. package/presets/cursor/next/skills/technical-retro/SKILL.md +0 -40
  191. package/presets/cursor/next/skills/unit-testing/SKILL.md +0 -32
  192. package/presets/cursor/next/team/README.md +0 -104
  193. package/presets/cursor/next/team/tasks/.gitkeep +0 -0
@@ -1,139 +0,0 @@
1
- ---
2
- description: Orchestrates the agent team via task-router and pipeline.json. Use for /task, /task-continue, /feature-start, task decomposition, or when the user describes a feature, bug, or review request.
3
- alwaysApply: false
4
- ---
5
-
6
- # Agent team orchestrator
7
-
8
- Parent agent = **manager**. Router plans; specialists execute. Artifacts: `.cursor/team/tasks/<slug>/`.
9
-
10
- Work request без `/task` — см. **`agent-team-intake.mdc`** (когда предлагать router вместо прямого кодинга).
11
-
12
- ## Entry points
13
-
14
- | Command | When |
15
- |---------|------|
16
- | **`/task <desc>`** | **Preferred** — router → dynamic pipeline → first agent |
17
- | `/task-continue <slug>` | After human gate or pause |
18
- | `/feature-start <desc>` | Legacy: analyst-only start (no router) |
19
- | `/feature-continue <slug>` | Alias of task-continue |
20
- | `/technical-retro [slug]` | Retro with agent team block |
21
-
22
- ## Roles
23
-
24
- | Agent | readonly | Typical intent |
25
- |-------|----------|----------------|
26
- | `task-router` | yes | Every `/task` — writes `pipeline.json` |
27
- | `task-analyst` | yes | feature, refactor, test-only, a11y, docs-only, migration |
28
- | `solution-architect` | yes | spike, complex cross-layer feature |
29
- | `migration-specialist` | yes | migration — phased upgrade plan |
30
- | `api-contract-reviewer` | yes | new/changed backend API contracts |
31
- | `debugger` | no | bugfix |
32
- | `ci-investigator` | no | ci-fix — minimal CI repair |
33
- | `feature-developer` | no | feature, bugfix, refactor, migration, a11y |
34
- | `build-verifier` | yes | lint/type-check/unit gate after developer |
35
- | `accessibility-reviewer` | yes | a11y, UI-heavy feature |
36
- | `performance-auditor` | yes | perf-audit, perf-sensitive feature |
37
- | `code-reviewer` | yes | most pipelines, review-only |
38
- | `security-reviewer` | yes | auth, forms, sensitive data |
39
- | `qa-tester` | no | feature, bugfix, test-only |
40
- | `unit-test-planner` | yes | unit-only — coverage plan |
41
- | `unit-test-generator` | no | unit-only — spec generation |
42
- | `unit-test-healer` | no | failing/flaky unit tests |
43
- | `playwright-test-planner` | no | e2e scenario planning |
44
- | `playwright-test-generator` | no | e2e spec generation |
45
- | `playwright-test-healer` | no | failing/flaky e2e fixes |
46
- | `tech-writer` | yes | docs-only, feature/migration docs |
47
-
48
- Full prompts: `.cursor/agents/*.md`. Artifact conventions: `.cursor/team/README.md`.
49
-
50
- ## Dynamic pipeline
51
-
52
- ```mermaid
53
- flowchart TD
54
- task["/task prompt"]
55
- router["task-router"]
56
- pipeline["pipeline.json"]
57
- step0["steps 0..N"]
58
- gate{"humanGates?"}
59
- hook["subagentStop hook"]
60
- retro["/technical-retro"]
61
-
62
- task --> router
63
- router --> pipeline
64
- pipeline --> step0
65
- step0 --> gate
66
- gate -->|"/task-continue"| step0
67
- step0 --> hook
68
- hook --> step0
69
- step0 --> retro
70
- ```
71
-
72
- **Source of truth for order:** `pipeline.json` → `steps[]`. Never hardcode analyst → dev → review → QA when `pipeline.json` exists.
73
-
74
- ## status.json (pipeline mode)
75
-
76
- ```json
77
- {
78
- "slug": "...",
79
- "intent": "feature",
80
- "pipelineIndex": 0,
81
- "currentAgent": "task-analyst",
82
- "phase": "executing",
83
- "state": "in_progress",
84
- "awaitingHumanGate": false
85
- }
86
- ```
87
-
88
- | state | Meaning |
89
- |-------|---------|
90
- | `in_progress` | Current step running |
91
- | `completed` | Current step done; hook advances |
92
- | `awaiting_approval` | Human gate; wait for `/task-continue` |
93
- | `changes_requested` | Reviewer blocked; re-run developer (`retryAfterFix`) |
94
- | `validation_failed` | build-verifier failed; re-run developer then build-verifier |
95
-
96
- ## Pipeline step options
97
-
98
- | Field | Use |
99
- |-------|-----|
100
- | `skipIf` | `debugger.fixed` / `ci-investigator.resolved` — hook skips step when artifact says fix applied |
101
- | `parallel: true` | `agent` is array — invoke **all** agents in one parent turn; each appends to `parallelCompleted` |
102
- | `scope` | e.g. `unit-in-dev`, `e2e-only` — passed to developer/qa |
103
-
104
- ## Rules (strict)
105
-
106
- 1. **`/task` always starts with task-router** (except user says "skip router" with documented pipeline).
107
- 2. Read `pipeline.json` before every subagent invocation.
108
- 3. One role per Task call — **except** parallel steps: multiple Task calls in one message.
109
- 4. **Never** skip `humanGates` without `/task-continue` or explicit user approval.
110
- 5. Persist handoffs to disk (`brief.md`, `decomposition.md`, `debug-report.md`, `validation-report.md`, `architecture.md`, `migration-plan.md`, `ci-report.md`, `a11y-review.md`, `perf-report.md`, `security-review.md`, `api-contract-review.md`, `unit-test-plan.md`, `documentation.md`, `review.md`).
111
- 6. On `changes_requested` from reviewers: hook sets `retryAfterFix` → developer → same reviewer.
112
- 7. On `validation_failed` from `build-verifier`: hook sets `retryAfterFix: build-verifier` → developer → build-verifier.
113
- 8. When all steps complete, suggest `/technical-retro <slug>`.
114
- 9. If `autoChain: false` in pipeline, do not rely on hook — manual step only.
115
-
116
- ## Invoking agents
117
-
118
- Use Task tool or `/agent-name`. Pass: slug, artifact paths, step `scope` if set.
119
-
120
- After each agent completes, ensure `status.json` has `state: completed` (or `awaiting_approval` if gate applies).
121
-
122
- ## Legacy mode
123
-
124
- If `pipeline.json` is missing (old `/feature-start` tasks), fall back to fixed phases: analysis → development → review → testing. Hook supports both.
125
-
126
- ## Skip pipeline when
127
-
128
- Do **not** run `/task` + router for:
129
-
130
- - Pure questions («как работает X», «объясни»).
131
- - Typo / one-file fix / trivial config with no architecture risk.
132
- - User explicitly says «без pipeline», «просто сделай», or continues an active slug.
133
- - Single-line `docs-only` with no code impact.
134
-
135
- Borderline work requests — см. **`agent-team-intake.mdc`**.
136
-
137
- ## Auto-detection (optional)
138
-
139
- When user describes a **non-trivial task** (not a question), suggest `/task <message>` or run router if they agree.
@@ -1,8 +0,0 @@
1
- ---
2
- description: Moved to public-imports.mdc — read that file instead
3
- alwaysApply: false
4
- ---
5
-
6
- # Deprecated
7
-
8
- Содержимое перенесено в **`public-imports.mdc`** (раздел `@/api`).
@@ -1,46 +0,0 @@
1
- ---
2
- description: Предпочитать стрелочные функции при написании кода
3
- globs: app/src/**/*.{ts,tsx,js,jsx}
4
- alwaysApply: false
5
- ---
6
-
7
- # Стрелочные функции
8
-
9
- При разработке **использовать стрелочный синтаксис** для функций, где это допустимо в TypeScript/JavaScript.
10
-
11
- ## Что делать
12
-
13
- - Объявлять функции как **`const имя = (...) => { ... }`** вместо **`function имя(...) { ... }`**, если не нужны особенности объявления `function`.
14
- - Колбэки и обработчики — стрелочные функции: `.map((x) => ...)`, `onClick={() => ...}`.
15
- - React-компоненты и хуки — как стрелочные функции с явной типизацией пропсов/возврата по принятому в проекте стилю.
16
-
17
- ## Исключения (допустимо не стрелка)
18
-
19
- - **Генераторы** (`function*`) — стрелкой не выразить.
20
- - **Методы класса** — если в коде используются классы, допустимы обычные методы (`method() {}`), а не стрелки в теле класса (из‑за `this`).
21
- - Когда осознанно нужны **подъём (hoisting)** или **имя функции в стеке** только у `function` — редкие случаи; иначе предпочитать стрелку.
22
-
23
- ## Примеры
24
-
25
- ```typescript
26
- // ❌ Избегать для нового кода
27
- function formatLabel(id: string): string {
28
- return id.toUpperCase()
29
- }
30
-
31
- // ✅ Предпочтительно
32
- const formatLabel = (id: string): string => {
33
- return id.toUpperCase()
34
- }
35
- ```
36
-
37
- ```tsx
38
- // ✅ Предпочтительно
39
- const UserCard = ({ name }: { name: string }) => {
40
- return <span>{name}</span>
41
- }
42
- ```
43
-
44
- ## Требование к агенту
45
-
46
- При генерации и правке кода **по умолчанию выбирать стрелочные функции**; отступать к `function` только в случаях из раздела исключений.
@@ -1,16 +0,0 @@
1
- ---
2
- description: Порядок CSS-свойств по Stylelint (idiomatic-order) — для любых стилей в проекте
3
- globs:
4
- - app/src/ui/**/*.styles.ts
5
- - app/src/ui/**/*.styles.tsx
6
- - app/src/ui/**/styles.ts
7
- - app/src/ui/**/styles.tsx
8
- - app/**/*.css
9
- alwaysApply: false
10
- ---
11
-
12
- # Порядок CSS-свойств (как в Stylelint)
13
-
14
- Для CSS в `.css`, `styles.ts(x)`, `styled` / Linaria — порядок свойств как в **`app/.stylelintrc`** (`@sh/stylelint-config-react` → `stylelint-config-idiomatic-order`).
15
-
16
- Не дублировать список свойств вручную. Автоисправление из `app/`: **`yarn lint:css --fix`** (или менеджер пакетов репо). Полный прогон — **`post-change-lint.mdc`**.
@@ -1,76 +0,0 @@
1
- ---
2
- description: Сквозной чеклист новой фичи и матрица «слой → правило Cursor». Use when implementing features via feature-developer or feature-delivery skill.
3
- alwaysApply: false
4
- ---
5
-
6
- # Доставка фичи (сквозной порядок)
7
-
8
- Типичная фича с данными с backend и общим состоянием. Детали слоёв — `architecture-boundaries.mdc`, `next-app-core.mdc`.
9
-
10
- ## Чеклист (порядок работ)
11
-
12
- 1. **Доменные типы** — `app/src/types/**`, экспорт через barrel (`public-imports.mdc`, **`layer-barrel-exports.mdc`**); JSDoc — `types-jsdoc.mdc`.
13
- 2. **Контракт API** — DTO там, где принято; доменные типы в `@/types`.
14
- 3. **Мапперы** — DTO → домен в `*responseMappers.ts` (`api-services.mdc`).
15
- 4. **Сервисы** — клиенты `app/src/api/clients/**`, barrel `@/api` (`api-services.mdc`, `http-client.mdc`, **`layer-barrel-exports.mdc`**). Без `fetch` из UI/store.
16
- 5. **Состояние** — `createSlice` / `createAsyncThunk` (`store-rtk.mdc`); thunk → сервисы из `@/api`.
17
- 6. **UI** — типы из `@/types`, без DTO (`react-ui.mdc`, `architecture-boundaries.mdc`, `no-props-spread.mdc`).
18
- 7. **Моки** — по схеме репо; регистрация в `app/src/mocks/handlers.ts` (см. ниже).
19
- 8. **Тесты** — unit для мапперов (`tests-unit.mdc`); e2e по `*.cases.md` (`tests-e2e-structure.mdc`, `playwright-agents.mdc`).
20
- 9. **Завершение** — **`post-change-lint.mdc`**: `lint:js` + `lint:css` + `type-check`; менеджер — `package-manager.mdc`.
21
-
22
- ## Поток данных (ориентир)
23
-
24
- ```mermaid
25
- flowchart LR
26
- subgraph transport [Транспорт]
27
- HttpClient[HttpClient]
28
- end
29
- DTO[DTO] --> Mappers[Мапперы]
30
- Mappers --> Domain[Доменные типы]
31
- Domain --> Service[API сервис]
32
- Service --> HttpClient
33
- Service --> Thunk[Thunk]
34
- Thunk --> Store[Store]
35
- Store --> UI[UI]
36
- ```
37
-
38
- ## Регистрация по слоям
39
-
40
- 1. **Типы** — `app/src/types/**`; доменная модель — источник правды для UI и store.
41
- 2. **API** — `app/src/api/services/<ServiceRoot>/<Segment>/`; публичные экспорты (в т.ч. **константы путей** для моков) → **`app/src/api/index.ts`**.
42
- 3. **Моки (MSW)** — `app/src/mocks/data/<feature>/`; хендлеры в **`app/src/mocks/handlers.ts`**. Пути из `@/api`, не дублировать URL-строки. Проверить браузерный worker и Node `setupServer`, если оба используются.
43
- 4. **Store** — `app/src/store/slices/<FeatureName>/`; редюсер в **`app/src/store/reducers.ts`**. Middleware → `app/src/store/middleware/**`, регистрация в **`app/src/store/index.ts`**.
44
- 5. **UI** — `app/src/ui/pages/<FeatureName>Page/**` и/или `components/**`; данные через store/hooks.
45
- 6. **Unit** — `*.spec.ts(x)`; мапперы и нетривиальная логика — обязательно.
46
- 7. **E2E** — `app/__tests__/e2e/<Area>/<plan>.cases.md` + `*.spec.ts`.
47
-
48
- ## Частичные сценарии
49
-
50
- | Задача | Минимум действий |
51
- |--------|------------------|
52
- | Только API + типы | Типы, сервис, мапперы, `@/api` barrel; unit на маппер. |
53
- | Только моки | Путь в `@/api`; handlers + `mocks/handlers.ts`. |
54
- | Только store | Thunk на `@/api`; slice + `reducers.ts`. |
55
- | Только UI | Store state; без HTTP/DTO. |
56
- | Только e2e | `*.cases.md` + spec; page object. |
57
-
58
- ## Антипаттерны
59
-
60
- - DTO в UI или нетипизированном store.
61
- - HTTP-клиент из компонента/thunk в обход сервиса.
62
- - Deep-import `@/api/services/**` из UI/store.
63
- - `{...props}` в компоненты — `no-props-spread.mdc`.
64
-
65
- ## Матрица: зона → правила
66
-
67
- | Зона | Правила |
68
- |------|---------|
69
- | `app/src/api/clients/**`, `app/src/lib/clients/**` | `http-client.mdc`, `tests-unit.mdc` (behavior) |
70
- | `app/src/api/services/**` | `api-services.mdc`, `layer-barrel-exports.mdc`, `http-client.mdc` |
71
- | `app/src/store/**` | `store-rtk.mdc`, `architecture-boundaries.mdc`, `public-imports.mdc` |
72
- | `app/src/ui/**` | `react-ui.mdc`, `no-props-spread.mdc`, `public-imports.mdc` |
73
- | `app/src/types/**` | `public-imports.mdc`, `types-jsdoc.mdc`, `layer-barrel-exports.mdc` |
74
- | `app/__tests__/e2e/**` | `tests-e2e-structure.mdc`, `playwright-agents.mdc` |
75
-
76
- При добавлении или расширении фичи **пройти чеклист** и правила из таблицы для затронутых зон.
@@ -1,42 +0,0 @@
1
- ---
2
- description: Единый HTTP-клиент, типы ошибок и ответов
3
- globs:
4
- - app/src/lib/clients/HttpClient/**/*.ts
5
- - app/src/api/clients/**/*.ts
6
- alwaysApply: false
7
- ---
8
-
9
- # HTTP-транспорт
10
-
11
- **Имена** фабрик, классов ошибок, типов ответа и конфига — **как в текущем коде репозитория** и в barrel `app/src/types/index.ts`. Ниже — **архитектурные правила**, а не спецификация переименований.
12
-
13
- ## Роль слоя
14
-
15
- - Обычные REST‑вызовы к backend идут через **одну реализацию** в `app/src/lib/clients/**` (модуль общего клиента) и **преднастроенные экземпляры** в `app/src/api/clients/**`, по тому же паттерну, что уже принят в проекте.
16
- - Место транспорта в общей картине **порты и адаптеры** — в `architecture-boundaries.mdc` (раздел **«Порты и адаптеры»**).
17
- - **Не** вызывать `fetch` напрямую из `app/src/api/services/**`, store и UI (см. `architecture-boundaries.mdc`, `api-services.mdc`); из store/UI — только вызовы через сервисы из `@/api` (`public-imports.mdc`).
18
- - **Исключения** (узкие протоколы, отдельный транспорт) — только там, где в репозитории уже есть образец; повторять его, не плодить произвольные обходы общего клиента.
19
-
20
- ## Типы
21
-
22
- - Всё, что относится к **контракту запроса/ответа/ошибки** приложения и реэкспортируется для HTTP‑слоя, импортировать **только** из barrel `@/types`, без deep‑импортов из внутренних файлов `app/src/types/**` (см. `public-imports.mdc`).
23
- - Не поднимать в новом коде **типы и зависимости от внешнего HTTP‑клиента**, от которого проект ушёл; ориентир — **`package.json`** и существующие вызовы.
24
-
25
- ## Контракт ошибок
26
-
27
- - Ошибки сети и HTTP должны приходить в **едином виде**, который задаёт общий клиент (обычно класс/обёртка с полем вроде `response` для тела и статуса).
28
- - В **`catch`** ориентироваться на **фактическую форму** ошибки в этом репозитории (как в соседних слайсах/сервисах): доступ к телу ошибки, статусу, диагностическому коду — **по полям текущей реализации**, без выдумывания второго формата.
29
-
30
- ## Поведение, которое остаётся в клиенте
31
-
32
- - Общие заголовки, `credentials`, загрузка файлов (**FormData** / снятие лишних заголовков), бинарные ответы (**blob** и аналоги), единообразный разбор JSON и прочих тел.
33
- - Перехват **401 / refresh**, обработка **404** и т.п. — **централизованно**, если так уже сделано в клиенте; не дублировать ту же логику в каждом сервисе.
34
-
35
- ## Связь со store
36
-
37
- - Thunk может возвращать **тип обёртки успешного ответа**, если сервис так устроен; в **state** по возможности класть **доменные** типы после маппинга. Подробнее — `store-rtk.mdc`.
38
-
39
- ## Требование к агенту
40
-
41
- - Меняя реализацию общего клиента — **обновить или добавить behavior‑тесты** рядом с модулем клиента (`tests-unit.mdc`).
42
- - Не вводить **второй полноценный HTTP‑стек** без явной задачи и согласования с архитектурой репозитория.
@@ -1,59 +0,0 @@
1
- ---
2
- description: Двухуровневые barrel-экспорты для слоёв с регламентированным public API
3
- globs: app/src/**/*
4
- alwaysApply: false
5
- ---
6
-
7
- # Barrel-экспорты слоёв с public API
8
-
9
- ## Когда применять
10
-
11
- Для **любого слоя** (каталога, пакета, bounded context), у которого:
12
-
13
- - есть **корневой barrel** — единая точка импорта для внешних потребителей;
14
- - deep-импорты внутрь слоя **запрещены** снаружи (ESLint `no-restricted-imports`, правила `public-imports.mdc`).
15
-
16
- Примеры alias/entry point в разных проектах: `@/api`, `@/types`, `@/core`, `@/store`, `packages/foo`.
17
-
18
- ## Два уровня barrel
19
-
20
- 1. **Локальный** — `index.ts` модуля/фичи внутри слоя.
21
- 2. **Корневой public API** — barrel слоя (например `src/<layer>/index.ts`).
22
-
23
- **Внутри** слоя — относительные импорты и пути между подмодулями. **Снаружи** — только корневой barrel и **явно разрешённые** вторичные entry points (если зафиксированы в правилах проекта, напр. `@/types/enums`).
24
-
25
- ## Что реэкспортировать наружу
26
-
27
- Только символы, которые **должны быть доступны** потребителям слоя: публичные функции/сервисы/фасады, типы контракта, константы и helpers, нужные другим слоям или тестам.
28
-
29
- **Не реэкспортировать:** внутренние адаптеры, мапперы, детали транспорта, промежуточные объекты для сборки фасада внутри слоя.
30
-
31
- Группировка в корневом barrel — **по конвенции репозитория** (ориентир — соседние модули того же слоя).
32
-
33
- ## Чеклист агента (обязателен)
34
-
35
- При добавлении или существенном расширении **модуля внутри регламентированного слоя**:
36
-
37
- 1. Определить слой, его **корневой barrel** и доп. entry points (`public-imports.mdc`).
38
- 2. Создать/обновить **локальный** `index.ts` — только публичные символы.
39
- 3. Если в слое есть **фасад/агрегатор** (`*ApiService.ts`, `rootReducer`, …) — подключить модуль там.
40
- 4. Добавить **реэкспорт** новых публичных символов в **корневой barrel** слоя.
41
- 5. **Проверка:** grep по имени символа или пути `./<Module>` в корневом barrel; снаружи слоя нет deep-импортов.
42
-
43
- Модуль **не готов**, пока чеклист не пройден.
44
-
45
- ## Как найти регламентированные слои в репозитории
46
-
47
- 1. Правила `public-imports.mdc` в `.cursor/rules/`.
48
- 2. ESLint `no-restricted-imports` — паттерны `@/<layer>/*` с исключением barrel.
49
- 3. `architecture-boundaries.mdc`, README проекта.
50
-
51
- ## В этом репозитории
52
-
53
- | Слой | Корневой barrel | Правило импортов |
54
- |------|-------------------|------------------|
55
- | API | `app/src/api/index.ts` | `public-imports.mdc` |
56
- | Types | `app/src/types/index.ts` | `public-imports.mdc` (+ `@/types/enums`) |
57
- | Core | `app/src/core/index.ts` | ESLint: `@/core/index` |
58
-
59
- Иллюстрация двух уровней (API): локальный `services/.../<Feature>/index.ts` → фасад `*ApiService.ts` → `app/src/api/index.ts`.
@@ -1,62 +0,0 @@
1
- ---
2
- description: Выбор API навигации по стеку проекта (Next.js vs React Router)
3
- globs: app/src/ui/**/*
4
- alwaysApply: false
5
- ---
6
-
7
- # Навигация и роутинг: сначала стек проекта
8
-
9
- **При любой задаче, связанной с навигацией, переходами между страницами, URL, редиректами, хлебными крошками, защищёнными маршрутами или программной сменой маршрута** — перед предложением кода или импортов **нельзя** опираться на «типичный React» по умолчанию. Нужно **явно свериться со стеком целевого репозитория** и использовать **один** согласованный с проектом механизм.
10
-
11
- ## Зависимости: что проверить в первую очередь
12
-
13
- 1. **`package.json`** в корне приложения (например `app/package.json` в монорепо — тот пакет, который реально собирается и деплоится). Смотреть **`dependencies`** и при необходимости **`peerDependencies`**:
14
- - **`next`** — Next.js; версия важна для нюансов API (сверяться с документацией под эту major).
15
- - **`react-router-dom`**, **`@remix-run/*`**, **`@tanstack/react-router`** и т.д. — отдельный роутинг; не подменять их API вызовами Next без проверки, что в проекте действительно используется этот стек.
16
- - **`next`** и **`react-router-dom`** одновременно — возможно легаси или гибрид; **не** выбирать API по умолчанию — смотреть раздел «Реализация в коде» ниже.
17
-
18
- 2. **Монорепо / workspaces** — роутинг может жить не в корневом `package.json`. Открыть **`package.json` того workspace**, где лежат страницы и `next.config.*` / точка входа SPA.
19
-
20
- 3. **Факт установки** — при сомнениях смотреть lockfile (`bun.lock`, `package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`) или каталог `node_modules` у соответствующего пакета: убедиться, что заявленный пакет реально установлен, а не только прописан в документации.
21
-
22
- ## Реализация роутинга в проекте (код и структура)
23
-
24
- Перед предложением паттерна навигации **свериться с тем, как уже сделано в репозитории**:
25
-
26
- 1. **Дерево маршрутов**
27
- - Next **App Router**: каталог **`app/`** (или `src/app/`) с `layout.tsx`, `page.tsx`, сегменты `[id]` и т.п.
28
- - Next **Pages Router**: каталог **`pages/`** с `_app`, динамические `[slug].tsx`.
29
- - Наличие **обоих** `app/` и `pages/` — уточнить по `next.config` и документации проекта, какой слой основной.
30
-
31
- 2. **Точки входа и обёртки**
32
- - Поиск по коду импортов: **`from 'next/navigation'`**, **`from 'next/router'`**, **`from 'next/link'`**, **`from 'react-router-dom'`**, **`createBrowserRouter`**, **`RouterProvider`**, **`BrowserRouter`**.
33
- - Где объявлены маршруты (файловая структура Next vs конфиг маршрутов / `routes.tsx` в SPA).
34
-
35
- 3. **Общие абстракции проекта**
36
- - Обертки над ссылками (`@/ui/...`, `Link` из дизайн-системы), хелперы путей, константы роутов — **использовать их**, а не дублировать сырой роутер.
37
-
38
- 4. **Соседние файлы фичи**
39
- - Новый код навигации — в том же стиле, что страницы/хуки той же области (`next/navigation` vs `react-router-dom` как в соседних импортах).
40
-
41
- ## Как определить, что использовать (сводка)
42
-
43
- 1. **Зависимости** — см. раздел выше; по ним задаётся допустимый набор пакетов.
44
- 2. **Структура** — App Router vs Pages vs SPA по каталогам и конфигу.
45
- 3. **Фактический код** — какие импорты и обёртки уже доминируют в приложении.
46
-
47
- ## Что использовать (краткая матрица)
48
-
49
- | Стек | Программная навигация / чтение пути | Ссылки |
50
- |------|-------------------------------------|--------|
51
- | **Next.js App Router** | `next/navigation` (`useRouter`, `usePathname`, `useSearchParams`, `redirect` и т.д. по документации Next для вашей версии) | `next/link` |
52
- | **Next.js Pages Router** | `next/router` | `next/link` |
53
- | **SPA + React Router** | `react-router-dom` (`useNavigate`, `useParams`, `useLocation`, …) | `<Link>` из `react-router-dom` |
54
-
55
- **Не делать:** подключать `react-router-dom` в проект на Next.js «по привычке»; импортировать хуки из `next/router` в компонентах App Router без проверки; смешивать два роутера в одном приложении без явной архитектурной причины в кодовой базе.
56
-
57
- ## Требование к агенту
58
-
59
- - Перед генерацией или ревью кода навигации **коротко зафиксировать вывод** (например: «зависимости: `next` без `react-router-dom`; в коде везде `next/navigation` → используем то же») и следовать ему.
60
- - **Обязательная проверка:** актуальные **`dependencies`** в `package.json` нужного workspace + **как в проекте уже реализованы** маршруты и импорты (поиск по репозиторию, соседние файлы). Не полагаться только на предположение по одному признаку (например, только на наличие папки `app/`).
61
- - Если стек неочевиден (два роутера в зависимостях, гибрид) — **сверить lockfile / установленные пакеты** и **доминирующие импорты** в `src`/`app`, затем выбрать API.
62
- - Для **этого** репозитория базовый ориентир — **`next-app-core.mdc`**: Next.js; предпочитать **`next/navigation`** и **`next/link`** там, где используется App Router.
@@ -1,36 +0,0 @@
1
- ---
2
- description: Next.js App Router — Server/Client Components, data fetching, loading and error UI
3
- globs: app/src/app/**/*,app/**/app/**/*
4
- alwaysApply: false
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
- - Навигация — `navigation-router-stack.mdc` + 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/**` и повтори структуру (`reference-features.mdc`).
@@ -1,58 +0,0 @@
1
- ---
2
- description: Стили компонентов — колокация, импорты, корневой styled как Root
3
- globs:
4
- - app/src/ui/**/*.ts
5
- - app/src/ui/**/*.tsx
6
- alwaysApply: false
7
- ---
8
-
9
- # Стили только рядом с компонентом
10
-
11
- ## Имя корневого styled-элемента: `Root`
12
-
13
- - В `styles.ts` (или аналоге) **корневой** styled-элемент — тот, что оборачивает весь JSX компонента — экспортируется как **`Root`**.
14
- - В разметке: `<s.Root>...</s.Root>` при `import * as s from './styles'`.
15
- - Вложенные и соседние примитивы именуются по смыслу: `Title`, `List`, `Item`, `Header` и т.д.
16
- - Если нет одной styled-обёртки на весь компонент (только фрагмент или один нативный тег без своего styled), экспорта `Root` может не быть. Когда вводится **одна** внешняя styled-обёртка всего JSX — она называется **`Root`**, а не `Container`, `Wrapper`, `Block` и т.п.
17
-
18
- ```tsx
19
- // ✅ Хорошо
20
- export const Root = styled.div` ... `
21
- // в компоненте: <s.Root>...</s.Root>
22
-
23
- // ❌ Плохо для единственной обёртки всего компонента
24
- export const Service = styled.div` ... `
25
- ```
26
-
27
- ## Правило
28
-
29
- **Запрещено** импортировать модули стилей, которые лежат в каталоге **другого** UI-компонента или блока (не в том же каталоге, что и текущий файл).
30
-
31
- Под «модулями стилей» имеются в виду в первую очередь:
32
-
33
- - `styles.ts` / `styles.tsx` рядом с компонентом;
34
- - `*.module.css`, `*.module.scss` и аналоги, принадлежащие конкретному компоненту;
35
- - любые файлы, которые **экспортируют только styled-примитивы** для одного компонента.
36
-
37
- ## Разрешено
38
-
39
- - `import * as s from './styles'` — стили **в той же папке**, что и компонент.
40
- - Импорты **общих** примитивов дизайн-системы, токенов, общих UI из `@/ui/components/...` или пакетов, если это **не** приватный `styles` чужой фичи.
41
- - Повторное использование визуала через **сам компонент** (композиция), а не через его `styles`.
42
-
43
- ## Примеры
44
-
45
- ```tsx
46
- // ✅ Хорошо — локальный styles
47
- import * as s from './styles'
48
-
49
- // ❌ Плохо — стили родителя/соседа
50
- import * as s from '../../styles'
51
- import * as s from '../RequestForAnalysisServices/styles'
52
- ```
53
-
54
- ## Почему
55
-
56
- - Единое имя **`Root`** ускоряет чтение: сразу видно входную точку разметки компонента.
57
- - Стили и разметка компонента должны меняться вместе, без скрытой связи через чужие файлы.
58
- - Упрощается рефакторинг и поиск владельца стилей.
@@ -1,60 +0,0 @@
1
- ---
2
- description: Избегать приведения типов через as на границах модулей (импорт/экспорт)
3
- globs:
4
- - app/src/api/**/*
5
- - app/src/store/**/*
6
- - app/src/types/**/*
7
- alwaysApply: false
8
- ---
9
-
10
- # Не использовать `as` для приведения типов при экспорте и импорте (кроме необходимых случаев)
11
-
12
- ## О чём речь
13
-
14
- Речь о **type assertion** в TypeScript: выражение вида `значение as Тип`.
15
-
16
- **Не относится к правилу** (это не assertion, а синтаксис модулей):
17
-
18
- - переименование при экспорте: `export { foo as bar }`, `export { default as Baz } from '...'`;
19
- - переименование при импорте: `import { foo as bar } from '...'`;
20
- - `import type { Foo as Bar }` — алиас типа в импорте типов.
21
-
22
- ## Требование
23
-
24
- - На **публичной границе модуля** (то, что **экспортируется** из файла / barrel, и то, что сразу **присваивается импортированным символам** с принудительным приведением) **не использовать** `as Тип` для «подгонки» типов, если можно обойтись нормальной типизацией.
25
-
26
- ## Предпочитать вместо `as`
27
-
28
- - явную аннотацию: `const x: T = ...` / `function f(): T`;
29
- - **дженерики** у функций и классов;
30
- - **`satisfies`** (когда нужно проверить совместимость без сужения до `any`);
31
- - сужение **`unknown`** после проверки (type guards, `zod` и т.п.);
32
- - правку **исходных типов/DTO/мапперов**, а не assertion на выходе.
33
-
34
- ## Когда `as` допустим
35
-
36
- - взаимодействие с **не типизированными** или некорректно типизированными внешними модулями, где нет разумной альтернативы;
37
- - узкие места после **валидации** данных, если типовый гард всё ещё не выразить без шума (предпочтительно всё же guard/`satisfies`);
38
- - **`as const`** — когда нужны литеральные типы и широкий вывод ломает контракт (это отдельный механизм; применять по делу, не как замену типизации API).
39
- - блок **`catch (error)`** после вызова HTTP через общий клиент: по возможности сужать через **`instanceof`** на **класс ошибки транспорта** из `@/types` (какой именно — по существующей реализации) и работать с уже суженным типом; голый **`as` к тому же типу** — только если `instanceof` недоступен (иной источник выброса) и осознанно.
40
-
41
- ## Примеры
42
-
43
- ```typescript
44
- // ❌ Плохо: assertion на экспортируемом API
45
- export const config = loadRaw() as AppConfig
46
-
47
- // ✅ Лучше: аннотация + проверка или маппер
48
- export const config: AppConfig = mapToAppConfig(loadRaw())
49
-
50
- // ❌ Плохо: сразу после импорта «ломаем» тип
51
- import { getData } from './api'
52
- export const data = getData() as MyDto[]
53
-
54
- // ✅ Лучше: типизировать getData / обернуть типобезопасной функцией
55
- ```
56
-
57
- ## Требование к агенту
58
-
59
- При ревью и генерации кода **не добавлять** новые `as Тип` на экспортируемые сущности и на цепочку import → export без явной необходимости; по возможности исправлять контракт типов в источнике.
60
- - В слайсах и сервисах при обработке ошибок API сначала рассматривать **`instanceof`** на класс ошибки транспорта из `@/types` по образцу существующего кода (`http-client.mdc`, `store-rtk.mdc`).
@@ -1,16 +0,0 @@
1
- ---
2
- description: Перед командами в терминале определять менеджер пакетов репозитория и использовать только его
3
- alwaysApply: true
4
- ---
5
-
6
- # Менеджер пакетов (терминал)
7
-
8
- Перед **`npm install` / `yarn` / `pnpm` / `bun`** и **`… run …`** определи менеджер репозитория и **используй только его**.
9
-
10
- ## Как определить
11
-
12
- 1. **`packageManager`** в `package.json` (корень или `app/package.json`).
13
- 2. **Lockfile** рядом: `yarn.lock` → yarn; `pnpm-lock.yaml` → pnpm; `package-lock.json` → npm; `bun.lock(b)` → bun.
14
- 3. Если неоднозначно — где `node_modules` и какой lockfile в CI.
15
-
16
- Рабочий каталог для scripts — **`app/`**. Примеры: `yarn lint`, `pnpm run test`. Не угадывай — проверь файлы.