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,226 +0,0 @@
1
- ---
2
- name: audit-bugs
3
- description: >
4
- Аудит прямых багов и логических ошибок: неверные условия, off-by-one, null dereference,
5
- забытый await, unreachable code, type coercion, мутация аргументов. Запускай при /audit-bugs.
6
- ---
7
-
8
- ## Правило применимости (Relevance Rule)
9
-
10
- Применим к любому коду с бизнес-логикой. Пропускай только автогенерированные файлы (миграции, protobuf-generated, build output) и чисто декларативные конфиги (JSON, YAML без логики).
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» по префиксу `BUG-`.
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
- | BUG-01 | Преобразования типов безопасны: ошибки парсинга обрабатываются, нет небезопасного приведения |
61
- | BUG-02 | Асинхронные/конкурентные вызовы ожидаются корректно, результат не теряется |
62
- | BUG-03 | Null-safety соблюдается — обращения к свойствам защищены от undefined/null |
63
- | BUG-04 | Функции не мутируют входные аргументы (sort, splice, object spread) |
64
- | BUG-05 | Exhaustive handling — все enum/union-ветки обработаны |
65
- | BUG-06 | Математические guard-условия (деление на ноль, граничные значения) |
66
- | BUG-07 | Off-by-one: границы диапазонов корректны (`<` vs `<=`, индексы массивов, slice) |
67
- | BUG-08 | Float comparison не использует `===` для проверки равенства (используется epsilon или toFixed) |
68
- | BUG-09 | Дата/время хранятся и обрабатываются в UTC, не локальном времени |
69
- | BUG-10 | RegExp с user input не содержит катастрофического backtracking (ReDoS) |
70
-
71
- ## Правила верификации
72
-
73
- 1. **Только чеклист**: оценивай ТОЛЬКО проверки выше. Не добавляй новые.
74
- 2. **Явная верификация = PASS**: ставь `✅ PASS` только если явно проверил механизм (нашёл схему, конфиг, guard) и подтвердил отсутствие нарушения — укажи что именно проверено.
75
- 3. **Нет доказательства = UNVERIFIED**: не можешь указать `файл:строка` ни для нарушения, ни для подтверждения — ставь `🔍 UNVERIFIED`.
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
- > Примеры ниже — иллюстративные (Node/TS). Конкретику текущего рантайма бери из
111
- > загруженного профиля (`stacks/<runtime>.md`, секции Idioms/Anti-patterns/Check-ID hints).
112
-
113
- **BUG-01 — Преобразования типов безопасны:**
114
- - Парсинг строки в число без обработки ошибки/результата
115
- - Небезопасное приведение типа без проверки успешности
116
- - Неявное приведение типов с неожиданным результатом
117
- - Сравнение значений разных типов с неявным coercion
118
- - В Go это проигнорированная ошибка `strconv` (`v, _ := strconv.Atoi(...)`) или type assertion `x.(T)` без comma-ok; radix/`==`-coercion — **N/A** при отсутствии парсинга строк (см. Check-ID hints профиля).
119
-
120
- **BUG-02 — Асинхронные/конкурентные вызовы ожидаются корректно:**
121
- - Асинхронный вызов запущен, но его результат/ошибка не дожидается
122
- - Условие на необёрнутом отложенном результате (всегда truthy)
123
- - Параллельный вызов теряется, потому что не синхронизирован
124
- - В Node: `await` внутри `forEach` (итерация не ждёт промисов), `if (asyncFn())` вместо `if (await asyncFn())`, async-вызов без `await`, `Promise` без обработки ошибки. В Go синтаксис forEach отсутствует (**N/A**), аналогичный риск — в CON-01.
125
-
126
- **BUG-03 — Null-safety соблюдается:**
127
- - Обращение к свойству без проверки на null/undefined
128
- - Опциональная цепочка пропущена (`obj.a.b` там где `obj.a` может быть undefined)
129
- - Деструктуризация без дефолтного значения при возможном undefined
130
- - В Go: разыменование nil-указателя/интерфейса; обращение к nil-map; запись в nil-map = паника; map-доступ без `v, ok := m[k]`
131
-
132
- **BUG-04 — Функции не мутируют входные аргументы:**
133
- - `Array.sort()` на переданном массиве без предварительного `.slice()`
134
- - `Array.splice()` изменяет оригинальный массив-аргумент
135
- - Прямое присваивание свойств объекта-аргумента вместо создания копии через spread
136
- - В Go: `sort.Slice` мутирует переданный слайс на месте; запись в slice/map-аргумент видна вызывающему
137
-
138
- **BUG-05 — Exhaustive handling:**
139
- - `switch` без `default` на enum-значении — новое значение enum пройдёт незамеченным
140
- - Union type без обработки всех вариантов в if/else цепочке
141
- - Отсутствие never-проверки для исчерпывающего TypeScript switch
142
- - В Go: `switch` по значению без ветки `default`
143
-
144
- **BUG-06 — Математические guard-условия:**
145
- - Деление на ноль без guard-проверки знаменателя
146
- - `Number()` / `parseInt()` без проверки результата на NaN перед использованием
147
- - Граничные значения не проверяются (отрицательный индекс, пустой массив)
148
-
149
- **BUG-07 — Off-by-one:**
150
- - `for (i = 0; i <= arr.length; i++)` — выход за границы массива
151
- - `slice(0, n)` / `slice(0, n-1)` — потеря или дублирование последнего элемента
152
- - Сравнение `index < arr.length - 1` там где нужно `index < arr.length`
153
- - Пагинация: `offset * limit` vs `(offset - 1) * limit` при 1-based страницах
154
-
155
- **BUG-08 — Float comparison:**
156
- - `a === b` где a и b — результаты float-арифметики (0.1 + 0.2 !== 0.3)
157
- - Сравнение денежных сумм через float вместо integer cents / BigDecimal
158
- - Условие `if (parseFloat(x) === 1.0)` вместо `Math.abs(x - 1.0) < epsilon`
159
- - В Go: сравнение `float64` через `==`; деньги — в `int64` (центы) или `shopspring/decimal`
160
-
161
- **BUG-09 — Дата/время в UTC:**
162
- - `new Date()` без явной UTC-обработки — результат зависит от timezone сервера
163
- - Сравнение дат через `toLocaleDateString()` — зависит от локали
164
- - Хранение timestamp как local datetime строки вместо ISO 8601 с `Z`
165
- - `new Date('2024-01-01')` парсится как UTC, `new Date('2024-01-01 00:00')` — как local
166
- - В Go: `time.Now()` вместо `time.Now().UTC()` — результат зависит от часового пояса сервера
167
-
168
- **BUG-10 — ReDoS:**
169
- - `new RegExp(userInput)` — пользователь контролирует регулярное выражение
170
- - Вложенные quantifiers на перекрывающихся классах: `(a+)+`, `(a*)*`, `([a-zA-Z]+\s?)+`
171
- - Проверка: `'a'.repeat(50000) + 'x'` на подозрительном regex вешает event loop
172
- - Особо опасно в middleware (auth, routing), где regex применяется к каждому запросу
173
- - В Go движок `regexp` (RE2) не имеет backtracking → ReDoS практически невозможен; помечай `N/A` или `Low` (см. профиль)
174
-
175
- ## Граница с другими аудитами
176
-
177
- - **Обработка ошибок** (timeout, retry, circuit breaker) → `audit-errors`
178
- - **Race conditions, транзакции** → `audit-concurrency`
179
- - **Валидация входных данных** → `audit-validation`
180
- - **Безопасность (injection, XSS)** → `audit-owasp`
181
-
182
- ## Формат вывода
183
-
184
- | Check ID | Проверка | Статус | Уверенность | Доказательство | Решение | Исправлено |
185
- |----------|----------|--------|-------------|----------------|---------|------------|
186
- | BUG-01 | Преобразования типов безопасны: ошибки парсинга обрабатываются, нет небезопасного приведения | ✅ PASS | High | `src/` — parseInt всегда с radix | — | — |
187
- | BUG-03 | Null-safety соблюдается — обращения к свойствам защищены от undefined/null | ❌ FAIL 🟠 | High | `services/order.ts:55` | **1. Добавить опциональную цепочку: `user?.address?.city`** \\ 2. Добавить guard-проверку перед обращением \\ 3. Использовать nullish coalescing с дефолтом | Нет |
188
- | BUG-05 | Exhaustive handling — все enum/union-ветки обработаны | ⏸ ACCEPTED | Medium | `handlers/event.ts:23` | В baseline: exhaustive check через TypeScript never | — |
189
-
190
- Статусы: `✅ PASS` / `❌ FAIL 🔴` / `❌ FAIL 🟠` / `❌ FAIL 🟡` / `❌ FAIL 🟢` / `⏸ ACCEPTED` / `🔍 UNVERIFIED`
191
-
192
- Уверенность: `High` — проверил несколько ключевых файлов, паттерн очевиден / `Medium` — проверил выборочно, паттерн вероятен / `Low` — ограниченный контекст, полная уверенность невозможна
193
-
194
- Для `❌ FAIL`: ровно 3 варианта решения, разделитель `\\`, вариант 1 жирным.
195
-
196
- `Исправлено`: FAIL → `Нет` (разработчик меняет на `✅ Да` вручную после фикса). PASS / ACCEPTED / UNVERIFIED → `—`.
197
-
198
- Требования к решениям:
199
- - Взаимно исключающие (не перефразировки одного и того же)
200
- - Соответствуют текущему стеку проекта (не предлагать смену фреймворка)
201
- - Не требуют переписать всю систему — realistic migration cost
202
- - Вариант 3 может быть «оставить, задокументировать причину» при наличии обоснования
203
-
204
- В конце отчёта добавь раздел покрытия:
205
- ```
206
- ## Audit Coverage
207
- Проверено: src/module1/**, src/module2/**
208
- Пропущено: scripts/**, migrations/**, tests/**
209
- Файлов проверено: N | Пропущено: N
210
- ```
211
-
212
- Если все PASS — выведи: `✅ Явных логических ошибок не обнаружено.`
213
-
214
- ## Сохранение результатов
215
-
216
- 1. Найди папку сессии:
217
- ```bash
218
- ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
219
- ```
220
- Если пусто — создай: `mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")`
221
- 2. Сохрани через Write: `<AUDIT_DIR>/audit-bugs.md`
222
-
223
- ```
224
- # Audit Report: Bugs & Logic Errors — <YYYY-MM-DD HH:MM>
225
- <таблица>
226
- ```
@@ -1,197 +0,0 @@
1
- ---
2
- name: audit-concurrency
3
- description: >
4
- Аудит управления состоянием и конкурентности: race conditions, deadlocks, shared mutable state,
5
- неатомарные операции. Запускай при /audit-concurrency.
6
- ---
7
-
8
- ## Правило применимости (Relevance Rule)
9
-
10
- Применим к коду с параллельными операциями, shared state, кэшированием, транзакциями БД, очередями, WebSocket. Для однопоточных скриптов без параллелизма — верни пустой ответ.
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» по префиксу `CON-`.
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
- | CON-01 | Параллельные операции запускаются и синхронизируются корректно; результаты дожидаются, фоновые задачи не утекают |
61
- | CON-02 | Read-modify-write операции выполняются в транзакциях [⚡ dynamic] |
62
- | CON-03 | Разделяемое изменяемое состояние защищено синхронизацией (синглтоны, кэши, переменные уровня модуля) |
63
- | CON-04 | Module-level кэш имеет механизм инвалидации |
64
- | CON-05 | Обработчики событий и webhook-handlers идемпотентны [⚡ dynamic] |
65
- | CON-06 | Фоновые операции имеют механизм отмены и не блокируют graceful shutdown |
66
-
67
- ## Правила верификации
68
-
69
- 1. **Только чеклист**: оценивай ТОЛЬКО проверки выше. Не добавляй новые.
70
- 2. **Явная верификация = PASS**: ставь `✅ PASS` только если явно проверил механизм (нашёл схему, конфиг, guard) и подтвердил отсутствие нарушения — укажи что именно проверено.
71
- 3. **Нет доказательства = UNVERIFIED**: не можешь указать `файл:строка` ни для нарушения, ни для подтверждения — ставь `🔍 UNVERIFIED`.
72
- - Проверки с `[⚡ dynamic]` нельзя статически подтвердить — только `🔍 UNVERIFIED` или `❌ FAIL` (при явном evidence), но не `✅ PASS`
73
- 4. **Baseline приоритетен**: check_id есть в `docs/audit-baseline.yml` → `⏸ ACCEPTED`.
74
- 5. **Только 🔴/🟠 FAIL требуют решения**: 🟡/🟢 — решение необязательно.
75
-
76
- ## Evidence Quality Rules
77
-
78
- Любой `❌ FAIL` обязан содержать:
79
- - Точный `file:line`
80
- - Минимальный код-фрагмент (1–3 строки)
81
- - Causal chain: почему именно это нарушение → какой риск возникает
82
-
83
- Запрещено:
84
- - Предполагать runtime behavior без evidence в коде
85
- - Предполагать prod-конфигурацию по dev-конфигу
86
- - Предполагать отсутствие middleware без проверки всей router chain
87
- - Если вывод основан на предположении — только `🔍 UNVERIFIED`
88
-
89
- ## Language Rule
90
-
91
- Результаты аудита должны быть написаны простым и понятным языком. Избегай сложных терминов, жаргона и абстрактных понятий без необходимости. Общепринятые технические термины (Docker, HTTP, API, JSON, URL) допустимы. Описывай проблемы так, чтобы они были понятны разработчику любого уровня, а не только узкому специалисту в данной области.
92
-
93
- ## Baseline
94
-
95
- До анализа:
96
- ```bash
97
- if [ ! -f ./docs/audit-baseline.yml ]; then
98
- mkdir -p ./docs
99
- cp ./skills/audit/audit-baseline-template.yml ./docs/audit-baseline.yml 2>/dev/null || \
100
- printf "accepted: []\n" > ./docs/audit-baseline.yml
101
- fi
102
- cat ./docs/audit-baseline.yml
103
- ```
104
-
105
- ## Контекст анализа
106
-
107
- > Примеры ниже — иллюстративные (Node/TS). Конкретику текущего рантайма бери из
108
- > загруженного профиля (`stacks/<runtime>.md`, секции Idioms/Anti-patterns/Check-ID hints).
109
-
110
- **CON-01 — Параллельные операции запускаются и синхронизируются корректно:**
111
- - Параллельная операция запущена, но её результат не дожидается (теряется)
112
- - Фоновая задача утекает — нет пути её завершения
113
- - Shared state между параллельными операциями без синхронизации
114
- - В Node: `await` внутри `forEach` (итерация не ждёт промисов); `async` в `Array.map` без `Promise.all` (промисы не ожидаются)
115
- - В Go: goroutine без `WaitGroup`/`errgroup`/`ctx` → потеря результата или goroutine leak; захват loop-переменной в `for { go f(loopVar) }` (до Go 1.22); незакрытый канал блокирует получателей
116
-
117
- **CON-02 — Read-modify-write в транзакциях:**
118
- - SELECT + UPDATE без транзакции (TOCTOU — time-of-check to time-of-use)
119
- - Двойное списание/начисление без транзакции с блокировкой
120
- - Check-then-act без атомарности (читаем → проверяем → пишем без lock)
121
- - Optimistic locking без retry при конфликте версий
122
- - Кэш-инвалидация между чтением и записью
123
-
124
- **CON-03 — Разделяемое изменяемое состояние защищено синхронизацией:**
125
- - Глобальные переменные, изменяемые из нескольких мест без синхронизации
126
- - Синглтоны с mutable state без синхронизации
127
- - Closure над изменяемой переменной в async callback
128
- - Конкурентная запись в один файл/ресурс без координации
129
- - В Go: map/переменная уровня пакета без `sync.Mutex`/atomic при конкурентном доступе → data race; ловится `go test -race`
130
-
131
- **CON-04 — Module-level кэш инвалидируется:**
132
- - Module-level кэш без механизма инвалидации при обновлении данных
133
- - Кэш без TTL (stale data не обновляется никогда)
134
- - Нет стратегии обновления кэша при изменении исходных данных
135
-
136
- **CON-05 — Идемпотентность обработчиков:**
137
- - Обработчики событий/сообщений без идемпотентности (повторная доставка не безопасна)
138
- - Нет защиты от дублирующихся webhook-вызовов (нет проверки event_id)
139
- - Финансовые или критические операции без идемпотентного ключа
140
-
141
- **CON-06 — Фоновые операции с механизмом отмены:**
142
- - Фоновая операция запущена без механизма отмены — при shutdown процесс не завершается чисто
143
- - Background job без timeout и без механизма принудительной остановки
144
- - Graceful shutdown не ожидает завершения фоновых задач
145
- - В Node: Promise-цепочка в фоне без `AbortController`/`signal`; `setInterval`/`setImmediate` в request handler без очистки; `Promise.all` с неотменяемыми задачами
146
- - В Go: фоновая goroutine не слушает `ctx.Done()` → не завершается при shutdown; нужен `context.Context` с проверкой отмены
147
-
148
- ## Граница с другими аудитами
149
-
150
- - **Идемпотентность** — этот скилл первичный (CON-05). `audit-errors` ссылается сюда.
151
- - **async/await в forEach** — первичный: `audit-bugs` (BUG-02). `audit-concurrency` (CON-01) фокусируется на параллелизме, а не на синтаксической ошибке.
152
-
153
- ## Формат вывода
154
-
155
- | Check ID | Проверка | Статус | Уверенность | Доказательство | Решение | Исправлено |
156
- |----------|----------|--------|-------------|----------------|---------|------------|
157
- | CON-01 | Параллельные операции запускаются и синхронизируются корректно; результаты дожидаются, фоновые задачи не утекают | ✅ PASS | High | `src/` — async forEach не найден | — | — |
158
- | CON-02 | Read-modify-write операции выполняются в транзакциях | ❌ FAIL 🔴 | High | `services/wallet.ts:67` | **1. Обернуть в db.transaction() с SELECT FOR UPDATE** \\ 2. Использовать optimistic locking с retry \\ 3. Добавить уникальное ограничение на уровне БД [⚡ dynamic] | Нет |
159
- | CON-05 | Обработчики событий и webhook-handlers идемпотентны | ⏸ ACCEPTED | Medium | `handlers/stripe.ts:12` | В baseline: идемпотентность обеспечена через event_id [⚡ dynamic] | — |
160
-
161
- Статусы: `✅ PASS` / `❌ FAIL 🔴` / `❌ FAIL 🟠` / `❌ FAIL 🟡` / `❌ FAIL 🟢` / `⏸ ACCEPTED` / `🔍 UNVERIFIED`
162
-
163
- Уверенность: `High` — проверил несколько ключевых файлов, паттерн очевиден / `Medium` — проверил выборочно, паттерн вероятен / `Low` — ограниченный контекст, полная уверенность невозможна
164
-
165
- Для `❌ FAIL`: ровно 3 варианта решения, разделитель `\\`, вариант 1 жирным.
166
-
167
- `Исправлено`: FAIL → `Нет` (разработчик меняет на `✅ Да` вручную после фикса). PASS / ACCEPTED / UNVERIFIED → `—`.
168
-
169
- Требования к решениям:
170
- - Взаимно исключающие (не перефразировки одного и того же)
171
- - Соответствуют текущему стеку проекта (не предлагать смену фреймворка)
172
- - Не требуют переписать всю систему — realistic migration cost
173
- - Вариант 3 может быть «оставить, задокументировать причину» при наличии обоснования
174
-
175
- В конце отчёта добавь раздел покрытия:
176
- ```
177
- ## Audit Coverage
178
- Проверено: src/module1/**, src/module2/**
179
- Пропущено: scripts/**, migrations/**, tests/**
180
- Файлов проверено: N | Пропущено: N
181
- ```
182
-
183
- Если все PASS — выведи: `✅ Проблем с конкурентностью не обнаружено.`
184
-
185
- ## Сохранение результатов
186
-
187
- 1. Найди папку сессии:
188
- ```bash
189
- ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
190
- ```
191
- Если пусто — создай: `mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")`
192
- 2. Сохрани через Write: `<AUDIT_DIR>/audit-concurrency.md`
193
-
194
- ```
195
- # Audit Report: State & Concurrency — <YYYY-MM-DD HH:MM>
196
- <таблица>
197
- ```