- 桌面应用
【免费下载链接】BongoCat
🐱 BongoCat — A cross-platform interactive desktop pet that brings fun to your desktop!
导读
docs/migration/legacy-behavior-inventory.md是 BongoCat 从旧版 Tauri + Vue/Ant Design 架构迁移到新版 Rust + GPUI 原生架构时的一份行为迁移基线:它逐条盘点旧版产品能力,把「Windows/macOS 首发必须具备」的行为冻结为P0 首发,把历史缺陷与旧技术细节列为不迁移反例,并用冻结的基线 commit 与修订记录约束实现期范围。读完本文,你将掌握 BongoCat 迁移行为的完整功能矩阵(主窗口、键盘/鼠标/手柄输入、Live2D、模型、快捷键、托盘、更新等 48 项)、P0 与不迁移的判定规则,以及每条行为对应的源码证据、待确认事项与已闭合决策(ADR)的引用链,可直接用于理解当前仓库各模块的能力边界与验收口径。
这份清单是什么:冻结的功能范围与优先级契约
清单是一份静态考古产物:它固定的是基线 commit44f44bc时的旧版行为事实(记录日期 2026-08-28),而不是持续跟随旧分支代码演进的动态文档。文档开篇明确三条规则:
P0 首发:Windows/macOS 首发必须具备;可以修复旧缺陷,但产品能力不能静默消失。不迁移:只作为行为对照或反例,不进入 BongoCat 产品实现。- 优先级描述的是产品能力,不承诺复制旧实现。列为
P0 首发的行为仍须通过 fixture、平台 contract 或实机验收后才能宣称兼容。
这意味着「P0」只回答「旧版有这个能力、新版必须保留」,而「新版怎么实现」由 ADR、技术设计(technical-design.md)与配置契约另行约束。文档同时规定:历史源码后续变化不自动改变本矩阵,任何范围变化必须显式评审并更新本文件——这正是它作为迁移期「防静默扩缩范围」基准的机制价值。
功能矩阵总览:48 项行为的三级归类
清单以一张领域×行为×优先级×源码结论×待确认的五列矩阵承载全部盘点,按领域覆盖主窗口、窗口状态、主窗口菜单、键盘、鼠标、手柄、Live2D、模型、快捷键、行为快捷键、托盘、系统、权限、设置、更新、外观、错误、诊断、配置与平台。当前统计为P0 首发 40 项 / 不迁移 8 项,合计 48(2026-09-28 修订后不再保留P1 首发后一档,图例与统计表同步收敛)。
主窗口与窗口状态(P0 全部)
| 行为 | 优先级 | 源码结论 | 待确认 |
|---|---|---|---|
| 透明、无边框、默认跳过任务栏 | P0 首发 | 主窗口配置为透明、无装饰、无阴影并默认跳过任务栏 | 原生 alpha、任务栏与阴影 |
| 显示/隐藏、置顶、穿透 | P0 首发 | 配置、快捷键和菜单可直接控制 | 双平台层级、焦点和恢复 |
| 左键拖动 | P0 首发 | 主窗口按下后调用窗口拖动 | 穿透开启时的临时操作入口 |
| 10%-500% 缩放和 10%-100% 透明度 | P0 首发 | 设置页和右键拖动可修改;不再在托盘/右键菜单重复放置数值项 | 逻辑尺寸、Retina/DPI 和手势 |
| 圆角 | P0 首发 | 旧版通过内容裁剪百分比实现 | 抗锯齿边缘与多层重叠 |
| hover 延迟隐藏 | P0 首发 | 光标进入后隐藏内容并临时穿透,离开后恢复 | 实机淡出观感与穿透时序 |
| 保持在屏幕内 | P0 首发 | 移动/缩放后按光标所在显示器边界 clamp | 显示器移除和负坐标 fallback |
| 恢复主窗口与设置窗口的位置和尺寸 | P0 首发 | 旧版保存两个窗口的物理 x/y/width/height | 稳定显示器 id 与 DPI 变化 |
矩阵备注了两处由P1 首发后上调为P0 首发的能力(2026-09-16 修订):主窗口圆角与hover 延迟隐藏。二者上调的原因一致——维护者要求新版同步支持旧版已有的配置项,因此overlay.corner_radius_percent、overlay.hide_on_pointer_hover、overlay.hide_on_pointer_hover_delay_seconds三个字段直接进入当前 v1 schema、默认值、fixture 与实现(见 contract.md 的 Initial Version Boundary 与窗口圆角段落)。同时待确认项随之改写:
- 圆角:旧版通过内容裁剪百分比实现,新版沿用片元着色器按窗口宽高百分比裁剪的路径,不再引入原生窗口形状 API,待确认项由「原生窗口边缘与背景资源一致性」改为「抗锯齿边缘与多层重叠」。
- hover 隐藏:旧版是 DOM
opacity加setIgnoreCursorEvents,新版把隐藏实现为窗口 alpha 淡出加临时穿透,待确认项由「多显示器边界与丢失离开事件」改为「实机淡出观感与穿透时序」。
2026-09-24 修订补充了一个关键实现事实:基线44f44bc的src/pages/main/index.vue把window.opacity / 100施加到包含背景、Live2D canvas 和按键图的根容器,而不是分别修改每个 Live2D drawable。因此 BongoCat 将窗口 presentation opacity 定义为最终 surface 的一次性 alpha,平台实现细节仍需实机 readback 验证。对应配置侧,opacity_percent/corner_radius_percent/hide_on_pointer_hover等在应用层经 settings_commands.rs 写入配置、并由 config_projection.rs 投影到设置快照,形成「设置页 → typed command → v1 配置」的完整链路。
窗口状态方面,window-state.json使用独立的schema_version: 1只保存可恢复的 settings 与 overlay 窗口布局:settings_window为空时在鼠标所在显示器居中按800x600打开,overlay_window为空时以350px作为100%默认逻辑宽度、高度按模型 Canvas 宽高比自适应;恢复前会再次检查窗口与当前显示器是否相交,显示器移除或完全离屏时回退居中默认布局。而旧版保存的是物理 x/y/width/height,跨 DPI/显示器恢复需要新规范(见下「配置不迁移」),新版改用逻辑坐标,window-state 契约 即为这一迁移的产物。
主窗口菜单:托盘与右键共用一棵菜单树
旧版行为:打开设置、模型窗口显隐/穿透/置顶/鼠标移入隐藏、可用的检查更新和退出;托盘与模型窗口右键共用同一套菜单。矩阵结论:两个入口复用同一 popup 根和模型窗口分组。
该行为在 ADR-0068 中被固定为「一棵 popup 根、一个 owner」:bongocat-platform::SystemMenu是唯一的托盘/菜单 owner,持有TrayIcon、一个muda::Menu根、一个模型窗口Submenu与强类型SystemMenuAction事件队列。菜单结构为:
设置 ──────── 模型窗口 ├─ □ 隐藏模型窗口 ├─ □ 鼠标穿透 ├─ □ 始终置顶 └─ □ 鼠标悬停时隐藏 ──────── 检查更新(仅在更新能力可用时创建) ──────── 退出 BongoCat2026-09-25 修订说明:源码、版本、重启以及重复的缩放/透明度选项从原生菜单移除,分别由 About、设置页和右键拖动承担;两个入口展示相同的项目、状态和 action,菜单项状态由 settings snapshot 驱动,显隐是 runtime 会话状态不写入config.json。唯一实现替换点是 system_menu_native.rs 与 overlay 的HasWindowHandle实现。
键盘:键位图、降级规则与「不迁移」的长按兜底
| 行为 | 优先级 | 源码结论 |
|---|---|---|
| 按键图片按 left/right key 目录分手 | P0 首发 | 同一手只保留最后一个 pressed key(多键同手产品语义待确认) |
| 不支持的 F 键降级为 Fn,左右修饰键降级为通用键 | P0 首发 | key.replace(/F(\d+)/, 'Fn'):Fn.png是 F1–F24 的共享回退图,不是 Fn 键(ADR-0049,已闭合) |
| macOS 左下角地球键(Fn 键) | P0 首发 | 旧版名Function(rdev的Key::Function,keycode 63),可达但无已知模型提供该图(已闭合:产品名Globe,Function作末位别名,ADR-0049) |
| CapsLock 短暂触发 | P0 首发 | 已恢复固定 100ms 自动释放(已闭合,ADR-0004) |
| 每次 KeyDown 创建 3 秒自动释放 timer | 不迁移 | Windows 旧兜底会破坏长按且不能证明真实释放;由 KeyUp、reconcile、Reset 替代 |
键盘领域的核心迁移原则在 ADR-0049 与 ADR-0041 / ADR-0042 中被反复钉住:
Fn是「F 编号通配符」而非 Fn 键:旧版pre-refactor:src/composables/useDevice.ts:105-110只有key.replace(/F(\d+)/, 'Fn')这一处产出,对「模型没逐键画图」的F<数字>生效;两个预置键盘模型出厂的Fn.png就是这张共享回退图。地球键在旧版叫Function(keycode 63,rdev的 macOS 表),与Fn只差两个字符而意思不同,因此 BongoCat 把产品名定为Globe(USB HID usage0xff03),Function只作末位别名以兼容已安装旧包;Fn.png不改名、不迁移。- 键位词表是与模型作者的契约,不是「预置模型当前画了哪些图」的清单:ADR-0041 补齐了标点、导航、
PrintScreen、小键盘等全部缺失 usage 的精确名(0x2dMinus …0x67KpEqual),并恢复出厂即存在却因缺命名 arm 永远画不出来的Delete.png(0x4c)。 - 键位图存在才触发按键动作(ADR-0042):
bongocat-live2d-render新增KeyImageInventory,read(root)扫描resources/left-keys与resources/right-keys(不解码任何图片),can_draw(side, hid_usage)按key_name_candidates的候选顺序回答「这个键在这一手能不能画出来」;bongocat-app::input_bindings_for_model把静态 hand 表与模型键位图取交集写入InputBindings,缺图的键既不动爪子(CatParamLeftHandDown/RightHandDown)也不产生按键图层。 - CapsLock 是锁存键(ADR-0004):macOS 平台实测只投递「锁存翻转」事件而完全不投递物理松开,因此按产品既定的「短暂触发」语义在固定
100 ms后由 adapter 合成释放边沿;该时长是按键行为本身,不是超时配置、不进 schema、不得推广到任何其它键。新版输入状态由「低延迟按下/释放事件 + 系统状态校正 + 生命周期 Reset」三类信号共同维护(Windows 以 Raw Input 为主路径并用GetAsyncKeyState校正,macOS 用 CGEventTap 并用CGEventSourceKeyState校正),因此旧版「每次 KeyDown 创建 3 秒自动释放 timer」的兜底被明确列为不迁移——它破坏长按语义且不能证明真实释放。
鼠标:参数映射与平滑,「非 Left 全部当作 Right」不迁移
| 行为 | 优先级 | 源码结论 |
|---|---|---|
| 左右按钮驱动专用模型参数 | P0 首发 | 左键映射 Left,旧版把其他所有按钮映射为 Right(中键和侧键独立语义待确认) |
| 非 Left 按钮全部当作 Right | 不迁移 | 会把中键和侧键错误映射为右键;新协议显式枚举或忽略 |
| 当前显示器归一化坐标驱动角度和眼球参数 | P0 首发 | X/Y 映射 parameter range,Z 使用 X/Y 乘积(混合 DPI、负坐标与边界待确认) |
| 位置指数平滑、忽略鼠标和水平镜像 | P0 首发 | 60 FPS 基准 decay 为 0.75,距离 <0.5 时收敛(确定性 tick 与 mirror fixture 待确认) |
鼠标按钮映射的「不迁移」项与旧版输入协议缺陷直接相关:旧版把所有非 Left 按钮统一映射为 Right,中键、侧键语义错误;新版输入协议显式枚举或忽略。指针平滑在 runtime 侧由CursorSmoother实现,worker/input.rs中smoother.set_target(sample, now)后advance(now)推进、normalized()产出归一化游标,worker/mod.rs 在 worker 初始化时创建平滑器;矩阵记录的「60 FPS 基准 decay 为 0.75、距离 <0.5 时收敛」正是CursorSmoother的默认参数事实(crates/bongocat-runtime/src/tests/input.rs有runtime_smooths_cursor_with_the_injected_monotonic_clock用例验证确定性行为)。
手柄:按钮/D-pad/trigger 与双摇杆参数
| 行为 | 优先级 | 源码结论 |
|---|---|---|
| 按钮、D-pad 和 trigger 驱动左右按键图片 | P0 首发 | gamepad 模式启停独立监听(dead-zone、断开复位和重连待确认) |
| 双摇杆显示、按下和 XY 参数 | P0 首发 | 使用CatParamStick*系列参数(多手柄选择与 profile 差异待确认) |
CatParamStick*系列参数在 parameter.rs 中逐一映射:CatParamStickLeftDown、CatParamStickRightDown、CatParamStickShowLeftHand、CatParamStickShowRightHand、CatParamStickLX/LY/RX/RY,对应双摇杆的按下、显示与 XY 参数语义。手柄连接模型自动切换(model.gamepad_auto_switch,默认关闭)在 ADR-0071 中设计为「谁观察、谁决定、谁写入」的完整通路:产品 frame source 观察 runtime 的connected_gamepad_count的「0 ↔ >0」跨帧跳变,发送GamepadConnectionChanged(不携带状态,处理时重读 runtime),settings service worker 作为唯一决定者复用Application::select_model两阶段提交;「上次使用」是会话内事实而非配置字段。
Live2D:加载、motion、expression 与参数更新
| 行为 | 优先级 | 源码结论 |
|---|---|---|
| model3、moc、texture 和 cdi 加载 | P0 首发 | 旧版选择目录中的第一个 model3(新版多入口必须拒绝并诊断) |
| motion group/index、normal priority 与 lock group | P0 首发 | motion 可预览并绑定快捷键(priority、并发和停止语义待确认) |
| expression 按 index 切换 | P0 首发 | expression 绑定使用 model id + index(稳定资源 id 与模型切换待确认) |
| physics、pose、fade、EyeBlink 和 parameter 更新 | P0 首发 | 预置模型不含 physics/pose,自定义模型会包含 physics(授权真实样本和 Framework 依据待确认) |
| motion sound 和最大 FPS | P0 首发 | 默认音效开、60 FPS(音频后端、无声资源与不可见降频待确认) |
注意矩阵对旧版「motion sound 默认开」的观察,在配置契约中已被刻意收窄:model.play_motion_audio默认false,新装或新建配置一律静音,只有用户显式打开开关后 motion 音效才会预解码并发布Play(见 contract.md 的model.play_motion_audio段落,它明确引用本清单作为「旧版默认音效开」的证据来源)。这正是「P0 保证能力不静默消失、但允许修复旧缺陷/改变默认值」的典型例证。最大 FPS 语义的迁移对照见 bongo-cat-mver-frame-rate-semantics.md:overlay.maximum_fps接受15..=240,决定 runtime 周期求值、GPUI 产品 frame source 与独立 overlay run loop 的下一帧间隔(按帧截止时间计算,隐藏时统一降到 100 ms)。
模型:预置/导入/输入模式判定/删除保护
| 行为 | 优先级 | 源码结论 |
|---|---|---|
| standard、keyboard、gamepad 三个预置和自定义模型 | P0 首发 | 启动时重建预置项并保留自定义项(用户模型 schema、稳定 id 与模式来源待确认) |
| 目录选择、拖放、多选导入并复制到当前环境数据根 | P0 首发 | 旧版直接复制选择目录(安全 preflight、取消和冲突待确认) |
普通包按left-keys/right-keys键图判定输入模式 | P0 首发 | 旧版East判 gamepad、否则 right-keys 判 keyboard(ModelStore staging 判定、失败拒绝并持久化input_mode) |
| 删除、切换、预置保护和在文件管理器显示 | P0 首发 | 预置不可删除;自定义模型可删除(prepare/commit 与删除事务待确认) |
| 删除失败后仍从模型列表移除 | 不迁移 | finally无条件更新列表,可能制造磁盘/配置不一致(失败必须保留原模型) |
普通包输入模式判定是矩阵中经历了「不迁移 → P0 首发」升级的条目(2026-09-25 修订):ModelStore 在 staging 提交前按left-keys/right-keys与手柄专用键名判定,无法判定直接拒绝导入,不再静默产生无模式记录;判定结果作为input_mode持久化到model.imported_models(闭合集合standard/keyboard/gamepad),模型卡片显示的模式来自强类型配置/构建事实:Mver 转换记录所选 section、预置记录由稳定 preset id 派生。矩阵末尾的模式补充(2026-09-25)特别声明:该 Badge 是展示元数据,不代表本阶段已改变 runtime 输入绑定。删除语义上,「删除失败仍从列表移除」被列为不迁移反例——新版必须保证失败保留原模型,删除走 prepare/commit 与删除事务。
快捷键与行为快捷键:自动分配、门禁与作用域
| 行为 | 优先级 | 源码结论 |
|---|---|---|
| 显示猫、打开设置、镜像、穿透和置顶 | P0 首发 | 只在 Pressed 执行;修改时旧版先解绑旧值(冲突检测和事务回滚待确认) |
| motion/expression 自动分配和用户编辑组合键 | P0 首发 | 模型加载后按 primary + Shift/Alt 与数字/字母分层自动分配,旧版无开关(已闭合:稳定行为 id 与冲突策略,ADR-0041/0042;分层与容量见 contract.md) |
行为快捷键是本清单修订最密集的领域,经历了三次关键变更:
- 2026-09-19 上调 P0:维护者要求新版保留旧版「模型加载后即为每个 motion 和 expression 自动分配组合键」的行为,否则快捷键页面在用户录制之前整页为空,属于产品能力静默消失。自动分配的分层、顺序与容量与旧版一致;有意差异是已占用的组合键跳过而非重用(旧版按位置索引,用户改过一项后可能把已被占用的组合键再发一次,而配置会因重复组合键整份失效),以及应用级 command 绑定同样计入占用。开关
shortcuts.model_behaviors_enabled仍默认false:分配照常写入配置并在页面上可见可改,但不在用户开启前进入平台匹配表。 - 2026-09-21 占用范围收窄到「同一模型 + 应用级 command」:切换模型后应只有当前模型的快捷键生效,且每个模型都从
Cmd+1(macOS)/Ctrl+1重新编号。冲突判定按作用域进行(命令内唯一、同一模型内唯一、模型绑定不得与命令冲突),跨模型允许复用组合键,平台表只编译当前模型的绑定,切换模型时立即重建该表。 - 2026-09-21 门禁跟随分组:模型行为快捷键开关从「交互」页搬到快捷键页面的「模型行为快捷键」分组第一行并改名「启用模型行为快捷键」;应用级快捷键新增自己的门禁「启用窗口快捷键」(
shortcuts.commands_enabled,默认true,见 ADR-0052)。两个开关都是正向字段直出(无取反)、只带标题不带描述;门禁只把对应的一半排除在平台匹配表之外,不清空、不改写绑定。
自动分配的完整契约在 contract.md 中给出:primary在 macOS 是Command、其它平台是Control;分层顺序为[primary]、[primary, Shift]、[primary, Alt]、[primary, Shift, Alt];每层先走数字1234567890再走字母QWERTYUIOPASDFGHJKLZXCVBNM,共4 × (10 + 26) = 144个名额——该容量在源码中即BEHAVIOR_SHORTCUT_CAPACITY(shortcuts/config.rs),行为 id 沿用motion:{group}:{index}与expression:{name},超过 144 个的行为保持未绑定。分配是幂等的:已有绑定的行为永不重写,模型每次激活可安全重复执行。门禁的唯一实现点是ShortcutConfig::active_bindings(「此刻生效的绑定」的唯一投影,模型侧的活动模型过滤也在同一处);字段级默认值在 config.rs 中为commands_enabled: true/model_behaviors_enabled: false,且Default是手写实现以避免派生默认值把全新配置判成「窗口快捷键已关闭」。
托盘、系统、权限与设置
| 行为 | 优先级 | 源码结论 |
|---|---|---|
| 可隐藏的托盘/菜单栏图标与动态状态菜单 | P0 首发 | 菜单按设置、模型窗口、检查更新和退出分组(图标隐藏后的可恢复入口待确认) |
| 任务栏图标与托盘/菜单栏图标分别显示或隐藏 | P0 首发 | 设置页分别保存 taskbar/tray visibility(双入口均隐藏时的恢复路径待确认) |
| 登录启动、单实例、正常重启/退出和结构化日志 | P0 首发 | 旧版由 Tauri 插件提供(原生失败状态和 shutdown 待确认) |
| Windows 管理员状态提示 | P0 首发 | 非管理员时提示退出,但旧版没有原地提权(默认不提权及高权限应用输入差异待确认) |
| macOS Input Monitoring 状态、请求和再次引导 | P0 首发 | 旧版只处理 Input Monitoring,没有 Accessibility 流程(拒绝、撤销、重启和 TCC 差异待确认) |
| 设置页关闭时隐藏、可从托盘/快捷键/单实例唤回 | P0 首发 | CloseRequested 被拦截并隐藏(GPUI 窗口重建与焦点待确认) |
| 首次启动依次初始化配置、模型、窗口恢复和系统 locale | P0 首发 | UI 等待窗口恢复完成后显示(部分失败时的 degraded 页面待确认) |
| 原样复刻旧 Vue/Ant Design 页面结构和视觉 | 不迁移 | 旧布局只作为功能入口证据;GPUI 使用新 design system |
托盘与任务栏图标在配置契约中由system.show_taskbar_icon(Windows 模型窗口任务栏按钮可见性,默认false,模型窗口是无标题栏WS_POPUP,任务栏按钮没有对应窗口可操作,因此默认不额外占用)与system.show_status_icon(Windows 托盘或 macOS 菜单栏状态图标)分别控制;macOS 另有system.show_dock_icon(程序坞图标唯一来源,默认false,进程以NSApplicationActivationPolicyAccessory运行)。显隐是平台能力而非持久化第二份布尔值:修改时先通过有界主线程 bridge 应用平台显隐,成功后才按 expected revision 原子提交配置,平台失败不提交、配置失败恢复旧平台可见性。
更新、外观、错误与诊断
| 行为 | 优先级 | 源码结论 |
|---|---|---|
| 自动/手动检查、进度、稍后安装和安装后重启 | P0 首发 | 自动检查周期为 24 小时(HTTPS、签名、channel 和回滚待确认) |
| HTTP endpoint、嵌入请求凭据和旧 updater payload | 不迁移 | 旧配置允许不安全传输且前端带固定 access key;新协议只允许 HTTPS 与签名 |
| system/light/dark 与五种既有语言 | P0 首发 | 首次语言从系统 locale 获取,不支持时回退英文(GPUI 字体、输入法和布局待确认) |
| 模型、更新、文件和快捷键失败具有用户可见反馈 | P0 首发 | 旧版多为未分类字符串 toast/dialog(稳定 error code、重试和详情待确认) |
| 复制脱敏 app/platform 信息、打开日志目录和反馈链接 | P0 首发 | About 页已有复制、日志和外部链接入口(脱敏诊断包的内容与隐私边界待确认) |
旧 updater 的「HTTP endpoint + 前端嵌入固定请求凭据」是不迁移反例:BongoCat 的更新协议只允许 HTTPS 与签名(相关信任模型见 ADR-0021、ADR-0022、ADR-0025、ADR-0034)。自动检查周期为 24 小时,对应配置updates.check_interval_hours(默认24,接受1..=8760,check_automatically默认false)。
诊断项在 2026-09-28 由P1 首发后上调为P0 首发:脱敏诊断包导出与 About 页入口均已实现,隐私边界由 ADR-0016 的诊断导出契约固定。导出经ExportDiagnostics强类型 command 生成 format version 1 JSON 到当前环境的logs/diagnostics.json,只包含 runtime/input/configuration 的稳定 code、匿名计数、模型来源计数和 revision;模型 ID、路径、原始按键或事件流、原始配置、时间戳和动态 I/O 文本永远不进入导出。语言方面,appearance.language是严格的七值枚举(system、zh-CN、zh-TW、en-US、ar-SA、vi-VN、pt-BR),system每次启动读取平台首选 locale 并按 primary subtag 归类(RFC 4647 fallback),未知值由 v1 解析入口直接拒绝,不提供 alias、迁移或 fallback——旧版「不支持时回退英文」在新版被更精确的 locale 归类规则替代。
配置与平台:不迁移边界
| 行为 | 优先级 | 源码结论 |
|---|---|---|
| 读取、探测、导入或 alias 旧 Tauri/Pinia 配置 | 不迁移 | 仅保留只读考古 fixture;configuration schema 从 v1 开始 |
| 原样恢复旧物理像素坐标和旧模型 id | 不迁移 | 旧状态不具备稳定显示器 id,且 BongoCat 不导入旧配置;新状态使用逻辑坐标和自有 id |
| Linux 窗口、输入、托盘、安装包和旧条件分支 | 不迁移 | Linux 只属于首发后单独能力评估;不进入 Windows/macOS 首发范围 |
配置领域的不迁移边界与 ADR-0008、ADR-0067 一致:初始版本是全新的,完整配置直接定义为schema_version: 1,不实现 migration、字段 alias、旧数据转换或历史版本判断;解析入口只接受完整 v1 并明确拒绝其他版本且不改写原文件。旧配置仅保留为只读考古 fixture。Linux 不进入首发范围,与 ADR-0006 的「首发后单独能力评估」决策一致。
主要源码证据与修订机制
清单的主要源码证据指向远端pre-refactor-tauri分支的对应实现(窗口、菜单、输入、手柄、模型、设置、系统集成和发布配置),并强调两点:
- 这些路径固定的是基线 commit 中的静态事实,历史源码后续变化不自动改变矩阵;
- 任何范围变化必须显式评审并更新本文件。
对应地,清单内嵌了大量修订记录,本身就是一部迁移决策日志:2026-09-16(圆角、hover 隐藏上调 P0)、2026-09-19(行为快捷键上调 P0、统计表对齐真实行数)、2026-09-21(占用范围收窄、门禁跟随分组)、2026-09-24(presentation opacity 定义)、2026-09-25(模式判定闭环、菜单树复用)、2026-09-28(诊断项上调 P0、移除 P1 档)。其中 2026-09-19 的修订记录还揭示了统计表本身的一次纠错:此前表里的P0 34 / P1 4与矩阵实际内容不符且早于改动就存在,不迁移一列始终是对的——说明该表本来就是逐行计数而非另一套口径,本次对优先级的净影响只有一行。
范围统计:40 / 8 的闭环口径
| 优先级 | 数量 | 解释 |
|---|---|---|
| P0 首发 | 40 | 构成 Windows/macOS 可发布产品闭环 |
| 不迁移 | 8 | 历史实现缺陷、旧技术细节或明确排除的平台能力 |
统计用于防止实现期静默扩缩范围;拆分或合并矩阵行时必须同步更新。8 个不迁移项完整清单为:Windows KeyDown 3 秒自动释放 timer、非 Left 鼠标按钮全部当作 Right、模型删除失败仍从列表移除、原样复刻旧 Vue/Ant Design 页面、旧 updater 的 HTTP endpoint 与嵌入凭据、读取/导入旧 Tauri/Pinia 配置、恢复旧物理坐标与旧模型 id、Linux 平台能力。
已确认的行为风险:新实现不得复制的八个反例
清单末尾以「已确认的行为风险」形式总结了八条必须由新实现规避的旧版问题,它们与矩阵的「不迁移」行互为印证:
- Windows KeyDown 后通过 timer 自动释放,不能证明真实按键状态,长按语义受 delay 影响——由 KeyUp、reconcile、Reset 替代(ADR-0004)。
- pressed key 图片按「手目录」互斥,不是任意多键叠加;fixture 必须保留该产品语义或明确修改。
- 模型删除在文件删除失败时仍会从列表移除,新实现不得复制该错误行为(失败必须保留原模型)。
- 模型 mode 通过 right-keys 内容推断,属于启发式协议,需要显式验证与诊断——现由 ModelStore staging 判定替代。
- 当前窗口状态保存物理坐标,跨 DPI/显示器恢复需要新规范——新版使用逻辑坐标与
window-state.json。 - 当前更新、模型和输入错误多以字符串传播,新 runtime 需要稳定 error code。
- 旧 updater 允许 HTTP endpoint 并把固定请求凭据放在前端源码,BongoCat 不得复制(新协议只允许 HTTPS 与签名)。
- 旧设置页面、Tauri plugin API 和 Pinia 字段名不是兼容面,只保留为功能入口证据。
结语:清单如何约束新版实现
legacy-behavior-inventory.md在 BongoCat 迁移工程中扮演的角色可以概括为三句话:它是「旧版必须保留哪些能力」的唯一仲裁者(P0 40 项构成双平台可发布闭环);它是「旧版哪些缺陷不得复制」的反例库(8 项不迁移与 8 条行为风险互为印证);它是「范围变更必须显式评审」的修订日志(每条修订记录都注明日期、原因与对矩阵行的影响)。对阅读源码的开发者而言,这张矩阵提供了从产品能力到实现证据的导航:行为快捷键的自动分配契约与容量(contract.md 与 shortcuts/config.rs)、地球键/Fn 语义(ADR-0049 与 macos.rs)、键位图即动作门禁(ADR-0042 与KeyImageInventory)、双摇杆参数(parameter.rs)、菜单树复用(ADR-0068)、诊断导出(ADR-0016),每一处都能沿矩阵的「源码结论」列继续下钻到 crate 实现与测试。
- 桌面应用
【免费下载链接】BongoCat
🐱 BongoCat — A cross-platform interactive desktop pet that brings fun to your desktop!
相关推荐
Unsloth Studio 多账户隔离集成门禁测试全解析:从路由矩阵、旧库迁移到热路径性能门禁
Unsloth Studio 多账户隔离集成门禁测试全解析:从路由矩阵、旧库迁移到热路径性能门禁 本指南聚焦 Unsloth Studio 后端为「多账户(mu
人工智能大模型微调LoRA模型优化模型量化强化学习Omi AI可穿戴项链:三步搭起自己的第二大脑
Omi AI可穿戴项链:三步搭起自己的第二大脑 开会两小时,回座位就忘了定了哪几条。课堂重点、散步时的灵感,一晃神就没了。开源项目 Omi 就是冲着这件事来的:
人工智能AI 应用语音移动开发后端桌面应用智能硬件MCP 服务Erlang/OTP 24 已移除功能清单与迁移指南(removed_24 深度解读)
Erlang/OTP 24 已移除功能清单与迁移指南(removed_24 深度解读) 本篇指南围绕 system/doc/general_info/remov
编程语言语言运行时标准库编译器并发编程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考