- ✅ mdl import 端到端测试(使用真实 .mrpack,36 个 overrides)
- ✅ 基础命令测试(list, status, mod list, versions, search, delete)
- ✅ 新功能测试(list 排序/过滤,instance 命令,changelog 命令)
- ✅ JSON 格式输出测试(stderr 分离验证)
- ✅ 中文语言支持测试(PowerShell UTF-8 编码验证)
- ✅ 帮助文档查看
- ✅ Release 编译测试(成功,warnings 未统计)
- 🔄 启动体验优化(changelog 控制)- 进行中
- 实例数量: 44 个测试实例
- 编译状态: Release 模式成功
- 核心功能: 全部正常工作
- 重大发现: 原计划的 10 个问题中,7 个已经在代码中实现或不是真实 bug!
状态: 部分实现,正在优化
之前实现(Alpha 8.1):
- 每次启动都显示完整的 4 个版本更新日志(冗长)
- 有
mdl changelog命令但默认仍显示全部日志
当前改进(Alpha 9):
- ✅ 修改
print_recent_updates()仅在版本变化时显示更新日志 - ✅ 添加版本变化检测(通过 last_version.txt)
- ✅ 增强
mdl changelog命令支持自定义显示版本数 - ✅ 将
CHANGELOG和recent_versions设为 public 供命令使用 - 🔄 编译测试中
测试: 等待编译完成后测试
实现文件:
src/util/changelog.rs- 版本变化检测和 public 接口src/main.rs- changelog 命令实现和命令行参数
状态: 已实现并正常工作
实现:
- 日志正确输出到 stderr
- JSON 输出到 stdout 完全纯净
- 可以直接
mdl list --format json 2>$null | jq使用
测试: ✅ JSON 输出干净无日志混入
状态: 已实现并正常工作
功能:
--sort-by支持按 name/version/loader 排序--loader <type>过滤特定加载器--mc-version <ver>过滤特定 MC 版本
测试:
- ✅
mdl list --sort-by version - ✅
mdl list --loader fabric - ✅
mdl list --mc-version 1.20.1
状态: 已实现并正常工作
命令: mdl instance <name>
显示内容:
- 实例名称、路径
- MC 版本、加载器类型和版本
- 配置信息
测试: ✅ mdl instance test-import-real 正常显示
状态: 正常工作,之前误报
测试: ✅ 使用真实 mrpack 导入,正确显示 "Overrides: 36 file(s) copied"
状态: 已实现 --force 选项
功能: delete 命令默认需要确认,可用 --force 跳过
测试: ✅ 命令参数正确
状态: 已实现并正常工作
实现:
- search mod 支持
--instance <name>参数 - 提供
--instance时,搜索后显示:Install which number? (0 to skip) - 用户输入编号即可直接安装到指定实例
- 输入 0 或无效编号则跳过安装
测试: ✅ mdl search mod --help 显示参数正确
实现文件: src/main.rs:1618-1657
状态: 已实现(Alpha 9 新增)
实现:
- Launch 命令添加了
--skip-verify参数 - LaunchOptions 结构体添加了
skip_verify字段 - 启动时根据此参数跳过验证逻辑
测试: ✅ mdl launch --help 显示参数正确
实现文件: src/main.rs:877, src/instance/launcher.rs:297
状态: 程序正常,环境限制已确认
根因分析(深度调查):
- ✅ 程序输出正确的 UTF-8 字节(验证:原始字节流包含正确的
E2-80-94em dash) - ✅ CHANGELOG.md 文件本身是正确的 UTF-8 编码
- ✅ Rust
include_str!在编译时正确读取 UTF-8 - ❌ PowerShell 默认使用 GBK (CP936) 解释程序输出,导致显示乱码
- ✅ cmd.exe 使用
chcp 65001后能正确显示所有中文字符
解决方案(推荐):
- cmd.exe 用户: 在启动 cmd 时执行
chcp 65001 - PowerShell 用户: 在 PowerShell profile 中添加:
$OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 [Console]::InputEncoding = [System.Text.Encoding]::UTF8
- Windows Terminal 用户: 默认支持 UTF-8,无需额外设置
程序侧已实现:
- ✅
enable_utf8_console()调用SetConsoleCP(CP_UTF8)和SetConsoleOutputCP(CP_UTF8) - ✅ 所有字符串正确使用 UTF-8 编码
- ✅ 国际化字符串通过
i18n::t()函数加载
测试结果:
- ✅ cmd.exe + chcp 65001:完美显示中文和特殊字符(—)
- 🟡 PowerShell:需要用户设置环境变量
- ✅ 程序输出字节流:100% 正确的 UTF-8
优先级: P2(仅需文档说明,非程序 bug)
状态: 已验证 - 需要文档更新
需求: 用户要求显示下载进度、启动进度和预计耗时
现状: 只有日志信息,无实时进度反馈
解决方案:
- 添加依赖:
indicatif = "0.17" - 大文件下载显示进度条:
[===>] 45.2 MB / 128 MB (35%) - 2.3 MB/s - ETA 35s - 小文件 (<1MB) 不显示进度条(避免闪烁)
- 启动阶段指示器:
[1/6] Verifying game files... [2/6] Downloading libraries... (15/87) [3/6] Extracting natives... [4/6] Downloading assets... (1234/5678) [5/6] Building classpath... [6/6] Starting game process... - 基于文件大小估算 ETA
实现文件: src/version/downloader.rs, src/instance/launcher.rs, Cargo.toml
优先级: P1
状态: 待实现 - Alpha 9
现状: 只有少数几处使用了 i18n(3 处 t() 调用),大部分错误消息仍为英文(117 处)
建议:
- 完整国际化是大工程,可推迟到后续版本
- 当前重点确保已实现的中文部分正确显示
- 优先国际化用户常见的命令输出
优先级: P2
状态: 待规划 - 未来版本
需求: mdl versions 应显示该版本支持的加载器列表
解决方案:
- 查询 Fabric/Forge/NeoForge API
- 显示可用的加载器版本列表
优先级: P2
状态: 待实现 - 未来版本
现状: 66 个警告(已优化)
主要类型:
- 未使用的函数、结构体、字段(大部分,主要是未来功能代码)
- 已废弃的类型(
image::io::Limits- 2 个) - 其他琐碎问题(3 个)
已完成优化:
- ✅ 统计 warnings 数量和类型:原 79 个
- ✅ 手动清理导入和重复代码:减少到 69 个
- ✅ 运行
cargo fix自动修复:减少到 66 个 - ✅ 修复 FFI 签名冲突:添加
#[allow(clashing_extern_declarations)] - ✅ 修复命名规范:添加
#[allow(non_snake_case)]到 API 响应结构体
剩余警告分析:
- 60+ 个未使用代码警告(dead_code)主要来自未来功能:
- Aprism 集成代码(GitHub releases, javaagent)
- Agent 模式代码(LogParser, CommandExecutor, AgentEvent)
- 服务端管理代码(backup_config, restore_config)
- NeoForge 支持代码(部分已实现但未完全使用)
- 下载进度功能(DownloadProgress 结构体,部分功能未使用)
- 2 个已废弃 API:
image::io::Limits→image::Limits - 3 个其他问题(unused variable, unused Result, unnecessary clone)
不建议进一步清理的理由:
- 未使用代码大多是规划中的未来功能,不应删除
- 添加
#[allow(dead_code)]到每个项会让代码更冗长 - 当前 66 个警告中有价值的警告只有约 5 个
优先级: P2(当前状态可接受)
状态: 已优化 - Alpha 9(79 → 66 warnings)
mdl export <instance> <output.mrpack>- 与 import 形成完整往返流程
- 生成
modrinth.index.json,包含所有 Modrinth 模组
mdl clone <source> <new-name>- 可选
--no-worlds跳过世界数据 - 自动更新配置中的实例名称
mdl mod update <mod> --all-instances- 支持通配符和过滤器
- 规模化管理 44+ 实例
已完成(Alpha 8.1 已实现):
- ✅ 启动更新摘要控制(changelog 命令)
- ✅ JSON 输出纯净(stderr 分离)
- ✅ list 排序和过滤
- ✅ instance 详情命令
- ✅ import overrides 统计正常
- ✅ delete 确认机制(--force)
仍需改进:
- ✅ 中文 UTF-8 显示验证完成(确认为环境问题,非程序 bug)
- Task 1: 下载与启动进度显示(indicatif)🔄 - 需要集成
- ✅ indicatif 依赖已添加到 Cargo.toml
- ✅ util/progress.rs 进度条工具已实现
- ✅ download_file_with_progress 接口已存在
- 🔄 实测发现:23MB 文件下载 26 秒无任何反馈
- ⏳ 需要在实际下载流程中集成进度显示
- Task 2: 文件完整性验证可选控制(--skip-verify)⏳ - 未实现
- ⏳ 需要添加 --skip-verify 参数到 launch 命令
- ⏳ 需要在验证流程中实现跳过逻辑
- Task 3: 交互式模组搜索安装 ✅(Alpha 8.1 已实现)
- Task 4: 编译警告清理和统计 ✅ - 从 79 降到 66 个
- Task 5: 启动更新摘要优化 ✅ - 版本变化检测完成
- ✅ 添加版本变化检测逻辑(基于 last_version 文件)
- ✅ 增强 mdl changelog 命令支持自定义版本数
- ✅ 将相关函数设为 public
- ✅ 编译测试通过
- ✅ 功能测试通过(首次显示 changelog,后续不显示)
- Task 6: 中文 UTF-8 显示验证 ✅
- ✅ 验证程序输出正确的 UTF-8 字节流
- ✅ 验证 cmd.exe + chcp 65001 完美显示
- ✅ 确认 PowerShell 乱码为环境问题,非程序 bug
- ✅ 文档已更新,说明解决方案
- 端到端测试所有功能
- 性能测试(启动时间、大文件下载)
- 更新 README.md(PowerShell UTF-8 设置说明)
- 更新 CHANGELOG.md
- 准备 Alpha 9 发布
- ✅ 下载与启动进度显示实现
- ✅ --skip-verify 参数实现
- ✅ 回归测试全部通过
- ✅ 中英文模式文档完整
- ✅ 编译警告统计和分析完成
- ✅ 交互式搜索安装实现
- ✅ 性能测试通过(启动时间对比)
- ✅ 编译警告减少到 <10
[dependencies]
indicatif = "0.17" # 进度条显示src/instance/launcher.rs- --skip-verify 参数、进度显示src/version/downloader.rs- 进度回调、ETA 计算src/loader/content.rs- 交互式搜索安装src/main.rs- 新参数、命令处理README.md- PowerShell UTF-8 设置说明
- 已实现src/util/changelog.rs- list/instance/delete 已完善src/instance/manager.rs- overrides 正常工作src/loader/modpack.rs
- 当前(有验证): 5-10 秒
- Alpha 9 (--skip-verify): 2-5 秒(减少 50-70%)
mdl list(44 实例): <200ms ✅mdl instance <name>: <100ms ✅
- 目标:<5% 额外时间
- 小文件不显示进度条避免闪烁
- ✅ 启动噪音减少(changelog 已可控)
- ✅ JSON 输出纯净可用
- 🎯 长时间操作有明确进度反馈(新功能)
- 🎯 可选跳过验证加快启动(新功能)
- ✅ list 命令响应 <200ms
- 🎯 --skip-verify 启动时间减少 50-70%
- 🎯 进度显示开销 <5%
- 🎯 编译警告统计完成并减少
- ✅ 核心功能全部正常工作
- ✅ JSON 输出纯净可直接处理
- 操作系统: Windows 11
- 终端: PowerShell 7.x
- 实例数量: 44 个测试实例
- 测试日期: 2026-08-10
- 测试版本: v26.0.0-alpha.8.1
- 手动端到端测试 + 命令输出检查
- 使用真实 .mrpack 文件进行 import 测试(36 个 overrides)
- JSON 输出验证(stderr 分离测试)
- 中文支持测试(PowerShell UTF-8 编码)
# ✅ 成功的测试
mdl list # 44 instances
mdl list --sort-by version # 排序正常
mdl list --loader fabric # 过滤正常
mdl list --mc-version 1.20.1 # 版本过滤正常
mdl list --format json 2>$null | jq # JSON 纯净
mdl versions # 版本列表正常
mdl status test # 状态检查
mdl instance test-import-real # 实例详情正常
mdl search mod sodium # 搜索正常
mdl changelog # 更新日志正常
mdl import test "真实.mrpack" # 导入成功,overrides 36 文件
# 🟡 需要环境设置的测试
mdl --lang zh changelog # 需要 PowerShell UTF-8 设置
$OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
mdl --lang zh changelog # ✅ 中文正常显示
# 🔄 待测试功能(Alpha 9)
mdl launch test --skip-verify # ✅ 参数已实现,等待端到端测试
mdl search mod sodium --instance test # ✅ 已实现,等待端到端测试- 实际游戏启动和运行
- Agent 模式和 Despotes 集成
- 游戏内控制命令(key, click, look, chat)
- 截图功能
- Aprism JE Native loader
- 服务端实际运行
- 下载进度显示仅支持单个文件,批量下载暂不支持进度聚合
- 启动进度的 ETA 预估为简单算法,不考虑历史数据
- 中文乱码修复依赖 PowerShell 环境变量,需要文档说明
mdl instance的磁盘占用统计(如有)可能较慢
- PowerShell 中文显示: 需要设置 UTF-8 编码
$OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 [Console]::InputEncoding = [System.Text.Encoding]::UTF8
- JSON 输出: 需要重定向 stderr 以获得纯净输出
mdl list --format json 2>$null | jq
- 已废弃(测试发现大量功能已实现)ALPHA9_PLANNING.md- 已废弃ALPHA9_TASKS.md- 已废弃ALPHA9_SUMMARY.md
重大发现: 原计划的 10 个问题中,8 个已经在 Alpha 8.1 中实现:
- ✅ 启动更新摘要控制 -
mdl changelog命令已存在 - ✅ JSON 输出纯净 - 日志已正确输出到 stderr
- ✅ list 排序和过滤 -
--sort-by,--loader,--mc-version都支持 - ✅ instance 详情命令 -
mdl instance命令已存在 - ✅ import overrides 统计 - 实测正常工作(36 文件)
- ✅ delete 确认提示 - 已有
--force选项 - 🟡 中文显示 - 程序正常,需要 PowerShell UTF-8 设置
- ✅ 交互式模组搜索安装 -
--instance参数已存在 - ✅ 文件完整性验证可选 -
--skip-verify已实现(Alpha 9 新增)
Alpha 9 实际需要实现:
- 下载与启动进度显示(indicatif)
- 编译警告分析和清理
最后更新: 2026-08-10
测试版本: Alpha 8.1 (v26.0.0-alpha.8.1)
下一版本: Alpha 9 (v26.0.0-alpha.9)
预计发布: 2026-08 月底
实施者: ox-alpha(OpenCode CLI Agent,NDBlockConnect 组织)
OpenLumin 项目(工作区位于 ...\Domain-Projects\Minecraft\OpenLumin\)的 NeoGradle 构建连续 3 次在 neoFormTransformSource 任务处无报错静默死亡。排查确认:mdl.log 中存在 178 条 "terminating stale process" 击杀记录,时间与构建死亡精确吻合。
根因:stale 进程启发式对命令行含 "minecraft/net.minecraft/mcp/mdriven" 的 java 进程执行击杀——而 NeoGradle 派生的构建工具进程(JST 源码变换器、Gradle worker、反编译器 fork)的 classpath/参数包含项目路径 ...\Minecraft...\,被误判为 stale 游戏进程。
- 内置开发工具链排除清单 \BUILTIN_EXCLUDE_SUBSTRINGS\:gradle / org.gradle.launcher / jst-cli / javac / forgeflower / vineflower / cfr / fernflower / net.neoforged / net.minecraftforge——命中即跳过击杀(debug 日志留痕)。
- 用户自定义排除文件 <data_dir>/oom_excludes.txt\(Windows 即 %APPDATA%\mdl\oom_excludes.txt):每行一个大小写不敏感子串,支持 # 注释,与内置清单合并生效;文件缺失为空表。
- 排除判定仅作用于 Phase 1 stale 击杀;Phase 2 工作集修剪不受影响(修剪无害)。
- 单元测试 +5(工具链命中、真实游戏不误伤、用户清单合并与大小写契约、加载容错),game::oom_guard 组 11/11 通过。
- 顺带修复两处既有编译损坏(非本功能引入):agent/server.rs 两处 tokio entry.metadata() 缺 .await;util/validate.rs 测试数组 &str/String 混型。
- cargo check ✅ cargo test oom_guard ✅ (11/11) cargo build --release ✅(12MB)
- 效果预期:mdl 任意命令的 OOM 扫描不再误杀 Gradle/NeoForm 工具链,长构建可与游戏实例并行。
- 默认零配置生效(内置清单)。
- 追加自定义排除:编辑 %APPDATA%\mdl\oom_excludes.txt,例如添加 \mycustomtool\。
- 注意:内置 "gradle" 排除意味着通过 \gradlew runClient\ 启动的残留 MC 实例也不会被 stale 清理——需手动处理或加入用户清单反向管理。
实施者: Starsails(主会话 Agent)
用 Get-Content -Raw + -replace + Set-Content -Encoding UTF8 对
main.rs / server.rs 做"插入一行字段"的机械修改。PS 5.1 的
Get-Content 在无 BOM 文件上按系统 ANSI(GBK)解码,Set-Content 再
以 UTF-8 写回——全部中文字符串与注释被双重编码损坏(如
杩戞洿鏂帮細),cargo 报 unknown token。
git checkout -- <两个文件> 恢复到 HEAD(alpha.2 提交),全部改动
改用 Edit 工具重做。alpha.3 的其余文件改动均为 Edit 工具所写,未受
影响。
本仓库源码文件一律使用 Edit/Write 工具修改,禁止 PowerShell Set-Content/Add-Content -Raw 管道做内容替换;Add-Content 追加 纯 ASCII 段落可接受(不触碰既有字节)。