kodu 2.2.0 → 3.0.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.
Files changed (233) hide show
  1. package/README.md +24 -3
  2. package/bin/kodu.js +23 -0
  3. package/package.json +11 -67
  4. package/scripts/postinstall.js +69 -0
  5. package/AGENTS.md +0 -214
  6. package/__tests__/core/fs/fs.service.test.ts +0 -72
  7. package/__tests__/core/registry/registry.service.test.ts +0 -82
  8. package/__tests__/shared/cleaner/cleaner.service.test.ts +0 -102
  9. package/__tests__/shared/git/git.service.test.ts +0 -84
  10. package/__tests__/shared/runbook/runbook.service.test.ts +0 -104
  11. package/__tests__/shared/tokenizer/tokenizer.service.test.ts +0 -45
  12. package/biome.json +0 -50
  13. package/dist/package.json +0 -96
  14. package/dist/src/app.module.d.ts +0 -2
  15. package/dist/src/app.module.js +0 -42
  16. package/dist/src/app.module.js.map +0 -1
  17. package/dist/src/commands/clean/clean.command.d.ts +0 -37
  18. package/dist/src/commands/clean/clean.command.js +0 -240
  19. package/dist/src/commands/clean/clean.command.js.map +0 -1
  20. package/dist/src/commands/clean/clean.module.d.ts +0 -2
  21. package/dist/src/commands/clean/clean.module.js +0 -26
  22. package/dist/src/commands/clean/clean.module.js.map +0 -1
  23. package/dist/src/commands/init/init.command.d.ts +0 -10
  24. package/dist/src/commands/init/init.command.js +0 -96
  25. package/dist/src/commands/init/init.command.js.map +0 -1
  26. package/dist/src/commands/init/init.module.d.ts +0 -2
  27. package/dist/src/commands/init/init.module.js +0 -22
  28. package/dist/src/commands/init/init.module.js.map +0 -1
  29. package/dist/src/commands/ops/ops-add.command.d.ts +0 -18
  30. package/dist/src/commands/ops/ops-add.command.js +0 -102
  31. package/dist/src/commands/ops/ops-add.command.js.map +0 -1
  32. package/dist/src/commands/ops/ops-init.command.d.ts +0 -22
  33. package/dist/src/commands/ops/ops-init.command.js +0 -130
  34. package/dist/src/commands/ops/ops-init.command.js.map +0 -1
  35. package/dist/src/commands/ops/ops-list.command.d.ts +0 -12
  36. package/dist/src/commands/ops/ops-list.command.js +0 -73
  37. package/dist/src/commands/ops/ops-list.command.js.map +0 -1
  38. package/dist/src/commands/ops/ops-path.command.d.ts +0 -9
  39. package/dist/src/commands/ops/ops-path.command.js +0 -52
  40. package/dist/src/commands/ops/ops-path.command.js.map +0 -1
  41. package/dist/src/commands/ops/ops-runbook.command.d.ts +0 -12
  42. package/dist/src/commands/ops/ops-runbook.command.js +0 -81
  43. package/dist/src/commands/ops/ops-runbook.command.js.map +0 -1
  44. package/dist/src/commands/ops/ops-status.command.d.ts +0 -11
  45. package/dist/src/commands/ops/ops-status.command.js +0 -62
  46. package/dist/src/commands/ops/ops-status.command.js.map +0 -1
  47. package/dist/src/commands/ops/ops-use.command.d.ts +0 -12
  48. package/dist/src/commands/ops/ops-use.command.js +0 -76
  49. package/dist/src/commands/ops/ops-use.command.js.map +0 -1
  50. package/dist/src/commands/ops/ops.command.d.ts +0 -7
  51. package/dist/src/commands/ops/ops.command.js +0 -56
  52. package/dist/src/commands/ops/ops.command.js.map +0 -1
  53. package/dist/src/commands/ops/ops.helpers.d.ts +0 -2
  54. package/dist/src/commands/ops/ops.helpers.js +0 -11
  55. package/dist/src/commands/ops/ops.helpers.js.map +0 -1
  56. package/dist/src/commands/ops/ops.module.d.ts +0 -2
  57. package/dist/src/commands/ops/ops.module.js +0 -36
  58. package/dist/src/commands/ops/ops.module.js.map +0 -1
  59. package/dist/src/commands/pack/pack.command.d.ts +0 -51
  60. package/dist/src/commands/pack/pack.command.js +0 -355
  61. package/dist/src/commands/pack/pack.command.js.map +0 -1
  62. package/dist/src/commands/pack/pack.module.d.ts +0 -2
  63. package/dist/src/commands/pack/pack.module.js +0 -27
  64. package/dist/src/commands/pack/pack.module.js.map +0 -1
  65. package/dist/src/core/config/config.module.d.ts +0 -2
  66. package/dist/src/core/config/config.module.js +0 -23
  67. package/dist/src/core/config/config.module.js.map +0 -1
  68. package/dist/src/core/config/config.schema.d.ts +0 -19
  69. package/dist/src/core/config/config.schema.js +0 -56
  70. package/dist/src/core/config/config.schema.js.map +0 -1
  71. package/dist/src/core/config/config.service.d.ts +0 -7
  72. package/dist/src/core/config/config.service.js +0 -49
  73. package/dist/src/core/config/config.service.js.map +0 -1
  74. package/dist/src/core/config/prompt.service.d.ts +0 -10
  75. package/dist/src/core/config/prompt.service.js +0 -80
  76. package/dist/src/core/config/prompt.service.js.map +0 -1
  77. package/dist/src/core/file-system/fs.module.d.ts +0 -2
  78. package/dist/src/core/file-system/fs.module.js +0 -21
  79. package/dist/src/core/file-system/fs.module.js.map +0 -1
  80. package/dist/src/core/file-system/fs.service.d.ts +0 -27
  81. package/dist/src/core/file-system/fs.service.js +0 -203
  82. package/dist/src/core/file-system/fs.service.js.map +0 -1
  83. package/dist/src/core/registry/registry.module.d.ts +0 -2
  84. package/dist/src/core/registry/registry.module.js +0 -22
  85. package/dist/src/core/registry/registry.module.js.map +0 -1
  86. package/dist/src/core/registry/registry.schema.d.ts +0 -24
  87. package/dist/src/core/registry/registry.schema.js +0 -21
  88. package/dist/src/core/registry/registry.schema.js.map +0 -1
  89. package/dist/src/core/registry/registry.service.d.ts +0 -16
  90. package/dist/src/core/registry/registry.service.js +0 -91
  91. package/dist/src/core/registry/registry.service.js.map +0 -1
  92. package/dist/src/core/ui/ui.module.d.ts +0 -2
  93. package/dist/src/core/ui/ui.module.js +0 -22
  94. package/dist/src/core/ui/ui.module.js.map +0 -1
  95. package/dist/src/core/ui/ui.service.d.ts +0 -22
  96. package/dist/src/core/ui/ui.service.js +0 -43
  97. package/dist/src/core/ui/ui.service.js.map +0 -1
  98. package/dist/src/main.d.ts +0 -2
  99. package/dist/src/main.js +0 -16
  100. package/dist/src/main.js.map +0 -1
  101. package/dist/src/shared/cleaner/cleaner.service.d.ts +0 -23
  102. package/dist/src/shared/cleaner/cleaner.service.js +0 -223
  103. package/dist/src/shared/cleaner/cleaner.service.js.map +0 -1
  104. package/dist/src/shared/cleaner/cleaner.types.d.ts +0 -21
  105. package/dist/src/shared/cleaner/cleaner.types.js +0 -3
  106. package/dist/src/shared/cleaner/cleaner.types.js.map +0 -1
  107. package/dist/src/shared/constants.d.ts +0 -4
  108. package/dist/src/shared/constants.js +0 -113
  109. package/dist/src/shared/constants.js.map +0 -1
  110. package/dist/src/shared/deps/deps.module.d.ts +0 -2
  111. package/dist/src/shared/deps/deps.module.js +0 -21
  112. package/dist/src/shared/deps/deps.module.js.map +0 -1
  113. package/dist/src/shared/deps/deps.service.d.ts +0 -15
  114. package/dist/src/shared/deps/deps.service.js +0 -114
  115. package/dist/src/shared/deps/deps.service.js.map +0 -1
  116. package/dist/src/shared/git/git.module.d.ts +0 -2
  117. package/dist/src/shared/git/git.module.js +0 -21
  118. package/dist/src/shared/git/git.module.js.map +0 -1
  119. package/dist/src/shared/git/git.service.d.ts +0 -5
  120. package/dist/src/shared/git/git.service.js +0 -56
  121. package/dist/src/shared/git/git.service.js.map +0 -1
  122. package/dist/src/shared/runbook/runbook.module.d.ts +0 -2
  123. package/dist/src/shared/runbook/runbook.module.js +0 -22
  124. package/dist/src/shared/runbook/runbook.module.js.map +0 -1
  125. package/dist/src/shared/runbook/runbook.service.d.ts +0 -20
  126. package/dist/src/shared/runbook/runbook.service.js +0 -118
  127. package/dist/src/shared/runbook/runbook.service.js.map +0 -1
  128. package/dist/src/shared/runbook/runbook.templates.d.ts +0 -6
  129. package/dist/src/shared/runbook/runbook.templates.js +0 -49
  130. package/dist/src/shared/runbook/runbook.templates.js.map +0 -1
  131. package/dist/src/shared/tokenizer/tokenizer.module.d.ts +0 -2
  132. package/dist/src/shared/tokenizer/tokenizer.module.js +0 -21
  133. package/dist/src/shared/tokenizer/tokenizer.module.js.map +0 -1
  134. package/dist/src/shared/tokenizer/tokenizer.service.d.ts +0 -10
  135. package/dist/src/shared/tokenizer/tokenizer.service.js +0 -36
  136. package/dist/src/shared/tokenizer/tokenizer.service.js.map +0 -1
  137. package/dist/tsconfig.build.tsbuildinfo +0 -1
  138. package/docs/todo.md +0 -7
  139. package/knip.json +0 -10
  140. package/kodu.json +0 -63
  141. package/kodu.schema.json +0 -100
  142. package/lefthook.yml +0 -11
  143. package/nest-cli.json +0 -8
  144. package/registry.schema.json +0 -39
  145. package/scripts/generate-json-schema.ts +0 -27
  146. package/skills/ac/SKILL.md +0 -239
  147. package/skills/al/SKILL.md +0 -98
  148. package/skills/audit/SKILL.md +0 -205
  149. package/skills/audit/audit-baseline-template.yml +0 -188
  150. package/skills/audit/runtime-detect.md +0 -64
  151. package/skills/audit/stacks/_generic.md +0 -41
  152. package/skills/audit/stacks/_registry.md +0 -47
  153. package/skills/audit/stacks/go.md +0 -66
  154. package/skills/audit/stacks/java.md +0 -44
  155. package/skills/audit/stacks/node.md +0 -57
  156. package/skills/audit/stacks/python.md +0 -45
  157. package/skills/audit/stacks/rust.md +0 -44
  158. package/skills/audit-api-contracts/SKILL.md +0 -201
  159. package/skills/audit-architecture/SKILL.md +0 -200
  160. package/skills/audit-bugs/SKILL.md +0 -226
  161. package/skills/audit-concurrency/SKILL.md +0 -197
  162. package/skills/audit-deployment/SKILL.md +0 -218
  163. package/skills/audit-docs/SKILL.md +0 -209
  164. package/skills/audit-errors/SKILL.md +0 -216
  165. package/skills/audit-logging/SKILL.md +0 -197
  166. package/skills/audit-matrix/SKILL.md +0 -245
  167. package/skills/audit-meta/SKILL.md +0 -120
  168. package/skills/audit-naming/SKILL.md +0 -200
  169. package/skills/audit-owasp/SKILL.md +0 -223
  170. package/skills/audit-performance/SKILL.md +0 -199
  171. package/skills/audit-reinvention/SKILL.md +0 -214
  172. package/skills/audit-secrets/SKILL.md +0 -198
  173. package/skills/audit-tests/SKILL.md +0 -210
  174. package/skills/audit-validation/SKILL.md +0 -206
  175. package/skills/audit-verify/SKILL.md +0 -139
  176. package/skills/audit-yagni/SKILL.md +0 -188
  177. package/skills/doc-gen/SKILL.md +0 -490
  178. package/skills/doc-gen/scripts/doc_gen.py +0 -911
  179. package/skills/generate-project-docs/SKILL.md +0 -380
  180. package/skills/implement-project/SKILL.md +0 -409
  181. package/skills/liteend-init/SKILL.md +0 -84
  182. package/skills/litefront-init/SKILL.md +0 -96
  183. package/skills/litefront-prototype/SKILL.md +0 -484
  184. package/skills/ops/SKILL.md +0 -94
  185. package/skills/post-call-task-builder/SKILL.md +0 -419
  186. package/skills/project-setup-standardizer/SKILL.md +0 -285
  187. package/skills/skills-best-practices/SKILL.md +0 -415
  188. package/skills/start/SKILL.md +0 -319
  189. package/skills/tech-blueprint/SKILL.md +0 -890
  190. package/skills/tech-blueprint/scripts/blueprint_validator.py +0 -417
  191. package/src/app.module.ts +0 -29
  192. package/src/commands/clean/clean.command.ts +0 -235
  193. package/src/commands/clean/clean.module.ts +0 -13
  194. package/src/commands/init/init.command.ts +0 -92
  195. package/src/commands/init/init.module.ts +0 -9
  196. package/src/commands/ops/ops-add.command.ts +0 -83
  197. package/src/commands/ops/ops-init.command.ts +0 -125
  198. package/src/commands/ops/ops-list.command.ts +0 -57
  199. package/src/commands/ops/ops-path.command.ts +0 -38
  200. package/src/commands/ops/ops-runbook.command.ts +0 -74
  201. package/src/commands/ops/ops-status.command.ts +0 -47
  202. package/src/commands/ops/ops-use.command.ts +0 -76
  203. package/src/commands/ops/ops.command.ts +0 -42
  204. package/src/commands/ops/ops.helpers.ts +0 -20
  205. package/src/commands/ops/ops.module.ts +0 -23
  206. package/src/commands/pack/pack.command.ts +0 -347
  207. package/src/commands/pack/pack.module.ts +0 -14
  208. package/src/core/config/config.module.ts +0 -10
  209. package/src/core/config/config.schema.ts +0 -58
  210. package/src/core/config/config.service.ts +0 -43
  211. package/src/core/config/prompt.service.ts +0 -80
  212. package/src/core/file-system/fs.module.ts +0 -8
  213. package/src/core/file-system/fs.service.ts +0 -248
  214. package/src/core/registry/registry.module.ts +0 -9
  215. package/src/core/registry/registry.schema.ts +0 -46
  216. package/src/core/registry/registry.service.ts +0 -128
  217. package/src/core/ui/ui.module.ts +0 -9
  218. package/src/core/ui/ui.service.ts +0 -39
  219. package/src/main.ts +0 -12
  220. package/src/shared/cleaner/cleaner.service.ts +0 -289
  221. package/src/shared/cleaner/cleaner.types.ts +0 -23
  222. package/src/shared/constants.ts +0 -118
  223. package/src/shared/deps/deps.module.ts +0 -8
  224. package/src/shared/deps/deps.service.ts +0 -175
  225. package/src/shared/git/git.module.ts +0 -8
  226. package/src/shared/git/git.service.ts +0 -47
  227. package/src/shared/runbook/runbook.module.ts +0 -9
  228. package/src/shared/runbook/runbook.service.ts +0 -164
  229. package/src/shared/runbook/runbook.templates.ts +0 -66
  230. package/src/shared/tokenizer/tokenizer.module.ts +0 -8
  231. package/src/shared/tokenizer/tokenizer.service.ts +0 -30
  232. package/tsconfig.build.json +0 -7
  233. package/tsconfig.json +0 -28
@@ -1,206 +0,0 @@
1
- ---
2
- name: audit-validation
3
- description: >
4
- Аудит валидации граничных данных: проверка входящих данных на границах системы,
5
- отсутствие sanitization, trust boundary нарушения. Запускай при /audit-validation.
6
- ---
7
-
8
- ## Правило применимости (Relevance Rule)
9
-
10
- Применим к коду, принимающему внешние данные: HTTP handlers, WebSocket, CLI args, file parsers, event consumers, gRPC endpoints. Для чисто внутреннего кода без внешних входов — верни пустой ответ.
11
-
12
- ## Runtime Detection & Stack Profile
13
-
14
- Этот аудит стек-агностичен: проверки сформулированы нейтрально, а конкретика
15
- (инструменты, идиомы, анти-паттерны, примеры) берётся из профиля стека.
16
-
17
- 1. **Профиль передан контекстом?** Если оркестратор `/audit` передал
18
- `runtime=<id>` и/или содержимое профиля — используй его, шаги 2–3 пропусти.
19
-
20
- 2. **Иначе определи РОВНО ОДИН рантайм** этого каталога:
21
- ```bash
22
- if [ -f package.json ]; then echo "runtime=node"
23
- elif [ -f go.mod ]; then echo "runtime=go"
24
- elif [ -f pyproject.toml ] || [ -f requirements.txt ] || [ -f setup.py ]; then echo "runtime=python"
25
- elif [ -f Cargo.toml ]; then echo "runtime=rust"
26
- elif [ -f pom.xml ] || ls build.gradle* settings.gradle* >/dev/null 2>&1; then echo "runtime=java"
27
- else echo "runtime=generic"; fi
28
- ```
29
- Один запуск = один рантайм; не миксуй backend и frontend. Если найдено
30
- несколько маркеров (монорепо) — выбери соответствующий текущему scope/анализируемым
31
- файлам и зафиксируй выбор в разделе Audit Coverage.
32
-
33
- 3. **Загрузи профиль** через Read: `./skills/audit/stacks/<runtime>.md`
34
- (fallback `./skills/audit/stacks/_generic.md`, если файл не найден).
35
-
36
- Дальше используй профиль:
37
- - **Инструменты** — из секции «Tooling by category» профиля (раздел
38
- «Инструментальная поддержка» ниже ссылается на категории, а не на команды).
39
- - **Ожидания PASS** — из «Idioms»; **формулировки FAIL** — из «Anti-patterns».
40
- - **Точечные подсказки** — из «Check-ID hints» по префиксу `VAL-`.
41
- - Если профиль `tier: general` или `runtime=generic` → стек-специфичные находки
42
- без однозначного evidence помечай `🔍 UNVERIFIED`, а не `❌ FAIL`. Проверки,
43
- чей механизм в рантайме отсутствует, помечай `N/A`.
44
-
45
- ## Severity Guide
46
-
47
- | Severity | Критерий назначения |
48
- |----------|---------------------|
49
- | 🔴 Critical | RCE, auth bypass, data corruption, необратимый финансовый риск |
50
- | 🟠 High | Падение production, privilege escalation, утечка данных |
51
- | 🟡 Medium | Деградация производительности или поддерживаемости без immediate outage |
52
- | 🟢 Low | Стиль, читаемость, слабое нарушение конвенции |
53
-
54
- Правило: severity = impact × exploitability × blast radius. Одинаковый паттерн → одинаковый severity между аудитами.
55
-
56
- ## Чеклист
57
-
58
- | Check ID | Проверка |
59
- |----------|----------|
60
- | VAL-01 | Все входящие данные (body, params, query) проходят schema-валидацию |
61
- | VAL-02 | Строки имеют maxLength, числа — диапазон, enum-значения — whitelist |
62
- | VAL-03 | Парсинг недоверенного ввода обрабатывает ошибки и валидирует структуру результата |
63
- | VAL-04 | Identity данные берутся из аутентифицированного контекста (не из user input) |
64
- | VAL-05 | Вложенные структуры и массивы ограничены (глубина, minItems/maxItems) |
65
- | VAL-06 | Валидатор не выполняет неявный coercion (строка "false" → boolean true) [⚡ dynamic] |
66
- | VAL-07 | Prototype pollution: merge/assign с user input фильтрует `__proto__`, `constructor`, `prototype` |
67
- | VAL-08 | Загрузка файлов: MIME тип проверяется по содержимому, имя файла санитизировано, размер ограничен |
68
-
69
- ## Правила верификации
70
-
71
- 1. **Только чеклист**: оценивай ТОЛЬКО проверки выше. Не добавляй новые.
72
- 2. **Явная верификация = PASS**: ставь `✅ PASS` только если явно проверил механизм (нашёл схему, конфиг, guard) и подтвердил отсутствие нарушения — укажи что именно проверено.
73
- 3. **Нет доказательства = UNVERIFIED**: не можешь указать `файл:строка` ни для нарушения, ни для подтверждения — ставь `🔍 UNVERIFIED`.
74
- - Проверки с `[⚡ dynamic]` нельзя статически подтвердить — только `🔍 UNVERIFIED` или `❌ FAIL` (при явном evidence), но не `✅ PASS`
75
- 4. **Baseline приоритетен**: check_id есть в `docs/audit-baseline.yml` → `⏸ ACCEPTED`.
76
- 5. **Только 🔴/🟠 FAIL требуют решения**: 🟡/🟢 — решение необязательно.
77
-
78
- ## Evidence Quality Rules
79
-
80
- Любой `❌ FAIL` обязан содержать:
81
- - Точный `file:line`
82
- - Минимальный код-фрагмент (1–3 строки)
83
- - Causal chain: почему именно это нарушение → какой риск возникает
84
-
85
- Запрещено:
86
- - Предполагать runtime behavior без evidence в коде
87
- - Предполагать prod-конфигурацию по dev-конфигу
88
- - Предполагать отсутствие middleware без проверки всей router chain
89
- - Если вывод основан на предположении — только `🔍 UNVERIFIED`
90
-
91
- ## Language Rule
92
-
93
- Результаты аудита должны быть написаны простым и понятным языком. Избегай сложных терминов, жаргона и абстрактных понятий без необходимости. Общепринятые технические термины (Docker, HTTP, API, JSON, URL) допустимы. Описывай проблемы так, чтобы они были понятны разработчику любого уровня, а не только узкому специалисту в данной области.
94
-
95
- ## Baseline
96
-
97
- До анализа:
98
- ```bash
99
- if [ ! -f ./docs/audit-baseline.yml ]; then
100
- mkdir -p ./docs
101
- cp ./skills/audit/audit-baseline-template.yml ./docs/audit-baseline.yml 2>/dev/null || \
102
- printf "accepted: []\n" > ./docs/audit-baseline.yml
103
- fi
104
- cat ./docs/audit-baseline.yml
105
- ```
106
-
107
- ## Контекст анализа
108
-
109
- **VAL-01 — Все входящие данные проходят schema-валидацию:**
110
- - HTTP request body используется напрямую без schema-валидации (Node: zod/joi/yup/etc; Go: проверка в resolver/handler — go-playground/validator или ручная проверка; gqlgen типизирует вход на уровне схемы, но прикладные инварианты всё равно проверяй)
111
- - Query params / path params используются без типизации и проверки
112
- - Отсутствие проверки обязательных полей
113
- - Нет валидации типов (строка может прийти вместо числа)
114
- - WebSocket, CLI args, event payloads без валидации входных данных
115
-
116
- **VAL-02 — Строки, числа, enum ограничены:**
117
- - Отсутствие maxLength для строк (DoS через огромную строку)
118
- - Нет проверки диапазонов чисел (отрицательные ID, огромные offset, NaN)
119
- - Отсутствие whitelist для enum-полей (принимается любое строковое значение)
120
- - Нет проверки формата (email, UUID, дата) там где она применима
121
-
122
- **VAL-03 — Парсинг недоверенного ввода с защитой:**
123
- - Node: `JSON.parse` без try/catch — выбросит SyntaxError при невалидном input
124
- - Go: `json.Unmarshal` / парсинг без проверки возвращаемой ошибки (err проигнорирован)
125
- - Парсинг без последующей валидации структуры (тип полей не проверен)
126
- - Доверие структуре распарсенного результата без schema-проверки
127
-
128
- **VAL-04 — Identity из аутентифицированного контекста:**
129
- - JWT claims используются без верификации подписи
130
- - User ID берётся из тела запроса вместо `req.user` / аутентифицированного контекста
131
- - Данные о ролях/правах берутся из user-controlled input
132
- - Массовое присваивание: объект из body напрямую сохраняется в БД без whitelist полей
133
-
134
- **Вложенность и коллекции:**
135
- - Рекурсивные/глубоко вложенные схемы без ограничения глубины → ReDoS / stack overflow
136
- - Массивы без maxItems → неограниченный рост payload
137
- - Вложенные объекты без maxProperties
138
-
139
- **Coercion:**
140
- - Zod: `.coerce.boolean()` принимает строку "false" как true
141
- - Joi: без `.options({ convert: false })` неявно кастует типы
142
- - express-validator: без explicit type checks принимает "1" как число 1
143
-
144
- **VAL-07 — Prototype pollution:**
145
- - Преимущественно JS-специфично (`__proto__`/`constructor`/`prototype`). В Go prototype pollution неприменим (нет прототипной модели объектов) → для Go-рантайма помечай VAL-07 как `N/A`. Концепт ниже актуален для Node:
146
- - `Object.assign(target, userInput)` без проверки — ключ `__proto__` загрязняет Object.prototype
147
- - `_.merge(obj, userInput)` в lodash < 4.17.21 — уязвим к prototype pollution
148
- - Deep merge из user input без sanitize ключей (`constructor`, `prototype`, `__proto__`)
149
- - Последствие: `({}).isAdmin === true` для всех объектов после атаки
150
-
151
- **VAL-08 — Безопасная загрузка файлов:**
152
- - Проверка типа только через `file.mimetype` — значение подставлено клиентом, не верифицировано
153
- - `path.join(uploadDir, file.originalname)` — `originalname` может содержать path traversal (`../../../etc/passwd`)
154
- - Нет ограничения `maxFileSize` — DoS через огромный файл
155
- - Разрешённые расширения не ограничены — возможна загрузка исполняемых файлов (.sh, .exe, .php)
156
-
157
- ## Граница с другими аудитами
158
-
159
- - **Validation** — этот скилл первичный. `audit-owasp` и `audit-bugs` ссылаются сюда при находках типа "missing input check".
160
- - **User ID из auth контекста** — VAL-04 первичный. `audit-owasp` (IDOR) — вторичный.
161
-
162
- ## Формат вывода
163
-
164
- | Check ID | Проверка | Статус | Уверенность | Доказательство | Решение | Исправлено |
165
- |----------|----------|--------|-------------|----------------|---------|------------|
166
- | VAL-01 | Все входящие данные (body, params, query) проходят schema-валидацию | ✅ PASS | High | `handlers/` — все routes используют zod-схемы | — | — |
167
- | VAL-02 | Строки имеют maxLength, числа — диапазон, enum-значения — whitelist | ❌ FAIL 🟠 | High | `handlers/user.ts:22` | **1. Добавить maxLength в zod-схему** \\ 2. Ручная проверка длины в handler \\ 3. Ограничение на уровне БД | Нет |
168
- | VAL-04 | Identity данные берутся из аутентифицированного контекста (не из user input) | ⏸ ACCEPTED | Medium | `routes/order.ts:9` | В baseline: legacy endpoint, запланирован рефактор | — |
169
-
170
- Статусы: `✅ PASS` / `❌ FAIL 🔴` / `❌ FAIL 🟠` / `❌ FAIL 🟡` / `❌ FAIL 🟢` / `⏸ ACCEPTED` / `🔍 UNVERIFIED`
171
-
172
- Уверенность: `High` — проверил несколько ключевых файлов, паттерн очевиден / `Medium` — проверил выборочно, паттерн вероятен / `Low` — ограниченный контекст, полная уверенность невозможна
173
-
174
- Для `❌ FAIL`: ровно 3 варианта решения, разделитель `\\`, вариант 1 жирным.
175
-
176
- `Исправлено`: FAIL → `Нет` (разработчик меняет на `✅ Да` вручную после фикса). PASS / ACCEPTED / UNVERIFIED → `—`.
177
-
178
- Требования к решениям:
179
- - Взаимно исключающие (не перефразировки одного и того же)
180
- - Соответствуют текущему стеку проекта (не предлагать смену фреймворка)
181
- - Не требуют переписать всю систему — realistic migration cost
182
- - Вариант 3 может быть «оставить, задокументировать причину» при наличии обоснования
183
-
184
- В конце отчёта добавь раздел покрытия:
185
- ```
186
- ## Audit Coverage
187
- Проверено: src/module1/**, src/module2/**
188
- Пропущено: scripts/**, migrations/**, tests/**
189
- Файлов проверено: N | Пропущено: N
190
- ```
191
-
192
- Если все PASS — выведи: `✅ Валидация граничных данных реализована корректно.`
193
-
194
- ## Сохранение результатов
195
-
196
- 1. Найди папку сессии:
197
- ```bash
198
- ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
199
- ```
200
- Если пусто — создай: `mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")`
201
- 2. Сохрани через Write: `<AUDIT_DIR>/audit-validation.md`
202
-
203
- ```
204
- # Audit Report: Boundary Data Validation — <YYYY-MM-DD HH:MM>
205
- <таблица>
206
- ```
@@ -1,139 +0,0 @@
1
- ---
2
- name: audit-verify
3
- description: >
4
- Финальная верификация всех проведённых аудитов: проверяет соответствие находок реальному коду,
5
- устраняет false positives, добавляет пропущенные критические риски, исправляет аудит-документы.
6
- Вызывай ПОСЛЕДНИМ после всех аудитов — /audit-verify или в конце /audit.
7
- ---
8
-
9
- ## Задача
10
-
11
- Ты — старший инженер по безопасности и качеству, проводящий финальную верификацию результатов аудита. Твоя цель: убедиться, что каждая находка реально существует в коде, а не является галлюцинацией или устаревшим артефактом.
12
-
13
- ## Шаг 1 — Сбор аудит-документов
14
-
15
- 1. Найди папку последней сессии через Bash:
16
- ```bash
17
- ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
18
- ```
19
- 2. Прочитай все `*.md` файлы из этой папки через Read.
20
-
21
- Если папка не найдена — сообщи пользователю: `⚠️ Аудит-документы не найдены. Сначала выполни аудит.` и завершай работу.
22
-
23
- ## Шаг 1.5 — Проверка актуальности аудита
24
-
25
- ```bash
26
- SESSION_DIR=$(ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||')
27
- SESSION_DATE=$(basename "$SESSION_DIR" | cut -c1-10)
28
- DAYS_OLD=$(( ($(date +%s) - $(date -d "$SESSION_DATE" +%s 2>/dev/null || date -j -f "%Y-%m-%d" "$SESSION_DATE" +%s 2>/dev/null || echo 0)) / 86400 ))
29
- echo "Audit age: $DAYS_OLD days (stale after 30)"
30
- ```
31
-
32
- Если `$DAYS_OLD > 30` — добавь в итоговый отчёт:
33
- ```
34
- ⚠️ STALE AUDIT — отчёт создан N дней назад. Код мог измениться. Рекомендуется повторный аудит.
35
- ```
36
-
37
- ## Шаг 2 — Верификация каждой находки
38
-
39
- Для каждой строки в каждой аудит-таблице выполни следующую проверку:
40
-
41
- ### 2.1 Проверка существования файла и строки
42
-
43
- - Извлеки `файл:строка` из колонки «Сценарий».
44
- - Открой файл через Read (с указанием offset и limit вокруг строки).
45
- - Убедись, что указанный код реально существует.
46
-
47
- ### 2.2 Классификация находки
48
-
49
- | Статус | Условие |
50
- |--------|---------|
51
- | ✅ **Подтверждено** | Код существует, риск актуален |
52
- | ❌ **False Positive** | Файл/строка не существует, или код не соответствует описанию |
53
- | ⚠️ **Устарело** | Код существует, но риск уже устранён (защита добавлена) |
54
- | 🔍 **Пропущено** | В ходе верификации обнаружен критический риск, не попавший в исходный аудит |
55
-
56
- ### 2.3 Проверка критических рисков (🔴)
57
-
58
- Для каждого 🔴 Критического риска дополнительно:
59
- - Прочитай весь контекст функции/класса (±30 строк).
60
- - Убедись, что в ближайшем коде нет существующих мер защиты, которые аудит не учёл.
61
- - Проверь, нет ли аналогичного паттерна в соседних файлах (grep по директории).
62
-
63
- ### 2.4 Проверка срока действия baseline
64
-
65
- Для каждой `⏸ ACCEPTED` записи в аудит-файлах:
66
- 1. Найди соответствующую запись в `docs/audit-baseline.yml`.
67
- 2. Если поле `expires` заполнено и дата прошла — статус автоматически меняется на `❌ FAIL 🟠` с пометкой `[baseline expired: <дата>]`.
68
- 3. Если поле `expires` отсутствует — оставляй `⏸ ACCEPTED` (бессрочное исключение).
69
-
70
- ## Шаг 3 — Исправление аудит-документов
71
-
72
- Для каждого файла с найденными проблемами:
73
-
74
- 1. **Удали** строки с `❌ False Positive` — они засоряют отчёт.
75
- 2. **Пометь** строки с `⚠️ Устарело` — добавь в колонку «Статус» значение `[✓ устарело]`.
76
- 3. **Добавь** строки с `🔍 Пропущено` в соответствующий аудит-файл.
77
- 4. Перезапиши файл через Write с исправленным содержимым.
78
- 5. **Истёкшие ACCEPTED** строки — измени статус с `⏸ ACCEPTED` на `❌ FAIL 🟠 [baseline expired: YYYY-MM-DD]` и удали из колонки «Решение» ссылку на baseline.
79
- 6. **Устаревшие ссылки** — если файл или строка из FAIL/ACCEPTED записи больше не существует (рефакторинг), удали запись из отчёта с пометкой в лог: `[removed: <file> not found]`.
80
-
81
- Если файл не требует изменений — не перезаписывай его.
82
-
83
- ## Шаг 4 — Отчёт верификации
84
-
85
- Выведи итоговый отчёт верификации:
86
-
87
- ```
88
- ## Результаты верификации
89
-
90
- | Аудит-файл | ✅ Подтверждено | ❌ False Positive | ⚠️ Устарело | 🔍 Пропущено |
91
- |------------|---------------|-----------------|------------|-------------|
92
- | audit-secrets | N | N | N | N |
93
- | audit-owasp | N | N | N | N |
94
- | ... | N | N | N | N |
95
- | **ИТОГО** | **N** | **N** | **N** | **N** |
96
-
97
- ### Исправленные документы
98
- - `<SESSION>/audit-<name>.md` — удалено N false positives, добавлено N пропущенных
99
- - ...
100
-
101
- ### Пропущенные критические риски
102
- [Список новых 🔴-рисков с файл:строка, если найдены]
103
- ```
104
-
105
- ## Шаг 5 — Сохранение отчёта верификации
106
-
107
- 1. Найди папку текущей сессии через Bash:
108
- ```bash
109
- ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
110
- ```
111
- Если вывод пустой — создай новую: `mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")` и используй её путь.
112
- 2. Сохрани отчёт через Write в файл: `<AUDIT_DIR>/audit-verify.md`
113
-
114
- Структура файла:
115
- ```
116
- # Audit Verification Report — <YYYY-MM-DD HH:MM>
117
-
118
- ## Результаты верификации
119
- <таблица из Шага 4>
120
-
121
- ### Исправленные документы
122
- <список>
123
-
124
- ### Пропущенные критические риски
125
- <список или "Не обнаружено">
126
- ```
127
-
128
- Сообщи пользователю путь к папке сессии и краткое резюме: сколько false positives удалено, сколько рисков добавлено.
129
-
130
- ## Правила
131
-
132
- - Не придумывай новые риски — только подтверждай или опровергай существующие, плюс очевидные пропуски в проверенном коде.
133
- - Не изменяй уровни риска (🔴/🟠/🟡/🟢) у подтверждённых находок.
134
- - Не редактируй колонку «Варианты решений» у подтверждённых находок.
135
- - Если файл аудита содержит только `✅ ... не обнаружено` — верификация для него не нужна, пропусти.
136
-
137
- ## Language Rule
138
-
139
- Результаты аудита должны быть написаны простым и понятным языком. Избегай сложных терминов, жаргона и абстрактных понятий без необходимости. Общепринятые технические термины (Docker, HTTP, API, JSON, URL) допустимы. Описывай проблемы так, чтобы они были понятны разработчику любого уровня, а не только узкому специалисту в данной области.
@@ -1,188 +0,0 @@
1
- ---
2
- name: audit-yagni
3
- description: >
4
- Аудит over-engineering и YAGNI: лишние абстракции, преждевременная оптимизация,
5
- неиспользуемый код. Запускай при /audit-yagni или запросе найти переусложнения.
6
- ---
7
-
8
- ## Правило применимости (Relevance Rule)
9
-
10
- Применим к любому production-коду с классами, паттернами проектирования или абстракциями. Для простых скриптов-утилит без архитектуры — применяй только к явным over-engineering паттернам.
11
-
12
- ## Runtime Detection & Stack Profile
13
-
14
- Этот аудит стек-агностичен: проверки сформулированы нейтрально, а конкретика
15
- (инструменты, идиомы, анти-паттерны, примеры) берётся из профиля стека.
16
-
17
- 1. **Профиль передан контекстом?** Если оркестратор `/audit` передал
18
- `runtime=<id>` и/или содержимое профиля — используй его, шаги 2–3 пропусти.
19
-
20
- 2. **Иначе определи РОВНО ОДИН рантайм** этого каталога:
21
- ```bash
22
- if [ -f package.json ]; then echo "runtime=node"
23
- elif [ -f go.mod ]; then echo "runtime=go"
24
- elif [ -f pyproject.toml ] || [ -f requirements.txt ] || [ -f setup.py ]; then echo "runtime=python"
25
- elif [ -f Cargo.toml ]; then echo "runtime=rust"
26
- elif [ -f pom.xml ] || ls build.gradle* settings.gradle* >/dev/null 2>&1; then echo "runtime=java"
27
- else echo "runtime=generic"; fi
28
- ```
29
- Один запуск = один рантайм; не миксуй backend и frontend. Если найдено
30
- несколько маркеров (монорепо) — выбери соответствующий текущему scope/анализируемым
31
- файлам и зафиксируй выбор в разделе Audit Coverage.
32
-
33
- 3. **Загрузи профиль** через Read: `./skills/audit/stacks/<runtime>.md`
34
- (fallback `./skills/audit/stacks/_generic.md`, если файл не найден).
35
-
36
- Дальше используй профиль:
37
- - **Инструменты** — из секции «Tooling by category» профиля (раздел
38
- «Инструментальная поддержка» ниже ссылается на категории, а не на команды).
39
- - **Ожидания PASS** — из «Idioms»; **формулировки FAIL** — из «Anti-patterns».
40
- - **Точечные подсказки** — из «Check-ID hints» по префиксу `YAGNI-`.
41
- - Если профиль `tier: general` или `runtime=generic` → стек-специфичные находки
42
- без однозначного evidence помечай `🔍 UNVERIFIED`, а не `❌ FAIL`. Проверки,
43
- чей механизм в рантайме отсутствует, помечай `N/A`.
44
-
45
- ## Severity Guide
46
-
47
- | Severity | Критерий назначения |
48
- |----------|---------------------|
49
- | 🔴 Critical | RCE, auth bypass, data corruption, необратимый финансовый риск |
50
- | 🟠 High | Падение production, privilege escalation, утечка данных |
51
- | 🟡 Medium | Деградация производительности или поддерживаемости без immediate outage |
52
- | 🟢 Low | Стиль, читаемость, слабое нарушение конвенции |
53
-
54
- Правило: severity = impact × exploitability × blast radius. Одинаковый паттерн → одинаковый severity между аудитами.
55
-
56
- ## Чеклист
57
-
58
- | Check ID | Проверка |
59
- |----------|----------|
60
- | YAGNI-01 | Нет закомментированного кода |
61
- | YAGNI-02 | Нет dead code — неиспользуемых экспортов, функций, переменных |
62
- | YAGNI-03 | Абстракции оправданы: интерфейс/фабрика имеет >1 реализации или требуется тестами |
63
- | YAGNI-04 | Feature flags не зафиксированы в одном значении |
64
- | YAGNI-05 | Технический долг актуален — нет заброшенных TODO/FIXME без даты или прогресса |
65
-
66
- ## Правила верификации
67
-
68
- 1. **Только чеклист**: оценивай ТОЛЬКО проверки выше. Не добавляй новые.
69
- 2. **Явная верификация = PASS**: ставь `✅ PASS` только если явно проверил механизм (нашёл схему, конфиг, guard) и подтвердил отсутствие нарушения — укажи что именно проверено.
70
- 3. **Нет доказательства = UNVERIFIED**: не можешь указать `файл:строка` ни для нарушения, ни для подтверждения — ставь `🔍 UNVERIFIED`.
71
- 4. **Baseline приоритетен**: check_id есть в `docs/audit-baseline.yml` → `⏸ ACCEPTED`.
72
- 5. **Только 🔴/🟠 FAIL требуют решения**: 🟡/🟢 — решение необязательно.
73
-
74
- ## Evidence Quality Rules
75
-
76
- Любой `❌ FAIL` обязан содержать:
77
- - Точный `file:line`
78
- - Минимальный код-фрагмент (1–3 строки)
79
- - Causal chain: почему именно это нарушение → какой риск возникает
80
-
81
- Запрещено:
82
- - Предполагать runtime behavior без evidence в коде
83
- - Предполагать prod-конфигурацию по dev-конфигу
84
- - Предполагать отсутствие middleware без проверки всей router chain
85
- - Если вывод основан на предположении — только `🔍 UNVERIFIED`
86
-
87
- ## Language Rule
88
-
89
- Результаты аудита должны быть написаны простым и понятным языком. Избегай сложных терминов, жаргона и абстрактных понятий без необходимости. Общепринятые технические термины (Docker, HTTP, API, JSON, URL) допустимы. Описывай проблемы так, чтобы они были понятны разработчику любого уровня, а не только узкому специалисту в данной области.
90
-
91
- ## Baseline
92
-
93
- До анализа:
94
- ```bash
95
- if [ ! -f ./docs/audit-baseline.yml ]; then
96
- mkdir -p ./docs
97
- cp ./skills/audit/audit-baseline-template.yml ./docs/audit-baseline.yml 2>/dev/null || \
98
- printf "accepted: []\n" > ./docs/audit-baseline.yml
99
- fi
100
- cat ./docs/audit-baseline.yml
101
- ```
102
-
103
- ## Контекст анализа
104
-
105
- > Примеры иллюстративны (Node); анти-паттерны рантайма — в профиле (Anti-patterns).
106
-
107
- **YAGNI-01 — Нет закомментированного кода:**
108
- - Блоки кода закомментированы вместо удаления (git history сохраняет историю)
109
- - Закомментированные альтернативные реализации без объяснения
110
-
111
- **YAGNI-02 — Нет dead code:**
112
- - Экспортируемые функции/классы/константы без единого импорта
113
- - Переменные объявлены, но не используются
114
- - Функции определены, но никогда не вызываются
115
- - Импорты без использования
116
-
117
- **YAGNI-03 — Абстракции оправданы:**
118
- - Интерфейс/абстрактный класс с единственной реализацией (без тестов, где mock нужен)
119
- - Factory/Builder/Strategy для объекта с 1-2 вариантами создания
120
- - Generic-типы с одним конкретным использованием
121
- - Event bus/pub-sub для прямых вызовов между 2 модулями
122
- - Repository pattern поверх ORM без необходимости абстракции
123
- - Service layer, просто проксирующий вызовы без логики
124
- - DTO для объектов, идентичных entity
125
-
126
- **YAGNI-04 — Feature flags не зафиксированы:**
127
- - Feature flag всегда `true` или всегда `false` в коде (не читается из конфига/env)
128
- - Конфигурируемость параметров, которые никогда не меняются
129
- - Опциональные параметры, всегда передаваемые с одним значением
130
-
131
- **YAGNI-05 — Технический долг актуален:**
132
- - TODO/FIXME без даты создания или имени автора
133
- - TODO/FIXME старше 6 месяцев без признаков прогресса
134
- - TODO без ссылки на issue/ticket (нет трекинга)
135
-
136
- ## Инструментальная поддержка
137
-
138
- Для YAGNI-02 используй инструмент категории **unused-code** из профиля стека
139
- (секция «Tooling by category»): он находит неиспользуемые экспорты, функции,
140
- зависимости и файлы. Используй вывод как подсказку для YAGNI-02 и верифицируй
141
- каждую находку вручную (`file:line`) перед занесением в FAIL. Если ячейка пустая
142
- (tier general/generic) — проверяй вручную и помечай находки `🔍 UNVERIFIED`.
143
-
144
- ## Формат вывода
145
-
146
- | Check ID | Проверка | Статус | Уверенность | Доказательство | Решение | Исправлено |
147
- |----------|----------|--------|-------------|----------------|---------|------------|
148
- | YAGNI-01 | Нет закомментированного кода | ✅ PASS | High | `src/` — закомментированного кода не найдено | — | — |
149
- | YAGNI-02 | Нет dead code — неиспользуемых экспортов, функций, переменных | ❌ FAIL 🟡 | High | `lib/formatters.ts:89` | **1. Удалить неиспользуемые экспорты** \\ 2. Добавить ts-prune в CI для автоматического обнаружения \\ 3. Пометить @deprecated и удалить в следующем релизе | Нет |
150
- | YAGNI-05 | Технический долг актуален — нет заброшенных TODO/FIXME без даты или прогресса | ⏸ ACCEPTED | Medium | `src/auth.ts:34` | В baseline: known tech debt, трекается в Jira PROJ-123 | — |
151
-
152
- Статусы: `✅ PASS` / `❌ FAIL 🔴` / `❌ FAIL 🟠` / `❌ FAIL 🟡` / `❌ FAIL 🟢` / `⏸ ACCEPTED` / `🔍 UNVERIFIED`
153
-
154
- Уверенность: `High` — проверил несколько ключевых файлов, паттерн очевиден / `Medium` — проверил выборочно, паттерн вероятен / `Low` — ограниченный контекст, полная уверенность невозможна
155
-
156
- Для `❌ FAIL`: ровно 3 варианта решения, разделитель `\\`, вариант 1 жирным.
157
-
158
- `Исправлено`: FAIL → `Нет` (разработчик меняет на `✅ Да` вручную после фикса). PASS / ACCEPTED / UNVERIFIED → `—`.
159
-
160
- Требования к решениям:
161
- - Взаимно исключающие (не перефразировки одного и того же)
162
- - Соответствуют текущему стеку проекта (не предлагать смену фреймворка)
163
- - Не требуют переписать всю систему — realistic migration cost
164
- - Вариант 3 может быть «оставить, задокументировать причину» при наличии обоснования
165
-
166
- В конце отчёта добавь раздел покрытия:
167
- ```
168
- ## Audit Coverage
169
- Проверено: src/module1/**, src/module2/**
170
- Пропущено: scripts/**, migrations/**, tests/**
171
- Файлов проверено: N | Пропущено: N
172
- ```
173
-
174
- Если все PASS — выведи: `✅ Over-engineering не обнаружен.`
175
-
176
- ## Сохранение результатов
177
-
178
- 1. Найди папку сессии:
179
- ```bash
180
- ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
181
- ```
182
- Если пусто — создай: `mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")`
183
- 2. Сохрани через Write: `<AUDIT_DIR>/audit-yagni.md`
184
-
185
- ```
186
- # Audit Report: Over-engineering & YAGNI — <YYYY-MM-DD HH:MM>
187
- <таблица>
188
- ```