@rt-tools/agent-kit 0.8.1 → 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 +25 -19
- package/assets/agents/qa-engineer.md +1 -1
- package/assets/agents/rules-reviewer.md +83 -0
- package/assets/checks/board.github.mjs +56 -17
- package/assets/checks/check-board.github.mjs +49 -5
- 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/checks/task-new.github.mjs +33 -5
- package/assets/commands/agent-kit-digest.md +10 -5
- package/assets/commands/feedback.md +95 -0
- package/assets/commands/next-session.md +4 -4
- package/assets/commands/rules-review.md +98 -0
- package/assets/commands/skill-curator.md +44 -25
- package/assets/defaults/gate-map.sh +11 -4
- package/assets/defaults/project.sh +46 -0
- package/assets/docs/GLOSSARY.md +49 -46
- package/assets/hooks/docs-guard.sh +19 -3
- package/assets/hooks/git-guard-delivery.sh +106 -13
- package/assets/hooks/proposal-guard.sh +93 -0
- package/assets/hooks/reuse-first-guard.sh +83 -15
- package/assets/hooks/skill-gate-layers.sh +1 -1
- package/assets/hooks/skill-gate.sh +27 -1
- package/assets/hooks/task-flow-guard.sh +59 -19
- package/assets/hooks/waiting-turn-guard.sh +87 -0
- package/assets/hooks/window-fill-guard.sh +1 -1
- package/assets/laws/delivery.md +41 -7
- package/assets/laws/project-documentation.md +39 -0
- package/assets/laws/verifiability.md +6 -1
- package/assets/laws/work-conduct.md +83 -3
- package/assets/patterns/git-workflow-commit.azure.md +84 -4
- package/assets/patterns/git-workflow-commit.github.md +90 -4
- package/assets/patterns/git-workflow-commit.gitlab.md +84 -5
- package/assets/patterns/git-workflow-docker.md +30 -0
- package/assets/patterns/git-workflow-merge.md +1 -1
- package/assets/patterns/spec-driven-domain.md +7 -1
- package/assets/patterns/spec-driven-rule.md +6 -0
- package/assets/patterns/task-flow-close.md +197 -21
- package/assets/patterns/task-flow-handoff.md +28 -5
- package/assets/patterns/task-flow-resume.md +25 -7
- package/assets/patterns/task-flow-start.md +37 -6
- package/assets/rules/angular-patterns.md +22 -0
- package/assets/rules/api-layer.md +25 -0
- package/assets/rules/browser-verification.md +42 -1
- package/assets/rules/component-structure.md +21 -0
- package/assets/rules/dependencies.md +22 -0
- package/assets/rules/doc-style.md +37 -5
- package/assets/rules/{entity-conventions.md → entity-conventions.needs-admin.md} +21 -0
- package/assets/rules/entity-models.md +21 -0
- package/assets/rules/git-workflow.azure.md +62 -8
- package/assets/rules/git-workflow.github.md +78 -14
- package/assets/rules/git-workflow.gitlab.md +61 -8
- 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.md → 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 +36 -0
- package/assets/rules/styling-bem.md +19 -0
- package/assets/rules/task-flow.md +150 -35
- package/assets/rules/testing.md +50 -0
- package/assets/rules/translations.md +21 -0
- package/assets/rules/typescript-conventions.md +33 -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-extend.md +24 -0
- package/assets/skills/agent-kit.md +69 -7
- package/assets/templates/rule.md +31 -2
- package/assets/traits.json +14 -0
- package/bin/agent-kit.d.ts.map +1 -1
- package/bin/agent-kit.js +31 -16
- package/bin/agent-kit.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/argv.d.ts +17 -0
- package/lib/argv.d.ts.map +1 -0
- package/lib/argv.js +44 -0
- package/lib/argv.js.map +1 -0
- package/lib/cargo.d.ts +88 -0
- package/lib/cargo.d.ts.map +1 -0
- package/lib/cargo.js +16 -0
- package/lib/cargo.js.map +1 -0
- package/lib/catalog.d.ts +18 -1
- package/lib/catalog.d.ts.map +1 -1
- package/lib/catalog.js +12 -2
- package/lib/catalog.js.map +1 -1
- package/lib/commands.d.ts +0 -26
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +79 -122
- package/lib/commands.js.map +1 -1
- package/lib/companion.d.ts +37 -0
- package/lib/companion.d.ts.map +1 -1
- package/lib/companion.js +42 -1
- package/lib/companion.js.map +1 -1
- package/lib/config.d.ts +38 -1
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +24 -0
- package/lib/config.js.map +1 -1
- package/lib/ship.d.ts +39 -0
- package/lib/ship.d.ts.map +1 -0
- package/lib/ship.js +87 -0
- package/lib/ship.js.map +1 -0
- package/lib/shipment.d.ts +60 -0
- package/lib/shipment.d.ts.map +1 -0
- package/lib/shipment.js +247 -0
- package/lib/shipment.js.map +1 -0
- package/lib/snapshot.d.ts +30 -0
- package/lib/snapshot.d.ts.map +1 -0
- package/lib/snapshot.js +73 -0
- package/lib/snapshot.js.map +1 -0
- package/lib/traits.d.ts +32 -0
- package/lib/traits.d.ts.map +1 -0
- package/lib/traits.js +82 -0
- package/lib/traits.js.map +1 -0
- package/package.json +6 -2
- package/rt-tools-agent-kit-0.8.3.tgz +0 -0
- package/lib/submit.d.ts +0 -24
- package/lib/submit.d.ts.map +0 -1
- package/lib/submit.js +0 -26
- package/lib/submit.js.map +0 -1
- package/rt-tools-agent-kit-0.8.1.tgz +0 -0
|
@@ -6,8 +6,14 @@ argument-hint: '[пусто | <акцент, на что смотреть в п
|
|
|
6
6
|
Запусти агента `skill-curator` на разбор только что закрытой задачи. Акцент от пользователя:
|
|
7
7
|
`$ARGUMENTS`
|
|
8
8
|
|
|
9
|
-
Вызывается
|
|
10
|
-
не
|
|
9
|
+
Вызывается **сразу за открытием PR** — тем же ходом, которым работа отдана на разбор. Агент
|
|
10
|
+
ничего не правит: он приносит готовые формулировки, а решение вставлять их принимает
|
|
11
|
+
пользователь.
|
|
12
|
+
|
|
13
|
+
**Запуск фоновый, и ход на нём не кончается.** Пока агент работает, берётся следующая задача:
|
|
14
|
+
он ничего не спрашивает и быстрее от ожидания не идёт. Шаги 1 и 2 делаются до запуска — пока
|
|
15
|
+
задача ещё в голове; шаги 4–6 принимают вернувшийся ответ одним ходом и возвращают исполнителя
|
|
16
|
+
к прежней работе.
|
|
11
17
|
|
|
12
18
|
## 1. Найди список загруженного
|
|
13
19
|
|
|
@@ -42,48 +48,61 @@ ls -t "${TMPDIR}claude-skill-gate/"*.loaded | head -5
|
|
|
42
48
|
которой не было» — ровно то, из чего получаются правила. Приглаженная сводка даёт приглаженный
|
|
43
49
|
разбор.
|
|
44
50
|
|
|
45
|
-
## 3. Запусти агента
|
|
51
|
+
## 3. Запусти агента в фон и вернись к работе
|
|
46
52
|
|
|
47
53
|
Инструментом `Agent`, `subagent_type: 'skill-curator'`. В промпт — путь к `.loaded` и сводку
|
|
48
54
|
целиком.
|
|
49
55
|
|
|
50
|
-
|
|
56
|
+
Ход на этом не кончается: пока агент работает, берётся следующая задача. Ответ придёт
|
|
57
|
+
уведомлением, и тогда идут шаги 4–6 — один ход, после которого исполнитель возвращается к тому,
|
|
58
|
+
что делал.
|
|
59
|
+
|
|
60
|
+
## 4. Положи находки в папку задачи
|
|
51
61
|
|
|
52
|
-
Ответ роли живёт в переписке и умирает вместе с ней,
|
|
53
|
-
|
|
54
|
-
пишет вовсе.
|
|
62
|
+
Ответ роли живёт в переписке и умирает вместе с ней, поэтому он сразу ложится на диск — рядом с
|
|
63
|
+
ходом работы, в папку задачи. Пишешь его ты, не роль: файлов она не пишет вовсе.
|
|
55
64
|
|
|
56
65
|
```bash
|
|
57
|
-
|
|
58
|
-
cp .claude/rt-kit/templates/proposal.md .claude/rt-kit/proposals/$(date +%F)-<ветка>.md
|
|
66
|
+
cat > docs/tasks/<ветка>/curator.md # заголовок блока — «## <адрес> · <ресурс>»
|
|
59
67
|
```
|
|
60
68
|
|
|
61
|
-
|
|
62
|
-
|
|
69
|
+
Адрес у каждого блока роль уже поставила — «пакет», «компаньон» или «дерево». Твоё дело — не
|
|
70
|
+
потерять его и не переписать текст своими словами.
|
|
63
71
|
|
|
64
|
-
|
|
65
|
-
|
|
72
|
+
Папка задачи умирает со слиянием, а находки должны пережить весь эпик: владелец читает их
|
|
73
|
+
разом, когда эпик кончился. Поэтому при разборе папки файл находок не удаляется, а переезжает к
|
|
74
|
+
замыслу эпика — паттерн закрытия работы. Работа вне эпика показывает находки владельцу сразу.
|
|
66
75
|
|
|
67
|
-
## 5. Отправь
|
|
76
|
+
## 5. Отправь сводку наблюдений — и только её
|
|
68
77
|
|
|
69
78
|
```bash
|
|
70
79
|
npx agent-kit propose --dry-run # что уехало бы
|
|
71
|
-
npx agent-kit propose #
|
|
80
|
+
npx agent-kit propose # отправить груз в приём
|
|
72
81
|
```
|
|
73
82
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
не
|
|
83
|
+
Груз уезжает при каждом прогоне: сводка наблюдений со снимком надстроек, разборы происшествий и
|
|
84
|
+
предложения, лежащие в каталоге предложений. Сводка — факт: чем пользовались, чем не
|
|
85
|
+
пользовались ни разу, что дерево переопределило. Она уезжает всегда и слова владельца не ждёт.
|
|
86
|
+
|
|
87
|
+
**Находки разбора в каталог предложений сами не ложатся, и потому не уезжают.** Предложение —
|
|
88
|
+
заготовка правки чужого дерева, и часть заготовок отпадает при первом же чтении; уехавшая без
|
|
89
|
+
разбора, она становится работой того, кто её не заказывал. В каталог предложений переносится
|
|
90
|
+
только то, что владелец назвал верным, — и тогда же уезжает.
|
|
91
|
+
|
|
92
|
+
Отправка отказывает, если адрес этого дерева нашёлся в сводке или в тексте предложения — путь,
|
|
93
|
+
имя корня, чужой репозиторий. Это не придирка: груз уезжает наружу целиком. Правь текст, а не
|
|
94
|
+
обходи проверку. Разбор происшествия проверкой не накрыт: он по устройству называет файлы
|
|
95
|
+
дерева, где промах случился.
|
|
77
96
|
|
|
78
|
-
|
|
79
|
-
чужой репозиторий. Это не придирка: файл уезжает в чужой репозиторий целиком. Правь текст, а не
|
|
80
|
-
обходи проверку.
|
|
97
|
+
## 6. Отдай находки владельцу — по концу эпика
|
|
81
98
|
|
|
82
|
-
|
|
99
|
+
Покажи находки **как есть**: роль пишет готовый текст для вставки, и пересказ его портит. По
|
|
100
|
+
каждой скажи своё — согласен или нет и почему; правило, с которым ты не согласен, вставлять не
|
|
101
|
+
надо.
|
|
83
102
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
103
|
+
Работа в эпике показывает их не сразу: находки копятся у замысла эпика и читаются разом, когда
|
|
104
|
+
эпик кончился, — так владелец видит повторяющееся, а не разрозненные заметки. Названное им
|
|
105
|
+
верным переносится в каталог предложений и уезжает шагом 5.
|
|
87
106
|
|
|
88
107
|
У каждого предложения агент ставит пометку «пакет», «компаньон» или «дерево»: тексты приезжают
|
|
89
108
|
из `@rt-tools/agent-kit`, и правка разложенного файла на месте теряется на следующем
|
|
@@ -40,6 +40,13 @@ skill_for_default() {
|
|
|
40
40
|
case "$kind" in
|
|
41
41
|
edit)
|
|
42
42
|
case "$target" in
|
|
43
|
+
# Надстройка над разложенным текстом — правка того же текста: путь другой, а
|
|
44
|
+
# предмет тот же. Ветка стоит первой, потому что путь надстройки кончается тем
|
|
45
|
+
# же именем файла, что и разложенная копия, и ветки ниже разобрали бы её по
|
|
46
|
+
# расширению — то есть правилом формулировок вместо правила устройства.
|
|
47
|
+
*/.claude/rt-kit/overrides/laws/* | */.claude/rt-kit/overrides/rules/* | */.claude/rt-kit/overrides/patterns/*)
|
|
48
|
+
printf '%s\n' 'spec-driven' ;;
|
|
49
|
+
|
|
43
50
|
# Правило и паттерн — такая же договорённость, как спек: обязательные разделы,
|
|
44
51
|
# утверждение с привязкой, граница между статьёй закона и утверждением правила.
|
|
45
52
|
# Ветка стоит раньше общего исключения и раньше `*.md`: под исключением текст
|
|
@@ -138,9 +145,9 @@ skill_for_default() {
|
|
|
138
145
|
|| rt_gate_invokes "$target" "[^[:space:]]*task:new" \
|
|
139
146
|
|| rt_gate_invokes "$target" "prisma[[:space:]]+(migrate|db)"; then
|
|
140
147
|
printf '%s\n' 'git-workflow'
|
|
141
|
-
# Правка тела
|
|
148
|
+
# Правка тела PR через клиент хостинга ловится двумя признаками сразу — вызовом
|
|
142
149
|
# клиента И адресом запроса: одного слова о заявке мало, оно попадает в строку любой
|
|
143
|
-
# команды, которая о ней пишет. Тело
|
|
150
|
+
# команды, которая о ней пишет. Тело PR не читает ни одна проверка, и утверждение
|
|
144
151
|
# о дереве стареет в нём молча.
|
|
145
152
|
elif rt_gate_invokes "$target" "(gh|glab)[[:space:]]+api" \
|
|
146
153
|
&& printf '%s' "$target" | grep -qE '(-X|--method)[[:space:]]+(PATCH|PUT).*(pulls|merge_requests)/[0-9]+'; then
|
|
@@ -154,8 +161,8 @@ skill_for_default() {
|
|
|
154
161
|
printf '%s\n' 'git-workflow'
|
|
155
162
|
fi
|
|
156
163
|
|
|
157
|
-
# Слияние
|
|
158
|
-
# тем же
|
|
164
|
+
# Слияние PR — последний момент, когда папку закрытой задачи ещё можно разобрать
|
|
165
|
+
# тем же PR: после слияния сверка очереди её видит, а отвечать за неё уже
|
|
159
166
|
# некому. Требуется ВТОРЫМ слоем, дополнительно к правилу поставки.
|
|
160
167
|
rt_gate_invokes "$target" "(gh[[:space:]]+pr|glab[[:space:]]+mr)[[:space:]]+merge" \
|
|
161
168
|
&& printf '%s\n' 'task-flow'
|
|
@@ -166,6 +166,36 @@ rt_is_app_code_default() {
|
|
|
166
166
|
esac
|
|
167
167
|
}
|
|
168
168
|
|
|
169
|
+
# Пишет ли команда оболочки файл. Успех — да, и тогда пути из неё судятся тем же признаком,
|
|
170
|
+
# что и путь из вызова инструмента правки.
|
|
171
|
+
#
|
|
172
|
+
# Гарды подписаны на инструменты правки файла, и этого мало: ту же правку кладут командой —
|
|
173
|
+
# перенаправлением, `tee`, `sed -i`, интерпретатором с heredoc. Отбитая правка дважды за один
|
|
174
|
+
# заход легла именно так, и не увидел этого никто: в дереве она неотличима от положенной
|
|
175
|
+
# инструментом. Разбор — `2026-08-15-guard-denied-shell-wrote-anyway.md`.
|
|
176
|
+
#
|
|
177
|
+
# Список намеренно широк, и цена этого названа: команда чтения, в которой стоит имя
|
|
178
|
+
# интерпретатора, будет отбита наравне с командой правки. Узкий список стоил бы дороже —
|
|
179
|
+
# пропущенная форма записи возвращает обход целиком, а найти её можно только промахом.
|
|
180
|
+
rt_shell_writes_default() {
|
|
181
|
+
printf '%s' "$1" | grep -Eq \
|
|
182
|
+
'>>?[[:space:]]*[^|&>[:space:]]|\btee\b|\bsed\b[^|]*-i|\bperl\b[^|]*-i|\bpython3?\b|\bnode\b|\bruby\b|\bdd\b[^|]*of=|\bcp\b|\bmv\b|\brm\b|\btouch\b|\btruncate\b|\binstall\b|\bpatch\b|\bgit[[:space:]]+(checkout|restore|apply|stash)\b'
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
# Пути, названные командой оболочки. Печатает по одному в строке; судит их зовущий.
|
|
186
|
+
#
|
|
187
|
+
# Разбирать оболочку по-настоящему нечем — здесь и не разбирают: из текста вынимается всё, что
|
|
188
|
+
# похоже на путь, и каждое отдаётся признаку. Лишнее он отсеет сам, а пропущенное вернуло бы
|
|
189
|
+
# обход. Кавычки и heredoc снимаются заменой на пробел: путь внутри них тот же самый.
|
|
190
|
+
rt_shell_paths_default() {
|
|
191
|
+
printf '%s' "$1" \
|
|
192
|
+
| tr "\"'\`(),;=" ' ' \
|
|
193
|
+
| tr '[:space:]' '\n' \
|
|
194
|
+
| grep -E '^[A-Za-z0-9_@.-]*/[A-Za-z0-9_@./-]+$' \
|
|
195
|
+
| sed 's|^\./||' \
|
|
196
|
+
| sort -u
|
|
197
|
+
}
|
|
198
|
+
|
|
169
199
|
# Имя ветки, с которой разрешено открывать заявку на слияние: в имени стоит номер задачи.
|
|
170
200
|
# Приставка — либо род правки, либо метка очереди работ: обе формы носят номер, а он и нужен.
|
|
171
201
|
#
|
|
@@ -201,6 +231,20 @@ RT_BOARD_CHECK_CMD="${RT_BOARD_CHECK_CMD:-npm run check:board}"
|
|
|
201
231
|
# Учётная запись, которую ставят исполнителем. Умолчание молчит: у каждого дерева она своя.
|
|
202
232
|
RT_TASK_BOT="${RT_TASK_BOT:-}"
|
|
203
233
|
|
|
234
|
+
# Почта, которой подписан коммит машинной учётной записи. Целым значением, а не образцом:
|
|
235
|
+
# служебный адрес хостинга состоит из числа, логина и домена, а сопоставляется по числу — логин
|
|
236
|
+
# рядом с ним не сверяет никто. Образец «число, плюс, логин» прошёл бы с чужим числом, то есть
|
|
237
|
+
# ровно с тем промахом, ради которого гард поставки подпись и читает.
|
|
238
|
+
#
|
|
239
|
+
# Отсюда же он берёт логин машинной записи — левой частью адреса, до собаки и после плюса.
|
|
240
|
+
# Вторым свойством логин не объявляется: два объявления одного имени разошлись бы молча.
|
|
241
|
+
# Исполнитель задачи для этого не годится — там, где хостинг ограничил машинную запись,
|
|
242
|
+
# исполнителем ставят человека, а коммит остаётся машинным.
|
|
243
|
+
#
|
|
244
|
+
# Умолчание молчит, и тогда подпись не судится: своей машинной записи у пакета нет, а выдуманная
|
|
245
|
+
# отбивала бы работу в чужом дереве.
|
|
246
|
+
RT_COMMIT_EMAIL="${RT_COMMIT_EMAIL:-}"
|
|
247
|
+
|
|
204
248
|
# Состояние задачи одним объектом: exists, open, onBoard, assigned, numbered. Спрашивает
|
|
205
249
|
# помощника очереди работ — того же, которым пользуются сверка и команда заведения, чтобы
|
|
206
250
|
# гард и очередь одинаково понимали «задача в порядке». Нет узла, нет помощника, нет сети —
|
|
@@ -259,6 +303,8 @@ rt_lint_for() { rt_lint_for_default "$@"; }
|
|
|
259
303
|
rt_task_branch_ok() { rt_task_branch_ok_default "$@"; }
|
|
260
304
|
rt_reinvented_in() { rt_reinvented_in_default "$@"; }
|
|
261
305
|
rt_is_app_code() { rt_is_app_code_default "$@"; }
|
|
306
|
+
rt_shell_writes() { rt_shell_writes_default "$@"; }
|
|
307
|
+
rt_shell_paths() { rt_shell_paths_default "$@"; }
|
|
262
308
|
rt_qa_decorative() { rt_qa_decorative_default "$@"; }
|
|
263
309
|
rt_task_state() { rt_task_state_default "$@"; }
|
|
264
310
|
rt_report_body() { rt_report_body_default "$@"; }
|
package/assets/docs/GLOSSARY.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Словарь проекта
|
|
2
2
|
|
|
3
3
|
Слова, которые в этом дереве значат что-то определённое. Читается перед тем, как написать спек,
|
|
4
|
-
правило, комментарий, тело коммита или описание
|
|
4
|
+
правило, комментарий, тело коммита или описание PR: слово отсюда употребляется в том
|
|
5
5
|
значении, что здесь, а слово не отсюда либо заводится здесь же, либо заменяется простым.
|
|
6
6
|
|
|
7
7
|
Термины одного домена живут в разделе «Терминология» его спека — здесь только те, что проходят
|
|
@@ -13,44 +13,45 @@
|
|
|
13
13
|
|
|
14
14
|
## Слой правил
|
|
15
15
|
|
|
16
|
-
| Термин | Что это
|
|
17
|
-
| ------------------------- |
|
|
18
|
-
| Закон | Файл в каталоге конституции. Говорит, что должно быть верно, и не знает ни путей, ни имён файлов. Верен для любого приложения этого класса
|
|
19
|
-
| Законы приложения | Слой законов, верных только для этого приложения: деньги, локали, доступ. Предметность в них законна — она их предмет
|
|
20
|
-
| Правило | Скил с `kind: rule`. Привязывает закон к этому дереву: чем это здесь названо и где лежит
|
|
21
|
-
| Паттерн | Скил с `kind: pattern`. Готовый код и порядок действий; стоит при правиле
|
|
22
|
-
| Компаньон | Файл `implementation.md` рядом с правилом: имена и пути этого дерева. Пакет знает приём, но не знает имён — их пишет проект
|
|
23
|
-
| Спек | Описание домена: как он работает. Говорит об установившемся, а не о предстоящем
|
|
24
|
-
| Домен | Предмет, у которого свой спек. Выросший домен делится на поддомены, а не на соседние домены
|
|
25
|
-
| Сценарий | Наблюдаемое поведение под номером `SC-<ПРЕФИКС>-<НОМЕР>`. Номер стоит в заголовке теста
|
|
26
|
-
| Привязка | Строка `` `файл:символ` `` в компаньоне или в спутнике спека — место, где утверждение исполняется
|
|
27
|
-
| Спутник | Файл рядом со спеком или правилом: компаньон, перечень сценариев
|
|
28
|
-
| Договорённость о продукте | Как продукт себя поведёт, записанное до кода. Единственное место, где спек говорит о будущем; после выкатки вливается в спек домена, а директория удаляется
|
|
29
|
-
| Ресурс | Единица того, что везёт пакет правил: закон, правило, паттерн, гард, проверка, роль, команда, конвейер, шаблон, умолчание, документ
|
|
30
|
-
| Раскладка | Перенос ресурса из пакета в дерево по его роду и настройке слоя
|
|
31
|
-
| Разложенный файл | Файл в дереве с шапкой пакета. Правится не на месте, а надстройкой: правка на месте теряется на следующей раскладке
|
|
32
|
-
| Надстройка | Файл дерева, который сливается с разложенным по заголовкам разделов
|
|
33
|
-
| Наблюдение | Строка о событии слоя правил: правило загружено, гейт отбил, гард отказал. Пишет гард, живёт в дереве, наружу уезжает счётчиками. Журналом не называется
|
|
34
|
-
| Сводка | Что наблюдения говорят за отрезок дней: чем пользовались, чем ни разу, обо что спотыкались
|
|
35
|
-
| Предложение | Готовая формулировка правки правил с адресом: пакет, компаньон или дерево. Приносит разбор закрытой
|
|
16
|
+
| Термин | Что это |
|
|
17
|
+
| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
18
|
+
| Закон | Файл в каталоге конституции. Говорит, что должно быть верно, и не знает ни путей, ни имён файлов. Верен для любого приложения этого класса |
|
|
19
|
+
| Законы приложения | Слой законов, верных только для этого приложения: деньги, локали, доступ. Предметность в них законна — она их предмет |
|
|
20
|
+
| Правило | Скил с `kind: rule`. Привязывает закон к этому дереву: чем это здесь названо и где лежит |
|
|
21
|
+
| Паттерн | Скил с `kind: pattern`. Готовый код и порядок действий; стоит при правиле |
|
|
22
|
+
| Компаньон | Файл `implementation.md` рядом с правилом: имена и пути этого дерева. Пакет знает приём, но не знает имён — их пишет проект |
|
|
23
|
+
| Спек | Описание домена: как он работает. Говорит об установившемся, а не о предстоящем |
|
|
24
|
+
| Домен | Предмет, у которого свой спек. Выросший домен делится на поддомены, а не на соседние домены |
|
|
25
|
+
| Сценарий | Наблюдаемое поведение под номером `SC-<ПРЕФИКС>-<НОМЕР>`. Номер стоит в заголовке теста |
|
|
26
|
+
| Привязка | Строка `` `файл:символ` `` в компаньоне или в спутнике спека — место, где утверждение исполняется |
|
|
27
|
+
| Спутник | Файл рядом со спеком или правилом: компаньон, перечень сценариев |
|
|
28
|
+
| Договорённость о продукте | Как продукт себя поведёт, записанное до кода. Единственное место, где спек говорит о будущем; после выкатки вливается в спек домена, а директория удаляется |
|
|
29
|
+
| Ресурс | Единица того, что везёт пакет правил: закон, правило, паттерн, гард, проверка, роль, команда, конвейер, шаблон, умолчание, документ |
|
|
30
|
+
| Раскладка | Перенос ресурса из пакета в дерево по его роду и настройке слоя |
|
|
31
|
+
| Разложенный файл | Файл в дереве с шапкой пакета. Правится не на месте, а надстройкой: правка на месте теряется на следующей раскладке |
|
|
32
|
+
| Надстройка | Файл дерева, который сливается с разложенным по заголовкам разделов |
|
|
33
|
+
| Наблюдение | Строка о событии слоя правил: правило загружено, гейт отбил, гард отказал. Пишет гард, живёт в дереве, наружу уезжает счётчиками. Журналом не называется |
|
|
34
|
+
| Сводка | Что наблюдения говорят за отрезок дней: чем пользовались, чем ни разу, обо что спотыкались |
|
|
35
|
+
| Предложение | Готовая формулировка правки правил с адресом: пакет, компаньон или дерево. Приносит разбор закрытой задачи или слово посреди работы, отправляет человек командой |
|
|
36
|
+
| Слово | Реплика человека посреди работы о слое правил: что мешает, чего не хватило, что сработало не так. Ложится блоком в файл предложений, а не живёт до конца захода |
|
|
36
37
|
|
|
37
38
|
## Работа
|
|
38
39
|
|
|
39
|
-
| Термин | Что это
|
|
40
|
-
| --------------- |
|
|
41
|
-
| Задача | Единица работы в очереди работ. Заводится до ветки, и номер её стоит в имени ветки и в заголовке
|
|
42
|
-
|
|
|
43
|
-
| Очередь работ | Доска, на которой видно состояние каждой задачи. Ветки она не видит
|
|
44
|
-
| Папка задачи | Одна работа от разбора до слияния: разбор просьбы, замысел, ход работы. Умирает со слиянием — разбирается, и объясняющее решение уезжает в архив
|
|
45
|
-
| Разбор | Расспрос владельца до первой правки. Записывается его словами и задним числом не переписывается
|
|
46
|
-
| Замысел | Файл папки задачи: след задачи и этапы с признаками готовности. После написания не правится — с ним сверяют результат при приёмке
|
|
47
|
-
| Ход работы | Файл папки задачи: «Где стоим», решения по ходу с причинами, записи заходов. Единственное место, где отмечается сделанное. Журналом не называется
|
|
48
|
-
| След задачи | Раздел замысла: какие спеки, законы, правила и части кода работа задевает
|
|
49
|
-
| Заход | Одна сессия работы над задачей. Работа живёт дольше одного захода, и между ними её состояние держит только ход работы
|
|
50
|
-
| Заполнение окна | Доля места захода, которую он уже занял: вход, запись в кэш, прочитанное из кэша и вывод последнего ответа, делённые на размер окна. Не «расход» и не «бюджет»: речь о месте, а не о деньгах
|
|
51
|
-
| Передача | Текст, которым заход закрывается: рабочее дерево, ветка, задача, где лежит ход работы, что сделано, следующий шаг, особенности захода. Кладётся вне дерева и не коммитится
|
|
52
|
-
|
|
|
53
|
-
| Архив | Записи о состоявшемся: что объясняет закрытое решение. После выкатки не правится
|
|
40
|
+
| Термин | Что это |
|
|
41
|
+
| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
42
|
+
| Задача | Единица работы в очереди работ. Заводится до ветки, и номер её стоит в имени ветки и в заголовке PR |
|
|
43
|
+
| PR | Заявка на слияние: то же название, что у задачи, переведённое в сделанное. Отчётом, пул-реквестом и мёрдж-реквестом не называется — ни в файлах, ни в разговоре |
|
|
44
|
+
| Очередь работ | Доска, на которой видно состояние каждой задачи. Ветки она не видит |
|
|
45
|
+
| Папка задачи | Одна работа от разбора до слияния: разбор просьбы, замысел, ход работы. Умирает со слиянием — разбирается, и объясняющее решение уезжает в архив |
|
|
46
|
+
| Разбор | Расспрос владельца до первой правки. Записывается его словами и задним числом не переписывается |
|
|
47
|
+
| Замысел | Файл папки задачи: след задачи и этапы с признаками готовности. После написания не правится — с ним сверяют результат при приёмке |
|
|
48
|
+
| Ход работы | Файл папки задачи: «Где стоим», решения по ходу с причинами, записи заходов. Единственное место, где отмечается сделанное. Журналом не называется |
|
|
49
|
+
| След задачи | Раздел замысла: какие спеки, законы, правила и части кода работа задевает |
|
|
50
|
+
| Заход | Одна сессия работы над задачей. Работа живёт дольше одного захода, и между ними её состояние держит только ход работы |
|
|
51
|
+
| Заполнение окна | Доля места захода, которую он уже занял: вход, запись в кэш, прочитанное из кэша и вывод последнего ответа, делённые на размер окна. Не «расход» и не «бюджет»: речь о месте, а не о деньгах |
|
|
52
|
+
| Передача | Текст, которым заход закрывается: рабочее дерево, ветка, задача, где лежит ход работы, что сделано, следующий шаг, особенности захода. Кладётся вне дерева и не коммитится |
|
|
53
|
+
| Эпик | Серия задач одной темы, выполняемых в назначенном порядке. Живёт в двух местах сразу: карточка в очереди работ с меткой эпика и замысел рядом с ней — что за возможность разрабатывается, какие задачи входят и в каком порядке. Шире одной ветки. Линией работ не называется |
|
|
54
|
+
| Архив | Записи о состоявшемся: что объясняет закрытое решение. После выкатки не правится |
|
|
54
55
|
|
|
55
56
|
## Проверки
|
|
56
57
|
|
|
@@ -65,13 +66,15 @@
|
|
|
65
66
|
|
|
66
67
|
## Так не пишем
|
|
67
68
|
|
|
68
|
-
| Так не пишем
|
|
69
|
-
|
|
|
70
|
-
| спека (о тесте)
|
|
71
|
-
| таска, тикет
|
|
72
|
-
| пул-реквест, мёрдж-реквест
|
|
73
|
-
|
|
|
74
|
-
|
|
|
75
|
-
|
|
|
76
|
-
|
|
|
77
|
-
|
|
|
69
|
+
| Так не пишем | Пишем так |
|
|
70
|
+
| --------------------------- | ---------------------------------------------------------------------------------------------- |
|
|
71
|
+
| спека (о тесте) | тест — файл рядом с исходником; спек — документ. Одна буква разницы, а значения противоположны |
|
|
72
|
+
| таска, тикет | задача |
|
|
73
|
+
| пул-реквест, мёрдж-реквест | PR, а действие — слияние |
|
|
74
|
+
| отчёт (о заявке на слияние) | PR; отчёт — сводка данных, и слово занято ею |
|
|
75
|
+
| джоба, пайплайн | конвейер и его шаг |
|
|
76
|
+
| хендофф | передача |
|
|
77
|
+
| бэклог | очередь работ |
|
|
78
|
+
| линия работ | эпик |
|
|
79
|
+
| контекст-виндоу | окно захода, а его доля — заполнение окна |
|
|
80
|
+
| скилл, скилы | правило, паттерн или скил без закона — по тому, что это на самом деле |
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
#
|
|
18
18
|
# Отдельно — законы. Совпал ли код с законом, машина не знает: правка файла, на который закон
|
|
19
19
|
# ссылается якорем, поэтому не отклоняется, а выносится вопросом владельцу. Тем же вопросом
|
|
20
|
-
# встречается и правка самого
|
|
21
|
-
# молча гард не даёт.
|
|
20
|
+
# встречается и правка самого закона — как на месте, так и надстройкой над ним: закон описывает
|
|
21
|
+
# договорённость о продукте, и менять её молча гард не даёт.
|
|
22
22
|
#
|
|
23
23
|
# Обход — строка `Docs-skip: <причина>` в теле коммита. Причина остаётся в истории и видна при
|
|
24
24
|
# разборе ветки; пустая не принимается.
|
|
@@ -66,11 +66,18 @@ command -v rt_needs >/dev/null 2>&1 || rt_needs() { command -v "$1" >/dev/null 2
|
|
|
66
66
|
|
|
67
67
|
laws_dir="${RT_LAWS_DIR:-docs/constitution}"
|
|
68
68
|
lib_marker="${RT_LIB_MARKER:-project.json}"
|
|
69
|
+
overrides_dir="${RT_OVERRIDES_DIR:-.claude/rt-kit/overrides}"
|
|
69
70
|
|
|
70
71
|
# ── Правка закона спрашивает владельца ────────────────────────────────────────
|
|
71
72
|
#
|
|
72
73
|
# Спутник рядом с законом — привязка статей к коду, она устаревает при каждом переименовании и
|
|
73
74
|
# правится свободно. Спрашивается только сам текст закона.
|
|
75
|
+
#
|
|
76
|
+
# Путей к тексту закона два, и ходят чаще вторым. Разложенный закон на месте не правится вовсе:
|
|
77
|
+
# правка теряется на следующей раскладке, а сама раскладка на неё отказывает, — поэтому правят
|
|
78
|
+
# надстройку, и файл закона переписывает раскладка. Гард, знающий один каталог законов, сторожит
|
|
79
|
+
# ровно тот путь, которым к закону и не ходят: чем сложнее надстройка дерева, тем реже закон
|
|
80
|
+
# правят на месте. Спрашивается и надстройка — по содержанию это правка закона, а не обвязки.
|
|
74
81
|
case "$tool" in
|
|
75
82
|
Edit | Write | MultiEdit | NotebookEdit | mcp__webstorm__create_new_file)
|
|
76
83
|
target="$(printf '%s' "$input" | jq -r '.tool_input.file_path // .tool_input.filePath // .tool_input.path // .tool_input.pathInProject // empty' 2>/dev/null)"
|
|
@@ -79,6 +86,10 @@ case "$tool" in
|
|
|
79
86
|
*/"$laws_dir"/*.md | "$laws_dir"/*.md)
|
|
80
87
|
decide ask "Правка закона: \`${target##*/}\`. Закон описывает договорённость о продукте, а не устройство кода, — назови владельцу, что и почему меняешь, и дождись ответа. Если правка уже согласована, подтверди вызов."
|
|
81
88
|
;;
|
|
89
|
+
*/"$overrides_dir"/laws/*.implementation.md | "$overrides_dir"/laws/*.implementation.md) exit 0 ;;
|
|
90
|
+
*/"$overrides_dir"/laws/*.md | "$overrides_dir"/laws/*.md)
|
|
91
|
+
decide ask "Правка закона надстройкой: \`${target##*/}\`. Разложенный файл переписывает раскладка, поэтому правка надстройки — это правка самого закона: назови владельцу, что и почему меняешь, и дождись ответа. Если правка уже согласована, подтверди вызов."
|
|
92
|
+
;;
|
|
82
93
|
esac
|
|
83
94
|
exit 0
|
|
84
95
|
;;
|
|
@@ -112,7 +123,12 @@ esac
|
|
|
112
123
|
|
|
113
124
|
# Причина обхода остаётся в истории, поэтому обход законен. Пустая строка обходом не считается:
|
|
114
125
|
# «Docs-skip:» без причины — это тот же молчаливый пропуск, только с двоеточием.
|
|
115
|
-
|
|
126
|
+
#
|
|
127
|
+
# Строка начинает строку — свою в теле коммита или комментарий в конце команды — и подстановки
|
|
128
|
+
# не принимает. То же условие, что у обхода при слиянии: иначе текст, который ОБЪЯСНЯЕТ обход,
|
|
129
|
+
# снимает требование сам собой. Тело коммита о правке гарда как раз называет эту строку, и без
|
|
130
|
+
# привязки к началу гард пропускал бы такой коммит молча.
|
|
131
|
+
if printf '%s' "$cmd" | grep -qiE '(^|#)[[:space:]]*Docs-skip:[[:space:]]*[^[:space:]<"'"'"'][^[:space:]"'"'"']{2,}'; then
|
|
116
132
|
exit 0
|
|
117
133
|
fi
|
|
118
134
|
|