@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,69 @@
1
+ # Playwright Agents in this project
2
+
3
+ Playwright Agents (planner, generator, healer) **must follow the existing e2e structure**:
4
+
5
+ - **Test directory**: `app/__tests__/e2e`
6
+ - **Test plans (specs)**: `*.cases.md` files under `app/__tests__/e2e/**`
7
+ - **Executable tests**: `*.spec.ts` files under `app/__tests__/e2e/**`
8
+ - **Seed test**: `app/__tests__/e2e/seed.spec.ts`
9
+
10
+ Do **not** introduce separate top-level `specs/` and `tests/` folders for real test coverage. Those may be used only as temporary sandboxes if explicitly requested.
11
+
12
+ ## Planner (test plans)
13
+
14
+ When acting as a **Planner** (or working with the Playwright planner agent):
15
+
16
+ - **Treat `*.cases.md` as the canonical test plan files**, equivalent to Playwright's `specs/*.md`.
17
+ - **Location**:
18
+ - For a feature/domain, use the corresponding `*.cases.md` file under `app/__tests__/e2e`, e.g.:
19
+ - `app/__tests__/e2e/OrderHistory/order-history.cases.md`
20
+ - `app/__tests__/e2e/BillingReport/invoice-list.cases.md`
21
+ - **Content requirements**:
22
+ - Group scenarios by feature and subfeature using headings.
23
+ - For each scenario include:
24
+ - clear title,
25
+ - preconditions,
26
+ - ordered steps,
27
+ - expected results.
28
+ - Write in concise business language, but precise enough for automatic test generation.
29
+ - **Seed**:
30
+ - Assume environment is prepared by `app/__tests__/e2e/seed.spec.ts` (login, baseURL, mocks, etc.).
31
+
32
+ When asked to "generate a test plan" for a feature, **create or update the appropriate `*.cases.md` file in `app/__tests__/e2e/**`**, not in a separate `specs/` folder.
33
+
34
+ ## Generator (tests from plans)
35
+
36
+ When acting as a **Generator** (or working with the Playwright generator agent):
37
+
38
+ - **Source of truth for scenarios**:
39
+ - Use the relevant `*.cases.md` file under `app/__tests__/e2e/**` as the test plan.
40
+ - **Target for tests**:
41
+ - Generate or update `*.spec.ts` files under the same folder, e.g.:
42
+ - plan: `app/__tests__/e2e/OrderHistory/order-history.cases.md`
43
+ - tests: `app/__tests__/e2e/OrderHistory/order-history.spec.ts` (or additional `*.spec.ts` in that folder if needed).
44
+ - **Structure**:
45
+ - Use `test.describe` to group by top-level plan sections (feature / user flow).
46
+ - Use `test(...)` titles that match scenario names from the plan.
47
+ - Prefer Page Object and fluent interfaces that already exist in this project, for example:
48
+ - `app/__tests__/e2e/OrderHistory/OrderHistoryPage.ts`
49
+ - shared helpers under `app/__tests__/e2e/_shared/`.
50
+ - **Seed**:
51
+ - If a seed test is needed, use `app/__tests__/e2e/seed.spec.ts` as the reference for environment setup.
52
+
53
+ Do **not** generate Playwright tests into a separate `tests/` folder by default. Keep all e2e tests under `app/__tests__/e2e/**` to respect project conventions.
54
+
55
+ ## Healer (fixing tests)
56
+
57
+ When acting as a **Healer** (or working with the Playwright healer agent):
58
+
59
+ - Operate only on `*.spec.ts` files under `app/__tests__/e2e/**`.
60
+ - Use `*.cases.md` in the same folder as **documentation of the intended behavior**:
61
+ - Do not weaken or change business assertions in tests in a way that conflicts with the corresponding `*.cases.md`.
62
+ - Prefer updating locators, waits, and flow details to match the UI while keeping the scenario semantics intact.
63
+ - When multiple specs are involved, prioritize:
64
+ - the spec file in the same folder as the failing test,
65
+ - then shared utilities in `app/__tests__/e2e/_shared/`.
66
+
67
+ Healer should keep tests aligned with the existing test plans (`*.cases.md`) and with the page objects and helpers already used in the project.
68
+
69
+ См. также агенты в `.claude/agents/` пресета и **`testing/tests-e2e-structure.md`**.
@@ -0,0 +1,52 @@
1
+ ---
2
+ paths:
3
+ - app/__tests__/e2e/**
4
+ ---
5
+
6
+ # Структура e2e в проекте
7
+
8
+ - Папка e2e: `app/__tests__/e2e/**`.
9
+ - Планы сценариев:
10
+ - `*.cases.md` файлы — **канонический источник сценариев**.
11
+ - Тесты:
12
+ - `*.spec.ts` файлы — реализация сценариев на Playwright.
13
+ - Общие утилиты и абстракции:
14
+ - `app/__tests__/e2e/_shared/**` — константы, fluent‑интерфейсы, хелперы.
15
+
16
+ # Принципы
17
+
18
+ - Каждый сценарий из `*.cases.md` должен иметь соответствующий тест (или набор тестов).
19
+ - **Нельзя** ослаблять проверки в тестах, если это противоречит бизнес‑ожиданиям из планов.
20
+ - Предпочтительно использовать:
21
+ - page‑objects (например, `OrderHistoryPage.ts`);
22
+ - общие хелперы из `_shared`.
23
+
24
+ # Именование e2e‑тестов
25
+
26
+ - Язык:
27
+ - все названия `test` / `it`, `describe`‑блоков и шагов в `*.cases.md` должны быть сформулированы **на русском языке**, описывая поведение и ожидаемый результат.
28
+ - Формат заголовков e2e‑тестов (`test(...)` / `it(...)`):
29
+ - перед текстовым описанием сценария указывается **префикс с номером** в формате: `ПРЕФИКС-XXX Описание сценария`.
30
+ - `ПРЕФИКС` — аббревиатура из **первых букв слов** тестируемой сущности, записанная **латиницей в верхнем регистре**.
31
+ - пример: `OrderHistory` → `OH`, `BillingReport` → `BR`.
32
+ - `XXX` — порядковый номер теста **с тремя разрядами и лидирующими нулями**: `001`, `002`, `010`, `123` и т.д.
33
+ - пример полного названия e2e‑теста:
34
+ - `test('OH-001 Отображается список заказов', async ({ page }) => { ... })`
35
+ - внутри одной сущности (`ПРЕФИКС`) номера тестов должны образовывать **непротиворечивую последовательность**, без дубликатов номеров.
36
+
37
+ # data-testid для e2e
38
+
39
+ - **Приоритет селекторов:** `data-testid` для стабильных элементов; `getByRole` и `getByLabel` для форм и доступных элементов.
40
+ - **Именование:** схема `{parent}__{element}` (например, `history-page__title`, `history-page__recognition-banner__attach-files-button`).
41
+ - **Где добавлять:** на корневые контейнеры страниц и ключевые интерактивные элементы (кнопки, ссылки, поля), к которым обращаются page objects.
42
+ - **При изменении UI:** обновлять data-testid в компонентах и соответствующие селекторы в page objects; сверять с `*.cases.md`.
43
+
44
+ # Требование к агенту
45
+
46
+ При добавлении/изменении e2e‑тестов:
47
+
48
+ - Сначала смотреть соответствующий `*.cases.md` и синхронизировать названия сценариев.
49
+ - Размещать спеки рядом с планами в той же директории.
50
+ - Переиспользовать общие page‑objects и хелперы, а не копировать селекторы напрямую в каждый тест.
51
+
52
+ См. также **`testing/playwright-agents.md`** для planner/generator/healer.
@@ -0,0 +1,66 @@
1
+ ---
2
+ paths:
3
+ - app/src/**/*.spec.ts
4
+ - app/src/**/*.spec.tsx
5
+ - app/src/**/*.test.ts
6
+ - app/src/**/*.test.tsx
7
+ ---
8
+
9
+ # Общие правила тестирования
10
+
11
+ - **Имена файлов:** для **новых** тестов использовать суффикс **`*.spec.ts` / `*.spec.tsx`**. Существующие **`*.test.ts` / `*.test.tsx`** не переименовывать без отдельной задачи (легаси).
12
+ - **Runner и матчеры** — как в проекте (часто Jest или Vitest); для компонентов — **@testing-library/react**.
13
+ - Основная цель тестов:
14
+ - проверять **поведение и бизнес‑правила**, а не реализацию или внутренние детали.
15
+ - **Именование unit‑тестов** (строки в `describe` / `it` / `test`):
16
+ - формулировки **только на русском языке** — понятные бизнес‑фразы (что проверяется и какой ожидается результат);
17
+ - **каждое предложение** в названии **начинается с заглавной буквы** (в том числе после `.`, `!`, `?` и при нескольких предложениях в одной строке); первая буква всей строки — тоже заглавная.
18
+ - **Проверка в CI:** ESLint (`jest/valid-title` в `app/eslint.config.mjs`) требует, чтобы строка начиналась с русской заглавной (А–Я, Ё), и запрещает пробел после точки, за которым сразу идёт строчная буква (типичный случай нарушения «с заглавной после точки»).
19
+
20
+ ```typescript
21
+ // ✅ Хорошо
22
+ it('Возвращает пустой список. Пользователь не авторизован', () => {})
23
+ it('При ошибке сети показывается сообщение об ошибке', () => {})
24
+
25
+ // ❌ Плохо (не с заглавной после точки; или не русский)
26
+ it('Возвращает пустой список. пользователь не авторизован', () => {})
27
+ it('Returns empty list when user is guest', () => {})
28
+ ```
29
+
30
+ # Тесты компонентов
31
+
32
+ - Использовать `render` из `@testing-library/react`.
33
+ - Ассерты:
34
+ - матчеры DOM для Testing Library, как подключены в проекте (`toBeInTheDocument`, `toHaveTextContent` и т.п.).
35
+ - Взаимодействия:
36
+ - `userEvent` из `@testing-library/user-event`.
37
+
38
+ # Изоляция и моки
39
+
40
+ - Для работы с API/store:
41
+ - мокать store (через test‑store) или использовать принятый в проекте способ моков HTTP/API.
42
+ - Не мокать то, что является частью публичного контракта фичи, если это ломает смысл теста.
43
+
44
+ # HTTP‑клиент
45
+
46
+ - При изменении **реализации общего HTTP‑клиента** (разбор тел, заголовки, ветки ошибок, 401/refresh, `FormData`, `blob` и т.п.) — **обновить или добавить behavior‑тесты** рядом с модулем клиента в `app/src/lib/clients/**` (предпочтительно `*.spec.ts`; легаси `*.test.ts` — не трогать без задачи).
47
+ - Проверять смысловые ветки: успешный JSON, HTTP‑ошибка, сеть, релевантные для проекта сценарии авторизации.
48
+
49
+ # Мапперы и преобразование данных
50
+
51
+ - Функции маппинга данных (DTO → доменная модель и обратно), особенно содержащие вычисляемые поля и ветвления, должны быть покрыты unit‑тестами.
52
+ - В тестах мапперов особое внимание уделять edge‑кейсам и регрессии бизнес‑правил (например, граничные значения, отсутствие полей, неожиданные комбинации значений).
53
+
54
+ # Требование к агенту
55
+
56
+ При добавлении тестов:
57
+
58
+ - Следовать существующей структуре и паттернам тестов в репозитории: файл `*.spec.ts(x)` рядом с модулем или в общем каталоге тестов — как в соседних фичах.
59
+ - Добавлять тесты для критичных веток логики и edge‑кейсов.
60
+ - При работе с данными:
61
+ - использовать **типы респонса** из API (DTO‑типы), а также **целевые доменные типы** из `@/types`, не дублировать интерфейсы в тестах;
62
+ - по возможности опираться на данные и обработчики из `app/src/mocks/**` (или аналог в репо), а не плодить случайные тестовые данные «с нуля».
63
+ - Размещение:
64
+ - для **компонентов UI** — **не создавать** поддиректорию `__tests__` внутри папки компонента; тест — соседний `*.spec.tsx`.
65
+ - в **других модулях** (например `api/services`) допустима уже существующая схема с `__tests__` — не ломать ради единообразия с UI.
66
+ - **новые** файлы — `*.spec.ts` / `*.spec.tsx` (см. блок «Имена файлов» выше).
@@ -1,3 +1,14 @@
1
1
  # Tooling and review
2
2
 
3
- Рефакторинг, качество кода, процесс ревью MR.
3
+ Lint, package manager, качество кода, code review MR.
4
+
5
+ | Файл | Содержание |
6
+ |------|------------|
7
+ | `package-manager.md` | yarn / pnpm / npm / bun — определить по lockfile |
8
+ | `post-change-lint.md` | Обязательный `lint:js` + `lint:css` после изменений |
9
+ | `code-quality.md` | Boy scout rule, рефакторинг, ESLint |
10
+ | `code-review-mr.md` | Чеклист ревью merge request |
11
+
12
+ Все — **session start**.
13
+
14
+ On-demand: **`commands/technical-retro.md`** (фасилитация ретро, не грузится как rule).
@@ -0,0 +1,9 @@
1
+ # Agent team intake
2
+
3
+ When the user message looks like a **work request** (implement, add, fix, refactor, review MR, write tests, spike) — not a question about how code works:
4
+
5
+ 1. Prefer **`/task <their request>`** or invoke **task-router** first.
6
+ 2. Do not jump straight to coding without router + pipeline when scope is non-trivial.
7
+ 3. Pure questions («как работает X», «объясни») — answer normally, no `/task`.
8
+
9
+ Exceptions: user explicitly says «без pipeline», «просто сделай», or continues an active slug.
@@ -0,0 +1,97 @@
1
+ # Agent team orchestrator
2
+
3
+ Parent agent = **manager**. Router plans; specialists execute. Artifacts: `.claude/team/tasks/<slug>/`.
4
+
5
+ ## Entry points
6
+
7
+ | Command | When |
8
+ |---------|------|
9
+ | **`/task <desc>`** | **Preferred** — router → dynamic pipeline → first agent |
10
+ | `/task-continue <slug>` | After human gate or pause |
11
+ | `/feature-start <desc>` | Legacy: analyst-only start (no router) |
12
+ | `/feature-continue <slug>` | Alias of task-continue |
13
+ | `/technical-retro [slug]` | Retro with agent team block |
14
+
15
+ ## Roles
16
+
17
+ | Agent | May edit production code | Typical intent |
18
+ |-------|--------------------------|----------------|
19
+ | `task-router` | no | Every `/task` — writes `pipeline.json` |
20
+ | `task-analyst` | no | feature, refactor, test-only |
21
+ | `solution-architect` | no | spike, complex cross-layer feature |
22
+ | `debugger` | yes, minimal fixes only | bugfix |
23
+ | `feature-developer` | yes | feature, bugfix, refactor |
24
+ | `code-reviewer` | no | most pipelines, review-only |
25
+ | `qa-tester` | tests only | feature, bugfix, test-only |
26
+
27
+ Full prompts: `.claude/agents/*.md`. Artifact conventions: `.claude/team/README.md`.
28
+
29
+ ## Dynamic pipeline
30
+
31
+ ```mermaid
32
+ flowchart TD
33
+ task["/task prompt"]
34
+ router["task-router"]
35
+ pipeline["pipeline.json"]
36
+ step0["steps 0..N"]
37
+ gate{"humanGates?"}
38
+ hook["subagentStop hook"]
39
+ retro["/technical-retro"]
40
+
41
+ task --> router
42
+ router --> pipeline
43
+ pipeline --> step0
44
+ step0 --> gate
45
+ gate -->|"/task-continue"| step0
46
+ step0 --> hook
47
+ hook --> step0
48
+ step0 --> retro
49
+ ```
50
+
51
+ **Source of truth for order:** `pipeline.json` → `steps[]`. Never hardcode analyst → dev → review → QA when `pipeline.json` exists.
52
+
53
+ ## status.json (pipeline mode)
54
+
55
+ ```json
56
+ {
57
+ "slug": "...",
58
+ "intent": "feature",
59
+ "pipelineIndex": 0,
60
+ "currentAgent": "task-analyst",
61
+ "phase": "executing",
62
+ "state": "in_progress",
63
+ "awaitingHumanGate": false
64
+ }
65
+ ```
66
+
67
+ | state | Meaning |
68
+ |-------|---------|
69
+ | `in_progress` | Current step running |
70
+ | `completed` | Current step done; hook or orchestrator advances |
71
+ | `awaiting_approval` | Human gate; wait for `/task-continue` |
72
+ | `changes_requested` | Reviewer blocked; re-run developer |
73
+
74
+ ## Rules (strict)
75
+
76
+ 1. **`/task` always starts with task-router** (except user says "skip router" with documented pipeline).
77
+ 2. Read `pipeline.json` before every subagent invocation.
78
+ 3. One role per subagent call.
79
+ 4. **Never** skip `humanGates` without `/task-continue` or explicit user approval.
80
+ 5. Persist handoffs to disk (`brief.md`, `decomposition.md`, `debug-report.md`, `architecture.md`, `review.md`).
81
+ 6. On `changes_requested`: re-invoke `feature-developer`, then `code-reviewer` — do not advance `pipelineIndex` until review passes.
82
+ 7. When all steps complete, suggest `/technical-retro <slug>`.
83
+ 8. If `autoChain: false` in pipeline, do not rely on hook — manual step only.
84
+
85
+ ## Invoking agents
86
+
87
+ Use the available Claude Code subagent mechanism. Pass: slug, artifact paths, step `scope` if set.
88
+
89
+ After each agent completes, ensure `status.json` has `state: completed` (or `awaiting_approval` if gate applies).
90
+
91
+ ## Legacy mode
92
+
93
+ If `pipeline.json` is missing (old `/feature-start` tasks), fall back to fixed phases: analysis → development → review → testing.
94
+
95
+ ## Auto-detection (optional)
96
+
97
+ When user describes a **task** (not a question "how does X work"), suggest `/task <their message>` or run router proactively if they agree.
@@ -0,0 +1,50 @@
1
+ # Поддержка и улучшение качества кода
2
+
3
+ ## Поддержка существующего стиля
4
+
5
+ - Новые изменения должны:
6
+ - следовать существующим паттернам (имена, структура, типизация);
7
+ - минимизировать «стилистический шум» (лишние правки форматирования, rename без нужды).
8
+ - Перед добавлением нового решения:
9
+ - искать аналогичное в коде и **повторять подход**, а не изобретать новый;
10
+ - проверять, нет ли уже подходящего компонента или паттерна в существующем UI‑коде и пакетах проекта, прежде чем добавлять новый кастомный контрол;
11
+ - использовать при обращении к чужим модулям только их **public API** (index/barrel‑файлы и явно экспортируемые сущности), а deep‑импорты внутренних файлов рассматривать как повод для рефакторинга.
12
+
13
+ ## Рефакторинг при изменениях
14
+
15
+ - Разрешён лёгкий refactor, если он:
16
+ - уменьшает дублирование;
17
+ - повышает читаемость;
18
+ - не ломает публичные контракты модулей.
19
+ - Примеры допустимых улучшений:
20
+ - вынести дублирующуюся логику в общий хук/утилиту;
21
+ - типизировать `any` и `unknown`, если это безболезненно;
22
+ - разделить слишком крупный компонент на несколько более простых;
23
+ - заменить локальные «магические» CSS‑значения (цвета, отступы, размеры) на токены/примитивы дизайна проекта;
24
+ - заменить deep‑импорты внутренних файлов других модулей на обращения к их public API.
25
+
26
+ ## Ограничения
27
+
28
+ - Не выполнять «большой» рефакторинг, если задача точечная и не про архитектуру:
29
+ - не менять структуру директорий;
30
+ - не менять названия публичных типов/функций без явного запроса.
31
+ - При необходимости крупного изменения:
32
+ - сначала локально улучшить архитектуру минимальными шагами;
33
+ - оставить код в консистентном состоянии.
34
+
35
+ ## ESLint, Stylelint и плагины
36
+
37
+ - Учитывать **все активные правила ESLint** и **подключённые плагины** проекта (конфиг: `app/eslint.config.mjs`, базовые пресеты в т.ч. `@sh/eslint-config-react`, `@sh/eslint-config-boundaries` и локальные overrides).
38
+ - Учитывать **Stylelint** для CSS и CSS-in-JS (конфиг: `app/.stylelintrc`; порядок свойств — `ui-and-accessibility/css-property-order.md`).
39
+ - Новый или изменённый код не должен нарушать эти правила.
40
+ - После **каждого** изменения кода агент **обязан** выполнить **`tooling-and-review/post-change-lint.md`**: полный прогон **`lint:js`** и **`lint:css`**, анализ вывода, исправление срабатываний в зоне задачи.
41
+ - Отключение правила (`eslint-disable`) — только **точечно** (строка/небольшой блок) и с **кратким комментарием**, зачем это нужно; отключать «на весь файл» без веской причины не следует.
42
+
43
+ ## Требование к агенту
44
+
45
+ При каждом изменении:
46
+
47
+ - Поддерживать принцип **«boy scout rule»**:
48
+ - оставлять модуль в немного лучшем состоянии, чем до изменения (простые, безопасные улучшения).
49
+ - Не жертвовать архитектурой и слоями ради краткости реализации.
50
+ - **Не завершать задачу**, пока не пройдены обязательные линтеры (`tooling-and-review/post-change-lint.md`).
@@ -0,0 +1,67 @@
1
+ # Code review merge requests
2
+
3
+ ## Когда применять
4
+
5
+ - Пользователь просит: «проведи ревью», «оценить MR/ветку/дифф», «посмотри изменения».
6
+ - Опираться на локальный репозиторий: текущую ветку, `git diff` и открытые файлы, а не на данные внешнего API хостинга.
7
+
8
+ ## Что обязан проверить агент
9
+
10
+ ### Архитектура и слои
11
+
12
+ Соблюдение `architecture/architecture-boundaries.md`, `stack/next-app-core.md` и при сетевых изменениях — `api-and-data/http-client.md`:
13
+
14
+ - UI (`app/src/ui/**`) не ходит напрямую в HTTP‑клиент и не знает DTO.
15
+ - Store (`app/src/store/**`) не зависит от UI; границы транспортных типов и ошибок — `api-and-data/store-rtk.md` / `api-and-data/http-client.md`.
16
+ - API (`app/src/api/**`) не тянет UI/store, использует мапперы; без прямого `fetch` в сервисах (кроме оговорённых исключений).
17
+
18
+ ### Импорты и организация кода
19
+
20
+ - Использование алиаса `@/...` вместо относительных импортов выше по дереву.
21
+ - Отсутствие deep‑импортов во внешние фичи; только public API; в файлах вне `app/src/api/**` импорты из API — только `from '@/api'` (`architecture/api-public-imports.md`, дублирует ESLint).
22
+ - При новых/изменённых модулях в регламентированных слоях — реэкспорт публичных символов в корневой barrel по **`architecture/layer-barrel-exports.md`**.
23
+ - Размещение новых файлов в корректных слоях и директориях фич.
24
+
25
+ ### Типы и TS‑строгость
26
+
27
+ - Не допускать новых `any`; предпочитать доменные типы из `@/types` (barrel, см. `architecture/types-public-imports.md`).
28
+ - Проверять корректность пропсов/возвращаемых типов, особенно в UI и API‑слое.
29
+
30
+ ### UI и стили
31
+
32
+ Для компонентов и стилей сверяться с `ui-and-accessibility/react-ui.md` и `stack/next-app-core.md`:
33
+
34
+ - Соблюдать принятый способ стилей и общие UI‑примитивы/токены, а не «магические» значения.
35
+ - Сохранять консистентность с существующими компонентами и паттернами.
36
+
37
+ ### Тесты
38
+
39
+ - Для нетривиальных изменений:
40
+ - либо обновлены/добавлены unit‑тесты (`testing/tests-unit.md`),
41
+ - либо e2e‑сценарии/спеки отражают новую логику (`testing/playwright-agents.md`, `testing/tests-e2e-structure.md`).
42
+ - При правках **общего HTTP‑клиента** — наличие/актуальность **behavior‑тестов клиента** (`api-and-data/http-client.md`, `testing/tests-unit.md`).
43
+ - **Указывать, какие именно тесты** стоит добавить или поправить.
44
+
45
+ ### Линтеры (обязательно)
46
+
47
+ **`tooling-and-review/post-change-lint.md`**:
48
+
49
+ - Перед финализацией отчёта по ревью и после любых правок по итогам ревью: полный прогон **`lint:js`** и **`lint:css`** из `app/`.
50
+ - В отчёт включить **все сообщения ESLint и Stylelint (errors и warnings)** по файлам из диффа MR/ветки; запуск — по всему проекту, **фильтрация вывода — к путям из `git diff`**.
51
+ - Не считать ревью/правки завершёнными, пока линтеры не проходят или не зафиксирован блокер в ответе.
52
+ - Полная валидация как в CI: **`lint`** (= `lint:js` + `lint:css` + `type-check`) — уместна перед итогом крупного MR.
53
+
54
+ ## Глубина и формат ревью
55
+
56
+ - Фокус на **изменениях MR** (дифф относительно целевой ветки), а не на всём проекте.
57
+ - Сначала **высокоуровневый обзор** (что делает MR, риски, архитектурные замечания), затем список конкретных комментариев.
58
+ - Каждый комментарий:
59
+ - **конкретный** (файл/участок и проблема),
60
+ - **практичный** (вариант исправления по существующим паттернам),
61
+ - без «больших рефакторингов» в духе `tooling-and-review/code-quality.md`, если задача локальная.
62
+
63
+ ## Ограничения для агента
64
+
65
+ - Не придумывать несуществующие метаданные из хостинга (лейблы MR, авторов, статусы CI), если их нет в локальных данных.
66
+ - Не менять общую архитектуру фичи без прямого запроса пользователя.
67
+ - Следовать принципу «boy scout rule»: предлагать улучшения, которые реально можно внести в рамках MR.
@@ -0,0 +1,20 @@
1
+ # Менеджер пакетов (терминал)
2
+
3
+ Перед **`npm install` / `yarn` / `pnpm` / `bun`** и любыми **`… run …`** (lint, test, dev, build) **сначала определи**, какой менеджер закреплён в этом репозитории, и **используй только его**.
4
+
5
+ ## Как определить (по убыванию надёжности)
6
+
7
+ 1. Поле **`packageManager`** в `package.json` (корень монорепо или `app/package.json`) — `yarn@…`, `pnpm@…`, `npm@…`, `bun@…`.
8
+ 2. **Lockfile** рядом с тем `package.json`:
9
+ - `yarn.lock` → **yarn**
10
+ - `pnpm-lock.yaml` → **pnpm**
11
+ - `package-lock.json` → **npm**
12
+ - `bun.lock` / `bun.lockb` → **bun**
13
+ 3. Если неоднозначно — где лежат **`node_modules`** и какой lockfile обновляют в CI.
14
+
15
+ ## Как запускать
16
+
17
+ - Рабочий каталог — там, где **`package.json`** с нужными **scripts** (в этом репозитории — **`app/`**).
18
+ - Примеры: `yarn lint`, `pnpm run test` — **в соответствии с обнаруженным менеджером**.
19
+
20
+ Если менеджер неочевиден — **посмотри файлы** инструментами чтения, **не угадывай**.
@@ -0,0 +1,43 @@
1
+ # Линтеры после изменений кода
2
+
3
+ ## Когда применять
4
+
5
+ После **любого** изменения исходников в репозитории: правка, создание или удаление файлов в `app/**` (TS/TSX/JS/MJS, CSS, styled/Linaria в `.ts`/`.tsx`, markdown с ESLint и т.д.).
6
+
7
+ Исключения без прогона линтеров: только правки **документации вне `app/`**, конфигов CI, `.claude/rules/**`, если **не** менялся исполняемый код приложения.
8
+
9
+ ## Обязательные команды
10
+
11
+ Рабочий каталог — **`app/`** (там `package.json` со скриптами). Менеджер пакетов — **`tooling-and-review/package-manager.md`**.
12
+
13
+ 1. **`lint:js`** — полный ESLint по проекту (`eslint .` с расширениями из скрипта).
14
+ 2. **`lint:css`** — полный Stylelint (`**/*.{css,ts}`).
15
+
16
+ **Всегда запускать обе команды**, даже если задача не касалась стилей: Stylelint проверяет и CSS-in-JS в `.ts`.
17
+
18
+ Точечный ESLint/Stylelint только на один файл **не заменяет** полный прогон перед завершением задачи.
19
+
20
+ ## Алгоритм для агента
21
+
22
+ 1. Завершить правки кода.
23
+ 2. Запустить **`lint:js`** и **`lint:css`** из `app/` (через терминал, не «на глаз»).
24
+ 3. **Проанализировать весь вывод**: errors и warnings.
25
+ 4. **Исправить** все срабатывания в **изменённых файлах** и связанных с задачей; для Stylelint сначала пробовать **`lint:css --fix`**, если правило автоисправимо.
26
+ 5. При ненулевом exit code — повторить шаги 2–4 до успешного прогона или явного блокера.
27
+ 6. **Не считать задачу выполненной**, пока оба линтера не завершились с кодом 0 **или** в ответе пользователю не зафиксирован блокер (например, легаси вне скоупа) с перечислением оставшихся замечаний.
28
+
29
+ ## Что исправлять
30
+
31
+ - **Errors** — обязательно.
32
+ - **Warnings** — обязательно в файлах из текущей задачи; вне скоупа — не чинить «заодно», но **упомянуть** в ответе, если мешают нулевому exit code.
33
+ - **`eslint-disable`** — только точечно, с кратким комментарием «зачем» (`tooling-and-review/code-quality.md`).
34
+
35
+ ## Связанные проверки
36
+
37
+ - **`type-check`** — обязателен при изменениях TypeScript (`stack/next-app-core.md`); не подменяет ESLint/Stylelint.
38
+ - Полная валидация как в CI: **`lint`** (= `lint:js` + `lint:css` + `type-check`) — уместна перед крупным MR.
39
+
40
+ ## Конфиги
41
+
42
+ - ESLint: `app/eslint.config.mjs`
43
+ - Stylelint: `app/.stylelintrc` (порядок свойств — `ui-and-accessibility/css-property-order.md`)
@@ -1,3 +1,10 @@
1
1
  # UI and accessibility
2
2
 
3
- Компоненты, стили, доступность, паттерны React UI.
3
+ Компоненты, стили, пропсы.
4
+
5
+ | Файл | Содержание | Загрузка |
6
+ |------|------------|----------|
7
+ | `no-props-spread.md` | Явные пропсы, без `{...props}` | session start |
8
+ | `component-styles.md` | Колокация стилей, `Root` | session start |
9
+ | `css-property-order.md` | Порядок CSS (Stylelint idiomatic-order) | session start |
10
+ | `react-ui.md` | Структура компонентов, `.data.ts`, хуки | `paths: app/src/ui/**` |
@@ -0,0 +1,50 @@
1
+ # Стили только рядом с компонентом
2
+
3
+ ## Имя корневого styled-элемента: `Root`
4
+
5
+ - **Корневой** styled-элемент — **`Root`**.
6
+ - В разметке: `<s.Root>...</s.Root>` при `import * as s from './styles'`.
7
+ - Вложенные — `Title`, `List`, `Item` и т.д.
8
+ - Единственная внешняя styled-обёртка всего JSX — **`Root`**, не `Container` / `Wrapper`.
9
+
10
+ ```tsx
11
+ // ✅ Хорошо
12
+ export const Root = styled.div` ... `
13
+ // в компоненте: <s.Root>...</s.Root>
14
+
15
+ // ❌ Плохо для единственной обёртки
16
+ export const Service = styled.div` ... `
17
+ ```
18
+
19
+ ## Правило
20
+
21
+ **Запрещено** импортировать модули стилей **другого** UI-компонента или блока.
22
+
23
+ Под «модулями стилей»:
24
+
25
+ - `styles.ts` / `styles.tsx` рядом с компонентом;
26
+ - `*.module.css`, `*.module.scss`;
27
+ - файлы, экспортирующие styled-примитивы одного компонента.
28
+
29
+ ## Разрешено
30
+
31
+ - `import * as s from './styles'` — в той же папке.
32
+ - Общие примитивы дизайн-системы, токены, `@/ui/components/...`.
33
+ - Повторное использование визуала через **сам компонент**, не через его `styles`.
34
+
35
+ ## Примеры
36
+
37
+ ```tsx
38
+ // ✅ Хорошо
39
+ import * as s from './styles'
40
+
41
+ // ❌ Плохо
42
+ import * as s from '../../styles'
43
+ import * as s from '../RequestForAnalysisServices/styles'
44
+ ```
45
+
46
+ ## Почему
47
+
48
+ - **`Root`** — быстрая ориентация в разметке.
49
+ - Стили и компонент меняются вместе.
50
+ - Проще рефакторинг.
@@ -0,0 +1,20 @@
1
+ # Порядок CSS-свойств (как в Stylelint)
2
+
3
+ Действует для **любого** CSS в репозитории: `.css`, стилевые блоки в `styles.ts` / `styles.tsx`, `styled` / Linaria и другой CSS-in-JS в `.ts` / `.tsx`, если этот код попадает под `lint:css`.
4
+
5
+ Источник: `app/.stylelintrc` → `@sh/stylelint-config-react` → пакет **`stylelint-config-idiomatic-order`** (правило `order/properties-order`). Свойства, не попавшие в список, идут **в конце блока в алфавитном порядке** (`unspecified: bottomAlphabetical`).
6
+
7
+ Пиши объявления в **одном** блоке в такой последовательности групп:
8
+
9
+ 1. **`composes`** — только для CSS Modules (если есть).
10
+ 2. **`all`**
11
+ 3. **Позиционирование:** `position`, `z-index`, затем `top`, `right`, `bottom`, `left`.
12
+ 4. **Отображение и раскладка:** `display`, `overflow`.
13
+ 5. **Размеры:** `width`, `min-width`, `max-width`, `height`, `min-height`, `max-height`, `box-sizing`.
14
+ 6. **Flex:** `flex`, `flex-basis`, `flex-direction`, `flex-flow`, `flex-grow`, `flex-shrink`, `flex-wrap`, `align-content`, `align-items`, `align-self`, `justify-content`, `order`.
15
+ 7. **Внутренние отступы:** `padding-top`, `padding-right`, `padding-bottom`, `padding-left`.
16
+ 8. **Рамка:** общие `border`, `border-width`, `border-style`, `border-color`, `border-radius`; затем для сторон **сверху по часовой** — `border-top` и его `-width`, `-style`, `-color`, `-radius`, то же для `right`, `bottom`, `left`.
17
+ 9. **Внешние отступы:** `margin-top`, `margin-right`, `margin-bottom`, `margin-left`.
18
+ 10. **Остальные свойства** — после перечисленных, **по алфавиту** (типографика, фон, анимации, `cursor`, и т.д.).
19
+
20
+ Автоисправление из каталога `app`: `lint:css --fix` (проверяет `**/*.{css,ts}`; менеджер пакетов — `tooling-and-review/package-manager.md`).
@@ -0,0 +1,52 @@
1
+ # Не использовать спред пропов при передаче в компоненты
2
+
3
+ При вызове **пользовательских** React-компонентов (имя с заглавной буквы) **передавать пропы явно**, а не через spread (`{...props}`, `{...obj}`).
4
+
5
+ **Агентам и при ревью:** не «упрощать» JSX через объект с spread. Длинное ветвление — два явных JSX-блока или отдельные компоненты.
6
+
7
+ ## Почему
8
+
9
+ - Явная передача делает зависимости очевидными.
10
+ - Упрощает рефакторинг и поиск использований.
11
+ - Снижает риск лишних пропов.
12
+
13
+ ## Проверка в репозитории
14
+
15
+ - Для `app/src/ui/**/*.tsx` — ESLint `react/jsx-props-no-spreading` (`app/eslint.config.mjs`).
16
+ - Исключение — `eslint-disable-next-line` с комментарием «почему».
17
+
18
+ ## Примеры
19
+
20
+ ```tsx
21
+ // ❌ Плохо
22
+ const commonProps = { a, b, c }
23
+ return <Child {...commonProps} />
24
+
25
+ // ❌ Плохо
26
+ return <Child {...props} />
27
+
28
+ // ✅ Хорошо
29
+ return (
30
+ <Child
31
+ a={a}
32
+ b={b}
33
+ c={c}
34
+ />
35
+ )
36
+
37
+ // ✅ Хорошо — явные пропсы по веткам
38
+ return cond ? (
39
+ <IconBox name={name} size="m" variant="warning" />
40
+ ) : (
41
+ <IconBox
42
+ customColors={styles.IconBoxAccent.customColors}
43
+ name={name}
44
+ size="m"
45
+ />
46
+ )
47
+ ```
48
+
49
+ ## Исключения
50
+
51
+ - **Нативный** DOM (`<div {...rest} />`) — если `rest` только HTML-атрибуты.
52
+ - Обёртки — если явно документировано; при необходимости ESLint-disable.