@rt-tools/agent-kit 0.5.3 → 0.7.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.
Files changed (85) hide show
  1. package/README.md +15 -1
  2. package/assets/checks/check-file-size.mjs +127 -0
  3. package/assets/checks/check-push-gate.mjs +139 -0
  4. package/assets/checks/rt-kit-checks.config.mjs +21 -0
  5. package/assets/defaults/gate-map.sh +90 -34
  6. package/assets/defaults/project.sh +26 -3
  7. package/assets/hooks/skill-gate-layers.sh +156 -0
  8. package/assets/hooks/skill-gate.sh +11 -2
  9. package/assets/laws/code-structure.md +3 -0
  10. package/assets/laws/delivery.md +9 -0
  11. package/assets/laws/observability.md +46 -0
  12. package/assets/laws/project-documentation.md +4 -0
  13. package/assets/laws/reuse-first.md +2 -0
  14. package/assets/laws/verifiability.md +5 -0
  15. package/assets/patterns/browser-verification-stand.md +22 -2
  16. package/assets/patterns/doc-style-trace.md +111 -0
  17. package/assets/patterns/git-workflow-commit.azure.md +18 -0
  18. package/assets/patterns/git-workflow-commit.github.md +19 -1
  19. package/assets/patterns/git-workflow-commit.gitlab.md +18 -0
  20. package/assets/patterns/git-workflow-docker.md +203 -0
  21. package/assets/patterns/git-workflow-secrets.md +93 -0
  22. package/assets/patterns/observability-record.md +114 -0
  23. package/assets/patterns/seo-verify.md +1 -1
  24. package/assets/patterns/spec-driven-domain.md +2 -2
  25. package/assets/patterns/spec-driven-rule.md +5 -0
  26. package/assets/patterns/styling-bem-sheet.md +178 -0
  27. package/assets/patterns/task-flow-close.md +20 -0
  28. package/assets/patterns/task-flow-resume.md +5 -0
  29. package/assets/patterns/translations-content.md +107 -0
  30. package/assets/patterns/translations-key.md +1 -1
  31. package/assets/rules/angular-patterns.md +5 -0
  32. package/assets/rules/browser-verification.md +17 -12
  33. package/assets/rules/component-structure.md +6 -2
  34. package/assets/rules/doc-style.md +16 -0
  35. package/assets/rules/git-workflow.azure.md +60 -1
  36. package/assets/rules/git-workflow.github.md +67 -1
  37. package/assets/rules/git-workflow.gitlab.md +61 -1
  38. package/assets/rules/lists.md +13 -0
  39. package/assets/rules/observability.md +147 -0
  40. package/assets/rules/permissions.md +23 -0
  41. package/assets/rules/reuse-first.md +9 -0
  42. package/assets/rules/seo.md +57 -9
  43. package/assets/rules/shared-code.md +6 -0
  44. package/assets/rules/spec-driven.md +9 -0
  45. package/assets/rules/styling-bem.md +34 -1
  46. package/assets/rules/task-flow.md +5 -0
  47. package/assets/rules/testing.md +46 -8
  48. package/assets/rules/translations.md +11 -5
  49. package/assets/rules/typescript-conventions.md +5 -0
  50. package/lib/assets.d.ts +1 -1
  51. package/lib/assets.d.ts.map +1 -1
  52. package/lib/assets.js +2 -4
  53. package/lib/assets.js.map +1 -1
  54. package/lib/catalog.d.ts +73 -0
  55. package/lib/catalog.d.ts.map +1 -1
  56. package/lib/catalog.js +121 -0
  57. package/lib/catalog.js.map +1 -1
  58. package/lib/commands.d.ts.map +1 -1
  59. package/lib/commands.js +84 -5
  60. package/lib/commands.js.map +1 -1
  61. package/lib/integrity.d.ts +25 -12
  62. package/lib/integrity.d.ts.map +1 -1
  63. package/lib/integrity.js +40 -18
  64. package/lib/integrity.js.map +1 -1
  65. package/lib/proposals.d.ts +9 -1
  66. package/lib/proposals.d.ts.map +1 -1
  67. package/lib/proposals.js +11 -2
  68. package/lib/proposals.js.map +1 -1
  69. package/lib/retired.d.ts +30 -0
  70. package/lib/retired.d.ts.map +1 -0
  71. package/lib/retired.js +19 -0
  72. package/lib/retired.js.map +1 -0
  73. package/lib/sync.d.ts +45 -1
  74. package/lib/sync.d.ts.map +1 -1
  75. package/lib/sync.js +44 -10
  76. package/lib/sync.js.map +1 -1
  77. package/package.json +1 -1
  78. package/rt-tools-agent-kit-0.7.0.tgz +0 -0
  79. package/assets/laws/application/money.md +0 -41
  80. package/assets/laws/application/ownership.md +0 -32
  81. package/assets/patterns/ownership-scope-resolve.md +0 -69
  82. package/assets/patterns/pricing-quote.md +0 -71
  83. package/assets/rules/ownership-scope.md +0 -63
  84. package/assets/rules/pricing.md +0 -64
  85. package/rt-tools-agent-kit-0.5.3.tgz +0 -0
@@ -1,71 +0,0 @@
1
- ---
2
- name: pricing-quote
3
- kind: pattern
4
- rule: pricing
5
- description: Паттерн правила pricing. Брать при правке расчёта цены, механик скидки, работы с курсом валют и сумм в письмах и документах — где округлять, как выбирается одна скидка, что кладётся в бронь. Не брать для доступа к процедурам цен — это паттерн permissions-procedure.
6
- ---
7
-
8
- # Расчёт цены
9
-
10
- Паттерн правила `pricing`. Что при этом должно быть верно — закон
11
- `docs/constitution/application/money.md`.
12
-
13
- ## Когда брать
14
-
15
- - Правится расчёт цены или механика скидки.
16
- - В код заходит сумма в чужой валюте.
17
- - Сумма попадает в заказ, письмо, документ или сводку.
18
-
19
- ## Всё считается один раз
20
-
21
- Расчёт живёт в `calculateQuote` и отдаёт готовые числа: ночи, подытог, скидку, итог, признак
22
- минимального срока. Показ, письмо и запись в базу берут одни и те же числа, а не пересчитывают
23
- их каждый у себя.
24
-
25
- ```typescript
26
- const quote: IQuoteResult = calculateQuote({
27
- checkIn,
28
- checkOut,
29
- basePriceThb,
30
- defaultMinNights,
31
- seasons,
32
- lengthDiscounts,
33
- promoCode,
34
- });
35
- ```
36
-
37
- ## Одна скидка — наибольшая
38
-
39
- Механики считаются по отдельности, а выбор между ними один:
40
-
41
- ```typescript
42
- const best: IDiscountCandidate | undefined = bestCandidateOf([
43
- lengthCandidateOf(nights, input, subtotalThb),
44
- promoCandidateOf(input.promoCode, subtotalThb),
45
- ]);
46
- ```
47
-
48
- При равных суммах побеждает промокод: владелец выдал его адресно, а скидка за длительность
49
- досталась бы гостю и без него. Новая механика добавляется третьим кандидатом в тот же вызов, а
50
- не отдельным вычитанием из итога.
51
-
52
- ## Чужая валюта — на показ
53
-
54
- В заказе лежат сумма в валюте хранения и код валюты, в которой гость смотрел цену. Само число в чужой
55
- валюте не хранится нигде:
56
-
57
- ```typescript
58
- export const SUPPORTED_QUOTE_CURRENCIES: readonly string[] = ['USD', 'RUB', 'EUR', 'CNY'];
59
- ```
60
-
61
- Курс тянется по расписанию и кэшируется в хранилище. Курса нет — сумма показывается в валюте хранения без
62
- пересчёта.
63
-
64
- ## Частые промахи
65
-
66
- - Округление на показе: сумма гостя, сумма письма и сумма в базе разойдутся на единицы.
67
- - Сложение двух скидок: владелец таких сумм не закладывал, и объяснить гостю итог нечем.
68
- - Сохранённое число в чужой валюте: оно устареет вместе с курсом.
69
- - Справочная сумма, подписанная как сумма к оплате, — оплата идёт в валюте хранения.
70
- - Письмо в валюте, отличной от той, что гость выбирал на сайте: оно читается как другая цена.
71
- - Дробная часть в сумме: единица хранения целая.
@@ -1,63 +0,0 @@
1
- ---
2
- name: ownership-scope
3
- kind: rule
4
- law: ownership
5
- description: Правило под «Закон о владеющей сущности». Брать, когда процедура или экран работает с записью, принадлежащей владеющей сущности — разрешение идентификатора, умолчание при единственной действующей, сводки по всем. Называет обе формы разрешения и коды отказа. Готовый код — в паттерне ownership-scope-resolve. Чем это названо здесь — в implementation.md рядом.
6
- ---
7
-
8
- # Владеющая сущность — как это устроено здесь
9
-
10
- Правило под закон `docs/constitution/application/ownership.md`. Закон говорит, что должно быть
11
- верно; здесь — каким приёмом это держится. Как владеющая сущность названа в этом дереве и какие
12
- экраны считаются сводками — в `implementation.md` рядом.
13
-
14
- ## Как это называется здесь
15
-
16
- | В законе | Здесь |
17
- | ---------------------------------- | ------------------------------------------------------------------------------- |
18
- | владеющая сущность | запись своего домена; в запросах — поле `<сущность>_id` |
19
- | пустой идентификатор | пустая строка, а не отсутствующее поле: необязательных скаляров в контракте нет |
20
- | сводка | списки и статистика, отвечающие сразу по всем действующим |
21
- | отказ при двух и более действующих | `Code.InvalidArgument` |
22
- | отказ, когда действующих нет вовсе | `Code.FailedPrecondition` |
23
- | ненайденный явный идентификатор | `Code.NotFound` |
24
-
25
- У списков, переведённых на общую выборку, идентификатор отдельным полем запроса не приходит
26
- вовсе: это условие отбора в модели фильтра, а прежний номер поля помечен `reserved`.
27
-
28
- ## Где это лежит
29
-
30
- В этом дереве — таблица в `implementation.md` рядом. Пути живут там, а не здесь: правило
31
- переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
32
- же дереве, которое держит код иначе.
33
-
34
- ## Как закон применяется здесь
35
-
36
- - **Запись принадлежит владеющей сущности, а не системе.** Общих настроек, действующих сразу
37
- на все, нет: заведение второй не меняет поведение первой.
38
- - **Пустой идентификатор означает единственную действующую.** Пока она одна, клиент вправе её
39
- не называть.
40
- - **При двух и более действующих запрос обязан назвать сущность.** Умолчание перестаёт быть
41
- однозначным, и запрос отбивается как неверный.
42
- - **Названная явно находится, даже если она скрыта.** У скрытой остаются записи, деньги и
43
- переписка.
44
- - **Там, где показана сводка, пустой идентификатор означает все действующие.** Списки и
45
- статистика отвечают по всему набору, а не требуют сперва выбрать одну.
46
- - **Когда действующих нет вовсе, запрос отбивается.** Скрытая вместо отсутствующей действующей
47
- не подставляется.
48
-
49
- ## Паттерны
50
-
51
- - `ownership-scope-resolve` — разрешение сущности в процедуре и обе формы умолчания.
52
-
53
- ## Ловушки
54
-
55
- - **Разрешение разложено на две части намеренно:** чистая функция разбирает случай, обёртка
56
- ходит в хранилище и переводит случай в отказ. Вторая реализация того же правила однажды уже
57
- жила у обработчика статистики соседнего домена и успела разойтись порядком выборки.
58
- - **Отсутствие действующей сущности и ненайденный явный идентификатор — разные случаи для
59
- вызывающего:** первое отвечает `FailedPrecondition`, второе — `NotFound`.
60
- - Таблица владеющих сущностей читается целиком одним запросом — она маленькая, и выборки ей не
61
- нужно.
62
- - Выбор сущности стоит в шапке и действует на разделы, которые говорят об одной. Снаружи выбора
63
- нет: пользователь приходит на страницу конкретной.
@@ -1,64 +0,0 @@
1
- ---
2
- name: pricing
3
- kind: rule
4
- law: money
5
- description: Правило под «Закон о деньгах». Брать при правке расчёта цены, скидок, курсов валют, сумм в заказах, письмах и сводках. Называет хранение в целых единицах валюты хранения, единственное округление, выбор одной наибольшей скидки и справочный пересчёт. Готовый код — в паттерне pricing-quote. Чем это названо здесь — в implementation.md рядом.
6
- ---
7
-
8
- # Суммы — как это устроено здесь
9
-
10
- Правило под закон `docs/constitution/application/money.md`. Закон говорит, что должно быть
11
- верно; здесь — каким приёмом это держится. Валюта хранения, набор справочных валют и имена
12
- колонок — при этом дереве, в `implementation.md` рядом.
13
-
14
- ## Как это называется здесь
15
-
16
- | В законе | Здесь |
17
- | ------------- | ---------------------------------------------------------------------------------------------- |
18
- | сумма | целое число единиц валюты хранения; код валюты стоит в имени поля — `total<Код>`, `price<Код>` |
19
- | валюта показа | поле заказа с кодом валюты, в которой пользователь смотрел цену |
20
- | расчёт цены | одна чистая функция: на входе — что заказано, на выходе — подытог, скидка и итог |
21
- | скидка | механики перечислены в `implementation.md`; правило про выбор одно на все |
22
- | курс | кэш в хранилище, обновляется по расписанию |
23
-
24
- ## Где это лежит
25
-
26
- В этом дереве — таблица в `implementation.md` рядом. Пути живут там, а не здесь: правило
27
- переносится между репозиториями, раскладка — нет, и путь, названный в правиле, врёт в первом
28
- же дереве, которое держит код иначе.
29
-
30
- ## Как закон применяется здесь
31
-
32
- - **Сумма хранится в целых единицах валюты хранения.** Дробная часть даёт расхождение между
33
- подытогом и итогом: показанное построчно перестаёт складываться в показанное внизу. Если
34
- дробная часть в предметной области значима, единицей хранения становится она сама.
35
- - **Код валюты стоит в имени поля, а не подразумевается.** Поле `total` без кода читается как
36
- «сумма вообще», и первый же пересчёт кладёт в него чужую валюту.
37
- - **Округление происходит один раз — при расчёте цены.** Сумма на экране, сумма в письме и
38
- сумма в хранилище — одно и то же число, а не три результата одного пересчёта.
39
- - **Из подходящих скидок применяется одна — наибольшая.** Сравниваются они в валюте хранения:
40
- доля и сумма иначе несравнимы.
41
- - **При равной выгоде побеждает та скидка, которую пользователь ввёл руками.** Он ждёт
42
- подтверждения своему действию, а «код не сработал» при той же итоговой цене читается как
43
- поломка.
44
- - **Скидка суммой ограничена подытогом.** Иначе она увела бы цену ниже нуля.
45
- - **Пересчёт в чужую валюту не хранится.** В заказе лежат сумма в валюте хранения и код валюты
46
- показа; само число вычисляется на показ.
47
- - **Оплата идёт в валюте хранения, остальные валюты — справка.** Ни подтверждение, ни документ
48
- не называют справочное число суммой к оплате.
49
- - **Валюта показа следует за пользователем.** Он выбрал её на экране — в письме сумма
50
- пересчитана в неё же.
51
- - **Курс недоступен — сумма показывается в валюте хранения без пересчёта.** Пересчёт по
52
- неизвестно какому курсу хуже отсутствующего: отсутствие видно, а неверный курс — нет.
53
-
54
- ## Паттерны
55
-
56
- - `pricing-quote` — расчёт цены, выбор скидки, работа с курсом.
57
-
58
- ## Ловушки
59
-
60
- - **Курс тянется по расписанию и кэшируется.** Само число в чужой валюте нигде не сохраняется.
61
- - **Дробная сумма в контракте — признак того, что округление уехало на показ.** Округление
62
- одно, и живёт оно в расчёте.
63
- - **Справочная сумма рядом с суммой к оплате читается как цена.** В письме и в документе
64
- справочное число подписывается как справка.
Binary file