Skip to content

MCP-сервер для работы с тестами из ИИ-агентов#27

Merged
sfaqer merged 2 commits into
masterfrom
feature/mcp-server
Jul 14, 2026
Merged

MCP-сервер для работы с тестами из ИИ-агентов#27
sfaqer merged 2 commits into
masterfrom
feature/mcp-server

Conversation

@sfaqer

@sfaqer sfaqer commented Jul 14, 2026

Copy link
Copy Markdown
Owner

Что добавлено

Команда oneunit mcp поднимает MCP-сервер (Model Context Protocol, stdio) на базе autumn-mcp, позволяющий ИИ-агентам (Claude Code, Cursor и другим MCP-клиентам) работать с тестами проекта напрямую, без разбора консольного вывода.

Инструменты

Инструмент Описание
run_tests Прогон с фильтрами (каталоги/файлы/теги/наборы/методы, таймаут) и структурированным результатом: statistics, problems (статус, набор, тест, сообщение, стек), skipped_tests; параметр coverage добавляет сводку покрытия — общий процент и непокрытые строки по файлам
discover_tests Список полных имён тестов без выполнения

Подключение описано в README (раздел 3), включая конфигурации для Windows (cmd /c) и Linux/macOS.

Сопутствующие изменения

  • РепортерJSON (core) — машиночитаемый отчёт прогона по детальке ПутьКОтчетуJSON: статусы из настоящих состояний выполнения (failed/broken/skipped/aborted), причины и стеки
  • ЗапускательТестирования (cli/internal) — общий желудь запуска прогонов дочерним процессом: одна реализация для execute, discover и MCP-инструментов, включая сбор покрытия (-codestat + ГенераторОтчетаПокрытия)
  • Ожелужены служебные модули cli/internal и mcp/internal — зависимости через &Пластилин, MCP-инструменты получают сервисы конструктором (требует autumn-mcp 1.1.1)
  • Канонизация регистра рабочего каталога (КаноническийРегистрПути): отчёт покрытия фильтруется по каталогу исходников регистрозависимо, а VSCode передаёт путь проекта с маленькой буквой диска — без канонизации покрытие возвращалось пустым
  • Зависимости: autumn-mcp 1.1.1, decorator 2.0.8 (оба фикса — апстрим-PR из этой работы: DI в инструментах autumn-mcp и подмена Неопределено в обёртках decorator, Исправлена подмена Неопределено на декоратор при отсутствии исходного объекта nixel2007/decorator#28)

Тесты

105 тестов (было 77), покрытие src 98.5%. Новые: интеграционные на запускатель (зелёный/красный прогоны, обнаружение, отчёты покрытия), РепортерJSON (проблемы, пропуски, прерванные контейнеры), MCP-обвязка (детальки, разбор JSONL, сводка покрытия, канонизация регистра).

Проверено end-to-end живым MCP-клиентом (Claude Code): tools/list, run_tests с покрытием на полном наборе тестов проекта, discover_tests.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Новые возможности

    • Добавлена интеграция с ИИ-агентами через MCP-сервер.
    • Доступны инструменты запуска и обнаружения тестов с фильтрами, таймаутами и рабочим каталогом.
    • Добавлено формирование JSON-отчётов и сводок покрытия кода.
    • В CLI появилась команда запуска MCP-сервера.
    • Добавлены подсказки параметров методов со значениями по умолчанию.
  • Документация

    • README дополнен инструкциями по настройке MCP и описанием доступных инструментов.
  • Тесты

    • Расширено покрытие тестами запуска, обнаружения, отчётов и анализа покрытия.

Команда oneunit mcp поднимает MCP-сервер (stdio) на autumn-mcp с двумя
инструментами: run_tests выполняет прогон и возвращает структурированный
результат (статистика, проблемы с текстами ошибок и стеками, пропущенные
тесты, опционально сводка покрытия кода), discover_tests возвращает список
полных имен тестов без выполнения.

Сопутствующие изменения:
- РепортерJSON в ядре: машиночитаемый отчет прогона (статистика, проблемы,
  пропуски) с подключением по детальке ПутьКОтчетуJSON
- Общий желудь ЗапускательТестирования: единая логика запуска прогонов
  дочерним процессом для команд execute/discover и MCP-инструментов,
  включая сбор покрытия
- Служебные модули cli/internal ожелужены (КонсольноеПриложениеТестирование-
  Служебный, ЗапускательТестирования), команды получают их пластилином
- Канонизация регистра рабочего каталога: отчет покрытия фильтруется по
  каталогу исходников регистрозависимо, а клиенты (VSCode) передают путь
  проекта в произвольном регистре
- Подняты зависимости: autumn-mcp 1.1.1 (поддержка DI в инструментах),
  decorator 2.0.8 (исправление подмены Неопределено в обертках)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@sfaqer, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 30 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: c39b2983-85c8-4bab-aa9c-d231a1d1b92d

📥 Commits

Reviewing files that changed from the base of the PR and between b2a535f and ab9fa10.

📒 Files selected for processing (3)
  • src/mcp/internal/Классы/MCPИнструментыСлужебный.os
  • src/mcp/Классы/ИнструментВыполнитьТесты.os
  • tests/MCPИнструменты.os

Walkthrough

Добавлены MCP-сервер OneUnit и инструменты run_tests/discover_tests. Запуск тестов и обнаружение унифицированы, JSON-отчеты и покрытие стали доступны через общий слой, CLI-команды обновлены, документация и тесты расширены.

Changes

MCP и тестирование

Layer / File(s) Summary
Общий запускатель и CLI-интеграция
src/cli/internal/..., src/cli/Классы/..., tests/КонсольноеПриложение.os, tests/support/...
Запуск тестов, обнаружение, логирование, покрытие и канонизация путей объединены в общий запускатель; CLI-команды используют внедренные зависимости.
JSON-отчетность прогонов
src/core/internal/Классы/РепортерJSON.os, src/core/internal/Классы/РогаткаТестирование.os
Добавлен JSON-репортер со статистикой, проблемами, пропущенными и прерванными тестами.
MCP-сервер и служебный слой
src/mcp/main.os, src/mcp/internal/..., src/cli/Классы/КомандаMCP.os, packagedef
Добавлены точка входа MCP, команда mcp, фильтры, обработка JSONL, чтение отчетов и сводка покрытия.
Инструменты MCP и документация
src/mcp/Классы/..., README.md
Реализованы run_tests и discover_tests с фильтрами, таймаутом, рабочим каталогом и покрытием; README описывает подключение и ответы.
Проверка MCP-функциональности
tests/MCPИнструменты.os
Добавлены проверки фильтров, запусков, отчетов, обнаружения и расчета покрытия.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant MCPClient
  participant CommandMCP
  participant MCPMain
  participant MCPTool
  participant TestRunner
  participant JSONReport
  MCPClient->>CommandMCP: запускает mcp
  CommandMCP->>MCPMain: загружает MCP-сервер
  MCPMain->>MCPTool: подключает инструмент
  MCPTool->>TestRunner: передает фильтры и параметры
  TestRunner->>JSONReport: формирует отчет
  JSONReport-->>MCPTool: возвращает результаты
  MCPTool-->>MCPClient: возвращает ответ
Loading

Poem

Я兔ик прыгнул в MCP,
Тесты собрал в JSON-стопку.
Покрытие блеснуло росой,
discover нашел путь лесной.
Морковкой отмечен успех!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed Заголовок точно отражает основное изменение: добавлен MCP-сервер для запуска и обнаружения тестов из ИИ-агентов.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/mcp-server

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (1)
tests/MCPИнструменты.os (1)

20-97: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Добавьте покрытие для параметров 5–9 в ДеталькиФильтров tests/MCPИнструменты.os:20-97

Сейчас тесты проверяют только значения по умолчанию для ТегиИсключаемые, ТестовыеНаборыВключаемые/Исключаемые и ТестовыеМетодыВключаемые/Исключаемые. Добавьте хотя бы один кейс с непустыми значениями для этих позиций и проверкой соответствующих полей в Детальки, чтобы не пропустить смещение позиционных аргументов.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/MCPИнструменты.os` around lines 20 - 97, Добавьте в область тестов
новый сценарий для процедуры ДеталькиФильтров, передав непустые значения в
параметры 5–9: ТегиИсключаемые, ТестовыеНаборыВключаемые,
ТестовыеНаборыИсключаемые, ТестовыеМетодыВключаемые и ТестовыеМетодыИсключаемые.
Проверьте в результате Детальки соответствующие поля с исходными значениями и
порядком, чтобы выявить смещение позиционных аргументов.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/cli/internal/Классы/ЗапускательТестирования.os`:
- Around line 174-199: Добавьте внешний тайм-аут вокруг вызова
Команда.Исполнить() в процедуре запуска тестирования, чтобы зависший дочерний
oscript не блокировал MCP-сеанс; используйте существующий механизм тайм-аутов
проекта, корректно прерывайте процесс по истечении времени и сохраняйте текущую
обработку вывода через Команда.ПолучитьВывод().

In `@src/core/internal/Классы/РепортерJSON.os`:
- Around line 64-68: В рекурсивной ветке обработки контейнеров обновите вызов
ОбработатьНабор, передавая полное имя текущего контейнера через Дитя.ПолноеИмя()
вместо родительского ИмяНабора; вызов ОбработатьТест оставьте без изменений.

In `@src/mcp/internal/Классы/MCPИнструментыСлужебный.os`:
- Around line 161-166: В
src/mcp/internal/Классы/MCPИнструментыСлужебный.os#L161-L166 оберните разбор
через ЧтениеJSON и ПрочитатьJSON в Попытка/Исключение, закрывая ЧтениеJSON при
ошибке и возвращая Неопределено; аналогично обработайте разбор ЧтениеXML в
src/mcp/internal/Классы/MCPИнструментыСлужебный.os#L199-L236, гарантируя
закрытие ресурса и возврат Неопределено при исключении, чтобы сохранить откат к
консольному выводу.

In `@src/mcp/Классы/ИнструментВыполнитьТесты.os`:
- Around line 139-185: Оберните операции формирования фильтров, запуска
тестирования, чтения отчета и покрытия в методе инструмента в конструкцию
Попытка/Исключение с гарантированным вызовом МенеджерВременныхФайлов.Удалить().
Сохраните текущее поведение и проброс исключений, обеспечив удаление временных
файлов как при успешном выполнении, так и при ошибке в
_Служебный.ДеталькиФильтров, _Служебный.ВыполнитьТестирование,
_Служебный.ПрочитатьОтчет или _Служебный.СводкаПокрытия.

---

Nitpick comments:
In `@tests/MCPИнструменты.os`:
- Around line 20-97: Добавьте в область тестов новый сценарий для процедуры
ДеталькиФильтров, передав непустые значения в параметры 5–9: ТегиИсключаемые,
ТестовыеНаборыВключаемые, ТестовыеНаборыИсключаемые, ТестовыеМетодыВключаемые и
ТестовыеМетодыИсключаемые. Проверьте в результате Детальки соответствующие поля
с исходными значениями и порядком, чтобы выявить смещение позиционных
аргументов.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: abc62e78-8e59-4076-a080-1684862f77e4

📥 Commits

Reviewing files that changed from the base of the PR and between e82b861 and b2a535f.

📒 Files selected for processing (19)
  • .bsl-language-server.json
  • README.md
  • packagedef
  • src/cli/internal/Классы/ЗапускательТестирования.os
  • src/cli/internal/Классы/КонсольноеПриложениеТестированиеСлужебный.os
  • src/cli/main.os
  • src/cli/Классы/КомандаMCP.os
  • src/cli/Классы/КомандаОбнаружить.os
  • src/cli/Классы/КомандаТестировать.os
  • src/core/internal/Классы/РепортерJSON.os
  • src/core/internal/Классы/РогаткаТестирование.os
  • src/mcp/internal/Классы/MCPИнструментыСлужебный.os
  • src/mcp/main.os
  • src/mcp/Классы/ИнструментВыполнитьТесты.os
  • src/mcp/Классы/ИнструментОбнаружитьТесты.os
  • tests/MCPИнструменты.os
  • tests/support/Модули/ЖурналВыполнения.os
  • tests/support/Модули/ПрогоныТестов.os
  • tests/КонсольноеПриложение.os

Comment on lines +174 to +199
Команда = Новый Команда();

Команда.УстановитьКоманду("oscript");
Команда.УстановитьРабочийКаталог(ТекущийКаталог());

Если ФормироватьПокрытие Тогда
ПутьКСтатистике = МенеджерВременныхФайлов.НовоеИмяФайла("json");
Команда.ДобавитьПараметр("-codestat=" + ПутьКСтатистике);
КонецЕсли;

Если Параметры.ПортОтладки > 0 Тогда
Команда.ДобавитьПараметр("-debug=" + Параметры.ПортОтладки);
КонецЕсли;

Если СтрНайти(ИмяТочкиВхода, " ") > 0 Тогда
ИмяТочкиВхода = Команда.ОбернутьВКавычки(ИмяТочкиВхода);
КонецЕсли;

Команда.ДобавитьПараметр(ИмяТочкиВхода);

Если Параметры.ЛогВывода <> Неопределено Тогда
Команда.ДобавитьЛогВыводаКоманды(Параметры.ЛогВывода);
КонецЕсли;

КодВозврата = Команда.Исполнить();
Вывод = Команда.ПолучитьВывод();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Map the target file and nearby symbols
ast-grep outline "src/cli/internal/Классы/ЗапускательТестирования.os" --view expanded || true

# Read the relevant slice with line numbers
sed -n '150,220p' "src/cli/internal/Классы/ЗапускательТестирования.os" | cat -n

# Search for timeout-related logic in the file and for log-output methods used by this command wrapper
rg -n "Таймаут|Исполнить\(|ДобавитьЛогВыводаКоманды|ПоказыватьВыводНемедленно|ЛогВывода|Команд" "src/cli/internal/Классы/ЗапускательТестирования.os" || true

# Search the repo for references to the 1commands docs wording or immediate output handling
rg -n "ПоказыватьВыводНемедленно|ДобавитьЛогВыводаКоманды|Команда\.Исполнить|Командный файл|зависан" .

Repository: sfaqer/OneUnit

Length of output: 4090


Добавьте внешний тайм-аут для Команда.Исполнить() — здесь нет ограничения времени на сам вызов дочернего oscript, а при Параметры.ЛогВывода <> Неопределено вывод еще и транслируется через ДобавитьЛогВыводаКоманды(). Зависший процесс повесит весь MCP-сеанс.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/cli/internal/Классы/ЗапускательТестирования.os` around lines 174 - 199,
Добавьте внешний тайм-аут вокруг вызова Команда.Исполнить() в процедуре запуска
тестирования, чтобы зависший дочерний oscript не блокировал MCP-сеанс;
используйте существующий механизм тайм-аутов проекта, корректно прерывайте
процесс по истечении времени и сохраняйте текущую обработку вывода через
Команда.ПолучитьВывод().

Comment on lines +64 to +68
Если Дитя.ТипОпределения() = ТипыОпределенийТестов.Контейнер Тогда
ОбработатьНабор(Дитя, ИмяНабора, Проблемы, Пропущенные);
Иначе
ОбработатьТест(Дитя, ИмяНабора, Проблемы, Пропущенные);
КонецЕсли;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Передавайте корректное имя набора для вложенных контейнеров.

При рекурсивном обходе вложенных наборов тестов в метод ОбработатьНабор передается родительское ИмяНабора. Из-за этого для всех тестов, находящихся глубоко во вложенных наборах, в итоговом JSON-отчете будет ошибочно указано имя самого верхнего (корневого) набора.

Рекомендуется передавать полное имя текущего контейнера (Дитя.ПолноеИмя()), чтобы в отчете корректно сохранялась принадлежность тестов к их фактическим наборам.

🐛 Предлагаемое исправление
 			Если Дитя.ТипОпределения() = ТипыОпределенийТестов.Контейнер Тогда
-				ОбработатьНабор(Дитя, ИмяНабора, Проблемы, Пропущенные);
+				ОбработатьНабор(Дитя, Дитя.ПолноеИмя(), Проблемы, Пропущенные);
 			Иначе
 				ОбработатьТест(Дитя, ИмяНабора, Проблемы, Пропущенные);
 			КонецЕсли;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Если Дитя.ТипОпределения() = ТипыОпределенийТестов.Контейнер Тогда
ОбработатьНабор(Дитя, ИмяНабора, Проблемы, Пропущенные);
Иначе
ОбработатьТест(Дитя, ИмяНабора, Проблемы, Пропущенные);
КонецЕсли;
Если Дитя.ТипОпределения() = ТипыОпределенийТестов.Контейнер Тогда
ОбработатьНабор(Дитя, Дитя.ПолноеИмя(), Проблемы, Пропущенные);
Иначе
ОбработатьТест(Дитя, ИмяНабора, Проблемы, Пропущенные);
КонецЕсли;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/core/internal/Классы/РепортерJSON.os` around lines 64 - 68, В рекурсивной
ветке обработки контейнеров обновите вызов ОбработатьНабор, передавая полное имя
текущего контейнера через Дитя.ПолноеИмя() вместо родительского ИмяНабора; вызов
ОбработатьТест оставьте без изменений.

Comment thread src/mcp/Классы/ИнструментВыполнитьТесты.os Outdated
…ных файлов

- ПрочитатьОтчет и СводкаПокрытия возвращают Неопределено вместо исключения,
  если аварийно завершившийся прогон оставил недописанный отчет - инструмент
  откатывается к консольному выводу; ресурсы чтения закрываются при ошибке
- Временные файлы run_tests удаляются и при исключении прогона: MCP-сервер
  живет дольше одного вызова, мусор не должен копиться
- Тест на различение девяти позиционных параметров ДеталькиФильтров

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@sfaqer
sfaqer merged commit 4d9a4e4 into master Jul 14, 2026
7 checks passed
@sfaqer
sfaqer deleted the feature/mcp-server branch July 16, 2026 06:12
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