Repository navigation
MuMuManager CLI Menu v1.21.5
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]: пин тега перезаписывал$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)
- 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.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.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