按 M218 SURVEY-p1 §4.1 的清单接上 LiteLoader 的安装路线,不动 OptiFine。 - core: 新增 addon::loader::liteloader(官方 versions.json 解析 + 合成清单)与 addon::loader::parent(父版本链读盘定位原版版本);LoaderKind 加 LiteLoader; LoaderRelease 加 parent_version_id、LoaderPlanInput::vanilla_installed → parent_installed; LoaderInstallPlan::build 改返回 Result(父版本缺失具名报错);LoaderSource::resolve_on 支持指定父版本(仅 LiteLoader,其它组合具名 unsupported)。 - 继承边界(本 mission 第一步核实):arguments.game 父在前子在后追加,minecraftArguments 子覆盖父,启动顺序 legacy(24) → arguments.game(25)。所以 tweakClass 只写 arguments.game, 绝不写 minecraftArguments(会顶掉 Forge 1.12.2 的 FMLTweaker)。 - maven/fabric 的 `_ =>` 通配改成穷尽分支:非 maven 族不再静默回落 Forge 的仓库; maven::{metadata_url,installer_url} 改返回 Option<String>。 - presenter: supported() 收 LiteLoader、wizard_choices 六选、dto::instances 按关注点拆成 instances/{loader,runtime,create,tests}.rs(原文件 395 行,动手前先拆)。 - cli: --loader 区分「认不出」(loader_unknown) 与「认得但装不了」(loader_unsupported); <version> 位写加载器版本 id 时按父版本处理(只有 liteloader 接受);help 只改 install 段。 - app-iced: 下载页加载器 chip 加 LiteLoader(1.5.2~1.12.2,两头按官方没有构建拒), chip 清单改为委派 Loader::ALL。 - 测试: 真实响应的裁剪夹具(dl.liteloader.com 与 repo.mumfrey.com 的 maven-metadata) 驱动「解析→计划→落盘→继承→启动参数顺序」全链;Forge 父链有回归(FMLTweaker 必须还在 且排在 LiteLoader 之前);父版本缺失/组合不支持/取消/坏表各自具名错误。
去重:`looks_like_cli(args) -> bool` 落在 `unlucky_cli::cli`,两个 GUI 的 main.rs 只调用它, 判据从两份变一份。cli crate 里**不**出现 GUI 的 flag 表——语义仍是「首个 token 是裸词就接管; 首个 token 是 flag 时只有解析出真命令才接管,解析失败不接管」。原来两个 main.rs 里的 5+5 条 单测合并成 cli crate 的一份(用例集按复审要求原样搬,含 --screenshot/--renderer/--diff/ --mock/--force-state/--scale-factor、--help/-h/--version/-V、10 个已知子命令、--json 前置、 未知子命令),两个 main.rs 的旧测试已删除。 banner:新增 cli::program 模块,从 argv[0] 的 basename 取程序名(剥目录、剥 .exe、空值回落 ull),把帮助/版本/错误提示里独立出现的 `ull` 换成它——`unlucky-launcher --version` 不再自称 `ull`,也不会把人指去敲 `ull --help`。`run()` 签名未改;`ull` 自己跑时输出逐字不变(替换是 恒等),打包脚本的 `ull --version` 冒烟不受影响。
Rust 原生单文件 Minecraft 启动器:CLI 完整可用(install/launch/accounts/java/diagnose/agent), MCP server 接入外部 Agent 工具,GUI 开发中。