# Линтинг архива функции — flow (май 2026) ## Назначение Пользователь может загрузить zip-архив с кодом функции. Перед сохранением или после загрузки — архив можно прогнать через линтер, чтобы убедиться что код синтаксически корректен. Линтинг выполняется **на сервере** (в Kubernetes), а не на машине пользователя. --- ## Endpoint ``` POST /console/api/ai/lint-archive Authorization: X-Auth-Token: Content-Type: multipart/form-data ``` Поле: `archive` — zip-файл. ### Ограничения - Максимальный размер zip-архива: **100 KB** - Максимальный суммарный размер распакованных файлов: **100 KB** (защита от zip bomb) - При превышении — HTTP 413 ### Response (200 OK) ```json { "ok": true, "results": [ {"file": "hello.py", "ok": true}, {"file": "bad.js", "ok": false, "output": "SyntaxError: Unexpected token (2:0)"} ] } ``` ### Response (ошибка) ```json {"error": "архив слишком большой: максимум 100 KB"} ``` --- ## Поддерживаемые языки | Расширение | Язык | Линтер | |-----------|---------|---------------------------| | `.py` | Python | `python3 -m py_compile` | | `.js` | Node.js | `node --check` | | `.rb` | Ruby | `ruby -c` | | `.php` | PHP | `php -l` | Файлы с другими расширениями (`.json`, `.txt`, `.md`, `.yaml` и т.д.) — пропускаются. Если в архиве нет ни одного поддерживаемого файла — HTTP 400. --- ## Реализация (backend) Файл: `console/internal/api/lint_archive.go` 1. Архив читается в память (`bytes.Buffer`), без записи на диск. 2. zip открывается через `archive/zip.Reader` из буфера в памяти. 3. Проверяется суммарный распакованный размер — защита от zip bomb. 4. Каждый поддерживаемый файл читается из zip в память. 5. Записывается во временный файл в **`/dev/shm`** (RAM-backed tmpfs), fallback — `/tmp`. 6. Линтер запускается с таймаутом 10 секунд на файл. 7. Временный файл удаляется сразу после линтинга. 8. Путь к tmp-файлу скрыт от пользователя в выводе линтера. --- ## Что ещё нужно сделать - [ ] UI: кнопка "Проверить архив" рядом с полем загрузки архива в форме создания функции - [ ] Показывать результаты в UI (список файлов, статус, ошибки) - [ ] Тесты: `scripts/test_fn_archives.sh` — добавить вызов lint-archive endpoint