@bonesofspring/ai-rules 0.1.42 → 0.2.1
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 +22 -0
- package/CONTRIBUTING.md +102 -0
- package/README.md +2 -0
- package/bin/cli.js +4 -2
- package/fragments/BUGBOT.md +23 -0
- package/package.json +10 -2
- package/presets/claude/next/BUGBOT.md +16 -0
- package/presets/claude/next/CLAUDE.md +6 -2
- package/presets/claude/next/agents/README.md +77 -15
- package/presets/claude/next/agents/api-contract-reviewer.md +1 -1
- package/presets/claude/next/agents/build-verifier.md +2 -0
- package/presets/claude/next/agents/code-reviewer.md +1 -1
- package/presets/claude/next/agents/feature-developer.md +8 -21
- package/presets/claude/next/agents/playwright-test-generator.md +16 -65
- package/presets/claude/next/agents/playwright-test-healer.md +16 -51
- package/presets/claude/next/agents/playwright-test-planner.md +15 -55
- package/presets/claude/next/agents/task-analyst.md +1 -1
- package/presets/claude/next/agents/task-router.md +50 -128
- package/presets/claude/next/agents/tech-writer.md +1 -1
- package/presets/claude/next/commands/task.md +1 -1
- package/presets/claude/next/hooks.json +17 -0
- package/presets/claude/next/rules/README.md +7 -3
- package/presets/claude/next/rules/api-and-data/api-services.md +3 -3
- package/presets/claude/next/rules/api-and-data/http-client.md +2 -2
- package/presets/claude/next/rules/api-and-data/store-rtk.md +2 -2
- package/presets/claude/next/rules/architecture/README.md +9 -11
- package/presets/claude/next/rules/architecture/api-public-imports.md +3 -26
- package/presets/claude/next/rules/architecture/architecture-boundaries-ui.md +15 -0
- package/presets/claude/next/rules/architecture/architecture-boundaries.md +10 -7
- package/presets/claude/next/rules/architecture/feature-delivery-workflow.md +44 -69
- package/presets/claude/next/rules/architecture/layer-barrel-exports.md +6 -6
- package/presets/claude/next/rules/architecture/public-imports.md +46 -0
- package/presets/claude/next/rules/architecture/reference-features.md +4 -1
- package/presets/claude/next/rules/architecture/types-public-imports.md +3 -29
- package/presets/claude/next/rules/stack/README.md +2 -1
- package/presets/claude/next/rules/stack/navigation-router-ui.md +15 -0
- package/presets/claude/next/rules/stack/navigation-router.md +2 -1
- package/presets/claude/next/rules/stack/next-app-core.md +20 -70
- package/presets/claude/next/rules/stack/no-type-assertion.md +3 -2
- package/presets/claude/next/rules/stack/types-jsdoc.md +1 -1
- package/presets/claude/next/rules/tooling-and-review/agent-team-intake.md +6 -0
- package/presets/claude/next/rules/tooling-and-review/agent-team-orchestrator.md +20 -1
- package/presets/claude/next/rules/tooling-and-review/code-quality.md +3 -11
- package/presets/claude/next/rules/tooling-and-review/code-review-mr.md +22 -59
- package/presets/claude/next/rules/tooling-and-review/package-manager.md +6 -15
- package/presets/claude/next/rules/tooling-and-review/post-change-lint.md +14 -24
- package/presets/claude/next/rules/ui-and-accessibility/README.md +1 -2
- package/presets/claude/next/rules/ui-and-accessibility/css-property-order.md +6 -18
- package/presets/claude/next/rules/ui-and-accessibility/react-ui.md +5 -4
- package/presets/claude/next/skills/feature-delivery/SKILL.md +5 -20
- package/presets/claude/next/team/README.md +1 -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/cursor/next/AGENTS.md +3 -10
- package/presets/cursor/next/BUGBOT.md +2 -0
- package/presets/cursor/next/agents/README.md +97 -15
- package/presets/cursor/next/agents/api-contract-reviewer.md +1 -1
- package/presets/cursor/next/agents/build-verifier.md +2 -0
- package/presets/cursor/next/agents/code-reviewer.md +2 -2
- package/presets/cursor/next/agents/feature-developer.md +9 -30
- package/presets/cursor/next/agents/task-analyst.md +1 -1
- package/presets/cursor/next/agents/task-router.md +49 -127
- package/presets/cursor/next/agents/tech-writer.md +1 -1
- package/presets/cursor/next/commands/task.md +1 -1
- package/presets/cursor/next/rules/README.md +27 -8
- package/presets/cursor/next/rules/agent-team-intake.mdc +2 -2
- package/presets/cursor/next/rules/agent-team-orchestrator.mdc +14 -1
- package/presets/cursor/next/rules/api-public-imports.mdc +3 -24
- package/presets/cursor/next/rules/api-services.mdc +3 -3
- package/presets/cursor/next/rules/architecture-boundaries-ui.mdc +15 -0
- package/presets/cursor/next/rules/architecture-boundaries.mdc +7 -7
- package/presets/cursor/next/rules/code-quality-and-refactoring.mdc +3 -11
- package/presets/cursor/next/rules/code-review-mr.mdc +20 -46
- package/presets/cursor/next/rules/css-property-order-stylelint.mdc +6 -18
- package/presets/cursor/next/rules/feature-delivery-workflow.mdc +45 -22
- package/presets/cursor/next/rules/http-client.mdc +2 -2
- package/presets/cursor/next/rules/layer-barrel-exports.mdc +6 -6
- package/presets/cursor/next/rules/navigation-router-stack.mdc +1 -1
- package/presets/cursor/next/rules/navigation-router-ui.mdc +16 -0
- package/presets/cursor/next/rules/next-app-core.mdc +18 -71
- package/presets/cursor/next/rules/no-cross-component-styles-import.mdc +3 -53
- package/presets/cursor/next/rules/no-type-assertion-as-import-export.mdc +4 -1
- package/presets/cursor/next/rules/package-manager.mdc +6 -15
- package/presets/cursor/next/rules/post-change-lint.mdc +14 -24
- package/presets/cursor/next/rules/public-imports.mdc +48 -0
- package/presets/cursor/next/rules/react-ui.mdc +5 -4
- package/presets/cursor/next/rules/reference-features.mdc +5 -1
- package/presets/cursor/next/rules/store-rtk.mdc +2 -2
- package/presets/cursor/next/rules/types-jsdoc.mdc +1 -1
- package/presets/cursor/next/rules/types-public-imports.mdc +3 -26
- package/presets/cursor/next/skills/feature-delivery/SKILL.md +5 -20
- package/presets/cursor/next/team/README.md +1 -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/scripts/README.md +84 -0
- package/scripts/golden-prompts.json +276 -0
- package/scripts/preset-manifest.json +72 -0
- package/scripts/regression-results/.gitkeep +0 -0
- package/scripts/validate-preset.sh +484 -0
- package/presets/claude/next/rules/ui-and-accessibility/component-styles.md +0 -56
- package/presets/cursor/next/rules/feature-delivery-flow.mdc +0 -74
|
@@ -1,59 +1,28 @@
|
|
|
1
1
|
---
|
|
2
2
|
paths:
|
|
3
|
-
- app/src/**/*
|
|
3
|
+
- app/src/ui/**/*
|
|
4
|
+
- app/src/store/**/*
|
|
5
|
+
- app/src/api/**/*
|
|
6
|
+
- app/src/types/**/*
|
|
4
7
|
---
|
|
5
8
|
|
|
6
9
|
# Доставка фичи (сквозной порядок)
|
|
7
10
|
|
|
8
|
-
Типичная фича с данными с backend и общим состоянием. Детали слоёв —
|
|
9
|
-
|
|
10
|
-
Плейсхолдеры: `<FeatureName>`, `<ServiceRoot>`, `<Area>` — нейтральные имена; реальные имена брать из соседних фич того же типа.
|
|
11
|
-
|
|
12
|
-
## Инварианты перед кодом
|
|
13
|
-
|
|
14
|
-
- Найти в том же слое фичу сопоставимой сложности и **повторить структуру каталогов и паттерн именования**.
|
|
15
|
-
- Не добавлять `any`; при необходимости — `unknown` и сужение типа.
|
|
16
|
-
- После правок — **`tooling-and-review/post-change-lint.md`**: `lint:js` + `lint:css` + `type-check`; менеджер пакетов — `tooling-and-review/package-manager.md`.
|
|
11
|
+
Типичная фича с данными с backend и общим состоянием. Детали слоёв — `architecture/architecture-boundaries.md`, `stack/next-app-core.md`.
|
|
17
12
|
|
|
18
13
|
## Чеклист (порядок работ)
|
|
19
14
|
|
|
20
|
-
1. **Доменные типы** — `app/src/types/**`,
|
|
21
|
-
2. **Контракт API** — DTO
|
|
22
|
-
3. **Мапперы** — DTO → домен
|
|
23
|
-
4. **Сервисы** —
|
|
24
|
-
5.
|
|
25
|
-
6.
|
|
26
|
-
7.
|
|
27
|
-
8.
|
|
28
|
-
9.
|
|
29
|
-
10. **Завершение** — **`tooling-and-review/post-change-lint.md`**: из `app/` обязательно `lint:js` + `lint:css` (полный прогон), затем `type-check`.
|
|
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`**.
|
|
30
24
|
|
|
31
|
-
##
|
|
32
|
-
|
|
33
|
-
```mermaid
|
|
34
|
-
flowchart LR
|
|
35
|
-
typesNode["types_domain"]
|
|
36
|
-
apiNode["api_services_mappers"]
|
|
37
|
-
mocksNode["mocks_msw"]
|
|
38
|
-
storeNode["store_slice_thunks"]
|
|
39
|
-
mwNode["middleware_optional"]
|
|
40
|
-
uiNode["ui_pages_components"]
|
|
41
|
-
unitNode["unit_tests"]
|
|
42
|
-
e2eNode["e2e_plans_specs"]
|
|
43
|
-
|
|
44
|
-
typesNode --> apiNode
|
|
45
|
-
apiNode --> mocksNode
|
|
46
|
-
apiNode --> storeNode
|
|
47
|
-
storeNode --> mwNode
|
|
48
|
-
storeNode --> uiNode
|
|
49
|
-
apiNode --> unitNode
|
|
50
|
-
storeNode --> unitNode
|
|
51
|
-
uiNode --> unitNode
|
|
52
|
-
uiNode --> e2eNode
|
|
53
|
-
mocksNode --> e2eNode
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
## Поток данных (ориентир)
|
|
25
|
+
## Поток данных
|
|
57
26
|
|
|
58
27
|
```mermaid
|
|
59
28
|
flowchart LR
|
|
@@ -69,36 +38,42 @@ flowchart LR
|
|
|
69
38
|
Store --> UI[UI]
|
|
70
39
|
```
|
|
71
40
|
|
|
72
|
-
##
|
|
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
|
+
## Частичные сценарии
|
|
73
52
|
|
|
74
53
|
| Задача | Минимум действий |
|
|
75
54
|
|--------|------------------|
|
|
76
|
-
| Только API + типы |
|
|
77
|
-
| Только моки |
|
|
78
|
-
| Только store | Thunk на
|
|
79
|
-
| Только UI |
|
|
80
|
-
| Только e2e |
|
|
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. |
|
|
81
60
|
|
|
82
61
|
## Антипаттерны
|
|
83
62
|
|
|
84
|
-
- DTO
|
|
85
|
-
-
|
|
86
|
-
- Deep
|
|
87
|
-
-
|
|
63
|
+
- DTO в UI или нетипизированном store.
|
|
64
|
+
- HTTP-клиент из компонента/thunk в обход сервиса.
|
|
65
|
+
- Deep-import `@/api/services/**` из UI/store.
|
|
66
|
+
- `{...props}` — `ui-and-accessibility/no-props-spread.md`.
|
|
88
67
|
|
|
89
|
-
## Матрица:
|
|
68
|
+
## Матрица: зона → правила
|
|
90
69
|
|
|
91
|
-
| Зона
|
|
92
|
-
|
|
93
|
-
| `app/src/api/clients/**`, `app/src/lib/clients/**` | `api-and-data/http-client.md
|
|
94
|
-
| `app/src/api/services/**` | `api-and-data/api-services.md`, `architecture/layer-barrel-exports.md
|
|
95
|
-
| `app/src/store/**` | `api-and-data/store-rtk.md`, `architecture/architecture-boundaries.md`, `architecture/
|
|
96
|
-
| `app/src/ui/**` | `ui-and-accessibility/react-ui.md`, `ui-and-accessibility/no-props-spread.md`, `architecture/
|
|
97
|
-
| `app/src/types/**` | `architecture/
|
|
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` |
|
|
98
77
|
| `app/__tests__/e2e/**` | `testing/tests-e2e-structure.md`, `testing/playwright-agents.md` |
|
|
99
78
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
## Требование к агенту
|
|
103
|
-
|
|
104
|
-
При добавлении или существенном расширении фичи **пройти чеклист сверху** и при правках в зоне из таблицы **ориентироваться на указанные правила**, не смешивать слои и не обходить public API модулей.
|
|
79
|
+
При добавлении или расширении фичи **пройти чеклист** и правила из таблицы для затронутых зон.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
paths:
|
|
3
|
-
- app/src
|
|
3
|
+
- app/src/**/index.ts
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Barrel-экспорты слоёв с public API
|
|
@@ -10,7 +10,7 @@ paths:
|
|
|
10
10
|
Для **любого слоя** (каталога, пакета, bounded context), у которого:
|
|
11
11
|
|
|
12
12
|
- есть **корневой barrel** — единая точка импорта для внешних потребителей;
|
|
13
|
-
- deep-импорты внутрь слоя **запрещены** снаружи (ESLint `no-restricted-imports`, правила `architecture
|
|
13
|
+
- deep-импорты внутрь слоя **запрещены** снаружи (ESLint `no-restricted-imports`, правила `architecture/public-imports.md`).
|
|
14
14
|
|
|
15
15
|
Примеры alias/entry point в разных проектах: `@/api`, `@/types`, `@/core`, `@/store`, `packages/foo`.
|
|
16
16
|
|
|
@@ -33,7 +33,7 @@ paths:
|
|
|
33
33
|
|
|
34
34
|
При добавлении или существенном расширении **модуля внутри регламентированного слоя**:
|
|
35
35
|
|
|
36
|
-
1. Определить слой, его **корневой barrel** и доп. entry points (`architecture
|
|
36
|
+
1. Определить слой, его **корневой barrel** и доп. entry points (`architecture/public-imports.md`).
|
|
37
37
|
2. Создать/обновить **локальный** `index.ts` — только публичные символы.
|
|
38
38
|
3. Если в слое есть **фасад/агрегатор** (`*ApiService.ts`, `rootReducer`, …) — подключить модуль там.
|
|
39
39
|
4. Добавить **реэкспорт** новых публичных символов в **корневой barrel** слоя.
|
|
@@ -43,7 +43,7 @@ paths:
|
|
|
43
43
|
|
|
44
44
|
## Как найти регламентированные слои в репозитории
|
|
45
45
|
|
|
46
|
-
1. Правила `architecture
|
|
46
|
+
1. Правила `architecture/public-imports.md` в `.claude/rules/architecture/`.
|
|
47
47
|
2. ESLint `no-restricted-imports` — паттерны `@/<layer>/*` с исключением barrel.
|
|
48
48
|
3. `architecture/architecture-boundaries.md`, README проекта.
|
|
49
49
|
|
|
@@ -51,8 +51,8 @@ paths:
|
|
|
51
51
|
|
|
52
52
|
| Слой | Корневой barrel | Правило импортов |
|
|
53
53
|
|------|-----------------|------------------|
|
|
54
|
-
| API | `app/src/api/index.ts` | `architecture/
|
|
55
|
-
| Types | `app/src/types/index.ts` | `architecture/
|
|
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
56
|
| Core | `app/src/core/index.ts` | ESLint: `@/core/index` |
|
|
57
57
|
|
|
58
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`**.
|
|
@@ -1,34 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
paths:
|
|
3
|
-
- app/src
|
|
4
|
-
- app/src/**/*.tsx
|
|
3
|
+
- app/src/types/**/*
|
|
5
4
|
---
|
|
6
5
|
|
|
7
|
-
#
|
|
6
|
+
# Deprecated
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
- **Запрещено** для потребителей слоя обходить barrel: любой импорт вида `@/types/<что‑угодно>`, кроме перечисленного ниже исключения для enum.
|
|
11
|
-
- Отдельно **нельзя** импортировать из вложенных файлов `*.types.ts` по путям `@/types/**/…*.types.ts` (типичный deep‑импорт).
|
|
12
|
-
- **Исключение — enum**: перечисления можно импортировать только из `@/types/enums` / `@/types/enums.ts` (не из других файлов под `@/types`).
|
|
13
|
-
|
|
14
|
-
## Внутри слоя `app/src/types/**`
|
|
15
|
-
|
|
16
|
-
- При реализации и поддержке barrel‑файла допустимы **относительные** импорты между файлами внутри `app/src/types` (например `from './User.types'`). Это не относится к потребителям слоя.
|
|
17
|
-
|
|
18
|
-
## Примеры
|
|
19
|
-
|
|
20
|
-
```typescript
|
|
21
|
-
// ✅ Допустимо — доменные и транспортные сущности с теми именами, что экспортирует barrel
|
|
22
|
-
import type { TUserProfile } from '@/types'
|
|
23
|
-
import { SomeEnum } from '@/types/enums'
|
|
24
|
-
|
|
25
|
-
// ❌ Запрещено (обход публичного API)
|
|
26
|
-
import type { TUserProfile } from '@/types/User.types'
|
|
27
|
-
import { TransportError } from '@/types/TransportError'
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
При ревью и правках кода **не добавлять** новые импорты типов из `@/types/...` кроме `@/types` и `@/types/enums`.
|
|
31
|
-
|
|
32
|
-
- Новые публичные типы — реэкспорт в `app/src/types/index.ts` по **`architecture/layer-barrel-exports.md`**.
|
|
33
|
-
|
|
34
|
-
**Коллизии формулировок:** если в разных правилах расходятся детали **импорта типов**, источник правды — **этот файл** (`@/types`, `@/types/enums`).
|
|
8
|
+
Содержимое перенесено в **`architecture/public-imports.md`** (раздел `@/types`).
|
|
@@ -7,5 +7,6 @@
|
|
|
7
7
|
| `next-app-core.md` | Стек, структура `app/`, слои, принципы агента | session start |
|
|
8
8
|
| `arrow-functions.md` | Стрелочный синтаксис | session start |
|
|
9
9
|
| `no-type-assertion.md` | Ограничение `as` на границах модулей | session start |
|
|
10
|
-
| `navigation-router.md` |
|
|
10
|
+
| `navigation-router-ui.md` | Навигация в UI-компонентах (slim) | `paths: app/src/ui/**/*.tsx` |
|
|
11
|
+
| `navigation-router.md` | Полный аудит стека навигации | `paths: app/src/app/**` |
|
|
11
12
|
| `types-jsdoc.md` | JSDoc в `app/src/types` | `paths: app/src/types/**/*.ts` |
|
|
@@ -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/**`.
|
|
@@ -1,83 +1,33 @@
|
|
|
1
1
|
# Стек и окружение
|
|
2
2
|
|
|
3
|
-
Конкретные версии
|
|
3
|
+
Конкретные версии — **из `package.json` и конфигов целевого репозитория**. Рамка preset: Next.js, React, TypeScript; runner/e2e/mocks/UI/APM — как заведено в репо.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
- **Сборка и Node:** как задано в репозитории.
|
|
7
|
-
- **Тесты:** unit/integration — runner и библиотеки проекта; e2e — инструмент проекта (правила для агентов Playwright — в `testing/playwright-agents.md`).
|
|
8
|
-
- **Моки HTTP/API:** если приняты в репо — повторять существующую схему (каталоги, регистрация, точка входа).
|
|
9
|
-
- **Стили и UI:** способ стилизации и **дизайн‑система / токены** — как уже заведено в коде; приоритет общим примитивам и токенам вместо разрозненных «магических» значений.
|
|
10
|
-
- **Наблюдаемость:** только если уже подключена в проекте — централизованно (клиент, обёртки), без дублирования в каждом методе.
|
|
5
|
+
# Структура проекта
|
|
11
6
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
-
|
|
15
|
-
- `app/src/**` — исходный код приложения.
|
|
16
|
-
- `app/__tests__/e2e/**` — e2e‑тесты и планы.
|
|
17
|
-
- `app/tsconfig.json`:
|
|
18
|
-
- `baseUrl: "."`
|
|
19
|
-
- `paths: { "@/*": ["./src/*"] }`
|
|
20
|
-
|
|
21
|
-
**Требование:** во всех новых изменениях использовать алиас `@/*` вместо относительных импортов выше по дереву.
|
|
7
|
+
- `app/` — корень Next.js; `app/src/**` — код; `app/__tests__/e2e/**` — e2e.
|
|
8
|
+
- `app/tsconfig.json`: `baseUrl: "."`, `paths: { "@/*": ["./src/*"] }`.
|
|
9
|
+
- **Требование:** `@/*` вместо относительных импортов выше по дереву.
|
|
22
10
|
|
|
23
11
|
# Архитектурные слои
|
|
24
12
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
- **HTTP‑транспорт** (`app/src/lib/clients/**`, `app/src/api/clients/**`):
|
|
34
|
-
- Один механизм запросов, без разбросанного «сырого» `fetch`/`XMLHttpRequest` по фичам. Детали — **`api-and-data/http-client.md`**.
|
|
35
|
-
- **Типы** (`app/src/types/**`):
|
|
36
|
-
- Доменные модели и транспортные контракты; **потребители** импортируют только через **`architecture/types-public-imports.md`** (`@/types`, `@/types/enums`).
|
|
37
|
-
- **Моки и тестовые данные** (`app/src/mocks/**`):
|
|
38
|
-
- По структуре и назначению — как принято в репозитории.
|
|
39
|
-
|
|
40
|
-
## Порты и адаптеры (сопоставление с каталогами)
|
|
41
|
-
|
|
42
|
-
Та же идея, что в `architecture/architecture-boundaries.md` (раздел **«Порты и адаптеры»**): UI и store зависят от **контракта** к backend (`@/api` + доменные типы), реализация HTTP — в **`app/src/lib/clients/**`** и **`app/src/api/clients/**`**. Детали транспорта — `api-and-data/http-client.md`; импорты `@/api` — `architecture/api-public-imports.md`.
|
|
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/**` | по схеме репозитория |
|
|
43
21
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
- **Чёткое разделение слоёв**:
|
|
47
|
-
- UI знает о доменных типах (из `@/types` / `@/types/enums`) и публичных API store; при необходимости импортирует из **`@/api`** — см. `architecture/api-public-imports.md` и `architecture/architecture-boundaries.md` (**«UI и обращение к API»**).
|
|
48
|
-
- Store знает о доменных типах и вызывает API‑сервисы через **`@/api`**.
|
|
49
|
-
- API‑сервисы знают о DTO, мапперах и вызовах через клиенты из `app/src/api/clients/**` (`api-and-data/http-client.md`).
|
|
50
|
-
- **Никаких «проникновений» слоёв**:
|
|
51
|
-
- UI не вызывает HTTP‑клиент и не работает с DTO; сценарии с записью в общий state — через store; узкие исключения для сервисов из UI — только по `architecture/architecture-boundaries.md`.
|
|
52
|
-
- Store не собирает запросы сам и не обходит API‑сервисы; данные для state — доменные модели после маппинга. Транспортные типы ответа/ошибки во thunk — как в `@/types`, согласованно с `api-and-data/http-client.md`, `api-and-data/store-rtk.md`.
|
|
53
|
-
- **Доменная логика и state**:
|
|
54
|
-
- DTO → домен — в **мапперах** и чистых функциях (`api-and-data/api-services.md`); **редюсеры и селекторы** — узкие. Подробности — `api-and-data/store-rtk.md`.
|
|
55
|
-
- **Типы — источник правды**:
|
|
56
|
-
- При коллизии по **импорту типов** — **`architecture/types-public-imports.md`**.
|
|
57
|
-
- Новые сущности — в `app/src/types/**` с экспортом через barrel.
|
|
58
|
-
- Не использовать `any`; при необходимости — `unknown` + безопасное сужение типа.
|
|
59
|
-
|
|
60
|
-
# Кодстайл и качества кода
|
|
61
|
-
|
|
62
|
-
- Следовать конфигам линтеров и форматтера **проекта** (`eslint`, `prettier`, `stylelint` — какие есть в репо).
|
|
63
|
-
- KISS, DRY, SOLID; модульность; визуальная консистентность через UI‑примитивы и токены.
|
|
64
|
-
- При добавлении нового кода **искать и копировать существующие паттерны**:
|
|
65
|
-
- Для страниц — `app/src/ui/pages/**`.
|
|
66
|
-
- Для блоков — `app/src/ui/components/**`.
|
|
67
|
-
- Для API — `app/src/api/services/**`.
|
|
68
|
-
- Для состояния — `app/src/store/slices/**`.
|
|
22
|
+
Границы слоёв, порты/адаптеры, UI→API — **`architecture/architecture-boundaries.md`**. Импорты `@/types`, `@/api` — **`architecture/public-imports.md`**.
|
|
69
23
|
|
|
70
24
|
# Работа агента
|
|
71
25
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
-
|
|
75
|
-
-
|
|
76
|
-
- Найти похожие примеры и **копировать архитектурный паттерн** (структура файлов, типы, именование).
|
|
77
|
-
- Не упрощать архитектуру (не тянуть DTO и HTTP в UI; вызовы сервисов из UI — только в рамках `architecture/architecture-boundaries.md`).
|
|
78
|
-
- Избегать `any`; при необходимости — `unknown` с безопасным сужением.
|
|
79
|
-
- После **любых** изменений — **`tooling-and-review/post-change-lint.md`** и **`tooling-and-review/package-manager.md`**.
|
|
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`; менеджер пакетов: `tooling-and-review/package-manager.md`
|
|
29
|
+
- Копировать паттерны соседних файлов в целевом слое; не использовать `any` (предпочитать `unknown` + сужение)
|
|
80
30
|
|
|
81
|
-
Задачи на **сеть,
|
|
31
|
+
Задачи на **сеть, HTTP, новые эндпоинты**: `api-and-data/http-client.md` + `api-and-data/api-services.md` + `api-and-data/store-rtk.md`.
|
|
82
32
|
|
|
83
|
-
См.
|
|
33
|
+
См. **`rules/README.md`** — полный каталог.
|
|
@@ -1,7 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- .claude/commands/**/*
|
|
4
|
+
- .claude/team/**/*
|
|
5
|
+
---
|
|
6
|
+
|
|
1
7
|
# Agent team orchestrator
|
|
2
8
|
|
|
3
9
|
Parent agent = **manager**. Router plans; specialists execute. Artifacts: `.claude/team/tasks/<slug>/`.
|
|
4
10
|
|
|
11
|
+
Work request без `/task` — см. **`tooling-and-review/agent-team-intake.md`**.
|
|
12
|
+
|
|
5
13
|
## Entry points
|
|
6
14
|
|
|
7
15
|
| Command | When |
|
|
@@ -116,6 +124,17 @@ After each agent completes, ensure `status.json` has `state: completed` (or `awa
|
|
|
116
124
|
|
|
117
125
|
If `pipeline.json` is missing (old `/feature-start` tasks), fall back to fixed phases: analysis → development → review → testing.
|
|
118
126
|
|
|
127
|
+
## Skip pipeline when
|
|
128
|
+
|
|
129
|
+
Do **not** run `/task` + router for:
|
|
130
|
+
|
|
131
|
+
- Pure questions («как работает X», «объясни»).
|
|
132
|
+
- Typo / one-file fix / trivial config with no architecture risk.
|
|
133
|
+
- User explicitly says «без pipeline», «просто сделай», or continues an active slug.
|
|
134
|
+
- Single-line `docs-only` with no code impact.
|
|
135
|
+
|
|
136
|
+
Borderline work requests — см. **`tooling-and-review/agent-team-intake.md`**.
|
|
137
|
+
|
|
119
138
|
## Auto-detection (optional)
|
|
120
139
|
|
|
121
|
-
When user describes a **task** (not a question
|
|
140
|
+
When user describes a **non-trivial task** (not a question), suggest `/task <message>` or run router if they agree.
|
|
@@ -32,19 +32,11 @@
|
|
|
32
32
|
- сначала локально улучшить архитектуру минимальными шагами;
|
|
33
33
|
- оставить код в консистентном состоянии.
|
|
34
34
|
|
|
35
|
-
##
|
|
35
|
+
## Линтеры
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
- Учитывать **Stylelint** для CSS и CSS-in-JS (конфиг: `app/.stylelintrc`; порядок свойств — `ui-and-accessibility/css-property-order.md`).
|
|
39
|
-
- Новый или изменённый код не должен нарушать эти правила.
|
|
40
|
-
- После **каждого** изменения кода агент **обязан** выполнить **`tooling-and-review/post-change-lint.md`**: полный прогон **`lint:js`** и **`lint:css`**, анализ вывода, исправление срабатываний в зоне задачи.
|
|
41
|
-
- Отключение правила (`eslint-disable`) — только **точечно** (строка/небольшой блок) и с **кратким комментарием**, зачем это нужно; отключать «на весь файл» без веской причины не следует.
|
|
37
|
+
Lint/stylelint — только **`tooling-and-review/post-change-lint.md`**; ESLint config: `app/eslint.config.mjs`. Отключение правила (`eslint-disable`) — только **точечно** с кратким комментарием «зачем».
|
|
42
38
|
|
|
43
39
|
## Требование к агенту
|
|
44
40
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
- Поддерживать принцип **«boy scout rule»**:
|
|
48
|
-
- оставлять модуль в немного лучшем состоянии, чем до изменения (простые, безопасные улучшения).
|
|
41
|
+
- **Boy scout rule:** оставлять модуль немного лучше, чем до изменения (простые, безопасные улучшения).
|
|
49
42
|
- Не жертвовать архитектурой и слоями ради краткости реализации.
|
|
50
|
-
- **Не завершать задачу**, пока не пройдены обязательные линтеры (`tooling-and-review/post-change-lint.md`).
|