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