@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,64 +2,103 @@
|
|
|
2
2
|
name: spec-driven
|
|
3
3
|
kind: rule
|
|
4
4
|
law: project-documentation
|
|
5
|
-
description: Правило под
|
|
5
|
+
description: Правило под «Закон о документации проекта». Брать при правке docs/specs/**, docs/constitution/** и любого скила в .claude/skills. Называет три слоя — закон, правило, паттерн, — обязательные разделы, привязку к коду и связь сценариев с тестами. Готовый порядок действий — в паттернах spec-driven-domain и spec-driven-rule.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# Документация проекта —
|
|
8
|
+
# Документация проекта — как это устроено здесь
|
|
9
9
|
|
|
10
|
-
Правило под закон `
|
|
11
|
-
про тексты; здесь — из каких слоёв они сложены и что сверяет машина.
|
|
12
|
-
|
|
13
|
-
`doc-style` под тем же законом.
|
|
10
|
+
Правило под закон `docs/constitution/project-documentation.md`. Закон говорит, что должно
|
|
11
|
+
быть верно про тексты; здесь — из каких слоёв они сложены в этом дереве и что сверяет машина.
|
|
12
|
+
Формулировки — правило `doc-style` под тем же законом.
|
|
14
13
|
|
|
15
|
-
##
|
|
16
|
-
|
|
17
|
-
Правка закона, правила, паттерна или спека домена. Заведение нового слоя документации.
|
|
18
|
-
|
|
19
|
-
## Как сложены слои
|
|
14
|
+
## Как это называется здесь
|
|
20
15
|
|
|
21
16
|
```
|
|
22
|
-
ЗАКОН
|
|
23
|
-
|
|
24
|
-
ни путей, ни имён файлов, ни привязок
|
|
17
|
+
ЗАКОН docs/constitution/<закон>.md — верен для любого приложения этого класса
|
|
18
|
+
docs/constitution/application/<закон>.md — закон приложения: деньги, локали, доступ
|
|
19
|
+
о проекте не знает ничего: ни путей, ни имён файлов, ни привязок
|
|
25
20
|
|
|
26
|
-
├─ ПРАВИЛО
|
|
27
|
-
│
|
|
28
|
-
│
|
|
21
|
+
├─ ПРАВИЛО .claude/skills/<правило>/SKILL.md (kind: rule, law: <закон>)
|
|
22
|
+
│ привязывает закон к этому проекту; несколько правил на закон
|
|
23
|
+
│ .claude/skills/<правило>/implementation.md — привязка к коду
|
|
29
24
|
│
|
|
30
|
-
│ └─ ПАТТЕРН
|
|
25
|
+
│ └─ ПАТТЕРН .claude/skills/<правило>-<что>/SKILL.md (kind: pattern, rule: <правило>)
|
|
31
26
|
│ готовый код и конкретные приёмы; минимум один на правило
|
|
32
27
|
│
|
|
33
|
-
└─ СПЕК ДОМЕНА
|
|
28
|
+
└─ СПЕК ДОМЕНА docs/specs/<домен>/
|
|
29
|
+
как работает домен; объявляет законы, которые применяет
|
|
30
|
+
|
|
31
|
+
СКИЛ БЕЗ ЗАКОНА .claude/skills/<имя>/SKILL.md (ни kind: rule, ни kind: pattern)
|
|
32
|
+
стоит рядом с лестницей, а не в ней: он не про то, что должно быть
|
|
33
|
+
верно в продукте, а про то, как здесь делается работа
|
|
34
34
|
```
|
|
35
35
|
|
|
36
36
|
Ссылки идут только снизу вверх: закон не ссылается ни на правило, ни на спек, ни на файл.
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
Скил без закона — третий случай, и он законный. Витрина, генератор, работа с чужим сервисом,
|
|
39
|
+
заведение самого скила: над таким нет утверждения о продукте, а значит нет и закона. Выдумывать
|
|
40
|
+
ему закон, чтобы уложить в лестницу, нельзя — закон, у которого одно правило и ни одной статьи о
|
|
41
|
+
продукте, разъезжается с остальными при первой же правке. Как такой скил заводится — скил
|
|
42
|
+
`write-a-skill`.
|
|
43
|
+
|
|
44
|
+
| В законе | Здесь |
|
|
45
|
+
| ------------------------------- | ---------------------------------------------------------------------------------------------------- |
|
|
46
|
+
| набор разделов | `REQUIRED_HEADINGS` для спека, «Статьи» для закона |
|
|
47
|
+
| утверждение документа | пункт `## Правила` в спеке, `## Статьи` в законе, `## Как закон применяется здесь` в правиле |
|
|
48
|
+
| место, где оно исполняется | строка в `implementation.md` рядом: `` `файл:символ` `` |
|
|
49
|
+
| обещанное поведение | сценарий `SC-<ПРЕФИКС>-<НОМЕР>` в `docs/specs/<домен>/scenarios.md` |
|
|
50
|
+
| открытый вопрос | `Q-N` — на него ссылаются из задачи на борде и из коммитов; номер после закрытия не переиспользуется |
|
|
51
|
+
| законы, которые применяет домен | строка `**Законы:**` в шапке спека, именами в кавычках |
|
|
52
|
+
|
|
53
|
+
## Где это лежит
|
|
54
|
+
|
|
55
|
+
В этом дереве — таблица в `implementation.md` рядом. Пути живут там, а не здесь: правило
|
|
56
|
+
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
57
|
+
же дереве, которое держит код иначе.
|
|
58
|
+
|
|
59
|
+
## Как закон применяется здесь
|
|
39
60
|
|
|
40
61
|
- **Набор разделов спека задан заранее, и отсутствие раздела — отказ.** «Не применимо» —
|
|
41
|
-
законный ответ, отсутствие раздела — нет: сквозные требования вспоминаются постфактум
|
|
42
|
-
тогда, когда для них не заведено места.
|
|
43
|
-
- **Каждое утверждение привязано к месту в коде, и связь сверяется в обе стороны.** Ключ
|
|
44
|
-
— сам текст утверждения, поэтому переформулировать его, забыв про привязку, нельзя.
|
|
62
|
+
законный ответ, отсутствие раздела — нет: сквозные требования вспоминаются постфактум
|
|
63
|
+
именно тогда, когда для них не заведено места.
|
|
64
|
+
- **Каждое утверждение привязано к месту в коде, и связь сверяется в обе стороны.** Ключ
|
|
65
|
+
связи — сам текст утверждения, поэтому переформулировать его, забыв про привязку, нельзя.
|
|
45
66
|
- **Привязка не ведёт в код, который никто не зовёт.** Символ, объявленный в своём файле и
|
|
46
67
|
больше нигде не встречающийся, местом исполнения не считается.
|
|
47
|
-
- **Таблица
|
|
48
|
-
|
|
49
|
-
- **Код отказа принимается, только если он в домене бросается.**
|
|
50
|
-
|
|
68
|
+
- **Таблица процедур сверяется с декораторами в обе стороны.** Иначе процедура, которую домен
|
|
69
|
+
обслуживает, но забыл описать, видна только в декораторе.
|
|
70
|
+
- **Код отказа принимается, только если он в домене бросается.** Коды выписывались по
|
|
71
|
+
замыслу, и на одном пути обещанный отказ не бросал никто.
|
|
51
72
|
- **Префикс сценариев в домене один.** Второй префикс означает, что домен описан дважды.
|
|
52
|
-
- **У закона обязателен раздел
|
|
53
|
-
доводов о выбранном когда-то варианте в законе нет: историю держит система
|
|
54
|
-
довод с отвергнутой альтернативой — свойство работы, и место ему в
|
|
73
|
+
- **У закона обязателен раздел «Статьи», а кроме них он держит только открытые вопросы.**
|
|
74
|
+
Истории правок и доводов о выбранном когда-то варианте в законе нет: историю держит система
|
|
75
|
+
контроля версий, а довод с отвергнутой альтернативой — свойство работы, и место ему в
|
|
76
|
+
«Ловушках» правила. Закрытый вопрос из закона уходит, а пустой раздел ради заголовка
|
|
77
|
+
проверку всё равно проходил.
|
|
55
78
|
- **Закон, назвавший файл проекта, — отказ.** Путям и привязкам место в правиле: иначе закон
|
|
56
79
|
нельзя ни прочитать без знания дерева, ни применить на другом приложении.
|
|
57
80
|
- **Правило объявляет закон, под который написано.** Правило без закона — набор приёмов, из
|
|
58
81
|
которого не видно, что именно должно быть верно.
|
|
82
|
+
- **Слоёв законов два, а имя закона одно на оба.** Общий лежит в корне конституции, закон
|
|
83
|
+
приложения — в `application/`; ни `law:`, ни `**Законы:**` слоя не называют, поэтому имена
|
|
84
|
+
законов уникальны по всему дереву конституции.
|
|
59
85
|
- **Спек объявляет законы, которые применяет, и связь сверяется в обе стороны.** Закон,
|
|
60
|
-
названный в тексте спека, обязан стоять в
|
|
86
|
+
названный в тексте спека, обязан стоять в шапке: иначе по закону не узнать, какие домены
|
|
61
87
|
на нём стоят.
|
|
62
88
|
|
|
89
|
+
## Чего из закона здесь нет
|
|
90
|
+
|
|
91
|
+
Закон, которого не применяет ни один спек, отказом не считается: законы про устройство кода,
|
|
92
|
+
поставку и проверяемость доменов не касаются вовсе. Порядок «сначала описание, потом код»
|
|
93
|
+
держится договорённостью — это `Q-PD-3` в законе.
|
|
94
|
+
|
|
95
|
+
Таблицы состояний экрана не сверяются ничем. `check:specs` знает сценарии против заголовков
|
|
96
|
+
тестов, правила против якорей, процедуры против декораторов и коды отказа против бросков —
|
|
97
|
+
строка таблицы состояний не привязана ни к чему и проходит зелёной, даже когда код в
|
|
98
|
+
названное состояние не попадает. Состояние «проверка не загрузилась» стояло в таблицах двух
|
|
99
|
+
доменов раньше, чем код научился в него приходить, и всё это время читалось описанием
|
|
100
|
+
работающего.
|
|
101
|
+
|
|
63
102
|
## Паттерны
|
|
64
103
|
|
|
65
104
|
- `spec-driven-domain` — заведение и правка спека домена, сценарии, привязка.
|
|
@@ -67,23 +106,30 @@ description: Правило под закон «Документация про
|
|
|
67
106
|
|
|
68
107
|
## Ловушки
|
|
69
108
|
|
|
70
|
-
-
|
|
109
|
+
- **`tasks.md` в спеке не заводить.** Шаги — артефакт сессии, им место в ветке или в описании
|
|
71
110
|
PR. Как только в директории появляются «шаги», спек снова становится планом и умирает после
|
|
72
|
-
|
|
111
|
+
мержа.
|
|
73
112
|
- **Спек описывает установившееся, а не предстоящее.** Единственное место, где он говорит о
|
|
74
|
-
будущем, —
|
|
75
|
-
|
|
76
|
-
- **Семантику полей не сверяет ничто.** Проверка знает имена
|
|
77
|
-
сценариев с тестами; что означает пустое поле — не знает.
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
113
|
+
будущем, — `proposed/<фича>/`. После выкатки его текст вливается в спек домена, директория
|
|
114
|
+
удаляется, идентификаторы сценариев не меняются.
|
|
115
|
+
- **Семантику полей не сверяет ничто.** Проверка знает имена процедур, коды отказа и связь
|
|
116
|
+
сценариев с тестами; что означает пустое поле — не знает. Правка `.proto` поэтому тянет
|
|
117
|
+
спеки всех доменов, чьи процедуры она задела, в той же ветке.
|
|
118
|
+
- **Живость символа считается совпадением имени по всему дереву, а не вызовом.** Символу
|
|
119
|
+
хватает второго упоминания где угодно — в чужом поле с тем же именем, в атрибуте разметки.
|
|
120
|
+
Место, где правило исполняется на самом деле, подтверждается только чтением кода.
|
|
121
|
+
- **Якорь в `tools/*.mjs` сверяется почти ничем:** живость считается только для `.ts`, а
|
|
122
|
+
исходники обходятся по `apps`, `libs` и `prisma`. Правило, привязанное к проверке, поэтому
|
|
123
|
+
читается вместе с её телом.
|
|
124
|
+
- **Зелёная проверка не значит, что структура верна.** Спутники с привязкой сначала лежали
|
|
125
|
+
рядом с законами, и проверка была зелёной именно потому, что структура совпадала с тем,
|
|
126
|
+
чего проверка сама и ждала.
|
|
127
|
+
- **Конфликт мержа в спеке разрешается сохранением обеих сторон, а не выбором одной.** Две
|
|
128
|
+
ветки дописывают в конец одних и тех же списков — сценариев, правил, строк привязки, — и
|
|
129
|
+
обе стороны верны: конфликт здесь не спор, а две дописи в одно место. Номера сценариев при
|
|
130
|
+
разрешении не пересчитываются: идентификатор — ключ связи с тестами, и сдвиг номеров рвёт
|
|
131
|
+
сверку у соседей, которых правка не касалась. Порядок сохранённых сторон держится
|
|
132
|
+
одинаковым в `spec.md`, `scenarios.md` и `implementation.md`: иначе правило, его сценарий и
|
|
133
|
+
его привязка перестают находиться друг по другу. После разрешения гоняется
|
|
134
|
+
`npm run check:specs` — конфликт в спеке кода не задевает, и ни сборка, ни линтеры его не
|
|
135
|
+
увидят.
|
|
@@ -2,58 +2,73 @@
|
|
|
2
2
|
name: styling-bem
|
|
3
3
|
kind: rule
|
|
4
4
|
law: frontend-application
|
|
5
|
-
description: Правило под
|
|
5
|
+
description: Правило под «Закон о фронтовом приложении». Брать при правке любого *.scss и шаблона компонента. Называет директивы BEM, токены оформления, общий слой раскладки приложения и проверку класса без правила. Готовый код — в паттернах styling-bem-layout и styling-bem-component.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# Оформление —
|
|
8
|
+
# Оформление — как это устроено здесь
|
|
9
9
|
|
|
10
|
-
Правило под закон `
|
|
11
|
-
здесь —
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
серверу — `api-layer`. Все пять под одним законом.
|
|
10
|
+
Правило под закон `docs/constitution/frontend-application.md`. Закон говорит, что должно быть
|
|
11
|
+
верно; здесь — чем это названо в этом дереве и где лежит. Раскладка файла компонента —
|
|
12
|
+
`component-structure`, состояние — `angular-patterns`, окружение браузера —
|
|
13
|
+
`platform-access`, слой обращения к серверу — `api-layer`. Все пять под одним законом.
|
|
15
14
|
|
|
16
|
-
##
|
|
15
|
+
## Как это называется здесь
|
|
17
16
|
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
| В законе | Здесь |
|
|
18
|
+
| ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
19
|
+
| общий набор значений оформления | шкалы кита `--rt-*`; своё поверх них — `--vm-*` в `styles.scss` приложения |
|
|
20
|
+
| класс в разметке | директивы `rtBlock` и `rtElem` из `@rt-tools`, а не строка в атрибуте |
|
|
21
|
+
| правило стилей | объявление `&__<элемент>` в `.scss` — своём или в общем слое приложения |
|
|
22
|
+
| общий слой раскладки | `apps/<app>/src/styles/`: `<префикс>-page`, `<префикс>-form`, `<префикс>-panel`, `<префикс>-window` у админки, `<префикс>-site-page` у сайта |
|
|
20
23
|
|
|
21
|
-
##
|
|
24
|
+
## Где это лежит
|
|
22
25
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
В этом дереве — таблица в `implementation.md` рядом. Пути живут там, а не здесь: правило
|
|
27
|
+
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
28
|
+
же дереве, которое держит код иначе.
|
|
29
|
+
|
|
30
|
+
## Как закон применяется здесь
|
|
31
|
+
|
|
32
|
+
- **Оформление берётся токеном `--rt-*`, а не пишется значением на месте.** Составные
|
|
33
|
+
значения — `box-shadow`, `text-shadow` — берутся готовым токеном целиком, а не собираются
|
|
34
|
+
из частей.
|
|
35
|
+
- **У каждого класса элемента есть своё правило стилей.** Класс без правила выглядит рабочим
|
|
36
|
+
и молча ничего не делает.
|
|
37
|
+
- **Класс ставится директивой, а не строкой в атрибуте.** Имя блока `rtElem` получает
|
|
38
|
+
инъекцией от ближайшего предка с `rtBlock`, и повторить этот разбор по тексту шаблона нечем.
|
|
30
39
|
- **Раскладка объявлена в общем слое приложения, а не в стилях экрана.** У компонента экрана
|
|
31
|
-
файл стилей по умолчанию пустой.
|
|
32
|
-
- **Предупреждение
|
|
33
|
-
|
|
40
|
+
вне кита файл стилей по умолчанию пустой.
|
|
41
|
+
- **Предупреждение stylelint роняет прогон наравне с ошибкой.** `!important` объявлен
|
|
42
|
+
предупреждением, а прогон идёт с `--max-warnings 0`: иначе запрет читается как пожелание —
|
|
43
|
+
два таких предупреждения лежали в дереве, а `npm run stylelint` возвращал ноль и гейтом не был.
|
|
44
|
+
|
|
45
|
+
## Чего из закона здесь нет
|
|
46
|
+
|
|
47
|
+
Проверка «класс без правила» считает совпадение по имени элемента, а не по паре «блок —
|
|
48
|
+
элемент»: класс, у которого правило есть, но у чужого блока, она пропускает. Обратное
|
|
49
|
+
направление — снятие правила у живого класса — не проверяется вовсе и ловится чтением шаблона.
|
|
34
50
|
|
|
35
51
|
## Паттерны
|
|
36
52
|
|
|
37
53
|
- `styling-bem-layout` — экран на общем слое раскладки, блоки приложения.
|
|
38
|
-
- `styling-bem-component` — стили компонента
|
|
54
|
+
- `styling-bem-component` — стили компонента кита, `:host`, модификаторы, язык оформления сайта.
|
|
39
55
|
|
|
40
56
|
## Ловушки
|
|
41
57
|
|
|
42
|
-
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
-
|
|
52
|
-
|
|
53
|
-
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
- **Комментарии-выключатели линтера стилей не ставятся.** Селекторы объединяются вложенностью.
|
|
58
|
+
- **`rtElem` без предка с `rtBlock` роняет отрисовку в рантайме** — сборка и линт молчат.
|
|
59
|
+
- **`rtBlock` на `<ng-container>` класса не ставит вовсе:** узел это комментарий, и имя блока
|
|
60
|
+
он только объявляет потомкам. Класс блока экрана вешает хост через `host: { class: … }`.
|
|
61
|
+
- **`justify-content: center` во flex-контейнере с `overflow-x` уводит первые элементы за
|
|
62
|
+
нулевой скролл** — доскроллить до них невозможно. В прокручиваемых лентах —
|
|
63
|
+
`justify-content: safe center`.
|
|
64
|
+
- **`scrollbar-gutter: stable` на корне не заводить:** резерв под полосу прокрутки сужает
|
|
65
|
+
содержащий блок для `position: fixed`, и попап, выровненный по правому краю, встаёт на
|
|
66
|
+
ширину резерва левее своей кнопки.
|
|
67
|
+
- **`& + :host` невалиден:** изнутри компонента до соседнего хоста не дотянуться. Разделитель
|
|
68
|
+
между повторяющимися хостами — `:host(:not(:first-of-type))`.
|
|
69
|
+
- **`[attr.aria-disabled]` визуального состояния не даёт:** браузер стилизует `:disabled`, но
|
|
70
|
+
атрибуты `aria-*` — нет. К каждому `aria-disabled` заводится правило `[aria-disabled='true']`.
|
|
71
|
+
- **Гарнитуру с `body` элементы формы не наследуют:** браузер задаёт `button`, `input`,
|
|
72
|
+
`select` и `textarea` свой шрифт. Наследование включено глобально — сбрасывать его нельзя.
|
|
73
|
+
- **Комментарии-выключатели stylelint не ставятся.** Селекторы объединяются вложенностью.
|
|
59
74
|
- **При переносе стилей новых объявлений не появляется** — только перемещение существующих.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: task-flow
|
|
3
|
+
kind: rule
|
|
4
|
+
law: work-conduct
|
|
5
|
+
description: Правило под «Закон о ведении работы». Брать в начале любой работы от владельца, при правке docs/tasks/**, docs/specs/*/proposed/** и при возвращении к незаконченной задаче. Называет разбор просьбы до первой правки, папку задачи по имени ветки, договорённость о продукте до кода, шесть обязательных вопросов и разбор папки при закрытии. Готовый порядок — в паттернах task-flow-start, task-flow-resume и task-flow-close.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Ведение работы — как это устроено здесь
|
|
9
|
+
|
|
10
|
+
Правило под закон `docs/constitution/work-conduct.md`. Закон говорит, что должно быть верно
|
|
11
|
+
про ход работы; здесь — чем это названо в этом дереве, где лежит и что из закона у нас не
|
|
12
|
+
проверяется.
|
|
13
|
+
|
|
14
|
+
## Как это называется здесь
|
|
15
|
+
|
|
16
|
+
| В законе | Здесь |
|
|
17
|
+
| --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
|
|
18
|
+
| просьба владельца | то, с чего начинается работа; разбирается командой `/grill-me` до первой правки |
|
|
19
|
+
| понимание, записанное там, где идёт работа | `docs/tasks/<ветка>/grill.md` — просьба дословно, ответы владельца его словами, решения с доводами |
|
|
20
|
+
| замысел | `docs/tasks/<ветка>/plan.md` — след задачи и этапы с признаками готовности; после написания не правится |
|
|
21
|
+
| ход работы | `docs/tasks/<ветка>/progress.md` — «Где стоим», решения по ходу, записи заходов; единственное место, где отмечается сделанное |
|
|
22
|
+
| договорённость о продукте, записанная до кода | `docs/specs/<домен>/proposed/<фича>/` — спек фичи; переживает мерж и вливается в спек домена |
|
|
23
|
+
| работа шире одной ветки | файл в `docs/plans/`, один на линию работ: порядок задач и зависимости между ними |
|
|
24
|
+
| папка задачи до заведения задачи | `docs/tasks/_draft-<slug>/` — вне истории, пока номера нет |
|
|
25
|
+
| разведка | заход `Explore` или `general-purpose` до первого вопроса владельцу |
|
|
26
|
+
| разбор замысла ролями | `.claude/workflows/plan.js` — нужность, договорённость, критика, замысел |
|
|
27
|
+
|
|
28
|
+
## Где это лежит
|
|
29
|
+
|
|
30
|
+
В этом дереве — таблица в `implementation.md` рядом. Пути живут там, а не здесь: правило
|
|
31
|
+
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
32
|
+
же дереве, которое держит код иначе.
|
|
33
|
+
|
|
34
|
+
## Как закон применяется здесь
|
|
35
|
+
|
|
36
|
+
- **Правка кода приложения отбивается, пока на диске нет замысла.** Гард требует папку задачи
|
|
37
|
+
по имени ветки, `plan.md` в ней и названную в его шапке договорённость о продукте.
|
|
38
|
+
- **Договорённость требуется по путям правки, а не по оценке задачи.** `apps/**` и `libs/**`
|
|
39
|
+
— признак; правила, тексты, обвязка и зависимости под него не подпадают. Обход — строка
|
|
40
|
+
`**Поведение:** не меняется — <причина владельца>` в замысле; пустая причина не
|
|
41
|
+
принимается.
|
|
42
|
+
- **Состояние незаконченной работы приходит в контекст на запуске сессии.** Замысел и ход
|
|
43
|
+
работы отдаются целиком, разбор просьбы — путём. Ветка вида `<КЛЮЧ>-*` без папки даёт
|
|
44
|
+
предупреждение с готовой командой, но сессию не рвёт.
|
|
45
|
+
- **Сделанное отмечается только в ходе работы.** «Где стоим» перезаписывается каждым заходом,
|
|
46
|
+
а не дописывается: это первое, что читает следующий заход.
|
|
47
|
+
- **Папка задачи заводится черновиком и получает номер командой.** До конца разбора
|
|
48
|
+
неизвестно, сколько задач из него выйдет, поэтому номер не может быть первым;
|
|
49
|
+
`npm run task:new` переименовывает черновик и проставляет шапку замысла.
|
|
50
|
+
- **Брошенный разбор виден.** Черновик старше недели перечисляет сверка очереди работ —
|
|
51
|
+
задачи за ним ещё нет, и спросить о нём некого.
|
|
52
|
+
- **Договорённость вливается в спек домена последним коммитом отчёта.** К этому моменту код
|
|
53
|
+
написан, привязки известны, и в главной ветке директория `proposed/` не появляется вовсе.
|
|
54
|
+
Готовые к вливанию перечисляет `npm run check:specs`.
|
|
55
|
+
- **Папка закрытой задачи разбирается, а не переносится целиком.** В `docs/archive/` уезжает
|
|
56
|
+
то, что объясняет состоявшееся решение; остальное удаляется. Неразобранную ловит сверка
|
|
57
|
+
очереди работ.
|
|
58
|
+
|
|
59
|
+
## Чего из закона здесь нет
|
|
60
|
+
|
|
61
|
+
Полноту записанного понимания не проверяет ничто, и проверки на неё не будет: машине видно
|
|
62
|
+
наличие записи, но не то, что в ней закрыты все пробелы. Разбор из одной строки проходит гард
|
|
63
|
+
так же, как разбор на сто. То же с вопросом, который стоило задать и не задали, — он не
|
|
64
|
+
оставляет следа. Оба разобраны решениями в законе: судит владелец.
|
|
65
|
+
|
|
66
|
+
Гард судит по путям правки, а не по тому, меняет ли работа поведение на самом деле.
|
|
67
|
+
Рефакторинг, снаружи не видный, упирается в требование договорённости и проходит обходом с
|
|
68
|
+
причиной. Своего признака рефакторингу не заводится: оценку «поведение не меняется»
|
|
69
|
+
назначал бы тот, кому она мешает.
|
|
70
|
+
|
|
71
|
+
Ничто из самого разбора не проверяется, и всё это держится памятью того, кто его ведёт.
|
|
72
|
+
Разговор с владельцем инструментом не является — гард видит правку файла и ничего не знает
|
|
73
|
+
ни о том, была ли разведка до первого вопроса, ни о том, задан ли каждый из шести
|
|
74
|
+
обязательных вопросов, ни о том, ответил ли на них владелец. Образец разбора перечисляет их
|
|
75
|
+
таблицей, но пустая таблица проходит так же, как заполненная.
|
|
76
|
+
|
|
77
|
+
Неизменность замысла не стережёт ничто: `plan.md` правится тем же инструментом, что и
|
|
78
|
+
остальные тексты, и правка по ходу отличима от первоначальной записи только по истории.
|
|
79
|
+
Держится это тем же, чем и порядок разбора.
|
|
80
|
+
|
|
81
|
+
Разбор папки при закрытии не проверяется по существу: сверка очереди работ видит, что папка
|
|
82
|
+
закрытой задачи лежит на месте, но не судит, что из неё стоило увезти в архив.
|
|
83
|
+
|
|
84
|
+
## Паттерны
|
|
85
|
+
|
|
86
|
+
- `task-flow-start` — разведка, разбор, договорённость, замысел, задача и ветка.
|
|
87
|
+
- `task-flow-resume` — возвращение к незаконченной работе новым заходом.
|
|
88
|
+
- `task-flow-close` — вливание договорённости, разбор папки, переезд в архив.
|
|
89
|
+
|
|
90
|
+
## Ловушки
|
|
91
|
+
|
|
92
|
+
- **Папка называется именем ветки, один в один.** Хук запуска ищет её по
|
|
93
|
+
`git branch --show-current`, и папка, названная иначе, не находится ничем: работа идёт с
|
|
94
|
+
пустым контекстом, а владельца просят пересказать то, что уже записано.
|
|
95
|
+
- **Разбор просьбы задним числом не переписывается.** Пересказ незаметно подгоняется под уже
|
|
96
|
+
сделанное, и сверять результат становится не с чем. Решение, изменённое по ходу, дописывается
|
|
97
|
+
в ход работы, а не правится в разборе.
|
|
98
|
+
- **Договорённость о продукте не кладётся в папку задачи.** Папка умирает с мержем, а
|
|
99
|
+
договорённость обязана его пережить: её сценарии получают номера в общей нумерации домена,
|
|
100
|
+
и на них ссылаются заголовки тестов. Обратное тоже верно — ход работы не кладётся в
|
|
101
|
+
`proposed/`: спек, в котором завелись шаги, снова становится планом и умирает после мержа.
|
|
102
|
+
- **Меню вариантов на разборе годится только для выбора значения из закрытого набора.** Пока
|
|
103
|
+
постановка вопроса не подтверждена, спрашивается прозой: у меню нет строки «вопрос не тот».
|
|
104
|
+
Выбор слова, имени и термина узким вопросом не является никогда.
|
|
105
|
+
- **Субагент вопросов владельцу не задаёт.** Ни роли, ни конвейер до него не достучатся —
|
|
106
|
+
они возвращают текст главному агенту. Поэтому разбор ведёт главный агент, а роли стоят по
|
|
107
|
+
обе стороны от него.
|
|
108
|
+
- **Слово для нового понятия берётся из `docs/GLOSSARY.md` или заводится там же.** Третий файл
|
|
109
|
+
папки задачи называется `progress.md`, а не `journal.md`, ровно поэтому: журнал в этом
|
|
110
|
+
дереве один, и он другой.
|