Skip to content

feat(desktop): 插件设置页分为已安装和市场两个标签,仓库在齿轮菜单管理 - #1833

Merged
xiaoyumuxi merged 2 commits into
previewfrom
feature/1794-plugin-settings-page
Nov 12, 2026
Merged

xiaoyumuxi merged 2 commits into
previewfrom
feature/1794-plugin-settings-page

Conversation

@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

关联 Issue / Linked issue

PR 类型 / Type

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

改动说明 / What changes

背景 / Why

Viva 桌面端的「设置 › 插件」原来把市场、已安装、仓库源和插件设置都塞在一个页面里,和旧 macOS 客户端的插件页差别很大:没有已安装列表的过滤和分组,插件设置挂在市场详情下面,仓库源和磁盘安装混在页面标题栏里。本 PR 按旧 macOS 插件页 1:1 复刻:市场和已安装分开,插件设置放进已安装详情,右上角齿轮只管插件仓库地址和从磁盘安装。

改动 / Changes

插件页结构(settingswindow/window.go、marketplace_view.go)

  • 插件页顶部分成「已安装」和「市场」两个标签,默认打开「已安装」。
  • 右上角齿轮菜单只保留「管理插件仓库…」和「从磁盘安装插件…」两项;原来页面标题栏里的源管理入口删除。

已安装标签(新增 settingswindow/installed_view.go)

  • 左栏:
    • 搜索框按名称、厂商或插件提供的能力名称过滤。
    • 过滤芯片:全部、语言服务器、构建、调试、界面、可更新、社区、已停用。
    • 在搜索框输入 / 会弹出过滤选项,选中后清空搜索框并切换过滤。
    • 列表按「已启用 / 已停用」分组,显示“已启用 N 个,共 M 个”,有新版本的插件行尾显示更新圆点(带提示)。
    • 过滤后原来选中的插件不在列表里时,自动选中第一个可见插件。
  • 详情头部:
    • 显示名称、厂商、版本、状态胶囊(运行中、已启用、已停用)。
    • 操作按钮:停用/启用;市场有新版本时显示「更新到 x.y.z」;卸载先弹确认框,取消不做任何事。
    • 窗口足够宽时头部横排,窄时竖排。
  • 头部下方固定显示社区、磁盘来源等提示,任何页签都能看到。
  • 五个页签(带数量):
    • 概览:状态、提供的能力、来源、设置数量;「在设置中配置」跳到插件贡献的设置页。
    • 功能:按清单列出语言服务器、构建系统、调试器等能力,ⓘ 说明内容来自插件声明。
    • 设置:原来挂在市场详情下面的插件设置移到这里。
    • 权限与程序:逐项说明清单里的权限(languageServer.launch 等),并列出会启动的程序。
    • 版本与来源:当前版本、插件 ID、来源。

插件仓库弹窗(settingswindow/marketplace_sources.go)

  • 新增「插件仓库」弹窗:
    • 列出社区、官方和自定义索引。内置仓库显示实际地址并标注“默认”,自定义仓库可以移除。
    • 每行可以单独刷新。
    • 顶部输入 https 地址后点「添加」,地址为空时「添加」不可点。
    • 底部有「全部刷新」和「完成」,关闭弹窗时清掉提示。
  • 删除原来的 marketSourceManager。

数据来源(workbench/plugins.go、workbench/settings.go、marketplace/service.go、pluginmanager/pluginmanager.go、settingswindow/controller.go)

  • installedPluginFacts 改为按名称(再按 ID)排序的切片。它在窗口线程外读取每个已安装包的清单和安装审批记录;清单读不出来的包也会列出 ID、版本和路径。
  • pluginmanager.Manager 新增 Approval(id, version),用来读取安装时的审批记录(来源、权限、程序)。
  • 社区仓库地址收为常量 marketplace.CommunityRepositoryURL;设置窗口的 Options 新增 MarketplaceURL 和 OfficialMarketplaceURL,仓库弹窗用它们显示内置仓库的实际地址。

数据竞争修复(workbench/lsp_status.go、workbench/app.go、workbench/pluginbackends.go)

  • 已安装页在设置窗口线程读取语言服务器状态,而状态原本只在工作台线程写。新增 sharedState(atomic.Pointer)和 sharedStateName(),跨线程只读这份原子副本。

配色(settingswindow/palette.go)

  • 新增 warning 和 success 两种颜色,用于提示条和状态胶囊。

界面文案(shared/i18n/)

  • 82 个已有词条(旧 macOS 插件页用过的)补上 desktop 平台。
  • 新增 desktop.plugins.installedOnThisComputer。
  • 删除 20 个不再使用的 desktop.marketplace.* 词条。
  • 重新生成 desktop/internal/i18n/shared.generated.go。

测试

  • 新增 installed_view_test.go:
    • 分组、启用数量、更新、停用、构建过滤、卸载确认。
    • / 选择过滤。
    • 权限与版本页签。
    • 仓库弹窗的添加、移除、关闭。
  • 市场相关测试(marketplace_model_test.go、marketplace_view_test.go、marketplace_search_test.go)切到「市场」标签再测。
  • 插件设置测试(plugin_settings_view_test.go、plugin_settings_actions_view_test.go)改为从已安装详情的「设置」页签进入。

功能矩阵

  • 更新 plugin-detail-tabs、plugin-marketplace、plugin-extension-management 三条记录的证据路径和 notes,验证状态保持 pending。

不在本 PR 范围内 / Out of scope

  • 插件自绘设置区(网页模式),暂缓。
  • 版本回滚:安装审批记录没有保存上一版本和索引地址,所以「版本与来源」页签的“上一版本”显示 —,来源只显示笼统的“市场”。
  • Lithe Store 收录 Go、Maven、LLDB 的 0.0.1 版本,发版时另做。

类型专属:feat

多平台对齐

  • 两端都具备:设置窗口是 macOS 与 Windows 共用的 Viva/Go 代码,合入后两端都具备;Windows 整机验收尚未执行(见“验证”)。
  • 只实现了 macOS:已为 Windows 提交跟进 Issue:#
  • 只实现了 Windows:已为 macOS 提交跟进 Issue:#
  • 刻意只属于某个平台(功能矩阵中另一端记为 platform-specific),理由:

范围检查 / Scope checks

功能矩阵 / Feature matrix

  • 已更新 shared/platform-feature-matrix/features/plugin-detail-tabs.json、plugin-marketplace.json、plugin-extension-management.json;两端实现状态保持 partial,验证状态保持 pending(没有执行整机验收)
  • 已运行 ./scripts/platform-feature-matrix/verify-platform-feature-matrix.sh 和 ./scripts/platform-feature-matrix/verify-platform-feature-matrix-change.sh origin/preview HEAD
  • 没有提交 .artifacts/ 下生成的矩阵视图
  • [N/A] 没有更新矩阵的理由:已更新矩阵

统一日志系统 / Structured logging

N/A:没有新增或改动生命周期里程碑、操作终态或失败路径。启用、停用、更新、卸载都调用工作台已有的处理函数,日志沿用原有记录。

界面文案 / i18n

  • 文案都走共享 i18n:在 shared/i18n/ 补齐中英词条,运行 node scripts/i18n/generate-i18n.mjs 并提交生成结果,没有手改生成文件
  • 已运行 node scripts/i18n/verify-app-language-localization.mjs 和 node scripts/i18n/generate-i18n.mjs --check,没有放宽脚本或扩大豁免名单

逻辑归属 / Logic placement

  • [N/A] 可共享的逻辑在 Rust Core:本 PR 没有新增解析、校验或状态规则,主要是界面呈现
  • 修改平台层已有的可共享逻辑时已迁入 Core:workbench/plugins.go 的 installedPluginFacts / describeManifest 原本就在 Go 层从清单推导插件提供的能力,本 PR 在这里扩展了展示字段,没有迁入 Core。这部分应由 Core 统一给出;refactor Issue 待维护者确认后提交并回填编号:#
  • 工具或运行时专属的知识放在插件或成熟上游,宿主和 Core 没有按工具名加分支

性能与内存 / Performance and memory

  • 没有新增后台功能、子进程、定时器或依赖;已安装列表用虚拟列表,只在过滤或插件变化时重建行
  • 清单与审批记录的读取在窗口线程之外完成;跨线程读取语言服务器状态改为原子指针,没有加锁等待
  • [N/A] 性能基线:没有改动启动、打开项目、输入、滚动、大文件、长输出或搜索路径

设置 / Settings

  • 难以理解的项有 ⓘ(功能页签说明内容来自插件声明);本 PR 没有新增用户可修改的配置项
  • [N/A] 非敏感工具配置回显真实来源:没有新增工具配置;插件设置沿用原有的设置编辑器,只是换了入口位置
  • [N/A] 新增或移动 macOS 设置页:插件页本身位置不变,只调整页内结构

插件契约 / Plugin contract

N/A:没有改动插件契约、能力版本、插件函数协议,也没有新增或修改宿主方法与通知。

发行包与资源 / Bundle and resources

N/A:没有新增运行时资源、缓存、下载物或构建步骤。仍运行了 ./scripts/desktop/verify/verify-runtime-bundle-immutability.sh,结果通过。

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

  • 本次改动导致变成无用的代码已在本 PR 删除(marketSourceManager,20 个不再使用的 desktop.marketplace.* 词条)
  • 本次之前就存在的可重构之处已提交 refactor Issue:清单能力推导在 Go 层(见“逻辑归属”),待维护者确认后提交:#

验证 / Verification

命令或操作 平台 结果
gofmt -l desktop/internal macOS 无输出
scripts/desktop/desktop-go.sh vet ./... macOS 通过
scripts/desktop/desktop-go.sh test ./... macOS 52 个包全部 ok,无 FAIL(在与本 PR 相同的提交树上运行)
settingswindow 新增 4 个测试(TestInstalledTab*、TestRepositoriesDialogAddsAndRemovesAnIndex) macOS 通过
node scripts/i18n/generate-i18n.mjs --check macOS 通过
node scripts/i18n/verify-app-language-localization.mjs macOS 通过(en-US、zh-CN 均 10984/10984)
./scripts/platform-feature-matrix/verify-platform-feature-matrix.sh macOS 通过(217 条)
./scripts/platform-feature-matrix/verify-platform-feature-matrix-change.sh origin/preview HEAD macOS 通过
./scripts/desktop/verify/verify-runtime-bundle-immutability.sh macOS 通过(desktop macOS 与 Windows 源码)

未能执行的检查和原因:

  • 整机界面检查:构建并启动了应用,但这台机器不允许自动按键,设置窗口无法自动打开,没有截图;明暗主题、中英文截图待维护者在「设置 › 插件」手动确认。
  • Windows:没有在 Windows 上构建或运行,依赖完整 CI。

提交前确认 / Final checks

  • 分支从最新的 preview 创建;目标分支:preview
  • 以 Draft 提交,本地验证通过后才标记 ready
  • 没有无关改动,没有提交 .build/、target/、dist/、.artifacts/ 等产物,没有凭据、个人路径和未脱敏的日志或截图
  • 本次构建、测试或预览启动的 Lithe 应用和子进程已全部关闭,没有进程残留

- 插件页拆成「已安装」和「市场」两个标签,已安装为默认页
- 已安装:搜索框支持 / 选筛选(全部、语言服务器、构建、调试、界面、可更新、社区、已停用),
  列表按已启用/已停用分组,带启用数量汇总和可更新标记
- 已安装详情:标题区显示状态、停用/启用、更新到新版本、卸载(先弹确认框);
  概览、功能、设置、权限与程序、版本与来源五个标签,插件设置移到「设置」标签
- 齿轮菜单只管插件仓库和从磁盘安装;仓库弹窗列出社区、官方和自定义索引,
  可添加、刷新、移除,内置仓库显示实际地址
- 社区仓库地址收为 marketplace.CommunityRepositoryURL,并传给设置窗口显示
- 已安装插件事实改为按名称排序的切片;修复 LanguageServerState 的数据竞争
- i18n:82 个已有词条补 desktop 平台,新增 desktop.plugins.installedOnThisComputer,
  删除 20 个不再使用的 desktop.marketplace.* 词条
@ghfind-review ghfind-review Bot added the review: high ghfind author score; see https://ghfind.com label Nov 12, 2026
@xiaoyumuxi
xiaoyumuxi marked this pull request as ready for review November 12, 2026 10:05
@xiaoyumuxi
xiaoyumuxi merged commit b43c05a into preview Nov 12, 2026
5 of 12 checks passed
@lithe-code-review

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

Copy link
Copy Markdown

Lithe Review

结论: ❓ 审查未完成

已由服务器取消。可以重新评论 @lithe review 召唤。

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