@rt-tools/agent-kit 0.3.0 → 0.4.0
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 +194 -30
- package/assets/agents/business-analyst.md +74 -0
- package/assets/agents/project-manager.md +70 -0
- package/assets/agents/qa-engineer.md +72 -0
- package/assets/agents/skill-curator.md +110 -0
- package/assets/agents/spec-critic.md +44 -0
- package/assets/agents/spec-writer.md +50 -0
- package/assets/checks/board.github.mjs +286 -0
- package/assets/checks/check-board.github.mjs +188 -0
- package/assets/checks/check-doc-paths.mjs +163 -0
- package/assets/checks/check-dupes.mjs +277 -0
- package/assets/checks/check-lib-layers.mjs +573 -0
- package/assets/checks/check-reuse.mjs +208 -0
- package/assets/checks/check-schema-drift.mjs +186 -0
- package/assets/checks/check-specs.mjs +1007 -0
- package/assets/checks/check-styles.mjs +109 -0
- package/assets/checks/rt-kit-checks.config.mjs +134 -0
- package/assets/checks/task-new.github.mjs +198 -0
- package/assets/commands/skill-curator.md +70 -0
- package/assets/defaults/gate-map.sh +100 -0
- package/assets/defaults/project.sh +179 -0
- package/assets/hooks/browser-device-id.sh +0 -0
- package/assets/hooks/browser-guard-device-id.sh +2 -1
- package/assets/hooks/browser-guard-no-asking.sh +27 -0
- package/assets/hooks/browser-guard-no-listing.sh +2 -1
- package/assets/hooks/browser-guard-no-other-drivers.sh +2 -1
- package/assets/hooks/browser-guard-require-select.sh +2 -1
- package/assets/hooks/commit-msg.sh +1 -1
- package/assets/hooks/constitution-index.sh +5 -4
- package/assets/hooks/dev-server-guard.sh +8 -6
- package/assets/hooks/docs-guard.sh +223 -37
- package/assets/hooks/git-guard-delivery.sh +86 -29
- package/assets/hooks/git-guard-main.sh +1 -0
- package/assets/hooks/git-guard-push-tests.sh +34 -13
- package/assets/hooks/glossary-load.sh +23 -0
- package/assets/hooks/lint-after-edit.sh +155 -30
- package/assets/hooks/qa-dataid-guard.sh +72 -32
- package/assets/hooks/reuse-first-guard.sh +105 -34
- package/assets/hooks/skill-gate-rearm.sh +1 -0
- package/assets/hooks/skill-gate.sh +75 -15
- package/assets/hooks/skill-loaded.sh +1 -0
- package/assets/hooks/sql-guard.sh +606 -56
- package/assets/hooks/task-context-load.sh +100 -0
- package/assets/hooks/task-flow-guard.sh +107 -0
- package/assets/laws/{access.md → application/access.md} +1 -4
- package/assets/laws/{locales.md → application/locales.md} +1 -3
- package/assets/laws/application/money.md +41 -0
- package/assets/laws/application/ownership.md +32 -0
- package/assets/laws/{search-visibility.md → application/search-visibility.md} +1 -1
- package/assets/laws/code-structure.md +7 -6
- package/assets/laws/delivery.md +53 -3
- package/assets/laws/entity-editing.md +49 -55
- package/assets/laws/entity-models.md +4 -14
- package/assets/laws/frontend-application.md +5 -5
- package/assets/laws/lib-imports.md +14 -1
- package/assets/laws/lists.md +33 -0
- package/assets/laws/navigation.md +40 -0
- package/assets/laws/project-documentation.md +17 -8
- package/assets/laws/reuse-first.md +26 -21
- package/assets/laws/shared-code.md +13 -1
- package/assets/laws/verifiability.md +17 -1
- package/assets/laws/work-conduct.md +48 -0
- package/assets/patterns/admin-lists-screen.md +131 -0
- package/assets/patterns/admin-nav-item.md +71 -0
- package/assets/patterns/angular-patterns-state.md +29 -22
- package/assets/patterns/api-layer-pair.md +40 -30
- package/assets/patterns/browser-verification-measure.md +41 -38
- package/assets/patterns/browser-verification-stand.md +106 -42
- package/assets/patterns/component-structure-new.md +33 -32
- package/assets/patterns/dependencies-upgrade.md +65 -0
- package/assets/patterns/doc-style-sweep.md +65 -28
- package/assets/patterns/doc-style-write.md +36 -33
- package/assets/patterns/entity-aside.md +136 -0
- package/assets/patterns/entity-models-new.md +124 -0
- package/assets/patterns/entity-store.md +91 -0
- package/assets/patterns/git-workflow-commit.azure.md +259 -0
- package/assets/patterns/git-workflow-commit.github.md +333 -0
- package/assets/patterns/git-workflow-commit.gitlab.md +283 -0
- package/assets/patterns/git-workflow-merge.md +42 -25
- package/assets/patterns/git-workflow-migration.md +61 -31
- package/assets/patterns/git-workflow-restart.md +20 -20
- package/assets/patterns/lib-layers-move.md +50 -32
- package/assets/patterns/lib-layers-new.md +41 -29
- package/assets/patterns/ownership-scope-resolve.md +69 -0
- package/assets/patterns/permissions-procedure.md +35 -33
- package/assets/patterns/platform-access-di.md +39 -25
- package/assets/patterns/pricing-quote.md +71 -0
- package/assets/patterns/reuse-first-extend.md +22 -22
- package/assets/patterns/seo-page.md +52 -40
- package/assets/patterns/seo-verify.md +48 -29
- package/assets/patterns/shared-code-new.md +37 -31
- package/assets/patterns/spec-driven-domain.md +44 -37
- package/assets/patterns/spec-driven-rule.md +55 -40
- package/assets/patterns/styling-bem-component.md +43 -32
- package/assets/patterns/styling-bem-layout.md +30 -24
- package/assets/patterns/task-flow-close.md +90 -0
- package/assets/patterns/task-flow-resume.md +94 -0
- package/assets/patterns/task-flow-start.md +117 -0
- package/assets/patterns/testing-e2e.md +53 -51
- package/assets/patterns/testing-unit.md +70 -46
- package/assets/patterns/translations-key.md +32 -19
- package/assets/patterns/ts-procedure.md +24 -25
- package/assets/rules/angular-patterns.md +46 -27
- package/assets/rules/api-layer.md +46 -28
- package/assets/rules/browser-verification.md +66 -48
- package/assets/rules/component-structure.md +43 -27
- package/assets/rules/dependencies.md +66 -0
- package/assets/rules/doc-style.md +81 -39
- package/assets/rules/entity-conventions.md +78 -0
- package/assets/rules/entity-models.md +70 -0
- package/assets/rules/git-workflow.azure.md +116 -0
- package/assets/rules/git-workflow.github.md +123 -0
- package/assets/rules/git-workflow.gitlab.md +113 -0
- package/assets/rules/lib-layers.md +56 -30
- package/assets/rules/lists.md +73 -0
- package/assets/rules/navigation.md +78 -0
- package/assets/rules/ownership-scope.md +63 -0
- package/assets/rules/permissions.md +43 -25
- package/assets/rules/platform-access.md +57 -29
- package/assets/rules/pricing.md +64 -0
- package/assets/rules/reuse-first.md +57 -43
- package/assets/rules/seo.md +51 -30
- package/assets/rules/shared-code.md +51 -26
- package/assets/rules/spec-driven.md +96 -50
- package/assets/rules/styling-bem.md +54 -39
- package/assets/rules/task-flow.md +110 -0
- package/assets/rules/testing.md +78 -47
- package/assets/rules/translations.md +48 -31
- package/assets/rules/typescript-conventions.md +57 -27
- package/assets/skills/agent-kit.md +81 -0
- package/assets/skills/write-a-skill.md +108 -0
- package/assets/templates/gate-map.sh +23 -15
- package/assets/templates/implementation.md +14 -8
- package/assets/templates/pattern.md +1 -1
- package/assets/templates/project.sh +32 -19
- package/assets/templates/rule.md +1 -1
- package/assets/variants.json +20 -0
- package/assets/workflows/feature.js +134 -0
- package/assets/workflows/plan.js +150 -0
- package/bin/agent-kit.d.ts.map +1 -1
- package/bin/agent-kit.js +78 -5
- package/bin/agent-kit.js.map +1 -1
- package/bin/prompt.d.ts +5 -0
- package/bin/prompt.d.ts.map +1 -1
- package/bin/prompt.js +19 -7
- package/bin/prompt.js.map +1 -1
- package/index.d.ts +1 -0
- package/index.d.ts.map +1 -1
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/lib/assets.d.ts +8 -3
- package/lib/assets.d.ts.map +1 -1
- package/lib/assets.js +13 -3
- package/lib/assets.js.map +1 -1
- package/lib/catalog.d.ts +52 -5
- package/lib/catalog.d.ts.map +1 -1
- package/lib/catalog.js +104 -16
- package/lib/catalog.js.map +1 -1
- package/lib/commands.d.ts +22 -1
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +202 -14
- package/lib/commands.js.map +1 -1
- package/lib/companion.d.ts +5 -1
- package/lib/companion.d.ts.map +1 -1
- package/lib/companion.js +29 -2
- package/lib/companion.js.map +1 -1
- package/lib/config.d.ts +26 -9
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +41 -15
- package/lib/config.js.map +1 -1
- package/lib/freshness.d.ts +14 -0
- package/lib/freshness.d.ts.map +1 -0
- package/lib/freshness.js +116 -0
- package/lib/freshness.js.map +1 -0
- package/lib/hooks-map.d.ts +24 -0
- package/lib/hooks-map.d.ts.map +1 -0
- package/lib/hooks-map.js +72 -0
- package/lib/hooks-map.js.map +1 -0
- package/lib/integrity.d.ts +36 -0
- package/lib/integrity.d.ts.map +1 -0
- package/lib/integrity.js +44 -0
- package/lib/integrity.js.map +1 -0
- package/lib/picker.d.ts +11 -1
- package/lib/picker.d.ts.map +1 -1
- package/lib/picker.js +44 -6
- package/lib/picker.js.map +1 -1
- package/lib/sync.d.ts +26 -0
- package/lib/sync.d.ts.map +1 -1
- package/lib/sync.js +59 -4
- package/lib/sync.js.map +1 -1
- package/lib/variants.d.ts +44 -0
- package/lib/variants.d.ts.map +1 -0
- package/lib/variants.js +82 -0
- package/lib/variants.js.map +1 -0
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.4.0.tgz +0 -0
- package/assets/laws/admin-lists.md +0 -35
- package/assets/laws/admin-navigation.md +0 -38
- package/assets/patterns/git-workflow-commit.md +0 -175
- package/assets/rules/git-workflow.md +0 -106
- package/rt-tools-agent-kit-0.3.0.tgz +0 -0
|
@@ -2,52 +2,70 @@
|
|
|
2
2
|
name: api-layer
|
|
3
3
|
kind: rule
|
|
4
4
|
law: frontend-application
|
|
5
|
-
description: Правило под
|
|
5
|
+
description: Правило под «Закон о фронтовом приложении». Брать при правке слоя api фронтового домена — *-api.facade.ts, *-api.service.ts и мапперов в его mappers/ под libs/admin и libs/site. Называет пару «фасад и сервис», один вход выборки у списка и общий конвертер страницы. Готовый код — в паттерне api-layer-pair.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# Обращение к серверу —
|
|
8
|
+
# Обращение к серверу — как это устроено здесь
|
|
9
9
|
|
|
10
|
-
Правило под закон `
|
|
11
|
-
здесь — из чего сложен слой обращения к серверу.
|
|
12
|
-
|
|
13
|
-
`
|
|
14
|
-
окружение браузера — `platform-access`. Все пять под одним законом.
|
|
10
|
+
Правило под закон `docs/constitution/frontend-application.md`. Закон говорит, что должно быть
|
|
11
|
+
верно; здесь — из чего сложен слой обращения к серверу. Состояние — `angular-patterns`, файл
|
|
12
|
+
компонента — `component-structure`, стили — `styling-bem`, окружение браузера —
|
|
13
|
+
`platform-access`. Все пять под одним законом.
|
|
15
14
|
|
|
16
|
-
Правило про фронтовые
|
|
17
|
-
|
|
15
|
+
Правило про обе фронтовые семьи: `libs/admin/*/api/**` и `libs/site/*/api/**`. На бэкенде слово
|
|
16
|
+
`api` означает выход к чужому сервису и устроено иначе — там `typescript-conventions`.
|
|
18
17
|
|
|
19
|
-
##
|
|
18
|
+
## Как это называется здесь
|
|
20
19
|
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
| В законе | Здесь |
|
|
21
|
+
| ---------------- | ------------------------------------------------------------------------------ |
|
|
22
|
+
| страница записей | `IPageModel` — `pageNumber`, `pageSize`, `totalCount` |
|
|
23
|
+
| выборка списка | `IList.Query.State` — страница, порядок, условия отбора, строка поиска |
|
|
24
|
+
| ответ списка | `data`, `pageModel`, `sortModel`, `filterModel`, `searchTerm` |
|
|
25
|
+
| путь запроса | экран → стор → `<Сущность>ApiService` → `<Сущность>ApiFacade` → клиент Connect |
|
|
23
26
|
|
|
24
|
-
##
|
|
27
|
+
## Где это лежит
|
|
25
28
|
|
|
26
|
-
|
|
29
|
+
В этом дереве — таблица в `implementation.md` рядом. Пути живут там, а не здесь: правило
|
|
30
|
+
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
31
|
+
же дереве, которое держит код иначе.
|
|
32
|
+
|
|
33
|
+
## Как закон применяется здесь
|
|
34
|
+
|
|
35
|
+
- **Домен ходит за данными парой классов: фасад зовёт процедуру, сервис переводит модели.**
|
|
27
36
|
Один класс на оба дела означал бы, что подмена источника тянет за собой перевод.
|
|
28
|
-
- **Фасад знает только контракт,
|
|
37
|
+
- **Фасад знает только контракт, сервис отдаёт только `State`.** Тип из контракта до стора и
|
|
29
38
|
шаблона не доходит.
|
|
30
|
-
- **У списка один вход — выборка.** Объект, к которому привязан список,
|
|
31
|
-
подписки — такие же условия отбора, и лежат они в
|
|
39
|
+
- **У списка один вход — выборка.** Объект, к которому привязан список, тип фида, состояние
|
|
40
|
+
подписки — такие же условия отбора, и лежат они в `filterModel`.
|
|
32
41
|
- **Ответ списка ложится в общий конвертер целиком.** Контракт отдаёт страницу в той же форме,
|
|
33
|
-
что и модель, и промежуточного объекта в
|
|
42
|
+
что и модель, и промежуточного объекта в сервисе не остаётся.
|
|
34
43
|
- **Поля порядка и отбора — перечисления домена, а не голая строка.** Голая строка означает,
|
|
35
|
-
что имя, по которому сервер не сортирует, компилируется и падает
|
|
36
|
-
- **Пара отдаёт поток, а не ожидание.** Основа списочного стора работает потоками, и
|
|
37
|
-
|
|
44
|
+
что имя, по которому сервер не сортирует, компилируется и падает запросом.
|
|
45
|
+
- **Пара отдаёт поток, а не ожидание.** Основа списочного стора работает потоками, и промисный
|
|
46
|
+
сервис в неё не ложится.
|
|
47
|
+
|
|
48
|
+
## Чего из закона здесь нет
|
|
49
|
+
|
|
50
|
+
Общей выборкой ходят только те списки, которым сервер отдаёт страницу — признак `page_model` в
|
|
51
|
+
ответе процедуры. Заявки и объекты приходят целиком: процедуры со страницей у них пока нет, и
|
|
52
|
+
это долги `Q-L-5` и `Q-L-7`, а не другая форма слоя.
|
|
53
|
+
|
|
54
|
+
Сторы, которые ещё держат прежнюю сигнатуру, зовут поток через `firstValueFrom` и несут над
|
|
55
|
+
классом комментарий с тем, когда мост уйдёт. Новый стор моста не заводит.
|
|
38
56
|
|
|
39
57
|
## Паттерны
|
|
40
58
|
|
|
41
|
-
- `api-layer-pair` — готовые фасад,
|
|
59
|
+
- `api-layer-pair` — готовые фасад, сервис и перевод выборки.
|
|
42
60
|
|
|
43
61
|
## Ловушки
|
|
44
62
|
|
|
45
63
|
- **Выборка в ответе — применённая, а не запрошенная.** Порядок по умолчанию и отброшенное
|
|
46
64
|
сервером условие экран иначе не увидит.
|
|
47
|
-
- **Одна пара — одна сущность.** У
|
|
48
|
-
лежат в одном
|
|
65
|
+
- **Одна пара — одна сущность.** У объекта, его прежних адресов и подписок на календари свои
|
|
66
|
+
пары, хотя процедуры лежат в одном proto-сервисе.
|
|
49
67
|
- **Метод, которого у домена нет, не объявляется.** Список читают все, правят не все.
|
|
50
|
-
- **Серверный
|
|
51
|
-
асинхронным итератором, и заворачивать его некуда.
|
|
52
|
-
-
|
|
53
|
-
|
|
68
|
+
- **Серверный стрим — исключение из правила про поток:** живой срез аналитики и лента тредов
|
|
69
|
+
приходят асинхронным итератором, и заворачивать его некуда.
|
|
70
|
+
- Своей копии общих мапперов страницы, порядка и отбора домен не заводит — второй экземпляр
|
|
71
|
+
ловит `npm run check:dupes`.
|
|
@@ -2,68 +2,86 @@
|
|
|
2
2
|
name: browser-verification
|
|
3
3
|
kind: rule
|
|
4
4
|
law: verifiability
|
|
5
|
-
description: Правило под
|
|
5
|
+
description: Правило под «Закон о проверяемости». Брать при любой проверке через браузер и при запросах curl или wget к дев-серверу. Называет порты сайта, админки и API, чему на дев-сервере верить нельзя и чем измерять вместо взгляда. Готовый код — в паттернах browser-verification-stand и browser-verification-measure.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# Проверка работающего приложения —
|
|
8
|
+
# Проверка работающего приложения — как это устроено здесь
|
|
9
9
|
|
|
10
|
-
Правило под закон `
|
|
11
|
-
здесь —
|
|
12
|
-
|
|
13
|
-
же законом — правило `testing`.
|
|
10
|
+
Правило под закон `docs/constitution/verifiability.md`. Закон говорит, что считается
|
|
11
|
+
подтверждением; здесь — где живут приложения, чему на них можно верить и чем измерять. Тесты
|
|
12
|
+
под тем же законом — правило `testing`.
|
|
14
13
|
|
|
15
|
-
##
|
|
14
|
+
## Как это называется здесь
|
|
16
15
|
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
| В законе | Здесь |
|
|
17
|
+
| --------------------------------- | ----------------------------------------------------------------------------------------------- |
|
|
18
|
+
| работающее приложение | сайт на 4900, админка на 4901, API на 3333 — всё поднято владельцем |
|
|
19
|
+
| место, где его видит пользователь | прод-сборка за настоящим `deploy/nginx.conf`, а не дев-сервер |
|
|
20
|
+
| замер | `getComputedStyle`, `getBoundingClientRect`, контраст, совпадение центров, попадание во вьюпорт |
|
|
21
|
+
| драйвер браузера | `claude-in-chrome` на закреплённом профиле этого дерева |
|
|
19
22
|
|
|
20
|
-
##
|
|
23
|
+
## Где это лежит
|
|
21
24
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
В этом дереве — таблица в `implementation.md` рядом. Пути живут там, а не здесь: правило
|
|
26
|
+
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
27
|
+
же дереве, которое держит код иначе.
|
|
28
|
+
|
|
29
|
+
## Как закон применяется здесь
|
|
30
|
+
|
|
31
|
+
- **Свой дев-сервер не поднимается.** Приложения уже подняты владельцем, и попытка поднять
|
|
32
|
+
второй экземпляр отбивается гардом.
|
|
25
33
|
- **Браузер водится одним драйвером на закреплённом профиле.** Остальные двери — второй
|
|
26
|
-
драйвер,
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
не держится: после паузы следующий вызов открывает вкладку в другом профиле молча.
|
|
34
|
+
драйвер, `open`, `osascript`, запуск бинарника — закреплённый профиль не спрашивают вовсе.
|
|
35
|
+
- **Выбор браузера протухает и требует повторного вызова.** Выбор, сделанный в начале
|
|
36
|
+
сессии, не держится: после паузы следующий вызов открывает вкладку в другом профиле молча.
|
|
30
37
|
- **Профиль не выбирается из списка и не спрашивается у владельца.** Список отдаёт неустойчивые
|
|
31
38
|
имена, которые не опознают ничего, а выбор из него ведёт на профиль без входа.
|
|
32
|
-
- **Прод-конфигурация проверяется только за настоящим прокси.** Голый сервер отдачи страниц
|
|
33
|
-
кэш, перенаправления и заголовки не знает ничего.
|
|
34
|
-
|
|
35
|
-
|
|
39
|
+
- **Прод-конфигурация проверяется только за настоящим прокси.** Голый сервер отдачи страниц
|
|
40
|
+
про кэш, перенаправления и заголовки не знает ничего.
|
|
41
|
+
|
|
42
|
+
Вывод о вёрстке подкрепляется числом: «выглядит нормально» результатом проверки не является.
|
|
43
|
+
Этого не стережёт ничто — как измерять, разобрано в паттерне `browser-verification-measure`.
|
|
44
|
+
|
|
45
|
+
## Чего из закона здесь нет
|
|
46
|
+
|
|
47
|
+
Проверки на прямое обращение к окружению браузера нет — это `Q-FA-1` в законе о фронтовом
|
|
48
|
+
приложении: такое обращение компилируется и падает только при отдаче страницы сервером.
|
|
36
49
|
|
|
37
50
|
## Паттерны
|
|
38
51
|
|
|
39
|
-
- `browser-verification-stand` — честный стенд из прод-сборки, вход в
|
|
40
|
-
- `browser-verification-measure` — замер вместо взгляда, ловушки инструмента
|
|
52
|
+
- `browser-verification-stand` — честный стенд из прод-сборки, вход в админку, разбор порта.
|
|
53
|
+
- `browser-verification-measure` — замер вместо взгляда, ловушки инструмента `computer`.
|
|
41
54
|
|
|
42
55
|
## Ловушки
|
|
43
56
|
|
|
44
|
-
- **Сначала выяснить, что отвечает на
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
каждый.
|
|
49
|
-
-
|
|
50
|
-
— от компиляции до правки. Признак
|
|
51
|
-
Расхождение между
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
57
|
+
- **Сначала выяснить, что отвечает на порту:** `lsof -nP -iTCP:<порт> -sTCP:LISTEN` до первого
|
|
58
|
+
запроса. На 3333 регулярно висит собранный артефакт из прошлой сессии — он отвечает 200
|
|
59
|
+
старым кодом, а заведённой в ветке процедуры у него нет вовсе, и 404 читается как дефект
|
|
60
|
+
регистрации. Таких процессов бывает несколько; `pkill` по `nx serve api` не попадает ни в
|
|
61
|
+
один — убивать по PID из `lsof`, каждый.
|
|
62
|
+
- Инкрементальная сборка протухает поштучно: разметка на 4900 бывает уже новая, а клиентский
|
|
63
|
+
чанк — от компиляции до правки. Признак дев-сборки — имена бандла без хеша (`main.js`).
|
|
64
|
+
Расхождение между `curl` и страницей после гидратации — повод пересобрать, а не искать
|
|
65
|
+
дефект в коде. Отсюда же нельзя делать вывод «такого маршрута нет»: сверяться с
|
|
66
|
+
`app.routes.ts`.
|
|
67
|
+
- **Кэш объясняет расхождение, но не подтверждает его.** В `.angular/cache/…/vite/deps` лежат
|
|
68
|
+
только пакеты из `node_modules`, кода репозитория там нет вовсе. Вывод «дефекта нет, это
|
|
69
|
+
кэш» закрывает разбор, поэтому принимается только после проверки на чистой сборке — три
|
|
70
|
+
круга ушло на застрявшую панель ленты событий, пока дефект лежал в снятии аутлета.
|
|
71
|
+
- Сообщение `Angular debugging APIs are not available` в консоли принадлежит расширению
|
|
72
|
+
Chrome, а не приложению: прод-сборка не публикует `window.ng`. Лечить правкой кода не надо —
|
|
73
|
+
`window.ng` в проде это карта внутренностей в руках любого, кто откроет консоль.
|
|
74
|
+
- Поведение роутера воспроизводится нажатиями: подстановка адреса и заход по прямой ссылке
|
|
75
|
+
поднимают приложение заново, и накопленного состояния у него нет.
|
|
76
|
+
- Замер отвечает только на заданный вопрос. Строки попапа профиля сошлись с образцом по
|
|
77
|
+
отступам, кеглю и скруглению, а фон на наведении образец в этом месте не красит вовсе —
|
|
78
|
+
полноширинная подсветка держалась два круга при верных числах.
|
|
63
79
|
- **Если сменилась версия пакета, который рисует вёрстку, экраны обходят руками.** Тесты
|
|
64
|
-
нажимают по
|
|
65
|
-
стала другой высоты: они проверяют переходы, а не вид. Пары
|
|
66
|
-
по очереди все экраны, которые этот пакет рисует.
|
|
67
|
-
- **Путей запуска
|
|
68
|
-
|
|
69
|
-
|
|
80
|
+
нажимают по `qa-dataid` и остаются зелёными, даже когда отступ съехал, размер пропал, а
|
|
81
|
+
строка стала другой высоты: они проверяют переходы, а не вид. Пары скриншотов тут тоже мало
|
|
82
|
+
— смотрят по очереди все экраны, которые этот пакет рисует.
|
|
83
|
+
- **Путей запуска здесь три, и проверять их надо порознь:** локальная команда, образ
|
|
84
|
+
`deploy/api.Dockerfile` и состав `docker-compose.prod.yml`. Переменная, заданная в команде
|
|
85
|
+
проверки, не говорит про образ ничего: в составе прода она есть, а ручной прогон того же
|
|
86
|
+
образа идёт без неё. Пути перечисляются до проверки, а не после того, как один из них
|
|
87
|
+
сошёлся.
|
|
@@ -2,33 +2,45 @@
|
|
|
2
2
|
name: component-structure
|
|
3
3
|
kind: rule
|
|
4
4
|
law: frontend-application
|
|
5
|
-
description: Правило под
|
|
5
|
+
description: Правило под «Закон о фронтовом приложении». Брать при правке любого *.component.ts и его шаблона. Называет порядок свойств декоратора, группировку импортов, договорённости шаблона и обязательный qa-dataid. Готовый код — в паттерне component-structure-new.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# Файл компонента —
|
|
8
|
+
# Файл компонента — как это устроено здесь
|
|
9
9
|
|
|
10
|
-
Правило под закон `
|
|
11
|
-
здесь — как устроен сам файл компонента и его шаблон.
|
|
12
|
-
|
|
13
|
-
`angular-patterns`, оформление — `styling-bem`, окружение браузера — `platform-access`, слой
|
|
10
|
+
Правило под закон `docs/constitution/frontend-application.md`. Закон говорит, что должно быть
|
|
11
|
+
верно; здесь — как устроен сам файл компонента и его шаблон. Состояние и потоки —
|
|
12
|
+
`angular-patterns`, стили — `styling-bem`, окружение браузера — `platform-access`, слой
|
|
14
13
|
обращения к серверу — `api-layer`. Все пять под одним законом.
|
|
15
14
|
|
|
16
|
-
##
|
|
15
|
+
## Как это называется здесь
|
|
17
16
|
|
|
18
|
-
|
|
17
|
+
| В законе | Здесь |
|
|
18
|
+
| ---------------------------------- | ---------------------------------------------------------------------------- |
|
|
19
|
+
| компонент | `vm-<имя>` — префикс один на сайт и админку |
|
|
20
|
+
| готовое, а не вычисление в шаблоне | `computed()`; там, где значение приходит из контекста шаблона, — чистый пайп |
|
|
21
|
+
| якорь для проверки | атрибут `qa-dataid` в kebab-case по смыслу элемента |
|
|
22
|
+
| корень разметки | `:host` с классом блока от `host: { class: 'vm-<имя>' }` |
|
|
19
23
|
|
|
20
|
-
##
|
|
24
|
+
## Где это лежит
|
|
21
25
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
В этом дереве — таблица в `implementation.md` рядом. Пути живут там, а не здесь: правило
|
|
27
|
+
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
28
|
+
же дереве, которое держит код иначе.
|
|
29
|
+
|
|
30
|
+
## Как закон применяется здесь
|
|
31
|
+
|
|
32
|
+
- **Шаблон не зовёт методов.** Правило линтера банит `{{ getTotal() }}` и `@if
|
|
33
|
+
(computeFlag())`, чтения сигналов не трогает.
|
|
34
|
+
- **Каждый интерактивный элемент несёт `qa-dataid`.** Это единственный якорь спек: классы BEM
|
|
35
|
+
меняются вместе с вёрсткой, а поиск по роли и тексту ломается на локалях перевода.
|
|
28
36
|
- **Класс блока висит на хосте, а не на обёртке внутри шаблона.** Лишняя обёртка вокруг всех
|
|
29
|
-
детей — это раскладка, и ей место на
|
|
30
|
-
|
|
31
|
-
|
|
37
|
+
детей — это раскладка, и ей место на `:host`.
|
|
38
|
+
|
|
39
|
+
## Чего из закона здесь нет
|
|
40
|
+
|
|
41
|
+
Порядок свойств декоратора, группировку импортов и самозакрывающиеся теги не проверяет ничто —
|
|
42
|
+
они держатся чтением соседнего файла. Проверки на прямое обращение к окружению браузера тоже
|
|
43
|
+
нет — это `Q-FA-1` в законе.
|
|
32
44
|
|
|
33
45
|
## Паттерны
|
|
34
46
|
|
|
@@ -36,13 +48,17 @@ description: Правило под закон «Фронтовое прилож
|
|
|
36
48
|
|
|
37
49
|
## Ловушки
|
|
38
50
|
|
|
39
|
-
-
|
|
40
|
-
|
|
41
|
-
полная навигация с перезагрузкой. Прокрутка
|
|
42
|
-
|
|
51
|
+
- **`href="#id"` в разметке не работает.** Сборка одна на все локали, в разметке стоит
|
|
52
|
+
`<base href="/">`, и браузер разрешает фрагмент относительно базы: вместо прокрутки
|
|
53
|
+
получается полная навигация с перезагрузкой. Прокрутка — через роутер:
|
|
54
|
+
`<a [routerLink]="[]" fragment="booking">`.
|
|
55
|
+
- **Один и тот же компонент в обеих ветках `@if` — это условная привязка.** Две ветки с
|
|
43
56
|
разными входами пересоздают компонент и теряют его состояние.
|
|
44
|
-
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
-
|
|
48
|
-
|
|
57
|
+
- **Кит, который рисуется в оверлее, из хоста вызывающего не адресуется:** его разметка лежит
|
|
58
|
+
вне хоста, и `[qa-dataid="x"] button` до кнопок не дотянется. Такие кнопки носят собственные
|
|
59
|
+
якоря прямо в шаблоне кита, а гард каталог зависимостей не проверяет.
|
|
60
|
+
- **`qa-dataid` не заменяет `aria-label` и роли:** доступность отдельно, якорь отдельно. И не
|
|
61
|
+
снимается при правке вёрстки — на него завязаны спеки.
|
|
62
|
+
- Готовое из кита не пишется заново: своя разметка с `role="alert"`, `<table>`,
|
|
63
|
+
`role="dialog"`, `role="tablist"` или `role="tooltip"` означает, что мимо `<префикс>-message`,
|
|
64
|
+
`<префикс>-table`, `<префикс>-dialog`, `<префикс>-tabs` или `<префикс>-tooltip` прошли. Правило целиком — `reuse-first`.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dependencies
|
|
3
|
+
kind: rule
|
|
4
|
+
law: delivery
|
|
5
|
+
description: Правило под «Закон о поставке». Брать при правке package.json, pnpm-lock.yaml и pnpm-workspace.yaml и при обновлении любого пакета. Называет точный номер версии вместо диапазона, снимок дерева, подмену чужих версий, выдержку новой версии и границу переформатирования после обновления форматтера. Готовый порядок — в паттерне dependencies-upgrade.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Зависимости — как это устроено здесь
|
|
9
|
+
|
|
10
|
+
Правило под закон `docs/constitution/delivery.md`. Закон говорит, что должно быть верно;
|
|
11
|
+
здесь — чем это названо в этом дереве, где лежит и что из закона у нас не применяется. Ветка,
|
|
12
|
+
коммит и выкатка под тем же законом — правило `git-workflow`.
|
|
13
|
+
|
|
14
|
+
## Как это называется здесь
|
|
15
|
+
|
|
16
|
+
| В законе | Здесь |
|
|
17
|
+
| ---------------------------- | -------------------------------------------------------------------------------------------------- |
|
|
18
|
+
| объявление зависимости | точный номер в `package.json` — `"prettier": "3.9.6"`; `^` и `~` в файле не встречаются ни разу |
|
|
19
|
+
| снимок установленного дерева | `pnpm-lock.yaml`; едет тем же коммитом, что и объявление |
|
|
20
|
+
| подмена чужой версии | `overrides` в `pnpm-workspace.yaml` — там лежат подменённые транзитивные зависимости |
|
|
21
|
+
| выдержка новой версии | `minimumReleaseAge`; пакет, нужный раньше срока, выписывается номером в `minimumReleaseAgeExclude` |
|
|
22
|
+
| менеджер пакетов | pnpm: `npm run` зовёт скрипты, установку делает `pnpm install` |
|
|
23
|
+
|
|
24
|
+
## Где это лежит
|
|
25
|
+
|
|
26
|
+
В этом дереве — таблица в `implementation.md` рядом. Пути живут там, а не здесь: правило
|
|
27
|
+
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
28
|
+
же дереве, которое держит код иначе.
|
|
29
|
+
|
|
30
|
+
## Как закон применяется здесь
|
|
31
|
+
|
|
32
|
+
- **Версия пакета записана точным номером.** Из диапазона сегодня и через неделю поставится
|
|
33
|
+
разное, и откат правки это не исправит.
|
|
34
|
+
- **Подменённые версии чужих зависимостей собраны в один список, и его пересматривают при
|
|
35
|
+
каждом обновлении.** Подмена, оставшаяся в списке после того, как основной пакет подняли,
|
|
36
|
+
незаметно откатывает его зависимость назад.
|
|
37
|
+
- **Свежая версия сначала выдерживается, а нужная раньше срока выписывается отдельно.** Иначе
|
|
38
|
+
выпуск, который автор успел отозвать, попадёт в снимок.
|
|
39
|
+
- **Переформатируется только то, чьё форматирование проверяет линтер.** Обновлённый форматтер
|
|
40
|
+
меняет все файлы, до которых дотянется, а `.md` и `.json` здесь не проверяет никто: правка в
|
|
41
|
+
них — просто шум, который придётся читать глазами.
|
|
42
|
+
|
|
43
|
+
## Чего из закона здесь нет
|
|
44
|
+
|
|
45
|
+
Никто не сверяет, что объявленные версии совпадают со снимком: `--frozen-lockfile` стоит
|
|
46
|
+
только в выкатке, а она идёт от пуша в главную ветку, то есть уже после мержа. Диапазоны тоже
|
|
47
|
+
не проверяются: один `^` в `package.json` пройдёт все проверки дерева.
|
|
48
|
+
|
|
49
|
+
## Паттерны
|
|
50
|
+
|
|
51
|
+
- `dependencies-upgrade` — подъём версий, выбор верхней границы, разбор последствий обновления.
|
|
52
|
+
|
|
53
|
+
## Ловушки
|
|
54
|
+
|
|
55
|
+
- **Диапазон пропускает версию, которой в реестре нет.** В объявление кита записали `^0.2.0`,
|
|
56
|
+
а снимок остался на прежней версии: объявление выглядело верным, но всё собиралось на 0.1.0,
|
|
57
|
+
где нужного размера у компонента нет вовсе, и главная ветка перестала собираться. Нашли это
|
|
58
|
+
через две недели — когда понадобилось дерево для сравнения, а сравнивать оказалось не с чем.
|
|
59
|
+
- **Верхнюю границу задают peer-диапазоны, а не последний номер в реестре.** TypeScript
|
|
60
|
+
остался на 6.0.3 при вышедшей седьмой версии, потому что Angular объявляет `>=6.0 <6.1`.
|
|
61
|
+
`pnpm install` такую ошибку не ловит: `autoInstallPeers` молча доставляет недостающее.
|
|
62
|
+
- **После обновления плагина линтера появляются правила, которых вчера не было.** eslint 10
|
|
63
|
+
добавил `no-useless-assignment`, `eslint-plugin-playwright` 2 — сразу три правила. Замечания
|
|
64
|
+
приходят на файлы, которых правка не касалась, и выглядят её последствиями.
|
|
65
|
+
- Прогон тестов после обновления — правило `testing`: после смены версии Playwright браузер
|
|
66
|
+
надо поставить заново, и это не регрессия.
|