From 13021c87c59b42311d5bdf992b56393153abafea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?4319=20=D0=97=D0=B0=D0=B4=D0=BE=D1=80=D0=BE=D0=B6=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=90=2E=D0=92?= Date: Sun, 19 Jul 2026 19:59:50 +0300 Subject: [PATCH 1/2] =?UTF-8?q?fix(plugin):=20=D1=81=D0=B8=D0=BD=D1=85?= =?UTF-8?q?=D1=80=D0=BE=D0=BD=D0=B8=D0=B7=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BC=D0=B0=D0=BD=D0=B8=D1=84=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D1=8B=20=D0=BF=D0=BB=D0=B0=D0=B3=D0=B8=D0=BD=D0=B0=20=D1=81=20?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B5=D0=B9=200.3.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Бамп версии 0.3.2 → 0.3.3 в pyproject.toml не сопровождался пересборкой манифестов плагина, из-за чего падали джобы Codex Plugin и Publish to PyPI (scripts/update_codex_plugin_manifest.py --check и install-тесты). Пересобрано скриптом синка: Claude-манифест → 0.3.3, Codex canonical/root → 0.3.3+codex.9aa7a5c3958b (digest пересчитан по обновлённому payload). --- .codex-plugin/plugin.json | 2 +- plugin/.claude-plugin/plugin.json | 2 +- plugin/.codex-plugin/plugin.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index e2ae6c5d..f6e4f867 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "rag-reviewer", - "version": "0.3.2+codex.9d551e36d655", + "version": "0.3.3+codex.9aa7a5c3958b", "description": "Agentic PR review: hybrid RAG + code graph via MCP, review skills for Codex", "repository": "https://github.com/mimfort/rag_for_git", "license": "MIT", diff --git a/plugin/.claude-plugin/plugin.json b/plugin/.claude-plugin/plugin.json index 5e8b8ae7..70da0947 100644 --- a/plugin/.claude-plugin/plugin.json +++ b/plugin/.claude-plugin/plugin.json @@ -1,5 +1,5 @@ { "name": "rag-reviewer", - "version": "0.3.2", + "version": "0.3.3", "description": "Agentic PR review: hybrid RAG + code graph via MCP, review skills for Claude Code" } diff --git a/plugin/.codex-plugin/plugin.json b/plugin/.codex-plugin/plugin.json index add8c9b3..81e86b26 100644 --- a/plugin/.codex-plugin/plugin.json +++ b/plugin/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "rag-reviewer", - "version": "0.3.2+codex.9d551e36d655", + "version": "0.3.3+codex.9aa7a5c3958b", "description": "Agentic PR review: hybrid RAG + code graph via MCP, review skills for Codex", "repository": "https://github.com/mimfort/rag_for_git", "license": "MIT", From 4cdcb7c8e4c00638395b6e8ba0e9948c8d929867 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?4319=20=D0=97=D0=B0=D0=B4=D0=BE=D1=80=D0=BE=D0=B6=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=90=2E=D0=92?= Date: Sun, 19 Jul 2026 20:04:45 +0300 Subject: [PATCH 2/2] =?UTF-8?q?fix(web):=20=D0=B8=D0=BD=D0=B8=D1=86=D0=B8?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B7=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D1=81=D1=85=D0=B5=D0=BC=D1=83=20=D0=91=D0=94=20=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D1=80=D0=B8=D0=B8=20=D0=B2=20lifespan,=20?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B5=20=D0=B2=20=D1=82=D0=B5=D0=BB=D0=B5=20cre?= =?UTF-8?q?ate=5Fapp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Жадный вызов history.init_schema() при конструировании приложения открывал пул Postgres даже при простом создании app (напр. unit-тест SPA-fallback на машине с собранным фронтом), из-за чего срабатывал новый guard изоляции инфраструктуры (PR #111): «Unit-тесту запрещено создание пула Postgres». Инициализация схемы перенесена в startup-часть lifespan (fail-soft сохранён). Прод (reviewer serve → uvicorn) запускает lifespan, поведение не меняется; конструирование app без lifespan к БД больше не подключается. --- reviewer/web/app.py | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/reviewer/web/app.py b/reviewer/web/app.py index 84819503..abdb8c2a 100644 --- a/reviewer/web/app.py +++ b/reviewer/web/app.py @@ -33,12 +33,15 @@ def create_app(settings: Settings) -> FastAPI: """Создать и настроить FastAPI-приложение. - - Инициализирует ReviewHistory и schema (fail-soft: если БД недоступна, - сервер всё равно стартует с предупреждением). + - Инициализирует ReviewHistory; схема создаётся на старте сервера в lifespan + (fail-soft: если БД недоступна, сервер всё равно стартует с предупреждением). - Монтирует API-роутер (/api/*). - Монтирует собранный SPA на / (если dist существует) или отдаёт заглушку. - Настраивает CORS для dev-сервера Vite (:5173). - При завершении работы закрывает пул соединений к Postgres. + + Пул Postgres создаётся лениво (init_schema — в lifespan, не в теле фабрики), + поэтому простое конструирование приложения к БД не подключается. """ history = ReviewHistory( settings.pg_dsn, @@ -48,6 +51,16 @@ def create_app(settings: Settings) -> FastAPI: @asynccontextmanager async def _lifespan(app: FastAPI): + # История прогонов: инициализация схемы на старте (fail-soft). + try: + history.init_schema() + except Exception as exc: + log.warning( + "Не удалось инициализировать схему БД истории (%s). " + "Убедитесь, что Postgres запущен: docker compose up -d. " + "API-эндпоинты вернут ошибку 500 до подключения к БД.", + exc, + ) yield history.close() @@ -67,18 +80,7 @@ async def _lifespan(app: FastAPI): allow_headers=["*"], ) - # История прогонов - try: - history.init_schema() - except Exception as exc: - log.warning( - "Не удалось инициализировать схему БД истории (%s). " - "Убедитесь, что Postgres запущен: docker compose up -d. " - "API-эндпоинты вернут ошибку 500 до подключения к БД.", - exc, - ) - - # API-роутер + # API-роутер (схема БД инициализируется в lifespan на старте сервера) app.include_router(make_router(history, settings)) # Статика / SPA