@bonesofspring/ai-rules 0.2.0 → 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/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 +5 -1
- package/presets/claude/next/agents/README.md +16 -15
- package/presets/claude/next/agents/code-reviewer.md +1 -1
- 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 +24 -0
- package/presets/claude/next/agents/tech-writer.md +1 -1
- package/presets/claude/next/hooks.json +17 -0
- package/presets/claude/next/rules/README.md +6 -2
- package/presets/claude/next/rules/architecture/README.md +2 -1
- package/presets/claude/next/rules/architecture/architecture-boundaries-ui.md +15 -0
- package/presets/claude/next/rules/architecture/architecture-boundaries.md +4 -1
- package/presets/claude/next/rules/architecture/feature-delivery-workflow.md +1 -1
- package/presets/claude/next/rules/architecture/layer-barrel-exports.md +1 -1
- 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 +1 -1
- package/presets/claude/next/rules/tooling-and-review/agent-team-orchestrator.md +6 -0
- package/presets/claude/next/rules/tooling-and-review/code-review-mr.md +22 -59
- package/presets/claude/next/rules/ui-and-accessibility/README.md +1 -2
- package/presets/claude/next/rules/ui-and-accessibility/react-ui.md +4 -3
- 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 +2 -9
- package/presets/cursor/next/BUGBOT.md +2 -0
- package/presets/cursor/next/agents/README.md +16 -15
- package/presets/cursor/next/agents/code-reviewer.md +1 -1
- package/presets/cursor/next/agents/task-analyst.md +1 -1
- package/presets/cursor/next/agents/task-router.md +24 -0
- package/presets/cursor/next/agents/tech-writer.md +1 -1
- package/presets/cursor/next/rules/README.md +21 -1
- package/presets/cursor/next/rules/architecture-boundaries-ui.mdc +15 -0
- package/presets/cursor/next/rules/architecture-boundaries.mdc +1 -1
- package/presets/cursor/next/rules/code-review-mr.mdc +20 -46
- package/presets/cursor/next/rules/feature-delivery-workflow.mdc +1 -1
- package/presets/cursor/next/rules/layer-barrel-exports.mdc +1 -1
- 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 +1 -1
- package/presets/cursor/next/rules/no-cross-component-styles-import.mdc +3 -53
- package/presets/cursor/next/rules/react-ui.mdc +4 -3
- 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
|
@@ -17,7 +17,7 @@ alwaysApply: true
|
|
|
17
17
|
|
|
18
18
|
| Слой | Каталог | Детали |
|
|
19
19
|
|------|---------|--------|
|
|
20
|
-
| UI | `app/src/ui/**` (pages, components) | `react-ui.mdc`, `architecture-boundaries.mdc` |
|
|
20
|
+
| UI | `app/src/ui/**` (pages, components) | `react-ui.mdc`, `architecture-boundaries-ui.mdc` |
|
|
21
21
|
| Store | `app/src/store/**` (slices, middleware) | `store-rtk.mdc` |
|
|
22
22
|
| API | `app/src/api/**` (services, clients, barrel) | `api-services.mdc`, `http-client.mdc` |
|
|
23
23
|
| HTTP | `app/src/lib/clients/**`, `app/src/api/clients/**` | `http-client.mdc` |
|
|
@@ -1,58 +1,8 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Стили компонентов —
|
|
3
|
-
globs:
|
|
4
|
-
- app/src/ui/**/*.ts
|
|
5
|
-
- app/src/ui/**/*.tsx
|
|
2
|
+
description: Стили компонентов — consolidated into react-ui.mdc
|
|
6
3
|
alwaysApply: false
|
|
7
4
|
---
|
|
8
5
|
|
|
9
|
-
#
|
|
6
|
+
# Moved to react-ui.mdc
|
|
10
7
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
- В `styles.ts` (или аналоге) **корневой** styled-элемент — тот, что оборачивает весь JSX компонента — экспортируется как **`Root`**.
|
|
14
|
-
- В разметке: `<s.Root>...</s.Root>` при `import * as s from './styles'`.
|
|
15
|
-
- Вложенные и соседние примитивы именуются по смыслу: `Title`, `List`, `Item`, `Header` и т.д.
|
|
16
|
-
- Если нет одной styled-обёртки на весь компонент (только фрагмент или один нативный тег без своего styled), экспорта `Root` может не быть. Когда вводится **одна** внешняя styled-обёртка всего JSX — она называется **`Root`**, а не `Container`, `Wrapper`, `Block` и т.п.
|
|
17
|
-
|
|
18
|
-
```tsx
|
|
19
|
-
// ✅ Хорошо
|
|
20
|
-
export const Root = styled.div` ... `
|
|
21
|
-
// в компоненте: <s.Root>...</s.Root>
|
|
22
|
-
|
|
23
|
-
// ❌ Плохо для единственной обёртки всего компонента
|
|
24
|
-
export const Service = styled.div` ... `
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## Правило
|
|
28
|
-
|
|
29
|
-
**Запрещено** импортировать модули стилей, которые лежат в каталоге **другого** UI-компонента или блока (не в том же каталоге, что и текущий файл).
|
|
30
|
-
|
|
31
|
-
Под «модулями стилей» имеются в виду в первую очередь:
|
|
32
|
-
|
|
33
|
-
- `styles.ts` / `styles.tsx` рядом с компонентом;
|
|
34
|
-
- `*.module.css`, `*.module.scss` и аналоги, принадлежащие конкретному компоненту;
|
|
35
|
-
- любые файлы, которые **экспортируют только styled-примитивы** для одного компонента.
|
|
36
|
-
|
|
37
|
-
## Разрешено
|
|
38
|
-
|
|
39
|
-
- `import * as s from './styles'` — стили **в той же папке**, что и компонент.
|
|
40
|
-
- Импорты **общих** примитивов дизайн-системы, токенов, общих UI из `@/ui/components/...` или пакетов, если это **не** приватный `styles` чужой фичи.
|
|
41
|
-
- Повторное использование визуала через **сам компонент** (композиция), а не через его `styles`.
|
|
42
|
-
|
|
43
|
-
## Примеры
|
|
44
|
-
|
|
45
|
-
```tsx
|
|
46
|
-
// ✅ Хорошо — локальный styles
|
|
47
|
-
import * as s from './styles'
|
|
48
|
-
|
|
49
|
-
// ❌ Плохо — стили родителя/соседа
|
|
50
|
-
import * as s from '../../styles'
|
|
51
|
-
import * as s from '../RequestForAnalysisServices/styles'
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## Почему
|
|
55
|
-
|
|
56
|
-
- Единое имя **`Root`** ускоряет чтение: сразу видно входную точку разметки компонента.
|
|
57
|
-
- Стили и разметка компонента должны меняться вместе, без скрытой связи через чужие файлы.
|
|
58
|
-
- Упрощается рефакторинг и поиск владельца стилей.
|
|
8
|
+
Правила колокации стилей, имени **`Root`** и запрета импорта чужих `styles` — в **`react-ui.mdc`** § «Стили и дизайн‑токены». Правило подгружается автоматически при правках `app/src/ui/**`.
|
|
@@ -27,7 +27,7 @@ alwaysApply: false
|
|
|
27
27
|
- Локальные подкомпоненты, используемые только этим блоком, выносятся в **`./components/<ComponentName>/`** относительно папки родительского компонента (не оставлять крупные куски JSX и «внутренние» компоненты в том же файле, что и родитель).
|
|
28
28
|
- У каждого такого подкомпонента — **своя** папка с тем же именем, что и публичное имя компонента:
|
|
29
29
|
- `ComponentName.tsx` — разметка и композиция;
|
|
30
|
-
- `styles.ts` — только стили этого подкомпонента (
|
|
30
|
+
- `styles.ts` — только стили этого подкомпонента (не тянуть `styles` соседних компонентов — см. § Стили ниже);
|
|
31
31
|
- при необходимости — `ComponentName.data.ts`, `ComponentName.utils.ts`, `ComponentName.hooks.ts` по тем же правилам префикса, что и у родителя;
|
|
32
32
|
- опционально `index.ts` с реэкспортом.
|
|
33
33
|
- Родитель импортирует подкомпонент из `./components/...`, а не держит его реализацию inline.
|
|
@@ -56,8 +56,9 @@ alwaysApply: false
|
|
|
56
56
|
|
|
57
57
|
# Стили и дизайн‑токены
|
|
58
58
|
|
|
59
|
-
- **Корневой** styled
|
|
60
|
-
-
|
|
59
|
+
- **Корневой** styled в соседнем `styles` — экспорт **`Root`**; в JSX: `<s.Root>` при `import * as s from './styles'`. Вложенные — `Title`, `List` и т.д. Не `Container`/`Wrapper` для единственной обёртки.
|
|
60
|
+
- **Запрещено** импортировать `styles` другого компонента (`../Other/styles`, `../../styles`). Разрешено: `./styles`, общие примитивы из `@/ui/components/...` или пакетов дизайн-системы.
|
|
61
|
+
- Порядок CSS / `styled` — Stylelint idiomatic-order: `css-property-order-stylelint.mdc` (грузится на `styles.ts` / `.css`).
|
|
61
62
|
- Для визуала использовать **тот стек стилей и токенов, который уже в проекте** (переменные, тема, общие классы, дизайн‑пакет).
|
|
62
63
|
- Избегать:
|
|
63
64
|
- inline‑стилей, кроме простых случаев;
|
|
@@ -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
|