code-ai-installer 1.0.1 → 1.1.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/.agents/a11y_baseline/SKILL.md +41 -0
- package/.agents/adr_log/SKILL.md +69 -0
- package/.agents/api_contract_compliance_review/SKILL.md +18 -0
- package/.agents/api_contracts/SKILL.md +42 -0
- package/.agents/architecture_compliance_review/SKILL.md +17 -0
- package/.agents/architecture_doc/SKILL.md +92 -0
- package/.agents/board/SKILL.md +43 -0
- package/.agents/cloud_infrastructure_security/SKILL.md +68 -0
- package/.agents/code_review_checklist/SKILL.md +47 -0
- package/.agents/current_state_analysis/SKILL.md +44 -0
- package/.agents/data_model/SKILL.md +40 -0
- package/.agents/dependency_supply_chain_review/SKILL.md +20 -0
- package/.agents/deployment_ci_plan/SKILL.md +51 -0
- package/.agents/design_intake/SKILL.md +71 -0
- package/.agents/design_parity_review/SKILL.md +73 -0
- package/.agents/design_systems/SKILL.md +15 -0
- package/.agents/dev_reference_snippets/SKILL.md +397 -0
- package/.agents/docker_kubernetes_architecture/SKILL.md +145 -0
- package/.agents/es2025_beast_practices/SKILL.md +15 -0
- package/.agents/gates/SKILL.md +35 -0
- package/.agents/go_beast_practices/SKILL.md +23 -0
- package/.agents/handoff/SKILL.md +52 -0
- package/.agents/k8s_manifests_conventions/SKILL.md +176 -0
- package/.agents/memory/SKILL.md +29 -0
- package/.agents/mongodb_mongoose_best_practices/SKILL.md +236 -0
- package/.agents/node_express_beast_practices/SKILL.md +30 -0
- package/.agents/observability_logging/SKILL.md +16 -0
- package/.agents/observability_plan/SKILL.md +38 -0
- package/.agents/observability_review/SKILL.md +20 -0
- package/.agents/performance_review_baseline/SKILL.md +17 -0
- package/.agents/pm_backlog/SKILL.md +32 -0
- package/.agents/pm_interview/SKILL.md +56 -0
- package/.agents/pm_prd/SKILL.md +56 -0
- package/.agents/qa_api_contract_tests/SKILL.md +16 -0
- package/.agents/qa_e2e_playwright/SKILL.md +0 -0
- package/.agents/qa_manual_run/SKILL.md +16 -0
- package/.agents/qa_security_smoke_tests/SKILL.md +14 -0
- package/.agents/qa_test_plan/SKILL.md +20 -0
- package/.agents/qa_ui_a11y_smoke/SKILL.md +12 -0
- package/.agents/react_15_3_wix_iframe/SKILL.md +20 -0
- package/.agents/react_beast_practices/SKILL.md +29 -0
- package/.agents/release_gate/SKILL.md +77 -0
- package/.agents/release_gate_checklist_template/SKILL.md +68 -0
- package/.agents/review_reference_snippets/SKILL.md +437 -0
- package/.agents/security_baseline_dev/SKILL.md +16 -0
- package/.agents/security_review/SKILL.md +55 -0
- package/.agents/security_review_baseline/SKILL.md +25 -0
- package/.agents/state_rtk_beast_practices/SKILL.md +15 -0
- package/.agents/state_zustand_beast_practices/SKILL.md +11 -0
- package/.agents/styling_css_stack/SKILL.md +12 -0
- package/.agents/system_design_checklist/SKILL.md +48 -0
- package/.agents/tanstack_beast_practices/SKILL.md +19 -0
- package/.agents/tdd_workflow/SKILL.md +34 -0
- package/.agents/testing_strategy_js/SKILL.md +30 -0
- package/.agents/tests_quality_review/SKILL.md +18 -0
- package/.agents/threat_model_baseline/SKILL.md +57 -0
- package/.agents/tooling_bun_biome/SKILL.md +17 -0
- package/.agents/typescript_beast_practices/SKILL.md +15 -0
- package/.agents/ui_a11y_smoke_review/SKILL.md +15 -0
- package/.agents/ui_inventory/SKILL.md +50 -0
- package/.agents/ux_discovery/SKILL.md +48 -0
- package/.agents/ux_spec/SKILL.md +56 -0
- package/.agents/wix_self_hosted_embedded_script/SKILL.md +88 -0
- package/AGENTS.md +120 -0
- package/README.md +6 -1
- package/agents/architect.md +242 -0
- package/agents/conductor.md +207 -0
- package/agents/product_manager.md +121 -0
- package/agents/reviewer.md +201 -0
- package/agents/senior_full_stack.md +218 -0
- package/agents/tester.md +187 -0
- package/agents/ux_ui_designer.md +145 -0
- package/dist/index.js +62 -23
- package/dist/sourceResolver.d.ts +10 -0
- package/dist/sourceResolver.js +36 -0
- package/package.json +5 -2
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release_gate
|
|
3
|
+
description: Финальный релиз-гейт: собрать отчёты Reviewer+Tester+CI, проверить DoD, классифицировать риски, принять решение GO/NO-GO и сформировать план закрытия.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill: Release Gate
|
|
7
|
+
|
|
8
|
+
## Цель
|
|
9
|
+
Принять решение о релизе (GO/NO-GO) на основе DoD, отчётов ревью/тестирования и состояния CI/CD.
|
|
10
|
+
|
|
11
|
+
## Обязательное условие
|
|
12
|
+
Перед запуском релиз-гейта дирижёр должен сгенерировать чек-лист через: $release_gate_checklist_template
|
|
13
|
+
|
|
14
|
+
## Входы
|
|
15
|
+
- Отчёт Reviewer (P0/P1/P2 + suggested fixes)
|
|
16
|
+
- Отчёт Tester (PASS/FAIL/BLOCKED + баги P0/P1/P2 + evidence)
|
|
17
|
+
- CI результаты (unit/integration, lint/format, security/dependency checks если есть)
|
|
18
|
+
- Release notes / список изменений (что релизим)
|
|
19
|
+
- Общий DoD
|
|
20
|
+
- Release Gate Checklist (RG-01…RG-xx) со статусами
|
|
21
|
+
|
|
22
|
+
## Release Criteria (строго)
|
|
23
|
+
### NO-GO (релиз запрещён)
|
|
24
|
+
- Есть **P0** от Reviewer или Tester
|
|
25
|
+
- Unit или Integration tests НЕ проходят
|
|
26
|
+
- Есть риск утечки секретов/PII в коде/логах
|
|
27
|
+
- Нет инструкций запуска/проверки (runbook) для изменений
|
|
28
|
+
- Критичный UX flow сломан или заблокирован (BLOCKED без обхода)
|
|
29
|
+
- Несоответствие API контрактам, ломающее клиента (P0)
|
|
30
|
+
|
|
31
|
+
### GO с условиями (допускается только если заранее согласовано)
|
|
32
|
+
- Есть P1/P2, но:
|
|
33
|
+
- есть workaround/митигирующие меры,
|
|
34
|
+
- есть заведённые задачи с приоритетом и владельцем,
|
|
35
|
+
- риск описан и принят.
|
|
36
|
+
|
|
37
|
+
## DoD Checklist (обязательный)
|
|
38
|
+
- [ ] Unit tests проходят
|
|
39
|
+
- [ ] Integration tests проходят
|
|
40
|
+
- [ ] Секреты не попадают в код/логи
|
|
41
|
+
- [ ] Есть инструкции запуска/проверки (локально/CI)
|
|
42
|
+
- [ ] Базовая безопасность: валидация ввода, авторизация, гигиена зависимостей
|
|
43
|
+
|
|
44
|
+
## Процесс (шаги)
|
|
45
|
+
1) Убедись, что создан RG checklist ($release_gate_checklist_template) и проставлены статусы.
|
|
46
|
+
2) Собери входные артефакты: Reviewer report, Tester report, CI status.
|
|
47
|
+
3) Сведи Findings в единый список: P0/P1/P2, owner, task link, status.
|
|
48
|
+
4) Прогони DoD checklist и отметь PASS/MISSING.
|
|
49
|
+
5) Прими решение GO/NO-GO (или GO-with-conditions если используется).
|
|
50
|
+
6) Сформируй Release Report и обнови RG-22 (Decision).
|
|
51
|
+
|
|
52
|
+
## Выход: Release Report (шаблон)
|
|
53
|
+
### Release Decision
|
|
54
|
+
- Decision: GO / NO-GO / GO-with-conditions
|
|
55
|
+
- Version/Tag: <если есть>
|
|
56
|
+
- Scope: <кратко что релизим>
|
|
57
|
+
|
|
58
|
+
### Evidence
|
|
59
|
+
- CI: PASS/FAIL (ссылка/коммит)
|
|
60
|
+
- Reviewer: PASS/MISSING + P0/P1/P2 count
|
|
61
|
+
- Tester: PASS/FAIL/BLOCKED + баги P0/P1/P2 count
|
|
62
|
+
|
|
63
|
+
### DoD Status
|
|
64
|
+
- Checklist: PASS/MISSING (со списком missing)
|
|
65
|
+
|
|
66
|
+
### Blocking Issues (если NO-GO)
|
|
67
|
+
- [ ] ID / Описание / Владелец / Как воспроизвести / Fix plan
|
|
68
|
+
|
|
69
|
+
### Accepted Risks (если GO-with-conditions)
|
|
70
|
+
- Риск → влияние → mitigation → owner → дедлайн
|
|
71
|
+
|
|
72
|
+
### Next Actions
|
|
73
|
+
- RG-01 ...
|
|
74
|
+
- RG-02 ...
|
|
75
|
+
|
|
76
|
+
## См. также
|
|
77
|
+
- Шаблон чек-листа: $release_gate_checklist_template
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release_gate_checklist_template
|
|
3
|
+
description: Генерирует перед релизом видимый чек-лист RG-01…RG-xx (Evidence/DoD/Security/Ops/Post-deploy/Rollback) и правила статусов.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill: Release Gate Checklist Template (RG-01…RG-xx)
|
|
7
|
+
|
|
8
|
+
## Цель
|
|
9
|
+
Перед каждым релизом создать **одинаковый** релизный чек-лист, чтобы дирижёр мог:
|
|
10
|
+
- собрать доказательства (reports/CI),
|
|
11
|
+
- проверить DoD,
|
|
12
|
+
- зафиксировать риски,
|
|
13
|
+
- выполнить post-deploy smoke,
|
|
14
|
+
- обеспечить rollback plan.
|
|
15
|
+
|
|
16
|
+
## Когда использовать
|
|
17
|
+
- Каждый раз перед финальным решением о релизе (Release Gate).
|
|
18
|
+
|
|
19
|
+
## Входы
|
|
20
|
+
- Scope релиза (что релизим)
|
|
21
|
+
- Версия/тег/коммит (если есть)
|
|
22
|
+
- Ссылки на окружения (staging/prod) при наличии
|
|
23
|
+
|
|
24
|
+
## Выход
|
|
25
|
+
- Видимый checklist **RG-01…RG-xx** со статусами:
|
|
26
|
+
- TODO / IN-PROGRESS / BLOCKED / DONE
|
|
27
|
+
- Краткая секция Evidence (ссылки/коммиты)
|
|
28
|
+
- Мини-итог “Что ещё нужно закрыть до GO”
|
|
29
|
+
|
|
30
|
+
## Шаблон (создавать как есть)
|
|
31
|
+
### Release Gate Checklist
|
|
32
|
+
- [ ] RG-01 (Evidence) Указать scope релиза + версия/тег/коммит
|
|
33
|
+
- [ ] RG-02 (Evidence) CI зелёный: unit tests PASS
|
|
34
|
+
- [ ] RG-03 (Evidence) CI зелёный: integration tests PASS
|
|
35
|
+
- [ ] RG-04 (Evidence) Lint/format PASS (если есть в CI)
|
|
36
|
+
- [ ] RG-05 (Evidence) Dependency/SCA audit PASS или риски зафиксированы
|
|
37
|
+
- [ ] RG-06 (Evidence) Reviewer report получен (P0=0) + ссылка на отчёт
|
|
38
|
+
- [ ] RG-07 (Evidence) Tester report получен (P0=0) + PASS/FAIL/BLOCKED + ссылка
|
|
39
|
+
|
|
40
|
+
- [ ] RG-08 (DoD) Секреты не попали в код/логи (проверки/скан/ручная верификация)
|
|
41
|
+
- [ ] RG-09 (DoD) Есть инструкции запуска/проверки (runbook) актуальные
|
|
42
|
+
- [ ] RG-10 (DoD) Базовая безопасность подтверждена: input validation + authz + hygiene
|
|
43
|
+
|
|
44
|
+
- [ ] RG-11 (Contracts) API соответствует контрактам (коды/форматы ошибок/валидация)
|
|
45
|
+
- [ ] RG-12 (Data) Миграции/изменения данных: план применений + обратимость (если есть)
|
|
46
|
+
- [ ] RG-13 (Ops) Observability: request_id/trace_id и безопасные логи (без PII/секретов)
|
|
47
|
+
- [ ] RG-14 (Ops) Rate limiting / WAF / security headers (если применимо и предусмотрено)
|
|
48
|
+
|
|
49
|
+
- [ ] RG-15 (Release) Release notes/изменения подготовлены
|
|
50
|
+
- [ ] RG-16 (Release) Feature flags/rollout стратегия (если используется) определена
|
|
51
|
+
- [ ] RG-17 (Rollback) Rollback plan описан и понятен
|
|
52
|
+
- [ ] RG-18 (Rollback) Backup/restore требования выполнены (если есть БД/критичные данные)
|
|
53
|
+
|
|
54
|
+
- [ ] RG-19 (Post-deploy) Smoke test сценарии определены (минимум P0 flows)
|
|
55
|
+
- [ ] RG-20 (Post-deploy) Smoke test выполнен на целевом окружении (PASS)
|
|
56
|
+
- [ ] RG-21 (Post-deploy) Мониторинг/алерты проверены (ошибки/latency)
|
|
57
|
+
|
|
58
|
+
- [ ] RG-22 (Decision) Итоговое решение: GO / NO-GO (+ причины и условия)
|
|
59
|
+
|
|
60
|
+
## Правила статусов
|
|
61
|
+
- Если любой пункт RG-02/03/06/07/08/09/10 провален → ставить BLOCKED и релиз = NO-GO.
|
|
62
|
+
- P0 из Reviewer или Tester → BLOCKED и релиз = NO-GO.
|
|
63
|
+
- P1 допускаются только при явном “Accepted Risks” с owner+deadline.
|
|
64
|
+
|
|
65
|
+
## Формат ответа
|
|
66
|
+
### Release Gate Checklist (RG-xx) — со статусами
|
|
67
|
+
### Evidence Links
|
|
68
|
+
### What’s Missing to GO
|
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: review_reference_snippets
|
|
3
|
+
description: Единый набор примеров (do/don’t) и шаблонов комментариев ревью: AppSec, Cloud/CI, контракты API, тесты, observability.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill: Review Reference Snippets (Do/Don't)
|
|
7
|
+
|
|
8
|
+
## Цель
|
|
9
|
+
Дать Reviewer готовые формулировки и эталонные do/don’t примеры, чтобы ревью было конкретным, воспроизводимым и единым по стилю.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## A) Secrets (P0)
|
|
14
|
+
|
|
15
|
+
### ❌ DON'T (P0): хардкод секретов
|
|
16
|
+
```ts
|
|
17
|
+
const apiKey = "sk-proj-xxxxx";
|
|
18
|
+
const dbPassword = "supersecret";
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### ✅ DO: секреты через env/secret manager + fail-fast проверка наличия
|
|
22
|
+
```ts
|
|
23
|
+
const apiKey = process.env.OPENAI_API_KEY;
|
|
24
|
+
if (!apiKey) throw new Error("OPENAI_API_KEY not configured");
|
|
25
|
+
|
|
26
|
+
const dbPassword = process.env.DB_PASSWORD;
|
|
27
|
+
if (!dbPassword) throw new Error("DB_PASSWORD not configured");
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### ✅ Шаблон комментария
|
|
31
|
+
- **P0:** Секрет захардкожен/попадает в репо. Вынести в secret manager/env, убрать из логов, проверить историю git и ротацию секретов.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## B) Secrets in logs (P0)
|
|
36
|
+
|
|
37
|
+
### ❌ DON'T: логировать body/headers целиком
|
|
38
|
+
```ts
|
|
39
|
+
logger.info({ headers: req.headers, body: req.body }, "incoming_request");
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### ✅ DO: логировать только безопасные поля + request_id
|
|
43
|
+
```ts
|
|
44
|
+
logger.info(
|
|
45
|
+
{ request_id: req.requestId, route: req.path, user_id: ctx.user?.id ?? null },
|
|
46
|
+
"incoming_request"
|
|
47
|
+
);
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### ✅ Комментарий
|
|
51
|
+
- **P0:** Возможна утечка PII/токенов в логах. Нужен allowlist полей + редактирование.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## C) Input validation на границе (P0/P1)
|
|
56
|
+
|
|
57
|
+
### ✅ DO: схема на границе (пример Zod)
|
|
58
|
+
```ts
|
|
59
|
+
import { z } from "zod";
|
|
60
|
+
|
|
61
|
+
const Schema = z.object({
|
|
62
|
+
email: z.string().email(),
|
|
63
|
+
name: z.string().min(1).max(100),
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const input = Schema.parse(req.body);
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### ❌ DON'T: использовать req.body напрямую
|
|
70
|
+
```ts
|
|
71
|
+
service.create(req.body);
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### ✅ Комментарий
|
|
75
|
+
- **P0/P1:** Нет валидации входа на границе. Добавить schema validation и вернуть 422/400 по контракту.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## D) Safe errors (P0/P1)
|
|
80
|
+
|
|
81
|
+
### ❌ DON'T: отдавать stack/внутренние детали пользователю
|
|
82
|
+
```ts
|
|
83
|
+
res.status(500).json({ message: err.message, stack: err.stack });
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### ✅ DO: единый формат ошибок + safe message
|
|
87
|
+
```ts
|
|
88
|
+
res.status(500).json({
|
|
89
|
+
error_code: "INTERNAL_ERROR",
|
|
90
|
+
message: "Unexpected error",
|
|
91
|
+
});
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### ✅ Комментарий
|
|
95
|
+
- **P0/P1:** Утечка внутренностей. Для 5xx — только safe message; детали — в структурированные логи.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## E) SQL Injection (P0)
|
|
100
|
+
|
|
101
|
+
### ❌ DON'T: конкатенация SQL
|
|
102
|
+
```ts
|
|
103
|
+
await db.query(`SELECT * FROM users WHERE email='${email}'`);
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### ✅ DO: параметризованные запросы / ORM
|
|
107
|
+
```ts
|
|
108
|
+
await db.query("SELECT * FROM users WHERE email=$1", [email]);
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### ✅ Комментарий
|
|
112
|
+
- **P0:** SQL injection риск. Только параметризация/ORM, без конкатенации.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## F) Command/Path Injection (P0)
|
|
117
|
+
|
|
118
|
+
### ❌ DON'T: shell exec с пользовательским вводом
|
|
119
|
+
```ts
|
|
120
|
+
import { exec } from "node:child_process";
|
|
121
|
+
exec(`convert ${userPath} -resize 200x200 out.png`);
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### ✅ DO: избегать shell, использовать безопасные API/библиотеки
|
|
125
|
+
```ts
|
|
126
|
+
// предпочтительно библиотека с безопасными аргументами, без shell
|
|
127
|
+
await imageLib.resize({ inputPath: safePath, width: 200, height: 200 });
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### ✅ Комментарий
|
|
131
|
+
- **P0:** command/path injection риск. Нельзя exec с пользовательскими аргументами; нужен allowlist/безопасные API.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## G) AuthN/AuthZ (P0)
|
|
136
|
+
|
|
137
|
+
### ❌ DON'T: “UI спрятал кнопку — значит безопасно”
|
|
138
|
+
```ts
|
|
139
|
+
// server does not check role/ownership
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### ✅ DO: authz до критичных операций + ownership check
|
|
143
|
+
```ts
|
|
144
|
+
if (!ctx.user) throw new AppError(401, "UNAUTHORIZED", "Auth required");
|
|
145
|
+
if (ctx.user.role !== "admin") throw new AppError(403, "FORBIDDEN", "Not enough permissions");
|
|
146
|
+
|
|
147
|
+
// ownership example
|
|
148
|
+
if (resource.ownerId !== ctx.user.id) throw new AppError(403, "FORBIDDEN", "Not owner");
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### ✅ Комментарий
|
|
152
|
+
- **P0:** Нет server-side authz/ownership. Добавить проверку ролей/владения ресурсом.
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## H) CSRF (cookie-based sessions) (P1 → P0 если есть риск)
|
|
157
|
+
|
|
158
|
+
### ❌ DON'T: cookie auth без CSRF защиты
|
|
159
|
+
```txt
|
|
160
|
+
Cookie session + POST/PUT/DELETE без CSRF защиты
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### ✅ DO: SameSite + CSRF token (если требуется)
|
|
164
|
+
```txt
|
|
165
|
+
SameSite=Strict/Lax + CSRF token (double-submit или synchronizer token)
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### ✅ Комментарий
|
|
169
|
+
- **P1/P0:** Если auth на cookie — нужна CSRF защита + проверка origin/referer по политике.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## I) XSS / пользовательский HTML (P0)
|
|
174
|
+
|
|
175
|
+
### ❌ DON'T: dangerouslySetInnerHTML с пользовательским вводом
|
|
176
|
+
```tsx
|
|
177
|
+
<div dangerouslySetInnerHTML={{ __html: userContent }} />
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### ✅ DO: санитизация + CSP (если применимо)
|
|
181
|
+
```tsx
|
|
182
|
+
const safeHtml = sanitize(userContent); // allowlist tags/attrs
|
|
183
|
+
return <div dangerouslySetInnerHTML={{ __html: safeHtml }} />;
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### ✅ Комментарий
|
|
187
|
+
- **P0:** XSS риск. Нужна санитизация/экранирование и (по возможности) CSP.
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## J) SSRF (P0 если есть fetch внешних URL)
|
|
192
|
+
|
|
193
|
+
### ❌ DON'T: принимать URL от пользователя и fetch без ограничений
|
|
194
|
+
```ts
|
|
195
|
+
await fetch(req.body.url);
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### ✅ DO: allowlist доменов + блок внутренних адресов
|
|
199
|
+
```ts
|
|
200
|
+
const url = new URL(req.body.url);
|
|
201
|
+
if (!ALLOWED_HOSTS.has(url.hostname)) throw new AppError(400, "BAD_URL", "Host not allowed");
|
|
202
|
+
// + защита от private ranges / metadata endpoints
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### ✅ Комментарий
|
|
206
|
+
- **P0:** SSRF риск. Требуется allowlist + блок внутренних/metadata адресов.
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## K) Rate limiting (P1 → P0 если публичный/дорогой endpoint)
|
|
211
|
+
|
|
212
|
+
### ✅ DO: базовый лимит на API + stricter на expensive ops
|
|
213
|
+
```ts
|
|
214
|
+
app.use("/api", limiter);
|
|
215
|
+
app.use("/api/auth/login", strictLimiter);
|
|
216
|
+
app.use("/api/search", searchLimiter);
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### ✅ Комментарий
|
|
220
|
+
- **P1/P0:** Нет rate limiting. Для публичных/дорогих эндпоинтов — обязательно.
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## L) Idempotency (P1)
|
|
225
|
+
|
|
226
|
+
### ❌ DON'T: повторяемый POST приводит к двойным действиям
|
|
227
|
+
```txt
|
|
228
|
+
Повтор запроса создаёт 2 заказа/2 списания
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### ✅ DO: idempotency key для рискованных операций
|
|
232
|
+
```txt
|
|
233
|
+
Idempotency-Key header + хранение результата/статуса по ключу на TTL
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### ✅ Комментарий
|
|
237
|
+
- **P1:** Для create/charge операций нужна идемпотентность (особенно при ретраях/сетевых сбоях).
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## M) API contract mismatches (P1/P0)
|
|
242
|
+
|
|
243
|
+
### ✅ DO: единый error формат + коды статусов
|
|
244
|
+
```json
|
|
245
|
+
{ "error_code": "VALIDATION_ERROR", "message": "Invalid input", "details": { "field": "email" } }
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### ❌ DON'T: разные форматы ошибок на разных ручках
|
|
249
|
+
```json
|
|
250
|
+
{ "error": "bad" }
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### ✅ Комментарий
|
|
254
|
+
- **P1/P0:** Контракт ошибок должен быть единым по проекту, иначе ломается клиент/тесты.
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## N) Observability: request_id/trace_id (P1)
|
|
259
|
+
|
|
260
|
+
### ❌ DON'T: логи без корреляции
|
|
261
|
+
```ts
|
|
262
|
+
logger.info("created user");
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### ✅ DO: structured logs + request_id + ключевые поля
|
|
266
|
+
```ts
|
|
267
|
+
logger.info({ request_id: req.requestId, user_id: user.id }, "user_created");
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### ✅ Комментарий
|
|
271
|
+
- **P1:** Нужна корреляция запросов (request_id/trace_id) по Observability Plan.
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## O) Audit logging для критичных операций (P1 → P0 если комплаенс/финансы)
|
|
276
|
+
|
|
277
|
+
### ✅ DO: audit события (без PII/секретов)
|
|
278
|
+
```ts
|
|
279
|
+
logger.info(
|
|
280
|
+
{ audit: true, action: "ORDER_REFUND", actor_id: ctx.user.id, order_id: order.id, request_id: req.requestId },
|
|
281
|
+
"audit_event"
|
|
282
|
+
);
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### ✅ Комментарий
|
|
286
|
+
- **P1/P0:** Для критичных действий нужен audit trail (кто/что/когда).
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## P) Dependency & supply chain (P1)
|
|
291
|
+
|
|
292
|
+
### ❌ DON'T: добавлять сомнительные/лишние пакеты без обоснования
|
|
293
|
+
```txt
|
|
294
|
+
Добавлен пакет с низкой репутацией / дублирующий функциональность
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### ✅ DO: минимизация + audit + lockfile
|
|
298
|
+
```txt
|
|
299
|
+
Обосновать зависимость, проверить аудит, обновить lockfile, включить CI проверки.
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### ✅ Комментарий
|
|
303
|
+
- **P1:** Проверь необходимость зависимости, результаты audit, и отсутствие known vulnerabilities.
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## Q) CI/CD security (P1)
|
|
308
|
+
|
|
309
|
+
### ✅ DO: OIDC вместо long-lived tokens + secret scanning + audit
|
|
310
|
+
```yaml
|
|
311
|
+
permissions:
|
|
312
|
+
contents: read
|
|
313
|
+
|
|
314
|
+
steps:
|
|
315
|
+
- uses: trufflesecurity/trufflehog@main
|
|
316
|
+
- run: npm audit --audit-level=high
|
|
317
|
+
- uses: aws-actions/configure-aws-credentials@v4
|
|
318
|
+
with:
|
|
319
|
+
role-to-assume: arn:aws:iam::123:role/ci
|
|
320
|
+
aws-region: eu-central-1
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### ❌ DON'T: хранить постоянные ключи в CI variables без ротации/ограничений
|
|
324
|
+
```txt
|
|
325
|
+
AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY долгоживущие и с широкими правами
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### ✅ Комментарий
|
|
329
|
+
- **P1:** Переход на OIDC, минимальные permissions, secret scanning, dependency audit.
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
## R) IAM least privilege (P0)
|
|
334
|
+
|
|
335
|
+
### ❌ DON'T: wildcard доступ
|
|
336
|
+
```yaml
|
|
337
|
+
iam_role:
|
|
338
|
+
permissions: ["s3:*"]
|
|
339
|
+
resources: ["*"]
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### ✅ DO: точные actions + ресурсы
|
|
343
|
+
```yaml
|
|
344
|
+
iam_role:
|
|
345
|
+
permissions:
|
|
346
|
+
- s3:GetObject
|
|
347
|
+
- s3:ListBucket
|
|
348
|
+
resources:
|
|
349
|
+
- arn:aws:s3:::my-bucket
|
|
350
|
+
- arn:aws:s3:::my-bucket/*
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### ✅ Комментарий
|
|
354
|
+
- **P0:** IAM слишком широкие права. Нужен least privilege (конкретные actions + ресурсы).
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## S) Network security (P0/P1)
|
|
359
|
+
|
|
360
|
+
### ✅ DO: DB не публичная + ограниченные security groups
|
|
361
|
+
```txt
|
|
362
|
+
DB private subnet, inbound только от app subnet/SG, no 0.0.0.0/0
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### ❌ DON'T: открывать БД в интернет
|
|
366
|
+
```txt
|
|
367
|
+
Inbound 0.0.0.0/0 на 5432
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### ✅ Комментарий
|
|
371
|
+
- **P0:** Публичная БД — критическая уязвимость. Закрыть доступ, оставить только приватные сети/SG.
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
## T) CDN/WAF/Security headers (P1)
|
|
376
|
+
|
|
377
|
+
### ✅ DO: security headers на edge + WAF rules
|
|
378
|
+
```ts
|
|
379
|
+
headers.set("X-Frame-Options", "DENY");
|
|
380
|
+
headers.set("X-Content-Type-Options", "nosniff");
|
|
381
|
+
headers.set("Referrer-Policy", "strict-origin-when-cross-origin");
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
### ✅ Комментарий
|
|
385
|
+
- **P1:** Нет security headers/WAF. Для продакшена — включить managed rules + базовые заголовки.
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
|
|
389
|
+
## U) Backup/DR (P1)
|
|
390
|
+
|
|
391
|
+
### ✅ DO: retention + deletion protection + recovery plan
|
|
392
|
+
```hcl
|
|
393
|
+
backup_retention_period = 30
|
|
394
|
+
deletion_protection = true
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
### ✅ Комментарий
|
|
398
|
+
- **P1:** Нужны бэкапы/retention/rollback. Минимум: retention, (опц.) PITR, тест восстановления, runbook.
|
|
399
|
+
|
|
400
|
+
---
|
|
401
|
+
|
|
402
|
+
## V) Тесты безопасности (P1)
|
|
403
|
+
|
|
404
|
+
### ✅ DO: тесты на auth/authz/валидацию/rate limit
|
|
405
|
+
```ts
|
|
406
|
+
expect(resp.status).toBe(401);
|
|
407
|
+
expect(resp.status).toBe(403);
|
|
408
|
+
expect(resp.status).toBe(422);
|
|
409
|
+
expect(resp.status).toBe(429);
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### ✅ Комментарий
|
|
413
|
+
- **P1:** Добавить тесты безопасности (auth/authz/validation/rate limiting) для критичных ручек.
|
|
414
|
+
|
|
415
|
+
---
|
|
416
|
+
|
|
417
|
+
## W) Шаблон итогового ревью (кратко)
|
|
418
|
+
|
|
419
|
+
### ✅ Summary Template
|
|
420
|
+
```txt
|
|
421
|
+
Summary:
|
|
422
|
+
- PASS: <что ок>
|
|
423
|
+
- MISSING: <что нужно добавить>
|
|
424
|
+
|
|
425
|
+
P0 (Blockers):
|
|
426
|
+
- [ ] <что / где / почему блокер / как исправить>
|
|
427
|
+
|
|
428
|
+
P1 (Important):
|
|
429
|
+
- [ ] ...
|
|
430
|
+
|
|
431
|
+
P2 (Nice-to-have):
|
|
432
|
+
- [ ] ...
|
|
433
|
+
|
|
434
|
+
Next Actions:
|
|
435
|
+
- REV-01 ...
|
|
436
|
+
- DEV-02 ...
|
|
437
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: security_baseline_dev
|
|
3
|
+
description: Базовая безопасность в реализации: валидация на границах, authz, безопасные ошибки, запрет секретов в коде/логах, гигиена зависимостей.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill: Security Baseline (Dev)
|
|
7
|
+
|
|
8
|
+
## Правила
|
|
9
|
+
- Валидация входных данных на границе (API/forms)
|
|
10
|
+
- Авторизация на сервере (не доверять клиенту)
|
|
11
|
+
- Никаких секретов в репозитории и логах
|
|
12
|
+
- Ошибки без утечки внутренностей
|
|
13
|
+
- Зависимости: обновления и минимизация лишних пакетов
|
|
14
|
+
|
|
15
|
+
## См. также
|
|
16
|
+
- Примеры: `$dev_reference_snippets`
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: security_review
|
|
3
|
+
description: AppSec ревью для эндпоинтов/авторизации/ввода/секретов/чувствительных фич. Чек-лист + паттерны (OWASP baseline).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill: Security Review (AppSec)
|
|
7
|
+
|
|
8
|
+
## Когда активировать
|
|
9
|
+
- Новые API endpoints
|
|
10
|
+
- AuthN/AuthZ
|
|
11
|
+
- User input / file uploads
|
|
12
|
+
- Secrets/credentials
|
|
13
|
+
- Payments/PII/sensitive data
|
|
14
|
+
- Third-party integrations
|
|
15
|
+
|
|
16
|
+
## Checklist (минимум)
|
|
17
|
+
1) Secrets management
|
|
18
|
+
- Нет хардкода, нет секретов в логах/ошибках
|
|
19
|
+
- Secrets живут в env/secret manager, есть проверка наличия
|
|
20
|
+
|
|
21
|
+
2) Input validation
|
|
22
|
+
- Схемы на границах (whitelist validation)
|
|
23
|
+
- Ошибки не раскрывают внутренности
|
|
24
|
+
|
|
25
|
+
3) Injection
|
|
26
|
+
- SQL/NoSQL/command: без конкатенаций, только параметризация/ORM
|
|
27
|
+
|
|
28
|
+
4) AuthN/AuthZ
|
|
29
|
+
- Токены не в localStorage (если применимо), предпочтительно httpOnly cookies
|
|
30
|
+
- AuthZ проверки до критичных операций
|
|
31
|
+
- RLS/политики данных (если используете Supabase/аналог)
|
|
32
|
+
|
|
33
|
+
5) XSS / CSP
|
|
34
|
+
- Санитизация пользовательского HTML (если есть)
|
|
35
|
+
- CSP/headers если требуется архитектурой
|
|
36
|
+
|
|
37
|
+
6) CSRF (если cookie-based sessions)
|
|
38
|
+
- CSRF tokens / SameSite=Strict, double-submit pattern при необходимости
|
|
39
|
+
|
|
40
|
+
7) Rate limiting
|
|
41
|
+
- Базовые лимиты на API, stricter для expensive endpoints
|
|
42
|
+
|
|
43
|
+
8) Sensitive data exposure
|
|
44
|
+
- Нет PII/секретов в логах
|
|
45
|
+
- Нет stack trace для пользователя
|
|
46
|
+
|
|
47
|
+
9) Dependency security
|
|
48
|
+
- audit/lockfile/reproducible install
|
|
49
|
+
|
|
50
|
+
## Выход
|
|
51
|
+
- Findings P0/P1/P2 + конкретные фиксы
|
|
52
|
+
- Что добавить в тесты безопасности (auth/authz/validation/rate limiting)
|
|
53
|
+
|
|
54
|
+
## См. также
|
|
55
|
+
- Примеры и анти-примеры: $review_reference_snippets
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: security_review_baseline
|
|
3
|
+
description: Security ревью по baseline: OWASP-риски, authz, валидация, SSRF/XSS/CSRF, секреты, безопасные логи/ошибки, least privilege.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill: Security Review Baseline
|
|
7
|
+
|
|
8
|
+
## Проверить (минимум)
|
|
9
|
+
- Input validation на границах (API/forms)
|
|
10
|
+
- AuthN/AuthZ: сервер проверяет права, нет доверия клиенту
|
|
11
|
+
- Ошибки: без утечки stacktrace/SQL/конфигов/PII
|
|
12
|
+
- Secrets: нет ключей/токенов в репо и логах
|
|
13
|
+
- SSRF: если есть fetch внешних URL → allowlist/блок внутренних адресов
|
|
14
|
+
- XSS: экранирование/санитизация (если есть пользовательский HTML)
|
|
15
|
+
- CSRF: если cookie-based sessions → защита (tokens/sameSite)
|
|
16
|
+
- Rate limiting / brute force для чувствительных эндпоинтов (если нужно)
|
|
17
|
+
- Audit trail для критичных операций (если требуется threat model)
|
|
18
|
+
|
|
19
|
+
## Выход
|
|
20
|
+
- P0 security blockers
|
|
21
|
+
- P1 security issues
|
|
22
|
+
- Рекомендованные меры (конкретно)
|
|
23
|
+
|
|
24
|
+
## См. также
|
|
25
|
+
- Примеры и анти-примеры: $review_reference_snippets
|