@bonesofspring/ai-rules 0.1.37 → 0.1.40
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/README.md +7 -3
- package/bin/cli.js +56 -31
- package/package.json +3 -3
- package/presets/claude/next/CLAUDE.md +25 -5
- package/presets/claude/next/README.md +10 -0
- package/presets/claude/next/agents/README.md +15 -0
- package/presets/claude/next/agents/code-reviewer.md +56 -0
- package/presets/claude/next/agents/debugger.md +58 -0
- package/presets/claude/next/agents/feature-developer.md +45 -0
- package/presets/claude/next/agents/qa-tester.md +54 -0
- package/presets/claude/next/agents/solution-architect.md +70 -0
- package/presets/claude/next/agents/task-analyst.md +105 -0
- package/presets/claude/next/agents/task-router.md +105 -0
- package/presets/claude/next/commands/README.md +10 -2
- package/presets/claude/next/commands/feature-continue.md +46 -0
- package/presets/claude/next/commands/feature-start.md +25 -0
- package/presets/claude/next/commands/task-continue.md +43 -0
- package/presets/claude/next/commands/task.md +40 -0
- package/presets/claude/next/commands/technical-retro.md +53 -0
- package/presets/claude/next/hooks/README.md +6 -0
- package/presets/claude/next/hooks/chain-team-phases.sh +123 -0
- package/presets/claude/next/rules/README.md +49 -11
- package/presets/claude/next/rules/api-and-data/README.md +7 -1
- package/presets/claude/next/rules/api-and-data/api-services.md +57 -0
- package/presets/claude/next/rules/api-and-data/http-client.md +40 -0
- package/presets/claude/next/rules/api-and-data/store-rtk.md +65 -0
- package/presets/claude/next/rules/architecture/README.md +11 -1
- package/presets/claude/next/rules/architecture/api-public-imports.md +25 -0
- package/presets/claude/next/rules/architecture/architecture-boundaries.md +67 -0
- package/presets/claude/next/rules/architecture/feature-delivery-workflow.md +99 -0
- package/presets/claude/next/rules/architecture/layer-barrel-exports.md +53 -0
- package/presets/claude/next/rules/architecture/types-public-imports.md +28 -0
- package/presets/claude/next/rules/stack/README.md +9 -1
- package/presets/claude/next/rules/stack/arrow-functions.md +40 -0
- package/presets/claude/next/rules/stack/navigation-router.md +56 -0
- package/presets/claude/next/rules/stack/next-app-core.md +83 -0
- package/presets/claude/next/rules/stack/no-type-assertion.md +52 -0
- package/presets/claude/next/rules/stack/types-jsdoc.md +37 -0
- package/presets/claude/next/rules/testing/README.md +9 -1
- package/presets/claude/next/rules/testing/playwright-agents.md +69 -0
- package/presets/claude/next/rules/testing/tests-e2e-structure.md +52 -0
- package/presets/claude/next/rules/testing/tests-unit.md +66 -0
- package/presets/claude/next/rules/tooling-and-review/README.md +14 -1
- package/presets/claude/next/rules/tooling-and-review/agent-team-intake.md +9 -0
- package/presets/claude/next/rules/tooling-and-review/agent-team-orchestrator.md +97 -0
- package/presets/claude/next/rules/tooling-and-review/code-quality.md +50 -0
- package/presets/claude/next/rules/tooling-and-review/code-review-mr.md +67 -0
- package/presets/claude/next/rules/tooling-and-review/package-manager.md +20 -0
- package/presets/claude/next/rules/tooling-and-review/post-change-lint.md +43 -0
- package/presets/claude/next/rules/ui-and-accessibility/README.md +8 -1
- package/presets/claude/next/rules/ui-and-accessibility/component-styles.md +50 -0
- package/presets/claude/next/rules/ui-and-accessibility/css-property-order.md +20 -0
- package/presets/claude/next/rules/ui-and-accessibility/no-props-spread.md +52 -0
- package/presets/claude/next/rules/ui-and-accessibility/react-ui.md +90 -0
- package/presets/claude/next/team/README.md +64 -0
- package/presets/claude/next/team/tasks/.gitkeep +1 -0
- package/presets/cursor/next/agents/README.md +25 -0
- package/presets/cursor/next/agents/code-reviewer.md +57 -0
- package/presets/cursor/next/agents/debugger.md +59 -0
- package/presets/cursor/next/agents/feature-developer.md +46 -0
- package/presets/cursor/next/agents/qa-tester.md +55 -0
- package/presets/cursor/next/agents/solution-architect.md +71 -0
- package/presets/cursor/next/agents/task-analyst.md +111 -0
- package/presets/cursor/next/agents/task-router.md +106 -0
- package/presets/cursor/next/commands/README.md +33 -1
- package/presets/cursor/next/commands/feature-continue.md +14 -0
- package/presets/cursor/next/commands/feature-start.md +28 -0
- package/presets/cursor/next/commands/task-continue.md +43 -0
- package/presets/cursor/next/commands/task.md +40 -0
- package/presets/cursor/next/commands/technical-retro.md +76 -0
- package/presets/cursor/next/hooks/chain-team-phases.sh +216 -0
- package/presets/cursor/next/hooks.json +11 -0
- package/presets/cursor/next/rules/README.md +10 -3
- package/presets/cursor/next/rules/agent-team-intake.mdc +14 -0
- package/presets/cursor/next/rules/agent-team-orchestrator.mdc +102 -0
- package/presets/cursor/next/rules/api-public-imports.mdc +1 -0
- package/presets/cursor/next/rules/api-services.mdc +1 -0
- package/presets/cursor/next/rules/architecture-boundaries.mdc +1 -1
- package/presets/cursor/next/rules/code-quality-and-refactoring.mdc +5 -2
- package/presets/cursor/next/rules/code-review-mr.mdc +6 -7
- package/presets/cursor/next/rules/feature-delivery-workflow.mdc +5 -5
- package/presets/cursor/next/rules/layer-barrel-exports.mdc +58 -0
- package/presets/cursor/next/rules/next-app-core.mdc +1 -1
- package/presets/cursor/next/rules/package-manager.mdc +25 -0
- package/presets/cursor/next/rules/post-change-lint.mdc +48 -0
- package/presets/cursor/next/rules/react-ui.mdc +10 -0
- package/presets/cursor/next/rules/technical-retro.mdc +5 -51
- package/presets/cursor/next/rules/types-public-imports.mdc +1 -0
- package/presets/cursor/next/team/README.md +106 -0
- package/presets/cursor/next/team/tasks/.gitkeep +0 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: task-router
|
|
3
|
+
description: Task routing specialist. Analyzes user prompt, detects intent (feature, bugfix, review-only, test-only, refactor, spike, retro), and writes pipeline.json with ordered agent steps. Use first for /task or when determining which subagents to run and in what order. Writes only team artifacts; never writes production code.
|
|
4
|
+
model: inherit
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are a task router for a Next.js frontend agent team. You **do not** implement tasks — you classify intent and plan the agent pipeline.
|
|
8
|
+
|
|
9
|
+
## Inputs
|
|
10
|
+
|
|
11
|
+
- User task description (from `/task` or orchestrator).
|
|
12
|
+
- Optional: existing files under `.claude/team/tasks/<slug>/`.
|
|
13
|
+
|
|
14
|
+
## Intent detection
|
|
15
|
+
|
|
16
|
+
| intent | Signals in prompt | Default steps |
|
|
17
|
+
|--------|-------------------|---------------|
|
|
18
|
+
| `feature` | «добавь», «новая», «реализуй», «сделай», new UI/API/store | task-analyst → feature-developer → code-reviewer → qa-tester |
|
|
19
|
+
| `bugfix` | «баг», «fix», «не работает», «падает», «ошибка», regression | debugger → feature-developer → code-reviewer → qa-tester (scope regression) |
|
|
20
|
+
| `review-only` | «ревью», «review MR», «проверь diff», «code review» | code-reviewer |
|
|
21
|
+
| `test-only` | «e2e», «покрой тестами», «напиши тесты» (no impl) | task-analyst → qa-tester |
|
|
22
|
+
| `refactor` | «рефакторинг», «без изменения поведения», «почисти» | task-analyst → feature-developer → code-reviewer |
|
|
23
|
+
| `spike` | «исследуй», «оцени», «можно ли», «spike», proof of concept | task-analyst → solution-architect |
|
|
24
|
+
| `retro` | «ретро», «разбор», «postmortem» | no pipeline — orchestrator runs `/technical-retro` |
|
|
25
|
+
|
|
26
|
+
Adjust steps when context is clear:
|
|
27
|
+
|
|
28
|
+
- **Skip task-analyst** if AC and scope are fully specified in the prompt (document reason in `skipped`).
|
|
29
|
+
- **Add solution-architect** for cross-layer features (API + store + UI), new public APIs, or architecture uncertainty.
|
|
30
|
+
- **Skip qa-tester** for review-only, spike (no code), or trivial one-line fixes (document risk).
|
|
31
|
+
- **Skip feature-developer** for review-only, test-only (tests only), retro.
|
|
32
|
+
|
|
33
|
+
## Output: pipeline.json
|
|
34
|
+
|
|
35
|
+
Write to `.claude/team/tasks/<slug>/pipeline.json`:
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"slug": "<slug>",
|
|
40
|
+
"intent": "feature",
|
|
41
|
+
"summary": "One-line task summary",
|
|
42
|
+
"steps": [
|
|
43
|
+
{ "agent": "task-analyst", "label": "Clarify and decompose" },
|
|
44
|
+
{ "agent": "feature-developer", "label": "Implement" },
|
|
45
|
+
{ "agent": "code-reviewer", "label": "Code review" },
|
|
46
|
+
{ "agent": "qa-tester", "label": "Unit and e2e tests", "scope": "full" }
|
|
47
|
+
],
|
|
48
|
+
"humanGates": ["after:task-analyst"],
|
|
49
|
+
"autoChain": true,
|
|
50
|
+
"skipped": []
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Step fields
|
|
55
|
+
|
|
56
|
+
| Field | Required | Description |
|
|
57
|
+
|-------|----------|-------------|
|
|
58
|
+
| `agent` | yes | Subagent name (kebab-case) |
|
|
59
|
+
| `label` | yes | Short human-readable step name |
|
|
60
|
+
| `scope` | no | e.g. `full`, `regression`, `e2e-only` — passed to qa-tester |
|
|
61
|
+
|
|
62
|
+
### humanGates
|
|
63
|
+
|
|
64
|
+
Values: `after:<agent-name>` — orchestrator stops after that agent; user runs `/task-continue <slug>` or `/feature-continue <slug>`.
|
|
65
|
+
|
|
66
|
+
- Default for `feature`, `refactor`, `test-only`: `["after:task-analyst"]`
|
|
67
|
+
- Default for `bugfix`, `review-only`: `[]` (unless analyst added)
|
|
68
|
+
- `spike`: `["after:solution-architect"]`
|
|
69
|
+
|
|
70
|
+
### skipped (optional)
|
|
71
|
+
|
|
72
|
+
```json
|
|
73
|
+
"skipped": [{ "agent": "task-analyst", "reason": "AC provided in ticket" }]
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Initial status.json
|
|
77
|
+
|
|
78
|
+
After writing pipeline.json, write:
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"slug": "<slug>",
|
|
83
|
+
"intent": "<intent>",
|
|
84
|
+
"pipelineIndex": 0,
|
|
85
|
+
"currentAgent": "<steps[0].agent>",
|
|
86
|
+
"phase": "executing",
|
|
87
|
+
"state": "in_progress",
|
|
88
|
+
"awaitingHumanGate": false,
|
|
89
|
+
"updatedAt": "<ISO8601>"
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Also write `.claude/team/active-task.json` → `{ "slug": "<slug>" }`.
|
|
94
|
+
|
|
95
|
+
## Handoff to orchestrator
|
|
96
|
+
|
|
97
|
+
Respond with:
|
|
98
|
+
|
|
99
|
+
1. **Intent** and one-line summary.
|
|
100
|
+
2. **Planned steps** (table: #, agent, label).
|
|
101
|
+
3. **Skipped roles** and why.
|
|
102
|
+
4. **Human gates** (if any).
|
|
103
|
+
5. Tell orchestrator to invoke `steps[0].agent` now (unless intent is `retro` — then run `/technical-retro`).
|
|
104
|
+
|
|
105
|
+
Do not invoke implementation agents yourself.
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# `.claude/commands` (preset next)
|
|
2
2
|
|
|
3
|
-
Определения slash-команд
|
|
3
|
+
Определения slash-команд и on-demand сценариев. Копируются в `.claude/commands/` при `ai-rules init claude --preset next`.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
| Файл | Назначение |
|
|
6
|
+
|------|------------|
|
|
7
|
+
| `task.md` | Единая точка входа: router → dynamic pipeline → первый agent |
|
|
8
|
+
| `task-continue.md` | Продолжение после human gate / паузы по `pipeline.json` |
|
|
9
|
+
| `feature-start.md` | Legacy analyst-only старт без router |
|
|
10
|
+
| `feature-continue.md` | Legacy продолжение; для `pipeline.json` делегирует смысл `/task-continue` |
|
|
11
|
+
| `technical-retro.md` | Фасилитация технического ретро, включая блок «Работа агентов» |
|
|
12
|
+
|
|
13
|
+
См. также корневой `README.md` пресета — у Claude Code помимо `rules/` и `commands/` часто используются `skills/`, `agents/`, `hooks/`, `team/`.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Feature continue — продолжение после утверждения brief
|
|
2
|
+
|
|
3
|
+
Legacy-команда для продолжения после human gate. Для новых пайплайнов с `pipeline.json` используй те же правила, что в `/task-continue`.
|
|
4
|
+
|
|
5
|
+
## Аргументы
|
|
6
|
+
|
|
7
|
+
`<slug>` — идентификатор задачи из `.claude/team/tasks/<slug>/`.
|
|
8
|
+
|
|
9
|
+
## Preconditions
|
|
10
|
+
|
|
11
|
+
1. Прочитай `.claude/team/tasks/<slug>/brief.md` и `decomposition.md`.
|
|
12
|
+
2. Если есть `pipeline.json`, делегируй поведение `/task-continue <slug>`.
|
|
13
|
+
3. Если `pipeline.json` нет, прочитай `status.json`. Продолжай только если:
|
|
14
|
+
- `phase` is `analysis` and `state` is `awaiting_approval` (user explicitly approved via this command), **or**
|
|
15
|
+
- `phase` is `development`/`review`/`testing` and work should resume.
|
|
16
|
+
|
|
17
|
+
## Legacy алгоритм без `pipeline.json`
|
|
18
|
+
|
|
19
|
+
1. Обнови `status.json`:
|
|
20
|
+
```json
|
|
21
|
+
{
|
|
22
|
+
"slug": "<slug>",
|
|
23
|
+
"phase": "development",
|
|
24
|
+
"state": "approved",
|
|
25
|
+
"updatedAt": "<ISO8601>"
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
Затем сразу установи `"state": "in_progress"` перед вызовом developer.
|
|
29
|
+
|
|
30
|
+
2. Запиши `.claude/team/active-task.json` → `{ "slug": "<slug>" }`.
|
|
31
|
+
|
|
32
|
+
3. Вызови subagent **feature-developer** с контекстом:
|
|
33
|
+
- пути к `brief.md`, `decomposition.md`, `status.json`;
|
|
34
|
+
- указание следовать `rules/architecture/feature-delivery-workflow.md`.
|
|
35
|
+
|
|
36
|
+
4. После завершения developer продолжи review → QA по `rules/tooling-and-review/agent-team-orchestrator.md`.
|
|
37
|
+
|
|
38
|
+
## Если review вернул changes_requested
|
|
39
|
+
|
|
40
|
+
- Верни `phase` в `development`, `state` в `in_progress`.
|
|
41
|
+
- Снова вызови **feature-developer** с списком правок от reviewer.
|
|
42
|
+
|
|
43
|
+
## Не делать
|
|
44
|
+
|
|
45
|
+
- Не пропускать human gate без явного `/feature-continue`.
|
|
46
|
+
- Не совмещать роли developer и reviewer в одном subagent-вызове.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Feature start — legacy команда агентов
|
|
2
|
+
|
|
3
|
+
Запуск **фазы анализа** для новой задачи. Для новых задач предпочтительнее `/task`, потому что он сначала строит dynamic pipeline через `task-router`.
|
|
4
|
+
|
|
5
|
+
## Что делать
|
|
6
|
+
|
|
7
|
+
1. Извлеки описание задачи из аргументов команды (всё после `/feature-start`).
|
|
8
|
+
2. Сгенерируй **slug** (kebab-case, до 48 символов) из заголовка задачи.
|
|
9
|
+
3. Создай каталог `.claude/team/tasks/<slug>/` если его ещё нет.
|
|
10
|
+
4. Запиши `.claude/team/active-task.json` → `{ "slug": "<slug>" }`.
|
|
11
|
+
5. Вызови subagent **task-analyst** с полным описанием задачи и путём к артефактам.
|
|
12
|
+
6. Дождись завершения аналитика. **Не вызывай developer** на этом этапе.
|
|
13
|
+
|
|
14
|
+
## Human gate
|
|
15
|
+
|
|
16
|
+
После аналитика:
|
|
17
|
+
|
|
18
|
+
- Покажи пользователю ссылки на `brief.md` и `decomposition.md`.
|
|
19
|
+
- Попроси проверить и утвердить или прислать правки.
|
|
20
|
+
- Для продолжения: `/feature-continue <slug>` или `/task-continue <slug>`.
|
|
21
|
+
|
|
22
|
+
## Если slug уже существует
|
|
23
|
+
|
|
24
|
+
- Если `status.json` в `awaiting_approval` — предложи ревью или `/feature-continue`.
|
|
25
|
+
- Если задача в работе — спроси, продолжать или начать новый slug.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Task continue — после human gate или паузы
|
|
2
|
+
|
|
3
|
+
Продолжение пайплайна из `pipeline.json`. Алиас по смыслу: `/feature-continue`.
|
|
4
|
+
|
|
5
|
+
## Аргументы
|
|
6
|
+
|
|
7
|
+
`<slug>` — идентификатор задачи.
|
|
8
|
+
|
|
9
|
+
## Preconditions
|
|
10
|
+
|
|
11
|
+
1. Прочитай `.claude/team/tasks/<slug>/pipeline.json` и `status.json`.
|
|
12
|
+
2. Продолжай если:
|
|
13
|
+
- `awaitingHumanGate: true` или `state: awaiting_approval`, **или**
|
|
14
|
+
- `state: changes_requested` (после review), **или**
|
|
15
|
+
- задача прервана и нужно возобновить с `pipelineIndex`.
|
|
16
|
+
|
|
17
|
+
## Алгоритм
|
|
18
|
+
|
|
19
|
+
1. Запиши `.claude/team/active-task.json` → `{ "slug": "<slug>" }`.
|
|
20
|
+
2. Сбрось gate: `awaitingHumanGate: false`.
|
|
21
|
+
3. Определи **следующий шаг**:
|
|
22
|
+
- После approval analyst/architect: `pipelineIndex + 1` → следующий agent в `steps`.
|
|
23
|
+
- После `changes_requested`: снова **feature-developer** (тот же index или найди developer в steps).
|
|
24
|
+
4. Обнови `status.json`:
|
|
25
|
+
```json
|
|
26
|
+
{
|
|
27
|
+
"pipelineIndex": <n>,
|
|
28
|
+
"currentAgent": "<steps[n].agent>",
|
|
29
|
+
"phase": "executing",
|
|
30
|
+
"state": "in_progress",
|
|
31
|
+
"awaitingHumanGate": false
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
5. Вызови subagent для `currentAgent` с контекстом slug и артефактов.
|
|
35
|
+
6. Если hook `chain-team-phases.sh` включён в проекте и `autoChain: true`, он продолжит цепочку по `pipeline.json`; иначе продолжай следующий шаг вручную.
|
|
36
|
+
|
|
37
|
+
## Артефакты для handoff
|
|
38
|
+
|
|
39
|
+
| Agent | Прочитать |
|
|
40
|
+
|-------|-----------|
|
|
41
|
+
| feature-developer | brief.md, decomposition.md, architecture.md (if exists), debug-report.md (if exists) |
|
|
42
|
+
| code-reviewer | brief.md, git diff |
|
|
43
|
+
| qa-tester | brief.md, decomposition.md, scope from pipeline step |
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Task — единая точка входа
|
|
2
|
+
|
|
3
|
+
Главная команда для постановки задачи в Claude Code. Родительский агент = оркестратор, правила — `rules/tooling-and-review/agent-team-orchestrator.md`.
|
|
4
|
+
|
|
5
|
+
## Аргументы
|
|
6
|
+
|
|
7
|
+
Всё после `/task` — описание задачи на естественном языке.
|
|
8
|
+
|
|
9
|
+
Примеры:
|
|
10
|
+
|
|
11
|
+
- `/task Добавить фильтр по дате в Order History`
|
|
12
|
+
- `/task Order History падает при пустом списке — пофикси`
|
|
13
|
+
- `/task Сделай ревью моих изменений в store/orders`
|
|
14
|
+
- `/task Напиши e2e для сценария оплаты`
|
|
15
|
+
|
|
16
|
+
## Алгоритм
|
|
17
|
+
|
|
18
|
+
1. **Slug** — kebab-case из описания (≤48 символов). Создай `.claude/team/tasks/<slug>/`.
|
|
19
|
+
2. **Router** — вызови subagent **task-router** с описанием задачи и путём к slug.
|
|
20
|
+
3. **План** — покажи пользователю таблицу из `pipeline.json`: intent, steps, skipped, humanGates.
|
|
21
|
+
4. **Intent retro** — если `intent === "retro"`, выполни `/technical-retro` и **остановись**.
|
|
22
|
+
5. **Старт** — вызови subagent для `pipeline.steps[0].agent`:
|
|
23
|
+
- передай slug, пути к артефактам, scope из step (если есть);
|
|
24
|
+
- обнови `status.json`: `pipelineIndex: 0`, `currentAgent`, `state: in_progress`.
|
|
25
|
+
6. **Human gate** — если после текущего шага есть gate в `humanGates` (`after:<agent>`), после завершения агента **остановись** и попроси `/task-continue <slug>` (или `/feature-continue <slug>`).
|
|
26
|
+
|
|
27
|
+
## Не делать
|
|
28
|
+
|
|
29
|
+
- Не вызывать developer до router и (если в pipeline) analyst/architect.
|
|
30
|
+
- Не hardcode порядок ролей — только `pipeline.json`.
|
|
31
|
+
- Не пропускать human gate без явного continue.
|
|
32
|
+
|
|
33
|
+
## Если slug занят
|
|
34
|
+
|
|
35
|
+
- `awaitingHumanGate` / `state: awaiting_approval` → предложи ревью артефактов или `/task-continue <slug>`.
|
|
36
|
+
- `in_progress` → спроси: продолжить или новый slug.
|
|
37
|
+
|
|
38
|
+
## Legacy
|
|
39
|
+
|
|
40
|
+
`/feature-start` и `/feature-continue` остаются совместимыми; для новых задач предпочитай `/task`.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Техническое ретро — роль агента
|
|
2
|
+
|
|
3
|
+
Агент выступает как **нейтральный фасилитатор технической ретроспективы**, а не как ревьюер кода или оценщик людей. Цель — вынести уроки, согласовать действия и улучшить процесс разработки.
|
|
4
|
+
|
|
5
|
+
## Когда включать
|
|
6
|
+
|
|
7
|
+
- Пользователь просит: «ретро», «техническое ретро», «разбор спринта/итерации», «что пошло хорошо / плохо», «action items после релиза».
|
|
8
|
+
- Есть контекст: период (спринт, квартал), тема (релиз, инцидент, миграция), или приложены заметки/линки.
|
|
9
|
+
|
|
10
|
+
## Входные данные (запросить при нехватке)
|
|
11
|
+
|
|
12
|
+
- **Период и фокус** (например: две недели, релиз X, постмортем).
|
|
13
|
+
- **Участники/роли** (если важно для формулировок): только разработка или весь кросс‑функциональный поток.
|
|
14
|
+
- **Ограничения**: время (15 / 30 / 60 мин), формат (async в чате vs синхронная повестка).
|
|
15
|
+
- По желанию: список deliverables, метрики, ссылки на тикеты/MR — **без выдумывания** фактов, которых нет в сообщении или репозитории.
|
|
16
|
+
|
|
17
|
+
Если контекста мало — задать **1–3 коротких уточняющих вопроса**, затем продолжить с явными допущениями в шапке вывода.
|
|
18
|
+
|
|
19
|
+
## Принципы фасилитации
|
|
20
|
+
|
|
21
|
+
- **Безопасность и нейтральность**: формулировки про процесс и систему, не про «виноватых»; избегать ярлыков к людям.
|
|
22
|
+
- **Конкретика**: от абстрактного «надо лучше общаться» — к наблюдаемым событиям и договорённостям.
|
|
23
|
+
- **Баланс**: зафиксировать и позитив (что усилить), и зоны роста.
|
|
24
|
+
- **Один владелец и срок** у каждого action item; избегать списка «сделает команда» без имени/роли.
|
|
25
|
+
- **Не смешивать с code review**: ретро не заменяет построчный разбор диффа; при запросе «и ретро, и ревью» — развести два блока в ответе.
|
|
26
|
+
|
|
27
|
+
## Рекомендуемая структура сессии (по умолчанию)
|
|
28
|
+
|
|
29
|
+
Подстроить под указанное время. Для короткого async‑формата — сжать до шагов 2–4.
|
|
30
|
+
|
|
31
|
+
1. **Цель и рамки** (1–2 предложения): зачем встреча, что в фокусе / что вне скоупа.
|
|
32
|
+
2. **Сбор фактов** (молча в чате — списком от пользователя; агент структурирует):
|
|
33
|
+
- что шло хорошо,
|
|
34
|
+
- что мешало / вызывало риски,
|
|
35
|
+
- сюрпризы (технический долг, узкие места, зависимости).
|
|
36
|
+
3. **Группировка тем**: объединить дубли, выделить 3–7 тем для обсуждения (приоритет — влияние × изменяемость).
|
|
37
|
+
4. **Корневые причины (легко)**: для 1–2 самых болезненных тем — кратко «5 почему» или «что в процессе/артефактах позволило этому случиться», без морализаторства.
|
|
38
|
+
5. **Эксперименты на следующий цикл**: не больше 1–3 изменений процесса/инструментов; каждое — измеримое или с явным критерием «успех/не успех».
|
|
39
|
+
6. **Action items**: таблица или список с **что / владелец / до когда / как поймём, что сработало**.
|
|
40
|
+
|
|
41
|
+
## Формат ответа агента
|
|
42
|
+
|
|
43
|
+
- Краткая **шапка**: период, фокус, допущения (если были).
|
|
44
|
+
- **Повестка** или итог по этапам выше.
|
|
45
|
+
- **Темы** — буллеты; по спорным местам — **вопросы команде**, а не окончательные выводы без данных.
|
|
46
|
+
- **Решения и эксперименты** отдельным блоком.
|
|
47
|
+
- **Action items** — в конце, каждый пункт с владельцем и дедлайном (или пометка «нужно назначить на встрече»).
|
|
48
|
+
|
|
49
|
+
## Ограничения
|
|
50
|
+
|
|
51
|
+
- Не приписывать команде цитаты или факты, которых не было во входе.
|
|
52
|
+
- Не выдавать юридические/HR‑рекомендации; при явных конфликтах или токсичности — мягко предложить эскалацию человеку, ответственному за команду, без детализации «наказаний».
|
|
53
|
+
- Если пользователь просит только шаблон — выдать **шаблон повестки и доски** (колонки, таймбоксы) без выдуманного контента.
|
|
@@ -3,3 +3,9 @@
|
|
|
3
3
|
Событийные хуки автоматизации Claude Code — по документации продукта, если включены в репозитории.
|
|
4
4
|
|
|
5
5
|
Папка копируется в `.claude/hooks/` при `ai-rules init claude --preset next`, если существует.
|
|
6
|
+
|
|
7
|
+
| Файл | Назначение |
|
|
8
|
+
|------|------------|
|
|
9
|
+
| `chain-team-phases.sh` | Optional chaining helper для agent team pipeline после завершения subagent |
|
|
10
|
+
|
|
11
|
+
Hook-скрипт сам по себе не включает автоматизацию: подключайте его в конфигурации Claude Code hooks целевого проекта, если хотите auto-chain. Без hook workflow продолжает родительский агент по `rules/tooling-and-review/agent-team-orchestrator.md`.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Chains agent team phases after subagent completion when wired into Claude Code hooks.
|
|
3
|
+
# Reads stdin JSON from a subagent-stop style hook; writes followup_message to stdout.
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
input=$(cat)
|
|
8
|
+
|
|
9
|
+
INPUT="$input" node <<'NODE'
|
|
10
|
+
const fs = require('fs');
|
|
11
|
+
const path = require('path');
|
|
12
|
+
|
|
13
|
+
const inputRaw = process.env.INPUT || '';
|
|
14
|
+
let hookInput;
|
|
15
|
+
try {
|
|
16
|
+
hookInput = JSON.parse(inputRaw);
|
|
17
|
+
} catch {
|
|
18
|
+
process.stdout.write('{}');
|
|
19
|
+
process.exit(0);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (hookInput.status !== 'completed') {
|
|
23
|
+
process.stdout.write('{}');
|
|
24
|
+
process.exit(0);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const teamRoot = path.join(process.cwd(), '.claude', 'team');
|
|
28
|
+
const activePath = path.join(teamRoot, 'active-task.json');
|
|
29
|
+
|
|
30
|
+
if (!fs.existsSync(activePath)) {
|
|
31
|
+
process.stdout.write('{}');
|
|
32
|
+
process.exit(0);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
let active;
|
|
36
|
+
try {
|
|
37
|
+
active = JSON.parse(fs.readFileSync(activePath, 'utf8'));
|
|
38
|
+
} catch {
|
|
39
|
+
process.stdout.write('{}');
|
|
40
|
+
process.exit(0);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const slug = active.slug;
|
|
44
|
+
if (!slug) {
|
|
45
|
+
process.stdout.write('{}');
|
|
46
|
+
process.exit(0);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const statusPath = path.join(teamRoot, 'tasks', slug, 'status.json');
|
|
50
|
+
if (!fs.existsSync(statusPath)) {
|
|
51
|
+
process.stdout.write('{}');
|
|
52
|
+
process.exit(0);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
let status;
|
|
56
|
+
try {
|
|
57
|
+
status = JSON.parse(fs.readFileSync(statusPath, 'utf8'));
|
|
58
|
+
} catch {
|
|
59
|
+
process.stdout.write('{}');
|
|
60
|
+
process.exit(0);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const now = new Date().toISOString();
|
|
64
|
+
|
|
65
|
+
function writeStatus(next) {
|
|
66
|
+
fs.writeFileSync(statusPath, JSON.stringify({ ...status, ...next, slug, updatedAt: now }, null, 2) + '\n');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function out(message) {
|
|
70
|
+
process.stdout.write(JSON.stringify({ followup_message: message }));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Human gate: do not auto-chain during analysis or explicit approval waits.
|
|
74
|
+
if (status.phase === 'analysis' || status.state === 'awaiting_approval') {
|
|
75
|
+
process.stdout.write('{}');
|
|
76
|
+
process.exit(0);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Legacy mode without pipeline.json.
|
|
80
|
+
if (status.phase === 'development' && status.state === 'completed') {
|
|
81
|
+
writeStatus({ phase: 'review', state: 'in_progress' });
|
|
82
|
+
out(
|
|
83
|
+
`Subagent development phase finished for slug "${slug}". ` +
|
|
84
|
+
`Invoke the code-reviewer subagent. ` +
|
|
85
|
+
`Read .claude/team/tasks/${slug}/brief.md and decomposition.md. ` +
|
|
86
|
+
`Review git diff against acceptance criteria per rules/tooling-and-review/code-review-mr.md. ` +
|
|
87
|
+
`Update status.json when done.`,
|
|
88
|
+
);
|
|
89
|
+
process.exit(0);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (status.phase === 'review' && status.state === 'completed') {
|
|
93
|
+
writeStatus({ phase: 'testing', state: 'in_progress' });
|
|
94
|
+
out(
|
|
95
|
+
`Code review completed for slug "${slug}". ` +
|
|
96
|
+
`Invoke the qa-tester subagent. ` +
|
|
97
|
+
`Add or update unit and e2e tests per brief acceptance criteria. ` +
|
|
98
|
+
`Follow rules/testing/playwright-agents.md and rules/testing/tests-e2e-structure.md. ` +
|
|
99
|
+
`Update status.json when done.`,
|
|
100
|
+
);
|
|
101
|
+
process.exit(0);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (status.phase === 'review' && status.state === 'changes_requested') {
|
|
105
|
+
out(
|
|
106
|
+
`Review requested changes for slug "${slug}". ` +
|
|
107
|
+
`Invoke feature-developer with the review fix list, then re-run code-reviewer.`,
|
|
108
|
+
);
|
|
109
|
+
process.exit(0);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (status.phase === 'testing' && status.state === 'completed') {
|
|
113
|
+
writeStatus({ phase: 'done', state: 'completed' });
|
|
114
|
+
out(
|
|
115
|
+
`QA phase completed for slug "${slug}". ` +
|
|
116
|
+
`Suggest running /technical-retro with this slug. ` +
|
|
117
|
+
`Read team artifacts under .claude/team/tasks/${slug}/ and git diff for the retro.`,
|
|
118
|
+
);
|
|
119
|
+
process.exit(0);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
process.stdout.write('{}');
|
|
123
|
+
NODE
|
|
@@ -1,16 +1,54 @@
|
|
|
1
1
|
# `.claude/rules` (preset next)
|
|
2
2
|
|
|
3
|
-
В Claude Code все `.md` под `rules/` **обнаруживаются
|
|
3
|
+
В Claude Code все `.md` под `rules/` **обнаруживаются рекурсивно**. Правила без YAML frontmatter загружаются **в начале сессии**; с `paths:` — **только при работе** с matching-файлами (экономия контекста).
|
|
4
4
|
|
|
5
|
-
Соответствие
|
|
5
|
+
Соответствие пресету Cursor (`.cursor/rules/*.mdc`):
|
|
6
6
|
|
|
7
|
-
| Папка | О чём |
|
|
8
|
-
|
|
9
|
-
| `
|
|
10
|
-
| `
|
|
11
|
-
| `api-and-data/` | сервисы,
|
|
12
|
-
| `
|
|
13
|
-
| `
|
|
14
|
-
| `tooling-and-review/` |
|
|
7
|
+
| Папка | О чём | Загрузка |
|
|
8
|
+
|-------|--------|----------|
|
|
9
|
+
| `architecture/` | границы слоёв, barrel, импорты, доставка фичи | session start |
|
|
10
|
+
| `stack/` | Next.js, TS, навигация, JSDoc типов | core — session; `types-jsdoc.md` — `paths: app/src/types/**` |
|
|
11
|
+
| `api-and-data/` | HTTP, сервисы, store | `paths:` по каталогам слоя |
|
|
12
|
+
| `ui-and-accessibility/` | React UI, стили, a11y, пропсы | core — session; `react-ui.md` — `paths: app/src/ui/**` |
|
|
13
|
+
| `testing/` | unit, e2e, Playwright agents | `tests-unit.md`, `tests-e2e-structure.md` — `paths:`; `playwright-agents.md` — session start |
|
|
14
|
+
| `tooling-and-review/` | lint, package manager, качество, MR review | session start |
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
On-demand сценарии вне постоянного контекста — в `commands/` (например `technical-retro.md`).
|
|
17
|
+
|
|
18
|
+
## С чего начать новую фичу
|
|
19
|
+
|
|
20
|
+
Для обычной задачи — **`commands/task.md`**: router → `pipeline.json` → нужные agents. Для ручной реализации без team workflow — **`architecture/feature-delivery-workflow.md`**.
|
|
21
|
+
|
|
22
|
+
## Каталог правил
|
|
23
|
+
|
|
24
|
+
| Файл | Назначение |
|
|
25
|
+
|------|------------|
|
|
26
|
+
| `tooling-and-review/package-manager.md` | Менеджер пакетов перед install/run |
|
|
27
|
+
| `tooling-and-review/agent-team-intake.md` | Когда использовать `/task` и task-router |
|
|
28
|
+
| `tooling-and-review/agent-team-orchestrator.md` | Dynamic pipeline, subagents, gates, handoff artifacts |
|
|
29
|
+
| `architecture/feature-delivery-workflow.md` | Сквозной порядок работ по фиче, mermaid, матрица слой → правило |
|
|
30
|
+
| `stack/next-app-core.md` | Стек, слои, порты‑адаптеры, работа агента |
|
|
31
|
+
| `tooling-and-review/post-change-lint.md` | **Обязательный** ESLint + Stylelint после изменений |
|
|
32
|
+
| `architecture/architecture-boundaries.md` | Границы UI / store / API, импорты, фича как срез |
|
|
33
|
+
| `api-and-data/http-client.md` | Единый HTTP‑стек, контракты из `@/types` |
|
|
34
|
+
| `api-and-data/api-services.md` | Сервисы, мапперы, прикладные API‑клиенты |
|
|
35
|
+
| `api-and-data/store-rtk.md` | Redux Toolkit, thunk’и, типизация ошибок |
|
|
36
|
+
| `architecture/types-public-imports.md` | Импорты только через barrel `@/types` |
|
|
37
|
+
| `architecture/api-public-imports.md` | Импорты только через barrel `@/api` |
|
|
38
|
+
| `architecture/layer-barrel-exports.md` | Двухуровневые barrel для слоёв с public API |
|
|
39
|
+
| `stack/types-jsdoc.md` | JSDoc для типов в `app/src/types` |
|
|
40
|
+
| `stack/no-type-assertion.md` | Ограничение `as`, `instanceof` для ошибок транспорта |
|
|
41
|
+
| `tooling-and-review/code-review-mr.md` | Чеклист ревью MR |
|
|
42
|
+
| `testing/tests-unit.md` | Unit‑тесты и behavior‑тесты HTTP‑клиента |
|
|
43
|
+
| `testing/playwright-agents.md`, `testing/tests-e2e-structure.md` | E2e |
|
|
44
|
+
| `ui-and-accessibility/react-ui.md` | React/Next UI: структура, `.data.ts` / `.utils.ts`, стили |
|
|
45
|
+
| `ui-and-accessibility/no-props-spread.md` | Без spread пропов в компонентах |
|
|
46
|
+
| `ui-and-accessibility/component-styles.md` | Колокация стилей, `Root` |
|
|
47
|
+
| `ui-and-accessibility/css-property-order.md` | Порядок CSS (Stylelint) |
|
|
48
|
+
| `stack/arrow-functions.md` | Стрелочные функции |
|
|
49
|
+
| `stack/navigation-router.md` | Навигация по стеку проекта |
|
|
50
|
+
| `tooling-and-review/code-quality.md` | Качество кода и рефакторинг |
|
|
51
|
+
|
|
52
|
+
**Коллизии:** импорт типов — **`architecture/types-public-imports.md`**; импорт API вне `app/src/api/**` — **`architecture/api-public-imports.md`**.
|
|
53
|
+
|
|
54
|
+
Задачи на **сеть, HTTP, эндпоинты**: **`api-and-data/http-client.md`** + **`api-and-data/api-services.md`** + **`api-and-data/store-rtk.md`**.
|
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
# API and data
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
HTTP-транспорт, сервисы, Redux store.
|
|
4
|
+
|
|
5
|
+
| Файл | Содержание | `paths:` |
|
|
6
|
+
|------|------------|----------|
|
|
7
|
+
| `http-client.md` | Единый HTTP-клиент, ошибки, связь со store | `app/src/lib/clients/**`, `app/src/api/clients/**` |
|
|
8
|
+
| `api-services.md` | Сервисы, мапперы, DTO → домен | `app/src/api/services/**` |
|
|
9
|
+
| `store-rtk.md` | Redux Toolkit, thunk'и, типизация | `app/src/store/**` |
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- app/src/api/services/**/*.ts
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Роль API слоя
|
|
7
|
+
|
|
8
|
+
- Инкапсулировать всё, что связано с:
|
|
9
|
+
- HTTP‑запросами через **экземпляры прикладных API‑клиентов** в `app/src/api/clients/**`, собранные на **общей реализации** из `app/src/lib/clients/**` (как в существующем коде); подробности — **`api-and-data/http-client.md`**; положение слоя в схеме **порты и адаптеры** — `architecture/architecture-boundaries.md`;
|
|
10
|
+
- URL/путями,
|
|
11
|
+
- заголовками и кодами ответов,
|
|
12
|
+
- DTO backend.
|
|
13
|
+
- Предоставлять UI и store **стабильный доменный интерфейс**:
|
|
14
|
+
- функции, работающие с доменными типами из `@/types` (`architecture/types-public-imports.md`).
|
|
15
|
+
- мапперы между DTO и доменными типами.
|
|
16
|
+
|
|
17
|
+
# Структура модулей
|
|
18
|
+
|
|
19
|
+
- Для каждой доменной области (например, заказы, биллинг, настройки аккаунта):
|
|
20
|
+
- отдельный каталог в `app/src/api/services/<ИмяСервиса или фичи>/**` по конвенции репозитория.
|
|
21
|
+
- Внутри модуля:
|
|
22
|
+
- файлы с вызовами API (`index.ts` или `*.service.ts`);
|
|
23
|
+
- файлы мапперов (`*responseMappers.ts`);
|
|
24
|
+
- специфичные типы запросов/ответов (если не вынесены в `app/src/types/**` с экспортом через barrel `@/types`).
|
|
25
|
+
- при необходимости — локальные `index.ts` / barrel внутри модуля для структуры **внутри** `app/src/api/**`; **снаружи** этого слоя UI, store и остальной код импортируют только из корневого barrel `app/src/api/index.ts` (`import … from '@/api'`, **`architecture/api-public-imports.md`**).
|
|
26
|
+
|
|
27
|
+
# Мапперы и типы
|
|
28
|
+
|
|
29
|
+
- Для каждого запроса/эндпоинта:
|
|
30
|
+
- описывать **response‑тип (DTO)**, точно соответствующий контракту backend;
|
|
31
|
+
- определять **целевой доменный тип** в `app/src/types/**`, с которым будет работать приложение (включая вычисляемые/агрегированные поля).
|
|
32
|
+
- Мапперы (например, `*responseMappers.ts`):
|
|
33
|
+
- чистые функции, без сайд‑эффектов;
|
|
34
|
+
- выполняют все необходимые вычисления и преобразования данных (булевы флаги, склейка строк, агрегаты и т.п.) при переводе из DTO в доменные модели;
|
|
35
|
+
- при необходимости обеспечивают обратное преобразование (доменные модели → транспортные типы).
|
|
36
|
+
- UI и store работают только с доменными типами (из `@/types` или экспортируемыми из public API слоя API), а не с «сырыми» DTO.
|
|
37
|
+
- **Не вызывать `fetch` напрямую** в теле API‑методов: только через клиент; исключения — узкие модули (например JSON‑RPC), если так уже устроено в репозитории.
|
|
38
|
+
|
|
39
|
+
# Обработка ошибок
|
|
40
|
+
|
|
41
|
+
- API‑слой:
|
|
42
|
+
- не должен «глотать» ошибки без следа;
|
|
43
|
+
- либо бросает доменные/унифицированные ошибки;
|
|
44
|
+
- либо возвращает результат в `Result<T, E>`‑подобной форме (если такой паттерн принят в проекте).
|
|
45
|
+
- Интеграция с APM/трассировкой (если есть в проекте):
|
|
46
|
+
- централизованно (HTTP‑клиент, обёртки), а не в каждом методе сервиса.
|
|
47
|
+
|
|
48
|
+
# Требование к агенту
|
|
49
|
+
|
|
50
|
+
При добавлении/изменении API‑метода:
|
|
51
|
+
|
|
52
|
+
- Следовать существующим сервисам и мапперам как эталону.
|
|
53
|
+
- Пройти чеклист barrel-экспортов (**`architecture/layer-barrel-exports.md`**): локальный `index.ts` → фасад слоя → корневой barrel.
|
|
54
|
+
- Не смешивать слой API и UI/store:
|
|
55
|
+
- компоненты не должны зависеть от DTO;
|
|
56
|
+
- store не должен сам собирать URL/коды эндпоинтов и не обходить сервисы; **транспортный тип ответа** и **контракт ошибки** из `@/types` (как у прикладного клиента) допустимы во thunk при разборе `catch`/payload, если так выстроен сервис (см. `api-and-data/store-rtk.md`, `api-and-data/http-client.md`).
|
|
57
|
+
- При использовании API‑сервисов в UI, store и утилитах **вне** `app/src/api/**` импортировать **только** из `@/api` (корневой barrel), см. **`architecture/api-public-imports.md`**; внутри слоя API — по относительным путям или `@/api/services/**` / `@/api/clients/**`, не дублируя публичный контракт мимо корневого barrel для внешних потребителей.
|