Skip to content

MuMuManager CLI Menu v1.21.5

Choose a tag to compare

@genrihx2 genrihx2 released this 15 Sep 15:09
· 255 commits to main since this release

MuMuManager CLI Menu v1.21.5

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

Что нового

v1.21.5 (15.09.2026)

  • Статус-экран [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)

  • Fix «лечения» маркера .version при запуске: контент, полученный с CDN-границы GitHub, должен сам заявлять scriptVer тега, иначе лечение отменяется — устаревший блоб предыдущего релиза перестаёт поднимать маркер до тега, чей контент не пришёл (живой случай на v1.20.4: установка «залипла» на «Up to date» с контентом v1.20.3 и маркером v1.20.4; лечение [U]/[F] при расхождении контента остаётся прежним)

v1.20.4 (15.09.2026)

  • [F]: маркер .version сравнивается семантически — локальный маркер, равный или более новый, чем отстающий маркер тега (бот синхронизации версий приземляется после тега), больше не даёт ложный DRIFT (поймано живьём на v1.20.3)
  • [F]: один повторный запрос перед вердиктом DRIFT — CDN-граница GitHub может отдать устаревший блоб минуты после пуша тега (живой случай: bootstrap-update.ps1 был байт-идентичен тегу, а фетч вернул старое содержимое); настоящий дрейф по-прежнему остаётся дрейфом
  • [F] → проверка ZIP: отсутствующий файл — это не подмена — «No ZIP found … nothing to verify» вместо пугающего «FAILED - do not install»

v1.20.3 (15.09.2026)

  • Fix пост-проверки хешей bootstrap (v1.20.2): эталонное содержимое тега получалось через cmd /c-захват вывода curl, который декодирует в консольной OEM-кодировке — кириллица в README/SKILL.md искажалась, и каждый файл давал ложный HASH MISMATCH (поймано живым прогоном; защита сработала как задумано — обновление было остановлено). Эталоны теперь считаются через байт-точный raw-фетч (curl → temp-файл → UTF-8), как в меню; регресс-тест T9 проверяет не-ASCII тело

v1.20.2 (15.09.2026)

Warning

В bootstrap этого релиза есть баг пост-проверки хешей (OEM-кодировка искажает эталонные SHA-256) — каждый файл даёт ложный HASH MISMATCH. Fail-closed, вреда нет; исправлено в v1.20.3. Если вы на v1.20.2: bootstrap-update.ps1 -NoVerify один раз.

  • Пост-проверка хешей в bootstrap-update.ps1 (паритет с [U]): после загрузки каждый файл сверяется с ожидаемой SHA-256 из содержимого тега — OK (hash OK) / HASH MISMATCH; расхождение останавливает обновление (.version не двигается, самоприменение обновлятора отменяется, событие update-fail в журнале)
  • Тот же hashing-контракт, что и в меню (CR/BOM/симметричный TrimEnd) — вынесено в Get-ContentHash/Get-ExpectedHashes; JSON-ошибки API (rate limit) никогда не принимаются за эталон
  • Опция -NoVerify для отключения; при недоступности хешей обновление продолжается с пометкой unverified в журнале
  • Регресс-тест T9: векторы SHA-256, симметричный TrimEnd, пропуск rate-limit JSON, wiring -NoVerify

Сравнение

Предыдущая версия v1.21.4
Текущая версия v1.21.5
Коммитов 2

Коммиты

31e82e9 feat(status): [ST] read-only install status screen (issue #25) + README recovery guide (issue #26)
4fd2d65 chore: auto-sync .version v1.21.3 -> v1.21.4

Установка

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

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.5/MuMuManager-CLI-Menu-v1.21.5.zip.sha256 -o MuMuManager-CLI-Menu-v1.21.5.zip.sha256
Get-FileHash MuMuManager-CLI-Menu-v1.21.5.zip -Algorithm SHA256 | Select -Expand Hash
# Сравнить с содержимым MuMuManager-CLI-Menu-v1.21.5.zip.sha256

Метрики

Размер ZIP 109 KB
Файлов 5
SHA256 86e521fdaf5fe9a0...

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

VirusTotal verdicts

File SHA-256 Malicious Suspicious Harmless Report
MuMuManager-CLI-Menu-v1.21.5.zip 86e521fdaf5fe9a0a32987d255a3956ecef0d06155fa0a32ed98eeb496781ec5 0 0 0 report
mumu-menu.ps1 (from ZIP) 5e9d8cd794bf910347894bc47b0f390443963bb080da95b21bc6cbb553d39401 0 0 0 report
SKILL.md (from ZIP) 32896c51c24f7e559fc1204998fdb08c08501c3b2485aa915aada36f6e237d6a 0 0 0 report

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

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