@bonesofspring/ai-rules 0.1.36 → 0.1.39

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.
Files changed (90) hide show
  1. package/README.md +7 -3
  2. package/bin/cli.js +55 -31
  3. package/package.json +1 -1
  4. package/presets/claude/next/CLAUDE.md +24 -5
  5. package/presets/claude/next/agents/code-reviewer.md +56 -0
  6. package/presets/claude/next/agents/debugger.md +58 -0
  7. package/presets/claude/next/agents/feature-developer.md +45 -0
  8. package/presets/claude/next/agents/qa-tester.md +54 -0
  9. package/presets/claude/next/agents/solution-architect.md +70 -0
  10. package/presets/claude/next/agents/task-analyst.md +105 -0
  11. package/presets/claude/next/agents/task-router.md +105 -0
  12. package/presets/claude/next/commands/README.md +5 -1
  13. package/presets/claude/next/commands/feature-continue.md +46 -0
  14. package/presets/claude/next/commands/feature-start.md +25 -0
  15. package/presets/claude/next/commands/task-continue.md +43 -0
  16. package/presets/claude/next/commands/task.md +40 -0
  17. package/presets/claude/next/commands/technical-retro.md +53 -0
  18. package/presets/claude/next/rules/README.md +47 -11
  19. package/presets/claude/next/rules/api-and-data/README.md +7 -1
  20. package/presets/claude/next/rules/api-and-data/api-services.md +57 -0
  21. package/presets/claude/next/rules/api-and-data/http-client.md +40 -0
  22. package/presets/claude/next/rules/api-and-data/store-rtk.md +65 -0
  23. package/presets/claude/next/rules/architecture/README.md +11 -1
  24. package/presets/claude/next/rules/architecture/api-public-imports.md +25 -0
  25. package/presets/claude/next/rules/architecture/architecture-boundaries.md +67 -0
  26. package/presets/claude/next/rules/architecture/feature-delivery-workflow.md +99 -0
  27. package/presets/claude/next/rules/architecture/layer-barrel-exports.md +53 -0
  28. package/presets/claude/next/rules/architecture/types-public-imports.md +28 -0
  29. package/presets/claude/next/rules/stack/README.md +9 -1
  30. package/presets/claude/next/rules/stack/arrow-functions.md +40 -0
  31. package/presets/claude/next/rules/stack/navigation-router.md +56 -0
  32. package/presets/claude/next/rules/stack/next-app-core.md +83 -0
  33. package/presets/claude/next/rules/stack/no-type-assertion.md +52 -0
  34. package/presets/claude/next/rules/stack/types-jsdoc.md +37 -0
  35. package/presets/claude/next/rules/testing/README.md +9 -1
  36. package/presets/claude/next/rules/testing/playwright-agents.md +69 -0
  37. package/presets/claude/next/rules/testing/tests-e2e-structure.md +52 -0
  38. package/presets/claude/next/rules/testing/tests-unit.md +66 -0
  39. package/presets/claude/next/rules/tooling-and-review/README.md +12 -1
  40. package/presets/claude/next/rules/tooling-and-review/agent-team-intake.md +9 -0
  41. package/presets/claude/next/rules/tooling-and-review/agent-team-orchestrator.md +97 -0
  42. package/presets/claude/next/rules/tooling-and-review/code-quality.md +50 -0
  43. package/presets/claude/next/rules/tooling-and-review/code-review-mr.md +67 -0
  44. package/presets/claude/next/rules/tooling-and-review/package-manager.md +20 -0
  45. package/presets/claude/next/rules/tooling-and-review/post-change-lint.md +43 -0
  46. package/presets/claude/next/rules/ui-and-accessibility/README.md +8 -1
  47. package/presets/claude/next/rules/ui-and-accessibility/component-styles.md +50 -0
  48. package/presets/claude/next/rules/ui-and-accessibility/css-property-order.md +20 -0
  49. package/presets/claude/next/rules/ui-and-accessibility/no-props-spread.md +52 -0
  50. package/presets/claude/next/rules/ui-and-accessibility/react-ui.md +90 -0
  51. package/presets/claude/next/team/README.md +64 -0
  52. package/presets/claude/next/team/tasks/.gitkeep +1 -0
  53. package/presets/cursor/next/agents/README.md +25 -0
  54. package/presets/cursor/next/agents/code-reviewer.md +57 -0
  55. package/presets/cursor/next/agents/debugger.md +59 -0
  56. package/presets/cursor/next/agents/feature-developer.md +46 -0
  57. package/presets/cursor/next/agents/qa-tester.md +55 -0
  58. package/presets/cursor/next/agents/solution-architect.md +71 -0
  59. package/presets/cursor/next/agents/task-analyst.md +111 -0
  60. package/presets/cursor/next/agents/task-router.md +106 -0
  61. package/presets/cursor/next/commands/README.md +33 -1
  62. package/presets/cursor/next/commands/feature-continue.md +14 -0
  63. package/presets/cursor/next/commands/feature-start.md +28 -0
  64. package/presets/cursor/next/commands/task-continue.md +43 -0
  65. package/presets/cursor/next/commands/task.md +40 -0
  66. package/presets/cursor/next/commands/technical-retro.md +76 -0
  67. package/presets/cursor/next/hooks/chain-team-phases.sh +216 -0
  68. package/presets/cursor/next/hooks.json +11 -0
  69. package/presets/cursor/next/rules/README.md +11 -3
  70. package/presets/cursor/next/rules/agent-team-intake.mdc +14 -0
  71. package/presets/cursor/next/rules/agent-team-orchestrator.mdc +102 -0
  72. package/presets/cursor/next/rules/api-public-imports.mdc +1 -0
  73. package/presets/cursor/next/rules/api-services.mdc +1 -0
  74. package/presets/cursor/next/rules/architecture-boundaries.mdc +1 -1
  75. package/presets/cursor/next/rules/code-quality-and-refactoring.mdc +9 -0
  76. package/presets/cursor/next/rules/code-review-mr.mdc +6 -7
  77. package/presets/cursor/next/rules/css-property-order-stylelint.mdc +25 -0
  78. package/presets/cursor/next/rules/feature-delivery-workflow.mdc +5 -5
  79. package/presets/cursor/next/rules/layer-barrel-exports.mdc +58 -0
  80. package/presets/cursor/next/rules/next-app-core.mdc +1 -1
  81. package/presets/cursor/next/rules/no-cross-component-styles-import.mdc +55 -0
  82. package/presets/cursor/next/rules/no-props-spread.mdc +26 -3
  83. package/presets/cursor/next/rules/package-manager.mdc +25 -0
  84. package/presets/cursor/next/rules/post-change-lint.mdc +48 -0
  85. package/presets/cursor/next/rules/react-ui.mdc +31 -2
  86. package/presets/cursor/next/rules/technical-retro.mdc +5 -51
  87. package/presets/cursor/next/rules/tests-unit.mdc +1 -0
  88. package/presets/cursor/next/rules/types-public-imports.mdc +1 -0
  89. package/presets/cursor/next/team/README.md +106 -0
  90. 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,9 @@
1
1
  # `.claude/commands` (preset next)
2
2
 
3
- Определения slash-команд для проекта. Копируются в `.claude/commands/` при `ai-rules init claude --preset next`.
3
+ Определения slash-команд и on-demand сценариев. Копируются в `.claude/commands/` при `ai-rules init claude --preset next`.
4
+
5
+ | Файл | Назначение |
6
+ |------|------------|
7
+ | `technical-retro.md` | Фасилитация технического ретро (не дублируется в `rules/` — экономия контекста) |
4
8
 
5
9
  См. также корневой `README.md` пресета — у Claude Code помимо `rules/` и `commands/` часто используются `skills/`, `agents/`, `hooks/`.
@@ -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
+ - Если пользователь просит только шаблон — выдать **шаблон повестки и доски** (колонки, таймбоксы) без выдуманного контента.
@@ -1,16 +1,52 @@
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
- Соответствие темам из пресета Cursor (для переноса смысла из `.mdc`):
5
+ Соответствие пресету Cursor (`.cursor/rules/*.mdc`):
6
6
 
7
- | Папка | О чём |
8
- |-------|--------|
9
- | `stack/` | Next.js, React, TypeScript |
10
- | `architecture/` | границы слоёв, модули |
11
- | `api-and-data/` | сервисы, API, данные |
12
- | `testing/` | unit, e2e, Playwright |
13
- | `ui-and-accessibility/` | UI, a11y, без spread props там, где это правило команды |
14
- | `tooling-and-review/` | качество кода, ревью MR |
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
- Добавляйте сюда `.md` файлы с осмысленными именами (`testing.md`, `api-design.md`, …).
16
+ On-demand сценарии вне постоянного контекста в `commands/` (например `technical-retro.md`).
17
+
18
+ ## С чего начать новую фичу
19
+
20
+ **`architecture/feature-delivery-workflow.md`** — сквозной чеклист и матрица «зона репозитория → правило».
21
+
22
+ ## Каталог правил
23
+
24
+ | Файл | Назначение |
25
+ |------|------------|
26
+ | `tooling-and-review/package-manager.md` | Менеджер пакетов перед install/run |
27
+ | `architecture/feature-delivery-workflow.md` | Сквозной порядок работ по фиче, mermaid, матрица слой → правило |
28
+ | `stack/next-app-core.md` | Стек, слои, порты‑адаптеры, работа агента |
29
+ | `tooling-and-review/post-change-lint.md` | **Обязательный** ESLint + Stylelint после изменений |
30
+ | `architecture/architecture-boundaries.md` | Границы UI / store / API, импорты, фича как срез |
31
+ | `api-and-data/http-client.md` | Единый HTTP‑стек, контракты из `@/types` |
32
+ | `api-and-data/api-services.md` | Сервисы, мапперы, прикладные API‑клиенты |
33
+ | `api-and-data/store-rtk.md` | Redux Toolkit, thunk’и, типизация ошибок |
34
+ | `architecture/types-public-imports.md` | Импорты только через barrel `@/types` |
35
+ | `architecture/api-public-imports.md` | Импорты только через barrel `@/api` |
36
+ | `architecture/layer-barrel-exports.md` | Двухуровневые barrel для слоёв с public API |
37
+ | `stack/types-jsdoc.md` | JSDoc для типов в `app/src/types` |
38
+ | `stack/no-type-assertion.md` | Ограничение `as`, `instanceof` для ошибок транспорта |
39
+ | `tooling-and-review/code-review-mr.md` | Чеклист ревью MR |
40
+ | `testing/tests-unit.md` | Unit‑тесты и behavior‑тесты HTTP‑клиента |
41
+ | `testing/playwright-agents.md`, `testing/tests-e2e-structure.md` | E2e |
42
+ | `ui-and-accessibility/react-ui.md` | React/Next UI: структура, `.data.ts` / `.utils.ts`, стили |
43
+ | `ui-and-accessibility/no-props-spread.md` | Без spread пропов в компонентах |
44
+ | `ui-and-accessibility/component-styles.md` | Колокация стилей, `Root` |
45
+ | `ui-and-accessibility/css-property-order.md` | Порядок CSS (Stylelint) |
46
+ | `stack/arrow-functions.md` | Стрелочные функции |
47
+ | `stack/navigation-router.md` | Навигация по стеку проекта |
48
+ | `tooling-and-review/code-quality.md` | Качество кода и рефакторинг |
49
+
50
+ **Коллизии:** импорт типов — **`architecture/types-public-imports.md`**; импорт API вне `app/src/api/**` — **`architecture/api-public-imports.md`**.
51
+
52
+ Задачи на **сеть, 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
- Конвенции сервисов, API-слоя и работы с данными.
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 для внешних потребителей.
@@ -0,0 +1,40 @@
1
+ ---
2
+ paths:
3
+ - app/src/lib/clients/**/*.ts
4
+ - app/src/api/clients/**/*.ts
5
+ ---
6
+
7
+ # HTTP-транспорт
8
+
9
+ **Имена** фабрик, классов ошибок, типов ответа и конфига — **как в текущем коде репозитория** и в barrel `app/src/types/index.ts`. Ниже — **архитектурные правила**, а не спецификация переименований.
10
+
11
+ ## Роль слоя
12
+
13
+ - Обычные REST‑вызовы к backend идут через **одну реализацию** в `app/src/lib/clients/**` (модуль общего клиента) и **преднастроенные экземпляры** в `app/src/api/clients/**`, по тому же паттерну, что уже принят в проекте.
14
+ - Место транспорта в общей картине **порты и адаптеры** — в `architecture/architecture-boundaries.md` (раздел **«Порты и адаптеры»**).
15
+ - **Не** вызывать `fetch` напрямую из `app/src/api/services/**`, store и UI (см. `architecture/architecture-boundaries.md`, `api-and-data/api-services.md`); из store/UI — только вызовы через сервисы из `@/api` (`architecture/api-public-imports.md`).
16
+ - **Исключения** (узкие протоколы, отдельный транспорт) — только там, где в репозитории уже есть образец; повторять его, не плодить произвольные обходы общего клиента.
17
+
18
+ ## Типы
19
+
20
+ - Всё, что относится к **контракту запроса/ответа/ошибки** приложения и реэкспортируется для HTTP‑слоя, импортировать **только** из barrel `@/types`, без deep‑импортов из внутренних файлов `app/src/types/**` (см. `architecture/types-public-imports.md`).
21
+ - Не поднимать в новом коде **типы и зависимости от внешнего HTTP‑клиента**, от которого проект ушёл; ориентир — **`package.json`** и существующие вызовы.
22
+
23
+ ## Контракт ошибок
24
+
25
+ - Ошибки сети и HTTP должны приходить в **едином виде**, который задаёт общий клиент (обычно класс/обёртка с полем вроде `response` для тела и статуса).
26
+ - В **`catch`** ориентироваться на **фактическую форму** ошибки в этом репозитории (как в соседних слайсах/сервисах): доступ к телу ошибки, статусу, диагностическому коду — **по полям текущей реализации**, без выдумывания второго формата.
27
+
28
+ ## Поведение, которое остаётся в клиенте
29
+
30
+ - Общие заголовки, `credentials`, загрузка файлов (**FormData** / снятие лишних заголовков), бинарные ответы (**blob** и аналоги), единообразный разбор JSON и прочих тел.
31
+ - Перехват **401 / refresh**, обработка **404** и т.п. — **централизованно**, если так уже сделано в клиенте; не дублировать ту же логику в каждом сервисе.
32
+
33
+ ## Связь со store
34
+
35
+ - Thunk может возвращать **тип обёртки успешного ответа**, если сервис так устроен; в **state** по возможности класть **доменные** типы после маппинга. Подробнее — `api-and-data/store-rtk.md`.
36
+
37
+ ## Требование к агенту
38
+
39
+ - Меняя реализацию общего клиента — **обновить или добавить behavior‑тесты** рядом с модулем клиента (`testing/tests-unit.md`).
40
+ - Не вводить **второй полноценный HTTP‑стек** без явной задачи и согласования с архитектурой репозитория.
@@ -0,0 +1,65 @@
1
+ ---
2
+ paths:
3
+ - app/src/store/**/*.ts
4
+ ---
5
+
6
+ # Общие принципы
7
+
8
+ - Использовать **Redux Toolkit**:
9
+ - `createSlice`, `createAsyncThunk`, RTK Query (если используется).
10
+ - Хранить в store **доменные модели**, не «сырые» DTO из API.
11
+ - Все вычисления и преобразования данных (включая вычисляемые поля, булевые флаги, агрегаты, человеко‑читаемые строки и т.п.) должны выполняться **между ответом API и записью в store** — в мапперах или отдельном слое подготовки данных. Store хранит уже подготовленную доменную модель.
12
+ - Разделять:
13
+ - «серверное» состояние (данные из API) и
14
+ - локальное UI‑состояние (выбор/фильтры/флаги).
15
+
16
+ # Структура слайсов
17
+
18
+ - Каждый доменный модуль — свой слайс в `app/src/store/slices/**`.
19
+ - Слайс экспортирует:
20
+ - `reducer` по умолчанию;
21
+ - `actions` именованным экспортом;
22
+ - селекторы `selectSomething(state: RootState): Type`.
23
+ - Состояние:
24
+ - явный тип для state;
25
+ - аккуратная инициализация initialState.
26
+
27
+ # Асинхронность и сайд‑эффекты
28
+
29
+ - Асинхронные запросы:
30
+ - через `createAsyncThunk` или RTK Query.
31
+ - внутри thunk:
32
+ - вызывать API через сервисы, импортированные из `@/api` (**`architecture/api-public-imports.md`**);
33
+ - не вызывать HTTP‑клиент напрямую — только через эти сервисы.
34
+ - Сайд‑эффекты (логирование, аналитика, работа с файлами):
35
+ - выносить в middleware (`app/src/store/middleware/**`) или специализированные слайсы.
36
+
37
+ # Типизация
38
+
39
+ - Использовать `RootState`, `AppDispatch` и типизированные хуки `useAppDispatch`, `useAppSelector` (если есть).
40
+ - **HTTP и ошибки API**:
41
+ - не импортировать типы **сторонних HTTP‑библиотек**, которых нет в актуальных зависимостях и существующих слайсах (ориентир — **`package.json`** и соседние файлы);
42
+ - когда сервис возвращает **обёртку ответа** прикладного клиента — использовать **соответствующий тип из `@/types`** (как в barrel и в аналогичных thunk’ах);
43
+ - при ошибках после вызова сервиса — опираться на **тот же класс/контракт ошибки транспорта**, что использует общий клиент (из `@/types`), и разбирать тело/статус **по полям текущей реализации**, а не по воображаемому API;
44
+ - в **`catch`** предпочитать **`instanceof`** на класс ошибки транспорта из `@/types` (если он есть в коде) вместо голого `as`, когда это выразимо без шума (см. `stack/no-type-assertion.md`).
45
+ - Для сущностей:
46
+ - доменные типы (включая вычисляемые поля) определять в `app/src/types/**`, экспортировать через barrel и импортировать в слайсы из `@/types` как **источник правды** (`architecture/types-public-imports.md`);
47
+ - избегать дублирования описаний сущностей в нескольких местах.
48
+ - **Граница домена**: в **state** хранить доменные модели; тип **обёртки ответа клиента** допустим как тип **возвращаемого значения thunk** или промежуточно до маппинга — без дублирования DTO в полях state без нужды (согласовано с `api-and-data/api-services.md` и `api-and-data/http-client.md`).
49
+
50
+ # Тестирование слайсов
51
+
52
+ - Для важных слайсов:
53
+ - тестировать редюсеры (инициализация, основные переходы состояний);
54
+ - тестировать селекторы (включая edge cases).
55
+ - Thunk’и:
56
+ - по возможности покрывать тестами с моками API‑слоя.
57
+
58
+ # Требование к агенту
59
+
60
+ При изменении/создании слайса:
61
+
62
+ - Не класть логику API внутрь редюсеров/компонентов.
63
+ - Строго типизировать state и actions.
64
+ - Использовать **единый стиль именования actions и селекторов**, как в существующих слайсах.
65
+ - При работе с ошибками и ответами HTTP опираться на **`api-and-data/http-client.md`** и контракты из `@/types`, а не на типы внешних HTTP‑библиотек вне зависимостей проекта.
@@ -1,3 +1,13 @@
1
1
  # Architecture
2
2
 
3
- Границы модулей, слоёв и зависимостей (аналог темы architecture / boundaries в Cursor-пресете).
3
+ Границы модулей, слоёв, зависимостей и сквозная доставка фич.
4
+
5
+ | Файл | Содержание |
6
+ |------|------------|
7
+ | `architecture-boundaries.md` | UI / store / API, порты и адаптеры, организация фич |
8
+ | `layer-barrel-exports.md` | Двухуровневые barrel и чеклист public API |
9
+ | `types-public-imports.md` | Импорт типов только через `@/types` |
10
+ | `api-public-imports.md` | Импорт API только через `@/api` |
11
+ | `feature-delivery-workflow.md` | Чеклист новой фичи, матрица зона → правило |
12
+
13
+ Все файлы — **session start** (без `paths:`).
@@ -0,0 +1,25 @@
1
+ # Импорты из `@/api`
2
+
3
+ - **Публичный API слоя API** — barrel `app/src/api/index.ts`. Для файлов **вне** `app/src/api/**` импортировать сервисы, клиенты, эндпоинты и публичные типы API **только** как `import … from '@/api'` (или `from '@/api/index'` при необходимости явного пути).
4
+ - **Запрещено** для таких потребителей обходить barrel: любой импорт вида `@/api/<что‑угодно>`, кроме `@/api/index`. Это дублирует правило ESLint `no-restricted-imports` в `app/eslint.config.mjs` (паттерн `@/api/*` с исключением `@/api/index`).
5
+ - При **добавлении** публичного символа в регламентированный слой — реэкспорт в корневой barrel по **`architecture/layer-barrel-exports.md`**.
6
+
7
+ ## Внутри слоя `app/src/api/**`
8
+
9
+ - При реализации сервисов, клиентов и barrel допустимы **относительные** импорты и пути вида `@/api/services/**`, `@/api/clients/**` между файлами этого слоя. Это не относится к потребителям снаружи `app/src/api/**`.
10
+
11
+ ## Примеры
12
+
13
+ ```typescript
14
+ // ✅ Допустимо в store, UI, lib вне app/src/api — только barrel
15
+ import { MedcardApiService, MarketplaceApiService } from '@/api'
16
+ import type { TReferenceRequest } from '@/api'
17
+
18
+ // ❌ Запрещено снаружи app/src/api (сработает ESLint)
19
+ import { MedcardApiService } from '@/api/services/MedcardApiService/MedcardApiService'
20
+ import { MedcardApiClient } from '@/api/clients/MedcardApiClient'
21
+ ```
22
+
23
+ При ревью и правках кода **не добавлять** новые импорты из `@/api/...` кроме `@/api` / `@/api/index` в файлах вне `app/src/api/**`.
24
+
25
+ **Коллизии формулировок:** по **импорту из API‑слоя** (store, UI, прочий код вне `app/src/api/**`) — источник правды — **этот файл** (`@/api`).