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,44 +0,0 @@
1
- # Stack Profile: Java / JVM (id: java)
2
- Tier: general
3
-
4
- Профиль уровня general: нейтральные идиомы + ориентиры по инструментам без
5
- гарантий их наличия. Стек-специфичные находки без однозначного evidence
6
- помечай `🔍 UNVERIFIED`.
7
-
8
- ## 1. Detection signals
9
- - `pom.xml` (Maven) / `build.gradle*` / `settings.gradle*` (Gradle)
10
-
11
- ## 2. Tooling by category
12
- | Категория | Команда | Как читать вывод |
13
- |-----------|---------|------------------|
14
- | unused-code | SpotBugs / IDE-инспекции | неиспользуемое → YAGNI-02 (часто `🔍 UNVERIFIED` без инструмента) |
15
- | clone-detection | `pmd cpd --minimum-tokens 50 --dir . 2>/dev/null \|\| true` | дубли → REINV-03 |
16
- | dep-audit | `mvn org.owasp:dependency-check-maven:check 2>/dev/null \|\| true` | CVE в зависимостях |
17
- | env-extraction | `grep -rEoh 'System\.getenv\("[A-Z0-9_]+"\)' . 2>/dev/null \| sort -u` | env из кода → DOC-02 (учти `@Value`/`application.yml`) |
18
- | arch-lint | ArchUnit-тесты | слои/зависимости |
19
- | lint/format | `mvn checkstyle:check 2>/dev/null \|\| true`; SpotBugs | — |
20
- | type-check | `mvn compile 2>/dev/null \|\| ./gradlew compileJava 2>/dev/null \|\| true` | компиляция |
21
- | test-run | `mvn test 2>/dev/null \|\| ./gradlew test 2>/dev/null \|\| true` | — |
22
- | secret-scan | `gitleaks detect --no-banner 2>/dev/null \|\| true` | стек-нейтрально |
23
-
24
- ## 3. Idioms
25
- - **Errors:** конкретные исключения; try-with-resources для ресурсов; нет пустых `catch`.
26
- - **Concurrency:** `ExecutorService`/`CompletableFuture`; отмена через `Future.cancel`/interruption; иммутабельность или `synchronized`/`java.util.concurrent`.
27
- - **Env/config:** Spring `@Value`/`application.yml` или `System.getenv`, централизованно.
28
- - **Logging:** SLF4J/Logback со структурой; нет `System.out.println` в production.
29
- - **Null-safety:** `Optional<T>`; аннотации `@Nullable`/`@NonNull`; проверки null.
30
- - **Lifecycle:** `@Transactional` для read-modify-write; graceful shutdown через lifecycle-хуки.
31
- - **Deps:** проверенные библиотеки экосистемы вместо самописного.
32
-
33
- ## 4. Anti-patterns
34
- - Пустой `catch (Exception e) {}`.
35
- - `System.out.println`/`printStackTrace` в production.
36
- - Shared mutable state без синхронизации.
37
- - Разбросанный `System.getenv` без централизации.
38
-
39
- ## 5. Check-ID hints
40
- - `LOG-01` → `System.out.println`/`printStackTrace` вместо SLF4J.
41
- - `ERR-01` → пустой `catch`.
42
- - `CON-02` → read-modify-write без `@Transactional`.
43
- - `ARC-05` → `System.getenv` вразброс.
44
- - Прочие стек-специфичные → при нехватке evidence `🔍 UNVERIFIED`.
@@ -1,57 +0,0 @@
1
- # Stack Profile: Node / TypeScript (id: node)
2
- Tier: first-class
3
-
4
- Покрывает и бэкенд (Node), и фронтенд (браузер/Vite). Это профиль рантайма, а не
5
- фреймворка — конкретные фреймворки (Express/Fastify/NestJS, React/Vite) упоминаются
6
- лишь как примеры идиом.
7
-
8
- ## 1. Detection signals
9
- - `package.json` (основной маркер)
10
- - доп.: `tsconfig.json`, `package-lock.json` / `pnpm-lock.yaml` / `yarn.lock`
11
-
12
- ## 2. Tooling by category
13
- | Категория | Команда | Как читать вывод |
14
- |-----------|---------|------------------|
15
- | unused-code | `npx knip --reporter json 2>/dev/null \| head -200 \|\| true` | неиспользуемые экспорты/зависимости/файлы → YAGNI-02, NAM-06 |
16
- | clone-detection | `npx jscpd --min-lines 8 --min-tokens 50 --reporters json --silent --output ./.jscpd ./src 2>/dev/null \|\| true` | дубли блоков → REINV-03 |
17
- | dep-audit | `npm audit --json 2>/dev/null \| head -100 \|\| pnpm audit --json 2>/dev/null \|\| true` | CVE в зависимостях (вне чеклиста — справочно) |
18
- | env-extraction | `grep -rEoh 'process\.env\.[A-Z0-9_]+\|import\.meta\.env\.[A-Z0-9_]+' ./src 2>/dev/null \| sed -E 's/.*env\.//' \| sort -u` | имена env-переменных из кода → DOC-02 |
19
- | arch-lint | `npx dependency-cruiser --validate 2>/dev/null \|\| true`; FSD: `npx steiger ./src 2>/dev/null \|\| true` | circular deps → ARC-03; нарушения слоёв FSD |
20
- | lint/format | `npx biome check 2>/dev/null \|\| npx eslint . 2>/dev/null \|\| true` | — |
21
- | type-check | `npx tsc --noEmit 2>/dev/null \|\| true` | — |
22
- | test-run | `npm test 2>/dev/null \|\| true` | — |
23
- | secret-scan | `gitleaks detect --no-banner 2>/dev/null \|\| trufflehog filesystem . 2>/dev/null \|\| true` | стек-нейтрально |
24
-
25
- Всегда верифицируй вывод инструмента вручную (`file:line`) перед `❌ FAIL`.
26
-
27
- ## 3. Idioms (как выглядит «правильно» → PASS)
28
- - **Error handling:** `try/catch` вокруг `await`; типизированные ошибки; промисы либо `await`-ятся, либо явно `.catch`. Express 5 / `asyncHandler` пробрасывает rejection в error-middleware.
29
- - **Concurrency:** `Promise.all`/`allSettled` для независимых задач; `AbortController`/`AbortSignal` для отмены и таймаутов; `process.on('SIGTERM')` для graceful shutdown.
30
- - **Env/config:** `process.env` (бэкенд) / `import.meta.env` (Vite-фронтенд), валидируется при старте (zod/envalid) и изолируется в config-модуле.
31
- - **Logging:** структурный логгер (pino/winston) с request/correlation ID; в production нет `console.*`.
32
- - **Null-safety:** optional chaining `?.`, nullish coalescing `??`; строгие проверки `undefined`/`null`.
33
- - **Type coercion:** `parseInt(x, 10)` с radix; строгое `===`; явные `Number()`/`String()`.
34
- - **DI / абстракции:** зависимости инжектируются (конструктор/параметры), не создаются внутри функций; интерфейс оправдан >1 реализацией или тестами.
35
- - **Deps / reinvention:** предпочитать stdlib (`structuredClone`, `crypto.randomUUID`, `[...new Set()]`, `Array.flat`) и уже установленные библиотеки самописным аналогам.
36
- - **Build/deploy:** multi-stage Dockerfile; `npm ci` по `package-lock.json`; `NODE_ENV=production`; `USER node`/nonroot; `.dockerignore` исключает `node_modules`/`.git`/`.env`.
37
-
38
- ## 4. Anti-patterns (как выглядит FAIL)
39
- - **Errors:** пустой `catch (e) {}`; промис без `await`/`.catch`; `if (asyncFn())` (всегда truthy).
40
- - **Concurrency:** `async` callback в `Array.forEach`/`map` (потерянные промисы); `await` в последовательном цикле для независимых задач; module-level mutable singleton без инвалидации.
41
- - **Logging:** `console.log`/`console.error` в production-коде; `[object Object]` в логах.
42
- - **Type coercion:** `parseInt(x)` без radix; `==` вместо `===`; сравнение float через `===`.
43
- - **Build/deploy:** `npm install` вместо `npm ci`; нет `NODE_ENV=production`; `node_modules` в build-контексте Docker.
44
-
45
- ## 5. Check-ID hints
46
- - `LOG-01` → `console.log`/`console.error`/`console.*` в production.
47
- - `BUG-01` → `parseInt` без radix, `NaN`-проверки, `==`-coercion.
48
- - `BUG-02` / `CON-01` → `async` в `forEach`/`map`, потерянные промисы.
49
- - `BUG-10` → катастрофический backtracking в `RegExp` на user input (ReDoS реален).
50
- - `DEP-04` → `node_modules`/`.git`/`.env` в build-контексте.
51
- - `DEP-09` → `NODE_ENV` не выставлен в `production`.
52
- - `DEP-10` → `npm install` вместо `npm ci`; нет `package-lock.json`.
53
- - `ERR-04` → нет `process.on('unhandledRejection')`/`uncaughtException`.
54
- - `ERR-06` → нет `process.on('SIGTERM')` для graceful shutdown.
55
- - `ERR-09` → `AbortSignal` не пробрасывается во внешние вызовы.
56
- - `ARC-05` → `process.env.X` разбросан вместо config-модуля.
57
- - `TST-01` → `tsconfig.json` без `strict: true`.
@@ -1,45 +0,0 @@
1
- # Stack Profile: Python (id: python)
2
- Tier: general
3
-
4
- Профиль уровня general: даёт нейтральные идиомы и ориентиры по инструментам, но
5
- без гарантий их наличия. Стек-специфичные находки без однозначного evidence
6
- помечай `🔍 UNVERIFIED`.
7
-
8
- ## 1. Detection signals
9
- - `pyproject.toml` / `requirements.txt` / `setup.py`
10
- - доп.: `Pipfile`, `poetry.lock`, `tox.ini`
11
-
12
- ## 2. Tooling by category
13
- | Категория | Команда | Как читать вывод |
14
- |-----------|---------|------------------|
15
- | unused-code | `vulture . 2>/dev/null \|\| true` | мёртвый код → YAGNI-02 |
16
- | clone-detection | `pylint --disable=all --enable=duplicate-code . 2>/dev/null \|\| true` | дубли → REINV-03 |
17
- | dep-audit | `pip-audit 2>/dev/null \|\| safety check 2>/dev/null \|\| true` | CVE в зависимостях |
18
- | env-extraction | `grep -rEoh 'os\.environ(\.get)?\(?\["'\'']?[A-Z0-9_]+' . 2>/dev/null \| sort -u` | env из кода → DOC-02 |
19
- | arch-lint | `import-linter 2>/dev/null \|\| true` | слои/циклы |
20
- | lint/format | `ruff check . 2>/dev/null \|\| flake8 2>/dev/null \|\| true` | — |
21
- | type-check | `mypy . 2>/dev/null \|\| pyright 2>/dev/null \|\| true` | — |
22
- | test-run | `pytest 2>/dev/null \|\| true` | — |
23
- | secret-scan | `gitleaks detect --no-banner 2>/dev/null \|\| true` | стек-нейтрально |
24
-
25
- ## 3. Idioms
26
- - **Errors:** конкретные исключения, не голый `except:`; `finally`/context managers (`with`) для ресурсов.
27
- - **Concurrency:** `asyncio` с `async/await`; отмена через `asyncio.CancelledError`/`asyncio.timeout`; `concurrent.futures` для CPU.
28
- - **Env/config:** `os.environ`/pydantic-settings, валидация при старте; изоляция в config-модуле.
29
- - **Logging:** модуль `logging` со структурой; нет `print()` в production.
30
- - **Null-safety:** явные проверки `is None`; `Optional[...]`.
31
- - **Type coercion:** явные `int()`/`str()` с обработкой `ValueError`.
32
- - **Deps:** stdlib (`itertools`, `functools`, `collections`, `datetime`, `secrets`); `pydantic` для валидации.
33
-
34
- ## 4. Anti-patterns
35
- - Голый `except:` / `except Exception: pass`.
36
- - `print()` для логирования в production.
37
- - Изменяемые аргументы по умолчанию (`def f(x=[])`).
38
- - Разбросанный `os.environ[...]` без централизации.
39
-
40
- ## 5. Check-ID hints
41
- - `LOG-01` → `print()` вместо `logging`.
42
- - `ERR-01` → `except: pass` (проглатывание).
43
- - `BUG-04` → mutable default argument.
44
- - `ARC-05` → `os.environ` вразброс.
45
- - Прочие стек-специфичные → при нехватке evidence `🔍 UNVERIFIED`.
@@ -1,44 +0,0 @@
1
- # Stack Profile: Rust (id: rust)
2
- Tier: general
3
-
4
- Профиль уровня general: нейтральные идиомы + ориентиры по инструментам без
5
- гарантий их наличия. Стек-специфичные находки без однозначного evidence
6
- помечай `🔍 UNVERIFIED`.
7
-
8
- ## 1. Detection signals
9
- - `Cargo.toml`
10
- - доп.: `Cargo.lock`, `rust-toolchain.toml`
11
-
12
- ## 2. Tooling by category
13
- | Категория | Команда | Как читать вывод |
14
- |-----------|---------|------------------|
15
- | unused-code | `cargo +nightly udeps 2>/dev/null \|\| true`; warnings `cargo build` | неиспользуемое → YAGNI-02 |
16
- | clone-detection | — (нет стандартного инструмента) | grep повторов → `🔍 UNVERIFIED` |
17
- | dep-audit | `cargo audit 2>/dev/null \|\| true` | CVE в crates |
18
- | env-extraction | `grep -rEoh '(std::)?env::var\(?"[A-Z0-9_]+"' . 2>/dev/null \| sort -u` | env из кода → DOC-02 |
19
- | arch-lint | — | ручной разбор слоёв → `🔍 UNVERIFIED` |
20
- | lint/format | `cargo clippy 2>/dev/null \|\| true`; `cargo fmt --check 2>/dev/null` | — |
21
- | type-check | `cargo check 2>/dev/null \|\| true` | компиляция = проверка типов |
22
- | test-run | `cargo test 2>/dev/null \|\| true` | — |
23
- | secret-scan | `gitleaks detect --no-banner 2>/dev/null \|\| true` | стек-нейтрально |
24
-
25
- ## 3. Idioms
26
- - **Errors:** `Result<T, E>` + `?`; `thiserror`/`anyhow`; нет `.unwrap()`/`.expect()` в production-путях.
27
- - **Concurrency:** `tokio`/`async`; отмена через drop/`CancellationToken`; shared state через `Arc<Mutex<...>>`/каналы.
28
- - **Env/config:** `std::env::var` с обработкой `Result`; централизованный config (`serde`/`config`).
29
- - **Logging:** `tracing`/`log` со структурой; нет `println!` в production.
30
- - **Null-safety:** `Option<T>` + сопоставление с образцом; компилятор гарантирует отсутствие null.
31
- - **Deps:** crates экосистемы (`serde`, `itertools`, `tokio`); stdlib-итераторы.
32
-
33
- ## 4. Anti-patterns
34
- - `.unwrap()`/`.expect()` на пути, где ошибка возможна.
35
- - `println!`/`eprintln!` для логирования в production.
36
- - `unsafe` без обоснования.
37
- - Игнор `Result` (`let _ = ...`) там, где ошибку нужно обработать.
38
-
39
- ## 5. Check-ID hints
40
- - `LOG-01` → `println!`/`eprintln!` вместо `tracing`/`log`.
41
- - `ERR-01` → `.unwrap()`/`.expect()`/проигнорированный `Result`.
42
- - `BUG-03` → в основном **N/A** (нет null; `Option` проверяется компилятором).
43
- - `BUG-10` → ReDoS обычно **N/A** (crate `regex` без catastrophic backtracking).
44
- - Прочие стек-специфичные → при нехватке evidence `🔍 UNVERIFIED`.
@@ -1,201 +0,0 @@
1
- ---
2
- name: audit-api-contracts
3
- description: >
4
- Аудит API-контрактов: консистентность форм ответов, HTTP-коды, версионирование,
5
- документация vs реализация, GraphQL/REST конвенции. Запускай при /audit-api-contracts.
6
- ---
7
-
8
- ## Правило применимости (Relevance Rule)
9
-
10
- Применим к коду с HTTP-роутингом, REST/GraphQL API, контроллерами, схемами запросов/ответов, OpenAPI/Swagger спецификациями. Для CLI-инструментов и internal-only функций без HTTP-интерфейса — верни пустой ответ.
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» по префиксу `API-`.
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
- | API-01 | Форма ответов консистентна — единый envelope или его отсутствие по всему API |
61
- | API-02 | HTTP статус-коды семантически корректны (201 при создании, 4xx для client errors) |
62
- | API-03 | Error responses машиночитаемы и консистентны по структуре |
63
- | API-04 | Именование полей консистентно (camelCase или snake_case, не смешано) |
64
- | API-05 | Stack trace и внутренние детали не попадают в error responses |
65
- | API-06 | Пагинация включает метаданные (total/hasNext) где применима |
66
- | API-07 | Публичный API имеет стратегию версионирования |
67
-
68
- ## Правила верификации
69
-
70
- 1. **Только чеклист**: оценивай ТОЛЬКО проверки выше. Не добавляй новые.
71
- 2. **Явная верификация = PASS**: ставь `✅ PASS` только если явно проверил механизм (нашёл схему, конфиг, guard) и подтвердил отсутствие нарушения — укажи что именно проверено.
72
- 3. **Нет доказательства = UNVERIFIED**: не можешь указать `файл:строка` ни для нарушения, ни для подтверждения — ставь `🔍 UNVERIFIED`.
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
- > Примеры в этом разделе и в таблице вывода (Express-style middleware, `HttpException`)
108
- > иллюстративны. Контракт может быть REST (Node: Express/Fastify; Go: chi-роуты)
109
- > или GraphQL (Node: Apollo/Yoga; Go: gqlgen-резолверы). Check ID и их смысл
110
- > одинаковы для любого транспорта — конкретику бери из загруженного профиля.
111
-
112
- **API-01 — Консистентная форма ответов:**
113
- - Одна сущность возвращается с разными наборами полей в разных endpoint'ах
114
- - Envelope-паттерн применяется непоследовательно (`{ data: ... }` в одних, прямой объект в других)
115
- - Разная структура success-ответов для схожих операций
116
-
117
- **API-02 — Семантически корректные HTTP-коды:**
118
- - 200 возвращается при ошибке (тело содержит `{ error: "..." }` но статус 200)
119
- - 500 возвращается для пользовательских ошибок (должен быть 4xx)
120
- - 201 не используется при создании ресурса (POST → 200 вместо 201)
121
- - 204 возвращается с телом ответа (No Content не должен иметь body)
122
- - GET-запрос с побочными эффектами (изменение состояния)
123
-
124
- **API-03 — Machine-readable и консистентные error responses:**
125
- - Разный формат ошибок в разных endpoint'ах
126
- - Отсутствие machine-readable error code (только human-readable message)
127
- - Разная структура ошибок для validation vs auth vs server errors
128
-
129
- **API-04 — Консистентное именование полей:**
130
- - Разные имена для одного поля (`userId` vs `user_id` vs `id`)
131
- - Смешение camelCase и snake_case в одном API
132
- - Непоследовательные аббревиатуры (`orgId` vs `organisationId`)
133
-
134
- **API-05 — Нет технических деталей в responses:**
135
- - Stack trace в ответе в production
136
- - Внутренние пути файловой системы в error messages
137
- - SQL-ошибки или DB-специфичные сообщения в API responses
138
- - Версии библиотек/фреймворка в заголовках или телах ответов
139
-
140
- **API-06 — Пагинация с метаданными:**
141
- - Разные паттерны пагинации в одном API (offset + cursor смешаны)
142
- - Отсутствие метаданных пагинации (total, hasNext) при наличии пагинации
143
- - Нет максимального лимита страницы (клиент может запросить всё)
144
-
145
- **API-07 — Стратегия версионирования:**
146
- - Поле удалено или переименовано без версионирования API
147
- - Тип поля изменён (string → number) без версионирования
148
- - Нет стратегии версионирования при наличии публичного API (URL versioning, header versioning)
149
-
150
- ## Граница с другими аудитами
151
-
152
- - **Stack trace в ответах** (API-05) — первичный: `audit-errors` (ERR-02). Если обнаружено здесь — добавь cross-ref «*см. ERR-02*» в доказательство, не создавай дублирующий `❌ FAIL`.
153
- - **Валидация входных данных** (отсутствие проверки полей) → `audit-validation`
154
- - **OWASP-уязвимости** (injection, auth) → `audit-owasp`
155
- - **Производительность** (N+1 без DataLoader) → `audit-performance`
156
-
157
- ## Формат вывода
158
-
159
- | Check ID | Проверка | Статус | Уверенность | Доказательство | Решение | Исправлено |
160
- |----------|----------|--------|-------------|----------------|---------|------------|
161
- | API-01 | Форма ответов консистентна — единый envelope или его отсутствие по всему API | ✅ PASS | High | `routes/` — все ответы используют единый `{ data, error }` envelope | — | — |
162
- | API-02 | HTTP статус-коды семантически корректны (201 при создании, 4xx для client errors) | ❌ FAIL 🟠 | High | `routes/auth.ts:78` | **1. Заменить res.status(200) на res.status(400) для ошибок валидации** \\ 2. Добавить централизованный error middleware \\ 3. Использовать HTTP Exception классы (HttpException) | Нет |
163
- | API-07 | Публичный API имеет стратегию версионирования | ⏸ ACCEPTED | Medium | — | В baseline: внутренний API без внешних клиентов | — |
164
-
165
- Статусы: `✅ PASS` / `❌ FAIL 🔴` / `❌ FAIL 🟠` / `❌ FAIL 🟡` / `❌ FAIL 🟢` / `⏸ ACCEPTED` / `🔍 UNVERIFIED`
166
-
167
- Уверенность: `High` — проверил несколько ключевых файлов, паттерн очевиден / `Medium` — проверил выборочно, паттерн вероятен / `Low` — ограниченный контекст, полная уверенность невозможна
168
-
169
- Для `❌ FAIL`: ровно 3 варианта решения, разделитель `\\`, вариант 1 жирным.
170
-
171
- `Исправлено`: FAIL → `Нет` (разработчик меняет на `✅ Да` вручную после фикса). PASS / ACCEPTED / UNVERIFIED → `—`.
172
-
173
- Требования к решениям:
174
- - Взаимно исключающие (не перефразировки одного и того же)
175
- - Соответствуют текущему стеку проекта (не предлагать смену фреймворка)
176
- - Не требуют переписать всю систему — realistic migration cost
177
- - Вариант 3 может быть «оставить, задокументировать причину» при наличии обоснования
178
-
179
- В конце отчёта добавь раздел покрытия:
180
- ```
181
- ## Audit Coverage
182
- Проверено: src/module1/**, src/module2/**
183
- Пропущено: scripts/**, migrations/**, tests/**
184
- Файлов проверено: N | Пропущено: N
185
- ```
186
-
187
- Если все PASS — выведи: `✅ API-контракты консистентны.`
188
-
189
- ## Сохранение результатов
190
-
191
- 1. Найди папку сессии:
192
- ```bash
193
- ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
194
- ```
195
- Если пусто — создай: `mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")`
196
- 2. Сохрани через Write: `<AUDIT_DIR>/audit-api-contracts.md`
197
-
198
- ```
199
- # Audit Report: API Contracts — <YYYY-MM-DD HH:MM>
200
- <таблица>
201
- ```
@@ -1,200 +0,0 @@
1
- ---
2
- name: audit-architecture
3
- description: >
4
- Аудит архитектуры и файловой структуры: корректность связей между слоями, нарушения
5
- dependency rules, структура папок, circular dependencies. Запускай при /audit-architecture.
6
- ---
7
-
8
- ## Правило применимости (Relevance Rule)
9
-
10
- Применим к проектам с выраженной слоистой архитектурой (MVC, Clean Architecture, DDD, Hexagonal). Для single-file скриптов или утилит без архитектурного деления — верни пустой ответ.
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» по префиксу `ARC-`.
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
- | ARC-01 | Бизнес-логика вынесена из route handlers в service/domain слой |
61
- | ARC-02 | Presentation layer не взаимодействует с БД напрямую |
62
- | ARC-03 | Нет circular dependencies между модулями |
63
- | ARC-04 | Нет god-объектов: файлы и классы имеют единственную ответственность |
64
- | ARC-05 | Конфигурация и env-переменные изолированы в config-модуле |
65
- | ARC-06 | Внешние зависимости инжектируются (DI), не импортируются напрямую |
66
- | ARC-07 | Доменный слой не импортирует инфраструктурные модули |
67
-
68
- ## Правила верификации
69
-
70
- 1. **Только чеклист**: оценивай ТОЛЬКО проверки выше. Не добавляй новые.
71
- 2. **Явная верификация = PASS**: ставь `✅ PASS` только если явно проверил механизм (нашёл схему, конфиг, guard) и подтвердил отсутствие нарушения — укажи что именно проверено.
72
- 3. **Нет доказательства = UNVERIFIED**: не можешь указать `файл:строка` ни для нарушения, ни для подтверждения — ставь `🔍 UNVERIFIED`.
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
- **ARC-01 — Бизнес-логика в service/domain слое:**
108
- - Бизнес-правила и вычисления прямо в route handler / controller
109
- - Сложные условия и трансформации данных в middleware вместо сервиса
110
- - Операции с несколькими сущностями выполняются в handler без сервиса
111
-
112
- **ARC-02 — Presentation layer без прямых DB-вызовов:**
113
- - Прямые обращения к ORM/query builder из роутеров/контроллеров
114
- - Импорт репозиториев или DB-клиента непосредственно в слой представления
115
- - SQL / Prisma / Mongoose вызовы в middleware (примеры иллюстративны — Node; конкретные ORM/драйверы текущего рантайма см. в профиле, секции Idioms/Anti-patterns)
116
-
117
- **ARC-03 — Нет circular dependencies:**
118
- - Модуль A импортирует модуль B, который импортирует модуль A
119
- - Circular deps через несколько уровней (A→B→C→A)
120
- - Прямые импорты между feature-модулями (должны идти через shared)
121
-
122
- **ARC-04 — Нет god-объектов:**
123
- - Файлы >500 строк с несвязанной логикой (несколько разных ответственностей)
124
- - Классы с методами из разных доменных областей
125
- - Модуль делает несвязанные вещи (low cohesion)
126
-
127
- **ARC-05 — Конфигурация изолирована:**
128
- - Доступ к конфигурации/env централизован в одном модуле; чтение env вразброс вне config-модуля — нарушение (профиль уточняет механизм: `process.env` в Node / `os.Getenv` в Go / `caarlos0/env`-теги и т.п.)
129
- - Магические строки с именами env-переменных разбросаны по коду
130
- - Нет единой точки валидации конфигурации при старте приложения
131
-
132
- **ARC-06 — Внешние зависимости инжектируются:**
133
- - HTTP-клиенты, email-сервисы, БД-клиенты создаются внутри функций (не инжектируются)
134
- - Зависимость от конкретных реализаций вместо интерфейсов/абстракций
135
- - Отсутствие dependency injection делает код нетестируемым (нельзя подменить в тестах)
136
-
137
- **Направление зависимостей (Dependency Rule):**
138
- > Примеры ниже иллюстративны (Node); конкретные ORM/типы инфраструктуры текущего рантайма см. в профиле (секции Idioms/Anti-patterns/Check-ID hints, ARC-07).
139
- - Domain/service слой импортирует типы Prisma напрямую (должен через repository interface)
140
- - Бизнес-логика зависит от Express Request/Response типов
141
- - Domain entity содержит ORM-декораторы (TypeORM @Entity в domain классе)
142
- - Нарушение: `domain/ → infrastructure/` (правильно: `infrastructure/ → domain/`)
143
-
144
- ## Инструментальная поддержка
145
-
146
- Для ARC-03 (circular dependencies) и нарушений слоёв используй инструмент
147
- категории **arch-lint** из профиля стека (секция «Tooling by category»). Используй
148
- вывод как подсказку и верифицируй каждую находку вручную (`file:line`) перед
149
- занесением в FAIL. Если ячейка пустая (tier general/generic) — проверяй вручную и
150
- помечай находки `🔍 UNVERIFIED`.
151
-
152
- Примечание: в Go циклы импортов запрещены компилятором, поэтому ARC-03 на уровне
153
- пакетов — авто-PASS / N/A; проверять нужно только логические слои (см. Check-ID
154
- hints профиля go).
155
-
156
- ## Формат вывода
157
-
158
- | Check ID | Проверка | Статус | Уверенность | Доказательство | Решение | Исправлено |
159
- |----------|----------|--------|-------------|----------------|---------|------------|
160
- | ARC-01 | Бизнес-логика вынесена из route handlers в service/domain слой | ✅ PASS | High | `routes/` — handlers делегируют в services | — | — |
161
- | ARC-03 | Нет circular dependencies между модулями | ❌ FAIL 🟠 | High | `modules/order/index.ts:3` | **1. Вынести общий код в shared модуль** \\ 2. Применить dependency inversion \\ 3. Разбить модуль на независимые части | Нет |
162
- | ARC-06 | Внешние зависимости инжектируются (DI), не импортируются напрямую | ⏸ ACCEPTED | Medium | `services/payment.ts:1` | В baseline: refactor запланирован в Q3 | — |
163
-
164
- Статусы: `✅ PASS` / `❌ FAIL 🔴` / `❌ FAIL 🟠` / `❌ FAIL 🟡` / `❌ FAIL 🟢` / `⏸ ACCEPTED` / `🔍 UNVERIFIED`
165
-
166
- Уверенность: `High` — проверил несколько ключевых файлов, паттерн очевиден / `Medium` — проверил выборочно, паттерн вероятен / `Low` — ограниченный контекст, полная уверенность невозможна
167
-
168
- Для `❌ FAIL`: ровно 3 варианта решения, разделитель `\\`, вариант 1 жирным.
169
-
170
- `Исправлено`: FAIL → `Нет` (разработчик меняет на `✅ Да` вручную после фикса). PASS / ACCEPTED / UNVERIFIED → `—`.
171
-
172
- Требования к решениям:
173
- - Взаимно исключающие (не перефразировки одного и того же)
174
- - Соответствуют текущему стеку проекта (не предлагать смену фреймворка)
175
- - Не требуют переписать всю систему — realistic migration cost
176
- - Вариант 3 может быть «оставить, задокументировать причину» при наличии обоснования
177
-
178
- В конце отчёта добавь раздел покрытия:
179
- ```
180
- ## Audit Coverage
181
- Проверено: src/module1/**, src/module2/**
182
- Пропущено: scripts/**, migrations/**, tests/**
183
- Файлов проверено: N | Пропущено: N
184
- ```
185
-
186
- Если все PASS — выведи: `✅ Архитектурные принципы соблюдены.`
187
-
188
- ## Сохранение результатов
189
-
190
- 1. Найди папку сессии:
191
- ```bash
192
- ls -dt ./docs/audits/[0-9]*/ 2>/dev/null | head -1 | sed 's|/$||'
193
- ```
194
- Если пусто — создай: `mkdir -p ./docs/audits/$(date +"%Y-%m-%d_%H-%M")`
195
- 2. Сохрани через Write: `<AUDIT_DIR>/audit-architecture.md`
196
-
197
- ```
198
- # Audit Report: Architecture & File Structure — <YYYY-MM-DD HH:MM>
199
- <таблица>
200
- ```