@bonesofspring/ai-rules 0.2.0 → 0.2.2
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 +10 -18
- package/bin/cli.js +73 -258
- package/package.json +3 -4
- package/presets/claude/ios-swift/CLAUDE.md +27 -0
- package/presets/claude/ios-swift/README.md +29 -0
- package/presets/claude/ios-swift/commands/README.md +3 -0
- package/presets/claude/ios-swift/rules/README.md +44 -0
- package/presets/claude/ios-swift/rules/api-and-data/README.md +9 -0
- package/presets/claude/ios-swift/rules/api-and-data/networking.md +49 -0
- package/presets/claude/ios-swift/rules/architecture/README.md +10 -0
- package/presets/claude/ios-swift/rules/architecture/boundaries.md +33 -0
- package/presets/claude/ios-swift/rules/architecture/feature-delivery.md +60 -0
- package/presets/claude/ios-swift/rules/stack/README.md +10 -0
- package/presets/claude/ios-swift/rules/stack/ios-app-core.md +42 -0
- package/presets/claude/ios-swift/rules/stack/swift-conventions.md +51 -0
- package/presets/claude/ios-swift/rules/testing/README.md +10 -0
- package/presets/claude/ios-swift/rules/testing/ui.md +41 -0
- package/presets/claude/ios-swift/rules/testing/unit.md +41 -0
- package/presets/claude/ios-swift/rules/tooling-and-review/README.md +11 -0
- package/presets/claude/ios-swift/rules/tooling-and-review/code-quality.md +38 -0
- package/presets/claude/ios-swift/rules/tooling-and-review/code-review.md +41 -0
- package/presets/claude/ios-swift/rules/tooling-and-review/post-change-build.md +31 -0
- package/presets/claude/ios-swift/rules/ui-and-accessibility/README.md +10 -0
- package/presets/claude/ios-swift/rules/ui-and-accessibility/swiftui.md +61 -0
- package/presets/claude/ios-swift/rules/ui-and-accessibility/viewmodels.md +43 -0
- package/presets/claude/next/CLAUDE.md +5 -29
- package/presets/claude/next/README.md +0 -10
- package/presets/claude/next/agents/README.md +0 -125
- package/presets/claude/next/commands/README.md +2 -10
- package/presets/claude/next/hooks/README.md +2 -5
- package/presets/claude/next/rules/README.md +11 -25
- package/presets/claude/next/rules/api-and-data/README.md +1 -7
- package/presets/claude/next/rules/architecture/README.md +2 -9
- package/presets/claude/next/rules/stack/README.md +1 -9
- package/presets/claude/next/rules/testing/README.md +1 -9
- package/presets/claude/next/rules/tooling-and-review/README.md +1 -14
- package/presets/claude/next/rules/ui-and-accessibility/README.md +1 -8
- package/presets/claude/next/skills/README.md +1 -11
- package/presets/cursor/ios-swift/README.md +17 -0
- package/presets/cursor/ios-swift/commands/README.md +3 -0
- package/presets/cursor/ios-swift/rules/README.md +33 -0
- package/presets/cursor/ios-swift/rules/architecture-boundaries.mdc +34 -0
- package/presets/cursor/ios-swift/rules/code-quality-and-refactoring.mdc +39 -0
- package/presets/cursor/ios-swift/rules/code-review-mr.mdc +42 -0
- package/presets/cursor/ios-swift/rules/feature-delivery-workflow.mdc +61 -0
- package/presets/cursor/ios-swift/rules/ios-app-core.mdc +43 -0
- package/presets/cursor/ios-swift/rules/networking-services.mdc +49 -0
- package/presets/cursor/ios-swift/rules/post-change-build.mdc +32 -0
- package/presets/cursor/ios-swift/rules/state-and-viewmodels.mdc +43 -0
- package/presets/cursor/ios-swift/rules/swift-conventions.mdc +51 -0
- package/presets/cursor/ios-swift/rules/swiftui-ui.mdc +61 -0
- package/presets/cursor/ios-swift/rules/tests-ui.mdc +41 -0
- package/presets/cursor/ios-swift/rules/tests-unit.mdc +41 -0
- package/presets/cursor/next/commands/README.md +1 -49
- package/presets/cursor/next/rules/README.md +0 -47
- package/presets/cursor/next/rules/api-services.mdc +10 -12
- package/presets/cursor/next/rules/architecture-boundaries.mdc +12 -31
- package/presets/cursor/next/rules/code-quality-and-refactoring.mdc +4 -5
- package/presets/cursor/next/rules/code-review-mr.mdc +7 -14
- package/presets/cursor/next/rules/next-app-core.mdc +61 -18
- package/presets/cursor/next/rules/no-props-spread.mdc +4 -27
- package/presets/cursor/next/rules/playwright-agents.mdc +1 -2
- package/presets/cursor/next/rules/react-ui.mdc +3 -32
- package/presets/cursor/next/rules/store-rtk.mdc +6 -13
- package/presets/cursor/next/rules/tests-unit.mdc +10 -30
- package/CHANGELOG.md +0 -22
- package/presets/claude/next/agents/accessibility-reviewer.md +0 -65
- package/presets/claude/next/agents/api-contract-reviewer.md +0 -69
- package/presets/claude/next/agents/build-verifier.md +0 -64
- package/presets/claude/next/agents/ci-investigator.md +0 -62
- package/presets/claude/next/agents/code-reviewer.md +0 -62
- package/presets/claude/next/agents/debugger.md +0 -63
- package/presets/claude/next/agents/feature-developer.md +0 -27
- package/presets/claude/next/agents/migration-specialist.md +0 -69
- package/presets/claude/next/agents/performance-auditor.md +0 -68
- package/presets/claude/next/agents/qa-tester.md +0 -56
- package/presets/claude/next/agents/security-reviewer.md +0 -64
- package/presets/claude/next/agents/solution-architect.md +0 -70
- package/presets/claude/next/agents/task-analyst.md +0 -109
- package/presets/claude/next/agents/task-router.md +0 -70
- package/presets/claude/next/agents/tech-writer.md +0 -60
- package/presets/claude/next/agents/unit-test-generator.md +0 -37
- package/presets/claude/next/agents/unit-test-healer.md +0 -38
- package/presets/claude/next/agents/unit-test-planner.md +0 -62
- package/presets/claude/next/commands/feature-continue.md +0 -51
- package/presets/claude/next/commands/feature-start.md +0 -30
- package/presets/claude/next/commands/task-continue.md +0 -49
- package/presets/claude/next/commands/task.md +0 -50
- package/presets/claude/next/commands/technical-retro.md +0 -58
- package/presets/claude/next/hooks/chain-team-phases.sh +0 -342
- package/presets/claude/next/hooks/guard-shell-command.sh +0 -77
- package/presets/claude/next/rules/api-and-data/api-services.md +0 -57
- package/presets/claude/next/rules/api-and-data/http-client.md +0 -40
- package/presets/claude/next/rules/api-and-data/store-rtk.md +0 -65
- package/presets/claude/next/rules/architecture/api-public-imports.md +0 -8
- package/presets/claude/next/rules/architecture/architecture-boundaries.md +0 -72
- package/presets/claude/next/rules/architecture/feature-delivery-workflow.md +0 -79
- package/presets/claude/next/rules/architecture/layer-barrel-exports.md +0 -58
- package/presets/claude/next/rules/architecture/public-imports.md +0 -46
- package/presets/claude/next/rules/architecture/reference-features.md +0 -37
- package/presets/claude/next/rules/architecture/types-public-imports.md +0 -8
- package/presets/claude/next/rules/stack/arrow-functions.md +0 -45
- package/presets/claude/next/rules/stack/navigation-router.md +0 -61
- package/presets/claude/next/rules/stack/next-app-core.md +0 -33
- package/presets/claude/next/rules/stack/next-app-router.md +0 -36
- package/presets/claude/next/rules/stack/no-type-assertion.md +0 -59
- package/presets/claude/next/rules/stack/types-jsdoc.md +0 -37
- package/presets/claude/next/rules/testing/playwright-agents.md +0 -74
- package/presets/claude/next/rules/testing/tests-e2e-structure.md +0 -52
- package/presets/claude/next/rules/testing/tests-unit.md +0 -66
- package/presets/claude/next/rules/tooling-and-review/agent-team-intake.md +0 -15
- package/presets/claude/next/rules/tooling-and-review/agent-team-orchestrator.md +0 -134
- package/presets/claude/next/rules/tooling-and-review/code-quality.md +0 -42
- package/presets/claude/next/rules/tooling-and-review/code-review-mr.md +0 -67
- package/presets/claude/next/rules/tooling-and-review/package-manager.md +0 -11
- package/presets/claude/next/rules/tooling-and-review/post-change-lint.md +0 -33
- package/presets/claude/next/rules/ui-and-accessibility/component-styles.md +0 -56
- package/presets/claude/next/rules/ui-and-accessibility/css-property-order.md +0 -14
- package/presets/claude/next/rules/ui-and-accessibility/no-props-spread.md +0 -57
- package/presets/claude/next/rules/ui-and-accessibility/react-a11y-coding.md +0 -37
- package/presets/claude/next/rules/ui-and-accessibility/react-ui.md +0 -90
- package/presets/claude/next/skills/ci-investigation/SKILL.md +0 -36
- package/presets/claude/next/skills/code-review/SKILL.md +0 -26
- package/presets/claude/next/skills/debug-investigation/SKILL.md +0 -28
- package/presets/claude/next/skills/feature-delivery/SKILL.md +0 -15
- package/presets/claude/next/skills/playwright-e2e/SKILL.md +0 -31
- package/presets/claude/next/skills/technical-retro/SKILL.md +0 -40
- package/presets/claude/next/skills/unit-testing/SKILL.md +0 -32
- package/presets/claude/next/team/README.md +0 -46
- package/presets/claude/next/team/tasks/.gitkeep +0 -1
- package/presets/cursor/next/AGENTS.md +0 -43
- package/presets/cursor/next/BUGBOT.md +0 -14
- package/presets/cursor/next/agents/README.md +0 -158
- package/presets/cursor/next/agents/accessibility-reviewer.md +0 -67
- package/presets/cursor/next/agents/api-contract-reviewer.md +0 -71
- package/presets/cursor/next/agents/build-verifier.md +0 -66
- package/presets/cursor/next/agents/ci-investigator.md +0 -64
- package/presets/cursor/next/agents/code-reviewer.md +0 -64
- package/presets/cursor/next/agents/debugger.md +0 -64
- package/presets/cursor/next/agents/feature-developer.md +0 -27
- package/presets/cursor/next/agents/migration-specialist.md +0 -71
- package/presets/cursor/next/agents/performance-auditor.md +0 -70
- package/presets/cursor/next/agents/playwright-test-generator.md +0 -26
- package/presets/cursor/next/agents/playwright-test-healer.md +0 -26
- package/presets/cursor/next/agents/playwright-test-planner.md +0 -28
- package/presets/cursor/next/agents/qa-tester.md +0 -57
- package/presets/cursor/next/agents/security-reviewer.md +0 -66
- package/presets/cursor/next/agents/solution-architect.md +0 -71
- package/presets/cursor/next/agents/task-analyst.md +0 -112
- package/presets/cursor/next/agents/task-router.md +0 -71
- package/presets/cursor/next/agents/tech-writer.md +0 -62
- package/presets/cursor/next/agents/unit-test-generator.md +0 -39
- package/presets/cursor/next/agents/unit-test-healer.md +0 -40
- package/presets/cursor/next/agents/unit-test-planner.md +0 -64
- package/presets/cursor/next/commands/feature-continue.md +0 -19
- package/presets/cursor/next/commands/feature-start.md +0 -33
- package/presets/cursor/next/commands/task-continue.md +0 -49
- package/presets/cursor/next/commands/task.md +0 -50
- package/presets/cursor/next/commands/technical-retro.md +0 -81
- package/presets/cursor/next/hooks/README.md +0 -8
- package/presets/cursor/next/hooks/chain-team-phases.sh +0 -380
- package/presets/cursor/next/hooks/guard-shell-command.sh +0 -77
- package/presets/cursor/next/hooks.json +0 -17
- package/presets/cursor/next/rules/agent-team-intake.mdc +0 -14
- package/presets/cursor/next/rules/agent-team-orchestrator.mdc +0 -139
- package/presets/cursor/next/rules/api-public-imports.mdc +0 -8
- package/presets/cursor/next/rules/arrow-functions.mdc +0 -46
- package/presets/cursor/next/rules/css-property-order-stylelint.mdc +0 -16
- package/presets/cursor/next/rules/feature-delivery-workflow.mdc +0 -76
- package/presets/cursor/next/rules/http-client.mdc +0 -42
- package/presets/cursor/next/rules/layer-barrel-exports.mdc +0 -59
- package/presets/cursor/next/rules/navigation-router-stack.mdc +0 -62
- package/presets/cursor/next/rules/next-app-router.mdc +0 -36
- package/presets/cursor/next/rules/no-cross-component-styles-import.mdc +0 -58
- package/presets/cursor/next/rules/no-type-assertion-as-import-export.mdc +0 -60
- package/presets/cursor/next/rules/package-manager.mdc +0 -16
- package/presets/cursor/next/rules/post-change-lint.mdc +0 -38
- package/presets/cursor/next/rules/public-imports.mdc +0 -48
- package/presets/cursor/next/rules/react-a11y-coding.mdc +0 -37
- package/presets/cursor/next/rules/reference-features.mdc +0 -39
- package/presets/cursor/next/rules/technical-retro.mdc +0 -12
- package/presets/cursor/next/rules/types-jsdoc.mdc +0 -42
- package/presets/cursor/next/rules/types-public-imports.mdc +0 -8
- package/presets/cursor/next/skills/README.md +0 -15
- package/presets/cursor/next/skills/ci-investigation/SKILL.md +0 -36
- package/presets/cursor/next/skills/code-review/SKILL.md +0 -26
- package/presets/cursor/next/skills/debug-investigation/SKILL.md +0 -28
- package/presets/cursor/next/skills/feature-delivery/SKILL.md +0 -15
- package/presets/cursor/next/skills/playwright-e2e/SKILL.md +0 -31
- package/presets/cursor/next/skills/technical-retro/SKILL.md +0 -40
- package/presets/cursor/next/skills/unit-testing/SKILL.md +0 -32
- package/presets/cursor/next/team/README.md +0 -104
- package/presets/cursor/next/team/tasks/.gitkeep +0 -0
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
paths:
|
|
3
|
-
- app/__tests__/e2e/**
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Playwright Agents in this project
|
|
7
|
-
|
|
8
|
-
Playwright Agents (planner, generator, healer) **must follow the existing e2e structure**:
|
|
9
|
-
|
|
10
|
-
- **Test directory**: `app/__tests__/e2e`
|
|
11
|
-
- **Test plans (specs)**: `*.cases.md` files under `app/__tests__/e2e/**`
|
|
12
|
-
- **Executable tests**: `*.spec.ts` files under `app/__tests__/e2e/**`
|
|
13
|
-
- **Seed test**: `app/__tests__/e2e/seed.spec.ts`
|
|
14
|
-
|
|
15
|
-
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.
|
|
16
|
-
|
|
17
|
-
## Planner (test plans)
|
|
18
|
-
|
|
19
|
-
When acting as a **Planner** (or working with the Playwright planner agent):
|
|
20
|
-
|
|
21
|
-
- **Treat `*.cases.md` as the canonical test plan files**, equivalent to Playwright's `specs/*.md`.
|
|
22
|
-
- **Location**:
|
|
23
|
-
- For a feature/domain, use the corresponding `*.cases.md` file under `app/__tests__/e2e`, e.g.:
|
|
24
|
-
- `app/__tests__/e2e/OrderHistory/order-history.cases.md`
|
|
25
|
-
- `app/__tests__/e2e/BillingReport/invoice-list.cases.md`
|
|
26
|
-
- **Content requirements**:
|
|
27
|
-
- Group scenarios by feature and subfeature using headings.
|
|
28
|
-
- For each scenario include:
|
|
29
|
-
- clear title,
|
|
30
|
-
- preconditions,
|
|
31
|
-
- ordered steps,
|
|
32
|
-
- expected results.
|
|
33
|
-
- Write in concise business language, but precise enough for automatic test generation.
|
|
34
|
-
- **Seed**:
|
|
35
|
-
- Assume environment is prepared by `app/__tests__/e2e/seed.spec.ts` (login, baseURL, mocks, etc.).
|
|
36
|
-
|
|
37
|
-
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.
|
|
38
|
-
|
|
39
|
-
## Generator (tests from plans)
|
|
40
|
-
|
|
41
|
-
When acting as a **Generator** (or working with the Playwright generator agent):
|
|
42
|
-
|
|
43
|
-
- **Source of truth for scenarios**:
|
|
44
|
-
- Use the relevant `*.cases.md` file under `app/__tests__/e2e/**` as the test plan.
|
|
45
|
-
- **Target for tests**:
|
|
46
|
-
- Generate or update `*.spec.ts` files under the same folder, e.g.:
|
|
47
|
-
- plan: `app/__tests__/e2e/OrderHistory/order-history.cases.md`
|
|
48
|
-
- tests: `app/__tests__/e2e/OrderHistory/order-history.spec.ts` (or additional `*.spec.ts` in that folder if needed).
|
|
49
|
-
- **Structure**:
|
|
50
|
-
- Use `test.describe` to group by top-level plan sections (feature / user flow).
|
|
51
|
-
- Use `test(...)` titles that match scenario names from the plan.
|
|
52
|
-
- Prefer Page Object and fluent interfaces that already exist in this project, for example:
|
|
53
|
-
- `app/__tests__/e2e/OrderHistory/OrderHistoryPage.ts`
|
|
54
|
-
- shared helpers under `app/__tests__/e2e/_shared/`.
|
|
55
|
-
- **Seed**:
|
|
56
|
-
- If a seed test is needed, use `app/__tests__/e2e/seed.spec.ts` as the reference for environment setup.
|
|
57
|
-
|
|
58
|
-
Do **not** generate Playwright tests into a separate `tests/` folder by default. Keep all e2e tests under `app/__tests__/e2e/**` to respect project conventions.
|
|
59
|
-
|
|
60
|
-
## Healer (fixing tests)
|
|
61
|
-
|
|
62
|
-
When acting as a **Healer** (or working with the Playwright healer agent):
|
|
63
|
-
|
|
64
|
-
- Operate only on `*.spec.ts` files under `app/__tests__/e2e/**`.
|
|
65
|
-
- Use `*.cases.md` in the same folder as **documentation of the intended behavior**:
|
|
66
|
-
- Do not weaken or change business assertions in tests in a way that conflicts with the corresponding `*.cases.md`.
|
|
67
|
-
- Prefer updating locators, waits, and flow details to match the UI while keeping the scenario semantics intact.
|
|
68
|
-
- When multiple specs are involved, prioritize:
|
|
69
|
-
- the spec file in the same folder as the failing test,
|
|
70
|
-
- then shared utilities in `app/__tests__/e2e/_shared/`.
|
|
71
|
-
|
|
72
|
-
Healer should keep tests aligned with the existing test plans (`*.cases.md`) and with the page objects and helpers already used in the project.
|
|
73
|
-
|
|
74
|
-
См. также агенты в `.claude/agents/` пресета и **`testing/tests-e2e-structure.md`**.
|
|
@@ -1,52 +0,0 @@
|
|
|
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.
|
|
@@ -1,66 +0,0 @@
|
|
|
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,15 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
paths:
|
|
3
|
-
- .claude/commands/**/*
|
|
4
|
-
- .claude/team/**/*
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Agent team intake
|
|
8
|
-
|
|
9
|
-
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:
|
|
10
|
-
|
|
11
|
-
1. Prefer **`/task <their request>`** or invoke **task-router** first.
|
|
12
|
-
2. Do not jump straight to coding without router + pipeline when scope is non-trivial.
|
|
13
|
-
3. Pure questions («как работает X», «объясни») — answer normally, no `/task`.
|
|
14
|
-
|
|
15
|
-
Exceptions: user explicitly says «без pipeline», «просто сделай», or continues an active slug.
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
# Agent team orchestrator
|
|
2
|
-
|
|
3
|
-
Parent agent = **manager**. Router plans; specialists execute. Artifacts: `.claude/team/tasks/<slug>/`.
|
|
4
|
-
|
|
5
|
-
Work request без `/task` — см. **`tooling-and-review/agent-team-intake.md`**.
|
|
6
|
-
|
|
7
|
-
## Entry points
|
|
8
|
-
|
|
9
|
-
| Command | When |
|
|
10
|
-
|---------|------|
|
|
11
|
-
| **`/task <desc>`** | **Preferred** — router → dynamic pipeline → first agent |
|
|
12
|
-
| `/task-continue <slug>` | After human gate or pause |
|
|
13
|
-
| `/feature-start <desc>` | Legacy: analyst-only start (no router) |
|
|
14
|
-
| `/feature-continue <slug>` | Alias of task-continue |
|
|
15
|
-
| `/technical-retro [slug]` | Retro with agent team block |
|
|
16
|
-
|
|
17
|
-
## Roles
|
|
18
|
-
|
|
19
|
-
| Agent | May edit production code | Typical intent |
|
|
20
|
-
|-------|--------------------------|----------------|
|
|
21
|
-
| `task-router` | no | Every `/task` — writes `pipeline.json` |
|
|
22
|
-
| `task-analyst` | no | feature, refactor, test-only, a11y, docs-only, migration |
|
|
23
|
-
| `solution-architect` | no | spike, complex cross-layer feature |
|
|
24
|
-
| `migration-specialist` | no | migration — phased upgrade plan |
|
|
25
|
-
| `api-contract-reviewer` | no | new/changed backend API contracts |
|
|
26
|
-
| `debugger` | yes, minimal fixes only | bugfix |
|
|
27
|
-
| `ci-investigator` | yes, minimal CI fixes | ci-fix |
|
|
28
|
-
| `feature-developer` | yes | feature, bugfix, refactor, migration, a11y |
|
|
29
|
-
| `build-verifier` | no | lint/type-check/unit gate after developer |
|
|
30
|
-
| `accessibility-reviewer` | no | a11y, UI-heavy feature |
|
|
31
|
-
| `performance-auditor` | no | perf-audit, perf-sensitive feature |
|
|
32
|
-
| `code-reviewer` | no | most pipelines, review-only |
|
|
33
|
-
| `security-reviewer` | no | auth, forms, sensitive data |
|
|
34
|
-
| `qa-tester` | tests only | feature, bugfix, test-only |
|
|
35
|
-
| `unit-test-planner` | no | unit-only — coverage plan |
|
|
36
|
-
| `unit-test-generator` | tests only | unit-only — spec generation |
|
|
37
|
-
| `unit-test-healer` | tests only | failing/flaky unit tests |
|
|
38
|
-
| `playwright-test-planner` | no | e2e scenario planning |
|
|
39
|
-
| `playwright-test-generator` | tests only | e2e spec generation |
|
|
40
|
-
| `playwright-test-healer` | tests only | failing/flaky e2e fixes |
|
|
41
|
-
| `tech-writer` | docs only | docs-only, feature/migration docs |
|
|
42
|
-
|
|
43
|
-
Full prompts: `.claude/agents/*.md`. Artifact conventions: `.claude/team/README.md`.
|
|
44
|
-
|
|
45
|
-
## Dynamic pipeline
|
|
46
|
-
|
|
47
|
-
```mermaid
|
|
48
|
-
flowchart TD
|
|
49
|
-
task["/task prompt"]
|
|
50
|
-
router["task-router"]
|
|
51
|
-
pipeline["pipeline.json"]
|
|
52
|
-
step0["steps 0..N"]
|
|
53
|
-
gate{"humanGates?"}
|
|
54
|
-
hook["subagentStop hook"]
|
|
55
|
-
retro["/technical-retro"]
|
|
56
|
-
|
|
57
|
-
task --> router
|
|
58
|
-
router --> pipeline
|
|
59
|
-
pipeline --> step0
|
|
60
|
-
step0 --> gate
|
|
61
|
-
gate -->|"/task-continue"| step0
|
|
62
|
-
step0 --> hook
|
|
63
|
-
hook --> step0
|
|
64
|
-
step0 --> retro
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
**Source of truth for order:** `pipeline.json` → `steps[]`. Never hardcode analyst → dev → review → QA when `pipeline.json` exists.
|
|
68
|
-
|
|
69
|
-
## status.json (pipeline mode)
|
|
70
|
-
|
|
71
|
-
```json
|
|
72
|
-
{
|
|
73
|
-
"slug": "...",
|
|
74
|
-
"intent": "feature",
|
|
75
|
-
"pipelineIndex": 0,
|
|
76
|
-
"currentAgent": "task-analyst",
|
|
77
|
-
"phase": "executing",
|
|
78
|
-
"state": "in_progress",
|
|
79
|
-
"awaitingHumanGate": false
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
| state | Meaning |
|
|
84
|
-
|-------|---------|
|
|
85
|
-
| `in_progress` | Current step running |
|
|
86
|
-
| `completed` | Current step done; hook or orchestrator advances |
|
|
87
|
-
| `awaiting_approval` | Human gate; wait for `/task-continue` |
|
|
88
|
-
| `changes_requested` | Reviewer blocked; re-run developer (`retryAfterFix`) |
|
|
89
|
-
| `validation_failed` | build-verifier failed; re-run developer then build-verifier |
|
|
90
|
-
|
|
91
|
-
## Pipeline step options
|
|
92
|
-
|
|
93
|
-
| Field | Use |
|
|
94
|
-
|-------|-----|
|
|
95
|
-
| `skipIf` | `debugger.fixed` / `ci-investigator.resolved` |
|
|
96
|
-
| `parallel: true` | `agent` array — invoke all in one parent turn |
|
|
97
|
-
| `scope` | e.g. `unit-in-dev`, `e2e-only` |
|
|
98
|
-
|
|
99
|
-
## Rules (strict)
|
|
100
|
-
|
|
101
|
-
1. **`/task` always starts with task-router** (except user says "skip router" with documented pipeline).
|
|
102
|
-
2. Read `pipeline.json` before every subagent invocation.
|
|
103
|
-
3. One role per subagent call — **except** parallel steps.
|
|
104
|
-
4. **Never** skip `humanGates` without `/task-continue` or explicit user approval.
|
|
105
|
-
5. Persist handoffs including `validation-report.md`.
|
|
106
|
-
6. On `changes_requested`: hook sets `retryAfterFix` → developer → same reviewer.
|
|
107
|
-
7. On `validation_failed`: hook sets `retryAfterFix: build-verifier` → developer → build-verifier.
|
|
108
|
-
8. When all steps complete, suggest `/technical-retro <slug>`.
|
|
109
|
-
9. If `autoChain: false`, manual step only.
|
|
110
|
-
|
|
111
|
-
## Invoking agents
|
|
112
|
-
|
|
113
|
-
Use the available Claude Code subagent mechanism. Pass: slug, artifact paths, step `scope` if set.
|
|
114
|
-
|
|
115
|
-
After each agent completes, ensure `status.json` has `state: completed` (or `awaiting_approval` if gate applies).
|
|
116
|
-
|
|
117
|
-
## Legacy mode
|
|
118
|
-
|
|
119
|
-
If `pipeline.json` is missing (old `/feature-start` tasks), fall back to fixed phases: analysis → development → review → testing.
|
|
120
|
-
|
|
121
|
-
## Skip pipeline when
|
|
122
|
-
|
|
123
|
-
Do **not** run `/task` + router for:
|
|
124
|
-
|
|
125
|
-
- Pure questions («как работает X», «объясни»).
|
|
126
|
-
- Typo / one-file fix / trivial config with no architecture risk.
|
|
127
|
-
- User explicitly says «без pipeline», «просто сделай», or continues an active slug.
|
|
128
|
-
- Single-line `docs-only` with no code impact.
|
|
129
|
-
|
|
130
|
-
Borderline work requests — см. **`tooling-and-review/agent-team-intake.md`**.
|
|
131
|
-
|
|
132
|
-
## Auto-detection (optional)
|
|
133
|
-
|
|
134
|
-
When user describes a **non-trivial task** (not a question), suggest `/task <message>` or run router if they agree.
|
|
@@ -1,42 +0,0 @@
|
|
|
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
|
-
## Линтеры
|
|
36
|
-
|
|
37
|
-
Lint/stylelint — только **`tooling-and-review/post-change-lint.md`**; ESLint config: `app/eslint.config.mjs`. Отключение правила (`eslint-disable`) — только **точечно** с кратким комментарием «зачем».
|
|
38
|
-
|
|
39
|
-
## Требование к агенту
|
|
40
|
-
|
|
41
|
-
- **Boy scout rule:** оставлять модуль немного лучше, чем до изменения (простые, безопасные улучшения).
|
|
42
|
-
- Не жертвовать архитектурой и слоями ради краткости реализации.
|
|
@@ -1,67 +0,0 @@
|
|
|
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/public-imports.md`, дублирует ESLint).
|
|
22
|
-
- При новых/изменённых модулях в регламентированных слоях — реэкспорт публичных символов в корневой barrel по **`architecture/layer-barrel-exports.md`**.
|
|
23
|
-
- Размещение новых файлов в корректных слоях и директориях фич.
|
|
24
|
-
|
|
25
|
-
### Типы и TS‑строгость
|
|
26
|
-
|
|
27
|
-
- Не допускать новых `any`; предпочитать доменные типы из `@/types` (barrel, см. `architecture/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.
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# Менеджер пакетов (терминал)
|
|
2
|
-
|
|
3
|
-
Перед **`npm install` / `yarn` / `pnpm` / `bun`** и **`… run …`** определи менеджер репозитория и **используй только его**.
|
|
4
|
-
|
|
5
|
-
## Как определить
|
|
6
|
-
|
|
7
|
-
1. **`packageManager`** в `package.json` (корень или `app/package.json`).
|
|
8
|
-
2. **Lockfile** рядом: `yarn.lock` → yarn; `pnpm-lock.yaml` → pnpm; `package-lock.json` → npm; `bun.lock(b)` → bun.
|
|
9
|
-
3. Если неоднозначно — где `node_modules` и какой lockfile в CI.
|
|
10
|
-
|
|
11
|
-
Рабочий каталог для scripts — **`app/`**. Примеры: `yarn lint`, `pnpm run test`. Не угадывай — проверь файлы.
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# Линтеры после изменений кода
|
|
2
|
-
|
|
3
|
-
## Когда применять
|
|
4
|
-
|
|
5
|
-
После **любого** изменения исходников в `app/**` (TS/TSX/JS/MJS, CSS, styled/Linaria в `.ts`/`.tsx`).
|
|
6
|
-
|
|
7
|
-
Исключения: правки документации вне `app/`, конфигов CI, `.claude/rules/**`, если исполняемый код приложения не менялся.
|
|
8
|
-
|
|
9
|
-
**Pipeline exception:** если задача идёт через agent team и следующий шаг — `build-verifier`, developer может ограничиться lint/type-check **изменённых файлов**; полный прогон — обязанность `build-verifier`. В single-agent режиме (без pipeline) — всегда полный прогон.
|
|
10
|
-
|
|
11
|
-
## Обязательные команды
|
|
12
|
-
|
|
13
|
-
Рабочий каталог — **`app/`**. Менеджер пакетов — **`tooling-and-review/package-manager.md`**.
|
|
14
|
-
|
|
15
|
-
1. **`lint:js`** — полный ESLint по проекту.
|
|
16
|
-
2. **`lint:css`** — полный Stylelint (`**/*.{css,ts}`).
|
|
17
|
-
|
|
18
|
-
Точечный lint на один файл **не заменяет** полный прогон перед завершением задачи (кроме pipeline exception выше).
|
|
19
|
-
|
|
20
|
-
## Алгоритм
|
|
21
|
-
|
|
22
|
-
1. Завершить правки кода.
|
|
23
|
-
2. Запустить **`lint:js`** и **`lint:css`** из `app/`.
|
|
24
|
-
3. Проанализировать весь вывод; исправить errors/warnings в изменённых файлах; для Stylelint — **`lint:css --fix`** если автоисправимо.
|
|
25
|
-
4. Повторить до exit code 0 или зафиксировать блокер в ответе пользователю.
|
|
26
|
-
5. **`type-check`** при изменениях TypeScript. CI-уровень: **`lint`** (= `lint:js` + `lint:css` + `type-check`).
|
|
27
|
-
|
|
28
|
-
## Что исправлять
|
|
29
|
-
|
|
30
|
-
- **Errors** — обязательно.
|
|
31
|
-
- **Warnings** — обязательно в файлах задачи; вне скоупа — упомянуть, если мешают нулевому exit code.
|
|
32
|
-
|
|
33
|
-
Конфиги: `app/eslint.config.mjs`, `app/.stylelintrc` (порядок CSS — `ui-and-accessibility/css-property-order.md`).
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
paths:
|
|
3
|
-
- app/src/ui/**/*.ts
|
|
4
|
-
- app/src/ui/**/*.tsx
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Стили только рядом с компонентом
|
|
8
|
-
|
|
9
|
-
## Имя корневого styled-элемента: `Root`
|
|
10
|
-
|
|
11
|
-
- **Корневой** styled-элемент — **`Root`**.
|
|
12
|
-
- В разметке: `<s.Root>...</s.Root>` при `import * as s from './styles'`.
|
|
13
|
-
- Вложенные — `Title`, `List`, `Item` и т.д.
|
|
14
|
-
- Единственная внешняя styled-обёртка всего JSX — **`Root`**, не `Container` / `Wrapper`.
|
|
15
|
-
|
|
16
|
-
```tsx
|
|
17
|
-
// ✅ Хорошо
|
|
18
|
-
export const Root = styled.div` ... `
|
|
19
|
-
// в компоненте: <s.Root>...</s.Root>
|
|
20
|
-
|
|
21
|
-
// ❌ Плохо для единственной обёртки
|
|
22
|
-
export const Service = styled.div` ... `
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Правило
|
|
26
|
-
|
|
27
|
-
**Запрещено** импортировать модули стилей **другого** UI-компонента или блока.
|
|
28
|
-
|
|
29
|
-
Под «модулями стилей»:
|
|
30
|
-
|
|
31
|
-
- `styles.ts` / `styles.tsx` рядом с компонентом;
|
|
32
|
-
- `*.module.css`, `*.module.scss`;
|
|
33
|
-
- файлы, экспортирующие styled-примитивы одного компонента.
|
|
34
|
-
|
|
35
|
-
## Разрешено
|
|
36
|
-
|
|
37
|
-
- `import * as s from './styles'` — в той же папке.
|
|
38
|
-
- Общие примитивы дизайн-системы, токены, `@/ui/components/...`.
|
|
39
|
-
- Повторное использование визуала через **сам компонент**, не через его `styles`.
|
|
40
|
-
|
|
41
|
-
## Примеры
|
|
42
|
-
|
|
43
|
-
```tsx
|
|
44
|
-
// ✅ Хорошо
|
|
45
|
-
import * as s from './styles'
|
|
46
|
-
|
|
47
|
-
// ❌ Плохо
|
|
48
|
-
import * as s from '../../styles'
|
|
49
|
-
import * as s from '../RequestForAnalysisServices/styles'
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
## Почему
|
|
53
|
-
|
|
54
|
-
- **`Root`** — быстрая ориентация в разметке.
|
|
55
|
-
- Стили и компонент меняются вместе.
|
|
56
|
-
- Проще рефакторинг.
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
paths:
|
|
3
|
-
- app/src/ui/**/*.styles.ts
|
|
4
|
-
- app/src/ui/**/*.styles.tsx
|
|
5
|
-
- app/src/ui/**/styles.ts
|
|
6
|
-
- app/src/ui/**/styles.tsx
|
|
7
|
-
- app/**/*.css
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Порядок CSS-свойств (как в Stylelint)
|
|
11
|
-
|
|
12
|
-
Порядок свойств — как в **`app/.stylelintrc`** (`stylelint-config-idiomatic-order`). Не дублировать список вручную.
|
|
13
|
-
|
|
14
|
-
Автоисправление из `app/`: **`lint:css --fix`**. Полный прогон — **`tooling-and-review/post-change-lint.md`**.
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
paths:
|
|
3
|
-
- app/src/**/*.tsx
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Не использовать спред пропов при передаче в компоненты
|
|
7
|
-
|
|
8
|
-
При вызове **пользовательских** React-компонентов (имя с заглавной буквы) **передавать пропы явно**, а не через spread (`{...props}`, `{...obj}`).
|
|
9
|
-
|
|
10
|
-
**Агентам и при ревью:** не «упрощать» JSX через объект с spread. Длинное ветвление — два явных JSX-блока или отдельные компоненты.
|
|
11
|
-
|
|
12
|
-
## Почему
|
|
13
|
-
|
|
14
|
-
- Явная передача делает зависимости очевидными.
|
|
15
|
-
- Упрощает рефакторинг и поиск использований.
|
|
16
|
-
- Снижает риск лишних пропов.
|
|
17
|
-
|
|
18
|
-
## Проверка в репозитории
|
|
19
|
-
|
|
20
|
-
- Для `app/src/ui/**/*.tsx` — ESLint `react/jsx-props-no-spreading` (`app/eslint.config.mjs`).
|
|
21
|
-
- Исключение — `eslint-disable-next-line` с комментарием «почему».
|
|
22
|
-
|
|
23
|
-
## Примеры
|
|
24
|
-
|
|
25
|
-
```tsx
|
|
26
|
-
// ❌ Плохо
|
|
27
|
-
const commonProps = { a, b, c }
|
|
28
|
-
return <Child {...commonProps} />
|
|
29
|
-
|
|
30
|
-
// ❌ Плохо
|
|
31
|
-
return <Child {...props} />
|
|
32
|
-
|
|
33
|
-
// ✅ Хорошо
|
|
34
|
-
return (
|
|
35
|
-
<Child
|
|
36
|
-
a={a}
|
|
37
|
-
b={b}
|
|
38
|
-
c={c}
|
|
39
|
-
/>
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
// ✅ Хорошо — явные пропсы по веткам
|
|
43
|
-
return cond ? (
|
|
44
|
-
<IconBox name={name} size="m" variant="warning" />
|
|
45
|
-
) : (
|
|
46
|
-
<IconBox
|
|
47
|
-
customColors={styles.IconBoxAccent.customColors}
|
|
48
|
-
name={name}
|
|
49
|
-
size="m"
|
|
50
|
-
/>
|
|
51
|
-
)
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## Исключения
|
|
55
|
-
|
|
56
|
-
- **Нативный** DOM (`<div {...rest} />`) — если `rest` только HTML-атрибуты.
|
|
57
|
-
- Обёртки — если явно документировано; при необходимости ESLint-disable.
|