diff --git a/docs/development/release-preparation-0.15.0.md b/docs/development/release-preparation-0.15.0.md index ecba8917..be6343a1 100644 --- a/docs/development/release-preparation-0.15.0.md +++ b/docs/development/release-preparation-0.15.0.md @@ -61,6 +61,28 @@ Host Key、加密凭据连接。重新捆绑当前源码的 Agent CLI、daemon 后续均使用等待退出并记录脱敏输出的启动器;本轮探针 Electron 进程已退出。 本地诊断证据在临时 `opencode/release-015-host/`,不提交脚本、日志或凭据。 +## 首次候选 CI 与测试修正 + +用户批准的首次候选 `5a6ba6c14f5c58f3da5e9afe281b18e0cbdb1ae8` +已推送至 `origin/main` 和 `github/main`,未创建两个发布标签。 + +- [Agent CI 36329271991](https://github.com/mesalogo/goodbuddy/actions/runs/36329271991) + 源码验证及 Linux x64、Linux arm64、Darwin arm64 原生构建全部通过。 +- [Desktop CI 36329271967](https://github.com/mesalogo/goodbuddy/actions/runs/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 批准,原发布说明正文保持不变。 + ## 数据、兼容与验收边界 Desktop schema 48 新增魔法笔记会话来源元数据。升级前应备份完整用户数据, diff --git a/docs/quality/recurring-defects.md b/docs/quality/recurring-defects.md index 04ada1db..223124a3 100644 --- a/docs/quality/recurring-defects.md +++ b/docs/quality/recurring-defects.md @@ -43,6 +43,9 @@ main CI `36164698647`:原生能力重试用例在启动状态未稳定时打 是否消除 CI 失败以修复提交的 Linux CI 结果为准。 同日 Windows 全量测试及独立复跑中,Magic Notes 原生拖拽分别停在索引列 168 和 AI 列 280。测试同步原生输入与实际状态后独立复跑通过,保留原有宽度和持久化断言。 +2026-09-27 的 0.15.0 主分支 CI 中,会话采集测试向隐藏 Electron 窗口发送 Escape, +未返回笔记列表。原生键盘辅助函数同样必须显示窗口、取得焦点并等待 +`document.hasFocus()`,再发送输入;不靠跳过 Linux 或关闭沙箱处理。 ## 整窗遮罩与原生拖动区域 diff --git a/src/renderer/src/App.test.tsx b/src/renderer/src/App.test.tsx index 59599189..1f9e0ce5 100644 --- a/src/renderer/src/App.test.tsx +++ b/src/renderer/src/App.test.tsx @@ -13979,7 +13979,7 @@ describe("App", () => { expect(screen.getByLabelText('笔记标题')).toHaveValue('Captured discussion') fireEvent.click(within(screen.getByRole('region', { name: '快速笔记' })).getByRole('button', { name: '加入笔记' })) await waitFor(() => expect(api.magicNotes.create).toHaveBeenCalledWith(expect.objectContaining({ source: expect.objectContaining({ kind: 'conversation', conversationId: conversation.id, messageIds: messages.map(message => message.id) }), content: { version: 1, ops: [{ insert: 'Frozen edited capture\n' }] } }))) - }) + }, 15_000) it('adds an assistant reply to an explicitly selected note and opens the returned entry in the full workspace', async () => { await api.updates!.updateSettings({ magicNotesEnabled: true, magicNoteCommentMode: 'after-save-manual' }) @@ -14075,7 +14075,7 @@ describe("App", () => { fireEvent.click(screen.getByRole('button', { name: '返回原会话' })) expect(await screen.findByRole('button', { name: '原会话已不存在' })).toBeDisabled() expect(screen.getByText('Saved text')).toBeVisible() - }) + }, 15_000) it('guards disabling Magic Notes with an unsaved quick draft before saving application settings', async () => { await api.updates!.updateSettings({ magicNotesEnabled: true }) diff --git a/tests/support/magic-notes-capture-main.ts b/tests/support/magic-notes-capture-main.ts index db53b646..d2acb551 100644 --- a/tests/support/magic-notes-capture-main.ts +++ b/tests/support/magic-notes-capture-main.ts @@ -57,6 +57,10 @@ app.whenReady().then(async () => { await run(`${expression}.click()`) } async function key(keyCode: string): Promise { + win.show() + win.focus() + win.webContents.focus() + await wait('document.hasFocus()', 'native window focus for keyboard input') win.webContents.sendInputEvent({ type: 'keyDown', keyCode }) if (keyCode === 'Enter') win.webContents.sendInputEvent({ type: 'char', keyCode: '\r' }) win.webContents.sendInputEvent({ type: 'keyUp', keyCode })