kodu 2.2.0 → 3.0.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 (234) hide show
  1. package/README.md +24 -3
  2. package/bin/kodu.js +40 -0
  3. package/package.json +12 -67
  4. package/scripts/install.js +68 -0
  5. package/scripts/postinstall.js +22 -0
  6. package/AGENTS.md +0 -214
  7. package/__tests__/core/fs/fs.service.test.ts +0 -72
  8. package/__tests__/core/registry/registry.service.test.ts +0 -82
  9. package/__tests__/shared/cleaner/cleaner.service.test.ts +0 -102
  10. package/__tests__/shared/git/git.service.test.ts +0 -84
  11. package/__tests__/shared/runbook/runbook.service.test.ts +0 -104
  12. package/__tests__/shared/tokenizer/tokenizer.service.test.ts +0 -45
  13. package/biome.json +0 -50
  14. package/dist/package.json +0 -96
  15. package/dist/src/app.module.d.ts +0 -2
  16. package/dist/src/app.module.js +0 -42
  17. package/dist/src/app.module.js.map +0 -1
  18. package/dist/src/commands/clean/clean.command.d.ts +0 -37
  19. package/dist/src/commands/clean/clean.command.js +0 -240
  20. package/dist/src/commands/clean/clean.command.js.map +0 -1
  21. package/dist/src/commands/clean/clean.module.d.ts +0 -2
  22. package/dist/src/commands/clean/clean.module.js +0 -26
  23. package/dist/src/commands/clean/clean.module.js.map +0 -1
  24. package/dist/src/commands/init/init.command.d.ts +0 -10
  25. package/dist/src/commands/init/init.command.js +0 -96
  26. package/dist/src/commands/init/init.command.js.map +0 -1
  27. package/dist/src/commands/init/init.module.d.ts +0 -2
  28. package/dist/src/commands/init/init.module.js +0 -22
  29. package/dist/src/commands/init/init.module.js.map +0 -1
  30. package/dist/src/commands/ops/ops-add.command.d.ts +0 -18
  31. package/dist/src/commands/ops/ops-add.command.js +0 -102
  32. package/dist/src/commands/ops/ops-add.command.js.map +0 -1
  33. package/dist/src/commands/ops/ops-init.command.d.ts +0 -22
  34. package/dist/src/commands/ops/ops-init.command.js +0 -130
  35. package/dist/src/commands/ops/ops-init.command.js.map +0 -1
  36. package/dist/src/commands/ops/ops-list.command.d.ts +0 -12
  37. package/dist/src/commands/ops/ops-list.command.js +0 -73
  38. package/dist/src/commands/ops/ops-list.command.js.map +0 -1
  39. package/dist/src/commands/ops/ops-path.command.d.ts +0 -9
  40. package/dist/src/commands/ops/ops-path.command.js +0 -52
  41. package/dist/src/commands/ops/ops-path.command.js.map +0 -1
  42. package/dist/src/commands/ops/ops-runbook.command.d.ts +0 -12
  43. package/dist/src/commands/ops/ops-runbook.command.js +0 -81
  44. package/dist/src/commands/ops/ops-runbook.command.js.map +0 -1
  45. package/dist/src/commands/ops/ops-status.command.d.ts +0 -11
  46. package/dist/src/commands/ops/ops-status.command.js +0 -62
  47. package/dist/src/commands/ops/ops-status.command.js.map +0 -1
  48. package/dist/src/commands/ops/ops-use.command.d.ts +0 -12
  49. package/dist/src/commands/ops/ops-use.command.js +0 -76
  50. package/dist/src/commands/ops/ops-use.command.js.map +0 -1
  51. package/dist/src/commands/ops/ops.command.d.ts +0 -7
  52. package/dist/src/commands/ops/ops.command.js +0 -56
  53. package/dist/src/commands/ops/ops.command.js.map +0 -1
  54. package/dist/src/commands/ops/ops.helpers.d.ts +0 -2
  55. package/dist/src/commands/ops/ops.helpers.js +0 -11
  56. package/dist/src/commands/ops/ops.helpers.js.map +0 -1
  57. package/dist/src/commands/ops/ops.module.d.ts +0 -2
  58. package/dist/src/commands/ops/ops.module.js +0 -36
  59. package/dist/src/commands/ops/ops.module.js.map +0 -1
  60. package/dist/src/commands/pack/pack.command.d.ts +0 -51
  61. package/dist/src/commands/pack/pack.command.js +0 -355
  62. package/dist/src/commands/pack/pack.command.js.map +0 -1
  63. package/dist/src/commands/pack/pack.module.d.ts +0 -2
  64. package/dist/src/commands/pack/pack.module.js +0 -27
  65. package/dist/src/commands/pack/pack.module.js.map +0 -1
  66. package/dist/src/core/config/config.module.d.ts +0 -2
  67. package/dist/src/core/config/config.module.js +0 -23
  68. package/dist/src/core/config/config.module.js.map +0 -1
  69. package/dist/src/core/config/config.schema.d.ts +0 -19
  70. package/dist/src/core/config/config.schema.js +0 -56
  71. package/dist/src/core/config/config.schema.js.map +0 -1
  72. package/dist/src/core/config/config.service.d.ts +0 -7
  73. package/dist/src/core/config/config.service.js +0 -49
  74. package/dist/src/core/config/config.service.js.map +0 -1
  75. package/dist/src/core/config/prompt.service.d.ts +0 -10
  76. package/dist/src/core/config/prompt.service.js +0 -80
  77. package/dist/src/core/config/prompt.service.js.map +0 -1
  78. package/dist/src/core/file-system/fs.module.d.ts +0 -2
  79. package/dist/src/core/file-system/fs.module.js +0 -21
  80. package/dist/src/core/file-system/fs.module.js.map +0 -1
  81. package/dist/src/core/file-system/fs.service.d.ts +0 -27
  82. package/dist/src/core/file-system/fs.service.js +0 -203
  83. package/dist/src/core/file-system/fs.service.js.map +0 -1
  84. package/dist/src/core/registry/registry.module.d.ts +0 -2
  85. package/dist/src/core/registry/registry.module.js +0 -22
  86. package/dist/src/core/registry/registry.module.js.map +0 -1
  87. package/dist/src/core/registry/registry.schema.d.ts +0 -24
  88. package/dist/src/core/registry/registry.schema.js +0 -21
  89. package/dist/src/core/registry/registry.schema.js.map +0 -1
  90. package/dist/src/core/registry/registry.service.d.ts +0 -16
  91. package/dist/src/core/registry/registry.service.js +0 -91
  92. package/dist/src/core/registry/registry.service.js.map +0 -1
  93. package/dist/src/core/ui/ui.module.d.ts +0 -2
  94. package/dist/src/core/ui/ui.module.js +0 -22
  95. package/dist/src/core/ui/ui.module.js.map +0 -1
  96. package/dist/src/core/ui/ui.service.d.ts +0 -22
  97. package/dist/src/core/ui/ui.service.js +0 -43
  98. package/dist/src/core/ui/ui.service.js.map +0 -1
  99. package/dist/src/main.d.ts +0 -2
  100. package/dist/src/main.js +0 -16
  101. package/dist/src/main.js.map +0 -1
  102. package/dist/src/shared/cleaner/cleaner.service.d.ts +0 -23
  103. package/dist/src/shared/cleaner/cleaner.service.js +0 -223
  104. package/dist/src/shared/cleaner/cleaner.service.js.map +0 -1
  105. package/dist/src/shared/cleaner/cleaner.types.d.ts +0 -21
  106. package/dist/src/shared/cleaner/cleaner.types.js +0 -3
  107. package/dist/src/shared/cleaner/cleaner.types.js.map +0 -1
  108. package/dist/src/shared/constants.d.ts +0 -4
  109. package/dist/src/shared/constants.js +0 -113
  110. package/dist/src/shared/constants.js.map +0 -1
  111. package/dist/src/shared/deps/deps.module.d.ts +0 -2
  112. package/dist/src/shared/deps/deps.module.js +0 -21
  113. package/dist/src/shared/deps/deps.module.js.map +0 -1
  114. package/dist/src/shared/deps/deps.service.d.ts +0 -15
  115. package/dist/src/shared/deps/deps.service.js +0 -114
  116. package/dist/src/shared/deps/deps.service.js.map +0 -1
  117. package/dist/src/shared/git/git.module.d.ts +0 -2
  118. package/dist/src/shared/git/git.module.js +0 -21
  119. package/dist/src/shared/git/git.module.js.map +0 -1
  120. package/dist/src/shared/git/git.service.d.ts +0 -5
  121. package/dist/src/shared/git/git.service.js +0 -56
  122. package/dist/src/shared/git/git.service.js.map +0 -1
  123. package/dist/src/shared/runbook/runbook.module.d.ts +0 -2
  124. package/dist/src/shared/runbook/runbook.module.js +0 -22
  125. package/dist/src/shared/runbook/runbook.module.js.map +0 -1
  126. package/dist/src/shared/runbook/runbook.service.d.ts +0 -20
  127. package/dist/src/shared/runbook/runbook.service.js +0 -118
  128. package/dist/src/shared/runbook/runbook.service.js.map +0 -1
  129. package/dist/src/shared/runbook/runbook.templates.d.ts +0 -6
  130. package/dist/src/shared/runbook/runbook.templates.js +0 -49
  131. package/dist/src/shared/runbook/runbook.templates.js.map +0 -1
  132. package/dist/src/shared/tokenizer/tokenizer.module.d.ts +0 -2
  133. package/dist/src/shared/tokenizer/tokenizer.module.js +0 -21
  134. package/dist/src/shared/tokenizer/tokenizer.module.js.map +0 -1
  135. package/dist/src/shared/tokenizer/tokenizer.service.d.ts +0 -10
  136. package/dist/src/shared/tokenizer/tokenizer.service.js +0 -36
  137. package/dist/src/shared/tokenizer/tokenizer.service.js.map +0 -1
  138. package/dist/tsconfig.build.tsbuildinfo +0 -1
  139. package/docs/todo.md +0 -7
  140. package/knip.json +0 -10
  141. package/kodu.json +0 -63
  142. package/kodu.schema.json +0 -100
  143. package/lefthook.yml +0 -11
  144. package/nest-cli.json +0 -8
  145. package/registry.schema.json +0 -39
  146. package/scripts/generate-json-schema.ts +0 -27
  147. package/skills/ac/SKILL.md +0 -239
  148. package/skills/al/SKILL.md +0 -98
  149. package/skills/audit/SKILL.md +0 -205
  150. package/skills/audit/audit-baseline-template.yml +0 -188
  151. package/skills/audit/runtime-detect.md +0 -64
  152. package/skills/audit/stacks/_generic.md +0 -41
  153. package/skills/audit/stacks/_registry.md +0 -47
  154. package/skills/audit/stacks/go.md +0 -66
  155. package/skills/audit/stacks/java.md +0 -44
  156. package/skills/audit/stacks/node.md +0 -57
  157. package/skills/audit/stacks/python.md +0 -45
  158. package/skills/audit/stacks/rust.md +0 -44
  159. package/skills/audit-api-contracts/SKILL.md +0 -201
  160. package/skills/audit-architecture/SKILL.md +0 -200
  161. package/skills/audit-bugs/SKILL.md +0 -226
  162. package/skills/audit-concurrency/SKILL.md +0 -197
  163. package/skills/audit-deployment/SKILL.md +0 -218
  164. package/skills/audit-docs/SKILL.md +0 -209
  165. package/skills/audit-errors/SKILL.md +0 -216
  166. package/skills/audit-logging/SKILL.md +0 -197
  167. package/skills/audit-matrix/SKILL.md +0 -245
  168. package/skills/audit-meta/SKILL.md +0 -120
  169. package/skills/audit-naming/SKILL.md +0 -200
  170. package/skills/audit-owasp/SKILL.md +0 -223
  171. package/skills/audit-performance/SKILL.md +0 -199
  172. package/skills/audit-reinvention/SKILL.md +0 -214
  173. package/skills/audit-secrets/SKILL.md +0 -198
  174. package/skills/audit-tests/SKILL.md +0 -210
  175. package/skills/audit-validation/SKILL.md +0 -206
  176. package/skills/audit-verify/SKILL.md +0 -139
  177. package/skills/audit-yagni/SKILL.md +0 -188
  178. package/skills/doc-gen/SKILL.md +0 -490
  179. package/skills/doc-gen/scripts/doc_gen.py +0 -911
  180. package/skills/generate-project-docs/SKILL.md +0 -380
  181. package/skills/implement-project/SKILL.md +0 -409
  182. package/skills/liteend-init/SKILL.md +0 -84
  183. package/skills/litefront-init/SKILL.md +0 -96
  184. package/skills/litefront-prototype/SKILL.md +0 -484
  185. package/skills/ops/SKILL.md +0 -94
  186. package/skills/post-call-task-builder/SKILL.md +0 -419
  187. package/skills/project-setup-standardizer/SKILL.md +0 -285
  188. package/skills/skills-best-practices/SKILL.md +0 -415
  189. package/skills/start/SKILL.md +0 -319
  190. package/skills/tech-blueprint/SKILL.md +0 -890
  191. package/skills/tech-blueprint/scripts/blueprint_validator.py +0 -417
  192. package/src/app.module.ts +0 -29
  193. package/src/commands/clean/clean.command.ts +0 -235
  194. package/src/commands/clean/clean.module.ts +0 -13
  195. package/src/commands/init/init.command.ts +0 -92
  196. package/src/commands/init/init.module.ts +0 -9
  197. package/src/commands/ops/ops-add.command.ts +0 -83
  198. package/src/commands/ops/ops-init.command.ts +0 -125
  199. package/src/commands/ops/ops-list.command.ts +0 -57
  200. package/src/commands/ops/ops-path.command.ts +0 -38
  201. package/src/commands/ops/ops-runbook.command.ts +0 -74
  202. package/src/commands/ops/ops-status.command.ts +0 -47
  203. package/src/commands/ops/ops-use.command.ts +0 -76
  204. package/src/commands/ops/ops.command.ts +0 -42
  205. package/src/commands/ops/ops.helpers.ts +0 -20
  206. package/src/commands/ops/ops.module.ts +0 -23
  207. package/src/commands/pack/pack.command.ts +0 -347
  208. package/src/commands/pack/pack.module.ts +0 -14
  209. package/src/core/config/config.module.ts +0 -10
  210. package/src/core/config/config.schema.ts +0 -58
  211. package/src/core/config/config.service.ts +0 -43
  212. package/src/core/config/prompt.service.ts +0 -80
  213. package/src/core/file-system/fs.module.ts +0 -8
  214. package/src/core/file-system/fs.service.ts +0 -248
  215. package/src/core/registry/registry.module.ts +0 -9
  216. package/src/core/registry/registry.schema.ts +0 -46
  217. package/src/core/registry/registry.service.ts +0 -128
  218. package/src/core/ui/ui.module.ts +0 -9
  219. package/src/core/ui/ui.service.ts +0 -39
  220. package/src/main.ts +0 -12
  221. package/src/shared/cleaner/cleaner.service.ts +0 -289
  222. package/src/shared/cleaner/cleaner.types.ts +0 -23
  223. package/src/shared/constants.ts +0 -118
  224. package/src/shared/deps/deps.module.ts +0 -8
  225. package/src/shared/deps/deps.service.ts +0 -175
  226. package/src/shared/git/git.module.ts +0 -8
  227. package/src/shared/git/git.service.ts +0 -47
  228. package/src/shared/runbook/runbook.module.ts +0 -9
  229. package/src/shared/runbook/runbook.service.ts +0 -164
  230. package/src/shared/runbook/runbook.templates.ts +0 -66
  231. package/src/shared/tokenizer/tokenizer.module.ts +0 -8
  232. package/src/shared/tokenizer/tokenizer.service.ts +0 -30
  233. package/tsconfig.build.json +0 -7
  234. package/tsconfig.json +0 -28
@@ -1,223 +0,0 @@
1
- ---
2
- name: audit-owasp
3
- description: >
4
- Аудит безопасности приложения по OWASP Top 10: инъекции, broken auth, IDOR, XSS,
5
- CSRF, SSRF, логические уязвимости. Запускай при /audit-owasp.
6
- ---
7
-
8
- ## Правило применимости (Relevance Rule)
9
-
10
- Применим к серверному коду с HTTP-роутингом, аутентификацией, работой с БД или файловой системой. Для чисто фронтендовых компонентов без fetch/API calls — применяй только XSS/CSRF секции. Для CLI-инструментов без сетевого взаимодействия — верни пустой ответ.
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» по префиксу `OWA-`.
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
- | OWA-01 | A03: Все запросы к БД/OS/LDAP параметризованы, нет injection |
61
- | OWA-02 | A01: Все защищённые маршруты имеют auth-middleware |
62
- | OWA-03 | A01: Resource ownership проверяется, нет IDOR [⚡ dynamic] |
63
- | OWA-04 | A02: Пароли хранятся безопасно (bcrypt/argon2/scrypt) |
64
- | OWA-05 | A05: Безопасная конфигурация сервера (CORS, security headers, body limits) |
65
- | OWA-06 | A07: Защита от перебора (rate limiting на auth и чувствительных эндпоинтах) |
66
- | OWA-07 | A09: Техническая информация не утекает в ответы (stack trace, внутренние пути) |
67
- | OWA-08 | A10: URL из user input не передаётся в HTTP-клиент без whitelist (SSRF) |
68
- | OWA-09 | A05: CSRF-защита реализована (SameSite cookies или CSRF-токены на state-changing запросах) |
69
-
70
- ## Правила верификации
71
-
72
- 1. **Только чеклист**: оценивай ТОЛЬКО проверки выше. Не добавляй новые.
73
- 2. **Явная верификация = PASS**: ставь `✅ PASS` только если явно проверил механизм (нашёл схему, конфиг, guard) и подтвердил отсутствие нарушения — укажи что именно проверено.
74
- 3. **Нет доказательства = UNVERIFIED**: не можешь указать `файл:строка` ни для нарушения, ни для подтверждения — ставь `🔍 UNVERIFIED`.
75
- - Проверки с `[⚡ dynamic]` нельзя статически подтвердить — только `🔍 UNVERIFIED` или `❌ FAIL` (при явном evidence), но не `✅ PASS`
76
- 4. **Baseline приоритетен**: check_id есть в `docs/audit-baseline.yml` → `⏸ ACCEPTED`.
77
- 5. **Только 🔴/🟠 FAIL требуют решения**: 🟡/🟢 — решение необязательно.
78
-
79
- ## Evidence Quality Rules
80
-
81
- Любой `❌ FAIL` обязан содержать:
82
- - Точный `file:line`
83
- - Минимальный код-фрагмент (1–3 строки)
84
- - Causal chain: почему именно это нарушение → какой риск возникает
85
-
86
- Запрещено:
87
- - Предполагать runtime behavior без evidence в коде
88
- - Предполагать prod-конфигурацию по dev-конфигу
89
- - Предполагать отсутствие middleware без проверки всей router chain
90
- - Если вывод основан на предположении — только `🔍 UNVERIFIED`
91
-
92
- ## Language Rule
93
-
94
- Результаты аудита должны быть написаны простым и понятным языком. Избегай сложных терминов, жаргона и абстрактных понятий без необходимости. Общепринятые технические термины (Docker, HTTP, API, JSON, URL) допустимы. Описывай проблемы так, чтобы они были понятны разработчику любого уровня, а не только узкому специалисту в данной области.
95
-
96
- ## Baseline
97
-
98
- До анализа:
99
- ```bash
100
- if [ ! -f ./docs/audit-baseline.yml ]; then
101
- mkdir -p ./docs
102
- cp ./skills/audit/audit-baseline-template.yml ./docs/audit-baseline.yml 2>/dev/null || \
103
- printf "accepted: []\n" > ./docs/audit-baseline.yml
104
- fi
105
- cat ./docs/audit-baseline.yml
106
- ```
107
-
108
- ## Контекст анализа
109
-
110
- **OWA-01 — Параметризованные запросы, нет injection:**
111
- - SQL строки, собранные через конкатенацию/template literals
112
- - NoSQL injection через неэкранированные операторы (`$where`, `$regex`)
113
- - Command injection: user input попадает в shell-команды без экранирования
114
- - LDAP/XPath запросы с неэкранированным user input
115
-
116
- **OWA-02 — Auth middleware на защищённых маршрутах:**
117
- - Protected routes без auth middleware
118
- - Privilege escalation: обычный пользователь вызывает admin-действие
119
- - Directory traversal в file operations
120
- - Отсутствие авторизации на отдельных маршрутах роутера
121
-
122
- **OWA-03 — Resource ownership проверяется:**
123
- - IDOR: ресурс запрашивается по ID без проверки ownership текущего пользователя
124
- - Bulk operations изменяют ресурсы других пользователей
125
- - Indirect object reference через связанные сущности без проверки доступа
126
-
127
- **OWA-04 — Безопасное хранение паролей:**
128
- - Слабые алгоритмы хеширования (MD5, SHA1 для паролей)
129
- - Пароли не хешируются через bcrypt/argon2/scrypt
130
- - Симметричное шифрование с hardcoded key
131
- - HTTP вместо HTTPS для передачи credentials
132
-
133
- **OWA-05 — Безопасная конфигурация сервера:**
134
- - CORS не должен быть wildcard (`*`) в production; origins только по whitelist
135
- - Не выставлены security-заголовки (X-Frame-Options, CSP, HSTS и т.п.)
136
- - Не ограничен размер тела запроса (DoS через огромное тело запроса)
137
- - Открытые error pages с технической информацией
138
- - Конкретика из профиля (Go: `http.MaxBytesReader`, chi `cors`/`secure`; Node: `express.json({ limit })`, Helmet)
139
-
140
- **OWA-06 — Защита от перебора:**
141
- - Отсутствие rate limiting на login/register/reset-password эндпоинтах
142
- - Нет rate limiting на чувствительных операциях (смена пароля, OTP-проверка)
143
- - Session tokens не инвалидируются при logout
144
- - Проверка JWT без явного whitelist алгоритмов: нужно отклонять `alg:none` и подмену RS256↔HS256 (атакующий передаёт `alg:none` либо RS256 с публичным ключом, выданным за HS256-секрет); слабые алгоритмы / короткий ключ
145
- - Конкретика из профиля (Go: go-oidc `Verifier` / golang-jwt `WithValidMethods`; Node: `jwt.verify(token, secret, { algorithms: [...] })`)
146
-
147
- **OWA-07 — Техническая информация не утекает:**
148
- - Stack trace в ответах production API
149
- - Внутренние пути файловой системы в error messages
150
- - Версии зависимостей/фреймворка в заголовках или ответах
151
- - SQL-ошибки или DB-специфичные сообщения в API responses
152
-
153
- **OWA-08 — SSRF: URL из user input без whitelist:**
154
- - URL из user input передаётся в HTTP-клиент без whitelist
155
- - Fetch к внутренним адресам (169.254.x.x, 10.x.x.x, localhost, metadata endpoints)
156
- - Редиректы на внутренние ресурсы без валидации destination
157
-
158
- **OWA-09 — CSRF-защита:**
159
- - State-changing запросы (POST/PUT/PATCH/DELETE) принимаются без CSRF-токена и без проверки `Origin`/`Referer`
160
- - Cookies без корректных атрибутов (`SameSite`, `Secure`, `HttpOnly`) — браузер отправит cookie в cross-site запросе либо она доступна скрипту/по HTTP
161
- - Мутации (включая GraphQL) доступны через GET вместо POST — обходит CSRF-защиту
162
- - `SameSite=None` без явного обоснования (нужно только для cross-site iframe/embed сценариев)
163
-
164
- ## Граница с другими аудитами
165
-
166
- - **Stack trace в ответах** (OWA-07) — первичный: `audit-errors` (ERR-02). Если обнаружено здесь — добавь cross-ref «*см. ERR-02*» в доказательство, не создавай дублирующий `❌ FAIL`.
167
- - **Валидация полей, типов, диапазонов** — первичный: `audit-validation`. Здесь не дублируй.
168
- - **Secrets в коде** — первичный: `audit-secrets`. Здесь не дублируй.
169
- - **API-контракты** — первичный: `audit-api-contracts`. Здесь не дублируй.
170
-
171
- ## Инструментальная поддержка
172
-
173
- Перед анализом используй инструмент категории **dep-audit** из профиля стека
174
- (секция «Tooling by category»): он выявляет уязвимые зависимости (известные CVE).
175
- Это самостоятельная зона, не входит в текущий чеклист, но критические CVE стоит
176
- вынести в раздел замечаний отчёта. Если ячейка категории пустая
177
- (`tier: general`/`generic`) — пропусти этот шаг.
178
-
179
- ## Формат вывода
180
-
181
- | Check ID | Проверка | Статус | Уверенность | Доказательство | Решение | Исправлено |
182
- |----------|----------|--------|-------------|----------------|---------|------------|
183
- | OWA-01 | A03: Все запросы к БД/OS/LDAP параметризованы, нет injection | ✅ PASS | High | `db/queries.ts` проверен — все запросы параметризованы | — | — |
184
- | OWA-02 | A01: Все защищённые маршруты имеют auth-middleware | ❌ FAIL 🔴 | High | `routes/admin.ts:14` | **1. Добавить authMiddleware на все /admin routes** \\ 2. Использовать router-level middleware \\ 3. Добавить проверку в каждый handler | Нет |
185
- | OWA-05 | A05: Безопасная конфигурация сервера (CORS, security headers, body limits) | ⏸ ACCEPTED | Medium | `app.ts:9` | В baseline: внутренний сервис | — |
186
-
187
- Статусы: `✅ PASS` / `❌ FAIL 🔴` / `❌ FAIL 🟠` / `❌ FAIL 🟡` / `❌ FAIL 🟢` / `⏸ ACCEPTED` / `🔍 UNVERIFIED`
188
-
189
- Уверенность: `High` — проверил несколько ключевых файлов, паттерн очевиден / `Medium` — проверил выборочно, паттерн вероятен / `Low` — ограниченный контекст, полная уверенность невозможна
190
-
191
- Для `❌ FAIL`: ровно 3 варианта решения, разделитель `\\`, вариант 1 жирным.
192
-
193
- `Исправлено`: FAIL → `Нет` (разработчик меняет на `✅ Да` вручную после фикса). PASS / ACCEPTED / UNVERIFIED → `—`.
194
-
195
- Требования к решениям:
196
- - Взаимно исключающие (не перефразировки одного и того же)
197
- - Соответствуют текущему стеку проекта (не предлагать смену фреймворка)
198
- - Не требуют переписать всю систему — realistic migration cost
199
- - Вариант 3 может быть «оставить, задокументировать причину» при наличии обоснования
200
-
201
- В конце отчёта добавь раздел покрытия:
202
- ```
203
- ## Audit Coverage
204
- Проверено: src/module1/**, src/module2/**
205
- Пропущено: scripts/**, migrations/**, tests/**
206
- Файлов проверено: N | Пропущено: N
207
- ```
208
-
209
- Если все PASS — выведи: `✅ Критических OWASP-уязвимостей не обнаружено.`
210
-
211
- ## Сохранение результатов
212
-
213
- 1. Найди папку сессии:
214
- ```bash
215
- ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
216
- ```
217
- Если пусто — создай: `mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")`
218
- 2. Сохрани через Write: `<AUDIT_DIR>/audit-owasp.md`
219
-
220
- ```
221
- # Audit Report: OWASP Application Security — <YYYY-MM-DD HH:MM>
222
- <таблица>
223
- ```
@@ -1,199 +0,0 @@
1
- ---
2
- name: audit-performance
3
- description: >
4
- Аудит ресурсов и производительности: блокирующие вызовы, N+1 запросы, тяжёлые запросы
5
- без лимитов, memory leaks, отсутствие пагинации. Запускай при /audit-performance.
6
- ---
7
-
8
- ## Правило применимости (Relevance Rule)
9
-
10
- Применим к коду с I/O операциями (БД, HTTP, файлы), обработкой коллекций, кэшированием. Для stateless математических утилит без I/O — верни пустой ответ.
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» по префиксу `PER-`.
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
- | PER-01 | Нет N+1: DB-запросы не выполняются внутри циклов [⚡ dynamic] |
61
- | PER-02 | Выборки из БД ограничены (LIMIT, пагинация) |
62
- | PER-03 | Обработчики запросов не содержат блокирующего I/O |
63
- | PER-04 | CPU-интенсивные операции вынесены из main thread |
64
- | PER-05 | Независимые async-операции выполняются параллельно |
65
- | PER-06 | Кэши ограничены по размеру и времени жизни (TTL + size limit) |
66
- | PER-07 | Event listeners и subscriptions очищаются при завершении |
67
- | PER-08 | Нет утечек памяти: timers и closures не удерживают большие объекты в долгоживущем scope |
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
- **PER-01 — Нет N+1:**
110
- - Запрос к БД внутри цикла по результатам другого запроса
111
- - ORM relations загружаются lazy внутри loop
112
- - Отсутствие `include`/`join` там где возможна одна выборка
113
- - DataLoader / batch loading не используется при множественных точечных запросах
114
-
115
- **PER-02 — Выборки ограничены:**
116
- - SELECT без LIMIT/пагинации (возможный full table scan)
117
- - Запросы без WHERE на индексированных полях
118
- - Агрегации на больших таблицах без materialized view / кэша
119
- - Нет cursor-based пагинации при больших наборах данных
120
-
121
- **PER-03 — Нет блокирующего I/O в handlers:**
122
- - Синхронные файловые операции в async контексте (Node: `fs.readFileSync`)
123
- - `sleep`/busy-wait в request handler
124
- - Синхронные операции с большими буферами блокирующие event loop (Node)
125
- - Go: блокирующие сетевые/I/O-вызовы без таймаута/`context.Context` в обработчике; синхронные тяжёлые вызовы вне горутины (менее критично, чем блокировка event loop в Node, но всё равно держат соединение)
126
-
127
- **PER-04 — CPU-операции вне main thread:**
128
- - CPU-intensive операции (crypto, image processing, compression) в main thread без worker
129
- - Тяжёлые вычисления (сортировка больших массивов, regex на длинных строках) в request path
130
-
131
- **PER-05 — Параллельные независимые операции:**
132
- - Последовательные независимые HTTP-запросы вместо `Promise.all`
133
- - Sequential await там где возможен parallel fetch
134
- - Повторные запросы к одному URL без мемоизации в рамках одного запроса
135
-
136
- **PER-06 — Кэши ограничены:**
137
- - Кэш без TTL (unbounded growth, stale data навсегда)
138
- - Кэш без size limit (memory leak в long-lived процессах)
139
- - In-memory кэш без механизма инвалидации при обновлении данных
140
-
141
- **PER-07 — Event listeners очищаются:**
142
- - Event listeners без `removeEventListener` / `off` (leak в long-lived процессах)
143
- - RxJS subscriptions без `unsubscribe` в destroy/cleanup
144
- - WebSocket / SSE connections без cleanup при завершении request lifecycle
145
- - Накопление данных в memory без flush (buffer без drain)
146
- - Go: горутина-подписчик/воркер без пути завершения по `ctx.Done()` (goroutine leak); незакрытый канал/`time.Ticker` без `Stop()`
147
-
148
- **PER-08 — Нет утечек памяти через timers и closures:**
149
- - `setInterval` / `setTimeout` без соответствующего `clearInterval` / `clearTimeout` в cleanup (Node)
150
- - Closure в долгоживущем объекте захватывает большой массив/объект — GC не может его собрать
151
- - `global`-объект или module-level переменная накапливает записи без ограничения (unbounded grow)
152
- - Circular reference между объектами с WeakMap/WeakRef там где нужна сильная ссылка
153
- - Go: `defer` в цикле/долгой функции держит ресурсы (rows/файлы/locks) дольше нужного — освобождение откладывается до конца функции, а не итерации
154
-
155
- ## Формат вывода
156
-
157
- | Check ID | Проверка | Статус | Уверенность | Доказательство | Решение | Исправлено |
158
- |----------|----------|--------|-------------|----------------|---------|------------|
159
- | PER-01 | Нет N+1: DB-запросы не выполняются внутри циклов | ✅ PASS | High | `repos/` проверены — запросы вне циклов | — [⚡ dynamic] | — |
160
- | PER-02 | Выборки из БД ограничены (LIMIT, пагинация) | ❌ FAIL 🟠 | High | `repos/user.ts:45` | **1. Добавить .take(limit).skip(offset) в запрос** \\ 2. Добавить cursor-based пагинацию \\ 3. Установить максимальный лимит через конфиг | Нет |
161
- | PER-06 | Кэши ограничены по размеру и времени жизни (TTL + size limit) | ⏸ ACCEPTED | Medium | `cache/store.ts:12` | В baseline: кэш управляется Redis с TTL | — |
162
-
163
- Статусы: `✅ PASS` / `❌ FAIL 🔴` / `❌ FAIL 🟠` / `❌ FAIL 🟡` / `❌ FAIL 🟢` / `⏸ ACCEPTED` / `🔍 UNVERIFIED`
164
-
165
- Уверенность: `High` — проверил несколько ключевых файлов, паттерн очевиден / `Medium` — проверил выборочно, паттерн вероятен / `Low` — ограниченный контекст, полная уверенность невозможна
166
-
167
- Для `❌ FAIL`: ровно 3 варианта решения, разделитель `\\`, вариант 1 жирным.
168
-
169
- `Исправлено`: FAIL → `Нет` (разработчик меняет на `✅ Да` вручную после фикса). PASS / ACCEPTED / UNVERIFIED → `—`.
170
-
171
- Требования к решениям:
172
- - Взаимно исключающие (не перефразировки одного и того же)
173
- - Соответствуют текущему стеку проекта (не предлагать смену фреймворка)
174
- - Не требуют переписать всю систему — realistic migration cost
175
- - Вариант 3 может быть «оставить, задокументировать причину» при наличии обоснования
176
-
177
- В конце отчёта добавь раздел покрытия:
178
- ```
179
- ## Audit Coverage
180
- Проверено: src/module1/**, src/module2/**
181
- Пропущено: scripts/**, migrations/**, tests/**
182
- Файлов проверено: N | Пропущено: N
183
- ```
184
-
185
- Если все PASS — выведи: `✅ Производительных антипаттернов не обнаружено.`
186
-
187
- ## Сохранение результатов
188
-
189
- 1. Найди папку сессии:
190
- ```bash
191
- ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
192
- ```
193
- Если пусто — создай: `mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")`
194
- 2. Сохрани через Write: `<AUDIT_DIR>/audit-performance.md`
195
-
196
- ```
197
- # Audit Report: Resource & Performance — <YYYY-MM-DD HH:MM>
198
- <таблица>
199
- ```