Skip to content

feat(linux): 新增 Linux GPUI 原生产品适配 - #886

Open
VedaChen wants to merge 113 commits into
1lck:previewfrom
VedaChen:linux_front
Open

VedaChen wants to merge 113 commits into
1lck:previewfrom
VedaChen:linux_front

Conversation

@VedaChen

Copy link
Copy Markdown

背景

本 PR 为 Lithe 增加 Linux 原生桌面产品(GPUI Kit + Rust Core)的完整适配,使得 Lithe 继 macOS(SwiftUI/AppKit)与 Windows(React/Tauri)之后,具备第三个独立平台实现。

Linux 前端使用 gpui-kit(GPUI + gpui-component)构建原生 UI,平台能力(PTY 终端、LSP、运行/构建、Git、文件系统)经平台适配层与 lithe-core 对接,不引入第二套 Core 语义。

主要改动

1. 新增 Linux 前端产品(linux/,143 个文件)

  • linux/src/main.rs、linux/src/lib.rs:应用入口与模块装配。
  • linux/src/workbench/:工作台各区域视图
    • 顶栏 / 多项目标签条 / 左侧活动栏 / 侧边栏(文件、Git、搜索)
    • 多窗格编辑器(Monaco 等价的 GPUI 编辑器视图,含标签页、分栏)
    • 底部面板:终端、Run、Maven、诊断、Git Log 五页
    • 浮层:全局搜索、快速打开、跳转到行、命令面板、设置对话框、新建/克隆项目、分支管理、欢迎页
    • 右侧工具窗口:通知、Maven、扩展
  • linux/src/workbench/terminal.rs:Linux 原生 PTY 终端(详见下方架构决策)。
  • linux/src/settings.rs、linux/src/theme.rs、linux/src/i18n.rs:设置持久化、主题调色板、中英文文案。
  • linux/src/lsp.rs、linux/src/core/:语言服务器与 Core 客户端接线。
  • linux/src/keybindings.rs:菜单派生的全局快捷键。
  • linux/assets/:图标与资源。

2. 终端实现:复用成熟上游引擎(关键架构决策)

Linux 终端不自行实现终端语义,而是复用成熟上游 alacritty_terminal 作为唯一引擎,本仓库只做「引擎 → GPUI 元素」的投影:

  • 解析、网格状态、回滚缓冲、选择、正则搜索、resize/reflow 全部由 alacritty_terminal 0.26 提供。
  • 本仓库仅调用上游既有 API:Term::resize、Term::scroll_display、Selection + selection_to_string、RegexSearch + Term::search_next、Term::renderable_content。
  • 单元格宽度用上游 WindowTextSystem::em_layout_width 按字号实测,鼠标命中换算、网格 cols/rows、PTY 尺寸三处共用同一套 CellMetrics。
  • 已支持:随窗缩放 + reflow、滚轮回滚、鼠标单击/双击/三击选择 + 拖动、Ctrl+Shift+C/V 复制粘贴、Ctrl+Shift+F 终端内搜索、等宽对齐、光标块。
  • 依赖:portable-pty = "0.9"、alacritty_terminal = "0.26"。

为什么不引入现成终端控件:GPUI 生态不存在可复用的成熟终端控件(无 gpui-term / terminal-gpui 类 crate);Alacritty 自身渲染基于 OpenGL/winit,与 GPUI 的 Element/Render 体系不兼容。因此复用边界只能落在引擎层。该决策已记录为 Agent Note(见下)。

3. 构建与 CI

  • scripts/build-linux.sh:Linux 前端构建入口(debug/release、可选 target)。
  • scripts/package-linux.sh:Linux 打包。
  • .github/workflows/ci-linux.yml:Linux CI(构建 + 打包,ubuntu-latest)。

4. Agent Notes

  • 新增 .agents/notes/implemented/architecture/2026-09-25-linux-gpui-terminal-engine-reuse.md:记录 Linux 终端「只复用上游引擎、禁止手写第二套终端语义」的边界与备选方案。
  • 更新 .agents/notes/implemented/architecture/2026-09-18-java-project-build-and-launch-boundary.md。

对其它平台的影响(请重点 review)

  • rust/lithe-core/Cargo.toml:tree-sitter 0.25 → 0.26,与 gpui-kit 的高亮特性对齐。
  • rust/lithe-core/src/languages/mybatis.rs:适配 tree-sitter 0.26 的 Node::child 参数类型(usize → u32)。
    • 这两处会影响 macOS / Windows 共享 Core,需要确认升级不会破坏两端既有语言高亮行为。
  • .gitignore:rust/target/ 改为 target/,并新增 .vscode/、.codegraph/。
    • 影响面覆盖全部平台的忽略规则,请确认是否符合仓库约定。

架构与边界

  • 遵循 .agents/notes/implemented/architecture/2026-09-13-repository-ownership-and-sharing-boundaries.md:Linux 是独立平台产品,不导入 Swift 源码、不依赖 macOS 类型;共享的确定性行为仍在 rust/lithe-core。
  • 终端、文件系统、进程、LSP 等平台能力留在 Linux 适配层。
  • Windows 侧同类能力不受影响(windows/tauri/ 的 xterm.js + windows/tauri/crates/terminal)。

验证

已在 Linux(Pop!_OS / Ubuntu 22.04,x86_64)本机验证:

  • cargo build --manifest-path linux/Cargo.toml -p lithe-linux 通过。
  • cargo test --manifest-path linux/Cargo.toml -p lithe-linux --lib:52 项全部通过,其中终端相关 12 项覆盖:
    • 坐标/内边距/回滚偏移换算(viewport_to_grid_point)
    • 256 色与加粗高亮解算
    • 引擎联通性:解析输出入网格、回滚 display_offset、选择导出字符串、resize 改变列数
  • .agents/skills/write-stable-tests/scripts/verify-test-stability.sh 通过(有界等待、确定性、资源清理)。
  • node scripts/verify-agent-notes.mjs 通过(36 篇 active note)。
  • 应用可启动运行,无 panic。

PR 规模说明

这是一个平台产品级的总 PR(151 文件 / +40513 行),其中 143 个文件是新增的 linux/ 前端。如果维护者希望拆分 review,我可以按需要拆成若干子 PR(例如:基础设施与构建 → 工作台视图 → 终端 → LSP/Run)。

关联

  • 目标分支:preview
  • 来源分支:VedaChen:linux_front

chenjunjie added 30 commits September 23, 2026 23:44
- 基于 gpui-kit (0.6) 建立独立 Linux 桌面工程 linux/
- 实现 CoreClient 调度层对接 rust/lithe-core
- 构建工作台基础视图:顶部工具栏、侧边栏(文件/搜索/Git)、多标签代码区与 PTY 原生终端底栏
- 新增 Linux 构建脚本 scripts/build-linux.sh 与打包脚本 scripts/package-linux.sh
- 新增 Linux CI 工作流 .github/workflows/ci-linux.yml
- 更新 .gitignore 排除目标产物与临时文件
- 新增 ThemeColors 集中定义深色主题调色板,并在应用入口强制开启 ThemeMode::Dark
- 重构标题栏 (ToolbarView):加入左上角完整桌面菜单栏 (File/Edit/View/Run/Terminal/Help)、项目与分支选择徽章、Search Everywhere 快捷入口
- 新增垂直活动栏 (ActivityRailView):支持在 Files、Git、Search 与 Terminal 间切换/展开侧边栏
- 重构多标签代码区 (EditorView):新增面包屑路径导航条与代码行号槽
- 重写底栏 (BottomPanelView) 与侧边栏 (SidebarView) Tab 控件,修复暗色下按钮低对比度不可见问题
- 新增全局底部状态栏 (StatusBarView):统一展示分支、光标位置、语言及编码状态
- 移除界面中所有 Emoji 字符,全面接入 gpui-kit Lucide 图标体系
- 顶部工具栏重构:实现 Lithe 品牌标识、项目与分支切换胶囊、Search Everywhere 搜索条与 Run/Debug 控制组
- 活动栏重构:对齐 macOS ActivityBar 布局,规范 32x32 图标按钮与激活态指示
- 侧边栏重构:精简工具窗口顶部标题栏,重写 Explorer/Git/Search 视图列表与状态指示徽章
- 多标签代码区重构:对齐 macOS 激活 Tab 2px 蓝条下划线、面包屑导航条、右对齐行号槽与居中空状态
- 底栏与状态栏重构:接入 Terminal/Output/Problems 标签与清理/折叠操作,完善状态栏展示
- editor: 正文改用 gpui-kit 上游 Editor/EditorState,恢复上下滚动、
  文本选中与复制;标签内容与语言在切换时同步进编辑器,编辑变更回写
  标签并置脏,保存读取编辑器实时文本。
- view: 接入 SearchEverywhere 与 SettingsDialog 事件;支持侧边栏宽度、
  底部面板高度的拖拽调整(带边界 clamp)。
- sidebar: 扩展 SidebarEvent/SidebarTab 与文件树交互。
- bottom_panel: 高度可配置。
- 忽略 .codegraph/ 索引目录。
对齐 windows/tauri 的 UI 结构与交互,功能暂不接后端:

- theme: 新增运行时调色板,移植 lithe-dark / lithe-light 全套 token,
  保留旧 ThemeColors 访问器为别名,视图无需改动即可跟随主题。
- settings: 新增 XDG 设置持久化(~/.config/lithe/settings.json),
  键名与 Tauri defaultSettings 对齐,含 coreFeatures / 顺序 / 布局尺寸;
  提供 resolved_theme_id + apply_theme 支持明暗与跟随系统。
- toolbar: 顶栏复刻为紧凑菜单栏(File/Edit/View/Go/Terminal/Run/Tools/
  Window/Help)+ 项目/分支胶囊 + 搜索条 + 运行控件 + 主题切换 + 窗口控件。
- activity_rail: 左侧活动栏 9 项(按 core_features 与设置顺序过滤/排序),
  新增右侧插件活动栏(Extensions / Notifications 带角标 / Maven)。
- status_bar: 按 footerLeading/TrailingItemsOrder 渲染文件路径、分支、
  光标、编码、缩进、只读、内存、Git 变更,变更 chip 可点击打开 Git。
- settings_dialog: 扩展为 12 分类(820x620),设置项读写 XDG 存储,
  主题项即时应用并落盘,支持 Restore Defaults。
- command_palette / quick_open / welcome_screen: 新增三个浮层与欢迎页,
  含分组列表、模式徽标、键盘导航与事件出口。
- main: 改用 AllAssets 以提供完整 Lucide 图标目录。
设置弹窗与全局搜索弹窗的卡片 on_mouse_down 是空处理器,未阻断事件冒泡,
点击卡片内的分类项/控件会冒泡到遮罩并触发 Close。补上 cx.stop_propagation(),
与命令面板、快速打开保持一致。
原实现是单个 Menu 按钮 + 九个子菜单的竖向下拉,与 Tauri `compactFloating`
的 Menubar 形态不一致。改为点击 Menu 图标后在标题栏下方浮出一个横向圆角
菜单条,九个菜单名并排、各自下拉;选择任意菜单项或点击菜单条外部即收起,
与 Tauri 的 onCompactClose 行为一致。图标由 Menu 换成 List 以对齐 ListIcon。
对照 windows/tauri 的 title-bar.tsx,非 macOS 顶栏只有四组元素:
菜单(紧凑按钮/平铺菜单)、项目菜单(logo+项目名+ChevronDown)、
分支胶囊、右侧搜索图标按钮、窗口控件。

删除 Linux 多出的元素:
- ⚡ + "Lithe" 品牌标识
- 中间 280px 全局搜索条(含占位文案与 Ctrl+P 徽标)
- "[Project] Default" 运行目标胶囊
- Run / Debug / Stop 按钮
- 主题切换按钮(Sun/Moon)
- 设置按钮(Settings)

其余对齐:
- 顶栏背景改用 surface(与 Tauri bg-surface 一致)。
- 项目菜单触发器改为 logo 徽标(品牌色圆角方块)+ 项目名 + ChevronDown,
  下拉项顺序对齐 TitleProjectMenu:New Project / Open / Clone Repository /
  Open Projects / Open Recent。
- 右侧只保留搜索图标按钮(quickOpenAction)与窗口控件。
对照 Tauri 真源修复三处不一致:

- 左侧活动栏去掉 maven:Tauri 左栏的 maven 项仅在 `hasMavenRun`
  为真时出现(`main-sidebar.tsx` 有条件传入 `onMavenClick`),
  默认无 Maven 运行故不显示;Maven 入口只保留在右侧插件栏
  (`plugin-activity-rail.tsx` 的 `isMavenAvailable`)。
  新增 `has_maven_run` 开关供后续 Maven 集成打开。
- 浅色模式终端仍深色:`terminal.rs` 硬编码深色底/文字/边框,
  改为主题色(背景/前景/边框/柔和文字/成功色),对齐 Tauri xterm
  取 `--background` / `--foreground` 的行为。
- 项目菜单触发器徽标:去掉蓝色闪电占位,改用与 Tauri
  `public/logo.png` 同一文件的真实应用图标(编译期嵌入,
  20px 圆角展示)。
原空态是自创的 Zap 大图标 + "Lithe IDEA" + 英文介绍 + 快捷键提示,
Tauri 不存在。改为复刻 `empty-editor-state.tsx`:
文件图标(40px)+ 右下角放大镜叠加(20px),标题「选择文件以查看」,
描述「外部工具产生的更改会自动显示。」(与 `locale.ts` 中文文案逐字一致)。
逐项核对 `settings-dialog.tsx` 各分类 `labelKey` 在 `locale.ts` /
`ai-commit.ts` 中的中文翻译,修正 8 处自创标题:
常规(原通用)、项目 · JDK 与 Maven(原项目)、运行配置(原运行)、
LSP(原语言服务)、AI 聊天与编辑(原 AI 助手)、AI 与提交(原 AI 提交)、
Git(原版本控制)。编辑器/快捷键/终端/日志/更新原本已一致。
图标(对照 settings-dialog.tsx):
general→Settings、run→Cog、terminal→SquareTerminal、
ai/ai-commit→WandSparkles、git→Code(与编辑器同图标,和 Tauri 一致)。

面板内容对照 macos-settings-panels.tsx 各 Panel 逐项重写:
- 常规:外观(配色主题/外观模式下拉)、语言、项目打开方式、
  自动保存、Git 保护策略、隐藏路径(目录/文件模式展示+应用)。
- 编辑器:显示(字号步进 10-22、用法与作者开关)、标签页
  (缓冲区轮播)、缩进(制表符宽度下拉)。
- 快捷键:预设下拉(Lithe/VSCode/JetBrains/Xcode)+ 快捷键搜索框。
- 终端:Shell 分组默认 Shell 下拉(系统默认/PowerShell/命令提示符/WSL)。
- LSP:自动补全/参数提示/语义高亮 + 已检测服务器说明。
- AI/AI 提交:分组结构与说明(完整配置后续接入)。
- Git:Fetch 默认行为/集成/视图/默认差异视图/编辑器全量偏好项。
- 日志:位置/诊断/保留策略/诊断包分组结构。
- 更新:软件更新分组(版本+检查按钮+状态文案)。
- 项目:JDK/Maven 三字段结构;运行:描述+生成按钮。

Settings 新增 24 个持久化字段,键与默认值与 Tauri
defaultSettings 一致;新增下拉框/多行文本展示控件。
- 新增 linux/src/i18n.rs:菜单文案国际化,键与 Tauri `menu.*` /
  `titleProject.*` 对齐,按 display_language 取中英文(缺键回空,
  与 Tauri t() 回退行为一致)。
- toolbar 菜单表按 window-menu-bar.tsx 逐项重建:九个菜单的分组、
  条目、分隔线、快捷键(含 View 末尾 Theme 子菜单、Tools 的
  databases 禁用项、Linux 下 Window 无 toggleMenuBar 段)。
- 顶层菜单标题与项目胶囊下拉项全部走翻译;菜单行用
  PopupMenuItem::element 实现左标签右快捷键结构。
- view.handle_action 接入新动作 ID:文件操作、视图切换、全局搜索、
  诊断面板、Explorer/Git 切换、快捷键设置页直达、主题切换
  (menu.theme.<id>),未实现命令落到空分支。
对照 file-explorer-tree.tsx 的 SidebarHeader:
- 去掉新建文件/刷新按钮;标题跟随语言(项目/Project)。
- 新增搜索按钮(tooltip 搜索文件/Search files):点击展开内联
  过滤行,输入即按文件名过滤(含祖先目录),Esc 清空收起,
  X 一键清除;键盘输入由侧边栏焦点+on_key_down 处理。
- 新增偏好设置下拉(tooltip 文件资源管理器偏好设置):
  可见性(隐藏文件/被 Git 忽略的文件/Git 状态标记)、外观
  (文件图标/缩进参考线/紧凑文件夹/隐藏根文件夹)、排序顺序
  (文件夹优先/名称)、缩进(紧凑/默认/宽松/宽)子菜单,
  以及自动显示活动文件/删除前确认开关,全部落盘。
- 文件树渲染应用偏好:排序、隐藏根目录、隐藏文件过滤、
  缩进尺寸、文件图标开关。
- Settings 新增 11 个文件树偏好字段,与 Tauri defaultSettings
  键与默认值一致;i18n 新增 22 个对应中英文案。
- 底部面板默认收起不占空间,对齐 Tauri isBottomPaneVisible=false;
  view.rs 仅可见时渲染分隔条与面板。
- 删除自创的 Output 页签与假日志存储(Tauri 无 Output 面板);
  Problems 更名 Diagnostics(图标/文案对齐 Tauri WarningIcon/diagnostics)。
- 左侧活动栏宽 40→38,去左侧竖条,激活态改 accent 背景,
  tooltip 走 i18n 跟随语言;新增 7 个 workbench.* 中英文案。
对照 Tauri features/maven(导航面板 + 生命周期阶段):
- 新增 MavenView:扫描工作区 pom.xml(深度上限 5,跳过构建产物目录),
  项目树展示模块与 Lifecycle 九阶段,点击阶段发射 RunGoal 事件。
- 右侧栏 Maven 按钮改为开关右侧 280px Maven 工具窗口(对齐 Tauri
  toggleMavenPane);无 pom.xml 时右侧入口自动隐藏,有项目打开时同步。
- RunGoal 接线:底部面板切到 Terminal 并发送 mvn -f "<pom>" <phase>,
  同时打开左侧 maven 项(对齐 Tauri hasMavenRun 语义)。
对照 Tauri locale.ts 与各面板 t() 调用:

- i18n 新增 ~80 键(含 maven/ui/diagnostics/quickOpen/commandPalette/welcome/
  设置全部分类与内容),中英文与上游逐字对齐;Linux-frame 新增键标注。
- workbench:底部 Diagnostics 文案本地化、清除/隐藏按钮本地化;
  左侧活动栏/右侧插件栏/Maven 面板标题与tooltip本地化;状态栏无文件时
  不渲染占位;终端 Clear 本地化;工具栏快速打开本地化、紧凑菜单去
  硬编码英文;欢迎页搜索/暂无项目/移除提示本地化。
- 弹窗:Quick Open 去徽标、占位/空态本地化;Command Palette 分类头
  本地化(条目标题与 Tauri 同保持英文);Search Everywhere 动作名/
  范围/占位/空态本地化,删除底部快捷键提示条。
- 设置:全 12 分类 title_key 接 i18n,头部/底部按钮本地化,开关去
  On/Off 文字,全部面板分组标题/行标题/描述/下拉选项本地化;
  render_group/render_note 入参改 owned String,render_dropdown 接
  owned options 解决生命周期;新增项目工具链/运行生成/AI 等缺键,
  管控语言名 "简体中文" 仅作为选项展示值保留。

构建零错误零告警。
对照 new-project-content.tsx / new-project-model.ts / project-picker.tsx:

- 新增 ProjectDialog(遮罩+560x480 卡片):New 模式来源列表
  (空项目/Next.js/Vite+React,搜索过滤)→详情表单(名称/位置/
  包管理器循环切换/目标预览/中文错误)→创建中;Clone 模式
  (URL/名称自动推导/位置)→后台 git clone。
- 名称校验、URL 推导名、starter 命令字符串逐字移植 model.ts;
  35 个 newProject.*/welcome.* 中英文案照抄 locale.ts。
- Cargo 新增 rfd 0.16:打开与选择父文件夹走原生目录框。
- view.rs:open_project_path 统一换根(sidebar/maven/关欢迎页);
  工具栏与欢迎页的 New/Open/Clone 由占位改为真实链路;
  模板项目打开后 starter 命令发往底部终端。
对照 recent-folders.ts / project-name-menu.tsx / GitBranchManager:

- 最近项目:Settings 新增 recent_projects(去重首位/过滤不存在/
  截断 12,上限常量对齐 MAX_RECENT_PROJECTS);open_project_path 与
  启动时记录;欢迎页列表改读持久化(点击打开/删除同步落盘);
  项目胶囊“最近项目”分组渲染条目,点击直达。
- 分支徽标改下拉:分支列表来自 core git.references 本地分支;
  当前分支打勾禁用;点其他分支经底部终端 git checkout,2 秒后
  刷新 git 状态;分支名为专名不翻译。
- 欢迎页标题/副标题/按钮补 welcome.* 本地化;启动记录抽
  settings::record_recent_project 共用。

构建零错误零告警,Xvfb 实测分支检出与最近菜单。
- 九菜单 File/Edit/View/Go/Terminal/Run/Tools/Window/Help 条目与 Tauri 同序,文案走 i18n
- File:新窗口/开文件夹/关文件夹/另存为/全部保存/还原/标签页批量关闭与恢复
- Edit:撤销重做剪贴板全选注释复制行删除行上下移行;无 LSP 后端项禁用
- Go:跳转到行弹窗、上下标签页;无导航历史/LSP 项禁用
- View:换行/行号/空白符开关、字体缩放 10-22 落盘、go_to_line/面板开关
- Terminal:新建会话 respawn、关闭收起;单会话 split 禁用
- Window:全屏 toggle_fullscreen;Help 外链经 xdg-open
- 紧凑菜单条去掉 on_mouse_down_out(吞弹窗点击),菜单项可触发
- editor_window_action fallback windows()[0];按键路径 editor_direct 直传 window
- 行操作快捷键:Ctrl+D/Ctrl+//Ctrl+Shift+K/Alt+Up-Down
- Xvfb 验证:复制行/切换注释/删除行生效
- Settings 补 Tauri 字段:fontFamily/lineHeight/renderWhitespace/vim/formatOnSave/terminalFontSize/cursorBlink/uiFontSize/gitExecutable/gitUseCredentialHelper/aiProvider/aiModel/aiCompletion/aiCommit/customLogDirectory;fontSize 默认 14
- General:隐藏目录/文件改为 Textarea 可编辑,应用按钮解析落盘
- Editor:字体下拉/行高步进/空白符下拉/字号 8-32,新增行为分组(换行/Vim/保存格式化);编辑器每帧同步 wrap/行号/空白符
- Keyboard:预设补全 8 项,Vim 开关
- Terminal:Linux 真实 shell 探测下拉,字号/回滚量/光标闪烁;终端按设置 shell 建会话、字号渲染
- LSP:保存时格式化开关
- Project:工具链三行可编辑,which 探测回填,保存写 .lithe/run/local.json
- Run:读 configurations.json 列表,生成默认 Java 配置
- AI:提供商下拉/模型输入应用/自动补全开关;AI 提交:启用/语言/格式/正文/标题长度/diff 上限
- Git:执行分组(可执行路径探测清空应用+凭据助手开关)
- Logs:自定义目录选择应用、清理 *.log、导出 diagnostic-bundle.json
- Updates:检查更新显示已是最新版本
- Xvfb 实测:生成/保存/步进/探测/选择/导出/检查/应用均落盘生效
- 右侧:RightToolView 三视图(通知/Maven/扩展),toggle 语义同视图再点关闭,不持久化
- 通知面板:搜索过滤、全部已读、诊断行点击跳转文件行、未读数同步铃铛角标
- 扩展面板:扫描 Plugins/ + 内置项,搜索/分类/启用开关落盘 extensions.json
- 底部:新增 Run(运行历史+重跑,经 send_terminal_command 统一记录)与 GitLog(git log 只读列表)Tab
- 左下:run/maven/gitLog 映射到独立 Tab;maven 图标仅运行历史非空出现;settings 开弹窗
- run.start 补进命令映射;构建零告警,Xvfb 全量实测通过
- 工具栏搜索按钮 tooltip 改用 workbench.search,对齐 title-bar.tsx quickOpenAction
- QuickOpen 增加已打开/最近/其他三段分组与命中计数徽标,对齐 useFileSearch + FileCountBadge
- 新增 quickOpen.filesCount/fileCountOne 文案
- 新增 linux/assets/file-icons(lithe-icons SVG + map.json)
- 新增 linux/build.rs:编译期生成查找表与 SVG 内嵌字节
- 新增 workbench/file_icon:对齐 Tauri 文件名/多后缀扩展名/目录名查找与深浅主题
- 侧边栏、快速打开、编辑器标签页接入,缺失回退 Lucide 单色图标
- links 冲突:全图只允许一份 tree-sitter 原生库
- core 仅用 Parser/Node 基础 API,适配 Node::child 改取 u32
chenjunjie added 10 commits September 26, 2026 03:52
- 结果列表改用官方 uniform_list + UniformListScrollHandle,只布局可见行
- 命中结果缓存化:仅在查询/范围/文件索引变化时重算,render 不再全量过滤
- 结果上限 200 并展示 "… more"(对齐 macOS SearchEverywhereResults.matchLimit)
- 空查询不渲染结果区(对齐 macOS if hasQuery),打开面板不再渲染全部文件
- 文件路径小写副本在 set_files 一次性预算,按键匹配零分配
- 方向键导航后 scroll_to_item(Center),选中项滚动到可视区中央(对齐 macOS)
点击"更改"列表中的文件时进程直接退出:rgitui DiffViewer 渲染路径
直接读 cx.global::<rgitui_settings::SettingsState>(),而 main.rs 接入
rgitui 时只调用了 rgitui_theme::init,遗漏上游约定 app 启动必须调用
的 rgitui_settings::init,触发 GPUI "no state of type SettingsState"
panic。

- main.rs 在 rgitui_theme::init 旁补调 rgitui_settings::init
- Cargo.toml 补声明 rgitui_settings path 依赖(Cargo.lock 同步)
- 已确认 diff/ui 渲染路径仅依赖该全局(AvatarCache 走 try_global
  可安全缺省),补齐后无同类未初始化 panic
对齐 macOS/Windows 的滚动预览发布模式:定时 + 手动触发,构建
package-linux.sh 产物并附带 sha256,上传到共享 preview 标签。
以 x86_64-pc-windows-msvc 目标编译 lithe-linux crate,产出未签名
zip + sha256,上传到共享 preview 滚动标签。
tree-sitter-sequel 将 cc 钉在 ~1.2.1,cc 1.2.67 在 MSVC 目标上因
find-msvc-tools 0.1.13 的 FILE_ATTRIBUTE_TEMPORARY 为 i32 而编译失败;
0.1.14 改为 u32 修复该类型不匹配。
ubuntu-latest 为 24.04(glibc 2.39),产物在 glibc 2.35 的系统
(如 Pop!_OS 22.04)上无法运行;固定 22.04 将最低要求降为 2.35。
22.04 发布任务不能复用 ubuntu-latest(24.04) 构建的 target 缓存,
否则 proc-macro dylib 因 glibc 不兼容无法加载。
- 新增 scripts/prepare-jdtls-linux.sh 与 scripts/prepare-jdk-linux.sh,
  复用 .artifacts/jdtls-downloads / jdk-downloads 缓存并按 manifest
  SHA-256 校验,生成 .artifacts/jdtls-linux、.artifacts/jdk-linux
- third_party/jdk/manifest.json 增加 linux-x86_64 Temurin 条目
- package-linux.sh 将运行时暂存到 share/LanguageServers/{jdtls,jdk},
  可用 LITHE_BUNDLE_RUNTIME=0 跳过;ci-linux.yml 编译校验保持轻量
- release-preview-linux.yml 增加 Java 运行时下载缓存步骤
- lsp.rs 资源查找顺序对齐其他端:环境变量 → 安装目录
  share/LanguageServers → 工作区 .artifacts(开发路径)
- docs/ci-builds.md 补充 Linux 解压输出的复用说明

@1lck 1lck left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

增量复审结论:请求修改

依据仓库 develop-lithe / lithe-code-review Skill,已补查最新提交 8210bb8c15c2aae3e42cab8c0afababdf22dd477。

必须修复:P1

上轮指出的进程管理器所有权问题仍然存在:释放一个执行句柄会触发共享会话集合的全局清理,可能终止其他仍在运行的 Run/Maven 任务。详见行内评论。

建议修改:P2(不单独作为阻塞结论)

  1. 等待超时被当成完成,上轮问题未修且扩散至终端。 run/process.rs:139 与 terminal.rs:459 都使用 finished || timed_out()。工作线程没有结束时,超时仍返回成功,后续无界 join() 可能卡住。应只在真实完成时返回成功,并确保超时分支不无界等待未结束的线程。
  2. 新增 Git 面板的未跟踪文件 diff 为空。 git_panel.rs:177 构造 git.diff 请求时未设置 untracked。Core 默认该值为 false,从而执行普通 git diff,不会返回新建未跟踪文件的内容。请根据 status 传递该字段,并覆盖新建文件选择场景。
  3. 最新 JDTLS 缓存复用缺少版本身份检查。 prepare-jdtls-linux.sh:100 只要现有目录通过文件存在性检查就提前退出,没有核对已解压资源与当前 manifest 的身份。只更新 JDTLS 或 Lombok 版本、而调试/测试插件文件名不变时,可能继续打包旧资源。请核对版本与校验身份,不匹配时重新生成。
  4. 最新 JDK 缓存失效时无法自动重建。 prepare-jdk-linux.sh:48 在身份不匹配时调用 exit 1;第 54 行虽然把校验放在条件中,函数内的 exit 仍会直接终止脚本。已有旧版输出目录时,更新 manifest 后打包会直接失败。请让复用校验返回失败并进入重建路径;JDTLS 的不完整目录校验也有同类退出问题。

当前 CI 与验证范围

该提交已有确定失败:Linux cargo fmt、平台功能矩阵检查、git diff --check 行尾空白。请同步处理;Linux 构建和打包未因这次 CI 得到完整验证。

本次为静态增量审查与现有 CI 日志核验,未本地运行完整构建、测试或应用;大量引入的第三方源码未逐行重审。

}
}

impl Drop for ProcessManagerInner {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P1] 仅在最后一个管理器所有者释放时清理全部会话

来源:上轮 P1 仍未修复。ProcessManagerInner 派生 Clone,内部 sessions 是共享的 Arc<Mutex<HashMap<...>>>;但 ProcessManager 按值持有该 inner,每个克隆各自都会执行这里的 Drop。start() 返回的每个 ProcessHandle 又持有一个 manager 克隆。

因此同时运行 A、B 两个任务时,即使 A 的 ProcessHandle::drop 先只停止了 A,接下来释放其 manager/inner 仍会在这里 drain 整个共享集合并终止 B。单独释放一个 manager 克隆也会触发相同问题,破坏独立会话的生命周期。

建议让 ProcessManager 持有 Arc<ProcessManagerInner>,将全局析构清理放在最后一个所有者释放时;单个句柄只清理自身 execution。请用两个独立会话验证:释放 A 或临时 manager 克隆后,B 仍然存活并可正常完成。

打包 share/LanguageServers/jdk 时不再复制完整 Temurin JDK(解压 346MB),
改为用 jlink 从 jmods 生成精简运行时(约 93MB,含 java/javac/jar 与
JDT LS、Java Debug/Test、javac 预编译所需的模块集),开发用的
.artifacts/jdk-linux 仍是完整 JDK。已验证精简运行时可正常启动 JDT LS。
@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

.gitignore 里面混入了你自己的东西来着,记得删掉

@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

希望这个 svg 最好直接进行共用来着,win 跟 Linux 应该不会出现啥冲突的来着

chenjunjie added 14 commits September 28, 2026 13:40
- 顶栏改用 TitleBar 客户端装饰,去掉与 WM 叠加的两层窗口控制按钮,
  新增运行配置胶囊 + Run/Rerun + Debug + Stop(对齐 mac 顶栏语义)
- Tests/Debug 按钮与占位面板补齐,底部活动栏顺序/图标对齐 macOS
- 右侧插件栏顺序对齐(通知→插件→Maven),圆点徽章、选中高亮、
  Maven 改用 IDEA 图标;通知面板头部对齐(Clear All + 打开即已读)
- Run/Maven 输出智能滚动:上翻不拉底,右下角“跳到最新”浮层
- Maven 构建失败解析 [ERROR] 为可点击 issue 列表并支持跳转源码
- Spring Boot 等框架服务缺 Java 元数据时弹 Rescan 确认,经
  JDT entrypoints 重新生成配置后续跑,不再回退会失败的 mvn goal
- 渲染性能优化:LSP 轮询条件化 notify、render 移除高频实体读取、
  下游 set_* 等值守卫;dev-dependencies 启用 gpui-kit test-support
- linux/Cargo.toml:gpui-kit 主依赖与 dev-dependencies(test-support)0.6 -> 0.7
- third_party/gpui_xterm/Cargo.toml:gpui-pre 0.3.6 -> 0.3.7、gpui-component 0.6 -> 0.7
- linux/Cargo.lock:同步 27 个 gpui 系列包版本

验证:
- scripts/build-linux.sh 编译通过,产物 target/debug/lithe-linux
- linux/ 下 cargo test --lib 全绿(99 passed, 0 failed)

经实际编译验证,linux/ 与 gpui_xterm 源码所用的 API
(TitleBar/Button/Icon/h_flex、v_flex/PopupMenu/Input/ScrollableElement、
Root/Theme/application/WindowDecorations/AllAssets/gpui_kit::test 等)
在 0.7 中保持兼容,未发现需要改名或降级实现的破坏性变更。
对齐 Windows Tauri 端点击运行后的 Run 面板功能与 UI:

- Java 语言服务准备状态可折叠区块:摘要行(就绪 ✓/加载/失败)+
  四阶段进度(启动/导入/同步/构建)+ 说明文案 + "语言服务设置与重试 /
  查看日志"入口(事件打开设置对话框并定位 LSP/日志页)。
- 构建失败策略(对齐 run-preferences):每工作区
  javaBuildFailurePolicyByWorkspace 落盘;策略为 alwaysProceed 时准备状态
  区块显示"构建失败时直接继续启动"并可一键"重新询问"。
- Java 构建失败决策对话框:原先构建失败一律终止启动,现按策略
  询问(仍然运行 / 始终继续,不再询问 / 取消),对齐 JavaLaunchDecisionBanner。
- 配置详情区块:右侧输出区上方展示 类型(Spring Boot/Java/Maven)与主类,
  并加"进程输出"标题,与 Tauri 配置详情一致。
- Run 面板头部新增"重启运行"按钮(运行中可用,对齐 Tauri 重启图标)。

数据链路无新增 IPC:准备快照继续读 Core projectPreparation 事件
(workbench.java_lsp_status),决策经面板事件 + 轮询同步给异步启动流程。
运行面板提示 "JDT LS is not installed" 的根因:资源解析只查
环境变量 → 发行布局 share/LanguageServers → 被打开工程的
.artifacts/jdtls-linux;开发构建(target/debug/lithe-linux)打开无自身
.artifacts 的外部 Java 工程时全部落空,导致 Java 项目准备失败。

新增 dev_checkout_runtime_root:从可执行文件位置向上查找仓库根
.artifacts/<name>(查找顺序保持 环境变量 → 发行布局 → 工作区 → 构建仓库),
不引入硬编码路径,发行安装不受影响;含工作区优先级回归测试。
- 左侧列表按 Tauri RunPane 语义分组:服务常显;Docker 服务(基础设施)与其他
  运行配置默认折叠,展开后内分应用/任务小节;current-file 不再进列表
- 新增 RunConfigGroup/normalized_group/sort_by_name(对齐 normalizeExecution、
  infrastructureConfigurations、sortedByName),附单元测试
- 配置行改为单行名称 + 图标 + 悬停显示齿轮编辑入口(打开设置→运行配置),
  运行按钮常驻,去掉原两行 kind/detail 副文本堆叠
- 右侧配置详情未选中时显示占位文案;进程输出区空态显示提示,
  不再以"开始运行/等待"原始文本顶替
- i18n 新增 run.configurations/services/infrastructure/otherConfigurations/
  applications/tasks/editService/selectConfiguration 中英文案
JDTLS 的 Eclipse `-data` workspace 落在 <工程>/.lithe/lsp/java/jdtls/<hash>
(cacheDirectory 直接传工程内路径),Eclipse 因"项目位置与自身 workspace
重叠"(overlaps the workspace location)拒绝导入根 Maven 工程,
Java 项目准备停在失败。

对齐 Windows(app_cache_dir()/language-servers)与 macOS(cacheDirectoryURL)
的平台缓存布局:Linux 新增 lsp::cache_root()(XDG_CACHE_HOME →
$HOME/.cache → 系统临时目录),所有 provider 的 cacheDirectory 改为
平台缓存/<provider_id>,不再写入工程 .lithe。
- 设置→运行配置从只读列表升级为可选中的列表 + 单配置编辑器
  (对齐 Tauri run-configuration-settings / RunConfigurationEditor):
  配置信息(类型/来源/主类)、保存范围(本机/项目)、配置覆盖
  (JDK/Maven/Maven JDK/Maven 测试策略/程序实参/VM 实参/工作目录/环境变量)、
  项目默认设置区(打开项目设置入口 + Node 可执行文件)
- 保存走 Core runConfig.saveEditorChanges,宿主按返回文档原子写回
  .lithe/run/local.json、run/configurations.json、toolchains/local.json
  (失败回滚),并广播 RunConfigurationChanged 刷新运行面板
- BottomPanelEvent::OpenSettings 增加 configuration_id:运行面板行齿轮
  打开设置并直接进入该配置编辑器(对齐 Tauri editInSettings)
- 新增编辑器数据层:RunConfigItem::options/kind_title/source_label/
  uses_*_toolchain、run_options_overrides、environment_text/from_text、
  save_editor_changes_request(project 范围路径归一)、write_editor_documents,
  附 6 个单元测试;i18n 补齐编辑器中英文案
原底部状态栏内存项恒定显示 0(memory_mb 从未被写入)。参照 Windows
Tauri 的 memory.rs,在 Linux 平台适配层新增 process_memory 模块并接上轮询:

- 新增 linux/src/workbench/process_memory.rs:
  - 读 /proc/self/statm 得到应用 RSS,回退 /proc/self/status 的 VmRSS;
  - 扫描 Lithe 进程树中命中 JDT LS(Eclipse Equinox)特征的子进程,
    只把真正的语言服务计入 total,排除终端/Run/Maven 等用户自启子进程;
  - 平台专有代码按 #[cfg] 隔离,非 Linux 目标给空实现,UI 只消费平台无关的
    ProcessMemoryUsage,不绑死系统 API。
- status_bar.rs:内存项从恒为 0 的 memory_mb 改为 Option<ProcessMemoryUsage>,
  文本格式对齐 Tauri footer 的 'Total {total} · Lithe {used}'(MB 保留一位小数);
  无采样时整项不渲染,仅在展示文本变化时 notify。
- view.rs:新增 spawn_memory_poll,每 10 秒采样一次(与 Tauri
  ApplicationMemoryPoller 同频),首帧立即采一次,采样放后台 executor,
  失败保留上一次成功值,不阻塞工作台。
- mod.rs:注册 process_memory 模块。

验证:./scripts/build-linux.sh 编译通过;process_memory 单元测试 6 项全部通过。
内存项此前恒为英文 'Total ... · Lithe ...',默认简体中文下仍显示英文。
改为按显示语言切换(默认中文):

- status_bar.rs: display_text 增加语言参数,中文输出
  '总计 {total} · Lithe {used}',英文保留 'Total {total} · Lithe {used}';
  渲染与 set_memory 去重比较都按当前语言取文案;新增 2 项文案/格式化测试。
- view.rs: SettingsEvent::Changed 时主动刷新状态栏,语言切换后立即更新内存
  项文案,不必等下一次采样。

验证:./scripts/build-linux.sh 编译通过;status_bar 测试 2 项全部通过。
select_run_config 在选中项变化时错误地递归调用自身(bcf52079 引入),
点击运行/配置行选中会沿 run_configuration_id → select_run_config 无限
递归直至主线程栈耗尽,整个画面卡死。改为直接赋值 selected_run_config。
底部状态栏此前多处文案与 Tauri footer 不一致,且缩进项在中文下仍显示
英文 'spaces'。逐项对齐 Tauri(含中英切换):

- indent: 中文 '{n} 个空格' / 英文 '{n} spaces'(修复中文下仍显示 spaces)。
- readOnly: 中文 '只读'/'可写';英文 'Read-only'/'Writable'
  (原来可写态错误显示 'Editable',Tauri 是 'Writable')。
- cursor: 改为 Tauri 的 '{line}:{col}' 紧凑格式(原为 'Ln x, Col y')。
- gitChanges: 无变更时只显示成功色对勾、不显示数字(对齐 Tauri 的
  CheckCircleIcon 分支);有变更时显示 '{n} 个更改' / '{n} changes'
  (原为裸数字)。
- cursor/encoding/indent/readOnly 仅在存在活动编辑器时渲染,memory /
  gitChanges 始终渲染,对齐 Tauri useFooterEditorStatusItems 的条件。
- labeled() 的 label 改为 Option,允许只渲染图标。

验证:./scripts/build-linux.sh 编译通过;status_bar 测试 5 项全部通过。
纯 rustfmt 格式化(随前几次功能提交的 fmt --manifest-path 全量格式化带出),
无行为变化。

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants