@rt-tools/agent-kit 0.8.0 → 0.8.1
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-reuse.mjs +9 -7
- package/assets/patterns/reuse-first-extend.md +12 -3
- package/assets/rules/reuse-first.md +1 -1
- package/assets/skills/agent-kit-extend.md +149 -0
- package/assets/skills/agent-kit.md +8 -4
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.8.1.tgz +0 -0
- package/rt-tools-agent-kit-0.8.0.tgz +0 -0
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*
|
|
15
15
|
* Отличий от гарда два. Первое: инвентарь кита не читается — гард спрашивает диск, потому что
|
|
16
16
|
* отвечает одной правке, а сплошной проверке важно накопленное, и пропавший пакет молча
|
|
17
|
-
* обнулял бы сводку. Второе: маркер `native-ok` снимает свою
|
|
17
|
+
* обнулял бы сводку. Второе: маркер `native-ok` снимает свою строку и следующую, а не весь файл.
|
|
18
18
|
*
|
|
19
19
|
* Накопленное к моменту заведения проверки лежит в tools/reuse-allowlist.json и отказом не
|
|
20
20
|
* считается: гейт падает на новом расхождении, а старое остаётся видимым числом в сводке.
|
|
@@ -85,14 +85,16 @@ function judged(path) {
|
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
/**
|
|
88
|
-
*
|
|
89
|
-
*
|
|
88
|
+
* Маркер — осознанное отступление, названное автором. Снимается строка, где он стоит, и та, что
|
|
89
|
+
* идёт следом: в разметке маркер ставится комментарием над кодом, потому что форматировщик
|
|
90
|
+
* разносит длинный тег по строкам и уводит первый атрибут со строки имени тега — признак считает
|
|
91
|
+
* имя тега, а маркер оказывается ниже. Дальше следующей строки маркер не достаёт: весь файл он
|
|
92
|
+
* не гасит, иначе один разрешённый случай прикрывал бы соседние.
|
|
90
93
|
*/
|
|
91
94
|
function withoutMarked(text) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
.join('\n');
|
|
95
|
+
const lines = text.split('\n');
|
|
96
|
+
|
|
97
|
+
return lines.filter((line, index) => !line.includes('native-ok') && !lines[index - 1]?.includes('native-ok')).join('\n');
|
|
96
98
|
}
|
|
97
99
|
|
|
98
100
|
const allowlist = JSON.parse(readFileSync(join(ROOT, ALLOWLIST), 'utf8'));
|
|
@@ -82,9 +82,18 @@ grep -rn "<похожий приём>" libs/admin libs/site --include='*.html' |
|
|
|
82
82
|
<input type="tel" qa-dataid="phone-input" />
|
|
83
83
|
```
|
|
84
84
|
|
|
85
|
-
Маркер `native-ok`
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
Маркер `native-ok` объясняет, **чего именно нет в ките**. «Эти строки были здесь раньше»
|
|
86
|
+
причиной не считается: гард вычёркивает из проверяемого текста то, что уже лежит в файле,
|
|
87
|
+
поэтому отказ означает новый текст.
|
|
88
|
+
|
|
89
|
+
Стоит он комментарием строкой выше кода или в самой строке — снимаются обе. В разметке годится
|
|
90
|
+
только первое: форматировщик разносит тег, у которого атрибуты не влезли в предел ширины, по
|
|
91
|
+
строкам, и первый атрибут всегда уезжает на строку ниже имени тега. Признак считает имя тега,
|
|
92
|
+
то есть первую строку, а маркер, поставленный атрибутом, оказывается на второй и не снимает
|
|
93
|
+
ничего. Короткий тег форматировщик не трогает — и маркер работает ровно до тех пор, пока к тегу
|
|
94
|
+
не добавили ещё один атрибут.
|
|
95
|
+
|
|
96
|
+
Дальше следующей строки маркер не достаёт: он снимает свой случай, а не блок вокруг себя.
|
|
88
97
|
|
|
89
98
|
Сверка идёт без отступов — при переезде блок меняет отступ, оставаясь тем же кодом.
|
|
90
99
|
|
|
@@ -17,7 +17,7 @@ description: Правило под «Закон о единообразии пр
|
|
|
17
17
|
| готовое | компоненты кита `@rt-tools/ui-kit-v2` с префиксом `rt-` — сегодня их больше семидесяти — и базовые классы без селектора, наследуемые в `@Component` экрана |
|
|
18
18
|
| раскладка страниц, форм и окон | `apps/<app>/src/styles/`, применяется директивами BEM |
|
|
19
19
|
| оформление части приложения | файл `.scss` рядом с компонентом |
|
|
20
|
-
| отступление, решённое владельцем | маркер `native-ok`
|
|
20
|
+
| отступление, решённое владельцем | маркер `native-ok` с объяснением — комментарием строкой выше или в самой строке |
|
|
21
21
|
|
|
22
22
|
## Где это лежит
|
|
23
23
|
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agent-kit-extend
|
|
3
|
+
description: Готовые примеры того, как дерево дописывает своё поверх пакета правил — надстройка над разложенным текстом, своя ветка карты гейта, своя функция профиля, свой признак единообразия, свой закон и правило. Брать, когда пакетный текст говорит не то, что верно здесь, гейт требует не то правило, гард судит не по тем путям, или своё поведение надо дописать, не трогая пакет. Где что настраивается и как устроена раскладка — скил agent-kit; форма нового скила — write-a-skill.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Как дописать своё поверх пакета
|
|
7
|
+
|
|
8
|
+
Скил `agent-kit` называет, **где** настраивается каждый род правки. Здесь — **как** выглядит
|
|
9
|
+
сама правка, на готовых примерах, и чем каждая проверяется.
|
|
10
|
+
|
|
11
|
+
Одно правило общее для всех пяти: разложенный файл не правится на месте. Он несёт шапку
|
|
12
|
+
`rt-kit v… · <ресурс> · <сумма>`, правка в нём теряется на следующей раскладке и до тех пор
|
|
13
|
+
выглядит применённой, а `sync` на такой файл отказывает вместо того, чтобы переписать молча.
|
|
14
|
+
|
|
15
|
+
## Когда брать
|
|
16
|
+
|
|
17
|
+
- Пакетный текст говорит не то, что верно здесь: имена, пути, приёмы этого дерева.
|
|
18
|
+
- Гейт требует под файл не то правило — или молчит там, где правило есть.
|
|
19
|
+
- Гард судит не по тем путям: чужие корни, свой набор проверок, своя форма ветки.
|
|
20
|
+
- Заводится своё — признак единообразия, проверка, закон с правилом, — чего пакет не везёт.
|
|
21
|
+
|
|
22
|
+
## Текст: надстройка сливается по разделам
|
|
23
|
+
|
|
24
|
+
Файл кладётся в `overrides/<идентификатор ресурса>` — путь повторяет ресурс один в один:
|
|
25
|
+
`rules/testing.md` надстраивается файлом `rules/testing.md`.
|
|
26
|
+
|
|
27
|
+
```markdown
|
|
28
|
+
## Ловушки этого дерева
|
|
29
|
+
|
|
30
|
+
- **Снимок дерева правится тем же коммитом, что и объявление.** Иначе установка у соседа
|
|
31
|
+
ставит не то, что стоит здесь.
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
| Заголовок в надстройке | Что происходит |
|
|
35
|
+
| ---------------------- | ------------------------- |
|
|
36
|
+
| есть у пакета | раздел замещается целиком |
|
|
37
|
+
| нет у пакета | дописывается в конец |
|
|
38
|
+
| есть, но тело пустое | раздел пакета снимается |
|
|
39
|
+
|
|
40
|
+
**Замещение — целиком, и это главная ловушка.** Свой пункт, дописанный под пакетным заголовком
|
|
41
|
+
`## Ловушки`, уносит все пакетные пункты этого раздела разом, и пропажу не видно ничем: файл
|
|
42
|
+
выглядит собранным. Поэтому заголовок в примере выше свой. Пакетный заголовок берут только
|
|
43
|
+
тогда, когда пакетный текст здесь неверен и его правда надо снять.
|
|
44
|
+
|
|
45
|
+
Проверяется раскладкой: `sync`, затем `sync --check` — и глазами по разложенному файлу, на
|
|
46
|
+
месте ли пакетные разделы.
|
|
47
|
+
|
|
48
|
+
От ресурса целиком отказываются не здесь, а списком `skip` в конфиге: надстройка правит текст,
|
|
49
|
+
`skip` отменяет файл.
|
|
50
|
+
|
|
51
|
+
## Гейт: своя ветка решает раньше умолчания
|
|
52
|
+
|
|
53
|
+
Гейт спрашивает `skill_for` — она печатает имя правила или молчит. Молчание значит «правила на
|
|
54
|
+
это нет», и правка проходит.
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
skill_for() {
|
|
58
|
+
kind="$1"; target="$2"; written="$3"
|
|
59
|
+
|
|
60
|
+
case "$kind" in
|
|
61
|
+
edit)
|
|
62
|
+
case "$target" in
|
|
63
|
+
# Частное — всегда раньше общего: файл истории не файл компонента.
|
|
64
|
+
*.stories.ts) printf '%s\n' 'showcase'; return 0 ;;
|
|
65
|
+
esac
|
|
66
|
+
;;
|
|
67
|
+
esac
|
|
68
|
+
|
|
69
|
+
# Всё остальное разбирает умолчание пакета — иначе оно теряется целиком.
|
|
70
|
+
command -v skill_for_default >/dev/null 2>&1 && skill_for_default "$kind" "$target" "$written"
|
|
71
|
+
|
|
72
|
+
return 0
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Две вещи здесь обязательны. **Порядок веток:** первое совпадение выигрывает, и общая ветка,
|
|
77
|
+
поставленная выше частной, съедает её молча. **Вызов умолчания:** объявив функцию заново и не
|
|
78
|
+
позвав `_default`, дерево остаётся без всех пакетных веток сразу — а выглядит это как «гейт
|
|
79
|
+
перестал требовать правила».
|
|
80
|
+
|
|
81
|
+
Проверяется сценариями гейта из набора пакета: они гоняют карту, ничего не раскладывая.
|
|
82
|
+
|
|
83
|
+
## Гард: профиль отвечает за имена и команды
|
|
84
|
+
|
|
85
|
+
Тем же приёмом объявляются функции профиля — что гонять перед пушем, какой документ едет парой,
|
|
86
|
+
чем линтуется файл, что здесь считается кодом приложения, какая форма ветки законна.
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# Какой документ обязан ехать тем же коммитом. Печатает образец пути или молчит.
|
|
90
|
+
rt_docs_pair_for() {
|
|
91
|
+
case "$1" in
|
|
92
|
+
*.spec.ts) return 0 ;;
|
|
93
|
+
libs/kit/src/*/*.component.ts) printf '%s' "${1%/*}/CONTEXT\.md" ;;
|
|
94
|
+
esac
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Печатается **образец**, а не путь: гард сверяет им состав коммита. Умолчание зовётся так же —
|
|
99
|
+
`rt_docs_pair_for_default "$@"` — везде, где своё правило случай не закрыло.
|
|
100
|
+
|
|
101
|
+
Путь приходит от корня дерева. Признак по подстроке вида `*/projects/*` совпадает и с чужим
|
|
102
|
+
каталогом за пределами репозитория — так запись в домашний каталог была отбита требованием
|
|
103
|
+
замысла, к ней не относящимся.
|
|
104
|
+
|
|
105
|
+
## Признаки и проверки: данные, а не код
|
|
106
|
+
|
|
107
|
+
Признак единообразия — данные. Дерево называет наборы пакета, чьё готовое оно берёт, и
|
|
108
|
+
дописывает свои файлом; совпавший ключ замещает пакетный.
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"sourceRoots": ["apps", "libs"],
|
|
113
|
+
"reuse": { "bundles": ["kit"], "signals": "tools/signals/own.json" }
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Объект сливается ключ за ключом: назвав один ключ раздела, дерево не теряет соседних. **Список
|
|
118
|
+
— наоборот, замещается целиком**, и это ловушка: назвав `sourceRoots`, дерево получает ровно
|
|
119
|
+
названное, а не пакетные корни плюс свои. «Дописать в список» и «убрать из списка» в этой записи
|
|
120
|
+
неразличимы, поэтому список всегда пишется полностью.
|
|
121
|
+
|
|
122
|
+
Набор объявляется по тому, что дерево **потребляет**. Дерево, в котором кит написан, а не
|
|
123
|
+
позван, объявив его набор, получит советы звать кит на файлах самого кита: признак верен, но
|
|
124
|
+
обращён не туда.
|
|
125
|
+
|
|
126
|
+
## Свой закон и правило
|
|
127
|
+
|
|
128
|
+
Пакет везёт слой правил, но не запрещает свой. Закон дерева ложится рядом с пакетными, правило
|
|
129
|
+
под него — среди скилов, и связь идёт через шапку: у правила `law:` с именем закона, у паттерна
|
|
130
|
+
`rule:` с именем правила. Имя, которому ничего не отвечает, отбивает сверку связности.
|
|
131
|
+
|
|
132
|
+
Утверждение правила получает строку в спутнике `implementation.md` — привязку к файлу и символу.
|
|
133
|
+
Утверждение, которому места в коде не нашлось, в проверяемый раздел не ставится: ему место в
|
|
134
|
+
«Ловушках» прозой.
|
|
135
|
+
|
|
136
|
+
Проверяется сверкой спеков — до пуша.
|
|
137
|
+
|
|
138
|
+
## Частые промахи
|
|
139
|
+
|
|
140
|
+
- **Правка на месте вместо надстройки.** Разложенный файл узнаётся по шапке, а не по каталогу:
|
|
141
|
+
раскладка ложится в те же `tools/` и `.claude/`, где лежит своё.
|
|
142
|
+
- **Свой пункт дописан к пакетному заголовку** — пакетные пункты этого раздела ушли молча.
|
|
143
|
+
- **Функция объявлена заново без вызова `_default`** — вместе со своим случаем потеряны все
|
|
144
|
+
пакетные.
|
|
145
|
+
- **Общая ветка карты стоит выше частной** — частная не выполняется никогда.
|
|
146
|
+
- **Замена по шаблону в файле оболочки** — `case` теряет свою `esac`, и гард с ошибкой синтаксиса
|
|
147
|
+
отвечает ненулевым кодом, то есть «правка отбита». После правки — `bash -n`.
|
|
148
|
+
- **Правка ресурса пакета без сборки.** Строка запуска читает собранное, а не исходники:
|
|
149
|
+
порядок всегда один — правка, сборка, `sync`.
|
|
@@ -33,6 +33,9 @@ description: Переносимый слой правил агента — за
|
|
|
33
33
|
`_default`. Слияние текста идёт по разделам `## `: совпавший заголовок замещает, новый
|
|
34
34
|
дописывается, пустой снимает раздел пакета.
|
|
35
35
|
|
|
36
|
+
Готовый пример на каждую строку этой таблицы — скил `agent-kit-extend`: как выглядит сама
|
|
37
|
+
правка, чем она проверяется и чем кончается, если положить её не туда.
|
|
38
|
+
|
|
36
39
|
## Порядок
|
|
37
40
|
|
|
38
41
|
Правка ресурса доезжает до дерева только через сборку пакета: строка запуска читает собранное,
|
|
@@ -108,10 +111,11 @@ npx agent-kit propose # отправить предложения, адр
|
|
|
108
111
|
написанная по путям, требует под него доменное правило — а оно уводит править файл на месте.
|
|
109
112
|
Правка на месте теряется на следующей раскладке, и до тех пор выглядит применённой. Ветка по
|
|
110
113
|
шапке ставится в карте первой и решает раньше путей.
|
|
111
|
-
- **Настройки проверок сливаются
|
|
112
|
-
|
|
113
|
-
теряет
|
|
114
|
-
|
|
114
|
+
- **Настройки проверок сливаются по ключам, а списки — замещаются.** Объект `checks.json`
|
|
115
|
+
ложится поверх умолчания ключ за ключом на любой глубине: назвав один ключ борды, дерево не
|
|
116
|
+
теряет соседних. Список приходит целиком — назвав корни исходников, дерево получает ровно
|
|
117
|
+
названное, а не умолчание вместе со своим: «дописать в список» и «убрать из списка» в этой
|
|
118
|
+
записи неразличимы.
|
|
115
119
|
- **Утверждение правила переезжает вместе с кодом.** Вынесенное в надстройку перестаёт
|
|
116
120
|
находиться по прежнему символу, и привязка в спутнике правила врёт молча — сверка спеков
|
|
117
121
|
ловит это, но только если её позвать.
|
package/package.json
CHANGED
|
Binary file
|
|
Binary file
|