@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
|
@@ -30,7 +30,7 @@ alwaysApply: false
|
|
|
30
30
|
- Асинхронные запросы:
|
|
31
31
|
- через `createAsyncThunk` или RTK Query.
|
|
32
32
|
- внутри thunk:
|
|
33
|
-
- вызывать API через сервисы, импортированные из `@/api` (**`
|
|
33
|
+
- вызывать API через сервисы, импортированные из `@/api` (**`public-imports.mdc`**);
|
|
34
34
|
- не вызывать HTTP‑клиент напрямую — только через эти сервисы.
|
|
35
35
|
- Сайд‑эффекты (логирование, аналитика, работа с файлами):
|
|
36
36
|
- выносить в middleware (`app/src/store/middleware/**`) или специализированные слайсы.
|
|
@@ -44,7 +44,7 @@ alwaysApply: false
|
|
|
44
44
|
- при ошибках после вызова сервиса — опираться на **тот же класс/контракт ошибки транспорта**, что использует общий клиент (из `@/types`), и разбирать тело/статус **по полям текущей реализации**, а не по воображаемому API;
|
|
45
45
|
- в **`catch`** предпочитать **`instanceof`** на класс ошибки транспорта из `@/types` (если он есть в коде) вместо голого `as`, когда это выразимо без шума (см. `no-type-assertion-as-import-export.mdc`).
|
|
46
46
|
- Для сущностей:
|
|
47
|
-
- доменные типы (включая вычисляемые поля) определять в `app/src/types/**`, экспортировать через barrel и импортировать в слайсы из `@/types` как **источник правды** для структуры данных (`
|
|
47
|
+
- доменные типы (включая вычисляемые поля) определять в `app/src/types/**`, экспортировать через barrel и импортировать в слайсы из `@/types` как **источник правды** для структуры данных (`public-imports.mdc`);
|
|
48
48
|
- избегать дублирования описаний сущностей в нескольких местах.
|
|
49
49
|
- **Граница домена**: в **state** хранить доменные модели; тип **обёртки ответа клиента** допустим как тип **возвращаемого значения thunk** или промежуточно до маппинга — без дублирования DTO в полях state без нужды (согласовано с `api-services.mdc` и `http-client.mdc`).
|
|
50
50
|
|
|
@@ -39,4 +39,4 @@ alwaysApply: false
|
|
|
39
39
|
- Правя файл, где уже есть такие комментарии, **поддерживать тот же стиль**, а не смешивать с англоязычными или «теговыми» блоками.
|
|
40
40
|
- Не раздувать комментарии: одна-две фразы на тип, одна строка на поле — норма; исключение — действительно сложная доменная оговорка.
|
|
41
41
|
|
|
42
|
-
См. также импорты и barrel: `
|
|
42
|
+
См. также импорты и barrel: `public-imports.mdc`.
|
|
@@ -1,31 +1,8 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
3
|
-
globs: app/src/**/*.ts,app/src/**/*.tsx
|
|
2
|
+
description: Moved to public-imports.mdc — read that file instead
|
|
4
3
|
alwaysApply: false
|
|
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
|
-
- Новые публичные типы — реэкспорт в `app/src/types/index.ts` по **`layer-barrel-exports.mdc`**.
|
|
8
|
+
Содержимое перенесено в **`public-imports.mdc`** (раздел `@/types`).
|
|
@@ -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 contract/mappers -> services -> store -> UI -> mocks -> **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: `next-app-core.mdc`, `architecture-boundaries.mdc`.
|
|
21
|
-
- Data/API: `http-client.mdc`, `api-services.mdc`, `store-rtk.mdc`.
|
|
22
|
-
- Public imports: `types-public-imports.mdc`, `api-public-imports.mdc`, `layer-barrel-exports.mdc`.
|
|
23
|
-
- UI: `react-ui.mdc`, `react-a11y-coding.mdc`, `no-props-spread.mdc`, `no-cross-component-styles-import.mdc`.
|
|
24
|
-
- App Router: `next-app-router.mdc`.
|
|
25
|
-
- Tests: `tests-unit.mdc`, `tests-e2e-structure.mdc`, `playwright-agents.mdc`.
|
|
26
|
-
- Finish: `post-change-lint.mdc`, `package-manager.mdc`.
|
|
8
|
+
1. Read task brief, acceptance criteria, and decomposition if present.
|
|
9
|
+
2. Read **`feature-delivery-workflow.mdc`** and **`reference-features.mdc`** — follow layer order and mirror closest reference feature.
|
|
10
|
+
3. Add or update focused tests for changed behavior.
|
|
11
|
+
4. Validation from `app/`: see **`post-change-lint.mdc`** (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 `.cursor/team/tasks/<slug>/status.json`.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "example-bugfix-standard",
|
|
3
|
+
"intent": "bugfix",
|
|
4
|
+
"profile": "standard",
|
|
5
|
+
"summary": "Regression fix with review",
|
|
6
|
+
"steps": [
|
|
7
|
+
{ "agent": "debugger", "label": "Root cause" },
|
|
8
|
+
{ "agent": "feature-developer", "label": "Fix if needed", "skipIf": "debugger.fixed" },
|
|
9
|
+
{ "agent": "build-verifier", "label": "Validation gate" },
|
|
10
|
+
{ "agent": "code-reviewer", "label": "Code review" }
|
|
11
|
+
],
|
|
12
|
+
"humanGates": [],
|
|
13
|
+
"autoChain": true,
|
|
14
|
+
"skipped": []
|
|
15
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "example-feature-full",
|
|
3
|
+
"intent": "feature",
|
|
4
|
+
"profile": "full",
|
|
5
|
+
"summary": "Multi-layer feature with e2e coverage",
|
|
6
|
+
"steps": [
|
|
7
|
+
{ "agent": "task-analyst", "label": "Clarify and decompose" },
|
|
8
|
+
{ "agent": "feature-developer", "label": "Implement + unit tests", "scope": "unit-in-dev" },
|
|
9
|
+
{ "agent": "build-verifier", "label": "Validation gate" },
|
|
10
|
+
{ "agent": "code-reviewer", "label": "Code review" },
|
|
11
|
+
{ "agent": "qa-tester", "label": "E2E", "scope": "e2e-only" }
|
|
12
|
+
],
|
|
13
|
+
"humanGates": ["after:task-analyst"],
|
|
14
|
+
"autoChain": true,
|
|
15
|
+
"skipped": []
|
|
16
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "example-feature-light",
|
|
3
|
+
"intent": "feature",
|
|
4
|
+
"profile": "light",
|
|
5
|
+
"summary": "Trivial single-file change with explicit AC",
|
|
6
|
+
"steps": [
|
|
7
|
+
{ "agent": "feature-developer", "label": "Implement" },
|
|
8
|
+
{ "agent": "build-verifier", "label": "Validation gate" }
|
|
9
|
+
],
|
|
10
|
+
"humanGates": [],
|
|
11
|
+
"autoChain": true,
|
|
12
|
+
"skipped": [
|
|
13
|
+
{ "agent": "task-analyst", "reason": "Explicit AC and single-file scope" },
|
|
14
|
+
{ "agent": "code-reviewer", "reason": "Light profile — non-trivial app changes should use standard" },
|
|
15
|
+
{ "agent": "qa-tester", "reason": "No e2e AC" }
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Preset validation scripts
|
|
2
|
+
|
|
3
|
+
Static regression checks for `presets/cursor/next` and `presets/claude/next`.
|
|
4
|
+
|
|
5
|
+
## Quick start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
cd packages/ai-rules
|
|
9
|
+
|
|
10
|
+
# Full static validation (no LLM)
|
|
11
|
+
./scripts/validate-preset.sh
|
|
12
|
+
|
|
13
|
+
# + init smoke into temp dirs
|
|
14
|
+
./scripts/validate-preset.sh --init-smoke
|
|
15
|
+
|
|
16
|
+
# Validate golden-prompts.json (agent names, schema)
|
|
17
|
+
./scripts/validate-preset.sh --check-golden
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Or via npm:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
yarn validate
|
|
24
|
+
yarn validate:init
|
|
25
|
+
yarn validate:golden
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Router regression (manual + semi-auto)
|
|
29
|
+
|
|
30
|
+
Golden prompts live in `golden-prompts.json` — one case per `task-router` intent (+ light/full variants).
|
|
31
|
+
|
|
32
|
+
### 1. Print checklist
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
./scripts/validate-preset.sh --print-golden
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 2. Run in Cursor (fresh chat each)
|
|
39
|
+
|
|
40
|
+
For each row, run `/task <prompt>`. After **task-router** finishes, copy `pipeline.json` from `.cursor/team/tasks/<slug>/` to:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
scripts/regression-results/<id>.json
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Use the `id` from golden-prompts (e.g. `feature-standard.json`).
|
|
47
|
+
|
|
48
|
+
### 3. Compare outputs
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
mkdir -p scripts/regression-results
|
|
52
|
+
./scripts/validate-preset.sh --check-golden --compare-pipeline scripts/regression-results/
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
The compare step checks:
|
|
56
|
+
|
|
57
|
+
- `intent`, `firstAgent`
|
|
58
|
+
- `requiredSequence` (ordered subsequence — extra steps allowed)
|
|
59
|
+
- `mustNotInclude`
|
|
60
|
+
- `stepConstraints` (`skipIf`)
|
|
61
|
+
- `humanGates`
|
|
62
|
+
|
|
63
|
+
`profile` mismatches are warnings (router may omit explicit profile when default applies).
|
|
64
|
+
|
|
65
|
+
### 4. Commit baseline (optional)
|
|
66
|
+
|
|
67
|
+
When router behavior intentionally changes, update `golden-prompts.json` and refresh committed `regression-results/` snapshots.
|
|
68
|
+
|
|
69
|
+
## Files
|
|
70
|
+
|
|
71
|
+
| File | Purpose |
|
|
72
|
+
|------|---------|
|
|
73
|
+
| `validate-preset.sh` | Main validator |
|
|
74
|
+
| `preset-manifest.json` | Always-on lists, rule pairs, UI glob rules, BUGBOT sync |
|
|
75
|
+
| `golden-prompts.json` | Expected router outcomes per intent |
|
|
76
|
+
| `regression-results/.gitkeep` | Placeholder for manual run outputs |
|
|
77
|
+
|
|
78
|
+
## What is NOT automated
|
|
79
|
+
|
|
80
|
+
- LLM routing quality (flaky by model/temperature)
|
|
81
|
+
- Behavioral golden tasks on a real Next.js repo
|
|
82
|
+
- Token cost of path-scoped rules on real file edits
|
|
83
|
+
|
|
84
|
+
Those stay manual / scheduled regression on a dogfood project.
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"description": "Golden prompts for task-router regression. Run manually via /task or semi-auto with validate-preset.sh --check-golden.",
|
|
4
|
+
"prompts": [
|
|
5
|
+
{
|
|
6
|
+
"id": "feature-standard",
|
|
7
|
+
"prompt": "Добавь фильтр по дате в Order History",
|
|
8
|
+
"intent": "feature",
|
|
9
|
+
"profile": "standard",
|
|
10
|
+
"firstAgent": "task-analyst",
|
|
11
|
+
"requiredSequence": [
|
|
12
|
+
"task-analyst",
|
|
13
|
+
"feature-developer",
|
|
14
|
+
"build-verifier",
|
|
15
|
+
"code-reviewer"
|
|
16
|
+
],
|
|
17
|
+
"mustInclude": ["build-verifier"],
|
|
18
|
+
"mustNotInclude": [],
|
|
19
|
+
"humanGates": ["after:task-analyst"],
|
|
20
|
+
"notes": "Default feature path; qa-tester optional unless e2e AC explicit."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": "feature-full",
|
|
24
|
+
"prompt": "Реализуй оплату картой: UI, API сервис, store и e2e сценарии checkout",
|
|
25
|
+
"intent": "feature",
|
|
26
|
+
"profile": "full",
|
|
27
|
+
"firstAgent": "task-analyst",
|
|
28
|
+
"requiredSequence": [
|
|
29
|
+
"task-analyst",
|
|
30
|
+
"feature-developer",
|
|
31
|
+
"build-verifier",
|
|
32
|
+
"code-reviewer",
|
|
33
|
+
"qa-tester"
|
|
34
|
+
],
|
|
35
|
+
"mustInclude": ["build-verifier", "qa-tester"],
|
|
36
|
+
"mustNotInclude": [],
|
|
37
|
+
"humanGates": ["after:task-analyst"],
|
|
38
|
+
"notes": "Cross-layer + e2e AC → full profile with qa-tester."
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "feature-light",
|
|
42
|
+
"prompt": "Исправь typo в тексте кнопки Submit в OrderHistoryButton — один файл app/src/ui/components/OrderHistoryButton/OrderHistoryButton.tsx, AC: label «Отправить»",
|
|
43
|
+
"intent": "feature",
|
|
44
|
+
"profile": "light",
|
|
45
|
+
"firstAgent": "feature-developer",
|
|
46
|
+
"requiredSequence": ["feature-developer", "build-verifier"],
|
|
47
|
+
"mustInclude": ["build-verifier"],
|
|
48
|
+
"mustNotInclude": ["task-analyst"],
|
|
49
|
+
"humanGates": [],
|
|
50
|
+
"notes": "Explicit single-file AC → light; skip analyst."
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": "bugfix-standard",
|
|
54
|
+
"prompt": "Order History падает при пустом списке — пофикси regression",
|
|
55
|
+
"intent": "bugfix",
|
|
56
|
+
"profile": "standard",
|
|
57
|
+
"firstAgent": "debugger",
|
|
58
|
+
"requiredSequence": [
|
|
59
|
+
"debugger",
|
|
60
|
+
"feature-developer",
|
|
61
|
+
"build-verifier",
|
|
62
|
+
"code-reviewer"
|
|
63
|
+
],
|
|
64
|
+
"mustInclude": ["debugger", "build-verifier"],
|
|
65
|
+
"mustNotInclude": [],
|
|
66
|
+
"humanGates": [],
|
|
67
|
+
"stepConstraints": [
|
|
68
|
+
{
|
|
69
|
+
"agent": "feature-developer",
|
|
70
|
+
"skipIf": "debugger.fixed"
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
"notes": "Bugfix standard; qa-tester(regression) optional per router."
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"id": "bugfix-light",
|
|
77
|
+
"prompt": "Просто поправь null-check в mapper — один файл, явный AC, без архитектурного риска",
|
|
78
|
+
"intent": "bugfix",
|
|
79
|
+
"profile": "light",
|
|
80
|
+
"firstAgent": "debugger",
|
|
81
|
+
"requiredSequence": ["debugger", "build-verifier"],
|
|
82
|
+
"mustInclude": ["build-verifier"],
|
|
83
|
+
"mustNotInclude": ["task-analyst", "code-reviewer"],
|
|
84
|
+
"humanGates": [],
|
|
85
|
+
"notes": "Light bugfix may skip developer when debugger.fixed."
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"id": "ci-fix",
|
|
89
|
+
"prompt": "CI упал на type-check в PR — красный пайплайн",
|
|
90
|
+
"intent": "ci-fix",
|
|
91
|
+
"profile": "standard",
|
|
92
|
+
"firstAgent": "ci-investigator",
|
|
93
|
+
"requiredSequence": [
|
|
94
|
+
"ci-investigator",
|
|
95
|
+
"feature-developer",
|
|
96
|
+
"build-verifier",
|
|
97
|
+
"code-reviewer"
|
|
98
|
+
],
|
|
99
|
+
"mustInclude": ["ci-investigator", "build-verifier"],
|
|
100
|
+
"mustNotInclude": ["task-analyst"],
|
|
101
|
+
"humanGates": [],
|
|
102
|
+
"stepConstraints": [
|
|
103
|
+
{
|
|
104
|
+
"agent": "feature-developer",
|
|
105
|
+
"skipIf": "ci-investigator.resolved"
|
|
106
|
+
}
|
|
107
|
+
]
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"id": "migration",
|
|
111
|
+
"prompt": "Миграция HTTP-клиента на fetch — upgrade major version",
|
|
112
|
+
"intent": "migration",
|
|
113
|
+
"profile": "standard",
|
|
114
|
+
"firstAgent": "task-analyst",
|
|
115
|
+
"requiredSequence": [
|
|
116
|
+
"task-analyst",
|
|
117
|
+
"migration-specialist",
|
|
118
|
+
"feature-developer",
|
|
119
|
+
"build-verifier",
|
|
120
|
+
"code-reviewer"
|
|
121
|
+
],
|
|
122
|
+
"mustInclude": ["migration-specialist", "build-verifier"],
|
|
123
|
+
"mustNotInclude": [],
|
|
124
|
+
"humanGates": ["after:migration-specialist"]
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"id": "perf-audit",
|
|
128
|
+
"prompt": "Страница Order History медленно грузится — perf audit bundle и LCP",
|
|
129
|
+
"intent": "perf-audit",
|
|
130
|
+
"profile": "light",
|
|
131
|
+
"firstAgent": "performance-auditor",
|
|
132
|
+
"requiredSequence": ["performance-auditor"],
|
|
133
|
+
"mustInclude": ["performance-auditor"],
|
|
134
|
+
"mustNotInclude": ["feature-developer", "build-verifier"],
|
|
135
|
+
"humanGates": []
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"id": "a11y",
|
|
139
|
+
"prompt": "Проверь a11y формы логина — WCAG и keyboard navigation",
|
|
140
|
+
"intent": "a11y",
|
|
141
|
+
"profile": "standard",
|
|
142
|
+
"firstAgent": "task-analyst",
|
|
143
|
+
"requiredSequence": [
|
|
144
|
+
"task-analyst",
|
|
145
|
+
"feature-developer",
|
|
146
|
+
"build-verifier",
|
|
147
|
+
"accessibility-reviewer",
|
|
148
|
+
"code-reviewer"
|
|
149
|
+
],
|
|
150
|
+
"mustInclude": ["accessibility-reviewer", "build-verifier"],
|
|
151
|
+
"mustNotInclude": [],
|
|
152
|
+
"humanGates": ["after:task-analyst"]
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"id": "review-only",
|
|
156
|
+
"prompt": "Сделай ревью моих изменений в store/orders — review MR diff",
|
|
157
|
+
"intent": "review-only",
|
|
158
|
+
"profile": "light",
|
|
159
|
+
"firstAgent": "code-reviewer",
|
|
160
|
+
"requiredSequence": ["code-reviewer"],
|
|
161
|
+
"mustInclude": ["code-reviewer"],
|
|
162
|
+
"mustNotInclude": ["feature-developer", "build-verifier", "task-analyst"],
|
|
163
|
+
"humanGates": []
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"id": "test-only",
|
|
167
|
+
"prompt": "Покрой тестами модуль payments — unit и e2e, без изменения прод-кода",
|
|
168
|
+
"intent": "test-only",
|
|
169
|
+
"profile": "standard",
|
|
170
|
+
"firstAgent": "task-analyst",
|
|
171
|
+
"requiredSequence": ["task-analyst", "qa-tester"],
|
|
172
|
+
"mustInclude": ["qa-tester"],
|
|
173
|
+
"mustNotInclude": ["feature-developer"],
|
|
174
|
+
"humanGates": ["after:task-analyst"]
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"id": "unit-only-plan",
|
|
178
|
+
"prompt": "Покрой unit-тестами mapper payments в api/services",
|
|
179
|
+
"intent": "unit-only",
|
|
180
|
+
"profile": "standard",
|
|
181
|
+
"firstAgent": "unit-test-planner",
|
|
182
|
+
"requiredSequence": ["unit-test-planner", "unit-test-generator"],
|
|
183
|
+
"mustInclude": ["unit-test-planner"],
|
|
184
|
+
"mustNotInclude": ["feature-developer", "qa-tester"],
|
|
185
|
+
"humanGates": ["after:unit-test-planner"],
|
|
186
|
+
"notes": "New unit coverage → planner then generator."
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"id": "unit-only-heal",
|
|
190
|
+
"prompt": "Почини unit тест OrderHistoryMapper.spec.ts — падает после рефактора",
|
|
191
|
+
"intent": "unit-only",
|
|
192
|
+
"profile": "standard",
|
|
193
|
+
"firstAgent": "unit-test-healer",
|
|
194
|
+
"requiredSequence": ["unit-test-healer"],
|
|
195
|
+
"mustInclude": ["unit-test-healer"],
|
|
196
|
+
"mustNotInclude": ["unit-test-planner", "feature-developer"],
|
|
197
|
+
"humanGates": [],
|
|
198
|
+
"notes": "Broken existing unit → healer path, no planner gate."
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"id": "e2e-only-plan",
|
|
202
|
+
"prompt": "Напиши e2e для сценария оплаты — playwright browser test",
|
|
203
|
+
"intent": "e2e-only",
|
|
204
|
+
"profile": "standard",
|
|
205
|
+
"firstAgent": "playwright-test-planner",
|
|
206
|
+
"requiredSequence": [
|
|
207
|
+
"playwright-test-planner",
|
|
208
|
+
"playwright-test-generator"
|
|
209
|
+
],
|
|
210
|
+
"mustInclude": ["playwright-test-planner"],
|
|
211
|
+
"mustNotInclude": ["feature-developer", "qa-tester"],
|
|
212
|
+
"humanGates": ["after:playwright-test-planner"]
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"id": "e2e-only-heal",
|
|
216
|
+
"prompt": "Почини e2e checkout.spec.ts — flaky playwright test",
|
|
217
|
+
"intent": "e2e-only",
|
|
218
|
+
"profile": "standard",
|
|
219
|
+
"firstAgent": "playwright-test-healer",
|
|
220
|
+
"requiredSequence": ["playwright-test-healer"],
|
|
221
|
+
"mustInclude": ["playwright-test-healer"],
|
|
222
|
+
"mustNotInclude": ["playwright-test-planner", "feature-developer"],
|
|
223
|
+
"humanGates": []
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"id": "docs-only",
|
|
227
|
+
"prompt": "Напиши changelog для релиза фильтров и migration guide",
|
|
228
|
+
"intent": "docs-only",
|
|
229
|
+
"profile": "standard",
|
|
230
|
+
"firstAgent": "task-analyst",
|
|
231
|
+
"requiredSequence": ["task-analyst", "tech-writer"],
|
|
232
|
+
"mustInclude": ["tech-writer"],
|
|
233
|
+
"mustNotInclude": ["feature-developer", "build-verifier"],
|
|
234
|
+
"humanGates": ["after:task-analyst"]
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
"id": "refactor",
|
|
238
|
+
"prompt": "Рефакторинг store/orders без изменения поведения — почисти дубли",
|
|
239
|
+
"intent": "refactor",
|
|
240
|
+
"profile": "standard",
|
|
241
|
+
"firstAgent": "task-analyst",
|
|
242
|
+
"requiredSequence": [
|
|
243
|
+
"task-analyst",
|
|
244
|
+
"feature-developer",
|
|
245
|
+
"build-verifier",
|
|
246
|
+
"code-reviewer"
|
|
247
|
+
],
|
|
248
|
+
"mustInclude": ["build-verifier"],
|
|
249
|
+
"mustNotInclude": [],
|
|
250
|
+
"humanGates": ["after:task-analyst"]
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
"id": "spike",
|
|
254
|
+
"prompt": "Исследуй spike: можно ли перейти на React Server Components для Order History?",
|
|
255
|
+
"intent": "spike",
|
|
256
|
+
"profile": "standard",
|
|
257
|
+
"firstAgent": "task-analyst",
|
|
258
|
+
"requiredSequence": ["task-analyst", "solution-architect"],
|
|
259
|
+
"mustInclude": ["solution-architect"],
|
|
260
|
+
"mustNotInclude": ["feature-developer", "build-verifier"],
|
|
261
|
+
"humanGates": ["after:solution-architect"]
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
"id": "retro",
|
|
265
|
+
"prompt": "Сделай ретро по задаче order-history-date-filter — postmortem",
|
|
266
|
+
"intent": "retro",
|
|
267
|
+
"noPipeline": true,
|
|
268
|
+
"firstAgent": null,
|
|
269
|
+
"requiredSequence": [],
|
|
270
|
+
"mustInclude": [],
|
|
271
|
+
"mustNotInclude": ["feature-developer", "task-analyst"],
|
|
272
|
+
"humanGates": [],
|
|
273
|
+
"notes": "Orchestrator runs /technical-retro; no pipeline.json steps."
|
|
274
|
+
}
|
|
275
|
+
]
|
|
276
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"alwaysOnCursor": [
|
|
4
|
+
"next-app-core.mdc",
|
|
5
|
+
"code-quality-and-refactoring.mdc",
|
|
6
|
+
"post-change-lint.mdc",
|
|
7
|
+
"package-manager.mdc"
|
|
8
|
+
],
|
|
9
|
+
"alwaysOnClaude": [
|
|
10
|
+
"stack/next-app-core.md",
|
|
11
|
+
"tooling-and-review/code-quality.md",
|
|
12
|
+
"tooling-and-review/post-change-lint.md",
|
|
13
|
+
"tooling-and-review/package-manager.md"
|
|
14
|
+
],
|
|
15
|
+
"alwaysOnMaxBytes": 12288,
|
|
16
|
+
"rulePairs": [
|
|
17
|
+
["architecture-boundaries.mdc", "architecture/architecture-boundaries.md"],
|
|
18
|
+
["architecture-boundaries-ui.mdc", "architecture/architecture-boundaries-ui.md"],
|
|
19
|
+
["layer-barrel-exports.mdc", "architecture/layer-barrel-exports.md"],
|
|
20
|
+
["navigation-router-stack.mdc", "stack/navigation-router.md"],
|
|
21
|
+
["navigation-router-ui.mdc", "stack/navigation-router-ui.md"],
|
|
22
|
+
["react-ui.mdc", "ui-and-accessibility/react-ui.md"],
|
|
23
|
+
["code-review-mr.mdc", "tooling-and-review/code-review-mr.md"],
|
|
24
|
+
["agent-team-orchestrator.mdc", "tooling-and-review/agent-team-orchestrator.md"],
|
|
25
|
+
["public-imports.mdc", "architecture/public-imports.md"],
|
|
26
|
+
["feature-delivery-workflow.mdc", "architecture/feature-delivery-workflow.md"],
|
|
27
|
+
["next-app-core.mdc", "stack/next-app-core.md"],
|
|
28
|
+
["post-change-lint.mdc", "tooling-and-review/post-change-lint.md"],
|
|
29
|
+
["package-manager.mdc", "tooling-and-review/package-manager.md"],
|
|
30
|
+
["code-quality-and-refactoring.mdc", "tooling-and-review/code-quality.md"]
|
|
31
|
+
],
|
|
32
|
+
"syncedRootFiles": [
|
|
33
|
+
{
|
|
34
|
+
"source": "fragments/BUGBOT.md",
|
|
35
|
+
"targets": ["presets/cursor/next/BUGBOT.md", "presets/claude/next/BUGBOT.md"]
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"parityDirs": ["agents", "skills", "team/fixtures"],
|
|
39
|
+
"uiGlobChecks": [
|
|
40
|
+
{
|
|
41
|
+
"id": "architecture-boundaries-no-ui",
|
|
42
|
+
"file": "architecture-boundaries.mdc",
|
|
43
|
+
"mustNotMatch": "app/src/ui"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"id": "architecture-boundaries-ui-scoped",
|
|
47
|
+
"file": "architecture-boundaries-ui.mdc",
|
|
48
|
+
"mustMatch": "app/src/ui"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "layer-barrel-index-only",
|
|
52
|
+
"file": "layer-barrel-exports.mdc",
|
|
53
|
+
"mustMatch": "index.ts",
|
|
54
|
+
"mustNotMatch": "app/src/ui/\\*\\*"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "navigation-router-stack-app-only",
|
|
58
|
+
"file": "navigation-router-stack.mdc",
|
|
59
|
+
"mustMatch": "app/src/app",
|
|
60
|
+
"mustNotMatch": "app/src/ui"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"id": "navigation-router-ui-tsx",
|
|
64
|
+
"file": "navigation-router-ui.mdc",
|
|
65
|
+
"mustMatch": "app/src/ui/\\*\\*/\\*\\.tsx"
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
"wideGlobDenylist": [
|
|
69
|
+
"architecture-boundaries.mdc",
|
|
70
|
+
"navigation-router-stack.mdc"
|
|
71
|
+
]
|
|
72
|
+
}
|
|
File without changes
|