@bonesofspring/ai-rules 0.1.41 → 0.2.0
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/README.md +10 -1
- package/bin/cli.js +193 -53
- package/package.json +1 -1
- package/presets/claude/next/CLAUDE.md +1 -1
- package/presets/claude/next/agents/README.md +61 -0
- 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/feature-developer.md +8 -21
- package/presets/claude/next/agents/task-router.md +24 -126
- package/presets/claude/next/commands/task.md +1 -1
- package/presets/claude/next/rules/README.md +3 -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 +8 -11
- package/presets/claude/next/rules/architecture/api-public-imports.md +3 -26
- package/presets/claude/next/rules/architecture/architecture-boundaries.md +6 -6
- package/presets/claude/next/rules/architecture/feature-delivery-workflow.md +44 -69
- package/presets/claude/next/rules/architecture/layer-barrel-exports.md +5 -5
- 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/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 +14 -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 +2 -2
- 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/css-property-order.md +6 -18
- package/presets/claude/next/rules/ui-and-accessibility/react-ui.md +1 -1
- package/presets/claude/next/skills/feature-delivery/SKILL.md +5 -20
- package/presets/cursor/next/AGENTS.md +1 -1
- package/presets/cursor/next/agents/README.md +81 -0
- 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 +1 -1
- package/presets/cursor/next/agents/feature-developer.md +9 -30
- package/presets/cursor/next/agents/task-router.md +23 -125
- package/presets/cursor/next/commands/task.md +1 -1
- package/presets/cursor/next/rules/README.md +6 -7
- 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.mdc +6 -6
- package/presets/cursor/next/rules/code-quality-and-refactoring.mdc +3 -11
- package/presets/cursor/next/rules/code-review-mr.mdc +2 -2
- 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 +5 -5
- package/presets/cursor/next/rules/next-app-core.mdc +18 -71
- 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 +1 -1
- 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/rules/feature-delivery-flow.mdc +0 -74
|
@@ -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`).
|
|
@@ -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.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`** — полный каталог.
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Parent agent = **manager**. Router plans; specialists execute. Artifacts: `.claude/team/tasks/<slug>/`.
|
|
4
4
|
|
|
5
|
+
Work request без `/task` — см. **`tooling-and-review/agent-team-intake.md`**.
|
|
6
|
+
|
|
5
7
|
## Entry points
|
|
6
8
|
|
|
7
9
|
| Command | When |
|
|
@@ -116,6 +118,17 @@ After each agent completes, ensure `status.json` has `state: completed` (or `awa
|
|
|
116
118
|
|
|
117
119
|
If `pipeline.json` is missing (old `/feature-start` tasks), fall back to fixed phases: analysis → development → review → testing.
|
|
118
120
|
|
|
121
|
+
## Skip pipeline when
|
|
122
|
+
|
|
123
|
+
Do **not** run `/task` + router for:
|
|
124
|
+
|
|
125
|
+
- Pure questions («как работает X», «объясни»).
|
|
126
|
+
- Typo / one-file fix / trivial config with no architecture risk.
|
|
127
|
+
- User explicitly says «без pipeline», «просто сделай», or continues an active slug.
|
|
128
|
+
- Single-line `docs-only` with no code impact.
|
|
129
|
+
|
|
130
|
+
Borderline work requests — см. **`tooling-and-review/agent-team-intake.md`**.
|
|
131
|
+
|
|
119
132
|
## Auto-detection (optional)
|
|
120
133
|
|
|
121
|
-
When user describes a **task** (not a question
|
|
134
|
+
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`).
|
|
@@ -18,13 +18,13 @@
|
|
|
18
18
|
### Импорты и организация кода
|
|
19
19
|
|
|
20
20
|
- Использование алиаса `@/...` вместо относительных импортов выше по дереву.
|
|
21
|
-
- Отсутствие deep‑импортов во внешние фичи; только public API; в файлах вне `app/src/api/**` импорты из API — только `from '@/api'` (`architecture/
|
|
21
|
+
- Отсутствие deep‑импортов во внешние фичи; только public API; в файлах вне `app/src/api/**` импорты из API — только `from '@/api'` (`architecture/public-imports.md`, дублирует ESLint).
|
|
22
22
|
- При новых/изменённых модулях в регламентированных слоях — реэкспорт публичных символов в корневой barrel по **`architecture/layer-barrel-exports.md`**.
|
|
23
23
|
- Размещение новых файлов в корректных слоях и директориях фич.
|
|
24
24
|
|
|
25
25
|
### Типы и TS‑строгость
|
|
26
26
|
|
|
27
|
-
- Не допускать новых `any`; предпочитать доменные типы из `@/types` (barrel, см. `architecture/
|
|
27
|
+
- Не допускать новых `any`; предпочитать доменные типы из `@/types` (barrel, см. `architecture/public-imports.md`).
|
|
28
28
|
- Проверять корректность пропсов/возвращаемых типов, особенно в UI и API‑слое.
|
|
29
29
|
|
|
30
30
|
### UI и стили
|
|
@@ -1,20 +1,11 @@
|
|
|
1
1
|
# Менеджер пакетов (терминал)
|
|
2
2
|
|
|
3
|
-
Перед **`npm install` / `yarn` / `pnpm` / `bun`** и
|
|
3
|
+
Перед **`npm install` / `yarn` / `pnpm` / `bun`** и **`… run …`** определи менеджер репозитория и **используй только его**.
|
|
4
4
|
|
|
5
|
-
## Как определить
|
|
5
|
+
## Как определить
|
|
6
6
|
|
|
7
|
-
1.
|
|
8
|
-
2. **Lockfile**
|
|
9
|
-
|
|
10
|
-
- `pnpm-lock.yaml` → **pnpm**
|
|
11
|
-
- `package-lock.json` → **npm**
|
|
12
|
-
- `bun.lock` / `bun.lockb` → **bun**
|
|
13
|
-
3. Если неоднозначно — где лежат **`node_modules`** и какой lockfile обновляют в CI.
|
|
7
|
+
1. **`packageManager`** в `package.json` (корень или `app/package.json`).
|
|
8
|
+
2. **Lockfile** рядом: `yarn.lock` → yarn; `pnpm-lock.yaml` → pnpm; `package-lock.json` → npm; `bun.lock(b)` → bun.
|
|
9
|
+
3. Если неоднозначно — где `node_modules` и какой lockfile в CI.
|
|
14
10
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
- Рабочий каталог — там, где **`package.json`** с нужными **scripts** (в этом репозитории — **`app/`**).
|
|
18
|
-
- Примеры: `yarn lint`, `pnpm run test` — **в соответствии с обнаруженным менеджером**.
|
|
19
|
-
|
|
20
|
-
Если менеджер неочевиден — **посмотри файлы** инструментами чтения, **не угадывай**.
|
|
11
|
+
Рабочий каталог для scripts — **`app/`**. Примеры: `yarn lint`, `pnpm run test`. Не угадывай — проверь файлы.
|
|
@@ -2,42 +2,32 @@
|
|
|
2
2
|
|
|
3
3
|
## Когда применять
|
|
4
4
|
|
|
5
|
-
После **любого** изменения исходников в
|
|
5
|
+
После **любого** изменения исходников в `app/**` (TS/TSX/JS/MJS, CSS, styled/Linaria в `.ts`/`.tsx`).
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Исключения: правки документации вне `app/`, конфигов CI, `.claude/rules/**`, если исполняемый код приложения не менялся.
|
|
8
|
+
|
|
9
|
+
**Pipeline exception:** если задача идёт через agent team и следующий шаг — `build-verifier`, developer может ограничиться lint/type-check **изменённых файлов**; полный прогон — обязанность `build-verifier`. В single-agent режиме (без pipeline) — всегда полный прогон.
|
|
8
10
|
|
|
9
11
|
## Обязательные команды
|
|
10
12
|
|
|
11
|
-
Рабочий каталог — **`app
|
|
13
|
+
Рабочий каталог — **`app/`**. Менеджер пакетов — **`tooling-and-review/package-manager.md`**.
|
|
12
14
|
|
|
13
|
-
1. **`lint:js`** — полный ESLint по
|
|
15
|
+
1. **`lint:js`** — полный ESLint по проекту.
|
|
14
16
|
2. **`lint:css`** — полный Stylelint (`**/*.{css,ts}`).
|
|
15
17
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
Точечный ESLint/Stylelint только на один файл **не заменяет** полный прогон перед завершением задачи.
|
|
18
|
+
Точечный lint на один файл **не заменяет** полный прогон перед завершением задачи (кроме pipeline exception выше).
|
|
19
19
|
|
|
20
|
-
## Алгоритм
|
|
20
|
+
## Алгоритм
|
|
21
21
|
|
|
22
22
|
1. Завершить правки кода.
|
|
23
|
-
2. Запустить **`lint:js`** и **`lint:css`** из `app
|
|
24
|
-
3.
|
|
25
|
-
4.
|
|
26
|
-
5.
|
|
27
|
-
6. **Не считать задачу выполненной**, пока оба линтера не завершились с кодом 0 **или** в ответе пользователю не зафиксирован блокер (например, легаси вне скоупа) с перечислением оставшихся замечаний.
|
|
23
|
+
2. Запустить **`lint:js`** и **`lint:css`** из `app/`.
|
|
24
|
+
3. Проанализировать весь вывод; исправить errors/warnings в изменённых файлах; для Stylelint — **`lint:css --fix`** если автоисправимо.
|
|
25
|
+
4. Повторить до exit code 0 или зафиксировать блокер в ответе пользователю.
|
|
26
|
+
5. **`type-check`** при изменениях TypeScript. CI-уровень: **`lint`** (= `lint:js` + `lint:css` + `type-check`).
|
|
28
27
|
|
|
29
28
|
## Что исправлять
|
|
30
29
|
|
|
31
30
|
- **Errors** — обязательно.
|
|
32
|
-
- **Warnings** — обязательно в файлах
|
|
33
|
-
- **`eslint-disable`** — только точечно, с кратким комментарием «зачем» (`tooling-and-review/code-quality.md`).
|
|
34
|
-
|
|
35
|
-
## Связанные проверки
|
|
36
|
-
|
|
37
|
-
- **`type-check`** — обязателен при изменениях TypeScript (`stack/next-app-core.md`); не подменяет ESLint/Stylelint.
|
|
38
|
-
- Полная валидация как в CI: **`lint`** (= `lint:js` + `lint:css` + `type-check`) — уместна перед крупным MR.
|
|
39
|
-
|
|
40
|
-
## Конфиги
|
|
31
|
+
- **Warnings** — обязательно в файлах задачи; вне скоупа — упомянуть, если мешают нулевому exit code.
|
|
41
32
|
|
|
42
|
-
|
|
43
|
-
- Stylelint: `app/.stylelintrc` (порядок свойств — `ui-and-accessibility/css-property-order.md`)
|
|
33
|
+
Конфиги: `app/eslint.config.mjs`, `app/.stylelintrc` (порядок CSS — `ui-and-accessibility/css-property-order.md`).
|
|
@@ -1,26 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
paths:
|
|
3
|
-
- app/src/**/*.
|
|
3
|
+
- app/src/ui/**/*.styles.ts
|
|
4
|
+
- app/src/ui/**/*.styles.tsx
|
|
5
|
+
- app/src/ui/**/styles.ts
|
|
6
|
+
- app/src/ui/**/styles.tsx
|
|
4
7
|
- app/**/*.css
|
|
5
8
|
---
|
|
6
9
|
|
|
7
10
|
# Порядок CSS-свойств (как в Stylelint)
|
|
8
11
|
|
|
9
|
-
|
|
12
|
+
Порядок свойств — как в **`app/.stylelintrc`** (`stylelint-config-idiomatic-order`). Не дублировать список вручную.
|
|
10
13
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
Пиши объявления в **одном** блоке в такой последовательности групп:
|
|
14
|
-
|
|
15
|
-
1. **`composes`** — только для CSS Modules (если есть).
|
|
16
|
-
2. **`all`**
|
|
17
|
-
3. **Позиционирование:** `position`, `z-index`, затем `top`, `right`, `bottom`, `left`.
|
|
18
|
-
4. **Отображение и раскладка:** `display`, `overflow`.
|
|
19
|
-
5. **Размеры:** `width`, `min-width`, `max-width`, `height`, `min-height`, `max-height`, `box-sizing`.
|
|
20
|
-
6. **Flex:** `flex`, `flex-basis`, `flex-direction`, `flex-flow`, `flex-grow`, `flex-shrink`, `flex-wrap`, `align-content`, `align-items`, `align-self`, `justify-content`, `order`.
|
|
21
|
-
7. **Внутренние отступы:** `padding-top`, `padding-right`, `padding-bottom`, `padding-left`.
|
|
22
|
-
8. **Рамка:** общие `border`, `border-width`, `border-style`, `border-color`, `border-radius`; затем для сторон **сверху по часовой** — `border-top` и его `-width`, `-style`, `-color`, `-radius`, то же для `right`, `bottom`, `left`.
|
|
23
|
-
9. **Внешние отступы:** `margin-top`, `margin-right`, `margin-bottom`, `margin-left`.
|
|
24
|
-
10. **Остальные свойства** — после перечисленных, **по алфавиту** (типографика, фон, анимации, `cursor`, и т.д.).
|
|
25
|
-
|
|
26
|
-
Автоисправление из каталога `app`: `lint:css --fix` (проверяет `**/*.{css,ts}`; менеджер пакетов — `tooling-and-review/package-manager.md`).
|
|
14
|
+
Автоисправление из `app/`: **`lint:css --fix`**. Полный прогон — **`tooling-and-review/post-change-lint.md`**.
|
|
@@ -72,7 +72,7 @@ paths:
|
|
|
72
72
|
- **Не передавать пропы в компоненты через spread** (`<Foo {...x} />`). Только явные атрибуты; подробности — `ui-and-accessibility/no-props-spread.md` (в `app/src/ui` это дополнительно ловит ESLint).
|
|
73
73
|
- Описывать пропсы через `type Props = { ... }` или `interface Props { ... }`.
|
|
74
74
|
- Не использовать `any`; при необходимости — обобщения (`<T>`), `unknown`, type guards.
|
|
75
|
-
- Для доменных сущностей использовать типы из `@/types` (и enum из `@/types/enums`), а не описывать их заново (`architecture/
|
|
75
|
+
- Для доменных сущностей использовать типы из `@/types` (и enum из `@/types/enums`), а не описывать их заново (`architecture/public-imports.md`).
|
|
76
76
|
|
|
77
77
|
# Логика и side effects
|
|
78
78
|
|
|
@@ -5,26 +5,11 @@ description: Delivers Next.js frontend features end-to-end across domain types,
|
|
|
5
5
|
|
|
6
6
|
# Feature Delivery
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
3. Work in layer order: types -> API -> store -> UI -> **unit tests** -> e2e (if in scope).
|
|
13
|
-
4. Keep DTOs out of UI/store; expose domain types through `@/types` and API calls through `@/api`.
|
|
14
|
-
5. Prefer small, reviewable edits; update barrels when adding public symbols.
|
|
15
|
-
6. Add or update focused tests for changed behavior.
|
|
16
|
-
7. Run project validation from `app/`: `lint:js`, `lint:css`, and `type-check` when TypeScript changed.
|
|
17
|
-
|
|
18
|
-
## Rule Map
|
|
19
|
-
|
|
20
|
-
- Core stack and layers: `rules/stack/next-app-core.md`, `rules/architecture/architecture-boundaries.md`.
|
|
21
|
-
- Data/API: `rules/api-and-data/http-client.md`, `rules/api-and-data/api-services.md`, `rules/api-and-data/store-rtk.md`.
|
|
22
|
-
- Public imports: `rules/architecture/types-public-imports.md`, `rules/architecture/api-public-imports.md`, `rules/architecture/layer-barrel-exports.md`.
|
|
23
|
-
- UI: `rules/ui-and-accessibility/react-ui.md`, `react-a11y-coding.md`, `no-props-spread.md`, `component-styles.md`.
|
|
24
|
-
- App Router: `rules/stack/next-app-router.md`.
|
|
25
|
-
- Tests: `rules/testing/tests-unit.md`, `rules/testing/tests-e2e-structure.md`, `rules/testing/playwright-agents.md`.
|
|
26
|
-
- Finish: `rules/tooling-and-review/post-change-lint.md`, `rules/tooling-and-review/package-manager.md`.
|
|
8
|
+
1. Read task brief, acceptance criteria, and decomposition if present.
|
|
9
|
+
2. Read **`rules/architecture/feature-delivery-workflow.md`** and **`rules/architecture/reference-features.md`** — follow layer order and mirror closest reference feature.
|
|
10
|
+
3. Add or update focused tests for changed behavior.
|
|
11
|
+
4. Validation from `app/`: see **`rules/tooling-and-review/post-change-lint.md`** (pipeline: scoped lint OK if next step is `build-verifier`).
|
|
27
12
|
|
|
28
13
|
## Handoff
|
|
29
14
|
|
|
30
|
-
Summarize
|
|
15
|
+
Summarize by layer, validation results, and known gaps. Agent team: update `.claude/team/tasks/<slug>/status.json`.
|
|
@@ -8,7 +8,7 @@ See `.cursor/rules/README.md` for the full catalog and loading strategy.
|
|
|
8
8
|
|
|
9
9
|
| Задача | Куда смотреть |
|
|
10
10
|
|--------|----------------|
|
|
11
|
-
| Любая новая work-задача | `/task` → `commands/task.md` + `agent-team-orchestrator.mdc` |
|
|
11
|
+
| Любая новая work-задача | `/task` → `commands/task.md` + `agent-team-orchestrator.mdc` (+ `agent-team-intake.mdc` on-demand) |
|
|
12
12
|
| Новая фича end-to-end | skill `feature-delivery` + `feature-delivery-workflow.mdc` |
|
|
13
13
|
| Стек и слои | `next-app-core.mdc` |
|
|
14
14
|
| Эталонные фичи | `reference-features.mdc` (заполнить пути в репо) |
|
|
@@ -75,3 +75,84 @@
|
|
|
75
75
|
| `docs-only` | analyst → tech-writer |
|
|
76
76
|
|
|
77
77
|
Опциональные шаги (router добавляет по контексту): `api-contract-reviewer`, `accessibility-reviewer`, `security-reviewer`, `performance-auditor`, `tech-writer`.
|
|
78
|
+
|
|
79
|
+
## pipeline.json reference
|
|
80
|
+
|
|
81
|
+
### Step fields
|
|
82
|
+
|
|
83
|
+
| Field | Required | Description |
|
|
84
|
+
|-------|----------|-------------|
|
|
85
|
+
| `agent` | yes | Subagent name (kebab-case) or array for `parallel: true` |
|
|
86
|
+
| `label` | yes | Short human-readable step name |
|
|
87
|
+
| `scope` | no | e.g. `unit-in-dev`, `e2e-only`, `regression`, `full` |
|
|
88
|
+
| `skipIf` | no | `debugger.fixed` \| `ci-investigator.resolved` |
|
|
89
|
+
| `parallel` | no | When `true` and `agent` is array — invoke all in one turn |
|
|
90
|
+
|
|
91
|
+
### Minimal template
|
|
92
|
+
|
|
93
|
+
```json
|
|
94
|
+
{
|
|
95
|
+
"slug": "<slug>",
|
|
96
|
+
"intent": "feature",
|
|
97
|
+
"summary": "One-line task summary",
|
|
98
|
+
"steps": [
|
|
99
|
+
{ "agent": "task-analyst", "label": "Clarify and decompose" },
|
|
100
|
+
{ "agent": "feature-developer", "label": "Implement + unit tests", "scope": "unit-in-dev" },
|
|
101
|
+
{ "agent": "build-verifier", "label": "Lint, type-check, unit smoke" },
|
|
102
|
+
{ "agent": "code-reviewer", "label": "Code review" }
|
|
103
|
+
],
|
|
104
|
+
"humanGates": ["after:task-analyst"],
|
|
105
|
+
"autoChain": true,
|
|
106
|
+
"skipped": []
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Example: parallel reviewers
|
|
111
|
+
|
|
112
|
+
```json
|
|
113
|
+
{
|
|
114
|
+
"intent": "feature",
|
|
115
|
+
"steps": [
|
|
116
|
+
{ "agent": "task-analyst", "label": "Clarify" },
|
|
117
|
+
{ "agent": "feature-developer", "label": "Implement", "scope": "unit-in-dev" },
|
|
118
|
+
{ "agent": "build-verifier", "label": "Validation gate" },
|
|
119
|
+
{
|
|
120
|
+
"agent": ["accessibility-reviewer", "security-reviewer"],
|
|
121
|
+
"parallel": true,
|
|
122
|
+
"label": "A11y and security"
|
|
123
|
+
},
|
|
124
|
+
{ "agent": "code-reviewer", "label": "Review" }
|
|
125
|
+
],
|
|
126
|
+
"humanGates": ["after:task-analyst"]
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Example: bugfix skipIf
|
|
131
|
+
|
|
132
|
+
```json
|
|
133
|
+
{
|
|
134
|
+
"intent": "bugfix",
|
|
135
|
+
"steps": [
|
|
136
|
+
{ "agent": "debugger", "label": "Root cause" },
|
|
137
|
+
{ "agent": "feature-developer", "label": "Fix if needed", "skipIf": "debugger.fixed" },
|
|
138
|
+
{ "agent": "build-verifier", "label": "Validation" },
|
|
139
|
+
{ "agent": "code-reviewer", "label": "Review" }
|
|
140
|
+
],
|
|
141
|
+
"humanGates": []
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Initial status.json
|
|
146
|
+
|
|
147
|
+
```json
|
|
148
|
+
{
|
|
149
|
+
"slug": "<slug>",
|
|
150
|
+
"intent": "<intent>",
|
|
151
|
+
"pipelineIndex": 0,
|
|
152
|
+
"currentAgent": "<steps[0].agent>",
|
|
153
|
+
"phase": "executing",
|
|
154
|
+
"state": "in_progress",
|
|
155
|
+
"awaitingHumanGate": false,
|
|
156
|
+
"updatedAt": "<ISO8601>"
|
|
157
|
+
}
|
|
158
|
+
```
|
|
@@ -13,7 +13,7 @@ You are an API contract reviewer for a layered Next.js frontend (`@/types`, `@/a
|
|
|
13
13
|
2. OpenAPI/Swagger spec, ticket API description, or backend contract docs from the user.
|
|
14
14
|
3. Changed files in `app/src/types/**`, `app/src/api/**`, mocks, store thunks.
|
|
15
15
|
|
|
16
|
-
Apply **`
|
|
16
|
+
Apply **`public-imports.mdc`**, **`api-services.mdc`**, **`http-client.mdc`**.
|
|
17
17
|
|
|
18
18
|
## Review scope
|
|
19
19
|
|
|
@@ -7,6 +7,8 @@ model: fast
|
|
|
7
7
|
|
|
8
8
|
You are a build verification specialist. You **validate** implementation quality before code review — you do not edit production code or tests.
|
|
9
9
|
|
|
10
|
+
**SSOT for full validation in pipeline:** run complete **`lint:js`**, **`lint:css`**, and **`type-check`** from `app/` even if feature-developer ran scoped checks.
|
|
11
|
+
|
|
10
12
|
## Inputs
|
|
11
13
|
|
|
12
14
|
1. `.cursor/team/tasks/<slug>/brief.md` and `decomposition.md`.
|
|
@@ -13,7 +13,7 @@ You are a senior code reviewer. You may write only review artifacts under `.curs
|
|
|
13
13
|
2. `.cursor/team/tasks/<slug>/decomposition.md` — check coverage of planned tasks.
|
|
14
14
|
3. Git diff for changed files (`git diff`, `git status`).
|
|
15
15
|
|
|
16
|
-
Apply the **`code-review` skill** and
|
|
16
|
+
Apply the **`code-review` skill** and **`code-review-mr.mdc`** checklist.
|
|
17
17
|
|
|
18
18
|
## Tests gate
|
|
19
19
|
|