feat: M1.1 完成 + M1.2 启动 — 全量更新

M1.1 收尾:
- 24项 P0/P1/P2 bug 修复 (Rust 107 tests + Flutter 15 tests)
- Flutter App v0.3: cupertino_icons 修复, 单元测试, 调试面板, APK 52.6MB
- 示例插件完善: manifest.json + 请求/响应示范 + 7个测试
- API 文档重写 (以 routes.rs 为唯一权威)
- MILESTONES.md 更新至 100%

M1.2 启动:
- P0: 插件管理 API 闭环 (handle_manager_message Custom 分支 + broadcast_plugin_states)
- ServiceManager 集成测试 8/8 (tests/m1_2_service_manager.rs)
- M1.2 测试计划 (docs/M1.2_TEST_PLAN.md, 18个E2E场景)
- 动态插件系统: auto_rollback + version_manager GC + 路径穿越防护

总计: Rust 115/115 测试, Flutter 15/15 测试, 零 warning

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
showen
2026-03-14 18:12:42 +08:00
parent 8ed9cb2d9d
commit d30c111c71
68 changed files with 8115 additions and 1201 deletions

View File

@@ -79,3 +79,49 @@
- cargo check --workspace --all-targets 通过
- cargo test --workspace 全部通过77 个测试)
- 防息屏和光标隐藏功能现已在运行时生效
## 个人经验 (2026-03-14 - P0 双 bug 修复)
- 修复 ServiceManager 自测失败路径遗漏的 AutoRollback 调用
- 将回退逻辑抽成 `rollback_dynamic_plugin()`,复用到错误阈值和 self-test 必须能力失败两条路径
- self-test 的 AutoRollback 现在会先调用 `VersionManager::rollback()`,再尝试热加载稳定版本
- 若稳定版本无法立刻加载,仍会正确更新 registry 并打上 `needs_rollback` 标记供下次启动处理
- 修复 `AppConfig.source_path/source_dir` 的 serde 丢失问题
- `#[serde(skip)]` 改为 `#[serde(default)]`,兼容旧配置缺省字段,同时允许 `ConfigReloaded(AppConfig)` 通过 JSON 传递路径信息
- `deny_unknown_fields` 不受影响,因为这两个字段现在是显式已知字段
- 增加回归测试
- 覆盖 self-test + AutoRollback 真实触发回退
- 覆盖 `ConfigReloaded` JSON 往返后 `source_path/source_dir` 保持不变
## 个人经验 (2026-03-14 - VersionManager GC 重叠保护修复)
- 修复 `VersionManager::gc()` 对 protected 版本数量的硬编码假设
- 用 active/stable 去重后的 `protected_count` 替换 `+ 2``keep` 现在严格表示总保留数(含受保护版本)
- 覆盖 `active == stable``stable == None``keep < protected_count` 三类边界,确保只删除非受保护版本
- 检查了 `src/core/version_manager.rs` 其余逻辑未发现同类“active/stable 必为两个不同版本”的硬编码假设
## 个人经验 (2026-03-14 - P2 遗留修复)
- 确认 `src/core/plugin_loader.rs``test_timeout_ms` 已经通过 `manifest.json` 配置化
- 新增回归测试,防止后续把 manifest 自测超时字段重新写回死配置
- 加固 `src/plugins/wifi/mod.rs` 的 nmcli 调用与解析
- 所有 SSID/密码都继续通过 `Command::args` 逐参数传递,避免 shell 转义问题
- `--terse --escape yes` 输出改为统一走反斜杠转义解析,修复 SSID/连接名中的 `:``\` 边界
- 为 connect/hotspot 参数构建新增单元测试,覆盖引号、反斜杠、空格场景
-`src/plugins/ble/gatt.rs` 增加无 D-Bus 依赖的单元测试
- 覆盖 BLE 写入缓存凭据后派发 WiFi 命令、错误状态回写、control 队列状态更新
- 顺手修复 `bytes_to_string()` 对“空白 + NUL 尾部”处理不稳的问题,避免 BLE 特征值残留 `\0`
- cargo check --workspace --all-targets 零 warningcargo test --workspace 100 个核心测试通过
## 个人经验 (2026-03-14 - 示例插件模板完善)
- 完成 `plugins/example-plugin` 参考模板增强,面向第三方插件作者补齐“能直接照着写”的示例
- 配置增加 `device_plugin` / `request_display_info_on_start`,演示请求/响应模式并保持 `serde(default)` + 业务校验分层
- `handle_message()` 增强 `DeviceResponse` 汇总处理和 `example.subscription.update` 自定义协议解析,错误提示不再停留在泛化 `unwrap` 风格
-`export_plugin!` 调用处补充 FFI 接口用途说明,明确 `create/get_info/init/start/handle_message/stop/free_string` 的职责
- 新增 `plugins/example-plugin/manifest.json` 完整模板,字段与 `PluginManifest` 对齐,能力声明同步到示例代码
- 保持 Rust Edition 2018未引入 edition 特有语法;`cargo check --workspace --all-targets` 零 warning`cargo test --workspace` 全通过
## 个人经验 (2026-03-14 - M1.2 P0 插件管理 API 闭环)
- 修复 `ServiceManager` 对 HTTP 插件管理 `Message::Custom` 的吞消息问题
- `handle_manager_message()` 现在处理 `plugin_enable` / `plugin_disable` / `plugin_rollback` / `plugin_switch` / `plugin_install` / `plugin_check_updates`
- 新增 `broadcast_plugin_states()`,在启动完成和每次管理命令后广播 `plugin_states`,补齐 HttpPlugin 缓存更新链路
- 为版本切换、安装、更新检查补了 Manager 侧 helper统一复用 `VersionManager` / `PluginRepository` / 热替换生命周期
-`src/core/tests.rs` 增加 7 个回归测试,覆盖初始状态广播和 6 个自定义管理命令;保留旧生命周期测试并过滤新增状态广播事件
- `cargo check --workspace --all-targets` 零 warning`cargo test --workspace` 107/107 + 集成测试全绿