Conversation
- 基于 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
- 结果列表改用官方 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
left a comment
There was a problem hiding this comment.
增量复审结论:请求修改
依据仓库 develop-lithe / lithe-code-review Skill,已补查最新提交 8210bb8c15c2aae3e42cab8c0afababdf22dd477。
必须修复:P1
上轮指出的进程管理器所有权问题仍然存在:释放一个执行句柄会触发共享会话集合的全局清理,可能终止其他仍在运行的 Run/Maven 任务。详见行内评论。
建议修改:P2(不单独作为阻塞结论)
- 等待超时被当成完成,上轮问题未修且扩散至终端。 run/process.rs:139 与 terminal.rs:459 都使用
finished || timed_out()。工作线程没有结束时,超时仍返回成功,后续无界join()可能卡住。应只在真实完成时返回成功,并确保超时分支不无界等待未结束的线程。 - 新增 Git 面板的未跟踪文件 diff 为空。 git_panel.rs:177 构造
git.diff请求时未设置untracked。Core 默认该值为 false,从而执行普通git diff,不会返回新建未跟踪文件的内容。请根据 status 传递该字段,并覆盖新建文件选择场景。 - 最新 JDTLS 缓存复用缺少版本身份检查。 prepare-jdtls-linux.sh:100 只要现有目录通过文件存在性检查就提前退出,没有核对已解压资源与当前 manifest 的身份。只更新 JDTLS 或 Lombok 版本、而调试/测试插件文件名不变时,可能继续打包旧资源。请核对版本与校验身份,不匹配时重新生成。
- 最新 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 { |
There was a problem hiding this comment.
[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。
|
.gitignore 里面混入了你自己的东西来着,记得删掉 |
|
希望这个 svg 最好直接进行共用来着,win 跟 Linux 应该不会出现啥冲突的来着 |
- 顶栏改用 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
# Conflicts: # .gitignore
- 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 全量格式化带出), 无行为变化。
背景
本 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/:工作台各区域视图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 元素」的投影:alacritty_terminal0.26 提供。Term::resize、Term::scroll_display、Selection+selection_to_string、RegexSearch+Term::search_next、Term::renderable_content。WindowTextSystem::em_layout_width按字号实测,鼠标命中换算、网格cols/rows、PTY 尺寸三处共用同一套CellMetrics。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-sitter0.25 → 0.26,与gpui-kit的高亮特性对齐。rust/lithe-core/src/languages/mybatis.rs:适配 tree-sitter 0.26 的Node::child参数类型(usize→u32)。.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。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)display_offset、选择导出字符串、resize改变列数.agents/skills/write-stable-tests/scripts/verify-test-stability.sh通过(有界等待、确定性、资源清理)。node scripts/verify-agent-notes.mjs通过(36 篇 active note)。PR 规模说明
这是一个平台产品级的总 PR(151 文件 / +40513 行),其中 143 个文件是新增的
linux/前端。如果维护者希望拆分 review,我可以按需要拆成若干子 PR(例如:基础设施与构建 → 工作台视图 → 终端 → LSP/Run)。关联
previewVedaChen:linux_front