2 Commits
Author SHA1 Message Date
mesalogo 9773f3ceb4 docs: complete 0.10.1 recovery notes
Cross-platform packages / Validate source (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 Release (push) Canceled after 0s
The cumulative recovery notes carried the failed 0.10.0 content forward but did not yet mention the user-visible Magic Notes loading-state correction. Include that behavior in both languages without adding another item or retaining a duplicate 0.10.0 entry.
2026-08-17 14:01:02 +08:00
mesalogo 47214ef87f fix: distinguish Magic Notes loading state
Cross-platform packages / Validate source (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 Release (push) Canceled after 0s
The AI comments pane reused its final empty-state title while the selected note detail was still loading. Slow CI runners could therefore satisfy the title wait before the final hint existed, causing the immutable v0.10.0 release validation to fail repeatedly.

The pane now presents a distinct loading state until note data is ready, and regression coverage controls the delayed detail response before asserting the final empty state. Recovery metadata moves the unpublished 0.10.0 notes forward to 0.10.1 so upgrading users see the cumulative release once.

Release note: 魔法笔记的 AI 评论区在笔记详情加载期间会明确显示加载状态,不再短暂显示空评论提示。
2026-08-17 13:54:12 +08:00
6 changed files with 44 additions and 14 deletions
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "goodbuddy",
"version": "0.10.0",
"version": "0.10.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "goodbuddy",
"version": "0.10.0",
"version": "0.10.1",
"license": "0BSD",
"dependencies": {
"@agentclientprotocol/sdk": "0.25.1",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "goodbuddy",
"version": "0.10.0",
"version": "0.10.1",
"private": true,
"description": "Secure desktop AI workspace with controlled Agent Runtimes",
"desktopName": "GoodBuddy",
+5 -5
View File
@@ -2,12 +2,12 @@
"formatVersion": 1,
"releases": [
{
"version": "0.10.0",
"version": "0.10.1",
"releasedAt": "2026-08-17",
"notes": {
"zh-CN": {
"highlights": [
"0.10.0 重点完善多 Runtime 工作流。OpenCode、Continue 和 DeepSeek Harness 的能力、MCP、插件与上下文管理现在可以在 GoodBuddy 内统一查看和配置,长对话、多会话和任务通知也更加连贯。"
"0.10.1 重点完善多 Runtime 工作流。OpenCode、Continue 和 DeepSeek Harness 的能力、MCP、插件与上下文管理现在可以在 GoodBuddy 内统一查看和配置,长对话、多会话和任务通知也更加连贯。"
],
"features": [
"**Runtime 能力概览。** 切换 Runtime 或排查不可用工具,设置页会展示内置 OpenCode、Continue 和 DeepSeek Harness 实际提供的 Agents、Tools、Commands、Rules、Prompts、Skills、MCP 等能力,并提供 Runtime 默认项与上下文压缩配置。",
@@ -24,7 +24,7 @@
"**DSH 插件与 MCP 稳定性。** 多个 DSH 插件共同运行、MCP 返回大量分页工具,启动、取消和退出依然可靠;单个插件失败会被隔离,循环游标和未释放会话也会得到处理。",
"**设置界面一致性。** DSH 搜索文字不再被图标遮挡,正常状态不会重复显示说明,导航高亮与页面边距也保持一致。",
"**跨架构发布包。** Windows、macOS 和 Linux 的 x64、arm64 安装包会校验 Canvas、Koffi 等原生依赖,避免构建成功后加载错误架构的二进制文件。",
"**魔法笔记编辑体验。** 更高且可纵向拖动的编辑区域为长笔记留出空间,数字字号选项、工具栏和分栏间距也更加清楚。"
"**魔法笔记编辑体验。** 更高且可纵向拖动的编辑区域为长笔记留出空间,数字字号选项、工具栏和分栏间距也更加清楚;AI 评论区会在笔记详情就绪前明确显示加载状态。"
],
"notices": [
"**DSH 插件市场。** 该功能仍处于预览阶段并默认关闭。第三方插件的安装脚本、初始化代码和 Execute 工具会以当前用户权限运行,请只安装可信的包。关闭市场不会自动停用或卸载已有插件。",
@@ -35,7 +35,7 @@
},
"en-US": {
"highlights": [
"GoodBuddy 0.10.0 strengthens multi-Runtime workflows. OpenCode, Continue, and DeepSeek Harness capabilities, MCP, plugins, and context controls can now be viewed and configured in one place, with smoother long conversations, parallel work, and task notifications."
"GoodBuddy 0.10.1 strengthens multi-Runtime workflows. OpenCode, Continue, and DeepSeek Harness capabilities, MCP, plugins, and context controls can now be viewed and configured in one place, with smoother long conversations, parallel work, and task notifications."
],
"features": [
"**Runtime capability overview.** Switching Runtimes or diagnosing unavailable tools now reveals the Agents, Tools, Commands, Rules, Prompts, Skills, MCP, and other capabilities actually provided by managed OpenCode, Continue, and DeepSeek Harness, along with Runtime defaults and context controls.",
@@ -52,7 +52,7 @@
"**DSH plugin and MCP reliability.** Startup, cancellation, and shutdown remain reliable with several DSH plugins or large paginated MCP tool sets. Plugin failures are isolated, cursor loops are bounded, and sessions are released.",
"**Settings consistency.** DSH plugin search text no longer overlaps its icon, healthy status descriptions are no longer duplicated, and navigation highlights and page gutters remain aligned.",
"**Cross-architecture packages.** Windows, macOS, and Linux packages validate Canvas, Koffi, and related native dependencies for x64 and arm64, preventing successful builds from loading binaries for the wrong architecture.",
"**Magic Notes editing.** The editor is taller and vertically resizable, with numeric font-size choices and clearer toolbar and pane spacing."
"**Magic Notes editing.** The editor is taller and vertically resizable, with numeric font-size choices and clearer toolbar and pane spacing. The AI comments pane now shows an explicit loading state until note details are ready."
],
"notices": [
"**DSH plugin marketplace.** This preview feature is disabled by default. Third-party install scripts, initialization code, and Execute tools run with current-user permissions, so install only trusted packages. Disabling the marketplace does not disable or remove installed plugins.",
+1 -1
View File
@@ -30,7 +30,7 @@ describe('packaged release notes', () => {
}
const currentRelease = parsed.releases.find(
(release) => release.version === '0.10.0'
(release) => release.version === '0.10.1'
)
expect(currentRelease).toBeDefined()
expect(currentRelease?.releasedAt).toBe('2026-08-17')
+25 -3
View File
@@ -4,6 +4,7 @@ import {
fireEvent,
render,
screen,
within,
waitFor
} from '@testing-library/react'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
@@ -449,14 +450,35 @@ describe('MagicNotesWorkspace', () => {
})
it('shows a concise empty state before a note has AI comments', async () => {
get.mockResolvedValueOnce(alternateDetail(noteId, detail.title))
let resolveDetail:
| ((value: MagicNoteDetail) => void)
| undefined
const delayedDetail = new Promise<MagicNoteDetail>((resolve) => {
resolveDetail = resolve
})
get.mockReturnValueOnce(delayedDetail)
render(<MagicNotesWorkspace onNotify={onNotify} />)
expect(await screen.findByText('暂无 AI 评论')).toBeInTheDocument()
const pane = await screen.findByLabelText('AI 评论')
expect(within(pane).getByText('正在加载')).toBeInTheDocument()
expect(within(pane).getByText('正在加载笔记…')).toBeInTheDocument()
expect(
screen.getByText('写完一句并停止输入 5 秒后,评论会显示在这里。')
within(pane).queryByText('暂无 AI 评论')
).not.toBeInTheDocument()
await act(async () => {
resolveDetail?.(alternateDetail(noteId, detail.title))
await delayedDetail
})
expect(
await within(pane).findByText(
'写完一句并停止输入 5 秒后,评论会显示在这里。'
)
).toBeInTheDocument()
expect(within(pane).getByText('暂无 AI 评论')).toBeInTheDocument()
expect(within(pane).queryByText('正在加载')).not.toBeInTheDocument()
})
it('resizes the AI comments pane with pointer and keyboard controls', async () => {
+10 -2
View File
@@ -2155,9 +2155,17 @@ export function MagicNotesWorkspace({
)
) : !detail ? (
<EmptyState
description={t('comments.selectNote')}
description={
loadStatus === 'loading'
? t('status.loadingNotes')
: t('comments.selectNote')
}
icon={<Bot size={20} />}
title={t('comments.emptyTitle')}
title={
loadStatus === 'loading'
? t('status.loading')
: t('comments.emptyTitle')
}
/>
) : aiEntries.length === 0 &&
draftAnalyses.length === 0 &&