[1] major Файл: ai-review.js Строка: 1-1680 Тип: code-smell Описание: Файл содержит 1680 строк и объединяет загрузку конфигураций, ридер файлов, сбор промтов, вызовы DeepSeek/Codex, парсинг, интеграции и вспомогательные утилиты. Это нарушает принцип единственной ответственности и делает поддержку/тестирование практически невозможным. Разбей функциональность на модули (например: конфигурация, загрузка промтов, DeepSeek-клиент, Codex-клиент, reporting) и экспортируй только нужные API, чтобы уменьшить длину и повысить читаемость. [2] major Файл: ai-review.js Строка: 32-36 Тип: code-smell Описание: Глобальная переменная `CONFIG` используется повсеместно без инкапсуляции, что усложняет тестирование и ведет к гонкам при параллельных вызовах. Инкапсулируй конфигурацию в объект/класс, передаваемый в функции, или используй dependency injection, чтобы устранить глобальное состояние и упростить юнит-тесты. [3] major Файл: ai-review.js Строка: 63-77 Тип: code-smell Описание: Функция `error` вызывает `process.exit(1)`, что делает модуль непригодным для тестирования и повторного использования (например, в серверном контексте). Вместо прямого завершения выбрасывай исключение или возвращай ошибку, а точка входа (CLI) уже должна решать, завершать процесс или продолжать. [4] major Файл: ai-review.js Строка: 131-181 Тип: code-smell Описание: `loadPromptForDeepSeek` выполняет загрузку с URL, fallback на файл и генерацию адаптивного промта в одной функции, с многочисленным try/catch и вложенной логикой. Раздели на: 1) загрузку промта (общую, переиспользуемую), 2) выбор источника (URL/файл), 3) создание адаптированного текста. Это снизит цикломатику и облегчит тесты. [5] major Файл: ai-review.js Строка: 217-320 Тип: code-smell Описание: `adaptPromptForCodex` строит большой промт с циклом и множеством условных блоков, что приводит к высокой сложности и трудностям модификации. Вынеси построение базовой структуры в отдельный генератор, используемый с шаблонами, и заменяй контекст/фрагменты через функции-помощники; либо применяй `map` + `join`, чтобы избежать мутирующих строк и упростить добавление нового контента. [6] major Файл: ai-review.js Строка: 354-403 Тип: code-smell Описание: `getChangedFiles` содержит три ветви (MR, push, fallback), обернутые в try/catch, что мешает читать и тестировать. Упростите, вынеся каждый сценарий в отдельную функцию (`getFilesFromMergeRequest`, `getFilesFromPush`, `getAllTrackedFiles`), обработку ошибок вынести наружу и явно логировать, а не подавлять все исключения. [7] major Файл: ai-review.js Строка: 429-467 Тип: performance Описание: `buildFilesContentPrompt` читает полный контент каждого файла и вставляет его в промт без ограничения размера, что легко приведёт к превышению лимитов токенов. Введи ограничение на длину (например, 50–100 KB) или берите только изменённые фрагменты. Также можно сжимать/отбрасывать большие комментарии и уведомлять пользователя о пропущенных частях. [8] major Файл: ai-review.js Строка: 490-642 Тип: code-smell Описание: `parseTextReport` содержит 152 строки логики с множеством условий, регулярных выражений и состояния. Это затрудняет поддержку и расширение. Раздели процесс на стадии (извлечение блока, проверка “no issues”, парсинг структурированных записей, fallback) и вынеси повторяющуюся логику парсинга (метаданные, описание) в вспомогательные функции. [9] major Файл: ai-review.js Строка: 750-754 Тип: code-smell Описание: Использование глобальной `globalAuthData` при генерации токенов нарушает инкапсуляцию и делает функцию `getOpenAIApiKey` непредсказуемой (например, повторные вызовы перезаписывают данные). Возвращай authData напрямую и передавай его в нужные функции, чтобы избежать побочных эффектов. [10] major Файл: ai-review.js Строка: 788-807 Тип: security Описание: `setupCodexCLIEnvironment` пишет файл `~/.codex/auth.json` с токенами/refresh-токенами без проверки прав доступа или шифрования, создавая угрозу утечки при открытых правах (например, если папка доступна другим пользователям). Установи режим доступа `0o600`, проверяй текущие права и, по возможности, используйте безопасное хранилище (keychain/secret manager), не записывая токены в открытые файлы. [11] major Файл: ai-review.js Строка: 817-932 Тип: code-smell Описание: `callCodexCLI` обрабатывает стримы stdout/stderr, JSONL и токены в одном месте, что делает функцию длинной и трудно тестируемой. Раздели части: 1) запуск процесса и сбор вывода, 2) разбор JSONL (в отдельный парсер), 3) логика токенов. Также вынеси создание окружения/args в конфиг, чтобы проще менять без изменения логики. [12] major Файл: ai-review.js Строка: 960-1049 Тип: code-smell Описание: `callDeepSeekAPI` вручную строит HTTPS-запрос, повторяя обработку ошибок и парсинг JSON, что сложно поддерживать. Используй стабильную HTTP-библиотеку (`axios`, `node-fetch`) с таймаутами и retry, либо вынеси общую обработку ответов в утилиты вместо дублирования логики в теле запроса. [13] major Файл: ai-review.js Строка: 1051-1088 Тип: performance Описание: `analyzeSnippetsWithCodex` перед тем как вызвать Codex не ограничивает длину адаптированного промта или количество фрагментов, поэтому при большом списке snippets промт превысит лимиты токенов. Введи ограничение (например, анализ не более N-х snippets за запуск) и дополнительно разбивай их на батчи с отдельными вызовами Codex. [14] major Файл: ai-review.js Строка: 1109-1206 Тип: code-smell Описание: `saveReportToServer` вручную собирает SSH/SCP-команды и работает с временными файлами, что тяжело поддерживать и безопасно. Используй библиотеку (например, `ssh2-sftp-client`) для загрузки файлов и обеспечь обработку ошибок в одном месте; также избегай хранения SSH-пароля в командной строке (передавай через stdin или ключи). [15] major Файл: ai-review.js Строка: 1208-1288 Тип: code-smell Описание: `generateSummaryWithDeepSeek` комбинирует подготовку статистики, чтение шаблона, парсинг JSON и вызов API в одной функции; сложно тестировать. Раздели на 1) получение статистики, 2) подготовку шаблона/промта, 3) вызов DeepSeek. Вынеси повторяющиеся шаги (например, `extractContentBetweenMarkers`) в утилиты. [16] major Файл: ai-review.js Строка: 1324-1418 Тип: code-smell Описание: `sendToPachka` формирует сообщение, сериализует JSON и вручную делает HTTPS-запрос (с множеством конкатенаций). Это делает функцию длинной и непересматриваемой. Вынеси формирование payload в отдельную функцию, а HTTP вызов сделай через клиентскую обёртку с retry и централизованной обработкой ошибок. [17] major Файл: ai-review.js Строка: 1422-1465 Тип: code-smell Описание: `initialize` делает слишком много: загружает конфиг, меняет глобальный логгер, проверяет env, создает каталоги, вызывает `git --version` и проверяет CLI. Это затрудняет переиспользование и тестирование. Раздели инициализацию на отдельные шаги (валидация конфигурации, подготовка окружения, проверка внешних зависимостей) и возвращай объект состояния вместо глобальных побочных эффектов. [18] major Файл: ai-review.js Строка: 1495-1573 Тип: architecture Описание: `runAnalysis` включает в себя определение файлов, сбор diff, построение промта, вызов DeepSeek, парсинг проблем, сохранение QA и отправку отчетов — всё в одной функции. Вынеси этапы в отдельные методы или класс (planDeepSeekRun, processResults, reportResults), чтобы улучшить читаемость и позволяло точечно тестировать этапы без повторного запуска всего цикла. [19] major Файл: ai-review.js Строка: 1642-1680 Тип: code-smell Описание: `loadPrompts` одновременно загружает prompt, проверяет URL, скачивает, логирует и вызывает `loadPromptForDeepSeek`. Логика загрузки и проверки должна быть выделена в отдельный сервис (`PromptLoader`), чтобы можно было мокать скачивание и повторно использовать код без дублирования.