Skip to content

feat: /help (RAG+MCP) и AI-ревью PR (/review + GitHub Action) - #15

Merged
Sermage merged 3 commits into
masterfrom
feat/help-rag-mcp
Jul 18, 2026
Merged

feat: /help (RAG+MCP) и AI-ревью PR (/review + GitHub Action)#15
Sermage merged 3 commits into
masterfrom
feat/help-rag-mcp

Conversation

@Sermage

@Sermage Sermage commented Jul 18, 2026

Copy link
Copy Markdown
Owner

Вносит в master две фичи поверх уже влитого ollama-провайдера:

Оба уже прошли ревью в отдельных PR (#12, #13). pytest — 492 passed. Конфликтов с master нет.

🤖 Generated with Claude Code

https://claude.ai/code/session_01WPCiJi7DVBdV2fjN2x3HMd

pisakov and others added 3 commits July 16, 2026 16:59
…тка через MCP

Команда /help без аргумента остаётся статичной справкой, а /help <вопрос>
отвечает по документации проекта: RAG-поиск по README + docs/ + CLAUDE.md и
текущая git-ветка, полученная через MCP-сервер mcp-server-git.

- docs/: architecture.md, memory-model.md, commands.md — корпус для RAG
- app/project_help.py: use case (порты RetrievalEngine, GitContextProvider, LLMClient)
- app/ports.py: новый порт GitContextProvider
- infra/mcp_git.py: McpGitContextProvider — git-ветка через MCP (git_status/git_branch)
- cli/help_commands.py + cli/main.py: обработчик и проводка в диспетчере
- cli/views.py: справка дополнена строкой /help <вопрос>
- tests: 16 юнит-тестов на use case, infra-провайдер и CLI-диспетчер (все на фейках)

Индекс доков собирается rag-kotlin/ingest.py, embed-модель bge-m3, путь
задаётся RAG_INDEX_PATH. git-ветка тянется детерминированно, независимо от
tool-calling, поэтому работает и на DeepSeek, и на локальной модели.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Пайплайн автоматического код-ревью пул-реквеста:
- получает diff и изменённые файлы через GitHub (gh);
- подмешивает RAG-контекст по двум индексам — документация и код
  (CompositeRetrievalEngine);
- LLM выдаёт структурированный разбор: баги / архитектура / рекомендации.

Слои:
- domain/review.py::PrDiff; app/pr_review.py::review_pull_request (use case);
- порты app.ports.DiffProvider/ReviewPublisher;
- infra: GhDiffProvider, GhReviewPublisher, gh.run_gh, CompositeRetrievalEngine;
- CLI /review <PR> (печатает); review_pr.py — CI-энтрипойнт (постит комментарий);
- GitHub Action .github/workflows/ai-review.yml (self-hosted, on: pull_request).

Тесты на фейках (18 шт.), pytest зелёный (492 passed). Второй индекс по коду —
CODE_INDEX_PATH (по умолчанию ~/rag-kotlin/index_jarvis_full).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WPCiJi7DVBdV2fjN2x3HMd
feat(review): AI-ревью PR — diff через GitHub + RAG (доки+код)
@Sermage
Sermage merged commit 4edd10e into master Jul 18, 2026
1 check passed
@github-actions

Copy link
Copy Markdown

🤖 AI-ревью

🐞 Потенциальные баги

  1. app/pr_review.py:89-90 — Параметр changed_files аннотирован как необязательный (list[str]), но в строке 90 переопределяется через list(changed_files or []). Если передан None, то операция or [] сработает, но если передан пустой список [] (который falsy), то он так и останется пустым. Лучше использовать changed_files = changed_files or [] — это не баг, но может сбить с толку.

  2. app/pr_review.py:99-100 — Проверка if not diff.strip() and not changed_files: использует changed_files, который уже переопределён выше как список. Если changed_files пуст, то второй элемент and будет False, что корректно. Однако если diff пуст, но changed_files содержит файлы, то ревью запустится с пустым diff, а RAG-запрос будет сформирован только из списка файлов. Это может привести к генерации ревью без анализа изменений.

  3. app/pr_review.py:113 — Атрибут text в объекте ReviewResult может содержать пустую строку, если client.chat() вернул пустой ответ. В таком случае _EMPTY_REVIEW не будет использован, но результат будет формально пустым.

  4. .github/workflows/ai-review.yml:38-39 — Путь RAG_INDEX_PATH: ~/.jarvis/rag/docs_index и CODE_INDEX_PATH: ~/rag-kotlin/index_jarvis_full указываются с тильдой ~. В GitHub Actions через env: тильда может не раскрываться корректно, если действие не запускает оболочку. Лучше использовать абсолютные пути или $HOME/....

🏛 Архитектурные проблемы

  1. app/pr_review.py:31-36 — Системный промпт для ревью дублирует требования из задачи, но жёстко зашит в коде use case. Это нарушает принцип единственной ответственности: промпт-инжиниринг должен быть отдельной сущностью или параметром, чтобы его можно было менять без пересборки приложения.

  2. app/project_help.py:9-10 — Порт GitContextProvider определён в app/ports.py, но не используется в cli/main.py и не внедряется никуда, кроме answer_project_question. Отсутствует связь с существующей системой команд /help — в diff не видно интеграции.

  3. app/pr_review.py и app/project_help.py — Оба use case содержат дублирование: функции _build_context() есть в обоих файлах с почти одинаковой логикой (разница только в git-ветке у project_help.py). Следует вынести в общий модуль app/_context.py или подобный.

  4. app/pr_review.py:9-12 — Комментарий упоминает, что use case тестируется на фейках, но в тестовом файле (tests/app/test_pr_review.py) нет проверки взаимодействия с RetrievalEngine через фейки — только базовый проверки. Отсутствует тест на случай, когда engine.is_ready() вернул False.

💡 Рекомендации

  1. app/pr_review.py:89-90 — Заменить строку на явную проверку if changed_files is None: changed_files = [] для ясности намерений.

  2. app/pr_review.py:100 — Добавить проверку if not diff.strip(): return ReviewResult(text=_EMPTY_REVIEW, files=changed_files, used_context=False) для сценария пустого diff с непустым списком файлов.

  3. app/pr_review.py:113 — Добавить пост-проверку: if not text.strip(): return ReviewResult(text=_EMPTY_REVIEW, ...).

  4. .github/workflows/ai-review.yml:38-39 — Заменить ~ на $HOME в путях индексов для гарантированной корректности в CI-окружении.

  5. app/_context.py (новый файл) — Вынести общие функции _build_context и _added_lines из app/pr_review.py и app/project_help.py в один модуль, чтобы избежать дублирования.


Контекст (RAG): cli/main.py · cli/views.py — ── help ──────────────────────────────────────────────────────────────────── · domain/retrieval.py — llm — cross-encoder на LLM: модель оценивает релевантность каждого чанка. · app/retrieval_pipeline.py

Сгенерировано jarvis-cli · review_pr.py

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant