@rt-tools/agent-kit 0.1.0 → 0.2.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/README.md +29 -3
- package/assets/laws/access.md +3 -12
- package/assets/laws/admin-lists.md +9 -21
- package/assets/laws/admin-navigation.md +3 -15
- package/assets/laws/code-structure.md +5 -16
- package/assets/laws/delivery.md +2 -16
- package/assets/laws/entity-editing.md +7 -20
- package/assets/laws/entity-models.md +10 -17
- package/assets/laws/frontend-application.md +3 -14
- package/assets/laws/lib-imports.md +0 -13
- package/assets/laws/locales.md +2 -11
- package/assets/laws/project-documentation.md +7 -20
- package/assets/laws/reuse-first.md +0 -9
- package/assets/laws/search-visibility.md +0 -13
- package/assets/laws/shared-code.md +0 -13
- package/assets/laws/verifiability.md +0 -13
- package/bin/agent-kit.d.ts +1 -1
- package/bin/agent-kit.d.ts.map +1 -1
- package/bin/agent-kit.js +63 -7
- package/bin/agent-kit.js.map +1 -1
- package/bin/prompt.d.ts +9 -0
- package/bin/prompt.d.ts.map +1 -0
- package/bin/prompt.js +57 -0
- package/bin/prompt.js.map +1 -0
- package/index.d.ts +2 -0
- package/index.d.ts.map +1 -1
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/lib/assets.d.ts +2 -2
- package/lib/assets.d.ts.map +1 -1
- package/lib/assets.js +14 -29
- package/lib/assets.js.map +1 -1
- package/lib/catalog.d.ts +44 -0
- package/lib/catalog.d.ts.map +1 -0
- package/lib/catalog.js +86 -0
- package/lib/catalog.js.map +1 -0
- package/lib/commands.d.ts +13 -1
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +85 -9
- package/lib/commands.js.map +1 -1
- package/lib/config.d.ts +5 -0
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +10 -5
- package/lib/config.js.map +1 -1
- package/lib/picker.d.ts +47 -0
- package/lib/picker.d.ts.map +1 -0
- package/lib/picker.js +112 -0
- package/lib/picker.js.map +1 -0
- package/package.json +1 -1
- package/rt-tools-agent-kit-0.2.0.tgz +0 -0
- package/rt-tools-agent-kit-0.1.0.tgz +0 -0
package/README.md
CHANGED
|
@@ -20,8 +20,9 @@
|
|
|
20
20
|
```bash
|
|
21
21
|
pnpm add -D @rt-tools/agent-kit
|
|
22
22
|
|
|
23
|
-
npx agent-kit
|
|
24
|
-
npx agent-kit
|
|
23
|
+
npx agent-kit list # что везёт пакет и что из этого взято здесь
|
|
24
|
+
npx agent-kit init # спросить законы галочками и завести .claude/rt-kit.json
|
|
25
|
+
npx agent-kit sync # разложить выбранное в docs/constitution/
|
|
25
26
|
npx agent-kit doctor # что разложено, что отстало, чего не хватает
|
|
26
27
|
```
|
|
27
28
|
|
|
@@ -34,6 +35,26 @@ npx agent-kit sync --check
|
|
|
34
35
|
Команда ничего не пишет и отказывает, если разложенное отстало от пакета или его правили
|
|
35
36
|
руками.
|
|
36
37
|
|
|
38
|
+
## Выбор законов
|
|
39
|
+
|
|
40
|
+
Половина законов пакета про то, чего в конкретном приложении нет вовсе: у сервиса без админки
|
|
41
|
+
нет ни её списков, ни её навигации. Поэтому `init` спрашивает, какие законы брать, а не кладёт
|
|
42
|
+
все пятнадцать молча.
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npx agent-kit init # спросить галочками
|
|
46
|
+
npx agent-kit init --all # взять все, ни о чём не спрашивая
|
|
47
|
+
npx agent-kit init --laws access,delivery,verifiability
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Без терминала — в CI, в конвейере, в чужом скрипте — спрашивать некого, и `init` без флага
|
|
51
|
+
отказывает вместо того, чтобы решить за проект: «взять всё» тоже решение, и принимать его
|
|
52
|
+
молча он не вправе.
|
|
53
|
+
|
|
54
|
+
Выбор уезжает в конфиг ключом `only` и оттуда же правится потом: `init` заведённый конфиг не
|
|
55
|
+
трогает. Имена законов — из `agent-kit list`, там же видно, что взято, что не выбрано и что
|
|
56
|
+
пропущено.
|
|
57
|
+
|
|
37
58
|
## Конфиг
|
|
38
59
|
|
|
39
60
|
`.claude/rt-kit.json` коммитится: раскладка обязана повторяться на чужой машине без вопросов.
|
|
@@ -42,6 +63,7 @@ npx agent-kit sync --check
|
|
|
42
63
|
{
|
|
43
64
|
"vars": { "mainBranch": "main" },
|
|
44
65
|
"layout": { "laws": "docs/constitution" },
|
|
66
|
+
"only": ["laws/access.md", "laws/delivery.md"],
|
|
45
67
|
"skip": ["laws/admin-lists.md"]
|
|
46
68
|
}
|
|
47
69
|
```
|
|
@@ -52,7 +74,11 @@ npx agent-kit sync --check
|
|
|
52
74
|
посреди правила агент прочтёт как имя.
|
|
53
75
|
- **`layout`** — куда класть каждый род ресурса. Умолчания менять без нужды не стоит: правила
|
|
54
76
|
ссылаются на законы теми же путями.
|
|
55
|
-
- **`
|
|
77
|
+
- **`only`** — что проект выбрал, идентификаторами вида `laws/<закон>.md`. Пусто — берётся всё.
|
|
78
|
+
Ограничивает только те роды, которые сам называет: перечислив законы, проект говорит о
|
|
79
|
+
законах, а не обо всём, что пакет везёт, — шаблоны при нём остаются.
|
|
80
|
+
- **`skip`** — ресурсы, от которых проект отказался, теми же идентификаторами. Вычитает из
|
|
81
|
+
выбранного, поэтому отказ от одного закона не требует переписывать список из пятнадцати.
|
|
56
82
|
|
|
57
83
|
## Надстройки
|
|
58
84
|
|
package/assets/laws/access.md
CHANGED
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
Кто что может делать: вход владельца, права на действия, поведение публичных путей.
|
|
4
4
|
Правила держат все процедуры контракта и все разделы админки.
|
|
5
5
|
|
|
6
|
-
**Ревизия:** 2026-08-02
|
|
7
|
-
|
|
8
6
|
## Терминология
|
|
9
7
|
|
|
10
8
|
| Термин | Определение |
|
|
@@ -34,13 +32,6 @@
|
|
|
34
32
|
- **Пока права не получены, админка ничего не прячет.** Пустая шапка после сетевого сбоя
|
|
35
33
|
выглядит как сломанная админка и не оставляет выхода; запрос без права всё равно
|
|
36
34
|
отобьётся на сервере.
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
- **Q-A-1.** Что видит владелец, у которого право отобрали посреди сессии? Токен живёт со
|
|
41
|
-
своими правами до истечения, и раздел останется доступным до перевхода. Заведён
|
|
42
|
-
2026-07-31.
|
|
43
|
-
- **Q-A-2.** Как владелец меняет свой пароль? Сегодня пароль задаётся при заведении учётной
|
|
44
|
-
записи и из интерфейса не меняется: ни экрана смены, ни процедуры, ни восстановления
|
|
45
|
-
забытого. Решение потребует процедуры смены и правила о подтверждении прежним паролем.
|
|
46
|
-
Заведён 2026-07-31, уточнён 2026-08-01 по коду домена `auth`.
|
|
35
|
+
- **Отобранное право перестаёт действовать не позже, чем истекает вход.** Права, вписанные во
|
|
36
|
+
вход и живущие до его конца, оставляют раздел открытым тому, у кого право уже забрали, — и
|
|
37
|
+
тем дольше, чем длиннее вход. Отзыв, который замечают только при следующем входе, — не отзыв.
|
|
@@ -6,8 +6,6 @@
|
|
|
6
6
|
|
|
7
7
|
Открытая запись, попадание в раздел и объём данных на строку — предмет других законов.
|
|
8
8
|
|
|
9
|
-
**Ревизия:** 2026-08-02
|
|
10
|
-
|
|
11
9
|
## Статьи
|
|
12
10
|
|
|
13
11
|
- **Записи показаны таблицей: строка — запись, столбец — её свойство.**
|
|
@@ -26,22 +24,12 @@
|
|
|
26
24
|
умолчанию виден стрелкой сразу, а условие, которого сервер не принял, не остаётся в тулбаре
|
|
27
25
|
как действующее.
|
|
28
26
|
- **Заголовки столбцов, тексты состояний и подписи действий приходят из словарей.**
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
- **Q-L-5 — страницу отдают три процедуры.** Промокоды, прежние адреса объекта и подписки на
|
|
39
|
-
календари принимают выборку и отвечают страницей; остальные списки приходят одним ответом
|
|
40
|
-
целиком, и заявки за несколько сезонов по нескольким объектам придут им же. Решено, что
|
|
41
|
-
список запрашивается страницей: номер и размер страницы, сортировка по одному полю
|
|
42
|
-
и несколько фильтров сразу. Форма запроса одна на все списки и объявлена в общей части
|
|
43
|
-
контракта, а не переписывается в каждом домене. Ответ несёт общее число записей — без него не
|
|
44
|
-
показать, сколько страниц. Заведён 2026-08-01.
|
|
45
|
-
- **Q-L-7 — выпадающие списки грузятся целиком.** Выбор объекта, гостя или тега приходит одним
|
|
46
|
-
ответом. Решено брать их той же страницей, что и таблицу, но догружать следующую при
|
|
47
|
-
прокрутке: страниц в таком списке не видно, значит и переключать их нечем. Заведён 2026-08-01.
|
|
27
|
+
- **Вид списка живёт в адресе: отбор, порядок и номер страницы.** Иначе ссылку на отобранный
|
|
28
|
+
список не передать, перезагрузка возвращает список к умолчанию, а возврат из открытой записи
|
|
29
|
+
сбрасывает набранное. Размер страницы и состав столбцов в адресе не участвуют: они про
|
|
30
|
+
владельца, а не про то, что он показывает другому.
|
|
31
|
+
- **Форма запроса списка одна на все разделы, и ответ несёт общее число записей.** Переписанная
|
|
32
|
+
в каждом разделе, она расходится по одному полю за раз; без общего числа не показать, сколько
|
|
33
|
+
страниц.
|
|
34
|
+
- **Выпадающий список берётся той же страницей, что и таблица, и догружается прокруткой.**
|
|
35
|
+
Страниц в нём не видно, значит и переключать их нечем.
|
|
@@ -4,8 +4,6 @@
|
|
|
4
4
|
заявки, объекты, календарь, переписку, аналитику, цены, организацию, — и разойтись им нельзя:
|
|
5
5
|
раздел, который ведёт себя иначе остальных, выглядит сломанным.
|
|
6
6
|
|
|
7
|
-
**Ревизия:** 2026-08-02
|
|
8
|
-
|
|
9
7
|
## Статьи
|
|
10
8
|
|
|
11
9
|
- **Пункт меню ведёт на свой экран.** Не на вкладку внутри чужого экрана и не на панель: адрес
|
|
@@ -35,16 +33,6 @@
|
|
|
35
33
|
откроется ли что-то при наведении, и владелец наводит наугад.
|
|
36
34
|
- **На узком экране меню сворачивается в кнопку и раскрывается списком с теми же разделами.**
|
|
37
35
|
- **Меню на узком экране прокручивается, когда пункты не помещаются по высоте.**
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
- **Q-N-5.** Хлебных крошек нет: на вложенном экране не видно, из какого он раздела и как вернуться
|
|
42
|
-
на уровень выше. Заведён 2026-08-01.
|
|
43
|
-
- **Q-N-6 — маркер непросмотренного не загорается ни у одного пункта.** Точку кит рисует, и у
|
|
44
|
-
раздела с панелью она сводится с его пунктов, но признак не поднимает никто: отметки «владелец
|
|
45
|
-
видел до сюда» нет ни в контракте, ни в базе. Решение заведёт отметку на пару владелец-раздел,
|
|
46
|
-
научит разделы считать записи, появившиеся после последнего захода, и гасить точку при
|
|
47
|
-
открытии. Заведён 2026-08-01, переписан 2026-08-02.
|
|
48
|
-
- **Q-N-8 — «Финансы» показывают одну подсказку вместо счетов и налогов.** Раздел стоит в ряду
|
|
49
|
-
недоступным: спеков на счета организации и расчёт налогов нет, и показывать в нём нечего.
|
|
50
|
-
Решение опишет раздел спеком и заведёт его экраны. Заведён 2026-08-02.
|
|
36
|
+
- **На вложенном экране видно, из какого он раздела и как вернуться на уровень выше.**
|
|
37
|
+
Подсветка раздела в меню говорит, где владелец сейчас, но не даёт пути назад: без него
|
|
38
|
+
наверх возвращаются кнопкой браузера, а из открытого по ссылке экрана — некуда.
|
|
@@ -4,8 +4,6 @@
|
|
|
4
4
|
код читают чаще, чем пишут: имя, по которому не видно рода объявления, и тип, объявленный
|
|
5
5
|
подходящим вместо проверенного, стоят читателю отдельного похода в соседний файл.
|
|
6
6
|
|
|
7
|
-
**Ревизия:** 2026-08-05
|
|
8
|
-
|
|
9
7
|
## Статьи
|
|
10
8
|
|
|
11
9
|
- **Имя объявления говорит, какого оно рода.** Без этого род объявления выясняется переходом
|
|
@@ -16,17 +14,8 @@
|
|
|
16
14
|
оригиналом молча, а компилируется из них только одна.
|
|
17
15
|
- **Отметка об устаревании — повод убрать, а не повод оставить.** Устаревшее объявление,
|
|
18
16
|
которое молча продолжает работать, переживает того, кто его пометил.
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
компилируется. Решение изменит, появится ли на это проверка. Заведён 2026-08-05.
|
|
25
|
-
- **Q-CS-2 — имя файла не связано с тем, что в нём лежит.** Соответствие держится
|
|
26
|
-
договорённостью, и файл под чужим именем проходит все проверки. Решение изменит, появится
|
|
27
|
-
ли на это проверка. Заведён 2026-08-05.
|
|
28
|
-
|
|
29
|
-
## История изменений
|
|
30
|
-
|
|
31
|
-
- **2026-08-05.** Закон заведён: статьи собраны из правила `typescript-conventions` — в нём
|
|
32
|
-
осталось то, из чего объявление собирается.
|
|
17
|
+
- **Значение проверяется, а не объявляется подходящим.** Объявить значение подходящим можно
|
|
18
|
+
где угодно и о чём угодно: это принимает любую строку и компилируется, а расходится с
|
|
19
|
+
правдой уже на работающем приложении.
|
|
20
|
+
- **Имя файла говорит, что в нём лежит.** Файл под чужим именем находится поиском, а
|
|
21
|
+
открывается не тем, чего от него ждали, — и так на каждом чтении заново.
|
package/assets/laws/delivery.md
CHANGED
|
@@ -4,8 +4,6 @@
|
|
|
4
4
|
в этот момент видит пользователь: неудачная выкатка отличается от удачной только тем, что
|
|
5
5
|
приложение перестаёт отвечать, а причина этого выясняется по истории.
|
|
6
6
|
|
|
7
|
-
**Ревизия:** 2026-08-05
|
|
8
|
-
|
|
9
7
|
## Статьи
|
|
10
8
|
|
|
11
9
|
- **Правка попадает в главную ветку только через отдельную ветку.** Прямая запись в главную
|
|
@@ -18,17 +16,5 @@
|
|
|
18
16
|
неверный порядок незаметен: он проявляется только при развёртывании с нуля.
|
|
19
17
|
- **Документ едет вместе с правкой, которую он описывает.** Ни сборка, ни проверки текстов
|
|
20
18
|
не читают, поэтому расхождение копится молча и потом выглядит действующей справкой.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
- **Q-D-1 — что происходит с выкаткой, когда правка задела несколько задач.** Сегодня одна
|
|
25
|
-
ветка закрывает одну задачу, и вторая идёт отдельной строкой связи. Решение изменит, можно
|
|
26
|
-
ли откатить одну задачу, не откатывая соседнюю. Заведён 2026-08-05.
|
|
27
|
-
- **Q-D-2 — связь ветки с задачей не проверяет ничто.** Имя ветки складывается по
|
|
28
|
-
договорённости, и ветка без номера задачи проходит все гарды. Решение изменит, появится ли
|
|
29
|
-
на это проверка или связь остаётся за автором. Заведён 2026-08-05.
|
|
30
|
-
|
|
31
|
-
## История изменений
|
|
32
|
-
|
|
33
|
-
- **2026-08-05.** Закон заведён: статьи собраны из правила `git-workflow` — в нём осталось
|
|
34
|
-
то, из чего поставка собирается.
|
|
19
|
+
- **Отдельная ветка называет задачу, которую закрывает.** Иначе связь правки с причиной живёт
|
|
20
|
+
только в памяти автора, и через полгода по истории не сказать, зачем это сделано.
|
|
@@ -6,8 +6,6 @@
|
|
|
6
6
|
|
|
7
7
|
Попадание в запись из набора и объём запрашиваемых данных — предмет других законов.
|
|
8
8
|
|
|
9
|
-
**Ревизия:** 2026-08-02
|
|
10
|
-
|
|
11
9
|
## Статьи
|
|
12
10
|
|
|
13
11
|
- **Асайд закрывается только после успешного запроса.** Закрытие — сигнал «сохранено»,
|
|
@@ -53,21 +51,10 @@
|
|
|
53
51
|
- **Запись, которую можно только смотреть, показана данными, а не полями ввода.** Поле ввода,
|
|
54
52
|
которое не принимает ввод, владелец сначала пробует заполнить.
|
|
55
53
|
- **Непонятное объясняется на месте: подсказкой под полем или сообщением над формой.**
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
- **Q-E-5 — вкладок в панелях нет.** Разделы идут подряд одной полосой, и до нижнего нужно
|
|
64
|
-
прокручивать всю форму. Решено раскладывать разделы по вкладкам, оставлять вкладки на месте
|
|
65
|
-
при прокрутке и не заводить действий, относящихся к содержимому одной вкладки: с закрытой
|
|
66
|
-
вкладки такое действие не видно, а на открытой спорит с общей кнопкой записи. Заведён
|
|
67
|
-
2026-08-01.
|
|
68
|
-
- **Q-E-8 — ненайденная запись обрабатывается двумя способами.** Панель промокода показывает
|
|
69
|
-
«код не найден» и остаётся открытой, остальные уходят с адреса. Заведён 2026-08-01.
|
|
70
|
-
- **Q-E-12 — правки формы документа пропадают при закрытии молча.** Карточка заявки собирает
|
|
71
|
-
адресата и состав гостей, но записывает их только выдачей документа, поэтому вопрос о
|
|
72
|
-
несохранённых правках ей задать нечем: исход «закрыть с сохранением» отправил бы гостю
|
|
73
|
-
письмо. Заведён 2026-08-02.
|
|
54
|
+
- **Действия над записью доступны из самой записи, а не только из набора.** Они стоят в шапке
|
|
55
|
+
панели и при числе больше двух прячутся под одну кнопку меню; иначе открытая запись — тупик,
|
|
56
|
+
из которого приходится возвращаться в набор ради каждого действия.
|
|
57
|
+
- **Длинная форма разложена вкладками, и вкладки остаются на месте при прокрутке.** Разделы
|
|
58
|
+
подряд одной полосой требуют прокрутить всю форму до нижнего.
|
|
59
|
+
- **Действий, относящихся к содержимому одной вкладки, не заводится.** С закрытой вкладки
|
|
60
|
+
такое действие не видно, а на открытой спорит с общей кнопкой записи.
|
|
@@ -6,8 +6,6 @@
|
|
|
6
6
|
|
|
7
7
|
Как список показывает записи и как ведёт себя панель правки — предмет других законов.
|
|
8
8
|
|
|
9
|
-
**Ревизия:** 2026-08-01
|
|
10
|
-
|
|
11
9
|
## Статьи
|
|
12
10
|
|
|
13
11
|
- **У сущности две стороны: то, что пришло из контракта, и то, чем пользуется экран.** Первая
|
|
@@ -17,18 +15,13 @@
|
|
|
17
15
|
- **Между сторонами стоит перевод, и экраны читают только вторую.**
|
|
18
16
|
- **Пустое значение выражается пустой строкой или нулём, а не отсутствием поля.** Необязательных
|
|
19
17
|
скаляров в контракте нет, и «не задано» у каждого поля значит своё.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
-
|
|
29
|
-
|
|
30
|
-
вложенные наборы. Решено разделить контракт на короткое сообщение списка и полное сообщение
|
|
31
|
-
записи. Заведён 2026-08-01.
|
|
32
|
-
- **Q-M-3 — открытая запись берётся из уже загруженного списка.** Своего чтения по
|
|
33
|
-
идентификатору нет: панель, открытая по ссылке, ждёт, пока подгрузится весь список. Заведён
|
|
34
|
-
2026-08-01.
|
|
18
|
+
- **У сущности два уровня: короткий и полный.** Короткий — для строки набора, выпадающего
|
|
19
|
+
списка и подсказок ввода, полный — для открытой записи. Одна модель на все случаи тянет в
|
|
20
|
+
набор то, что в нём не показано: изображения, длинные тексты, вложенные наборы.
|
|
21
|
+
- **Следующий уровень расширяет предыдущий, а не повторяет его поля.** Повторённое поле
|
|
22
|
+
расходится при первой же правке, и какое из двух объявлений верное — не видно.
|
|
23
|
+
- **Контракт различает короткое сообщение набора и полное сообщение записи.** Одно сообщение
|
|
24
|
+
на оба случая делает выбор уровня невозможным: лишнее приезжает независимо от того, кто
|
|
25
|
+
спрашивает.
|
|
26
|
+
- **Открытая запись читается своим запросом по идентификатору.** Взятая из уже загруженного
|
|
27
|
+
набора, она открывается по ссылке только после того, как загрузится весь набор.
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
Как устроено то, что рисует экран. Закон держит и сайт, и админку сразу: экран, устроенный
|
|
4
4
|
иначе соседнего, пользователь читает заново, а разработчик правит вслепую.
|
|
5
5
|
|
|
6
|
-
**Ревизия:** 2026-08-05
|
|
7
|
-
|
|
8
6
|
## Статьи
|
|
9
7
|
|
|
10
8
|
- **Состояние экрана пересчитывается само, а не по команде.** Пересчёт вручную рано или
|
|
@@ -20,15 +18,6 @@
|
|
|
20
18
|
рабочим и молча ничего не делает.
|
|
21
19
|
- **Набор записей приходит с сервера страницей, а не целиком.** Список, растущий вместе с
|
|
22
20
|
данными, однажды перестаёт открываться, и заметно это становится уже у пользователя.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
- **Q-FA-1 — обращение к окружению браузера не проверяет ничто.** Прямое обращение к
|
|
27
|
-
глобальному объекту компилируется и падает только при отдаче страницы сервером. Решение
|
|
28
|
-
изменит, появится ли на это проверка. Заведён 2026-08-05.
|
|
29
|
-
|
|
30
|
-
## История изменений
|
|
31
|
-
|
|
32
|
-
- **2026-08-05.** Закон заведён: статьи собраны из правил `angular-patterns`,
|
|
33
|
-
`component-structure`, `styling-bem`, `platform-access` и `api-layer` — в них осталось то,
|
|
34
|
-
из чего экран собирается.
|
|
21
|
+
- **К окружению браузера обращаются только там, где известно, что оно есть.** Прямое
|
|
22
|
+
обращение к глобальному объекту компилируется и молчит, а падает там, где браузера нет, —
|
|
23
|
+
на отдаче страницы сервером или в прогоне тестов.
|
|
@@ -8,8 +8,6 @@
|
|
|
8
8
|
Закон отвечает на вопрос, откуда берётся импорт. Раскладка самих либ и слоёв — не его
|
|
9
9
|
предмет.
|
|
10
10
|
|
|
11
|
-
**Ревизия:** 2026-08-02
|
|
12
|
-
|
|
13
11
|
## Статьи
|
|
14
12
|
|
|
15
13
|
- **Либа отдаёт наружу только то, что объявила сама.** Чужой символ через неё не проходит:
|
|
@@ -18,14 +16,3 @@
|
|
|
18
16
|
дописывается строкой с объяснением, зачем оно понадобилось.
|
|
19
17
|
- **У либы, общей всем трём приложениям, список зависимостей пуст.** Её видит и бэкенд, и
|
|
20
18
|
любая её зависимость стала бы общей для всех сразу.
|
|
21
|
-
|
|
22
|
-
## Открытые вопросы
|
|
23
|
-
|
|
24
|
-
- **Q-I-2 — куда положен общий символ, не проверяет ничто.** `check:dupes` ловит копию по
|
|
25
|
-
совпавшему имени или набору членов, а та же логика, написанная заново под другим именем,
|
|
26
|
-
проходит. Решение изменит, появится ли на это проверка или выбор места остаётся за ревью.
|
|
27
|
-
Заведён 2026-08-02.
|
|
28
|
-
- **Q-I-3 — доменом ли заведено то, у чего нет ни экранов, ни состояния, ни запросов, не
|
|
29
|
-
проверяет ничто.** Проверка раскладки требует полного набора слоёв у всех, поэтому пустой
|
|
30
|
-
слой механики выглядит так же, как слот домена, который заполнит следующая задача. Решение
|
|
31
|
-
изменит, станет ли признак «непуст один только `util`» отказом проверки. Заведён 2026-08-02.
|
package/assets/laws/locales.md
CHANGED
|
@@ -4,8 +4,6 @@
|
|
|
4
4
|
контента и язык админки. Правила держат сайт, админку, письма и документ-подтверждение
|
|
5
5
|
одновременно.
|
|
6
6
|
|
|
7
|
-
**Ревизия:** 2026-07-31
|
|
8
|
-
|
|
9
7
|
## Терминология
|
|
10
8
|
|
|
11
9
|
| Термин | Определение |
|
|
@@ -33,12 +31,5 @@
|
|
|
33
31
|
ввода при сохранении объекта.
|
|
34
32
|
- **У локали есть начальная валюта показа.** Дальше валюту выбирает гость, и его выбор
|
|
35
33
|
сильнее умолчания локали.
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
- **Q-L-1.** Что показывать гостю, чей перевод объекта устарел после правки владельца, но
|
|
40
|
-
ещё не перезаписан из-за отказа провайдера? Сейчас видно прежний текст, признака
|
|
41
|
-
устаревания у страницы нет. Заведён 2026-07-31.
|
|
42
|
-
- **Q-L-2.** Как выбирается локаль гостю, пришедшему на корень сайта: сегодня это адрес, а
|
|
43
|
-
не язык браузера. Решение изменит поведение первой страницы и набор адресов, которые
|
|
44
|
-
попадают в кэш. Заведён 2026-07-31.
|
|
34
|
+
- **Локаль страницы определяется её адресом, а не языком браузера.** Иначе один адрес отдаёт
|
|
35
|
+
разным гостям разный текст, и кэшировать его нечем: в кэш попадает то, что увидел первый.
|
|
@@ -5,8 +5,6 @@
|
|
|
5
5
|
устаревшее описание живёт дальше и выглядит действующей справкой — тем убедительнее, чем оно
|
|
6
6
|
старше.
|
|
7
7
|
|
|
8
|
-
**Ревизия:** 2026-08-05
|
|
9
|
-
|
|
10
8
|
## Статьи
|
|
11
9
|
|
|
12
10
|
- **У документа заранее задан набор разделов, и отсутствие раздела — отказ.** Требования,
|
|
@@ -19,21 +17,10 @@
|
|
|
19
17
|
действующее указание, и следующий читатель заводит снятое заново.
|
|
20
18
|
- **Документ, разошедшийся с приложением, правится тогда же, когда замечено расхождение.**
|
|
21
19
|
Отложенная правка не случается: расхождение перестаёт быть заметным на следующий день.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
- **Q-PD-2 — число в тексте стареет молча.** Пересчёт числа командой в том же изменении
|
|
30
|
-
держится договорённостью; устаревшее число выглядит так же, как свежее. Решение изменит,
|
|
31
|
-
появится ли способ отличить одно от другого. Заведён 2026-08-05.
|
|
32
|
-
- **Q-PD-3 — начало работы с описания не проверяет ничто.** Порядок «сначала описание, потом
|
|
33
|
-
код» держится договорённостью, и обратный порядок виден только по истории. Решение
|
|
34
|
-
изменит, появится ли на это проверка. Заведён 2026-08-05.
|
|
35
|
-
|
|
36
|
-
## История изменений
|
|
37
|
-
|
|
38
|
-
- **2026-08-05.** Закон заведён: статьи собраны из правил `spec-driven` и `doc-style` — в них
|
|
39
|
-
осталось то, из чего документ собирается и как он формулируется.
|
|
20
|
+
- **Документ описывает то, что есть, а не то, чего не будет.** «Не планируется», «не будет» —
|
|
21
|
+
намерение, а не свойство приложения: сверить его не с чем, и оно проходит любую проверку,
|
|
22
|
+
пережив того, кто его писал.
|
|
23
|
+
- **Число в тексте пересчитывается тогда же, когда пишется.** Устаревшее число выглядит так же
|
|
24
|
+
убедительно, как свежее, и стареет молча — часто внутри той же правки, где появилось.
|
|
25
|
+
- **Работа начинается с описания, а не с кода.** Описанное после того, как написано, повторяет
|
|
26
|
+
сделанное вместо того, чтобы его задавать, и перестаёт быть требованием.
|
|
@@ -8,8 +8,6 @@
|
|
|
8
8
|
Закон говорит о том, что верно для владельца и гостя. Как эти основы устроены в коде — не
|
|
9
9
|
его предмет.
|
|
10
10
|
|
|
11
|
-
**Ревизия:** 2026-08-04
|
|
12
|
-
|
|
13
11
|
## Статьи
|
|
14
12
|
|
|
15
13
|
- **Готовое из кита и общих основ берётся, а не пишется заново.** Своя копия расходится с
|
|
@@ -26,10 +24,3 @@
|
|
|
26
24
|
видны только на своём экране, и соседний остаётся с прежним видом.
|
|
27
25
|
- **Раскладка экранов, форм, панелей и окон одна на всё приложение.** Отступы страницы,
|
|
28
26
|
заголовок, полоса действий и зона содержимого у всех разделов одни, и меняются они разом.
|
|
29
|
-
|
|
30
|
-
## Открытые вопросы
|
|
31
|
-
|
|
32
|
-
- **Q-R-2 — расхождение вида на уже написанных экранах не измерено.** Гард отбивает новое, а
|
|
33
|
-
сколько мест сегодня показывают отказ и поля не так, как кит, известно только по одному
|
|
34
|
-
признаку — `role="alert"` вне кита. Решение изменит, заводится ли на это проверка по дереву
|
|
35
|
-
или разбор идёт экраном за экраном. Заведён 2026-08-03.
|
|
@@ -5,8 +5,6 @@
|
|
|
5
5
|
языках или дублями друг друга. Ошибка здесь не видна ни в сборке, ни в браузере: она
|
|
6
6
|
проявляется падением выдачи через недели.
|
|
7
7
|
|
|
8
|
-
**Ревизия:** 2026-08-05
|
|
9
|
-
|
|
10
8
|
## Статьи
|
|
11
9
|
|
|
12
10
|
- **У страницы один канонический адрес — её собственный, на её языке.** Общий канонический
|
|
@@ -24,14 +22,3 @@
|
|
|
24
22
|
перенаправления обнуляет накопленный вес страницы.
|
|
25
23
|
- **Перенаправление с прежнего адреса живёт в кэше наравне со страницами.** Некэшируемое
|
|
26
24
|
перенаправление не вытесняет из кэша старую страницу, и гость видит её ещё сутки.
|
|
27
|
-
|
|
28
|
-
## Открытые вопросы
|
|
29
|
-
|
|
30
|
-
- **Q-SV-1 — что становится каноническим адресом, когда страниц одного вида несколько.**
|
|
31
|
-
Сегодня корень языка отдаёт единственную страницу и объявляет каноническим её адрес.
|
|
32
|
-
Решение изменит, появится ли у списка собственный канонический адрес. Заведён 2026-08-05.
|
|
33
|
-
|
|
34
|
-
## История изменений
|
|
35
|
-
|
|
36
|
-
- **2026-08-05.** Закон заведён: статьи собраны из правила `seo` — в нём осталось только то,
|
|
37
|
-
из чего разметка собирается.
|
|
@@ -7,8 +7,6 @@
|
|
|
7
7
|
Закон говорит о том, что общим быть обязано. Где такой символ лежит и кто его видит — не
|
|
8
8
|
его предмет.
|
|
9
9
|
|
|
10
|
-
**Ревизия:** 2026-08-02
|
|
11
|
-
|
|
12
10
|
## Статьи
|
|
13
11
|
|
|
14
12
|
- **Число-настройка объявлено один раз на все приложения.** Размер страницы жил шестью
|
|
@@ -19,14 +17,3 @@
|
|
|
19
17
|
принимает любую строку, и порядок молча становится нечитаемым.
|
|
20
18
|
- **Номер страницы меньше единицы читается как первая.** Отрицательный номер доходил до
|
|
21
19
|
переключателя страниц как есть.
|
|
22
|
-
|
|
23
|
-
## Открытые вопросы
|
|
24
|
-
|
|
25
|
-
- **Q-S-1 — перевод сущности на двух сторонах устроен по-разному.** Фронт переводит классом
|
|
26
|
-
с приведением через `typeCast`, бэкенд — свободными функциями без общей основы, хотя пакет
|
|
27
|
-
с этой основой виден обоим. Решение изменит, станет ли `BaseMapper` общей формой перевода
|
|
28
|
-
или у сторон останутся две. Заведён 2026-08-02.
|
|
29
|
-
- **Q-S-2 — совпадение строковой настройки и таблицы соответствий не сверяется.** Проверка
|
|
30
|
-
считает только числа: у строк под одним именем значение бывает своим в каждой либе, и учёт
|
|
31
|
-
их дал бы полсотни ложных срабатываний. Решение изменит, появится ли признак, который
|
|
32
|
-
отличает общее понятие от совпавшего имени. Заведён 2026-08-02.
|
|
@@ -4,8 +4,6 @@
|
|
|
4
4
|
выглядит так же уверенно, как проверенное утверждение, и отличить их потом нечем: код,
|
|
5
5
|
который «должен работать», и код, который проверили, в истории выглядят одинаково.
|
|
6
6
|
|
|
7
|
-
**Ревизия:** 2026-08-05
|
|
8
|
-
|
|
9
7
|
## Статьи
|
|
10
8
|
|
|
11
9
|
- **Обещанное поведение названо сценарием, а сценарий назван в тесте, который его
|
|
@@ -20,14 +18,3 @@
|
|
|
20
18
|
ведёт себя иначе рабочего, и проверка в нём подтверждает не то, что будет у пользователя.
|
|
21
19
|
- **Разметка проверяется замером, а не взглядом.** На глаз не отличить отступ от поля и
|
|
22
20
|
выравнивание от совпадения, и расхождение находится уже после выкатки.
|
|
23
|
-
|
|
24
|
-
## Открытые вопросы
|
|
25
|
-
|
|
26
|
-
- **Q-V-1 — что считать достаточным покрытием сценария.** Сегодня достаточно одного теста,
|
|
27
|
-
назвавшего сценарий, и его глубину не проверяет ничто. Решение изменит, появится ли
|
|
28
|
-
требование к тому, каким путём тест идёт. Заведён 2026-08-05.
|
|
29
|
-
|
|
30
|
-
## История изменений
|
|
31
|
-
|
|
32
|
-
- **2026-08-05.** Закон заведён: статьи собраны из правил `testing` и `browser-verification`
|
|
33
|
-
— в них осталось то, из чего проверка собирается.
|
package/bin/agent-kit.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { IOutcomeOfCommand } from '../lib/commands.js';
|
|
3
|
-
export declare function main(argv: readonly string[]): IOutcomeOfCommand
|
|
3
|
+
export declare function main(argv: readonly string[]): Promise<IOutcomeOfCommand>;
|
|
4
4
|
//# sourceMappingURL=agent-kit.d.ts.map
|
package/bin/agent-kit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-kit.d.ts","sourceRoot":"","sources":["../../../projects/agent-kit/src/bin/agent-kit.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"agent-kit.d.ts","sourceRoot":"","sources":["../../../projects/agent-kit/src/bin/agent-kit.ts"],"names":[],"mappings":";AAaA,OAAO,EAA8B,iBAAiB,EAAc,MAAM,oBAAoB,CAAC;AAwF/F,wBAAsB,IAAI,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsB9E"}
|