@rt-tools/agent-kit 0.8.2 → 0.8.3
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 +1 -0
- package/assets/agents/rules-reviewer.md +83 -0
- package/assets/checks/check-dupes.mjs +66 -6
- package/assets/checks/check-specs.mjs +100 -15
- package/assets/checks/rt-kit-checks.config.mjs +9 -0
- package/assets/commands/feedback.md +95 -0
- package/assets/commands/rules-review.md +98 -0
- package/assets/commands/skill-curator.md +39 -22
- package/assets/docs/GLOSSARY.md +21 -20
- package/assets/hooks/reuse-first-guard.sh +16 -2
- package/assets/hooks/skill-gate.sh +1 -1
- package/assets/hooks/task-flow-guard.sh +16 -2
- package/assets/hooks/waiting-turn-guard.sh +87 -0
- package/assets/laws/delivery.md +28 -0
- package/assets/laws/project-documentation.md +18 -0
- package/assets/laws/work-conduct.md +16 -0
- package/assets/patterns/git-workflow-commit.azure.md +74 -2
- package/assets/patterns/git-workflow-commit.github.md +75 -2
- package/assets/patterns/git-workflow-commit.gitlab.md +75 -4
- package/assets/patterns/git-workflow-docker.md +30 -0
- package/assets/patterns/task-flow-close.md +154 -47
- package/assets/patterns/task-flow-handoff.md +1 -1
- package/assets/patterns/task-flow-resume.md +3 -3
- package/assets/patterns/task-flow-start.md +32 -5
- package/assets/rules/angular-patterns.md +22 -0
- package/assets/rules/api-layer.md +25 -0
- package/assets/rules/browser-verification.md +32 -0
- package/assets/rules/component-structure.md +21 -0
- package/assets/rules/dependencies.md +22 -0
- package/assets/rules/doc-style.md +24 -0
- package/assets/rules/entity-conventions.needs-admin.md +21 -0
- package/assets/rules/entity-models.md +21 -0
- package/assets/rules/git-workflow.azure.md +50 -1
- package/assets/rules/git-workflow.github.md +48 -2
- package/assets/rules/git-workflow.gitlab.md +49 -1
- package/assets/rules/lib-layers.md +25 -0
- package/assets/rules/lists.md +27 -0
- package/assets/rules/navigation.md +21 -0
- package/assets/rules/observability.needs-app.md +23 -0
- package/assets/rules/permissions.md +23 -0
- package/assets/rules/platform-access.md +21 -0
- package/assets/rules/reuse-first.md +20 -0
- package/assets/rules/seo.md +19 -0
- package/assets/rules/shared-code.md +19 -0
- package/assets/rules/spec-driven.md +32 -0
- package/assets/rules/styling-bem.md +19 -0
- package/assets/rules/task-flow.md +107 -17
- package/assets/rules/testing.md +31 -0
- package/assets/rules/translations.md +21 -0
- package/assets/rules/typescript-conventions.md +21 -0
- package/assets/samples/specs/_template/spec.md +83 -0
- package/assets/samples/tasks/_template/grill.md +28 -0
- package/assets/samples/tasks/_template/plan.md +39 -0
- package/assets/samples/tasks/_template/progress.md +23 -0
- package/assets/skills/agent-kit.md +16 -2
- package/assets/templates/rule.md +31 -2
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +1 -0
- package/lib/commands.js.map +1 -1
- package/lib/config.d.ts +10 -1
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +4 -0
- package/lib/config.js.map +1 -1
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.8.3.tgz +0 -0
- package/rt-tools-agent-kit-0.8.2.tgz +0 -0
|
@@ -30,6 +30,29 @@ description: Правило под «Закон о наблюдаемости».
|
|
|
30
30
|
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
31
31
|
же дереве, которое держит код иначе.
|
|
32
32
|
|
|
33
|
+
## Ход
|
|
34
|
+
|
|
35
|
+
Ход обработки запроса глазами наблюдаемости: где заводится номер обращения, чем отличается
|
|
36
|
+
отказ от поломки и что уходит наружу.
|
|
37
|
+
|
|
38
|
+
```mermaid
|
|
39
|
+
flowchart TD
|
|
40
|
+
A[Пришёл запрос] --> B{Номер обращения пришёл снаружи}
|
|
41
|
+
B -->|Да| C[Чистится и укорачивается]
|
|
42
|
+
B -->|Нет| D[Заводится заново, один на весь запрос]
|
|
43
|
+
C --> E[Стоит в каждой строке лога об этом запросе]
|
|
44
|
+
D --> E
|
|
45
|
+
E --> F{Чем кончилась работа}
|
|
46
|
+
F -->|Сделано| G[Ответ уходит с номером обращения в заголовке]
|
|
47
|
+
F -->|Ввод или права| H[Пишется отдельно от поломки и без стека: это сработавшая проверка]
|
|
48
|
+
F -->|Поломка| I[Причина разбирается в одном месте, поля строки вычищаются всегда]
|
|
49
|
+
H --> J[Наружу — код и общий текст; подробности остаются в логах]
|
|
50
|
+
I --> J
|
|
51
|
+
J --> K[Номер обращения стоит и в подробностях отказа]
|
|
52
|
+
G --> L[Готово]
|
|
53
|
+
K --> L
|
|
54
|
+
```
|
|
55
|
+
|
|
33
56
|
## Как закон применяется здесь
|
|
34
57
|
|
|
35
58
|
- **Номер обращения заводится один раз на запрос и стоит в каждой строке лога о нём.** По
|
|
@@ -28,6 +28,29 @@ description: Правило под «Закон о доступе». Брать
|
|
|
28
28
|
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
29
29
|
же дереве, которое держит код иначе.
|
|
30
30
|
|
|
31
|
+
## Ход
|
|
32
|
+
|
|
33
|
+
Ход проверки доступа: чем закрыта процедура, откуда берутся права вошедшего и чем отличается
|
|
34
|
+
отсутствие входа от отсутствия права.
|
|
35
|
+
|
|
36
|
+
```mermaid
|
|
37
|
+
flowchart TD
|
|
38
|
+
A[Вызов процедуры] --> B{Каким видом доступа она объявлена}
|
|
39
|
+
B -->|Публично| C{Она заводит запись}
|
|
40
|
+
C -->|Да| D[Работает ещё и ограничитель частоты]
|
|
41
|
+
C -->|Нет| E[Работа идёт]
|
|
42
|
+
B -->|Любому вошедшему| F{Вход есть}
|
|
43
|
+
B -->|По праву| F
|
|
44
|
+
F -->|Нет| G[Отбивается как неаутентифицированный]
|
|
45
|
+
F -->|Да| H{Учётная запись ещё существует}
|
|
46
|
+
H -->|Нет| G
|
|
47
|
+
H -->|Да| I[Права читаются при каждом вызове: пресет плюс личные правки поверх]
|
|
48
|
+
I --> J{Право дано}
|
|
49
|
+
J -->|Да| E
|
|
50
|
+
J -->|Нет, либо роль о нём молчит| K[Отбивается как отказ в доступе: молчание — не разрешение]
|
|
51
|
+
D --> E
|
|
52
|
+
```
|
|
53
|
+
|
|
31
54
|
## Как закон применяется здесь
|
|
32
55
|
|
|
33
56
|
- **Каждая процедура объявляет свой доступ декоратором, и объявление ровно одно.**
|
|
@@ -34,6 +34,27 @@ description: Правило под «Закон о фронтовом прило
|
|
|
34
34
|
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
35
35
|
же дереве, которое держит код иначе.
|
|
36
36
|
|
|
37
|
+
## Ход
|
|
38
|
+
|
|
39
|
+
Ход обращения к среде исполнения: чем берётся глобальный объект, где проверяется среда и что
|
|
40
|
+
делается в файле без внедрения зависимостей.
|
|
41
|
+
|
|
42
|
+
```mermaid
|
|
43
|
+
flowchart TD
|
|
44
|
+
A[Коду нужен глобальный объект или среда] --> B{Где он лежит}
|
|
45
|
+
B -->|Класс с внедрением зависимостей| C[Глобальный объект приходит токеном, а не берётся напрямую]
|
|
46
|
+
B -->|Чистая функция| D[Окно принимается параметром: внедрения там нет]
|
|
47
|
+
C --> E{Нужно знать, где исполняется код}
|
|
48
|
+
D --> E
|
|
49
|
+
E -->|Да| F[Спрашивается служба платформы, а не наличие имени в окружении]
|
|
50
|
+
E -->|Нет| G[Работа идёт]
|
|
51
|
+
F --> G
|
|
52
|
+
G --> H{Класс создаётся на подъёме приложения}
|
|
53
|
+
H -->|Да| I[Проверяется и отдача страницы сервером: линтер этого не видит]
|
|
54
|
+
H -->|Нет| J[Готово]
|
|
55
|
+
I --> J
|
|
56
|
+
```
|
|
57
|
+
|
|
37
58
|
## Как закон применяется здесь
|
|
38
59
|
|
|
39
60
|
- **Глобальный объект приходит токеном `WINDOW`, а не берётся напрямую.** Тип уточняется
|
|
@@ -25,6 +25,26 @@ description: Правило под «Закон о единообразии пр
|
|
|
25
25
|
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
26
26
|
же дереве, которое держит код иначе.
|
|
27
27
|
|
|
28
|
+
## Ход
|
|
29
|
+
|
|
30
|
+
Ход заведения нового: с чего начинается работа, где проходит граница между расширением готового
|
|
31
|
+
и своим, и чем эта граница держится.
|
|
32
|
+
|
|
33
|
+
```mermaid
|
|
34
|
+
flowchart TD
|
|
35
|
+
A[Нужен новый экран, компонент или поле] --> B[Читается готовое: набор приложения, общие основы, соседний экран]
|
|
36
|
+
B --> C{Готовое подходит}
|
|
37
|
+
C -->|Да| D[Берётся как есть]
|
|
38
|
+
C -->|Почти| E[Расширяется там, где живёт, а не клонируется рядом]
|
|
39
|
+
C -->|Нет| F{Владелец одобрил своё}
|
|
40
|
+
F -->|Да| G[Заводится своё, и это записано решением]
|
|
41
|
+
F -->|Нет| H[Спрашивается: свой примитив без слова владельца не заводится]
|
|
42
|
+
E --> I[Компонент объявляется тремя файлами, сообщения идут общей шиной]
|
|
43
|
+
D --> I
|
|
44
|
+
G --> I
|
|
45
|
+
H --> I
|
|
46
|
+
```
|
|
47
|
+
|
|
28
48
|
## Как закон применяется здесь
|
|
29
49
|
|
|
30
50
|
- **Источник вида выбирается по приложению, а не по привычке.** У каждого приложения дерева
|
package/assets/rules/seo.md
CHANGED
|
@@ -30,6 +30,25 @@ description: Правило под «Закон о видимости в пои
|
|
|
30
30
|
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
31
31
|
же дереве, которое держит код иначе.
|
|
32
32
|
|
|
33
|
+
## Ход
|
|
34
|
+
|
|
35
|
+
Ход отдачи страницы поисковику: что ставится в разметку, чем связаны локали и что делается с
|
|
36
|
+
прежним адресом.
|
|
37
|
+
|
|
38
|
+
```mermaid
|
|
39
|
+
flowchart TD
|
|
40
|
+
A[Страница отдаётся] --> B[Свои теги помечаются признаком и при повторе переписываются, а не множатся]
|
|
41
|
+
B --> C[Канонический адрес ведёт на локализованный путь этой страницы]
|
|
42
|
+
C --> D[Связи локалей строятся по готовым локалям плюс запасная]
|
|
43
|
+
D --> E{Локаль самой страницы}
|
|
44
|
+
E -->|В список запасных не попадает| F[Иначе она объявлена и своей, и чужой]
|
|
45
|
+
F --> G[Данные для поиска отдаются блоками: отказ одного не уносит остальные]
|
|
46
|
+
G --> H{Адрес страницы менялся}
|
|
47
|
+
H -->|Да| I[С прежнего идёт перенаправление со сроком хранения, покрытое проверкой]
|
|
48
|
+
H -->|Нет| J[Готово]
|
|
49
|
+
I --> J
|
|
50
|
+
```
|
|
51
|
+
|
|
33
52
|
## Как закон применяется здесь
|
|
34
53
|
|
|
35
54
|
- **Свои теги помечены атрибутом `data-<префикс>-seo`** и при повторном применении переписываются.
|
|
@@ -27,6 +27,25 @@ description: Правило под «Закон об общем коде при
|
|
|
27
27
|
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
28
28
|
же дереве, которое держит код иначе.
|
|
29
29
|
|
|
30
|
+
## Ход
|
|
31
|
+
|
|
32
|
+
Ход заведения общего значения: где оно живёт, что считается копией и чем сверяются стороны.
|
|
33
|
+
|
|
34
|
+
```mermaid
|
|
35
|
+
flowchart TD
|
|
36
|
+
A[Значение нужно обеим сторонам] --> B{Оно уже есть в общем наборе}
|
|
37
|
+
B -->|Да| C[Берётся оттуда: своё с теми же членами — копия, и она разойдётся молча]
|
|
38
|
+
B -->|Нет| D{Оно про предмет домена}
|
|
39
|
+
D -->|Да| E[Живёт в домене: перечисления полей порядка и отбора копией не считаются]
|
|
40
|
+
D -->|Нет| F[Живёт в общей либе и оттуда берётся обеими сторонами]
|
|
41
|
+
C --> G{Пришло значение вне набора}
|
|
42
|
+
E --> G
|
|
43
|
+
F --> G
|
|
44
|
+
G -->|Да| H[Сверяется общей парой функций, а разбирает промах вызывающий: политика у сторон разная]
|
|
45
|
+
G -->|Нет| I[Готово]
|
|
46
|
+
H --> I
|
|
47
|
+
```
|
|
48
|
+
|
|
30
49
|
## Как закон применяется здесь
|
|
31
50
|
|
|
32
51
|
- **Число-настройка лежит в `libs/common/util` и оттуда берётся обеими сторонами.** Умолчание
|
|
@@ -56,6 +56,31 @@ description: Правило под «Закон о документации пр
|
|
|
56
56
|
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
57
57
|
же дереве, которое держит код иначе.
|
|
58
58
|
|
|
59
|
+
## Ход
|
|
60
|
+
|
|
61
|
+
Ход заведения текста: какой слой пишется, чем утверждение привязывается к коду и что происходит
|
|
62
|
+
со сценарием после выкатки.
|
|
63
|
+
|
|
64
|
+
```mermaid
|
|
65
|
+
flowchart TD
|
|
66
|
+
A[Пишется текст о продукте или о работе] --> B{О чём он}
|
|
67
|
+
B -->|Что должно быть верно, без имён| C[Закон: обязателен раздел статей, путей в нём нет]
|
|
68
|
+
B -->|Каким приёмом это держится здесь| D[Правило: объявляет свой закон, имена — в компаньоне рядом]
|
|
69
|
+
B -->|Готовый код и приём| E[Паттерн: объявляет своё правило]
|
|
70
|
+
B -->|Как работает домен| F[Спек домена: объявляет законы, которые применяет]
|
|
71
|
+
D --> G{У утверждения есть место в коде}
|
|
72
|
+
F --> G
|
|
73
|
+
G -->|Да| H[Ставится строка привязки; связь сверяется в обе стороны]
|
|
74
|
+
G -->|Нет| I[Это намерение: уходит в открытые вопросы, а не в правила]
|
|
75
|
+
H --> J{Заводится сценарий}
|
|
76
|
+
J -->|Да| K[Номер выдаётся новый и повторно не используется; заголовок теста правится тем же изменением]
|
|
77
|
+
J -->|Нет| L[Готово]
|
|
78
|
+
C --> L
|
|
79
|
+
E --> L
|
|
80
|
+
K --> L
|
|
81
|
+
I --> L
|
|
82
|
+
```
|
|
83
|
+
|
|
59
84
|
## Как закон применяется здесь
|
|
60
85
|
|
|
61
86
|
- **Набор разделов спека задан заранее, и отсутствие раздела — отказ.** «Не применимо» —
|
|
@@ -136,6 +161,13 @@ description: Правило под «Закон о документации пр
|
|
|
136
161
|
доменов раньше, чем код научился в него приходить, и всё это время читалось описанием
|
|
137
162
|
работающего.
|
|
138
163
|
|
|
164
|
+
Полноту разделов у самого закона, правила и паттерна здесь не проверяет ничто. Статьи о том,
|
|
165
|
+
что текст судится не слабее своей копии, что невыбранная редакция судится наравне с выбранной и
|
|
166
|
+
что набор разделов объявлен отдельно от образца, исполняются там, где эти тексты пишут, — в
|
|
167
|
+
наборе того пакета, который их везёт. В дереве-потребителе лежат разложенные копии, и краснеть
|
|
168
|
+
у него на промахе, который правится не у него, проверка не должна. Согласие двух текстов между
|
|
169
|
+
собой не считается нигде и ни у кого: оно ищется чтением.
|
|
170
|
+
|
|
139
171
|
## Паттерны
|
|
140
172
|
|
|
141
173
|
- `spec-driven-domain` — заведение и правка спека домена, сценарии, привязка.
|
|
@@ -27,6 +27,25 @@ description: Правило под «Закон о фронтовом прило
|
|
|
27
27
|
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
28
28
|
же дереве, которое держит код иначе.
|
|
29
29
|
|
|
30
|
+
## Ход
|
|
31
|
+
|
|
32
|
+
Ход правки оформления: откуда берётся значение, где живёт раскладка и чем открывается
|
|
33
|
+
всплывающее.
|
|
34
|
+
|
|
35
|
+
```mermaid
|
|
36
|
+
flowchart TD
|
|
37
|
+
A[Правится оформление] --> B{Что задаётся}
|
|
38
|
+
B -->|Цвет, отступ, кегль| C[Берётся токеном оформления, а не пишется значением на месте]
|
|
39
|
+
B -->|Раскладка экрана| D[Объявляется в общем слое приложения, а не в стилях экрана]
|
|
40
|
+
B -->|Слой поверх страницы| E[Открывается службой набора; номер слоя берётся из шкалы]
|
|
41
|
+
C --> F[Класс ставится директивой, и у каждого класса элемента есть своё правило]
|
|
42
|
+
D --> F
|
|
43
|
+
E --> F
|
|
44
|
+
F --> G{Размер элемента управления}
|
|
45
|
+
G -->|Выбирается по признаку указателя, а не по ширине экрана| H[Файл стилей держится в пределах длины]
|
|
46
|
+
H --> I[Прогон линтера стилей: предупреждение роняет его наравне с ошибкой]
|
|
47
|
+
```
|
|
48
|
+
|
|
30
49
|
## Как закон применяется здесь
|
|
31
50
|
|
|
32
51
|
- **Оформление берётся токеном `--rt-*`, а не пишется значением на месте.** Составные
|
|
@@ -22,7 +22,8 @@ description: Правило под «Закон о ведении работы»
|
|
|
22
22
|
| замысел | `docs/tasks/<ветка>/plan.md` — след задачи и этапы с признаками готовности; после написания не правится |
|
|
23
23
|
| ход работы | `docs/tasks/<ветка>/progress.md` — «Где стоим», решения по ходу, записи заходов; единственное место, где отмечается сделанное |
|
|
24
24
|
| договорённость о продукте, записанная до кода | `docs/specs/<домен>/proposed/<фича>/` — спек фичи; переживает мерж и вливается в спек домена |
|
|
25
|
-
| эпик — работа шире одной ветки | карточка в очереди работ с меткой эпика и
|
|
25
|
+
| эпик — работа шире одной ветки | карточка в очереди работ с меткой эпика и замысел эпика рядом с ней: возможность, состав задач и их порядок |
|
|
26
|
+
| замысел эпика | запись вне папки задачи — та умирает с мержем, а эпик её переживает; каталог для неё называет компаньон правила |
|
|
26
27
|
| папка задачи до заведения задачи | `docs/tasks/_draft-<slug>/` — вне истории, пока номера нет |
|
|
27
28
|
| разведка | заход `Explore` или `general-purpose` до первого вопроса владельцу |
|
|
28
29
|
| разбор замысла ролями | `.claude/workflows/plan.js` — нужность, договорённость, критика, замысел |
|
|
@@ -44,24 +45,72 @@ description: Правило под «Закон о ведении работы»
|
|
|
44
45
|
| 1 | Разведка по дереву — до первого вопроса владельцу | `task-flow-start` |
|
|
45
46
|
| 2 | Разбор просьбы с владельцем, шесть обязательных вопросов | `task-flow-start` |
|
|
46
47
|
| 3 | Конвейер ролей после разбора | `task-flow-start` |
|
|
47
|
-
| 4 |
|
|
48
|
-
| 5 |
|
|
49
|
-
| 6 |
|
|
50
|
-
| 7 |
|
|
51
|
-
| 8 |
|
|
52
|
-
| 9 |
|
|
53
|
-
| 10 |
|
|
54
|
-
| 11 |
|
|
55
|
-
| 12 |
|
|
56
|
-
| 13 |
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
48
|
+
| 4 | Серия задач объявляется эпиком — карточкой и замыслом | `task-flow-start` |
|
|
49
|
+
| 5 | Задача, ветка, папка задачи | `task-flow-start` |
|
|
50
|
+
| 6 | Шапка замысла и сам замысел | `task-flow-start` |
|
|
51
|
+
| 7 | Возвращение к работе новым заходом | `task-flow-resume` |
|
|
52
|
+
| 8 | Этап замысла делается и отмечается в ходе работы | `task-flow-resume` |
|
|
53
|
+
| 9 | Заход закрывается передачей | `task-flow-handoff` |
|
|
54
|
+
| 10 | Работа отдаётся на разбор: PR открыт, ожидание названо | `task-flow-close` |
|
|
55
|
+
| 11 | Следующая задача эпика берётся тем же движением | `task-flow-resume` |
|
|
56
|
+
| 12 | Договорённость вливается в спек домена | `task-flow-close` |
|
|
57
|
+
| 13 | Тексты домена приводятся к сделанному | `task-flow-close` |
|
|
58
|
+
| 14 | Папка задачи разбирается | `task-flow-close` |
|
|
59
|
+
| 15 | Сверка очереди работ | `task-flow-close` |
|
|
60
|
+
| 16 | Работа разбирается правилами — фоном, следом за PR | `task-flow-close` |
|
|
61
|
+
| 17 | Находки разбора принимаются одним ходом и ждут владельца | `task-flow-close` |
|
|
62
|
+
|
|
63
|
+
Шаги 7–9 повторяются, пока этапы замысла не кончатся: первый заход входит в работу шагом 1 и
|
|
64
|
+
доходит до 8, дальше каждый следующий начинается шагом 7. Шаг 4 идёт только у работы, из которой
|
|
65
|
+
видно серию задач. Шаги 10–17 идут один раз, когда работа кончена.
|
|
66
|
+
|
|
67
|
+
Порядок в таблице — тот, в каком шаги случаются, а не тот, в каком о них удобно рассказывать.
|
|
68
|
+
Следующая задача берётся раньше уборки за предыдущей: работа, отданная на разбор, ждёт владельца,
|
|
69
|
+
и заход этим ожиданием не занимают. Список, в котором уборка стоит раньше, читается как
|
|
70
|
+
разрешение сидеть над зелёным PR до ответа.
|
|
71
|
+
|
|
72
|
+
Три шага идут не в очередь, а рядом с работой: прогон конвейера, разбор владельцем и разбор
|
|
73
|
+
закрытой работы правилами. Ни один из них не спрашивает исполнителя, пока идёт, и ни один не
|
|
74
|
+
ускоряется от того, что его ждут, — поэтому шаг 11 случается раньше, чем кончатся 10 и 16, а
|
|
75
|
+
шаг 17 вклинивается в работу следующей задачи ровно на один ход. Порядок номеров говорит, что
|
|
76
|
+
за чем следует, а не что чего дожидается.
|
|
61
77
|
|
|
62
78
|
Список показывается владельцу в начале работы, и на нём же отмечается, где стоим: иначе после
|
|
63
79
|
шести вопросов не видно ни того, что будет дальше, ни сколько всего впереди.
|
|
64
80
|
|
|
81
|
+
## Ход
|
|
82
|
+
|
|
83
|
+
Ход работы от просьбы владельца до закрытия: где стоит разбор, что требует гард и куда девается
|
|
84
|
+
папка задачи.
|
|
85
|
+
|
|
86
|
+
```mermaid
|
|
87
|
+
flowchart TD
|
|
88
|
+
A[Просьба владельца] --> B[Разведка по дереву — до первого вопроса]
|
|
89
|
+
B --> C[Разбор просьбы: шесть обязательных вопросов, ответы ложатся на диск]
|
|
90
|
+
C --> D{Правка задевает код приложения}
|
|
91
|
+
D -->|Да| E[Пишется договорённость о продукте — до кода]
|
|
92
|
+
D -->|Нет| F[В замысле стоит причина, по которой её нет]
|
|
93
|
+
E --> Z{Из разбора вышло несколько задач}
|
|
94
|
+
F --> Z
|
|
95
|
+
Z -->|Да| Y[Серия объявляется эпиком: карточкой и замыслом, до первой задачи]
|
|
96
|
+
Z -->|Нет| G[Задача, ветка, папка задачи по имени ветки]
|
|
97
|
+
Y --> G
|
|
98
|
+
G --> H[Замысел с этапами; после записи он не правится]
|
|
99
|
+
H --> I{Этап сделан}
|
|
100
|
+
I -->|Да| J[Отметка в ходе работы — единственном месте, где отмечается сделанное]
|
|
101
|
+
J --> I
|
|
102
|
+
I -->|Этапы кончились| K[PR открывается; исполнитель называет номер, чего ждёт и что сделает следом]
|
|
103
|
+
K --> W[Разбор закрытой работы правилами уходит в фон, находки ложатся на диск]
|
|
104
|
+
W --> L[Пока PR ждёт разбора, берётся следующая задача]
|
|
105
|
+
L --> M{Разбор и прогон кончились}
|
|
106
|
+
M -->|Красный прогон или замечания| V[Чинится в той же ветке: замысел на диске ещё нужен]
|
|
107
|
+
V --> M
|
|
108
|
+
M -->|Зелено и замечаний нет| T[Договорённость вливается в спек домена, тексты приводятся к сделанному]
|
|
109
|
+
T --> N[Папка задачи разбирается последним коммитом: разбор просьбы — в описание прошлого, находки — к замыслу эпика, замысел — прочь]
|
|
110
|
+
N --> S[Сверка очереди работ]
|
|
111
|
+
S --> O[Черновик снимается, слияние нажимает человек]
|
|
112
|
+
```
|
|
113
|
+
|
|
65
114
|
## Как закон применяется здесь
|
|
66
115
|
|
|
67
116
|
- **Правка кода приложения отбивается, пока на диске нет замысла.** Гард требует папку задачи
|
|
@@ -86,12 +135,28 @@ description: Правило под «Закон о ведении работы»
|
|
|
86
135
|
читает однозначно, а зелёный прогон на странице — нет: он говорит, что не сломано, и молчит
|
|
87
136
|
о том, что ветка ждёт ещё одного коммита. Трижды подряд PR был влит внутри этого молчания.
|
|
88
137
|
- **Просьба о слиянии — отдельный ход, и раньше уборки её не бывает.** Порядок один: PR открыт
|
|
89
|
-
→ прогон зелёный → папка задачи разобрана и запушена →
|
|
90
|
-
номер. До этой просьбы работа не готова, сколько бы зелёного
|
|
138
|
+
черновиком → прогон зелёный → папка задачи разобрана и запушена → черновик снят →
|
|
139
|
+
исполнитель просит влить, называя номер. До этой просьбы работа не готова, сколько бы зелёного
|
|
140
|
+
на её странице ни было.
|
|
141
|
+
- **PR открывается черновиком, а не в конце работы.** Пока правка кода не выложена в PR,
|
|
142
|
+
владелец её не видит вовсе: ветка не приходит ему во входящие и обсуждения не имеет.
|
|
143
|
+
Открытый PR при этом читается как приглашение влить — поэтому незаконченная работа идёт
|
|
144
|
+
черновиком, и владельцу не приходится спрашивать, кончилась ли она. Черновик снимается тем
|
|
145
|
+
ходом, которым исполнитель говорит, что решение готово.
|
|
91
146
|
- **Пока PR ждёт разбора, исполнитель берёт следующую задачу.** Ожидание чужого шага заходом
|
|
92
147
|
не занимают: работа уходит на разбор, и тем же движением берётся следующая. Готовым к
|
|
93
148
|
слиянию прежний PR становится не сам — его доводит до готовности исполнитель, вернувшись к
|
|
94
149
|
нему тем же ходом, которым прочитал конец прогона.
|
|
150
|
+
- **Ход, в котором открыт PR, стережёт гард ожидания, а не память исполнителя.** Он отбивает
|
|
151
|
+
завершение хода, в котором не было ни одного действия по следующей задаче — заведения задачи,
|
|
152
|
+
ветки, папки или перевода колонки. Признак берётся из самого хода: спросить хостинг об
|
|
153
|
+
открытых PR было бы точнее, но сетевой вызов на завершении хода падает вместе со связью и
|
|
154
|
+
отбивал бы работу вместо промаха. Слова «беру следующую задачу» гард действием не считает —
|
|
155
|
+
ровно потому, что их и произносят вместо неё.
|
|
156
|
+
- **Конец прогона узнаётся возвратом фоновой команды, а не взглядом на страницу.** Ожидание,
|
|
157
|
+
запущенное в фоне отдельным ходом, возвращает исполнителя к PR само; до тех пор ход занят
|
|
158
|
+
следующей задачей. Взгляд на страницу этого не даёт: он либо повторяется вхолостую, либо не
|
|
159
|
+
повторяется вовсе, и оба исхода со стороны выглядят одинаково — работа не двигается.
|
|
95
160
|
- **Отказ гарда кончает ход.** Другого пути к отбитой правке не ищут: ни командой оболочки, ни
|
|
96
161
|
соседним инструментом, ни правкой самого гарда. Отбитая правка либо делается после того, как
|
|
97
162
|
условие отказа выполнено, либо не делается вовсе — и тогда владельцу называется отказ, а не
|
|
@@ -133,6 +198,31 @@ description: Правило под «Закон о ведении работы»
|
|
|
133
198
|
`npm run task:new` переименовывает черновик и проставляет шапку замысла.
|
|
134
199
|
- **Брошенный разбор виден.** Черновик старше недели перечисляет сверка очереди работ —
|
|
135
200
|
задачи за ним ещё нет, и спросить о нём некого.
|
|
201
|
+
- **Замысел эпика лежит там, где его найдут без сети и после мержа.** Карточка в очереди работ
|
|
202
|
+
говорит, что эпик есть, но порядка задач не держит; папка задачи держала бы его ровно до
|
|
203
|
+
слияния первой из них. Каталог для замысла называет компаньон правила: у пакета своего пути
|
|
204
|
+
нет, а замысел, положенный каждым заходом заново, теряет решения предыдущих.
|
|
205
|
+
- **Закрытая работа разбирается правилами, и это шаг закрытия, а не отдельная просьба.** Что
|
|
206
|
+
грузилось, что помогло и чего не хватило, видно только тому заходу, который работу вёл; через
|
|
207
|
+
сутки этого нет ни у кого. Разбор кончается правкой слоя правил или предложением наружу —
|
|
208
|
+
разбор, из которого не вышло ни того ни другого, объясняет случившееся и ничего не меняет.
|
|
209
|
+
Ведёт его роль разбора закрытой задачи, если дерево её разложило; не разложившее ведёт разбор
|
|
210
|
+
само, и требование от этого не слабеет.
|
|
211
|
+
- **Разбор закрытой работы уходит в фон, а исполнитель берёт следующую задачу.** Роль работает
|
|
212
|
+
своим ходом и у исполнителя ничего не спрашивает; держать ради неё заход незачем. Сводку для
|
|
213
|
+
неё собирают до запуска — пока задача ещё в голове, — а вернувшиеся находки принимают одним
|
|
214
|
+
ходом: записать и продолжить прежнее. Порядок и место записи — паттерн закрытия работы.
|
|
215
|
+
- **Находки разбора ждут владельца, а в пакет уезжает только сводка наблюдений.** Предложение —
|
|
216
|
+
это заготовка правки чужого дерева, и часть заготовок отпадает при первом же чтении; уехавшая
|
|
217
|
+
без разбора, она становится работой того, кто её не заказывал. Сводка наблюдений уезжает
|
|
218
|
+
всегда: она говорит, чем пользовались и чем нет, и мнением не является.
|
|
219
|
+
- **Ожидание прогона работой не занимают.** Прогон идёт на стороне и быстрее от взгляда на него
|
|
220
|
+
не становится. Пока он идёт, берётся следующая задача, а к прогону возвращаются тем ходом,
|
|
221
|
+
которым читают его конец. Это верно и для разбора владельцем: оба ожидания — не повод стоять.
|
|
222
|
+
- **Остановка, если она всё-таки случилась, называется владельцу отдельной репликой.** Не
|
|
223
|
+
строкой в конце отчёта: там она тонет — владелец читает отчёт как рассказ о сделанном.
|
|
224
|
+
Называются три вещи: что стоит, чего оно ждёт и что владелец может решить — разобрать работу
|
|
225
|
+
первой или сказать, что прогона можно не ждать. Всё остальное идёт после.
|
|
136
226
|
- **Договорённость вливается в спек домена последним коммитом PR.** К этому моменту код
|
|
137
227
|
написан, привязки известны, и в главной ветке директория `proposed/` не появляется вовсе.
|
|
138
228
|
Готовые к вливанию перечисляет `npm run check:specs`.
|
package/assets/rules/testing.md
CHANGED
|
@@ -28,6 +28,37 @@ description: Правило под «Закон о проверяемости».
|
|
|
28
28
|
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
29
29
|
же дереве, которое держит код иначе.
|
|
30
30
|
|
|
31
|
+
## Ход
|
|
32
|
+
|
|
33
|
+
Ход заведения проверки: что проверяется вызовом, что — сквозным путём и как сценарий связан со
|
|
34
|
+
своим тестом.
|
|
35
|
+
|
|
36
|
+
```mermaid
|
|
37
|
+
flowchart TD
|
|
38
|
+
A[Нужна проверка] --> B{Что обещает сценарий}
|
|
39
|
+
B -->|Человек видит и делает| C[Закрывается сквозным тестом тем же путём, что и пользователь]
|
|
40
|
+
B -->|Значение, состояние, отказ| D[Закрывается вызовом]
|
|
41
|
+
D --> E{Решение зашито в компонент или сервис}
|
|
42
|
+
E -->|Да| F[Выносится в чистую функцию и проверяется вызовом]
|
|
43
|
+
E -->|Нет| G[Проверяется как есть]
|
|
44
|
+
F --> H[Момент времени принимается параметром, а не читается с часов машины]
|
|
45
|
+
G --> H
|
|
46
|
+
C --> I{Тест погашен переменной окружения}
|
|
47
|
+
I -->|Да| J[Покрытием не считается: это долг, а отметка при живом тесте — отказ]
|
|
48
|
+
I -->|Нет| K[В заголовке теста стоит номер сценария]
|
|
49
|
+
H --> K
|
|
50
|
+
K --> P{Сценарий с таким номером есть в спеках}
|
|
51
|
+
P -->|Нет| Q[Проверка краснеет: тест ссылается на несуществующий сценарий]
|
|
52
|
+
P -->|Да| R{Тест идёт тем же путём, что и пользователь}
|
|
53
|
+
R -->|Нет| S[Помечается частичным покрытием: в сводку идёт долгом]
|
|
54
|
+
R -->|Да| L{Сценарий остался без теста}
|
|
55
|
+
L -->|Да| M[Несёт отметку с причиной: пустая не принимается]
|
|
56
|
+
L -->|Нет| N[Готово]
|
|
57
|
+
S --> N
|
|
58
|
+
M --> N
|
|
59
|
+
J --> N
|
|
60
|
+
```
|
|
61
|
+
|
|
31
62
|
## Как закон применяется здесь
|
|
32
63
|
|
|
33
64
|
- **Идентификатор сценария стоит в начале заголовка теста, через тире.** Один сценарий
|
|
@@ -28,6 +28,27 @@ description: Правило под «Закон о локалях и перев
|
|
|
28
28
|
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
29
29
|
же дереве, которое держит код иначе.
|
|
30
30
|
|
|
31
|
+
## Ход
|
|
32
|
+
|
|
33
|
+
Ход появления видимого текста: откуда он берётся, что делается с непришедшим переводом и чем
|
|
34
|
+
держится полнота словарей.
|
|
35
|
+
|
|
36
|
+
```mermaid
|
|
37
|
+
flowchart TD
|
|
38
|
+
A[Появился видимый человеку текст] --> B{Чей он}
|
|
39
|
+
B -->|Интерфейса| C[Заводится ключом во всех локалях перевода сразу]
|
|
40
|
+
B -->|Содержимого| D[Владелец пишет на своём языке, остальные локали — производные]
|
|
41
|
+
C --> E{Перевод пуст}
|
|
42
|
+
E -->|Да| F[Считается пропуском: подставляется запасной словарь, а прогон краснеет]
|
|
43
|
+
E -->|Нет| G[Готово]
|
|
44
|
+
D --> H{Перевод пришёл}
|
|
45
|
+
H -->|Да| I[Записывается]
|
|
46
|
+
H -->|Нет| J[Прежнее значение сохраняется, а само сохранение не срывается]
|
|
47
|
+
I --> G
|
|
48
|
+
J --> G
|
|
49
|
+
F --> G
|
|
50
|
+
```
|
|
51
|
+
|
|
31
52
|
## Как закон применяется здесь
|
|
32
53
|
|
|
33
54
|
- **Локаль по умолчанию отдаётся из корня, остальные семь — из-под префикса пути.**
|
|
@@ -25,6 +25,27 @@ description: Правило под «Закон об устройстве код
|
|
|
25
25
|
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
26
26
|
же дереве, которое держит код иначе.
|
|
27
27
|
|
|
28
|
+
## Ход
|
|
29
|
+
|
|
30
|
+
Ход объявления символа: чем задаётся имя, откуда берётся тип и что делается со снятым
|
|
31
|
+
объявлением.
|
|
32
|
+
|
|
33
|
+
```mermaid
|
|
34
|
+
flowchart TD
|
|
35
|
+
A[Объявляется символ] --> B[Род виден по префиксу имени, а суффикс файла обещает, что в нём лежит]
|
|
36
|
+
B --> C{Тип уже объявлен где-то}
|
|
37
|
+
C -->|Да| D[Берётся из того пакета, где объявлен: своя копия разойдётся с оригиналом молча]
|
|
38
|
+
C -->|Нет| E[Объявляется здесь]
|
|
39
|
+
D --> F{Значение приходит не в том виде}
|
|
40
|
+
E --> F
|
|
41
|
+
F -->|Да| G[Приведение идёт названным способом; двухступенчатое запрещено]
|
|
42
|
+
F -->|Нет| H{Объявление снимается}
|
|
43
|
+
G --> H
|
|
44
|
+
H -->|Да| I[Отметка об устаревании ставится вместе с обходом всех потребителей]
|
|
45
|
+
H -->|Нет| J[Файл держится в пределах длины, сложность спрашивается у плагина, а не вспоминается]
|
|
46
|
+
I --> J
|
|
47
|
+
```
|
|
48
|
+
|
|
28
49
|
## Как закон применяется здесь
|
|
29
50
|
|
|
30
51
|
- **Род объявления виден по префиксу имени, и это держат три правила линтера.** У интерфейса,
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# <Домен>
|
|
2
|
+
|
|
3
|
+
**Статус:** действует · **Ревизия:** <дата> · **Префикс сценариев:** `SC-<ПРЕФИКС>`
|
|
4
|
+
**Зависимости:** <домены, без которых этот не работает, или «нет»>
|
|
5
|
+
**Законы:** `<закон>`, `<закон>`
|
|
6
|
+
**Процедуры:** <либы, чьи процедуры домен обслуживает, или «нет»>
|
|
7
|
+
|
|
8
|
+
Разделы ниже обязательны все: отсутствие раздела — отказ, а «не применимо» — законный ответ.
|
|
9
|
+
Договорённость о продукте, которая пишется до кода, лежит в `proposed/<фича>/` этого же домена
|
|
10
|
+
и вливается сюда последним коммитом PR — с прежними номерами сценариев.
|
|
11
|
+
|
|
12
|
+
## Зачем
|
|
13
|
+
|
|
14
|
+
<Что домен решает и чего стоит его отсутствие. Не пересказ реализации.>
|
|
15
|
+
|
|
16
|
+
## Терминология
|
|
17
|
+
|
|
18
|
+
| Термин | Что это |
|
|
19
|
+
| -------- | ---------- |
|
|
20
|
+
| <термин> | <значение> |
|
|
21
|
+
|
|
22
|
+
### Как это называется в интерфейсе
|
|
23
|
+
|
|
24
|
+
| В договорённости | На экране |
|
|
25
|
+
| ---------------- | --------- |
|
|
26
|
+
| <термин> | <подпись> |
|
|
27
|
+
|
|
28
|
+
## Правила
|
|
29
|
+
|
|
30
|
+
- **<утверждение о продукте>.** <Довод: что случится, если этого не держать.> Каждое
|
|
31
|
+
утверждение получает строку привязки `файл:символ` в `implementation.md` рядом.
|
|
32
|
+
|
|
33
|
+
## Что не входит
|
|
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
|
+
### SEO
|
|
62
|
+
|
|
63
|
+
<Заголовки, адреса, разметка. Не применимо — так и пишется.>
|
|
64
|
+
|
|
65
|
+
### Мобильная раскладка
|
|
66
|
+
|
|
67
|
+
<Что меняется на узком экране.>
|
|
68
|
+
|
|
69
|
+
### Мультиобъектность
|
|
70
|
+
|
|
71
|
+
<Что у домена своё на каждый объект владения.>
|
|
72
|
+
|
|
73
|
+
## Решения
|
|
74
|
+
|
|
75
|
+
- **<решение>** — <довод>. Отвергнуто: <альтернатива и почему>.
|
|
76
|
+
|
|
77
|
+
## Открытые вопросы
|
|
78
|
+
|
|
79
|
+
- `Q-<номер>` — <вопрос и допущение, с которым идёт работа>.
|
|
80
|
+
|
|
81
|
+
## История изменений
|
|
82
|
+
|
|
83
|
+
- <дата> — <что изменилось>.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Разбор просьбы
|
|
2
|
+
|
|
3
|
+
## Просьба владельца
|
|
4
|
+
|
|
5
|
+
> <дословно, без пересказа>
|
|
6
|
+
|
|
7
|
+
## Что уже есть в дереве
|
|
8
|
+
|
|
9
|
+
<Находки разведки: спеки по теме, законы и правила, которые работа задевает, готовый образец
|
|
10
|
+
рядом. Заполняется до первого вопроса владельцу.>
|
|
11
|
+
|
|
12
|
+
## Что уже сказано в правилах
|
|
13
|
+
|
|
14
|
+
<Что нашлось в законах и правилах по теме вопроса. Владельцу не задаётся то, ответ на что уже
|
|
15
|
+
записан.>
|
|
16
|
+
|
|
17
|
+
## Вопросы и ответы
|
|
18
|
+
|
|
19
|
+
**<вопрос>**
|
|
20
|
+
<ответ владельца его словами>
|
|
21
|
+
|
|
22
|
+
## Решения
|
|
23
|
+
|
|
24
|
+
- **<решение>** — <довод>. Отвергнуто: <что и почему>.
|
|
25
|
+
|
|
26
|
+
## Что осталось невыясненным
|
|
27
|
+
|
|
28
|
+
- <вопрос, который не задавали, и почему он не блокирует работу>
|