@rt-tools/agent-kit 0.10.0 → 0.12.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/check-file-size.mjs +19 -4
- package/assets/checks/check-state-next.mjs +202 -0
- package/assets/checks/check-states.mjs +142 -0
- package/assets/checks/check-turn-map.mjs +146 -0
- package/assets/checks/rt-kit-checks.config.mjs +16 -2
- package/assets/defaults/project.sh +67 -7
- package/assets/defaults/turn-map.md +48 -0
- package/assets/hooks/browser-device-id.sh +2 -0
- package/assets/hooks/browser-guard-device-id.sh +5 -1
- package/assets/hooks/browser-guard-no-asking.sh +5 -1
- package/assets/hooks/browser-guard-no-listing.sh +2 -0
- package/assets/hooks/browser-guard-no-other-drivers.sh +7 -3
- package/assets/hooks/browser-guard-require-select.sh +6 -2
- package/assets/hooks/claim-guard.sh +5 -1
- package/assets/hooks/commit-msg.sh +2 -0
- package/assets/hooks/conscience-guard.sh +5 -1
- package/assets/hooks/constitution-index.sh +2 -0
- package/assets/hooks/dev-server-guard.sh +7 -3
- package/assets/hooks/dispatch.sh +69 -0
- package/assets/hooks/docs-guard.sh +8 -4
- package/assets/hooks/exam-guard.sh +7 -3
- package/assets/hooks/git-guard-delivery-signature.sh +2 -0
- package/assets/hooks/git-guard-delivery.sh +39 -5
- package/assets/hooks/git-guard-main.sh +8 -4
- package/assets/hooks/git-guard-push-tests.sh +8 -4
- package/assets/hooks/glossary-load.sh +2 -0
- package/assets/hooks/grill-gate.sh +6 -2
- package/assets/hooks/handoff-entry-guard.sh +6 -2
- package/assets/hooks/handoff-write.sh +124 -0
- package/assets/hooks/hook-input.sh +54 -0
- package/assets/hooks/lint-after-edit.sh +7 -3
- package/assets/hooks/observe.sh +2 -0
- package/assets/hooks/postmortem-guard.sh +5 -1
- package/assets/hooks/proposal-guard.sh +5 -1
- package/assets/hooks/prose-style-guard.sh +7 -3
- package/assets/hooks/qa-dataid-guard.sh +6 -2
- package/assets/hooks/rerun-guard.sh +7 -3
- package/assets/hooks/reuse-first-guard.sh +7 -3
- package/assets/hooks/roles.sh +2 -0
- package/assets/hooks/rule-article.sh +99 -0
- package/assets/hooks/skill-gate-layers.sh +2 -0
- package/assets/hooks/skill-gate-rearm.sh +5 -1
- package/assets/hooks/skill-gate.sh +25 -2
- package/assets/hooks/skill-loaded.sh +5 -1
- package/assets/hooks/sql-guard-parse.sh +2 -0
- package/assets/hooks/sql-guard-request.sh +4 -1
- package/assets/hooks/sql-guard-target.sh +2 -0
- package/assets/hooks/sql-guard-write.sh +2 -0
- package/assets/hooks/sql-guard.sh +6 -2
- package/assets/hooks/task-context-load.sh +2 -0
- package/assets/hooks/task-flow-guard.sh +8 -4
- package/assets/hooks/turn-entry-load.sh +62 -0
- package/assets/hooks/turn-exit-guard.sh +44 -17
- package/assets/hooks/utf8.sh +35 -0
- package/assets/hooks/waiting-turn-guard.sh +5 -1
- package/assets/hooks/window-fill-guard.sh +37 -5
- package/assets/laws/work-conduct.md +34 -9
- package/assets/patterns/dependencies-upgrade.md +1 -1
- package/assets/patterns/doc-style-write.md +3 -3
- package/assets/patterns/git-workflow-commit.azure.md +2 -202
- package/assets/patterns/git-workflow-commit.github.md +2 -258
- package/assets/patterns/git-workflow-commit.gitlab.md +1 -217
- package/assets/patterns/git-workflow-docker.md +3 -3
- package/assets/patterns/git-workflow-merge.md +3 -2
- package/assets/patterns/git-workflow-migration.md +3 -3
- package/assets/patterns/git-workflow-pr.azure.md +224 -0
- package/assets/patterns/git-workflow-pr.github.md +280 -0
- package/assets/patterns/git-workflow-pr.gitlab.md +240 -0
- package/assets/patterns/git-workflow-restart.md +3 -3
- package/assets/patterns/git-workflow-secrets.md +3 -3
- package/assets/patterns/task-flow-archive.md +193 -0
- package/assets/patterns/task-flow-close.md +11 -160
- package/assets/patterns/task-flow-handoff.md +22 -4
- package/assets/patterns/task-flow-resume.md +6 -0
- package/assets/patterns/task-flow-start.md +41 -0
- package/assets/patterns/turn-entry-map.md +81 -0
- package/assets/pitfalls/doc-style.md +80 -0
- package/assets/pitfalls/git-workflow.azure.md +50 -0
- package/assets/pitfalls/git-workflow.github.md +78 -0
- package/assets/pitfalls/git-workflow.gitlab.md +49 -0
- package/assets/pitfalls/spec-driven.md +36 -0
- package/assets/pitfalls/styling-bem.md +45 -0
- package/assets/pitfalls/task-flow.md +62 -0
- package/assets/pitfalls/testing.md +70 -0
- package/assets/rules/deploy-flow.azure.md +106 -0
- package/assets/rules/deploy-flow.github.md +113 -0
- package/assets/rules/deploy-flow.gitlab.md +108 -0
- package/assets/rules/doc-style.md +25 -76
- package/assets/rules/git-workflow.azure.md +6 -92
- package/assets/rules/git-workflow.github.md +14 -127
- package/assets/rules/git-workflow.gitlab.md +6 -93
- package/assets/rules/spec-driven.md +39 -30
- package/assets/rules/styling-bem.md +20 -39
- package/assets/rules/task-flow.md +17 -186
- package/assets/rules/testing.md +3 -64
- package/assets/rules/turn-conduct.md +206 -0
- package/assets/rules/turn-entry.md +93 -0
- package/assets/rules/typescript-conventions.md +15 -0
- package/assets/skills/agent-kit.md +35 -12
- package/assets/templates/pitfalls.md +10 -0
- package/assets/templates/rule.md +5 -3
- package/lib/assets.d.ts.map +1 -1
- package/lib/assets.js +6 -1
- package/lib/assets.js.map +1 -1
- package/lib/cargo.d.ts +42 -0
- package/lib/cargo.d.ts.map +1 -1
- package/lib/cargo.js +2 -0
- package/lib/cargo.js.map +1 -1
- package/lib/cascade.d.ts.map +1 -1
- package/lib/cascade.js +19 -1
- package/lib/cascade.js.map +1 -1
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +65 -4
- package/lib/commands.js.map +1 -1
- package/lib/config.d.ts +16 -1
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +8 -0
- package/lib/config.js.map +1 -1
- package/lib/hooks-map.d.ts +13 -0
- package/lib/hooks-map.d.ts.map +1 -1
- package/lib/hooks-map.js +33 -1
- package/lib/hooks-map.js.map +1 -1
- package/lib/observations.d.ts +35 -1
- package/lib/observations.d.ts.map +1 -1
- package/lib/observations.js +14 -2
- package/lib/observations.js.map +1 -1
- package/lib/ship.d.ts +2 -0
- package/lib/ship.d.ts.map +1 -1
- package/lib/ship.js +2 -0
- package/lib/ship.js.map +1 -1
- package/lib/thresholds.d.ts +49 -0
- package/lib/thresholds.d.ts.map +1 -0
- package/lib/thresholds.js +151 -0
- package/lib/thresholds.js.map +1 -0
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.12.0.tgz +0 -0
- package/assets/commands/agent-kit-digest.md +0 -88
- package/assets/commands/rules-review.md +0 -98
- package/rt-tools-agent-kit-0.10.0.tgz +0 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: turn-conduct
|
|
3
|
+
kind: rule
|
|
4
|
+
law: work-conduct
|
|
5
|
+
description: Правило под «Закон о ведении работы» — та его часть, что про один ход. Брать, когда ход заканчивают: чем он кончается и что его концом не бывает, что говорится владельцу о чужом шаге, чем подтверждается утверждение о дереве, что делает страж выходов хода, гард ожидания, гард разговора и гард происшествия, как закрывается заход по заполнению окна. Готовый порядок — в паттерне task-flow-handoff. Ход работы от просьбы владельца до слияния — правило task-flow.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Ход захода — как это устроено здесь
|
|
9
|
+
|
|
10
|
+
Правило под закон `docs/constitution/work-conduct.md` — та его часть, что про один ход.
|
|
11
|
+
Закон говорит, что должно быть верно; здесь — чем это стережётся в этом дереве. Ход работы
|
|
12
|
+
от просьбы владельца до слияния, состояния работы и папка задачи — правило `task-flow`
|
|
13
|
+
под тем же законом.
|
|
14
|
+
|
|
15
|
+
## Как это называется здесь
|
|
16
|
+
|
|
17
|
+
| В законе | Здесь |
|
|
18
|
+
| -------------------------------- | ----------------------------------------------------------------------------------------------- |
|
|
19
|
+
| ход | один заход агента: от реплики владельца до ответа ему |
|
|
20
|
+
| выход хода | один из четырёх способов кончить ход; чем подтверждается каждый — карта хода |
|
|
21
|
+
| страж выходов хода | гард на завершении хода: читает объявленное состояние работы и то, что за ход сделано в дереве |
|
|
22
|
+
| утверждение о состоянии дерева | слово ответа владельцу, за которым обязана стоять команда того же хода и её вывод |
|
|
23
|
+
| передача захода | запись вне дерева: она пересказывает ход работы для вставки в новый заход |
|
|
24
|
+
| порог сжатия и порог остановки | два числа заполнения окна; дерево задаёт их само, и первый стоит ниже второго |
|
|
25
|
+
|
|
26
|
+
## Выходы хода
|
|
27
|
+
|
|
28
|
+
Ход кончается четырьмя способами, и других нет: вопрос владельцу, ответа на который в правилах
|
|
29
|
+
нет; отказ гарда; заполненное окно там, где сжатия нет; отданная работа, за которой начата
|
|
30
|
+
следующая. Чем подтверждается каждый из четырёх, перечисляет карта хода — там, где дерево её
|
|
31
|
+
разложило.
|
|
32
|
+
|
|
33
|
+
Всё остальное — продолжение хода, а не его конец. Веха ходом не кончается: ни коммит, ни
|
|
34
|
+
прочитанная договорённость, ни граница «прочитал — сейчас правлю», ни зелёная проверка.
|
|
35
|
+
Переход из состояния в состояние — тем более: обязательное действие сделано, и следующее
|
|
36
|
+
делается тем же ходом, а граница состояния выглядит законченным куском лучше всякой другой вехи,
|
|
37
|
+
и отчёт встаёт ровно туда, где должно было стоять следующее действие.
|
|
38
|
+
|
|
39
|
+
Четыре способа кончить ход выглядят работой и ею не являются: сводка о чужом шаге, меню при
|
|
40
|
+
назначенном порядке, объявление намерения и названная, но не запущенная команда. Что при этом
|
|
41
|
+
должно быть верно — ниже, в статьях о применении закона.
|
|
42
|
+
|
|
43
|
+
## Где это лежит
|
|
44
|
+
|
|
45
|
+
В этом дереве — таблица в `implementation.md` рядом. Пути живут там, а не здесь: правило
|
|
46
|
+
переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
|
|
47
|
+
же дереве, которое держит код иначе.
|
|
48
|
+
|
|
49
|
+
## Ход
|
|
50
|
+
|
|
51
|
+
Ход одного захода: чем он кончается, что проверяется до его конца и что при этом говорится
|
|
52
|
+
владельцу.
|
|
53
|
+
|
|
54
|
+
```mermaid
|
|
55
|
+
flowchart TD
|
|
56
|
+
A[Ход идёт] --> B{Что случилось}
|
|
57
|
+
B -->|Владельцу задан вопрос| C[За тот же ход читались законы и правила]
|
|
58
|
+
B -->|Гард отбил правку| D[Отказ назван владельцу, обход не искался]
|
|
59
|
+
B -->|Окно захода заполнено| E{Дерево объявило сжатие}
|
|
60
|
+
B -->|Работа отдана заявкой| F[По следующей задаче сделано действие, а не сказано]
|
|
61
|
+
B -->|Ничего из этого| G[Ход продолжается: веха его концом не бывает]
|
|
62
|
+
E -->|Да| G
|
|
63
|
+
E -->|Нет| H[Ход работы дописан, передача написана]
|
|
64
|
+
C --> I{Ответ владельцу говорит о дереве}
|
|
65
|
+
D --> I
|
|
66
|
+
F --> I
|
|
67
|
+
H --> I
|
|
68
|
+
I -->|Да| J[Каждое слово несёт команду того же хода и её вывод]
|
|
69
|
+
I -->|Нет| K[Ход кончен]
|
|
70
|
+
J --> K
|
|
71
|
+
G --> A
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Как закон применяется здесь
|
|
75
|
+
|
|
76
|
+
- **Сводка о чужом шаге.** Прогон, разбор владельцем и слияние идут без исполнителя и от взгляда
|
|
77
|
+
быстрее не становятся. Ход, кончившийся такой сводкой, владелец читает как работу: она полна,
|
|
78
|
+
в ней названы номера и состояния, и пустоты за ней не видно. О чужом шаге говорят вместе с
|
|
79
|
+
начатым своим, а не вместо него. За один заход это было нарушено четырежды, и готовая работа
|
|
80
|
+
простояла в невлитом PR почти три часа.
|
|
81
|
+
- **Меню при назначенном порядке.** Выбор, предложенный владельцу, пока эпик не кончился, — это
|
|
82
|
+
просьба назначить порядок заново. Работы в эпике не осталось — так и говорится: эпик
|
|
83
|
+
кончился, — а не «чем займёмся».
|
|
84
|
+
- **Объявление намерения.** «Беру следующую задачу» — не то же самое, что взять её: фраза живёт
|
|
85
|
+
до конца хода, а работа не двигается. Названо может быть только сделанное: номер заведённой
|
|
86
|
+
задачи, имя заведённой ветки, переведённая колонка.
|
|
87
|
+
- **Названная командой работа запускается в том же ходе, где названа.** Строка «сейчас запущу»
|
|
88
|
+
ходом не кончается: либо запуск уже был, либо ход не кончен. Названная поимённо команда
|
|
89
|
+
выглядит начатой работой лучше всякого другого обещания — она точна, её видно, и по ней не
|
|
90
|
+
отличить сделанного от собранного. Ответ владельцу пишется после вызова, а не вместо него:
|
|
91
|
+
реплика посреди хода отвечается вместе с начатым действием. Дважды за сутки ход кончился
|
|
92
|
+
ровно такой строкой, и оба раза владелец возвращал работу сам.
|
|
93
|
+
|
|
94
|
+
- **Прерывание работы владельцем называется вслух.** Пришло задание, останавливающее начатое, —
|
|
95
|
+
исполнитель говорит, что стоит, на чём остановлено и что будет с прежней работой, и только
|
|
96
|
+
потом берётся за новое. Молчание об этом владелец читает как «прежнее кончилось».
|
|
97
|
+
- **Остановка называется отдельной репликой.** Не строкой в конце отчёта: там она тонет —
|
|
98
|
+
владелец читает отчёт как рассказ о сделанном. Называются три вещи: что стоит, чего оно ждёт
|
|
99
|
+
и что владелец может решить.
|
|
100
|
+
- **Выходы хода стережёт страж, а не память исполнителя.** Он читает объявленное состояние
|
|
101
|
+
работы и то, что за ход по ней сделано: правку файла или команду, меняющую дерево. Ход, в
|
|
102
|
+
котором не было ни того ни другого, возвращается исполнителю вместе со следующим шагом из
|
|
103
|
+
хода работы. Отданную и влитую работу страж не судит: она уже дождалась чужого шага.
|
|
104
|
+
- **Работа без ветки и без папки задачи судится тем же стражем по второму признаку.** Состояния
|
|
105
|
+
у неё нет, и первый признак взять неоткуда, — но ход, в котором не было ни одной правки
|
|
106
|
+
дерева, не кончается и здесь. Раньше страж отпускал такую работу молча, и защищена она была
|
|
107
|
+
меньше всего: просьба владельца «разложи», «обнови», «посмотри» идёт без задачи и без ветки,
|
|
108
|
+
и именно она чаще всего кончалась объявлением намерения.
|
|
109
|
+
- **Передача пишется и там, где имени у ветки нет.** Всё, что в неё едет, лежит в дереве и на
|
|
110
|
+
отсоединённой голове доступно целиком; имя нужно одному файлу, и он называется коротким
|
|
111
|
+
снимком головы. Молчание хука здесь стоит дороже прочего: сжатие приходит без передачи, и
|
|
112
|
+
следующий заход начинает с пустого места.
|
|
113
|
+
- **Этап замысла объявляется закрытым только после того, как его команда проверки прошла.**
|
|
114
|
+
Строка «Чем проверяется» несёт команду обратными кавычками и то, что в её выводе означает
|
|
115
|
+
«сошлось». Страж читает прежний номер этапа из истории ветки и не выпускает ход, в котором
|
|
116
|
+
номер вырос, а команда не запускалась: через заход отмеченное по памяти неотличимо от
|
|
117
|
+
проверенного.
|
|
118
|
+
- **Слово об остановке страж читает у владельца, а не у исполнителя.** Иначе остановку
|
|
119
|
+
объявляет тот, кому она в эту минуту удобна, и запрет держится ровно до первого неудобства.
|
|
120
|
+
- **Утверждение о состоянии дерева стережёт гард утверждения, а не память исполнителя.** Всё,
|
|
121
|
+
что ответ владельцу говорит о дереве, несёт команду и её вывод: сказанное без команды
|
|
122
|
+
утверждением не считается — ни «проверено», ни «снято», ни «готово». Гард читает текст,
|
|
123
|
+
сказанный владельцу за ход, и ищет команду того же хода; у каждого слова назван свой род
|
|
124
|
+
команды, потому что общий признак «команда была» подтверждал бы одно другим. Прошлый ход не
|
|
125
|
+
годится: состояние дерева меняется, и вчерашний вывод о нынешнем молчит. Восемь разборов
|
|
126
|
+
подряд пришлись на этот промах, и каждый раз в правило дописывалась ещё одна статья —
|
|
127
|
+
держит его теперь машина.
|
|
128
|
+
- **Слово-утверждение гард ловит, неверный вывод — нет.** Об образце, судимом по одному его
|
|
129
|
+
файлу, и о пути, которым человек не пойдёт, судить нечем: там нет ни слова, ни команды, с
|
|
130
|
+
которой сверять. Это известная граница гарда, и держат её статьи ниже, а не он.
|
|
131
|
+
- **Ход о чужом шаге стережёт гард ожидания, а не память исполнителя.** Он отбивает завершение
|
|
132
|
+
хода, в котором о чужом шаге сказано, а по следующей задаче не сделано ни одного действия —
|
|
133
|
+
ни заведения задачи, ни ветки, ни папки, ни перевода колонки. Чужой шаг он узнаёт по двум
|
|
134
|
+
признакам: в ходе открыт PR либо в ходе прочитан красный прогон. Оба берутся из самого хода:
|
|
135
|
+
спросить хостинг было бы точнее, но сетевой вызов на завершении хода падает вместе со связью
|
|
136
|
+
и отбивал бы работу вместо промаха, а вывод команды о прогоне в записи хода уже лежит. Слова
|
|
137
|
+
«беру следующую задачу» гард действием не считает — ровно потому, что их и произносят вместо
|
|
138
|
+
неё.
|
|
139
|
+
- **Конец прогона узнаётся возвратом фоновой команды, а не взглядом на страницу.** Ожидание,
|
|
140
|
+
запущенное в фоне отдельным ходом, возвращает исполнителя к PR само; до тех пор ход занят
|
|
141
|
+
следующей задачей. Взгляд на страницу этого не даёт: он либо повторяется вхолостую, либо не
|
|
142
|
+
повторяется вовсе, и оба исхода со стороны выглядят одинаково — работа не двигается.
|
|
143
|
+
- **Отказ гарда кончает ход.** Другого пути к отбитой правке не ищут: ни командой оболочки, ни
|
|
144
|
+
соседним инструментом, ни правкой самого гарда. Отбитая правка либо делается после того, как
|
|
145
|
+
условие отказа выполнено, либо не делается вовсе — и тогда владельцу называется отказ, а не
|
|
146
|
+
результат. Обход стоит дороже отказа: гард отбивает один файл, а обойдённый гард снимает
|
|
147
|
+
требование со всего дерева и молчит об этом. Держится это не только памятью — гарды судят и
|
|
148
|
+
команду оболочки, которая пишет файл.
|
|
149
|
+
- **Ход, в котором владельцу задан вопрос, не заканчивается, пока за этот же ход не читались
|
|
150
|
+
законы и правила.** Чтением считается любой из трёх путей: загрузка правила, чтение файла
|
|
151
|
+
законов или правил, поиск по ним. Отбивает гард разговора — на завершении хода, а не на
|
|
152
|
+
инструменте вопроса: спрашивают чаще прозой, чем меню. Найденное ложится в раздел «Что уже
|
|
153
|
+
сказано в правилах» разбора.
|
|
154
|
+
- **Действия, которые исполнитель не делает без слова владельца, перечислены в компаньоне
|
|
155
|
+
правила.** Список у каждого дерева свой — пакет знает только требование, чтобы список был
|
|
156
|
+
назван. Не названный, он выводится из общих слов, и «делай, что нужно по плану» становится
|
|
157
|
+
разрешением на пуш и правку общих документов заодно с коммитом. Оценка «это безопасно» списка
|
|
158
|
+
не заменяет: её назначает тот, кому она в эту минуту удобна, и она плывёт. За один заход одна
|
|
159
|
+
и та же команда была сначала слишком опасной, чтобы её позвать, а через два хода —
|
|
160
|
+
достаточно безопасной, чтобы позвать без спроса.
|
|
161
|
+
- **У отказа от необратимого действия есть безопасная часть, и она делается.** Требование
|
|
162
|
+
спросить владельца относится к действию, а не к ходу: работа, у которой отделима часть без
|
|
163
|
+
последствий, делится, а не откладывается целиком. Список вариантов, поданный вместо работы,
|
|
164
|
+
читается как работа — тем полнее, чем аккуратнее он составлен: он пронумерован, в нём названы
|
|
165
|
+
цифры, и именно поэтому пустота хода за ним не видна. Владельцу называется, что уже сделано и
|
|
166
|
+
что осталось за его словом, — а не выбор из вариантов вместо и того и другого.
|
|
167
|
+
- **Ход, в котором исполнитель признал промах, не заканчивается, пока записи о происшествии
|
|
168
|
+
нет.** Отбивает гард происшествия — на завершении хода: к моменту признания промах уже
|
|
169
|
+
случился, и ловить раньше нечего. Признание ловится набором образцов, а не пониманием смысла;
|
|
170
|
+
промах, признанный словами вне набора, гард пропускает, и это его известная граница, а не
|
|
171
|
+
обещание.
|
|
172
|
+
- **Заход, начатый с передачи, входит в работу тем же правилом, что и всякий другой.** Передача
|
|
173
|
+
лежит вне дерева, её не читает ни одна проверка, и написана она вчера: всё, что в ней стоит,
|
|
174
|
+
проверяется деревом. Порядок входа — четыре шага в паттерне возвращения; стережёт его гард, а
|
|
175
|
+
не память: порядок, записанный только словами, исполняется, пока о нём помнят.
|
|
176
|
+
- **Состояние незаконченной работы приходит в контекст на запуске сессии.** Замысел и ход
|
|
177
|
+
работы отдаются целиком, разбор просьбы — путём. Ветка вида `<КЛЮЧ>-*` без папки даёт
|
|
178
|
+
предупреждение с готовой командой, но сессию не рвёт.
|
|
179
|
+
- **Заполненное окно кончает ход только там, где сжатия нет.** Где оно объявлено, окно —
|
|
180
|
+
продолжение хода: заход сжимается и работает дальше, а порог остановки срабатывает лишь тогда,
|
|
181
|
+
когда сжатие не пришло.
|
|
182
|
+
- **Заполнение окна захода стережёт гард, а не память исполнителя.** На первом пороге он
|
|
183
|
+
напоминает выбирать точку остановки, на втором отбивает всё, кроме записи хода работы,
|
|
184
|
+
передачи и команд поставки. Размер окна и оба порога дерево задаёт само; не задавшее размера
|
|
185
|
+
стража не получает.
|
|
186
|
+
- **Порог сжатия контекста дерево задаёт само, и стоит он НИЖЕ порога остановки.** Совпавшие
|
|
187
|
+
пороги согласием не бывают: это гонка, и выигрывает её страж — он стоит на вызове, а сжатие
|
|
188
|
+
приходит между ходами. Расстояние объявляется числом, а не выводится разницей; сведены пороги
|
|
189
|
+
или нет, говорит разбор состояния раскладки.
|
|
190
|
+
- **Заход закрывается передачей, которая лежит вне дерева.** Состояние работы коммитится ходом
|
|
191
|
+
работы, а передача его пересказывает для вставки в новый заход: рабочее дерево, ветка,
|
|
192
|
+
сделанное, следующий шаг и особенности захода. В историю она не едет — иначе рядом с ходом
|
|
193
|
+
работы заводится вторая запись об одном и том же.
|
|
194
|
+
|
|
195
|
+
## Чего из закона здесь нет
|
|
196
|
+
|
|
197
|
+
Полноту сказанного владельцу не проверяет ничто: гард утверждения ловит слово-утверждение и
|
|
198
|
+
ищет команду того же хода, а неверный вывод из верной команды не судит ничем — об образце,
|
|
199
|
+
судимом по одному его файлу, и о пути, которым человек не пойдёт, сверять нечего.
|
|
200
|
+
|
|
201
|
+
Признание промаха ловится набором образцов, а не пониманием смысла: промах, признанный
|
|
202
|
+
словами вне набора, гард происшествия пропускает. Это его известная граница, а не обещание.
|
|
203
|
+
|
|
204
|
+
## Паттерны
|
|
205
|
+
|
|
206
|
+
- `task-flow-handoff` — закрытие захода по заполнению окна: точка остановки и передача.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: turn-entry
|
|
3
|
+
kind: rule
|
|
4
|
+
law: work-conduct
|
|
5
|
+
description: Правило под «Закон о ведении работы». Брать при правке хука входа в заход, текста карты хода и проверки над ней, а также когда решается, что заход получает в контекст до первой реплики. Называет передачу прошлого захода, карту хода, четыре запуска и отказ в пользу работы. Не брать для самого хода работы — это правило task-flow.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Вход в заход — как это устроено здесь
|
|
9
|
+
|
|
10
|
+
Правило под закон `docs/constitution/work-conduct.md`. Закон говорит, что переданное прошлым
|
|
11
|
+
заходом приходит в новый заход само и что порядок ведения работы приходит вместе с работой;
|
|
12
|
+
здесь — чем это сделано в этом дереве. Сам ход работы — правило `task-flow` под тем же законом:
|
|
13
|
+
там про состояния и их обязательные действия, здесь — про то, как они попадают в заход.
|
|
14
|
+
|
|
15
|
+
## Как это называется здесь
|
|
16
|
+
|
|
17
|
+
| В законе | Здесь |
|
|
18
|
+
| -------------------------- | ----------------------------------------------------------------------------- |
|
|
19
|
+
| вход в заход | то, что хук старта кладёт в контекст до первой реплики |
|
|
20
|
+
| переданное прошлым заходом | файл по имени ветки в каталоге передач; пишет его хук перед сжатием контекста |
|
|
21
|
+
| порядок ведения работы | карта хода — состояния с обязательными действиями и четыре выхода хода |
|
|
22
|
+
| запуск | первый запуск, возобновление, сжатие контекста, очистка |
|
|
23
|
+
|
|
24
|
+
## Где это лежит
|
|
25
|
+
|
|
26
|
+
В этом дереве — таблица в `implementation.md` рядом. Пути живут там, а не здесь: правило
|
|
27
|
+
переносится между репозиториями, раскладка — нет.
|
|
28
|
+
|
|
29
|
+
## Ход
|
|
30
|
+
|
|
31
|
+
Ход подачи: что кладётся в контекст, в каком порядке и что делается с недостающим.
|
|
32
|
+
|
|
33
|
+
```mermaid
|
|
34
|
+
flowchart TD
|
|
35
|
+
A[Запуск захода] --> B{Есть передача по имени текущей ветки}
|
|
36
|
+
B -->|Да| C[Передача кладётся в контекст целиком]
|
|
37
|
+
B -->|Нет| D[О передаче не говорится ничего]
|
|
38
|
+
C --> E{Разложен ресурс карты хода}
|
|
39
|
+
D --> E
|
|
40
|
+
E -->|Да| F[Карта кладётся следом: состояния, действия, четыре выхода]
|
|
41
|
+
E -->|Нет| G[О карте не говорится ничего]
|
|
42
|
+
F --> H[Хук выходит нулём: запуск не отбивается ни при каком исходе]
|
|
43
|
+
G --> H
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Как закон применяется здесь
|
|
47
|
+
|
|
48
|
+
- **Передача прошлого захода приходит в контекст тем же запуском, что и состояние работы.**
|
|
49
|
+
Написанная и не прочитанная, она равна ненаписанной: следующий заход о ней не знает и
|
|
50
|
+
начинает с пустого места — с того самого, ради чего её и писали.
|
|
51
|
+
- **Передача берётся по имени текущей ветки.** Передач в каталоге столько, сколько было веток;
|
|
52
|
+
чужая, поданная как своя, описывает работу, которой в этом дереве нет.
|
|
53
|
+
- **Передачи нет — вход об этом молчит.** Ветка, по которой заход ещё не закрывался, это
|
|
54
|
+
обычное начало работы, а не поломка: отказ на ней превращал бы каждый первый заход в разбор
|
|
55
|
+
хука.
|
|
56
|
+
- **Карта хода приходит тем же запуском и лежит своим файлом, а не вынимается из правила.**
|
|
57
|
+
Разобранная на месте из таблицы правила, она ломается молча при первой правке разметки;
|
|
58
|
+
зашитая в хук — расходится с правилом без единой правки.
|
|
59
|
+
- **Карта короче правила, и предел ей назначает проверка дерева.** Этим она и полезна:
|
|
60
|
+
выросшая до правила, она съедает то самое окно, ради которого её кладут в контекст, — и
|
|
61
|
+
заметить это нечем, потому что она продолжает приходить и продолжает быть верной.
|
|
62
|
+
- **Состояние, объявленное правилом и забытое в карте, — расхождение.** Заход получает карту,
|
|
63
|
+
не находит в ней своего состояния и идёт читать правило: карта работает ровно до первого
|
|
64
|
+
нового состояния.
|
|
65
|
+
- **Вход подаётся на всех четырёх запусках, а не только после сжатия.** Заход после обрыва и
|
|
66
|
+
заход после очистки начинают с того же пустого места, и разница между ними исполнителю не
|
|
67
|
+
видна вовсе.
|
|
68
|
+
- **Хук входа запуск не отбивает.** Отказ любой его части — нечитаемый файл, отсутствующий
|
|
69
|
+
ресурс, чужие права — оставляет заход без части входа, но не без захода.
|
|
70
|
+
|
|
71
|
+
## Чего из закона здесь нет
|
|
72
|
+
|
|
73
|
+
Полноту самой передачи не проверяет ничто: хук подаёт то, что лежит, и о том, дописал ли
|
|
74
|
+
исполнитель к черновику своё, судить машине нечем. Держится это паттерном закрытия захода.
|
|
75
|
+
|
|
76
|
+
Не проверяется и то, прочитал ли заход поданное. Вход кладётся в контекст, а что с ним делают
|
|
77
|
+
дальше — свойство хода, а не файла.
|
|
78
|
+
|
|
79
|
+
## Паттерны
|
|
80
|
+
|
|
81
|
+
- `turn-entry-map` — что входит в карту, порядок подачи и живая проба хука.
|
|
82
|
+
- `task-flow-handoff` — закрытие захода: точка остановки и форма передачи; паттерн соседнего
|
|
83
|
+
правила, но читается в паре с этим.
|
|
84
|
+
|
|
85
|
+
## Ловушки
|
|
86
|
+
|
|
87
|
+
- **Хук, подающий пустоту, неотличим от работающего.** Вход, у которого нет ни передачи, ни
|
|
88
|
+
карты, печатает ноль байт и возвращает ноль — ровно так же выглядит хук, который не запустился
|
|
89
|
+
вовсе. Проверяется это не глазами по контексту, а вызовом хука руками на дереве, где обе части
|
|
90
|
+
лежат.
|
|
91
|
+
- **Передача пишется для машины, а не для владельца.** Обращение в ней — «спроси у него, чем
|
|
92
|
+
кончилась проба» — уходит в пустоту: к минуте, когда передачу читают, владельца в разговоре
|
|
93
|
+
ещё нет.
|
|
@@ -50,15 +50,23 @@ flowchart TD
|
|
|
50
50
|
|
|
51
51
|
- **Род объявления виден по префиксу имени, и это держат три правила линтера.** У интерфейса,
|
|
52
52
|
у типа и у перечисления свои; все три подняты для всех `.ts`.
|
|
53
|
+
<!-- rt-when: *.ts -->
|
|
54
|
+
|
|
53
55
|
- **Источник, за которым следят, назван суффиксом.** Субъект и наблюдаемое, поднятое из него,
|
|
54
56
|
различаются в месте использования, а не переходом к объявлению.
|
|
57
|
+
<!-- rt-when: *.ts -->
|
|
58
|
+
|
|
55
59
|
- **Суффикс имени файла находит в нём обещанное объявление.** Список суффиксов закрыт: слово,
|
|
56
60
|
которого в нём нет, суффиксом не считается, и такой файл правило не судит.
|
|
61
|
+
<!-- rt-when: *.ts -->
|
|
62
|
+
|
|
57
63
|
- **Файл не длиннее 500 строк, и считаются все строки — пустые и комментарии тоже.** Файл,
|
|
58
64
|
который не влезает на экран целиком, читают по частям, и правку в нём делают, не увидев
|
|
59
65
|
остального. Для `.ts` это держит правило линтера; файлы обвязки — сценарии и скрипты — до
|
|
60
66
|
него не доходят и судятся отдельной проверкой дерева. Накопленное к дню включения
|
|
61
67
|
перечислено поимённо, и строка оттуда снимается вместе с делением своего файла.
|
|
68
|
+
<!-- rt-when: *.ts -->
|
|
69
|
+
|
|
62
70
|
- **Значение из закрытого набора приходит перечислением `E<Имя>`, а не строкой или числом в
|
|
63
71
|
месте использования.** Ключ переводимого поля, имя вкладки, слот обложки, вид записи — всё
|
|
64
72
|
это наборы: их называют форма, стор, разметка и сравнение черновиков, и написанное на месте
|
|
@@ -66,14 +74,21 @@ flowchart TD
|
|
|
66
74
|
домена, чей это набор, а общее нескольким приложениям — в общей либе. Одиночный адрес,
|
|
67
75
|
разделитель и знак-подпись перечислением не становятся: закрытого набора у них нет, и они
|
|
68
76
|
объявляются константой файла с говорящим именем.
|
|
77
|
+
<!-- rt-when: *.ts -->
|
|
78
|
+
|
|
69
79
|
- **Тип берётся из того пакета, где объявлен.** Своя копия чужого типа расходится с оригиналом
|
|
70
80
|
молча, а компилируется из них только одна.
|
|
81
|
+
<!-- rt-when: *.ts -->
|
|
82
|
+
|
|
71
83
|
- **Двухступенчатое приведение `as unknown as` запрещено правилом линтера.** Вместо него —
|
|
72
84
|
честный тип, сужение проверкой или чтение поля формой (`Reflect.get`); место, где иначе
|
|
73
85
|
нельзя, помечается точечным отключением с причиной в той же строке.
|
|
86
|
+
<!-- rt-when: *.ts -->
|
|
87
|
+
|
|
74
88
|
- **Отметка об устаревании ставится вместе с обходом потребителей.** Все правила
|
|
75
89
|
`eslint-plugin-sonarjs` подняты до отказа разом, и пометка на типе красит каждое место, где
|
|
76
90
|
его ещё зовут: один `@deprecated` на файл дал семнадцать замечаний в чужих доменах.
|
|
91
|
+
<!-- rt-when: *.ts -->
|
|
77
92
|
|
|
78
93
|
## Чего из закона здесь нет
|
|
79
94
|
|
|
@@ -40,9 +40,9 @@ description: Переносимый слой правил агента — за
|
|
|
40
40
|
|
|
41
41
|
## Порядок
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
Раскладка кладёт всё или ничего: отказ хотя бы по одному файлу не пишет ничего — половина
|
|
44
|
+
разложенного хуже целого. Правится либо надстройка здесь, либо сам ресурс — а это работа того
|
|
45
|
+
дерева, где пакет живёт исходниками, и здесь о ней не сказано ничего.
|
|
46
46
|
|
|
47
47
|
## Команды
|
|
48
48
|
|
|
@@ -56,13 +56,36 @@ npx agent-kit propose # отправить груз в приём: сво
|
|
|
56
56
|
|
|
57
57
|
Строкой запуска слой правил не исчерпывается: часть его команд исполняет агент, а не программа.
|
|
58
58
|
`/feedback` кладёт слово о правилах блоком в файл предложений, `/skill-curator` разбирает
|
|
59
|
-
закрытую задачу, `/next-session` закрывает
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
59
|
+
закрытую задачу, `/next-session` закрывает заход.
|
|
60
|
+
|
|
61
|
+
Команд, которыми правят сам пакет, здесь нет: они зовутся там, где лежат его ресурсы, и вместе
|
|
62
|
+
с ними не едут.
|
|
63
|
+
|
|
64
|
+
## Что пакет везёт, а что остаётся дереву
|
|
65
|
+
|
|
66
|
+
Пакет ставят чужие деревья, и везёт он им только то, что они исполняют. Ресурс, у которого в
|
|
67
|
+
чужом дереве нет предмета или некому его позвать, ресурсом пакета не бывает — он живёт своим
|
|
68
|
+
ресурсом того дерева, где предмет есть.
|
|
69
|
+
|
|
70
|
+
Признак — не оценка, а два вопроса к ресурсу:
|
|
71
|
+
|
|
72
|
+
| Вопрос | «Нет» означает |
|
|
73
|
+
| ----------------------------------------------- | ---------------------------------------------- |
|
|
74
|
+
| Есть ли у потребителя то, о чём ресурс говорит? | предмета нет: заполнить компаньон нечем |
|
|
75
|
+
| Есть ли у потребителя кому его позвать? | исполнителя нет: команда у него не запускается |
|
|
76
|
+
|
|
77
|
+
Ответ «нет» хотя бы на один — ресурс остаётся дереву, которое пакет пишет.
|
|
78
|
+
|
|
79
|
+
**Перечень отменяемого границу не закрывает.** Строка в `skip` говорит «мне этого не надо» и
|
|
80
|
+
снимает раскладку у себя; ресурс при этом остаётся в пакете и продолжает ехать всем остальным.
|
|
81
|
+
Убирается он из самого пакета, а не из своей раскладки.
|
|
82
|
+
|
|
83
|
+
**Своё правило дерева объявляется наравне с пакетным:** та же форма, тот же закон сверху,
|
|
84
|
+
компаньон рядом и своя ветка в карте гейта. Читателю не должно быть видно, чем оно младше.
|
|
85
|
+
|
|
86
|
+
Что при этом должно быть верно, записано договорённостью в том дереве, которое пакет пишет:
|
|
87
|
+
там же живёт и проверка, которая границу держит. Чужому дереву судить ресурсы пакета нечего,
|
|
88
|
+
поэтому проверка сюда не едет.
|
|
66
89
|
|
|
67
90
|
## Обратная связь наверх
|
|
68
91
|
|
|
@@ -104,8 +127,8 @@ npx agent-kit propose # отправить груз в приём: сво
|
|
|
104
127
|
сколько записей легло и сколько уже лежало. Строка «принято 0, уже лежало 3» означает, что
|
|
105
128
|
нового не уехало ничего.
|
|
106
129
|
|
|
107
|
-
|
|
108
|
-
|
|
130
|
+
Разбирают их там, где лежат правимые ресурсы и видно всех потребителей сразу, — а сюда
|
|
131
|
+
приезжает ответ приёма о том, сколько записей легло.
|
|
109
132
|
|
|
110
133
|
**Имя файла предложения в текстах дерева не называется.** Каталог предложений в историю не едет:
|
|
111
134
|
файл лежит на той машине, где его написали, и адрес на него ведёт в пустоту у всех остальных —
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# <О чём правило> — холодная часть
|
|
2
|
+
|
|
3
|
+
Ловушки: грабли, на которые уже наступали. Грузится не вместе с правилом, а по требованию —
|
|
4
|
+
при обычном решении она не нужна, она нужна тому, кто уже наступил.
|
|
5
|
+
|
|
6
|
+
Правило — `<имя-правила>`; статьи, которыми держится закон, стоят там.
|
|
7
|
+
|
|
8
|
+
## Ловушки
|
|
9
|
+
|
|
10
|
+
- **<Грабли, на которые уже наступали.>** <Чем это кончилось.>
|
package/assets/templates/rule.md
CHANGED
|
@@ -11,6 +11,9 @@ description: Правило под закон «<Название закона>
|
|
|
11
11
|
приёмом это делается. Чем это названо в этом дереве и где лежит — `implementation.md` рядом:
|
|
12
12
|
правило переносится между репозиториями, имена — нет.
|
|
13
13
|
|
|
14
|
+
**Холодная часть:** `pitfalls.md` рядом — <ловушки и поведение по разборам, если они у правила
|
|
15
|
+
есть>. Строка стоит только у правила, которое такой файл завело: у остального её нет вовсе.
|
|
16
|
+
|
|
14
17
|
## Как это называется здесь
|
|
15
18
|
|
|
16
19
|
<Таблица «в законе — здесь»: закон говорит без имён, дерево называет свои. Правка, по которой
|
|
@@ -56,6 +59,5 @@ flowchart TD
|
|
|
56
59
|
|
|
57
60
|
- `<имя-правила>-<что>` — <когда брать>.
|
|
58
61
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
- **<Грабли, на которые уже наступали.>** <Чем это кончилось.>
|
|
62
|
+
Ловушек здесь нет: они живут в холодной части — `pitfalls.md` рядом, по образцу холодной
|
|
63
|
+
части. Правило кончается паттернами.
|
package/lib/assets.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/assets.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,eAAe,EAAe,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/assets.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,eAAe,EAAe,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,OAAO,EAA0C,KAAK,EAAE,MAAM,aAAa,CAAC;AAErF,MAAM,WAAW,MAAM;IACnB,kGAAkG;IAClG,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,8FAA8F;IAC9F,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,gFAAgF;IAChF,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAChC;AAUD;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAU9H;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CASnF"}
|
package/lib/assets.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { join } from 'node:path';
|
|
9
9
|
import { chosenEntries } from './cascade.js';
|
|
10
10
|
import { readCatalog } from './catalog.js';
|
|
11
|
-
import { SKILL_FILE, SKILL_KINDS } from './config.js';
|
|
11
|
+
import { PITFALLS_FILE, SKILL_FILE, SKILL_KINDS } from './config.js';
|
|
12
12
|
/** Расширение ресурса вместе с точкой; у файла без расширения — пустая строка. */
|
|
13
13
|
const extensionOf = (id) => {
|
|
14
14
|
const dot = id.lastIndexOf('.');
|
|
@@ -23,6 +23,11 @@ const extensionOf = (id) => {
|
|
|
23
23
|
* дереве нет, а агенту, который правило читает, различать их незачем.
|
|
24
24
|
*/
|
|
25
25
|
export function targetOf(entry, layout) {
|
|
26
|
+
// Холодная часть ложится в каталог своего правила и под своим именем: правило читается как
|
|
27
|
+
// `<имя>/SKILL.md`, а её читают отдельно и по требованию — `<имя>/pitfalls.md`.
|
|
28
|
+
if (entry.kind === 'pitfalls') {
|
|
29
|
+
return join(layout[entry.kind], entry.name, PITFALLS_FILE);
|
|
30
|
+
}
|
|
26
31
|
return SKILL_KINDS.includes(entry.kind)
|
|
27
32
|
? join(layout[entry.kind], entry.name, SKILL_FILE)
|
|
28
33
|
: join(layout[entry.kind], `${entry.name}${extensionOf(entry.id)}`);
|
package/lib/assets.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/assets.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAmB,WAAW,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAW,UAAU,EAAE,WAAW,EAAS,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/assets.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAmB,WAAW,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAW,aAAa,EAAE,UAAU,EAAE,WAAW,EAAS,MAAM,aAAa,CAAC;AAerF,kFAAkF;AAClF,MAAM,WAAW,GAA2B,CAAC,EAAU,EAAU,EAAE;IAC/D,MAAM,GAAG,GAAW,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,KAAK,GAAW,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAE1C,OAAO,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5C,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAoD,EAAE,MAAuC;IAClH,2FAA2F;IAC3F,gFAAgF;IAChF,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;QACnC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC;QAClD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAe,EAAE,SAAiB;IAC5D,OAAO,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAsB,EAAU,EAAE,CAAC,CAAC;QAC1F,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACtC,UAAU,EAAE,KAAK,CAAC,UAAU;KAC/B,CAAC,CAAC,CAAC;AACR,CAAC","sourcesContent":["/**\n * Что из везомого пакетом взял этот проект и куда оно ложится.\n *\n * Полный набор читает `catalog.ts`, здесь из него остаётся выбранное. Разделено потому, что\n * выбирать приходится раньше, чем раскладывать: `init` спрашивает, какие законы взять, а `list`\n * показывает и то, от чего проект отказался, — обоим нужен набор до отбора.\n */\nimport { join } from 'node:path';\n\nimport { chosenEntries } from './cascade.js';\nimport { IEntryOfCatalog, readCatalog } from './catalog.js';\nimport { IConfig, PITFALLS_FILE, SKILL_FILE, SKILL_KINDS, TKind } from './config.js';\n\nexport interface IAsset {\n /** Идентификатор: `laws/application/money.md`. Он же путь надстройки и ключ в `only` и `skip`. */\n readonly id: string;\n readonly kind: TKind;\n /** Имя без рода, вида и расширения: `delivery`. У скила — имя каталога, которым его зовут. */\n readonly name: string;\n readonly text: string;\n /** Путь в дереве проекта, куда ресурс ложится. */\n readonly target: string;\n /** Запускается ли файл сам по себе: гарда без права на запуск не существует. */\n readonly executable: boolean;\n}\n\n/** Расширение ресурса вместе с точкой; у файла без расширения — пустая строка. */\nconst extensionOf: (id: string) => string = (id: string): string => {\n const dot: number = id.lastIndexOf('.');\n const slash: number = id.lastIndexOf('/');\n\n return dot > slash ? id.slice(dot) : '';\n};\n\n/**\n * Куда ложится ресурс. Скил читается агентом как `<имя>/SKILL.md`, и другого имени у него быть\n * не может: файл, названный по ресурсу, агент не найдёт вовсе. Остальные роды ложатся файлом —\n * по имени, а не по идентификатору: слой законов из идентификатора в путь переезжает, а вид\n * ресурса нет. У разложенного `git-workflow` хостинга в имени не остаётся: второго вида в этом\n * дереве нет, а агенту, который правило читает, различать их незачем.\n */\nexport function targetOf(entry: Pick<IEntryOfCatalog, 'id' | 'kind' | 'name'>, layout: Readonly<Record<TKind, string>>): string {\n // Холодная часть ложится в каталог своего правила и под своим именем: правило читается как\n // `<имя>/SKILL.md`, а её читают отдельно и по требованию — `<имя>/pitfalls.md`.\n if (entry.kind === 'pitfalls') {\n return join(layout[entry.kind], entry.name, PITFALLS_FILE);\n }\n\n return SKILL_KINDS.includes(entry.kind)\n ? join(layout[entry.kind], entry.name, SKILL_FILE)\n : join(layout[entry.kind], `${entry.name}${extensionOf(entry.id)}`);\n}\n\nexport function collectAssets(config: IConfig, assetsDir: string): readonly IAsset[] {\n return chosenEntries(readCatalog(assetsDir), config).map((entry: IEntryOfCatalog): IAsset => ({\n id: entry.id,\n kind: entry.kind,\n name: entry.name,\n text: entry.text,\n target: targetOf(entry, config.layout),\n executable: entry.executable,\n }));\n}\n"]}
|
package/lib/cargo.d.ts
CHANGED
|
@@ -105,4 +105,46 @@ export interface IIntakeAccepted {
|
|
|
105
105
|
readonly added?: number;
|
|
106
106
|
readonly known?: number;
|
|
107
107
|
}
|
|
108
|
+
/** Род записи груза, у которой есть состояние. Набор закрыт: сводка месяца состояния не несёт. */
|
|
109
|
+
export type TCargoStateKind = 'postmortem' | 'proposal';
|
|
110
|
+
/** Состояния записи груза по порядку: шаг идёт вперёд на соседнее, назад — только из «в работе». */
|
|
111
|
+
export declare const CARGO_STATES: readonly string[];
|
|
112
|
+
/** Одна строка правки состояния: род записи, ключ и состояние, в которое её переводят. */
|
|
113
|
+
export interface ICargoStateItem {
|
|
114
|
+
readonly kind: TCargoStateKind;
|
|
115
|
+
/** Ключ записи: имя файла у разбора происшествия, признак текста у предложения. */
|
|
116
|
+
readonly key: string;
|
|
117
|
+
readonly state: string;
|
|
118
|
+
/**
|
|
119
|
+
* Чем недочёт исправлен. Едет только при переходе в «починено и не выпущено» — с другим
|
|
120
|
+
* переходом приём отбивает строку, а без него отбивает переход в починку.
|
|
121
|
+
*/
|
|
122
|
+
readonly fixNote?: string;
|
|
123
|
+
/**
|
|
124
|
+
* В какой версии искать фикс. Едет только при переходе в «выпущено» — с другим переходом
|
|
125
|
+
* приём отбивает строку, а без него отбивает переход в выпуск.
|
|
126
|
+
*/
|
|
127
|
+
readonly releaseVersion?: string;
|
|
128
|
+
}
|
|
129
|
+
/** Пакет правки состояния: то же общее, что у всякого груза, плюс строки правки. */
|
|
130
|
+
export interface ICargoStateBody extends ICargoHead {
|
|
131
|
+
readonly items: readonly ICargoStateItem[];
|
|
132
|
+
}
|
|
133
|
+
/** Строка, которую приём не исполнил: место в пакете, род записи, ключ и причина. */
|
|
134
|
+
export interface ICargoStateDenied {
|
|
135
|
+
readonly at: number;
|
|
136
|
+
readonly kind: TCargoStateKind;
|
|
137
|
+
readonly key: string;
|
|
138
|
+
/** Почему не исполнена: записи у дерева нет либо переход не разрешён. */
|
|
139
|
+
readonly denial: string;
|
|
140
|
+
}
|
|
141
|
+
/** Ответ приёма на правку состояния: признак дерева, два числа и отбитые строки. */
|
|
142
|
+
export interface ICargoStateAccepted {
|
|
143
|
+
readonly tree: string;
|
|
144
|
+
/** Сколько записей переведено. */
|
|
145
|
+
readonly changed: number;
|
|
146
|
+
/** Сколько уже стояло в названном состоянии: переходом это не считается. */
|
|
147
|
+
readonly same: number;
|
|
148
|
+
readonly denied: readonly ICargoStateDenied[];
|
|
149
|
+
}
|
|
108
150
|
//# sourceMappingURL=cargo.d.ts.map
|
package/lib/cargo.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cargo.d.ts","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/cargo.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cargo.d.ts","sourceRoot":"","sources":["../../../projects/agent-kit/src/lib/cargo.ts"],"names":[],"mappings":"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"}
|
package/lib/cargo.js
CHANGED
|
@@ -13,4 +13,6 @@
|
|
|
13
13
|
export const CARGO_SCHEMA_VERSION = '1';
|
|
14
14
|
/** Заголовок, которым дерево представляется приёму. */
|
|
15
15
|
export const TREE_TOKEN_HEADER = 'x-tree-token';
|
|
16
|
+
/** Состояния записи груза по порядку: шаг идёт вперёд на соседнее, назад — только из «в работе». */
|
|
17
|
+
export const CARGO_STATES = ['new', 'in_work', 'fixed', 'released'];
|
|
16
18
|
//# sourceMappingURL=cargo.js.map
|