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,205 +0,0 @@
1
- ---
2
- name: audit
3
- description: >
4
- Мастер-оркестратор комплексного аудита кодовой базы. Запускает все 18 специализированных
5
- проверок и группирует результаты по компонентам системы. Вызывай при /audit или
6
- запросе "полный аудит", "комплексный аудит кодовой базы".
7
- ---
8
-
9
- ## Задача
10
-
11
- Ты — ведущий инженер по качеству и безопасности, проводящий полный аудит кодовой базы.
12
-
13
- ## Шаг 0 — Runtime resolution (определение стека)
14
-
15
- Аудиты стек-агностичны: конкретика берётся из профиля стека. Определи рантайм
16
- ОДИН раз здесь и передай его всем саб-скиллам, чтобы они не передетектили.
17
-
18
- ```bash
19
- if [ -f package.json ]; then echo "runtime=node"
20
- elif [ -f go.mod ]; then echo "runtime=go"
21
- elif [ -f pyproject.toml ] || [ -f requirements.txt ] || [ -f setup.py ]; then echo "runtime=python"
22
- elif [ -f Cargo.toml ]; then echo "runtime=rust"
23
- elif [ -f pom.xml ] || ls build.gradle* settings.gradle* >/dev/null 2>&1; then echo "runtime=java"
24
- else echo "runtime=generic"; fi
25
- ```
26
-
27
- Один запуск `/audit` = ОДИН рантайм. **Полиглот-репозиторий** (например Go-бэкенд
28
- + Node-фронтенд в сабмодулях) аудить по подпроектам: запусти `/audit` отдельно
29
- внутри каждого подкаталога (`backend/`, `frontend/`). Если в текущем каталоге
30
- несколько маркеров — выбери по scope и сообщи об этом пользователю.
31
-
32
- Прочитай профиль один раз через Read: `./skills/audit/stacks/<runtime>.md`
33
- (fallback `./skills/audit/stacks/_generic.md`). Канон детекта — `./skills/audit/runtime-detect.md`.
34
-
35
- Передавай `runtime=<id>` + содержимое профиля как контекст каждому sub-скиллу
36
- (тем же каналом, что и baseline). Саб-скиллы увидят это и пропустят собственный
37
- детект; при автономном запуске они детектят сами.
38
-
39
- ## Шаг 1 — Подготовка сессии
40
-
41
- Выполни через Bash:
42
-
43
- ```bash
44
- # Удалить старые сессии, оставить 2 последних
45
- ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | tail -n +3 | xargs rm -rf 2>/dev/null
46
- # Создать папку новой сессии
47
- mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")
48
- ```
49
-
50
- Для incremental-аудита (только изменённые файлы) — определи scope:
51
- ```bash
52
- git diff --name-only HEAD~1 2>/dev/null | grep -E '\.(ts|js|py|go|rs)$' | head -30
53
- ```
54
- Если список < 20 файлов — начинай аудит с них, затем критические пути.
55
-
56
- ## Шаг 2 — Baseline
57
-
58
- ```bash
59
- cat ./docs/audit-baseline.yml 2>/dev/null
60
- ```
61
-
62
- Если файл не существует — создай:
63
-
64
- ```bash
65
- cp ./skills/audit/audit-baseline-template.yml ./docs/audit-baseline.yml 2>/dev/null || \
66
- printf "accepted: []\n" > ./docs/audit-baseline.yml
67
- ```
68
-
69
- Сообщи: `📋 docs/audit-baseline.yml создан. Заполни для подавления принятых рисков.`
70
-
71
- Содержимое baseline передавай как контекст каждому sub-скиллу (вместе с `runtime=<id>` и профилем из Шага 0).
72
-
73
- ## Шаг 3 — Декомпозиция системы
74
-
75
- Перечисли логические компоненты (Аутентификация, API, Фоновые задачи и т.д.) перед запуском аудитов. Используй структуру папок как ориентир.
76
-
77
- ## Шаг 3.5 — Критические пути (Risk-Based Prioritization)
78
-
79
- ```bash
80
- grep -rl "auth\|login\|payment\|billing\|webhook\|cron\|migration" ./src 2>/dev/null | head -20
81
- ```
82
-
83
- Перечисли critical paths — файлы/модули с наибольшим blast radius:
84
- ```
85
- Critical paths (exhaustive depth):
86
- - Authentication: src/auth/**
87
- - Payments: src/payments/**
88
- - Webhooks/Workers: src/workers/**
89
-
90
- Standard paths: src/api/**, src/services/**
91
- Low priority (naming/style): src/utils/**
92
- ```
93
-
94
- Передавай список critical paths каждому sub-скиллу — они должны начинать с этих файлов.
95
-
96
- ## Шаг 4 — Анализ по 18 направлениям
97
-
98
- **ОБЯЗАТЕЛЬНО:** Для каждого направления вызови специализированный скилл через `Skill`. Прямой анализ без скилла недопустим.
99
-
100
- **Правило пропуска:** направление нерелевантно → пропусти без упоминания.
101
-
102
- Скиллы сгруппированы для параллельного запуска. Группы выполняются последовательно — скиллы внутри группы можно запускать параллельно через Agent-вызовы.
103
-
104
- **Группа А — Безопасность:**
105
- | # | Направление | Скилл |
106
- |---|-------------|-------|
107
- | 1 | Secrets Leak | `audit-secrets` |
108
- | 2 | OWASP Security | `audit-owasp` |
109
- | 3 | Boundary Validation | `audit-validation` |
110
-
111
- **Группа Б — Логика:**
112
- | # | Направление | Скилл |
113
- |---|-------------|-------|
114
- | 4 | Bugs & Logic | `audit-bugs` |
115
- | 5 | Error Handling | `audit-errors` |
116
- | 6 | Concurrency | `audit-concurrency` |
117
-
118
- **Группа В — Качество:**
119
- | # | Направление | Скилл |
120
- |---|-------------|-------|
121
- | 7 | Architecture | `audit-architecture` |
122
- | 8 | Naming | `audit-naming` |
123
- | 9 | YAGNI | `audit-yagni` |
124
- | 10 | Reinventing the Wheel | `audit-reinvention` |
125
- | 11 | Documentation | `audit-docs` |
126
-
127
- **Группа Г — Операции:**
128
- | # | Направление | Скилл |
129
- |---|-------------|-------|
130
- | 12 | Tests & Linters | `audit-tests` |
131
- | 13 | Logging | `audit-logging` |
132
- | 14 | Performance | `audit-performance` |
133
- | 15 | Deployment | `audit-deployment` |
134
- | 16 | API Contracts | `audit-api-contracts` |
135
- | 17 | Meta-контроль | `audit-meta` |
136
-
137
- **Группа Д — Системный уровень:**
138
- | # | Направление | Скилл |
139
- |---|-------------|-------|
140
- | 18 | Матрица взаимодействий | `audit-matrix` |
141
-
142
- **Каждый скилл ОБЯЗАН сохранить файл в папку сессии: `./docs/audits/<SESSION>/audit-<name>.md`**
143
-
144
- ## Шаг 5 — Сводный отчёт по компонентам
145
-
146
- После всех скиллов собери только строки `❌ FAIL` и `⏸ ACCEPTED`:
147
-
148
- ```
149
- ## Компонент: [Название]
150
-
151
- | Check ID | Проверка | Статус | Доказательство | Решение | Исправлено |
152
- |----------|----------|--------|----------------|---------|------------|
153
- | OWA-02 | Auth на protected routes | ❌ FAIL 🔴 | `routes/admin.ts:14` | **1. Добавить authMiddleware** \\ 2. ... \\ 3. ... | Нет |
154
- | OWA-06 | Rate limiting | ⏸ ACCEPTED | `src/app.ts` | В baseline: nginx rate limit | — |
155
- ```
156
-
157
- Если все PASS — выведи: `✅ Проблем не обнаружено.`
158
-
159
- ## Шаг 6 — Итоговая таблица
160
-
161
- ```
162
- ## Сводка
163
-
164
- | Компонент | ❌ FAIL 🔴 | ❌ FAIL 🟠 | ❌ FAIL 🟡🟢 | ⏸ ACCEPTED | Итого FAIL |
165
- |-----------|-----------|-----------|------------|-----------|------------|
166
- | [Компонент] | N | N | N | N | N |
167
- | **ИТОГО** | **N** | **N** | **N** | **N** | **N** |
168
- ```
169
-
170
- ## Шаг 7 — Разбор FAIL 🔴
171
-
172
- Для каждого `❌ FAIL 🔴`:
173
-
174
- ```
175
- ### 🔴 [Check ID] — [Компонент]
176
- **Файл:** `path/file.ts:line`
177
- **Проверка:** [название]
178
- **Доказательство:** [конкретный код]
179
- **Решение:** [первый вариант из таблицы]
180
- ```
181
-
182
- ## Шаг 8 — Финальная верификация
183
-
184
- Вызови: `Skill("audit-verify")`
185
-
186
- Затем вызови: `Skill("audit-meta")`
187
-
188
- ## Шаг 9 — Сохранение
189
-
190
- Сохрани полный отчёт через Write: `./docs/audits/<SESSION>/audit-report.md`
191
-
192
- ```
193
- # Full Audit Report — <YYYY-MM-DD HH:MM>
194
- ## Компоненты системы
195
- ## Компонент: [Название]
196
- ## Сводка
197
- ## Критические риски
198
- ```
199
-
200
- Сообщи путь к папке сессии и число FAIL по severity.
201
-
202
- ## Language Rule
203
-
204
- Результаты аудита должны быть написаны простым и понятным языком. Избегай сложных терминов, жаргона и абстрактных понятий без необходимости. Общепринятые технические термины (Docker, HTTP, API, JSON, URL) допустимы. Описывай проблемы так, чтобы они были понятны разработчику любого уровня, а не только узкому специалисту в данной области.
205
-
@@ -1,188 +0,0 @@
1
- # audit-baseline.yml
2
- # Принятые/отложенные риски. Совпадение по check_id → статус ⏸ ACCEPTED в отчёте.
3
- # Скопируй в корень проекта: docs/audit-baseline.yml
4
- #
5
- # check_id стек-нейтральны: один и тот же идентификатор применяется к любому
6
- # рантайму (Node/TS, Go, Python, Rust, Java). Конкретика стека берётся из
7
- # профилей skills/audit/stacks/<runtime>.md и не влияет на матчинг по check_id.
8
-
9
- accepted:
10
- # Пример:
11
- # - check_id: OWA-06
12
- # file: src/app.ts # Опционально: ограничить конкретным файлом
13
- # reason: "Rate limiting на nginx уровне"
14
- # type: accepted-risk # accepted-risk | false-positive | intentional-design
15
- # accepted_by: username
16
- # accepted_date: 2026-01-01
17
- # expires: 2026-12-31 # Опционально: когда пересмотреть
18
-
19
- # ─────────────────────────────────────────
20
- # Ложные срабатывания (инструмент ошибся, нарушения нет)
21
- false_positives:
22
- # - check_id: ARC-03
23
- # reason: "import cycle from prisma-generated client, not real cycle"
24
- # type: false-positive
25
-
26
- # Намеренные архитектурные решения (не баги, обоснованный выбор)
27
- intentional:
28
- # - check_id: NAM-06
29
- # reason: "utils.ts contains 3 tightly related helpers, intentional"
30
- # type: intentional-design
31
-
32
- # ─────────────────────────────────────────
33
- # ПОЛНЫЙ СПИСОК check_id
34
- # ─────────────────────────────────────────
35
- #
36
- # audit-secrets:
37
- # SEC-01 Нет hardcoded credentials в коде (пароли, токены, API-ключи, приватные ключи)
38
- # SEC-02 Файлы с секретами исключены из VCS (.env* в .gitignore)
39
- # SEC-03 Секреты не передаются через URL (query params, Basic Auth в URL)
40
- # SEC-04 .env.example содержит только placeholder-значения без реальных данных
41
- # SEC-05 Dockerfile не содержит секретов в ENV-директивах
42
- # SEC-06 Комментарии в коде не содержат credentials
43
- # SEC-07 Автоматическое сканирование секретов настроено (pre-commit или CI)
44
- #
45
- # audit-owasp:
46
- # OWA-01 A03: Все запросы к БД/OS/LDAP параметризованы, нет injection
47
- # OWA-02 A01: Все защищённые маршруты имеют auth-middleware
48
- # OWA-03 A01: Resource ownership проверяется, нет IDOR
49
- # OWA-04 A02: Пароли хранятся безопасно (bcrypt/argon2/scrypt)
50
- # OWA-05 A05: Безопасная конфигурация сервера (CORS, security headers, body limits)
51
- # OWA-06 A07: Защита от перебора (rate limiting на auth и чувствительных эндпоинтах)
52
- # OWA-07 A09: Техническая информация не утекает в ответы (stack trace, внутренние пути)
53
- # OWA-08 A10: URL из user input не передаётся в HTTP-клиент без whitelist (SSRF)
54
- # OWA-09 A05: CSRF-защита реализована (SameSite cookies или CSRF-токены на state-changing запросах)
55
- #
56
- # audit-validation:
57
- # VAL-01 Все входящие данные (body, params, query) проходят schema-валидацию
58
- # VAL-02 Строки имеют maxLength, числа — диапазон, enum-значения — whitelist
59
- # VAL-03 JSON.parse обёрнут в try/catch с последующей валидацией структуры
60
- # VAL-04 Identity данные берутся из аутентифицированного контекста (не из user input)
61
- # VAL-05 Вложенные структуры и массивы ограничены (глубина, minItems/maxItems)
62
- # VAL-06 Валидатор не выполняет неявный coercion
63
- # VAL-07 Prototype pollution: merge/assign с user input фильтрует __proto__, constructor, prototype
64
- # VAL-08 Загрузка файлов: MIME тип проверяется по содержимому, имя файла санитизировано, размер ограничен
65
- #
66
- # audit-errors:
67
- # ERR-01 Ошибки не проглатываются — catch-блоки обрабатывают или пробрасывают
68
- # ERR-02 Внутренние детали (stack trace, пути, версии) не попадают в ответы
69
- # ERR-03 Async handlers корректно пробрасывают исключения в error middleware
70
- # ERR-04 Unhandled rejections и uncaught exceptions имеют process-level обработчики
71
- # ERR-05 Внешние вызовы (HTTP-клиенты, DB) имеют явные таймауты
72
- # ERR-06 Graceful shutdown реализован — SIGTERM обрабатывается
73
- # ERR-07 Error responses консистентны по структуре во всём приложении
74
- # ERR-08 Retry-стратегии используют exponential backoff с jitter
75
- # ERR-09 AbortSignal/CancellationToken пробрасывается во внешние вызовы
76
- #
77
- # audit-logging:
78
- # LOG-01 Production-код не использует console.log/console.error напрямую
79
- # LOG-02 PII не логируется (email, телефон, имена, адреса, финансовые данные)
80
- # LOG-03 Секреты и токены не попадают в логи
81
- # LOG-04 Запросы трассируются (Request ID или correlation ID сквозной)
82
- # LOG-05 Формат логов структурирован (JSON) в production
83
- # LOG-06 Критические операции логируются (auth, create, update, delete)
84
- # LOG-07 User input санитизируется перед логированием (защита от log injection)
85
- # LOG-08 Критические события безопасности логируются: вход, выход, изменение прав, массовая выгрузка данных
86
- #
87
- # audit-performance:
88
- # PER-01 Нет N+1: DB-запросы не выполняются внутри циклов
89
- # PER-02 Выборки из БД ограничены (LIMIT, пагинация)
90
- # PER-03 Обработчики запросов не содержат блокирующего I/O
91
- # PER-04 CPU-интенсивные операции вынесены из main thread
92
- # PER-05 Независимые async-операции выполняются параллельно
93
- # PER-06 Кэши ограничены по размеру и времени жизни (TTL + size limit)
94
- # PER-07 Event listeners и subscriptions очищаются при завершении
95
- # PER-08 Нет утечек памяти: timers и closures не удерживают большие объекты в долгоживущем scope
96
- #
97
- # audit-architecture:
98
- # ARC-01 Бизнес-логика вынесена из route handlers в service/domain слой
99
- # ARC-02 Presentation layer не взаимодействует с БД напрямую
100
- # ARC-03 Нет circular dependencies между модулями
101
- # ARC-04 Нет god-объектов: файлы и классы имеют единственную ответственность
102
- # ARC-05 Конфигурация и env-переменные изолированы в config-модуле
103
- # ARC-06 Внешние зависимости инжектируются (DI), не импортируются напрямую
104
- # ARC-07 Доменный слой не импортирует инфраструктурные модули
105
- #
106
- # audit-concurrency:
107
- # CON-01 async/await не используется в неасинхронных итераторах (forEach, map)
108
- # CON-02 Read-modify-write операции выполняются в транзакциях
109
- # CON-03 Нет shared mutable state на уровне модуля (синглтоны, кэши без locks)
110
- # CON-04 Module-level кэш имеет механизм инвалидации
111
- # CON-05 Обработчики событий и webhook-handlers идемпотентны
112
- # CON-06 Background async операции имеют механизм отмены (AbortController/signal) и не блокируют graceful shutdown
113
- #
114
- # audit-naming:
115
- # NAM-01 Соглашение об именовании соблюдается консистентно (camelCase/snake_case)
116
- # NAM-02 Имена переменных, функций и классов описывают назначение, не реализацию
117
- # NAM-03 Boolean-переменные имеют предикативные имена (is/has/can/should)
118
- # NAM-04 Функции-читатели (get*/find*) не имеют side effects
119
- # NAM-05 Magic numbers и magic strings заменены именованными константами
120
- # NAM-06 Утилитные модули не являются свалкой несвязанного кода
121
- # NAM-07 Ключевые сущности названы в соответствии с доменным глоссарием
122
- #
123
- # audit-yagni:
124
- # YAGNI-01 Нет закомментированного кода
125
- # YAGNI-02 Нет dead code — неиспользуемых экспортов, функций, переменных
126
- # YAGNI-03 Абстракции оправданы: интерфейс/фабрика имеет >1 реализации или требуется тестами
127
- # YAGNI-04 Feature flags не зафиксированы в одном значении
128
- # YAGNI-05 Технический долг актуален — нет заброшенных TODO/FIXME без даты или прогресса
129
- #
130
- # audit-reinvention:
131
- # REINV-01 Нет ручной реализации того, что есть в stdlib/языке/рантайме
132
- # REINV-02 Нет ручной реализации того, что уже умеет установленная зависимость
133
- # REINV-03 Нет смыслового дублирования логики (одинаковый код в ≥2 местах вместо общей утилиты)
134
- # REINV-04 Крупные механизмы (ORM, DI, scheduler, logger, job queue) не написаны с нуля при наличии зрелого решения
135
- #
136
- # audit-docs:
137
- # DOC-01 README/онбординг документирует install/run/test/build, команды совпадают с package.json scripts
138
- # DOC-02 Env-переменные синхронизированы: используемые в коде задокументированы, нет задокументированных но неиспользуемых
139
- # DOC-03 Внутренние ссылки и пути в Markdown-документации ведут на существующие файлы и секции
140
- # DOC-04 Комментарии и JSDoc/docstring не противоречат коду (сигнатура, параметры, типы, поведение)
141
- # DOC-05 Публичная поверхность (экспортируемое API библиотеки/пакета) имеет doc-комментарий
142
- # DOC-06 Проектная/архитектурная документация не ссылается на удалённые/переименованные сущности
143
- #
144
- # audit-bugs:
145
- # BUG-01 Преобразования типов безопасны (NaN, radix, coercion)
146
- # BUG-02 async/await используется корректно (нет await в forEach, нет if(asyncFn()))
147
- # BUG-03 Null-safety соблюдается — обращения к свойствам защищены от undefined/null
148
- # BUG-04 Функции не мутируют входные аргументы (sort, splice, object spread)
149
- # BUG-05 Exhaustive handling — все enum/union-ветки обработаны
150
- # BUG-06 Математические guard-условия (деление на ноль, граничные значения)
151
- # BUG-07 Off-by-one: границы диапазонов корректны (< vs <=, индексы массивов, slice)
152
- # BUG-08 Float comparison не использует === для проверки равенства
153
- # BUG-09 Дата/время хранятся и обрабатываются в UTC, не локальном времени
154
- # BUG-10 RegExp с user input не содержит катастрофического backtracking (ReDoS)
155
- #
156
- # audit-tests:
157
- # TST-01 TypeScript strict mode включён
158
- # TST-02 Coverage thresholds настроены и применяются в CI
159
- # TST-03 Pre-commit/pre-push хуки запускают проверки (tests, lint, typecheck)
160
- # TST-04 Критические пути покрыты тестами (auth, validation, error handling)
161
- # TST-05 Тесты изолированы — нет shared mutable state между тестами
162
- # TST-06 Нет пропущенных или зафиксированных тестов (.only/.skip без обоснования)
163
- # TST-07 Тесты проверяют поведение, а не детали реализации
164
- # TST-08 Нет нестабильных тестов (Math.random, Date.now без mock, sleep)
165
- # TST-09 Snapshot-тесты охватывают значимые изменения, не весь DOM
166
- #
167
- # audit-deployment:
168
- # DEP-01 Docker images используют pinned versions (нет :latest)
169
- # DEP-02 Контейнеры запускаются от непривилегированного пользователя (USER nonroot)
170
- # DEP-03 Multi-stage build разделяет dev и prod зависимости
171
- # DEP-04 .dockerignore исключает node_modules, .git, .env
172
- # DEP-05 HEALTHCHECK определён в Dockerfile
173
- # DEP-06 Секреты не hardcoded в Dockerfile (нет в ENV)
174
- # DEP-07 .env исключён из VCS
175
- # DEP-08 .env.example документирует все переменные окружения
176
- # DEP-09 NODE_ENV корректно устанавливается для production
177
- # DEP-10 npm ci используется вместо npm install в Docker
178
- # DEP-11 Ограничения ресурсов контейнера определены (CPU limits, Memory limits)
179
- # DEP-12 Возможность запуска с read-only root filesystem проверена
180
- #
181
- # audit-api-contracts:
182
- # API-01 Форма ответов консистентна — единый envelope или его отсутствие по всему API
183
- # API-02 HTTP статус-коды семантически корректны (201 при создании, 4xx для client errors)
184
- # API-03 Error responses машиночитаемы и консистентны по структуре
185
- # API-04 Именование полей консистентно (camelCase или snake_case, не смешано)
186
- # API-05 Stack trace и внутренние детали не попадают в error responses
187
- # API-06 Пагинация включает метаданные (total/hasNext) где применима
188
- # API-07 Публичный API имеет стратегию версионирования
@@ -1,64 +0,0 @@
1
- # Runtime Detection & Stack Profile (общий канон)
2
-
3
- Этот файл — единый источник правды для того, как аудит-скилл определяет рантайм
4
- проекта и подгружает соответствующий **профиль стека** из `./skills/audit/stacks/`.
5
-
6
- Каждый кодовый аудит-скилл содержит инлайн-копию блока ниже (раздел
7
- «Runtime Detection & Stack Profile»). Инлайн-копия обязательна — она гарантирует,
8
- что скилл работает автономно (`/audit-<name>`), даже если оркестратор `/audit`
9
- не запускался. Этот файл — справочник и место для синхронной правки канона.
10
-
11
- ## Принцип
12
-
13
- Один запуск аудита = **ровно один рантайм**. Скилл:
14
- 1. принимает рантайм, инъектированный оркестратором, ЕСЛИ он передан; иначе
15
- 2. определяет ровно один рантайм текущего каталога; затем
16
- 3. читает профиль и использует его инструменты/идиомы/анти-паттерны.
17
-
18
- Полиглот-репозитории (например Go-бэкенд + Node-фронтенд в одном дереве)
19
- аудитятся по подпроектам: запусти аудит отдельно внутри каждого подкаталога.
20
-
21
- ## Канонический блок (вставляется в каждый кодовый скилл)
22
-
23
- ```
24
- ## Runtime Detection & Stack Profile
25
-
26
- Этот аудит стек-агностичен: проверки сформулированы нейтрально, а конкретика
27
- (инструменты, идиомы, анти-паттерны, примеры) берётся из профиля стека.
28
-
29
- 1. **Профиль передан контекстом?** Если оркестратор `/audit` передал
30
- `runtime=<id>` и/или содержимое профиля — используй его, шаги 2–3 пропусти.
31
-
32
- 2. **Иначе определи РОВНО ОДИН рантайм** этого каталога:
33
- ```bash
34
- if [ -f package.json ]; then echo "runtime=node"
35
- elif [ -f go.mod ]; then echo "runtime=go"
36
- elif [ -f pyproject.toml ] || [ -f requirements.txt ] || [ -f setup.py ]; then echo "runtime=python"
37
- elif [ -f Cargo.toml ]; then echo "runtime=rust"
38
- elif [ -f pom.xml ] || ls build.gradle* settings.gradle* >/dev/null 2>&1; then echo "runtime=java"
39
- else echo "runtime=generic"; fi
40
- ```
41
- Один запуск = один рантайм; не миксуй backend и frontend. Если найдено
42
- несколько маркеров (монорепо) — выбери соответствующий текущему scope/анализируемым
43
- файлам и зафиксируй выбор в разделе Audit Coverage.
44
-
45
- 3. **Загрузи профиль** через Read: `./skills/audit/stacks/<runtime>.md`
46
- (fallback `./skills/audit/stacks/_generic.md`, если файл не найден).
47
-
48
- Дальше используй профиль:
49
- - **Инструменты** — из секции «Tooling by category» профиля (раздел
50
- «Инструментальная поддержка» ниже ссылается на категории, а не на команды).
51
- - **Ожидания PASS** — из «Idioms»; **формулировки FAIL** — из «Anti-patterns».
52
- - **Точечные подсказки** — из «Check-ID hints» по префиксу этого аудита.
53
- - Если профиль `tier: general` или `runtime=generic` → стек-специфичные находки
54
- без однозначного evidence помечай `🔍 UNVERIFIED`, а не `❌ FAIL`. Проверки,
55
- чей механизм в рантайме отсутствует, помечай `N/A`.
56
- ```
57
-
58
- ## Инъекция из оркестратора
59
-
60
- Мастер-скилл `audit/SKILL.md` определяет рантайм один раз (Шаг 0), читает профиль
61
- один раз и передаёт `runtime=<id>` + содержимое профиля каждому `Skill()` тем же
62
- каналом, что и baseline. Саб-скиллы видят это в шаге 1 и пропускают собственный
63
- детект. Автономность при этом не теряется: инлайн-блок отрабатывает сам, если
64
- инъекции нет.
@@ -1,41 +0,0 @@
1
- # Stack Profile: Generic (fallback) (id: generic)
2
- Tier: fallback
3
-
4
- Используется, когда рантайм не определён (нет известного маркер-файла) или нужный
5
- профиль не найден. Инструментов нет; работают только **стек-нейтральные** проверки.
6
-
7
- ## 1. Detection signals
8
- - ничего из известных маркеров (`package.json`, `go.mod`, `pyproject.toml`/`requirements.txt`, `Cargo.toml`, `pom.xml`/`build.gradle`)
9
-
10
- ## 2. Tooling by category
11
- | Категория | Команда | Как читать вывод |
12
- |-----------|---------|------------------|
13
- | unused-code | — | нет инструмента → ручной скан ссылок на символы → `🔍 UNVERIFIED` |
14
- | clone-detection | — | grep повторяющихся блоков вручную → `🔍 UNVERIFIED` |
15
- | dep-audit | — | нет → пометить «аудит зависимостей недоступен» |
16
- | env-extraction | `grep -rEoh '[A-Z][A-Z0-9_]{2,}' . 2>/dev/null \| sort -u` (грубо) | кандидаты в env-переменные, верифицируй вручную |
17
- | arch-lint | — | ручной разбор слоёв → `🔍 UNVERIFIED` |
18
- | lint/format | — | — |
19
- | type-check | — | — |
20
- | test-run | — | — |
21
- | secret-scan | `gitleaks detect --no-banner 2>/dev/null \|\| trufflehog filesystem . 2>/dev/null \|\| true` | стек-нейтрально, работает всегда |
22
-
23
- ## 3. Idioms
24
- Стек-нейтральные ожидания (применимы к любому языку):
25
- - Ошибки обрабатываются или явно пробрасываются, не подавляются молча.
26
- - Внешние вызовы имеют таймауты и механизм отмены.
27
- - Секреты не захардкожены; конфигурация изолирована.
28
- - Логи структурированы, без PII и секретов.
29
- - Имена описывают назначение; нет дублирования логики.
30
- - Документация (README, ссылки, env) синхронизирована с кодом.
31
-
32
- ## 4. Anti-patterns
33
- - Подавление ошибок без обработки.
34
- - Захардкоженные секреты, разбросанная конфигурация.
35
- - Дублирование логики, мёртвый код.
36
-
37
- ## 5. Check-ID hints
38
- Для всех стек-специфичных Check ID без однозначного evidence ставь `🔍 UNVERIFIED`.
39
- Реальные `✅ PASS`/`❌ FAIL` допустимы только для стек-нейтральных направлений:
40
- secrets (SEC-*), docs (DOC-*), naming-читаемость (NAM-02/03/05), bugs-логика
41
- (BUG-06/07/09), api-contracts (API-*) при наличии явного evidence.
@@ -1,47 +0,0 @@
1
- # Stack Profiles — реестр
2
-
3
- Таблица соответствия «маркер-файл → id профиля». Используется блоком
4
- Runtime Detection (см. `../runtime-detect.md`). Порядок проверки — сверху вниз,
5
- выбирается первый совпавший рантайм (один запуск = один рантайм).
6
-
7
- | Приоритет | Маркер-файл(ы) | runtime id | Профиль | Tier |
8
- |-----------|----------------|------------|---------|------|
9
- | 1 | `package.json` | `node` | `node.md` | first-class |
10
- | 2 | `go.mod` | `go` | `go.md` | first-class |
11
- | 3 | `pyproject.toml` / `requirements.txt` / `setup.py` | `python` | `python.md` | general |
12
- | 4 | `Cargo.toml` | `rust` | `rust.md` | general |
13
- | 5 | `pom.xml` / `build.gradle*` / `settings.gradle*` | `java` | `java.md` | general |
14
- | — | ничего из перечисленного | `generic` | `_generic.md` | fallback |
15
-
16
- ## Tier — что означает
17
-
18
- - **first-class** — профиль содержит конкретные инструменты и идиомы; находки
19
- могут быть `❌ FAIL` с точным evidence.
20
- - **general** — профиль даёт нейтральные формулировки и общие идиомы, но без
21
- гарантированных инструментов; стек-специфичные находки без однозначного
22
- evidence помечай `🔍 UNVERIFIED`.
23
- - **fallback** (`generic`) — инструментов нет; работают только стек-нейтральные
24
- проверки (docs-ссылки, secrets, naming-читаемость), остальное → `🔍 UNVERIFIED`.
25
-
26
- ## Категории инструментов (общие для всех профилей)
27
-
28
- Секция «Tooling by category» в каждом профиле использует один и тот же набор
29
- ключей, чтобы скиллы ссылались на категорию, а не на команду:
30
-
31
- `unused-code`, `clone-detection`, `dep-audit`, `env-extraction`, `arch-lint`,
32
- `lint/format`, `type-check`, `test-run`, `secret-scan`.
33
-
34
- ## Структура профиля
35
-
36
- Каждый `stacks/<id>.md` имеет одинаковые секции:
37
- 1. **Detection signals** — маркер-файлы.
38
- 2. **Tooling by category** — таблица по категориям выше.
39
- 3. **Idioms** — как выглядит «правильно» (ожидания PASS).
40
- 4. **Anti-patterns** — как выглядит FAIL (1 строка кода на пункт).
41
- 5. **Check-ID hints** — точечные подсказки по префиксу Check ID.
42
-
43
- ## Добавление нового стека
44
-
45
- 1. Создай `stacks/<id>.md` по структуре выше.
46
- 2. Добавь строку в таблицу реестра.
47
- 3. Добавь ветку в bash-детект в `../runtime-detect.md` и в инлайн-блоках скиллов.
@@ -1,66 +0,0 @@
1
- # Stack Profile: Go (id: go)
2
- Tier: first-class
3
-
4
- Профиль рантайма Go. Конкретные библиотеки (chi, gqlgen, sqlc, pgx, asynq, slog,
5
- go-oidc) упоминаются лишь как примеры идиом, а не как требования.
6
-
7
- ## 1. Detection signals
8
- - `go.mod` (основной маркер)
9
- - доп.: `go.sum`, `Taskfile.yml`/`Makefile`, `.golangci.yml`, `.go-arch-lint.yml`
10
-
11
- ## 2. Tooling by category
12
- | Категория | Команда | Как читать вывод |
13
- |-----------|---------|------------------|
14
- | unused-code | `deadcode ./... 2>/dev/null \|\| true` (golang.org/x/tools/cmd/deadcode) | недостижимые функции → YAGNI-02; верифицируй перед FAIL |
15
- | clone-detection | `dupl -threshold 50 ./... 2>/dev/null \|\| true` | дубли токенов → REINV-03 |
16
- | dep-audit | `govulncheck ./... 2>/dev/null \|\| true` | CVE в модулях (вне чеклиста — справочно) |
17
- | env-extraction | `grep -rEoh 'os\.Getenv\("[A-Z0-9_]+"\)' . 2>/dev/null \| sed -E 's/.*"(.*)".*/\1/' \| sort -u` | имена env из кода → DOC-02 (учти теги `env:"..."` для caarlos0/env) |
18
- | arch-lint | `go vet ./... 2>/dev/null`; слои: `go-arch-lint check 2>/dev/null \|\| true` | циклы импортов запрещены компилятором → ARC-03 на уровне пакетов авто-PASS |
19
- | lint/format | `golangci-lint run 2>/dev/null \|\| true`; `gofmt -l . 2>/dev/null` | включает `errcheck`, `gosec`, `nilness`, `staticcheck` |
20
- | type-check | `go build ./... 2>/dev/null \|\| true` | компиляция = проверка типов |
21
- | test-run | `go test ./... 2>/dev/null \|\| true`; гонки: `go test -race ./...` | `-race` обнаруживает data race → CON-03 |
22
- | secret-scan | `gitleaks detect --no-banner 2>/dev/null \|\| trufflehog filesystem . 2>/dev/null \|\| true` | стек-нейтрально |
23
-
24
- Всегда верифицируй вывод инструмента вручную (`file:line`) перед `❌ FAIL`.
25
-
26
- ## 3. Idioms (как выглядит «правильно» → PASS)
27
- - **Error handling:** явная проверка `if err != nil`; оборачивание `fmt.Errorf("...: %w", err)`; sentinel-ошибки + `errors.Is`/`errors.As`. Возвращаемая ошибка не игнорируется.
28
- - **Concurrency:** отмена через `context.Context` (не сигналы); shared state под `sync.Mutex`/каналами; fan-out через `errgroup`/`sync.WaitGroup`; каждая goroutine имеет путь завершения по `ctx.Done()`.
29
- - **Graceful shutdown:** `signal.NotifyContext(ctx, syscall.SIGTERM, os.Interrupt)`; `server.Shutdown(ctx)`; закрытие пулов (pgx), воркеров (asynq), redis.
30
- - **Panic safety:** `defer recover()` в HTTP-хендлерах (chi `middleware.Recoverer`), в gqlgen (`RecoverFunc`), в каждой фоновой goroutine и в обёртке job (asynq).
31
- - **Env/config:** централизованная config-структура (например caarlos0/env), загружается при старте; нет `os.Getenv` вразброс.
32
- - **Logging:** структурный `log/slog` (JSON в prod) с request/correlation ID через `context`; нет `fmt.Print*`/`log.Print*` в request-путях.
33
- - **Null-safety:** проверка nil-указателей/интерфейсов перед разыменованием; запись в nil-map не допускается; map-доступ через `v, ok := m[k]`.
34
- - **Type coercion:** `strconv.Atoi`/`ParseInt` с проверкой ошибки; type assertion через `v, ok := x.(T)` (comma-ok).
35
- - **Deps / reinvention:** stdlib `slices`/`maps`/`sync`; `database/sql`/sqlc вместо самописного query builder.
36
- - **Build/deploy:** multi-stage (builder → distroless/`nonroot`); `go.mod`+`go.sum` закоммичены; `GOFLAGS=-mod=readonly`; `CGO_ENABLED=0` для статической линковки; нет `go get` в Dockerfile; нет `net/http/pprof`/debug-роутов в prod.
37
-
38
- ## 4. Anti-patterns (как выглядит FAIL)
39
- - **Errors:** игнор ошибки через `_ = f()` или `v, _ := f()`; `panic` для обычного потока управления; потеря wrap-цепочки.
40
- - **Concurrency:** goroutine без `WaitGroup`/`errgroup`/`ctx` (результат теряется / процесс не ждёт / leak); запись в map из >1 goroutine без lock (data race, ловит `go test -race`); `for ... { go f(loopVar) }` — захват переменной цикла (до Go 1.22); незакрытый канал блокирует получателей.
41
- - **Panic:** паника в goroutine без `recover()` роняет весь процесс.
42
- - **Logging:** `fmt.Print*`/`log.Print*`/`println` в production-путях вместо `slog`.
43
- - **Resources:** `defer` внутри цикла (ресурс держится до конца функции, не итерации).
44
- - **Build/deploy:** `go get` в Dockerfile; отсутствие `go.sum`; компилятор/тесты в финальном образе.
45
-
46
- ## 5. Check-ID hints
47
- - `LOG-01` → `fmt.Print*`, `log.Print*`, `println` вне обёртки `slog`.
48
- - `BUG-01` → **N/A**, если нет парсинга строк; иначе — type assertion `x.(T)` без comma-ok, проигнорированная ошибка `strconv`.
49
- - `BUG-02` → **N/A** (нет синтаксиса промисов/forEach); риск переезжает в `CON-01`.
50
- - `BUG-03` → nil-deref указателя/интерфейса/map; запись в nil-map (паника).
51
- - `BUG-08` → сравнение float через `==`; деньги — в `int64` (центы) или `shopspring/decimal`.
52
- - `BUG-10` → **N/A или Low**: `regexp` (RE2) не имеет backtracking, ReDoS практически невозможен.
53
- - `CON-01` → goroutine без механизма завершения (WaitGroup/errgroup/ctx) → goroutine leak.
54
- - `CON-03` → конкурентный доступ к map/переменной пакета без `sync.Mutex`/atomic (data race).
55
- - `CON-06` → фоновая goroutine не слушает `ctx.Done()` → не завершается при shutdown.
56
- - `ERR-01` → ошибка проигнорирована через `_`.
57
- - `ERR-03` → нет recover-middleware (паника в хендлере роняет соединение/процесс).
58
- - `ERR-04` → нет `defer recover()` в фоновых goroutine/asynq-handler.
59
- - `ERR-06` → нет `signal.NotifyContext`/`server.Shutdown` (graceful shutdown).
60
- - `ERR-09` → `context.Context` не пробрасывается во внешние вызовы (pgx/HTTP/asynq).
61
- - `PER-08` → `defer` в цикле/долгой функции держит ресурсы (rows/файлы/locks).
62
- - `ARC-03` → **N/A на уровне пакетов** (циклы импортов запрещены компилятором); проверять только логические слои через go-arch-lint.
63
- - `ARC-05` → `os.Getenv` разбросан вместо config-структуры.
64
- - `DEP-09` → нет переключения в production-режим (debug-роуты/pprof/verbose в prod-образе).
65
- - `DEP-10` → `go get` в сборке вместо `go mod download` по закоммиченному `go.sum`; нет `-mod=readonly`.
66
- - `TST-01` → `go vet`/`staticcheck`/`golangci-lint` не включены/не обязательны.