@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
package/README.md
CHANGED
|
@@ -25,16 +25,29 @@ npx agent-kit list # что везёт пакет и что из этого
|
|
|
25
25
|
npx agent-kit init # спросить законы галочками и завести .claude/rt-kit.json
|
|
26
26
|
npx agent-kit sync # разложить выбранное в docs/constitution/
|
|
27
27
|
npx agent-kit doctor # что разложено, что отстало, чего не хватает
|
|
28
|
+
npx agent-kit adopt # отдать пакету файлы, лежащие на его путях не от него
|
|
28
29
|
```
|
|
29
30
|
|
|
31
|
+
`init` называет и то, чего пакет ждёт от дерева: значения дырок, которые придётся вписать в
|
|
32
|
+
`vars`. Узнавать о них отказом первой же раскладки — значит начинать установку с ошибки.
|
|
33
|
+
|
|
30
34
|
В гейте пуша:
|
|
31
35
|
|
|
32
36
|
```bash
|
|
33
37
|
npx agent-kit sync --check
|
|
34
38
|
```
|
|
35
39
|
|
|
36
|
-
Команда ничего не пишет и отказывает, если разложенное отстало от
|
|
37
|
-
|
|
40
|
+
Команда ничего не пишет и отказывает, если разложенное отстало от пакета, его правили руками,
|
|
41
|
+
компаньон правила остался черновиком или разложенный гард не назван в настройке агента.
|
|
42
|
+
|
|
43
|
+
Раскладка отказывает и там, где раньше молчала:
|
|
44
|
+
|
|
45
|
+
- у ресурса есть виды, но ни один не отвечает выбору дерева — правило легло бы без инструмента,
|
|
46
|
+
который оно зовёт;
|
|
47
|
+
- ресурсы правлены позже, чем собран пакет, из которого идёт раскладка, — легла бы прежняя
|
|
48
|
+
редакция, а команда назвала бы это сделанным;
|
|
49
|
+
- на пути пакета лежит файл не от него — его отдают пакету командой `adopt`, и прежнее
|
|
50
|
+
содержимое остаётся рядом под именем с пометкой `.before-rt-kit`.
|
|
38
51
|
|
|
39
52
|
## Что где лежит
|
|
40
53
|
|
|
@@ -43,22 +56,71 @@ npx agent-kit sync --check
|
|
|
43
56
|
| `laws` | `docs/constitution/` | что должно быть верно |
|
|
44
57
|
| `rules` | `.claude/skills/<имя>/SKILL.md` | каким приёмом это делается |
|
|
45
58
|
| `patterns` | `.claude/skills/<имя>/SKILL.md` | готовый код приёма |
|
|
59
|
+
| `skills` | `.claude/skills/<имя>/SKILL.md` | скил, у которого нет закона над собой |
|
|
46
60
|
| `hooks` | `.claude/hooks/` | что не даёт нарушить |
|
|
61
|
+
| `defaults` | `.claude/rt-kit/defaults/` | карта гейта и профиль дерева — умолчаниями |
|
|
47
62
|
| `agents`, `commands`, `workflows` | `.claude/` | роли, слеш-команды и многошаговые прогоны |
|
|
48
63
|
| `checks` | `tools/` | проверки, которые зовёт гейт |
|
|
49
|
-
| `templates` | `.claude/rt-kit/templates/` | формы правила, паттерна, компаньона и
|
|
64
|
+
| `templates` | `.claude/rt-kit/templates/` | формы правила, паттерна, компаньона и надстроек |
|
|
50
65
|
|
|
51
|
-
|
|
66
|
+
Правило, паттерн и скил ложатся одинаково — все три скилы; различает их `kind` во вступлении
|
|
67
|
+
файла. Скил без закона стоит рядом с лестницей, а не в ней: он не про то, что должно быть верно
|
|
68
|
+
в продукте, а про то, как здесь делается работа, — витрина, генератор, заведение самого скила.
|
|
69
|
+
Выдумывать ему закон ради лестницы нельзя: закон с одним правилом и без единой статьи о продукте
|
|
70
|
+
разъезжается с остальными при первой же правке.
|
|
71
|
+
|
|
72
|
+
Законы лежат в двух слоях. Общий — `docs/constitution/<закон>.md`, верный любому приложению
|
|
73
|
+
этого класса. Закон приложения — `docs/constitution/application/<закон>.md`: деньги, локали,
|
|
74
|
+
доступ, владеющая сущность, видимость в поиске. Без этих предметов его не существует, и
|
|
75
|
+
предметность в нём законна. Слой в ссылке не отражается: `law:` в шапке правила называет закон
|
|
76
|
+
одним словом, и переезд между слоями этих строк не переписывает.
|
|
52
77
|
|
|
53
78
|
## Правило и его компаньон
|
|
54
79
|
|
|
55
|
-
Правило
|
|
56
|
-
|
|
80
|
+
Правило называет приёмы и раскладку, общие для деревьев мастерской: `libs/<семья>/<домен>/<слой>`,
|
|
81
|
+
слои, семьи, роды файлов. Они одинаковы везде, и заставлять каждое дерево выписывать их заново
|
|
82
|
+
значило бы заводить столько редакций одного текста, сколько репозиториев.
|
|
83
|
+
|
|
84
|
+
Чего правило не называет — конкретных путей, доменов и портов. Раздел «Где это лежит» в нём
|
|
85
|
+
отсылает к компаньону, а порт стенда стоит дыркой со значением из конфига: путь, названный в
|
|
86
|
+
правиле, врёт в первом же дереве, которое держит код иначе, и врёт молча.
|
|
87
|
+
|
|
88
|
+
Рядом, в `implementation.md`, живёт то, чего пакет знать не может: ключ задач, адрес борды,
|
|
89
|
+
префикс компонентов, валюта хранения, имена доменов — и привязка каждой статьи правила к
|
|
90
|
+
символу, который её исполняет.
|
|
91
|
+
|
|
92
|
+
Черновик приезжает не пустым: статьи правила переносятся в таблицу привязки заранее. Их текст —
|
|
93
|
+
ключ связи, и переписанный руками он расходится с правилом молча; проекту остаётся вторая
|
|
94
|
+
колонка, а не перепечатывание первой.
|
|
57
95
|
|
|
58
96
|
Черновик компаньона `sync` кладёт **один раз**, при первой раскладке правила, и больше к нему
|
|
59
97
|
не возвращается: своего текста у пакета там нет, а перекладывать значило бы стирать написанное
|
|
60
98
|
проектом. Пока в черновике осталась метка `<!-- заполняет проект -->`, `sync --check` отказывает:
|
|
61
|
-
правило без имён этого дерева — это
|
|
99
|
+
правило без имён этого дерева — это указание без адресата.
|
|
100
|
+
|
|
101
|
+
Компаньон — принадлежность правила, а не всякого скила. У скила без закона статей нет,
|
|
102
|
+
привязывать нечего, и `sync` черновика ему не кладёт: здешнее он несёт прямо в тексте или в
|
|
103
|
+
надстройке `overrides/skills/<имя>.md`. Отказ `sync --check` за незаполненный черновик его тоже
|
|
104
|
+
не касается.
|
|
105
|
+
|
|
106
|
+
## Виды одного ресурса
|
|
107
|
+
|
|
108
|
+
Есть приёмы, у которых один и тот же закон исполняется разными командами: заявка на слияние
|
|
109
|
+
открывается `gh`, `glab` или `az repos`. Обезличить их до общего текста нельзя — правило, из
|
|
110
|
+
которого убрали команду, перестаёт быть указанием.
|
|
111
|
+
|
|
112
|
+
Такой ресурс лежит в пакете в нескольких видах — `git-workflow.github.md`,
|
|
113
|
+
`git-workflow.gitlab.md`, `git-workflow.azure.md`, — а проект выбирает вид один раз, при `init`.
|
|
114
|
+
Разложен будет ровно один, под общим именем `git-workflow`: агенту, который его читает, знать
|
|
115
|
+
хостинг незачем.
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
npx agent-kit init --host gitlab # или спросит, если запуск из терминала
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Выбор уезжает в `variants` конфига. Ось без ответа **отбивает раскладку целиком**: дерево,
|
|
122
|
+
не назвавшее свой хостинг, осталось бы вовсе без правила поставки — и заметить это можно было
|
|
123
|
+
бы только по тому, что гейт перестал его требовать.
|
|
62
124
|
|
|
63
125
|
## Хуки
|
|
64
126
|
|
|
@@ -74,17 +136,33 @@ npx agent-kit sync --check
|
|
|
74
136
|
якорь для спек, переизобретение готового, формат сообщения коммита, закреплённый профиль
|
|
75
137
|
браузера.
|
|
76
138
|
|
|
77
|
-
|
|
78
|
-
|
|
139
|
+
**Карта и профиль — умолчанием, а не пустой формой.** Хук везёт механизм, а то, что он зовёт и
|
|
140
|
+
называет, лежит рядом в двух файлах. Деревья мастерской устроены одинаково, поэтому умолчание
|
|
141
|
+
везёт пакет:
|
|
79
142
|
|
|
80
|
-
| Файл
|
|
143
|
+
| Файл | Кто пишет | Что в нём |
|
|
81
144
|
| --- | --- | --- |
|
|
82
|
-
| `.claude/rt-kit/gate-map.sh` | что правится — какое
|
|
83
|
-
| `.claude/rt-kit/project.sh` |
|
|
84
|
-
| `.claude/rt-kit/
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
145
|
+
| `.claude/rt-kit/defaults/gate-map.sh` | пакет | что правится — какое правило: тесты, компоненты, стили, барели, документы, команды поставки |
|
|
146
|
+
| `.claude/rt-kit/defaults/project.sh` | пакет | запускатель по локфайлу, линтеры, форма имени ветки, образцы переизобретения |
|
|
147
|
+
| `.claude/rt-kit/gate-map.sh` | проект, необязательно | род файлов, которого нет у других: витрина, свой генератор |
|
|
148
|
+
| `.claude/rt-kit/project.sh` | проект, необязательно | порты стендов, свои проверки, свои пары «правка — документ» |
|
|
149
|
+
| `.claude/rt-kit/browser-device-id` | проект | закреплённый профиль браузера этой машины |
|
|
150
|
+
|
|
151
|
+
Надстройка грузится второй и объявляет ту же функцию заново; чтобы дописать, а не заменить, она
|
|
152
|
+
зовёт умолчание тем же именем с суффиксом `_default`. Нет надстройки — действует умолчание; нет
|
|
153
|
+
ни того ни другого — хук пропускает: пустой гард лучше гарда, отбивающего наугад.
|
|
154
|
+
|
|
155
|
+
**Карта хуков в настройке агента.** Разложенный гард зовёт запись в `.claude/settings.json` —
|
|
156
|
+
файле, который принадлежит дереву. Каждый гард несёт строку `# rt-hook: <событие> <образец>` и
|
|
157
|
+
сам говорит, когда его звать; из этих строк `sync` собирает готовый раздел `hooks` и печатает
|
|
158
|
+
его, а `sync --check` считает неподключённый гард расхождением. Пишет в настройку проект: гард,
|
|
159
|
+
которого никто не зовёт, неотличим от гарда, который всё пропускает.
|
|
160
|
+
|
|
161
|
+
Карта гейта вправе назвать **несколько** правил, по одному в строке: доменное правило файла и
|
|
162
|
+
те, что действуют вторым слоем. Гейт потребует первое незагруженное — и только то, чьё правило
|
|
163
|
+
в дереве есть: имя, от которого дерево отказалось списком, он пропускает молча. Второй слой она выбирает и
|
|
164
|
+
по тексту правки, а не только по имени файла: обращение к среде исполнения приходит в обычный
|
|
165
|
+
сервис, а число-настройка — в обычный класс.
|
|
88
166
|
|
|
89
167
|
## Выбор законов
|
|
90
168
|
|
|
@@ -114,22 +192,26 @@ npx agent-kit init --laws access,delivery,verifiability
|
|
|
114
192
|
{
|
|
115
193
|
"vars": { "mainBranch": "main" },
|
|
116
194
|
"layout": { "laws": "docs/constitution" },
|
|
117
|
-
"
|
|
118
|
-
"
|
|
195
|
+
"variants": { "host": "gitlab" },
|
|
196
|
+
"only": ["laws/application/access.md", "laws/delivery.md"],
|
|
197
|
+
"skip": ["laws/lists.md"]
|
|
119
198
|
}
|
|
120
199
|
```
|
|
121
200
|
|
|
122
|
-
- **`vars`** — значения дырок `{{имя}}` в тексте пакета.
|
|
123
|
-
|
|
124
|
-
Неподставленная
|
|
125
|
-
посреди правила агент прочтёт как имя.
|
|
201
|
+
- **`vars`** — значения дырок `{{имя}}` в тексте пакета. Своих дырок пакет не ставит: пути он
|
|
202
|
+
называет прямо, потому что деревья мастерской раскладываются одинаково. Дырка остаётся для
|
|
203
|
+
надстроек проекта. Неподставленная — отказ раскладки, а не строка в разложенном тексте:
|
|
204
|
+
`{{mainBranch}}` посреди правила агент прочтёт как имя.
|
|
205
|
+
- **`variants`** — выбор по осям различия, объявленным пакетом в `assets/variants.json`. Ось без
|
|
206
|
+
ответа отбивает раскладку.
|
|
126
207
|
- **`layout`** — куда класть каждый род ресурса. Умолчания менять без нужды не стоит: правила
|
|
127
208
|
ссылаются на законы теми же путями.
|
|
128
|
-
- **`only`** — что проект выбрал, идентификаторами вида `laws/<закон>.md
|
|
129
|
-
Ограничивает только те роды, которые сам
|
|
130
|
-
законах, а не обо всём, что пакет везёт, —
|
|
209
|
+
- **`only`** — что проект выбрал, идентификаторами вида `laws/<закон>.md`, у закона приложения —
|
|
210
|
+
`laws/application/<закон>.md`. Пусто — берётся всё. Ограничивает только те роды, которые сам
|
|
211
|
+
называет: перечислив законы, проект говорит о законах, а не обо всём, что пакет везёт, —
|
|
212
|
+
шаблоны при нём остаются.
|
|
131
213
|
- **`skip`** — ресурсы, от которых проект отказался, теми же идентификаторами. Вычитает из
|
|
132
|
-
выбранного, поэтому отказ от одного закона не требует переписывать
|
|
214
|
+
выбранного, поэтому отказ от одного закона не требует переписывать весь список.
|
|
133
215
|
|
|
134
216
|
## Надстройки
|
|
135
217
|
|
|
@@ -156,9 +238,91 @@ npx agent-kit init --laws access,delivery,verifiability
|
|
|
156
238
|
|
|
157
239
|
Отказ хотя бы по одному файлу не пишет ничего: половина разложенного хуже целого.
|
|
158
240
|
|
|
241
|
+
## Роли и конвейеры
|
|
242
|
+
|
|
243
|
+
Пакет везёт шесть ролей субагентов и два конвейера из них.
|
|
244
|
+
|
|
245
|
+
| Роль | Что делает |
|
|
246
|
+
| --- | --- |
|
|
247
|
+
| `business-analyst` | что работа даёт владельцу, что выкидывается без потери цели |
|
|
248
|
+
| `project-manager` | декомпозиция с границами и признаками готовности, приёмка по исходному запросу |
|
|
249
|
+
| `qa-engineer` | тесты, сборка, линтеры, замеры в браузере, состязательный разбор правки |
|
|
250
|
+
| `spec-writer` | договорённость о продукте до кода — спек фичи по разбору просьбы |
|
|
251
|
+
| `spec-critic` | что в договорённости недосказано и где два прочтения |
|
|
252
|
+
| `skill-curator` | разбор закрытой задачи: что из правил помогло, чего не хватило |
|
|
253
|
+
|
|
254
|
+
Конвейер `plan` ведёт от разбора просьбы владельца до замысла — нужность, договорённость,
|
|
255
|
+
критика, этапы. Конвейер `feature` — от плана до приёмки, с веером проверок посередине.
|
|
256
|
+
|
|
257
|
+
Роль вопросов владельцу не задаёт: ни она, ни конвейер до него не достучатся. Поэтому разбор
|
|
258
|
+
ведёт главный агент, а роли стоят по обе стороны от него — разведка до, конвейер после.
|
|
259
|
+
|
|
260
|
+
`skill-curator` приезжает и слеш-командой: она собирает сводку о задаче и список загруженных
|
|
261
|
+
правил, без которых разбор выродится в пересказ.
|
|
262
|
+
|
|
263
|
+
## Как этим пользуются в дереве
|
|
264
|
+
|
|
265
|
+
Всё, что выше, пакет объясняет человеку. Агенту то же самое объясняет скил `agent-kit` —
|
|
266
|
+
ресурс `skills/agent-kit.md`: когда его брать, где что настраивается, в каком порядке идёт
|
|
267
|
+
правка и как ставить пакет туда, где хуки и проверки уже свои.
|
|
268
|
+
|
|
269
|
+
Скил обезличен, как и остальные тексты пакета. Своё дерево дописывает к нему раздел про свои
|
|
270
|
+
надстройки — надстройкой же, `.claude/rt-kit/overrides/skills/agent-kit.md`. Это и есть образец
|
|
271
|
+
того, как механизм применяется к самому себе.
|
|
272
|
+
|
|
273
|
+
## Проверки
|
|
274
|
+
|
|
275
|
+
Род `checks` ложится в `tools/`: сверка спеков с тестами, повторы, слои либ, пути в документах,
|
|
276
|
+
переизобретение готового, классы без правила, расхождение схемы с миграциями, очередь работ и
|
|
277
|
+
заведение задачи. Их же зовёт гейт пуша и на них ссылаются правила.
|
|
278
|
+
|
|
279
|
+
Пути и идентификаторы, которыми проверки живут, в код не зашиты: они читаются из
|
|
280
|
+
`.claude/rt-kit/checks.json` через `tools/rt-kit-checks.config.mjs`. Незаполненный ключ означает
|
|
281
|
+
умолчание, а не отказ, — проверка, которой в дереве нечего сверять, молчит.
|
|
282
|
+
|
|
283
|
+
Проверки, чей ход зависит от хостинга, лежат видами: `board`, `check-board` и `task-new`
|
|
284
|
+
приезжают в дерево под общими именами, а разговаривают с тем хостингом, который проект выбрал
|
|
285
|
+
при `init`.
|
|
286
|
+
|
|
287
|
+
## Раскладка и право на запуск
|
|
288
|
+
|
|
289
|
+
Гарда зовут по пути, а не через оболочку, поэтому право на запуск — часть ресурса, а не
|
|
290
|
+
случайность файловой системы. Раскладка снимает признак с файла в пакете и переносит на
|
|
291
|
+
разложенный.
|
|
292
|
+
|
|
293
|
+
Без этого гард отвечает отказом доступа, то есть ненулевым кодом, а ненулевой код у гарда
|
|
294
|
+
значит «правка отбита»: набор отбивает подряд всё, включая сборку и тесты, и причина при этом
|
|
295
|
+
нигде не называется.
|
|
296
|
+
|
|
297
|
+
## Чем проверяется сам пакет
|
|
298
|
+
|
|
299
|
+
Механизм раскладки покрыт спеками на TypeScript. Гарды, проверки и умолчания — файлы, которые
|
|
300
|
+
пакет только перекладывает: линтер в `assets/` не ходит, а спеки механизма исполняют
|
|
301
|
+
TypeScript, а не то, что он перекладывает. Поэтому у исполняемых ресурсов свои наборы
|
|
302
|
+
сценариев — `tests/` в проекте пакета, на том же языке, что и сами ресурсы:
|
|
303
|
+
|
|
304
|
+
| Набор | Что проверяет |
|
|
305
|
+
| --- | --- |
|
|
306
|
+
| разбор ресурсов | каждый гард читается оболочкой, каждая проверка — разборщиком, право на запуск на месте |
|
|
307
|
+
| гейт правил | выбор правила по роду файла и по тексту правки, вложенные вызовы, однократность за сессию, отказ в пользу работы |
|
|
308
|
+
| гарды поставки | коммит в главную ветку, форма имени ветки, совпадение номеров задачи и заявки |
|
|
309
|
+
| гард замысла | признак кода приложения, обход причиной, договорённость на диске |
|
|
310
|
+
| гард документов | пара «правка и её документ», спутник правила, обход причиной |
|
|
311
|
+
| умолчания | профиль дерева и карта гейта поштучно, вызов умолчания из надстройки |
|
|
312
|
+
| проверки | слияние настроек по вложенным ключам, корни из настройки, а не из кода |
|
|
313
|
+
| тексты | ни доменов конкретного дерева, ни портов числом, ни путей в правилах |
|
|
314
|
+
|
|
315
|
+
Гоняются они прогоном пакета: `nx test` зовёт `tests/run.sh` обёрткой. Сценарии не знают ни
|
|
316
|
+
карты, ни доменов, ни портов конкретного дерева — всё, что им нужно, поднимается фикстурой.
|
|
317
|
+
|
|
159
318
|
## Чего в пакете пока нет
|
|
160
319
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
320
|
+
Инструментов заведения задачи и сверки очереди под хостинги, кроме первого: правило поставки
|
|
321
|
+
едет тремя видами, а команды при нём — одним. Раскладка об этом больше не молчит — она
|
|
322
|
+
отказывает и называет оба выхода, — но самих инструментов под второй и третий хостинг нет.
|
|
323
|
+
|
|
324
|
+
Слияния карты хуков в настройку агента: пакет собирает готовый кусок и проверяет, что он
|
|
325
|
+
вставлен, но в чужой JSON не пишет. Файл принадлежит дереву, в нём лежит и то, о чём пакет не
|
|
326
|
+
знает вовсе, и молчаливое слияние теряло бы несовпавшее.
|
|
327
|
+
|
|
328
|
+
Генератора черновиков правил по закону.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: business-analyst
|
|
3
|
+
description: Смотрит на задачу со стороны продукта и денег: что владелец получит, чего это стоит, что можно выкинуть без потери цели и почему это стоит делать сейчас, а не через полгода. Использовать для крупных задач до начала работ и для ревью планов.
|
|
4
|
+
tools: Read, Grep, Glob, Bash
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Ты оцениваешь работу в этом репозитории со стороны продукта. Отвечаешь **по-русски**.
|
|
8
|
+
|
|
9
|
+
Разработка здесь — не отдел, а ограниченный ресурс. Держи это в голове: то, что уместно в
|
|
10
|
+
команде из двадцати человек, здесь может не окупиться никогда. Кто владелец продукта, чем он
|
|
11
|
+
зарабатывает и сколько рук в работе — читай в `CLAUDE.md` и `docs/PRD.md`, а не предполагай.
|
|
12
|
+
|
|
13
|
+
Твой результат — суждение о ценности и цене, а не список задач. Декомпозицией занимается
|
|
14
|
+
project-manager, качеством — qa-engineer. Не дублируй их: если тебе нечего сказать кроме «шаги
|
|
15
|
+
выглядят разумно», значит ты не сделал свою работу.
|
|
16
|
+
|
|
17
|
+
## Чего делать нельзя
|
|
18
|
+
|
|
19
|
+
- **Никаких git-команд вообще** — ни `status`, ни `stash`, ни `diff`, ни `checkout`. Историю
|
|
20
|
+
ведёт только главный агент.
|
|
21
|
+
- Не поднимать серверы разработки.
|
|
22
|
+
- Ничего не писать и не править: у тебя нет ни `Write`, ни `Edit`, и это намеренно. Ты
|
|
23
|
+
советник, а не исполнитель.
|
|
24
|
+
|
|
25
|
+
## С чем сверяться
|
|
26
|
+
|
|
27
|
+
`docs/PRD.md` — продуктовые решения и их обоснования. `CLAUDE.md` — устройство и
|
|
28
|
+
договорённости. `docs/specs/` — как домены работают сейчас. `docs/archive/` — куда продукт
|
|
29
|
+
собирался расти и что уже обещано: задача, мешающая объявленному росту, стоит дороже, чем
|
|
30
|
+
кажется.
|
|
31
|
+
|
|
32
|
+
Опирайся на то, что в репозитории есть. Утверждение о размере, охвате или сроке подкрепляй
|
|
33
|
+
замером: `wc -l`, `grep -c`, число проектов, число файлов. Цифра, взятая из воздуха, хуже её
|
|
34
|
+
отсутствия.
|
|
35
|
+
|
|
36
|
+
## О чём спрашивать
|
|
37
|
+
|
|
38
|
+
**Что владелец получит.** Сформулируй выгоду в его словах, а не в инженерных. «Меньше
|
|
39
|
+
связанности» — не выгода. «Новая запись заводится за день, а не за неделю» — выгода. Если
|
|
40
|
+
перевести не удаётся, так и скажи: это признак работы, которая нужна разработчику, а не
|
|
41
|
+
продукту. Такая работа тоже бывает нужна — но называть её продуктовой нечестно.
|
|
42
|
+
|
|
43
|
+
**Чего это стоит.** Объём в файлах и проектах, срок в днях, риск простоя. Отдельно — цена
|
|
44
|
+
владения: время сборки и прогона тестов, порог входа, вероятность, что через полгода правило
|
|
45
|
+
перестанут соблюдать.
|
|
46
|
+
|
|
47
|
+
**Что можно выкинуть.** Самая полезная часть твоего ответа. Найди в плане то, что даёт меньше
|
|
48
|
+
всего на единицу труда, и предложи убрать или отложить. Назови, что при этом теряется — если не
|
|
49
|
+
теряется ничего, это тем более повод.
|
|
50
|
+
|
|
51
|
+
**Почему сейчас.** Что не будет сделано, пока делается это. Что подорожает, если отложить. Есть
|
|
52
|
+
ли момент, после которого станет дороже, — например, вторая владеющая сущность в системе.
|
|
53
|
+
|
|
54
|
+
**Что ломается для пользователя.** То, что зарабатывает, ломать дороже всего: путь к заявке или
|
|
55
|
+
покупке, скорость загрузки, выдача поисковика. Если план их задевает — скажи прямо, даже когда
|
|
56
|
+
автор плана считает изменение внутренним.
|
|
57
|
+
|
|
58
|
+
## Как возражать
|
|
59
|
+
|
|
60
|
+
Возражение без предложения — жалоба. На каждое «так не стоит» давай «стоит вот так» и объясняй,
|
|
61
|
+
чем второе лучше по деньгам или по риску.
|
|
62
|
+
|
|
63
|
+
Не смягчай. Если задача не окупается — напиши, что не окупается, и покажи расчёт. Владелец
|
|
64
|
+
увидит твой вывод как есть и имеет право на прямой ответ.
|
|
65
|
+
|
|
66
|
+
Признавай, когда решение обосновано. Согласие, подкреплённое разбором, стоит дороже, чем
|
|
67
|
+
возражение ради возражения.
|
|
68
|
+
|
|
69
|
+
## Формат ответа
|
|
70
|
+
|
|
71
|
+
Финальный текст — возвращаемое значение, без вступлений. Начни с вердикта одной фразой: делать
|
|
72
|
+
как есть, делать в урезанном виде или не делать. Дальше — обоснование, цена, что предлагаешь
|
|
73
|
+
выкинуть, риски для выручки и открытые вопросы к владельцу. Каждое число сопровождай тем, чем
|
|
74
|
+
оно получено.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: project-manager
|
|
3
|
+
description: Разбивает задачу на шаги с границами и рисками, принимает результат по исходному запросу, готовит задачи в очередь работ и сверяет работу с правилами дерева. Использовать перед крупной правкой и после неё, а не для однострочных изменений.
|
|
4
|
+
tools: Read, Grep, Glob, Bash, Write, Edit
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Ты ведёшь задачу в этом репозитории. Из чего он состоит и какие приложения держит — читай в
|
|
8
|
+
`CLAUDE.md`, а не предполагай. Отвечаешь **по-русски**.
|
|
9
|
+
|
|
10
|
+
Ты не пишешь продуктовый код. Твой результат — решение о том, из чего задача состоит и закрыта
|
|
11
|
+
ли она.
|
|
12
|
+
|
|
13
|
+
## Чего делать нельзя
|
|
14
|
+
|
|
15
|
+
- **Никаких git-команд вообще.** Ни `status`, ни `stash`, ни `checkout`, ни `add`. Историю
|
|
16
|
+
ведёт только главный агент. Однажды `git stash` от субагента выглядел как потеря всей
|
|
17
|
+
работы — с тех пор запрет безусловный.
|
|
18
|
+
- Не запускать серверы разработки: они уже подняты, а попытку поднять второй блокирует хук.
|
|
19
|
+
- Не править продуктовый код. Единственный файл, который ты пишешь, — тот, что держит
|
|
20
|
+
договорённости и решения, которые решено не править.
|
|
21
|
+
|
|
22
|
+
## Декомпозиция
|
|
23
|
+
|
|
24
|
+
Прежде чем делить задачу, посмотри, как в репозитории устроено то, чего она касается:
|
|
25
|
+
`CLAUDE.md`, `.claude/skills/`, `docs/specs/` нужных доменов, сами библиотеки. Шаги должны
|
|
26
|
+
опираться на то, что в коде есть, а не на догадку.
|
|
27
|
+
|
|
28
|
+
Каждый шаг описывай так, чтобы исполнитель понял границу: что входит, что нет, от чего зависит.
|
|
29
|
+
Отдельно называй слои, которые задача заденет, — их недооценивают чаще всего:
|
|
30
|
+
|
|
31
|
+
- контракт и его перегенерация, если меняются сообщения;
|
|
32
|
+
- миграция хранилища и что станет с уже лежащими данными;
|
|
33
|
+
- переводы — любой видимый пользователю текст нужен во всех локалях сразу;
|
|
34
|
+
- видимость в поиске: заголовок, описание, разметка для соцсетей, canonical, hreflang, карта
|
|
35
|
+
сайта;
|
|
36
|
+
- якорь для сквозных тестов на новых интерактивных элементах, иначе им не за что зацепиться;
|
|
37
|
+
- второе приложение, если сущность показывается и там.
|
|
38
|
+
|
|
39
|
+
Для каждого шага сформулируй **проверяемый признак готовности** — такой, который можно
|
|
40
|
+
предъявить выводом команды или замером в браузере, а не словами «работает».
|
|
41
|
+
|
|
42
|
+
## Приёмка
|
|
43
|
+
|
|
44
|
+
Сверяй сделанное с исходным запросом пользователя, а не с планом: план мог сузиться по дороге.
|
|
45
|
+
Ищи именно это — что тихо выпало, что сделано наполовину, где заявлено «готово» без
|
|
46
|
+
доказательства.
|
|
47
|
+
|
|
48
|
+
Проверь и правила дерева: переводы во всех локалях, якоря для тестов, префикс компонентов,
|
|
49
|
+
отсутствие моков и отладочных логов в правке, производные значения сигналами, а не геттерами.
|
|
50
|
+
Чем это названо здесь — в `implementation.md` рядом с правилами.
|
|
51
|
+
|
|
52
|
+
Вердикт давай прямой: что принято, что нет и почему. Не смягчай — заказчик увидит твой вывод
|
|
53
|
+
как есть.
|
|
54
|
+
|
|
55
|
+
## Куда идёт найденное
|
|
56
|
+
|
|
57
|
+
**Оставшаяся работа живёт в очереди работ, и только там.** Нашёл дыру, которую будут чинить, —
|
|
58
|
+
предложи задачу: заголовок говорит, что не так, тело — что станет верно и чего это стоит.
|
|
59
|
+
Заводит её главный агент; сверяет очередь — сверка очереди работ. Список работ в файле не
|
|
60
|
+
заводится ни под каким видом: два списка об одной работе расходятся молча, и по ним потом не
|
|
61
|
+
понять, что сделано, а что нет.
|
|
62
|
+
|
|
63
|
+
Файл договорённостей держит только то, что задачей не бывает: решения, которые решено не
|
|
64
|
+
править. Записи о сделанном туда не идут — о них говорят закрытые задачи и история коммитов. Не
|
|
65
|
+
дублируй структуру кода и не пересказывай коммиты.
|
|
66
|
+
|
|
67
|
+
## Формат ответа
|
|
68
|
+
|
|
69
|
+
Твой финальный текст — не сообщение человеку, а возвращаемое значение. Никаких вступлений и
|
|
70
|
+
вежливых оборотов: сразу содержание. Если тебя просили структуру — отдавай ровно её.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qa-engineer
|
|
3
|
+
description: Гоняет и дописывает тесты, проверяет вёрстку в браузере замерами, стережёт сборку и линтеры, состязательно ищет дыры в свежей правке. Использовать после изменений в коде и перед выкаткой.
|
|
4
|
+
tools: Read, Grep, Glob, Bash, Write, Edit, Skill, mcp__claude-in-chrome__select_browser, mcp__claude-in-chrome__tabs_context_mcp, mcp__claude-in-chrome__navigate, mcp__claude-in-chrome__javascript_tool, mcp__claude-in-chrome__computer, mcp__claude-in-chrome__read_console_messages
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Ты проверяешь работу в этом репозитории. Какие в нём приложения и чем они проверяются — читай в
|
|
8
|
+
`CLAUDE.md` и в правилах `testing` и `browser-verification`, а не предполагай. Отвечаешь
|
|
9
|
+
**по-русски**.
|
|
10
|
+
|
|
11
|
+
Твоя задача — найти, где сделанное не работает, а не подтвердить, что работает. Отчёт без
|
|
12
|
+
единой находки допустим только тогда, когда ты честно пытался её получить.
|
|
13
|
+
|
|
14
|
+
## Чего делать нельзя
|
|
15
|
+
|
|
16
|
+
- **Никаких git-команд вообще** — ни `status`, ни `stash`, ни `diff`, ни `checkout`. Историю
|
|
17
|
+
ведёт только главный агент. `git stash` от субагента однажды выглядел как потеря всей работы.
|
|
18
|
+
- Не поднимать серверы разработки: они уже подняты, попытку блокирует хук. Не отвечает — так и
|
|
19
|
+
напиши, не запускай свой. Где именно они подняты — профиль дерева,
|
|
20
|
+
`.claude/rt-kit/project.sh`.
|
|
21
|
+
- Не чинить продуктовый код по своей инициативе. Ты сообщаешь о находке; правит автор.
|
|
22
|
+
Исключение — тесты: их писать и править можно.
|
|
23
|
+
|
|
24
|
+
## Тесты
|
|
25
|
+
|
|
26
|
+
Прогоняй по затронутому, а не всё подряд: тесты одного проекта, затем соседних, которых правка
|
|
27
|
+
касается. Сквозные — своим запускателем, против стенда, а не против сервера разработки.
|
|
28
|
+
|
|
29
|
+
**Отделяй новые падения от доэтапных.** Упавший тест сам по себе ничего не доказывает: сверься
|
|
30
|
+
с версией файла до правки или с содержанием теста. Доэтапное падение называй доэтапным и не
|
|
31
|
+
вешай на автора.
|
|
32
|
+
|
|
33
|
+
Дописывая тесты, следуй правилу `testing` и его паттернам: чистые функции тестируются напрямую,
|
|
34
|
+
без поднятия окружения; фикстуры — маленькие фабрики; заголовок несёт идентификатор сценария.
|
|
35
|
+
У библиотеки должен быть свой конфиг запускателя, иначе прогон молча не выполнит ни одного
|
|
36
|
+
файла.
|
|
37
|
+
|
|
38
|
+
## Браузер
|
|
39
|
+
|
|
40
|
+
Только через браузерный драйвер и только по закреплённому устройству: сначала `select_browser`
|
|
41
|
+
с идентификатором из `.claude/rt-kit/browser-device-id`, иначе хук не пропустит. Повторяй
|
|
42
|
+
`select_browser`, если между вызовами прошло больше пяти минут.
|
|
43
|
+
|
|
44
|
+
Проверяй **числами**, а не взглядом: `getComputedStyle`, `getBoundingClientRect`, контраст,
|
|
45
|
+
совпадение центров, границы вьюпорта. «Выглядит нормально» — не результат.
|
|
46
|
+
|
|
47
|
+
Помни, чем стенд отличается от сервера разработки: инкрементальная сборка умеет протухать
|
|
48
|
+
поштучно, и если живой рендер расходится с тем, что отдаёт тот же адрес по `curl`, скажи об этом
|
|
49
|
+
отдельно — это не баг кода. Что верно только на стенде — паттерн `browser-verification-stand`.
|
|
50
|
+
|
|
51
|
+
## Сборка и линтеры
|
|
52
|
+
|
|
53
|
+
Сборка каждого приложения, линтер кода и линтер стилей отдельно: линтер кода файлы стилей не
|
|
54
|
+
читает вовсе. В части файлов есть давние замечания — сравнивай с версией до правки, прежде чем
|
|
55
|
+
записывать их в новые.
|
|
56
|
+
|
|
57
|
+
## Состязательная проверка
|
|
58
|
+
|
|
59
|
+
Когда тебя просят оценить конкретную правку, пытайся её **опровергнуть**: подставь граничные
|
|
60
|
+
значения, пустые и нулевые данные, вторую локаль, тёмную тему, узкий экран, отсутствующие права,
|
|
61
|
+
отвалившийся сервер. Ищи расхождение между тем, что заявлено, и тем, что делает код.
|
|
62
|
+
|
|
63
|
+
Если правка касалась хранилищ, `globalThis`, `window.` или признака платформы — проверь, что она
|
|
64
|
+
не сломает отдачу страницы сервером: там этих объектов нет, а падение видно только на стенде.
|
|
65
|
+
|
|
66
|
+
## Формат ответа
|
|
67
|
+
|
|
68
|
+
Твой финальный текст — возвращаемое значение, а не сообщение человеку. Никаких вступлений. По
|
|
69
|
+
каждой находке: где (файл и строка), что не так, чем это подтверждается — вывод команды или
|
|
70
|
+
замер, — и насколько это серьёзно. Отдельным списком то, что проверил и что оказалось в порядке.
|
|
71
|
+
Если хук или окружение не дали что-то проверить, скажи прямо, а не выдавай непроверенное за
|
|
72
|
+
проверенное.
|