AskaEth a6013c7d22 fix(ci/release): M50 —— Windows 槽位 dumpbin 定位链改三级(vswhere → find → PATH)
v0.1.0 首跑(run 41273841717)windows-x64 在「Windows 单文件自检」挂
`找不到 dumpbin,无法校验导入表(静态 CRT 门禁不降级)`。两个独立根因:

- `command -v dumpbin` 在 windows-latest 上不成立:VS 环境未预置进 PATH。
- 兜底 glob 深度错了一级:写的是 `<VS 根>/<年>/VC/Tools/...`,真实布局是
  `<VS 根>/<年>/<版次>/VC/Tools/...`(2022/Enterprise、2022/BuildTools),
  所以即便 PATH 失守、glob 也不可能命中。
- 且只扫了 64 位 `Program Files` 根,Build Tools 落在 `Program Files (x86)` 根。

改成三级定位链,全不命中才 fail(门禁语义一字未动:工具缺失仍 exit 1、
导入表出现 VCRUNTIME/MSVCP/MSVCR/ucrtbase 仍 exit 1,文案不变):

1. vswhere —— VS 官方定位器,安装器自身路径固定,与 VS 版本/版次/布局无关:
   `.../Installer/vswhere.exe -latest -products '*' -find <pattern>`。
   模式先试反斜杠(官方文档形式)、再试正斜杠,输出统一折成正斜杠后再执行。
2. find 兜底 —— 两个 VS 根(64 位 + x86)按路径模式扫,`-maxdepth 11`
   留一级余量,不再依赖固定层数的 glob。
3. PATH —— 最后才试,PATH 最不可控。

另加一行 `dumpbin: <路径>(定位自 <层级>)`,下次真机挂掉能直接看出命中哪一级。
同文件其余步骤不依赖 VS 环境(已逐条核对),无需收敛。

验证(本机无 VS):
- 抽出 run 块 `bash -n` 通过;13 条 stub 用例全绿:无工具→fail 文案不变且不写
  dependents.txt、vswhere 反斜杠/正斜杠两个模式、两处 VS 根 find 兜底、PATH 兜底、
  动态 CRT 仍 fail-closed、vswhere 优先于 PATH、vswhere 输出的反斜杠路径归一化后可执行。
- 未改写的原始 run 块在本机实跑:干净 exit 1 + 原文案,不误命中、不崩。
- yaml 解析 + 23 条结构断言全过(矩阵四槽位、触发条件、门禁 grep/文案/exit 原样);
  文件 276 行 ≤ 400。
- git-bash 行为实证:`.exe` 的 `-x` 为真、非可执行文件为假、`find` 接受含空格的
  `C:/Program Files` 根。
真机验证由 merge 后 retag 重跑流水线完成。
2026-11-01 12:58:40 +08:00
2026-10-31 21:54:10 +08:00
2026-10-31 21:54:10 +08:00
2026-10-31 21:54:10 +08:00
2026-10-31 21:54:10 +08:00
2026-10-31 21:54:10 +08:00
2026-10-31 21:54:10 +08:00

Unlucky Launcher (ULL)

English · 简体中文

Official project home: https://github.com/AskaEth/Unlucky-Launcher

Unlucky Launcher (ULL) is a free, open-source Minecraft: Java Edition launcher written in Rust (Apache-2.0, non-commercial), with a Slint + Metro UI. It embeds an AI agent client (chat / configuration / crash diagnosis) and integrates with the broader agent tooling ecosystem via MCP. Minimum baseline: Windows 10.

  • Runtime: a single native Rust binary — no JVM, no WebView, no external runtime
  • UI: Slint (Royalty-Free 2.0; GL preferred, CPU software-rendering fallback so older machines without a usable GPU still get the full UI)
  • License: Apache-2.0 © AskaEth (YeiJ)

Compliance statement

Authentication uses only official Microsoft/Mojang endpoints — Microsoft OAuth 2.0 device code flow, Xbox Live, XSTS, and api.minecraftservices.com — so players sign in with their own Microsoft account and launch the game they already own. Account tokens are stored only on the user's local machine and are never sent to any server operated by the project. ULL does not distribute, mirror, proxy or modify any Minecraft game files. Online play always requires a Microsoft account with valid entitlements. Local offline profiles never contact Microsoft or Mojang services and cannot join online-mode servers. Not affiliated with Mojang or Microsoft.

Status

The core engine is complete (workspace: 983+ tests passing):

  • Microsoft sign-in: OAuth 2.0 device code flow → Xbox Live → XSTS → Minecraft Services, with entitlement verification
  • Account credentials are stored only on the local machine — never uploaded, and inaccessible to the AI features
  • Mod loaders: Forge / NeoForge / Fabric / Quilt, verified on real machines
  • Java management: Temurin / Oracle / Microsoft / Zulu with a regional fallback chain
  • Multi-source download engine; YAML rule-based crash diagnosis
  • Usable as an MCP server for external agent tooling (ull agent serve)
  • Local offline profiles: for local / isolated-network testing only; they perform no Microsoft authentication and cannot join servers with online-mode enabled

CLI (ull) is fully usable: install / launch / accounts / java / diagnose / agent.

GUI in development: crates/app is currently a Slint + Metro skeleton; the theme system and the full interface ship with subsequent versions — use the CLI until then.

Module map

Unlucky-Launcher (cargo workspace)
├── crates/core     # domain library, zero UI dependencies, eight modules
├── crates/agent    # AI agent: ToolSpec registry + built-in client + MCP server (one shared core)
├── crates/app      # Slint UI: the only crate allowed to depend on a UI framework
├── crates/cli      # CLI (bin `ull`): headless, zero UI, depends on core + agent
└── packaging       # single-file artifact matrix and packaging assets (planned)

The eight modules of crates/core:

Module Responsibility
setting three data-directory modes, schema-based config, atomic writes, migrations
download multi-source health scoring, mirrors, chunked downloads, hash-while-downloading
game version / instance repository, snapshots and inheritance resolution
launch 10-stage launch pipeline, processes, JSONL event stream
auth Microsoft sign-in / local offline profiles
addon mod loader installation, modpacks, CurseForge / Modrinth
diagnose five signal collectors, YAML rule engine, hs_err parsing
platform OS abstraction: paths, processes, file locks, capability probing, runtime OS detection

Building

Prerequisites:

  • Rust stable (rust-toolchain.toml selects the toolchain automatically; components rustfmt / clippy)
  • Windows: MSVC toolchain (used by CI) or MinGW-w64 (x86_64-pc-windows-gnu)
  • Linux: libxkbcommon-dev libfontconfig1-dev libgl1-mesa-dev libegl1-mesa-dev libwayland-dev libxcb1-dev (Slint winit backend + femtovg build dependencies)
cargo fmt --all --check                               # formatting
cargo clippy --workspace --all-targets -- -D warnings # lints (zero-warning gate)
cargo test --workspace                                # tests
cargo build --release                                 # artifact: target/release/unlucky-launcher[.exe]

Software-rendering switch (machines without a usable GPU / with broken drivers): unlucky-launcher --software-renderer (equivalent to SLINT_BACKEND=winit-software).

Dependency license check (optional locally, required in CI): cargo deny check licenses bans sources.

CI gates

Workflow Content
.github/workflows/ci.yml fmt + clippy + test + build, Windows / Linux matrix
.github/workflows/guards.yml zero-UI guard for core, 400-line-per-file guard, cargo-deny license guard

Platform baseline

Minimum baseline: Windows 10. Windows 8.1 / 8 / 7 are not supported:

  • Windows 10/11 builds use the standard toolchain (MSVC / GNU) — no custom target specs, no -Zbuild-std, no import-table allowlists
  • Other platforms: macOS 12+ first class; Linux x64 with X11 preferred, Wayland as the long-term direction; Android Termux experimental, not committed
  • UI fallback: Slint software rendering (fully usable on machines without a GPU or with broken drivers)
  • Platform independence is expressed through separate test matrices, not separate artifact pipelines; capability differences use feature gates with runtime probing

License and acknowledgements

  • This project: Apache License 2.0, see LICENSE; third-party notices in NOTICE
  • The GUI uses Slint (Royalty-Free 2.0 track). Per the RF 2.0 obligations an AboutSlint widget will be placed on the about page (P2); until then NOTICE and this section serve the attribution duty.

Thanks to HMCL and PCL2 (both GPL-3.0) — these two launchers have accompanied the vast majority of Minecraft players for many years. ULL learned a great deal about design and implementation from them, and this project is dedicated to those two pioneers.

S
Description
A modern MC launcher.
Readme Apache-2.0
2 MiB
0 Stars 1 Watchers 0 Forks
Languages
Rust 93.4%
Slint 6.4%
Python 0.2%