Bitrix Module Security — orchestrated entry
Это headless точка входа автоматического скана (подходит для любого agent-CLI).
Ты запускаешь security-flow проверки одного Bitrix-модуля, headless (контейнер
изолирован, внешней сети нет — только relay модели; никакого веб-UI).
Сам этот скилл эвристик аудита не содержит. Аудит — в скилле scan, политика
severity — в journal-review. Те же шаги в человекочитаемом виде описаны в
using-marketplace-sec (upstream-референс).
Тебе дают в промпте:
- MODULE_DIR — путь к распакованному PHP-исходнику модуля (аргумент вызова).
- RESULT_PATH — путь, куда сохранить итоговый JSON-отчёт.
- REVIEW_SCRIPT — абсолютный путь к
review_journal.py (детерминированный
скрипт пересмотра severity). Уже на диске — используй путь как есть, НЕ ищи
его через find.
Если путь к REVIEW_SCRIPT в промпте не дан — сообщи об этом и останови flow.
Обязательная последовательность
Выполни ВСЕ шаги по порядку. Нельзя писать сырой аудит сразу в RESULT_PATH —
в RESULT_PATH должен лежать пересмотренный (reviewed) отчёт после шага 2.
SCAN. Вызови скилл scan с аргументом MODULE_DIR — проведи тщательный
security-аудит по его методологии (включая scan/references/*). Сохрани сырой
JSON в /tmp/raw-scan.json. Формат строго: {success, requestId, data:{vulnerabilities[], summary, scannedFiles, riskLevel, auditedFiles}};
у КАЖДОЙ находки есть file, line, type, severity, description, recommendation, fix.
REVIEW (BUS-aware severity). Выполни (подставь реальные RESULT_PATH и
REVIEW_SCRIPT из промпта):
python3 "$REVIEW_SCRIPT" /tmp/raw-scan.json --output "RESULT_PATH"
Скрипт сохраняет исходные поля, заменяет только severity на reviewed-severity,
добавляет узел reviewed к каждой находке и data.reviewSummary. Теперь
RESULT_PATH — финальный отчёт.
При НЕнулевом коде выхода review_journal.py скрипт НИЧЕГО не выдумывает —
он печатает в stderr полный список реальных пробелов. Действуй
детерминированным циклом (максимум 3 итерации):
- Прочитай
stderr. Машиночитаемый список — в строке
REVIEW_VALIDATION_ERRORS: [...] (JSON-массив всех проблемных находок
сразу). Каждый элемент: index, file, line, type, missingKeys,
invalidSeverity.
- Для каждой перечисленной находки сделай точечную проверку: открой
(
Read) её file (при необходимости по line) и впиши в
/tmp/raw-scan.json реальное недостающее значение, выведенное из кода —
настоящие description/recommendation/fix, либо корректную severity из
набора {high, medium, low}. Чини все находки из списка за один
проход. Никаких заглушек/плейсхолдеров.
- Перезапусти ту же команду
review_journal.py. Повторяй цикл, пока код выхода
не станет 0.
Если за 3 итерации сойтись не удалось — НЕ подсовывай выдуманные данные: останови
flow с ошибкой (внешний слой перезапустит скан заново). Честный повтор лучше
фиктивного отчёта.
VALIDATE финал. Сначала синтаксис: python3 -m json.tool "RESULT_PATH".
Затем — самопроверка реальной финальной формы перед тем как объявить готово.
Прочитай RESULT_PATH и убедись по каждому пункту:
data.summary — это строка (не объект, не массив).
data.scannedFiles — это число.
data.riskLevel ∈ {high, medium, low, none}.
data.auditedFiles — это массив строк.
- у каждого
data.vulnerabilities[i] присутствуют все 7 ключей
(file, line, type, severity, description, recommendation, fix), причём
description, recommendation, fix — непустые.
data.riskLevel равен максимальной severity среди находок (none, если
находок нет).
Если самопроверка нашла пробел — НЕ вставляй плейсхолдер. Исправь
реальное содержимое: перечитай файл модуля и впиши настоящий
fix/recommendation/description, затем заново выполни шаг REVIEW (п. 2,
тем же ограниченным циклом — максимум 3 итерации), чтобы reviewed-отчёт был
пересобран из исправленных данных. Если сойтись не удалось — останови flow с
ошибкой, не сдавай фиктивный отчёт.
Резюме одной строкой: reviewed-счётчики severity (high/medium/low)
из data.reviewSummary.
Никаких UI/веб-серверов не запускай. Накопительный журнал (journal-update) в
этом headless-пайплайне НЕ ведётся — кросс-ран состояние отслеживает API.
1---2name: scan-composer3description: Marketplace pre-submission security-flow для ОДНОГО Bitrix-модуля — сырой аудит и BUS-aware пересмотр severity. Headless точка входа автоматического сканера (без UI). Вызывается с одним аргументом — путём к распакованному модулю.4---56# Bitrix Module Security — orchestrated entry78Это **headless точка входа** автоматического скана (подходит для любого agent-CLI).9Ты запускаешь security-flow проверки одного Bitrix-модуля, headless (контейнер10изолирован, внешней сети нет — только relay модели; никакого веб-UI).1112Сам этот скилл эвристик аудита не содержит. Аудит — в скилле `scan`, политика13severity — в `journal-review`. Те же шаги в человекочитаемом виде описаны в14`using-marketplace-sec` (upstream-референс).1516Тебе дают в промпте:17- **MODULE_DIR** — путь к распакованному PHP-исходнику модуля (аргумент вызова).18- **RESULT_PATH** — путь, куда сохранить итоговый JSON-отчёт.19- **REVIEW_SCRIPT** — абсолютный путь к `review_journal.py` (детерминированный20 скрипт пересмотра severity). Уже на диске — **используй путь как есть, НЕ ищи21 его через `find`**.2223Если путь к `REVIEW_SCRIPT` в промпте не дан — сообщи об этом и останови flow.2425## Обязательная последовательность2627Выполни ВСЕ шаги по порядку. Нельзя писать сырой аудит сразу в RESULT_PATH —28в RESULT_PATH должен лежать **пересмотренный** (reviewed) отчёт после шага 2.29301. **SCAN.** Вызови скилл `scan` с аргументом MODULE_DIR — проведи тщательный31 security-аудит по его методологии (включая `scan/references/*`). Сохрани сырой32 JSON в `/tmp/raw-scan.json`. Формат строго: `{success, requestId,33 data:{vulnerabilities[], summary, scannedFiles, riskLevel, auditedFiles}}`;34 у КАЖДОЙ находки есть `file, line, type, severity, description,35 recommendation, fix`.36372. **REVIEW (BUS-aware severity).** Выполни (подставь реальные RESULT_PATH и38 REVIEW_SCRIPT из промпта):3940 python3 "$REVIEW_SCRIPT" /tmp/raw-scan.json --output "RESULT_PATH"4142 Скрипт сохраняет исходные поля, заменяет только severity на reviewed-severity,43 добавляет узел reviewed к каждой находке и data.reviewSummary. Теперь44 RESULT_PATH — финальный отчёт.4546 **При НЕнулевом коде выхода `review_journal.py`** скрипт НИЧЕГО не выдумывает —47 он печатает в `stderr` полный список реальных пробелов. Действуй48 детерминированным циклом (**максимум 3 итерации**):4950 1. Прочитай `stderr`. Машиночитаемый список — в строке51 `REVIEW_VALIDATION_ERRORS: [...]` (JSON-массив **всех** проблемных находок52 сразу). Каждый элемент: `index`, `file`, `line`, `type`, `missingKeys`,53 `invalidSeverity`.54 2. Для **каждой** перечисленной находки сделай точечную проверку: открой55 (`Read`) её `file` (при необходимости по `line`) и впиши в56 `/tmp/raw-scan.json` **реальное** недостающее значение, выведенное из кода —57 настоящие `description`/`recommendation`/`fix`, либо корректную `severity` из58 набора `{high, medium, low}`. Чини **все** находки из списка за один59 проход. **Никаких заглушек/плейсхолдеров.**60 3. Перезапусти ту же команду `review_journal.py`. Повторяй цикл, пока код выхода61 не станет 0.6263 Если за 3 итерации сойтись не удалось — НЕ подсовывай выдуманные данные: останови64 flow с ошибкой (внешний слой перезапустит скан заново). Честный повтор лучше65 фиктивного отчёта.66673. **VALIDATE финал.** Сначала синтаксис: `python3 -m json.tool "RESULT_PATH"`.68 Затем — самопроверка **реальной финальной формы** перед тем как объявить готово.69 Прочитай `RESULT_PATH` и убедись по каждому пункту:70 - `data.summary` — это **строка** (не объект, не массив).71 - `data.scannedFiles` — это **число**.72 - `data.riskLevel` ∈ `{high, medium, low, none}`.73 - `data.auditedFiles` — это **массив строк**.74 - у **каждого** `data.vulnerabilities[i]` присутствуют все 7 ключей75 (`file, line, type, severity, description, recommendation, fix`), причём76 `description`, `recommendation`, `fix` — **непустые**.77 - `data.riskLevel` **равен** максимальной severity среди находок (`none`, если78 находок нет).7980 **Если самопроверка нашла пробел** — НЕ вставляй плейсхолдер. Исправь81 **реальное** содержимое: перечитай файл модуля и впиши настоящий82 `fix`/`recommendation`/`description`, затем **заново выполни шаг REVIEW** (п. 2,83 тем же ограниченным циклом — максимум 3 итерации), чтобы reviewed-отчёт был84 пересобран из исправленных данных. Если сойтись не удалось — останови flow с85 ошибкой, не сдавай фиктивный отчёт.86874. **Резюме одной строкой:** reviewed-счётчики severity (high/medium/low)88 из data.reviewSummary.8990Никаких UI/веб-серверов не запускай. Накопительный журнал (`journal-update`) в91этом headless-пайплайне НЕ ведётся — кросс-ран состояние отслеживает API.