CI-агностичный пайплайн: на каждый pull request или merge request собирает контекст изменений, отправляет его в LLM и возвращает в ветку описание фичи, тест-план ручной проверки и черновик тестового CI-пайплайна. Итог публикуется комментарием в PR/MR.
Исходный код закрыт. Здесь — устройство инструмента и решения, которые за ним стоят. Код покажу на собеседовании, доступ на чтение дам по запросу.
Python 3.9+ без внешних зависимостей · OpenAI-совместимый Chat Completions API · GitHub Actions · GitLab CI
flowchart LR
PR["PR / MR"] --> Ctx["git diff base...HEAD<br/>коммиты · статистика · файлы"]
Ctx --> Trim["обрезка diff<br/>до лимита символов"]
Trim --> LLM["LLM<br/>OpenAI-совместимый API"]
LLM --> Doc["описание фичи"]
LLM --> Plan["тест-план"]
LLM --> Pipe["черновик CI-пайплайна"]
Doc --> Out["коммит в ветку с [skip ci]<br/>+ комментарий в PR/MR"]
Plan --> Out
Pipe --> Out
ai_feature_analysis/
__main__.py CLI: флаги, dry-run, мягкий режим ошибок
git_utils.py diff и коммиты, автоопределение базовой ветки
llm_client.py клиент Chat Completions на urllib с ретраями
prompts.py системный и пользовательские промпты, шаблоны
analyzer.py оркестрация: контекст → LLM → Markdown
notify.py комментарий в GitHub PR / GitLab MR
На выходе в docs/features/:
| Файл | Что внутри |
|---|---|
<branch>.md |
что сделано, зачем, риски, как тестировать |
<branch>.test-plan.md |
чеклист ручной проверки на 15–30 минут: стенд, 3–10 проверок, граничные случаи, критерии приёмки |
<branch>.test-pipeline.yml |
минимальный пайплайн: зависимости → линт → тесты → сборка, стек определяется по diff |
Пакет написан на стандартной библиотеке Python: HTTP через urllib, ретраи свои.
В CI не нужен pip install — запуск быстрее, и нет цепочки поставок, которую надо
обновлять и проверять.
Базовая ветка берётся из переменных окружения CI, затем из origin/main, либо задаётся
явно. GitHub Actions и GitLab CI работают из коробки, остальные системы — через
переменные окружения. Модель — любой endpoint с Chat Completions: OpenAI, OpenRouter,
DeepSeek или локальные Ollama и vLLM.
Тестовый YAML кладётся в docs/features/, а не в .github/workflows/. Непроверенный код
от модели не должен попадать в CI без ревью — чтобы включить, его переносят вручную.
При каждом пуше в ветку комментарий обновляется, а не добавляется новый. Тест-план вставляется в него сворачиваемым блоком.
Коммит артефактов в ветку помечен [skip ci], иначе он запускал бы анализ заново.
--dry-run показывает, что именно уйдёт в модель, не вызывая её. Полный прогон — до трёх
запросов к LLM; ненужные артефакты отключаются флагами или переменными окружения.
- Diff уходит внешнему провайдеру. Для кода, который нельзя показывать третьей стороне, — только локальная модель.
- Нужен
fetch-depth: 0: без полной истории нет merge-base, и анализ сводится к последнему коммиту. - В PR из форков токен GitHub выдаётся только на чтение: комментарий и коммит не пройдут.
Рабочий инструмент: около 1 000 строк Python, готовые конфигурации для GitHub Actions и GitLab CI. Автотестов пока нет.