@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.
Files changed (129) hide show
  1. package/README.md +25 -19
  2. package/assets/agents/qa-engineer.md +1 -1
  3. package/assets/agents/rules-reviewer.md +83 -0
  4. package/assets/checks/board.github.mjs +56 -17
  5. package/assets/checks/check-board.github.mjs +49 -5
  6. package/assets/checks/check-dupes.mjs +66 -6
  7. package/assets/checks/check-specs.mjs +100 -15
  8. package/assets/checks/rt-kit-checks.config.mjs +9 -0
  9. package/assets/checks/task-new.github.mjs +33 -5
  10. package/assets/commands/agent-kit-digest.md +10 -5
  11. package/assets/commands/feedback.md +95 -0
  12. package/assets/commands/next-session.md +4 -4
  13. package/assets/commands/rules-review.md +98 -0
  14. package/assets/commands/skill-curator.md +44 -25
  15. package/assets/defaults/gate-map.sh +11 -4
  16. package/assets/defaults/project.sh +46 -0
  17. package/assets/docs/GLOSSARY.md +49 -46
  18. package/assets/hooks/docs-guard.sh +19 -3
  19. package/assets/hooks/git-guard-delivery.sh +106 -13
  20. package/assets/hooks/proposal-guard.sh +93 -0
  21. package/assets/hooks/reuse-first-guard.sh +83 -15
  22. package/assets/hooks/skill-gate-layers.sh +1 -1
  23. package/assets/hooks/skill-gate.sh +27 -1
  24. package/assets/hooks/task-flow-guard.sh +59 -19
  25. package/assets/hooks/waiting-turn-guard.sh +87 -0
  26. package/assets/hooks/window-fill-guard.sh +1 -1
  27. package/assets/laws/delivery.md +41 -7
  28. package/assets/laws/project-documentation.md +39 -0
  29. package/assets/laws/verifiability.md +6 -1
  30. package/assets/laws/work-conduct.md +83 -3
  31. package/assets/patterns/git-workflow-commit.azure.md +84 -4
  32. package/assets/patterns/git-workflow-commit.github.md +90 -4
  33. package/assets/patterns/git-workflow-commit.gitlab.md +84 -5
  34. package/assets/patterns/git-workflow-docker.md +30 -0
  35. package/assets/patterns/git-workflow-merge.md +1 -1
  36. package/assets/patterns/spec-driven-domain.md +7 -1
  37. package/assets/patterns/spec-driven-rule.md +6 -0
  38. package/assets/patterns/task-flow-close.md +197 -21
  39. package/assets/patterns/task-flow-handoff.md +28 -5
  40. package/assets/patterns/task-flow-resume.md +25 -7
  41. package/assets/patterns/task-flow-start.md +37 -6
  42. package/assets/rules/angular-patterns.md +22 -0
  43. package/assets/rules/api-layer.md +25 -0
  44. package/assets/rules/browser-verification.md +42 -1
  45. package/assets/rules/component-structure.md +21 -0
  46. package/assets/rules/dependencies.md +22 -0
  47. package/assets/rules/doc-style.md +37 -5
  48. package/assets/rules/{entity-conventions.md → entity-conventions.needs-admin.md} +21 -0
  49. package/assets/rules/entity-models.md +21 -0
  50. package/assets/rules/git-workflow.azure.md +62 -8
  51. package/assets/rules/git-workflow.github.md +78 -14
  52. package/assets/rules/git-workflow.gitlab.md +61 -8
  53. package/assets/rules/lib-layers.md +25 -0
  54. package/assets/rules/lists.md +27 -0
  55. package/assets/rules/navigation.md +21 -0
  56. package/assets/rules/{observability.md → observability.needs-app.md} +23 -0
  57. package/assets/rules/permissions.md +23 -0
  58. package/assets/rules/platform-access.md +21 -0
  59. package/assets/rules/reuse-first.md +20 -0
  60. package/assets/rules/seo.md +19 -0
  61. package/assets/rules/shared-code.md +19 -0
  62. package/assets/rules/spec-driven.md +36 -0
  63. package/assets/rules/styling-bem.md +19 -0
  64. package/assets/rules/task-flow.md +150 -35
  65. package/assets/rules/testing.md +50 -0
  66. package/assets/rules/translations.md +21 -0
  67. package/assets/rules/typescript-conventions.md +33 -0
  68. package/assets/samples/specs/_template/spec.md +83 -0
  69. package/assets/samples/tasks/_template/grill.md +28 -0
  70. package/assets/samples/tasks/_template/plan.md +39 -0
  71. package/assets/samples/tasks/_template/progress.md +23 -0
  72. package/assets/skills/agent-kit-extend.md +24 -0
  73. package/assets/skills/agent-kit.md +69 -7
  74. package/assets/templates/rule.md +31 -2
  75. package/assets/traits.json +14 -0
  76. package/bin/agent-kit.d.ts.map +1 -1
  77. package/bin/agent-kit.js +31 -16
  78. package/bin/agent-kit.js.map +1 -1
  79. package/index.d.ts +1 -0
  80. package/index.d.ts.map +1 -1
  81. package/index.js +1 -0
  82. package/index.js.map +1 -1
  83. package/lib/argv.d.ts +17 -0
  84. package/lib/argv.d.ts.map +1 -0
  85. package/lib/argv.js +44 -0
  86. package/lib/argv.js.map +1 -0
  87. package/lib/cargo.d.ts +88 -0
  88. package/lib/cargo.d.ts.map +1 -0
  89. package/lib/cargo.js +16 -0
  90. package/lib/cargo.js.map +1 -0
  91. package/lib/catalog.d.ts +18 -1
  92. package/lib/catalog.d.ts.map +1 -1
  93. package/lib/catalog.js +12 -2
  94. package/lib/catalog.js.map +1 -1
  95. package/lib/commands.d.ts +0 -26
  96. package/lib/commands.d.ts.map +1 -1
  97. package/lib/commands.js +79 -122
  98. package/lib/commands.js.map +1 -1
  99. package/lib/companion.d.ts +37 -0
  100. package/lib/companion.d.ts.map +1 -1
  101. package/lib/companion.js +42 -1
  102. package/lib/companion.js.map +1 -1
  103. package/lib/config.d.ts +38 -1
  104. package/lib/config.d.ts.map +1 -1
  105. package/lib/config.js +24 -0
  106. package/lib/config.js.map +1 -1
  107. package/lib/ship.d.ts +39 -0
  108. package/lib/ship.d.ts.map +1 -0
  109. package/lib/ship.js +87 -0
  110. package/lib/ship.js.map +1 -0
  111. package/lib/shipment.d.ts +60 -0
  112. package/lib/shipment.d.ts.map +1 -0
  113. package/lib/shipment.js +247 -0
  114. package/lib/shipment.js.map +1 -0
  115. package/lib/snapshot.d.ts +30 -0
  116. package/lib/snapshot.d.ts.map +1 -0
  117. package/lib/snapshot.js +73 -0
  118. package/lib/snapshot.js.map +1 -0
  119. package/lib/traits.d.ts +32 -0
  120. package/lib/traits.d.ts.map +1 -0
  121. package/lib/traits.js +82 -0
  122. package/lib/traits.js.map +1 -0
  123. package/package.json +6 -2
  124. package/rt-tools-agent-kit-0.8.3.tgz +0 -0
  125. package/lib/submit.d.ts +0 -24
  126. package/lib/submit.d.ts.map +0 -1
  127. package/lib/submit.js +0 -26
  128. package/lib/submit.js.map +0 -1
  129. 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
- ## 4. Выгрузи предложения файлом
56
+ Ход на этом не кончается: пока агент работает, берётся следующая задача. Ответ придёт
57
+ уведомлением, и тогда идут шаги 4–6 — один ход, после которого исполнитель возвращается к тому,
58
+ что делал.
59
+
60
+ ## 4. Положи находки в папку задачи
51
61
 
52
- Ответ роли живёт в переписке и умирает вместе с ней, а правки в пакет идут из другого дерева и
53
- в другой день. Поэтому предложения ложатся на диск — их пишешь ты, не роль: файлов она не
54
- пишет вовсе.
62
+ Ответ роли живёт в переписке и умирает вместе с ней, поэтому он сразу ложится на диск рядом с
63
+ ходом работы, в папку задачи. Пишешь его ты, не роль: файлов она не пишет вовсе.
55
64
 
56
65
  ```bash
57
- mkdir -p .claude/rt-kit/proposals
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
- Файл читает `agent-kit propose`: по заголовку он отбирает то, что уезжает в репозиторий пакета.
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
- ## 6. Отдай результат владельцу
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 "$@"; }
@@ -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
- if printf '%s' "$cmd" | grep -qiE 'Docs-skip:[[:space:]]*[^[:space:]"'"'"']{3,}'; then
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