6.5 KiB
升级模块落地(2026-10-20)
真实升级反馈:ASAR 标记误判
用户在 0.0.3 → 0.0.4 测试中实际遇到 NSIS 安装标记不是文件。物理安装文件正常;原实现使用 Electron patched fs.stat,将 resources/app.asar 当作虚拟目录。此前 Node 后端测试和未调用安装器的启动/下载验证没有覆盖这个语义差异。
修复通过 physical-files.ts 的 Electron node:original-fs 适配器执行物理 stat/realpath,由生产更新入口注入。没有全局关闭 ASAR,也没有移除 isFile、注册表或路径校验。真实 Electron 只读测试 node scripts/verify-updates-installer-marker.cjs 已通过:当前真实安装目录校验成功,真实目录 marker 和错误 registry 仍被拒绝;未启动安装器、未修改用户安装。报告 .tmp/updates-installer-marker/2026-10-20T10-23-07-489Z/report.json。
修正版为 0.0.5。旧版 0.0.3/0.0.4 的运行中检查器无法通过服务器目标包自我修复,需要手动覆盖安装一次修正版后,再测试后续自动升级。
0.0.5 已构建并发布,237106337 字节,SHA-256 a3b8ece96077af81f9c8c676cb7d0d71f16a5d73332bc48b865c5cba7e92fd0d。最终 ASAR 已核对包含物理文件适配器;生产包隔离启动与正式 IPC、服务器签名清单及完整下载校验通过,报告 .tmp/updates-live/2026-10-20T10-28-49-489Z/report.json。没有替用户执行安装或重启,真实覆盖安装仍待用户继续验证。
实现与边界
- Windows x64、Electron + NSIS 按用户安装;账号菜单、关于页与侧栏共享真实更新状态。
- 启动 10 秒后检查,此后每 5 分钟检查;发现更新后后台下载,已忽略版本不自动下载。
- 检查中、下载进度、就绪、失败重试、按版本忽略/折叠、手动下载及安装诊断日志已接通。
- 原版参考为 WorkBuddy 5.8.3,ASAR SHA-256
3e50fcb5b060deba4f1ea9a8c293cf955bf12d7e52d971985de914350afd9077;主要 REA Evidence 为ev_6f16b9ef02d9c5fb142e7d686ea8caeeec79797b621d615aaa532b49b65d7ad9(renderer)与ev_e41b1e44cb0c430be5d8caa14b4e3a4710a6925e0bdff870d42ffa73b5e1a5c8(Windows 更新模块)。本轮复用历史静态 REA 结论,没有通过其他渠道查看原版。 - 强制升级、商店/企业分支、启动 splash 与架构纠正仍在后续完整复刻清单中。本轮普通更新交互不是完整 1:1 验收;缺少原版全状态运行态布局/动效/像素证据。
安全与退出
- 完整 payload 使用独立 YCode Ed25519 密钥签名;客户端先验签再采用版本、说明、大小、下载地址与哈希。公钥随包分发;私钥仅在仓库外保存。
- 同源、固定版本目录、严格 SemVer、响应体上限、超时、大小与 SHA-256 校验;断点续传检查 Content-Range;缓存和安装前再次校验。
- 多窗口 IPC 仅接受主窗口/设置窗口的主 frame;渲染层不接收 Node 能力或安装路径参数。
- 用户确认前不启动安装器。确认后暂停新任务/终端创建,停止调度并取消、等待当前任务落库;该准备阶段不销毁全局 Claude 内核/MCP。
- 准备超时后,不会在旧 stop 尚未结束时恢复服务;安装标记写入或 spawn 失败后允许恢复。
- 安装器成功 spawn 是不可回退提交点;后端拒绝重复安装/检查/忽略,不再恢复后台任务。随后有界清理资源并退出,避免已启动的安装器和恢复后的工作并存。
- NSIS 等待指定 PID 后检查残留实例;不使用进程名批量结束其他实例。真实执行行为以专项安装 QA 结果为准。
- 安装位置绑定当前用户注册表 GUID、当前 EXE、卸载器与 app.asar,支持用户选择的目录;便携解压/开发模式不执行覆盖安装。
- 记录目标版本,下次启动仍低于目标则提示升级未完成。安装器执行失败不会被误报为已升级。
验证
npm run test:updates:后端 14 组;运行时门禁与生命周期专项;发布工具 12 组;发布清单与真实后端验签/路径契约检查通过。npm run build:完整主进程、preload、renderer 构建和 Node/Web 类型检查通过。npm run test:updates:ui:真实 Electron 主/设置窗口、正式 preload、注入确定性 updates IPC,验证渲染交互和跨窗口状态;最终报告.tmp/updates-ui-ZnQVYZ/report.json,无 renderer 错误。该验证不等价于真实下载或安装。npm run test:chat:消息顺序、聊天状态、流式提交旧回归通过。0.0.2的真实生产包隔离启动与 HTTP 下载验证通过;报告.tmp/updates-live/2026-10-20T09-43-52-041Z/report.json。前代版本号为注入模拟,安装器调用为零,不是实际版本升级。- 审查发现并修复安装失败后内核永久关闭、超时清理继续破坏恢复、确认期间并发忽略、spawn 后回滚、NSIS 错误码与残留进程检查问题;修正版内部版本递增为
0.0.3,不覆盖不可变0.0.2发布。 0.0.3已构建并发布,安装包release/YCode-0.0.3-Setup-x64.exe,237105798 字节,SHA-2566f7565fcc152a99899bf74a795c8e91417516980f143fb9fccb61bde2b490200。0.0.3真实生产包隔离启动与正式 preload IPC 检查通过(idle → checking → up-to-date);真实服务器签名清单及全量安装包下载/哈希通过,模拟旧版本最终 ready/100。报告.tmp/updates-live/2026-10-20T10-02-05-040Z/report.json。安装器/安装回调调用均为零;真实用户注册表与安装 EXE 指纹前后未变。- 完整 NSIS 真机覆盖安装、原生确认取消、安装后重启/版本回查,以及等待宏的不存在 PID/睡眠 PID/第二实例/拒绝访问动态探针仍未执行。独立 QA 安装方案仅完成设计,没有构建或安装 fixture;不能把单元、渲染或真实下载测试当作已完成安装验收。
发布与使用
服务器为 local001,客户端更新入口为 http://192.168.10.6/ycode/releases/latest.json,手动下载页为 http://192.168.10.6/ycode/releases/。SSH 仅用于发布维护,客户端不需要 SSH 凭据。HTTP 限内网使用;真实性依赖内置公钥,不能防止网络阻断/旧清单重放导致的更新延迟。
参见 升级发布说明。0.0.1 未包含 updater,必须先关闭旧 YCode 并手动安装首个安全验收完成的基线包,之后才有自动更新能力。安装包尚未 Authenticode 签名,系统可能显示 SmartScreen 警告。没有替换或重启当前用户安装版,也没有修改其配置/会话或提交 Git。