@rt-tools/agent-kit 0.3.0 → 0.5.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.
Files changed (202) hide show
  1. package/README.md +194 -30
  2. package/assets/agents/business-analyst.md +74 -0
  3. package/assets/agents/project-manager.md +70 -0
  4. package/assets/agents/qa-engineer.md +72 -0
  5. package/assets/agents/skill-curator.md +110 -0
  6. package/assets/agents/spec-critic.md +44 -0
  7. package/assets/agents/spec-writer.md +50 -0
  8. package/assets/checks/board.github.mjs +329 -0
  9. package/assets/checks/check-board.github.mjs +181 -0
  10. package/assets/checks/check-doc-paths.mjs +163 -0
  11. package/assets/checks/check-dupes.mjs +277 -0
  12. package/assets/checks/check-lib-layers.mjs +573 -0
  13. package/assets/checks/check-reuse.mjs +208 -0
  14. package/assets/checks/check-schema-drift.mjs +186 -0
  15. package/assets/checks/check-specs.mjs +1086 -0
  16. package/assets/checks/check-styles.mjs +109 -0
  17. package/assets/checks/rt-kit-checks.config.mjs +134 -0
  18. package/assets/checks/task-new.github.mjs +198 -0
  19. package/assets/commands/skill-curator.md +70 -0
  20. package/assets/defaults/gate-map.sh +106 -0
  21. package/assets/defaults/project.sh +204 -0
  22. package/assets/hooks/browser-device-id.sh +0 -0
  23. package/assets/hooks/browser-guard-device-id.sh +2 -1
  24. package/assets/hooks/browser-guard-no-asking.sh +27 -0
  25. package/assets/hooks/browser-guard-no-listing.sh +2 -1
  26. package/assets/hooks/browser-guard-no-other-drivers.sh +2 -1
  27. package/assets/hooks/browser-guard-require-select.sh +2 -1
  28. package/assets/hooks/commit-msg.sh +1 -1
  29. package/assets/hooks/constitution-index.sh +5 -4
  30. package/assets/hooks/dev-server-guard.sh +8 -6
  31. package/assets/hooks/docs-guard.sh +223 -37
  32. package/assets/hooks/git-guard-delivery.sh +171 -31
  33. package/assets/hooks/git-guard-main.sh +1 -0
  34. package/assets/hooks/git-guard-push-tests.sh +34 -13
  35. package/assets/hooks/glossary-load.sh +23 -0
  36. package/assets/hooks/grill-gate.sh +96 -0
  37. package/assets/hooks/lint-after-edit.sh +155 -30
  38. package/assets/hooks/qa-dataid-guard.sh +72 -32
  39. package/assets/hooks/reuse-first-guard.sh +105 -34
  40. package/assets/hooks/skill-gate-rearm.sh +1 -0
  41. package/assets/hooks/skill-gate.sh +75 -15
  42. package/assets/hooks/skill-loaded.sh +1 -0
  43. package/assets/hooks/sql-guard.sh +606 -56
  44. package/assets/hooks/task-context-load.sh +100 -0
  45. package/assets/hooks/task-flow-guard.sh +118 -0
  46. package/assets/laws/{access.md → application/access.md} +1 -4
  47. package/assets/laws/{locales.md → application/locales.md} +1 -3
  48. package/assets/laws/application/money.md +41 -0
  49. package/assets/laws/application/ownership.md +32 -0
  50. package/assets/laws/{search-visibility.md → application/search-visibility.md} +1 -1
  51. package/assets/laws/code-structure.md +7 -6
  52. package/assets/laws/delivery.md +53 -3
  53. package/assets/laws/entity-editing.md +49 -55
  54. package/assets/laws/entity-models.md +4 -14
  55. package/assets/laws/frontend-application.md +5 -5
  56. package/assets/laws/lib-imports.md +14 -1
  57. package/assets/laws/lists.md +33 -0
  58. package/assets/laws/navigation.md +40 -0
  59. package/assets/laws/project-documentation.md +27 -8
  60. package/assets/laws/reuse-first.md +26 -21
  61. package/assets/laws/shared-code.md +13 -1
  62. package/assets/laws/verifiability.md +30 -1
  63. package/assets/laws/work-conduct.md +59 -0
  64. package/assets/patterns/admin-lists-screen.md +131 -0
  65. package/assets/patterns/admin-nav-item.md +71 -0
  66. package/assets/patterns/angular-patterns-state.md +29 -22
  67. package/assets/patterns/api-layer-pair.md +40 -30
  68. package/assets/patterns/browser-verification-measure.md +41 -38
  69. package/assets/patterns/browser-verification-stand.md +106 -42
  70. package/assets/patterns/component-structure-new.md +33 -32
  71. package/assets/patterns/dependencies-upgrade.md +65 -0
  72. package/assets/patterns/doc-style-sweep.md +65 -28
  73. package/assets/patterns/doc-style-write.md +36 -33
  74. package/assets/patterns/entity-aside.md +136 -0
  75. package/assets/patterns/entity-models-new.md +124 -0
  76. package/assets/patterns/entity-store.md +91 -0
  77. package/assets/patterns/git-workflow-commit.azure.md +259 -0
  78. package/assets/patterns/git-workflow-commit.github.md +337 -0
  79. package/assets/patterns/git-workflow-commit.gitlab.md +283 -0
  80. package/assets/patterns/git-workflow-merge.md +42 -25
  81. package/assets/patterns/git-workflow-migration.md +61 -31
  82. package/assets/patterns/git-workflow-restart.md +20 -20
  83. package/assets/patterns/lib-layers-move.md +50 -32
  84. package/assets/patterns/lib-layers-new.md +41 -29
  85. package/assets/patterns/ownership-scope-resolve.md +69 -0
  86. package/assets/patterns/permissions-procedure.md +35 -33
  87. package/assets/patterns/platform-access-di.md +39 -25
  88. package/assets/patterns/pricing-quote.md +71 -0
  89. package/assets/patterns/reuse-first-extend.md +22 -22
  90. package/assets/patterns/seo-page.md +52 -40
  91. package/assets/patterns/seo-verify.md +48 -29
  92. package/assets/patterns/shared-code-new.md +37 -31
  93. package/assets/patterns/spec-driven-domain.md +60 -37
  94. package/assets/patterns/spec-driven-rule.md +55 -40
  95. package/assets/patterns/styling-bem-component.md +43 -32
  96. package/assets/patterns/styling-bem-layout.md +30 -24
  97. package/assets/patterns/task-flow-close.md +154 -0
  98. package/assets/patterns/task-flow-resume.md +94 -0
  99. package/assets/patterns/task-flow-start.md +129 -0
  100. package/assets/patterns/testing-e2e.md +53 -51
  101. package/assets/patterns/testing-unit.md +70 -46
  102. package/assets/patterns/translations-key.md +32 -19
  103. package/assets/patterns/ts-procedure.md +24 -25
  104. package/assets/rules/angular-patterns.md +50 -27
  105. package/assets/rules/api-layer.md +46 -28
  106. package/assets/rules/browser-verification.md +67 -48
  107. package/assets/rules/component-structure.md +43 -27
  108. package/assets/rules/dependencies.md +66 -0
  109. package/assets/rules/doc-style.md +95 -39
  110. package/assets/rules/entity-conventions.md +78 -0
  111. package/assets/rules/entity-models.md +70 -0
  112. package/assets/rules/git-workflow.azure.md +116 -0
  113. package/assets/rules/git-workflow.github.md +123 -0
  114. package/assets/rules/git-workflow.gitlab.md +113 -0
  115. package/assets/rules/lib-layers.md +56 -30
  116. package/assets/rules/lists.md +73 -0
  117. package/assets/rules/navigation.md +78 -0
  118. package/assets/rules/ownership-scope.md +63 -0
  119. package/assets/rules/permissions.md +43 -25
  120. package/assets/rules/platform-access.md +57 -29
  121. package/assets/rules/pricing.md +64 -0
  122. package/assets/rules/reuse-first.md +57 -43
  123. package/assets/rules/seo.md +51 -30
  124. package/assets/rules/shared-code.md +51 -26
  125. package/assets/rules/spec-driven.md +107 -51
  126. package/assets/rules/styling-bem.md +54 -39
  127. package/assets/rules/task-flow.md +150 -0
  128. package/assets/rules/testing.md +78 -47
  129. package/assets/rules/translations.md +48 -31
  130. package/assets/rules/typescript-conventions.md +57 -27
  131. package/assets/skills/agent-kit.md +85 -0
  132. package/assets/skills/write-a-skill.md +108 -0
  133. package/assets/templates/gate-map.sh +23 -15
  134. package/assets/templates/implementation.md +14 -8
  135. package/assets/templates/pattern.md +1 -1
  136. package/assets/templates/project.sh +32 -19
  137. package/assets/templates/rule.md +2 -2
  138. package/assets/variants.json +20 -0
  139. package/assets/workflows/feature.js +134 -0
  140. package/assets/workflows/plan.js +150 -0
  141. package/bin/agent-kit.d.ts.map +1 -1
  142. package/bin/agent-kit.js +78 -5
  143. package/bin/agent-kit.js.map +1 -1
  144. package/bin/prompt.d.ts +5 -0
  145. package/bin/prompt.d.ts.map +1 -1
  146. package/bin/prompt.js +19 -7
  147. package/bin/prompt.js.map +1 -1
  148. package/index.d.ts +1 -0
  149. package/index.d.ts.map +1 -1
  150. package/index.js +1 -0
  151. package/index.js.map +1 -1
  152. package/lib/assets.d.ts +8 -3
  153. package/lib/assets.d.ts.map +1 -1
  154. package/lib/assets.js +13 -3
  155. package/lib/assets.js.map +1 -1
  156. package/lib/catalog.d.ts +52 -5
  157. package/lib/catalog.d.ts.map +1 -1
  158. package/lib/catalog.js +104 -16
  159. package/lib/catalog.js.map +1 -1
  160. package/lib/commands.d.ts +22 -1
  161. package/lib/commands.d.ts.map +1 -1
  162. package/lib/commands.js +202 -14
  163. package/lib/commands.js.map +1 -1
  164. package/lib/companion.d.ts +5 -1
  165. package/lib/companion.d.ts.map +1 -1
  166. package/lib/companion.js +29 -2
  167. package/lib/companion.js.map +1 -1
  168. package/lib/config.d.ts +26 -9
  169. package/lib/config.d.ts.map +1 -1
  170. package/lib/config.js +41 -15
  171. package/lib/config.js.map +1 -1
  172. package/lib/freshness.d.ts +14 -0
  173. package/lib/freshness.d.ts.map +1 -0
  174. package/lib/freshness.js +116 -0
  175. package/lib/freshness.js.map +1 -0
  176. package/lib/hooks-map.d.ts +27 -0
  177. package/lib/hooks-map.d.ts.map +1 -0
  178. package/lib/hooks-map.js +77 -0
  179. package/lib/hooks-map.js.map +1 -0
  180. package/lib/integrity.d.ts +36 -0
  181. package/lib/integrity.d.ts.map +1 -0
  182. package/lib/integrity.js +44 -0
  183. package/lib/integrity.js.map +1 -0
  184. package/lib/picker.d.ts +11 -1
  185. package/lib/picker.d.ts.map +1 -1
  186. package/lib/picker.js +44 -6
  187. package/lib/picker.js.map +1 -1
  188. package/lib/sync.d.ts +26 -0
  189. package/lib/sync.d.ts.map +1 -1
  190. package/lib/sync.js +59 -4
  191. package/lib/sync.js.map +1 -1
  192. package/lib/variants.d.ts +44 -0
  193. package/lib/variants.d.ts.map +1 -0
  194. package/lib/variants.js +82 -0
  195. package/lib/variants.js.map +1 -0
  196. package/package.json +1 -1
  197. package/rt-tools-agent-kit-0.5.0.tgz +0 -0
  198. package/assets/laws/admin-lists.md +0 -35
  199. package/assets/laws/admin-navigation.md +0 -38
  200. package/assets/patterns/git-workflow-commit.md +0 -175
  201. package/assets/rules/git-workflow.md +0 -106
  202. package/rt-tools-agent-kit-0.3.0.tgz +0 -0
@@ -2,64 +2,113 @@
2
2
  name: spec-driven
3
3
  kind: rule
4
4
  law: project-documentation
5
- description: Правило под закон «Документация проекта». Брать при правке спека домена, закона и любого скила. Три слоя — закон, правило, паттерн, — обязательные разделы, привязка утверждений к коду, связь сценариев с тестами. Готовый порядок действий — в паттернах spec-driven-domain и spec-driven-rule. Чем это названо здесь — в implementation.md рядом.
5
+ description: Правило под «Закон о документации проекта». Брать при правке docs/specs/**, docs/constitution/** и любого скила в .claude/skills. Называет три слоя — закон, правило, паттерн, — обязательные разделы, привязку к коду и связь сценариев с тестами. Готовый порядок действий — в паттернах spec-driven-domain и spec-driven-rule.
6
6
  ---
7
7
 
8
- # Документация проекта — каким приёмом
8
+ # Документация проекта — как это устроено здесь
9
9
 
10
- Правило под закон `{{lawsDir}}/project-documentation.md`. Закон говорит, что должно быть верно
11
- про тексты; здесь — из каких слоёв они сложены и что сверяет машина. Где лежат спеки домена,
12
- чем они проверяются и какой у них шаблон — `implementation.md` рядом. Формулировки правило
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
- ЗАКОН {{lawsDir}}/<закон>.md
23
- верен для любого приложения этого класса; о проекте не знает ничего:
24
- ни путей, ни имён файлов, ни привязок
17
+ ЗАКОН docs/constitution/<закон>.md — верен для любого приложения этого класса
18
+ docs/constitution/application/<закон>.md — закон приложения: деньги, локали, доступ
19
+ о проекте не знает ничего: ни путей, ни имён файлов, ни привязок
25
20
 
26
- ├─ ПРАВИЛО {{rulesDir}}/<правило>/SKILL.md (kind: rule, law: <закон>)
27
- каким приёмом закон исполняется; несколько правил на закон
28
- {{rulesDir}}/<правило>/implementation.md — имена этого дерева и привязка к коду
21
+ ├─ ПРАВИЛО .claude/skills/<правило>/SKILL.md (kind: rule, law: <закон>)
22
+ привязывает закон к этому проекту; несколько правил на закон
23
+ .claude/skills/<правило>/implementation.md — привязка к коду
29
24
 
30
- │ └─ ПАТТЕРН {{rulesDir}}/<правило>-<что>/SKILL.md (kind: pattern, rule: <правило>)
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
- живут в документе годами, а на одном из путей обещанный отказ не бросает никто.
51
- - **Префикс сценариев в домене один.** Второй префикс означает, что домен описан дважды.
52
- - **У закона обязателен раздел статей, и кроме них он не держит ничего.** Истории правок и
53
- доводов о выбранном когда-то варианте в законе нет: историю держит система контроля версий, а
54
- довод с отвергнутой альтернативой свойство работы, и место ему в «Ловушках» правила.
68
+ - **Таблица процедур сверяется с декораторами в обе стороны.** Иначе процедура, которую домен
69
+ обслуживает, но забыл описать, видна только в декораторе.
70
+ - **Код отказа принимается, только если он в домене бросается.** Коды выписывались по
71
+ замыслу, и на одном пути обещанный отказ не бросал никто.
72
+ - **Префикс сценариев в спеке один, и по всему дереву он занят им одним.** Второй префикс
73
+ внутри спека означает, что предмет описан дважды; занятый чужим что по номеру не видно,
74
+ чей это сценарий. Договорённость о продукте исключение: она нумеруется вместе со спеком, в
75
+ который вольётся, и занятым префикс от неё не становится.
76
+ - **Поддомен спрашивается наравне с доменом.** Те же обязательные разделы, тот же компаньон
77
+ рядом, та же связь сценариев с тестами. Домен, у которого половина поддоменов описана, а
78
+ половина заведена пустыми каталогами, зелёным не бывает.
79
+ - **У закона обязателен раздел «Статьи», а кроме них он держит только открытые вопросы.**
80
+ Истории правок и доводов о выбранном когда-то варианте в законе нет: историю держит система
81
+ контроля версий, а довод с отвергнутой альтернативой — свойство работы, и место ему в
82
+ «Ловушках» правила. Закрытый вопрос из закона уходит, а пустой раздел ради заголовка
83
+ проверку всё равно проходил.
84
+ - **Предложенный закон правила не требует.** Договорённость, записанную раньше кода,
85
+ привязывать не к чему, а требование правила заставило бы завести его с якорями в
86
+ несуществующие места. Признак стоит строкой статуса в самом законе, а не в списке исключений
87
+ рядом с проверкой.
55
88
  - **Закон, назвавший файл проекта, — отказ.** Путям и привязкам место в правиле: иначе закон
56
89
  нельзя ни прочитать без знания дерева, ни применить на другом приложении.
57
90
  - **Правило объявляет закон, под который написано.** Правило без закона — набор приёмов, из
58
91
  которого не видно, что именно должно быть верно.
92
+ - **Слоёв законов два, а имя закона одно на оба.** Общий лежит в корне конституции, закон
93
+ приложения — в `application/`; ни `law:`, ни `**Законы:**` слоя не называют, поэтому имена
94
+ законов уникальны по всему дереву конституции.
59
95
  - **Спек объявляет законы, которые применяет, и связь сверяется в обе стороны.** Закон,
60
- названный в тексте спека, обязан стоять в его шапке: иначе по закону не узнать, какие домены
96
+ названный в тексте спека, обязан стоять в шапке: иначе по закону не узнать, какие домены
61
97
  на нём стоят.
62
98
 
99
+ ## Чего из закона здесь нет
100
+
101
+ Закон, которого не применяет ни один спек, отказом не считается: законы про устройство кода,
102
+ поставку и проверяемость доменов не касаются вовсе. Порядок «сначала описание, потом код»
103
+ держится договорённостью — это `Q-PD-3` в законе.
104
+
105
+ Таблицы состояний экрана не сверяются ничем. `check:specs` знает сценарии против заголовков
106
+ тестов, правила против якорей, процедуры против декораторов и коды отказа против бросков —
107
+ строка таблицы состояний не привязана ни к чему и проходит зелёной, даже когда код в
108
+ названное состояние не попадает. Состояние «проверка не загрузилась» стояло в таблицах двух
109
+ доменов раньше, чем код научился в него приходить, и всё это время читалось описанием
110
+ работающего.
111
+
63
112
  ## Паттерны
64
113
 
65
114
  - `spec-driven-domain` — заведение и правка спека домена, сценарии, привязка.
@@ -67,23 +116,30 @@ description: Правило под закон «Документация про
67
116
 
68
117
  ## Ловушки
69
118
 
70
- - **Список шагов в спеке не заводить.** Шаги — артефакт сессии, им место в ветке или в описании
119
+ - **`tasks.md` в спеке не заводить.** Шаги — артефакт сессии, им место в ветке или в описании
71
120
  PR. Как только в директории появляются «шаги», спек снова становится планом и умирает после
72
- слияния.
121
+ мержа.
73
122
  - **Спек описывает установившееся, а не предстоящее.** Единственное место, где он говорит о
74
- будущем, — отдельная директория предложенного; после выкатки её текст вливается в спек
75
- домена, директория удаляется, идентификаторы сценариев не меняются.
76
- - **Семантику полей не сверяет ничто.** Проверка знает имена обработчиков, коды отказа и связь
77
- сценариев с тестами; что означает пустое поле — не знает.
78
- - **Живость символа считается совпадением имени по дереву, а не вызовом.** Символу хватает
79
- второго упоминания где угодно в чужом поле с тем же именем, в атрибуте разметки. Место, где
80
- правило исполняется на самом деле, подтверждается только чтением кода.
81
- - **Зелёная проверка не значит, что структура верна.** Проверка сверяет структуру с тем, чего
82
- сама и ждёт: неверная раскладка, совпавшая с её ожиданием, проходит зелёной.
83
- - **Конфликт слияния в спеке разрешается сохранением обеих сторон, а не выбором одной.** Две
84
- ветки дописывают в конец одних и тех же списков, и обе стороны верны: конфликт здесь не спор,
85
- а две дописи в одно место. Номера сценариев при разрешении не пересчитываются — идентификатор
86
- это ключ связи с тестами, и сдвиг номеров рвёт сверку у соседей, которых правка не касалась.
87
- Порядок сохранённых сторон держится одинаковым во всех файлах спека, иначе правило, его
88
- сценарий и его привязка перестают находиться друг по другу. После разрешения гоняется
89
- проверка спеков: конфликт в тексте кода не задевает, и ни сборка, ни линтеры его не увидят.
123
+ будущем, — `proposed/<фича>/`. После выкатки его текст вливается в спек домена, директория
124
+ удаляется, идентификаторы сценариев не меняются.
125
+ - **Семантику полей не сверяет ничто.** Проверка знает имена процедур, коды отказа и связь
126
+ сценариев с тестами; что означает пустое поле — не знает. Правка `.proto` поэтому тянет
127
+ спеки всех доменов, чьи процедуры она задела, в той же ветке.
128
+ - **Живость символа считается совпадением имени по всему дереву, а не вызовом.** Символу
129
+ хватает второго упоминания где угодно в чужом поле с тем же именем, в атрибуте разметки.
130
+ Место, где правило исполняется на самом деле, подтверждается только чтением кода.
131
+ - **Якорь в `tools/*.mjs` сверяется почти ничем:** живость считается только для `.ts`, а
132
+ исходники обходятся по `apps`, `libs` и `prisma`. Правило, привязанное к проверке, поэтому
133
+ читается вместе с её телом.
134
+ - **Зелёная проверка не значит, что структура верна.** Спутники с привязкой сначала лежали
135
+ рядом с законами, и проверка была зелёной именно потому, что структура совпадала с тем,
136
+ чего проверка сама и ждала.
137
+ - **Конфликт мержа в спеке разрешается сохранением обеих сторон, а не выбором одной.** Две
138
+ ветки дописывают в конец одних и тех же списков сценариев, правил, строк привязки, — и
139
+ обе стороны верны: конфликт здесь не спор, а две дописи в одно место. Номера сценариев при
140
+ разрешении не пересчитываются: идентификатор — ключ связи с тестами, и сдвиг номеров рвёт
141
+ сверку у соседей, которых правка не касалась. Порядок сохранённых сторон держится
142
+ одинаковым в `spec.md`, `scenarios.md` и `implementation.md`: иначе правило, его сценарий и
143
+ его привязка перестают находиться друг по другу. После разрешения гоняется
144
+ `npm run check:specs` — конфликт в спеке кода не задевает, и ни сборка, ни линтеры его не
145
+ увидят.
@@ -2,58 +2,73 @@
2
2
  name: styling-bem
3
3
  kind: rule
4
4
  law: frontend-application
5
- description: Правило под закон «Фронтовое приложение». Брать при правке любого файла стилей и шаблона компонента токены оформления вместо сырых значений, класс директивой, общий слой раскладки, класс без правила. Готовый код — в паттернах styling-bem-layout и styling-bem-component. Чем это названо здесь — в implementation.md рядом.
5
+ description: Правило под «Закон о фронтовом приложении». Брать при правке любого *.scss и шаблона компонента. Называет директивы BEM, токены оформления, общий слой раскладки приложения и проверку класса без правила. Готовый код — в паттернах styling-bem-layout и styling-bem-component.
6
6
  ---
7
7
 
8
- # Оформление — каким приёмом
8
+ # Оформление — как это устроено здесь
9
9
 
10
- Правило под закон `{{lawsDir}}/frontend-application.md`. Закон говорит, что должно быть верно;
11
- здесь — каким приёмом это держится. Как названы токены, директивы классов и общий слой
12
- раскладки — `implementation.md` рядом. Раскладка файла компонента `component-structure`,
13
- состояние — `angular-patterns`, окружение браузера — `platform-access`, слой обращения к
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,150 @@
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
+ - **Влитая договорённость ветку не запирает.** После вливания директории «предложено» на диске
39
+ нет, а замысел на неё ссылается до конца работы: гард отличает влитое от незаведённого по
40
+ истории ветки и пропускает первое. Иначе последний коммит отчёта закрывал бы дорогу правкам
41
+ по замечаниям разбора.
42
+ - **Договорённость требуется по путям правки, а не по оценке задачи.** `apps/**` и `libs/**`
43
+ — признак; правила, тексты, обвязка и зависимости под него не подпадают. Обход — строка
44
+ `**Поведение:** не меняется — <причина владельца>` в замысле; пустая причина не
45
+ принимается.
46
+ - **Ход, в котором владельцу задан вопрос, не заканчивается, пока за этот же ход не читались
47
+ законы и правила.** Чтением считается любой из трёх путей: загрузка правила, чтение файла
48
+ законов или правил, поиск по ним. Отбивает гард разговора — на завершении хода, а не на
49
+ инструменте вопроса: спрашивают чаще прозой, чем меню. Найденное ложится в раздел «Что уже
50
+ сказано в правилах» разбора.
51
+ - **Состояние незаконченной работы приходит в контекст на запуске сессии.** Замысел и ход
52
+ работы отдаются целиком, разбор просьбы — путём. Ветка вида `<КЛЮЧ>-*` без папки даёт
53
+ предупреждение с готовой командой, но сессию не рвёт.
54
+ - **Сделанное отмечается только в ходе работы.** «Где стоим» перезаписывается каждым заходом,
55
+ а не дописывается: это первое, что читает следующий заход.
56
+ - **Папка задачи заводится черновиком и получает номер командой.** До конца разбора
57
+ неизвестно, сколько задач из него выйдет, поэтому номер не может быть первым;
58
+ `npm run task:new` переименовывает черновик и проставляет шапку замысла.
59
+ - **Брошенный разбор виден.** Черновик старше недели перечисляет сверка очереди работ —
60
+ задачи за ним ещё нет, и спросить о нём некого.
61
+ - **Договорённость вливается в спек домена последним коммитом отчёта.** К этому моменту код
62
+ написан, привязки известны, и в главной ветке директория `proposed/` не появляется вовсе.
63
+ Готовые к вливанию перечисляет `npm run check:specs`.
64
+ - **Папка закрытой задачи разбирается, а не переносится целиком.** В `docs/archive/` уезжает
65
+ то, что объясняет состоявшееся решение; остальное удаляется. Неразобранную ловит сверка
66
+ очереди работ.
67
+ - **Слияние отбивается, пока ветка везёт папку своей задачи.** Требование стоит на слиянии, а
68
+ не на открытии отчёта: до слияния папка ещё нужна — правка по замечаниям разбора идёт в ту
69
+ же ветку, а без замысла на диске её отбивает гард хода работы. На открытии отчёта о лежащей
70
+ папке говорится вслух, и только. Судится содержимое ветки, а не рабочее дерево: снесённая,
71
+ но не закоммиченная папка въехала бы вместе с веткой.
72
+ - **Ветка, снёсшая папку, обязана прибавить запись в архив.** Снести дешевле, чем разобрать, и
73
+ первым уходит разбор просьбы — единственная запись слов владельца. Что именно увезено,
74
+ требование не судит: это судит владелец.
75
+ - **Обход — строка `Task-folder-skip: <причина>` в отчёте или в самой команде слияния.**
76
+ Работа, вливаемая частями, папку до конца не разбирает. Чтение из команды работает и без
77
+ сети: единственный сетевой путь отбивал бы оффлайн то самое слияние, причина которого
78
+ написана в отчёте. Пустая причина обходом не считается, а сам обход снимает отказ, но не
79
+ гасит строку сверки очереди — иначе он через месяц становится рабочим путём.
80
+
81
+ ## Чего из закона здесь нет
82
+
83
+ Полноту записанного понимания не проверяет ничто, и проверки на неё не будет: машине видно
84
+ наличие записи, но не то, что в ней закрыты все пробелы. Разбор из одной строки проходит гард
85
+ так же, как разбор на сто. То же с вопросом, который стоило задать и не задали, — он не
86
+ оставляет следа. Оба разобраны решениями в законе: судит владелец.
87
+
88
+ Гард судит по путям правки, а не по тому, меняет ли работа поведение на самом деле.
89
+ Рефакторинг, снаружи не видный, упирается в требование договорённости и проходит обходом с
90
+ причиной. Своего признака рефакторингу не заводится: оценку «поведение не меняется»
91
+ назначал бы тот, кому она мешает.
92
+
93
+ Ничто из самого разбора не проверяется, и всё это держится памятью того, кто его ведёт.
94
+ Разговор с владельцем инструментом не является — гард видит правку файла и ничего не знает
95
+ ни о том, была ли разведка до первого вопроса, ни о том, задан ли каждый из шести
96
+ обязательных вопросов, ни о том, ответил ли на них владелец. Образец разбора перечисляет их
97
+ таблицей, но пустая таблица проходит так же, как заполненная.
98
+
99
+ Неизменность замысла не стережёт ничто: `plan.md` правится тем же инструментом, что и
100
+ остальные тексты, и правка по ходу отличима от первоначальной записи только по истории.
101
+ Держится это тем же, чем и порядок разбора.
102
+
103
+ Приведение текстов к сделанному не проверяет ничто, и проверки на него не будет: что устарело
104
+ в правиле и в спеке, машине не видно — раздел «Чего из закона здесь нет» не читает ни одна
105
+ сверка, а «Что не входит» выглядит верным ровно так же, как в день, когда его писали. Держится
106
+ это шагом закрытия работы и следом задачи в замысле: там названо, что перечитать. Правило и
107
+ спек правятся в ветке, закон — нет: его статья приносится владельцу текстом, а работа идёт
108
+ дальше без неё.
109
+
110
+ Что именно перенесли в архив, не проверяется. Гард видит, что папка уезжает в главную ветку и
111
+ что ветка что-то в архив добавила, но не может судить, то ли это и стоило ли переносить именно
112
+ это. Сверять содержимое машине нечем — смотрит владелец на ревью. Отсюда же и обход: если
113
+ работа вливается частями, папку до конца не разбирают, а причина остаётся в отчёте.
114
+
115
+ ## Паттерны
116
+
117
+ - `task-flow-start` — разведка, разбор, договорённость, замысел, задача и ветка.
118
+ - `task-flow-resume` — возвращение к незаконченной работе новым заходом.
119
+ - `task-flow-close` — вливание договорённости, разбор папки, переезд в архив.
120
+
121
+ ## Ловушки
122
+
123
+ - **Папка называется именем ветки, один в один.** Хук запуска ищет её по
124
+ `git branch --show-current`, и папка, названная иначе, не находится ничем: работа идёт с
125
+ пустым контекстом, а владельца просят пересказать то, что уже записано.
126
+ - **Разбор просьбы задним числом не переписывается.** Пересказ незаметно подгоняется под уже
127
+ сделанное, и сверять результат становится не с чем. Решение, изменённое по ходу, дописывается
128
+ в ход работы, а не правится в разборе.
129
+ - **Договорённость о продукте не кладётся в папку задачи.** Папка умирает с мержем, а
130
+ договорённость обязана его пережить: её сценарии получают номера в общей нумерации домена,
131
+ и на них ссылаются заголовки тестов. Обратное тоже верно — ход работы не кладётся в
132
+ `proposed/`: спек, в котором завелись шаги, снова становится планом и умирает после мержа.
133
+ - **Меню вариантов на разборе годится только для выбора значения из закрытого набора.** Пока
134
+ постановка вопроса не подтверждена, спрашивается прозой: у меню нет строки «вопрос не тот».
135
+ Выбор слова, имени и термина узким вопросом не является никогда.
136
+ - **Субагент вопросов владельцу не задаёт.** Ни роли, ни конвейер до него не достучатся —
137
+ они возвращают текст главному агенту. Поэтому разбор ведёт главный агент, а роли стоят по
138
+ обе стороны от него.
139
+ - **Если дефект чинится правкой одного общего числа, спроси владельца, тем ли способом ты его
140
+ чинишь.** Замер показывает, что дефект ушёл, — но не то, что причину вылечили. В одной
141
+ задаче так ушли две правки подряд: сначала подняли общее число у соседнего узла, потом
142
+ перенесли узел в другое место разметки. Обе владелец отверг, а нужный способ назвал сам.
143
+ Спрашивают до правки, а не показывают замер после.
144
+ - **Линия работ по теме читается до того, как решается раскладка.** Файл линии держит решения,
145
+ которые пережили десяток задач, и разведка по коду их не находит: снятое решение следа в
146
+ дереве не оставляет. Домен, заведённый генератором и снесённый через полчаса, стоял в линии
147
+ прямым запретом — но линию открыли уже после того, как он был заведён во второй раз.
148
+ - **Слово для нового понятия берётся из `docs/GLOSSARY.md` или заводится там же.** Третий файл
149
+ папки задачи называется `progress.md`, а не `journal.md`, ровно поэтому: журнал в этом
150
+ дереве один, и он другой.