Skip to content

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

Closed
VedaChen wants to merge 115 commits into
1lck:previewfrom
VedaChen:linux_front
Closed

VedaChen wants to merge 115 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 3 commits September 26, 2026 14:24
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 and others added 15 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 全量格式化带出),
无行为变化。
@VedaChen
VedaChen marked this pull request as draft September 29, 2026 16:16

@xiaoyumuxi xiaoyumuxi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

本轮仅针对上次审查后新增的 Linux PTY 控制台增量;发现 1 个 P2 非阻塞问题,见 inline comment。未批准或合并。

execution_id: &str,
steps: Vec<ProcessStep>,
sender: mpsc::Sender<ProcessEvent>,
terminal_size: PtySize,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[P2] 运行中的 PTY 需要跟随控制台尺寸变化

这里把 terminal_size 作为一次性的 PtySize 传入 worker;OutputConsole 的 resize 回调只更新自己的 size slot,运行期间没有拿到 PTY master 去调用 resize。复现:启动一个会持续运行并按列宽排版的 Maven/CLI 任务,然后拖动底部面板或窗口改变宽度;子进程仍使用启动时的 cols/rows,�[?25l/ 进度或全屏输出会按旧宽度换行、截断或错位,直到下次启动才恢复。建议让受管进程持有可 resize 的 master/共享尺寸回调,并在控制台每次测量变化时同步 PtySize;如果产品有意接受快照行为,也应在 UI/需求说明中明确限制并覆盖该边界测试。

@xiaoyumuxi xiaoyumuxi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

本轮增量还发现 rolling preview 发布脚本在已有 Release 时不会移动 tag;Linux 与 Windows GPUI 两处同类 inline,未批准或合并。

run: |
set -euo pipefail
notes="Rolling Preview build from ${SOURCE_SHA}. This release is replaced by the next scheduled build. The Linux package is an unsigned tar.gz archive."
if ! gh release view "$RELEASE_TAG" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1; then

@xiaoyumuxi xiaoyumuxi Oct 6, 2026 •

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[P2] 已存在的 rolling Release 也必须更新 tag target

这里在 gh release view 成功后直接跳过 gh release edit,所以第一次创建 preview-0.3.0 后,后续定时构建只会用 --clobber 替换附件,Release 的 tag 仍指向首个构建的 commit,标题/说明中的 SOURCE_SHA 也会过期。复现:先让一次 schedule 创建 release,再在 preview 推送新 commit 运行第二次;下载到新 tarball 后解析 preview-0.3.0 仍得到旧 commit。macOS rolling workflow 已在复用 Release 时执行 gh release edit --target "$SOURCE_SHA",这里应在 gh release view 成功分支同样更新 target/title/notes(并保留并发竞态后的重查)。

shell: pwsh
run: |
$notes = "Rolling Preview build from $env:SOURCE_SHA. This release is replaced by the next scheduled build. The Windows GPUI package is an unsigned preview of the native GPUI frontend."
$existing = gh release view $env:RELEASE_TAG --repo $env:GITHUB_REPOSITORY 2>$null

@xiaoyumuxi xiaoyumuxi Oct 6, 2026 •

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[P2] 已存在的 rolling Release 也必须更新 tag target

与 Linux workflow 相同:gh release view 成功后没有 gh release edit,后续定时构建只替换 zip 附件,preview-0.3.0 仍解析到第一次构建的 commit,Release notes 的 SOURCE_SHA 也陈旧。复现:第一次 schedule 创建 release 后更新 preview 再跑一次 workflow,gh release view preview-0.3.0 --json targetCommitish 仍返回旧 SHA。请在已存在分支执行与 macOS workflow 等价的 target/title/notes 更新,并保留创建竞态后的重查。

@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

@VedaChen 佬这个 PR 还搞么?

@xiaoyumuxi xiaoyumuxi closed this Oct 16, 2026
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