diff --git a/docs/development/release-preparation-0.15.0.md b/docs/development/release-preparation-0.15.0.md index fcb84478..70ccbe76 100644 --- a/docs/development/release-preparation-0.15.0.md +++ b/docs/development/release-preparation-0.15.0.md @@ -15,6 +15,10 @@ - `FEATURES.md` 与 `FEATURES.zh-CN.md` 已核对本轮能力、限制和候选版本。 - 用户要求两张未跟踪宣传截图保留原位、不提交,打标签前另行处理; 不移动、删除、暂存或更改忽略规则。 +- 2026-09-28 用户更新授权:当前工作区的宣传文档与素材可以一起提交、推送, + 后续候选由代理自行审核确认,不再逐次等待用户批准,继续完成双产品正式发布。 + 三张新增候选图已读取检查,保留原始草稿属性,不冒充正式发布截图或对外媒体发文。 + 发布说明正文保持不变,`releasedAt` 更新为实际准备发布日期 2026-09-28。 ## 本地验证 @@ -113,6 +117,30 @@ Escape 返回列表仍失败,活动历史迁移这次超过默认 5 秒时限 - 本阶段不新增真实模型请求,不改变产品代码或双语说明。 新候选仍须重新批准 SHA 并通过自己的主分支 CI/生产构建,两个标签仍未创建。 +## 后续 CI 焦点前提与确定性取消验证 + +`b8b6007` 的 [CI 36335076841](https://github.com/mesalogo/goodbuddy/actions/runs/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/生产构建通过。 + ## 数据、兼容与验收边界 Desktop schema 48 新增魔法笔记会话来源元数据。升级前应备份完整用户数据, diff --git a/docs/pr-articles/2026-09-26-unreleased/article.md b/docs/pr-articles/2026-09-26-unreleased/article.md index 943f020d..d8b5b50d 100644 --- a/docs/pr-articles/2026-09-26-unreleased/article.md +++ b/docs/pr-articles/2026-09-26-unreleased/article.md @@ -1,14 +1,14 @@ -# GoodBuddy 更新:工作回顾、可追溯图谱与远程对话恢复 +# GoodBuddy 更新:故事图谱、Obsidian接入、Runtime原生终端 -> **编辑标注说明(对外发布前删除):** 本稿汇总桌面版 0.13.8 至 0.13.16 的变化,另在末尾标出 0.13.16 之后已提交、尚未归入发布版本的修复。“待补图”表示尚未取得素材,“待替换”表示发布信息未核验,“待核对”表示发布前需要确认的行为。本文是宣传草稿,尚未对外发布。 +> **编辑标注说明(对外发布前删除):** 本稿汇总桌面版 0.13.8 至 0.13.16,以及此后截至 `0f8bf40` 的已提交变化,更新于 2026-09-27。所述功能与修复均已开发完成并提交;0.13.16 之后的内容,其发布版本待确认。“待补图”表示缺少可发布素材,“待替换”表示发布信息未核验,“待核对”表示发布前需要确认的行为。本文是宣传草稿,尚未对外发布。 -GoodBuddy 新增了监督者工作回顾:选择一个项目或一段时间,整理讨论过的事情、进展和未解决事项,再沿着图谱查看原始依据。这轮更新还加入模型连接复制、Mermaid 图表导出,并改善了待办浏览、长对话运行记录和远程会话恢复。 +GoodBuddy 这一轮更新围绕工作记录的整理与使用展开:监督者按项目回顾进展,并通过图谱保留结论依据;新加入的笔记连接支持保存聊天正文、返回原会话,以及在聊天中读写本机 Obsidian 笔记。本地项目还可以从输入区打开 Continue、OpenCode 原生终端或 DS Web 客户端,沿用当前项目与模型配置。 本文接续上一份画布笔记与文档处理更新稿,覆盖 0.13.8 起的实际增量。远程项目建议先升级桌面,再将 Host 环境更新至 Agent 0.13.4,以获得本文涉及的远程完成状态和旧进程清理修复。 -> **【待替换 R01|版本与体验入口】** 对外发布前核验目标桌面安装包、发布日期、下载地址和完整更新日志链接,并在此补入。当前正式 tag 核查截至 `v0.13.16`;末尾开发中补充依据提交 `5116613`,目标版本未定。不能仅因 tag 存在就写“所有平台已可下载”;也不要推测下一版本号。桌面 0.13.14 的发布失败后由 0.13.15 承接,不将其列为成功发布的独立版本。 +> **【待替换 R01|版本与体验入口】** 对外发布前核验目标桌面安装包、发布日期、下载地址和完整更新日志链接,并在此补入。已核查正式版本截至 `v0.13.16`;后续已提交内容固定至 `0f8bf40`,本轮增量为 `5116613..0f8bf40`。工作区中的 0.15.0 发布准备尚未提交,不作为发布依据。桌面 0.13.14 的发布失败后由 0.13.15 承接。 -**从较早版本升级前,请先关闭应用并备份完整用户数据。** 数据库和相邻的 `notes/` 目录需要成套保留;旧客户端不能直接打开升级后的数据库。0.13.15 升至 0.13.16 本身不再提高数据库格式版本,但从前面的版本跨版本升级仍可能需要转换数据。 +**升级前,请先关闭应用并备份完整用户数据。** 数据库和相邻的 `notes/` 目录需要成套保留。本稿中的聊天采集功能将数据库格式升至 48,用于保存笔记来源;升级后旧客户端不能直接打开该数据库,回退需要升级前的备份。 ## 新增功能 @@ -38,6 +38,44 @@ GoodBuddy 新增了监督者工作回顾:选择一个项目或一段时间, 这两种后续操作目前适合短摘要:继续讨论的最终内容最多 12,000 字符,知识实体描述最多 2,000 字符。固定任务没有关联会话时,不能直接发送继续讨论。后续对话沿用目标会话的模型和工作模式。 +### 聊天正文存入魔法笔记,并保留来源 + +遇到值得保留的回答,可以点击助手消息旁的“加入笔记”,预览并编辑文字,再追加到已有笔记,或新建笔记保存。需要保留整段讨论时,会话菜单中的“保存当前对话到笔记”会读取完整历史,收录用户与助手的正文,不局限于屏幕上已经显示的消息。 + +保存后的记录带有“来自会话”入口。单条回答可以返回对应消息;原会话或消息被删除后,已保存的笔记内容仍保留。每次采集新增一条记录,后续对话修改不会自动同步到笔记。 + +“快速笔记”入口和工作栏“+ → 笔记”可以打开紧凑面板,在聊天旁搜索笔记标题与正文、浏览摘要、追加文字。切换项目或会话时草稿保留,关闭有未保存内容的面板前会提示;草稿仅在本次应用运行期间保留。画布、待办和完整编辑继续在魔法笔记工作区中使用。 + +采集保存文本与 Markdown,不复制推理过程、工具日志或附件图片。生成中的回答暂不可采集,单条记录上限为 500 KiB,超限会提示缩减。采集本身无需调用模型;保存后自动评论仍按已有设置执行。笔记继续属于全局,来源项目只用于帮助回看。 + +> **【待补图 06|必补|聊天采集与来源返回】** 用公开演示对话预览并保存一条回答,展示笔记记录中的来源入口,再验证能返回原消息。计划文件:`assets/06-chat-note-source.png`。 +> +> 建议图注:把有用的回答存入笔记,需要上下文时返回原会话。 + +### 在聊天中查找和整理 Obsidian 笔记 + +已有 Obsidian 笔记可以直接接入 GoodBuddy。在“设置 → 能力与工具 → MCP”的 Obsidian 卡片中,选择本机已注册的仓库,或限定一个文件夹,测试连接并保存,然后启用并分配给所用 Runtime。无需启动 Obsidian,也无需额外安装 Obsidian 插件或配置 REST 服务。 + +接入后,可以请助手查找笔记、读取内容,或将讨论结果写回仓库;也支持追加、局部修改、目录浏览,以及标签和属性操作。笔记仍保存在原仓库,不会自动复制成 GoodBuddy 知识库。 + +目前支持直连模型及 GoodBuddy 管理的本机 OpenCode、Continue 聊天,默认关闭;DeepSeek Harness 和远程执行暂不支持。Ask 只读,Execute 可写入;多仓库调用需要明确目标仓库。接入本机文件不等于离线推理,读出的内容会随当前会话交给所选模型处理。 + +> **【待补图 07|建议|Obsidian 接入与读写】** 已有候选 `obsidian.png` 展示仓库范围和 Runtime 分配,尚需确认构建来源;正文主图优先补公开笔记的搜索、写入与回读结果。计划文件:`assets/07-obsidian-notes.png`。 +> +> 建议图注:按仓库范围接入本机 Obsidian,在聊天中查找笔记并保存整理结果。 + +### 从输入区打开本地原生客户端 + +本地项目选择 Continue 或 OpenCode 后,输入框下方可以打开工作栏内的原生交互终端;选择 DS 后,可以在系统默认浏览器中打开官方 DeepSeek Harness Web 客户端。启动时沿用当前项目目录与所选模型,适合希望使用 Runtime 自身交互界面的用户。 + +原生客户端使用独立会话,不会自动接续或同步 GoodBuddy 中的聊天历史。DS 网页关闭后,本地服务继续运行,可以回到 GoodBuddy 重新打开或停止;退出应用会清理所属服务。 + +当前入口支持本地项目,远程原生客户端尚未接通。Continue 与 DS Web 需要可用的标准 Node 环境,首次准备环境可能需要下载。Ask 与 Execute 仍有工具权限区别,Continue、OpenCode 原生客户端在 Ask 下暂不接入 MCP 工具。 + +> **【待补图 08|建议|原生终端与 DS Web】** 已有 `continue.png`、`opencode.png`、`deepseekweb.png` 候选;发布前确认构建来源,并处理本机路径、浏览器书签及与演示无关的会话。Continue 图含模型能力警告,建议换用合适模型重拍;不能据启动画面宣称完整对话验收通过。计划文件:`assets/08-native-clients.png`。 +> +> 建议图注:在工作栏打开原生终端,或在系统浏览器中使用 DS Web 的独立会话。 + ### 复制模型连接,保留已有配置 在“设置 → 模型连接”中打开一条 LLM 连接,点击“复制”,即可在副本中修改模型名称、地址或其他选项,再保存为新连接。协议、请求定制和认证配置随副本带入,已保存的 API Key 无需重新输入。 @@ -56,6 +94,18 @@ GoodBuddy 新增了监督者工作回顾:选择一个项目或一段时间, ## 功能改进 +### 知识库文档与来源集中浏览 + +知识库将内容来源与文档索引合并为统一列表。单文档来源合成一行,目录继续按组展示,导入失败、尚未生成文档的来源也保留恢复入口。搜索可以同时查找来源与文档,网址来源保留原网址,便于辨认同名资料。 + +列表突出查看入口,打开原文、分块管理、重新解析等操作收进更多菜单。解析结果页也整理了返回导航和图片操作,减少长名称、多个按钮挤在一行的情况。 + +任务历史改为按批次展示,可以展开处理步骤,查看进行中、失败与历史记录。筛选与计数跟随当前文档或来源,便于检查一次导入的处理情况。 + +### 图谱按事件、实体和关系切换 + +故事线图谱侧栏将原来上下堆叠的列表改为“事件、实体、关系”页签,各自显示数量并独立滚动。切换页签保留已有选中对象,在画布选中对象时,侧栏会切到对应类别,查看关联信息时少一些来回滚动。 + ### 自动监督与手动回顾分开管理 原有的每日、每周计划现在集中到“自动监督”。新建或编辑计划时,可以选择全局或多个项目,设置时间、时区、回顾窗口和历史保留期限;暂停的计划在编辑保存后仍保持暂停。 @@ -78,7 +128,7 @@ GoodBuddy 新增了监督者工作回顾:选择一个项目或一段时间, > > 建议图注:从活动记录查看处理阶段与已保存批次,展开核对来源。 -> **【待核对 C01|暂停与取消的版本差异】** `v0.13.16` 支持主动暂停和失败续跑,但活动页“继续”后的同卡片暂停控件仍有可用性缺口。`5116613` 修复该问题并增加取消入口,见末尾开发中补充。截图与最终文案必须对应同一版本,不能把后续控件标成 0.13.16 已有。 +> **【待核对 C01|暂停与取消的版本差异】** `v0.13.16` 支持主动暂停和失败续跑,但活动页“继续”后的同卡片暂停控件仍有可用性缺口。`5116613` 修复该问题并增加取消入口,见末尾“回顾运行期间的控制”。截图与最终文案必须对应同一版本,不能把后续控件标成 0.13.16 已有。 分页和批次记录便于核查处理范围,模型给出的总结、实体和关系仍需人工判断;来源处理完成不代表每个事实都被模型准确理解。 @@ -135,9 +185,19 @@ Host 更新还会清理已确认停用的旧 Agent 程序和归属明确的孤 - 纯文本排队消息不再显示无效的“查看附件”按钮;浏览器页签关闭失败后重试成功,会清除残留错误。 - 监督反馈显示会话或任务名称,固定与刷新按钮在窄侧栏中排列更紧凑。工作回顾和活动页使用可用宽度,运行阶段与已保存批次更醒目。 -### 开发中补充:回顾运行期间的控制 +### 运行配置与界面修复 -> **【待替换 R02|尚未发布的修复】** 以下仅对应 `5116613`,不属于 `v0.13.16`。正式发布前核验其归属版本和安装包,届时合并到上文对应段落并删除本提示;若只发布截至 0.13.16 的文章,则移除本小节。 +- 修复 Continue 禁用自动更新后仍显示“Checking for updates”的问题,避免空闲终端显示误导性的更新状态。 +- 补齐 DS Web、远程 Runtime 和模型桥辅助进程启动时的遥测关闭配置;模型、MCP 和用户主动发起的联网请求保持可用。远程改动需对应 Agent 更新,不能视为现有 Agent 0.13.4 已包含。 +- 修复知识库不同来源的操作相互阻塞,以及多文档来源中任务范围、筛选计数不一致的问题。 +- 修复深浅主题中危险操作按钮、禁用状态、控件边框和键盘焦点显示不一致的问题,包括放弃笔记草稿的确认框。 +- MCP 编辑器和图片预览可以在父弹窗上正常操作;项目弹窗的 Escape 只处理当前弹窗,帮助层覆盖浏览器时不再被原生页面遮挡。 +- HTML 全屏预览恢复键盘进入与 Escape 返回,继续保持原有沙箱限制。 +- 窄工作栏的添加按钮不再被滚动箭头遮挡,模型连接协议文字保持可读;DS 入口移除常驻说明,重新打开和停止服务操作继续保留。 + +### 回顾运行期间的控制 + +> **【待替换 R02|发布版本归属】** 正式发布前统一核验 0.13.16 之后已完成的功能与修复是否进入目标版本和安装包。回顾控制依据 `5116613`,本轮新增依据 `5116613..0f8bf40`;两者均不能标成 `v0.13.16` 已有。 回顾运行期间,范围、时间选择和刷新入口继续可用;修改选择不会改变已经启动的回顾。重复点击发起按钮会提示已有运行,避免同时创建重叠回顾。 diff --git a/docs/pr-articles/2026-09-26-unreleased/deepseekweb.png b/docs/pr-articles/2026-09-26-unreleased/deepseekweb.png new file mode 100644 index 00000000..63b655d4 Binary files /dev/null and b/docs/pr-articles/2026-09-26-unreleased/deepseekweb.png differ diff --git a/docs/pr-articles/2026-09-26-unreleased/obsidian.png b/docs/pr-articles/2026-09-26-unreleased/obsidian.png new file mode 100644 index 00000000..32a50697 Binary files /dev/null and b/docs/pr-articles/2026-09-26-unreleased/obsidian.png differ diff --git a/docs/pr-articles/2026-09-26-unreleased/review.md b/docs/pr-articles/2026-09-26-unreleased/review.md index 2ddd81e2..0e0fa2fd 100644 --- a/docs/pr-articles/2026-09-26-unreleased/review.md +++ b/docs/pr-articles/2026-09-26-unreleased/review.md @@ -1,5 +1,84 @@ # 0.13.8 起综合宣传稿核查记录 +## 2026-09-28 发布候选归档 + +- 用户授权将当前工作区宣传文档与素材一并提交、推送,并由代理自行审核后继续 + Desktop/Agent 0.15.0 发布,不再逐次等待提交确认。 +- 下方 2026-09-27 记录及正文中的 `0f8bf40` 截止点保留为当时的内容核查截面, + 其中“发布准备未提交”“Agent 实机未完成”等是历史状态,不代表当前发布进度。 + 当前候选、实机与 CI 结果以 [0.15.0 发布准备记录](../../development/release-preparation-0.15.0.md) + 和两个独立发布渠道为准,正式版本未完成公开核验前不宣称已经发布。 +- 新增候选 `deepseekweb.png`、`obsidian.png`、`storygraph.png` 已逐张检查, + 未发现可见 API Key、密码或令牌。原图按用户授权归档,不裁切或改写; + DS 图仍有本机用户名、路径和浏览器书签,图谱包含既有会话摘要, + 不能直接当作隔离公开演示素材。正式宣传配图仍遵循下方素材核验及重拍要求。 +- 本次提交原始候选素材不等于确认其构建 SHA,也不授权发布文章到外部媒体。 + 不因候选截图归档宣称跨平台安装包或完整对话验收通过。 + +## 2026-09-27 增量更新 + +本节为最新核查结论;下方首次核查记录保留历史语境,其中截止点、schema 和截图缺口以本节更新为准。 + +- 用户要求检查“上一次到目前最新提交中间的功能更新”,并更新已有草稿;沿用已确认的综合稿结构,直接补充。 +- 上次截止 `51166136157a646530e1ad9f6a0242c1c6390e95`;本轮固定至 `0f8bf405db7ca21a85cc70009ad083eb837e1e03`,共 17 个提交。全文总范围为 `v0.13.7..0f8bf40`。 +- 目标提交没有 tag;已核查正式版仍截至 `v0.13.16`。用户确认所述功能均已开发完成,正文已去除开发状态标签;后续已提交功能只保留发布版本待确认的说明。工作区的 `package.json`、锁文件、Agent Runtime 锁、功能矩阵和未跟踪 `release-preparation-0.15.0.md` 不作为已发布依据,也未修改。 +- 选题:保留工作回顾主线,新增聊天采集、Obsidian 与原生客户端三个独立使用场景;知识库统一列表和图谱页签归入改进;运行配置和交互问题归入修复。按用户要求,打包类修复只保留内部核查依据,不进入宣传正文。标题随覆盖范围更新。 +- `1094433` 将数据库格式升至 48。正文已替换仅适用于 0.13.15→0.13.16 的升级说明,明确完整备份和旧客户端回退限制。 + +### 本轮完整盘点 + +下表“实现”只指进入固定提交。逐项依据提交 diff、生产实现和已提交的功能记录;本轮未执行产品测试、打包、真实模型调用或远程 Host 验收。 + +| 内容 | 分类与入口 | 功能与边界 | 提交及证据 | +| --- | --- | --- | --- | +| 本机 Obsidian 接入 | 新增/设置→能力与工具→MCP | 注册仓库发现、指定文件夹、独立测试与保存、开关和 Runtime 分配;搜索、读取、写入、追加、局部修改等。默认关闭;直连模型及受管理本机 OpenCode/Continue 支持,DSH 与远程不支持;Ask 只读、Execute 可写;不是知识库复制或同步 | `55efca3`;`src/main/obsidian/obsidian-service.ts`、`src/shared/obsidian-tools.ts`、[Obsidian 进度](../../features/obsidian/progress.md) | +| 聊天采集到魔法笔记 | 新增/助手消息、会话菜单 | 单条助手正文或完整会话用户/助手正文,预览编辑、追加或原子创建笔记;保留来源回跳,源删除后内容保留;不复制工具日志/附件,单记录 500 KiB,生成中不可采集 | `1094433`;`App.tsx`、`ChatTimeline.tsx`、`magic-notes-contracts.ts`、[笔记进度](../../features/magic-notes/progress.md) | +| 快速笔记与草稿 | 新增/快速笔记、工作栏“+” | 标题/正文搜索、摘要、文字追加;切项目/会话保留草稿,关闭/替换/禁用有确认,重启不恢复;仍是全局笔记,完整画布/待办编辑在工作区;采集本身不调模型,自动评论沿用设置 | `1094433`;`MagicNotesPanel.tsx`、`MagicNoteSource.tsx`、`use-magic-note-draft.tsx` | +| 来源存储升级 | 兼容性/启动 | schema 48 保存来源元数据,不改写文件化正文;旧客户端不能直接打开升级数据库 | `1094433`;`assistant-database.ts`、笔记技术设计 | +| 本地原生客户端 | 新增/聊天输入区 | Continue/OpenCode 工作栏终端、DS 系统浏览器 Web;沿用项目与模型,独立历史;DS 可复用、重开、停止,关闭网页不停止服务。远程协调入口未接通;Continue/DS 需标准 Node,托管准备可能联网;Continue/OpenCode 原生 Ask 暂无 MCP | `f81f342`;`native-client-coordinator.ts`、`native-terminal-client.ts`、`native-dsh-web-client.ts`、[客户端方案](../../features/assistant-workbar/runtime-native-client-proposal.md) | +| DSH 依赖升级 | 新功能配套/内部版本 | DSH 0.1.7-rc.2、Cordis 4.0.4;不把依赖版本当模型名或稳定版承诺,正文并入原生客户端 | `f81f342`;提交中的 package/锁文件 | +| 知识库统一列表 | 改进/知识库文档页 | 单文档来源合行、目录分组、失败来源保留、来源与文档统一搜索、紧凑拖放区域;归属语义不改变 | `5177b47`;`knowledge-workspace/DocumentsView.tsx`、[知识库界面](../../features/knowledge-base/ui-design.md) | +| 文档操作及任务批次 | 改进兼修复/列表、解析预览、任务页 | 保留 URL,突出查看与更多菜单,解析结果导航和图片操作归位;按批次展开历史,计数/筛选跟随对象;多文档来源范围修正,不同来源操作不互相阻塞 | `ceb275b`、`67dedc2`;`DocumentsView.tsx`、`KnowledgeTasksView.tsx`、`DocumentResultPreview.tsx` | +| 图谱侧栏页签 | 改进/故事线图谱 | 事件、实体、关系计数与独立滚动,切页签保留选择,画布选中联动类别;没有新增图谱导出或回放 | `40c108d`;`SupervisorWorkspace.tsx` | +| 遥测配置传播 | 修复/启动 | 补到 DS Web、远程 Runtime、模型桥 helper;不影响主动联网,不是新设置页或无联网保证;对应 Agent 发布归属待定,不能归给 Agent 0.13.4 | `eb53c82`;`runtime-privacy-environment.ts`、Agent profile/helper | +| Continue 更新状态 | 修复/原生终端 | 禁用更新时更新服务不再发出检查状态;不称终端卡死已修复,不涉及关闭桌面更新 | `0f0b6ac`;`continue-host-adapter.ts` | +| DS Web portable 依赖 | 内部维护/不进入宣传正文 | 修正 CLI、嵌套依赖和 Web 资源复制,新增 CLI 入口存在性检查;仅保留核查依据,未据此宣称最终包完整验证 | `5ecc19d`;`build/native-dsh-resources.cjs`、`build/build-portable.cjs`、package 复制规则与测试 | +| 控件、弹层与窄布局 | 修复/多页面 | 危险按钮、深浅主题、禁用与焦点、Continue 字段;MCP/图片嵌套弹层可交互、项目 Escape 范围、帮助与原生浏览器遮挡;HTML 键盘与 Escape;工作栏添加按钮和模型协议文字 | `8b15399`、`11facf0`、`2713a81`;`styles.css`、`dialog-focus.ts`、`StaticHtmlPreview.tsx`、`WorkbarShell.tsx`、[弹层复核](../../quality/overlay-review-2026-09-27.md) | +| DS 输入区精简 | 改进/输入区 | 删除常驻独立会话/服务说明,保留重开与停止;正文合入界面调整,实际生命周期照实说明 | `0f8bf40`;`RuntimeNativeClientActions.tsx` | +| IPC 与聊天组件抽取 | 维护/不单独宣传 | 模型设置 IPC、聊天历史组件及文档归属说明;不当作新增用户功能 | `4edf06b`、`44cd944`;`model-settings-ipc.ts`、`ChatHistoryPane.tsx` | +| 导航测试修正及文章素材 | 维护/不单独宣传 | 嵌套页签断言修正;上一稿提交及 Continue/OpenCode 图片入库 | `4a2986c`、`11facf0`、`5ecc19d` | + +### 验证证据与限制 + +- Obsidian 已提交记录包含 Windows Electron 设置操作、本机 OpenCode/Continue 读写及解包应用连接验证;未扩大为所有平台安装包或物理断网通过。 +- 聊天采集记录包含真实 App/Preload/IPC/SQLite、502 条历史、来源回跳、214px 面板输入和源删除保留;502 是样例,非产品上限。schema 和正文容量另查契约。 +- 原生客户端有本地真实模型历史证据,但部分组件/IPC 使用测试模拟;Continue 后续记录有完整 Windows 生产 App 操作。DS 正常 UI、最终 portable 和跨平台整体验收不能据此视为全通过。部分历史模型验证有 TLS override,不作为严格 TLS 验证证据。 +- 遥测修复有 16 项定向测试记录,修改后的 Agent 实机与后台联网监测尚未完成;DS 打包有 3 项复制规则回归,非最终包真实对话。 +- `2713a81` 全量记录为 5309 通过、3 失败、83 跳过;项目焦点修正后定向 331 通过,其余两个 HeartbeatCenter 断言由 `4a2986c` 修正,后续 96 项通过及 typecheck/lint 通过。最终固定提交未重跑全量,不能合写为全量全绿。 +- 知识库有定向及 Electron 布局回归,真实导入/解析链路未在对应改动轮重跑。历史证据详见[知识库进度](../../features/knowledge-base/progress.md)、[工作栏进度](../../features/assistant-workbar/progress.md)、[控件与响应式复核](../../quality/responsive-controls-review-2026-09-27.md)。 + +### 配图更新 + +已逐张读取四张现有图片,未改动或裁切原文件;`continue.png`、`opencode.png` 已由 `5ecc19d` 跟踪,`obsidian.png`、`deepseekweb.png` 是用户工作区未跟踪素材。图片只作候选,尚未绑定可核验构建 SHA,因此未直接作为最终配图插入正文。本轮没有新拍截图,也没有将上一轮构建检查结论冒称为本轮重新验证。 + +| 编号 | 内容与路径 | 最新状态 | +| --- | --- | --- | +| 01–05 | 原工作回顾、来源、图表、批次、待办图 | 仍待补,原计划保留;最终截图需反映最新图谱页签 | +| 06 | 聊天采集与来源返回;`assets/06-chat-note-source.png` | 必补;现有四张图均不能证明该流程 | +| 07 | Obsidian;候选 `obsidian.png`,计划 `assets/07-obsidian-notes.png` | 建议;现图设置可读、浅色中文,能展示范围和分配,不能证明读写结果;需核验构建来源或补拍公开示例 | +| 08 | 原生客户端;候选 `continue.png`、`opencode.png`、`deepseekweb.png`,计划 `assets/08-native-clients.png` | 建议;前两张展示工作栏终端并含本机路径及聊天;Continue 有模型能力警告;DS 图含书签、头像和本机用户路径。发布前重拍或生成明确标注的脱敏副本,并确认构建来源 | +| R01/R02/C01 | 最终版本、后续提交的发布归属、回顾控件 | 仍待最终安装包核验;R02 覆盖 0.13.16 之后已完成的功能与修复 | + +### 本轮交付检查 + +仅更新正文、核查记录和索引;产品测试、构建、新截图及真实模型调用为 0。 + +- Python 3.13.13 执行 deai-writing 扫描:阻断项 0、复核项 16、读取错误 0。按命中行逐条核对:15 项为发布状态、功能范围、升级或取消语义等必要限定,1 项是“模型准确理解”的能力边界表述,保留。 +- 独立只读复核未发现重大事实过度宣称、版本混淆或前后矛盾;新增 8 个相对 Markdown 链接目标均存在,图 06–08 的编号、场景、文件名与优先级对应,R01/R02/C01 和索引一致。 +- 四张候选素材均已打开审阅;没有插入不存在的计划图片链接,没有把启动界面当作完整流程验收。 +- `git diff --check -- docs/pr-articles` 通过,仅提示既有 LF→CRLF 行尾策略。完成时再次确认 HEAD 仍为 `0f8bf405db7ca21a85cc70009ad083eb837e1e03`。 +- 未提交 Git、打 tag 或对外发布;既有版本准备与图片文件保持原状。 + ## 状态与范围 - 状态:草稿,未对外发布,截图待补。首次建档与检查日期:2026-09-26。 @@ -117,7 +196,7 @@ | 04 | 必补 | 同一回顾的阶段与保存批次;`assets/04-review-progress.png` | blocked:同上,区分 0.13.16 与后续取消控件 | | 05 | 建议 | 虚构笔记待办调宽与折叠;`assets/05-note-todos.png` | blocked:同上 | | R01 | 必填 | 最终版本、下载、日期、完整更新说明 | 尚未在线核验,不编造 | -| R02 | 必处理 | 5116613 的最终归属 | 已提交但未归入目标 tag;发布前合并或移除开发中小节 | +| R02 | 必处理 | 5116613 的最终归属 | 已提交但未归入目标 tag;发布前核验对应版本并处理小节中的编辑提示 | | C01 | 必核对 | 续跑期间暂停与取消控件版本 | 保留具体差异,待匹配最终安装包 | 取得可核验产物后的步骤:在本轮独立临时目录建立 Node supervisor 与 Electron bootstrap,ready 前隔离 userData/sessionData,通过生产 Main/Preload/Renderer 启动;正常 UI 创建虚构项目、消息、任务和笔记。回顾演示仅发送所需最小模型请求并从实际请求边界计数。检查保存与重新打开、对象来源、暂停续跑后,逐张 capturePage 并打开审阅,确认无私人资料、裁切、错误状态;只归档实际采用图片,停止本次进程并清理演示 profile。 diff --git a/docs/pr-articles/2026-09-26-unreleased/storygraph.png b/docs/pr-articles/2026-09-26-unreleased/storygraph.png new file mode 100644 index 00000000..217e50ec Binary files /dev/null and b/docs/pr-articles/2026-09-26-unreleased/storygraph.png differ diff --git a/docs/pr-articles/README.md b/docs/pr-articles/README.md index 552401f8..ae684d2a 100644 --- a/docs/pr-articles/README.md +++ b/docs/pr-articles/README.md @@ -386,4 +386,4 @@ Agent 专题使用对应的 `agent-v…` tag。 | 日期 | 目标 tag | 标题 | 状态 | 正文 | 发布链接 | | --- | --- | --- | --- | --- | --- | | 2026-09-19 | 未确定(unreleased) | GoodBuddy 更新预览:画布笔记、文档处理与应用管理 | 草稿,截图待补 | [综合更新稿](./2026-09-19-unreleased/article.md) | 未发布 | -| 2026-09-26 | 未确定;汇总 v0.13.8–v0.13.16,另列 5116613 未发布补充 | GoodBuddy 更新:工作回顾、可追溯图谱与远程对话恢复 | 草稿,截图待补 | [综合更新稿](./2026-09-26-unreleased/article.md) | 未发布 | +| 2026-09-26(09-27 更新) | 未确定;汇总 v0.13.8–v0.13.16 及此后至 0f8bf40 的已完成、已提交内容 | GoodBuddy 更新:故事图谱、Obsidian接入、Runtime原生终端 | 草稿,已有候选素材,配图与发布信息待核验 | [综合更新稿](./2026-09-26-unreleased/article.md) | 未发布 | diff --git a/docs/quality/recurring-defects.md b/docs/quality/recurring-defects.md index 3e9ebbe2..d4642fe9 100644 --- a/docs/quality/recurring-defects.md +++ b/docs/quality/recurring-defects.md @@ -49,6 +49,10 @@ AI 列 280。测试同步原生输入与实际状态后独立复跑通过,保 随后 Linux CI 与共享 Host 的实测表明窗口焦点并不足够:缩窄窗口会收起工作栏, 隐藏面板仍有非零宽度,Escape 实际发给工作栏开关。测试须等待响应式状态完成, 按真实入口重新打开工作栏,并确认目标输入框取得焦点,再测试键盘返回和导航。 +验证输入框自动聚焦时,Electron 测试窗口也应从开始即显示并取得焦点,不要到后续 +键盘阶段才显示;失败信息应包含实际焦点、输入框禁用/可见状态及保存状态。 +取消边界测试不使用 `setTimeout(0)` 猜测异步 I/O 的完成次序。Continue 启动前取消 +用例改在既有启动环境回调处触发中止,仍断言未启动子进程及临时配置清理。 ## 整窗遮罩与原生拖动区域 diff --git a/resources/release-notes.json b/resources/release-notes.json index 6ed7e0e9..41499790 100644 --- a/resources/release-notes.json +++ b/resources/release-notes.json @@ -3,7 +3,7 @@ "releases": [ { "version": "0.15.0", - "releasedAt": "2026-09-27", + "releasedAt": "2026-09-28", "notes": { "zh-CN": { "highlights": [], diff --git a/src/main/agent/continue-host-adapter.test.ts b/src/main/agent/continue-host-adapter.test.ts index c8beee44..318d7ecb 100644 --- a/src/main/agent/continue-host-adapter.test.ts +++ b/src/main/agent/continue-host-adapter.test.ts @@ -319,6 +319,11 @@ describe('ContinueHostAdapter', () => { it('removes capability config when cancellation reaches the pre-spawn check', async () => { const distribution = await createDistribution() const launchHost = vi.fn() + const controller = new AbortController() + const launchEnvironmentProvider = vi.fn(() => { + controller.abort(new Error('cancelled')) + return {} + }) const adapter = new ContinueHostAdapter({ binaryPath: distribution.entryPath, configPath: '', @@ -326,6 +331,7 @@ describe('ContinueHostAdapter', () => { cacheRoot: distribution.cacheRoot, trustedBundleHashes: [distribution.sourceHash], launchHost, + launchEnvironmentProvider, modelProfile: { id: '00000000-0000-4000-8000-000000000098', name: 'Local model', @@ -335,7 +341,6 @@ describe('ContinueHostAdapter', () => { authentication: 'none' } }) - const controller = new AbortController() const pending = adapter.run( 'search', controller.signal, @@ -348,9 +353,8 @@ describe('ContinueHostAdapter', () => { } } ) - setTimeout(() => controller.abort(new Error('cancelled')), 0) - await expect(pending).rejects.toThrow('cancelled') + expect(launchEnvironmentProvider).toHaveBeenCalledOnce() expect(launchHost).not.toHaveBeenCalled() await expect(readdir(distribution.cacheRoot)).resolves.not.toEqual( expect.arrayContaining([ diff --git a/tests/support/magic-notes-capture-main.ts b/tests/support/magic-notes-capture-main.ts index 8b8c644a..32807469 100644 --- a/tests/support/magic-notes-capture-main.ts +++ b/tests/support/magic-notes-capture-main.ts @@ -13,7 +13,7 @@ const directory = process.env.GB_CAPTURE_DIRECTORY! app.setPath('userData', join(directory, 'profile')) app.whenReady().then(async () => { - const win = new BrowserWindow({ show: false, width: 1280, height: 900, webPreferences: { + const win = new BrowserWindow({ show: true, width: 1280, height: 900, webPreferences: { sandbox: true, contextIsolation: true, nodeIntegration: false, backgroundThrottling: false, preload: join(directory, 'preload.cjs') } }) @@ -46,7 +46,16 @@ app.whenReady().then(async () => { if (await run(script)) return await new Promise(resolve => setTimeout(resolve, 50)) } - throw new Error(`Timed out: ${label}`) + const focus = await run(`(() => { + const title = document.querySelector('#compact-note-title'); + const active = document.activeElement; + return { documentFocused: document.hasFocus(), activeId: active?.id, + activeTag: active?.tagName, activeLabel: active?.getAttribute('aria-label'), + titlePresent: Boolean(title), titleDisabled: title?.disabled, + titleVisible: title?.checkVisibility(), titleInert: Boolean(title?.closest('[inert]')), + saving: document.querySelector('.magic-note-panel')?.getAttribute('aria-busy') }; + })()`) + throw new Error(`Timed out: ${label}; focus=${JSON.stringify(focus)}`) } function button(name: string, root = 'document'): string { return `[...${root}.querySelectorAll('button,[role="menuitem"]')].find(e => (e.getAttribute('aria-label') || e.textContent.trim()) === ${JSON.stringify(name)} && e.getClientRects().length)` @@ -71,6 +80,9 @@ app.whenReady().then(async () => { let closed = false try { await win.loadURL(process.env.GB_CAPTURE_URL!) + win.focus() + win.webContents.focus() + await wait('document.hasFocus()', 'visible capture window focus') await wait('document.body.innerText.includes("CAPTURE_HISTORY_501_END")', 'App persisted history') assert.equal(await run('document.body.innerText.includes("CAPTURE_HISTORY_0_END")'), false, 'old history must initially be folded') // The last assistant reply is rendered by the real ChatTimeline.