背景
Windows 端的 Git Log 引用树目前右键没有反应。生产环境会统一禁用 WebView 原生右键菜单,而 Git 引用树没有接入应用自己的 ContextMenu。
macOS 端已经有部分 Git 引用右键操作,但远程分支相关动作不完整。两个平台的 Git 行为不应分别实现:确定性的 Git 命令构造、参数校验、引用解析和结果模型应继续统一放在 rust/lithe-core,Windows 和 macOS 只负责 UI、状态编排及平台边界适配。
目标
以“当前本地分支为 main,选中远程引用 origin/feature”为例,在 Windows 和 macOS 的 Git Log 引用树中提供一致的核心操作:
- 检出选中引用
- 从选中引用新建分支
- 检出选中分支,并将其变基到操作前的当前分支
- 与当前分支比较
- 显示与工作树的差异
- 将当前分支变基到选中引用
- 将选中引用合并到当前分支
- 使用变基将选中的远程分支拉入当前分支
- 使用合并将选中的远程分支拉入当前分支
标签仅保留适用操作;例如 tag 不显示远程拉取,当前分支不显示会对自身执行的检出、合并或变基。
架构约束
调用链保持如下:
- macOS:SwiftUI -> GitFeatureModel/GitService -> RustGitOperations -> C ABI -> rust/lithe-core
- Windows:React -> Git API -> Tauri platform_invoke -> lithe_core::execute_json
具体要求:
- rust/lithe-core 负责共享 Git 语义、完整引用校验、命令参数构造和稳定错误。
- shared/contracts 与 shared/fixtures 记录新增的跨平台行为。
- Windows 不新增另一套 Git 实现,也不能把远程引用强制包装为 refs/heads/*。
- macOS 不直接从 View 调用 Rust C ABI,工作流仍由 GitFeatureModel 和 GitService 编排。
- 两个平台传递完整 GitReference,包括 fullName、shortName 和 kind。
- 继续通过结构化参数执行 Git,不通过 shell 拼接命令。
当前差距
Windows
- GitReferenceTree 只有左键选择,没有应用内右键菜单。
- 全局禁用了原生右键菜单,因此用户看到的是“右键无反应”。
- checkout 固定使用 referenceKind: local。
- merge、rebase 和部分创建分支路径会把输入强制转换为 refs/heads/,无法正确处理 refs/remotes/。
- 缺少“引用与工作树比较”的专用 UI/API 入口。
- 需要补齐确认框、分支名输入框、执行中禁用、成功/失败提示和冲突状态刷新。
macOS
- 已有“从引用新建分支”“与工作树比较”“选择/执行引用比较”。
- checkout、merge、rebase 等操作目前主要限制在本地引用。
- 远程 checkout 的 Rust 适配能力已经存在,但 Git Log 右键菜单没有完整暴露。
- 需要补齐“检出并变基”和“按合并/变基策略拉入选中远程引用”等工作流。
Rust Core
现有能力可直接复用:
- createBranch
- checkout(支持 local、remote、tag,远程分支可创建 tracking branch)
- merge
- rebase
- fetch
- pull(当前分支 upstream)
- git.diff / git.comparison
- checkoutPreflight / integrationPreflight
- 冲突 continue、abort、skip
建议仅为确实缺失的共享语义扩展 Core:
- checkoutAndRebase:记录操作前的当前本地分支,检查工作树,检出选中的本地/远程分支,再将检出后的分支变基到原当前分支。
- 显式远程引用拉取:pull 接收完整 refs/remotes// 与 merge/rebase 策略,由 Core 安全拆解 remote 和 branch 并执行,不由 TS/Swift 拼 Git 参数。
实施方案
1. 共享契约与 Rust Core
- 更新 shared/contracts/rust-core-api.md。
- 先更新 shared/fixtures/git/write.json,再让第二个平台消费新增行为。
- 为新增操作补充请求校验、稳定错误和 Rust 测试。
- 组合检出/变基在脏工作树上必须先阻止操作,不能先切换分支再因 rebase 失败而留下半完成状态。
- 远程引用必须保留 refs/remotes/* 身份,禁止误当成本地分支。
2. Windows 适配层
- Tauri 翻译器同时兼容现有短分支名调用和新的完整引用调用。
- checkout、checkout preflight、merge、rebase、integration preflight、create branch 都支持 fullName。
- 增加引用到工作树 diff 的兼容命令,翻译到现有 git.diff。
- 保留现有本地分支管理器行为,避免回归。
3. Windows UI
- 在 GitReferenceTree 的叶子引用上接入应用现有 ContextMenu。
- 右键时同步选中对应引用。
- 在 GitLogToolWindow 或专用 hook 中实现输入、确认、执行、刷新和提示流程。
- 菜单按引用 kind、isCurrent 和当前操作状态显示或禁用。
- 所有文案补齐英文和中文本地化。
- Git 冲突后刷新 operation state,继续使用现有冲突解决入口。
4. macOS UI
- 扩展 GitLogView 的现有 contextMenu。
- 通过 GitFeatureModel/GitService 调用共享 Core 能力。
- 复用现有 checkout、integration preflight、冲突和通知流程。
- 对远程引用开放合法的 checkout、merge、rebase、比较和拉取入口。
验收标准
- Windows Git Log 中右键本地分支、远程分支和 tag 均会打开应用内菜单。
- Windows 和 macOS 对同一引用显示一致且适用的核心动作。
- 上述 9 个远程分支场景均可从 UI 完成。
- 远程引用从 UI 到 Rust Core 全链路保持 fullName 和 kind,不被转换为 refs/heads/*。
- 自合并、自变基、当前分支重复检出等情况被稳定阻止。
- 脏工作树、checkout 阻塞、merge/rebase 冲突均有明确反馈,且不会静默丢失更改。
- 操作成功后工作树、提交历史和引用列表正确刷新。
- Windows 菜单和对话框提供中英文文案。
- Rust、Windows TypeScript/Tauri 和 macOS 均有针对性测试。
验证
至少执行:
- ./scripts/verify-rust-core.sh
- ./scripts/verify-shared-contracts.sh
- ./scripts/verify-windows-boundaries.sh
- ./scripts/test-macos.sh
- Windows 前端相关 Bun 测试与 typecheck
- Windows Tauri Rust 测试
- 在 Parallels Windows 环境中执行 Release 构建并实际验证右键菜单及关键流程
背景
Windows 端的 Git Log 引用树目前右键没有反应。生产环境会统一禁用 WebView 原生右键菜单,而 Git 引用树没有接入应用自己的 ContextMenu。
macOS 端已经有部分 Git 引用右键操作,但远程分支相关动作不完整。两个平台的 Git 行为不应分别实现:确定性的 Git 命令构造、参数校验、引用解析和结果模型应继续统一放在 rust/lithe-core,Windows 和 macOS 只负责 UI、状态编排及平台边界适配。
目标
以“当前本地分支为 main,选中远程引用 origin/feature”为例,在 Windows 和 macOS 的 Git Log 引用树中提供一致的核心操作:
标签仅保留适用操作;例如 tag 不显示远程拉取,当前分支不显示会对自身执行的检出、合并或变基。
架构约束
调用链保持如下:
具体要求:
当前差距
Windows
macOS
Rust Core
现有能力可直接复用:
建议仅为确实缺失的共享语义扩展 Core:
实施方案
1. 共享契约与 Rust Core
2. Windows 适配层
3. Windows UI
4. macOS UI
验收标准
验证
至少执行: