@rt-tools/agent-kit 0.21.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/checks/board-long-work.github.mjs +101 -0
- package/assets/checks/board-runs.github.mjs +34 -0
- package/assets/checks/check-board.github.mjs +16 -2
- package/assets/checks/check-reuse.mjs +4 -1
- package/assets/checks/check-schema-drift.mjs +65 -6
- package/assets/checks/rt-kit-checks.config.mjs +13 -0
- package/assets/checks/signals.mjs +41 -1
- package/assets/commands/next-session.md +16 -5
- package/assets/defaults/project.sh +16 -0
- package/assets/hooks/browser-guard-no-asking.sh +5 -1
- package/assets/hooks/claim-guard.sh +1 -0
- package/assets/hooks/conscience-guard.sh +1 -0
- package/assets/hooks/git-guard-delivery.sh +15 -11
- package/assets/hooks/git-guard-push-tests.sh +22 -0
- package/assets/hooks/glossary-load.sh +23 -2
- package/assets/hooks/grill-gate.sh +64 -0
- package/assets/hooks/hook-input.sh +1 -0
- package/assets/hooks/postmortem-guard.sh +1 -0
- package/assets/hooks/proposal-guard.sh +8 -0
- package/assets/hooks/turn-exit-guard.sh +1 -0
- package/assets/hooks/waiting-turn-guard.sh +1 -0
- package/assets/hooks/work-start-guard.sh +2 -0
- package/assets/laws/autonomous-work.md +30 -0
- package/assets/laws/frontend-application.md +10 -0
- package/assets/laws/project-documentation.md +8 -0
- package/assets/laws/work-conduct.md +3 -0
- package/assets/patterns/autonomous-work-run.md +105 -0
- package/assets/patterns/browser-verification-stand.md +1 -1
- package/assets/patterns/doc-style-write.md +16 -0
- package/assets/patterns/git-workflow-pr-ready.md +93 -0
- package/assets/patterns/git-workflow-pr.azure.md +1 -1
- package/assets/patterns/git-workflow-pr.github.md +1 -1
- package/assets/patterns/git-workflow-pr.gitlab.md +1 -1
- package/assets/patterns/task-flow-start.md +47 -47
- package/assets/patterns/ts-procedure.md +3 -2
- package/assets/rules/autonomous-work.md +92 -0
- package/assets/rules/browser-verification.md +6 -0
- package/assets/rules/deploy-flow.azure.md +7 -0
- package/assets/rules/deploy-flow.github.md +7 -0
- package/assets/rules/deploy-flow.gitlab.md +7 -0
- package/assets/rules/doc-style.md +18 -0
- package/assets/rules/git-workflow.azure.md +13 -0
- package/assets/rules/git-workflow.github.md +59 -57
- package/assets/rules/git-workflow.gitlab.md +13 -0
- package/assets/rules/reuse-first.md +17 -3
- package/assets/rules/task-flow.md +62 -63
- package/assets/skills/agent-kit.md +20 -20
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +6 -0
- package/lib/commands.js.map +1 -1
- package/lib/push-gate.d.ts +14 -0
- package/lib/push-gate.d.ts.map +1 -0
- package/lib/push-gate.js +93 -0
- package/lib/push-gate.js.map +1 -0
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.23.0.tgz +0 -0
- package/assets/laws/application/access.md +0 -34
- package/assets/laws/application/locales.md +0 -33
- package/assets/laws/application/search-visibility.md +0 -24
- package/assets/patterns/permissions-procedure.md +0 -71
- package/assets/patterns/seo-page.md +0 -104
- package/assets/patterns/seo-verify.md +0 -83
- package/assets/patterns/translations-content.md +0 -107
- package/assets/patterns/translations-key.md +0 -64
- package/assets/rules/permissions.md +0 -116
- package/assets/rules/seo.md +0 -139
- package/assets/rules/translations.md +0 -96
- package/rt-tools-agent-kit-0.21.0.tgz +0 -0
|
@@ -69,15 +69,15 @@ flowchart TD
|
|
|
69
69
|
за которой в очереди работ ничего не стоит. Заводится задача, и работа переносится в ветку с
|
|
70
70
|
её номером.
|
|
71
71
|
- **Главная ветка влита в ветку задачи до открытия PR.** Гард отбивает открытие, пока вершина
|
|
72
|
-
главной не стала предком
|
|
73
|
-
|
|
72
|
+
главной не стала предком текущей: иначе ревьювер видит свою правку вперемешку с чужой, а
|
|
73
|
+
проверено всё было от основания, которого уже нет.
|
|
74
74
|
- **Волна веток от одной главной проверяется пробным слиянием, а не по одной:** каждая зелена
|
|
75
|
-
сама по себе, а сталкиваются
|
|
75
|
+
сама по себе, а сталкиваются тем, чего на отдельной ветке не видно.
|
|
76
76
|
- **Ветка следующей работы отводится от предыдущей, пока череда не прервалась.** `git checkout -b
|
|
77
|
-
<КЛЮЧ>-<номер>-<slug> <предыдущая ветка>` вместо `origin/main`; от главной —
|
|
78
|
-
череды. Иначе первое
|
|
77
|
+
<КЛЮЧ>-<номер>-<slug> <предыдущая ветка>` вместо `origin/main`; от главной — первая работа
|
|
78
|
+
череды. Иначе первое слияние разводит все остальные разом.
|
|
79
79
|
- **У заявки в череде основанием стоит предыдущая ветка, а не главная.** `gh pr create --base
|
|
80
|
-
<предыдущая ветка>` — иначе разбор показывает
|
|
80
|
+
<предыдущая ветка>` — иначе разбор показывает правку вперемешку со всем, что под ней. Базу
|
|
81
81
|
влитой нижней хостинг переносит сам.
|
|
82
82
|
- **Череда вливается снизу вверх, и порядок стоит в теле каждой заявки.** Родство веток по
|
|
83
83
|
списку не видно: строка «стоит на #<номер>» — единственное место, где владелец это прочтёт.
|
|
@@ -87,9 +87,9 @@ flowchart TD
|
|
|
87
87
|
владельца, разбирающего то же при слиянии, нет ни одной.
|
|
88
88
|
- **Несошедшиеся условия поставки называются одним отказом.** Гард копит их и печатает разом: всё
|
|
89
89
|
несошедшееся известно на первом вызове.
|
|
90
|
-
- **Условие, известное в начале работы, спрашивается в начале.** Заведение ветки отбивает
|
|
91
|
-
без вершины главной и чужую почту в
|
|
92
|
-
|
|
90
|
+
- **Условие, известное в начале работы, спрашивается в начале.** Заведение ветки отбивает
|
|
91
|
+
основание без вершины главной и чужую почту в подписи; на пуше то же чинится вливанием с
|
|
92
|
+
конфликтом и переписыванием ветки.
|
|
93
93
|
- **Судится то основание, которое названо командой, а не вершина рабочей копии.** Ветку заводят и
|
|
94
94
|
от `origin/main` прямо — этой командой основание как раз и берут свежим. Основание, о котором
|
|
95
95
|
дерево ничего не знает, не судится вовсе.
|
|
@@ -140,12 +140,10 @@ flowchart TD
|
|
|
140
140
|
прогона, а не цвет, и свежей вершине даёт время.
|
|
141
141
|
- **Прогон, вытесненный из очереди конвейера, сверка называет отдельной строкой.** Он выглядит
|
|
142
142
|
упавшим, хотя ветку не проверял; отличает их число заданий — у него ноль.
|
|
143
|
-
- **Черновик при зелёном прогоне на вершине — расхождение сверки.** Зелёная страница
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
машинной записи судится двумя признаками — зелёный прогон на его вершине и разобранная папка
|
|
148
|
-
задачи в его ветке; лежащая папка означает идущую работу.
|
|
143
|
+
- **Черновик при зелёном прогоне на вершине — расхождение сверки.** Зелёная страница ничего не
|
|
144
|
+
разрешает: кнопка заблокирована хостингом. В ходе это закрывает гард, между ходами — сверка.
|
|
145
|
+
- **Свои черновики судятся все разом, а не тот один, чья ветка взята.** Признака два — зелёный
|
|
146
|
+
прогон на вершине и разобранная папка задачи в ветке; лежащая папка означает идущую работу.
|
|
149
147
|
- **Открытие PR отбивается, пока ветка везёт папку своей задачи.** Кнопку слияния нажимает
|
|
150
148
|
человек там, где гардов нет, и открытие — последняя точка, где отказ ещё виден тому, кто может
|
|
151
149
|
его выполнить.
|
|
@@ -168,25 +166,32 @@ flowchart TD
|
|
|
168
166
|
- **Сборка входит в набор наравне с линтом и юнитами.** Линтер типов не читает, а юниты читают
|
|
169
167
|
только импортированное тестом: ошибка типов в непокрытом коде доживает до сборки образа, то
|
|
170
168
|
есть до мержа.
|
|
171
|
-
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
169
|
+
- **На машине, где раннеров несколько, любой путь от домашнего каталога общий.** Умолчание
|
|
170
|
+
готового шага опасно именно тем, что оно общее: соседнее задание переписывает его под свою
|
|
171
|
+
версию, пока наше стоит между шагами. Каталог установки, имя контейнера и имя сборщика
|
|
172
|
+
называются поэтому по проекту и постоянно, а временный каталог решением не бывает — в нём
|
|
173
|
+
живёт хранилище пакетов.
|
|
174
|
+
- **Набор гейта пуша не бывает уже набора конвейера.** Шаг конвейера, которому в наборе нет ни
|
|
175
|
+
строки, ни объявленного исключения с причиной, отбивает пуш, а не печатается рядом:
|
|
176
|
+
предупреждение читается как разрешение.
|
|
177
|
+
- **Набор гейта зовёт умолчание пакета, а не перечисляет его строками.** Переписанный строками,
|
|
178
|
+
он оставляет завтрашнюю дыру: заведённая пакетом проверка до дерева не доедет. Отсеивать из
|
|
179
|
+
умолчания законно, но поимённо и с причиной.
|
|
180
|
+
- **Итоговый набор перед пушем читается разбором состояния, а не сборкой в уме.** Раздел «набор
|
|
181
|
+
перед пушем» печатает его целиком и называет рядом то, что умолчание печатало, а в набор не
|
|
182
|
+
попало: дерево, писавшее надстройку вслепую, дописывало в неё повтор.
|
|
178
183
|
- **Причина исключения, называющая задачу, судится на живость этой задачи.** Мёртвый номер делает
|
|
179
|
-
исключение
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
копится молча: раскладка отказывает по правленому файлу целиком. Статьёй выше это не покрывается —
|
|
183
|
-
сверки нет в конвейере.
|
|
184
|
+
исключение бессрочным молча. Спрашивается тем же ярусом, что состояние задачи у гарда.
|
|
185
|
+
- **Сверка раскладки стоит в наборе гейта пуша наравне с линтом и сборкой.** Правка мимо
|
|
186
|
+
источника копится молча, а сверки нет в конвейере.
|
|
184
187
|
- **После вливания главной ветки набор проверок пересматривается по тому, что ветка везёт
|
|
185
|
-
теперь.**
|
|
186
|
-
|
|
187
|
-
-
|
|
188
|
-
|
|
189
|
-
|
|
188
|
+
теперь.** Проверять по тому, что правил автор, — значит проверять половину: отвечает ветка
|
|
189
|
+
целиком.
|
|
190
|
+
- **Главная ветка берётся удалённой ссылкой — и в словах, и в действиях.** Локальная протухает в
|
|
191
|
+
минуту, когда её подтянули, и молчит об этом: это снимок вчерашнего дня. От `origin/main` идут
|
|
192
|
+
и сравнение, и основание новой ветки, и счёт влитого, и подтягивание — смешанные в одной
|
|
193
|
+
команде, ссылки дают промах, изнутри выглядящий верным. Влитая ветка при локальной числится
|
|
194
|
+
невлитой, и уборка кончается списком невлитого, которого нет.
|
|
190
195
|
- **Правка кода отдаётся человеку открытым PR, а не запушенной веткой.** Ветка во входящие не
|
|
191
196
|
приходит и обсуждения не имеет: до открытия PR правки для человека нет. Открывается он тем же
|
|
192
197
|
ходом, которым исполнитель говорит, что работу отдаёт.
|
|
@@ -216,36 +221,32 @@ flowchart TD
|
|
|
216
221
|
хостинга об авторе гард спрашивает на снятии черновика: влитую заявку не переоткрыть.
|
|
217
222
|
|
|
218
223
|
- **Автор PR не может быть его ревьювером.** Запрос разбора на себя GitHub принимает и молча не
|
|
219
|
-
|
|
220
|
-
- **Вызов клиента хостинга идёт из дерева, а связка команд исхода не проверяет.**
|
|
221
|
-
клиент
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
борде `gh pr edit` отвечает отказом про Projects.
|
|
224
|
+
создаёт. Считаются только запрос и отзыв не от автора.
|
|
225
|
+
- **Вызов клиента хостинга идёт из дерева, а связка команд исхода не проверяет.** Вне дерева
|
|
226
|
+
клиент отказывает, а следующее звено увозит на хостинг остаток отказавшего.
|
|
227
|
+
- **Метки, исполнитель и ревьювер PR ставятся вызовами `gh api`, а не `gh pr edit`:** тот
|
|
228
|
+
отвечает отказом про Projects.
|
|
225
229
|
- **Борда правится запросом GraphQL по идентификатору борды, а не по имени владельца.**
|
|
226
|
-
- **Почта машинного коммита копируется из компаньона, а не набирается по памяти.**
|
|
227
|
-
`<число>+<логин>@users.noreply.github.com`
|
|
228
|
-
|
|
229
|
-
- **Личность машинной записи подтверждается ответом хостинга, а не узнаванием
|
|
230
|
-
|
|
231
|
-
- **Сценарии гардов задают настройки git сами, а не берут их с машины.**
|
|
232
|
-
|
|
233
|
-
|
|
230
|
+
- **Почта машинного коммита копируется из компаньона, а не набирается по памяти.** Адрес
|
|
231
|
+
`<число>+<логин>@users.noreply.github.com` сходится по числу: с чужим коммит уезжает подписанным
|
|
232
|
+
посторонним. Ту же строку держит профиль дерева, и гард отбивает пуш.
|
|
233
|
+
- **Личность машинной записи подтверждается ответом хостинга, а не узнаванием строки:** её
|
|
234
|
+
спрашивают токеном, и логин с числом приходят вместе.
|
|
235
|
+
- **Сценарии гардов задают настройки git сами, а не берут их с машины.** Подпись с машины уводит
|
|
236
|
+
git в агент ключей, а заблокированный агент роняет набор: автор, почта и подпись идут флагами
|
|
237
|
+
`-c` в команде.
|
|
234
238
|
|
|
235
239
|
- **Каждый коммит вклада ветки подписан машинной записью, и это проверяется набором пуша.** Гард
|
|
236
|
-
судит
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
возврата.** Открытие и постановка ревьювера отвечают нулём и тогда, когда не сделали ничего.
|
|
240
|
+
судит коммит, назвавшийся ею; подписанный человеком проходит мимо.
|
|
241
|
+
- **Состояние заявки перечитывается у хостинга сразу после публикации.** Открытие и постановка
|
|
242
|
+
ревьювера отвечают нулём и тогда, когда не сделали ничего.
|
|
240
243
|
- **Автор открытой заявки и наличие у неё ревьювера сверяются очередью работ.** До слияния оба
|
|
241
|
-
промаха не видны:
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
требует прав, которых у машинной записи нет: «сошлось» не отличить от «спросить было нечем».
|
|
244
|
+
промаха не видны: открытая человеком заявка ревьювера не получит никогда.
|
|
245
|
+
- **Ревьюверы спрашиваются вызовом REST, а не выборкой клиента.** Её поля собирает GraphQL, прав
|
|
246
|
+
на который у записи нет: «сошлось» неотличимо от «спросить было нечем».
|
|
245
247
|
|
|
246
|
-
- **Рабочее дерево не опустошается ради прогона инструмента.** Сравнение
|
|
247
|
-
|
|
248
|
-
дерева, ни сверка.
|
|
248
|
+
- **Рабочее дерево не опустошается ради прогона инструмента.** Сравнение идёт на второй копии:
|
|
249
|
+
прятанье уводит незакоммиченную работу туда, где её не видит ни состояние дерева, ни сверка.
|
|
249
250
|
|
|
250
251
|
## Чего из закона здесь нет
|
|
251
252
|
|
|
@@ -269,3 +270,4 @@ flowchart TD
|
|
|
269
270
|
- `git-workflow-merge` — главная ветка влита в ветку задачи, конфликт разобран.
|
|
270
271
|
- `git-workflow-stack` — череда веток: ветвление от предыдущей, основание заявки, порядок отдачи.
|
|
271
272
|
- `git-workflow-freshness` — свои открытые заявки: чтение всех разом, отставание против спора.
|
|
273
|
+
- `git-workflow-pr-ready` — доведение отданного: снятый черновик, разбор красного, волна по череде.
|
|
@@ -159,12 +159,21 @@ flowchart TD
|
|
|
159
159
|
только то, что импортировано тестом: ошибка типов в непокрытом коде доживает до сборки
|
|
160
160
|
образа, то есть до слияния. Четыре слияния подряд так и уехали в главную ветку, ломая
|
|
161
161
|
выкатку.
|
|
162
|
+
- **На машине, где раннеров несколько, любой путь от домашнего каталога общий.** Умолчание
|
|
163
|
+
готового шага опасно именно тем, что оно общее: соседнее задание переписывает его под свою
|
|
164
|
+
версию, пока наше стоит между шагами. Каталог установки, имя контейнера и имя сборщика
|
|
165
|
+
называются поэтому по проекту и постоянно, а временный каталог решением не бывает — в нём
|
|
166
|
+
живёт хранилище пакетов.
|
|
162
167
|
- **Набор гейта пуша не бывает уже набора конвейера.** Гейт — обещание, что пуш не приедет
|
|
163
168
|
красным; набор, из которого выкинуты сборка и снимки, обещает то, чего не проверяет. Шаг
|
|
164
169
|
конвейера, которому в наборе гейта нет ни строки, ни объявленного исключения с причиной,
|
|
165
170
|
отбивает пуш, а не печатается рядом с ним: напечатанное предупреждение исполнитель читает как
|
|
166
171
|
разрешение. Дважды подряд правка, прошедшая гейт целиком, была отбита конвейером — и оба раза
|
|
167
172
|
зелёный гейт был прочитан как «локально всё зелено».
|
|
173
|
+
- **Итоговый набор перед пушем читается разбором состояния, а не сборкой в уме.** Он собирается
|
|
174
|
+
из умолчания пакета и надстройки дерева, и прочитать сборку было нечем: раздел «набор перед
|
|
175
|
+
пушем» печатает его целиком, по команде на строку, а рядом называет то, что умолчание печатало,
|
|
176
|
+
а в набор не попало. Дерево, писавшее надстройку вслепую, дописывало в неё повтор.
|
|
168
177
|
- **Причина исключения, называющая задачу, судится на живость этой задачи.** Отсрочка со сроком
|
|
169
178
|
и отсрочка без срока выглядят одинаково, пока номер никто не спросил; мёртвый номер в причине
|
|
170
179
|
делает исключение бессрочным, не сказав об этом ни строкой. Спрашивается тем же ярусом, что
|
|
@@ -186,6 +195,10 @@ flowchart TD
|
|
|
186
195
|
сломана, она описывает вчерашний день. Сравнение веток пишется от `origin/main` целиком —
|
|
187
196
|
смешав в одной команде удалённую ссылку для одной стороны и локальную для другой, промах
|
|
188
197
|
изнутри выглядит правильным.
|
|
198
|
+
- **Удалённую ссылку берут не только слова, но и действия.** Основание новой ветки, счёт влитого
|
|
199
|
+
и подтягивание главной судятся по ней же: локальная — снимок последнего подтягивания, и работа,
|
|
200
|
+
начатая от неё, стартует от основания, которого в главной уже нет. Влитая ветка при ней числится
|
|
201
|
+
невлитой, и уборка кончается списком невлитого, которого нет.
|
|
189
202
|
- **Слияние по кнопке «Merge when pipeline succeeds» не заменяет проверок до пуша.** Конвейер
|
|
190
203
|
видит только то, что уже отправлено, а отправленная красная ветка занимает очередь работ и
|
|
191
204
|
выглядит готовой к разбору.
|
|
@@ -64,7 +64,16 @@ flowchart TD
|
|
|
64
64
|
- **Панель правки записи наследует общую основу, а не собирается своей разметкой.** Тогда она
|
|
65
65
|
открывается, закрывается и спрашивает про несохранённое одинаково во всех разделах.
|
|
66
66
|
- **Об удаче и об отказе сообщает общая шина, а не своя разметка на экране.** Своё сообщение
|
|
67
|
-
расходится с соседним видом, местом и временем показа.
|
|
67
|
+
расходится с соседним видом, местом и временем показа. Готовое сообщение набора, поставленное
|
|
68
|
+
на экран, — та же своя разметка: правило говорит про место показа, а не про тег, и замена
|
|
69
|
+
своего абзаца на готовый компонент нарушения не снимает — она снимает признак.
|
|
70
|
+
- **Инлайновое сообщение законно там, где панель правки записи остаётся открытой после отказа.**
|
|
71
|
+
Держит его основа панели; экран, список и публичная страница к этому месту не относятся.
|
|
72
|
+
- **Маркер отступления ставится после чтения инвентаря готового, и прочитанное называется рядом.**
|
|
73
|
+
Объяснение при маркере называет компонент кита и то, чего в нём не хватает. Маркер без этого —
|
|
74
|
+
не отступление, а глушитель: он снимает признак, ничего не доказав.
|
|
75
|
+
- **Проверка не снимается с гейта ради того, чтобы пуш прошёл.** Расхождение закрывается готовым
|
|
76
|
+
либо объявляется отступлением в самом коде; надстройка профиля для этого не средство.
|
|
68
77
|
- **Компонент объявляется тремя файлами: `.ts`, `.html`, `.scss`.** `template:` и `styles:` в
|
|
69
78
|
декораторе, атрибут `style=` и правка размеров через `[ngStyle]` — это стили, до которых не
|
|
70
79
|
дотянется ни кит, ни `stylelint`.
|
|
@@ -107,13 +116,18 @@ flowchart TD
|
|
|
107
116
|
Списком их здесь нет: признак — это данные, а не текст правила и не код проверки. Наборы лежат
|
|
108
117
|
при пакете, по файлу на пакет rt-tools, и в каждом только то, что везёт он сам. Дерево называет
|
|
109
118
|
нужные ему наборы ключом `reuse.bundles` в настройке проверок и дописывает свои признаки файлом,
|
|
110
|
-
названным ключом `reuse.signals`; совпавший ключ замещает пакетный, новый дописывается.
|
|
119
|
+
названным ключом `reuse.signals`; совпавший ключ замещает пакетный, новый дописывается. Там же
|
|
120
|
+
дерево называет директивы своей дизайн-системы — ключом `reuse.kitDirectives`: нативный тег,
|
|
121
|
+
несущий такую директиву, из признаков вырезается, потому что источник вида в дереве бывает не
|
|
122
|
+
один. Гард на
|
|
111
123
|
правке и сплошная проверка читают отсюда оба — разойтись им нечем.
|
|
112
124
|
|
|
113
125
|
Что бывает признаком:
|
|
114
126
|
|
|
115
127
|
- нативный контрол в шаблоне там, где кит везёт свой;
|
|
116
|
-
- отказ, предупреждение или ожидание, собранные руками вместо
|
|
128
|
+
- отказ, предупреждение или ожидание, собранные руками вместо готового, — признак называет тег,
|
|
129
|
+
а решение принимается по месту показа: готовое сообщение на экране закрывает признак, не
|
|
130
|
+
закрывая нарушения;
|
|
117
131
|
- наложение поверх страницы, объявленное своими стилями, — подложка, порядок слоёв, вращение;
|
|
118
132
|
- раскладка, объявленная в файле стилей экрана, а не применённая директивами из общего слоя;
|
|
119
133
|
- своя реализация того, что даёт основа кита, вместо наследования;
|
|
@@ -115,56 +115,60 @@ flowchart TD
|
|
|
115
115
|
правится.** Гард хода работы требует три вещи: папку задачи по имени ветки, замысел в ней и
|
|
116
116
|
объявленное в ходе работы состояние. Договорённость о продукте требует свой гард на те же
|
|
117
117
|
события.
|
|
118
|
-
- **Гард судит объявленный переход, а не наличие файлов.** Пустой
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
без замысла на диске.
|
|
118
|
+
- **Гард судит объявленный переход, а не наличие файлов.** Пустой замысел лежит так же, как
|
|
119
|
+
написанный, поэтому отказ снимает объявленное состояние — `этап-идёт`, `этапы-кончились`,
|
|
120
|
+
`разбор-кончился`. Четвёртый путь не состояние, а история ветки: папка, разобранная её
|
|
121
|
+
коммитом, означает отданную работу, и правка по замечаниям идёт без замысла на диске.
|
|
123
122
|
- **Строка состояния, переведённая вперёд, — то же объявление намерения, только машиночитаемое.**
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
Исполнитель, которому сказано только «не в том состоянии», перепишет строку состояния вместо
|
|
128
|
-
того, чтобы сделать шаг.
|
|
123
|
+
Состояние объявляется тем ходом, в котором его обязательное действие начато делом.
|
|
124
|
+
- **Отказ по состоянию называет обязательное действие объявленного состояния.** Услышав только
|
|
125
|
+
«не в том состоянии», исполнитель перепишет строку состояния вместо шага.
|
|
129
126
|
- **Именем состояния считается только слово из перечня.** Своё слово не говорит ни о входе, ни о
|
|
130
|
-
выходе, ни об обязательном
|
|
131
|
-
- **Два требования — два гарда, и снять одно можно, не теряя второго.**
|
|
132
|
-
|
|
133
|
-
порознь: строка о неизменном поведении снимает договорённость, а не требование дойти до
|
|
134
|
-
правки кода.
|
|
127
|
+
выходе, ни об обязательном действии.
|
|
128
|
+
- **Два требования — два гарда, и снять одно можно, не теряя второго.** Судят порознь: строка о
|
|
129
|
+
неизменном поведении снимает договорённость, а не требование дойти до правки кода.
|
|
135
130
|
- **Влитая договорённость ветку не запирает.** После вливания директории «предложено» на диске
|
|
136
|
-
нет, а замысел на неё
|
|
137
|
-
истории ветки.
|
|
131
|
+
нет, а замысел ссылается на неё до конца работы: влитое от незаведённого гард отличает по
|
|
132
|
+
истории ветки.
|
|
138
133
|
- **Договорённость требуется по путям правки, а не по оценке задачи.** `apps/**` и `libs/**` —
|
|
139
134
|
признак; правила, тексты, обвязка и зависимости под него не подпадают. Обход — строка
|
|
140
135
|
`**Поведение:** не меняется — <причина владельца>` в замысле; пустая причина не принимается.
|
|
141
136
|
- **Что требует слова владельца, берётся списком, а не оценкой на месте.** Оценку «это безопасно»
|
|
142
|
-
назначает тот, кому она
|
|
143
|
-
|
|
137
|
+
назначает тот, кому она удобна. Недовольство владельца простоем разрешением не бывает.
|
|
138
|
+
- **На команду владельца ответ начинается с результата, а не с намерения и не с его обоснования.**
|
|
139
|
+
Владелец, поставивший задачу, мнения о ней не запрашивал, и обоснование при уже принятом чужом
|
|
140
|
+
решении читается его оценкой: авторство переписывается на исполнителя. Исключение одно —
|
|
141
|
+
исполнение упёрлось в препятствие: тогда называется препятствие, а не отношение к задаче.
|
|
144
142
|
- **Заход работу не начинает сам.** Начало требует слова владельца в этом же заходе: передача,
|
|
145
143
|
состояние из хука запуска и назначенный эпик говорят, что делать, если работать, и молчат о
|
|
146
144
|
том, работать ли. Судится это формой реплики, а не смыслом: правка кода после пустой реплики,
|
|
147
145
|
одного слова или одного пути ход не заканчивает.
|
|
148
|
-
- **Указание работать по ходу работы покрывает все его шаги, включая меняющие историю.**
|
|
149
|
-
|
|
146
|
+
- **Указание работать по ходу работы покрывает все его шаги, включая меняющие историю.**
|
|
147
|
+
Спрашивают о том, чего в ходе работы нет.
|
|
150
148
|
- **Вопрос, записанный прошлым заходом, вопросом владельца не становится.** Он адресован автору
|
|
151
149
|
передачи, и часть таких вопросов закрыта шагом работы.
|
|
150
|
+
- **Указание владельца действует до его отмены, и новый факт против него — строка в ответе о
|
|
151
|
+
цене, а не новый вопрос.** Переспрашивают то, чего указание не покрывает; обстоятельство,
|
|
152
|
+
меняющее цену указания, но не смысл, называется вслух, и работа идёт дальше. Меню, где два
|
|
153
|
+
варианта из трёх предлагают отменить решение владельца, и есть такая отмена. Правило о развилке
|
|
154
|
+
говорит, КАК задавать вопрос, и молчит о том, задавать ли его вовсе.
|
|
155
|
+
- **Ответ, данный репликой владельца, записан наравне с ответом в документе.** Вопрос, на который
|
|
156
|
+
в разговоре уже отвечали, второй раз не задают.
|
|
152
157
|
- **Слово владельца об устройстве — постановка, а не решение.** Названное им обычно уже живёт в
|
|
153
|
-
дереве под этим самым
|
|
154
|
-
|
|
155
|
-
|
|
158
|
+
дереве под этим самым словом — именем на экране, разделом спека, полем модели, — и сверяется с
|
|
159
|
+
ними до правки. Разошлось прочтение — спрашивается владелец: истолкованное по ближайшему коду
|
|
160
|
+
выглядит исполненной просьбой ровно до приёмки.
|
|
156
161
|
- **Папка задачи заводится под любую работу, без исключений.** Исключение, у которого есть хоть
|
|
157
|
-
одна законная форма, исполняется как разрешение. Заводится она до первой
|
|
158
|
-
заходов уйдёт на работу, заранее не знает никто.
|
|
162
|
+
одна законная форма, исполняется как разрешение. Заводится она до первой правки.
|
|
159
163
|
- **Папка задачи едет в ветку коммитом, а не живёт в одном рабочем дереве.** Незакоммиченная,
|
|
160
|
-
она проходит все правки без отказа, а
|
|
161
|
-
|
|
164
|
+
она проходит все правки без отказа, а отказ приходит в последней точке, когда замысел уже снят:
|
|
165
|
+
признак отданной работы берётся из истории. Вне истории законен один черновик без номера.
|
|
162
166
|
- **Папка задачи разбирается последним коммитом до открытия PR, а не после одобрения.** Человек
|
|
163
167
|
вливает, как только видит зелёное, и закрывающему коммиту места не остаётся вовсе. Цена:
|
|
164
168
|
замысла с этой минуты на диске нет, и признак отданной работы гард берёт из истории ветки.
|
|
165
|
-
- **Открыв PR, исполнитель называет владельцу
|
|
166
|
-
|
|
167
|
-
|
|
169
|
+
- **Открыв PR, исполнитель называет владельцу номер, чего ждёт и что сделает следом.** Ждёт он
|
|
170
|
+
прогона, следом снимает черновик: зелёный прогон говорит, что не сломано, и молчит о
|
|
171
|
+
заблокированной у черновика кнопке слияния.
|
|
168
172
|
- **Просьба о слиянии — отдельный ход, и раньше зелёного прогона её не бывает.** Порядок один:
|
|
169
173
|
папка разобрана и запушена → PR открыт черновиком → прогон зелёный → черновик снят →
|
|
170
174
|
исполнитель просит влить, называя номер.
|
|
@@ -174,66 +178,60 @@ flowchart TD
|
|
|
174
178
|
- **Гард замысла — нижняя граница требования, а не его предел.** Он требует папку только под
|
|
175
179
|
правку кода приложения, а статья выше — под любую работу. Прочитанный как признак, он
|
|
176
180
|
становится разрешением работать без замысла везде, куда не смотрит.
|
|
177
|
-
- **Указание работать по правилу — это указание делать его шаги, включая
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
Отбитая гардом команда и отклонённый вызов читаются так же: сперва делается всё, что мимо них.
|
|
181
|
+
- **Указание работать по правилу — это указание делать его шаги, включая меняющие историю.**
|
|
182
|
+
Отметка этапа, коммит, пуш и открытие заявки правилом предписаны: спросить надо о том, чего в
|
|
183
|
+
нём нет. Ход, доведший работу до готовности и вставший перед коммитом, её не отдал, а спрятал.
|
|
184
|
+
- **Взятая задача ходом не кончается.** Заведение задачи, ветки, колонки и папки — подготовка:
|
|
185
|
+
она переводит работу в состояние записанного замысла, где действие уже другое. Держит это страж
|
|
186
|
+
выхода хода, называя в отказе первый этап.
|
|
187
|
+
- **Ожидание одной части этапа остановкой этапа не бывает.** Независимые от ожидаемого части
|
|
188
|
+
делаются тем же ходом, а владельцу называется, что сделано и что осталось на его шаг. Отбитая
|
|
189
|
+
команда читается так же: сперва делается всё, что мимо неё.
|
|
187
190
|
- **Сделанное отмечается только в ходе работы.** «Где стоим» перезаписывается каждым заходом, а
|
|
188
191
|
не дописывается: это первое, что читает следующий заход.
|
|
189
192
|
- **Слово для нового понятия ищется в словаре дерева.** Общую часть везёт пакет, предметную
|
|
190
193
|
дописывает дерево надстройкой; словарь уезжает в контекст на запуске сессии целиком, поэтому
|
|
191
194
|
«не читал» основанием не бывает.
|
|
192
195
|
- **Папка задачи заводится черновиком и получает номер командой.** До конца разбора неизвестно,
|
|
193
|
-
сколько задач из него выйдет, поэтому номер не
|
|
194
|
-
|
|
195
|
-
шапку раскладки.
|
|
196
|
+
сколько задач из него выйдет, поэтому номер не бывает первым. Команда переименовывает черновик,
|
|
197
|
+
проставляет шапку замысла и снимает с копий шапку раскладки.
|
|
196
198
|
- **Брошенный разбор виден.** Черновик старше недели перечисляет сверка очереди.
|
|
197
199
|
- **Следующая задача берётся из замысла эпика, а список очереди работ спрашивается только там, где
|
|
198
200
|
эпика нет.** По списку номеров первая задача чужого эпика неотличима от своей. Кончившийся эпик
|
|
199
201
|
называется владельцу тем же ходом, которым берётся работа вне его.
|
|
200
|
-
- **Эпик не закрывается по признаку, подтверждённому только чтением.**
|
|
201
|
-
|
|
202
|
+
- **Эпик не закрывается по признаку, подтверждённому только чтением.** Проверяемое глазами
|
|
203
|
+
называется проверенным лишь вместе с командой и её выводом.
|
|
202
204
|
- **Задачи эпика заводятся все разом, тем же ходом, что и сам эпик.** Заведение по одной прячет
|
|
203
205
|
объём. Номера возвращаются в раздел порядка той же правкой: без них «взять следующую» отвечает
|
|
204
206
|
названием, а не карточкой.
|
|
205
207
|
|
|
206
208
|
- **Замысел эпика лежит там, где его найдут без сети и после мержа.** Карточка порядка задач не
|
|
207
|
-
держит, а папка задачи держала бы его до слияния
|
|
208
|
-
|
|
209
|
-
каким приняты.
|
|
209
|
+
держит, а папка задачи держала бы его до слияния первой; каталог называет компаньон правила.
|
|
210
|
+
Названное владельцем по ходу дописывается туда же тем ходом, каким принято.
|
|
210
211
|
- **Сборка по образцу начинается с чтения самого образца, а не пересказа о нём.** Пересказ лежит
|
|
211
212
|
в разборе просьбы и в замысле эпика; образцом они не считаются. Повторяемая часть открывается
|
|
212
213
|
целиком — обходом каталогов, а не одним файлом, за которым пришли.
|
|
213
214
|
- **Что действует на дерево, а не на правку, лежит вне индекса.** Путь к образцу и разрешение
|
|
214
|
-
работать вне эпика ветке не
|
|
215
|
-
а следующая, отведённая от главной, их не несёт. Место записи — рядом с передачей захода.
|
|
215
|
+
работать вне эпика ветке не принадлежат и живут рядом с передачей захода.
|
|
216
216
|
- **Закрытая работа разбирается правилами, и это шаг закрытия, а не отдельная просьба.** Что
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
если дерево её разложило.
|
|
217
|
+
грузилось и чего не хватило, видно только заходу, который работу вёл. Разбор кончается правкой
|
|
218
|
+
слоя правил или предложением наружу.
|
|
220
219
|
- **Разбор закрытой работы уходит в фон, а исполнитель берёт следующую задачу.** Роль работает
|
|
221
|
-
своим
|
|
222
|
-
одним ходом.
|
|
220
|
+
своим ходом; сводку собирают до запуска, находки принимают одним ходом.
|
|
223
221
|
- **Находки разбора ждут владельца, а в пакет уезжает только сводка наблюдений.** Предложение —
|
|
224
222
|
заготовка правки чужого дерева, и уехавшая без разбора, она становится работой того, кто её не
|
|
225
223
|
заказывал. Сводка уезжает всегда: она говорит, чем пользовались, и мнением не бывает.
|
|
226
|
-
- **Дешёвый шаг закрытия идёт раньше дорогого, а прогон — после вливания.** Вливание
|
|
227
|
-
и приведение текстов стоят минуты, прогон — окно
|
|
228
|
-
|
|
224
|
+
- **Дешёвый шаг закрытия идёт раньше дорогого, а прогон — после вливания.** Вливание
|
|
225
|
+
договорённости и приведение текстов стоят минуты, прогон — окно захода; идущий до вливания, он
|
|
226
|
+
смотрит то, что в главную не поедет.
|
|
229
227
|
- **Договорённость вливается в спек домена одним из последних коммитов ветки, до открытия PR.**
|
|
230
228
|
К этому моменту код написан, привязки известны, и в главной ветке директория `proposed/` не
|
|
231
229
|
появляется вовсе. Готовые к вливанию перечисляет `npm run check:specs`.
|
|
232
230
|
- **Папка закрытой задачи разбирается, а не переносится целиком.** В `docs/archive/` уезжает то, что
|
|
233
231
|
объясняет решение; остальное удаляется. Неразобранную ловит сверка очереди.
|
|
234
232
|
- **Открытие PR и снятие черновика отбиваются, пока ветка везёт папку своей задачи.** Слияние
|
|
235
|
-
нажимает человек на хостинге, где гардов нет: снятый черновик он читает
|
|
236
|
-
|
|
233
|
+
нажимает человек на хостинге, где гардов нет: снятый черновик он читает приглашением влить.
|
|
234
|
+
Судится содержимое ветки, а не рабочее дерево.
|
|
237
235
|
- **Ветка, снёсшая папку, обязана прибавить запись в архив.** Снести дешевле, чем разобрать, а
|
|
238
236
|
первым уходит разбор просьбы — единственная запись слов владельца.
|
|
239
237
|
- **Обход — строка `Task-folder-skip: <причина>` в PR или в самой команде.** Пустая причина обходом
|
|
@@ -253,8 +251,9 @@ flowchart TD
|
|
|
253
251
|
видит правку файла и не знает ни о разведке до первого вопроса, ни о шести обязательных, ни об
|
|
254
252
|
ответах на них — пустая таблица проходит так же, как заполненная.
|
|
255
253
|
|
|
256
|
-
|
|
257
|
-
|
|
254
|
+
Понимания текста у гарда разговора нет: второй его признак судит общие слова темы вопроса и
|
|
255
|
+
последней реплики владельца, а не смысл — вопрос о другом предмете, названный прежними словами,
|
|
256
|
+
он отобьёт. Отказ называет законный ход: назвать то, чего в прежнем ответе владельца нет.
|
|
258
257
|
|
|
259
258
|
Неизменность замысла не стережёт ничто: правка по ходу отличима от первоначальной записи только
|
|
260
259
|
по истории.
|
|
@@ -228,17 +228,17 @@ npx agent-kit adopt [файлы] # отдать пакету свой файл,
|
|
|
228
228
|
|
|
229
229
|
## Установка туда, где уже всё своё
|
|
230
230
|
|
|
231
|
-
1. `init`, затем `skip` на всё, что дерево держит
|
|
232
|
-
2. Снимок того, что говорят проверки дерева, до единой
|
|
231
|
+
1. `init`, затем `skip` на всё, что дерево держит само; пустая раскладка — законное начало.
|
|
232
|
+
2. Снимок того, что говорят проверки дерева, до единой правки: он и есть мерило.
|
|
233
233
|
3. Ресурс за ресурсом: пакетную редакцию довести до здешней, предметность вынести в
|
|
234
234
|
надстройку, снять отказ, разложить, прогнать сценарии и сверить снимок.
|
|
235
235
|
4. Разложенное поверх своего пакет не пишет: файл без шапки для него чужой. Отдаётся он
|
|
236
|
-
командой `adopt` — прежнее содержимое ложится рядом с пометкой `.before-rt-kit
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
236
|
+
командой `adopt` — прежнее содержимое ложится рядом с пометкой `.before-rt-kit`.
|
|
237
|
+
5. Ресурс, у которого здешняя редакция богаче пакетной по существу, в раскладку не берётся.
|
|
238
|
+
Признак — статья, которой в пакетной редакции нет и не может быть: она выводится из предмета
|
|
239
|
+
дерева. Он уходит в `skip`, а наверх едет предложение снять его из пакета.
|
|
240
|
+
6. Свои сценарии отданного файла переписываются под пакетное поведение либо снимаются: чинить
|
|
241
|
+
пакетную редакцию на месте нельзя, её адрес — источник пакета или надстройка.
|
|
242
242
|
|
|
243
243
|
## Свойства дерева
|
|
244
244
|
|
|
@@ -272,6 +272,10 @@ npx agent-kit adopt [файлы] # отдать пакету свой файл,
|
|
|
272
272
|
|
|
273
273
|
## Ловушки раскладки
|
|
274
274
|
|
|
275
|
+
- **Словарь — такой же разложенный ресурс, как правило.** Хук запуска кладёт его в контекст
|
|
276
|
+
целиком, до первой реплики, и оттого он выглядит обычным документом дерева; шапка у него есть,
|
|
277
|
+
но читается служебной строкой. Новое слово идёт в надстройку словаря, своим разделом.
|
|
278
|
+
|
|
275
279
|
- **Запись файла командой оболочки судится по всем путям, названным в её теле.** Гейт вынимает
|
|
276
280
|
пути из текста команды, а тело документа читает целиком, как только в команде встречается имя
|
|
277
281
|
интерпретатора, — и строка запуска первой строкой записываемого файла возвращает его туда сама.
|
|
@@ -281,18 +285,14 @@ npx agent-kit adopt [файлы] # отдать пакету свой файл,
|
|
|
281
285
|
оболочки остаётся для того, что файлом дерева не станет.
|
|
282
286
|
- **Своё, стоящее рядом с разложенным, повторяет его механику молча.** Проверка, гард и утилита
|
|
283
287
|
дерева лежат в тех же каталогах, что и пакетные, а общий разбор списка известного, корни
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
совпадение текста. Признак один, и он читается, а не ищется: до того как в своей проверке
|
|
288
|
+
исходников и снимок долга приезжают модулем настройки проверок. Второе такое же заводится без
|
|
289
|
+
сигнала: повтора не видит ни сверка раскладки — файл не разложен, — ни проверка повторов,
|
|
290
|
+
которая ищет совпадение текста. Признак один, и он читается: до того как в своей проверке
|
|
288
291
|
заводится разбор списка, чтение настройки или сравнение с накопленным, смотрят, что
|
|
289
|
-
экспортирует модуль настройки
|
|
292
|
+
экспортирует модуль настройки проверок.
|
|
290
293
|
- **Правило, загруженное инструментом, бывает показано не целиком, и обрыв ничем не помечен.**
|
|
291
294
|
Длинный файл приезжает в контекст обрезанным по строке, а снаружи это выглядит концом: показанное
|
|
292
|
-
кончается осмысленным
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
черновиков не держит вовсе. Отсюда порядок: решение о порядке работы принимается только после
|
|
297
|
-
того, как показанные строки сверены с длиной файла — одной командой, — а расходятся они, файл
|
|
298
|
-
дочитывается чтением.
|
|
295
|
+
кончается осмысленным пунктом. Бьёт обрыв ровно по хвосту, а хвост — то место, где дерево
|
|
296
|
+
отменяет умолчания пакета: разделы надстройки сливаются по совпавшему заголовку и новыми уходят
|
|
297
|
+
в конец. Отсюда порядок: решение о порядке работы принимается после того, как показанные строки
|
|
298
|
+
сверены с длиной файла одной командой, а расходятся они — файл дочитывается чтением.
|
package/lib/commands.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/commands.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/commands.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAuB7C,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,2FAA2F;AAC3F,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CAC1B;AA2DD,+DAA+D;AAC/D,eAAO,MAAM,WAAW,EAAE,MAAyB,CAAC;AA0ZpD;;;;GAIG;AACH,wBAAgB,IAAI,CAChB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,SAAS,MAAM,EAAO,EAC5B,QAAQ,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,EAC/C,SAAS,GAAE,MAAW,GACvB,iBAAiB,CAgCnB;AAmKD,wBAAgB,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,GAAG,iBAAiB,CA8DzE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,iBAAiB,CA+CpF;AAQD,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8FAA8F;IAC9F,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CAC1B;AA8JD;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,GAAG,iBAAiB,CA6DlF;AA0BD,wBAAgB,MAAM,CAAC,GAAG,EAAE,YAAY,GAAG,iBAAiB,CAkF3D;AAED;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,YAAY,GAAG,iBAAiB,CA2DzD"}
|