Skip to content

fix(win): stop console windows from every subprocess call - #140

Open
ManSio wants to merge 12 commits into
mainfrom
fix/console-flash-guard
Open

ManSio wants to merge 12 commits into
mainfrom
fix/console-flash-guard

Conversation

@ManSio

@ManSio ManSio commented Nov 15, 2026

Copy link
Copy Markdown
Owner

Что и зачем

Windows мигает окнами консоли при работе сервера и тестов. Причина классовая: если у процесса-родителя нет консоли (MCP-сервер, pytest под хостом без окна, дочерний python), то любой subprocess.* без CREATE_NO_WINDOW создаёт свою консоль.

Динамическая защита (src/core/silent_subprocess.apply()) существовала, но патчила только тот процесс, который её импортировал, — а импортировал её ровно один entry-point (src/main.py).

Что сделано

Что Сколько
creationflags=getattr(subprocess, "CREATE_NO_WINDOW", 0) в bare-вызовах 135 вызовов в 57 файлах (src/, tests/, scripts/)
silent_subprocess теперь применяется в src/remote_main.py, src/cli.py (было: только src/main.py)
Новый guard tests/test_no_console_windows.py — AST-скан + позитив/негатив-контроль на синтетике

Смысл guard'а: динамический патч — это сеть на рантайм, а guard — статический контракт. Новый файл с subprocess.run([...]) без флага роняет тест со списком file:line, а не всплывает окном на Windows через месяц.

Что измерено (а не предположено)

Проверка Результат
WinEvent-хук EVENT_OBJECT_SHOW, 50 subprocess-тестов 0 показанных консольных окон
Перечисление видимых окон класса консоли во время прогона 0
Живые cmd.exe на машине 16, все — npx -y @mobilenext/mobile-mcp@latest (по одному на старт сессии OpenCode)

Вывод: сами тесты в этом окружении окон не показывают, но контракт был неполным — и на машине без консоли у родителя (MCP под хостом) любой новый bare-вызов снова дал бы вспышку. Отдельно, вне репозитория: mobile-mcp в конфиге OpenCode запускается через npx → cmd.exe на каждый старт.

Проверка

pytest tests/ -q -n auto          (линия из lock, mcp 1.30):  см. CI / итог
pytest tests/test_no_console_windows.py -q:  3 passed
ruff check src/ tests/:                      All checks passed
сканер: было 135 offenders -> 0
позитив-контроль: bare subprocess.run найден; негатив: с creationflags/startupinfo/**kwargs — нет

Осталось / риски

  • scripts/live_search_audit.py не парсится (битый отступ, было до этой задачи) — исключён из скана явным allowlist в guard'е, записан в KNOWN_ISSUES.md.
  • creationflags — Windows-only флаг; на POSIX getattr(..., 0) даёт 0, что subprocess принимает.
  • Само окно npx … mobile-mcp этим PR не лечится: это конфиг хоста, а не репозиторий.

@coderabbitai

coderabbitai Bot commented Nov 15, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: b5a2ee46-7ca9-4482-aa18-aa3fcafaac09

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

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