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