agent-quality-kit 0.2.2

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 (137) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +155 -0
  3. package/kit/docs/ai/agent-harness-playbook.md +596 -0
  4. package/kit/docs/ai/ai-native-development.md +371 -0
  5. package/kit/docs/ai/ai-sdlc.md +221 -0
  6. package/kit/docs/ai/anthropic-ai-native-sdlc-2026-08.md +294 -0
  7. package/kit/docs/ai/app-owner-strategy.md +921 -0
  8. package/kit/docs/ai/deep-research-2026-07.md +161 -0
  9. package/kit/docs/ai/harness-best-practices.md +385 -0
  10. package/kit/docs/ai/index.md +64 -0
  11. package/kit/docs/ai/project-baseline.md +261 -0
  12. package/kit/docs/ai/quality-gates-checklist.md +322 -0
  13. package/kit/docs/ai/sources-building-with-agents.md +111 -0
  14. package/kit/docs/ai/stream-2026-08-ai-coding-panel.md +304 -0
  15. package/kit/docs/ready-made-rules.md +170 -0
  16. package/kit/gates/README.md +231 -0
  17. package/kit/gates/_skip.sh +75 -0
  18. package/kit/gates/commit-explains-itself/README.md +45 -0
  19. package/kit/gates/commit-explains-itself/check.sh +63 -0
  20. package/kit/gates/commit-explains-itself/gate.yml +10 -0
  21. package/kit/gates/commit-explains-itself/green/COMMIT_MSG +6 -0
  22. package/kit/gates/commit-explains-itself/red/COMMIT_MSG +3 -0
  23. package/kit/gates/complexity-limit/README.md +37 -0
  24. package/kit/gates/complexity-limit/check.sh +44 -0
  25. package/kit/gates/complexity-limit/gate.yml +13 -0
  26. package/kit/gates/complexity-limit/green/flat.py +10 -0
  27. package/kit/gates/complexity-limit/red/deep.py +9 -0
  28. package/kit/gates/dead-code/README.md +30 -0
  29. package/kit/gates/dead-code/gate.yml +23 -0
  30. package/kit/gates/dead-code/green/mod.py +9 -0
  31. package/kit/gates/dead-code/red/mod.py +9 -0
  32. package/kit/gates/deps-are-pinned/README.md +29 -0
  33. package/kit/gates/deps-are-pinned/check.sh +49 -0
  34. package/kit/gates/deps-are-pinned/gate.yml +9 -0
  35. package/kit/gates/deps-are-pinned/green/nodep-go/go.mod +3 -0
  36. package/kit/gates/deps-are-pinned/green/package-lock.json +3 -0
  37. package/kit/gates/deps-are-pinned/green/package.json +4 -0
  38. package/kit/gates/deps-are-pinned/green/requirements.txt +2 -0
  39. package/kit/gates/deps-are-pinned/red/package.json +4 -0
  40. package/kit/gates/deps-are-pinned/red/requirements.txt +2 -0
  41. package/kit/gates/deps-are-pinned/red/withdep-go/go.mod +5 -0
  42. package/kit/gates/duplicate-code/README.md +40 -0
  43. package/kit/gates/duplicate-code/check.sh +58 -0
  44. package/kit/gates/duplicate-code/gate.yml +12 -0
  45. package/kit/gates/duplicate-code/green/common.py +9 -0
  46. package/kit/gates/duplicate-code/green/use.py +9 -0
  47. package/kit/gates/duplicate-code/red/a.py +12 -0
  48. package/kit/gates/duplicate-code/red/b.py +12 -0
  49. package/kit/gates/entry-links-exist/README.md +22 -0
  50. package/kit/gates/entry-links-exist/check.sh +24 -0
  51. package/kit/gates/entry-links-exist/gate.yml +16 -0
  52. package/kit/gates/entry-links-exist/green/AGENTS.md +5 -0
  53. package/kit/gates/entry-links-exist/green/rules/general.md +3 -0
  54. package/kit/gates/entry-links-exist/red/AGENTS.md +3 -0
  55. package/kit/gates/file-size-limit/README.md +22 -0
  56. package/kit/gates/file-size-limit/check.sh +34 -0
  57. package/kit/gates/file-size-limit/gate.yml +9 -0
  58. package/kit/gates/file-size-limit/green/a.py +251 -0
  59. package/kit/gates/file-size-limit/green/b.py +251 -0
  60. package/kit/gates/file-size-limit/red/big.py +601 -0
  61. package/kit/gates/gate-has-samples/README.md +29 -0
  62. package/kit/gates/gate-has-samples/check.sh +48 -0
  63. package/kit/gates/gate-has-samples/gate.yml +9 -0
  64. package/kit/gates/gate-has-samples/green/.aqk.yml +10 -0
  65. package/kit/gates/gate-has-samples/green/gates/no-print-in-prod/check.sh +2 -0
  66. package/kit/gates/gate-has-samples/green/gates/no-print-in-prod/green/good.py +2 -0
  67. package/kit/gates/gate-has-samples/green/gates/no-print-in-prod/red/bad.py +1 -0
  68. package/kit/gates/gate-has-samples/red/.aqk.yml +10 -0
  69. package/kit/gates/gate-has-samples/red/gates/no-print-in-prod/check.sh +2 -0
  70. package/kit/gates/gates-are-runnable/README.md +23 -0
  71. package/kit/gates/gates-are-runnable/check.sh +35 -0
  72. package/kit/gates/gates-are-runnable/gate.yml +9 -0
  73. package/kit/gates/gates-are-runnable/green/.aqk.yml +9 -0
  74. package/kit/gates/gates-are-runnable/green/checks/lint.sh +2 -0
  75. package/kit/gates/gates-are-runnable/red/.aqk.yml +6 -0
  76. package/kit/gates/gates-run-in-ci/README.md +29 -0
  77. package/kit/gates/gates-run-in-ci/check.sh +42 -0
  78. package/kit/gates/gates-run-in-ci/gate.yml +12 -0
  79. package/kit/gates/gates-run-in-ci/green/.aqk.yml +6 -0
  80. package/kit/gates/gates-run-in-ci/green/.github/workflows/ci.yml +7 -0
  81. package/kit/gates/gates-run-in-ci/green/checks/lint.sh +2 -0
  82. package/kit/gates/gates-run-in-ci/red/.aqk.yml +6 -0
  83. package/kit/gates/gates-run-in-ci/red/.github/workflows/ci.yml +7 -0
  84. package/kit/gates/gates-run-in-ci/red/checks/lint.sh +2 -0
  85. package/kit/gates/lesson-has-outcome/README.md +37 -0
  86. package/kit/gates/lesson-has-outcome/check.sh +50 -0
  87. package/kit/gates/lesson-has-outcome/gate.yml +11 -0
  88. package/kit/gates/lesson-has-outcome/green/.aqk.yml +2 -0
  89. package/kit/gates/lesson-has-outcome/green/incidents/README.md +32 -0
  90. package/kit/gates/lesson-has-outcome/red/.aqk.yml +2 -0
  91. package/kit/gates/lesson-has-outcome/red/incidents/README.md +13 -0
  92. package/kit/gates/no-print-in-prod/README.md +44 -0
  93. package/kit/gates/no-print-in-prod/check.sh +36 -0
  94. package/kit/gates/no-print-in-prod/gate.yml +15 -0
  95. package/kit/gates/no-print-in-prod/green/docs.ts +15 -0
  96. package/kit/gates/no-print-in-prod/green/legacy.py +9 -0
  97. package/kit/gates/no-print-in-prod/green/main.go +8 -0
  98. package/kit/gates/no-print-in-prod/green/main.rs +4 -0
  99. package/kit/gates/no-print-in-prod/green/service.py +8 -0
  100. package/kit/gates/no-print-in-prod/red/main.go +8 -0
  101. package/kit/gates/no-print-in-prod/red/main.rs +4 -0
  102. package/kit/gates/no-print-in-prod/red/service.py +3 -0
  103. package/kit/gates/secrets-not-in-code/README.md +29 -0
  104. package/kit/gates/secrets-not-in-code/check.sh +18 -0
  105. package/kit/gates/secrets-not-in-code/gate.yml +9 -0
  106. package/kit/gates/secrets-not-in-code/green/settings.py +4 -0
  107. package/kit/gates/secrets-not-in-code/red/settings.py +2 -0
  108. package/kit/gates/swallowed-error/README.md +26 -0
  109. package/kit/gates/swallowed-error/check.sh +54 -0
  110. package/kit/gates/swallowed-error/gate.yml +12 -0
  111. package/kit/gates/swallowed-error/green/loader.py +11 -0
  112. package/kit/gates/swallowed-error/green/run.js +8 -0
  113. package/kit/gates/swallowed-error/red/loader.py +5 -0
  114. package/kit/gates/swallowed-error/red/run.js +3 -0
  115. package/kit/gates/todo-without-task/README.md +26 -0
  116. package/kit/gates/todo-without-task/check.sh +19 -0
  117. package/kit/gates/todo-without-task/gate.yml +12 -0
  118. package/kit/gates/todo-without-task/green/order.py +9 -0
  119. package/kit/gates/todo-without-task/red/order.py +8 -0
  120. package/kit/ratchet/ratchet.sh +62 -0
  121. package/kit/rules/general.md +55 -0
  122. package/kit/rules/security.md +33 -0
  123. package/kit/rules/testing.md +46 -0
  124. package/package.json +41 -0
  125. package/tool/commands/doctor.mjs +230 -0
  126. package/tool/commands/gates.mjs +445 -0
  127. package/tool/commands/project.mjs +316 -0
  128. package/tool/lib/core.mjs +98 -0
  129. package/tool/lib/manifest.mjs +140 -0
  130. package/tool/lib/repo.mjs +270 -0
  131. package/tool/lib/templates.mjs +187 -0
  132. package/tool/program.mjs +81 -0
  133. package/tool/selfcheck/conditional.sh +24 -0
  134. package/tool/selfcheck/gates.sh +127 -0
  135. package/tool/selfcheck/smoke.sh +539 -0
  136. package/tool/selfcheck/syntax.sh +23 -0
  137. package/tool/selfcheck/units.mjs +105 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Arsen
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,155 @@
1
+ # AQK — Agent Quality Kit
2
+
3
+ **Стандарт готовности репозитория к тому, что код в нём пишет агент.** Обещание проекта
4
+ становится командой с кодом возврата — и его держит машина, а не чья-то добрая воля.
5
+
6
+ Что вообще должно быть на проекте, чтобы это было возможно, — словами, без привязки к языку и
7
+ инструменту: [«тёмная фабрика» и обязательный минимум](kit/docs/ai/project-baseline.md).
8
+
9
+ ```bash
10
+ npx github:arsen-ask-lx/Agent_Quality_Kit start # кода ещё нет: сторожа дня 0 сразу
11
+ npx github:arsen-ask-lx/Agent_Quality_Kit doctor # код уже есть: уровень и что поставить
12
+ ```
13
+
14
+ **Первый запуск молчит две-три минуты** — `npx` скачивает репозиторий целиком и до конца не
15
+ печатает ничего. Это не зависание, подожди. Дальше команды работают мгновенно.
16
+
17
+ **Что нужно.** Node 18+ и оболочка `sh` — она есть в macOS, Linux и WSL; на Windows подойдёт
18
+ Git Bash. Переносимые проверки написаны на `sh` намеренно: он есть везде, где собирают код.
19
+
20
+ **Не зависит от инструмента:** Claude Code, Codex, Cursor — и без ИИ тоже.
21
+
22
+ При первой установке на машине `init`/`start` один раз печатают ссылку на звезду и на «завести
23
+ Issue» — ничего не постится сама, только текст для человека, и больше не повторяется.
24
+
25
+ **Готовые правила ставятся отдельно и по желанию.** Переносимая проверка работает без них
26
+ всегда; если в проекте стоит `ruff`, `eslint` или `vulture`, запись возьмёт готовое правило —
27
+ оно точнее. Одна запись, `dead-code`, без готового инструмента не работает вовсе и честно
28
+ скрывается: граф вызовов поиском по тексту не построить.
29
+
30
+ ## Как устроено
31
+
32
+ Весь стандарт — файл `.aqk.yml` в корне:
33
+
34
+ ```yaml
35
+ aqk: 1
36
+ entry: [AGENTS.md] # что агент читает первым
37
+ rules: .aqk/rules # где стандарты
38
+ gates: # что обязано пройти — командами, не словами
39
+ lint: "npm run lint"
40
+ secrets-not-in-code: "bash gates/secrets-not-in-code/check.sh ."
41
+ samples: gates # красный и зелёный образец каждой записи
42
+ ratchets: ratchets # реестры долга: список может только укорачиваться
43
+ lessons: incidents # где копятся уроки
44
+ ```
45
+
46
+ Пустое поле — не заглушка, а честный ответ «ступень не пройдена»: `init` кладёт их пустыми,
47
+ а заполняются они по мере того, как появляется чем их заполнить.
48
+
49
+ **Если утверждение нельзя проверить машиной — его в стандарте нет.** Иначе значок означает
50
+ доверие к автору, а не факт.
51
+
52
+ ## Четыре ступени
53
+
54
+ | Уровень | Требуется | Что доказано |
55
+ |---|---|---|
56
+ | **AQK-0** | манифест и точка входа | инструмент знает, что читать |
57
+ | **AQK-1** | правила есть, гейты объявлены командами | проверки исполняются |
58
+ | **AQK-2** | у гейтов красные и зелёные образцы, долг под храповиком | гейт ловит брак и молчит на исправном коде |
59
+ | **AQK-3** | журнал уроков с выводами | шишка не набивается дважды |
60
+
61
+ ```bash
62
+ aqk doctor --run --min 1 # в конвейере: ошибка, если ниже AQK-1 ИЛИ упал хоть один гейт
63
+ ```
64
+
65
+ ## Поставить гейт
66
+
67
+ ```bash
68
+ aqk find "печать в проде" # есть ли уже такой гейт — сверка по намерению
69
+ aqk doctor # что применимо к этому репозиторию и чего нет
70
+ aqk add secrets-not-in-code # копирует проверку и образцы в проект, объявляет в манифесте
71
+ aqk doctor --run # запускает объявленные гейты и показывает результат
72
+ aqk ratchet no-print-in-prod # старое — долг, новое не пускать
73
+ ```
74
+
75
+ Каждый `doctor --run` перезаписывает `.aqk/last-run.md` — короткий отчёт, что из объявленного
76
+ реально сработало и за сколько. Список гейтов в манифесте молчит о том, сколько из них живы
77
+ именно сейчас; отчёт — нет. Файл эфемерный, в `.gitignore` его стоит держать самому.
78
+
79
+ ## Поймал ошибку, которую не поймал сторож
80
+
81
+ ```bash
82
+ aqk why "файл вырос до девяти тысяч строк"
83
+ ```
84
+
85
+ Ответ один из трёх, и выбирает его прогон, а не память: **сторожа не было** · **сторож есть,
86
+ но эту поломку не видит** · **сторож есть и ловит — значит его обошли**. Разница решает, что
87
+ чинить: саму проверку или её место в конвейере. Без прогона эти два случая неразличимы, и
88
+ чинят обычно не тот. При неуверенном совпадении команда не выбирает за тебя, а спрашивает.
89
+
90
+ **Храповик** нужен, когда правило вводят в проект, где старый код ему не соответствует.
91
+ Список нарушений снимается в реестр, гейт разрешает его **укорачивать** и запрещает удлинять.
92
+ Правило действует со дня установки, старый код трогать не надо.
93
+
94
+ `add` **копирует проверку в репозиторий**, а не ссылается на пакет: при установке через `npx`
95
+ пакет временный, и завтра команда в манифесте указывала бы в никуда.
96
+
97
+ ## Каталог обещаний
98
+
99
+ `doctor` смотрит на репозиторий — языки, наличие гейтов — и показывает **только применимое**:
100
+ что уже держит машина, что применимо и не поставлено, что скрыто и почему. Каталог может
101
+ вырасти до сотен записей, конкретный проект по-прежнему увидит десяток.
102
+
103
+ Запись принимается, только если её арбитр краснеет на красном образце, молчит на зелёном и
104
+ назван реальный отказ, который она поймала. Проверяет это машина: `bash tool/selfcheck/gates.sh`.
105
+
106
+ ## Методички одним файлом
107
+
108
+ ```bash
109
+ aqk blob # собирает GOD_AI.md из kit/docs — чтобы разом отдать методички в чат
110
+ ```
111
+
112
+ Файл **собирается, а не хранится**: править надо оригиналы. Копия, которую правят руками, через
113
+ неделю расходится с источником, и непонятно, какая настоящая.
114
+
115
+ ## Принести свой гейт
116
+
117
+ Каталог живёт чужими шишками. Порядок и порог — в [`CONTRIBUTING.md`](CONTRIBUTING.md):
118
+ сверься `aqk find`, заведи заготовку `aqk new`, положи два образца, заполни четыре поля,
119
+ прогони машиной. Отбор делает `tool/selfcheck/gates.sh`, а не рецензент.
120
+
121
+ ## Журнал шишек
122
+
123
+ ```bash
124
+ aqk note "гейт краснел на правильном коде" # запись без раздела «Вывод» не принимается
125
+ ```
126
+
127
+ ## Честно о состоянии
128
+
129
+ Задача целиком — в [`PROJECT.md`](PROJECT.md): что строим, четыре сценария, критерий успеха, что осталось.
130
+
131
+
132
+ Версия 1, один автор. Сам комплект держит **AQK-3**: девятнадцать проверок объявлено и
133
+ прогоняется конвейером, два реестра долга под храповиком. Пока комплектом пользуется один
134
+ человек, AQK — красивое слово в README. Он начнёт работать, когда появится чужой третий проект.
135
+
136
+ **Стандарт нельзя выпустить первым.** Спецификация раньше практики — это тридцать первый
137
+ заброшенный репозиторий с манифестом и нулём пользователей. Порядок обратный:
138
+
139
+ | # | Шаг | Состояние |
140
+ |---|---|---|
141
+ | 1 | живём по этому на своих проектах | ⬜ измерено: у трёх своих проектов манифеста нет, уровень не заведён |
142
+ | 2 | `doctor` считает уровень | ✅ сделано |
143
+ | 3 | сложившееся записано как короткая спецификация | ✅ [`SPEC.md`](SPEC.md) |
144
+ | 4 | третий проект — **чужой** | ❌ первый честный сигнал, его ещё нет |
145
+ | 5 | значок, сайт, разговор с людьми | ❌ только после четвёртого шага |
146
+
147
+ ## Очередь работ
148
+
149
+ Живёт в одном месте — [`PROJECT.md` §9](PROJECT.md). Список здесь не повторяется: два списка через месяц
150
+ расходятся, и непонятно, какой настоящий.
151
+
152
+ Чего нет: второго пользователя; покрытия команд, которые пишут на диск (проверены прогоном на
153
+ чистой папке, но не по отдельности); третьего — чужого — проекта.
154
+
155
+ MIT.