Repository navigation
MuMuManager CLI Menu v1.21.10
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)"): встроенный
--retrycurl никогда не повторял сбои 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.exeMuMu, с ретраем на холодный демон. Регрессионный тест с инъекцией заглушки 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]: пин тега перезаписывал$TagSHA-коммитом — семантическое сравнение.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.ps1Git 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