Skip to content

MuMuManager CLI Menu v1.21.10

Choose a tag to compare

@genrihx2 genrihx2 released this 16 Sep 04:11
· 238 commits to main since this release

MuMuManager CLI Menu v1.21.10

Интерактивное PowerShell-меню для управления MuMu Emulator через MuMuManager.exe.

Что нового

v1.21.10 (16.09.2026)

  • Авто-диагностика на старте (issue #30): меню один раз за запуск тихо собирает находки [DIAG] и показывает ОДНУ строку под статус-баром — только если есть ошибки или предупреждения: [auto-diag] Problems found: N error(s), M warning(s) - details: [DIAG]. Info-находки («no .version marker yet», неактивные инстансы) не напоминанают — они остаются в [DIAG]. Здоровая установка не рендерит ничего. MUMU_MENU_NO_AUTODIAG=1 отключает проверку; сборщик обёрнут в try/catch — диагностика никогда не блокирует старт, вердикт собирается один раз и кэшируется для всех перерисовок меню. 8 новых Pester-тестов: фильтр severity, подавление info, поведение кэша, проводка на реальном фикстуре, env-отключение

v1.21.9 (16.09.2026)

  • Устойчивость к нестабильной сети (исправление "Update check failed: Request failed (exit 35)"): встроенный --retry curl никогда не повторял сбои TLS-handshake (exit 35) - один сбой сети убивал всю проверку обновлений. Все запросы к GitHub теперь идут с --retry-all-errors (проба один раз за запуск: опция есть только с curl 7.71, старые сборки откатываются на обычный --retry, а не падают на неизвестной опции), ETag-загрузка меню получает PS-уровень ретрая для любой транспортной ошибки, [V] делает 2 попытки, bootstrap печатает код curl при каждом ретрае. Pester-тесты фиксируют классификацию кодов выхода заглушками (35 = поддерживается, 2 = нет, 0 = да, нет curl = деградация)
  • Устойчивость диагностических проб к ErrorActionPreference = Stop: запись в stderr от реального adb ("daemon not running") или curl вызывала терминирующую ошибку внутри Invoke-MumuManagerProbe/_Fetch под Pester и строгими хостами; теперь перехватывается и трактуется как пустая попытка (поймано живым прогоном тестов)

v1.21.8 (15.09.2026)

  • [RB] Откат из backup (issue #27): список папок backup\ГГГГММДД_ЧЧММСС (новые сверху, размер + дата + полнота), выбор, подтверждение словом ROLLBACK, восстановление 4 файлов. Маркер .version выводится из собственного $scriptVer восстановленного контента — никогда не угадывается (в бэкапах маркера нет; принцип guard v1.20.5). В журнал пишется rollback (from = маркер до, to = восстановленный) или rollback-fail; после предлагается [F]. Чистые хелперы (Get-BackupFolders, Build-RollbackPlan, Invoke-Rollback) покрыты 5 Pester-тестами, включая проверки журнала
  • bootstrap-update.ps1 -Diagnose (issue #29): вход в диагностику без меню — для установок, где mumu-menu.ps1 не стартует. Печатает отчёт находок в стиле [DIAG] (маркер против scriptVer, распарсенного из сырого — возможно битого — текста меню, состояния лока, здоровье журнала, путь MuMu, диск) без сети и без мутаций; exit 0 если чисто, exit 1 при error/warn (скриптабельно для поддержки). T11 в bootstrap-наборе проверяет парсинг из битого файла и проводку
  • Исправлен ложный позитив проверки готовности ADB-моста (пойман на реальной машине): некоторые сборки MuMu вообще не отдают adb_version в info -v all, из-за чего v1.21.7 вечно предупреждала «ADB bridge not ready». Проба теперь спрашивает сам ADB — adb devices против adb_port инстанса (только локальный сокет), бинарник ищется в shell\adb.exe MuMu, с ретраем на холодный демон. Регрессионный тест с инъекцией заглушки adb

v1.21.7 (15.09.2026)

  • Диагностика эмулятора в [DIAG] (issue #32) — один запрос MuMuManager info -v all добавляет к экрану проблем сторону эмулятора: число инстансов, запущены ли, готовность ADB-моста. Нет инстансов / ничего не запущено — info (подсказка создать/запустить), запущенный инстанс без готового ADB-моста — предупреждение (то самое состояние, из-за которого команды внутри эмулятора вроде curl падали с «inaccessible or not found»), а MuMuManager, не ответивший чисто, — предупреждение без поломки диагностики. Живой поимок исправлен до релиза: реальный бинарник выдаёт pretty-printed многострочный JSON, который pwsh 7 в пайплайне парсит построчно — проба теперь склеивает строки перед парсингом (регрессионный тест). 9 новых Pester-тестов с честным дочерним процессом (.cmd-заглушка); набор 81 зелёный на PS 5.1 и pwsh 7

v1.21.6 (15.09.2026)

  • Релиз с фиксом ложного DRIFT глубокой проверки [ST] (07f30fa): Get-IntegrityVerdict читает вердикт из summary|-строки отчёта — метаданные больше не маскируются под дрейф. Набор 73 зелёный

v1.21.5 (15.09.2026)

  • Fix ложного DRIFT в глубокой проверке [ST] (поймано живьём через минуты после релиза): обёртка drift-чека считала информационные строки отчёта (verify-start|, ref-pin|, даже summary|ok|) дрейфом, потому что они не начинаются с OK, — полностью здоровая установка сама себе докладывала DRIFT. Теперь выделенный Get-IntegrityVerdict классифицирует отчёт по его собственному вердикту (summary|ok| / summary|drift|<файлы> / summary|partial| / error|) — метаданные больше не маскируются под дрейф; проверка, упёршаяся в rate limit, по-прежнему честно деградирует в «unknown». 4 Pester-теста, включая точный регрессионный отчёт из живого поимка; набор 73 зелёный
  • Статус-экран [ST] (issue #25) — один экран «только чтение»: версия скрипта, локальный маркер, последний релиз, состояние версии, drift-чек, последняя верификация ZIP (из журнала) и сводка журнала. Быстрый путь (Enter) полностью офлайн с честными состояниями «неизвестно/не проверялось»; d в меню добавляет сравнение с релизом и полный drift-чек против тега. Статус собирает тестируемый Get-InstallStatus с инъекцией сетевых/drift-источников (6 Pester-тестов: быстрый путь, сравнение ok/behind/ahead, drift OK/DRIFT/сбой, отсутствие журнала, FAILED zip-вердикт, проводка меню); набор 69 зелёный. Клавиша [S] осталась за скриншотами — статус это [ST]
  • README-раздел восстановления (issue #26) — «Восстановление после сбоя обновления»: четыре сценария (HASH MISMATCH, клин маркера, битые файлы/бэкап, отказ блокировки) с таблицей «симптом → причина → действие» по всем вердиктам обновлятора и английской сводкой. Принцип — сначала диагностика ([ST]/[DIAG]/[F]/[J]), потом действие
  • Это закрывает milestone v1.21.0 "Drift Hardening & Journal Tooling" (#22 пин/ETag, #23 экспорт журнала, #24 сингл-флайт блокировка, #25 статус-экран, #26 recovery-документация)

v1.21.4 (15.09.2026)

  • Диагностика проблем [DIAG] — новый экран «только чтение, только локально»: одним взглядом отвечает, есть ли проблемы с установкой. Проверки: раскладка установки, маркер .version против собственного $scriptVer скрипта (маркер ВПЕРЕДИ контента — ошибка-клин, класс бага лечения v1.20.5, из-за которого обновлятор вечно говорит «Up to date»; контент впереди маркера — предупреждение о прерванном обновлении); ожидающие .new/остатки .old; блокировка обновлений (свежая — предупреждение с PID держателя, stale — info об автоломании, остаток claim — info); здоровье журнала (битые строки, fail-события, счётчик update-skipped, размер ротации); окружение MuMu (нет MuMuManager.exe — ошибка, версия ниже минимума — предупреждение) и мало места на диске
  • Находки собирает чистая функция Get-ProblemFindings с путями в параметрах — 9 новых Pester-тестов на фикстурных установках (здоровая/ноль, клин, прерывание, отсутствующие файлы, состояния блокировки, здоровье журнала, MuMu, ожидающие файлы, проводка меню); набор 63 зелёный на PowerShell 5.1 и pwsh 7. Экран ничего не мутирует и не ходит в сеть (онлайн-сравнение остаётся в [F])

v1.21.3 (15.09.2026)

  • Экспорт журнала [J] (issue #23) — новый пункт [J] -> 5 Export записывает выбранные события в Markdown (таблица для issue, экранирование |), RFC-4180 CSV (заголовок + кавычки для ячеек с запятой/кавычкой/переводом строки) или JSON (объект верхнего уровня generator/count/events, поля без изменений). Формат → диапазон (последние 20 / весь / только ошибки, как в просмотре) → путь (Enter = update-journal-YYYYMMDD-HHMMSS.<ext> рядом с журналом). Вывод — UTF-8 с BOM (правило #535), сам журнал не изменяется, повторные экспорты байт-в-байт идентичны
  • JSON — объект верхнего уровня, а не голый массив: массивы верхнего уровня по-разному парсятся в некоторых потребителях PowerShell 5.1 (проверено живьём — python видел 3 элемента, а pipeline-форма 5.1 оборачивала массив); свойство объекта парсится единообразно в PS 5.1/7, jq и Python. JSON — компактная одна строка; MD/CSV — человеко-форматы
  • Тесты: 6 golden-тестов (заголовок/экранирование MD, кавычки CSV, round-trip JSON, BOM + идемпотентность + неприкосновенность журнала, диапазон «только ошибки», ошибка неизвестного формата); набор 54 зелёный на PowerShell 5.1 и pwsh 7

v1.21.2 (15.09.2026)

  • Сингл-флайт блокировка обновлений (issue #24) — [U] и bootstrap-update.ps1 перед изменением файлов установки захватывают .update-lock (PID + timestamp) атомарным CreateNew: два параллельных обновлятора (меню в двух окнах, меню + bootstrap) больше не могут повредить .version/скрипты/журнал или применить обновление дважды. Отказ печатает PID держателя и возраст блокировки, пишет в журнал update-skipped и выходит, ничего не меняя. Блокировка старше 10 минут считается остатком упавшего процесса и безопасно ломается (create-then-break через .update-lock.new закрывает гонку break/recreate). Снимается в finally, включая Ctrl+C
  • [J]: update-skipped подсвечивается жёлтым (пропуск — не ошибка), сообщение «ошибок нет» считает пропуски успешными событиями
  • Тесты: 6 новых Pester-тестов + блок T10 в bootstrap-регрессионном наборе (включая межскриптовые проверки проводки); набор 48 зелёный; проверено живьём (отказ в одном процессе, кросс-процессный отказ через дочерний PowerShell, stale-break, повторный захват после снятия)

v1.21.1 (15.09.2026)

  • Fix регрессии v1.21.0 в [F]: пин тега перезаписывал $Tag SHA-коммитом — семантическое сравнение .version отключалось, и здоровый маркер давал ложный DRIFT на каждой проверке (поймано живьём на установке сразу после релиза v1.21.0). Теперь $Tag остаётся читаемым тегом для семантического сравнения, а фетчи контента идут через отдельный закреплённый $FetchRef; добавлен Pester-страж, проверяющий это разделение

v1.21.0 (15.09.2026)

  • [U]/[F]/лечение: закрепление тега за коммитом (issue #22) — все фетчи содержимого ?ref=<тег> переписываются на ?ref=<sha-коммита>: contents API резолвит ссылку в момент запроса, поэтому CDN-граница может отдать блоб предыдущего коммита минуты после пуша тега (класс багов v1.20.3–v1.20.6); SHA-коммит неизменяем — устаревшее чтение невозможно по построению. Если резолв не удался — проверка идёт по обычному URL тега
  • ETag-кеш с replay 304 в Invoke-GitHubGet — повторные фетчи того же URL в одной сессии меню отправляют If-None-Match и на 304 Not Modified возвращают кешированное тело без передачи; кешируются только реальные тела (не ошибки API)
  • bootstrap-update.ps1: тот же пин тега → SHA — в получении эталонных хешей и в цикле загрузки; резерв — верификация SHA-256 каждого скачанного файла
  • Исправлено мёртвое лечение [U]: блок version-fix ссылался на не присвоенные $localText/$remoteText — лечение не могло сработать; теперь локальный текст читается, а фетч закрепляется за коммитом тега
  • Откат идеи «дешёвых хешей»: media type application/vnd.github.sha не поддерживается contents API (проверено живьём) — эталонные хеши по-прежнему считаются из тела; повторные фетчи дешевле за счёт ETag-кеша

v1.20.6 (15.09.2026)

  • Полировка журнала [J]: пустое поле from рендерится как (new) -> vX.Y.Z (событие на свежей установке без маркера), а события одного запуска (одинаковые timestamp+actor, например update-ok + updater-refresh) группируются — продолжение печатается с ASCII-меткой - вместо повторной строки timestamp/actor; глифы боксов не используются (не входят в OEM-кодировки консоли)

v1.20.5 (15.09.2026)

Сравнение

Предыдущая версия v1.21.9
Текущая версия v1.21.10
Коммитов 1

Коммиты

a9de22d feat: startup auto-diag line - one verdict line when errors/warnings exist (issue #30)

Установка

Быстрый запуск (одна команда):

irm https://raw.githubusercontent.com/genrihx2/MuMuManager-CLI-Menu/main/mumu-menu.ps1 -OutFile $env:TEMP\mumu-menu.ps1; & $env:TEMP\mumu-menu.ps1

Git clone (с автообновлением через [U]):

git clone https://github.com/genrihx2/MuMuManager-CLI-Menu.git
cd MuMuManager-CLI-Menu
.\mumu-menu.ps1

Верификация

curl -sL https://github.com/genrihx2/MuMuManager-CLI-Menu/releases/download/v1.21.10/MuMuManager-CLI-Menu-v1.21.10.zip.sha256 -o MuMuManager-CLI-Menu-v1.21.10.zip.sha256
Get-FileHash MuMuManager-CLI-Menu-v1.21.10.zip -Algorithm SHA256 | Select -Expand Hash
# Сравнить с содержимым MuMuManager-CLI-Menu-v1.21.10.zip.sha256

Метрики

Размер ZIP 119 KB
Файлов 5
SHA256 ce2f4a61b66d9b8e...

Требования: Windows 10/11 · PowerShell 5.1+ · MuMu Emulator 6.x

VirusTotal verdicts

File SHA-256 Malicious Suspicious Harmless Report
MuMuManager-CLI-Menu-v1.21.10.zip ce2f4a61b66d9b8e5f256acb06574832e9414fd821a33119d794dd2ad6df5b29 0 0 0 report
mumu-menu.ps1 (from ZIP) efee0f0e699ca37661921adecfd1badf7f6f096ce1ed6f2bd4f5ca6f9c887a29 0 0 0 report
SKILL.md (from ZIP) 10be2c19e2f43579c528642befd3144a2033a3addc121771ff06b86ccbd0e8b1 0 0 0 report

Status: CLEAN - 0 malicious / 0 suspicious (CI scan 2026-09-16, scan run)

Verify the download yourself
sha256sum -c MuMuManager-CLI-Menu-v1.21.10.zip.sha256