Files
goodbuddy/docs/development/release-preparation-0.15.0.md
T
mesalogo 4e5239256d
GoodBuddy Agents / Validate Agent source (push) Canceled after 0s
GoodBuddy Agents / Build darwin arm64 Agent (push) Canceled after 0s
GoodBuddy Agents / Build linux arm64 Agent (push) Canceled after 0s
GoodBuddy Agents / Build linux x64 Agent (push) Canceled after 0s
Cross-platform packages / Validate source (push) Canceled after 0s
Cross-platform packages / Authorize desktop packaging (push) Canceled after 0s
Cross-platform packages / linux arm64 (push) Canceled after 0s
Cross-platform packages / macos arm64 (push) Canceled after 0s
Cross-platform packages / windows arm64 (push) Canceled after 0s
Cross-platform packages / linux x64 (push) Canceled after 0s
Cross-platform packages / macos x64 (push) Canceled after 0s
Cross-platform packages / windows x64 (push) Canceled after 0s
Cross-platform packages / Publish GitHub and OSS release (push) Canceled after 0s
fix: keep bundled DS Web links relocatable
Preserve npm relative symlinks while preparing the desktop DS Web resources.
The previous copy rewrote CLI links to build-machine absolute paths, causing
both macOS targets to fail strict code-signature verification. The regression
runs the production preparation and builder matcher, removes the installation
and staging trees, and verifies the final link remains readable.

Recover the unpublished Desktop 0.15.0 as 0.15.1 without moving its tag.
Agent stays 0.15.0 and requires Desktop 0.15.1. Carry the unpublished notes
forward once and align the bilingual feature matrices and upgrade guidance.

Validation: complete frozen Linux tree 5372 passed, 51 skipped; Windows
packaging checks 45 passed and one POSIX-only test skipped. Typecheck, lint,
and bilingual release-note validation passed. Native macOS signing remains
an independent release check. Agent Runtime implementations are unaffected.

Release note: 修复本地 DS Web 随包依赖的链接复制,避免 macOS 安装包签名校验失败。
2026-09-28 09:51:01 +08:00

16 KiB
Raw Blame History

Desktop 0.15.1 与 Agent 0.15.0 发布准备及恢复

日期:2026-09-27 至 2026-09-28。原 Desktop 0.15.0 标签构建失败, 用户已选择 Desktop 0.15.1 与 Agent 0.15.0 恢复发布;验证通过不代表已发布。

范围与批准

  • 用户要求 Desktop 与 GoodBuddy Agent 同步升级至 0.15.0,明确不构建 LoongArch。
  • 源码基线:0f8bf405db7ca21a85cc70009ad083eb837e1e03。
  • Desktop 差异基线为已发布的 v0.13.16,Agent 为 agent-v0.13.4。
  • v0.15.0 已创建并推送,保持不可变;恢复使用 v0.15.1, agent-v0.15.0 尚未创建或推送。
  • 用户已批准两份完整双语说明,正式正文仅维护在 Desktop 发布资源 的 0.15.1 条目与 Agent 发布资源。 已逐条核对写入文本与批准草案一致,本记录不再复制正文。
  • FEATURES.md 与 FEATURES.zh-CN.md 已核对本轮能力、限制和候选版本。
  • 用户要求两张未跟踪宣传截图保留原位、不提交,打标签前另行处理; 不移动、删除、暂存或更改忽略规则。
  • 2026-09-28 用户更新授权:当前工作区的宣传文档与素材可以一起提交、推送, 后续候选由代理自行审核确认,不再逐次等待用户批准,继续完成双产品正式发布。 三张新增候选图已读取检查,保留原始草稿属性,不冒充正式发布截图或对外媒体发文。 发布说明正文保持不变,releasedAt 更新为实际准备发布日期 2026-09-28。

本地验证

  • npm run typecheck:通过。
  • npm run lint:通过。
  • npm run release:notes:verify:通过。
  • 发布说明相关三个文件定向测试:16 项通过。
  • 首轮 npm test:5,313 通过、79 跳过、4 失败,耗时 697.61 秒。 三项失败来自当时尚未批准写入的 0.15.0 Desktop/Agent 发布说明; 另一项为 magic-notes-layout.electron.test.ts 的布尔断言。 该布局用例单独复验 1 项通过,未修改源码或放宽断言。 单独通过不替代全量结果。
  • 正式说明写入后的最终 npm test:5,317 通过、79 跳过、0 失败, 453 个测试文件通过、11 个跳过,耗时 645.49 秒。随后再次执行完整 npm run typecheck 与 npm run lint,均通过。
  • 最终验证期间出现并行宣传文档编辑及新增 storygraph.png,均不属于本次 发布准备改动,不暂存或覆盖。打标签前仍须处理工作区洁净条件。
  • 修改文档的相对文件链接、版本一致性和 git diff --check 通过。
  • 不运行本地生产构建、打包或安装包启动。准确候选提交须经用户批准, 然后双远端推送、主分支 CI、生产构建、原生发布与公开核验分别进行。

Agent 当前源码实机验证

共享 Linux x64 Host 的 LAN/VPN SSH 端口均可达,实际通过 LAN 与既有固定 Host Key、加密凭据连接。重新捆绑当前源码的 Agent CLI、daemon、model bridge 与 Desktop 适配器,仅上传独立 /root/tmp/gb-lifecycle-* 测试目录,复用已安装且 版本锁未变的 Node/OpenCode/Continue,不替换原安装,不构建正式包。

最终 OpenCode、Continue 各通过一次 Ask 和一次 Execute,无工具请求, 验证回答、后续历史、空闲 Runtime 回收及测试停止后所属进程为 0。 模型请求时读取所属进程的固定遥测字段,确认 DO_NOT_TRACK=1、 OTEL_SDK_DISABLED=true 及三个 exporter 均为 none,不输出整个环境。 这些结果补齐 eb53c82 的 Agent/model bridge 真实链路验证, 但不证明后台没有其他网络流量,也不替代三目标正式包验收。

首轮 Continue 探针沿用了 OpenCode 原生历史持久化假设,未像 Desktop 一样传入 request.history,第二轮历史断言失败;当前 Continue 冷启动源码明确要求传入 保存历史。修正测试输入及会话 ID 断言后通过,未修改产品实现。

有完整计数的实机运行共 8 次真实模型 HTTP 请求:首次 OpenCode 2 次、 首次 Continue 2 次、最终 Continue 2 次、最终 OpenCode 2 次。 此前一次直接启动 Electron 的探针未捕获子进程输出,不能确认是否实际发出请求, 该次上限 2 次,不纳入通过证据;因此不能把 8 次写成本轮精确总数,总量为 8–10 次。 后续均使用等待退出并记录脱敏输出的启动器;本轮探针 Electron 进程已退出。 本地诊断证据在临时 opencode/release-015-host/,不提交脚本、日志或凭据。

首次候选 CI 与测试修正

用户批准的首次候选 5a6ba6c14f5c58f3da5e9afe281b18e0cbdb1ae8 已推送至 origin/main 和 github/main,未创建两个发布标签。

  • Agent CI 36329271991 源码验证及 Linux x64、Linux arm64、Darwin arm64 原生构建全部通过。
  • Desktop CI 36329271967 为 5,342 通过、51 跳过、3 失败。两个 App 长历史场景超过默认 5 秒单用例时限; 会话采集 Electron 场景等待 Escape 返回笔记列表超时。生产构建未运行。
  • 测试修正仅让原生键盘辅助函数显示窗口、获取焦点并等待 document.hasFocus(), 然后发送真实输入;两个长历史场景采用仓库既有的 15 秒单用例时限。 不修改产品实现、不跳过 Linux、不关闭沙箱、不删除或放宽数据和键盘断言。
  • Windows 聚焦复验三个失败场景通过,其中真实 Electron 覆盖完整 502 条历史、 214px 窄栏键盘操作、浅深主题确认按钮、真实 IPC/SQLite 和重开保留。 修正后首次全量复验被中断,不计为通过;随后完整重跑为 5,317 通过、 79 跳过、0 失败,453 个文件通过、11 个跳过,耗时 646.48 秒。 类型检查、lint 和发布说明校验均通过,新候选 Linux CI 仍需独立通过。
  • 本次只改测试和验证文档,不改变 Agent、远程 Runtime 或模型桥; 沿用上方当前源码 Host 验证,不新增真实模型请求。
  • 新提交必须重新取得准确 SHA 批准,原发布说明正文保持不变。

Linux 实机复现与最终同步修正

2026-09-28:第二次批准候选 12594961fe1e814e89f55de1fbfe245310505115 的 Desktop CI 36331853137 为 5,343 通过、51 跳过、2 失败。两个 App 长历史场景已通过; Escape 返回列表仍失败,活动历史迁移这次超过默认 5 秒时限,生产构建仍未执行。

按用户要求直接在共享 Linux x64 Host 测试准确候选源码。使用独立磁盘测试目录、 锁定 Node 24.19.0 和 npm ci,补齐 Xvfb 与匹配的 X server 系统依赖; 没有创建新账号,使用既有非 root 账号运行测试,保留 Electron 沙箱及其标准 helper 权限。 不替换既有 Agent,不修改其安装或工作区,不执行生产构建或打包。

原测试在 Host 上稳定复现:缩窄窗口会按产品既有行为收起工作栏,隐藏面板仍有非零宽度。 诊断显示 Escape 实际发给 aria-expanded=false 的工作栏开关,而不是笔记输入框。 因此仅获取窗口焦点不够;测试改为等待窄视口及响应式渲染完成,按真实按钮打开工作栏, 确认展开状态和目标输入框焦点后再发送键盘输入。临时诊断代码已移除。

迁移测试在 Host 上以原默认时限通过,保留 10,000 条记录、完整迁移、WAL 字节比、 扫描次数与无变化写入断言;仅为这一个大数据场景采用已有的 15 秒单用例时限, 不改数据库实现或全局时限。

  • 最终 Linux Host 完整 npm test:5,345 通过、51 跳过、0 失败, 449 个文件通过、15 个跳过,耗时 751.09 秒。
  • Windows 聚焦回归:3 项通过,包含真实 Electron 和迁移。
  • Windows 完整类型检查、lint、发布说明校验:全部通过。
  • Linux Electron 实测覆盖 502 条历史、218px 窄栏、Escape/Tab/Enter、 浅深主题确认按钮、真实 IPC/SQLite 与重开保留;Windows 对应窄栏为约 214px。
  • 本阶段不新增真实模型请求,不改变产品代码或双语说明。 新候选仍须重新批准 SHA 并通过自己的主分支 CI/生产构建,两个标签仍未创建。

后续 CI 焦点前提与确定性取消验证

b8b6007 的 CI 36335076841 两次执行均为 5,344 通过、51 跳过、1 失败,失败点改为 new title focus, 生产构建没有运行。该次失败未在 Host 的 10 次带诊断复验中重现,其中 5 次限制单 CPU; 移除临时诊断后再测也通过。这些独立结果不替代 CI。

测试原先直到键盘阶段才显示窗口,前面的自动聚焦检查仍在隐藏窗口执行。 现让测试窗口从开始即显示并确认焦点,保留标题自动聚焦原断言; 超时增加实际焦点、标题禁用/可见/隔离状态和保存状态,避免只报告阶段名称。 可见窗口版本在 Host 连续五次聚焦复验通过。

随后 Host 全量出现一个独立的 Continue 取消测试竞争: setTimeout(0) 没有保证取消发生在子进程启动前,空 mock 已被调用。 用例改在既有启动环境回调处精确取消,仍验证回调执行、子进程未启动和临时配置删除, 不更改 Continue 产品实现或取消机制。

  • 最终 Host 完整测试:5,345 通过、51 跳过、0 失败,449 个文件通过、 15 个跳过,耗时 743.34 秒。
  • Windows 可见窗口 Electron 回归及确定性取消回归通过。
  • 完整类型检查、lint 通过;双语说明正文不变,日期调整后另行验证发布资源。
  • 上述均为测试或验证文档调整,不新增真实模型调用,不改变 Agent 发布输入。 正式发布仍要求当前候选自己的 CI/生产构建通过。

完整分支快照重新核对

d9e1e42 的 Desktop CI 36340682594 已通过原生会话采集焦点测试,但为 5,367 通过、51 跳过、4 失败。 核对祖先后确认准备期间另有四个并行提交进入分支: ee1bf8a 输入区控件样式、8e60736 流式会话稳定排序、 f35198d 桌面通知开关、d47f967 监督结果继续讨论。 它们已随用户授权的当前分支推送;前述 Host 的 5,345 项通过使用较早源码快照, 不能作为包含这四项的新候选验证结果。

本轮已重新核对四个提交的实现和文档,补充两份功能矩阵与双语发布说明: 通知开关默认开启且不影响应用内提示;流式更新不改变排序; 监督结果可直接编辑问题并继续讨论,界面不再提供知识实体写回控件。 Agent 产品源码及 Runtime 锁未因这四项改变,Agent CI 36340682607 源码校验和三个原生构建全部通过。

补齐通知默认值的契约 fixture;Obsidian 多次真实子进程调用使用单用例 15 秒时限, 避免前项超时后的在途调用污染下一项取消断言;笔记来源用例按面板查询控件, 并等前次来源操作释放禁用状态后再发起下一次。 这些修正不改变产品实现。Windows 聚焦回归 19 项通过,类型、lint 和说明校验通过。 从 Git tree 1758ff58a6ff33fcf7ddaa3d35dd2fcc57cd1265 导出完整快照, 覆盖 Host 测试源码,而非只同步早期快照中的少数文件。 该完整快照 npm test 为 5,371 通过、51 跳过、0 失败, 451 个文件通过、15 个跳过,耗时 751.42 秒,包含全部四个并行提交。 最终提交前再次核对源码、测试、依赖和发布资源与该已验证 tree 一致, 仅追加本段验证结果;完整候选仍需自己的主分支 CI 与生产构建通过。

完整候选后的焦点同步修正

5cdffee 的 Agent CI 36343184917 三个原生构建和源码校验通过;桌面 CI 36343184916 为 5,369 通过、51 跳过、2 失败,生产构建未执行。 会话采集的焦点等待可被 body 后代文字误满足,菜单随后被真正的消息聚焦关闭; 另一个原生 Runtime 控件用例在启动完成前打开失焦关闭的菜单。 本轮收紧消息焦点的元素断言,并等待项目能力请求及启动渲染后再打开 Runtime 选项。 不重试菜单、不跳过场景、不改产品实现。

完整冻结 tree 2ddc0da69b6bcb42d8272c44dd11e3e6904d0438 在 Host 全量 5,371 通过、51 跳过、0 失败,耗时 748.21 秒。 Windows 原生 Runtime 聚焦用例、类型检查和 lint 通过。 提交仅追加本段记录;仍须等待修正候选的主分支 CI 和生产构建。

706726b 的桌面 CI 36345672365 已通过上述采集与 Runtime 用例,但另一个外部知识库测试失败: 5,370 通过、51 跳过、1 失败,生产构建未执行。 该 fixture 只在查询新库 ID 时返回包含已创建库的快照,普通轮询会返回创建前数据; 同时错误地要求最后一次请求必须属于新库,忽略后台轮询。 改为模拟已持久化的库列表,等待新库请求发生,保留原库与新增库选中、被排除库未选中的 全部界面断言,不修改产品代码。Windows 完整 App 300 项通过,类型、lint 和说明校验通过。 冻结 tree 42a92450ad7d9ebc50167c7946bff53cff2889e6 的 Linux 全量为 5,371 通过、51 跳过、0 失败,耗时 748.67 秒。

Desktop 0.15.1 恢复

65a21390debe0dd04871417a363a9d87a29339e6 的主分支 CI 36347785076 验证与生产构建全部通过后,两个远端创建了不可变 v0.15.0。 其正式 CI 36348938269 两个 macOS 目标在 codesign --verify --deep --strict 失败, 报 invalid destination for symbolic link in bundle;GitHub Release 未发布。

Host 隔离 fixture 经实际 DS 资源准备和 electron-builder 文件复制, 复现相对 npm CLI 链接变成原构建目录的绝对链接。不是签名凭据或测试超时问题。 用户明确选择 Desktop 0.15.1 + Agent 0.15.0 恢复,不移动或复用旧标签。 修正仅让复制保留相对链接;新增回归移除原安装与暂存目录后验证最终链接仍可读。 该路径不用于 Agent,远程 Runtime 与 Agent 源码未改,不增加真实模型调用。 未发布 Desktop 0.15.0 的双语条目迁移到 0.15.1,保留全部功能说明; Agent 版本不变,其包元数据从新版 Desktop manifest 派生最低版本 0.15.1, 两份说明和功能矩阵同步这个升级顺序。

原标签最终 Windows/Linux 四个目标成功,两个 macOS 失败,发布任务跳过, 公开 Latest 仍为 v0.13.16。 Windows 打包相关测试 45 通过、1 个 POSIX 链接用例跳过,类型、lint、 发布说明校验通过。冻结 tree 99d3271174a68922fbf0a1a4cfbadbb85a6067c8 在 Linux Host 全量 5,372 通过、51 跳过、0 失败,耗时 745.88 秒; 新增符号链接回归实际执行通过。提交仅追加验证记录,恢复候选 CI 与 macOS 签名待验证。

数据、兼容与验收边界

Desktop schema 48 新增魔法笔记会话来源元数据。升级前应备份完整用户数据, 包括数据库及相邻 notes/ 目录;旧客户端不能打开升级后的数据库。 本次发布准备不修改数据库迁移实现,也不直接改写用户数据库。

Agent 发布工作流以候选 package.json 设置最低 Desktop 版本,因此 Agent 0.15.0 包要求 Desktop 0.15.1;Node、OpenCode、Continue 锁不变。 Agent 与 Desktop 独立发布,Agent 不替代 Desktop Latest。

原生客户端的远程 coordinator、托管标准 Node 交付整合、Continue/OpenCode Ask 内置 MCP 映射及完整跨平台安装包验收仍有缺口,见 原生客户端进度。 本次说明明确标为本地预览,不将这些未完成部分宣称为已提供能力。