Skip to content

feat(desktop): Build 窗口可运行的行常驻绿色运行按钮,依赖标题加 ⓘ - #1896

Merged
xiaoyumuxi merged 1 commit into
previewfrom
feat/build-panel-runnable-rows
Nov 14, 2026
Merged

xiaoyumuxi merged 1 commit into
previewfrom
feat/build-panel-runnable-rows

Conversation

@xiaoyumuxi

@xiaoyumuxi xiaoyumuxi commented Nov 14, 2026 •

Copy link
Copy Markdown
Collaborator

关联 Issue / Linked issue

PR 类型 / Type

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

改动说明 / What changes

背景 / Why

IDEA 的 Make 窗口里,每个可运行的目标行首都有绿色 ▷,看一眼就知道哪些能跑,点一下就运行。Lithe 的 Build 窗口只有选中的那一行才有运行按钮:要先点选中,再去点工具栏或行尾的按钮,而且看不出哪些目标能运行。另外 Go 模块的目标名是完整导入路径,窄窗口里名称和路径会挤在一起,被窗口边缘直接截断,没有省略号。依赖分组折叠着,展开后才会运行构建工具读取依赖,用户也不知道为什么要等、什么时候会重新读取。

改动 / Changes

  • 常驻运行按钮(build_tree_view.go 的 buildRunMark):

    • 每个任务行,以及有运行入口的目标行(buildPrimaryAction 有运行的),行首放绿色 ▷(colors.Success),替换该行的类型图标。
    • 不必先选中:点 ▷ 会先选中这一行(切换到所属构建系统),然后运行,再打开 Run 窗口的构建控制台。这条路径和双击运行一样。
    • 构建进行中或模型加载中,▷ 变暗、不可点,点击落到行上。
    • 没有运行入口的目标和项目仍显示类型图标。▷ 的占位和图标一样宽(14),名称对齐。
    • ▷ 有自己的点击区域(RoleButton,悬停是手形,提示为“运行 {名称}”),同时作为无障碍标签。
    • 调试按钮不变,仍只在选中的行上。
  • 名称优先、路径先省略:标签 Shrink(1),路径 Shrink(1000),两者都 MinWidth(0) 并以省略号结尾。行太窄时路径先缩,路径没了才轮到名称。

  • 悬停提示(buildItemTip):项目、目标、任务行悬停显示完整名称,下一行是完整路径。feat(desktop): Build 窗口的目标行只显示路径,悬停显示完整名称 #1895 给“只显示路径的目标”设的 tooltip(完整名称)优先,两种提示由同一个函数给出,不会叠加。

  • 依赖标题的 ⓘ:依赖分组标题旁加 ⓘ,说明依赖树在第一次展开时才由构建工具读取,以及什么时候重新读取(重新检测构建系统,或在构建系统、依赖上选“重新加载”)。新增 i18n 词条 desktop.build.dependenciesHelp(中英),并重新生成 shared.generated.go。

  • 测试(build_tree_test.go):新增 TestBuildTreeRunMarksRunTheirRowsAtOnce,覆盖以下几点:

    • 只有可运行的目标和任务有 ▷,Lib 目标没有。
    • 什么都没选时,点任务的 ▷ 就以该任务发出请求。
    • 构建进行中没有可点的 ▷。
    • 目标行的悬停提示是“名称\n路径”。
    • ⓘ 的提示文案。

    回退成“只在选中行有运行按钮”时,这个测试会失败(本地反向验证过)。

  • 截图(build_panels_visual_test.go、docs/assets/build-panels/):新增 build-go-targets 场景,内容是一个以导入路径命名目标的 Go 模块,两个命令可运行,其余是测试包,有任务和依赖。其余四张截图按当前代码重新生成,README 补一行。

  • 功能矩阵:build-system-plugins 的说明补上上述行为和测试名,状态保持 partial/pending。

  • 顺手修的不稳定测试(notifications_test.go):

    • 现象:三个通知测试直接在测试协程调用 notify 后只 settle() 一次,没有请求重绘。Driver.Pump 只在有待处理的唤醒时才重画,所以 toast 能否画出来,取决于前面有没有偶然留下的唤醒。整套测试负载下,TestNoticesKeepTheirKindAndShowAtMostThreeToasts 会失败(“the newest toasts are not up”)。
    • 为什么 Len()==3 没能发现:Toaster.Show 按标题去重,错误和成功两个“Sync”是同一个 toast,所以没画过也是 3。
    • 修复:在 settle 前显式 invalidator.Invalidate(),和仓库里其他测试的做法一致。

截图(深色中文 / 浅色英文):

深色中文 浅色英文

不在本 PR 范围内 / Out of scope

以下改动已规划,分别提交:


类型专属:feat

多平台对齐

  • 两端都具备:Viva 桌面端是 macOS 和 Windows 共用的一份 Go 代码,合入后两端都有。Windows 未做实机验证,功能矩阵的 Windows 验证状态保持 pending。
  • 只实现了 macOS:已为 Windows 提交跟进 Issue:#
  • 只实现了 Windows:已为 macOS 提交跟进 Issue:#
  • 刻意只属于某个平台(功能矩阵中另一端记为 platform-specific),理由:

范围检查 / Scope checks

功能矩阵 / Feature matrix

  • 已更新 shared/platform-feature-matrix/features/build-system-plugins.json 的说明;状态和验证保持 partial/pending
  • 已运行 ./scripts/platform-feature-matrix/verify-platform-feature-matrix.sh(222 项通过)和 ./scripts/platform-feature-matrix/verify-platform-feature-matrix-change.sh origin/preview HEAD(通过)
  • 没有提交 .artifacts/ 下生成的矩阵视图
  • [N/A] 已更新矩阵,不需要豁免理由

统一日志系统 / Structured logging

N/A:没有新增生命周期里程碑、操作终态或失败路径。点 ▷ 复用已有的运行路径,打点用已有的 performed("build.item.run")。

界面文案 / i18n

  • 新增文案 desktop.build.dependenciesHelp 在 shared/i18n/ 补齐中英,运行了 node scripts/i18n/generate-i18n.mjs 并提交生成结果;▷ 的提示复用已有的 RunTarget
  • 已运行 node scripts/i18n/verify-app-language-localization.mjs 和 node scripts/i18n/generate-i18n.mjs --check,都通过;没有放宽脚本

逻辑归属 / Logic placement

性能与内存 / Performance and memory

  • 没有新增后台任务、进程、缓存或轮询;每行只多一个图标和点击区域
  • 主线程没有新增文件读写或进程启动
  • [N/A] 不涉及启动、输入、滚动、大文件或搜索路径;树仍是虚拟化列表,只画可见行

设置 / Settings

N/A:没有改设置项或设置页。依赖标题的 ⓘ 按“难懂的功能用 ⓘ”加。

插件契约 / Plugin contract

N/A:不改契约和宿主方法。

发行包与资源 / Bundle and resources

  • 没有新增运行时资源;仍运行了 ./scripts/desktop/verify/verify-runtime-bundle-immutability.sh,通过
  • [N/A] 没有新增下载、解压、生成或缓存资源

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

  • 运行按钮从“选中行行尾”移到“行首常驻”,旧的选中行运行按钮已删除;buildItemIcons 只留给不可运行的行
  • 发现的不稳定通知测试已在本 PR 修复(见改动说明),没有另开 Issue

验证 / Verification

命令或操作 平台 结果
./scripts/desktop/desktop-go.sh test ./... -count=1(在 desktop/,rebase 到最新 preview 后) macOS 全部通过
./scripts/desktop/desktop-go.sh test ./internal/workbench/ -run 'TestBuild|TestNotice|TestNotification|TestRepeatedNotices|TestRunConfiguration' -count=5 macOS 通过
./scripts/desktop/desktop-go.sh test ./internal/workbench/ -run TestNoticesKeepTheirKindAndShowAtMostThreeToasts -count=20 macOS 20/20 通过(修复前整套测试负载下失败)
./scripts/desktop/desktop-go.sh vet ./internal/workbench/、gofmt -l macOS 无输出
LITHE_VISUAL_OUTPUT_DIR=… ./scripts/desktop/desktop-go.sh test -tags vivahead,lithevisual ./internal/workbench -run '^TestVisualBuildPanels' macOS 无头 生成 6 张截图并人工核对
node --test --test-timeout=60000 scripts/i18n/test-i18n.mjs macOS 41/41 通过
node scripts/i18n/generate-i18n.mjs --check、node scripts/i18n/verify-app-language-localization.mjs macOS 通过
.agents/skills/write-stable-tests/scripts/verify-test-stability.sh --base origin/preview macOS 通过
./scripts/desktop/verify/verify-runtime-bundle-immutability.sh macOS 通过
功能矩阵两个校验脚本 macOS 通过

未能执行的检查和原因: Windows 实机没有运行;截图来自无头渲染,不代表原生窗口验收。没有在打包后的应用里手动点过 ▷。

提交前确认 / Final checks

- 参照 IDEA 的 Make 窗口:每个任务行和有运行入口的目标行,行首常驻绿色 ▷,
  不必先选中,点一下就选中该行并运行,然后打开 Run 窗口的构建控制台;
  构建进行中按钮变暗、不可点。没有运行入口的目标和项目仍显示类型图标,
  ▷ 与图标同宽,名称对齐。调试按钮仍只在选中的行上。
- 名称与路径放不下时,路径先缩(按权重收缩),名称以省略号结尾;悬停提示
  显示完整的名称和路径,同时作为无障碍提示。#1895 给只显示路径的目标设的
  tooltip(完整名称)优先,两者由 buildItemTip 统一给出。
- “依赖”标题旁加 ⓘ:依赖树在第一次展开时才由构建工具读取,以及何时重新读取。
  新增 i18n 词条 desktop.build.dependenciesHelp(中英)。
- 测试 TestBuildTreeRunMarksRunTheirRowsAtOnce:▷ 只出现在可运行的行,
  未选中时点 ▷ 就以该行发出请求,构建进行中没有可点的 ▷,悬停提示与 ⓘ 文案。
- 截图:新增 build-go-targets 场景(以导入路径命名目标的 Go 模块),
  重新生成其余截图。
- 功能矩阵 build-system-plugins 的说明补上该行为。
- 通知测试直接调用 notify 后没有请求重绘,依赖偶然的唤醒才画出 toast,
  整套测试负载下 TestNoticesKeepTheirKindAndShowAtMostThreeToasts 会失败;
  三个通知测试在 settle 前显式 Invalidate。
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