Skip to content

feat(desktop): 按 macOS 基线对齐 Viva 工作台与设置界面 - #1849

Merged
1lck merged 1 commit into
previewfrom
codex/preview-ui-baseline
Nov 13, 2026
Merged

1lck merged 1 commit into
previewfrom
codex/preview-ui-baseline

Conversation

@1lck

@1lck 1lck commented Nov 13, 2026 •

Copy link
Copy Markdown
Owner

关联 Issue / Linked issue

PR 类型 / Type

  • feat:新功能或用户可见的改进
  • fix:缺陷修复
  • docs:文档、Agent Note、Skill 等规则文件
  • release:稳定版发布准备

改动说明 / What changes

背景 / Why

Viva 重构后的工作台与设置窗口仍沿用部分框架默认外观,与用户提供的 main-macos-live-baseline.zip(原客户端提交 a824bd5c)存在明显差异。本 PR 按这份已有截图校准当前已实现的页面;未启动旧 main 客户端,也未扩展工作量较大的缺失子系统。

改动 / Changes

  • 工作台:恢复深浅色的 chrome、编辑器、工具面板与分隔线层级;面板圆角 10pt,普通标题 41pt 加粗,Git/终端/提交等带标签标题保留紧凑高度。
  • 项目渐变改由根容器在子元素前绘制,避免绝对定位背景盖住不透明面板。Metal 像素回归在原实现得到 {26 27 28}、修复后保持面板色 #191a1c;补充既有架构 Note 的绘制顺序约束。
  • 工具栏选中入口使用蓝底白图标;编辑器/终端标签补上激活、失焦的底色、边框和圆角。初始默认布局只展开 Project,Git 改为用户请求时展开,已保存的布局仍恢复。
  • 欢迎页:新建项目按钮改为描边;空态补文件夹图标、字号/间距和原版中英文文案。空编辑器收成两行搜索提示。
  • 设置窗口:初始 900×700、最小 900×668、侧栏 234pt、导航行 24pt、图标 20pt;校准标题、面包屑、正文边距、卡片边框/圆角、底部按钮栏和深浅色弹层。
  • 通用设置:项目颜色说明收入 ⓘ;自动保存移回通用页。编辑器标签布局改为滚动/压缩/多行的一个下拉,切到多行保留既有溢出偏好。
  • 终端 Shell 改为共享下拉,保留加载期间禁用、自动实际值、缺失安装路径和打开不写入的语义;退出策略按“退出 Lithe / 关闭终端标签”分组、同列排版;更新页拆开当前版本与更新操作。
  • 目录新建、标签复制路径/引用、工具窗口移动改为子菜单;Diff 设置菜单复用已有的空白比较、折叠未修改片段和关闭操作,保留并排/统一切换入口。
  • 共享 i18n 补齐中英词条、复用旧词条并重新生成;更新四项功能矩阵,验证状态继续保持 pending。
  • 新增 opt-in Viva 无头采集(vivahead lithevisual),隔离 store、fixture 仓库、插件事实与日志,真实点击弹层入口并断言已绘制;补布局/菜单行为与像素回归。调整原有 Git/拖动测试显式打开其依赖的底部面板,保留原断言。
  • 附六张离线 fixture 截图供 PR 审阅;设置采集支持 LITHE_VISUAL_LANGUAGE=en,中英文均覆盖深浅色。

不在本 PR 范围内 / Out of scope

  • 中文采集共 152 张,覆盖原截图包 149 个状态中的 118 个;覆盖不等于每个控件已逐像素一致,项目身份色和 fixture 内容、部分弹层采集尺寸也不同。
  • 其余 31 个状态按用户约定跳过:文件内查找/替换、快捷键分类/预设/右键、环境来源页、目录类型标记、依赖视图、多套主题、自动保存延迟、部分编辑器显示设置、后台 Agent 退出策略,以及离线场景下没有真实会话的语言服务器详情。
  • 文件内查找/替换需要 Core 匹配位置与文档版本接口;没有复制 Go Diff 全文扫描到新编辑器。现有 Diff 分层债务已提交 refactor Issue [Feature] 将 Viva Diff 查找的全文匹配与位置投影迁入 Rust Core #1847。
  • Windows 原生窗口、输入法、GPU、真实插件及配置写回的完整验收未执行;不将无头截图当作整机验收。

类型专属:feat

多平台对齐

  • 两端都具备:修改共用的 Viva Go 呈现与既有 Core 操作入口,macOS / Windows 使用同一实现;本地运行的是 macOS,Windows 原生验证仍为 pending。
  • 只实现了 macOS:已为 Windows 提交跟进 Issue:
  • 只实现了 Windows:已为 macOS 提交跟进 Issue:
  • 刻意只属于某个平台:

范围检查 / Scope checks

功能矩阵 / Feature matrix

  • 已更新 application-settings、git-diff-review、onboarding-welcome、workbench-tool-window-docking 的证据和说明,两端状态如实保留 partial / pending。
  • 已运行矩阵 source 与 verify-platform-feature-matrix-change.sh origin/preview HEAD 门禁。
  • 没有提交 .artifacts/ 生成视图。
  • [N/A] 未更新矩阵的理由:本 PR 已更新上述四项。

统一日志系统 / Structured logging

N/A:仅调整呈现与既有操作入口,未新增操作终态、失败、降级或恢复路径;行为继续调用原有带日志的处理函数,未新增日志事件或豁免。

界面文案 / i18n

  • 中英文文案走 shared/i18n/,生成文件由生成器更新;未在产品代码硬编码文案。
  • localization、生成一致性与 41 项 i18n Node 测试通过;未放宽门禁或豁免。

逻辑归属 / Logic placement

  • 新增代码只持有菜单、选择和布局呈现状态;Diff、布局移动及设置写入继续调用既有入口,未新增共享业务算法或契约。
  • [N/A] 已有共享逻辑迁入 Core:本 PR 未修改 Diff 匹配等共享算法;既有债务独立跟踪 [Feature] 将 Viva Diff 查找的全文匹配与位置投影迁入 Rust Core #1847,未扩大实现。
  • 没有新增工具专属知识、工具名特判或插件协议分支。

性能与内存 / Performance and memory

  • 未新增后台服务、进程、缓存、定时器或依赖;测试的临时会话、仓库和终端由 harness 清理。
  • 未引入主线程 I/O 或全量数据跨边界传输。
  • [N/A] 运行时性能基线:本 PR 调整界面呈现与默认展开状态,未改编辑器引擎、数据加载、搜索或滚动实现;未宣称性能或内存改善,也未修改预算。测试计时只是稳定性证据。

设置 / Settings

  • 保留既有 ⓘ 和自动实际生效值,Shell 不存在时仍回显原路径。
  • 未新增影子配置、工具配置来源或打开页面写入;Shell 选择及标签布局仍通过既有 setter,回归覆盖打开不写入、恢复默认和偏好保持。
  • 自动保存移动到既有 General 页,侧栏分类未变;遵循设置层级 Note。

插件契约 / Plugin contract

N/A:未改 Core pin、插件协议、SDK、宿主方法或通知。

发行包与资源 / Bundle and resources

N/A:没有新增运行时资源、下载、解压或缓存路径;docs/assets 中仅是离线审阅截图。仍已运行 desktop macOS / Windows 资源只读静态门禁。

无用代码与重构 / Dead code and refactoring

验证 / Verification

命令或操作 平台 结果
scripts/desktop/desktop-go.sh test ./... -count=1 -timeout=180s macOS 全部通过;workbench 包 138.757s
`scripts/desktop/desktop-go.sh test -race ./internal/workbench ./internal/settingswindow -run 'TestBaseline TestDiffSettings TestToolWindowMoveSubmenu
scripts/desktop/desktop-go.sh vet ./...、vet -tags dev ./...、test -tags dev ./internal/buildinfo -count=1 macOS 通过
scripts/desktop/desktop-go.sh --exec go run github.com/vivaui/viva/cmd/viva vet ./... macOS 使用 go.mod replace 固定版本,通过
LITHE_VISUAL_OUTPUT_DIR=<output> LITHE_VISUAL_BASELINE_DIR=<extracted-baseline> scripts/desktop/desktop-go.sh test -tags 'vivahead lithevisual' ./internal/workbench ./internal/settingswindow ./internal/logwindow -run '^TestVisual' -count=1 -timeout=180s macOS Metal 158 项记录通过,生成 152 张中文截图;批量工作台父测试 60.240s(包含所有子场景)
LITHE_VISUAL_OUTPUT_DIR=<output> LITHE_VISUAL_LANGUAGE=en scripts/desktop/desktop-go.sh test -tags 'vivahead lithevisual' ./internal/settingswindow -run '^TestVisualSettings$' -count=1 -timeout=60s macOS Metal 47 项英文深浅色记录通过;最终中文设置与面板像素再验 48 项通过
.agents/skills/write-stable-tests/scripts/run-go-tests-with-timing.mjs(macos-ui-full / pixel / changed / capture / english / pr-final) macOS HTML + JUnit 已生成;改动相关 28 项全部通过,最慢单项 1.570s;批量截图父测试使用独立 90s 上限,未更改产品/编辑器预算
node scripts/i18n/verify-app-language-localization.mjs、node scripts/i18n/generate-i18n.mjs --check、node --test --test-timeout=60000 scripts/i18n/test-i18n.mjs macOS / Node 通过,中英各 11001/11001,41 项测试通过
scripts/platform-feature-matrix/verify-platform-feature-matrix.sh、verify-platform-feature-matrix-change.sh origin/preview HEAD macOS 通过,219 项能力
scripts/desktop/verify/verify-runtime-bundle-immutability.sh、scripts/agent-notes/verify-agent-notes.sh macOS 通过,覆盖桌面 macOS / Windows 路径;218 项 Note
.agents/skills/write-stable-tests/scripts/verify-test-stability.sh --base origin/preview --platform macos、git diff --check、gofmt macOS 通过
当前分支原生启动与用户自行查看 macOS 窗口已显示,用户确认后要求提交并合入 preview

CI 结果补充: macOS 与 Linux 完整 lane、格式/脚本、依赖固定、功能矩阵和 Agent Note 检查均通过。Windows 在链接阶段失败:cannot find -lwinapi_advapi32 / -lwinapi_cfgmgr32 / -lwinapi_kernel32 / -lwinapi_user32,没有进入相关界面测试。同一故障已存在于 PR 基线 549696fdb,不是本次新增:

仓库保护仍要求已移除的 macOS CI gate 检查名及代码评审;按维护者本次明确要求合入 preview,使用仓库已有的 PR 合并豁免权限,不修改保护规则或伪造成功状态。

本 PR 未改 Core pin、构建脚本或 Windows 链接参数;该能力仍由 #1798 跟踪,不把失败记为通过。等待 CI 时 preview 合入 #1848 (a6f68e7de),已在本地临时合并两份改动、运行设置模块全量测试,通过(3.255s),随后撤销临时合并;没有为重复触发 CI 而推送无实质变化的提交。

未能执行的检查和原因: 未在 Windows 运行原生验收;macOS 原生启动及用户查看不代表所有页面与真实工具链/插件流程已验收。全仓稳定性扫描会扫描用户已有未跟踪 extension-host/node_modules 的第三方计时器测试,未将该目录提交或改豁免;本次改动的 macOS 增量门禁通过。测试时有既有 Core dead-code 和本机 SDK 链接警告,本 PR 未改工具链或 Core。

离线截图:中英文与深浅色
设置中文浅色 设置中文深色
设置中文浅色 设置中文深色
Settings light Settings dark
Settings light Settings dark
工作台浅色 工作台深色
工作台浅色 工作台深色

提交前确认 / Final checks

  • 分支从当时最新 preview 549696fdb 创建;推送前重新 fetch,远端未前进;目标 preview。
  • 先以 Draft 提交,本地验证通过后标记 ready,再等待完整 CI;Windows 既有失败单独披露,按用户请求合入 preview。
  • 未提交无关的 extension-host/、fixture target/、.artifacts/、构建产物或日志;截图仅使用隔离离线数据。
  • [N/A] 关闭所有预览:用户明确要求启动供自行查看,该原生 preview 按要求保留;所有测试启动的临时会话与子进程已清理。

@ghfind-review ghfind-review Bot added the review: high ghfind author score; see https://ghfind.com label Nov 13, 2026
@1lck
1lck marked this pull request as ready for review November 13, 2026 09:20
@lithe-code-review

lithe-code-review Bot commented Nov 13, 2026 •

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← codex/preview-ui-baseline · head: 42ad518

未发现需要阻塞合并的问题。建议补齐界面前后对照证据;本次未确认代码缺陷。

Scope Check

架构归属对账

逻辑块(仓库相对路径与符号) 归属 依据
desktop/internal/workbench/root.go:workbench,shell_view.go:shellPanel,editor_view.go:editorGroup,theme.go、tabstrip.go:stripTab、welcome_view.go 平台 API 使用 ui.C、ui.Box、ui.DrawContext、gfx.Theme 绘制与呈现焦点状态
desktop/internal/workbench/chrome_view.go:stripeButtonMenu,filetree_menu.go:projectTreeMenu,tab_menu.go:tabMenuItems 平台 API 使用 ui.MenuItems 组织子菜单,继续调用既有新建、复制和 Core 布局入口
desktop/internal/workbench/difftab_view.go:diffToolbar、difftab.go:settingsOpen 平台 API ui.Menu 的开关状态;动作复用既有空白比较、布局切换和关闭函数
desktop/internal/settingswindow/window_view.go、terminal_view.go、process_termination_view.go、updates_view.go 平台 API 使用 ui.Select、ui.Switch、ui.Row,选择结果交给原有 setter
新增采集测试及 app_test.go:newHarnessWithDriver 平台测试适配 使用 headless.Session、app.Driver、临时目录及测试清理回调
默认展开标记、尺寸/调色板、i18n 和功能矩阵 配置与文案,无新增算法 布局仍由既有 workbench.chromeLayout.reduce 执行;未改契约或 Core pin

其余上游领域能力审查不适用:本次未扩展语言服务、构建、运行或调试机制。

Checked and cleared

  • Shell 下拉保留加载禁用、自动生效值、缺失路径回显及 Windows 路径大小写匹配;打开页面不会因控件替换而写入设置。
  • 编辑器标签下拉选择多行时保留溢出偏好,回归测试继续覆盖 setter 和恢复默认。
  • 默认关闭 Git 只改变 catalog 输入;loadChrome 对已有布局仍使用 Normalize,未改成重置保存值。
  • 子菜单继续调用原处理函数;Diff 关闭仍经过代次失效和编辑器释放路径。
  • 新增产品文案使用共享 i18n,未见本次放宽检查或扩大豁免;功能矩阵保留 pending。
  • 采集入口使用临时 store、离线事实和清理回调;等待复用既有有界 helper,未新增生产资源或后台服务。

Suggestions

  1. PR 已附六张改后截图链接,请补充相应改前截图并并排展示,尤其是设置布局、标签焦点状态和菜单。仅引用基线压缩包名称不足以直接核对前后效果。

Observations

  • 存量(#1847):desktop/internal/workbench/diff_find.go:39 的 diffFindMatches 仍在 Go 中执行全文匹配,refreshDiffFind 从呈现路径调用它。该文件在固定范围内无差异,本 PR 未扩大算法,不要求此次修复。

Summary

静态检查未发现明确的正确性或架构回归。菜单与设置改动复用现有入口,相关行为测试保留了关键断言;视觉对齐及两端原生体验仍需运行证据确认。

Verification

  • 实际检查:固定 549696f...42ad518 的非生成文本差异,以及设置 setter、布局恢复、Diff 关闭、采集等待与清理调用链。六张 PNG 和生成字典未读取正文。
  • 已提供结果:作者报告 macOS 全量测试、定向 race、vet、采集、i18n、矩阵、资源只读和稳定性检查通过;这些结果未由本次复跑。
  • 已提供 CI:pins、矩阵及 Agent Notes 有成功记录;三平台测试和 Format 检查仍在进行,不能视为最终全绿。
  • 本次未运行任何代码、测试、边界脚本或应用,未访问网络。
  • 验证缺口:需补充上述前后截图;本次未读取图片,视觉效果尚未验证。Windows 原生验收及性能/常驻内存前后基线未提供,无头截图和测试计时不能替代这些验证。

@1lck
1lck merged commit 90d816d into preview Nov 13, 2026
9 of 13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review: high ghfind author score; see https://ghfind.com

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant