Lithe 功能矩阵

数据版本:8b1d666933cc4250c04770fcd755073bfd07c447

Markdown · CSV · JSON

macOS:实现:✅ 183 已实现,🟡 21 部分实现,❌ 15 未实现,🧩 13 平台专属;验证:✔️ 7 已验证,🔍 198 待验证,— 27 不适用

Windows:实现:✅ 158 已实现,🟡 21 部分实现,❌ 36 未实现,🧩 17 平台专属;验证:✔️ 7 已验证,🔍 171 待验证,— 54 不适用

实现状态与运行验证相互独立;代码存在不代表已通过实机验收。

分类能力macOSWindows负责人验证方式 / 备注
AI / Agent 对话可选 ACP Agent 对话:API Key 鉴权、项目会话与历史恢复、模型/权限/思考配置与响应期间预选下一轮配置、不依赖凭据的本机默认模型同步、无效默认模型回退官方推荐或可用目录模型、保留官方模型列表与品牌模型图标、CC GUI 风格紧凑的完整模型目录(无搜索框)与权限弹出面板及按配置行定位的独立说明子菜单、工具详情与权限、停止确认和进程清理、按内容显示任务进度、真实子代理与文件修改摘要,并通过共享弹出面板进行文件差异审阅及受保护回撤、同一未关闭会话重连保留审阅基线、拒绝末端链接替换及与原生保存串行的创建回撤、基于实际进度的等待/推理/执行/授权/重连次数/停止状态、Codex/Claude 本机供应商导入来源隔离与旧关联修复、带品牌图标并向上展开的 Agent 切换菜单、Codex API Key 原生恢复与五次共享预算、永久错误快速返回及首次连接二十秒重连上限、已有工作后原生恢复不受 Host 截止或第二份次数预算中断、有效计划更新退出重连并保留轮次计时与状态优先级、正常长任务与授权等待无整轮期限、静默只提醒并允许继续等待或停止、macOS 面板边缘原生滚动条与按可用宽度 80% 居中的阅读列、默认单行并随草稿增长且封顶后内部滚动的输入框、按可见轮次区分长短标记的悬停预览和点击跳转、长会话懒加载下的原生底部跟随与历史浏览位置保持、滚动容器预留权限空间避免消息定位与布局循环、Claude 恢复历史模型时不沿用启动默认值并等待底层模型重新确认、恢复单行会话标题与独立历史管理按钮、按内容出现的紧凑活动摘要、输入框内底部配置及按需展开的上下文与会话详情;Codex 进程供应商与显式认证路由一致,避免 0.166 轮次准入误报内部错误
agent-acp-conversation
已实现
待验证
证据路径
macos/Sources/LitheAgentConversationModule
macos/Sources/Lithe/Views/Agent
rust/lithe-agent-host
macos/Tests/LitheTests/AgentBrandIconResourceTests.swift
macos/Sources/Lithe/Views/Agent/AgentSessionSelectors.swift
macos/Tests/LitheTests/AgentSessionSelectorLayoutTests.swift
macos/Tests/LitheTests/AgentConversationFeatureModelTests.swift
macos/Sources/Lithe/Platform/MacOS/Agent/MacAgentEditRestorer.swift
macos/Tests/LitheTests/AgentActivityTests.swift
macos/Tests/LitheTests/AgentActivityPresentationTests.swift
macos/Tests/LitheTests/AgentEditRestorerTests.swift
macos/Sources/Lithe/Platform/MacOS/FileSystem/MacWorkspaceFileOperations.swift
macos/Tests/LitheTests/DocumentGuardedSaveTests.swift
macos/Sources/Lithe/Views/Agent/AgentTurnStatisticsView.swift
macos/Sources/LitheAgentConversationModule/Application/AgentConversationState.swift
macos/Tests/LitheTests/AgentNextTurnConfigurationTests.swift
macos/Tests/LitheTests/AgentSessionSelectorInteractionTests.swift
macos/Sources/Lithe/Models/Settings/AppSettings.swift
macos/Tests/LitheTests/AgentProviderImportTests.swift
rust/lithe-agent-host/src/session_defaults.rs
rust/lithe-agent-host/src/tests.rs
rust/lithe-agent-host/src/codex_retry.rs
rust/lithe-agent-host/src/codex-config-relay.cjs
rust/lithe-agent-host/tests/codex_api_failure.rs
shared/contracts/agent-turn-policy.json
.agents/notes/implemented/bug-fix/2026-10-08-agent-turn-lifetime-and-quiet-notices.md
macos/Sources/Lithe/Views/Agent/AgentTranscriptScrollAnchor.swift
macos/Sources/Lithe/Views/Agent/AgentTranscriptNavigation.swift
macos/Tests/LitheTests/AgentTranscriptNavigationTests.swift
macos/Sources/Lithe/Views/Components/LitheScrollViewChrome.swift
macos/Tests/LitheTests/LitheScrollWheelRoutingTests.swift
macos/Sources/Lithe/Views/Agent/AgentMarkdownView.swift
macos/Tests/LitheTests/AgentMarkdownTests.swift
macos/Tests/LitheTests/AgentTranscriptScrollTests.swift
macos/Tests/LitheTests/AgentTranscriptReplay.swift
macos/Tests/LitheTests/AgentConversationPresentationTests.swift
macos/Tests/LitheTests/EditorTabOrderFeatureModelTests.swift
rust/lithe-agent-host/src/session_restore.rs
rust/lithe-agent-host/tests/claude_api_failure.rs
scripts/agent/test-codex-config-relay.mjs
已实现
待验证
证据路径
rust/lithe-agent-host
windows/tauri/src/features/ai/lib/acp-activity-monitor.ts
windows/tauri/src/features/ai/lib/acp-activity-monitor.test.ts
windows/tauri/src/features/ai/services/acp-stream-handler.ts
windows/tauri/src/features/ai/components/chat/ai-chat.tsx
rust/lithe-agent-host/src/session_restore.rs
rust/lithe-agent-host/tests/claude_api_failure.rs
windows/tauri/src-tauri/src/agent.rs
windows/tauri/src/features/agent/components/agent-panel.tsx
windows/tauri/src/features/agent/components/agent-transcript.tsx
windows/tauri/src/features/agent/components/agent-composer.tsx
windows/tauri/src/features/agent/stores/agent-connection.model.ts
windows/tauri/src/features/agent/services/agent-transport.ts
windows/tauri/src/features/agent/components/agent-session-selectors.tsx
windows/tauri/src/features/agent/components/brand/agent-brand-icon.tsx
windows/tauri/src/features/agent/services/agent-session-selectors.test.ts
windows/tauri/src/features/agent/services/agent-session-selectors.ts
windows/tauri/src/features/agent/components/agent-panel-parts.tsx
windows/tauri/src/features/agent/stores/agent-connection.model.test.ts
windows/tauri/src/features/agent/stores/agent-connection-service.ts
.agents/notes/implemented/architecture/2026-10-17-windows-agent-connection-ownership.md
windows/tauri/src/features/agent/services/agent-transcript-navigation.ts
windows/tauri/src/features/agent/services/agent-transcript-navigation.test.ts
windows/tauri/src/features/agent/components/agent-usage-panel.tsx
windows/tauri/src/features/agent/stores/agent-parity.test.ts
rust/lithe-agent-host/src/codex-config-relay.cjs
scripts/agent/test-codex-config-relay.mjs
AgentmacOS 原生轮次导航:宽编辑页下滚动条贴消息面板右边缘,消息与输入区按各自可用宽度的 80% 居中,窄面板可收缩;输入框默认两行书写区,附件“+”位于底栏最左侧、Agent图标之前,顶部附件/额度灰栏与占位完全移除;额度保留在底栏靠右,输入、换行和窗口变窄后按实际内容增高,书写区到达 240pt 或会话 60% 的可用高度约束后在框内滚动,能到达草稿末尾,删除文字、移除附件及发送清空后收缩,命令建议浮在上方且不遮挡输入;指针进入右侧轨道显示短标记,视口内轮次显示长标记,权限卡片或通知出现后完全被遮住的轮次改为短标记、关闭后无需滚动即恢复;正文停在中部时在长轨道和浮动命令列表上滚轮只交给对应覆盖层,到列表边界也不由正文拦截器抢走;预览上方用户输入、下方模型正文且无推理或工具日志;离开收起标记和预览;点击首轮能定位真实用户消息,持续输出、工具、权限、窗口缩放不抢回位置,回到底部或发送新消息恢复跟随;搜索与会话切换无旧预览或旧跳转。深浅主题和长列表验证滚轮、可访问标签及调整面板时预览收起。Windows 已有右侧轮次轨道、悬停预览和点击跳转;目标平台验收仍待完成。macOS Markdown 表格:深浅主题和窄宽面板下,长中文、加粗文字及无空格长标识符的表头与正文应换行并按完整内容增高,不以省略号隐藏尾部;短列按内容占宽,宽表保留共享横向滚动条并能滚至最末列。macOS + Codex + API Key:验证发消息前的上游配置选项和确认;无自定义服务商或 API Key 时确认仍显示本机顶层默认模型、保留密钥缺失错误;修改本机默认模型后重连,连续新建空会话确认不再使用旧导入模型;配置不在上游目录中的模型时,确认新会话优先使用目录内的上游推荐值;推荐值缺失、版本过旧或不可选时,按官方目录顺序选择第一个可用模型,确认后保留完整官方列表且不显示临时补入的无效模型;有效配置模型保持不变,拒绝与超时不显示假成功且 Codex 模型菜单显示 OpenAI 标志;验证工具输入/输出/文件/变更、权限拒绝、停止确认及超时重连、历史加载失败保留记录;使用确定性时钟推进静默、持续工具更新超过原十分钟期限,确认只出现静默提醒、轮次保持忙碌且没有自动取消或重发;继续等待只关闭提醒,新进度清除提醒并重新计时;多个授权等待超过五分钟仍可答复,全部完成后重新计时,后台会话不污染当前状态;等待授权期间其他更新、会话与 EOF 不被阻塞;明确停止仍保持忙碌直到确认,不确认时连接与进程树有界停止。Windows Agent 面板已接入共享 Host,连接、会话、工具/权限、取消、计划/思考、上下文用量与基础轮次统计已存在;Windows 已映射共享 Host 的重试/静默活动状态;真实供应商端到端验收仍待完成。临时项目跑通读文件→修改→执行测试→追问,复用文档观察和脏缓冲区保存保护。检查无搜索框的完整模型目录(名称、上游顺序、分组、空目录)、品牌图标/选中状态、无模型说明、权限说明、思考/速度子菜单、确认/失败与会话切换关闭弹出面板;检查项目切换、退出清理,以及 CC GUI 风格空态、搜索、标签、自适应增长输入区和配置菜单在窄宽面板及深浅主题下的布局。Windows 端到端仍待验证;Claude API Key 鉴权与完整工具流程由独立能力行记录。 安装包环境下打开 Agent 面板,确认 Codex/Claude 图标从 Contents/Resources 加载且不依赖构建目录;资源包或图标缺失时显示默认图标而不闪退,读取前后包内文件清单和内容不变。 检查紧凑配置菜单:模型和设置子选项最小行高 26pt、权限模式最小行高 44pt,上下内边距 4pt;面板高度随行高收紧;权限面板按实际内容高度调整并保留 330pt 上限,短列表的双行说明不需要滚动即可完整显示。深浅主题下通过实际 SwiftUI/AppKit 渲染与原生鼠标事件验证双行说明、滚动到模型/权限长列表末项并选择,原始 ID 和选中回调不变;完整目录及选中标记正常。 点击任务、运行中、编辑确认展示当前会话的计划、活跃工具及去重文件;检查打开文件、分段差异、保留全部和逐个/全部回撤。保留后继续修改并回撤只能撤销新增修改;核对后台会话、未保存缓冲区、文件冲突、缺失或截断证据、编码、符号链接越界及批量部分失败不会覆盖用户内容。确认回撤后的编辑器刷新和连接关闭时任务清理,统计缺失不能伪造行数。 同一标签保留 A→B 后断连重连并回放,再执行 B→C 和回撤必须恢复 B;已回撤版本重连不再出现,失败回放保留基线、变更证据重新出现,关闭重开释放确认。创建路径被工作区内末端链接替换时保全链接及目标;最后快照后原生保存必须使回撤冲突;移动期间外部替换后核对实际移出的字节并恢复,原路径被重建时保全两个版本且提示恢复位置,Trash 失败不确认成功。 确认新请求无输出时显示等待响应而不显示推理;Codex 无标题的明确重试元数据切换到重试,新输出或工具事件恢复状态,授权和停止优先,迟到和后台会话事件不污染当前轮次;历史工具不计入当前执行状态。静默推进时钟不能伪造重试,正常轮次无绝对时限,取消确认保持。 响应期间点击审批、模型和思考选项,确认底栏预选值立即更新且当前轮不发送配置请求;连续选择取最后一次,改回已确认值撤销。结束或取消确认后先确认模型、再按最新选项逐项确认,全部完成前不能发送下一条;验证换模型后选项消失、拒绝或发送失败有明确错误并恢复已确认值。切换会话保持各自预选,后台完成只更新对应会话,断连清除预选且迟到确认不恢复。深浅主题下通过原生鼠标打开菜单并选择。Windows 已接入下一轮配置预选及按序确认。 检查速度与思考强度子菜单:主模型面板宽度和位置不变,子面板顶端贴齐触发行、只包住选项且没有顶部整块空白;右侧空间不足时向左展开。深浅主题下验证上游名称原文、简短说明、已确认值勾选、Esc 只关闭子菜单、选择关闭两级菜单并保留原始 ID;长说明按实际宽度换行,长列表仍能选择末项,会话切换与锚点拆除释放全部子窗口。 同一配置 ID 的 choices、currentValue 或说明变化时,已打开的子菜单关闭,模型面板保留;重新打开使用最新选项、说明和勾选。原生窗口回归覆盖无搜索框时直接选择完整目录模型,以及键盘滚动后 mouseMoved 恢复指针选择;其他选项更新不关闭当前子菜单。 检查输入框上方任务/子代理和文件修改摘要按内容出现,空态移除状态区和预留高度;点击每项摘要直接打开原详情,长列表末项、文件打开/保留、差异与回撤确认保持。标题栏仅一行,独立历史按钮进入原管理页,验证搜索、收藏、改名、可恢复移除、导出及返回不丢草稿和连接。发送旁只保留一个会话详情入口,有用量显示圆环,未上报显示信息图标,点击在同一可滚动面板查看上下文、会话及Token统计,顶部不重复显示信息按钮,Agent/审批/模型在框内底部;深浅主题和320/417pt窄面板验证所有入口、关闭弹层及会话切换。 分别仅导入 Codex、先导入 Codex 再导入 Claude、反向导入与重复导入,确认来源、模型和关联保持独立;重载旧共享标识及已刷新标识的串用设置,确认正确绑定与提交供应商选择保留,错误关联恢复未配置,订阅和手动供应商不变。 点击输入区底栏 Agent 图标,确认 Claude/Codex 行显示原品牌图标,菜单底边位于触发按钮上方且不覆盖状态栏,切换及已选勾选保持。 Claude 暂时故障时显示正在重连 2/5 至 5/5,继续累计耗时且保持忙碌;恢复输出、错误、取消和断连清除次数。Codex 明确重试通知也显示正在重连;旧轮次通知和无效次数不能把新轮次或已结束会话变为重连。流式文本合并发布不能因状态清理增加每段刷新。 Codex API Key:本地 Responses 服务验证带 Retry-After:180 的 400/401/402/403/404 快速失败,503/断连最多五次原生调用,普通429无工作时有界补重发且与503共用五次预算,额度及已有工具/输出不整轮重发;明确重连次数和持续计时,尚无工作时20秒上限后保留10秒取消确认;已有回复、推理、计划、工具或授权后取消 Host 恢复上限及重复计数终止,原生有限重试仍有效。虚拟时钟推进恢复超过20秒并注入超过五次通知,确认同一轮完成且没有第二条 prompt;首次恢复警告后五分钟显示等待较久、继续等待/停止,后续警告不推迟提醒,实际进度清除。终止错误保留已完成工具与修改,用户明确继续复用原会话;未确认的停止仍有界清理。新建/历史恢复/分叉均使用预算,保持配置、工具、历史和订阅登录刷新。临时helper在进程树结束及启动失败后删除,安装包、适配器、用户CLI和配置不变;自定义ACP保留原生策略。Windows 重试策略由共享 Host 提供,Windows 已呈现重试状态;真实供应商验收待完成。 macOS:在 turnRetrying 后只发送有效 plan(含空 entries)即可退出重连并清空次数,保留计划、忙碌轮次和累计计时;无法解析的 plan 不能清理重连。已有回复/推理不退回等待,权限和停止继续优先;确认完成前仍拒绝第二条消息。确定性回归注入时钟与事件,Windows 同等界面行为仍待验证。 深浅主题检查标题栏无重复Agent名称,空态与底栏品牌资源尺寸保持,按钮仍有共享22pt命中区。 macOS 长会话:在窄面板积累多轮历史,读文件、修改、执行测试期间反复出现和关闭权限卡片,完成回复与统计后连续调整宽度,界面可响应且底部内容可见;主动上滚阅读历史后新文本、工具和权限更新不得拉走位置,回到底部或发送新消息后继续跟随,搜索期间暂停,会话切换或关闭不执行迟到滚动。保留 macOS 13 最低部署目标,旧系统实际运行仍待复验。 原生视口仅发送frame变化通知时也继续底部跟随;翻转坐标夹具先完成首次定位,再增加文档高度并改变视口frame,禁用bounds通知以验证独立通知路径。用户上滚浏览时仍不强制拉到底部,不观察文档估算高度驱动循环。 Claude:新会话仍使用供应商默认模型;会话选择不同模型并完成真实回复后关闭适配器,重连恢复必须保留历史模型并以相同模型发出实际请求。模型重新确认前不得发布加载完成;拒绝、错误确认和超时保留加载失败,禁止排队消息越过确认。分组列表、目录外当前模型和相同默认值均通过标准 ACP 确认;无选择器旧适配器和其他 Agent 保持原有加载行为。Windows Agent 面板与连接桥已接入共享 Host;真实供应商和目标平台端到端验收仍待完成。 macOS 活动状态区按需显示任务进度与当前步骤、右侧子代理入口和单独文件修改摘要,复用原详情与回撤。只有全部可见文件的上游统计完整且操作完成时显示增删合计,缺失或溢出时只显示文件数;已保留版本不再计入。空态高度与间距归零,审阅进行中或失败仍保留可操作入口。原生回归覆盖深浅主题、窄宽度、当前步骤、清空、旧弹层清理、长列表与文件动作。 Windows:在真实 Tauri 窗口执行 Windows 已接入历史归档、原生子代理、受保护的文件修改审阅、下一轮配置预选、重试与静默状态,以及模型调用与会话统计。运行时验收按相关独立能力记录;真实 Codex/Claude 服务调用仍待验证。 单元测试不替代运行时验收,未执行的真实服务及平台动作保持 pending。 Windows 后台 Agent 打开必须在窗口已销毁时拒绝,覆盖销毁先于排队打开执行及其他窗口不受影响。 Codex 0.166 + codex-acp 2.2.2:全局使用另一供应商时网关新会话仍可发送与回复;只有所选模拟服务收到请求,原配置字节不变,恢复历史不调用模型。订阅连接进程使用 openai;Windows 检查 npm cmd 固定参数启动,命令行无地址或凭据,托管策略仍由 Codex 执行。
2026-10-22:Windows 已接入历史归档、原生子代理、受保护的文件修改审阅、下一轮配置预选、重试与静默状态,以及模型调用与会话统计。运行时验收按相关独立能力记录;真实 Codex/Claude 服务调用仍待验证。 2026-10-25:适配器固定版本升至 codex-acp 2.2.2、claude-agent-acp 0.95.0;附件路径含百分号编码时额外带一行 📎 真实路径,原生斜杠命令不加。 2026-11-01:relay 使用非敏感进程配置对齐供应商准入;macOS 真实 CLI/ACP 与本地 Responses 服务验证发送和恢复,Windows 原生验收仍 pending。
AI / Agent 对话Agent 权限模式呈现:Claude/Codex 名称保留上游原文,当前模式说明按界面语言显示,菜单使用左侧勾选的紧凑单行列表,保留各 Agent 实际支持的选项及权限语义
agent-approval-mode-presentation
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentSessionSelectors.swift
macos/Resources/en.lproj/Localizable.strings
macos/Resources/zh-Hans.lproj/Localizable.strings
macos/Tests/LitheTests/AgentSessionSelectorPresentationTests.swift
已实现
待验证
证据路径
shared/contracts/application-boundary.md
windows/tauri/src/features/agent/components/agent-session-selectors.tsx
windows/tauri/src/features/agent/services/agent-session-selectors.ts
windows/tauri/src/features/agent/services/agent-session-selectors.test.ts
Agent中文和英文环境分别验证 Claude/Codex:权限名称保留上游原文,Plan 菜单与底栏一致,模式入口只显示名称及向下箭头,未知选项原文不变;当前模式说明在入口 tooltip 使用当前界面语言,保留各 Agent 实际的审批和环境约束。检查原始 ID、数量、顺序及确认/失败行为不变。使用指定语言的资源 Bundle 验证名称与通用 Plan 翻译不会串用;菜单使用共享单行选项、左侧勾选、普通/hover/选中/禁用状态;深浅主题验证紧凑菜单、长列表方向键/Enter 导航、选择后关闭及响应期间下一轮配置仍可操作。 Windows 已按同一呈现规则实现,真机中英文验收待执行。
2026-10-17 Windows:权限模式名称保留上游原文,当前模式说明在入口 tooltip 按界面语言显示;菜单改为左侧勾选的紧凑单行列表,去掉两行说明,选项数量、ID、顺序与确认行为不变;未知选项原文显示。 真机中英文验收待执行。
AI / Agent 对话当前工作区的 Codex 归档历史:历史页“已归档(N)”分组默认折叠,搜索覆盖归档会话并自动展开命中项,分页不缺不重且空结果/折叠/无搜索命中时仍明示截断;活跃转归档不受响应先后或本地加载影响;已移除归档可独立恢复本地可见性;浏览只读,打开前确认后才通过官方 App Server 取消归档;不支持归档的 Agent(如 Claude)明确提示;Codex 同账号与工作区跨供应商历史可见,不因当前计费路由切换而漏查;主动按上游供应商筛选,默认全部、未知来源独立可选,和搜索/置顶/已移除组合
agent-archived-conversation-history
已实现
待验证
证据路径
rust/lithe-agent-host/src/codex_history.rs
rust/lithe-agent-host/src/codex_history/tests.rs
macos/Sources/LitheAgentConversationModule/Application/AgentConnectionModel.swift
macos/Sources/Lithe/Views/Agent/AgentHistoryView.swift
macos/Tests/LitheTests/AgentHistoryTests.swift
shared/fixtures/agent/history-activity-v1.json
已实现
待验证
证据路径
rust/lithe-agent-host/src/codex_history.rs
windows/tauri/src/features/agent/components/agent-history-list.tsx
windows/tauri/src/features/agent/stores/agent-connection.model.ts
windows/tauri/src/features/agent/services/agent-transport.ts
windows/tauri/src/features/agent/components/agent-archived-history.tsx
windows/tauri/src/features/agent/stores/agent-parity.test.ts
windows/tauri/src/features/agent/components/agent-history-provider.test.tsx
windows/tauri/src/features/agent/services/agent-history-view.ts
AgentmacOS:Codex(订阅与 API Key 两种模式)打开历史页,确认“已归档(N)”默认折叠、只含当前工作区(路径大小写/尾斜杠按 codex-acp 规则)的归档会话且带“已归档”标记,与 Lithe 本地“已移除”互不影响;搜索标题或 ID 能命中归档会话并自动展开,清空搜索后恢复折叠;超过 Host 分页上限时,即使当前工作区结果为空、分组折叠或搜索无命中也显示“仅显示最近的归档会话”,不误报没有历史/没有匹配;让归档和活跃响应分别先返回,已加载与未打开的活跃转归档会话都在本轮刷新后仅出现在归档分组;在“已移除”中恢复归档会话只清除本地隐藏标记,保留标题与收藏,不取消归档或加载;浏览、刷新、搜索不改变 ~/.codex 下的归档状态。点击归档会话先弹出确认,取消不发送任何请求,确认后会话移回活跃历史并打开,失败时保留在归档分组并显示错误。恢复成功先于此前活跃与归档列表响应时,两个旧响应均失效,重新查询双列表;旧响应无论何种先后顺序、紧接成功事件或异步等待返回后到达,都不能把已恢复会话重新放回归档、结束新刷新或覆盖完整性状态。切换工作区、切换 Agent 或断开连接后归档列表清空,不混入旧结果。Claude 连接显示“Claude 不支持归档会话”且不请求归档列表。共享 Host 与 Windows Tauri/React 已接入归档列表、分页/完整性状态、与活跃历史独立的新鲜度缓存和确认后恢复。独立状态机测试覆盖恢复与并发旧响应;本次真实 Tauri 验收使用受控 ACP fixture,真实 Codex 账户执行仍待完成。 Codex 历史时间与排序使用上游 recencyAt:只查看/恢复旧会话、刷新、重命名或收藏后时间和顺序保持;新一轮对话活动出现后更新。活跃与归档一致,缺失活动时间不回退到元数据更新时间或当前时间;读取失败保留已有列表。保留历史页和弹框外观。 Codex 跨供应商回归:同账号与工作区准备官方、ACP 网关、原生自定义及之前供应商的记录,活跃与归档均可列出和搜索;不同账号、工作区及子代理仍隔离。查询全部 provider 并保持 useStateDbOnly,不改写旧记录或按 rollout 文件存在性判断历史丢失。 供应商筛选:默认全部;菜单候选合并活跃和归档的真实 modelProvider,未知/空白来源独立处理,不按当前路由或模型猜。验证精确 ID、未知来源、标题/ID 搜索、置顶/已移除交集、分页到达、归档分组和无命中提示;切换后清除批量选择,批量动作不得影响被筛掉的会话;恢复全部不重新查询或改写历史。窄宽面板、深浅主题、键盘选择和中英文入口验收。 归档折叠回归:无搜索词下选择有归档匹配的供应商或未知来源,首次点击归档标题立即收起,再点立即展开;搜索/供应商变化恢复新范围的自动默认,旧范围手动折叠不能泄漏,普通列表刷新保留用户选择。
2026-10-22:Windows 已接入 Codex 归档分组、历史页显示、恢复命令及并发响应保护。真实 Codex 账户端到端验收仍待完成。 2026-11-01:共享 Host 删除固定供应商历史筛选;混合供应商确定性测试覆盖活跃与归档,真实平台验收保持 pending。 2026-11-01:增加可选 modelProvider 摘要元数据和双平台主动筛选,默认仍查询全部;确定性测试覆盖传播与筛选交集,原生整机验证按实际执行记录。 2026-11-01 review 修复:双平台手动折叠覆盖供应商/搜索的自动展开默认,macOS 展示与切换共用实际值,Windows 随搜索和供应商范围重置显式覆盖。
AI / Agent 对话在编辑区标签页与 AI 工具窗口之间移动对话(按钮、右键菜单或把 AI 工具窗口图标拖到编辑区),编辑区使用居中对话布局与会话详情栏,工具窗口展示历史列表,共享会话、标题与未发送草稿,共用原单行标题、独立历史管理与紧凑活动摘要,统计和上下文明细按需展开;macOS 编辑区对话采用 Claude Desktop 式外观:中性灰用户气泡、圆角卡片输入框、卡片下方的审批模式/模型/额度/上下文环状态行,详情栏为可折叠的上下文、更改、会话统计分区;macOS 对话标签同时绑定 Agent 与会话,预创建且无消息、文字或附件草稿的空会话可复用,连接丢弃会话时同步清除失效标签
agent-chat-editor-placement
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentConversationView.swift
macos/Sources/Lithe/Views/Agent/AgentHistoryView.swift
macos/Sources/Lithe/Views/Editor/EditorAreaView.swift
macos/Sources/Lithe/Models/AppModel/AppModel+AgentConversation.swift
macos/Sources/LitheAgentConversationModule/Application/AgentConnectionModel.swift
macos/Tests/LitheTests/AgentConversationSelectionTests.swift
macos/Tests/LitheTests/EditorTabOrderFeatureModelTests.swift
macos/Sources/Lithe/Views/Agent/AgentEditorConversationChrome.swift
macos/Sources/Lithe/Views/Agent/AgentComposerView.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchToolWindowDock.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchView.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchModuleUIComposition.swift
macos/Tests/LitheTests/ToolWindowDockingTests.swift
macos/Sources/Lithe/Views/Agent/AgentTranscriptView.swift
macos/Tests/LitheTests/AgentTranscriptReplay.swift
macos/Tests/LitheTests/AgentTranscriptScrollTests.swift
.agents/notes/implemented/feature/2026-10-23-macos-agent-editor-large-history-and-claude-layout.md
macos/Sources/Lithe/Application/Features/EditorTabOrderFeatureModel.swift
macos/Tests/LitheTests/AgentConversationFeatureModelTests.swift
已实现
待验证
证据路径
shared/contracts/application-boundary.md
windows/tauri/src/features/agent/components/agent-panel.tsx
windows/tauri/src/features/agent/components/agent-conversation-tab.tsx
windows/tauri/src/features/agent/actions/agent-conversation-placement-actions.ts
windows/tauri/src/features/agent/stores/agent-surface.store.ts
windows/tauri/src/features/agent/utils/agent-conversation-path.ts
windows/tauri/src/features/editor/stores/buffer.store.ts
windows/tauri/src/features/panes/components/pane-container.tsx
windows/tauri/src/features/panes/types/pane-content.types.ts
.agents/notes/implemented/feature/2026-10-18-windows-agent-conversation-editor-placement.md
windows/tauri/src/features/agent/services/agent-editor-binding.test.ts
Agent深浅主题下使用标题栏位置按钮、工具窗口图标拖放和右键菜单在编辑区与工具窗口之间移动同一会话;重复打开仅聚焦,不创建会话或重连,文字与附件草稿保持。历史按钮进入原搜索/收藏/改名/可恢复移除/导出管理页,选择原连接会话后返回聊天。关闭或反向位置按钮返回工具窗口,共享标签排序、分组和焦点语义不变。两种位置共用单行标题、输入框上方按内容显示紧凑活动摘要、框内默认两行书写区,没有顶部条或占位;附件“+”在底栏Agent图标左侧,同栏保留审批/模型选择和靠右的订阅额度、发送旁唯一会话详情入口;收到用量显示圆环,未上报显示信息图标,入口位置不变。编辑区聊天列最大716pt、输入框最大700pt,窄窗口自然收缩,宽编辑页可通过设置菜单显示右侧上下文构成与会话统计详情;窄窗口仍可通过发送旁同一入口在可滚动弹窗查看相同数据,顶部不重复显示信息按钮。验证320/417/900/1400pt和深浅主题、各项摘要详情及文件回撤、上下文折叠、统计持久化、复制消息/对话、隐藏工具栏与会话切换的弹层清理。工具窗口的会话详情弹窗不展示更改区、Git分支、变更文件数、Agent编辑行数或未编辑文件提示;文件活动栏及回撤仍可用;MCP服务器清单没有后端数据时不编造;本次原生宿主验证不能替代真实Agent完整产品验收。两种位置共用按内容出现的紧凑活动摘要:任务/子代理一行、文件修改摘要一行;空态移除状态区和间距,输入框与正文位置及最小高度正确,计划清空、保留全部和切换会话关闭旧弹层。窄面板长标题不覆盖子代理入口,文件摘要继续打开原有差异、保留与回撤。 Windows 已实现编辑区标签与工具窗口之间的放置切换:编辑区使用最大 716pt 居中列、最大 700pt 输入框和可开关的会话详情栏;工具窗口在编辑区占用会话时转为历史列表,选择历史会话会聚焦其已有标签或新开标签。同一会话重复打开只聚焦现有标签,关闭标签或反向位置按钮返回工具窗口,未发送草稿与附件按会话共享。本次原生宿主验证不能替代真实Agent完整产品验收,Windows 真机验收待执行。 Windows:A 工作区编辑区会话保留挂载,切换 B 并连接 Agent 后再返回 A,侧栏仍从 A 的 buffers 判断会话已放置,不重复出现输入框;切换 Agent 后仅当前 Agent 的标签接管侧栏。 macOS 工具窗口正文在深浅主题及 280/350/486/620pt 缩放时,左侧仅保留 12pt 基础边距,额外导航留白只在右侧(合计 40pt);检查文字随可用宽度换行,右侧导航不覆盖正文,原生滚动条仍位于面板边缘,浏览历史和最新回复跟随继续正常,编辑页 80% 居中列保持原有行为。 macOS 编辑区(仅居中模式,工具窗口 CC GUI 样式不变):深浅主题下用户消息为灰色圆角气泡;输入卡片内依次是 Agent、权限模式(中文名称)、模型、添加、发送,卡片上方不再显示活动摘要。右侧详情栏为圆角卡片并可单独折叠且重启后保持:上下文卡显示已用百分比、容量、彩色进度条和图例(无分解数据显示“—”);更改卡显示总增删行数和文件列表,超过 5 个折叠为“显示更多”,可全部保留/全部回滚,悬停单个文件可看差异或回滚(回滚前确认);活动卡只显示任务与子代理,不重复文件修改。标题栏详情开关与菜单“显示会话详情”同步。 macOS 编辑区多标签:点击输入区的“新对话(+)”在编辑区新开一个对话标签而不是覆盖当前对话(当前标签仍为空时复用);每个标签绑定一个会话,切换标签时 Agent 跟随显示该会话;从历史选择已在某标签打开的会话只聚焦该标签,否则新开标签;关闭一个标签不影响其他标签,关闭最后一个回到工具窗口;⌘W 只关闭当前对话标签。分屏时非当前对话的窗格显示“显示对话”占位。需真机验收,单元测试覆盖标签与会话的绑定、复用和关闭。 macOS 回归:Codex 与 Claude 使用相同会话 ID 时分别打开标签,往返选择恢复所属 Agent、会话与草稿,标题从原 Agent 解析。预创建 sessionCreated 后连续 New Chat 复用同一空标签;文字或仅附件草稿保留原标签。断连、重连与 New Chat 丢弃空会话时,当前标签解除旧绑定、后台旧标签移除;已加载历史保留。确定性模型回放不能替代真实 Agent 验收。
AI / Agent 对话Claude API Key 鉴权:所选供应商及新建/恢复路由保持;永久错误快速返回;临时故障五次短尝试、二十秒重连上限、错误保持与已开始工作禁止重放
agent-claude-api-key-authentication
已实现
待验证
证据路径
rust/lithe-agent-host/src/session_routing.rs
rust/lithe-agent-host/src/prompt_retry.rs
rust/lithe-agent-host/src/tests.rs
rust/lithe-agent-host/tests/real_agent.rs
rust/lithe-agent-host/tests/claude_api_failure.rs
shared/fixtures/agent/acp-events-v1.json
.agents/notes/implemented/architecture/2026-09-25-shared-acp-agent-conversation.md
已实现
待验证
证据路径
rust/lithe-agent-host/src/session_routing.rs
shared/contracts/rust-core-api.md
windows/tauri/src/features/agent/stores/agent-connection.model.ts
windows/tauri/src/features/agent/services/agent-transport.ts
AgentmacOS:验证所选 Anthropic Messages 供应商的正常流式回复、读写文件、执行测试、追问、停止和历史恢复。新建与恢复用同一公开 SDK env/settings.env 禁用原生长退避、watchdog、非流式回退,清除冲突路由并只发送有效 x-api-key。隔离配置目录以已安装 CLI/ACP 和本地 HTTP 服务覆盖 400/401/402/403 的快速终止、404 原生模型探测、408/429/500/502/503/504/529 及响应前断连五次短尝试,即使 Retry-After:180 和 x-should-retry:true 也不能等待三分钟;验证实际 HTTP 次数、结构化失败不能当成功、失败后恢复正常流、部分输出后不重放、项目重试配置冲突。Host 虚拟时钟验证二十秒预算不刷新、取消确认前仍忙碌、退避中停止、已有进度禁止重放和其他会话隔离。检查关闭后子进程退出和包内文件哈希不变。生产 macOS UI 和 Windows 真实验收仍待完成,不能把本地假服务当真实供应商或 Windows 验证。 Windows:在真实 Tauri 窗口执行 Claude 的 API Key 路由由共享 Host 执行,Windows 已补齐 turnRetrying、turnActivity 和模式降级通知的呈现。真实 Claude 的认证、新建、恢复、重试与继续回复仍待服务端验收。 单元测试不替代运行时验收,未执行的真实服务及平台动作保持 pending。
2026-10-22:Claude 的 API Key 路由由共享 Host 执行,Windows 已补齐 turnRetrying、turnActivity 和模式降级通知的呈现。真实 Claude 的认证、新建、恢复、重试与继续回复仍待服务端验收。
AI / Agent 对话在 Lithe 中打开 Claude Desktop 开始的 Claude Code 会话时,Desktop 专属机制按 Desktop 的方式呈现:每轮总结(wrap_up)显示为 Agent 回复,建议回复显示为按钮(仅最新一轮、未在回复时出现,点击填入输入框);章节显示为分隔线;建议任务、启动会话与移交显示为任务卡片并随撤回/启动更新状态,可在新对话中开始;PR 绑定、CI 监控、自动合并显示为带链接的说明行;切换或申请目录显示为说明行;show_widget 可视化在禁网、非持久、禁止导航并直接拒绝摄像头/麦克风的隔离网页中展开显示;<pr-created> 变为 PR 链接;Desktop、浏览器、电脑操作、终端、定时任务与 claude.ai 连接器的其余工具显示可读标题;CI 监控事件与跨会话通知显示为折叠上下文。被拒绝或失败的 Desktop 调用保留为失败的工具行;CLI 会话行为不变
agent-claude-desktop-mechanisms
已实现
待验证
证据路径
rust/lithe-agent-host/src/claude_desktop.rs
rust/lithe-agent-host/src/lib.rs
macos/Sources/LitheAgentConversationModule/Application/AgentDesktopCard.swift
macos/Sources/LitheAgentConversationModule/Application/AgentSessionConfiguration.swift
macos/Sources/LitheAgentConversationModule/Application/AgentImage.swift
macos/Sources/Lithe/Views/Agent/AgentDesktopCardView.swift
macos/Sources/Lithe/Views/Agent/AgentTranscriptView.swift
macos/Tests/LitheTests/AgentDesktopCardTests.swift
macos/Sources/Lithe/Platform/MacOS/WebMediaCapture.swift
macos/Tests/LitheTests/WebMediaCaptureTests.swift
部分实现
待验证
证据路径
rust/lithe-agent-host/src/claude_desktop.rs
windows/tauri/src/features/agent/components/agent-transcript.tsx
AgentmacOS:在 Lithe 中恢复一个 Claude Desktop 开始、含章节、建议回复、建议任务(含撤回与启动)、PR 监控、目录切换与 show_widget 的会话,确认各卡片按顺序出现、被拒绝的调用留在折叠过程中显示失败;建议回复只在最后一轮且未在回复时出现,点击后文字进入输入框而不发送;任务卡片“在新对话中开始”新建对话并填入提示;PR 链接在浏览器打开;可视化展开后正常显示内联 SVG/HTML、不发起网络请求、不外开链接,并通过共享拒绝委托拒绝摄像头与麦克风,不弹系统授权提示;深浅主题与 300pt 窄面板布局不溢出。CLI 会话中同样的工具不存在,转录不受影响。运行 AgentDesktopCardTests、WebMediaCaptureCoverageTests 与 cargo test -p lithe-agent-host claude_desktop。Windows:共用宿主,Desktop 工具显示可读标题与类型,卡片尚未绘制,退回普通工具行。 可视化页面里点链接不会打开浏览器,页面脚本自己 click 链接也不会;页面刚展开时调用 sendPrompt 不会改动输入框草稿,用户在页面内点击后才会填入。任务撤回或启动失败时,原调用和失败原因在折叠过程里可见,卡片状态不变。压缩前历史里超过 4000 字符的可视化和任务提示完整显示。
2026-10-25:宿主在 `_meta.lithe.claudeDesktop` 附加卡片描述并为所有 Desktop 工具提供可读标题;macOS 原生绘制卡片。Windows 只获得可读工具行,卡片待对齐。用本机 96 个含 Desktop 工具的真实会话离线回放,产出章节 19、建议回复 154、建议任务 30(6 次启动、4 次撤回状态更新)、PR 3、目录 7、可视化 7、计划 854。
AI / Agent 对话Claude 供应商可选官方订阅:直接使用本机 Claude Code 已登录的 claude.ai 账号,与 API Key 模式随时切换,Lithe 不读取任何凭据
agent-claude-subscription
已实现
待验证
证据路径
macos/Sources/LitheCoreContracts/Agent/AgentConversationPorts.swift
macos/Sources/Lithe/Application/Features/AgentLaunchConfigurationResolver.swift
macos/Sources/Lithe/Models/AppModel/AppModel+AgentProviders.swift
macos/Sources/Lithe/Views/Agent/AgentProviderConfigurationView.swift
macos/Sources/Lithe/Application/Features/AgentSetupDiagnostics.swift
macos/Tests/LitheTests/AgentLaunchConfigurationResolverTests.swift
macos/Tests/LitheTests/AgentProviderConfigurationTests.swift
rust/lithe-agent-host/src/claude_subscription.rs
.agents/notes/implemented/architecture/2026-09-25-shared-acp-agent-conversation.md
部分实现
待验证
证据路径
rust/lithe-agent-host/src/claude_subscription.rs
rust/lithe-agent-host/src/lib.rs
AgentmacOS:本机 Claude Code 已用 /login 登录 claude.ai 账号时,在设置 > AI > Agent 管理 > Claude Agent 的供应商管理中启用「Claude 官方订阅(本机账号)」,预检的 Agent 供应商显示 PASS 并说明使用 claude.ai 账号;打开 Agent 面板新建与恢复会话、发送消息,确认请求不携带 API Key、地址或模型覆盖(Lithe 环境中的 ANTHROPIC_API_KEY、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_BASE_URL、ANTHROPIC_MODEL、CLAUDE_CODE_OAUTH_TOKEN 不传给适配器),模型列表来自 Claude Code。终端执行 claude /logout 后重连,面板显示「Claude Code 尚未登录……用 /login 登录后再重试」,Lithe 不打开浏览器;重新登录后重试恢复。空闲时在订阅与 API Key 供应商之间切换,API Key 模式仍按所选供应商路由并清除 OAuth;Codex 订阅不能用于 Claude,Claude 订阅不能用于 Codex;取消关联后回到未配置。开启“模型调用统计”(默认开启)时,订阅模式经本机回环代理把 Claude Code 自己的请求原样转发到官方端点,Lithe 不读取、保存令牌,计费仍走订阅;2026-10-25 已用真实 Claude 订阅完成一轮对话,解析出标题请求(标记为辅助请求,只计 Token 不计步数)和带工具的对话请求,界面显示系统提示词、工具定义、对话消息分项;关闭开关并重新连接后回到直连。Windows:共享 Host 已支持 claudeSubscription 启动与登录检查,设置界面尚未提供该选项,待接入并真机验收。
AI / Agent 对话Codex 供应商选择官方订阅:复用本机账号、显式浏览器登录与取消、API Key 模式切换及旧配置兼容
agent-codex-subscription
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentProviderConfigurationView.swift
macos/Sources/Lithe/Models/AppModel/AppModel+AgentProviders.swift
macos/Sources/LitheAgentConversationModule/Application/AgentConnectionModel.swift
macos/Tests/LitheTests/AgentProviderConfigurationTests.swift
rust/lithe-agent-host/src/subscription.rs
已实现
待验证
证据路径
rust/lithe-agent-host/src/lib.rs
rust/lithe-agent-host/src/subscription.rs
shared/fixtures/agent/acp-events-v1.json
windows/tauri/src-tauri/src/agent.rs
windows/tauri/src/features/agent/components/agent-settings-section.tsx
windows/tauri/src/features/agent/components/agent-panel.tsx
windows/tauri/src/features/agent/services/agent-launch.ts
windows/tauri/src/features/agent/types/agent-settings.types.ts
windows/tauri/src/features/agent/types/agent-settings.types.test.ts
windows/tauri/src/i18n/locale.ts
AgentmacOS:已有 Codex ChatGPT 登录直接对话;未登录只显示登录按钮,点击才打开浏览器,取消与超时清理进程;API Key 与订阅空闲切换后验证实际计费来源,不携带旧 key/URL/模型、不改提交服务商;忙碌时拒绝切换,账号变化后断开;老配置仍走 API Key,Codex 订阅不能用于 Claude(Claude 订阅见 agent-claude-subscription)。真实账号与 macOS UI 待验证;Windows 连接桥已接通共享 host,UI 待接入;2026-10-16 删除了从未接入后端的「Codex 集成」设置页与 Codex app-server 客户端死代码,AI 设置不再显示 Codex CLI 状态或连接按钮。 Windows:Codex 设置显示 macOS 同款订阅行,未启用时只提供 Enable,启用后提供 “Use API key” 返回 API Key 模式;切换按钮在连接中、创建会话、回复中、加载历史、等待权限或配置确认时禁用,避免中断当前工作。订阅启动不携带 provider 的 key、地址或模型;未登录时 Agent 面板只显示“Sign in with ChatGPT”,点击后才启动登录,登录中可取消并清理连接。旧配置仍按 API Key 读取;Claude 不显示订阅入口。真实 ChatGPT 账号验收待执行。
2026-10-18 Windows:设置页订阅入口改成 macOS 的启用/切换行;`reconnect` 从设置 store 读取刚保存的值,避免切换登录方式后仍用旧配置重连;默认模型随供应商初始化(Codex `gpt-6.1-sol`,Claude `claude-fable-5-1`)。
AI / Agent 对话Agent 与模型切换:所选连接即时同步,准备期间明确等待会话设置,确认后显示模型,来回切换保留各自会话;模型面板移除搜索框并直接展示上游完整目录与分组,保留滚动和选中标记;思考强度以 Effort 标签与随上游档位变化的单行圆点滑块呈现,支持保持弹窗打开的点击、拖动和键盘连续调整
agent-connection-model-switching
已实现
已验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentConversationView.swift
macos/Sources/Lithe/Views/Agent/AgentComposerView.swift
macos/Sources/LitheAgentConversationModule/Application/AgentConnectionModel.swift
macos/Sources/Lithe/Views/Agent/AgentSessionSelectors.swift
macos/Tests/LitheTests/AgentConversationSelectionTests.swift
rust/lithe-agent-host/tests/real_agent.rs
macos/Sources/Lithe/Views/Agent/AgentReasoningEffortControl.swift
macos/Tests/LitheTests/AgentSessionSelectorLayoutTests.swift
macos/Tests/LitheTests/AgentSessionSelectorPresentationTests.swift
已实现
待验证
证据路径
shared/contracts/application-boundary.md
windows/tauri/src/features/agent/stores/agent-connection-service.ts
windows/tauri/src/features/agent/stores/agent-connection.model.ts
windows/tauri/src/features/agent/stores/agent-connection.model.test.ts
windows/tauri/src/features/agent/components/agent-panel.tsx
.agents/notes/implemented/architecture/2026-10-17-windows-agent-connection-ownership.md
windows/tauri/tests/agent-connection-service.test.ts
windows/tauri/src/features/agent/components/agent-session-selectors.tsx
windows/tauri/src/features/agent/stores/agent-parity.test.ts
AgentmacOS:不触发 AppModel 通知或替换宿主根视图,切换 Claude/Codex,确认品牌、当前连接和模型列表立即同步;切到未准备的连接时保持会话设置加载提示,不闪现本地保存的默认模型;进程 ready 后继续等待会话确认,过期响应不解除等待;加载历史等待其配置,创建/加载/连接失败和不提供配置能力时退出加载,回车与发送按钮都禁止准备期间发送;已准备的连接来回切换不重复加载;分别在 Claude/Codex 关闭最后一个已准备标签,确认连接保持 ready、立即且只发一次 newSession,过期确认不恢复旧会话,新确认后底栏退出等待且消息发送到新会话;仍有标签时切到已有会话,断连时不创建。选择模型后等待上游确认,重新展开检查勾选,来回切换确认模型和会话分别保留;打开模型菜单后无搜索框且立即展示全部上游名称、顺序与分组,空目录有明确提示且仍能调整 Effort,当前 Agent 移除后正确回退,实际模型切换后发送最小消息验证回复。模型入口位于输入框下方 Agent 右侧,模式入口保留框内;深浅主题及280/540pt面板验证两个菜单可选择且模型与Agent同行。模型弹框至少 300pt 宽,长内容继续测量至共享宽度上限,顶部直接显示模型标题,不留搜索框占位;验证左侧勾选与hover、思考强度单行圆点滑块:中英文界面统一显示 Effort,Medium 与最长档位名称不省略;2/4/6 档及未知上游名称按实际目录显示、点击首尾档、调整强度后同一弹窗保持,等待期间禁用,拒绝后仍用已确认值,确认后能继续调整;Esc、外部点击及选择模型仍关闭;拖动仅在松开时提交一次、方向键和辅助功能可调整、禁用态不提交、确认后重新打开保持当前值、空模型目录仍可改强度、长模型列表最后一项可选择,其他配置子菜单仍按触发行定位并可关闭。 Windows 已实现连接身份切换、会话快照保留与配置确认前等待,真机往返切换验收待执行。模型入口位于输入框下方 Agent 右侧,模式入口保留框内;深浅主题及280/540pt面板验证两个菜单可选择且模型与Agent同行。模型弹框按内容测量宽度而非固定330pt,搜索框使用共享28pt控件;验证左侧勾选与hover、思考强度同级选择、名称搜索及空结果仍可改强度、长模型列表最后一项可选择,其他配置子菜单仍按触发行定位并可关闭。 Windows:用可控传输挂起首次启动,在完成前切换 Agent 或认证方式,确认先关闭旧进程再启动新配置;停止后立即重开也不得越过清理。 编辑区与侧栏同时请求相同身份时只启动一次,两个请求均在所有权登记后完成。 Windows:在真实 Tauri 窗口执行 Windows Agent 配置独立保留,切回恢复会话;模型目录完整显示,Effort 使用可访问的档位滑块。响应中预选模型、权限和 Effort,只在下一轮开始前按顺序等待 ACK,失败保留未确认状态且不发送。模型选项来自上游,不推测目录。 单元测试不替代运行时验收,未执行的真实服务及平台动作保持 pending。
2026-10-22:Windows Agent 配置独立保留,切回恢复会话;模型目录完整显示,Effort 使用可访问的档位滑块。响应中预选模型、权限和 Effort,只在下一轮开始前按顺序等待 ACK,失败保留未确认状态且不发送。模型选项来自上游,不推测目录。
AI / Agent 对话Agent 上下文长度与自动压缩阈值:每个 Agent 可在设置里调整,圆环按配置值显示,留空沿用 Agent 默认值;macOS 恢复默认后失焦、离页和重开不回写旧草稿
agent-context-limits
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentContextLimitsSettings.swift
macos/Sources/Lithe/Models/Settings/AppSettings.swift
macos/Sources/Lithe/Views/Agent/AgentPanelSettingsView.swift
macos/Sources/Lithe/Views/Agent/AgentSessionStatusView.swift
macos/Sources/LitheCoreContracts/Agent/AgentConversationPorts.swift
macos/Sources/LitheAgentConversationModule/Application/AgentConnectionModel.swift
macos/Sources/Lithe/Application/Features/AgentLaunchConfigurationResolver.swift
macos/Sources/Lithe/Platform/MacOS/Agent/MacACPAgentTransport.swift
macos/Tests/LitheTests/AgentContextTokenTextTests.swift
macos/Tests/LitheTests/AgentLaunchConfigurationResolverTests.swift
macos/Tests/LitheTests/AgentConversationFeatureModelTests.swift
macos/Tests/LitheTests/AgentContextLimitsSettingsTests.swift
部分实现
待验证
证据路径
rust/lithe-agent-host/src/lib.rs
rust/lithe-agent-host/src/tests.rs
shared/contracts/rust-core-api.md
AgentmacOS:设置 › AI › Agents 选择 Codex 或 Claude,“上下文”卡片有“上下文长度”和“自动压缩阈值”两项,输入框占位显示 Agent 自己上报过的默认长度(未上报显示“暂未上报”);输入 200K、1M、200000 均可,范围 10K 到 10M,非法输入标红且不保存,阈值大于上下文长度报错,留空或点“重置”恢复 Agent 默认值;保存 200K/150K 后点击全局“恢复默认值”,立即失焦、切页或关闭,再重开确认两项仍为空且持久化限制已清除;原限制为空时输入未保存草稿再恢复默认,失焦后也不得新建覆盖;外部更新同一 Agent 时刷新表单,更新其他 Agent 不丢当前草稿。已连接时修改提示“重新连接 Agent 后生效”。重连后:Codex 把两项作为 model_context_window 与 model_auto_compact_token_limit 传入,圆环分母为配置的上下文长度(Codex 自己按其 95% 上报),悬停与详情多一行“自动压缩阈值”;Claude Code 只有一个压缩窗口开关,阈值(否则上下文长度)作为 CLAUDE_CODE_AUTO_COMPACT_WINDOW 传入,圆环以它为满。配置值大于 Agent 上报值时不放大圆环;2026-10-25 已用真实 Claude 订阅和本机 Codex(API Key,本机转发)各完成一轮,确认上报大小随配置变化。Windows:共享 Host 已支持 contextLimits 并有单元测试,设置界面尚未提供入口。
Claude Code 的上报大小会在回合内来回变化(先报配置值、结束时报模型值),所以圆环分母由 Lithe 按配置封顶,不直接用上报值。
AI / Agent 对话Agent 上下文用量与会话详情共用发送旁单一入口(未上报显示信息图标,有报告显示紧凑圆环,未知与真实零保持区分)、单行悬停已用/容量、点击同时展示可滚动的参考式用量明细、会话统计与Token明细(大号百分比、多色容量条、四类分项与工具数量,估算说明按需悬停;明细面板在无数据时保留未知说明,不显示成零用量)、按确认模型恢复真实报告且不展示来源后缀,会话隔离与压缩更新;Codex旧历史通过当前原生连接恢复真实用量,无需再次调用模型;Codex订阅连接支持HTTP/SSE与WebSocket模型调用采集、增量上下文构成和原生用量校准
agent-context-usage
已实现
待验证
证据路径
macos/Sources/LitheAgentConversationModule/Application/AgentContextUsage.swift
macos/Sources/Lithe/Views/Agent/AgentContextUsageView.swift
macos/Tests/LitheTests/AgentConversationFeatureModelTests.swift
macos/Tests/LitheTests/AgentConversationPresentationTests.swift
macos/Sources/LitheAgentConversationModule/Application/AgentSessionStatisticsStore.swift
macos/Sources/Lithe/Views/Agent/AgentComposerView.swift
macos/Tests/LitheTests/AgentSessionSelectorLayoutTests.swift
rust/lithe-agent-host/src/codex_context.rs
rust/lithe-agent-host/src/codex_context/tests.rs
rust/lithe-agent-host/src/codex-config-relay.cjs
scripts/agent/test-codex-config-relay.mjs
macos/Sources/Lithe/Views/Agent/AgentSessionStatusView.swift
macos/Sources/Lithe/Views/Agent/AgentEditorConversationChrome.swift
rust/lithe-agent-host/src/model_proxy/websocket.rs
rust/lithe-agent-host/src/model_proxy/websocket/tests.rs
rust/lithe-agent-host/src/subscription.rs
macos/Sources/Lithe/Application/Features/AgentLaunchConfigurationResolver.swift
macos/Tests/LitheTests/AgentLaunchConfigurationResolverTests.swift
已实现
待验证
证据路径
rust/lithe-agent-host/src/lib.rs
shared/fixtures/agent/acp-events-v1.json
rust/lithe-agent-host/src/codex_context.rs
scripts/agent/test-codex-config-relay.mjs
rust/lithe-agent-host/src/model_proxy/websocket.rs
rust/lithe-agent-host/src/model_proxy/websocket/tests.rs
rust/lithe-agent-host/src/subscription.rs
windows/tauri/src-tauri/src/agent.rs
windows/tauri/src/features/agent/components/agent-usage-panel.tsx
windows/tauri/src/features/agent/components/agent-composer.tsx
windows/tauri/src/features/agent/types/agent.types.ts
windows/tauri/src/features/agent/services/agent-session-selectors.ts
windows/tauri/src/features/agent/stores/agent-connection.model.ts
windows/tauri/src/features/agent/components/agent-observed-statistics.tsx
AgentmacOS:窄宽面板和深浅主题检查圆环紧邻发送,悬停显示一位小数百分比及大写K已用/总容量,点击同一可滚动面板展示上下文、会话统计及Token明细,顶部没有重复信息按钮;关闭按钮、Esc、外部点击、隐藏工具栏及切换会话关闭;无报告时发送旁信息图标仍能打开统计;无上报提示未知,有效零报告显示0%,不从累计账单或消息推算。实际对话上报用量后重连/重启恢复相同模型,显示用量,不显示“上次上报”后缀或标题(包括悬停、上下文明细、会话详情与无障碍值);不同模型、未知模型、回放明确无效报告不恢复旧值,新上报清除历史标记。确认模型切换清除内存和持久化容量,权限和思考选项保留;压缩后数值可下降,会话不串用量。验证旧版统计记录兼容、缓存数量上限和运行中更新不逐条落盘,旧历史无缓存等待Agent新报告。共享菜单、悬停、无障碍与关闭行为保持;本地原生宿主回归通过不等于真实供应商验收,verification保持pending。Codex:无本地缓存的旧会话恢复后显示原生last.totalTokens/modelContextWindow,界面不显示来源后缀,内部保留历史标记,不使用累计total。标准ACP已上报优先;失败、取消、替换加载和新轮次不接收旧票据报告,通道不可用仍能加载历史;检查订阅与API Key、原生重试不变、安装包/适配器/CLI哈希不变、进程和临时helper清理。Windows已共享Host实现及cmd分支模拟,仍需目标平台实际验收。检查参考式上下文面板在264pt详情栏、300pt弹层及深浅主题/中英文下不截断:大号使用率保留一位小数,真实容量不加估算符号,四类估算分项标~,窗口未知时不归一化为100%;无分项显示未知及单条说明。MCP与普通工具数量保留,悬停可看估算Token;关闭按钮、Esc、外部点击与切换会话关闭弹层。会话详情弹窗及右侧详情栏均只展示上下文与会话/Token统计,不再展示更改区、分支、文件数、编辑行数或未编辑文件提示。有分项数据后面板底部不常驻估算说明和分隔线;分项比例仍有~,悬停显示估算Token及按请求大小估算/按供应商输入校准的口径。无分项的未知或启用指引继续保留。开启统计后,Codex订阅重连并发送消息,验证四类分项、调用次数、TTFT/TPS和缓存命中;关闭统计重连保持原生直连。WebSocket压缩、分片、控制帧和认证头原样透传,预热不计数,连续两轮基于完整上下文估算,未知前序ID不编造分项;旧历史缺分项等待新请求,不显示“订阅不统计”提示。原生Codex与本地假服务验收不等于真实供应商或Windows运行验收。原生account/read仅对普通后台且NO_CONSTRAINT启用采集;地区受限、未知或失败保留原生直连,账户变更关闭已观察连接。 Windows 已接入紧凑上下文圆环、悬停提示、分项详情与会话统计,消费历史 usage_update;真实 Codex 历史上下文恢复仍待验收。Codex:无本地缓存的旧会话恢复后显示原生last.totalTokens/modelContextWindow,界面不显示来源后缀,内部保留历史标记,不使用累计total。标准ACP已上报优先;失败、取消、替换加载和新轮次不接收旧票据报告,通道不可用仍能加载历史;检查订阅与API Key、原生重试不变、安装包/适配器/CLI哈希不变、进程和临时helper清理。Windows已共享Host实现及cmd分支模拟,仍需目标平台实际验收。检查参考式上下文面板在264pt详情栏、300pt弹层及深浅主题/中英文下不截断:大号使用率保留一位小数,真实容量不加估算符号,四类估算分项标~,窗口未知时不归一化为100%;无分项显示未知及单条说明。MCP与普通工具数量保留,悬停可看估算Token;关闭按钮、Esc、外部点击与切换会话关闭弹层。更改和会话统计仍可访问。有分项数据后面板底部不常驻估算说明和分隔线;分项比例仍有~,悬停显示估算Token及按请求大小估算/按供应商输入校准的口径。无分项的未知或启用指引继续保留。开启统计后,Codex订阅重连并发送消息,验证四类分项、调用次数、TTFT/TPS和缓存命中;关闭统计重连保持原生直连。WebSocket压缩、分片、控制帧和认证头原样透传,预热不计数,连续两轮基于完整上下文估算,未知前序ID不编造分项;旧历史缺分项等待新请求,不显示“订阅不统计”提示。原生Codex与本地假服务验收不等于真实供应商或Windows运行验收。原生account/read仅对普通后台且NO_CONSTRAINT启用采集;地区受限、未知或失败保留原生直连,账户变更关闭已观察连接。Windows 面板按 macOS 在输入框顶部上下文栏显示 12px 圆环与百分比,90% 起警告色、100% 起错误色,未知时显示 0% 并提示“上下文: 0.0%”,有用量时提示“x% · 12.3k / 200k 上下文 token”;压缩与会话隔离的实机验证待完成。 Windows:在真实 Tauri 窗口执行 Windows 上下文圆环可展开模型调用与会话统计,以及系统提示词、工具、MCP、消息的估算构成;按供应商输入 Token 校准并明确标识估算。历史重放消费上游 usage_update,不推测缺失值。 单元测试不替代运行时验收,未执行的真实服务及平台动作保持 pending。
2026-10-22:Windows 上下文圆环可展开模型调用与会话统计,以及系统提示词、工具、MCP、消息的估算构成;按供应商输入 Token 校准并明确标识估算。历史重放消费上游 usage_update,不推测缺失值。
AI / Agent 对话CC GUI 风格历史页:标题与会话 ID 搜索、对话活动时间、复制 ID、刷新与恢复、收藏与本地重命名、单条与批量移除确认及恢复、筛选、多选批量管理及 Markdown 导出;分页首批结果提前显示、近期列表复用与刷新请求合并;macOS 历史页按收藏、今天、昨天、过去 7/30 天、更早分组,行内用 Agent 磁贴与“…”菜单;大历史对话回放期间不逐条发布,对话视图首屏只构建最近 48 项并可展开更早内容;Codex 同账号与工作区跨供应商历史可见,不因当前计费路由切换而漏查;主动按上游供应商筛选,默认全部、未知来源独立可选,和搜索/置顶/已移除组合
agent-conversation-history
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentHistoryView.swift
macos/Sources/LitheAgentConversationModule/Application/AgentHistoryFeatureModel.swift
macos/Sources/Lithe/Platform/MacOS/Agent/MacAgentHistoryAdapters.swift
macos/Tests/LitheTests/AgentHistoryTests.swift
macos/Tests/LitheTests/AgentConversationSelectionTests.swift
macos/Sources/LitheAgentConversationModule/Application/AgentConnectionModel.swift
rust/lithe-agent-host/src/lib.rs
shared/fixtures/agent/acp-events-v1.json
rust/lithe-agent-host/src/codex_history.rs
rust/lithe-agent-host/src/codex_history/tests.rs
shared/fixtures/agent/history-activity-v1.json
macos/Tests/LitheTests/AgentLargeHistoryLoadTests.swift
.agents/notes/implemented/feature/2026-10-23-macos-agent-editor-large-history-and-claude-layout.md
已实现
待验证
证据路径
rust/lithe-agent-host/src/lib.rs
windows/tauri/src/features/agent/components/agent-history-list.tsx
windows/tauri/src/features/agent/hooks/use-agent-history.ts
windows/tauri/src/features/agent/services/agent-history-annotations.ts
windows/tauri/src/features/agent/services/agent-history-export.ts
windows/tauri/src/features/agent/services/agent-history-save.ts
windows/tauri/src/features/agent/services/agent-history-store.ts
windows/tauri/src/features/agent/services/agent-history-view.ts
windows/tauri/src/features/agent/services/agent-history.test.ts
windows/tauri/src/features/agent/components/agent-panel.tsx
windows/tauri/src/features/agent/stores/agent-connection.model.ts
windows/tauri/src/features/agent/stores/agent-parity.test.ts
windows/tauri/src/features/agent/components/agent-history-provider.test.tsx
AgentmacOS:在深浅主题与窄宽面板查看历史页,检查共享搜索框与按钮的焦点、悬停、禁用状态,验证标题/ID 搜索、空结果、返回保留草稿、刷新失败不丢列表、打开历史恢复会话;验证收藏/重命名重启后保留且不同项目/Agent 隔离;筛选和全选只操作可见项,单条与批量移除先确认,取消不修改记录,确认只移除提示时选中的会话,移除后可恢复且不改上游文件;单个与批量 Markdown 导出等待历史回放完成、保持原选中标签,取消/失败不写部分记录;部分回放后失败再导出必须重新加载并等待完成,断连后的未完整回放不可导出,完整快照断连后仍可导出;关闭项目释放导出等待。消息数量只显示已加载的用户与 Agent 消息,未知总数不伪造。点击 New Chat 创建真实新会话,等待创建时不能重复请求,确认后恢复可用;断连或未配置时显示具体原因;输入框加号仍只添加文件。macOS Chat History 进入独立历史管理页,选择会话通过已有连接发送 loadSession;返回保留草稿与连接。新建但未提交的实际会话可见、创建确认后仍显示 New Chat,且不伪造更新时间;本地重命名与上游标题优先保留、隐藏历史不重现;搜索和历史管理入口保持可用。进入会话后顶部历史入口显示当前标题;首条用户消息提供临时标题,本地重命名和上游标题优先;切换及重命名同步刷新顶部与列表,长标题省略且历史点击功能保留。标题栏三个点菜单打开共享弹框;检查 Rename Chat 持久化并更新标题,Delete Chat 取消不改动、确认后从历史隐藏且可恢复,忙碌时禁用,Settings打开现有设置。Show Toolbar 勾选隐藏/恢复输入框操作栏与Agent/模型/统计栏,已开弹框随隐藏关闭;文本可编辑且输入框高度保留,Tasks/Running/Edits不受影响。重开或切Agent保留可见状态,不停止任务。 Windows 面板已实现筛选(全部/收藏/已移除)、标题与会话 ID 搜索、复制会话 ID、收藏、本地重命名、单条与批量移除确认及恢复,标注按项目与 Agent 隔离并存在平台 store(`agent-history.json`),每次保存前先重读再合并以免多窗口互相覆盖;Markdown 导出已实现:先按需重放未打开的会话(导出用的加载不打开标签页),全部加载成功后才写文件,取消保存对话框不写文件,超过 32 MiB 直接报错;独立历史页已接入,消息数量只在会话已加载时显示。点击 New Chat 创建真实新会话,等待创建时不能重复请求,确认后恢复可用;断连或未配置时显示具体原因;输入框加号仍只添加文件。Chat History 点击后直接展开共享会话列表,当前会话置顶;新建但未提交的实际会话可见、创建确认后仍显示 New Chat,且不伪造更新时间;本地重命名与上游标题优先保留、隐藏历史不重现。鼠标和方向键/Enter 选择使用已有 loadSession;Escape 和外部点击关闭,关闭后键盘事件不继续作用于旧弹框。搜索和历史管理入口保持可用。进入会话后顶部历史入口显示当前标题;首条用户消息提供临时标题,本地重命名和上游标题优先;切换及重命名同步刷新顶部与列表,长标题省略且历史点击功能保留。标题栏三个点菜单打开共享弹框;检查 Rename Chat 持久化并更新标题,Delete Chat 取消不改动、确认后从历史隐藏且可恢复,忙碌时禁用,Settings打开现有设置。Show Toolbar 勾选隐藏/恢复输入框操作栏与Agent/模型/统计栏,已开弹框随隐藏关闭;文本可编辑且输入框高度保留,Tasks/Running/Edits不受影响。重开或切Agent保留可见状态,不停止任务。 历史加载:控制第二页尚未返回时确认第一页会话已显示且刷新状态保持;空项目页继续翻页,失败保留旧列表和已返回新项,重试及取消归档后丢弃旧请求分页。30 秒内从快捷历史切到管理页复用成功结果(包括空列表),请求未完成时不重复发送;超过期限重新查询,手动刷新立即查询。活跃与归档各自记录成功时间,归档失败只重试归档,断连/重连清除新鲜度;确认归档与活跃响应先后不同仍保持正确分组。Windows 同样消费共享 Host 的 sessionsPage 事件,非末页提前合并展示;活跃与归档分别维护 30 秒新鲜度,合并在途请求,并在轮次完成、重连与归档恢复时失效。跨过轮次的旧响应不能延长缓存有效期。 Codex 历史时间与排序使用上游 recencyAt:只查看/恢复旧会话、刷新、重命名或收藏后时间和顺序保持;新一轮对话活动出现后更新。活跃与归档一致,缺失活动时间不回退到元数据更新时间或当前时间;读取失败保留已有列表。保留历史页和弹框外观。 Codex 原生 App Server 活跃列表同样先发布匹配的非末页,继续保留 recency_at 排序、useStateDbOnly 只读请求、去重及 workspace/account/source 隔离;全局外项目页和重复页不产生假空列表或重复行。 双平台轮次结束:先确认 30 秒内命中活跃与归档快照,再完成后台会话的一轮回复,立即重新打开历史,验证只重查活跃列表并采用上游新活动时间与排序;加载/查看旧会话仍命中缓存。分别控制历史响应在轮次结束前、后到达,确认跨过该轮次的在途查询不能延长缓存期限,同时保持请求合并;新查询成功后可以再次复用。 macOS 大历史加载:对 1 200 轮(万级回放事件)的对话执行 loadSession,回放期间不逐条发布,结束后消息顺序、工具合并正确,对话首屏只显示最近 48 项,点“显示更早的 N 项”或导航栏跳到更早回合会扩大窗口并保持位置;加载失败恢复旧副本,断连保留部分回放但不标记完整。历史页分组与“…”菜单(收藏、重命名、导出、复制会话 ID、移出历史/恢复)可用,搜索、筛选、多选、归档分区保持原行为。 Codex 跨供应商回归:同账号与工作区准备官方、ACP 网关、原生自定义及之前供应商的记录,活跃与归档均可列出和搜索;不同账号、工作区及子代理仍隔离。查询全部 provider 并保持 useStateDbOnly,不改写旧记录或按 rollout 文件存在性判断历史丢失。 供应商筛选:默认全部;菜单候选合并活跃和归档的真实 modelProvider,未知/空白来源独立处理,不按当前路由或模型猜。验证精确 ID、未知来源、标题/ID 搜索、置顶/已移除交集、分页到达、归档分组和无命中提示;切换后清除批量选择,批量动作不得影响被筛掉的会话;恢复全部不重新查询或改写历史。窄宽面板、深浅主题、键盘选择和中英文入口验收。 归档折叠回归:无搜索词下选择有归档匹配的供应商或未知来源,首次点击归档标题立即收起,再点立即展开;搜索/供应商变化恢复新范围的自动默认,旧范围手动折叠不能泄漏,普通列表刷新保留用户选择。
2026-10-22:Windows 已提供独立历史页与快捷历史列表、分页首批展示、30 秒活跃/归档独立缓存、请求合并和轮次完成失效。搜索、收藏、重命名、移除/恢复、批量管理和 Markdown 导出沿用现有平台存储与回放流程。Agent 标注按项目和 Agent 隔离,不修改上游会话文件。单元测试覆盖分页、归档恢复及旧响应竞争;完整平台运行验收保持 pending,不能用测试替身证明真实服务。 2026-11-01:共享 Host 删除固定供应商历史筛选;混合供应商确定性测试覆盖活跃与归档,真实平台验收保持 pending。 2026-11-01:增加可选 modelProvider 摘要元数据和双平台主动筛选,默认仍查询全部;确定性测试覆盖传播与筛选交集,原生整机验证按实际执行记录。 2026-11-01 review 修复:双平台手动折叠覆盖供应商/搜索的自动展开默认,macOS 展示与切换共用实际值,Windows 随搜索和供应商范围重置显式覆盖。
AI / Agent 对话新安装及模块关闭时仍显示 Agent 侧栏入口,打开项目不自动恢复 Agent 面板;未选择 Agent 前反复打开均显示欢迎页,选择 Codex、Claude 或更多 Agent 后直达会话;会话顶部显示历史、新对话、设置与收缩入口,输入区沿用共享控件;设置位于主设置窗口
agent-entry-discoverability
已实现
待验证
证据路径
macos/Sources/Lithe/Application/Features/AgentConversationEntryPolicy.swift
macos/Sources/Lithe/Views/Agent/AgentConversationView.swift
macos/Tests/LitheTests/AgentConversationEntryPolicyTests.swift
macos/Resources/IDEAIcons/toolwindows/toolWindowAgent.svg
macos/Sources/Lithe/Views/Workbench/WorkbenchModuleUIComposition.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchView.swift
macos/Sources/Lithe/Views/App/SettingsView.swift
macos/Sources/Lithe/Models/AppModel/AppModelSupportTypes.swift
macos/Sources/Lithe/Views/Agent/AgentWelcomeView.swift
macos/Sources/Lithe/Views/Agent/AgentComposerView.swift
macos/Sources/Lithe/Views/Agent/AgentComposerContent.swift
macos/Sources/Lithe/Views/Components/LitheWelcomeCardStyle.swift
已实现
待验证
证据路径
windows/tauri/src/features/settings/components/tabs/ai-settings.tsx
windows/tauri/src/features/ai/hooks/use-agent-options.ts
windows/tauri/src/features
windows/tauri/src/features/agent/components/agent-trigger.tsx
windows/tauri/src/features/layout/components/plugin-activity-rail.tsx
windows/tauri/src/features/agent/components/agent-panel.tsx
windows/tauri/src/features/keymaps/commands/command-registry.ts
Agent打开保存过 Agent 面板可见布局的项目,确认面板仍关闭,点击入口后才能打开。然后在未选择 Agent 的 macOS 测试偏好域打开项目,确认点击右侧 Agent 入口显示欢迎页,直接关闭再打开、自定义 API 设置返回仍显示欢迎页。分别选择 Codex 和 Claude,重开后确认顶部显示对应 Agent 名称及品牌图标;历史菜单可打开历史与搜索,模块关闭或未配置时,新对话显示具体不可用原因并保留本地草稿,历史入口展示不可读取原因并可返回且保留草稿;已配置时新对话使用现有动作,不显示顶部面板图标,设置图标进入 AI > Agents,共享收缩按钮关闭面板;发送、Agent 与模型/权限下拉按钮复用共享 hover/按下/禁用样式,会话标签复用共享工具窗口标签的活动/非活动样式,Agent 下拉列出现有 Codex/Claude 与配置入口,未配置选择后直接切换标题与底栏,显示配置提示且不打开设置;底栏 hover 左边界与输入框普通边框对齐,输入背景沿用编辑器表面;输入框复用共享控件边框及普通/焦点颜色,写作空白区域使用共享编辑光标,焦点边框为 2pt 并向外扩展 1pt;多行输入及占位文字复用共享输入的 14pt Regular、深浅主题 Component.infoForeground 提示色(#73767C)及输入法观察;附件/发送使用 16pt 图标和共享 22pt 按钮状态,会话详情入口复用共享22pt命中区且无 hover 底色,收到报告显示16pt用量圆环,未上报显示信息图标并在弹层提示未知;同一可滚动面板保留上下文、会话和Token统计,未知不伪造零用量并检查深浅主题、焦点描边、附件、发送、Agent 切换、命令补全及窄面板布局。关闭模块后入口不重复,未选择时不激活模块 factory;已有配置或已激活模块的默认选择不记录为用户选择,也不启动连接;旧版首次打开布尔标记仍显示欢迎页。Windows 尚无 Agent 对话 UI。默认书写区为两行(50pt含文字内边距),只保留单一底栏,附件“+”移到Agent图标左侧;顶部灰栏及空白占位移除。输入继续自动增高、封顶滚动,清空后回到两行,附件单独增高,没有手动拖动输入高度。会话详情唯一入口在发送按钮左侧,真实用量显示16pt圆环,未上报显示信息图标,均占位22pt,顶部不重复显示信息按钮,不显示行内百分比或hover底色;有无会话统计、窄宽面板和深浅主题下位置一致,悬停详情及无障碍百分比保留,底栏不重复显示。New Chat 不再显示会话标签条,连续创建时立即清理前一个未发送消息的本地临时会话;已发送的会话与已加载空历史保留,创建等待时重复点击不发第二次请求。系统语言与界面语言不同时,Agent启动/认证/错误/设置/状态与用量提示使用界面locale,不混入系统语言;切换英文后历史中文名称与消息保持原文。启动空态在深浅主题复用共享字型、颜色、间距和小号进度指示器。Windows 不提供 Codex 原生 app-server 集成入口;AI 设置只保留本机 API Key 供应商,以及行内编辑与补全所需的供应商配置,Windows 已接入 Agent 面板入口与能力开关;真机验收待执行。 Windows 已提供活动栏 Agent 入口、命令面板命令与快捷键,面板只在用户触发后显示;真机初次安装、关闭模块与项目重启行为待验收。默认输入边框高度为参考布局目标 108pt,在不同面板高度保持一致;附件和手动拖动仍可增加高度。上下文用量仅在发送按钮左侧显示16pt圆环、22pt占位,不显示行内百分比或hover底色;有无会话统计、窄宽面板和深浅主题下位置一致,悬停详情及无障碍百分比保留,底栏不重复显示。New Chat 不再显示会话标签条,连续创建时立即清理前一个未发送消息的本地临时会话;已发送的会话与已加载空历史保留,创建等待时重复点击不发第二次请求。系统语言与界面语言不同时,Agent启动/认证/错误/设置/状态与用量提示使用界面locale,不混入系统语言;切换英文后历史中文名称与消息保持原文。启动空态在深浅主题复用共享字型、颜色、间距和小号进度指示器。Windows 不提供 Codex 原生 app-server 集成入口;AI 设置只保留本机 API Key 供应商,以及行内编辑与补全所需的供应商配置,Agent 对话面板待接入共享 lithe-agent-host(#956)。
2026-10-16 Windows:活动栏新增 Agent 入口(`plugin-activity-rail.tsx` + `agent-trigger.tsx`),`MainLayout` 把 Agent 面板挂到右侧工具窗,命令面板与快捷键可触发 `workbench.showAgent`,`settings.agentPanel` 参与归一化;面板关闭或未配置时状态条给出原因与设置入口。 真实窗口、深浅主题与中英文切换验收仍待执行。 2026-10-18 Windows:入口链路(活动栏 `agent-trigger.tsx`、命令面板 `workbench.showAgent`、快捷键)已存在,本次把矩阵状态从 missing 更新为 implemented;真机初次安装、关闭模块、打开保存过面板布局的项目仍不自动弹出,以及中英文切换验收待执行。 2026-10-30 两端 Agent 入口图标统一为 Lucide bot 字形:macOS 替换 `toolWindowAgent.svg`,Windows `agent-trigger.tsx` 改用 `AgentIcon`;深浅主题下的真机核对待执行。
AI / Agent 对话从编辑器文件标签或项目树右键把文件添加到当前或指定 Agent 会话草稿;明确 Codex/Claude 目标、支持多文件去重、新建会话与按会话保留输入,不自动发送
agent-file-context-actions
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentFileAttachmentMenu.swift
macos/Sources/Lithe/Views/Editor/EditorAreaView.swift
macos/Sources/Lithe/Views/Workspace/ProjectSidebarView.swift
macos/Sources/Lithe/Models/AppModel/AppModel+AgentConversation.swift
macos/Sources/LitheAgentConversationModule/Application/AgentFileAttachmentDestination.swift
macos/Sources/LitheAgentConversationModule/Application/AgentConnectionModel.swift
macos/Tests/LitheTests/AgentFileAttachmentTests.swift
已实现
待验证
证据路径
shared/contracts/application-boundary.md
windows/tauri/src/features/agent/components/agent-composer.tsx
windows/tauri/src/features/agent/stores/agent-connection.model.ts
windows/tauri/src/features/agent/hooks/use-agent-file-context-menu.ts
windows/tauri/tests/agent-file-context-menu.test.ts
windows/tauri/src/features/agent/stores/agent-connection-service.ts
AgentmacOS:深浅主题下右键非活动文件标签,确认添加的是被右键的文件;项目树单文件和多选文件使用同一入口,目录不递归展开。当前会话入口明确 Agent,其他会话按已配置 Codex/Claude 分组,显示标题、短 ID 与当前勾选,支持新建会话。分别切换两个 Agent 与同 Agent 的两个会话,确认草稿文字及附件互不串用、重复添加去重、超过32个或非法批次原子拒绝、未配置时引导设置。首次启动、会话创建和历史加载失败后附件保留;已有回复不中断,只有手动发送才提交;添加后显示目标会话并聚焦输入框,编辑区/工具窗口位置保持。菜单打开后换项目、删除文件、取消 Agent 配置或移除会话,不得错误转发。脏文件只提醒保存,不自动保存或复制。Swift 原生宿主与受控 transport 回归不代替真实 Codex/Claude 完整工作流,Windows 已接入相同文件上下文入口;真实供应商完整工作流待验收。 Windows:在真实 Tauri 窗口执行 Windows 项目树与编辑器标签菜单可将保存的文件引用添加到当前或指定 Agent/会话草稿,保留文本、去重并检查工作区与会话是否过期;不会自动发送或启动后台 Agent。草稿按 Agent/会话隔离。 单元测试不替代运行时验收,未执行的真实服务及平台动作保持 pending。 Windows 回归使用真实设置 store 和 CAS 队列:从 Codex 文件菜单添加到 Claude,保存完成并规范化后仍能加入目标草稿;保存失败、保存或连接期间切换项目与配置时不得附加到错误目标。 Windows 本机 CLI 联动回归同时使用真实连接服务与设置 CAS 队列:Claude/Codex 启动读取到新地址或模型并保存后,文件仍加入正确草稿;启动期间外部修订或刷新保存失败必须拒绝附加。
2026-10-22:Windows 项目树与编辑器标签菜单可将保存的文件引用添加到当前或指定 Agent/会话草稿,保留文本、去重并检查工作区与会话是否过期;不会自动发送或启动后台 Agent。草稿按 Agent/会话隔离。 Windows 回归使用真实设置 store 和 CAS 队列:从 Codex 文件菜单添加到 Claude,保存完成并规范化后仍能加入目标草稿;保存失败、保存或连接期间切换项目与配置时不得附加到错误目标。 Windows 本机 CLI 联动回归同时使用真实连接服务与设置 CAS 队列:Claude/Codex 启动读取到新地址或模型并保存后,文件仍加入正确草稿;启动期间外部修订或刷新保存失败必须拒绝附加。
AI / Agent 对话从 Finder 或项目树拖入文件、⌘V 粘贴 Finder 文件或剪贴板图片、单独输入 @ 或全角 @ 展示工作区文件候选、继续输入关键字筛选并附加到 Agent 输入框,文件选择器、图片缩略图与可移除标签、多文件去重和数量限制、文件引用随消息发送及失败保留草稿
agent-file-references
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentComposerView.swift
macos/Sources/Lithe/Views/Agent/AgentFileReferenceList.swift
macos/Sources/LitheAgentConversationModule/Application/AgentFileReference.swift
macos/Tests/LitheTests/AgentFileReferenceTests.swift
macos/Tests/LitheTests/AgentConversationFeatureModelTests.swift
rust/lithe-agent-host/src/tests.rs
macos/Sources/Lithe/Views/Agent/AgentComposerPaste.swift
macos/Sources/Lithe/Views/Agent/AgentCommandCompletion.swift
macos/Sources/Lithe/Models/AppModel/AppModel+AgentConversation.swift
macos/Tests/LitheTests/AgentConversationPresentationTests.swift
macos/Tests/LitheTests/AgentComposerPasteTests.swift
macos/Sources/Lithe/Application/Features/SearchWorkflowCoordinator.swift
macos/Tests/LitheTests/SearchEverywhereBehaviorTests.swift
shared/fixtures/search/unicode-contiguous.json
已实现
待验证
证据路径
rust/lithe-agent-host/src/prompt.rs
shared/fixtures/agent/acp-events-v1.json
windows/tauri/src/features/agent/components/agent-composer.tsx
windows/tauri/src/features/agent/types/agent-file-uri.ts
windows/tauri/src/features/agent/services/agent-composer-mentions.ts
windows/tauri/src/features/agent/services/agent-composer-mentions.test.ts
windows/tauri/src/features/file-system/utils/file-system-dropped-paths.ts
windows/tauri/src/features/file-system/utils/file-system-drop-controller.ts
windows/tauri/src/features/file-system/utils/file-system-drop-controller.test.ts
windows/tauri/src-tauri/src/agent_clipboard.rs
windows/tauri/src/platform/agent-pasted-images.ts
windows/tauri/tests/agent-pasted-images.test.ts
AgentmacOS:从 Finder、项目树拖入临时文件(多文件、中文/空格名)到输入区与上下文栏,检查高亮和可移除标签、去重、数量限制、会话切换和发送失败保留草稿;用隔离项目验证文字+文件与纯文件发送、历史加载后引用正确送到原会话、Agent 读取与权限流程。在 Finder 复制文件后于输入框 ⌘V 应附加文件,截图后 ⌘V 应生成带缩略图的图片附件(保存在 Caches/AgentPastedImages,一周后清理,不写 app bundle),复制普通文字时 ⌘V 照常粘贴,Caps Lock 开启时附件 ⌘V 同样生效;切到另一窗口或同窗口其他输入框后,附件粘贴不得进入原 Agent 草稿;在深色和浅色主题下单独输入 @ 或全角 @ 应立即列出已加载工作区的文件候选(最多 20 项,不重新扫描);扫描结束前输入 @,文件清单就绪后应自动出现候选,无需重输;继续输入关键字应筛选文件,旧查询不得覆盖新候选;方向键切换、回车/Tab 选中后移除 @ 查询并附加该文件,Esc 只关闭候选且保留草稿。图片按文件引用处理,无多模态上传。Windows 原生拖放和 Claude 端到端待验证。 macOS 裸 @ 与 @Name 共享项目文件可见性,均不显示 .build/node_modules 生成文件,不受 Search exclusions(例如 *.log)影响;全局搜索仍可单独包含生成目录名称。 Unicode 回归:@i 能找到 src/İ.txt,小写展开和希腊字母上下文转换不丢失候选;与共享 unicode-contiguous fixture 核对。 Windows:在真实 Tauri 窗口执行 Windows 支持拖放、选择器、当前文件、@ 引用、原生 CF_HDROP 文件粘贴与图片粘贴缩略图。图片按数量、类型和大小限制写入平台缓存,过期或失败粘贴清理自身文件;已接收图片为历史保留。目录不递归展开。 单元测试不替代运行时验收,未执行的真实服务及平台动作保持 pending。
2026-10-22:Windows 支持拖放、选择器、当前文件、@ 引用、原生 CF_HDROP 文件粘贴与图片粘贴缩略图。图片按数量、类型和大小限制写入平台缓存,过期或失败粘贴清理自身文件;已接收图片为历史保留。目录不递归展开。
AI / Agent 对话全局指令卡片:一份共享正文按 Agent 显式启停同步到原生用户文件的 Lithe 区块,保留自有内容、实际路径、独立草稿及逐项错误;支持展开编辑、外部修改校验、原子保存和显式重新加载;取消在 Core 登记边界同步交付,已取消保存不因后台任务启动竞态写入
agent-global-instructions
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentInstructionsSettingsView.swift
macos/Sources/Lithe/Application/Features/AgentInstructionsFeatureModel.swift
macos/Sources/Lithe/Core/Rust/RustAgentInstructionsService.swift
macos/Tests/LitheTests/AgentInstructionsFeatureModelTests.swift
macos/Tests/LitheTests/AgentInstructionsAppearanceTests.swift
rust/lithe-agent-host/src/instructions.rs
macos/Sources/Lithe/Views/App/SettingsView.swift
macos/Tests/LitheTests/SettingsSidebarLayoutTests.swift
macos/Tests/LitheTests/SharedInstructionsFeatureTests.swift
rust/lithe-agent-host/src/instructions/shared.rs
rust/lithe-agent-host/src/instructions/shared/tests.rs
macos/Sources/Lithe/Core/Rust/RustCoreCancellation.swift
macos/Tests/LitheTests/AgentInstructionsCancellationTests.swift
部分实现
待验证
证据路径
rust/lithe-agent-host/src/instructions.rs
rust/lithe-core/src/agent/instructions.rs
windows/tauri/src-tauri/src/platform.rs
shared/fixtures/agent/agent-instructions-v1.json
rust/lithe-agent-host/src/instructions/shared.rs
shared/fixtures/agent/shared-instructions-v1.json
Agent在同一份 macOS 预览的 AI 分组中同时检查「指令」与「技能」入口,来回切换确认两个功能都可加载。macOS:打开设置 AI > 指令,分别查看 Codex、Claude 的实际用户路径,编辑保存后新建对话验证原生加载;确认 CODEX_HOME/CLAUDE_CONFIG_DIR、自定义目录、Codex 非空 override 优先和清空 override 后返回基础文件;切换 Agent 和设置页保留未保存草稿,文件被外部修改时拒绝覆盖并保留草稿,显式重新加载需确认且读取失败不丢草稿;回归中文/英文、深浅主题和窄宽窗口的原生编辑器、选择器、搜索及保存状态。运行 AgentInstructionsFeatureModelTests、AgentInstructionsAppearanceTests、AgentInstructionsContractTests、SettingsSidebarLayoutTests、SettingsSearchVocabularyTests,以及 Host/Core 计时测试;Windows 共享文件命令可经通用 platform_invoke 分派,设置页与 Windows 原生运行验收待完成。 新增共享卡片、Agent 图标/路径/自有行数与展开编辑;隔离用户目录真实保存、启用两 Agent、更新、关闭其中一个,逐字节确认私有内容不变,重新打开从原生区块回读开关;外部修改、损坏标记、只读目标与取消后不覆盖,单项失败继续其他项并保留错误。SharedInstructionsFeatureTests 覆盖连续开关排队、取消、失败和草稿;深浅色中英文宽窄布局需实机检查。 注册前取消回归:确定性控制调用前取消、请求编码时取消,真实 Core 返回 cancelled,已有共享源不变、缺失源和锁不创建,后续有效操作仍成功。CI test-stability-macos 产物包含 instructions-ui 的中英文、深浅主题、宽窄原生截图。
共享源保存在平台 storage adapter 的 Application Support/Lithe/AgentInstructions/Shared.md,不额外拼接提示词。开关只控制 Lithe 区块,新会话由上游加载;按文件原子替换,跨文件部分失败可见。源、锁、暂存文件及原生指令均为用户状态,不可工作树复用,不写发行资源。
AI / Agent 对话Hook 资源库:创建、编辑、搜索、启停、删除并显式同步到 Codex / Claude Code 原生配置,支持五种共同生命周期事件、工具筛选、超时、部分失败重试和中断恢复;不代替上游执行或授予信任
agent-hooks
已实现
已验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentHooksSettingsView.swift
macos/Sources/Lithe/Application/Features/AgentHooksFeatureModel.swift
macos/Sources/Lithe/Core/Rust/RustAgentHooksService.swift
macos/Tests/LitheTests/AgentHooksFeatureModelTests.swift
macos/Tests/LitheTests/AgentHooksAppearanceTests.swift
rust/lithe-agent-host/src/hooks.rs
shared/fixtures/agent/hooks-management-v1.json
.agents/notes/implemented/feature/2026-10-24-agent-hooks.md
macos/Sources/Lithe/Views/Agent/AgentSelectionChip.swift
macos/Sources/Lithe/Views/Components/LitheSettingsControls.swift
已实现
待验证
证据路径
windows/tauri/src/features/settings/components/tabs/agent-hooks-settings.tsx
windows/tauri/src/features/agent/services/agent-hooks.ts
windows/tauri/src/features/agent/services/agent-hooks.test.ts
rust/lithe-agent-host/src/hooks.rs
windows/tauri/src/features/settings/components/tabs/agent-hooks-settings.test.tsx
Agent在 macOS 与真实 Windows 中打开 AI > Hooks,创建、编辑、搜索、启停和删除命令;确认五种事件和 Shell/文件编辑筛选映射正确,超时空值沿用原生默认。使用隔离用户目录运行真实 Codex/Claude Agent,批准原生信任后触发会话开始、提示词、工具前后和回合结束,并验证 JSON stdin 与工作目录。保留已有设置及用户 Hook;删除后其他组的位置不变,Codex trust 配置不变;外部修改、只读、非法 JSON、符号链接、原生单项失败、中断和取消显示可重试状态。运行 Host Hook、Core 契约、Swift 功能/外观/设置导航测试与 Windows frontend 验证,检查中英文深浅色窄宽页面及编辑面板。比较操作前后发行 bundle 文件清单与哈希不变。 按参考页检查编辑器两列标签对齐、多行描述与命令、创建/编辑标题和固定底部动作;验证 Agent 品牌选择按钮、全部恢复和全不选时禁用保存。 搜索不匹配时应显示中英文「没有匹配的 Hook」,清空后恢复列表;区分无搜索词的空资源库,搜索不发起配置写入。
源与所有权日志由平台 storage adapter 提供可写目录;1 MiB 有界读写,非阻塞 OS 锁,逐文件原子替换,跨文件部分失败明确可见。原生 JSON 保留未知字段值但规范化格式;非法 JSON/重复键拒绝覆盖。Codex 仍须在原生 /hooks 中启用与信任命令,配置已写入不表示已执行。macOS 已通过 51 项相关 Swift 计时测试、14 项 Hook 文件测试和真实界面 CRUD/搜索/启停/冲突恢复验收;10 个原生 CLI 与 4 个 ACP 真实模型会话覆盖 Codex 0.160.0、Claude Code 2.1.310、Codex ACP 1.13.1、Claude ACP 0.81.2,验证五种事件、工具筛选、JSON stdin、会话目录、命令修改、停用/删除/重新启用和原生超时。1382 个 bundle 文件哈希不变,测试配置与进程已清理。完整 Host lane 为 231 通过、39 个 opt-in 跳过。Windows 实机运行尚未执行,verificationStatus 保持 pending。 Windows frontend 的 9 项计时测试与类型检查通过,包含重新加载不携带写入快照的请求边界回归;这不替代 Windows 实机验收。 编辑器按参考设计采用两列表单、独立标题/底栏和品牌选择按钮;macOS 复用 MCP 原有选择按钮,新增布局与输入回归。 布局调整后 78 项 macOS Swift 计时测试和 9 项 frontend 测试通过,类型检查通过;已检查中英文深浅色编辑器截图,并在真实预览验证焦点、多行描述、全部/单选和工具事件切换。 Review 修复 Windows 无匹配搜索留白,空状态改为依据筛选结果;新增中英文界面回归后 11 项 frontend 计时测试和类型检查通过。覆盖名称/命令大小写、中文描述、清空恢复、空资源库和搜索不写入;目标 Windows 运行证据仍待补充。
AI / Agent 对话Agent 管理:主设置窗口 AI > Agents 单页设置、Node.js/npm 检测、预检清单、ACP 适配器与 Agent CLI 一键安装或升级、所有 Agent CLI 共用按安装来源确认新版本的更新入口与更新后重连提示、一键获取本机 CLI 配置、实时下载数据量/速度/耗时与等待提示、按 CLI 安装来源更新、验证实际升级结果并区分成功警告与失败
agent-management
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentPanelSettingsView.swift
macos/Sources/Lithe/Application/Features/AgentManagementFeatureModel.swift
rust/lithe-agent-host/src/install.rs
rust/lithe-core/src/agent/mod.rs
rust/lithe-agent-host/src/npm-progress.mjs
rust/lithe-agent-host/src/cli_update.rs
macos/Tests/LitheTests/AgentManagementFeatureModelTests.swift
macos/Sources/Lithe/Application/Features/AgentSetupDiagnostics.swift
macos/Tests/LitheTests/AgentSetupDiagnosticsTests.swift
macos/Sources/Lithe/Views/App/SettingsView.swift
rust/lithe-agent-host/src/environment.rs
rust/lithe-agent-host/src/cli_update/tests.rs
已实现
待验证
证据路径
rust/lithe-core/src/agent/mod.rs
shared/fixtures/agent/agent-management-v1.json
windows/tauri/src-tauri/src/platform.rs
windows/tauri/src/features/agent/services/agent-management.ts
windows/tauri/src/features/agent/services/agent-management.test.ts
windows/tauri/src/features/agent/components/agent-settings-section.tsx
windows/tauri/src/features/agent/hooks/use-agent-management.ts
windows/tauri/src/features/settings/components/tabs/agent-settings-panel.tsx
Agent在 macOS 打开 Agent 面板右上角的设置:确认弹出主设置窗口并选中 AI > Agents,沿用共享侧栏、搜索、面包屑与表单样式,显示 Node.js 与 npm 版本,Node 缺失或版本过低时只提示;一键安装、取消安装、更新与卸载 Codex 适配器;Codex、Claude Code 与后续目录 Agent 的 npm 发布版本确认无更新时,预检行保持 PASS、显示已是最新版本且没有 Update;Homebrew 无更新时只显示当前本地索引未发现更新,并提示手动 brew update 后重查,确认不会自动刷新索引;英文与简体中文切换后,折叠预检标题及说明随界面语言变化;确认有新版本时才显示 Update;原生安装查询未知时显示无法检查更新与原安装器指引,不运行更新器做探测;新增 npm/Homebrew Agent 复用目录包名与已验证的更新计划,无品牌分支;回归覆盖 Claude 两种 Homebrew 渠道、虚构后续 Agent、npm 字符串与单元素数组 JSON、成功命令 stderr 带 warning,以及 CLI 低于最低版本但 updateAvailable 为 false 时仍保留升级指引;查询失败时显示无法确认且没有 Update;CLI 过旧时确认通过原安装器升级,npm 环境不匹配或未知来源时只显示手动指引;升级后确认实际 PATH 中的版本达到要求,成功提示重连以刷新模型目录且现有会话不会被自动中断;模拟安装器先下载失败再重试成功但返回非零,确认版本确实提升时显示成功与折叠警告日志,版本未变/仍旧/丢失、取消和超时继续按原语义处理;确认下载数据量、速度、耗时实时更新且未知总量不显示百分比,取消/失败/完成后进度清除;一键获取本机 Codex 配置后返回 Agent 面板对话,且提交信息所用服务商不变;Windows 已接入独立 Agent 设置页;官方 CLI 安装、卸载和登录仍需独立验收。设置页 Agent 选择使用共享下拉框,预检和 ACP adapter 标注没有背景卡片;从设置选择 Codex/Claude/自定义 Agent 后,聊天标题与底栏同步,再从聊天底栏切回,设置下拉与详情同步;未配置或功能关闭时也保持选择一致且不自动打开设置。设置供应商按钮使用共享尺寸,错误提示使用共享通知,WARN/FAIL 检查项能收起再展开;AI Providers 无供应商时仍可新增。运行AgentManagementFeatureModelTests、AgentSetupDiagnosticsTests及lithe-agent-host计时测试:重复检查加载、失败原因、保留旧数据后重试;所有目录适配器相同/较高/较低/预发布/元数据/非法版本;Codex、Claude和future-agent在不同渠道与未知状态下的按钮一致性和CLI探测错误。真实macOS设置页与Windows界面验收仍待进行。更新版本展示回归覆盖npm、Homebrew cask/formula、缺少current_version及其他包同列时只选取目标包的版本;中英文预检标题与详情必须显示相同当前/目标版本。 Windows:在真实 Tauri 窗口执行 Windows Agent 设置页复用管理模型,提供适配器安装、确认卸载、CLI 来源与版本、预检详情、更新检查及下载进度。真实下载、卸载及官方 CLI 登录需单独验收。 单元测试不替代运行时验收,未执行的真实服务及平台动作保持 pending。
2026-10-22:Windows Agent 设置页复用管理模型,提供适配器安装、确认卸载、CLI 来源与版本、预检详情、更新检查及下载进度。真实下载、卸载及官方 CLI 登录需单独验收。
AI / Agent 对话回复过程中发送补充指令:协商现有 ACP steering 能力、按草稿内容切换的单一发送/停止入口、发送确认和失败、保留当前轮次与授权、结束竞态的受控续轮、斜杠命令由普通 prompt 确认完成、等待配置时可撤销未消费消息、断连保留输入与回显去重
agent-mid-turn-steering
已实现
待验证
证据路径
rust/lithe-agent-host/src/steering.rs
rust/lithe-agent-host/src/lib.rs
rust/lithe-agent-host/src/tests.rs
macos/Sources/LitheAgentConversationModule/Application/AgentConnectionModel.swift
macos/Sources/Lithe/Views/Agent/AgentComposerView.swift
macos/Sources/Lithe/Views/Agent/AgentTranscriptView.swift
macos/Tests/LitheTests/AgentConversationFeatureModelTests.swift
macos/Tests/LitheTests/AgentNextTurnConfigurationTests.swift
shared/fixtures/agent/acp-events-v1.json
macos/Tests/LitheTests/AgentLocalizationTests.swift
macos/Tests/LitheTests/AgentConversationSelectionTests.swift
已实现
待验证
证据路径
rust/lithe-agent-host/src/steering.rs
shared/contracts/rust-core-api.md
windows/tauri/src/config/backend-capabilities.ts
rust/lithe-agent-host/src/lib.rs
shared/fixtures/agent/acp-events-v1.json
windows/tauri/src/features/agent/stores/agent-connection.model.ts
windows/tauri/src/features/agent/stores/agent-connection.model.test.ts
windows/tauri/src/features/agent/components/agent-composer.tsx
windows/tauri/src/features/agent/components/agent-transcript.tsx
windows/tauri/src/features/agent/types/agent.types.ts
windows/tauri/src/i18n/locale.ts
AgentmacOS 分别使用 Codex API Key、Codex 订阅和 Claude API Key,在输出、工具执行和等待授权期间发送补充,确认补充发送不替换主轮次且停止仍可取消任务、上游接受后调整当前任务、原计时和权限保留、用户回显不重复;连续发送保持顺序,拒绝和断连保留输入并显示错误。受控 ACP 测试覆盖完成先于补充确认、Claude promptRequired 仅续发一次且停止撤销、turnFinished 后等待多项配置时取消不发送原生 cancel,全部确认后也不再续发;Codex /status 等斜杠命令(含前导空白和附件)不调用 steering,原回复结束后由普通 prompt 响应完成,无新轮状态事件仍可继续对话;普通补充 startedNewTurn 等待新轮明确 idle,重复旧 idle 不提前结束、停止仍可达续轮且不确认时看门狗清理;超时不自动重放。深浅主题与窄面板检查发送和停止及等待配置时的 Stop/Esc 可用;切换界面语言后发送、已接收、取消和拒绝文案跟随界面语言,用户输入保持原文。真实供应商和 Windows 运行验收待完成;Windows Agent 原生后端当前未启用,仅共享协议已实现。原生受控回归在 280/480pt 宽度与深浅主题下实际点击同一位置的 Send/Stop,确认运行中空草稿或纯空白显示停止,文字或仅附件切换为发送,发送清空后恢复停止,停止确认和待续发期间仍可取消,检查 steer/cancel 命令及发送中/已接收状态,并可输出补充发送前、发送中、已接收、停止中的组件截图;该验证不替代真实供应商、完整产品桌面合成或 Windows 端到端验收。 Windows:共享 Rust host 的 `steer`/`steeringResult` 已接到 Tauri 前端。回复中发送走独立 steer 命令并保留原轮次计时与授权;消息先显示“正在发送…”,`injected` 后变为“Agent 已接收”,失败保留输入与原因;`promptRequired`(含斜杠命令)在轮次结束后只以普通 prompt 续发一次,续发复用原消息 ID 不重复回显;停止会撤销未消费的 continuation;断连把未确认补充标为失败并清除 steering 能力;实时 `user_message_chunk` 在回复期间忽略,历史回放仍照常重建。单测覆盖已接收、promptRequired 单次续发、停止撤销、拒绝与断连;真实 Codex/Claude 供应商与 Windows UI 验收待执行。 Windows:补充命令收到 promptRequired 后,原轮继续输出再结束,续轮必须复用同一用户消息 ID 且独立显示回复;两轮统计具有不同结束锚点,两个 footer 均保留,复制各自回复不得串轮。
2026-10-18 Windows:`AgentConnectionModel` 增加 `canSteer`、`pendingSteeringToken`、补充消息 delivery 状态与 continuation 队列;Composer 在响应中显示独立 Stop 与 Send,Send 仅在协商 `canSteer` 时可用;Transcript 在用户气泡下方显示发送/已接收/失败。
AI / Agent 对话Agent 自行切换模式时同步权限选择器;结构化 notice 与回复分开,过期 Auto 提示不覆盖 Plan,本地或原生 /model 切换中新产生的降级原因保留,配置结果不重放旧警告覆盖新通知,后续换模型清理旧通知
agent-mode-sync
已实现
待验证
证据路径
macos/Sources/LitheAgentConversationModule/Application/AgentConnectionModel.swift
macos/Tests/LitheTests/AgentConversationFeatureModelTests.swift
macos/Tests/LitheTests/AgentConversationPresentationTests.swift
macos/Tests/LitheTests/AgentTranscriptReplay.swift
macos/Sources/LitheAgentConversationModule/Application/AgentSessionNotice.swift
macos/Sources/Lithe/Views/Agent/AgentTranscriptView.swift
rust/lithe-agent-host/src/tests.rs
shared/fixtures/agent/acp-events-v1.json
macos/Tests/LitheTests/AgentConversationSelectionTests.swift
docs/agent-mode-notice-visual-check.md
已实现
待验证
证据路径
windows/tauri/src/features/agent/types/agent.types.ts
windows/tauri/src/features/agent/stores/agent-connection.model.ts
windows/tauri/src/features/agent/services/agent-session-selectors.ts
windows/tauri/src/features/agent/types/agent.types.test.ts
shared/fixtures/agent/acp-events-v1.json
rust/lithe-agent-host/src/lib.rs
windows/tauri/src/features/agent/stores/agent-parity.test.ts
AgentmacOS:使用真实 Agent 进入并退出计划模式,确认 current_mode_update 只同步有效模式且不回发请求。Claude 默认 Auto 且模型不支持时,先切 Plan 再首次发送,迟到降级提示不出现;实际降级时显示可关闭通知,成功切模式或模型后清除旧通知,配置失败保留。新降级通知早于配置结果时等待确认,不能被旧 Plan 或新模型确认误删;暂存警告→新错误→配置成功/失败都保留新错误,相反顺序保留最新有效警告,无效或其他会话通知不改变顺序。无本地 token 的原生 /model 按 mode→notice→config 顺序保留本次新通知,转换只保护一份完整配置,后续换模型仍清理旧警告;覆盖后台会话隔离和新轮次清理。确认通知不进入回复、导出或轮次统计,各会话独立;深浅主题和窄宽面板使用共享 Banner。执行 AgentConversationFeatureModelTests、AgentConversationPresentationTests、AgentTranscriptScrollTests、Host notice 握手与转发测试,通知与权限同时出现及关闭时保持长历史滚动。Windows 已处理 `current_mode_update`:只更新 Agent 已列出的 mode 选项,未知 id 不写入、不回发请求,选择器继续显示上游模式名。真实供应商与降级通知验收仍 pending。 Windows:在真实 Tauri 窗口执行 Windows 消费上游模式变更与结构化降级通知,关联当前会话和配置;确认新配置后清理过期提示。重试次数与静默活动保留真实忙碌状态,不擅自结束轮次。 单元测试不替代运行时验收,未执行的真实服务及平台动作保持 pending。
2026-10-22:Windows 消费上游模式变更与结构化降级通知,关联当前会话和配置;确认新配置后清理过期提示。重试次数与静默活动保留真实忙碌状态,不擅自结束轮次。
AI / Agent 对话Agent 发送旁单一入口按需展开的上下文与会话详情(有用量显示圆环,未上报显示信息图标;顶部不重复显示信息按钮):轮次/模型调用步数/TPS、Token 用量与缓存命中、参考式上下文构成面板(系统提示词、工具定义、MCP 工具、对话消息)详情卡片;可在设置中关闭的本机代理观测每次模型调用的首 token 延迟、耗时与非流式标记;Codex订阅连接支持HTTP/SSE与WebSocket模型调用采集、增量上下文构成和原生用量校准;会话详情左侧边框固定竖向,不出现横穿滚动面板的伪分隔线;账户/工作区变更使在途路由查询失效,迟到响应不能授权订阅采集;会话及Token统计卡片省略常驻观测与计数来源说明;macOS 按全部观察请求判断用量完整性,辅助请求不抵消缺失 usage,只有辅助请求的 Token 也显示并持久化
agent-model-call-statistics
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentSessionStatusView.swift
macos/Sources/Lithe/Views/Agent/AgentContextUsageView.swift
macos/Sources/Lithe/Views/Agent/AgentTurnStatisticsView.swift
macos/Sources/Lithe/Views/Agent/AgentPanelSettingsView.swift
macos/Sources/LitheAgentConversationModule/Application/AgentModelCall.swift
macos/Sources/LitheAgentConversationModule/Application/AgentSessionStatistics.swift
macos/Tests/LitheTests/AgentConversationFeatureModelTests.swift
rust/lithe-agent-host/src/model_proxy.rs
rust/lithe-agent-host/src/model_calls.rs
rust/lithe-agent-host/src/model_proxy/websocket.rs
rust/lithe-agent-host/src/model_proxy/websocket/tests.rs
rust/lithe-agent-host/src/subscription.rs
macos/Sources/Lithe/Application/Features/AgentLaunchConfigurationResolver.swift
macos/Tests/LitheTests/AgentLaunchConfigurationResolverTests.swift
macos/Sources/Lithe/Views/Agent/AgentEditorConversationChrome.swift
macos/Tests/LitheTests/AgentSessionSelectorLayoutTests.swift
rust/lithe-agent-host/src/codex-config-relay.cjs
scripts/agent/test-codex-config-relay.mjs
已实现
待验证
证据路径
rust/lithe-agent-host/src/model_proxy.rs
shared/fixtures/agent/acp-events-v1.json
rust/lithe-agent-host/src/model_proxy/websocket.rs
rust/lithe-agent-host/src/model_proxy/websocket/tests.rs
rust/lithe-agent-host/src/subscription.rs
rust/lithe-agent-host/src/codex-config-relay.cjs
scripts/agent/test-codex-config-relay.mjs
windows/tauri/src/features/agent/components/agent-observed-statistics.tsx
windows/tauri/src/features/agent/types/agent-observations.test.ts
AgentmacOS:在 Agent 设置开启“模型调用统计”,用 API Key 模式的 Claude 与 Codex 各完成一轮带工具调用的对话,确认 Agent 正常回复;点击会话详情显示会话统计(模型用时、工具与授权用时、TTFT、TPS)、Token 明细和上下文构成;发送旁圆环悬停仅显示百分比与已用/容量,点击展开上下文明细,数值与服务商控制台大致一致;每轮页脚显示模型调用次数、首字和速度,非流式响应有标记。关闭开关并重新连接后,步数、TPS、TTFT 与上下文构成隐藏,只显示轮次、Agent 上报的最近一轮 Token 与上下文占用;Codex订阅与API Key模式共用可选统计。并发两个会话时不串数据。窄宽面板、深浅主题检查布局。Windows 已消费 observeModelCalls 与 modelCall 事件并呈现观测统计。受控代理可验证 UI 与持久化;真实供应商代理观测仍待验收。 统计与上下文入口统一位于发送旁,顶部不再显示重复信息按钮;有报告显示用量圆环,未上报显示信息图标,均打开同一可滚动面板,窄面板可查看全部会话、Token与缓存命中、上下文四类分项及工具/MCP数量;主界面不常驻统计长文本。发送旁同一入口同时展示上下文构成、会话统计与Token明细,标题关闭按钮、Esc、外部点击关闭同一弹窗,历史快照仅显示用量数字,未上报不显示为0%;隐藏工具栏或切换会话关闭原弹层,编辑页与工具窗口数据保持一致。 上下文与MCP共用多色容量条和图例,缺少分项不显示伪造零值或技能分类,详情仅展示上下文构成、会话与Token统计,移除更改区、Git分支、变更文件数、Agent编辑行数和未编辑文件提示;弹窗与右侧详情栏一致,文件活动栏及回撤仍可用。 有分项数据后面板底部不常驻估算说明和分隔线;分项比例仍有~,悬停显示估算Token及按请求大小估算/按供应商输入校准的口径。无分项的未知或启用指引继续保留。 开启统计后,Codex订阅重连并发送消息,验证四类分项、调用次数、TTFT/TPS和缓存命中;关闭统计重连保持原生直连。WebSocket压缩、分片、控制帧和认证头原样透传,预热不计数,连续两轮基于完整上下文估算,未知前序ID不编造分项;旧历史缺分项等待新请求,不显示“订阅不统计”提示。原生Codex与本地假服务验收不等于真实供应商或Windows运行验收。 原生account/read仅对普通后台且NO_CONSTRAINT启用采集;地区受限、未知或失败保留原生直连,账户变更关闭已观察连接。 会话详情展开并滚动至会话统计与Token用量,确认左侧边框竖向且无横穿面板中间的多余线;正常标题分隔、滚动和关闭行为保留,深浅主题均检查。 会话统计不显示“模型调用由本机代理观测”说明,Token卡片不显示“本会话所有模型请求由服务商返回的计数”说明;数值、标题分隔和卡片间距正常,无说明残留空白;缺失统计指引、缺失用量下界及Agent原生计数口径按原状态保留。 确定性回放account/read请求→account/updated或account/login/completed通知→旧成功响应→新建/恢复/分叉,确认同邮箱工作区切换也保持原生路由,通知后的新查询成功才允许观察;已观察连接仍关闭。darwin/win32协议模拟均覆盖,不等于Windows原生验收。 Windows:在真实 Tauri 窗口执行 Windows 消费 Host 模型调用观测,展示调用数、输入输出 Token、首 Token 延迟、输出速度、模型耗时与非流式调用;未知用量保留未知,部分观测按下界提示。按会话持久化累计数字,未保存原始请求、正文或凭据。真实供应商代理观测仍待验收。 单元测试不替代运行时验收,未执行的真实服务及平台动作保持 pending。 Claude 订阅(本机 Claude Code 账号)与 API Key、Codex 订阅一样可观测:发送一轮后上下文分项有数值,Claude Code 在会话开始时自己发的“起标题”请求不计入步数、首字延迟和输出速度,但它花掉的 Token 计入 Token 合计。说明文字统一收进 ⓘ(详情栏卡片标题行、发送旁面板标题旁),悬停小卡片仍直接显示。 macOS 确定性回放一条有 usage 的标题请求加一条缺 usage 的普通或辅助请求,确认缺失次数为 1、Token 保持下界;全部有 usage 时缺失为 0。仅标题请求也显示与保存真实 Token,重载合并后请求数继续累计,对话步数仍不含标题;旧统计文档无新计数字段时可读取。
2026-10-22:Windows 消费 Host 模型调用观测,展示调用数、输入输出 Token、首 Token 延迟、输出速度、模型耗时与非流式调用;未知用量保留未知,部分观测按下界提示。按会话持久化累计数字,未保存原始请求、正文或凭据。真实供应商代理观测仍待验收。 2026-10-25:Claude 订阅经透传代理观测;模型调用事件新增 auxiliary 标记,起标题请求不计步数。
AI / Agent 对话当前打开项目的明确上下文:嵌套子项目范围、普通和补充消息一致、恢复会话后保持范围、保留上层开发规则与原生命令、用户历史与实时及历史列表标题移除 Host 附加上下文
agent-opened-workspace-context
已实现
已验证
证据路径
rust/lithe-agent-host/src/workspace_context.rs
rust/lithe-agent-host/src/lib.rs
rust/lithe-agent-host/src/tests.rs
rust/lithe-agent-host/tests/real_agent.rs
macos/Sources/Lithe/Platform/MacOS/Agent/MacACPAgentTransport.swift
shared/fixtures/agent/acp-events-v1.json
macos/Tests/LitheTests/AgentHistoryTests.swift
已实现
待验证
证据路径
rust/lithe-agent-host/src/workspace_context.rs
shared/contracts/rust-core-api.md
windows/tauri/src/features/agent/services/agent-launch.ts
windows/tauri/src/features/agent/services/agent-transport.ts
windows/tauri/src-tauri/src/agent.rs
Agent打开外层有独立 IDE README 和开发规则、内层有 Spring Boot README 的子项目,普通提问和回复中补充均应读取内层资料并介绍内层服务;停止重连并恢复同一会话后再次询问,范围与用户历史保持。跨会话及不同工作区不能混用范围。检查文件附件顺序、仅附件消息、空输入和非法 URI;/usage、/compact 与 /model 的 ACP 原始参数保持。真实 Claude/Codex 供应商验证读文件证据与回答;历史只呈现原用户文字,模型回复和工具证据不被过滤。该上下文不宣称文件系统沙箱。Windows 已由 Agent 面板经 Tauri 连接桥接入共享 Host,launch.cwd 作为工作区路径;共享 workspace context 覆盖普通消息、补充消息和会话恢复。目标平台与真实供应商运行验收待完成。 macOS 已通过共享 ACP 确定性回归、真实 Claude Opus 与 Codex 的嵌套项目/补充/重连恢复/消息和标题验收,以及实际 Spring Boot 示例窗口中的原始问题、补充提问和历史恢复验证。 受控 ACP 回归必须比较带附件斜杠命令的完整普通 prompt 和 steering 延后续发数组(含前导空白与多附件顺序),确认没有附加上下文块;仅附件首条消息产生的完整、截断、空白归一化上下文标题在实时更新与列表中均为 null,macOS 保留首条用户消息、新对话、无标题和导出回退。上述边界通过受控协议与呈现验证,真实供应商带附件命令未据此视为验收完成。
AI / Agent 对话任务以紧凑状态行显示 Agent 上报计划(ACP plan)的已完成/总数及当前步骤,点击展开待执行、进行中和已完成状态;无计划或空计划隐藏任务行并关闭旧弹层,不计入工具调用;每次更新整体替换,空计划清除;Codex API Key 与官方订阅会话均显式启用原生 update_plan 清单工具,仅作用于 Lithe 启动的进程;步骤文字保持正常颜色且无删除线,已完成显示绿色勾选,待执行显示空心圆
agent-plan-display
已实现
待验证
证据路径
macos/Sources/LitheAgentConversationModule/Application/AgentSessionGuidance.swift
macos/Sources/Lithe/Views/Agent/AgentSessionGuidanceViews.swift
macos/Tests/LitheTests/AgentConversationFeatureModelTests.swift
shared/fixtures/agent/acp-events-v1.json
macos/Sources/Lithe/Views/Agent/AgentActivitySummaryBar.swift
macos/Tests/LitheTests/AgentActivityPresentationTests.swift
rust/lithe-agent-host/src/lib.rs
rust/lithe-agent-host/src/subscription.rs
rust/lithe-agent-host/src/tests.rs
已实现
待验证
证据路径
windows/tauri/src/features
windows/tauri/src/features/agent/types/agent.types.ts
windows/tauri/src/features/agent/stores/agent-connection.model.ts
windows/tauri/src/features/agent/components/agent-transcript.tsx
shared/fixtures/agent/acp-events-v1.json
AgentmacOS:让真实 Claude/Codex 在多步任务中上报计划,确认任务入口显示已完成/总数,展开后每条待执行、进行中、已完成状态和图标正确;步骤推进时整体刷新而不重复;切换会话显示各自计划,加载历史会话后计划恢复。没有计划但存在已完成或执行中的工具调用时,不显示任务入口或工具数量;收到非空计划后显示计划进度及步骤,再收到空计划或切回无计划会话时隐藏任务入口并关闭旧弹层,不回退到工具列表。工具证据保留在对话记录,普通工具不计入子代理。运行 AgentActivityPresentationTests.tasksShowOnlyReportedPlansAndToolsDoNotBecomeSubagents,覆盖计划到达后的入口出现、打开与清空关闭、计数、中英文可访问标签、三种步骤状态和深浅主题;在窄宽面板检查长步骤截断与滚动。macOS 紧凑状态区:进度与当前步骤同一行、长标题省略并保留完整悬停;存在子代理时右侧保留其独立入口。无计划时不留任务占位,清空计划关闭弹层,新计划不自动重新打开;全部内容为空时输入区上方无状态区及预留高度。深浅主题、280/540pt、中英文与长列表验证可点击区域、滚动、当前步骤及状态更新。Codex 原生清单启用:核对 API Key/订阅及指定/未指定模型的启动配置,均含 tools.update_plan.enabled=true,且无协作模式覆盖、无密钥注入;订阅路由统计改写后该能力仍保留。重启开发版创建新会话,请求真实三步任务,确认工具可调用、计划状态推进并展开详情;用户 CLI 配置文件不变。任务文字样式:深浅主题展开包含 completed/in_progress/pending 的清单,确认已完成为绿色勾选、待执行为空心圆,所有步骤正文保持正常文字颜色且不出现删除线,状态可访问标签仍正确。 Windows 已接入共享 `plan` 事件:会话按整批替换计划,活动栏上方以单行“计划 1/3”显示完成进度与当前步骤,展开后逐条显示待办、进行中与已完成状态;不上报计划时不渲染。真机计划上报验收待执行。
2026-10-18 Windows:`agent-connection.model.ts` 把 ACP `plan` 整体写入会话,`agent-transcript.tsx` 在活动统计栏上方显示可折叠计划进度;单测覆盖共享 fixture 的计划解析、进度汇总,非法计划更新被忽略、空计划清除。 真机验收待执行。
AI / Agent 对话Agent 供应商管理:读取本机配置、Codex/Claude 字段表单(名称、遮罩密钥、基础地址和模型)与可切换的配置文本输入(空白和部分填写也可返回表单)、新增 Codex 使用 gpt-6.1-sol、Claude 使用 claude-fable-5-1 默认模型、通用供应商要求显式模型、协议切换保留手动模型、编辑保留已保存模型、安全保存密钥、启用与重连、确认删除及取消关联;本机连接按同次快照同步地址、模型与凭据,并支持按供应商显式允许 HTTP
agent-provider-configuration
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentProviderConfigurationView.swift
macos/Sources/Lithe/Platform/MacOS/UI/MacConfigurationTextEditor.swift
macos/Sources/Lithe/Application/Features/AgentProviderConfiguration.swift
macos/Sources/Lithe/Models/AppModel/AppModel+AgentProviders.swift
macos/Tests/LitheTests/AgentProviderConfigurationTests.swift
macos/Sources/LitheAgentConversationModule/Application/AgentConnectionModel.swift
macos/Tests/LitheTests/AgentConversationFeatureModelTests.swift
macos/Sources/LitheCoreContracts/AI/CommitMessageModels.swift
macos/Tests/LitheTests/CommitMessageTests.swift
macos/Sources/Lithe/Application/Features/AgentLaunchConfigurationResolver.swift
macos/Sources/Lithe/Models/Settings/AppSettings.swift
macos/Tests/LitheTests/AgentLaunchConfigurationResolverTests.swift
macos/Tests/LitheTests/AgentLaunchConfigurationIntegrationTests.swift
macos/Sources/Lithe/Platform/MacOS/AI/MacAgentProviderConfigurationParser.swift
已实现
待验证
证据路径
rust/lithe-core/src/ai/agent_configuration.rs
shared/fixtures/agent/provider-configuration-v1.json
windows/tauri/src/features/agent/components/agent-settings-section.tsx
windows/tauri/src/features/agent/services/agent-launch.ts
windows/tauri/src/features/agent/services/agent-provider-import.ts
windows/tauri/src/platform/agent-cli-configuration.ts
windows/tauri/src/features/agent/services/agent-provider-credentials.ts
windows/tauri/tests/agent-linked-launch.test.ts
windows/tauri/src-tauri/src/agent_provider_settings.rs
windows/tauri/tests/agent-settings-persistence.test.ts
windows/tauri/tests/agent-provider-editor.test.tsx
AgentmacOS:本机 Codex/Claude 配置使用 HTTP 回环代理时,确认默认被拒绝;在当前本机配置行打开 Allow insecure HTTP,空闲重连后检查所选代理接收请求,关闭后再次拒绝;刷新、重新导入及重启保留许可且另一来源不受影响,忙碌时拒绝更改,另一窗口刷新或删除后过期更改失败。验证本机 Codex/Claude 配置读取、刷新与取消关联;外部 CLI 连续切换地址、模型与密钥后直接建立新连接,确认每个连接使用同次快照且面板元数据同步,不依赖手动刷新;原供应商 ID、关联、提交供应商选择、另一来源和 HTTP 许可不变,密钥不进入设置;缺失配置或密钥拒绝旧路由,仅模型可读时保留回退显示;自定义配置及订阅不读取本机 API 快照;新增 Codex 专用编辑器时确认默认模型为 gpt-6.1-sol,新增 Claude 专用编辑器确认预填 claude-fable-5-1 且 settings JSON 与表单一致;两种草稿往返切换后保留默认值,编辑已有 Claude 供应商保留自定义或空模型;通用 AI Providers 的 Add Provider 切换 Anthropic Messages 后,未填写模型时确认 Claude 草稿模型为空且提交信息请求在发送前被拒绝,填写模型后检查 Anthropic 请求使用该值;协议切换保留手动模型(包括恰好等于 Codex 默认值的输入),编辑已有服务商时确认保留已保存的模型;新增与编辑默认显示名称、API Key、API 请求地址和模型表单,必填项为空禁用保存,密钥默认隐藏且可显隐;修改字段后切到配置文本确认 TOML/JSON 正确转义,修改配置文本后切回表单检查同步回填;新增 Codex/Claude 后不填任何值往返切换,以及分别缺少地址、模型、Key 时返回表单,确认不报缺失密钥、不填隐式默认值且仍不能保存;粘贴部分配置和模型别名确认字段与 Key 保留,切换失败保留原文和当前模式,保存只读取当前模式的输入;检查表单 HTTP 默认阻止且显式许可后可保存,编辑回填地址、模型、Key、HTTP 许可及原 ID;添加自定义 TOML/auth JSON 或 Claude settings JSON,检查格式化、输入直引号不被自动替换、弯引号 TOML 错误在保存按钮上方始终可见、非法配置和缺失密钥、取消不保存、编辑保持 ID、删除确认及安全存储失败不丢失配置。在一个窗口保存并等待连接关闭期间,由另一窗口删除或修改同一供应商,确认旧保存失败且不恢复/覆盖供应商、密钥或 Agent 关联。检查窄宽面板、深浅主题、中英文本。空闲切换后确认请求到所选地址和模型;未发送空会话切换或意外退出后重新创建,不向旧 ID 加载,首条消息与文件只发送一次;已有消息、上游列出或成功加载的会话继续恢复,历史加载失败保留记录;正在响应、加载、权限待处理或配置确认时拒绝切换。提交服务商选择不被添加/启用改变。CLI 文件与 bundle 不被写入。2026-10-07 已通过 claude-fable-5-1 真实新连接、重连、历史回放与继续回复验证;Windows 编辑器及完整供应商管理界面验收待验证。 Windows:在真实 Tauri 窗口执行 Windows 已支持按 Agent 保存独立配置、命名供应商列表、确认移除与解除密钥关联;密钥按 Agent/供应商 ID 存入 Windows 凭据库,地址变化使用新凭据所有者。表单可生成 Codex TOML/Claude JSON,文本可解析返回表单;Codex auth JSON 的显式 API Key 安全保存。可只读导入本机元数据,或关联本机配置,在每次连接读取最新地址、模型与同次读取的显式 API Key,缺失时拒绝使用旧路由。CLI 文件保持只读。供应商新增和编辑使用独立草稿,取消不保存;显式保存通过 native CAS 同时提交元数据与安全凭据,过期修订拒绝覆盖。已关联本机配置在连接时刷新元数据与凭据,密钥字段支持显隐,读取完成前禁用编辑与保存。真实 Claude/Codex 服务请求和完整多窗口桌面验收保持 pending。 单元测试不替代运行时验收,未执行的真实服务及平台动作保持 pending。 Windows 回归:Codex TOML/auth JSON 和 Claude settings JSON 在文本模式导入后切回表单,直接保存保留导入的地址、模型及凭据草稿;密钥只交给凭据保存动作,不写入普通设置。
2026-10-22:Windows 已支持按 Agent 保存独立配置、命名供应商列表、确认移除与解除密钥关联;密钥按 Agent/供应商 ID 存入 Windows 凭据库,地址变化使用新凭据所有者。表单可生成 Codex TOML/Claude JSON,文本可解析返回表单;Codex auth JSON 的显式 API Key 安全保存。可只读导入本机元数据,或关联本机配置,在每次连接读取最新地址、模型与同次读取的显式 API Key,缺失时拒绝使用旧路由。CLI 文件保持只读。供应商新增和编辑使用独立草稿,取消不保存;显式保存通过 native CAS 同时提交元数据与安全凭据,过期修订拒绝覆盖。已关联本机配置在连接时刷新元数据与凭据,密钥字段支持显隐,读取完成前禁用编辑与保存。真实 Claude/Codex 服务请求和完整多窗口桌面验收保持 pending。 Windows 回归:Codex TOML/auth JSON 和 Claude settings JSON 在文本模式导入后切回表单,直接保存保留导入的地址、模型及凭据草稿;密钥只交给凭据保存动作,不写入普通设置。
AI / Agent 对话每轮思考、过程说明和工具调用合成一个默认折叠的过程入口,流式时也由用户主动展开;最终回复单独展示,空白片段不占行,搜索临时展开匹配内容,原始思考记录与 Markdown 导出保持独立
agent-reasoning-display
已实现
待验证
证据路径
macos/Sources/LitheAgentConversationModule/Application/AgentConnectionModel.swift
macos/Sources/Lithe/Views/Agent/AgentSessionGuidanceViews.swift
macos/Tests/LitheTests/AgentThoughtTranscriptTests.swift
macos/Tests/LitheTests/AgentConversationFeatureModelTests.swift
shared/fixtures/agent/acp-events-v1.json
macos/Tests/LitheTests/AgentConversationPresentationTests.swift
macos/Sources/Lithe/Views/Agent/AgentTranscriptView.swift
macos/Sources/Lithe/Views/Agent/AgentTurnStatisticsView.swift
macos/Sources/Lithe/Views/Agent/AgentProcessGroupView.swift
已实现
待验证
证据路径
windows/tauri/src/features/agent/types/agent.types.ts
windows/tauri/src/features/agent/stores/agent-connection.model.ts
windows/tauri/src/features/agent/components/agent-transcript.tsx
shared/fixtures/agent/acp-events-v1.json
windows/tauri/src/features/agent/services/agent-transcript-items.ts
windows/tauri/src/features/agent/services/agent-history-export.ts
windows/tauri/src/features/agent/services/agent-history-view.ts
windows/tauri/src/features/agent/services/agent-transcript-items.test.ts
windows/tauri/src/features/agent/components/agent-transcript.process.test.tsx
AgentmacOS 与 Windows:构造思考→过程说明→读文件→思考→执行命令→最终回复,确认每轮只有一个过程入口且默认收起,流式也不自动展开;收起时过程文字与工具行不占高度,最终回复始终可读。展开按原顺序呈现,只有相邻工具合并,状态与证据可继续查看。纯空白思考、过程说明不产生空行,没有思考和工具的直接回答不产生入口;新用户消息、已记录的轮次结束分别切断分组,工具或思考结束而没有最终回复时不伪造回复。搜索过程文字及工具输入、输出、文件路径,匹配组临时展开且不能在搜索期间收起,清空后恢复手动选择;切换和关闭会话验证偏好隔离与释放。深浅主题、窄宽面板、历史恢复和实时流均验证;历史导出、文件审阅、权限卡片、轮次统计和回复复制继续可用。单元测试与组件回放不替代真实 Agent 和 Windows Tauri 运行验收,未执行部分保持 pending。
2026-10-24:改为每轮一个默认折叠的过程区,包含思考、工具和中间说明;只改变呈现,不改写历史或 ACP 协议。ACP 无最终回复角色,按最后一条思考或工具的位置保留末尾正文;后续活动到达时才将先前正文移入过程。
AI / Agent 对话Agent 回复的 Markdown 渲染:中文标点紧邻 ** 的加粗正确显示;表格悬停可单独复制为 Markdown 与 HTML;文件路径(含 :行号 / #L行号)、GitHub 与普通网页链接按类型显示图标,文件链接在编辑器中打开并定位到行,其余交给系统打开
agent-reply-markdown
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentMarkdownView.swift
macos/Sources/Lithe/Views/Agent/AgentMarkdownLink.swift
macos/Sources/Lithe/Views/Agent/AgentTranscriptView.swift
macos/Resources/IDEAIcons/vcs/vendors/github.svg
macos/Tests/LitheTests/AgentMarkdownTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/agent/components/agent-transcript.tsx
windows/tauri/src/features/ai/components/messages/markdown-renderer.tsx
windows/tauri/src/utils/markdown-links.ts
windows/tauri/src/utils/markdown-links.test.ts
AgentmacOS:让 Agent 回复包含 `**状态:**仍开放`、代码内 `**`、多列表格以及 `[App.swift](macos/Sources/App.swift:42)`、`[README](README.md#L3)`、GitHub issue 与普通网页链接。确认加粗正确且代码、转义星号和实体生成的星号保持原文,两个独立路径链接标签中的字面 ** 不能跨链接配对或被删除;悬停表格出现复制按钮,粘贴到文本编辑器得到 Markdown 表格,重新渲染后字面星号、反斜杠、链接语法、HTML 实体、单元格内换行与边缘空白仍保留原字符,粘贴到 Numbers/表格得到单元格;文件链接显示文档/代码图标并在编辑器中打开到对应行,文件名包含字面 %20、%2F、# 时仍打开原文件,GitHub 链接显示 GitHub 图标并用浏览器打开。检查深浅主题。Windows Agent 对话已复用共享 Markdown 渲染器:表格悬停提供 MD/HTML 两个复制按钮,文件路径(含 :行号、:行:列 与 #L行号)、GitHub 与普通网页链接按类型显示图标,文件链接在编辑器中打开并定位到行,其余交给系统打开;回复与思考块都使用同一渲染器。真机复制与跳转验收待执行。
2026-10-18 Windows:新增 `markdown-links.ts` 复刻 macOS `AgentMarkdownLink` 的分类(web/github/file,文件带 :行号 与 #L 解析,Windows 盘符不当成 URL scheme),思考与回复统一走 `markdown-renderer.tsx`;表格复制 Markdown 保留原始源文本,HTML 复制生成带对齐的 table。单测覆盖链接分类,真机验收待执行。
AI / Agent 对话技能设置:全局与项目分类、Agent 来源筛选、搜索刷新、查看与定位、原生目录新建和导入、原生配置启停开关(点击立即切换、后台确认、失败回滚、不显示加载转圈、保存提示不推动列表、仅待确认行禁用、其他行保持颜色并按序保存);操作菜单保留所属窗口焦点和开启开关的颜色;技能目录最终发布在 macOS/Linux/Windows 均原子拒绝已有目标(包含空目录)
agent-skill-management
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentSkillsSettingsView.swift
macos/Sources/Lithe/Views/Agent/AgentSkillSheets.swift
macos/Sources/Lithe/Application/Features/AgentSkillsFeatureModel.swift
rust/lithe-agent-host/src/skills.rs
rust/lithe-agent-host/src/skills/files.rs
macos/Tests/LitheTests/AgentSkillsFeatureModelTests.swift
rust/lithe-agent-host/src/skills/tests.rs
shared/fixtures/agent/skills-management-v1.json
rust/lithe-agent-host/src/skills/settings.rs
macos/Tests/LitheTests/LitheActionMenuFocusTests.swift
macos/Sources/Lithe/Core/Rust/RustAgentManagementService.swift
macos/Tests/LitheTests/AgentSkillsCancellationTests.swift
部分实现
待验证
证据路径
rust/lithe-core/src/agent/mod.rs
rust/lithe-agent-host/src/skills.rs
shared/fixtures/agent/skills-management-v1.json
rust/lithe-agent-host/src/skills/files.rs
rust/lithe-agent-host/src/skills/tests.rs
AgentmacOS 在设置 → AI → 技能查看全局/项目两类、数量和来源标签;切换已打开项目和来源筛选,查询名称与说明;Codex 使用官方发现结果,Claude 清楚区分目录清单、本地配置可见性与会话实际可用性,内置/插件来源保留。检查深浅主题、500pt 与宽页面、菜单锚点、长名称和空态。打开详情查看完整 SKILL.md 与路径,复制路径及 Finder 定位;新建和导入弹窗显示适用 Agent、范围和目标目录,导入保留脚本、模板及权限。同名、非法名称、错误 YAML、符号链接、超限、取消或读取失败不覆盖已有技能、不留下半成品;失败保留旧列表,切项目拒绝旧结果。无项目时可管理全局,项目新增不可用;无需对话和 API Key,保存不发消息、不打断任务。Windows 目前仅共享 Core 与 Host 操作,页面及真实进程/文件系统验收待实现。 验证启停点击立即显示用户选择且不出现行内加载转圈,确认前不报告已保存;在深浅主题、500pt 与 760pt 页面中,对比首次切换前、关闭保存中及确认后、再次开启保存中及确认后的原生开关位置,成功提示始终预留空间且隐藏时不进入辅助功能树,列表不因提示显示或隐藏而跳动;写入失败恢复已确认值并显示错误、待确认行禁止重复提交,其他行保持原生开启颜色并可独立点击排队;控制同一 Agent 的两次原生写入按序确认,不丢失已保存的状态,单行失败回滚且后续队列继续,失败提示不被其他成功覆盖;切项目或退出时未开始的写入不再执行、切项目及退出拒绝迟到结果;Codex 仅对发现路径调用 skills/config/write 并读取确认,项目路径配置影响所有引用该路径的项目;Claude 全局修改用户 settings.json,项目修改 settings.local.json,按名称生效并保留其他字段/文件权限;无效配置、未知状态、符号链接、超限、锁冲突和取消不覆盖既有配置。不自动断开已有对话。 打开技能三个点纯操作菜单,所属设置窗口保持 key 身份、开启开关保持颜色且不发配置写入;方向键/Return/Esc 可用,真正保存期间仍禁用。搜索下拉继续获得输入焦点,嵌套子动作菜单优先接收按键;所属窗口失焦或应用切换关闭菜单并移除监听。 Windows 原生 CI 回归 publication_cannot_replace_an_existing_empty_directory,覆盖暂存后目标出现、普通文件与非空目录字节保留、Unicode/空格目标完整发布,以及 NUL 路径拒绝。Windows 使用 MoveFileExW 且不启用覆盖或跨卷复制,不以 std::fs::rename 的平台行为推断排他性;文件系统用例通过不代表设置页或会话已验收。 AgentSkillsCancellationTests 通过真实桥接验证创建、导入和启停在服务入口前取消时不改变技能包或原生配置;编码时取消经 requestStarted 注册握手补传,文件分派前停止且后续请求可成功。
AI / Agent 对话输入框以 / 开头(或以 $ 开头选择 Skill)时,按 Agent 为当前会话上报的命令列表(ACP available_commands_update)弹出补全,显示名称、说明与参数提示,选择后填入命令并按普通消息原样发送;长补全列表保留可见输入行,最小输入区中在上方浮出完整列表;中文输入法下 `、` 等同 `/`,`¥`/`¥` 等同 `$` 打开技能列表
agent-slash-commands
已实现
待验证
证据路径
macos/Sources/LitheAgentConversationModule/Application/AgentSessionGuidance.swift
macos/Sources/Lithe/Views/Agent/AgentComposerView.swift
macos/Sources/Lithe/Views/Agent/AgentSessionGuidanceViews.swift
macos/Tests/LitheTests/AgentConversationFeatureModelTests.swift
macos/Sources/Lithe/Views/Agent/AgentComposerDraftArea.swift
macos/Tests/LitheTests/AgentConversationPresentationTests.swift
macos/Sources/Lithe/Views/Agent/AgentComposerContent.swift
macos/Sources/Lithe/Views/Agent/AgentCommandCompletion.swift
macos/Sources/LitheAgentConversationModule/Application/AgentConnectionModel.swift
已实现
待验证
证据路径
windows/tauri/src/features/agent/types/agent.types.ts
windows/tauri/src/features/agent/stores/agent-connection.model.ts
windows/tauri/src/features/agent/components/agent-composer.tsx
windows/tauri/src/features/agent/services/agent-command-completion.ts
windows/tauri/src/features/agent/services/agent-command-completion.test.ts
shared/fixtures/agent/acp-events-v1.json
AgentmacOS:分别连接 Codex 与 Claude,输入 / 确认弹出的命令与 Agent 实际上报一致,不出现 Lithe 内置命令;Codex 上报的 $Skill 补全为 $名称 而不是 /$名称,输入 $ 只列 Skill;继续输入时按前缀优先过滤,无匹配时显示“没有匹配的命令”,输入空格后关闭;鼠标选择或 Return 补全为“/命令 ”,完整命令按 Return 直接发送并由 Agent 执行;macOS 14 及以上方向键和 Tab 可导航,macOS 13 仍可鼠标选择;Esc 先关闭补全、回复中再次 Esc 才停止;切换会话后显示各自命令列表;上游重复上报同名命令时只显示首条定义,断连后清空旧补全,重连加载后以新进程上报为准;在默认和最小输入区高度、有无附带文件、窄宽面板中输入 /,用长列表和空结果确认输入行可见可编辑,浮出的命令可鼠标选择,方向键选中最后一条时列表跟随滚动。Windows 已接入 ACP `available_commands_update`:输入 `/`、`、` 或 `macOS:分别连接 Codex 与 Claude,输入 / 确认弹出的命令与 Agent 实际上报一致,不出现 Lithe 内置命令;Codex 上报的 $Skill 补全为 $名称 而不是 /$名称,输入 $ 只列 Skill;继续输入时按前缀优先过滤,无匹配时显示“没有匹配的命令”,输入空格后关闭;鼠标选择或 Return 补全为“/命令 ”,完整命令按 Return 直接发送并由 Agent 执行;macOS 14 及以上方向键和 Tab 可导航,macOS 13 仍可鼠标选择;Esc 先关闭补全、回复中再次 Esc 才停止;切换会话后显示各自命令列表;上游重复上报同名命令时只显示首条定义,断连后清空旧补全,重连加载后以新进程上报为准;在默认和最小输入区高度、有无附带文件、窄宽面板中输入 /,用长列表和空结果确认输入行可见可编辑,浮出的命令可鼠标选择,方向键选中最后一条时列表跟随滚动。、`¥`、`¥` 时在输入框上方浮出命令列表(最多 168px),显示调用名与说明,前缀匹配优先、其次包含匹配;方向键移动、Tab 或 Return 补全为“/命令 ”或“$skill ”,完整命令 Return 直接发送,Esc 先关闭列表、回复中再次 Esc 才停止;无匹配时显示“没有匹配的命令”,断连后清空旧列表。中文输入法与真机验收待执行。
2026-10-18 Windows:`availableCommands` 进入 `AgentConversation`,由 `parseAvailableCommands` 按 200 条上限、去重保留首条解析;`agent-command-completion.ts` 复刻 macOS 的触发字符、前缀优先排序与按键状态机,Composer 在草稿上方浮出列表并保留原 `@` 文件选择器。单测覆盖触发字符、排序、去重与按键结果,真机验收待执行。
AI / Agent 对话原生子代理监视:有真实子会话时在任务状态行右侧显示独立子代理数量入口,查看真实任务、状态、完成进度及已收到的推理、工具和输出;嵌套子代理与授权由主会话管理,普通工具不计入子代理;子代理或祖先终止时只结算对应子树的未决授权,移除失效卡片并释放计时/静默计数,保留主轮次和其他授权
agent-subagent-monitoring
已实现
待验证
证据路径
rust/lithe-agent-host/src/subagents.rs
rust/lithe-agent-host/src/lib.rs
rust/lithe-agent-host/src/tests.rs
macos/Sources/Lithe/Views/Agent/AgentSubagentListView.swift
macos/Sources/Lithe/Views/Agent/AgentActivitySummaryBar.swift
macos/Sources/LitheAgentConversationModule/Application/AgentConnectionModel.swift
macos/Tests/LitheTests/AgentConversationFeatureModelTests.swift
macos/Tests/LitheTests/AgentActivityPresentationTests.swift
shared/fixtures/agent/acp-events-v1.json
macos/Sources/LitheAgentConversationModule/Application/AgentConversationState.swift
已实现
待验证
证据路径
rust/lithe-agent-host/src/lib.rs
windows/tauri/src/features/agent/services/agent-transport.ts
windows/tauri/src/features/agent/stores/agent-connection.model.ts
windows/tauri/src/features/agent/components/agent-transcript.tsx
windows/tauri/src/features/agent/types/agent-observations.ts
windows/tauri/src/features/agent/components/agent-observed-statistics.tsx
windows/tauri/src/features/agent/stores/agent-parity.test.ts
AgentmacOS:使用支持 AIR nativeSubagentSessions 的 Claude/Codex 在隔离项目中创建真实子代理,确认名称、任务、嵌套关系、运行/完成/失败/取消/断开状态与完成数/总数;展开详情查看实际输出和工具,状态刷新保持弹层。普通工具不产生子代理;子输出不拼入主回复、历史预览或复制。切换会话隔离,历史恢复同一子代理,停止主任务收尾子代理授权等待;父代理结束后未报告结果的子代理显示已断开。运行 AgentConversationFeatureModelTests 的 nativeSubagents/nativeChild 回归、AgentActivityPresentationTests.subagentsExpandDeliveredOutputAndRefreshWithoutDismissing 和 Host 的 native_subagents_keep_child_permissions_owned_by_the_root_turn。受控协议与原生 UI 测试不能替代真实供应商工作流,完成该实测前保持 pending。Windows launch 已启用 observeSubagents,连接模型与 transcript 已呈现子代理层级、状态、输出和工具。状态机回归覆盖后代清理和权限归属;本次真实 Tauri 验收使用受控 ACP fixture,真实 Claude/Codex 子代理仍待完成。 macOS 窄宽面板:子代理入口在任务摘要右侧且与任务独立点击,无计划时仍可单独出现;数量为真实子会话总数,已完成/总数保留在可访问值与详情。子代理为空时不显示占位;保留深浅主题、展开输出、状态更新和弹层关闭验证。 终态授权清理:根 prompt 保持未结束,依次创建子代理、后代与同级代理并挂起授权;对子代理发送 completed/failed/cancelled/disconnected,确认只将其自身及后代请求回应 cancelled,根和同级请求仍可答复;终态后迟到请求不再入队。Swift 同步移除对应卡片、保留其他队列项,最后一项终止后注意状态解除、等待计时停止;虚拟时钟推进后 Host 静默提醒恢复,根轮次正常完成。 Windows 回归:累计创建并结束 70 个子 Agent 后,在本轮或下一轮新增子 Agent,其授权仍进入主会话;同时运行 70 个子 Agent 时全部保留授权所有者,终止后只保留最近 64 条终态展示记录。
2026-10-22:Windows 已消费原生子代理事件并呈现层级、任务、状态、输出与工具;父子授权归属和终态清理由共享 Host 负责。真实供应商子代理流程仍待验收。 Windows 回归:累计创建并结束 70 个子 Agent 后,在本轮或下一轮新增子 Agent,其授权仍进入主会话;同时运行 70 个子 Agent 时全部保留授权所有者,终止后只保留最近 64 条终态展示记录。
AI / Agent 对话Claude 与 Codex 官方订阅支持多个账号:每个账号是官方 CLI 的独立配置目录(CLAUDE_CONFIG_DIR / CODEX_HOME),登录在后台运行官方登录命令并由 CLI 打开浏览器,手动设为首选并重启连接;账号卡片显示邮箱、套餐和最近一次推送的 5 小时/7 天用量,会话收藏与重命名按账号分开,不读取、复制凭据,也不在额度耗尽时自动换号
agent-subscription-multi-account
已实现
待验证
证据路径
macos/Sources/Lithe/Models/Settings/AgentAccounts.swift
macos/Sources/Lithe/Models/AppModel/AppModel+AgentAccounts.swift
macos/Sources/Lithe/Views/Agent/AgentAccountsSection.swift
macos/Sources/Lithe/Platform/MacOS/Agent/MacAgentAccountSignIn.swift
macos/Sources/Lithe/Application/Features/AgentLaunchConfigurationResolver.swift
macos/Sources/LitheAgentConversationModule/Application/AgentHistoryFeatureModel.swift
macos/Tests/LitheTests/AgentAccountTests.swift
rust/lithe-agent-host/src/claude_subscription.rs
rust/lithe-agent-host/src/subscription.rs
.agents/notes/implemented/feature/2026-10-24-agent-subscription-multi-account.md
部分实现
待验证
证据路径
rust/lithe-agent-host/src/claude_subscription.rs
rust/lithe-agent-host/src/subscription.rs
rust/lithe-agent-host/src/lib.rs
AgentmacOS:启用 Claude 或 Codex 官方订阅后,在设置 > AI > Agent 管理对应 Agent 的「订阅账号」中点击「添加另一个账号」,不弹出终端,卡片显示「正在等待浏览器登录…」并可取消,浏览器由官方 CLI 打开并完成授权;分别用带该账号目录的 claude auth status / codex login status 与默认账号确认互不覆盖登录(macOS 钥匙串隔离需实机确认)。将新账号设为首选,当前项目该 Agent 的连接重启,卡片显示该账号邮箱与套餐,发送消息后显示 5 小时/7 天用量、重置时间、配速和「截至 …,本次未主动刷新」(Codex 的用量由已有额度查询刷新,使用同一账号目录);正在回复或等待授权时设为首选被拒绝;两个账号下的会话收藏和重命名互不影响;Codex 已归档历史按账号目录列出;移除账号不删除其目录;额度耗尽时不会自动换号;关闭设置页会取消进行中的登录。Windows:共享 Host 已支持 claudeConfigDir 与 codexHome 启动参数,设置界面和登录入口尚未提供,待接入并真机验收。
AI / Agent 对话Codex 订阅额度:输入框底部工具栏靠右对标 Claude Desktop 的单个圆环(灰轨,按已用最多的窗口填充),悬停显示灰底分窗口进度条;已用超过60%黄色、超过90%红色、默认绿色,未知/过期灰显,实际重置时间与账号隔离
agent-subscription-quota
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentSubscriptionQuotaView.swift
macos/Sources/LitheAgentConversationModule/Application/AgentSubscriptionQuota.swift
macos/Tests/LitheTests/AgentConversationFeatureModelTests.swift
rust/lithe-agent-host/src/subscription/tests.rs
macos/Sources/Lithe/Views/Agent/AgentComposerView.swift
macos/Tests/LitheTests/AgentSessionSelectorLayoutTests.swift
macos/Tests/LitheTests/AgentConversationPresentationTests.swift
已实现
待验证
证据路径
rust/lithe-agent-host/src/subscription.rs
shared/fixtures/agent/acp-events-v1.json
windows/tauri/src-tauri/src/agent.rs
windows/tauri/src/features/agent/components/agent-usage-panel.tsx
windows/tauri/src/features/agent/types/agent.types.ts
windows/tauri/src/features/agent/components/agent-panel.tsx
windows/tauri/src/features/agent/components/agent-composer.tsx
windows/tauri/src/i18n/locale.ts
AgentmacOS:真实订阅模式在输入框底部工具栏靠右只显示一个灰轨圆环,按五小时/七天中已用最多的窗口填充并着色,不再显示文字;仅悬停展示灰底面板,移开收起,无点击弹层,面板含五小时/七天已用百分比及灰轨进度条、实际重置时间与账号;面板中五小时优先,不伪造窗口时长,未上报时圆环只有灰轨。检查60%仍绿色、超过60%黄色、90%仍黄色、超过90%红色;未知及过期灰显。窄宽面板、深浅主题、单周窗口和缺失值截图检查,切换会话/账号或隐藏工具栏后清除旧悬停。原可见且活跃时每分钟刷新、隐藏停止轮询、单连接不并发、查询不创建会话或模型请求保持;失败保留旧值,账号不匹配清除,API Key模式不显示。 Windows:输入框上方只保留一个灰轨圆环,按已用最多的窗口填充,不再显示文字;60% 内绿色、超过 60% 黄色、超过 90% 红色。悬停卡片使用灰底面板,按 5 小时、7 天、其他窗口排序展示名称、已用百分比、灰轨进度条与实际重置时间;失败或过期时圆环与进度条灰显并显示原因,账号变更提示重新连接。未知窗口不伪造百分比。真实账号、断网与换账号清理仍待真机验收。
2026-10-16 Windows:订阅额度复用同一用量区块,按共享字段的窗口与重置时间判断是否过期,账号未知时显示占位;真实账号、断网灰显与换账号清理仍待验收。 2026-10-18 Windows:`AgentSubscriptionQuotaView` 改为 macOS 同款单圆环 + 悬停分窗口卡片;窗口按 5 小时/7 天/其他排序,缺失百分比只画灰轨,过期或失败整体灰显。
AI / Agent 对话Agent 思考强度英文呈现:Claude/Codex 子菜单、设置行当前值和模型底栏统一使用上游英文名称
agent-thinking-level-labels
已实现
已验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentSessionSelectors.swift
macos/Tests/LitheTests/AgentSessionSelectorPresentationTests.swift
已实现
待验证
证据路径
shared/contracts/application-boundary.md
windows/tauri/src/features/agent/services/agent-session-selectors.ts
windows/tauri/src/features/agent/services/agent-session-selectors.test.ts
windows/tauri/src/features/agent/components/agent-session-selectors.tsx
windows/tauri/src/features/agent/components/agent-composer.tsx
Agent2026-10-01 macOS:最新 preview 独立 PR 分支 83 项 Agent 回归通过;含 PR #1007 前置修复的组合构建 87 项回归及真实界面验收通过;中文真实界面确认 Codex 的 Low、Medium、High、Xhigh、Max、Ultra 和 Claude 的 Low、Medium、High、Max 均显示英文。两边分别切换 Low,确认子菜单、设置行当前值和模型底栏同步英文,并恢复 Claude Medium、Codex Xhigh;权限、速度和思考强度标题仍显示中文。不改原始选项 ID、顺序和确认行为,运行前后 bundle 全部 990 个文件 SHA-256 一致。 Windows 已按同一规则实现上述英文呈现,真机验收待执行。
2026-10-17 Windows:`model`、`mode`、`thought_level` 三类选项的 choice 名称统一使用上游原文(Low/Medium/High/XHigh/Max 等),`思考强度`/`速度` 等选项标题仍按界面语言显示;设置行当前值与模型底栏(`gpt-5.5 High`)共用同一 `choiceTitle`,纯函数测试覆盖中英文。 真机验收待执行。
AI / Agent 对话每轮工具调用与思考、过程说明放进同一个默认折叠的过程区;展开后相邻工具保留有序时间线、状态、输入输出和文件位置,最终回复单独展示;工具读取或截取的图片以缩略图显示在工具行和工具组标题旁(最多三张、其余 +N),悬停预览、点击放大,用户消息附带的图片同样可放大;Claude Code 后台任务通知:成功的并入随后一轮的折叠过程区,失败的与无后续过程的保持可见;恢复 Claude 会话时压缩前的完整记录也会显示(macOS)
agent-tool-activity-timeline
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentTranscriptView.swift
macos/Sources/Lithe/Views/Agent/AgentToolGroupView.swift
macos/Tests/LitheTests/AgentConversationPresentationTests.swift
macos/Sources/Lithe/Views/Agent/AgentProcessGroupView.swift
macos/Tests/LitheTests/AgentThoughtTranscriptTests.swift
macos/Sources/LitheAgentConversationModule/Application/AgentImage.swift
macos/Sources/Lithe/Views/Agent/AgentImageViews.swift
macos/Tests/LitheTests/AgentImageTests.swift
rust/lithe-agent-host/src/claude_earlier_history.rs
已实现
待验证
证据路径
windows/tauri/src/features
windows/tauri/src/features/agent/components/agent-transcript.tsx
windows/tauri/src/features/agent/services/agent-transcript-items.test.ts
windows/tauri/src/features/agent/services/agent-transcript-items.ts
windows/tauri/src/features/agent/components/agent-edit-review.tsx
windows/tauri/src/features/agent/services/agent-edit-review.test.ts
windows/tauri/crates/project/src/document_file.rs
scripts/windows/test/test-windows-agent-recycle.ps1
windows/tauri/src/features/agent/components/agent-transcript.process.test.tsx
AgentmacOS 与 Windows:构造思考→过程说明→读文件→思考→执行命令→最终回复,确认每轮只有一个过程入口且默认收起,流式也不自动展开;收起时过程文字与工具行不占高度,最终回复始终可读。展开按原顺序呈现,只有相邻工具合并,状态与证据可继续查看。纯空白思考、过程说明不产生空行,没有思考和工具的直接回答不产生入口;新用户消息、已记录的轮次结束分别切断分组,工具或思考结束而没有最终回复时不伪造回复。搜索过程文字及工具输入、输出、文件路径,匹配组临时展开且不能在搜索期间收起,清空后恢复手动选择;切换和关闭会话验证偏好隔离与释放。深浅主题、窄宽面板、历史恢复和实时流均验证;历史导出、文件审阅、权限卡片、轮次统计和回复复制继续可用。单元测试与组件回放不替代真实 Agent 和 Windows Tauri 运行验收,未执行部分保持 pending。 macOS 图片:让 Agent 读取多张图片,确认缩略图最多三张并显示 +N,悬停出现带标题和序号的预览,点击进入放大查看并可用方向键切换、Esc 关闭;用户粘贴图片后气泡显示缩略图且可放大;触发后台任务后不再出现原始 task-notification 标记。Windows 对应能力尚未实现。 macOS 后台任务与压缩历史:让 Agent 连续启动多个后台命令,确认成功的通知不再单独成行,而是在对应一轮的“思考过程”展开后以中文状态行出现;失败的通知仍在对话中可见。恢复一个经历过多次压缩的 Claude 会话,确认压缩分界线之前的用户消息、回复、思考和工具调用都能滚动查看,且每次压缩处有“对话已从摘要继续”标记。 点击缩略图后的大图支持双指缩放、拖动、百分比与 ⌘+/⌘−/⌘0;用户消息里的 file:// 链接与 [Image: source:] 占位符显示为缩略图;Claude Code 的斜杠命令、本地命令输出、Shell 转义、压缩续接摘要、技能展开和宿主上下文显示为状态行或折叠块,只给模型看的提醒不显示。 压缩前的用户消息若带粘贴截图,恢复会话后截图仍以缩略图显示在原消息气泡里(不是只剩 [Image #N] 文字),可点击放大。
2026-10-24:改为每轮一个默认折叠的过程区,包含思考、工具和中间说明;只改变呈现,不改写历史或 ACP 协议。ACP 无最终回复角色,按最后一条思考或工具的位置保留末尾正文;后续活动到达时才将先前正文移入过程。 2026-10-24:macOS 增加工具图片缩略图、悬停预览、放大查看器和后台任务通知状态行(#1462),Windows 待对齐。 2026-10-24(续):折叠的思考过程标题行也显示图片缩略图;放大查看器增加缩放;识别更多 Claude Code 特殊消息格式。 2026-10-24(再续):成功的后台任务通知并入后续过程区;Rust 宿主在 session/load 时只读取最后一个压缩点之前的会话记录,补全 Claude 适配器不回放的历史。 2026-10-25:压缩前历史由 Rust 宿主读取会话记录补全,之前丢弃用户消息里的内联截图,现在作为同一条用户消息的 image 块回放(仅 base64 来源);Windows 待对齐。
AI / Agent 对话Agent 品牌标志:Claude 橙色星芒、Codex 随主题变化的灰色结形图标,底栏切换入口、Agent 下拉菜单条目与模型入口保持清晰一致
agent-toolbar-brand-marks
已实现
已验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentPanelStyle.swift
macos/Sources/Lithe/Views/Agent/AgentComposerView.swift
macos/Sources/Lithe/Views/Agent/AgentSessionSelectors.swift
macos/Tests/LitheTests/AgentBrandIconResourceTests.swift
已实现
待验证
证据路径
shared/contracts/application-boundary.md
windows/tauri/src/features/agent/components/brand/agent-brand-icon.tsx
windows/tauri/src/features/agent/components/agent-composer.tsx
windows/tauri/src/features/agent/components/agent-session-selectors.tsx
AgentmacOS:原生真实输入框的 Menu 像素测试通过四种品牌/深浅主题组合,共用模板图像保持不变;87 项相关 Agent 测试通过。打包预览应用的深色界面实际展开 Agent 与模型菜单,确认底栏图标居中、点击区域一致、模型小标志同步;Agent 菜单中 Claude 与 Codex 都带对应品牌图标,Claude 选中与切到 Codex 后的勾选均与品牌图标并列正确显示,模型与权限跟随所选 Agent。菜单验证前后 bundle 的 990 个文件清单及 SHA-256 一致,旧版应用与辅助进程已退出,仅保留用户新版主应用及项目正常运行的进程。 Windows 已用同一品牌组件实现底栏、Agent 菜单与模型入口,真机深浅主题验收待执行。
2026-10-17 Windows:`AgentBrandIcon` 新增 `variant="brand"`,与 macOS `AgentPanelStyle.brandTint` 对齐——Claude 使用品牌橙 `#d97757`,Codex 结形跟随主题文字色;底栏 Agent 切换入口、Agent 下拉条目(图标+名称+勾选并列)与模型入口都使用同一组件。 真机深浅主题验收待执行。
AI / Agent 对话发送后实时计时;每轮回复下方固定显示复制回复、用量胶囊(耗时 · token)与完成时间(当天 HH:mm,否则 年-月-日 时:分),首字延迟、输出速度、输入/输出、缓存、推理、工具与模型调用仅在悬停卡片中显示;会话合计(轮次、工具、Token、TTFT 等)跨连接保存,重新加载历史会话后继续累加
agent-turn-statistics
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Agent/AgentTurnStatisticsView.swift
macos/Sources/Lithe/Views/Agent/AgentTranscriptView.swift
macos/Sources/LitheAgentConversationModule/Application/AgentTurnStatistics.swift
macos/Sources/LitheAgentConversationModule/Application/AgentConnectionModel.swift
macos/Sources/LitheAgentConversationModule/Application/AgentSessionStatisticsStore.swift
macos/Sources/LitheAgentConversationModule/Application/AgentSessionStatistics.swift
macos/Sources/Lithe/Platform/MacOS/Agent/MacAgentHistoryAdapters.swift
macos/Tests/LitheTests/AgentConversationFeatureModelTests.swift
macos/Tests/LitheTests/AgentConversationPresentationTests.swift
已实现
待验证
证据路径
rust/lithe-agent-host/src/prompt.rs
rust/lithe-agent-host/src/tests.rs
shared/fixtures/agent/acp-events-v1.json
windows/tauri/src/features/agent/components/agent-transcript.tsx
windows/tauri/src/features/agent/services/agent-transcript-items.ts
windows/tauri/src/features/agent/stores/agent-connection.model.ts
windows/tauri/src/features/agent/stores/agent-turn-statistics.model.test.ts
windows/tauri/src/features/agent/types/agent-turn-statistics.ts
windows/tauri/src/features/agent/types/agent-session-statistics.ts
windows/tauri/src/platform/agent-statistics-storage.ts
AgentmacOS:在真实 Agent 会话中确认发送后计时包含建会话、加载历史、工具和权限等待;正常完成、取消确认、请求失败和断连后停止计时,下一轮仍可看到上一轮统计。并发会话切换验证耗时与用量隔离;每轮下方只显示复制、用量胶囊与完成时间,复制按钮复制该轮最终回复;悬停胶囊显示耗时、输入/输出、缓存、推理、工具次数、模型调用、平均首字延迟和输出速度,缺失 usage 时胶囊只显示耗时;跨天的轮次显示完整日期。历史回放不编造逐轮耗时;完成几轮后断开或重启,重新加载该会话应显示之前累计的轮次、工具、Token 与 TTFT,新一轮在其基础上增加,重复加载不叠加;上下文占用与订阅额度不作为输入/输出 token。检查深浅主题和窄宽面板。Windows 共享 Host 已透传可选 usage;每轮回复下方已显示复制回复、用量胶囊(耗时 · token)与完成时间(当天 HH:mm,否则 yyyy-MM-dd HH:mm),悬停胶囊显示耗时、输入/输出、推理、缓存读写与总量,缺失 usage 时只显示耗时,失败/取消/断连仍保留耗时。首字延迟、输出速度、工具与模型调用统计及跨连接会话累计已接入 Windows;详见模型调用统计行。 Windows:在真实 Tauri 窗口执行 Windows 记录完成轮次、去重工具调用、工具与权限重叠区间的并集耗时,并保存每会话累计统计。历史重放不重复计费,最新 ACP 用量不跨轮累加;断连冻结时间。统计缓存按工作区/Agent/会话隔离,最多 200 条,不保存正文或凭据。 单元测试不替代运行时验收,未执行的真实服务及平台动作保持 pending。
2026-10-22:Windows 记录完成轮次、去重工具调用、工具与权限重叠区间的并集耗时,并保存每会话累计统计。历史重放不重复计费,最新 ACP 用量不跨轮累加;断连冻结时间。统计缓存按工作区/Agent/会话隔离,最多 200 条,不保存正文或凭据。
AI / AI 对话对话历史、置顶与归档
ai-chat-history
未实现
不适用
证据路径
macos/Sources/Lithe/Platform/MacOS/AI
已实现
待验证
证据路径
windows/tauri/src/features/ai/services/ai-chat-history-service.ts
windows/tauri/src/features/layout/components/sidebar/sidebar-history.tsx
AIWindows 验证历史加载、重命名、置顶、归档、删除和重启后持久化。
AI / AI 对话多 Provider 与工作区范围
ai-chat-providers
未实现
不适用
证据路径
macos/Sources/Lithe/Platform/MacOS/AI
已实现
待验证
证据路径
windows/tauri/src/features/ai/services/providers
windows/tauri/src/features/ai/lib/ai-workspace-scope.ts
AIWindows 验证 Provider 切换、凭据边界、工作区范围和模型错误提示。
AI / AI 对话对话会话与流式响应
ai-chat-session
未实现
不适用
证据路径
macos/Sources/Lithe/Platform/MacOS/AI
已实现
待验证
证据路径
windows/tauri/src/features/ai/components/chat/ai-chat.tsx
windows/tauri/src/features/ai/services/ai-chat-service.ts
AIWindows 验证新建会话、流式输出、取消和失败恢复;macOS 需要先定义产品范围。
AI / AI 提交信息Provider 配置与提交信息生成
ai-commit-generation
已实现
待验证
证据路径
macos/Sources/Lithe/Application/Features/CommitWorkflowCoordinator.swift
macos/Sources/Lithe/Platform/MacOS/AI
已实现
待验证
证据路径
windows/tauri/src/features/git/services/ai-commit-service.ts
shared/contracts/ai-commit.md
Git / AI用相同 diff、规则和 Provider 配置比较请求计划、取消、错误和生成文本。
设置 / 应用配置应用、项目与运行设置及设置窗口操作
application-settings
已实现
待验证
证据路径
macos/Sources/Lithe/LitheApp.swift
macos/Sources/Lithe/Views/App/RootView.swift
macos/Sources/Lithe/Views/App/SettingsView.swift
macos/Sources/Lithe/Views/App/PluginManagementView.swift
macos/Sources/Lithe/Models/Workspace/ProjectSessionManager.swift
macos/Sources/Lithe/Models/AppModel/AppModel+PluginManagement.swift
macos/Sources/Lithe/Views/Components/LitheSplitPaneView.swift
macos/Sources/Lithe/Views/Workbench/SplitHandleView.swift
macos/Sources/Lithe/Views/App/ProjectRuntimeSettingsView.swift
macos/Sources/Lithe/Views/Components/LitheSettingsControls.swift
macos/Sources/Lithe/Views/Components/LitheInfoTip.swift
macos/Sources/Lithe/Views/App/GitExecutionSettingsView.swift
macos/Sources/LitheGitModule/Models/GitConfigurationFallback.swift
macos/Tests/LitheGitModuleTests/GitSettingsPresentationTests.swift
rust/lithe-core/src/git/configuration.rs
macos/Sources/LitheGitModule/Application/GitExecutionSettingsFeatureModel.swift
macos/Sources/Lithe/Views/App/EffectiveRuntimeLabel.swift
macos/Sources/Lithe/Views/App/McpSettingsView.swift
macos/Sources/Lithe/Application/Features/AgentSetupDiagnostics.swift
macos/Sources/LitheGitModule/Application/GitRepositorySetupFeatureModel.swift
macos/Sources/Lithe/Views/Agent/AgentPanelSettingsView.swift
macos/Tests/LitheTests/SettingsAppearanceContainerTests.swift
macos/Tests/LitheTests/SettingsSelectPopupGeometryTests.swift
macos/Sources/Lithe/Theme/LitheTheme.swift
macos/Tests/LitheTests/PluginManagementPresentationTests.swift
.agents/notes/implemented/feature/2026-10-15-macos-settings-hierarchy.md
.agents/notes/implemented/feature/2026-10-17-settings-info-tips.md
macos/Sources/Lithe/Models/AppModel/AppModelSupportTypes.swift
macos/Tests/LitheTests/SettingsSidebarLayoutTests.swift
macos/Sources/Lithe/Views/Components/LitheDropdown.swift
macos/Tests/LitheTests/ContextMenuCoverageTests.swift
macos/Tests/LitheTests/SearchEverywhereBehaviorTests.swift
macos/Tests/LitheTests/LitheCoreLogicTests.swift
macos/Tests/LitheTests/SettingsWindowRestorationTests.swift
.agents/notes/implemented/bug-fix/2026-10-30-macos-settings-window-restoration.md
已实现
待验证
证据路径
windows/tauri/src/features/settings
windows/tauri/src/features/settings/components/settings-panels.tsx
windows/tauri/src/features/settings/config/default-settings.ts
windows/tauri/src/features/settings/lib/settings-normalization.test.ts
windows/tauri/src/ui/number-input.tsx
windows/tauri/src/ui/number-input.test.tsx
windows/tauri/src/features/settings/components/editor-settings-routing.test.tsx
windows/tauri/src-tauri/src/fonts.rs
windows/tauri/src/features/settings/components/editor-font-settings.test.tsx
windows/tauri/src/features/settings/lib/editor-font-size.test.ts
windows/tauri/src/utils/search-match.test.ts
windows/tauri/src/ui/settings-select.tsx
windows/tauri/src/ui/settings-path-input.tsx
windows/tauri/src/ui/settings-select.test.tsx
.agents/notes/implemented/simplification/2026-10-08-windows-settings-controls.md
windows/tauri/src/features/settings/lib/settings-navigation.ts
windows/tauri/src/features/settings/components/settings-dialog.tsx
windows/tauri/src/ui/dialog.tsx
windows/tauri/src/utils/motion.ts
windows/tauri/src/features/settings/components/settings-section.tsx
windows/tauri/src/features/settings/components/settings-hierarchy.test.tsx
windows/tauri/src/extensions/ui/components/extensions-sidebar.tsx
.agents/notes/implemented/feature/2026-10-08-windows-settings-hierarchy.md
windows/tauri/src/extensions/ui/components/extensions-browser-layout.tsx
windows/tauri/src/i18n/locale.ts
shared/i18n/messages.json
windows/tauri/src/features/settings/lib/settings-effects.ts
windows/tauri/src/features/settings/lib/theme-resolution.ts
windows/tauri/src/features/settings/lib/settings-theme-sync.test.ts
windows/tauri/src-tauri/src/host.rs
windows/tauri/src/extensions/ui/components/extensions-sidebar-focus.test.tsx
windows/tauri/src/features/settings/components/update-status.test.tsx
.github/workflows/ci-windows.yml
windows/tauri/src/ui/settings-path-input.test.tsx
Settings运行 ./scripts/macos/test/test-macos.sh --filter GitSettingsPresentationTests,并以 cargo test --manifest-path rust/Cargo.toml -p lithe-core git::configuration:: 验证合法布尔写法、无值与空值、远程覆盖、无效值保留和编辑原值不变。 macOS 共享下拉选择器闭合框遵循 Islands:深色底 #26282C、浅色白底,1pt 普通边框、2pt 展开或键盘聚焦描边,28pt 高及 4pt 圆角;验证设置页与 Commit 的深浅外观、键盘聚焦及选择功能。Windows 无已保存缩略图配置时确认代码编辑器右侧不显示缩略图,设置 → Editor → Display 的显示缩略图开关为关闭;切换开关确认所有打开的编辑器即时更新,关闭设置重开及应用重启后选择保持,已有 showMinimap=true/false 的设置均保留,恢复默认后关闭;中英文显示对应文案。修改应用级和项目级设置,验证持久化、迁移、重启恢复和无效值提示;macOS 保持设置窗口打开切换亮色、暗色和跟随系统模式,并改变系统外观,确认标题栏、设置树、插件列表与详情背景和主界面侧边栏使用同一主题色,窗口按钮可用且可拖动;缩小设置窗口确认最小尺寸 900×700,底部操作按钮为 72×28 且边框与输入框一样以 1pt 内描边绘制;拖动设置树与插件列表右侧分隔线,确认设置分类栏不能小于原始宽度、插件列表分隔线可向左缩至 200 pt 或向右加宽,在 900 pt 最小宽度下仍有至少 150 pt 可分配的拖动余量,窗口缩小时设置内容区保留至少 500 pt、插件详情区至少 160 pt,拖动结束后宽度可恢复,悬停及拖动分隔线仅显示左右调整光标而不改变线条颜色;点击设置搜索框后切换分类及点击内容空白区域,确认焦点边框消失;悬停插件条目及设置窗口各子页面的按钮和选择控件时光标保持箭头;从主窗口打开设置后切换到其他应用,确认设置窗口随主窗口置后且不置顶遮挡;在插件页点击 Enable 后点击设置窗口 OK,确认成功时应用并关闭、失败时保留待确认状态且可重试;应用期间确认窗口关闭按钮和常规关闭命令不能关闭窗口,应用结束后恢复关闭能力;A 项目开始应用插件后从 B 项目重新打开共享设置窗口,确认 A 完成后 B 窗口仍打开且未应用草稿保留;待确认时点击 Cancel 或窗口关闭按钮,确认重开后草稿已清除;亮色模式确认分段选择的选中文字清晰可读;检查搜索框、普通及密码输入框、多行编辑框(含获得与失去焦点的边框)、数值步进器、下拉框和分段选择在各设置子页面中的背景、边框、焦点态及操作行为一致,关闭后重开再检查;macOS 切换通用、编辑器、快捷键、项目、运行配置和语言服务等设置页,检查右侧路径标题、分组线、行对齐、说明文字、下拉框、复选框、分段控件与底部操作区;打开短列表和超过十项的下拉框,检查当前项蓝色高亮、无勾号、圆角、紧凑行距、鼠标悬停不跳动、键盘选择与按需滚动;再次点击原下拉按钮应收起弹层,点击另一处下拉框应切换弹层,点击空白处应关闭弹层;缩小可用屏幕高度时检查弹层不遮挡控件;使用辅助功能检查勾选框和分段控件的当前状态。 Windows 编辑器字号输入数字居中,输入区到独立步进按钮间隔 8px,标准按钮命中范围 32×32px;手动输入、增减、上下限、只读和禁用正确。检查行高、缩进等共用数值控件的布局,并在深浅色设置页验收。 从实际 Windows 设置窗口进入 Editor → Display,确认 Font size 使用共享数值控件,增减与直接输入写入 editor.fontSize,6–72 上下限生效;检查此真实页面的居中、按钮大小及深浅色,避免只验证旧设置页或孤立组件。 步进按钮横排在输入框右侧,左侧增大、右侧减小,各保留 32×32px 点击区域和 4px 间距,输入框与按钮组垂直居中;键盘 Tab 顺序与左右顺序一致。 Windows验证中文与英文目录检索、非等宽字体、目录加载中及失败时的已存选择、共享字号步进控件边界、连字预览以及所有打开编辑器的即时更新。 Windows逐一打开所有设置分类及运行配置编辑器,检查深浅主题的下拉按钮、菜单圆角、边框、选中项与禁用态一致;验证字体和模型搜索、选项键盘选择、Esc仅关闭菜单、点击外部关闭、长列表滚动、标签可访问名称、切换到空字符串自动配置和关闭重开后的持久化;AI提交数值草稿仅在真实失焦或Enter失焦后保存,Maven路径保留显式应用。 项目路径候选菜单检查深浅色、候选选择、任意路径输入后直接点击保存和清空恢复自动配置,确认输入草稿不会被候选列表替换。 Windows逐一访问外观与行为、版本控制、构建/执行/部署、语言与框架、工具、AI六个分组及插件一级页面;中文字段与英文关键词搜索应定位正确页面并展开父组,无结果显示空态,Esc清空查询,外部重复请求同一页清空查询并重新定位。确认第一组标题、水平线、左对齐行、说明和底部左侧恢复默认、右侧只有关闭;中英文分别显示关闭和 Close,点击关闭后即时保存的字号等仍保留,未显式保存的项目草稿丢弃。拖动侧栏时不得连续写入布局,松开后保存,关闭重开或刷新后恢复;720px、768px、769px及800px宽窗口内容区至少500px且底部按钮可用;视口不超过768px时分类栏最小180px,超过断点恢复234px,已保存的宽布局缩至720px仍不溢出。插件管理保留既有安装和启用行为,在真实WebView2及工作区验证。 插件设置在800px宽窗口仍显示详情;拖动插件列表分隔栏检查200px/160px最小宽度、松开前不写入、松开后保存,以及切换页面和重开恢复布局。 Windows逐页切换中英文,核对通用/General、字体/Font、编辑器标签栏/Editor tabs、多行展开/Wrap into rows、Tab宽度/Tab width、Git搁置与Git Stash、AI服务商与API密钥或Token;搜索设置和搜索操作或快捷键的提示及空态与macOS一致,相关命令入口使用通用和Keymap。核对替换前后的本地化键集合和变量占位符一致;关闭行为与原有保存时机保持正确。 Windows当前系统为深色时,先手动选择浅色再切回跟随系统,确认窗口、设置页与编辑器立即恢复深色,配色主题显示实际主题;反向和系统明暗变化也应同步。关闭重开以及重启保持跟随系统;手动模式保持指定外观,重复切换不增加监听。主题元数据为浅色但名称不含light时,模式仍正确显示浅色。 Windows分别在中文和英文界面检索字体连字、显示引用数量和Git作者、LSP自动补全及语义高亮,确认进入正确页面;Sticky Scroll、UI Font Size等当前未提供字段应无结果。在全局搜索持续输入插件关键词时确认焦点不离开搜索框,打开独立扩展管理入口确认插件搜索自动聚焦;Git Fetch配置的prune=true和false均应显示文本值。 Windows在项目设置输入未列出的JDK或Maven路径,候选关闭时按Esc确认路径保留,继续编辑和手动清空仍可用;编辑项目路径或运行参数但不保存,搜索无匹配词后清空查询,确认当前页面草稿仍保留且空态期间控件不可见。 Windows非空路径候选自动化回归:运行settings-path-input.test.tsx,确认方向键只高亮不改草稿、Enter输出所选完整路径、未列出路径可直接输入、打开和关闭弹层时Esc均不清空草稿、关闭后可继续筛选和恢复空字符串自动配置。自动化结果不替代真实WebView2主题切换与连续拖动验收,实机验证仍待完成。 Windows项目及Maven输入未保存路径后搜索Git,再清空查询并切回原页,确认草稿保留且未自动保存;手动切换分类和重复外部导航亦保留。关闭设置后重开,草稿清除且仅挂载当前页,所有已访问页面的订阅在关闭时释放。 Windows打开设置确认一级入口依次为外观与行为、插件、版本控制、构建/执行/部署、语言与框架、工具、AI;快捷键和编辑器在外观与行为下,MCP配置、AI与提交、AI聊天与编辑在AI下;从命令面板或其他入口跳转到这些页面、搜索命中时所属分组自动展开且面包屑与侧栏一致,中英文均显示AI;自动化仅为浏览器组件测试,真实WebView2验收待完成。 macOS打开设置确认一级入口依次为外观与行为、插件、版本控制、构建/执行/部署、语言与框架、工具、AI;快捷键和编辑器在外观与行为下,AI分组内依次为AI服务商、Agent管理、指令、技能、MCP配置、AI与提交;搜索过滤后保留这一显示顺序;从任意入口跳转到这些页面时所属分组自动展开且面包屑与侧栏一致,搜索命中时展开对应分组。 macOS依次打开通用、Git、Agents 设置页,确认配色主题、外观、背景、语言、项目打开方式、隐藏路径、Git 执行与凭据、Fetch 默认值与配置项、Agent 开关与统计、Agent 说明和供应商说明默认只显示标签和 ⓘ,不再常驻小字;悬停 ⓘ 约半秒显示完整说明,移开或点击外部关闭,点击图标可固定,键盘聚焦后 Space/Return 可打开;错误、警告和 “No remembered choices” 等状态文案仍直接可见。macOS 在 Git 执行页确认 Git 可执行文件为空时仍回显实际路径和版本,输入一个不存在的绝对路径后显示未找到可运行 Git 的警告,点击使用 PATH 中的 Git 后恢复回显;在 Git 行为配置中把“Lithe: 获取标签”设为继承,确认生效值显示具体标签行为(默认获取可达提交的标签),修改某远程的 `remote.<name>.tagOpt` 或 `fetch.pruneTags` 后重新加载,确认回显变为不获取、全部获取或同步删除;给远程设置 `skipFetchAll=true` 后确认所有远程模式排除该远程,显式选择该远程时仍显示其标签行为。macOS 在 Git 行为与配置中确认每个选项的标题、当前生效值、下拉框、重置和应用按钮在同一行,短选项的下拉框不再保留大片空白;缩窄设置窗口后当前生效值换到第二行且按钮不被裁切。打开编辑器页切换字体,确认预览使用所选字体和字号,旧字体与新字体短暂并列后淡出;打开插件详情的设置区,确认说明收进 ⓘ 且数值、下拉和复选框仍可编辑。 打开 Git 身份页确认未覆盖时输入框回显当前生效值且保存禁用,编辑后保存、清除覆盖后回到继承值。打开项目 JDK 与 Maven 页确认生效运行时为卡片且路径可复制、长路径可悬停查看全文,settings.xml 和 Local Repository 未覆盖时占位显示有效路径或 Not found。打开 Agents 详情展开预检项,确认版本/路径/安装来源为独立行且长路径中段省略。打开 MCP 配置确认状态卡与配置代码块在启用后出现,关闭后按钮回到 Enable。 Windows 在 125% 与 150% 显示缩放下打开设置对话框,依次切换设置分类(覆盖内容不滚动与需要滚动的页面),确认标题栏、分类栏、正文与底部按钮整体清晰、不出现整层发虚,并在开发者工具中确认弹窗静止态的计算 filter 为 none(入场期间仍应看到模糊淡入)。自动化与静态检查不替代该实机验收。 运行 ContextMenuCoverageTests.newlyInsertedOpenDropdownPresentsAfterAnchorAttaches,覆盖深浅主题下首次更新尚未进入窗口、随后挂载自动显示及移除关闭;设置页实机悬停与点击固定行为另行验收。 macOS 共享 litheSettingsTextEditor 支持传入单一 FocusState 绑定,所有设置多行框使用统一 1pt 普通、2pt 聚焦且外扩 1pt 的控件描边,外框不改变布局尺寸;检查常规隐藏路径、终端环境变量、MCP 和运行配置多行框的聚焦/失焦,未要求自动聚焦的现有页面保留原行为。 设置窗口重新绑定到同一或另一 session 后,OK、Cancel 与标题栏关闭仍能关闭当前窗口;旧 binding 不得关闭新窗口(LitheCoreLogicTests)。 macOS 隐藏路径只有一个模式输入框,下方一行回显内置规则(`**/node_modules/` 等前三项加“+N”胶囊,悬停显示全部),应用按钮在右下;悬停 ⓘ 确认说明写明通配符是正则的简化写法、不区分大小写,并给出 `**/dist/`、`.lithe/*`、`*.log`、`docs/*.md` 四个示例。在框里输入 `.lithe/*` 后点击应用,确认项目树不再显示 `.lithe` 文件夹(只写 `.lithe` 不隐藏文件夹,写 `.lithe/`、`.lithe/*` 或 `.lithe/**` 才隐藏),`.lithe-notes.md` 仍可见;输入 `**/tmp/` 后根目录与任意层级的 `tmp` 文件夹都消失。从旧版本升级时,旧“目录”中的自定义名称迁移成 `**/名称/`、旧“文件模式”条目原样保留,内置项不会复制进输入框。运行 cargo test -p lithe-core folder_patterns_hide_folders_without_reading_them 与 ./scripts/macos/test/test-macos.sh --filter 'folderPatternsHideWholeFoldersFromTheProjectRoot|hiddenPathsMigrateTheTwoLegacyListsIntoOnePatternList|builtInHiddenPatternsShowTheEffectiveRulesInPatternSyntax',并用 directoryExclusionsFollowTheSharedPruningContract 复核共享 fixture。 隐藏 `.lithe` 后在其中修改一个 JSON 配置(如运行配置),确认项目服务仍然重载;自动化为 hiddenProjectConfigurationFolderStaysWatchedButOtherHiddenPathsAreDropped。 macOS 设置 › AI:资源库为可折叠子分组,内含指令、技能、Hooks、MCP 配置;面包屑为“AI › 资源库 › 页面”,搜索命中或从其他入口跳转到其中的页面时自动展开 AI 与资源库。 macOS 设置页内容区随窗口宽度伸缩(不再有 900/860/760 的宽度上限),调大设置窗口后各页卡片铺满内容区,右侧不留空白。 macOS 设置窗口恢复:打开设置后退出并保留窗口,重开应用,连续三轮检查恢复日志中的 settings 标识、完整设置内容和可用的搜索框;覆盖欢迎页与项目窗口、深浅主题、取消/确认/标题栏关闭以及再次打开。SettingsWindowRestorationTests 覆盖首次恢复、幂等绑定、失效会话替换、旧绑定回调和真实原生宿主挂载。
Git 标签继承回显使用 Core 通过 Git 布尔解析器归一化的 pruneTags 值,识别 yes/on/1 及 false 等等价写法;远程设置覆盖全局默认,原始编辑值保持不变。 Windows 当前设置面板的 Editor → Display 提供显示缩略图开关,复用 showMinimap 和 Monaco 实时选项更新。无已保存 showMinimap 配置时默认关闭;已有用户保存的 true 或 false 保留,恢复默认设置也会关闭。macOS 默认值不变。 Windows字体目录使用DirectWrite提供系统及用户字体的规范名、本地化标签与等宽信息;编辑器可选择非等宽字体,目录失败不替换已保存选择,字号6–72与连字设置即时持久化。 Windows设置页通过SettingsSelect统一固定与可搜索下拉框的触发密度和菜单样式,包含运行配置、Git与AI提交;文本、多行文本与复选框复用现有共享控件,空字符串自动配置保持选中态。 macOS设置页把纯解释性说明收进标签后的 ⓘ 提示:默认只显示设置标签和图标,指针停留半秒后显示说明,点击图标可固定,键盘聚焦后用 Space/Return 打开;错误、警告、保存结果、空态和动态状态仍常驻显示。分组级说明复用 LitheSettingsSection 的 accessory,行级说明复用 LitheSettingsLabel 与 LitheInfoTip。 macOS设置行采用标签在左、控件在右的两列布局,分组标题到内容间距 8 pt、分组上方 10 pt、页面级间距 10 pt;编辑器字体页以当前字体的示例代码实时预览,切换字体后旧字体保留约 2.5 秒与新字体上下对比再淡出,减少动态效果开启时取消动画;插件声明的设置摘要同样收进 ⓘ。 macOS Git 行为配置行优先把设置名、当前生效值、下拉框和重置/应用按钮放在同一行,下拉框按该设置最长选项文案在 150–240 pt 内取宽;窗口过窄时当前生效值移到第二行,按钮保持完整。 macOS 项目 JDK 与 Maven 的生效运行时使用卡片展示模式、来源、名称和可选择复制的路径,警告/错误沿用同一卡片形状;Git 身份输入框回显当前生效值,保存按钮仅在草稿变化后启用;Maven 的 settings.xml 与 Local Repository 未覆盖时以实际有效路径作为占位文本,没有时显示 Not found;Agent 预检把版本、路径和安装来源拆成结构化小表,PASS/WARN/FAIL 使用带图标胶囊;MCP 页改为状态卡、项目权限和 Agent 配置分区。 LitheInfoTip 的悬停计时器不再触发页面重新求值,弹层锚点只在说明打开时安装。 项目JDK与Maven路径候选菜单复用SettingsPathInput,保留任意路径直接输入的草稿。 Windows设置对齐macOS分类树、双语检索、面包屑和标题分组线;侧栏默认234px,视口不超过768px时最小180px,否则最小234px;正文最小500px,拖动结束持久化布局。插件页复用既有插件管理且即时操作;普通设置即时保存;底部左侧恢复默认、右侧单个关闭,关闭不回滚已保存修改,项目及运行配置继续显式保存。Windows的AI服务商配置继续由既有AI与AI提交页面负责。 插件设置使用独立可调整的列表/详情分栏,列表最小200px、详情最小160px,窄设置窗口保留详情;原扩展管理入口保留网格布局。 Windows共用设置的中英文文案按macOS设置源码与中文本地化统一,覆盖通用、字体、Code Vision、标签布局、Tab宽度、Git、AI术语、搜索空态与相关命令入口;项目附加和Windows凭据说明保留平台实际语义,底部仍为单个关闭。 Windows跟随系统通过Tauri set_theme(None)解除原生窗口的手动主题覆盖,保留Windows主题事件向WebView2传递系统颜色偏好;复用既有媒体查询同步应用与编辑器,手动模式清理监听。通用页显示实际生效的主题,并按主题元数据判断明暗。 Windows设置检索仅收录当前实际页面字段,始终支持中英文标签;排除旧索引中的不可见控件。插件设置挂载保留全局搜索焦点,独立插件入口继续自动聚焦。Windows设置组件采用settings-panels中性命名;分层、主题、下拉、更新和插件焦点回归已接入Windows CI独立测试进程。 Windows路径输入在候选关闭时按Esc保留已编辑路径,手动清空仍可切回自动配置;搜索无结果时隐藏当前页面并保留未保存草稿,清空搜索恢复显示。 Windows路径候选回归使用非空候选和真实Combobox,覆盖方向键/Enter选择、未列出路径、弹层打开和关闭时Esc保留草稿、再次编辑与清空;候选行使用稳定路径key。 macOS设置侧栏收束为外观与行为(通用、更新、编辑器、快捷键)、插件、版本控制、构建/执行/部署、语言与框架、工具(终端、诊断)、AI(AI服务商、Agent管理、指令、技能、MCP配置、AI与提交,依此排序)七个一级入口,分组关系由SettingsGroup单一来源提供;Windows设置侧栏已同步为同样的七个一级入口:外观与行为(通用、更新、编辑器、快捷键)、插件、版本控制(Git)、构建/执行/部署(项目环境、运行配置、Maven)、语言与框架(LSP)、工具(终端、日志)、AI(MCP配置、AI与提交、AI聊天与编辑);分组由settingsGroups单一来源提供,Windows没有独立AI服务商页和Agents页,不新增空页面,页面内容、存储键和保存时机不变。Windows 设置对话框保留入场模糊淡入,但通过 motion 的 transitionEnd 在入场结束后把插值终值覆盖成 filter: none(overlayEntranceSelfClearing,由 clearEntranceFilter 选择),避免弹窗因为常驻 filter 一直留在滤镜合成层;该层会关闭子像素抗锯齿并按显示缩放比栅格化,让整个弹窗(标题栏、分类栏、正文和底部按钮)一起发虚。该行为只对设置对话框启用,其它弹窗保持原样。 macOS Git 执行页在覆盖为空时回显实际解析到的 Git 路径与版本,并用 `git.executable` 在不打开仓库的情况下完成解析;覆盖路径不可运行时显示警告。Git 行为配置中“Lithe: 获取标签”为继承时,会按 `remote.<name>.tagOpt`、`fetch.pruneTags` 与 Lithe 的 prune 选择解析成具体标签传输行为(全部、不获取、同步删除、获取可达提交的标签,或多个远程不一致),不再只显示“遵循 Git 标签规则”。 macOS说明弹层的延迟创建锚点进入窗口后会重试显示,修复悬停或点击仅变蓝而无说明的问题;离开窗口仍取消待显示任务并关闭弹层。 macOS 隐藏路径合并为一个模式列表(原“目录”与“文件模式”两个框),应用按钮在右下,内置规则以只读胶囊回显、始终生效不可移除;语法是不区分大小写的通配符(正则的简化写法),说明与示例收进 ⓘ。文件夹必须用显式模式隐藏:`name/`、`name/*`、`name/**` 都表示从项目根起的文件夹规则,文件夹连同内容一起隐藏并在列目录时剪枝、不读取其内容;开头的 `**/` 代表零层或多层目录,因此 `**/name/` 同时覆盖根目录与任意层级的副本;纯名称和带通配符的文件 glob 仍只匹配文件(规则由 shared/fixtures/search/exclusions.json 固定)。旧版保存的两个列表在升级时合并:自定义目录名变为 `**/名称/`,文件模式原样保留。macOS 把工作区根下的 `.lithe` 作为唯一特例:被规则隐藏后不在项目树、搜索和列目录中显示,但文件监听仍送达其事件,编辑其中的 JSON 仍会重载项目服务(内置噪声如 `.lithe/run/local.json` 仍丢弃)。Windows 隐藏路径沿用既有 gitignore 语义,不在此次范围。 macOS 系统恢复设置窗口时,在窗口宿主出现后为缺失或已失效的设置会话建立绑定;已有有效绑定不随焦点切换而改变。关闭和释放均校验本次绑定令牌,旧回调不能清除同一会话重新打开的设置窗口。
扩展 / 插件与主题已启用的构建 Provider 可显式发布只读项目、目标和内容目录及选定普通构建选项;消费者声明精确可选来源,由宿主/Core 提供有界快照;配置、模型、插件或工作区变化撤销旧输入,并拒绝旧回复,协议 6 独立准入
build-provider-readonly-model-inputs
已实现
待验证
证据路径
rust/lithe-core/src/build/model_inputs.rs
rust/lithe-core/src/tests/build_systems.rs
shared/contracts/plugins/v1/fixtures/build-model-producer.plugin.json
shared/contracts/plugins/v1/fixtures/build-model-consumer.plugin.json
macos/Sources/LitheExecutionModule/Services/BuildSystemService.swift
macos/Sources/Lithe/Core/Rust/RustBuildSystemOperations.swift
macos/Tests/LitheExecutionModuleTests/BuildSystemServiceTests.swift
macos/Tests/LitheTests/RustBuildSystemOperationsTests.swift
未实现
不适用
证据路径
rust/lithe-core/src/build/model_inputs.rs
shared/contracts/plugins/v1/plugin-manifest.schema.json
Extensions本地运行 Core model_inputs 测试、BuildSystemServiceTests 和 RustBuildSystemOperationsTests:核对精确来源、只读字段投影、选项指纹、不可用/过期状态、路径/大小边界、协议 5 拒绝、协议 6 接收,以及生产者重载/选项 ABA/停用/构建文件修改/工作区替换后忽略取消的旧结果不能发布。在 lithe-plugin-docs 使用当前工作区快照执行 Node/Java 两个真实后端的模型共享端到端场景,核对插件包字节不变。手动验收仍需安装一对正式插件,在原生窗口加载生产者与消费者,再修改选项、禁用生产者并确认旧模型不能启动任务;当前 Java/Maven 插件尚未迁移,Windows 宿主缺失,均不视为通过实机验收。 并行生产者回归:同时暂停 A/B 模型回复,按两种顺序释放,确认二者均非过期且消费者收到两个 ready 模型;生产者自身选项 ABA 仍使旧回复 stale。
扩展 / 插件与主题构建 Provider 请求区分首次加载与重新加载,并带上宿主解析好的构建工具:lithe/build/model、lithe/build/dependencies 在用户点 Reload/Retry、网页 build.refresh 或同步文件变化后重新加载时带 refresh: true,首次加载不带;宿主按构建系统 invocation 解析出的可执行文件以 tool.executable 传给 Provider,解析失败时省略而不让加载失败
build-provider-refresh-and-tool
已实现
待验证
证据路径
rust/lithe-core/src/build/plans.rs
shared/contracts/plugins/v1/fixtures/build-plans.json
shared/contracts/plugins/v1/README.md
macos/Sources/Lithe/Core/Rust/RustBuildSystemOperations.swift
macos/Sources/LitheCoreContracts/Execution/BuildSystemContracts.swift
macos/Sources/LitheExecutionModule/Services/BuildSystemService.swift
macos/Sources/Lithe/Views/Run/BuildSystemToolWindowView.swift
macos/Sources/Lithe/Application/Features/PluginWebBridge.swift
macos/Tests/LitheExecutionModuleTests/BuildSystemServiceTests.swift
macos/Tests/LitheTests/MacBuildProviderSessionsTests.swift
macos/Tests/LitheTests/PluginWebBridgeTests.swift
未实现
不适用
证据路径
rust/lithe-core/src/build/plans.rs
shared/contracts/plugins/v1/fixtures/build-plans.json
ExtensionsCore 侧 build.modelPlan、build.dependencyPlan 对 provider 来源接受 refresh 与 tool.executable:只在 refresh 为 true 时写入 params.refresh,只在宿主给出工具时写入 params.tool,tool.executable 不是绝对路径时返回 plugin.build.invalidSelection,command 来源忽略两者;不带参数时计划与之前逐字节一致(build-plans.json 金样)。macOS 宿主先向 Core 要计划,确认是 provider 请求后才用 MacBuildToolResolver 解析工具并带上路径重新计划;工具解析失败只在 Build Output 记一行说明,请求照常发出且不带 tool。工具窗口的刷新按钮、构建文件变化横幅的 Reload、失败后的 Retry、依赖节点的 Reload/Retry 以及插件网页的 build.refresh 都带 refresh;首次点击“Load Project Model”与首次展开依赖不带。Windows 宿主尚未接入插件后端与 build.* 命令。自动化:cargo test -p lithe-core --lib build_systems、scripts/architecture/verify-shared-contracts.sh、./scripts/macos/test/test-macos.sh --filter 'BuildSystemServiceTests|MacBuildProviderSessionsTests|PluginWebBridgeTests'。手动验证:安装带 Provider 的 Maven 插件(lithe-plugin-maven 常驻后端版本),打开项目后首次加载模型,后端日志中 params 无 refresh、tool.executable 为项目 mvnw 或 PATH 中的 mvn;点工具栏刷新或修改 pom.xml 后点 Reload,params.refresh 为 true;临时移除 mvn 与 mvnw 后加载,Build Output 提示由 Provider 自行查找工具且请求仍然发出。
扩展 / 插件与主题构建系统插件(API 3 buildSystems):插件用 JSON 声明构建工具的识别、可执行文件、选项、任务、运行入口、测试和输出格式,或由插件自带、与语言服务器同类的 Provider 进程回答模型和依赖,Rust Core 统一校验、生成命令行或 Provider 请求并解码结果,宿主为每个构建系统打开一个按声明(icon、presentation、category)布局的工具窗口;通过共享 executableResolution 候选解析支持可选设置路径、优先级与相对排序,空值自动发现、显式失败不回退;buildProviders 2/3 原生任务与测试执行复用工作区后端会话,带进度、取消、结果与配置失效隔离;协议 3 可按声明发现测试并在现有构建树按精确选择器运行,源码/设置变化撤销旧清单;协议 4 可为应用目标准备启动计划,Core 校验后交给原生 Run 管理进程;Provider 应用可保存到本地 Run v2 配置并重新准备后重启;插件自有原生程序经 Provider v5 构建并准备 Debug,Build 树和保存的 Run 配置复用原生调试会话
build-system-plugins
部分实现
待验证
证据路径
rust/lithe-core/src/build
shared/contracts/plugins/v1/fixtures/build-plans.json
macos/Sources/Lithe/Core/Rust/RustBuildSystemOperations.swift
macos/Sources/Lithe/Platform/MacOS/Build
macos/Sources/LitheExecutionModule/Services/BuildSystemService.swift
macos/Sources/Lithe/Views/Workbench/BuildSystemToolWindowRegistration.swift
macos/Sources/Lithe/Views/Run/BuildSystemToolWindowView.swift
macos/Sources/Lithe/Views/Run/BuildOutputView.swift
macos/Sources/Lithe/Models/AppModel/AppModel+BuildSystems.swift
macos/Sources/Lithe/Models/AppModel/AppModel+JavaIndex.swift
macos/Tests/LitheTests/RustBuildSystemOperationsTests.swift
macos/Tests/LitheExecutionModuleTests/BuildSystemServiceTests.swift
macos/Tests/LitheTests/BuildSystemToolWindowTests.swift
macos/Tests/LitheTests/PluginBuildOptionPersistenceTests.swift
macos/Tests/LitheLanguageIntelligenceModuleTests/LanguageIntelligenceModuleTests.swift
rust/lithe-core/src/lsp/interface/build_provider.rs
macos/Sources/Lithe/Platform/MacOS/Build/MacBuildProviderSessions.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginLanguageServerLaunchResolver.swift
macos/Tests/LitheTests/PluginMarketplaceServiceTests.swift
shared/contracts/plugins/v1/fixtures/build-tool-path.plugin.json
rust/lithe-core/src/plugins/executables.rs
macos/Sources/LitheCoreContracts/Execution/ExecutableResolution.swift
macos/Tests/LitheTests/BuildToolProviderResolutionTests.swift
macos/Tests/LitheTests/MacBuildToolResolverTests.swift
shared/contracts/plugins/v1/fixtures/build-provider-execution.plugin.json
shared/contracts/plugins/v1/fixtures/build-execution-protocol.json
macos/Tests/LitheTests/MacBuildProviderSessionsTests.swift
.agents/notes/implemented/architecture/2026-10-26-build-provider-task-execution.md
shared/contracts/plugins/v1/fixtures/build-provider-tests.plugin.json
shared/contracts/plugins/v1/fixtures/build-test-protocol.json
rust/lithe-core/src/build/test_discovery.rs
shared/contracts/plugins/v1/fixtures/build-test-discovery.json
rust/lithe-core/src/build/run_preparation.rs
shared/contracts/plugins/v1/fixtures/build-provider-run-preparation.plugin.json
shared/contracts/plugins/v1/fixtures/build-run-preparation.json
macos/Sources/LitheExecutionModule/Services/RunService.swift
macos/Tests/LitheExecutionModuleTests/ExecutionModuleTests.swift
shared/fixtures/run-configuration/build-provider.json
shared/contracts/run-configuration-v2.schema.json
macos/Sources/Lithe/Platform/MacOS/RunConfiguration/MacRunConfigurationStore.swift
macos/Tests/LitheTests/RunConfigurationIntegrationTests.swift
macos/Tests/LitheTests/IdeCapabilitiesTests.swift
rust/lithe-core/src/build/debug_preparation.rs
shared/contracts/plugins/v1/fixtures/build-provider-debug-preparation.plugin.json
macos/Sources/Lithe/Platform/MacOS/Debug/MacBuildDebugLaunchResolver.swift
macos/Sources/Lithe/Models/AppModel/AppModel+Debugging.swift
macos/Tests/LitheTests/MacNativeBuildProviderIntegrationTests.swift
macos/Tests/LitheTests/MacNativeProviderDebugIntegrationTests.swift
macos/Tests/LitheTests/ProviderWorkflowPresentationTests.swift
docs/assets/provider-workflow-review/README.md
未实现
不适用
证据路径
rust/lithe-core/src/build
shared/contracts/plugins/v1/fixtures/build-plans.json
shared/contracts/plugins/v1/fixtures/build-provider.plugin.json
ExtensionsmacOS 已接入 static、command、hostIntegration、provider 四种模型来源:宿主向 Core 声明 buildSystems 与 buildProviders 能力,插件市场因此列出兼容的 API 3 声明式和 Provider 版本;Provider 进程按插件、构建系统和工作区各自独立,经各自 stdio 用 JSON-RPC(LSP 基础协议)与宿主通信,initialize 协商 capabilities.experimental.litheBuild 后宿主才经 lsp.buildRequest 发送 lithe/build/model、lithe/build/dependencies,回复交给 Core 解码;共享写法只复用同一插件的语言服务器会话;进程只在用户加载模型或依赖时启动,切换工作区、关闭项目窗口、停止执行模块、停用或更新插件、退出应用时停止;ExecutionFeatureGraph.stop 经 BuildSystemService.stop 同时回收已就绪和初始化中的 Provider,停止后的初始化完成也不得重新登记会话;状态写入插件状态目录;每个已启用的构建系统插件在打开工作区后各有一个右侧工具窗口(标题为 displayName、图标为 icon),不依赖识别结果,工作区没有对应工程时窗口内显示未检测到该构建系统,工具栏放运行、参数任务、刷新和 presentation=toolbar 的开关,树顶部是 presentation=tree 的勾选选项,工程下按 category(缺省按 group)分级列出任务,再列测试、目标和依赖;内置 Maven 窗口与共享 Build 窗口已删除,Build Output 显示输出、诊断与测试结果。窗口恢复先激活所属插件模块,激活中的命令面板项禁用;参数任务遵守 workspace/project/target 作用范围与目标标签,模型或工作区变化后清除旧选择。隔离回归覆盖这些边界、窗口布局恢复及包内图标读取前后文件清单与字节不变;多实例的根目录选择器保留每个实例的模型候选和生效值,编辑多选时保留兄弟实例独有的已选值;显式清空按实例根持久化为空覆盖,检测、同步指纹、任务计划和语言服务器导入使用同一覆盖,兄弟编辑或重开不会恢复非空默认值,非空编辑清当前实例标记而共享编辑/重置清该选项全部标记;真实 Core、生产存储与服务回归核对最终 argv 和导入值;列表单选与多选支持 allowCustom 原生输入和移除已选自定义值,文本/文件/目录清空提交显式空字符串,只有重置删除覆盖。插件选项在项目打开、选项修改和模型加载完成后通过 Core build.languageImport 归一化为 mavenContext/javaGradle,与构建计划使用同一生效值,并在 Java 启动前等待同一工作区代次的最新配置;运行时准备后再等一次,覆盖等待期间失效。唯一发布回调优先 Maven 原地热更新,被拒绝时串行恢复重启;停用最后一个 Maven 插件时,仅清除曾带 Maven 输入的同一会话,纯 Gradle 首次启动保持 nil。Gradle 在下次启动生效,取消/重置拒绝旧检测与恢复任务,被动工具路径发现不执行 Wrapper/版本探测;没有对应插件导入输入时兼容原 Maven 设置。命令模型 run 配置尚未接入;buildProviders 2 已接入原生任务 lithe/build/execute,复用工作区进程并校验协议版本、进度/结果、取消/超时和旧结果隔离,真实安装包/工具工作流仍待验收,Provider 无操作系统级沙盒;Windows 宿主尚未调用 build.* 命令。自动化:cargo test -p lithe-core --lib build_systems、cargo test -p lithe-core --lib lsp、scripts/architecture/verify-shared-contracts.sh、./scripts/macos/test/test-macos.sh --filter 'BuildSystemToolWindowTests|RustBuildSystemOperationsTests|BuildSystemServiceTests|PluginMarketplaceServiceTests'。手动验证:安装 fixtures 中 build-static-file、build-command-stdout 形态的插件包,确认每个构建系统各出现一个工具窗口,列出工程、分级任务、选项和依赖,停用插件后窗口消失;执行任务与测试的 argv 与 build-plans.json 一致,停止与输出上限生效;JUnit 报告与 lineMatcher 诊断可跳转到源码;命令模型和项目内 Wrapper 只在用户点击加载或运行后启动;禁用插件后实例消失;Windows 接入后另需验证未信任工作区不启动任何模型命令或 Wrapper;build-provider 形态的自有 Provider 只在用户操作或工作区信任后启动、停用插件时停止,build-provider-language-server 形态复用语言服务器会话而不启动第二个进程;运行前后 app bundle 文件清单不变(scripts/macos/verify/verify-runtime-bundle-immutability.sh)。;新路径选择使用 executableResolution 1 + settings 2,已发布 buildSystems 2 旧字段只作统一候选输入适配:MacBuildToolResolverTests 验证带空格绝对路径、权限与版本失败不回退,BuildSystemServiceTests 验证 Provider 失败不独立发现,RustBuildSystemOperationsTests 验证全局值接入。Cargo 独立仓库以显式本地 Core bridge 验证自选路径用于 metadata 和全部构建/测试/运行/清理;发布前需把独立仓库 sdk.lock.json 的宿主 pin 更新到包含该能力的已发布提交。;回归增加非法存储值不回默认、数组/priority/插入顺序与拒绝循环、宿主注入发现、空设置跳过和被动选择不探测;Language Server/Execution Provider 新清单语法尚未开放,Windows 不声明 executableResolution。;真实 Core + macOS resolver + BuildSystemService 组合回归覆盖前置 Runtime 缺失/版本不足时保留工具或后置 Runtime 的非空 setting 约束,Provider 不发送独立发现请求;全部设置为空时仍可回退。自定义 Runtime 先构造含所选目录的 PATH,再以同一环境探测与执行,同目录 helper 的带空格路径回归通过。;buildProviders 3 增加原生测试执行 lithe/build/test,筛选参数保持类型化,报告复用 JUnit/标准结果解析;旧协议明确拒绝测试,报告解析期间配置失效会取消操作并丢弃迟到结果。原生树已接入按需测试发现,Core 校验完整清单并保留模块身份,运行前重查当前清单;配置/源码/包变化、停用/重开使缓存或进行中的发现失效。真实 Maven 模块编译与单方法测试已有生产 macOS Provider 会话证据;Windows 工作流仍待验收。;buildProviders 4 应用目标准备接入原生 Build 树,构建进度在 Build Output 展示,验证后转交 RunService 解析工具与启动/停止应用;准备期间源码、选项、工作区或停用变化拒绝迟到启动,旧操作 ID 不得停止替换进程;Core 拒绝绝对可执行路径、越界目录/符号链接及超限参数环境。服务编排、调试与 Java/Maven 消费者迁移尚未完成;真实插件/发行包和 Windows 工作流仍待验收。;Run v2 本地层显式保存 Provider 选择器,参数保持原始数组;无 generated.json 也能读回/显示,重复保存保留 ID/其他配置/项目环境;重启重新进入当前 Provider,停止与晚到结果按身份隔离。原生入口保存工作区文档后再准备,Run 窗口在未生成旧配置时仍显示 Provider 输出。;Agent 入口回归从真实本地配置启动,验证准备到进程退出保持公开操作 ID、准备中停止与重启重新准备,旧 ID 不能停止替换操作;Provider 与进程为可控替身,真实插件端到端验收仍待完成。;配套独立仓库 Node/Java SDK 源码补齐协议 2/3/4 的处理器、版本准入与进度;无页面示例经真实 Core 验证非零构建退出码、精确筛选、运行前构建及准备计划、并行工作区、取消工具清理和完整包不变,另保留锁定旧契约的兼容场景与 TypeScript 调用方编译检查。SDK 尚未发布,真实 Maven/JDT 与 Windows 验收仍待完成。 原生 Debug:运行声明引用同包适配器,点击 Build 树 Debug 或保存配置的 Debug 后先保存并构建,验证程序路径/参数/环境交给注册表;停止、源码或配置变化、模型重载、插件停用与工作区切换均丢弃过期结果,解码后的文件别名变化和不可执行文件在平台交接前拒绝。Node/Java SDK 进程的准备协议与 Core 解码有端到端覆盖;真实适配器、Java/JDT、跨插件协作和 Windows 尚未验收。 Maven 独立插件的本地增量已经删除生命周期/插件目标/自定义目标/测试的命令模板,改由 Provider 3 执行;真实 Core C ABI + Java 后端 + Maven 三模块工程验证模块编译、单方法 Surefire 报告和模型共享,受控进程回归覆盖取消、非零退出和输出超限。插件与新版 SDK 已分别提交 Draft PR #7/#4,尚未发布,正式 SDK 锁定仍待更新;生产 macOS Provider 会话已经执行模型、编译和单方法测试,包 SHA-256/权限保持不变;显式 SDK CI 在 Java 8 上通过当前与 3.6.3 Maven 的 55 项开发检查(各自包括 3 项打包);旧 MavenService、Agent/设置/Run/Java 迁移、正式包、完整 macOS UI 与 Windows 验收未完成,保持 partial/pending。 真实原生调试集成:公开 Node SDK Provider 用 Clang 编译 C 程序,经生产 macOS 会话、Core 准备、Registry 明确身份、生产 stdio 传输和 LLDB 命中源码断点、读取 main 栈帧、保留空格参数后继续并退出码 0;包 SHA-256/权限不变,所有本次进程回收。测试显式选择 SDK/工具,完整 UI、正式发行与 Windows 尚未验收,verification 保持 pending。 Build 树应用从文档保存阶段起持有同一可取消运行 ID;保存 gate 下启动新任务/测试或停止、切换工作区、选项/源码/模型/插件失效后,旧保存返回不得启动 Provider、替换新运行或清空新输出;保存失败不启动,成功后才准备。 原生视图隔离回归用真实 Core 与受控 Provider 数据检查深浅主题的测试发现、Debug 入口和 Run 输出;截图仅验证该视图状态,不代替完整发行包或 Windows 实机验收。
扩展 / 插件与主题Cargo 社区构建插件:由 Cargo metadata 提供 workspace/package/target/features,使用原生构建窗口执行编译、检查、测试、清理和 binary/example 运行,支持 Release、Features、Offline;用户安装 Cargo 与 Node,插件独立打包且运行时只读;通过共享 executableResolution 候选解析支持可选设置路径、优先级与相对排序,空值自动发现、显式失败不回退
cargo-build-plugin
已实现
待验证
证据路径
Plugins/mac/README.md
docs/ci-builds.md
.agents/notes/implemented/feature/2026-10-22-cargo-build-plugin.md
shared/contracts/plugins/v1/fixtures/build-tool-path.plugin.json
rust/lithe-core/src/plugins/executables.rs
macos/Sources/LitheCoreContracts/Execution/ExecutableResolution.swift
未实现
不适用
证据路径
shared/contracts/plugins/v1/README.md
Plugin Platform独立源码与预发布包由 https://github.com/Lithe-IDEA/lithe-plugin-cargo 维护;插件 CI 按 sdk.lock.json 的宿主提交构建公开 JSON API 测试桥接,运行 3 项 Cargo 专属 Core 兼容性回归(清单/安装审查/能力拒绝、识别/模型解码、任务与测试选择),并以 LITHE_CARGO_INTEGRATION=1 执行真实双包 workspace:模型由 Core 规划请求并解码,编译/检查/测试/同名 binary 与 example/单测试/清理由 Core 生成参数,验证 Release/Features/Offline、编译失败及诊断解码、后端退出和包字节不变;SDK 固定源码和哈希、打包校验及逐测试 HTML/JUnit 由插件仓库 CI 持有。固定宿主基线不代表已验证未来 preview。主仓库只保留通用插件契约回归;scripts/macos/verify/verify-runtime-bundle-immutability.sh。原生验收待完成:macOS 从磁盘安装预发布 ZIP、确认 Cargo/Node、重启并启用;打开插件仓库 fixture workspace,检查 Cargo 原生窗口、模型与选项,执行构建/检查/测试/运行,制造错误并跳转源码;停止运行、关闭项目与停用插件后确认无后端和 Cargo 子进程。基础版不提供依赖树、调试或逐用例图形报告;Windows 尚无 API 3 构建宿主。;新路径选择使用 executableResolution 1 + settings 2,已发布 buildSystems 2 旧字段只作统一候选输入适配:MacBuildToolResolverTests 验证带空格绝对路径、权限与版本失败不回退,BuildSystemServiceTests 验证 Provider 失败不独立发现,RustBuildSystemOperationsTests 验证全局值接入。Cargo 独立仓库以显式本地 Core bridge 验证自选路径用于 metadata 和全部构建/测试/运行/清理;发布前需把独立仓库 sdk.lock.json 的宿主 pin 更新到包含该能力的已发布提交。;回归增加非法存储值不回默认、数组/priority/插入顺序与拒绝循环、宿主注入发现、空设置跳过和被动选择不探测;Language Server/Execution Provider 新清单语法尚未开放,Windows 不声明 executableResolution。
工作台 / 命令与布局命令面板与全局动作
command-palette
已实现
待验证
证据路径
macos/Sources/Lithe/Models/Keymap/LitheCommandCatalog.swift
macos/Sources/Lithe/Views/Search/SearchEverywhereView.swift
macos/Tests/LitheTests/WorkbenchContributionHostTests.swift
macos/Sources/LitheApplicationKernel/Lifecycle/ModuleRuntime.swift
已实现
待验证
证据路径
windows/tauri/src/features/command-palette
Workbench搜索并执行打开面板、运行、Git 和设置命令,确认快捷键和不可用命令状态。 macOS 动作状态:确认窗口入口、工具栏、菜单与命令面板共用可用和勾选状态,激活中命令禁用且 Enter/鼠标均不能触发,窗口入口允许取消;同时打开同一插件的两个窗口只构造一次模块,取消其中一个不影响另一个;激活中禁用再启用,确认无资源残留或晚到贡献,旧动作引用不绕过状态校验。 禁用执行、调试、搜索、终端等模块后,其原生命令和快捷键同样不可执行;界面入口隐藏不代表命令被禁用。 内置和插件命令面板入口共用贡献目录,可隐藏、排序及恢复;恢复入口不执行命令,内置快捷键与分组不变,插件标题原样展示。
社区 / LINUX DO 社区社区认证与请求失败处理
community-auth
未实现
不适用
证据路径
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginPackageStore.swift
shared/fixtures/community
未实现
不适用
证据路径
windows/tauri/src/features
Community如果重新引入社区入口,在 macOS 和 Windows 验证认证、过期、限流和网络错误。
macOS 的 LINUX DO 插件已退役,现存 fixture 不代表产品接入。
社区 / LINUX DO 社区主题列表与详情
community-feed
未实现
不适用
证据路径
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginPackageStore.swift
未实现
不适用
证据路径
windows/tauri/src/features
Community如果重新引入社区入口,在 macOS 和 Windows 验证 Latest/Top、主题详情、分页和浏览器跳转。
macOS 的 LINUX DO 插件已退役,当前两端均无社区入口。
数据库 / 数据库工作区连接配置与 Provider(由社区插件提供)
database-connections
已实现
待验证
证据路径
macos/Sources/LitheModuleAPI/Catalog/BuiltInModuleCatalog.swift
macos/Sources/Lithe/Application/Features/PluginMarketplace.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginBackendSessions.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginCredentialStore.swift
rust/lithe-core/src/plugins/backend.rs
macos/Tests/LitheTests/PluginWebBridgeTests.swift
.agents/notes/implemented/architecture/2026-10-24-database-provider-plugin.md
未实现
不适用
证据路径
shared/contracts/plugins/v1/README.md
Database(社区插件 Lithe-IDEA/lithe-plugin-database,Lithe Store 上架)macOS 从插件市场的 Lithe Store 安装社区插件 io.github.lithe-idea.database,打开 Database 工具窗口:新建、编辑、复制、测试、删除 MySQL、MariaDB、PostgreSQL、SQLite、SQL Server、MongoDB、Redis、Nacos 连接,含 SSH 隧道、TLS、只读和生产保护;永久保存的密码进入 Keychain(服务 <前缀>.plugin-credentials.dev.lithe.plugin.database),“直到重启”的密码不落盘;文件夹的新建、嵌套、移动、重命名和删除,以及从 DBX 导入连接。停用后入口消失、后端进程退出,重新启用或更新后连接和密码仍在;卸载后凭据和 ${stateDir} 一并删除。确认安装包目录没有任何写入。 Windows:插件宿主和插件市场就绪前不提供数据库功能,主程序不再包含数据库入口。
数据库 / 数据库工作区表数据编辑、CRUD 与导出(由社区插件提供)
database-crud-export
已实现
待验证
证据路径
macos/Sources/LitheModuleAPI/Catalog/BuiltInModuleCatalog.swift
macos/Sources/Lithe/Application/Features/PluginMarketplace.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginBackendSessions.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginCredentialStore.swift
rust/lithe-core/src/plugins/backend.rs
macos/Tests/LitheTests/PluginWebBridgeTests.swift
.agents/notes/implemented/architecture/2026-10-24-database-provider-plugin.md
未实现
不适用
证据路径
shared/contracts/plugins/v1/README.md
Database(社区插件 Lithe-IDEA/lithe-plugin-database,Lithe Store 上架)macOS 从插件市场的 Lithe Store 安装社区插件 io.github.lithe-idea.database,打开 Database 工具窗口:打开表数据,筛选、排序、分页,编辑单元格、新增和删除行后提交与撤销;只读连接和脱敏列不可编辑;生产保护连接上的危险写入弹出确认;通过宿主文件对话框导出 CSV/JSON/SQL、导入 CSV/JSON、备份与恢复 SQL,大结果超过 1 MiB 时提示截断。 Windows:插件宿主和插件市场就绪前不提供数据库功能,主程序不再包含数据库入口。
数据库 / 数据库工作区连接下多数据库独立展开与显示范围选择(由社区插件提供)
database-multi-schema-tree
已实现
待验证
证据路径
macos/Sources/LitheModuleAPI/Catalog/BuiltInModuleCatalog.swift
macos/Sources/Lithe/Application/Features/PluginMarketplace.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginBackendSessions.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginCredentialStore.swift
rust/lithe-core/src/plugins/backend.rs
macos/Tests/LitheTests/PluginWebBridgeTests.swift
.agents/notes/implemented/architecture/2026-10-24-database-provider-plugin.md
未实现
不适用
证据路径
shared/contracts/plugins/v1/README.md
Database(社区插件 Lithe-IDEA/lithe-plugin-database,Lithe Store 上架)macOS 从插件市场的 Lithe Store 安装社区插件 io.github.lithe-idea.database,打开 Database 工具窗口:展开 MySQL/MariaDB 连接后同时展开多个数据库,各自折叠、刷新和失败重试;用“Databases Shown…”只显示选中的库,选择随连接保存;表、视图、例程、触发器、序列分组按需加载。 Windows:插件宿主和插件市场就绪前不提供数据库功能,主程序不再包含数据库入口。
数据库 / 数据库工作区内置数据库模块的连接迁入插件与安装提示
database-plugin-migration
已实现
已验证
证据路径
macos/Sources/Lithe/Platform/MacOS/Plugins/MacDatabasePluginMigration.swift
macos/Tests/LitheTests/MacDatabasePluginMigrationTests.swift
macos/Sources/Lithe/Application/Features/DatabasePluginTransition.swift
macos/Sources/Lithe/Models/AppModel/AppModel+DatabasePlugin.swift
macos/Tests/LitheTests/WorkbenchNotificationTests.swift
macos/Tests/LitheTests/MacPluginBackendSessionsTests.swift
平台专属
不适用
证据路径
shared/contracts/plugins/v1/README.md
DatabasemacOS:用保存过数据库连接(含文件夹、旧 group 字段、SQL 历史、永久和“直到重启”密码)的旧版本升级。首次启动出现一次“数据库已改为插件”通知,点击“打开插件市场”进入搜索 Database 的市场页,通知在点击前不自动消失,之后不再出现;已安装插件或从未保存连接的用户不出现。从 Lithe Store 安装插件并首次打开后,连接、文件夹(旧 group 变为顶层文件夹)、属于现存连接的最近 100 条历史和永久密码全部可用,“直到重启”的密码需要重新输入;Keychain 锁定时迁移失败的密码只记录日志、连接改为询问密码。从磁盘、其他市场来源或仓库地址不是 Lithe-IDEA/lithe-plugin-database 的同 ID 包得不到任何旧数据和密码,之后从 Lithe Store 安装仍会迁移;插件已有 connections.json 时不覆盖;迁移只执行一次,旧数据保留供旧版本读取。Windows 没有内置数据库模块,无需迁移。2026-10-24 已在 macOS 开发版身份(app.lithe.desktop.dev,独立偏好与 Keychain)按此流程验收:写入 3 个旧连接(含文件夹、旧 group、历史、永久与“直到重启”密码)后启动,出现通知并经“打开插件市场”从 Lithe Store 安装 Database 0.1.0,重启后打开工具窗口,3 个连接都在;插件状态中旧 group 变为顶层文件夹、历史时间换算正确、connections.json 不含密码,永久密码进入插件凭据、“直到重启”的密码未迁移,迁移标记已写入。Keychain 锁定与非 Lithe Store 来源由 MacDatabasePluginMigrationTests 覆盖。
数据库 / 数据库工作区SQL 查询、历史与分页(由社区插件提供)
database-query-history
已实现
待验证
证据路径
macos/Sources/LitheModuleAPI/Catalog/BuiltInModuleCatalog.swift
macos/Sources/Lithe/Application/Features/PluginMarketplace.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginBackendSessions.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginCredentialStore.swift
rust/lithe-core/src/plugins/backend.rs
macos/Tests/LitheTests/PluginWebBridgeTests.swift
.agents/notes/implemented/architecture/2026-10-24-database-provider-plugin.md
未实现
不适用
证据路径
shared/contracts/plugins/v1/README.md
Database(社区插件 Lithe-IDEA/lithe-plugin-database,Lithe Store 上架)macOS 从插件市场的 Lithe Store 安装社区插件 io.github.lithe-idea.database,打开 Database 工具窗口:在查询控制台执行单条和多条语句,取消正在执行的语句,查看逐语句结果、耗时、行数和错误;只读连接拒绝写入语句(包括以查询或导出形式发送的写入);不带 WHERE 的 UPDATE/DELETE 等危险语句在生产保护连接上先确认;SQL 历史保留最近 100 条并可恢复到所属连接。 Windows:插件宿主和插件市场就绪前不提供数据库功能,主程序不再包含数据库入口。
数据库 / 数据库工作区Schema、表与列浏览及结构编辑(由社区插件提供)
database-schema
已实现
待验证
证据路径
macos/Sources/LitheModuleAPI/Catalog/BuiltInModuleCatalog.swift
macos/Sources/Lithe/Application/Features/PluginMarketplace.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginBackendSessions.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginCredentialStore.swift
rust/lithe-core/src/plugins/backend.rs
macos/Tests/LitheTests/PluginWebBridgeTests.swift
.agents/notes/implemented/architecture/2026-10-24-database-provider-plugin.md
未实现
不适用
证据路径
shared/contracts/plugins/v1/README.md
Database(社区插件 Lithe-IDEA/lithe-plugin-database,Lithe Store 上架)macOS 从插件市场的 Lithe Store 安装社区插件 io.github.lithe-idea.database,打开 Database 工具窗口:浏览 schema、表、列、索引、外键和 DDL;新增、修改、删除列与索引,生产保护连接上的结构变更先确认;MongoDB 集合、Redis Key、Nacos 配置与服务各自的浏览和编辑页面可用。 Windows:插件宿主和插件市场就绪前不提供数据库功能,主程序不再包含数据库入口。
运行与调试 / 调试器启动调试与断点
debug-breakpoints
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Debug
shared/fixtures/debug
macos/EditorFrontend/main.ts
frontend/editor/src/workbench.ts
macos/Sources/Lithe/Platform/MacOS/MonacoWorkbenchEditor.swift
macos/Resources/IDEAIcons/expui/breakpoints
macos/Experiments/Monaco/workbench.integration.ts
macos/Sources/LitheDebugModule/Application/DebugBreakpointLocationValidator.swift
macos/Sources/LitheDebugModule/Application/GenericDebugFeatureModel.swift
macos/Tests/LitheTests/RealJavaDebugIntegrationTests.swift
shared/fixtures/debug/breakpoint-binding-v1.json
macos/Sources/Lithe/Views/Workbench/WorkbenchView.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchModuleUIComposition.swift
macos/Tests/LitheTests/DebugToolbarPresentationTests.swift
macos/Sources/Lithe/Models/AppModel/AppModel+Debugging.swift
macos/Tests/LitheTests/RunEntryPointTests.swift
macos/Sources/LitheDebugModule/Runtime/DebugAdapterSessionManager.swift
macos/Tests/LitheDebugModuleTests/DebugModuleTests.swift
部分实现
待验证
证据路径
windows/tauri/src/features/debugger
shared/fixtures/debug
windows/tauri/src/features/debugger/services/debug-session-actions.test.ts
windows/tauri/src/features/debugger/services/monaco-debug-decorations.test.ts
windows/tauri/src/features/maven/services/maven-module-debug.test.ts
windows/tauri/src/features/debugger/utils/debug-source-path.ts
windows/tauri/src/features/debugger/stores/debugger-breakpoints.test.ts
.github/workflows/ci-windows.yml
Debug设置、命中、禁用和重新定位断点,确认调试会话生命周期。 Windows验证Java gutter增删断点、禁用断点和暂停行装饰;只读编辑器不增删断点,切换/销毁编辑器后订阅与装饰均释放。 Windows盘符路径的大小写/分隔符别名必须在 gutter mutation、按文件查询和 Monaco 投影使用同一字面身份;第二次点击移除可见位置及其历史重复别名,保留其他行/模块和原始持久化路径。POSIX大小写保持区分,真实store与隔离localStorage回归登记Windows CI。 macOS WebKit验证IDEA原始14pt断点SVG明暗变体、普通/禁用/静音/未验证/日志状态,未启动调试时为普通实心断点;启用且暂停的断点采用IDEA配色行背景,禁用和日志断点无此背景,增删不改变文本或边栏宽度。 可编辑行号区hover显示原始断点SVG预览,Islands深/浅透明度0.35/0.30,光标为pointer;已有断点保持完整不透明度,只读与Git blame不显示可点击预览。 macOS断点位置只检查合法源码行和provider能力,不以@注解、类型声明或单独花括号启发式拒绝;hover与点击共享宿主能力,未支持文件和只读等状态不发请求。真实JUnit/TestNG调试同时保留方法结束括号断点并在方法体语句暂停、检查局部变量及继续退出。Core requestedLine与适配器ID关联实际行号和后续无位置事件,拒绝旧请求回包;显示已调整位置的圆点仍切换原始持久化断点,新会话撤销旧绑定确认。 macOS暂停位置对齐IDEA EXECUTIONPOINT_ATTRIBUTES:Islands深/浅背景#2A5091/#2154A6,执行高亮覆盖同位置断点背景并保留语法色和已验证断点;不增加IDEA Java默认没有的黄色stack-frame箭头。行尾变量使用#849FBF/#A9B7D6斜体透明背景。真实WebKit覆盖深浅主题、单步移动、继续后清除暂停装饰并恢复断点背景及文本历史不变。 共享行尾变量注入必须设置showIfCollapsed,使零宽锚点实际渲染;不得只检查模型装饰存在。macOS实际演示项目已验证断点命中、单步到下一行及继续退出后的高亮和值清理。 macOS主工具栏对当前选中调试目标以Pause/Resume替换Run,使用IDEA原始16pt图标与普通按钮底色;执行请求处理中禁用,仍保留Restart Debug和Stop,退出调试或选择其他目标恢复Run/Rerun。检查暂停时点击Resume继续到下一断点、运行时Pause、目标切换及模块禁用;纯展示测试覆盖各会话状态和不匹配的目标。 顶栏选中测试目标时,Debug及其共享快捷键入口必须调用测试调试工作流,而非底下的Main配置;没有源码的测试必须明确报错,不能回退调试Main。 macOS 多会话(#1210):启动带 startDebugging 子会话的调试,确认头部只有一个会话标签,线程选择器先列“会话”(子会话缩进、带状态和当前勾选)再列线程,切换会话后线程、栈帧和变量跟随;停止父会话连带停止子会话,父会话终止或失败也清理子会话,右键线程选择器可单独停止某个运行中的会话。运行 LitheDebugModuleTests 的多会话用例;真实多会话产品验收 pending。
Windows 真实调试产品链路仍在 #466 跟进。 本次Windows改动保留Core/JDT的DAP及Java目标所有权,仅修复前端事件、请求和资源生命周期;完整界面及跨平台验收保持pending。 路径键复用既有装饰规则,不等同于原生文件句柄/符号链接身份,不全量迁移用户断点。 macOS 内置 Python(debugpy)和 Rust(lldb-dap)stdio 调试器已移除,只保留 Java,其余语言由语言插件提供调试适配器(#1210)。
运行与调试 / 调试器汇编级调试:无源码栈帧、反汇编视图、指令步进、指令断点、寄存器与只读内存,均由适配器能力决定是否可用
debug-disassembly
已实现
待验证
证据路径
rust/lithe-core/src/debug/types.rs
rust/lithe-core/src/debug/capabilities.rs
rust/lithe-core/src/debug/engine.rs
rust/lithe-core/src/protocol/command.rs
rust/lithe-core/src/runtime/dispatcher.rs
macos/Sources/LitheCoreContracts/Debug/DebugAdapterContracts.swift
macos/Sources/LitheCoreContracts/Debug/DebugProtocolCore.swift
macos/Sources/Lithe/Core/Rust/RustDebugProtocolCore.swift
macos/Sources/LitheDebugModule/Runtime/CoreDebugAdapterProtocolSession.swift
macos/Sources/LitheDebugModule/Runtime/DebugAdapterSessionManager.swift
macos/Sources/LitheDebugModule/Application/GenericDebugFeatureModel.swift
macos/Sources/LitheDebugModule/Application/GenericDebugDisassemblyModel.swift
macos/Sources/LitheDebugModule/Application/GenericDebugMemoryDisplay.swift
macos/Sources/Lithe/Views/Debug/GenericDebugView.swift
macos/Sources/Lithe/Views/Debug/GenericDebugDisassemblyView.swift
macos/Sources/Lithe/Views/Debug/DebugVariableJSONView.swift
macos/Sources/Lithe/Views/Debug/DebugJSONSyntax.swift
macos/Tests/LitheDebugModuleTests/DebugModuleTests.swift
macos/Tests/LitheTests/DebugJSONSyntaxTests.swift
shared/fixtures/debug/projection-v2-examples.json
macos/Tests/LitheTests/DebugDisassemblyLayoutTests.swift
未实现
不适用
证据路径
rust/lithe-core/src/debug/engine.rs
rust/lithe-core/src/debug/capabilities.rs
DebugmacOS:用只带符号表、没有调试信息的 C 程序(含 raise(SIGTRAP))经 Xcode lldb-dap 启动调试,暂停后栈帧显示函数名与地址而不是伪造的文件和第 1 行,反汇编标签自动打开并高亮当前指令;适配器不声明 supportsDisassembleRequest 时没有反汇编标签。反汇编中单步改为按指令前进(仅适配器声明 supportsSteppingGranularity 时),关闭反汇编标签后恢复按行单步;点击地址栏设置或移除指令断点(仅适配器声明 supportsInstructionBreakpoints 时),断点只属于当前会话、不写入持久化,新会话不重放。反汇编打开时,步过/步入的按钮提示变为按指令单步,头部显示“按指令单步”;适配器不支持时头部提示单步仍按源码行前进。寄存器作用域出现在寄存器标签,内存标签接受地址或保存着地址的表达式,从目标地址前 64 字节读起并分页,目标字节在十六进制和 ASCII 两侧高亮并滚入可见区,读取不到的字节显示为缺失而不是 00;右侧显示设置可切换进制、每格字节数、每行字节数、字节序与 ASCII 列;只读内存,不开放 writeMemory。连续单步时线程、调用栈、变量、反汇编、内存与 JSON 视图原地更新,不整面板清空重画,变化的内存字节被标出,继续执行或会话结束才清空。单步暂停到新作用域返回之前,旧变量树与 JSON 仍不可操作;同步取消和切换会话后的旧反汇编失败不重试、不覆盖保留的内存;传输失败清空保留数据。内存偏移表头使用请求引用而不是返回的页首地址。地址和引用对宿主是不透明字符串,宿主不做地址运算、不内置 CPU 寄存器表,也不按适配器 ID 分支。Windows 尚未实现,共享 Rust 内核已经提供能力快照与 debug.inspect 的 disassemble、readMemory,待 React 界面接入。 macOS 反汇编短指令从左侧地址列开始,长指令可横向滚动,当前指令定位只改变纵向位置;接近上下边缘时自动补充有界指令页,不再点击加载更早/更晚按钮。上方插入保留可见指令像素位置,下方追加不跳回当前指令;同页重复地址和无进展停止、失败需显式重试,关闭/继续执行后的迟到页面不得覆盖。运行 DebugDisassemblyLayoutTests 与 DebugModuleTests,真实 lldb-dap 连续滚动验收仍待完成。 映像边界回归:上下页被适配器拒绝后按 64→32→16→8→4→2→1 条缩小,不跳过仍可读取的相邻指令;单条相邻读取失败且原边缘仍可读才停止该方向,不显示永久失败条。空白无效补位不得成为分页地址,另一方向仍可滚动;超时/停止/无效回复继续显示重试,验证迟到不覆盖新暂停点。独立真实 lldb-dap 21/C 程序已复现首地址的负偏移失败与零偏移成功;运行新增 DebugModuleTests 边界回归及原生错误条左对齐测试,完整工作台连续滚动仍 pending。
运行与调试 / 调试器Java 调试与运行使用同一个 JDK:调试不单独配置 JDK,随运行配置、项目 JDK 和 JAVA_HOME 的选择变化
debug-java-runtime
已实现
待验证
证据路径
macos/Sources/Lithe/Services/Debug/DebugLaunchConfigurationResolver.swift
macos/Sources/Lithe/Services/Java/ProjectRuntimeService.swift
macos/Tests/LitheTests/RunConfigurationIntegrationTests.swift
未实现
不适用
证据路径
windows/tauri/src/platform/lsp-core-adapter.ts
Debug为项目或运行配置指定与语言服务器运行时不同的 JDK,分别运行和调试 Java 主类、Maven 类配置与测试,确认三者的被调试 JVM 都是运行所用的 JDK;把 JDK 改为无效路径,确认调试与运行给出相同的报错。
Windows 的 Java 调试启动参数不带 javaExec,由 Java Debug Server 选择 JVM,尚未与运行对齐。
运行与调试 / 调试器目标JVM实时CPU与堆内存图表
debug-performance
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Debug/DebugPerformancePane.swift
macos/Sources/Lithe/Application/Features/DebugPerformanceFeatureModel.swift
macos/Sources/Lithe/Platform/MacOS/Debug/MacDebugPerformanceSampler.swift
macos/Tests/LitheTests/DebugPerformanceChartTests.swift
macos/Tests/LitheTests/DebugPerformanceSamplingTests.swift
macos/Tests/LitheTests/JVMPerformanceIntegrationTests.swift
.agents/notes/implemented/feature/2026-10-14-local-jvm-performance-monitoring.md
macos/Sources/Lithe/Platform/MacOS/Debug/MacProcessTreePerformanceSampler.swift
macos/Tests/LitheTests/ProcessTreePerformanceTests.swift
macos/Sources/Lithe/Platform/MacOS/Debug/MacTestJVMPerformance.swift
macos/Sources/Lithe/Application/Features/TestJVMPerformanceFeatureModel.swift
macos/Sources/Lithe/Views/Language/TestJVMPerformanceView.swift
macos/Tests/LitheTests/TestJFRIntegrationTests.swift
macos/Tests/LitheTests/TestJVMPerformanceFeatureTests.swift
docs/screenshots/test-panel-review
未实现
不适用
证据路径
windows/tauri/src/features/debugger
Debug用Lithe启动本地Java调试目标,展开Performance确认CPU与JDK堆数据,切换/结束会话、收起时释放采集。明暗主题检查折线与面积、底部基准线、紧凑高度,60秒窗口最新在右且历史左移,鼠标悬停两图显示同一真实采样的圆点/数值/时间;缺失数据不造零。 验证相同DAP会话重新启动新PID时清除旧历史;重复登记相同目标不重启;销毁Feature取消流;jstat超长/非法/缺失计数报错;显式Java21集成测试读取真实数据并核对取消后jstat PID退出。 Test 右侧 Performance/Details 共用一个可收缩区域,顶部两个标签切换;核对11pt常规标题和Islands文字色。Java选择本次启动器后代中的JUnit/Surefire/Gradle测试JVM,实时CPU/堆曲线,多个worker切换。开始/停止JFR录制、Show Results查看JDK热点方法和分配报告,结束/重跑/关闭正确取消及清理。非Java测试继续用明确标注的CPU/RSS;缺失worker或工具明确提示,不采样Maven/Gradle启动器。 审核回归:停止失败保留录制与可重试入口,不允许Show Results/重录;隐藏期间报告成功/失败或启动失败后停止发现轮询。已有兼容 Gradle daemon 时,内置测试计划使用 --no-daemon 生成本次拥有的 worker,既有 daemon 不采样、不停止;自定义扩展复用既有 daemon 且没有关联 PID 时仍不支持。
复用OpenJDK jstat与原生目标进程CPU计数,支持已知本地Java目标;无对应采集能力时明确提示。图表复用系统Swift Charts与Lithe共享配色、字体、分隔线和Git Log收起条。公开Community未找到该面板源码,按用户同意的OpenJDK路线独立接入;Test已接入JDK JFR录制及Show Results热点/分配文本报告,Debug当前仅实时图表。组件渲染/时间域可独立验证,完整JVM流程及交互验收保持pending。 审查补齐采集生命周期与真实JVM集成测试,原生流只缓冲最新一条,避免UI繁忙时累积;测试通过不提升完整用户项目验收状态。 Test复用同一图表与采样生命周期,独立进程树CPU/RSS源明确标注驻留内存,Debug继续使用目标JVM堆源。 内置Gradle测试已通过预启动兼容daemon后的真实worker归属集成;新建Gradle项目在完整应用导入后测试提供方不可用,产品入口端到端仍待验收,不据此提升verificationStatus。
运行与调试 / 调试器变量、异常与断开策略
debug-state
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Debug
shared/fixtures/debug
macos/Sources/LitheDebugModule/Application/GenericDebugFeatureModel.swift
macos/Tests/LitheDebugModuleTests/DebugModuleTests.swift
macos/Sources/Lithe/Views/Workbench/LitheConsoleStyle.swift
macos/Tests/LitheTests/ConsolePresentationTests.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchView.swift
macos/Tests/LitheTests/ConsoleInlineInputTests.swift
macos/Sources/Lithe/Views/Components/LitheToolWindowStatusText.swift
macos/Tests/LitheTests/ToolWindowStatusTextTests.swift
macos/Sources/Lithe/Models/AppModel/AppModel+Terminal.swift
macos/Tests/LitheTests/TerminalPlacementFeatureModelTests.swift
macos/Sources/Lithe/Views/Workbench/OutputTextView.swift
macos/Sources/LitheDebugModule/Runtime/DebugAdapterSessionManager.swift
部分实现
待验证
证据路径
windows/tauri/src/features/debugger
shared/fixtures/debug
windows/tauri/src/features/debugger/services/debug-session-actions.test.ts
windows/tauri/src/features/debugger/services/monaco-debug-decorations.test.ts
windows/tauri/src/features/maven/services/maven-module-debug.test.ts
Debug验证变量分页、异常信息、step filters、暂停/继续和 disconnect policy。 Windows验证DAP请求信封、初始断点先于launch入队、暂停线程与线程列表、继续后清空暂停状态、快速单步/失败回滚,以及并发Stop等待同一资源清理。 macOS验证Debug空状态的初始、活跃、无输出终止、关闭最后会话、失败重试、重置,以及明暗主题与配置/帮助链接。 macOS检查活动会话的标题与内容标签焦点、单行工具栏、控制台/变量切换、现有求值与程序输入、窄宽度及停止操作。 macOS验证明暗图标/禁用灰度、Console ANSI常规与亮色、1pt缩放及边界、嵌套折叠/展开/复制/源码链接、内容标签切换保留状态和400k字符范围性能。 检查首次启动/重新启动默认Console、暂停切换,以及13pt为22pt行高、折叠占位和字号改变后行高一致。 检查主工具栏运行/调试重启的绿色底与白色图标、停止红底、明暗主题、hover/按下与默认箭头光标,并验证原有启动/停止动作。 检查各会话状态均不在内容标签旁显示状态文字/圆点,暂停位置仍可跳转。 验证分块SGR、非法/超长CSI过滤、Logback时间/线程/级别/类名颜色及字重、折叠占位手形和展开后左侧9pt标记点击、原文复制及滚动/缩放。 检查收起标记展开、展开标记收起的完整往返及深浅主题资源。 验证内联输入的Enter/空行、发送失败保留、历史正文保护、输出追加与IME/光标保持、会话结束和切换、明暗主题、源码链接/折叠点击、求值与添加监视及历史菜单。 检查Debug标题/工具栏/线程选择/求值/变量监视/Console诊断条的共享1pt横线,线程变量及Performance拖动分隔线的深浅主题、收起恢复、hover与按住不变亮,并确认动作组短竖线和对话框保留各自共享样式。 Console六个左侧动作在明暗主题加载真实16pt SVG;上下箭头深色资源不回退浅色,禁用态只应用IDEA灰度一次,按钮hover复用Git Log共享入口。 Console折叠标记在真实NSScrollView中检查深浅主题实际像素与收起/展开往返点击;追加输出与滚动后折叠栏重绘,不能只验证锚点存在。 Threads & Variables核对线程/作用域菜单、13pt普通标题与代码内容、原始16pt明暗New UI图标、变量展开/加载/层级、求值/添加监视/刷新及灰度、占位/IME和焦点;暂停后的真实变量修改与求值保持原动作。 StatusText深浅主题像素检查居中、三分之一高度与文字行高;检查运行/暂停/终止、变量为空而监视非空、异常非空、线程切换/栈帧选择、Enter求值、添加监视/历史菜单;默认1:2与拖动后宽度、背景开关均保持。 Console上一处/下一处对相同URL的不同文字范围逐一导航、回绕及后退,替换输出后重置定位。 添加监视:空白求值输入禁用内联 Add to Watch,非空表达式点击后进入 Watches;下方+打开共享样式弹窗,检查新增/编辑初值、自动聚焦、共享输入边框和焦点环、中文输入法、空白禁存、Enter保存和Esc取消。 Watch新增和编辑不使用系统sheet;确认弹层从Watches的+锚定,无弹出动画,8pt共享外框及1pt边框,Enter保存、Esc和外部点击关闭,再次编辑显示正确初值。 Console源码导航在未定位时,首次下一处定位第一条、首次上一处定位最后一条;重复URL逐个范围遍历并回绕,输出替换且URL/范围相同时也重置位置。 主动Stop最后运行会话后保留Console日志及内容标签,停留Threads & Variables仍可切回Console;清空无错误的历史后恢复空状态。Console源码导航按钮在无链接→有链接→清空输出时正确禁用/启用,排队通知被新渲染覆盖或原生视图卸载后不得回写旧状态。 双Debug会话中A终端不可输入或绑定缺失、B终端可输入时,A Console必须禁用并拒绝发送给B;选中B后正常发送。超过400000字符时,前台及后台会话按完整SGR边界截断并恢复有效颜色和粗体,覆盖跨chunk、标准/256/真彩、重置及Unicode,缓存仍有界。 验证变量分页、异常信息、step filters、暂停/继续和 disconnect policy。 Windows验证DAP请求信封、初始断点先于launch入队、暂停线程与线程列表、继续后清空暂停状态、快速单步/失败回滚,以及并发Stop等待同一资源清理。macOS Debug 与 Run 复用 OutputTextView 的 IDEA 控制台入口,检查 13pt 字体、ANSI 明暗配色及源码链接高亮一致,不按日志级别给普通输出整行重新着色。 macOS:Run、Debug、Test 共用 OutputTextView/LitheConsoleStyle 默认字体、行高和日志等级色;纯文本及 Maven/Spring ANSI 日志的 INFO 标签均为绿色、WARN 黄色、ERROR 红色,正文及其他 ANSI 片段保留;检查明暗主题、复制、折叠与源码链接。 macOS多会话:startDebugging 子会话带父链接且不抢provider选择、子会话启动前重放已有断点、停止父会话同时停止子会话、功能模型清理子会话快照并回退选择;线程选择器会话分组缩进、状态圆点及单会话右键停止。Windows 暂无多会话实现。
共享 Rust Core 调试内核(#1210)新增能力快照与扩展注册表、停止代数与过期引用丢弃(旧停止下发出的 variables/evaluate 回复报 StaleReference,不再覆盖新停止的数据)、父子会话树及 v2 投影事件;macOS 已接入 startDebugging 子会话:宿主按父会话 Core ID 创建并关联子会话,启动前重放已保存的源码/异常/函数/数据断点,停父即停子;界面保持单会话标签,会话切换并入线程选择器的“会话”分组。Windows 未同步,多会话保持 pending。 Windows 真实调试产品链路仍在 #466 跟进。 本次Windows改动保留Core/JDT的DAP及Java目标所有权,仅修复前端事件、请求和资源生命周期;完整界面及跨平台验收保持pending。 macOS空状态按Community可见内容语义判断并复用Git Log文字度量;无内容时隐藏会话控件和工具栏,失败启动保留诊断与重试。配置链接复用Run面板,无独立选择快捷键时不显示快捷键。空状态标题栏沿用Git Log/Terminal的41pt高度、专用分隔线及标准IDEA图标按钮。 Debug标题栏移除重复配置选择器,统一使用窗口顶部入口。活动会话复用共享工具窗口标签、关闭按钮和图标按钮,调试操作与内容标签并排,去掉固定蓝底及局部状态胶囊;保留已有动作,不新增Spring专属功能。变量值/类型采用共享Debugger主题颜色,控制台复用原输出渲染器。 Debug图标按PlatformIconMappings切换New UI资源并按主题GrayFilter禁用;Console显式启用独立配色、ANSI色板与局部字号操作,支持保留8帧的长堆栈和默认内部行嵌套折叠,复制还原原文。个人折叠设置及完整stdout/stderr通道语义尚未移植。 启动与重新启动调试默认打开Console,暂停仍切线程/变量;正文与折叠占位统一按Console默认1.2行距和字体度量取整计算行高,13pt JetBrains Mono基准为22pt,字号变化同步重算。 主工具栏运行中按钮与停止按钮复用30pt共享入口,按Community RunWidget/Islands token绘制绿色/红色底及白色16pt描边图标;保留既有动作与可见条件。 Debug内容标签旁不再显示会话状态圆点与状态文字,保留暂停位置跳转。 输出区悬浮复制按钮仅显示图标,保留复制操作、悬停提示与可访问名称。 跳到最新输出使用Community ScrollToTheEndToolbarAction的New UI scrollDown明暗图标,复用共享图标按钮hover,无常驻背景和文字。 调试输出清理器跨分块保留有界SGR颜色/字重码,继续过滤OSC、光标/屏幕控制和非法CSI;日志时间、级别、类名按程序ANSI输出及IDEA色板显示。折叠文字hover手形,展开标记改为官方9pt Fold SVG在正文左侧绘制,不占原文宽度;标记命中与绘制仅查询可见字符。 收起与展开的Console多行折叠均显示左侧官方Unfold/Fold标记,点击同一折叠栏位置可展开和再次收起。 Console移除底部固定求值与标准输入栏。求值复用变量区已有入口,Enter执行并切Console查看结果,+仍添加监视,历史通过求值图标共享右键菜单访问。标准输入只在当前活跃会话可接收时作为原生控制台可编辑尾部,使用现有Console字体、配色和行高,无新增背景、边框或工具栏;日志正文只读。草稿跨输出刷新与页签切换保留,发送失败保留,成功清空,会话切换清理;生产者更新不打断IME。 Debug内容横线复用LitheToolWindowHeaderDivider;纵向边界统一toolWindowBorder,线程变量拆分复用Git Log的LitheSplitPaneView,避免原生HSplitView的独立边框外观。 Console动作栏补齐up/down深色资源,禁用图标复用IDEA GrayFilter并移除二次透明度淡化。 修复NSTextView正文绘制遗留裁剪导致左侧9pt折叠图标不显示;恢复图形状态后绘制官方SVG,并在输出及滚动时刷新可见折叠栏。原生像素回归修复前失败、修复后通过。 Threads & Variables移到Community New UI图标,内联添加监视用Debugger.AddToWatch;使用共享Tree文字/缩进/hover、StatusText提示和原生输入占位入口,保留多行变量及监视内容。 Threads & Variables线程选择标题和表达式输入前不再显示前导图标;线程菜单项图标保留,表达式历史通过已有添加监视按钮的右键菜单访问,输入框原生菜单不受影响。 调用栈默认三分之一;同类空提示复用StatusText普通字体/灰色及水平居中、三分之一高度;右侧只留一条状态提示,移除计数和三角求值按钮,无监视时隐藏刷新入口,Enter/历史/添加监视及已有数据操作保留。 监视表达式弹窗复用LitheSearchTextField/litheSearchField及共享主次按钮,移除原生roundedBorder和局部11pt输入样式;内联添加监视在空输入时禁用,避免静默无响应。 Watch编辑外层迁移到共享litheDropdown/LitheContextMenuPresenter,去掉系统sheet、额外内容底色和固定高度。 修正未定位状态的Console前进初始索引,保留后退和回绕逻辑;原生回归同时覆盖两个方向与输出替换。
运行与调试 / 调试器普通 TCP 调试适配器连接与有界生命周期
debug-tcp-transport
已实现
待验证
证据路径
macos/Sources/Lithe/Platform/MacOS/Debug/MacTCPDebugAdapterTransport.swift
macos/Sources/Lithe/Core/Rust/RustDebugTransportCore.swift
macos/Sources/Lithe/Platform/MacOS/Debug/MacExternalDebugAdapterTransport.swift
macos/Sources/Lithe/Platform/MacOS/Debug/MacHostedPortDebugAdapterTransport.swift
macos/Sources/Lithe/Views/Debug/ExternalDebugAdapterView.swift
macos/Sources/Lithe/Application/Features/ExternalDebugAdapterConfiguration.swift
macos/Sources/Lithe/Models/AppModel/AppModel+Debugging.swift
macos/Sources/LitheDebugModule/Runtime/DebugAdapterSessionManager.swift
macos/Tests/LitheTests/TCPDebugAdapterTests.swift
macos/Tests/LitheDebugModuleTests/DebugModuleTests.swift
.agents/notes/implemented/architecture/2026-10-27-debug-tcp-transport-lifecycle.md
macos/Sources/Lithe/Application/Features/ExternalDebugAdapterConnection.swift
未实现
不适用
证据路径
rust/lithe-core/src/debug/endpoint.rs
rust/lithe-core/src/debug/transport_lifecycle.rs
shared/fixtures/debug/adapter-endpoints-v1.json
shared/fixtures/debug/transport-lifecycle-v1.json
DebugmacOS:在有已安装调试提供方的源码文件上,从 Debug 更多操作打开连接调试适配器,填写已运行的 DAP 服务地址、launch/attach 与适配器参数。分别验证回环、IPv4/IPv6/DNS 外部地址、非回环默认取消的逐次确认、错误 JSON 与非法端点。确认 IDE 到 DAP 的地址不覆盖适配器到 debuggee 的地址,既有 stdio 与 tcpLanguageServer 回环限制不变。验证端点发现与建连两段独立超时(冷启动发现不缩短也不拉长建连)、被拒绝/不可达端口立即以系统原因结束、连接拒绝或 initialize 超时/未获批准/已有活动会话时对话框保持打开并保留已填内容,初始化完成后才关闭;取消等待只停止本次连接,不能误停后来选中的会话、当前文件无调试提供方时菜单项不可用、单个在途写入、字节/消息预算、写入超时、EOF、解析/建连/已连接时取消和旧回调隔离(含 Core 桥接失败清理后重新登记的连接);停止时断开帧最多排空 1 秒且 attach 的 terminateDebuggee 为 false,超时仍回收;停止后外部服务、共享 LSP、attach 目标与用户隧道仍存活。真实回环测试覆盖 Core initialize/attach 帧;真实 JVM/debugpy/GDB 和界面全链路仍待验收。Windows 未接入此 TCP 宿主。
复用 Apple Network 与 Rust DAP 引擎;连接生命周期(状态、代次、期限、队列预算、单个在途写入)由 Rust Core 的独立状态机持有,macOS 只做 NWConnection、解析与系统计时器并执行 Core 返回的效果,Windows 接入时复用同一状态机与 fixture 但尚无宿主 TCP 实现;用户端点独立于 attach 目标。入口复用当前文件的提供方索引,尚不发现仅附加或非文件型插件。仅直连,有可替换的连接工厂但没有代理、SSH、转发、凭据、自动重连、持久化配置或 tcpPort/tcpAnnounced 托管进程支持。运行时不写发行资源。 外部连接表单等待有界 DAP 初始化结果,取消按会话 ID 清理;send 桥接故障立即关闭连接,释放 Core 后换用新登记 ID,隔离旧代次和计时器回调。
运行与调试 / 调试器调试变量默认JSON与树形切换
debug-variable-json-view
已实现
待验证
证据路径
macos/Sources/LitheDebugModule/Application/DebugVariableJSONSnapshot.swift
macos/Sources/LitheDebugModule/Application/GenericDebugFeatureModel.swift
macos/Sources/Lithe/Views/Debug/DebugVariableJSONView.swift
macos/Sources/Lithe/Views/Debug/GenericDebugView.swift
macos/Tests/LitheDebugModuleTests/DebugVariableJSONSnapshotTests.swift
.agents/notes/implemented/feature/2026-10-14-debug-variable-json-view.md
macos/Tests/LitheTests/DebugJSONFoldingTests.swift
macos/Sources/Lithe/Views/Debug/DebugToolbarPresentation.swift
未实现
不适用
证据路径
windows/tauri/src/features/debugger
Debug暂停真实目标,确认默认JSON可选择和复制,Variables标题右端按钮切树并切回JSON,树展开状态保持;切换线程/帧/作用域、恢复运行或离开JSON时取消并拒绝迟到结果。验证多层对象、连续索引数组、重复引用、循环、长整数、字段失败、根分页及深度/节点/输出限制标记;深浅主题高亮、固定标题和Watches原操作。 验证JSON对象/数组箭头折叠、父子状态保持、更新后清空旧折叠、折叠后仍可复制完整快照及紧凑线程选择器。 实际拖动Watches分隔条、缩放窗口、Add/Edit Watch居中与取消保存;比较Console空/非空及主题和壁纸背景。 验证JSON展开/收起行hover显隐、跨行移动、隐藏时点击不折叠、键盘聚焦、拖动期间隐藏及布局不跳动。 深浅主题验证方法/行号颜色、同名去重、关闭源码名称恢复、内部类与不同类名保留。
复用DAP变量请求与已有共享字体、高亮器、图标按钮,不执行目标序列化或toString,不写运行时资源;JSON是带诊断标记的有界调试快照,不等同业务序列化。演示和单元测试不提升真实JVM全流程验收状态。 调用栈使用单行Regular共享列表样式,不固定显示普通帧图标;线程选择器右侧共享菜单切换源码名称,默认开启,开启后同一行居右显示灰色源码名称,左侧方法/类名为主文字色。移除Variables标题底线。 Variables/Watches共享纵向分隔器支持拖动和独立滚动;监视表达式表单相对窗口居中,Console背景跟随共享表面。 JSON折叠按钮按行hover显隐,固定占位、隐藏时禁用指针命中,键盘聚焦保留可操作;分隔条拖动期间隐藏。 移除工具栏跟随所选栈帧变化的位置文字,保留调用栈源码定位。 调用栈方法/行号使用共享编辑器语法色,右侧源码保持灰色;只去掉与可见Java源文件完全同名的尾部类名,关闭源码名称时恢复完整标签。
插件 / 插件界面插件声明原生树/列表、工具栏按钮及右键菜单,由宿主统一样式;数据与动作复用已有插件函数入口,保存稳定选择及展开状态,关闭/停用/替换时取消并拒绝晚到结果;ui 3 原生 schema 1;树/列表复用共享外侧留白与焦点外观,选中及悬停背景不贴面板边缘,保留键盘导航;同一停靠槽切换面板按贡献 ID 隔离会话,公共标题栏使用41pt高度、13pt Bold,纯文字且无标题图标、边框和底线;工具栏动作仅图标按钮,复用宿主图标、公共工具栏颜色及原生16pt动作资源,面板悬停或键盘/无障碍聚焦时显露;表单通过 input/select/checkbox 直接复用 IDE 公共输入框、下拉选择与复选框,支持初始值、禁用、提交和工作区内恢复,输入框悬停在未聚焦时即显示I形光标,按钮外观继续复用公共控件;表单支持1–12列栅格与控件span,宿主管理间距及窄面板单列回退;接入字段info、搜索、多行输入、分段选择、数字步进器及普通/主要按钮,文字动作使用#1422公共自然宽度与6pt间距;搜索统一完整入口,单行/密码及多行输入使用完整公共组件,MCP命令输入通过公共垂直输入保持1–3行自适应且Agent指令编辑保留外部焦点,禁用字段/动作的说明仍可用鼠标和键盘查看
declarative-native-plugin-ui
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Workbench/PluginNativeToolWindowView.swift
macos/Sources/Lithe/Application/Features/PluginNativeUIFeature.swift
macos/Tests/LitheTests/PluginNativeUITests.swift
shared/contracts/plugins/v1/fixtures/native-panel.plugin.json
macos/Sources/Lithe/Views/Components/LitheTreeList.swift
macos/Tests/Fixtures/native-ui-lab/plugin.json
macos/Tests/Fixtures/native-ui-lab/README.md
macos/Tests/Fixtures/native-ui-lab/native-ui-lab.test.mjs
macos/Sources/Lithe/Views/Components/LitheToolWindowHeader.swift
macos/Sources/Lithe/Views/Components/LitheToolWindowTabStyle.swift
shared/contracts/plugins/v1/fixtures/native-form.plugin.json
macos/Sources/Lithe/Views/Components/LitheSettingsControls.swift
macos/Sources/Lithe/Views/Components/LitheFormGrid.swift
macos/Tests/LitheTests/LitheFormGridTests.swift
macos/Sources/Lithe/Views/Components/LitheInfoTip.swift
macos/Sources/Lithe/Views/Components/LitheSearchField.swift
macos/Sources/Lithe/Views/Components/LitheActionButtonStyle.swift
shared/contracts/plugins/v1/fixtures/native-controls.plugin.json
macos/Sources/Lithe/Views/Components/LitheTextInput.swift
macos/Tests/LitheTests/LitheTextInputTests.swift
未实现
不适用
证据路径
shared/contracts/plugins/v1/README.md
Plugin Platform运行 PluginNativeUITests、PluginWebBridgeTests、WorkbenchContributionHostTests 和 UI Lab 验收测试(从外部 lithe-plugin-docs 显式取得 SDK);macOS 加载 sample-build 示例,刷新、选择、展开及右键 Inspect,验证键盘、浅深色、失焦、隐藏重开、停靠布局恢复以及停用/关闭过程取消;Windows 必须拒绝 ui 3,后续独立适配并验收。原生产品视觉验收 pending。 已在真实 DEBUG 预览中使用磁盘安装示例验证节点加载、展开、Inspect、右键动作、方向键及隐藏重开恢复;修复原生入口初始为空时未出现内容的问题,增加完整父容器挂载回归。完整浅深色、停靠及停用中取消验收仍 pending。 独立 native-ui-lab 验收插件覆盖静态/动态树与列表、左右及底部位置、空数据、600 项长数据、增删改序、动作/数据错误、重复 ID 拒绝和可取消慢动作;运行 Node 验收测试并从打包后的 vendored SDK 再跑一次。完整人工验收由配套 README 指引,仍为 pending。 同一停靠槽在动态树、静态树、列表与空面板间往返切换,确认正确释放窗口会话,不能出现 disabled or already registered;检查标题栏高度、文字、无图标/边框/底线和隐藏动作。 三面板同时挂载,分别隐藏/重开,再全部移除并重建;确认会话所有者销毁后登记清空,旧句柄的释放不影响后续会话。 分隔布局新面板先挂载、旧面板后释放时,同一窗口原子移交会话;旧释放不关闭新句柄,不允许跨插件覆盖登记。 检查原生动作 host 图标的深浅主题工具栏色、原生16pt动作资源和描边,刷新/通用执行兼容回退、面板内悬停显露与面板外隐藏,标题仅用于 tooltip/辅助功能名称。 表单验收:输入中文/Emoji、占位提示与回车提交,选择器键盘/鼠标与 Escape,复选框文字/键盘切换,三类禁用、执行中禁用、所有当前值传入既有函数、隐藏重开及工作区隔离、窄面板滚动和深浅主题;按钮声明复用公共样式。 栅格验收:宽面板每行两个字段,跨列布局能力正确对齐,窄于640pt内容宽度回到单列,变宽恢复;不丢字段值/焦点、不水平溢出,旧无layout表单保持单列。 0.3.0验收:提示悬停/固定/键盘、搜索输入/清空/回车、多行编辑与按钮提交、分段选择与数值边界、主次按钮正常/禁用和content/fill宽度、参数类型/恢复/忙碌/取消/错误;运行公共按钮深浅外框像素回归。 0.3.1验收:现有设置/市场/Git/数据库搜索和插件的完整公共入口一致,清空及外部焦点不回归,禁用输入/按钮和忙碌状态下i提示可悬停/点击/键盘打开,值和动作仍保持禁用。 0.3.2:主次文字按钮复用preview统一样式,实际28pt高度、无外圈留白、短/长文案自然增长和6pt动作间距;窄面板纵向排列;旧fill声明仍可加载但不能拉伸按钮。
扩展 / 插件与主题声明式插件契约 v1(插件不在宿主进程内运行代码),API 2 支持运行时启动、插件自带运行时、启动模板、具名宿主集成与宿主 UI;API 3 通过 requires 声明能力版本,Core 新增构建展示字段、语言导入配置与可选 ui 2 包内网页的校验契约,各平台宿主分别接入并声明支持
declarative-plugin-contract
已实现
待验证
证据路径
shared/contracts/plugins/v1
rust/lithe-core/src/plugins/declarative.rs
macos/Sources/Lithe/Core/Rust/RustDeclarativePluginOperations.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginPackageStore.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginStartupLoader.swift
macos/Tests/LitheTests/PluginPackageStoreTests.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginLanguageServerLaunchResolver.swift
macos/Tests/LitheTests/PluginLanguageServerLaunchResolverTests.swift
macos/Sources/Lithe/Core/Language/PluginLanguageProviderCatalogSource.swift
macos/Tests/LitheTests/LanguageProviderCatalogSourceTests.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchModuleUIRegistry.swift
macos/Sources/Lithe/Models/AppModel/AppModel+UIContributions.swift
macos/Tests/LitheTests/WorkbenchContributionHostTests.swift
macos/Sources/Lithe/Application/Composition/ModuleSessionCoordinator.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginUIIconLoader.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchContributionIcon.swift
macos/Tests/LitheTests/PluginUIIconTests.swift
macos/Sources/LitheApplicationKernel/Lifecycle/ModuleRuntime.swift
部分实现
待验证
证据路径
windows/tauri/src-tauri/src/plugin_host/mod.rs
windows/tauri/src-tauri/src/plugin_host/store.rs
windows/tauri/src-tauri/src/plugin_host/scan.rs
windows/tauri/src-tauri/src/plugin_host/launch.rs
windows/tauri/src-tauri/src/plugin_host/tests.rs
windows/tauri/src-tauri/src/plugin_host/install.rs
windows/tauri/src-tauri/src/plugin_host/settings.rs
windows/tauri/src-tauri/src/plugin_host/run_plans.rs
Plugins/win/Official/PhpSupportContract/plugin.json
windows/tauri/src-tauri/src/plugin_host/web.rs
windows/tauri/src/features/plugins/declarative-plugins-section.tsx
windows/tauri/src/features/plugins/declarative-plugin-launch.ts
windows/tauri/src/features/editor/lsp/resolve-editor-lsp-launch.ts
shared/contracts/plugins/v1/fixtures/invalid-manifests.json
shared/i18n/messages.json
windows/tauri/src/i18n/shared-i18n.test.ts
windows/tauri/src-tauri/src/plugin_host/lifecycle.rs
windows/tauri/src/features/plugins/declarative-plugin-ui.ts
windows/tauri/src/features/plugins/declarative-plugin-ui.test.ts
windows/tauri/src/platform/lsp-core-adapter.test.ts
ExtensionsAPI 3 共享契约:cargo test -p lithe-core --lib community_build_plugins、cargo test -p lithe-core --lib build_systems、cargo test -p lithe-core --lib declarative_plugins 及 scripts/architecture/verify-shared-contracts.sh,覆盖真实 Maven/Gradle 输出、构建 icon/presentation/category、build.languageImport 的插件选项映射和 ui 2 包内网页清单。Core 校验通过不代表平台宿主已实现;macOS 原生窗口/JDT 接线与可选 WKWebView 分别验收后才由宿主声明对应能力,Windows 仍待接入。macOS:安装 shared/contracts/plugins/v1/fixtures/invalid-manifests.json 中每类错误的包,确认插件管理显示对应错误且不注册模块;合法包启用、禁用无需重启;包内声明的语言服务器可执行文件缺失或为符号链接时拒绝安装;启动后 app bundle 文件清单不变(scripts/macos/verify/verify-runtime-bundle-immutability.sh)。API 2:安装 fixtures 中 node-runtime 形态的包,确认宿主发现满足最低版本的 node 并用它启动入口文件,版本过低的候选不被使用;语言服务器的状态写在 <app-support>/Lithe/PluginState 下而不是插件包内,卸载后该目录被删除。宿主能力:声明语言但未在 hostIntegration.capabilities 中列出运行、测试或调试、也未提供执行提供方的包,对应入口不可用且宿主不运行内置工具;列出后对应入口恢复。Windows:宿主 v0 已读取该契约(语言与语言服务器范围,按 hostCapabilities 门控),接入验收必须通过同一组共享 fixture,Windows 宿主测试已对 invalid-manifests.json 全量断言;Worker 扩展清单的迁移未完成,宿主 UI 仅完成文本和命令入口,不能用共享校验通过代替界面验收。 macOS API level 2:安装 Hello Lithe 数据包,确认工具窗口、命令面板、工具栏和菜单通过相同注册表显示;移动数据库与插件窗口、隐藏入口及重排后重启恢复;禁用插件后窗口和命令消失,重新启用保留位置与排序;无第三方原生代码载入。Windows UI adapter 仍缺停靠、图标和动作状态等对齐,不能用共享校验通过代替界面验收。 回归:声明与内置/应用动作冲突的合法包在启动时隔离并显示错误;正常退出保留已保存的窗口展开状态,用户主动隐藏才更新该状态;Agent 未启用时可移至底部并恢复入口;首次通过菜单打开 Services 会按需激活数据库。 macOS 图标:宿主语义 ID 与包内 SVG/PNG 在窗口入口、标题栏、工具栏、菜单和命令面板显示;模板着色与品牌原色、亮暗变体、选中/悬停/禁用沿用宿主规范;拒绝未知图标 ID、样式覆盖、包外路径、符号链接、脚本和外部引用;验证资源字节与 bundle 文件清单不变。 原生回归覆盖真实注册窗口标题栏、主工具栏活动/禁用状态、命令面板键盘选择及同一窗口亮→暗→亮切换;品牌图标不随选中着色,模板图标使用宿主选中文字颜色。 macOS 动作状态:确认窗口入口、工具栏、菜单与命令面板共用可用和勾选状态,激活中命令禁用且 Enter/鼠标均不能触发,窗口入口允许取消;同时打开同一插件的两个窗口只构造一次模块,取消其中一个不影响另一个;激活中禁用再启用,确认无资源残留或晚到贡献,旧动作引用不绕过状态校验。 API level 2 工具窗口初始位置接受 left/bottom/right,Rust 校验、macOS 解码及首次显示位置一致,用户保存布局仍覆盖默认声明。 Windows 安全回归:plugin_host::launch 的版本探测必须在父进程退出、后代继承管道时仍有界结束并清理进程树;web 回归验证真实文档来源与工作区文件目标。 Windows 语言资源整合:声明式插件的运行分组、管理页与安装审查使用共享生成词条;中英文回归验证安装名称/版本、程序数量和启停标签,并确认用户值中的占位符保持字面文本。 Windows 宿主修复回归:在 Core startServer 尚未返回时禁用插件,晚到会话必须先停止再拒绝;即时设置携带 pluginId,Core 接受并下推对应会话。缺失 requiredPackagePaths/runtimeRequirements 或 validationArguments 非零退出时拒绝启动。Hello Lithe 文本窗口、菜单、命令面板和工具栏可见,禁用后全部撤销;停靠、图标、动作状态及持久布局仍待接入,保持 partial。
Windows 宿主 v0 已接入契约 v1 的语言与语言服务器链路:plugin_host 模块负责包存储(app_local_data_dir 下的 plugins 与 plugin-state,bundled 从资源目录只读加载)、启动扫描(经 plugins.declarative.validate 携带 hostCapabilities {languages:1, languageServers:[1,2], serverProcess:1, settings:[1,2], ui:[1,2]},拒绝的包隔离并展示原因)、启动计划解析(packaged 入口固定在包内且拒绝 reparse point 与路径逃逸,runtime/systemCommand 走 PATH 与 LITHE_<TOOL>_PATH 约定),语言服务器会话仍由共享 Core 的 lsp.startServer 拉起;shared fixtures 的 invalid-manifests.json 全部 154 个用例在 Windows 二进制内断言同一稳定错误码。M2 已补磁盘安装链(快照、installReview 审批、staging、回滚)与最小管理界面;M3 已补声明式设置(settings/languageServers 2 能力声明,全局+项目级存储,immediate 效果经 workspaceConfiguration 下推)、运行/测试计划命令与契约版 PHP bundled 包(随安装器分发,validate/launch/runPlan 端到端测试覆盖)。M4 已补 Web 工具窗口(ui 能力声明提升为 [1,2]):lithe-plugin:// scheme 只服务启用包内普通文件(拒 reparse point、路径逃逸、超 16MiB),响应带 CSP(default-src none、拒 eval/联网/frame)与 nosniff/no-store;window.lithe 桥 v0 提供 context、ui.getState/setState(宿主持有,64KiB 上限)、workspace.openFile 与主题事件,build.*/functions.* 在 Windows 构建系统能力接入前返回 plugin.web.unknownMethod。尚未实现:Worker 扩展清单向契约迁移(Worker 版 PHP 提供 composer scripts 动态运行动作,契约无等价能力,完整迁移推迟;见 Note)、构建系统插件能力与多仓库源市场。决策与切分见 .agents/notes/implemented/architecture/2026-10-22-windows-declarative-plugin-host.md。 后续安全修复已补插件身份传递、运行中和待启动会话排空、跨窗口包变更确认、完整启动前检查及 ui 1 文本/命令入口;目前 WebView 仍为独立窗口,停靠位置、图标、动作状态及布局持久化未完成。
插件 / 插件管理声明式插件可以在 plugin.json 里声明用户可调的选项(整数、枚举、布尔),在“设置 › 插件”的插件详情页里编辑,值按插件保存一份并在下次启动语言服务器时代入启动模板;Java Support 首批提供 JDT LS 最大堆内存和日志级别
declarative-plugin-settings
已实现
待验证
证据路径
rust/lithe-core/src/plugins/declarative.rs
rust/lithe-core/src/lsp/languages/jdt.rs
macos/Sources/LitheCoreContracts/Plugins/DeclarativePluginContracts.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginSettingsStore.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginLanguageServerLaunchResolver.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginManager.swift
macos/Sources/Lithe/Views/App/PluginSettingsSection.swift
macos/Tests/LitheTests/PluginSettingsTests.swift
Plugins/mac/Official/JavaSupport/plugin.json
shared/contracts/plugins/v1/fixtures/node-runtime.plugin.json
部分实现
待验证
证据路径
windows/tauri/src-tauri/src/plugin_host/settings.rs
windows/tauri/src-tauri/src/plugin_host/tests.rs
windows/tauri/src/features/plugins/declarative-plugin-settings-editor.tsx
shared/contracts/plugins/v1/fixtures/settings-v2.plugin.json
windows/tauri/src/features/editor/lsp/resolve-editor-lsp-launch.ts
windows/tauri/src/platform/lsp-core-adapter.ts
windows/tauri/src/platform/lsp-core-adapter.test.ts
Plugin PlatformmacOS:打开设置 › 插件,选中 Java Support,切到“设置”页签,确认显示“最大内存”(默认 1024 MB)和“语言服务器日志级别”(默认全部消息)。把最大内存改成 3072:输入 3072 后点“重启语言服务器”,用 ps 查看 JDT LS 的 java 进程参数,确认 -Xmx3072m 且只出现一次;输入 100 时出现范围提示且没有保存,失焦后回到上一个合法值。把日志级别改成“仅错误”并重启,确认进程参数里是 -Dlog.level=SEVERE。点“恢复默认值”后重启,确认回到 -Xmx1024m 和 -Dlog.level=ALL。退出并重新打开 Lithe,确认修改过的值仍在。卸载并恢复 Java Support,值仍在。Windows:契约设置页与双层存储已接入,须完成下述实机验证。 Windows:启动契约语言服务器,修改 immediate 设置,确认 lsp.startServer 和即时更新都带独立 pluginId,已启动会话收到 workspace/didChangeConfiguration;禁用后旧会话不能继续接收。设置双层持久化和界面验收仍 pending。 Windows 两个窗口并发保存不同设置时,完整读改写事务必须保留两个修改;删除空文件也使用同一互斥,成功或失败后无临时文件残留。
工作区 / 项目浏览项目依赖与模块浏览
dependency-browser
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Workspace/DependencySidebarView.swift
macos/Sources/LitheLanguageIntelligenceModule/Services/LanguageToolingSessionManager.swift
macos/Tests/LitheLanguageIntelligenceModuleTests/LanguageIntelligenceModuleTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/maven
windows/tauri/src/features/sidebar
windows/tauri/src/features/maven/components/project-dependencies.tsx
windows/tauri/src/features/maven/utils/maven-module-operations.ts
windows/tauri/src/features/maven/utils/maven-module-operations.test.ts
windows/tauri/src/features/maven/components/project-dependencies.test.tsx
Workspace / Java打开 Maven 项目依赖和模块树,验证导航、刷新和空项目状态;在 macOS 打开 /tmp 或 /var 下的 Maven 项目,Java 服务就绪后依赖树由 JDT LS 的运行时 classpath 给出第三方 JAR,JDT LS 日志中没有 java.project.getClasspaths 的 NullPointerException。 Windows 在工作区子目录 backend 打开 Maven reactor,双击根模块与 service 模块的依赖,分别导航 backend/pom.xml 与 backend/service/pom.xml;同时检查根目录 reactor 和 WSL UNC 路径。
Windows Project 的 Dependencies 视图当前只读投影 Maven owner 的模块与依赖数据,打开和展开不触发解析,明确点击后才复用其解析、取消与重试;通用语言插件依赖快照、归档源码与虚拟文档浏览尚未同步,不将 Maven 投影视为这些能力的验证。 Windows Maven 面板和 Dependencies 使用同一 POM 路径解析,包含 project.relativePath,避免嵌套 reactor 打开工作区根下其他同名模块。
可观测性 / 诊断与日志模块日志筛选、限额与快照诊断包导出
diagnostics-export
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Diagnostics/DiagnosticsExportSheet.swift
macos/Sources/Lithe/Services/Diagnostics
macos/Sources/Lithe/Platform/MacOS/Logging/MacApplicationLogWriter.swift
macos/Sources/Lithe/Views/Diagnostics/ApplicationLogSettingsView.swift
macos/Tests/LitheTests/DiagnosticsWorkflowTests.swift
已实现
待验证
证据路径
windows/tauri/src-tauri/src/logging.rs
windows/tauri/src-tauri/src/diagnostics.rs
windows/tauri/src/features/settings/components/log-settings-panel.tsx
windows/tauri/src/features/settings/components/log-settings-panel.test.tsx
Diagnostics双端记录 language/git/run/performance 事件,按模块、当前/上次会话、级别、UTC 时间与文本筛选;确认诊断 15 分钟到期、过载不阻塞调用线程、日志受限额控制、目录切换后收集实际位置、嵌套与转义凭据不落盘;确认预览后修改源文件不改变导出快照,取消/失败清理暂存,并检查旧日志兼容与收集缺失计数。 验证自定义目录中无关的 lithe.*.log 不被收集或删除、刷新期间修改条件后按钮恢复、UTC 小数精度及等价时区边界正确、200 文件上限在模块/会话筛选后应用且遗漏明确标记。 两端从设置→工具→日志与诊断进入同一流程,核对中英文名称、顺序、实际诊断范围、清理全模块会话范围、目录/清理后刷新、预览条件冻结,以及取消/失败后按钮和快照恢复;原生 macOS 明暗页面与实际 ZIP 链路、Windows 前端界面交互分别验证。
可观测性 / 诊断与日志工作区诊断与问题面板
diagnostics-workspace
已实现
待验证
证据路径
macos/Sources/Lithe/Application/Features/DiagnosticsFeatureModel.swift
macos/Sources/Lithe/Views/Language/JavaProblemsView.swift
macos/Tests/LitheTests/ProblemsPanelPresentationTests.swift
macos/Tests/LitheTests/MonacoWorkbenchSessionLifetimeTests.swift
macos/Experiments/Monaco/workbench.integration.ts
macos/Sources/Lithe/Platform/MacOS/ProblemsDemo.swift
已实现
待验证
证据路径
windows/tauri/src/features/diagnostics
windows/tauri/src/features/logging
windows/tauri/src/ui/dialog.tsx
Diagnostics制造多个来源、多个文件的错误和警告,验证 Problems 的 File 随编辑器切换、关闭而更新,非文本编辑器显示打开文件提示,Project Errors 保留全部文件问题;检查无问题与严重程度过滤空状态,并按文件显示名称、路径和数量,紧凑问题行保留描述、行列和完整提示;在深浅主题及窄面板中检查标题、图标和悬停,并验证筛选、排序、定位和清除。检查左侧 View Options 与 Show Editor Preview;开启后单击及方向键更新右侧只读源码,双击和 Enter 定位主编辑器;拖动分栏、关闭再打开、切换文件和清空诊断,确认不抢焦点、不移动主编辑器 WebView、不接管保存屏障且会话随预览关闭释放。 在系统语言与应用语言不同时切换 English / 简体中文,检查 File、Project Errors、带文件名的空状态、过滤提示和预览失败文案跟随应用语言。 使用 Debug 的 --problems-demo,确认默认 File 显示 Main.java 的 8 条问题,切换 Project Errors 显示两个文件共 10 条问题;检查全部五种诊断级别、废弃与未使用标签、关联信息、长多行文案及 Unicode;点击后用上下键切换,确认只有行选择样式且没有列表外围蓝色焦点框,右侧不出现空查找浮层。退出后检查演示临时目录、进程清理,并比较 bundle 文件哈希不变。 检查 File 与 Project Errors 的全部级别图标使用 IDEA Community SVG,提示使用 intentionBulbGrey,未知级别使用 questionMark;在明暗主题核对对应变体。 文件分组复用 JavaFileIconResolver 显示类或接口图标;问题行的错误和警告使用 inspections 16×16 原始画布与内部留白,右上角统计继续使用 status 图标。 检查已有 Java 启动配置 sourcePath/mainClass 对应的文件显示原始 runnableMark 角标,普通类不显示;演示 Main.java 显示该角标。YAML 与 Java 类图标按主题加载上游明暗变体,application.yml 使用 YAMLFileType 的通用图标。 关闭源码预览后行选择背景仍保留,方向键选择离屏问题时列表自动滚动。 在文本文件、Agent Conversation 编辑器标签与原文本文件之间切换,确认 File 问题先清空再恢复;预览中不出现 Run/Debug 角标和动作,旧动作引用及原生 javaRunMarkerAction 不能启动进程。
运行与调试 / 项目运行Docker / Compose 项目识别与运行
docker-compose
部分实现
待验证
证据路径
macos/Sources/Lithe/Views/Run/RunConfigurationIcon.swift
macos/Sources/Lithe/Services/Java
已实现
待验证
证据路径
windows/tauri/src/features/docker
windows/tauri/src/features/run
Run / Docker使用 Dockerfile 和 Compose fixture 验证识别、命令参数、输出和进程停止;确认 macOS 是否只有入口识别。
编辑器 / 文本编辑键盘移动后优先撤销光标,并支持独立光标撤销与重做
editor-cursor-history
部分实现
待验证
证据路径
frontend/editor/src/editor-commands.ts
frontend/editor/src/workbench.ts
已实现
待验证
证据路径
frontend/editor/src/editor-commands.ts
windows/tauri/src/features/editor/engines/monaco/cursor-aware-undo.ts
windows/tauri/src/features/editor/engines/monaco/cursor-aware-undo.test.ts
windows/tauri/src/features/editor/components/monaco-editor.tsx
windows/tauri/src/features/keymaps/commands/editor-command-actions.ts
windows/tauri/src/features/keymaps/commands/command-registry.ts
windows/tauri/src/features/keymaps/defaults/default-keymaps.ts
windows/tauri/src/features/keymaps/hooks/use-keymaps.integration.test.tsx
windows/tauri/src/features/command-palette/constants/navigation-actions.tsx
EditorWindows 输入代码后误按向下箭头,第一次 Ctrl+Z 应回到之前的行列且内容和脏状态不变,第二次才撤销输入,再重做应恢复文本;通过 Ctrl+Z 或独立 Ctrl+U 恢复光标后,直接 Ctrl+Shift+Z 或 Ctrl+Y 应恢复移动,空光标历史不抢占文本重做。连续多次方向键后仅优先回退最近一次。核对 Ctrl+U/Ctrl+Shift+U、选区、多光标、滚动恢复、只读文件、空历史及继续编辑后清空光标历史;切换文件或分屏后不得恢复其他视图的选区。在命令面板搜索光标撤销/重做并执行,修改快捷键后确认生效,普通输入框、查找和终端保持原输入行为。macOS 原生按键与宿主命令入口需分别验收。
复用固定 Monaco 0.55.1 的 cursorUndo/cursorRedo;Windows 在键盘移动后第一次 Ctrl+Z 恢复最近一次光标移动,第二次撤销代码,光标恢复后可直接重做移动。文本或模型变化、鼠标/API 移动和视图失活清除待恢复状态。另提供命令面板、快捷键设置和 Ctrl+U/Ctrl+Shift+U 独立入口。macOS 已加载 Monaco 原生能力与共享动作映射,但未接入该策略和宿主命令入口,保持部分实现。
编辑器 / 文本编辑按指定编码重新打开文本文件
editor-file-encoding-reopen
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Workbench/WorkbenchView.swift
macos/Sources/Lithe/Views/Editor/StandaloneEditorView.swift
macos/Sources/Lithe/Application/Features/DocumentFeatureModel.swift
macos/Sources/Lithe/Platform/MacOS/FileSystem/MacDocumentEncoding.swift
已实现
待验证
证据路径
windows/tauri/src/features/command-palette/components/encoding-picker.tsx
windows/tauri/src/features/editor/services/document-encoding-workflow.ts
windows/tauri/crates/project/src/document_file.rs
Editor在 macOS 和 Windows 实机验证 UTF-8、UTF-8 BOM、UTF-16 LE/BE BOM 与 GBK/GB18030 的自动识别,并分别验证 UTF-16 LE/BE(无 BOM)、Big5、Shift JIS、EUC-JP、EUC-KR、Windows-1250/1251/1252、KOI8-R 的指定编码重新打开、编码转换保存、脏文件选择和外部修改保护。
编辑器 / 文本编辑按指定编码保存文本文件
editor-file-encoding-save
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Workbench/WorkbenchView.swift
macos/Sources/Lithe/Views/Editor/StandaloneEditorView.swift
macos/Sources/Lithe/Application/Features/DocumentFeatureModel.swift
macos/Sources/Lithe/Platform/MacOS/FileSystem/MacDocumentEncoding.swift
已实现
待验证
证据路径
windows/tauri/src/features/command-palette/components/encoding-picker.tsx
windows/tauri/src/features/editor/stores/editor-app.store.ts
windows/tauri/crates/project/src/document_file.rs
Editor在 macOS 和 Windows 实机验证 UTF-8、UTF-8 BOM、UTF-16 LE/BE BOM 与 GBK/GB18030 的自动识别,并分别验证 UTF-16 LE/BE(无 BOM)、Big5、Shift JIS、EUC-JP、EUC-KR、Windows-1250/1251/1252、KOI8-R 的指定编码重新打开、编码转换保存、脏文件选择和外部修改保护。
编辑器 / 排版代码编辑器可选择已安装的等宽编程字体族,未安装时回退到随包分发的默认等宽字体;macOS 编辑器字号下限为 8 pt
editor-font-family
已实现
待验证
证据路径
macos/Sources/Lithe/Views/App/SettingsView.swift
macos/Sources/Lithe/Platform/MacOS/UI/MacEditorFontCatalog.swift
macos/Sources/Lithe/Models/Settings/EditorFontDefaults.swift
macos/Sources/Lithe/Models/Settings/EditorFontCoverage.swift
macos/Sources/Lithe/Models/Settings/AppSettings.swift
macos/Sources/Lithe/Views/Components/LitheSettingsControls.swift
macos/Sources/Lithe/Platform/MacOS/MonacoWorkbenchEditor.swift
macos/Sources/Lithe/Views/Diff/RepositoryDiffView.swift
macos/Sources/Lithe/Views/History/LocalHistoryView.swift
macos/Sources/Lithe/Views/Git/BranchComparisonView.swift
macos/Sources/Lithe/Views/App/SettingsSearchVocabulary.swift
macos/Tests/LitheTests/EditorFontFamilyTests.swift
macos/Tests/LitheTests/SettingsSearchVocabularyTests.swift
macos/Tests/LitheTests/SearchableSettingsSelectTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/settings/components/tabs/editor-settings.tsx
windows/tauri/src/features/settings/components/font-selector.tsx
windows/tauri/src/features/settings/stores/font.store.ts
windows/tauri/src/features/settings/lib/font-family-resolution.ts
windows/tauri/src/features/settings/config/typography-defaults.ts
windows/tauri/src/features/window/hooks/use-font-loading.ts
windows/tauri/src-tauri/src/host.rs
Editor / SettingsmacOS:在未安装任何额外字体的机器上打开设置 → 编辑器 → 显示,确认「Font」下拉只列出等宽字体族且默认显示 JetBrains Mono;在装有兰亭黑(Lantinghei TC,系统可下载字体)的机器上确认下拉中不出现它;输入关键字过滤(例如 menlo)确认列表收缩且面板高度跟随行数变化,↑/↓ 移动高亮、Return 应用、Esc 关闭、点击空白处关闭;选择另一等宽字体后确认所有已打开编辑器(含分栏编辑器和搜索替换预览)立即换字并重新测量字宽,行号栏与横向滚动范围同步更新;在工作区 Diff 与历史提交 Diff 中确认代码与行号使用同一字体。打开「Font size」步进器确认下限为 8 pt,可从 9 减至 8 且 8 时减号禁用;增加至 9 后重新减小确认不会低于 8。确认 8 pt 下设置预览、主/分栏 Monaco 编辑器及 SQL 编辑器显示正常。关闭设置重开及重启应用后确认字体族选择保留,恢复默认后回到 JetBrains Mono。把已选字体移出系统字体目录后重开应用,确认编辑器回退到 JetBrains Mono 且设置项显示原族名并呈不可用样式,重新安装字体后再次生效。缺字回退:选一个不含中文的拉丁字体并在中文界面输入中文,确认编辑器、Diff 与完整搜索预览仍正常显示中文(由打包字体与系统级联提供),设置页 Font 行下方出现「该字体不包含中文字符」提示;换成随包默认 JetBrains Mono 时提示消失;再选一个用 CoreText 判定缺标点或符号的旧 GBK 字体,确认提示点名对应字符组,且源码里的标点仍能显示。切换明暗主题,并输入中文确认系统回退字形正常。比较安装包 Fonts 目录清单与 SHA-256,确认枚举与选择过程不修改已签名 bundle。Windows:进入设置 → 编辑器,确认字体族选择器只列出等宽字体,选择后编辑器即时更新并在重启后保留,未安装的配置值回退到默认等宽字体。在未额外安装字体的机器上确认等宽下拉里出现内置的 JetBrains Mono 与 Geist Mono,选择 JetBrains Mono 后编辑器即时换字。
macOS 只列出等宽字体族,是否等宽只按实测 `i`/`W`/`0` 的字宽判断,不信任字体声明的 monoSpace trait(兰亭黑 Lantinghei TC 声明了该 trait 但拉丁字形是比例宽度),默认是随包分发的 JetBrains Mono,因此未改过设置的用户与旧版本渲染一致;终端、Output 工具窗、提交信息输入框和搜索结果里的 Before/After 小片段继续使用打包字体,与 IDEA 的 Editor/Console 字体分工一致;搜索的完整源码预览会跟随所选族,Agent 上报 Diff 弹窗因宿主刻意不依赖环境而保留打包字体。所选字族缺字时打包字族是第一回退:网页侧发 `"所选族", "JetBrains Mono", monospace` 字体栈,原生侧给非打包字族加打包字体描述符开头的级联表;打包字体也没有的字形继续走系统级联。设置页在所选字族缺少界面所需字符组时给出提示(打包默认字族豁免,要求集按界面语言取基本拉丁字母+界面标点,中文界面额外要求中文)。族名一律用带默认值的参数逐层传入,不给叶子 Diff 视图新增必需的环境对象。等宽限定同时保证原生 Diff 的单字符宽度度量仍然成立。存储值只保存族名,字体被卸载或重命名时由字体目录回退到默认族,设置项仍显示用户原值以便重新安装后恢复;字体枚举只在进程内内存中缓存且不失效,故新增字体需重启应用,不写入已签名安装包。Windows 默认等宽字体仍是 Geist Mono,并通过 validate_font 校验配置值;Windows 另外随包分发 JetBrains Mono 作为可选的内置等宽字体族(web 字体、选择器内置列表、无桥回退目录),默认族不变。
编辑器 / Git 变更行号及左侧 gutter 区域右键打开精简菜单:未注释时 Annotate with Git Blame,已注释时 Close Annotations、Show Diff(打开该行提交的单文件 diff)、Copy Revision Number;点注释打开 Git Log 并选中该提交;编辑器内容区右键的 Git 子菜单提供 Annotate、Show Diff、Copy Revision Number 与 Show Line History;注释每行标注,先日期(yyyy/M/d)、两个空格、后作者,标签贴注释列左侧、行号保持右对齐,列宽按最长标签自适应(12–26 字符,中文按双宽计算);非仓库及未跟踪文件不显示入口;已有断点的行号右键只打开同一菜单,断点编辑必须显式选择
editor-git-blame-menu
已实现
待验证
证据路径
frontend/editor/src/workbench.ts
macos/EditorFrontend/main.ts
macos/Sources/Lithe/Platform/MacOS/MonacoWorkbenchEditor.swift
macos/Sources/Lithe/Models/AppModel/AppModel+EditorIntelligence.swift
macos/Experiments/Monaco/workbench.integration.ts
macos/Tests/LitheTests/MonacoEditorContextMenuTests.swift
已实现
已验证
证据路径
windows/tauri/src/features/git/utils/git-blame-gutter.ts
windows/tauri/src/features/git/utils/git-blame-gutter.test.ts
windows/tauri/src/features/git/stores/git-blame.store.ts
windows/tauri/src/features/git/stores/git-log-reveal.store.ts
windows/tauri/src/features/git/hooks/use-git-blame.ts
windows/tauri/src/features/git/utils/open-commit-diff-buffer.ts
windows/tauri/src/features/git/components/log/git-log-tool-window.tsx
windows/tauri/src/platform/core-result-adapter.ts
windows/tauri/src/features/editor/components/monaco-editor.tsx
windows/tauri/src/features/editor/context-menu/editor-context-menu-items.tsx
windows/tauri/src/features/editor/context-menu/gutter-context-menu.tsx
windows/tauri/src/features/editor/styles/monaco-editor.css
windows/tauri/src/features/keymaps/utils/readonly-diff-clipboard.ts
Editor / GitmacOS:打开已跟踪文件,行号区右键开启及隐藏 Git Blame;检查作者、日期、提交点击与栏宽恢复。检查深浅主题、中文菜单、分屏、只读已跟踪文件,以及非仓库、未跟踪文件入口禁用。菜单打开后切换或关闭文档,旧动作不能作用到新文档。运行 scripts/macos/probe/probe-macos-monaco.sh --workbench-tests 验证真实 WebKit 命中、动作、模型生命周期和选区/撤销保护;完整产品 Git 数据链路另行实机验收。 在已有断点的 Java 行号上执行完整 mousedown/mouseup/contextmenu 右键序列,打开菜单不能触发断点编辑;仅点击编辑断点时发送该行请求。检查切换文件后的旧编辑动作失效。 Windows:在已跟踪文件的任一 gutter 列(行号、变更标记、字形边距)右键,确认弹出的是只含 Annotate/Close Annotations、Show Diff、Copy Revision Number 的精简菜单(不是完整编辑器菜单,也没有行历史),开启后每行都显示「yyyy/M/d 作者」(日期与作者之间两个空格),标签贴注释列左侧、行号仍右对齐,且列宽随最长标签自适应而非固定宽度,栏宽随之加宽并在隐藏后恢复;在编辑器内容区右键确认 Annotate/Show Diff/Copy Revision/行历史都在 Git 子菜单内;点注释确认打开 Git Log 并选中该行提交(含需要向前翻页的旧提交),并在 Show Diff 打开的只读 diff 中分别选中左右两侧文字执行 Ctrl+C 确认可复制;对未提交行、未跟踪文件、非仓库文件和只读预览确认入口不出现或无反应。检查深浅主题、中文界面、行号 off/relative 两种设置、分屏同时开启两个文件互不影响、提交后注释自动刷新而不是关闭。运行 bun test src/features/git/utils/git-blame-gutter.test.ts src/features/editor/context-menu/gutter-context-menu.test.tsx 与 bun run typecheck,并在 Windows 实机核对完整链路。 2026-10-30 已在 Windows 实机验收通过(行号区右键精简菜单、每行 yyyy/M/d 作者 注释与自适应列宽、点注释跳转 Git Log、Show Diff 左右两侧复制、未跟踪/只读预览不出现入口)。
沿用已有 GitFeatureModel.loadBlame 和作者/提交展示;共享编辑器只在宿主显式启用 gitBlameMenu 时添加入口,Windows 现有 Blame 能力不受此入口开关影响。 Windows 侧与 IDEA 对齐:注释由 Monaco 行号格式化器输出 HTML 渲染在行号左侧,每行都标注而不按提交块合并,标签先日期(yyyy/M/d,与 macOS 一致、不补零)后作者、中间仅一个空格,标签贴注释列左侧、行号保持右对齐,可见性按文件存放在 git-blame store(原来的全局 enableInlineGitBlame 设置已删除),只有开启注释的文件才读取 git.blame;点注释把提交交给 Git Log 并选中(git-log-reveal store 传递请求,日志按页向前加载直到找到该提交,上限 20 页),Show Diff 仍复用 openCommitDiffBuffer 打开带路径限制和定位范围的单文件 diff。行号区右键为独立精简菜单(只含注释与提交动作,行历史移入内容区菜单的 Git 子菜单);内容区菜单新增 Git 子菜单承载 Annotate/Show Diff/Copy Revision/行历史,图标使用作者语义的用户图标。行号被 diff 编辑器重映射或为虚拟/预览缓冲时不渲染注释,避免行号与实际内容错位。 Show Diff 打开的是只读 diff,其左右两侧的 Ctrl+C/Ctrl+X 由 Monaco 原生处理(diff 根节点带 data-readonly-diff,编辑器 keymap 不再拦截),否则会复制源编辑器模型的空选择。
编辑器 / Git 变更编辑器 Git 行变更标记、点击预览与变更导航
editor-git-gutter-peek
已实现
待验证
证据路径
macos/Sources/Lithe/Platform/MacOS/MonacoWorkbenchEditor.swift
frontend/editor/src/workbench.ts
已实现
待验证
证据路径
windows/tauri/src/features/editor/engines/monaco/git-gutter-controller.ts
windows/tauri/src/features/editor/engines/monaco/git-gutter-peek-widget.ts
windows/tauri/src/features/git/utils/git-gutter-changes.test.ts
Editor / Git在 Windows 打开已跟踪文件,新增、修改、删除内容并保存,点击标记查看差异、切换前后变更、按 Escape 关闭;确认多仓库同名文件互不影响。切换浅色、深色及自定义主色,检查面板边框、焦点和 Git 语义色;关闭 Git 标记设置后标记消失。macOS 检查对应行变更入口。Linux 单元测试不替代目标平台运行验证。
编辑器 / Git 变更设置中开关编辑器 Git 变更标记
editor-git-gutter-setting
平台专属
不适用
证据路径
macos/Sources/Lithe/Platform/MacOS/MonacoWorkbenchEditor.swift
frontend/editor/src/workbench.ts
已实现
待验证
证据路径
windows/tauri/src/features/settings/components/tabs/git-settings.tsx
windows/tauri/src/features/settings/config/default-settings.ts
Editor / GitWindows 默认显示 Git 变更标记;在 Git 设置中关闭时清除标记和预览,重新启用后恢复,重启后保留选择。此项记录 Windows 新增的独立开关。
编辑器 / Git 变更从编辑器行变更入口暂存单处修改
editor-git-gutter-stage
已实现
待验证
证据路径
macos/Sources/Lithe/Platform/MacOS/MonacoWorkbenchEditor.swift
frontend/editor/src/workbench.ts
已实现
待验证
证据路径
windows/tauri/src/features/git/services/git-gutter-actions.ts
windows/tauri/src/features/git/utils/git-gutter-changes.test.ts
Editor / Git保存含多处增删改的已跟踪文件,单独暂存后一处修改,检查 index 只包含选中修改,邻近与前方未暂存修改保留;未保存或只读时禁用暂存。Windows 与 macOS 均需实机验证。
编辑器 / 排版所有项目的源码编辑器共享字体、字号、行间距、高亮配色和常用显示偏好,修改后即时生效并持久化
editor-global-appearance
已实现
待验证
证据路径
macos/Sources/Lithe/Models/Settings/EditorAppearanceSettings.swift
macos/Sources/Lithe/Models/Settings/AppSettings.swift
macos/Sources/Lithe/Views/App/SettingsView.swift
macos/Sources/Lithe/Platform/MacOS/MonacoWorkbenchEditor.swift
frontend/editor/src/theme.ts
frontend/editor/src/workbench.ts
macos/Tests/LitheTests/AppSettingsTests.swift
macos/Tests/LitheTests/MonacoWorkbenchThemeTests.swift
macos/Experiments/Monaco/workbench.integration.ts
frontend/editor/themes/vscode.json
frontend/editor/themes/idea.json
frontend/editor/src/textmate-grammar.ts
frontend/editor/src/semantic-tokens.ts
部分实现
待验证
证据路径
windows/tauri/src/features/settings/types/settings.types.ts
windows/tauri/src/features/settings/components/tabs/editor-settings.tsx
windows/tauri/src/features/editor/engines/monaco/use-monaco-editor-settings.ts
windows/tauri/src/extensions/themes/theme-loader.ts
frontend/editor/themes/github.json
frontend/editor/themes/one.json
Editor / Settings自动化:运行 AppSettingsTests、MonacoWorkbenchThemeTests、SettingsSearchVocabularyTests,以及 scripts/macos/probe/probe-macos-monaco.sh --workbench-tests,检查持久化、逐字段坏值回退、恢复默认、双外观词法/语义配色、已有与新建分栏选项、模型/光标/撤销历史保留,以及隐藏行号后的断点图标、已有断点/空白行点击与相对行号恢复。产品验收:在中文和英文设置中检索行间距、配色、空白符和光标;在深浅外观及多个项目中逐项切换,检查主编辑器、分栏、独立窗口和完整源码预览实时更新。检查 6/72 字号与 1/3 倍行间距边界、键盘选择、窄设置窗口滚动、关闭设置与重启后的恢复,以及恢复默认。完整产品 UI 验收和 Windows WebView2 验收仍待完成;组件和 WebKit 探针通过不替代这些验收。
macOS 在既有字体、字号、软换行、缩略图设置上增加独立 Lithe/GitHub/One 高亮方案、注释斜体、字体连字、行间距、绝对/相对/隐藏行号、空白符模式、缩进引导线、当前行高亮、括号着色、固定作用域标题、滚动及光标偏好。配色自动适配界面明暗但不改界面主题。行间距为字号倍数,0 保留 Monaco 自动值;新字段逐项回退,旧设置保持默认渲染。作用于主编辑器、分栏、独立文件窗口和完整源码预览。原生 Diff、SQL 控制台、终端和结果行片段保留各自排版。本次不实现外部 IDE 检测和配置导入。Windows 已有多数选项与主题体系,尚未对齐独立源码配色选择;GitHub/One JSON 仅移到共享编辑器目录,Windows 内容与行为不变。 macOS 隐藏行号仅隐藏数字,保留断点图标与空白行的可点击断点区域,已有及新建分栏一致。Git 作者栏保留相对或隐藏行号,样式变更重新安装作者栏,关闭作者栏和切换标签后恢复所选行号模式。 新增 VS Code 当前默认 Dark/Light 2026 与 IntelliJ IDEA Islands Dark/Light 代码配色,按官方固定提交映射通用词法和语义角色,保留声明/调用差异;不加载外部配置。 彩色配对括号归属语法高亮方案,移除手动开关及旧持久化覆盖;IDEA 关闭,其余内置方案启用。语法高亮分组只读显示方案状态。IDEA 的 Java 词法方法名使用正文色,语义层保留 declaration/static 标记,区分普通声明、调用与静态方法。
编辑器 / Git 变更Windows 行尾 Git Blame 默认关闭;开启后仅在文件本身或提交历史变化时刷新,刷新期间保留旧注释,不随 .git/index 改写闪烁
editor-inline-git-blame
未实现
不适用
证据路径
macos/Sources/Lithe/Platform/MacOS/MonacoWorkbenchEditor.swift
已实现
待验证
证据路径
windows/tauri/src/features/git/stores/git-blame.store.ts
windows/tauri/src/features/git/hooks/use-git-blame.ts
windows/tauri/src/features/git/runtime/git-metadata-watch-host.tsx
windows/tauri/crates/project/src/git_watcher.rs
windows/tauri/src/features/settings/config/default-settings.ts
windows/tauri/src/features/git/stores/git-blame.store.test.ts
windows/tauri/src/features/git/hooks/use-git-blame.test.ts
Editor / GitWindows:新安装时行尾 Blame 关闭;在设置中开启后打开大型 Maven 项目,导入期间(工具频繁改写 .git/index)行尾注释不闪烁、不重复执行 git blame;保存文件、提交、切换分支后注释更新且更新前保留旧注释。未提交行显示本地化的“未提交的更改”。已保存过开关的老用户保持原值。
macOS 没有行尾 Blame,只有行号区菜单入口(见 editor-git-blame-menu)。
编辑器 / 文本编辑语法高亮与编辑器模型、关闭或切换模型后丢弃过期符号高亮回调
editor-language-basics
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Editor
macos/Sources/Lithe/Models/Editor
macos/Sources/Lithe/Platform/MacOS/MonacoWorkbenchEditor.swift
macos/Sources/Lithe/Platform/MacOS/MonacoDocumentMessage.swift
macos/Experiments/Monaco/workbench.integration.ts
frontend/editor/src/word-highlight-lifecycle.ts
macos/Sources/Lithe/Views/Editor/CodeEditorPalette.swift
macos/Sources/Lithe/Views/Editor/EditorAreaView.swift
macos/Sources/Lithe/Models/Editor/EditorDocument.swift
macos/EditorFrontend/index.html
macos/EditorFrontend/main.ts
macos/Resources/IDEAIcons/expui/actions/runAll.svg
macos/Tests/LitheTests/EditorTabLayoutTests.swift
macos/Resources/IDEAIcons/expui/nodes/junitTestMark.svg
macos/Tests/LitheTests/EditorSyntaxHighlighterTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/editor
frontend/editor
windows/tauri/src/features/editor/engines/monaco/theme.ts
frontend/editor/src/word-highlight-lifecycle.ts
windows/tauri/src/features/editor/engines/monaco/model-position-resolver.ts
windows/tauri/src/features/editor/engines/monaco/model-position-resolver.test.ts
Editor分别打开 Java、Markdown 和普通文本,确认语言识别、语法高亮和模型切换;开启缩略图并滚动,确认滚动条轨道不透出编辑器代码。macOS 运行 scripts/macos/probe/probe-macos-monaco.sh --workbench-tests,验证原生关闭文档后到达的 Monaco 焦点和光标消息取消,主视图和分屏切换后不出现同步失败红条,其他文档仍可编辑并完成同步;已关闭文档的文本编辑与保存请求仍必须拒绝。真实产品另检查关闭文件、关闭搜索预览、删除文件后的文档切换及未保存输入保护。 原生探针捕获真实 Monaco 高亮回调,先在存活视图产生查询,再关闭主视图、分屏或差异视图,显式执行旧回调,确认没有空模型 URI 异常、存活文档仍可编辑且文本不变。升级固定 Monaco 版本时复核兼容钩子并运行三个回归;Windows 另在 WebView2 验证。 macOS Lithe 深色行号为 #4B5059,当前行为 #A1A3AB,行号为普通编辑字体小1pt且跟随字号设置。打开含 main 的 Java 文件确认标签原始类图标右上角显示 runnableMark,普通类和仅测试类不显示,删除 main 后更新;用现有 JDT Run marker 响应驱动,不增加语言服务请求。 macOS 编辑器边栏从左到右为行号、运行/导航标记;主方法使用原始16pt IDEA 描边 Run SVG 与明暗变体,断点在行号区显示并保持原点击调试请求。真实 WebKit 检查图标位置及引擎命中区域。Windows 未开启 lineNumbersFirst。 行号后及动作后留白均4pt,折叠按钮单独占16pt槽,原始9×9 IDEA fold/unfold SVG 保留明暗颜色与1pt描边;实际点击折叠/断点和运行图标互不串联,不影响差异审阅布局。 测试类未运行状态使用 IDEA 原始16pt Run All 明暗描边图标,测试方法和结果状态语义保持不变。没有导航标记时收回空导航槽,运行控件和折叠控件之间为4pt;导航标记出现、主题配置及切换文件后槽位仍正确。 普通行号栏按实际行号字体与最大行号位数计算,最低16pt用于断点,不固定预留5位;验证9/99/100/1000行增长及缩回、字体字号变更、分屏独立宽度,Git blame 维持注释空间并能恢复普通栏宽。 Java 测试文件标签在类图标右上角显示原始 IDEA JunitTestMark 红绿角标;测试与 main 共存时测试优先,移除测试或改为非 Java 后撤销,主方法与普通文件逻辑不变。由已有 JDT Run marker 响应驱动,不通过文件名推测测试。 macOS Lithe 深色结构线普通色 #323438、高亮色 #4E5157;仅光标紧邻多行代码块配对花括号时显示对应高亮线,块内普通语句、文本选择及字符串或注释中的括号不触发,分屏各自独立。原生 WebKit 回归覆盖实际引导线颜色、嵌套块与配置更新;完整产品视觉验收仍 pending。 macOS 普通行号列左偏移8pt(4pt空注释区+4pt间隔),数字列宽仍按实际字体和位数计算,断点不额外计入左偏移;真实WebKit验证9/99/100/1000行、字号/字体、分屏、运行/折叠命中和Git blame恢复,行号至Run仍4pt,未出现额外右侧空槽。 macOS软换行开关移入WebKit的标准HTML按钮,移除原生覆盖层的光标竞争;保留共享22pt外观、SVG、选中/禁用、查找栏隐藏及原设置持久化,真实WebKit验证完整命中区域均pointer、点击桥接与选区保持,缩略图开关后位置正确。 普通快速修复提示采用IDEA原始16pt intentionBulb明暗SVG,覆盖代码区与gutter位置,保留原Monaco动作和菜单。 macOS Java 首次打开文件时默认折叠至少两条 import/static import,Java 服务准备期间也可用;类体与方法默认展开,手动展开后切换标签保持展开,单条导入不折叠。复用 Core Java structure 和 Monaco foldingImportsByDefault,真实 WebKit 检查可见折叠状态与源码不变,Swift 检查 Core 范围;Windows 未启用。 macOS Java 主编辑区和分屏初次附加模型时,等待 Monaco 初始折叠与视图状态恢复再显示内容,避免展开导入区随后收起的闪动;无固定延时。真实 WebKit 用受控 folding provider 验证计算期间不呈现展开代码、完成后首个可见状态已折叠。 Java TextMate 注释分隔符 punctuation.definition.comment 映射为 comment,斜杠与正文同色;WebKit 深浅主题验证行/块/文档注释前景色与 token 类型一致,除法运算符不受影响。 Windows 连续打开超过 8 个文件以触发表面复用,随后在新文件执行重命名、查看参数提示和 Code Lens;延迟加载结束后与切换为较短文件后定位均正确,旧模型释放或解绑时不返回旧位置。
macOS 对已关闭文档的过期焦点、光标和工具请求返回取消,避免锁住其他文档;文本增量、保存和缺失 ID 的非法消息仍失败。原生 WKWebView 回归直接编译生产消息策略,覆盖主视图与分屏的关闭顺序,Windows 独立宿主不改;完整产品与 Windows 实机验收仍 pending。 共享高亮生命周期钩子绑定上游实例的原模型,模型关闭或切换后不再执行旧回调;保持上游符号计算、同步失败保护与完整验收 pending。 Windows 编辑器表面复用时,浮层位置解析按调用时当前绑定的模型读取,覆盖初次加载、模型切换及解绑;自动回归不替代 WebView2 产品验收。
编辑器 / 文本编辑macOS 中文组合输入层遮住原文字,输入和删除候选文字时不透出整行重影
editor-macos-ime-presentation
已实现
待验证
证据路径
macos/EditorFrontend/ime-input.css
macos/EditorFrontend/main.ts
macos/Experiments/Monaco/ime-input.integration.ts
平台专属
不适用
证据路径
windows/tauri/src/features/editor/components/monaco-editor.tsx
Editor运行 scripts/macos/probe/probe-macos-monaco.sh --workbench-tests。在 macOS 使用系统拼音与微信输入法,在含中文和英文的同一行中间输入、删减候选拼音、确认上屏,再按删除键;检查整行无重影、候选与光标正常、撤销恢复文本。覆盖明暗主题、背景图开关和分屏,结束输入后背景恢复。
修正 macOS 原生主题半透明当前行底色作为 Monaco 输入法覆盖层底色时的字形透出。Linux Chromium 的真实 Monaco 组合事件样式回归通过;macOS 原生输入法及删除键实机验证待完成。Windows 不加载此 macOS 样式。
编辑器 / 文本编辑多行标签与标签导航
editor-multiline-tabs
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Editor
macos/Tests/LitheTests/EditorTabOrderFeatureModelTests.swift
macos/Sources/Lithe/Views/Editor/EditorTabFrameStore.swift
已实现
待验证
证据路径
windows/tauri/src/features/tabs
Editor打开足够多文件触发多行标签,确认滚动、切换、关闭和活动文件保持。 单行和多行文件、媒体与 Repository Diff 复用固定标签栏坐标手势,原生窗口按下/移动/松开检查 .gitignore 与 Diff 双向跨行重排;终端跨工具窗口仍使用原生载荷。 普通文件/媒体/Repository Diff 共用独立浮动标签预览,可沿两个方向离开标签栏再返回;移除蓝色插入竖线,以原尺寸圆角占位表示落点,临时显示重排在松开时才提交。单/多行核对无裁剪、90% 预览、原字型图标、Esc 后同次拖动不重启、栏外释放恢复顺序,结束/卸载清理窗口及事件监视器;原生组件验证不替代完整工作区验收。 标签拖动开始、换位、松开与取消直接完成,无透明度渐变/弹簧;原生浮动窗口禁用系统动画,事件回归使用未额外屏蔽动画的测试宿主。 从标签上边缘而非中心抓取,在标签栏上缘返回并松开,真实鼠标位置决定栏内外及跨行落点;单行/多行及文件/Repository Diff 双向重排均通过原生事件回归。
编辑器 / 文本编辑鼠标与触控板点击、选词和拖选
editor-pointer-selection
已实现
待验证
证据路径
macos/EditorFrontend/main.ts
macos/EditorFrontend/mouse-input.ts
macos/Experiments/Monaco/mouse-input.integration.ts
已实现
待验证
证据路径
windows/tauri/src/features/editor/components/monaco-editor.tsx
EditormacOS 分别启用微信输入法和系统 ABC,快速轻点不同位置后松手移动,确认不扩展选区、不移动文字;验证同位置双击选词、Shift 点击扩选、按住拖选、选中文字拖放、主编辑器和分屏及 diff。运行 scripts/macos/probe/probe-macos-monaco.sh --workbench-tests;Windows 验证同样的正常鼠标交互。
macOS 在宿主修正 WebKit 零按钮按下事件,保留 Monaco 选择语义。Linux Chromium 真实 Monaco 控制事件回放通过,仍待 macOS 微信输入法与 Windows WebView2 实机验证。
编辑器 / 界面样式编辑器滚动条与文件树一致的细圆头样式
editor-scrollbar-style
平台专属
不适用
证据路径
.agents/notes/implemented/feature/2026-10-02-macos-shared-scrollbar.md
已实现
已验证
证据路径
windows/tauri/src/features/editor/components/monaco-editor.tsx
windows/tauri/src/features/editor/notebook/notebook-code-cell-editor.tsx
windows/tauri/src/features/editor/styles/monaco-editor.css
windows/tauri/src/features/editor/config/constants.ts
windows/tauri/src/styles/scrollbars.css
EditorWindows 深浅主题下打开超出视口的文件,核对主编辑器与 Notebook 代码单元的 Monaco 滚动条为约 5px 圆头滑块、11px 轨道,颜色与文件树滚动条一致;hover 与按下的颜色变化一致,横向滚动条同样生效。提交差异预览(统一与拆分视图)保留其自有滑块与变更标记轨道设计,不在本条目对齐范围。真实 WebView2 深浅主题下已核对。
macOS 编辑器滚动条走 WebKit/Monaco 默认外观及 macOS 共享滚动条体系(见 macos-shared-scrollbar-style),不随本条目对齐。
编辑器 / 文本编辑LSP 语义高亮
editor-semantic-highlighting
已实现
待验证
证据路径
macos/Sources/Lithe/Models/AppModel/AppModel+LanguageEditing.swift
macos/Sources/LitheLanguageIntelligenceModule/Runtime/LanguageServerSession.swift
frontend/editor/src/semantic-tokens.ts
已实现
待验证
证据路径
windows/tauri/src/platform/lsp-core-adapter.ts
windows/tauri/src/features/editor/lsp/lsp-client.ts
windows/tauri/src/features/editor/engines/monaco/semantic-token-provider.ts
windows/tauri/src/features/editor/engines/monaco/semantic-token-provider.test.ts
windows/tauri/src/platform/lsp-core-adapter.test.ts
Editor / Language Tooling打开普通 Java 文件并等待 JDTLS 就绪,开启语义高亮,确认字段、方法等按协商图例上色;编辑、切换、关闭文档和重连服务器后不应用旧结果;服务器 refresh 后重新请求;关闭设置或大文件降级时保留基础语法高亮。
Windows 复用 Core semanticTokens 和共享 fixture,修复 #675;Linux 上的适配器与模型测试不替代 Windows WebView2/JDTLS 实机验收。
编辑器 / 文本编辑标签数量上限与自动关闭策略
editor-tab-limit
未实现
不适用
证据路径
macos/Sources/Lithe/Views/Editor
已实现
待验证
证据路径
windows/tauri/src/features/editor/stores/buffer-eviction.ts
windows/tauri/src/features/editor/stores/buffer-eviction.test.ts
windows/tauri/src/features/tabs/utils/tab-recency.ts
windows/tauri/src/features/tabs/components/tab-bar.tsx
windows/tauri/src/features/settings/components/tabs/editor-settings.tsx
EditorWindows:把最大打开标签数设为 3,依次打开 5 个文件并切回第 1 个,确认默认策略关闭最久未使用的标签而不是最早打开的;切换为「关闭最早打开的」后行为随之改变。开着终端、Agent 对话、已固定和未保存标签重复上述步骤,确认它们都不被关闭。把上限设为 0 后继续打开文件,确认不再自动关闭。
Windows 只有一份上限逻辑:打开新标签时由 buffer store 淘汰,调低上限或恢复会话时由标签栏补齐。上限只计算可自动关闭的标签,已固定、有未保存修改的标签以及终端、Agent 等工具标签既不计数也不关闭;0 表示不限制。默认值 30 只影响新安装,已写入 settings.json 的值保持不变。
编辑器 / 文本编辑文本编辑与标签生命周期
editor-text-tabs
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Editor
macos/Sources/Lithe/Models/Editor
macos/Tests/LitheTests/EditorTabOrderFeatureModelTests.swift
macos/Sources/Lithe/Application/Features/EditorGroupLayout.swift
macos/Sources/Lithe/Views/Editor/EditorGroupContainer.swift
macos/Tests/LitheTests/MonacoWorkbenchSessionLifetimeTests.swift
macos/Sources/Lithe/Views/Components/LitheToolWindowTabStyle.swift
macos/Tests/LitheTests/EditorTabColorTests.swift
macos/Tests/LitheTests/EditorTabLayoutTests.swift
.agents/notes/implemented/architecture/2026-10-12-editor-tab-split-docking.md
macos/Sources/LitheGitModule/Models/GitRepositoryDiffSession.swift
macos/Sources/Lithe/Views/Diff/RepositoryDiffSessionView.swift
已实现
待验证
证据路径
windows/tauri/src/features/editor
windows/tauri/src/features/tabs
windows/tauri/src/features/tabs/components/tab-context-menu.tsx
windows/tauri/src/features/tabs/components/tab-context-menu.test.ts
windows/tauri/src/ui/tab-bar.tsx
windows/tauri/src/features/tabs/components/tab-bar-item.tsx
windows/tauri/src/features/panes/components/pane-container.tsx
windows/tauri/src/features/editor/config/constants.ts
windows/tauri/src/features/editor/notebook/notebook-code-cell-editor.tsx
windows/tauri/src/features/editor/stores/buffer.store.ts
Editor打开、编辑、保存、关闭和恢复多个文本文件,确认光标、脏状态和标签状态;在 macOS 打开无扩展名文本文件,确认标签与项目树图标一致;从外部改为二进制后折叠并展开项目树,确认两处图标更新一致。 macOS 验证所有 Repository Diff 与文件/媒体/终端标签共用排序,切换保留 Diff、关闭命令关闭选中内容,标题按当前文件变化;共享 Islands 圆角标签在编辑区/工具窗口鼠标、键盘和窗口失活间呈现蓝色活动或灰色失焦状态,卸载移除焦点观察器。完整工作区视觉验收 pending。 从 Diff 设置菜单关闭时也清理混合标签槽并恢复原文档;通过原生窗口鼠标拖动检查普通文件跨 Repository Diff 重排。 右键标签页确认关闭分组排在其他操作之前,其中“关闭已保存”关闭无修改且未固定的标签并保留有未保存修改的标签,全程不弹保存确认;在 macOS 打开无扩展名文本文件,确认标签与项目树图标一致;从外部改为二进制后折叠并展开项目树,确认两处图标更新一致。 在 Windows 确认编辑器标签栏左上角不再有前进/后退箭头,后退/前进改由 Navigate 菜单与 Ctrl+Alt+←/→ 提供;选中标签为 IntelliJ Islands 圆角块(浅蓝底加蓝边),焦点移到终端、项目树或另一分栏时变为灰底灰边;长文件名标签完整显示不截断。 macOS 工作区、linked worktree、目录、冲突、行标记、分支/引用、历史提交和 Stash/Shelf Diff 均显示普通共享编辑标签;切回文件/媒体/终端/Agent 不清空比较,重新进入不重复添加标签。重排、拖动分屏与关闭空组合并沿用普通分组逻辑;关闭当前项只关闭活动标签,后台 Diff 不截获文件关闭命令;从 Diff 按钮、设置菜单或 ⌘W 关闭时只清理目标比较状态并拒绝迟到结果,关闭活动 Diff 优先恢复本组标签。 Windows 用同一鼠标滚轮事件对照普通编辑器、笔记本代码区和 Diff,确认共用两倍灵敏度,平滑滚动开关仍生效,滚动边界及标签位置恢复正确;真实整机 IDEA 滚动帧性能对照仍待验收。 macOS 标签拖到编辑区右侧或底部显示对应半区预览,释放后移动到独立标签组;继续拆分、组间移动、关闭空组合并、各组选择和聚焦命令正确,原文档和终端会话不复制,Esc 与无效释放保持原布局。浮动标签使用灰色卡片,无激活蓝底和关闭按钮。空编辑区仅显示 Search Everywhere 与 Find in Files,按当前 Keymap 和自定义配置生成快捷键,16pt 普通字重及 IDEA 明暗提示色;窄窗口裁剪文字而不缩字。 macOS 点击编辑器正文下方空白后,仅移动鼠标到文件、Diff、终端标签及标签栏空白处即恢复箭头,不要求再次点击;返回正文仍使用文本光标,单行、多行及分组标签栏均检查。 与数据库标签集成:文件切换和分组保留数据库概览/查询标签;数据库标签组内重排有效,跨组移动不改变布局,新增数据库标签进入既有数据库分组,避免共享上下文同时渲染为两个不同查询。 普通文本标签连续移到右侧、底部及原组后,撤销/重做移动前后输入;保持同一 WebView 和 Monaco 模型,不重建历史。松开拖动后只有目标文档取得原生焦点,后台正文没有闪烁光标;输入、撤销、查找和保存均作用于目标文件。视口尺寸变化允许滚动范围正常限制。 macOS 横向溢出的隐藏标签不截获相邻分组按下/拖动,部分可见标签仅在视口内可点击;第二、第三行释放执行重排而非分屏,正文边缘仍可分屏。文档→另一组终端或数据库→点击文档正文后,查找及关闭作用于原文档,其他标签保留。 A 与终端 T 分组,分别在挂载前及挂载排队后选 T,验证 A 异步 attach 不夺取 T 的 first responder;切回 A 后挂载可正常聚焦。单标签组右键向右分屏禁用,多文档或文档加终端组启用并实际分屏。 Windows 点击标签栏“新建标签页”按钮或按 Ctrl+N/Ctrl+T,确认打开一个可编辑、可保存的空白未命名编辑器(Untitled/未命名),并出现在标签栏;连续新建依次得到 Untitled-2、Untitled-3;关闭其中编号较小的未命名标签后再次新建,确认仍然打开新的空白页而不是只聚焦遗留标签;在未命名页输入文字后标签标记为未保存,关闭时先弹出保存确认;标签数达到上限时再新建,确认有未保存修改的标签不会被自动驱逐。 macOS测试源码文件标签使用IDEA FileColor.Green(深#1C261C/浅#EDFAEF),选中内缩3pt,活动100%/非活动40%,保留原边框与其他标签行为。优先按Maven导入的项目及子模块源码根角色判定,覆盖自定义测试目录、辅助类和主源码反例,无根信息时使用已有JDT测试元数据,不按文件名推测。EditorTabColorTests验证实际明暗及活动/非活动渲染,完整应用视觉验收仍pending。 多 Diff 回归:同时打开两个文件和同一文件的不同提交,检查独立标签、同一比较去重、切换保留内容/滚动、分屏各自显示、关闭一个不影响另一加载、Git Log 换提交不改变旧比较及工作区退出释放全部会话。
Windows 编辑器标签按 IntelliJ Islands IslandsTabPainter 绘制:28px 圆角块、6px 圆角、选中填充加 1px 边框、标签间距 8px、无宽度上限;是否置灰按焦点是否位于该标签组判断(对应 EditorTabbedContainer 的 isFocusAncestor)。标签栏不提供前进/后退按钮(IntelliJ 新 UI 同样没有)。Islands 精确色值只写在 Lithe 主题中,其他主题由自身主色、前景和边框色推导。 macOS 仓库 Diff 不再在根编辑区覆盖标签栏;采用带 UUID 的独立 repositoryDiff 标签及 GitRepositoryDiffSession:不同文件、提交、目录和引用比较可以并存,同一比较复用已有标签,服务与写入工作流仍由 GitFeatureModel 共享。EditorTabOrderFeatureModelTests 在深浅主题覆盖八种入口的实际原生分组、切换、分屏与关闭,GitModuleTests 覆盖异步结果隔离;Windows 现有 working-tree/commit-file-preview 已走普通标签,仅核对源码,完整两端工作区验收仍 pending。
编辑器 / 文本编辑编辑器不把中文全角标点标记为易混淆字符
editor-unicode-confusable-highlight
已实现
待验证
证据路径
frontend/editor/src/workbench.ts
frontend/editor/src/diff-review.ts
已实现
已验证
证据路径
windows/tauri/src/features/editor/components/monaco-editor.tsx
windows/tauri/src/features/editor/notebook/notebook-code-cell-editor.tsx
windows/tauri/src/features/git/components/diff/independent-commit-diff-surface.ts
frontend/editor/src/diff-review.ts
Editor双端打开含全角括号、全角逗号等中文标点的文档或代码文件,并覆盖 Notebook 代码单元与提交差异视图(拆分与统一),悬停这些字符不再出现 "could be confused with the ASCII character" 提示,也没有对应高亮标记;不可见字符检测等其他 Unicode 高亮行为保持不变。
关闭 Monaco unicodeHighlight.ambiguousCharacters 默认值:中文行内全角标点是正常输入而非误敲,且提示中的 Adjust settings 链接在嵌入场景没有可跳转的设置页。
编辑器 / 文本编辑中文 properties 与未知扩展名文本的一致打开和恢复
editor-unicode-text-classification
已实现
待验证
证据路径
macos/Sources/Lithe/Core/Rust/RustTextContentPolicy.swift
macos/Tests/LitheTests/TextContentPolicyTests.swift
frontend/editor/src/language-contributions.ts
已实现
待验证
证据路径
windows/tauri/src/features/file-system/controllers/workspace-session-restore.ts
windows/tauri/src/features/file-system/controllers/workspace-session-restore.test.ts
frontend/editor/src/language-contributions.ts
Editor双端打开高中文比例的 .properties 和未知扩展名 UTF-8 文件,编辑保存后恢复会话并验证内容及编码;验证 properties 高亮、emoji 跨边界、NUL 和控制字符拒绝、读取错误独立报告,并执行 text-content-v1.json 共享规则样例。
编辑器 / 编辑器外观macOS 工作台壁纸模式下,编辑器概览标尺与代码缩略图随编辑器背景透明,不显示黑色竖条;普通主题仍保持实体背景
editor-wallpaper-overview-ruler
已实现
待验证
证据路径
frontend/editor/src/theme.ts
macos/Sources/Lithe/Platform/MacOS/MonacoWorkbenchEditor.swift
macos/Experiments/Monaco/workbench.integration.ts
macos/Sources/Lithe/Views/Editor/EditorSoftWrapToggle.swift
macos/Sources/Lithe/Theme/LitheTheme.swift
macos/Tests/LitheTests/MonacoWorkbenchThemeTests.swift
平台专属
不适用
证据路径
windows/tauri/src/features/editor/engines/monaco/theme.ts
Editor在 macOS 选择工作台背景并打开文本文件,分别关闭和打开右侧 Agent 面板,确认编辑器最右侧概览标尺不出现黑色竖条;关闭背景图后确认普通主题底色保持不变。运行真实 WebKit 工作台主题集成测试。Windows 不使用 macOS 原生工作台壁纸。 普通主题与壁纸模式都不显示缩略图阴影和概览标尺边框形成的两条竖线;缩略图导航、滚动条及标尺上的诊断标记仍可用,主编辑器与分屏切换一致。WebKit 回归核对标尺左边缘像素和阴影 token 透明。 软换行按钮位于缩略图左侧,使用统一 22pt 工具栏按钮与 16pt 原始 IDEA 图标;调整编辑器宽度和开关缩略图后位置跟随 Monaco 实际布局,主编辑器及独立文件窗口一致。 Lithe 深色编辑器、空编辑区和工具窗口背景使用 IDEA Islands Dark 精确 #191A1C;核对打开文件前后背景一致,浅色及其他主题不变。 macOS 软换行按钮的完整命中区悬停显示默认箭头,从代码区移入及移回后光标分别为箭头和文本光标,禁用状态仍显示箭头,点击继续切换换行;完整应用交互验收待进行。
编辑器 / 资源预览HTML、SVG、媒体、PDF 与二进制预览
embedded-viewers
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Editor/HTMLPreviewView.swift
macos/Sources/Lithe/Platform/MacOS/HTMLPreviewWebView.swift
macos/Sources/Lithe/Platform/MacOS/HTMLPreviewBrowser.swift
macos/Sources/Lithe/Platform/MacOS/HTMLPreviewResources.swift
macos/Sources/Lithe/Platform/MacOS/HTMLPreviewNavigation.swift
macos/Sources/Lithe/Platform/MacOS/HTMLPreviewDialogs.swift
macos/Sources/Lithe/Platform/MacOS/HTMLPreviewZoom.swift
macos/Sources/Lithe/Platform/MacOS/UI/MacShortcutDetector.swift
macos/Sources/Lithe/Platform/MacOS/HTMLPreviewFind.swift
macos/Sources/Lithe/Platform/MacOS/HTMLPreviewPrint.swift
macos/Sources/Lithe/Platform/MacOS/HTMLPreviewMediaCapture.swift
macos/Sources/Lithe/Platform/MacOS/WebMediaCapture.swift
macos/Sources/Lithe/Platform/MacOS/HTMLPreviewScrollbars.swift
macos/Sources/Lithe/Views/Editor/MediaViewerView.swift
macos/Sources/Lithe/Views/Editor/SVGPreviewView.swift
macos/Sources/Lithe/Platform/MacOS/UI/MacHTMLBrowserOpener.swift
macos/Tests/LitheTests/HTMLBrowserOpenerTests.swift
macos/Tests/LitheTests/HTMLPreviewBrowserTests.swift
macos/Tests/LitheTests/HTMLPreviewResourcesTests.swift
macos/Tests/LitheTests/HTMLPreviewNavigationTests.swift
macos/Tests/LitheTests/HTMLPreviewZoomTests.swift
macos/Tests/LitheTests/HTMLPreviewBrowserHarness.swift
macos/Tests/LitheTests/HTMLPreviewFindTests.swift
macos/Tests/LitheTests/HTMLPreviewPageShortcutTests.swift
macos/Tests/LitheTests/HTMLPreviewPrintTests.swift
macos/Tests/LitheTests/HTMLPreviewMediaCaptureTests.swift
macos/Tests/LitheTests/WebMediaCaptureTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/viewer
windows/tauri/src-tauri/src/html_browser.rs
windows/tauri/src/features/editor/components/html/html-preview.tsx
windows/tauri/src/features/keymaps/commands/navigation-command-actions.ts
Editor分别打开 HTML、SVG、图片、PDF 和二进制文件,验证缩放、错误和源文件返回。 两端将 .html 默认打开程序改成文本编辑器,再点击 HTML 浏览器按钮,确认仍打开默认网页浏览器中的磁盘文件;覆盖中文、空格、# 文件名和无默认浏览器失败提示。 在 Windows 的 Web Viewer 标签中浏览几页后,用 Navigate 菜单或 Ctrl+Alt+←/→ 确认先在网页历史中后退/前进,到达网页历史起点后再次后退回到之前的代码位置。 在 macOS 的 HTML 预览中验证内嵌浏览器:后退/前进/刷新(Shift 强制刷新)、地址栏输入本地路径和网址、−/+/百分比和 ⌘+/⌘−/⌘0 页面缩放(跳转页面后保持)、内容溢出时常驻纵横滚动条、锚点与相对链接在预览内跳转、module 脚本与 fetch 可读取工作区文件、alert/confirm/prompt 与文件选择弹窗、开发者工具可开关;本地隐藏文件和密钥文件不能被页面读取。Windows 的 iframe 预览尚无对应能力。 在 macOS 的 HTML 预览中继续验证:页面有焦点时按 ⌘F 打开查找条,输入文字后页面内选中并高亮匹配项,⌘G / ⇧⌘G 与 Return / ⇧Return 前进后退并回绕,没有匹配时显示“No matches”,Esc 关闭后键盘回到页面;用默认键位,页面有焦点时按 ⌘F / ⌘G / ⇧⌘G 打开并驱动的是预览的查找条而不是编辑器的查找(应用键位监听器对页面的缩放、查找、打印按键让路);分屏时焦点在编辑器里按 ⌘F / ⌘G / ⌘P 仍由编辑器处理。右键点击链接、图片和页面空白处:可以复制链接地址和检查元素,没有“在新窗口打开”,页面空白处的菜单有 Print… 与 Export as PDF…;⌘P 打开作为窗口 sheet 的打印面板,导出 PDF 得到整页的单页 PDF,取消保存面板不写文件。摄像头和麦克风:在 Info.plist 带 NSCameraUsageDescription 与 NSMicrophoneUsageDescription 的构建里,页面调用 getUserMedia 弹出写明页面名称和设备的确认框(默认按钮是 Don’t Allow),页面每次加载后的第一次调用都会询问(同一页面里再次调用是否再询问取决于 WebKit 是否复用已批准的授权,记录实测结果);允许后地址栏右侧出现红色摄像头 / 麦克风指示,点击可暂停(变灰)或停止,页面里的轨道随之静音或结束;没有这两项说明的构建里 navigator.mediaDevices 不存在,页面拿不到设备也不会弹出系统权限框。Lithe 自己的页面(Markdown 预览、Monaco 编辑器和 diff、发行说明)调用 getUserMedia 一律被拒绝且不弹窗,源码扫描测试保证每个 WKWebView 都有人回答摄像头 / 麦克风请求、授权只出现在 WebMediaCapture.swift。地理位置和剪贴板读取使用 WebKit 自带的确认,未单独验证。 自动回归:./scripts/macos/test/test-macos.sh --filter HTMLPreview(真实 WKWebView 覆盖查找、打印、导出 PDF、右键菜单、WebAssembly、经真实应用键位监听器的页面快捷键放行,以及 WebKit 模拟摄像头 / 麦克风下的授权、静音与停止),界面尚未在运行的应用里手动验收。
工作区 / 项目浏览把项目树中的文件或目录以路径形式送入集成终端(复制后粘贴,或直接拖拽)
file-explorer-copy-path-for-terminal
未实现
不适用
证据路径
shared/contracts/application-boundary.md
已实现
待验证
证据路径
windows/tauri/src/features/file-explorer/lib/clipboard-entry-paths.ts
windows/tauri/src/features/file-explorer/lib/clipboard-entry-paths.test.ts
windows/tauri/src/features/terminal/utils/file-clipboard-paste.ts
windows/tauri/src/features/terminal/utils/terminal-file-drop.ts
windows/tauri/src/features/terminal/utils/terminal-file-drop.test.ts
windows/tauri/src/features/file-system/utils/file-system-drop-controller.ts
windows/tauri/src/features/file-system/utils/file-system-drop-controller.test.ts
windows/tauri/src/features/file-explorer/hooks/use-file-explorer-drag-drop.ts
windows/tauri/src/features/terminal/components/terminal.tsx
windows/tauri/src/i18n/locale.ts
windows/tauri/src-tauri/src/host.rs
windows/tauri/src-tauri/Cargo.toml
Workspace在 Windows 项目树中复制一个顶层文件、一个嵌套文件、一个嵌套目录(右键菜单与 Ctrl+C/Ctrl+X 都要覆盖),确认复制行为与改动前一致:应用内剪贴板仍记录条目,系统剪贴板文本不被覆写,项目树内 Ctrl+V 仍按原逻辑粘贴文件。随后在集成终端按 Ctrl+V、Ctrl+Shift+V 与右键「粘贴」,确认插入完整绝对路径;再在默认 cmd、Windows PowerShell、PowerShell Core、Git Bash、MSYS2、Cygwin、Nushell 及 wsl:<发行版> 各会话下验证:含 $() 与反引号的文件名插入后不执行任何额外命令,含 & | < > ; ^ ( ) 的文件名同样不触发额外命令;含弯单引号(U+2018/U+2019/U+201A/U+201B)的文件名在 PowerShell 下同样不被当作字符串结束符。Git Bash 等 POSIX shell 下反斜杠路径仍可访问;Nushell 下含单引号与含反引号的路径分别确认原值不变。在 wsl: 会话中确认 Windows 盘符路径转换为 /mnt/<盘符>/ 形式并可被 Linux 程序读取,同发行版的 wsl:// 工作区路径转换为发行版内路径;已知限制:目标发行版在 /etc/wsl.conf 自定义 [automount] root 时该转换不适用。在终端内执行 cd 到子目录后再次粘贴,确认绝对路径仍指向正确文件。终端右键「粘贴已复制的文件路径」在剪贴板内容变化后仍可插入复制的文件路径。复制文件后再复制一段文本,确认 Ctrl+V 得到该文本而不是路径;再复制与文件复制前相同的文本,确认 Ctrl+V 仍得到该文本(剪贴板变更序号已变化),这是纯文本比较无法区分的场景。把项目树条目拖到终端,确认插入路径并追加一个空格,且不再打开编辑器标签(拖到非终端 pane 仍打开文件);从资源管理器拖入终端在各 shell 下均能访问到文件。真实 Windows 产品交互验收 pending。
工作区 / 项目浏览项目文件树与资源打开
file-explorer
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Workspace/ProjectSidebarView.swift
macos/Sources/Lithe/Models/Workspace
macos/Sources/Lithe/Theme/LitheIcons.swift
macos/Resources/IDEAIcons/fileTypes/toml.svg
macos/Resources/IDEAIcons/fileTypes/toml_dark.svg
macos/Tests/LitheTests/TomlIconResourceTests.swift
macos/Sources/Lithe/Platform/MacOS/UI/ProjectTreeKeyboardCommands.swift
macos/Sources/Lithe/Views/Workspace/ProjectTreeSelection.swift
macos/Tests/LitheTests/ProjectTreeSelectionTests.swift
macos/Sources/Lithe/Views/Components/LitheToolWindowTabStyle.swift
macos/Tests/LitheTests/LitheTreeRowStyleTests.swift
macos/Sources/LitheCoreContracts/Workspace/FileNodePathLookup.swift
macos/Sources/LitheWorkspaceModule/Application/WorkspaceFeatureModel.swift
macos/Sources/LitheCoreContracts/Workspace/DirectoryChangeContracts.swift
rust/lithe-core/src/project/files.rs
macos/Sources/Lithe/Models/Workspace/ProjectTreeLoader.swift
.agents/notes/implemented/architecture/2026-10-19-lazy-project-tree.md
rust/lithe-core/src/project/file_name_order.rs
macos/Sources/LitheCoreContracts/Workspace/NaturalNameOrder.swift
macos/Sources/Lithe/Platform/MacOS/FileSystem/MacWorkspaceSnapshotBuilder.swift
macos/Tests/LitheTests/ProjectTreeNameOrderTests.swift
shared/fixtures/workspace/file-name-order-v1.json
.agents/notes/implemented/bug-fix/2026-10-22-project-tree-natural-name-order.md
shared/fixtures/workspace/change-filter-v1.json
macos/Tests/LitheTests/FileTypeIconKindTests.swift
macos/Resources/IDEAIcons/fileTypes/custom.svg
macos/Resources/IDEAIcons/fileTypes/i18n.svg
已实现
待验证
证据路径
windows/tauri/src/features/file-explorer
windows/tauri/src/features/sidebar
windows/tauri/src/features/file-explorer/components/file-explorer-viewport.tsx
windows/tauri/src/ui/wheel-scroll-animation.ts
windows/tauri/src/ui/scroll-container-wheel.integration.test.ts
.agents/notes/implemented/bug-fix/2026-10-08-windows-git-log-wheel-animation.md
windows/tauri/src/features/sidebar/utils/tree-selection.ts
windows/tauri/src/features/file-explorer/stores/directory-marks.ts
windows/tauri/src/features/file-explorer/hooks/use-file-explorer-sync.ts
windows/tauri/src/features/file-explorer/components/file-explorer-reveal.test.tsx
windows/tauri/src/utils/path-helpers.ts
windows/tauri/src/utils/path-helpers.test.ts
windows/tauri/src/features/file-explorer/components/file-explorer-selection.test.tsx
windows/tauri/src/features/file-explorer/components/file-explorer-pane.tsx
windows/tauri/src/features/file-explorer/hooks/use-file-explorer-drag-drop.test.tsx
windows/tauri/src/features/sidebar/utils/tree-selection.test.ts
rust/lithe-core/src/project/files.rs
shared/fixtures/workspace/change-filter-v1.json
windows/tauri/src/extensions/bundled/icon-themes/idea/extension.json
windows/tauri/src/extensions/bundled-extension-manifests.test.ts
Workspace浏览目录、展开/折叠、打开资源并在文件变更后刷新树。 macOS 文件树、标签页与面包屑共用 TOML 文件图标:亮色使用 IDEA New UI 官方浅底蓝色 T,深色使用深底蓝色 T;检查明暗主题切换后选择对应 SVG,保留原始 16pt 几何与颜色。 点击目录名称后上下键按可见行移动选择,右键展开目录并再次右键进入首个子项,左键折叠或返回显示父项;双击目录名称展开/折叠,单击与修饰键多选保持独立。验证压缩 Java 包、列表首尾、Shift 上下范围选择与自动滚动;方向键不送到编辑器,点击编辑器或转移到搜索输入框后恢复其按键处理。 Windows Project 文件树滚轮与 Git Log 共用 Community Windows 默认 200ms 惯性过渡;核对连续同向、反向、Shift 横向滚动、顶底边界、键盘定位与滑块拖动取消惯性、卸载帧清理和减少动态效果偏好;虚拟树保持可见区呈现,真实 WebView2 实机验收 pending。 macOS 项目文件和目录选中行共用 LitheTheme.Tree 的主题聚焦色与灰色失焦色;点击编辑器、其他工具窗口后失焦,键盘转移到搜索输入框尚未输入时失焦,重新点击树恢复,整个窗口失焦时保持灰色。深浅主题、非默认主题、多选、上下键和右键菜单均需核对;组件像素和焦点回归不能替代完整应用验收。 Windows 在默认及舒适密度下比较 Project 与 Dependencies 树正文,再修改界面字号确认同步;深浅主题检查刷新图标为循环箭头,点击仍刷新目录。 Windows 打开深层文件并折叠祖先,点击定位当前文件,检查展开后滚动到目标行;滚动离开后重复点击同一文件仍定位;编辑器切换页签不得让树自动滚动。延迟目录加载完成后再滚动,旧请求完成不改变新位置;树内搜索和 Dependencies 视图下定位应回到完整 Project 树。 Windows 搜索首次命中和 Enter 切换后复制/剪切应使用当前命中;同时选择父目录、后代与其他文件后右键后代,复制/删除仍处理整个选择且父子只操作一次。原生移动等待期间关闭 Project 或切换工作区,成功项同步原工作区并停止后续项。受控 WSL/远程/POSIX 路径用例保留大小写不同的文件与目录,Windows 本地/普通 UNC 同名目标继续拒绝覆盖;这些用例不代表已开放 WSL/远程功能,真实 WebView2 工作流仍 pending。 Windows 编辑器保持 README 打开时点击目录名称,通过真实 FileExplorerPane、侧栏与缓冲区 store 验证路径同步往返后目录仍被选中,复制/剪切、键盘焦点和 Shift 范围锚点仍属于目录;实际切换编辑文件时单选跟随,明确多选保留。 Windows 批量拖动分别在目录预检、原生移动和原工作区同步等待期间切换 A→B→A,确认旧批次不再派发剩余项,已完成项仍同步原工作区;普通重渲染继续当前批次,旧移动失败不清除新拖动或显示过期错误。 macOS 打开含 .claude/worktrees 等嵌套 Git linked worktree 与 .artifacts 的仓库:项目树、文件列表与搜索索引不包含这些目录,子模块和位于主检出之外的工作树仍显示;嵌套工作树内的文件变化不触发刷新。外部新增/删除普通文件时树原地增删、不重新扫描整个工作区,新目录、压缩包结构变化时回退完整快照;定位当前文件按路径逐级查找,侧栏渲染不再遍历全部文件。 macOS 项目树按需列目录:快照只返回文件清单,目录展开时才列出下一层;检查首次打开大仓库只显示根层,展开、折叠后再展开、源码根下压缩 Java 包与全量构建一致;外部改动未展开目录下的文件不改变树,展开后可见;重新扫描后已展开目录保持展开并显示最新内容;定位当前文件会逐级加载祖先后滚动到目标行;新增或删除文件后先展开目录再处理监听事件,确认搜索等文件库存仍同步;压缩包重列期间发生其它文件增删,完成后库存和树都保留最新结果。 macOS 项目树同级排序对齐 IDEA 项目视图:目录先于文件,名称按自然顺序(数字按数值、忽略大小写、'-' 与 '_' 相邻);打开含 docs/releases/v0.1.4.md、v0.1.12.md、v0.1.14.md 的仓库,确认 v0.1.4 在 v0.1.12 之前,外部新建 v0.1.5.md 后原地插入到二者之间,与重新扫描的顺序一致。 外部构建产生超过 512 条 target/build 事件且混有源码变化时,只转发有效事件,不触发输出洪峰导致的整项目重扫;显式文件/生成源码监听、项目根名为 build、跨排除边界重命名均保留,系统丢失事件始终触发恢复重扫。 Windows 同时粘贴同名文件不覆盖彼此;剪切期间再次复制相同或不同内容,旧粘贴完成不得清除新剪贴板。 Windows 文件树单击文件只选中并高亮,不打开也不新建预览页签;双击或按 Enter 才打开,单击目录同样只选中。 Windows 文件树选中文件、目录或多选后按 Delete(无修饰键)总是弹出删除确认,即使“删除前确认”设置关闭;取消不删除,确认后按选择集合逐项删除,工作区根目录以及 Shift/Ctrl/Alt+Delete 不触发。 项目树、标签页和面包屑的 IDEA 文件图标:两端 .jsonl/.ndjson 用 JSON 图标,.wbmp 用图片图标,.doc/.docx/.ppt/.pptx 用 IDEA Native 类型的 custom 图标,.strings 用 i18n 图标;Windows IDEA Icons 主题另补齐 macOS 已识别的 Kotlin、Rust、Go、Python、Ruby、Scala、PHP 等扩展名和 .classpath、.gitattributes、docker-compose 等文件名,.kts 用 Kotlin 图标而 .gradle.kts 仍用 Gradle 图标;检查明暗主题均显示对应 SVG,实机 pending。 Windows 编辑器打开文件的路径与项目树根目录的分隔符或盘符大小写不同(例如经快速打开得到的正斜杠路径对反斜杠根目录)时,点击定位当前文件同样展开祖先、选中并滚动到目标行;真实 WebView2 实机验收 pending。
Windows 补齐 Ctrl/Shift 多选、批量复制/剪切/删除、已选集合拖动、Project/Dependencies 切换、定位当前文件、刷新和隐藏。目录名称单击选择,双击或箭头展开;长名称水平滚动。目录标记按工作区持久化,并随移动、重命名和删除迁移;本地 Windows/UNC 按不区分大小写处理,POSIX、WSL 和远程标识保留大小写并隔离工作区。批量移动预检父子重复及重名目标,原生发布拒绝覆盖;真实 WebView2 的拖动与焦点验收 pending。 Windows 树正文统一使用 ui-text-sm(默认 13px),随界面字号设置变化,舒适密度不单独放大 Dependencies 等树行;Project 刷新按钮使用 IDEA refresh.svg。手动定位使用有代次的展开后滚动请求;编辑器切换页签不再自动跟随滚动(autoRevealActiveFileInFileTree 设置已退役);定位清除树内搜索并切回 Project,保持虚拟列表。 搜索导航同步选择与锚点,右键成员判断保留原始选择集合,批量目标再去除父子重复;已完成移动不因面板卸载或工作区切换而漏掉原工作区同步。路径去重与拖动预检按文件系统大小写语义比较,包含 WSL UNC 别名。编辑器活动文件变化时单选同步高亮、复制/剪切目标及范围锚点,明确多选保留;使用同步 Hook 的真实编辑器目标判断切换,选择目录引发的共享侧栏路径往返不改变选择;真实面板与 store 回归覆盖此链路。 批量移动按每次工作区访问识别生命周期,相同根路径的再次访问不能复活旧批次;预检、移动、同步和失败回调共用该守卫。 macOS 快照跳过嵌套在自身仓库中的 linked worktree(.git 文件指向 <主仓库>/.git/worktrees/*)并内置隐藏 .artifacts;项目树由 workspace.listDirectories 按需逐层列出,children 为 nil 表示目录未加载;平铺文件清单 projectFiles 仍完整保留供搜索等功能使用。 macOS 项目树同级排序由 Rust Core 的 visible_children 与 Swift 的 NaturalNameOrder 共同实现 IDEA FileNameComparator(共享 fixture file-name-order-v1.json);快照 files 与搜索索引按 ChildOrder::Traversal 保持原有的小写排序(Windows 快速打开取前 100 项依赖它),只有 workspace.listDirectories 使用自然顺序。Windows 项目文件树仍使用 localeCompare,Git 文件树已使用同源的 compareGitFileNames,Windows 项目树对齐待后续处理。 Windows 文件树支持 Delete 键删除(始终二次确认),macOS 文件树暂无键盘删除,仅右键“移到废纸篓”。 Windows 定位当前文件先用 toRootedPath 把活动路径改写成树根目录的前缀与分隔符写法,再展开祖先并滚动;此前编辑器路径与树节点写法不同会因精确字符串匹配而静默无反应。
工作区 / 项目浏览F4 打开焦点文件与搜索位置
file-open-selected
未实现
待验证
证据路径
macos/Sources/Lithe/Platform/MacOS/UI/ProjectTreeKeyboardCommands.swift
已实现
待验证
证据路径
windows/tauri/src/features/keymaps/hooks/use-file-open-target.ts
windows/tauri/src/features/keymaps/commands/command-registry.ts
windows/tauri/src/features/keymaps/defaults/default-keymaps.ts
windows/tauri/src/features/file-explorer/components/file-explorer-tree.tsx
windows/tauri/src/features/file-explorer/components/file-navigator-sidebar.tsx
windows/tauri/src/features/global-search/components/global-search-buffer.tsx
windows/tauri/src/features/global-search/components/search-excerpt-results.tsx
windows/tauri/src/features/global-search/components/search-excerpt-code.tsx
windows/tauri/src/features/file-explorer/components/file-explorer-selection.test.tsx
windows/tauri/src/features/global-search/components/f4-file-navigation.integration.test.tsx
.agents/notes/implemented/bug-fix/2026-10-05-project-tree-selection-and-moves.md
WorkspaceWindows WebView2 中在项目树选择文件后按 F4,确认固定打开该文件;目录、空树、失效项、重命名和树搜索输入不误开。内容搜索查询框用方向键选择匹配后按 F4,确认保留一基行列;焦点移到另一文件行或片段后打开该文件自身的位置;同一片段选择第 8 行后 Tab 聚焦第 27 行按钮,F4 应打开第 27 行的匹配列,标题和容器焦点仍打开已选匹配。查询等待、空结果、替换和过滤框、编辑器、终端以及弹窗不得借用旧目标。设置中改绑或禁用打开所选文件,确认默认 F4 随之覆盖;查询框改绑两段式快捷键,确认完成、未匹配按键和超时后重置,替换框不执行,卸载清理计时器;编辑器开启 Vim 后文件区域仍可执行。完成四项修复后的完整 Windows 构建与真实焦点验收前保留 pending;macOS 需补齐同等命令后独立验证。
版本控制 / Git分支、标签与远程
git-branches-remotes
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Git
macos/Tests/LitheTests/BranchSwitcherPopoverBehaviorTests.swift
macos/Sources/Lithe/Services/Workbench/WorkbenchLayoutStore.swift
macos/Sources/Lithe/Views/Components/LitheDropdown.swift
macos/Tests/LitheTests/WorkbenchMavenLayoutTests.swift
macos/Tests/LitheTests/ContextMenuCoverageTests.swift
macos/Sources/Lithe/Views/Git/BranchPopupRowView.swift
macos/Sources/Lithe/Core/Rust/RustCoreBridge.swift
macos/Sources/LitheGitModule/Models/GitModels.swift
rust/lithe-core/src/git/history.rs
rust/lithe-core/src/tests/git.rs
rust/lithe-core/src/git/mod.rs
rust/lithe-core/src/tests/git_remote_checkout.rs
shared/fixtures/git/remote-checkout-v1.json
.agents/notes/implemented/bug-fix/2026-10-08-remote-checkout-fetched-tip.md
macos/Sources/LitheGitModule/Application/GitFeatureModel.swift
macos/Sources/LitheGitModule/Services/GitService.swift
macos/Sources/Lithe/Core/Rust/RustGitOperations.swift
macos/Tests/LitheGitModuleTests/GitModuleTests.swift
macos/Tests/LitheTests/GitReferenceRowsBuilderTests.swift
shared/fixtures/git/write.json
macos/Sources/Lithe/Views/Git/GitPushDialog.swift
macos/Sources/Lithe/Views/Git/CommitAreaView.swift
macos/Sources/Lithe/Core/Rust/RustCoreBridge+GitPush.swift
macos/Sources/LitheGitModule/Models/GitPushModels.swift
macos/Sources/LitheGitModule/Models/GitWorkspaceCommitModels.swift
macos/Sources/LitheGitModule/Application/GitFeatureModel+WorkspaceCommit.swift
macos/Tests/LitheTests/GitPushDialogPresentationTests.swift
macos/Tests/LitheTests/GitPushReviewBridgeTests.swift
rust/lithe-core/tests/git_push.rs
rust/lithe-core/src/tests/git_workspace_commit.rs
.agents/notes/implemented/bug-fix/2026-10-17-git-push-target-and-upstream-tracking.md
已实现
待验证
证据路径
windows/tauri/src/features/git
rust/lithe-core/src/git/history.rs
rust/lithe-core/src/tests/git.rs
windows/tauri/src/features/git/components/git-fetch-status.tsx
windows/tauri/src/features/git/services/git-fetch-progress.test.ts
windows/tauri/src/features/git/components/git-fetch-status.test.tsx
windows/tauri/src/features/git/stores/git-fetch-progress.integration.test.ts
windows/tauri/src/features/layout/components/footer/footer.tsx
windows/tauri/src/features/git/services/git-log-branch-update.ts
windows/tauri/src/features/git/services/git-log-branch-update.test.ts
windows/tauri/src/features/git/components/log/git-log-branch-actions.test.tsx
rust/lithe-core/src/git/mod.rs
rust/lithe-core/src/tests/git_repository_setup.rs
shared/fixtures/git/write.json
windows/tauri/src/features/git/stores/git.store.ts
windows/tauri/src/features/git/runtime/git-status-refresh-host.tsx
windows/tauri/src/features/git/runtime/git-status-refresh-host.test.tsx
.agents/notes/implemented/architecture/2026-10-08-windows-git-status-ownership.md
rust/lithe-core/src/tests/git_remote_checkout.rs
shared/fixtures/git/remote-checkout-v1.json
.agents/notes/implemented/bug-fix/2026-10-08-remote-checkout-fetched-tip.md
windows/tauri/src/features/git/components/log/git-log-tool-window.tsx
windows/tauri/src/features/git/utils/git-checkout-failure-presentation.tsx
windows/tauri/src/features/git/utils/git-checkout-failure-presentation.test.ts
windows/tauri/src/features/git/components/git-branch-manager.tsx
windows/tauri/src/features/git/components/log/git-create-branch-dialog.tsx
windows/tauri/src/features/git/components/log/git-create-branch-dialog.test.tsx
windows/tauri/src/features/git/utils/git-branch-name.ts
windows/tauri/src/features/git/utils/git-branch-name.test.ts
windows/tauri/src/features/git/api/git-branches-api.ts
windows/tauri/src/features/git/api/git-branches-api.test.ts
windows/tauri/src/ui/context-menu.tsx
windows/tauri/src/ui/dropdown.tsx
windows/tauri/src/ui/dropdown.test.tsx
windows/tauri/src/ui/idea-notification.tsx
windows/tauri/src/ui/idea-notification.test.tsx
windows/tauri/src/features/git/components/git-push-dialog.tsx
windows/tauri/src/features/git/components/git-push-target-prompt.tsx
windows/tauri/src/features/git/components/git-push-target-prompt.test.tsx
windows/tauri/src/features/git/api/git-push-api.ts
windows/tauri/src/features/git/api/git-push-api.test.ts
windows/tauri/src/features/git/components/git-commit-panel.tsx
windows/tauri/src/features/git/components/git-commit-panel.test.tsx
windows/tauri/src/features/git/components/git-commit-panel-push-target.test.tsx
windows/tauri/src/features/git/services/git-push-target.ts
windows/tauri/src/features/git/services/git-workspace-commit-workflow.ts
windows/tauri/src/features/git/services/git-workspace-commit-workflow.test.ts
rust/lithe-core/tests/git_push.rs
rust/lithe-core/src/tests/git_workspace_commit.rs
Git创建、切换、合并分支并查看标签和远程,确认冲突与认证失败可恢复。 macOS 悬停分支弹窗内被截断的行,确认沿原行位置展开完整分支名与 upstream,延续选中底色和行高;完整可见的行不展开,离开或打开动作菜单后展开层消失。滚动列表且鼠标位置不动时,高亮跟随当前鼠标下的行,离开的行清除 hover,不出现多行残留选中底色;已打开动作菜单的行仍保持高亮。顶部项目及分支按钮保持箭头光标,顶部当前分支不显示帮助浮层。 macOS 检查右侧真实上游列靠右显示、末尾省略且选中后沿用行文字颜色及普通字重;悬停直接显示沿原行展开的非激活子窗口,保留原行位置、选择底色、普通字重与高度,转交点击及滚轮,父弹窗关闭时清理,显示完整名称,不额外插入分组前缀,领先/落后提交数与 Git 一致(大于 99 显示 99+),无上游时不猜测远端。确认搜索框固定,其下操作项和全部分支分组共用一个滚动区,缩小弹窗时操作项也能滚出视口;拖动分支弹窗右边缘调整宽度、右上角/右下角无需先点击即分别使用东北—西南/西北—东南的斜向调整光标并调整宽高,固定另一侧边界,连续事件合并且不逐事件同步重绘,检查鼠标光标、内容刷新保留尺寸、关闭重开及重启后按项目恢复,切换项目互不覆盖,并检查屏幕边界及最小尺寸,普通菜单不出现拖动入口。 macOS 分支弹窗或 Git 已保存更改列表打开且鼠标悬停在被截断的行上时,反复切换到其他应用再切回、让窗口失焦/激活,应用不崩溃(issue #1277),悬停展开层仍只有一个且在布局完成后刷新;长分支列表快速滚动保持流畅,行内容、选中底色与展开层不丢失。 两端在仅抓取 preview、其他分支已有 remote/merge 配置和远端引用的仓库中确认上游名称与领先/落后计数仍可见,Recent 与 Local 一致,查询不修改 fetch 配置;同名远端但未设置跟踪时仍不显示上游。 Windows Git Log 普通 Fetch 和 Fetch 选项执行后保持当前页签,底部状态栏显示等待或真实阶段进度;连接等待、认证、多个远程切换不沿用旧百分比,成功、失败、取消和预检查失败均收起;Console 仍保留命令与输出。核对中英文、明暗主题与窄窗口。 Windows Git Log 普通 Checkout 不再二次确认,仍阻止覆盖本地修改;Update Selected 按跟踪分支配置启用,不依赖缓存 behind。当前分支后台 Merge,未检出分支原地快进,其他 worktree 内仅快进;不打开 Pull 弹窗,分叉/脏工作区保留本地内容并报告失败,仓库或工作区切换后迟到结果不得刷新或解锁新请求。 Windows Update Selected 在 Fetch 等待期间及预检后切换目标 worktree 的分支,或分离 HEAD,应返回 state-changed,不执行新分支的 Pull;Core 在执行前校验完整 expectedBranch,省略时保留兼容行为。 带 expectedBranch 的后台更新整合已 Fetch 的固定 upstream 提交,不再次执行 pull/fetch;验证 Merge、仅快进和 Rebase 策略,普通 Pull 省略字段时保持原行为。 Windows 顶部、Commit 和 Project 文件树由同一个仓库状态表生成展示;关闭 Commit 后外部 pull、checkout 和暂存仍刷新分支名、领先/落后及文件状态,已同步分支的 incoming 箭头消失。覆盖多仓库选择、根目录文件路径、快速切仓库/工作区与旧请求迟到,查询失败保留成功快照,草稿不丢失;元数据监听覆盖已发现仓库并在卸载时全部释放。真实 Windows 交互验收 pending。 两端 Fetch 后从其他分支及已处于目标本地分支时 Checkout Remote,确认 HEAD、本地分支和文件内容更新到所选已 Fetch 节点,重复操作成功且不生成合并提交。缺少本地分支时创建并配置跟踪;本地独有提交在切换或自动 stash 前被拒绝,Force 不丢弃提交;阻塞的工作区、暂存区、未跟踪文件和其他工作树占用保持原状态。Smart Checkout 更新后恢复本地修改,失败后界面刷新真实仓库状态;普通本地 Checkout 与 Checkout and Rebase 保持原行为。 Windows Git Log 的本地及远程 Checkout 成功后不再弹出成功提示(与 IDEA 一致,分支标签直接切换),失败时仍显示错误原因。 Windows Git Log 与分支切换器 Checkout 失败(例如目标分支已被其他 worktree 占用)时,右下角显示需手动关闭的 IDEA BalloonError 红色错误气泡,标题为“无法签出 {分支}”/“Could not checkout {branch}”,正文为去掉 fatal:/error: 前缀的 Git 输出;中英文、明暗主题下核对图标与换行。 macOS 分支弹窗和 Git Log 分支右键菜单中,有上游的未检出本地分支启用“更新”,原地快进且不切换 HEAD;本地有上游没有的提交时提示分叉、不强制更新;被其他 worktree 检出时提示到该 worktree 更新且不执行 Fetch;无上游的分支保持禁用;当前分支仍走原有拉取流程。在中文 Git 输出环境下核对提示。 macOS 分支弹窗按 Community 的 8pt 四边和角落沿边 16pt 规则命中;四边仅调整对应轴,四角同时调整两轴,反向边固定。水平/垂直使用 AppKit 双向光标,对角线直接使用 SDK JavaRuntimeSupport 的 javaResizeNE/NW/SE/SW,与 JBR 映射同源;检查原始图像、尺寸和热点一致。检查中央的搜索输入、滚动与分支点击不被边缘层拦截,移回中央释放调整光标,拖动中合并更新、松开才保存,内容刷新保持释放位置。 Windows Git Log 右键分支选择“新建分支”,弹窗对齐 IDEA 的 Create Branch from 对话框:标题为“从 {引用} 创建分支”,单行“分支名称”输入、创建/取消按钮,无 Checkout 与 Overwrite 选项,创建后固定检出新分支;初始名称本地分支沿用原名、远程分支去掉远程前缀,打开即全选,按一次退格即可清空;输入时空格转为连字符并丢弃非法字符且光标位置保持。打开及输入期间不做重名检测,点击创建后若名称为空,或与现有本地分支、远程分支、本地分支目录或 HEAD 冲突,才在输入框下方显示错误并禁用创建,此后错误随输入实时更新;创建按钮在前、取消按钮在后,创建为实心主色;Git 失败时错误显示在弹窗内且可重试,成功后不弹出提示,直接刷新历史。核对中英文与明暗主题。 Windows Git Log 右键本地分支选择“删除分支”不再弹出确认框,直接删除并在右下角弹出 IDEA 样式的通知(信息图标、粗体“已删除分支:”加分支名、下一行蓝色“恢复”文字链接、右上角关闭按钮,约 15 秒内有效,核对明暗主题与长分支名换行);点击后在原提交上重建该分支且不切换,原上游仍存在时恢复跟踪;分支重建成功但上游跟踪恢复失败时提示“分支已恢复,但上游跟踪恢复失败”,不得误报为整体失败,仍刷新历史。工作区切换后迟到的恢复不得刷新新工作区。分支未完全合并、被其他工作树占用等 Core 拒绝删除的情况显示 Git 给出的原因,不弹出恢复提示。远程分支和标签的删除保持原有确认。 Windows 所有右键菜单的弹出位置对齐 IDEA(Swing JPopupMenu):菜单左上角落在点击点,靠下或靠右放不下时整体平移回窗口内,不翻到光标上方或左侧;子菜单首行与父行对齐,右侧放不下时翻到左侧,纵向只平移。覆盖 Git Log 分支树、提交表、侧边栏、标签页、终端、文件树及通知/扩展/GitHub 等自绘菜单,并检查窗口很矮时菜单可滚动。 分支跟踪名称不同的远端分支(例如从 origin/main 新建分支后手动设置 upstream)时:Windows 推送弹窗必须先让用户在“发布到同名分支”和“推送到 upstream”之间选择,选择后弹窗展示的目标分支和提交列表与最终远端一致;“提交并推送”在写入提交前一次性询问所有异名仓库,取消后不产生提交;普通同名推送不出现任何询问。macOS 每次推送(分支列表与顶部分支弹窗)都先打开推送弹窗,顶部显示“本地分支 → 远端/分支”,左侧列出将推送的提交、右侧显示所选提交的改动文件,点击“推送”前不写远端;异名上游时“推送”保持禁用,直到在“发布到同名分支”和“推送到 upstream”之间选择,选择后目的地与提交列表随之更新,远端 main 不变;弹窗打开后仓库又有新提交时推送被拒绝并给出原因。macOS “提交并推送”始终先出审阅单列出每个仓库的目的地,异名仓库在审阅单内选择,未选择时“继续”不可用,取消后不产生提交。核对中英文、明暗主题与窄窗口。 macOS 指针停在被截断的分支行上时,用触控板双指滚动,确认列表持续跟随手势(含抬指后的惯性滚动),展开层在滚动时隐藏且手势结束后不残留;手指只放在触控板上不滚动时展开层保持显示。滚动中途手指停顿超过 1 秒再继续移动,确认列表仍跟随手势;原行滚出列表后手势不中断;滚动结束后点击同一位置,确认没有隐藏层拦截后续操作。 macOS 触控板滚动隐藏名称展开层后,立即在原位置左键/右键并拖动、松开,确认当前可见行收到完整操作,修饰键与点击次数不变,不触发滚走的旧行;滚动中按 Esc 关闭父弹窗后立即重开,确认隐藏层和回收任务已清理、无残留点击拦截。
2026-10-06:用户确认 PR #1083 涉及的 Windows 功能改动均已完成实机测试,未发现问题;实机验收依据为用户反馈。 2026-10-08:用户确认本次远程 Checkout 更新和 Windows 成功提示修复的本地测试没有问题;作为本次 Windows 改动的用户验收依据,未宣称完成其他矩阵场景或 macOS 验收。 2026-10-17:issue #1272 推送目标修复。Core 与 Windows 本地自动化已覆盖:从 origin/main 新建分支不继承 upstream;异名目标未确认时拒绝推送;预览与推送共用同一个按选择解析的目标,确认后 upstream 被改指其他分支时已审阅的推送被判过期;--force-with-lease 作用在所选 upstream 分支;提交并推送在写入提交前由 Core 按仓库提问,重试时恢复并重新校验;省略 targetKind 的旧调用方仍可推送。 2026-10-22:macOS 补上界面。每次推送先打开 IDEA 式推送弹窗(目的地、将推送的提交、所选提交的改动文件),异名上游需先选择;“提交并推送”先出审阅单并就地选择。原生层与真实 Core 的衔接由 GitPushReviewBridgeTests 覆盖,相关套件经 scripts/macos/test/test-macos.sh 串行运行通过;完整套件在本机并行运行时有与本变更无关的超时类失败。SwiftUI 窗口本身尚未在真机上目视验证。两端真实 Windows/macOS 交互验收仍为 pending。 2026-10-31:issue #1621 修复悬停展开层关闭后丢失触控板手势后续事件。自动化测试已覆盖手势全程转发、行中途被移除和鼠标滚轮路径;尚未用真实触控板完成 macOS 实机验收,验证状态保持 pending。 2026-10-31:PR #1625 后续修复将隐藏展开层的完整鼠标操作交给当前父窗口命中控件,并由移交对象在父窗口关闭时立即清理;不依赖旧行存活或兜底计时,真实触控板验收仍为 pending。
版本控制 / GitmacOS Commit/Shelf 标签采用共享选中与悬停样式、12pt 水平内边距、41pt 顶栏和共享主题分隔线,Commit 工具栏四个现有操作使用 IDEA 明暗 SVG 和共享按钮样式,工具栏下不绘制横线,Changes 列表紧贴工具栏;提交区可拖动分隔条使用共享边框且悬停/拖动不高亮,提交按钮及多行编辑框遵循 IDEA Community 尺寸、边框和字体,占位色与共享输入框一致;提交信息编辑框复用编辑器共享底色
git-commit-sidebar-toolbar-icons
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Git/ChangesSidebarView.swift
macos/Sources/Lithe/Theme/LitheTheme.swift
macos/Sources/Lithe/Views/Components/LitheToolWindowTabStyle.swift
macos/Resources/IDEAIcons/expui/general/refresh.svg
macos/Resources/IDEAIcons/expui/vcs/revert.svg
macos/Resources/IDEAIcons/expui/general/download.svg
macos/Resources/IDEAIcons/expui/general/show.svg
macos/Sources/Lithe/Views/Git/CommitAreaView.swift
macos/Sources/Lithe/Views/Git/CommitMessageEditor.swift
macos/Tests/LitheTests/CommitMessageEditorTests.swift
macos/Tests/LitheTests/CommitActionButtonStyleTests.swift
macos/Resources/IDEAIcons/expui/general/history.svg
macos/Resources/IDEAIcons/expui/diff/magicResolveToolbar.svg
平台专属
不适用
证据路径
windows/tauri/src/features/git
Git在 macOS 深浅主题下核对 Commit/Shelf 标签文字距左侧 12pt、选中和悬停使用共享背景与边框、点击外部后选中标签变为非活动色、按下时文字不变暗;标题栏 41pt 且下沿使用带左右 1pt 留白的共享分隔线、操作按钮行使用共享 40pt 高度且 Changes 列表无额外顶部留白、四个操作按钮下方无横线;核对工具栏图标、尺寸、悬停块与默认箭头光标;没有所选改动或没有变更时,确认对应按钮弱化、无悬停高亮且不能触发动作;有可操作内容时确认动作正常。 在深浅主题中核对提交信息框 4pt 圆角、普通 1pt 边框、焦点 2pt 边框及 13pt regular 编辑器字体;空值聚焦仍显示 #73767C 占位文字,输入及中文组合文字不受影响;提交按钮可见高度 28pt、最小宽度 72pt、14pt 文字边距和 3pt 外侧留白,禁用状态不可提交,提交及推送流程不变;分隔条悬停和连续拖动均保持共享边框颜色;历史/设置/AI 魔杖图标使用 IDEA 16pt 明暗资源,设置按钮保留原动作。 确认提交信息编辑框使用 LitheTheme.editor,与 Commit 列表及编辑器的同主题底色一致,搜索框仍使用共享控件底色。 提交信息框在输入法组词、取消及确认时重绘完整占位区域;有组词时不画占位文字,短拼音不能留下旧占位尾部。CommitMessageEditorTests 用原生 setMarkedText/unmarkText/insertText 检查完整失效区域、占位隐藏及恢复。
版本控制 / GitDiff 与变更审查(含未暂存修改块的暂存/取消暂存/回退操作;块级回退遵守「丢弃前确认」设置:开启时先确认,确认期间目标刷新或切换则放弃执行;CRLF 与无末尾换行文件经字节保真通道恢复块级回退入口)
git-diff-review
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Git
macos/Sources/Lithe/Views/Diff
macos/Sources/Lithe/Theme/LitheTheme.swift
macos/Tests/LitheTests/DiffAppearanceTests.swift
macos/Sources/Lithe/Views/Diff/DiffScrollSynchronization.swift
macos/Sources/Lithe/Views/Diff/DiffUnifiedPaneView.swift
macos/Tests/LitheTests/DiffScrollSynchronizationTests.swift
macos/Sources/Lithe/Models/Diff/DiffSplitLayout.swift
macos/Sources/LitheGitModule/Application/GitFeatureModel.swift
macos/Sources/Lithe/Models/AppModel/AppModel+WorkbenchClose.swift
macos/Tests/LitheTests/EditorTabOrderFeatureModelTests.swift
macos/Sources/Lithe/Views/Components/LitheCenteredPopup.swift
macos/Tests/LitheTests/LitheCenteredPopupTests.swift
macos/Tests/LitheGitModuleTests/GitModuleTests.swift
.agents/notes/implemented/architecture/2026-10-12-editor-tab-split-docking.md
macos/Sources/LitheGitModule/Models/GitRepositoryDiffSession.swift
macos/Sources/Lithe/Views/Diff/RepositoryDiffSessionView.swift
macos/Sources/Lithe/Models/AppModel/AppModel+VcsProviders.swift
macos/Sources/Lithe/Views/Vcs/VcsProviderHistoryAndDiffViews.swift
macos/Tests/LitheTests/VcsProviderHostTests.swift
.agents/notes/implemented/feature/2026-10-29-commit-file-context-actions.md
已实现
已验证
证据路径
windows/tauri/src/features/git
windows/tauri/src/features/viewer
windows/tauri/src/features/git/utils/diff-buffer-label.ts
windows/tauri/src/features/git/api/git-diff-api.ts
windows/tauri/src/features/git/utils/git-diff-helpers.ts
windows/tauri/src/features/git/api/git-status-api.test.ts
.agents/notes/implemented/feature/2026-10-04-windows-commit-file-diff-preview.md
windows/tauri/src/features/git/hooks/use-commit-diff-review.ts
windows/tauri/src/features/git/services/commit-diff-review.ts
windows/tauri/src/features/git/utils/commit-diff-blocks.integration.test.ts
windows/tauri/src/features/git/components/diff/monaco-commit-block-controls.ts
windows/tauri/src/features/tabs/utils/tab-chrome-buffer.ts
windows/tauri/src/features/git/hooks/use-git-diff-actions.test.tsx
windows/tauri/src/features/git/hooks/use-commit-diff-review.test.tsx
rust/lithe-core/src/git/mod.rs
rust/lithe-core/src/tests/git.rs
windows/tauri/src/features/git/components/diff/commit-file-diff-toolbar.tsx
windows/tauri/src/features/git/components/status/git-status-panel.tsx
windows/tauri/src/features/git/components/status/git-workspace-status-panel.test.tsx
windows/tauri/src/features/git/components/diff/independent-commit-diff-surface.test.ts
Git验证新增、删除、重命名、二进制和多文件 Diff 的展示与定位;从源代码管理打开已修改和未跟踪文件的工作区 Diff 后保持静止,确认 Diff 不会自动关闭,且只在文件不再出现在 Git 状态中时关闭。 调整下方 Git Log 或终端高度时,上方 Diff 的全文测量、折叠和双栏规划不随尺寸重复计算;核对 GitCommitDiffReviewView、DiffReviewView 和共享 DiffPaneView 的新增/删除单栏、双栏、搜索/折叠/差异选择及收缩恢复行为。 长 Diff 双栏只创建可见区域附近的行;用 1,200 行夹具检查初始视口、滚动到末行和连续改变可见高度。 macOS 原生双栏 Diff 按 IDEA Islands/Darcula 配色显示新增绿、删除灰、修改蓝;JetBrains Mono Regular 13pt 与 22pt 行高;原版/新版行号分别固定在中央两侧,单侧增删后仍对应各自源文件行号。核对深浅外观、中央 1pt 分隔线、横向滚动和非等宽拖动后的连接带位置;单栏增删同步使用该配色。 双栏代码通过原生 NSTextView 连续选中,深色/浅色光标行号分别使用 A1A3AB/767A8A;整行修改背景按 IDEA 混合淡化,词内使用原修改色。分隔条允许先隐藏代码、再隐藏行号,双向完全收起后可恢复;窄窗口无负尺寸。1,200 行组件回归连续调整 60 次,检查文字存储不重建且固定容器排版不失效、透明定位/连接带不拦截代码点击。组件绘制耗时仅作诊断,完整应用的连续拖动视觉验收仍 pending。 历史提交 Diff 两行顶部显示紧凑工具栏与父/当前提交短哈希,左版本附中间省略的路径;隐藏补丁区块头,设置菜单保留词内高亮和关闭。切换单栏后版本标题上下排列,正文按旧/新顺序显示修改,左侧双源行号,仍可连续选中/复制。两侧滚动条按各自完整代码流标出增删改,点击跳至变更;纵向按视口三分之一锚点映射已有差异边界,匹配行连接带随滚动变平。检查真实原生 clip 偏移、标记颜色/点击、通知卸载和文字缓存不重建,保留共享折叠/区块操作。 历史提交页顶部按 Islands 独立工具栏层验证:40pt 内容、上 2pt/左右 6pt 留白与 6pt 圆角;版本标题四边 6pt 内边距、29pt 行高、1pt TEARLINE 底边;路径 13pt Regular/#73767C。布局选择由一个父外框及选中项边框绘制,检查未选项不重复描边、实际深浅像素和原生点击切换。 Windows 实现未改;完整工作区视觉与连续滚动性能验收保持 pending。 macOS 连续修改加多行插入、反向删除使用同一个左右源范围配对;纯插入/删除仍为绿/灰。检查行号、连接带、标记与整块正文一致,词内单侧变化使用增删色,滚动后空范围边界保留 1pt 线。 历史提交工具栏复用现有打开文件、当前提交内文件导航和 DiffCollapse,首尾/单文件箭头及删除文件打开入口禁用;双栏/单栏折叠、单区域展开和切换文件状态清理。版本标题使用真实布局高度,比较实际原生代码行转换到连接带的坐标,初始及滚动均无 29pt 偏移;中央宽度 24pt,源行号按真实字型测量并共享最大宽度,右数字不进入折叠空白区。Diff 错误条使用 14pt 宽标记(右 x=4、左 x=0),末行端点和 2pt 最小高度,滑块覆盖与点击定位保留。 Diff 正文和连接带不得绘制到工具栏或左右侧栏,平直连接带与行号区使用相同的排他行末端;差异导航不绘制蓝色竖线。只保留右侧纵向 thumb,左侧保留变更标记;真实窗口鼠标拖动右侧和底部横向 thumb 均改变代码偏移。嵌套工作区中将中央分隔条拖至两端后再次拉回,确认命中区域留在 Diff 内且外层面板不移动。多行调用重排按整段左右文本计算内部高亮,避免逐行配对造成绿色/灰色碎片;保留纯单侧内部变化颜色。 核对相邻等行数修改只高亮各行变化参数,正文保持淡色、中央保持原修改色;深浅主题下以 0/0.25/0.5/0.75pt 偏移验证相邻行背景无细缝。 中央连接带端点与行号填充采用相同设备像素覆盖范围;1×/2× 与小数滚动/拖动坐标下检查平直块跨中央区域无边框或接缝,保留曲线抗锯齿。 从源代码管理打开已修改和未跟踪文件的工作区 Diff 后保持静止,确认 Diff 不会自动关闭,且只在文件不再出现在 Git 状态中时关闭;在 Windows Commit、Git Log 及统一 Diff 中确认完整上下文不折叠,没有 hidden lines;核对中央行号两侧留白与竖线、Commit 动作区比 Git Log 更宽且不遮挡数字或代码,每个修改块仍可单独暂存;在 Windows 未暂存单文件 Diff 中点击某个修改块的“回滚”,2026-10-17 起与文件列表及整仓库丢弃一致遵守「丢弃前确认」设置:开启时先确认再恢复该块且暂存区不变,关闭时直接执行,最后一块回滚后文件从状态中消失时 Diff 关闭;暂存区、历史、分支比较与新增/未跟踪文件不显示回滚按钮。 在 Windows 从提交面板点击未提交文件,确认差异标签标题为「提交: 文件名」(英文为 Commit: <file>)并显示差异图标,悬停显示完整标题;在提交面板切换到另一个文件时同一标签标题随之更新;从编辑器 gutter 打开整文件差异时标题保持「未提交的更改」。 macOS 工作区、linked worktree、目录、冲突、行标记、分支/引用、历史提交和 Stash/Shelf Diff 均显示普通共享编辑标签;切回文件/媒体/终端/Agent 不清空比较,重新进入不重复添加标签。重排、拖动分屏与关闭空组合并沿用普通分组逻辑;关闭当前项只关闭活动标签,后台 Diff 不截获文件关闭命令;从 Diff 按钮、设置菜单或 ⌘W 关闭时只清理目标比较状态并拒绝迟到结果,关闭活动 Diff 优先恢复本组标签。 审核回归另核对无末尾换行、CRLF-only 和内容伴随 CRLF:不能用有损行投影显示已包含或写入块,整文件暂存及实际提交的 blob 字节必须与磁盘一致。暂存 B 后磁盘恢复 HEAD 的 a,仍应显示暂存版本和文件框;二进制 A→B 暂存后磁盘 C,文件框显示部分包含,点击包含剩余内容。Unix 在公共可遍历父目录验证临时上下文没有组/其他用户访问权限,Drop 清理 HEAD/index;本机 Windows 权限执行范围与 macOS CI 断言应分别记录。 Windows Git Log 单文件和 Commit 文件 Diff 的词级高亮、显示空白符、统一/并排切换均在左侧,最右侧统计当前文件差异,区分无差异/单数/复数;Commit 勾选、部分包含、取消及刷新后 included 数同步变化,全部包含仍显示数量;加载、切换文件及图片/二进制不显示文本差异统计。核对中英文、明暗主题、窄窗口和按钮选中/禁用状态。 Windows 单文件 Diff 上箭头在首处继续进入上一文件最后一处,下箭头在末处进入下一文件首处,集合首尾不循环、加载中禁用;Commit 文件列表随跨文件导航更新选中行并展开祖先、滚动到可见位置,保留编辑器焦点和 include 状态;同文件刷新、历史 Diff、无关仓库和迟到读取不扰动列表。 Windows Git Log 鼠标或上下键选择提交后,异步 Diff 自动定位第一处改动但保持提交列表键盘焦点;并排与统一预览均不调用初始 focus。双击/Enter 打开完整 Diff、主动差异跳转及跨文件导航仍进入编辑器。 macOS Commit/Shelf 标题栏创建补丁按钮使用共享工具栏按钮样式,悬停保持箭头;打开补丁弹窗检查共享浮层外观与主次按钮,列表选择、生成预览、关闭及应用确认流程保持不变。 macOS 标题栏仅显示创建补丁入口,不额外显示应用补丁按钮。创建和应用补丁表单使用 Commit 共享标题栏对话框、背景、留白与主次按钮;打开或取消原生文件选择器以及内部下拉菜单均不得清空表单。窗口打开时后台主窗口不能触发另一编辑,关闭后恢复交互;标题和内容继承同一应用语言,主窗口关闭仍释放面板与监听。 macOS 共享居中弹窗需在单次点击后立即显示,关闭和重新打开无需其他交互;重复点击不得新增窗口,取消或卸载后不得显示过期弹窗。原生 SwiftUI 状态回归由 LitheCenteredPopupTests 覆盖。 macOS Commit 与 Git Log/Stash 共用 RepositoryDiffView;核对搜索、空白比较、整文件及块级暂存/取消暂存/丢弃仍可用,新建/删除文件使用新版单栏,历史入口无写入动作。旧面板与无调用渲染组件删除;真实工作区视觉验收仍需执行。 字节保真回退:CRLF(autocrlf=false/true、.gitattributes eol=crlf)与无末尾换行文件在预置非空暂存的仓库中逐块回退,目标块恢复为暂存区对应内容、未涉及区域原样保留、index 内容与 staged diff 前后不变;filter 或 working-tree-encoding 属性不安全的文件继续整文件降级。 块级回退确认:「丢弃前确认」开启时,预览面与 Monaco 块箭头均先弹确认,取消不写、确认后按打开时目标执行;确认期间同文件快照刷新后确认返回时不写入并提示选中内容已变化,切换文件或仓库后确认返回时不写入且不在新目标显示提示;重复点击只保留一个确认;设置关闭时直接执行。 macOS GitModuleTests 验证从linked worktree打开Diff后暂存/取消暂存仍保留比较、回滚后关闭,调用根目录不变且历史cursor不被关闭;实机工作树整文件与块级动作、切换工作树/仓库及后台刷新仍需验证。 多 Diff 回归:同时打开两个文件和同一文件的不同提交,检查独立标签、同一比较去重、切换保留内容/滚动、分屏各自显示、关闭一个不影响另一加载、Git Log 换提交不改变旧比较及工作区退出释放全部会话。 EditorTabOrderFeatureModelTests 验证同文件显式新标签与普通去重并存、关闭一个不影响另一个;VcsProviderAppModelTests 用可控基线请求覆盖成功、关闭标签、关闭工作区及焦点保持,确认任务和数据映射清空。真实插件新标签与分屏仍待目标产品验收。
Windows Commit 单文件预览复用 Repository Diff 的新页面:中央行号、动态连接带、独立轨道与对应行同步,右侧块级包含框、左侧回退双箭头和手动/事件刷新。点击文件保持 HEAD 到工作区的完整比较,块包含通过真实暂存/取消暂存同步到文件列表;提交只使用已包含块的暂存内容。相邻修改不因 Git hunk 上下文合并而一起包含。回退只撤销未暂存部分并保留已有包含内容,点击双箭头按「丢弃前确认」设置执行(2026-10-17 规则变更,此前为直接执行),写入前重新验证快照;块写入期间提交保护,刷新保留滚动位置。核对新增/删除单标题、没有外圈与增删符号、轨道背景色一致、明暗主题和统一 gutter widget;真实临时仓库与有界组件回归已覆盖,完整 WebView2 的勾选、刷新及提交视觉/原生验收仍 pending。gutter 入口的整文件差异保持原标签。 修复状态映射备用入口和旧预览缺少工作区目标导致块控件缺失;按原显示路径解析嵌套仓库并补全元数据,迟到解析不得覆盖新比较。中央行号取消重复内边距并固定按钮左缘,关闭只读整行光标底色及内容宿主 title 气泡。真实 Chromium 中加载生产 React/Monaco,核对 Commit/Log 字体与色值、恢复缺失目标、块包含/取消/回退和滚动时控件及连接带位置;IPC 使用可控返回,不替代原生 WebView2 验收。 修复原生 Git 监听与只读快照的刷新循环:快照索引改用系统临时目录,不再创建 .git 子目录;保留外部变更监听与快照失效保护。真实 Git 回归检查读取前后仓库元数据目录时间及真实索引字节不变。 2026-10-05 完整原生 WebView2 独立配置验收通过 Commit 文件点击显示块框/双箭头、部分包含同步文件列表、回退保留索引及实际提交只包含勾选块;完整主题/长文件/快捷键验收仍 pending。 Windows Diff 取消默认上下文折叠,中央行号增加留白及主题边界竖线,Commit 每侧额外预留块控件宽度;双箭头与勾选框放在各自行号列的图标区,距外侧竖线保留对称留白、与数字保持间隔,不贴代码边缘。整文件新增保持无外圈。 行号与图标间距进一步收紧,方框水平居中于右侧行号和外侧竖线之间,左侧双箭头与行号镜像对齐,图标两侧等距;控件按首个改动行垂直居中;Commit 单文件预览保留轻量文件顺序,下箭头到最后差异后按需进入下一文件并定位首个改动,同一标签不循环。块包含、手动及事件刷新保留导航顺序,切换或关闭使迟到读取失效。 审核修复:EOF/CRLF 有损显示标识阻止新旧 Diff 的块写入,保留整文件入口;HEAD 到磁盘为空时显示真实暂存区内容并标注版本,显示回退不改变写入身份。整文件三态直接读取 staged/worktree,覆盖二进制、重命名及没有安全块的情况。新旧 Diff 块级双箭头 2026-10-17 起与文件/整仓库的丢弃确认统一遵守设置,设置描述已同步更新范围。Unix 临时索引目录在创建时设置 0700,保持原子占有及错误/正常销毁清理;Windows 保持用户临时目录继承权限。 Windows 两处单文件 Diff 共用工具栏:显示选项移到左侧,右端显示 IDEA 差异统计及 Commit included 数;英文文案、单复数和空白符稳定开关名参考 Community 源码。组件回归覆盖统计及开关行为,原生视觉验收 pending。 Windows 上下差异箭头补齐双向跨文件导航;Commit 列表从活动工作区预览的仓库/路径同步行选择和一次性虚拟滚动,沿用原有加载代次保护。组件回归覆盖双向边界、嵌套仓库、折叠展开、刷新及焦点/include 保持,完整原生验收 pending。 2026-10-06:用户确认 PR #1083 涉及的 Windows 功能改动均已完成实机测试,未发现问题;实机验收依据为用户反馈。 2026-10-22:Windows 单文件并排预览在 Git 连续变更块内部增加仅显示的 IDEA 式子块拆分(参考 Community ByWord.compareAndSplit / LineFragmentSplitter):按块内行词元相似度配对,完全相同的行按上下文不绘制,仅单侧存在的行恢复新增绿/删除灰,其余相似行保持修改蓝;无共享词元的相邻子块仍合并为修改块,超预算回退为整个 Git 块。Git 脚本、差异计数、块包含、回退与导航不变,单个 Git 块的控件只绘制一次。真实 17_menus.jsonl 的 115/113 行单块被拆出第 2、3 行新增子块;完整 WebView2 像素验收仍 pending。 2026-10-22 起文件导航按用户看到的列表顺序:Commit 面板单文件/批量 Diff 使用仓库→changelist→文件夹树或状态分组的行顺序,Git Log 提交预览、完整提交、范围与离散多选 Diff 使用提交文件树顺序;未跟踪目录汇总行不参与导航,重复路径稳定相邻。展示顺序由 orderGitStatusFilesForDisplay 与 gitFileTreeOrder 共用,面板和导航不再各自排序;组件回归覆盖混合状态与重复路径。 复用标签标题随当前选中比较更新:Git Log 预览箭头切换文件后,标签栏比较选中文件名而不是只看虚拟路径。 macOS 仓库 Diff 不再在根编辑区覆盖标签栏;采用带 UUID 的独立 repositoryDiff 标签及 GitRepositoryDiffSession:不同文件、提交、目录和引用比较可以并存,同一比较复用已有标签,服务与写入工作流仍由 GitFeatureModel 共享。EditorTabOrderFeatureModelTests 在深浅主题覆盖八种入口的实际原生分组、切换、分屏与关闭,GitModuleTests 覆盖异步结果隔离;Windows 现有 working-tree/commit-file-preview 已走普通标签,仅核对源码,完整两端工作区验收仍 pending。
版本控制 / Git项目文件树右键 Git 操作:比对单文件工作区/暂存区 Diff、添加(暂存)当前文件、暂存当前文件并打开提交面板;目录右键打开所属仓库的变更面板
git-explorer-context-actions
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Workspace/ProjectSidebarView.swift
macos/Sources/LitheGitModule/Models/GitFileContextMenuPlan.swift
已实现
待验证
证据路径
windows/tauri/src/features/file-explorer/hooks/use-file-explorer-context-menu.tsx
windows/tauri/src/features/file-explorer/lib/file-context-menu-git-file-items.ts
Git在文件树对修改、未跟踪、已暂存文件右键:Show Diff/Show Git Diff 打开该文件的工作区或暂存区 Diff;Add 将该文件加入暂存区并更新状态;Stage and Open Commit…(暂存并打开提交)暂存该文件并打开源代码管理提交面板,注意面板提交范围为当前暂存区的全部内容。目录右键 Show Diff/Show Git Diff 切换到所属仓库的变更面板(macOS 为目录差异视图)。无变更的干净文件不显示 Git 菜单。多仓库工作区下打开嵌套仓库文件的 Diff 后修改该文件,刷新仍读所属仓库。 覆盖 MM/AM 部分暂存后 Add 与 Stage and Open Commit,以及首次打开和刷新 Diff 的比较基准一致性。
版本控制 / Git提交历史与图谱
git-history
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Git
macos/Sources/LitheGitModule/Services/GitGraphLayoutService.swift
macos/Sources/LitheGitModule/Services/GitGraphHeadOrdering.swift
macos/Sources/Lithe/Views/Git/GitGraphColor.swift
macos/Tests/LitheTests/GitReferenceRowsBuilderTests.swift
macos/Tests/LitheTests/LitheSearchFieldStyleTests.swift
macos/Tests/LitheTests/GitReferenceTreeSelectionTests.swift
macos/Tests/LitheTests/LitheTreeRowStyleTests.swift
macos/Tests/LitheTests/GitReferenceRowRenderKeyTests.swift
macos/Tests/LitheTests/SplitHandleViewTests.swift
macos/Sources/Lithe/Theme/LitheTheme.swift
macos/Tests/LitheTests/BundledUIFontTests.swift
macos/Tests/LitheTests/GitGraphInteractionTests.swift
macos/Tests/LitheTests/GitCommitFileTreeLayoutTests.swift
macos/Sources/Lithe/Views/Components/LitheSplitPaneView.swift
macos/Sources/Lithe/Views/Components/LitheContextMenu.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchHoverTooltip.swift
macos/Tests/LitheTests/LitheSplitPaneCollapseTests.swift
macos/Sources/Lithe/Views/Git/GitConsoleView.swift
macos/Tests/LitheTests/GitConsoleToolbarTests.swift
macos/Sources/Lithe/Views/Git/GitGraphReferenceGroup.swift
macos/Tests/LitheTests/GitLogReferenceResizeTests.swift
macos/Tests/LitheGitModuleTests/GitGraphLayoutTests.swift
macos/Sources/Lithe/Views/Git/GitRepositoryEmptyView.swift
macos/Sources/Lithe/Views/Git/GitGraphView.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchToolWindowDock.swift
macos/Tests/LitheTests/WorkbenchSurfaceBackgroundTests.swift
macos/Tests/LitheTests/GitLogFilterLabelTests.swift
macos/Sources/LitheGitModule/Application/GitFeatureModel.swift
macos/Tests/LitheGitModuleTests/GitModuleTests.swift
macos/Tests/LitheTests/GitStatusObservationTests.swift
macos/Sources/Lithe/Views/Workbench/SplitHandleView.swift
macos/Tests/LitheTests/SplitHandleHitTestTests.swift
macos/Tests/LitheTests/DiffScrollSynchronizationTests.swift
已实现
待验证
证据路径
windows/tauri/src/ui/wheel-scroll-animation.ts
windows/tauri/src/ui/wheel-scroll-animation.test.ts
windows/tauri/src/ui/scroll-container-wheel.integration.test.ts
.agents/notes/implemented/bug-fix/2026-10-08-windows-git-log-wheel-animation.md
windows/tauri/src/features/git
windows/tauri/src/features/git/utils/git-graph-layout.ts
windows/tauri/src/features/git/utils/git-graph-colors.ts
windows/tauri/src/features/git/utils/git-graph-layout.test.ts
windows/tauri/src/features/git/components/log/git-commit-details.tsx
windows/tauri/src/features/git/components/log/git-commit-details.test.tsx
windows/tauri/src/features/git/hooks/use-git-diff-actions.test.tsx
windows/tauri/src/features/git/hooks/use-commit-file-preview.ts
windows/tauri/src/features/git/components/log/git-commit-inspector.tsx
windows/tauri/src/features/git/components/log/git-commit-inspector.test.tsx
windows/tauri/src/features/git/components/log/git-commit-file-tree.tsx
windows/tauri/src/features/git/hooks/use-commit-file-preview.test.tsx
windows/tauri/src/features/git/components/diff/commit-file-diff-preview.tsx
windows/tauri/src/features/git/components/diff/commit-file-diff-toolbar.test.tsx
windows/tauri/src/features/git/utils/commit-file-diff-navigation.test.ts
windows/tauri/src/features/git/components/diff/commit-file-diff-version-header.tsx
windows/tauri/src/features/git/components/diff/commit-file-diff-preview.css
windows/tauri/src/features/git/utils/commit-file-diff-appearance.ts
windows/tauri/src/features/git/utils/commit-file-diff-appearance.test.ts
windows/tauri/src/features/git/utils/commit-diff-chrome-geometry.test.ts
windows/tauri/src/features/git/components/diff/independent-commit-diff.tsx
windows/tauri/src/features/git/components/diff/independent-commit-diff-surface.ts
windows/tauri/src/features/git/components/diff/independent-commit-diff-surface.test.ts
windows/tauri/src/features/git/utils/independent-commit-diff.test.ts
windows/tauri/src/features/git/utils/monaco-diff-rows.test.ts
windows/tauri/src/features/git/utils/independent-commit-diff.ts
windows/tauri/src/platform/system-date-time.ts
windows/tauri/src-tauri/src/date_time.rs
windows/tauri/src/features/git/utils/git-log-date.test.ts
windows/tauri/src/features/git/components/log/git-log-date-cell.test.tsx
.agents/notes/implemented/bug-fix/2026-10-06-windows-git-log-system-date-format.md
windows/tauri/src/features/git/components/diff/commit-file-diff-toolbar.tsx
windows/tauri/src/features/git/components/log/git-log-title-bar.tsx
windows/tauri/src/features/git/components/log/git-commit-table.tsx
windows/tauri/src/features/git/components/log/git-graph-row.tsx
windows/tauri/src/features/git/components/log/git-create-tag-dialog.tsx
windows/tauri/src/features/git/components/log/git-create-tag-dialog.test.tsx
windows/tauri/src/features/git/components/log/git-commit-table-tag.test.tsx
windows/tauri/src/features/git/components/log/git-log-branch-actions.test.tsx
windows/tauri/src/features/git/components/log/git-reference-tree.tsx
windows/tauri/src/features/git/components/log/git-reference-tree.test.tsx
windows/tauri/src/features/git/utils/git-repository-colors.ts
windows/tauri/src/features/git/components/log/git-commit-table-keyboard-menu.test.tsx
windows/tauri/src/features/git/api/git-tags-api.test.ts
windows/tauri/src-tauri/src/platform.rs
windows/tauri/src/features/git/utils/git-graph-filter-projection.ts
windows/tauri/src/features/git/components/log/git-graph-row.test.ts
windows/tauri/src/features/git/components/log/git-commit-table.filter.test.tsx
windows/tauri/src/features/git/components/log/git-commit-table.toolbar.test.tsx
windows/tauri/src/features/git/components/log/git-log-branch-filter.tsx
windows/tauri/src/features/git/utils/git-log-branch-filter.ts
windows/tauri/src/features/git/utils/git-log-branch-filter.test.ts
windows/tauri/src/features/git/stores/git-log-preferences.store.ts
macos/Tests/LitheTests/Fixtures/GitGraph/issue410-idea.txt
windows/tauri/src/features/git/utils/git-graph-geometry.ts
windows/tauri/src/features/git/utils/git-graph-colors.test.ts
windows/tauri/src/features/git/utils/git-graph-geometry.test.ts
windows/tauri/src/features/git/hooks/use-git-graph-paint.ts
windows/tauri/src/features/git/hooks/use-git-graph-paint.test.tsx
windows/tauri/src/features/git/components/log/git-graph.css
windows/tauri/src/features/git/hooks/use-git-log-controller.integration.test.tsx
windows/tauri/src/features/git/components/log/git-commit-table.navigation.test.tsx
macos/Tests/LitheTests/Fixtures/GitGraph/issue410-date-idea.txt
macos/Tests/LitheTests/Fixtures/GitGraph/issue410-context-idea.txt
shared/fixtures/git/history-page-date-request-v1.json
windows/tauri/src/features/git/components/log/git-graph-row.theme.test.tsx
windows/tauri/src/features/git/components/log/git-commit-inspector.test.tsx
windows/tauri/src/features/git/utils/git-graph-highlights.ts
windows/tauri/src/features/git/utils/git-graph-highlights.test.ts
windows/tauri/src/features/git/utils/git-graph-reference-group.ts
windows/tauri/src/features/git/utils/git-graph-reference-group.test.ts
windows/tauri/src/features/git/components/log/git-graph-reference-label.tsx
windows/tauri/src/features/git/components/log/git-commit-table.presentation.test.tsx
windows/tauri/src/features/git/hooks/use-git-graph-reference-metrics.ts
windows/tauri/src/features/git/components/log/git-commit-file-tree.tsx
windows/tauri/src/ui/scroll-area.tsx
windows/tauri/src/ui/dialog.tsx
Git分页浏览提交历史、分支图谱和提交详情,确认日期、作者和文件列表一致;macOS Git Log 工具窗口标签悬停有反馈,点击窗口内外时选中标签背景在活动色与非活动色之间切换,标签文字保持相同颜色与常规字重,按下时不变暗;分支最新提交的图谱连线从提交圆点开始,不超出到圆点上方;在双端使用同一包含本地分支、远端引用、标签和合并提交的仓库,核对永久图布局、图头引用排序、合并边投影及跨越 30 行的紧凑长边;在本地分支新增提交后确认分支颜色保持稳定,且不会因共用屏幕泳道直接沿用父分支颜色。双端使用 Community 完整颜色 ID 及明暗主题 RGB 规则;macOS Git Log 不再显示单独的 Fetch/Compare/Checkout/Cherry-pick 横向操作栏,分支树与竖向工具栏分离;检查 Fetch、分支比较、分支右键 Checkout、提交右键 Cherry-pick 和 Fetch 设置仍可用,分支搜索可筛选嵌套路径,并隐藏无匹配项的分组、显示无结果提示;定位按钮滚动到当前所选分支的首个可见提交而不重新加载历史;Git Log 的分支和提交搜索框复用 全局唯一的 LitheSearchFieldStyle,对照 IDEA SearchFieldWithExtension,核对 13pt 常规提示文字、Islands 明暗控件底色与边框色、36pt 外框内的 30pt 可见高度、3pt 外层留白、1pt 常态内描边、向外扩 1pt 的 2pt 聚焦描边及 4pt 圆角;图标与文字间距为 2pt,输入框清除按钮复用已有 16pt IDEA SVG 和 20pt 按钮区域,按上游预留清除图标宽度,移除分支搜索框重复外层水平内边距,提交搜索框按 15 列字体度量和 150pt 最小宽度布局,Search 与 Database 搜索输入框使用相同共享样式;竖栏更新按钮采用 IDEA ExpUI 的明暗 update 图标,按钮与侧边栏图标悬停使用共用工具提示样式,提示的明暗背景、文字色、1pt 内描边、圆角及内边距对齐 IDEA HelpTooltip;隐藏与显示分支使用 IDEA ExpUI 的 chevronLeft/chevronRight 明暗图标;竖栏宽 36pt,展开态按钮为 22pt 且四周保留工具栏内边距,展开态分支树左边框复用与 Commit 标题下边框同源的 1pt 分隔线;收缩态竖栏常态复用展开态侧栏背景,展开与收缩保留提交图谱和详情视图实例、滚动状态及分支宽度,仅切换分支面板与分隔条的占用宽度,按钮占满竖栏,深色 hover 使用 Islands Dark 的 #FFFFFF17,浅色 hover 使用 ExpUI Gray12,不在右侧显示 Show Branches 浮层提示,图标在顶部留 8pt 并使用常规小字号文字;展开后恢复分支树宽度。 使用原生 NSHostingView 渲染验证共享 LitheSearchTextField 的占位文字在深浅主题均为 IDEA Component.infoForeground 对应的 #73767C、13pt 常规字重;空输入框单独绘制占位文字,避免 SwiftUI 原生 prompt 替换其颜色与字重,有内容时占位文字消失并保留原生编辑和主文字色。 Git Log 分支树按 IDEA Community Islands 普通密度核对 24pt 行高、无行间额外间距、13pt 常规文字、12pt 次要计数与 4/12pt 树边距;展开箭头、路径文件夹、普通分支、当前分支和标签使用上游 16pt 明暗 SVG,Local/Remote/Tags 标题不附加图标,当前分支不显示额外蓝色勾选;HEAD 与当前分支是两个互斥选中节点,点击分支、HEAD、清除筛选和切换仓库时核对选中状态;深浅主题核对树行焦点/失焦选中色及 hover,保留多仓库名称、圆点、数量和只读菜单,移除分支行仓库色条;Windows 多仓库分支树的仓库行与 macOS 一致,仓库行使用中性色文件夹图标,并只在图标与名称之间显示 8px 仓库色点,仓库名保持普通文字色,不出现整组着色卡片底色、左侧色条或彩色名称,截断名称通过共享工具提示显示全名,行悬停为箭头光标;确认搜索、分组折叠、右键操作、缓存行比较和滚动状态正常。 Git Log 分支树右侧分隔线与 Commit 标题下边框共用 LitheTheme.toolWindowBorder 和 1pt 厚度,深色为 #26282C、浅色为 #E9EAEE;悬停、拖动开始/移动/结束均保持同色,不高亮,保留原生调整光标、命中区域、拖动尺寸约束及提交宽度行为。 Git Log 中间栏按 IDEA Community FilterComponent、VcsLogGraphTable 和 PaintParameters 核对四个筛选器的 13pt 常规文字、4pt 内边距、16pt 箭头和仅文字悬停反馈;工具栏使用 16pt IDEA 明暗 SVG、22pt 点击区域和共享提示,保留动作及禁用条件;提交列表为 26pt 连续行,图谱尺寸同比缩放,作者与日期同为 13pt 主文字色,日期列按打包字体度量,核对深浅主题行 hover、焦点/失焦选中色及选中覆盖 hover,筛选、分页、箭头命中、上下键导航和右键操作不回归。 分支竖栏设置齿轮复用 LitheIconButtonStyle 的 22pt 点击区域、4pt 圆角和主题 hover/按下背景;点击使用 LitheContextMenuPresenter 的共享操作菜单背景、1pt 边框、行 hover 与键盘导航,保留 Fetch Options 对话框、Show Worktree Repositories 勾选和无工作树时禁用行为,点击外部或按 Esc 关闭菜单。 macOS 下拉菜单仅保留 Project 同源的一套全局共享样式,移除 settingsStyle 切换;Project、Git Log 设置、Terminal、欢迎页及右键子菜单统一使用 8pt 外框圆角、1pt 内描边、24pt 行高、12.5pt 文字、6pt 外留白和 8pt 行内边距,设置选择下拉框共享同一外框与尺寸定义; Git Log 顶部按 IDEA 恢复 Branch: 已选分支名称,保留 Branch 筛选、清除和菜单内勾选;Branch、User、Date、Paths 按 IDEA FilterComponent 保留 4pt 内边距、3pt 箭头间距和 13pt 常规文字,四项文字 hover 为白色且不增加底色。Date 使用共享菜单呈现器,Branch/User 的可搜索列表与分组子菜单使用共享 LitheDropdownRowStyle、24pt 行高和共享菜单外框,Paths 输入面板复用共享菜单外框及搜索输入框样式,保留搜索、选项选中、路径 Apply/Cancel/Clear 和时间范围计算。 Branch/User/Paths 原生弹窗锚点不参与鼠标命中,核对按钮与文字收到 hover/点击、菜单正确弹出且关闭后可再次打开;Date 保持共享菜单呈现器。共享下拉外框裁剪内部内容,明暗主题下 Branch/User 搜索条不能覆盖圆角;Paths 输入框复用共享输入样式并显示正确焦点边框,Clear/Cancel/Apply 复用共享次按钮/主按钮,保留路径应用和清除行为。Branch、User、Paths 的可搜索内容同样使用 LitheContextMenuPresenter 的透明无边框面板,去掉 NSPopover 系统外框,复用 Project 共享背景、1pt 边框和圆角;分组展开与搜索动态调整弹窗尺寸,Esc、点击外部和切换菜单正确关闭。选择分支后清除筛选,确认 Branch 恢复默认标题且关闭按钮消失;关闭按钮保留 16pt closeSmall 明暗 SVG、22pt hover 区域及 4pt 圆角。展开分支树左侧固定线、中间分隔线和右侧详情拖动线均使用 toolWindowBorder 的 1pt 边框,右侧 hover 与拖动不高亮。右侧详情展示图标使用 IDEA previewVertically 明暗 SVG,装饰开关使用 show 眼睛而非 hide 工具窗口减号;所有工具栏展示图标复用 22pt、4pt 圆角的共享 hover 背景,保留原动作与提示。深浅主题渲染核对背景和边框,保留可选图标、勾选、快捷键、禁用、子菜单和键盘导航。 Git Log 提交标题、作者和日期使用 Inter 13 Normal,引用标签 12pt;核对至少 26pt 的字体度量行高、含 leading 的整数基线、长标题与中文/emoji 截断,以及选中合并提交的文字颜色。 所选分支存在时 Log 标签显示 Log: 分支短名(包含 codex/ 路径),选择另一分支立即更新;清除分支筛选后恢复 Log,保留本地化标题、原始分支名和原标签选择/焦点行为。 macOS 标题起点按缩放图谱列距、图文间距和 2pt 文字内边距计算,为对齐参考截图至少预留六列,密集行继续扩宽,不改变图谱节点、连线和箭头命中;在 SwiftUI/AppKit 两条渲染路径核对未选中的合并提交标题、作者、日期统一使用合并灰色,选中后恢复普通文字色,合并判定仅依赖至少两个父节点。 Git Log 右侧文件树使用共享 24pt 行高、19pt 层级缩进、常规字重、文件类型图标和 IDEA FileStatus 文件名颜色,无逐行横线及工具栏重复总数;核对文件夹折叠、文件打开 diff、长名称 hover 展开与横向滚动,拖动宽度不重建行内容。提交详情使用 14pt 外边距、10pt 内间距、等宽 bold 标题、同段作者邮箱时间与引用标签,长内容可滚动;文件树/详情之间分隔线复用共享边框,hover/拖动不高亮。左侧分支树从 180pt 专用下限改为共享 30pt 下限,独立 36pt 竖栏保持原宽,窄树裁剪后可拖回原宽,收缩/展开不重建图谱。 图谱圆点、连线、箭头按 SimpleGraphCellPainter/ PaintUtil 的 FLOOR/ODD 物理像素规则对齐;在 1×/2× 原生位图验证圆点与线宽,在真实 NSHostingView 检查对齐后的上下斜向箭头尖端及内侧描边可导航,切换屏幕只重绘且绘制/命中坐标一致。 时间列复用 Inter 13 常规字体的等宽数字与固定 AM/PM 区域,按应用语言使用英文 12h AM/PM 或中文 24h 格式;核对午夜、正午、未知日期回退、行起点一致及切换语言后的原生日期缓存失效,列表两条渲染路径和提交详情使用相同格式。 连续上下拖动 Git Log,包含上方长 Diff:原生列表只调整可见区域,保持文档身份、滚动位置、Shift/Command 多选、焦点色、键盘与箭头导航、分页和辅助功能;收缩再恢复后列表宽高正确。GitGraphInteractionTests 使用 300 条提交、80 次原生尺寸变化和共享分隔条事件验证,局部新旧路径计时作为诊断,不代替目标工作区帧率验证。 共享分隔容器按已有宽高直接分配两个面板与分隔条的确定矩形,避免 HStack/VStack 最小及理想尺寸探测;splitPaneBounds 覆盖横纵方向、leading/trailing、折叠、子视图身份和有限尺寸,达到尺寸限制后的相同结果不重复写状态。 通过键盘或程序化切换焦点时 Git 标签活动态双向更新;挂载或重新显示 Git Log 不主动抢走编辑器焦点。 在包含展开分支树的 Git Log 中连续拖动外层高度和内部宽度:共享分隔器只在拖动开始/结束传播环境状态,嵌套容器继承祖先状态;拖动期间共享行悬停不更新、提示不登记几何锚点、右键覆盖层暂停,松开后恢复菜单和提示,行内容及滚动状态不重挂载。69 行原生分隔条事件回归检查覆盖层暂停/恢复及内容身份;未悬停控件在平时同样不登记提示锚点。用目标工作区 Time Profiler/Animation Hitches 对照 Terminal 核对持续更新成本及起止开销,split.drag 整次手势时长不能当作单帧延迟;本次仅前端共享交互装饰调整,不修改后端及默认详情高度行为。 中文输入法组词期间,即使绑定文本仍为空,共享 LitheSearchTextField 占位文字立即隐藏;取消组词或删空后恢复,确认中文后仍隐藏。原生 setMarkedText 回归覆盖明暗主题和两个输入框互不影响;保留焦点、键盘提交、搜索/过滤语义及占位字号颜色。原生背景观察视图卸载和移出窗口时清理通知,匹配当前窗口的字段编辑器及所属输入区域,不修改业务绑定。 四个筛选弹窗均以各自按钮左下角为定位锚点,Date 不依赖鼠标点击坐标;空间不足时限制在屏幕可见范围内。原生面板回归核对操作菜单/可搜索内容相同锚点下的左上角、无展开动画和 Esc 关闭回调。共享搜索字段在未聚焦时悬停也显示文本编辑光标,离开或禁用时恢复箭头。 Git Console 左侧六个现有动作使用 Community 原始 16pt 明暗 SVG;22pt 背景、竖向 2/1 按钮留白、5/7 外边距和默认箭头光标。核对查找、软换行、跟随、停止、清空、复制的原有动作与禁用状态,组件资源检查不替代完整应用验收。 按 Community CurrentBranchHighlighter 标出当前本地分支可达的所有父提交,包含合并父节点;深色 #1D2336、浅色 #EDF3FF,选中背景优先,仅已加载图谱可证明的祖先被标记,当前分支/HEAD 单独筛选时不重复染色。引用默认显示并按 GitRefManager/SimpleRefGroup 紧凑合组:本地与上游同提交显示 remote & branch,HEAD/本地/远端/标签使用官方黄/绿/紫/灰轮廓及叠层,标签单独存在时默认只显示图标;长名称按列宽和 22 字符下限缩写,原生可见区 tooltip 保留所有完整名称,滚动后按当前鼠标位置解析。明暗原生渲染检查颜色、宽度、选择优先级及完整名称;GitLogReferenceResizeTests 在真实 GitLogView 中加载 1000 个分支并拖动外层高度,检查可见右键覆盖层数量和挂载生命周期,计时仅作诊断。最新正式预览已进入该工作树,观察全部引用下的深色背景、叠层缩写标签和多次上边缘拖动后的布局恢复;用户随后在本机明确确认“现在不卡顿了”,本次报告的高度拖动卡顿通过用户实机验收;组件计时和混合工作区采样不用于推断唯一根因或量化通用帧延迟,其他主题/悬浮等视觉项继续按各自范围验收。 在 Windows Git Log 选中带多行正文的提交,确认右侧详情在标题下方完整显示正文(保留空行与缩进),复制提交信息和打开提交 Diff 时也包含正文;分支最新提交的图谱连线从提交圆点开始,不超出到圆点上方;在双端使用同一包含本地分支、远端引用、标签和合并提交的仓库,核对永久图布局、图头引用排序、合并边投影及跨越 30 行的紧凑长边;在本地分支新增提交后确认分支颜色保持稳定,且不会因共用屏幕泳道直接沿用父分支颜色。双端使用 Community 完整颜色 ID 及明暗主题 RGB 规则。 读取提交正文期间切换仓库、重新打开另一提交或关闭面板,确认迟到结果不会打开旧 Diff 或覆盖新请求的加载状态。 Windows 另验证:单击提交后编辑区预览该提交第一个文件的 diff;单击或双击 Commit files 中的文件只显示该文件的 diff(不含提交说明,也不显示文件列表),并复用同一个预览标签;Commit files 树中过长的文件或目录名不折叠为省略号,区域随最宽行横向展开,可通过横向滚动条或触控板侧滑左右滑动查看完整名称(与源代码管理变更树一致);Git Log 刚打开、尚未点击提交时不会自动打开 diff;日期列将有 UTC 偏移的提交转换到本机时区后显示相对时间(刚刚、N 分钟前、今天/昨天);英文绝对日期和时间通过 Windows 原生接口遵循系统短日期/时间及用户自定义格式,中文使用中文地区格式,未知偏移仍显示绝对日期;验证美式月/日/年、英式日/月/年、自定义分隔符、12/24 小时制、跨时区相对时间和迟到原生结果保护,真实 WebView2 产品验收为 pending;鼠标移入行时刷新相对时间;作者/日期列可在行内列边缘拖动调整宽度并在重启后保留。 非连续多选提交修改同一路径时,预览保留每个提交的 diff 和提交标识,可通过文件导航分别查看;延迟请求返回前取消选择、隐藏 Git Log、切换仓库或卸载工具窗,确认旧请求不会重新打开或激活预览标签。 Windows 端提交历史仅通过 Git Log 工具窗浏览:源代码管理侧栏入口已更名为 Commit 面板,其 History 标签已移除,面板固定显示变更列表与提交区。命令面板中的 Git: Show History 入口同步移除。 Windows Commit Files 单文件预览使用独立页面:上下箭头导航差异,下箭头在当前文件最后一处后继续进入下一文件并在比较完成后定位第一处差异,整个文件集合末尾禁用且不循环;图片、二进制和无文本差异文件也允许下箭头继续,比较未就绪时禁用以防连续点击跳过文件。左右箭头直接切换当前比较集合的上一文件/下一文件;标签使用 IDEA 的 Repository Diff: 文件名并跟随导航更新,不附加提交 hash。Jump to Source 按最后聚焦侧的补丁位置打开预览所属仓库的文件,重命名使用新路径、删除行映射邻近保留行、已删除文件禁用源跳转;模型更新期间禁用差异动作。保留并排/统一视图、空白显示、Monaco 查找、图片和二进制呈现,普通全量提交比较仍使用多文件页面。真实 WebView2 内核及源文件打开还需目标产品运行验收。 Windows 单文件历史 Diff 外观验证:并排视图使用独立外侧 12px 滚动轨道、8px 滑块和概览,通常的统一视图保留 Monaco 原生 Diff 组件,整文件新增使用真实新行流的独立只读控件,深浅主题检查常态/悬停/拖动色、圆角及边框;实际拖动任一并排滑块后按差异边界同步对应行且模型身份保持。工具栏使用现有 Button,核对 40px 高度和 22px 图标按钮;保留用户字体与字号,默认行距按 14px 字号对应 22px 并随缩放,自定义行距不覆盖。词级高亮开关复用现有 Monaco 装饰能力,关闭只隐藏字符差异、保留整行差异,切换文件保留词级和空白开关。旧/新版本标题显示真实第一父提交、范围基线/目标或非连续提交各自身份,根提交旧侧为空树,重命名显示旧/新路径;短 hash 和截断路径的 tooltip 保留全文。并排标题列宽由独立布局所有者更新 CSS,拖动分隔条时标题跟随且不重建模型;统一视图标题纵向排列。以上浏览器真实组件验证不替代目标 WebView2 产品验收。 Windows 单文件 Diff 滚动条回归:两侧横纵滚动条默认显示,鼠标移到工具栏后仍可见,不依赖悬停;差异概览不绘制重复的宽矩形视口指示,并排由独立外侧轨道负责点击、拖动和滚轮,统一视图保留原生委托。明暗主题、并排/统一视图及长文本双向溢出下检查唯一可见滑块、并排横向同像素偏移同步、纵向对应行同步和模型身份。 历史 Diff 两侧滚动轨道与代码编辑器概览画布背景透明,鼠标不悬停时滑块仍显示;关闭代码编辑器重复概览通道,但保留 Diff 专用差异色条。横向轨道不额外增加内容高度,检查代码能显示在滑块后、底部内容与滚动位置正确,拖动命中保留,并排两侧横向同像素偏移同步、纵向对应行同步。 Windows 并排单文件 Diff 使用两个独立只读 Monaco 代码控件,取消 DiffEditor 的补空白对齐。左右横向滚动按同一像素偏移双向同步,较短侧由 Monaco 钳制到真实内容边界且不反向拉回主动侧;纵向原生代码区、外侧滑块拖动/点击、轨道键盘、滚轮和查找以视口三分之一处为锚点,按 Git 差异块起止边界同步对应行并保留行内偏移,短侧在不等长块内钳制、共同上下文恢复对齐。同步有重入与微小方向保护;双模型替换、布局、字体配置和显式上下导航期间暂停同步。新增旧侧/删除新侧画横跨可见代码区的双像素零行边界,修改区画上下单像素边界;两列行号背景为直边,曲线只在两列之间弯曲,实际偏移改变端点形状。检查文件开头/末尾零行、三态、明暗主题和窄列,代码不补空白、不扩展横向范围;连接面覆盖两列历史行号背景,行号选择和源映射正确。左右外侧各显示透明常显纵向滑块与增删改概览,横向保留原生滚动条,滚动范围截止真实最长代码行。验证深浅主题、折叠展开、Ctrl/Cmd+F 搜索折叠文本、词级开关和预算、统一视图及跨文件首处定位、连续拖动和窄窗口非负尺寸。高频帧二分筛选可见差异,缓存像素边界及概览,不扫描全文、不更新 React;卸载和迟到语言准备清理所有帧、监听、观察器、拖动、两个编辑器和模型。浏览器生产组件验证使用平台记录器,真实 WebView2 产品验收仍为 pending。 外侧轨道预留独立空间,不显示代码;左轨道距面板边缘、右轨道距代码视口各留 4px 间隙,窄列随可用宽度缩减,右侧文字与轨道不重叠;并排和统一预览关闭缩进及括号引导线,保留语法颜色;中央行号缩小边距和曲线间隙,整数布局边界及上下半像素描边消除与代码区的垂直接缝。滚轮在代码、行号和轨道统一加快到两倍,拖动仍映射各侧真实进度,纵向同步对应行;方向键按用户行高移动。有词级结果时修改正文底色按 40% 修改色与 60% 页面背景混合,完整修改色突出替换词的两侧,纯新增和纯删除词分别使用完整增删色,语法前景色和文字透明度保持;关闭词级或超限保留整行底色。验证三态与开头末尾、双向对应行同步、明暗主题、轨道无遮挡、宽窄字体布局和预算回退。 单文件并排及统一视图隐藏补丁 @@ 标题,但保留真正以 @@ 开头的源码、行 ID、源行映射和原始补丁;默认多文件与暂存投影不变。Islands Dark 继承 Darcula 背景,Islands Light 使用 Light 方案,独立差异轨道标记与连接、代码边界共用对应差异背景色。底部保留五个用户实际行高的 padding,模型不增加假行;从任意侧滚到底部验证共同末行对齐与五行留白,字号/行距变化同步更新。 Windows 单文件 Diff 首次打开、左右切文件和同路径新比较均在模型/比较准备完成后定位第一处改动;定位只消费一次,调整词级、空白、字号或主题保持用户当前位置。统一视图的原生 Monaco 增删行、字符与行号栏使用该预览相同的 Islands 背景变量,移除默认字符边框;新增整文件应为深色 #294436 或浅色 #BEE6BE,删除为 #484A4A 或 #D6D6D6,语法前景色不变且其他编辑器主题不被覆盖。 整文件新增采用单流只读代码控件,隐藏不存在的旧侧与连接带,新增背景覆盖行号、代码和底部留白,避免空旧模型的灰色删除行及外圈;新增仅显示新版本、删除仅显示旧版本的一组 hash 与路径。并排两侧及新增单流轨道的增删改标记与对应内容背景共用颜色;原生统一预览关闭 renderIndicators,历史行号旁不显示 +/-。这组新增显示修复按用户要求延后运行验证,提交或 PR 前核对新增文件、普通修改、删除、深浅主题、查找、源跳转与底部留白。 Windows Git Log 单文件和 Commit 文件 Diff 的词级高亮、显示空白符、统一/并排切换均在左侧,最右侧统计当前文件差异,区分无差异/单数/复数;Commit 勾选、部分包含、取消及刷新后 included 数同步变化,全部包含仍显示数量;加载、切换文件及图片/二进制不显示文本差异统计。核对中英文、明暗主题、窄窗口和按钮选中/禁用状态。 Windows 单文件 Diff 上箭头在首处继续进入上一文件最后一处,下箭头在末处进入下一文件首处,集合首尾不循环、加载中禁用;Commit 文件列表随跨文件导航更新选中行并展开祖先、滚动到可见位置,保留编辑器焦点和 include 状态;同文件刷新、历史 Diff、无关仓库和迟到读取不扰动列表。 Windows Git Log 右下角 Commit files 列表同样跟随 Diff 的上一/下一文件导航:选中行移到当前文件,被折叠的父目录自动展开,行滚动到可见位置;预览属于其他提交或范围时不改变选中,点击行不会改变横向滚动。 Windows Git Log 筛选后基于完整已加载历史投影可见祖先:隐藏中间提交以虚线连接,直接父子保持实线,无关分支不误连;合并路径去重并保留永久颜色,未加载父提交经隐藏节点传播,分页补齐后解除缺失标记;清空筛选恢复原图,核对文本、作者、分支名称三种范围、空结果与选择行为。算法和真实表格组件回归通过不代替 WebView2 原生验收,原生验证保持 pending。 Windows 未筛选图与筛选图共用上下半边打印元素:普通浏览的跨行泳道换列必须在共同中点连续连接,合流入边保留各自颜色到提交圆点;核对原始 IDEA 200 条历史输出的列号、方向、终止和颜色身份;截图/原生交互验收仍为 pending,组件输出和 golden 对照不代替 WebView2 验收。 Windows Git Graph 外观:核对明暗主题真实 IDEA RGB、实心节点、直线与筛选虚线、终止箭头及至少六列标题预留;默认 26px 行高,用户字号变化时虚拟行与 SVG 同步扩高;在 100%/125%/150%/200%/300% 缩放及跨屏 DPI 变化下核对奇数物理像素和相邻半边连续性,普通视口调整不重建历史图。箭头能跳到已加载且可见的父/子提交,未加载父节点没有可点击目标;浏览器生产组件验证不代替目标 WebView2 运行验收,原生验证保持 pending。 Windows 历史排序和图导航:在交错分支仓库核对首批/分页/回退及全引用上下文均使用日期顺序,切换分支保持可证明的永久颜色和基础顺序;上下文最多 5000 条,覆盖不完整或哈希重复时保留可见页并回退。核对 upstream/backup 等非 origin 远程引用分类及本地含斜杠分支;背景上下文不阻塞 50 条可见页,分页不取消或重读上下文,切仓库/刷新/卸载取消旧操作且关闭迟到游标。长边开关展开/收起不改变提交、筛选、选择和游标;验证 30/1000 行边界。点击或用 Enter/空格激活上下箭头,选择并滚动到屏幕外端点,挂载后键盘焦点随目标;不误选源行、不误开源行 Diff,保持普通选择/多选/双击/右键和原预览入口。明暗主题及 1x/1.25x/2x 检查箭头尖端与命中范围,真实 WebView2 运行验收保持 pending。 图谱颜色必须跟随 ThemeRegistry 根 data-theme-type 切换;不依赖页面存在 dark class。复用真实 Lithe 明暗主题检查同一已挂载节点与连线的颜色变化、布局不因主题重算,结合主题回归和浏览器真实切换验证。 Windows 分页稳定性:选中顶部提交后向下滚动触发连续分页,确认滚动位置不跳回已选提交,Commit Files 不清空或重读,已选文件及树折叠保持;更新引用、背景上下文和相同 hash 的元数据同样不导航。定位分支头通过独立请求仍能定位已经选中的头提交一次;新选择或切仓库仍读取新文件并丢弃旧结果。组件回归与真实浏览器虚拟列表/IntersectionObserver 验证通过,目标 WebView2 实机验收保持 pending。 Windows Git Log 标题栏不显示固定 Read-only/只读文字,关闭按钮保持靠右,刷新、设置及隐藏操作正常。 Windows Git Log 单个提交右键 New Tag… 输入非空且无空白的标签名,创建指向右键提交完整 hash 的轻量标签并刷新引用和历史;取消不写入,失败保留名称可重试,双击/Enter 不重复创建,多选和写操作期间禁用。仓库或工作区切换关闭旧弹窗,旧请求迟到不得刷新或关闭新弹窗。 Windows 提交区域点击后上下箭头更新可见提交选择和详情,焦点不随虚拟行移除而丢失;筛选、首尾边界、Home/End、Shift 范围选择和 Enter 正常,菜单与输入框保留自己的方向键。 Windows Git Log 鼠标或上下键选择提交后,异步 Diff 自动定位第一处改动但保持提交列表键盘焦点;并排与统一预览均不调用初始 focus。双击/Enter 打开完整 Diff、主动差异跳转及跨文件导航仍进入编辑器。 Windows Git Log 提交右键 New Tag 使用与 Tags 节点同源的 TagIcon(沿用现有标签轮廓图案),核对 16px 图标、菜单对齐和禁用反馈;新补图标的实机视觉确认待完成。 Windows 提交列表菜单键和 Shift+F10 打开当前选中提交的真实菜单;关闭后列表继续上下键导航,菜单操作仍针对所选提交。New Tag 在 tag.gpgSign=true 下生成轻量标签,不运行签名器或消息编辑器,不修改配置。 Windows 提交行高亮和紧凑引用组:在全部引用和其他分支视图核对当前检出分支全父祖先背景,当前分支/HEAD 视图关闭重复高亮;合并提交的说明、作者、日期未选中时弱化、选中后恢复,选中背景优先于分支并区分列表/文件树/窗口焦点。核对明暗主题固定基准色、真实 upstream 合并名称、游离 HEAD、每种最多两个叠加图标、仅标签图标和完整汇总悬停/无障碍提示。宽窄列及字号变化时按至少 22 字符缩略规则布局,只有一个视口尺寸观察器,列拖动不逐行读取宽度,卸载清理;分页不丢滚动/选择,成功后不重读 Commit Files;文件读取失败时 Commit Files 面板显示重试入口,重新选择同一提交或刷新历史也会重试一次,长边导航和新建标签原入口保持。组件与浏览器验证通过,目标 WebView2 实机验收 pending。 Windows Git Log 分支树和提交列表的普通滚轮使用 Community Windows 默认 200ms 和 (0.5,0.505,0.5,1) 曲线;连续同向累积、反向从当前位置重启。核对两处列表的中间帧、Shift 横向滚动、分页保持、顶底边界、键盘定位和滑块拖动取消惯性、关闭工具窗清理帧以及减少动态效果偏好。确定性动画与 DOM 回归通过,真实 WebView2 设备手感验收保持 pending。 Windows graph 标题不再固定预留六列:建议宽度取可见图边数的加权均值与标准差,最多以六列作统一基线,每行按节点与斜边中点扩展,密集行不把其他简单行扩成最大列宽。验证单线/少分支、罕见密集合并、超过六列、筛选、长边开关、引用标签可用宽度及字号/DPI,保持图谱颜色/连线/导航不变。 Windows Git Log 的 Commit Files 文件树沿用 IDEA Windows 默认 200ms 滚轮动画;在文件行、竖向/横向滚动条区域连续滚动、反向及 Shift 横向滚动,确认共用真实视口的动画目标,长文件名保持自然宽度;按下滚动条取消未完成惯性,减少动态效果时直接滚动,切换提交及卸载不残留帧。其它 ScrollArea 默认行为不变。真实 WebView2 交互验收 pending。 Windows Git Log 右键 New Tag 打开弹窗后焦点直接位于标签名输入框,无需点击即可输入,Enter 提交、Esc 关闭。 macOS Git Log 空状态:在非 Git 项目检查明暗主题、窄窗口和键盘操作:13pt 常规文字按 IDEA 左对齐,整组位于内容区上方三分之一处;显示 To track changes to code、GitHub/GitLab 官网链接、Initialize Git repository…、Open Git Settings 和带原始 ContextHelp 图标的 Version control integration(打开 Git 官方文档)。初始化仍先确认,不自动暂存或提交;设置打开既有 Git 设置。未提交仓库、无匹配提交、加载失败及重试保持原动作,所有空状态操作采用文字按钮。 非 Git 项目空状态隐藏 Log/Worktrees/Console 标签、添加按钮、分支树与动作条、筛选/搜索工具栏及提交详情,提示占满工具窗内容区;GitHub、GitLab、初始化、设置及帮助链接悬停仅给当前文字加主题强调色下划线并显示手形,离开后恢复;初始化或切换至真实仓库后恢复原有三栏布局,真实仓库无匹配提交仍保留筛选入口。 空状态字体与间距对照 Community c7f91397:按钮标签显式使用 Inter 13pt Regular;行首破折号按首行基线对齐,21pt 行高加 2pt 间隔,帮助图标间隔 2pt;灰字与链接分别沿 Component.infoForeground 和 Islands Link.activeForeground 核对明暗主题,悬停下划线仍使用当前主题强调色。 macOS 右侧提交详情的分支标签按可见区域懒加载,全部引用仍可滚动查看。重开面板初始化时恢复匹配的提交图和分支树,第一次布局即可读取全部已缓存数据,不依赖出现后的异步任务回填。重开面板复用未变化的分支树,单仓库不重复构建分组副本,多仓库活动根复用已有三类行;引用、仓库、工作树开关、折叠状态改变后拒绝旧树。原生绘制与无障碍日期文本复用缓存,语言改变后刷新。 macOS 大量引用首屏:同提交放置 1,500 个本地分支和 1,500 个远程引用,核对真实 upstream 优先、同名远程自然排序回退、完整提示及每类图标上限;反复切换 Terminal/Git Log,数据版本相同应复用已准备图,改变分支/筛选/图显示选项后不得复用旧图。运行 GitGraphInteractionTests 的 manyReferenceGroups 和 presentationCache;组件耗时仅诊断,整机卡顿以相同数据实测为准。 macOS Git Log 及终端按需创建后由工作台持有实际原生宿主;隐藏再重开及移动停靠位置复用控件。运行 GitLogReferenceResizeTests,验证同一工作台隐藏再重开时,固定原生表面上的提交文档和滚动容器对象身份不变,恢复可见性且尺寸正确,工作台释放后宿主释放;核对语言、主题、搜索、分支操作和终端会话。 Git Log 与终端同时停靠时,从外层横向和纵向分隔条中央及向面板两侧偏移 4pt 处,经窗口发送按下、拖动、松开,确认完整 10pt 命中区仍能提交尺寸、宿主身份保持,面板中央正常交互。;macOS 保留宿主圆角需在明暗主题、侧栏顶部与移动后、项目辉光改变、渐变开关及背景图切换时,与原工作台树四角像素一致(WorkbenchSurfaceBackgroundTests.retainedPaneCornersMatchWorkbenchGradient)。 Windows HEAD 按 Community HeadNodePainter 核对外圈、背景间隔和中心实点:26px 行高、100% 缩放时三层直径为 13/9/5px,125%/150%/200%/300% 按物理像素 FLOOR/ODD 对齐;深浅主题、悬停、当前分支及活动/非活动选择均透出真实行底色,穿过 HEAD 的连线不侵入间隔。普通节点及分叉、筛选、长边展开保持;同边双向终止元素键唯一。目标 WebView2 实机验收保持 pending。 macOS 在明暗主题的窄 Git Log 工具栏中选择长用户名、分支和路径,确认名称与选中值以同一行尾部截断,文字不重叠,清除按钮和重新选择仍可用。 macOS Git Log 接近底部时自动追加较早提交,正常浏览不出现必须点击的加载更多按钮;单一页面最多发起一次边缘请求,追加保留选择和原生视口偏移。无新提交或缺失后续游标时停止并释放游标;失败暂停自动读取,显式刷新重开历史而不重用失败游标。运行 GitGraphInteractionTests.automaticHistoryPaging 与 GitModuleTests.continuousHistoryPagingStopsOnDuplicatePagesAndRefreshesAfterFailure,真实大仓库连续滚动和 Windows WebView2 验收仍 pending。 macOS 深层历史后台刷新:文件状态变化不重开首批,元数据刷新保留已加载窗口和后续页占位,未变结果不重建提交图;外部新提交按可见 hash 与行内偏移保持原生视口,按新行位移补齐旧尾部,保留尾部选择。当前仓库引用只读取一次,多仓库仍独立加载。后台刷新打断自动分页后,即使历史相同也能继续读取新游标;失败仍暂停自动重试。运行 GitModuleTests.backgroundRefreshRetainsDeepHistoryAndSelectionWhileExternalCommitsStillAppear、引用聚合回归及 GitGraphInteractionTests.backgroundHistoryRefreshAnchorsVisibleCommitInsteadOfSelectedCommit/automaticHistoryPaging;真实大仓库长时间滚动仍待用户验收,原生进程 cleanup 超时未独立复现,不将减少重复查询等同于修复所有进程失败。 macOS #1542:显示保留的 Git Log/终端时,横纵分隔条中央及两侧偏移 4pt 仍经窗口事件完成拖动且只提交一次,宿主身份不变;根命中查询深度始终为 1,面板内部连续 100 次查询不产生额外根查询,鼠标移动不回查祖先 SwiftUI。验证禁用、收起(含嵌套分隔条)、恢复、卸载、跨窗口与登记表隔离、实时移动/裁剪、隐藏/透明和弱引用释放;保留宿主内部仍正常命中,外层边缘优先。Diff 两端收起后在普通与保留侧栏下均能经窗口拖回,不触发外层拖动。运行 GitLogReferenceResizeTests、SplitHandleHitTestTests 和 DiffScrollSynchronizationTests;旧实现先出现嵌套命中断言失败,新实现通过。较新 macOS 原生组件回归不替代 macOS 13 Intel 原报告崩溃验收,目标环境验证保持 pending。
Windows 两处单文件 Diff 共用工具栏:显示选项移到左侧,右端显示 IDEA 差异统计及 Commit included 数;英文文案、单复数和空白符稳定开关名参考 Community 源码。组件回归覆盖统计及开关行为,原生视觉验收 pending。 Windows 上下差异箭头补齐双向跨文件导航;Commit 列表从活动工作区预览的仓库/路径同步行选择和一次性虚拟滚动,沿用原有加载代次保护。组件回归覆盖双向边界、嵌套仓库、折叠展开、刷新及焦点/include 保持,完整原生验收 pending。 Windows 筛选图沿用 macOS/Community 双向最近可见祖先算法和隐藏边界分组;通过统一打印元素使用保留边身份的 SVG 半边绘制,未筛选和筛选共用同一绘制入口。 Windows 移除未筛选 SVG 的泳道数组推断路径,统一消费 printElements;图宽计入斜向边界中点;外观采用 macOS/Community 完整颜色生成、实心点、直线、方向箭头和字号/DPI 绘制尺寸。 Windows Git Log 显式请求 Core 既有 date 顺序,并独立加载有界仓库上下文,在唯一且完整覆盖当前页时复用永久布局;远程引用身份来自真实引用集合。长边默认紧凑,可展开并保留安全上限,箭头透明按钮复用物理像素几何和既有选择/虚拟滚动。焦点由目标 DOM 挂载消费,拒绝替换提交或筛选的旧请求,不轮询。 Windows 将图谱数据重绘与选择/明确导航区分,分页不再触发选择定位;Inspector 按仓库与实际比较身份读取文件,保留文件树和预览代次保护;只有失败的读取可重试(失败身份与当前选择一致时才重试,避免旧失败让新选择重复加载)。 Windows 按 macOS/Community 补齐当前分支范围、合并文字和活动/非活动选择;引用由独立纯分组模型准备,共享视口字体/宽度度量绘制原始 TagPainter 图标,分组不改变真实引用。 Windows Git Log 两处滚轮显式启用共享动画绑定;每帧只更新视口,保留虚拟列表和既有事件换算,其他滚动区默认行为保持。 Windows 移除固定六列最小标题留白,按 Community PrintElementGeneratorImpl 和 GraphCommitCellUtil 的建议宽度及逐行占用混排图形与说明;真实 IDEA oracle 的 Width 输出也参与回归。macOS 保留已有标题留白,本次只调整 Windows。 Windows 连线改用单一连续 SVG,沿完整边身份拼接相邻半边;HEAD 采用 Community 独立尺寸和外圈加实点,裁掉圆内连线使背景间隔不依赖行状态副本。 连续图层只为虚拟列表及上下各一行生成节点、路径和 HEAD 裁剪,SVG 高度随窗口而非全部历史增长,按全局行偏移定位且边身份稳定;5,000 条历史、四行视口及换列分叉滚动边界有确定性回归,空虚拟范围不绘制。真实 WebView2 滚动性能仍待验收。 Git Log 工具栏按 IDEA 调整:文本筛选框缩短为固定宽度,输入后按 Enter 才搜索(清除按钮立即清空,输入法组词期间的 Enter 不触发);在文本筛选右侧新增 Branch 下拉,可搜索并按 Local/远程分组选择分支(不含 Tags),选中分支后右侧出现 × 一键回到 All;展开的下拉在鼠标位于菜单中部时也能用滚轮上下滚动(WebView2 滚轮粘连到被裁剪子元素的问题,由通用 Dropdown 把滚轮应用到自身滚动容器);所选分支按仓库保存,重新打开项目后恢复,分支已被删除时回退为 All。组件回归覆盖 Enter 搜索、下拉选择、按仓库持久化和分组排序,WebView2 实机验收 pending。 Windows 提交详情双栏 diff 的正文首列与中央 tearline 竖线保留 1px 间距(lineDecorationsWidth: 1),文字不再贴线;行号列与连接带几何不变。 macOS 修复 #1342:Git Log Branch/User/Date/Paths 的名称与选中值共用单段文字布局,保留各自颜色,窄宽度统一尾部截断,避免独立 Text 压缩导致重叠。 macOS Git 主日志新增原生边缘自动加载,保留有界后端分页和可见区域绘制;Windows 已有 IntersectionObserver 自动加载入口,本次未改动。 macOS 后台状态与历史上下文刷新分开,元数据检查原子替换已加载窗口,原生视口按可见提交锚定;复用当前仓库引用结果,避免重复读取。
版本控制 / Git大型未跟踪目录汇总与按需展开
git-large-untracked-directories
已实现
待验证
证据路径
rust/lithe-core/src/git/untracked_directories.rs
rust/lithe-core/src/tests/git_untracked_directories.rs
macos/Sources/Lithe/Views/Git/ChangesSidebarView.swift
macos/Sources/Lithe/Views/Git/GitChangeSectionsCache.swift
macos/Sources/LitheGitModule/Application/GitFeatureModel.swift
macos/Sources/LitheGitModule/Models/GitModels.swift
macos/Tests/LitheTests/GitChangeSectionsCacheTests.swift
macos/Tests/LitheGitModuleTests/GitModuleTests.swift
.agents/notes/implemented/bug-fix/2026-10-21-git-large-untracked-directories.md
rust/lithe-core/src/git/mod.rs
已实现
待验证
证据路径
rust/lithe-core/src/git/untracked_directories.rs
windows/tauri/src/features/git/api/git-status-api.ts
windows/tauri/src/features/git/services/git-untracked-directory-expansions.ts
windows/tauri/src/features/git/utils/git-untracked-directories.ts
windows/tauri/src/features/git/components/status/git-status-panel.tsx
windows/tauri/src/features/git/utils/git-status-model.ts
windows/tauri/src/features/git/utils/git-changelists.ts
windows/tauri/src/features/file-explorer/lib/file-tree-git-status.ts
windows/tauri/src/features/git/utils/git-untracked-directories.test.ts
windows/tauri/src/features/git/components/status/git-workspace-status-panel.test.tsx
rust/lithe-core/src/git/mod.rs
rust/lithe-core/src/tests/git_untracked_directories.rs
Git在仓库中放入未被忽略、超过 100 个文件的构建目录(如 rust/lithe-core/target/),以及包含多个 linked worktree 的 .worktrees/。打开 Commit 面板:构建目录只显示一行目录节点和「N 个文件」,状态栏与 ChangeList 计数按文件统计;.worktrees/ 不被汇总,已发现的 worktree 不出现在父仓库列表。展开目录只加载下一层,子目录继续显示为带数量的节点;构建写入触发刷新后展开状态保持,目录被删除或暂存后展开状态清除。勾选目录节点暂存全部文件,丢弃目录节点删除其中未跟踪文件,搁置后能完整恢复目录内容;项目树中该目录下的文件仍显示未跟踪颜色,编辑器行标记正常。多仓库和单仓库模式下滚动与帧率不随变更数量下降。 Windows 另检查目录视图与平铺视图:折叠的汇总显示为带「N 个文件」的目录行,展开后由同名文件夹代表该汇总,折叠该文件夹即收起汇总,已记住的文件夹折叠不能挡住展开内容;单击汇总行不打开 Diff,「显示 Diff」与查看全部变更跳过汇总本身;删除汇总只删一次目录;页脚计数、项目树颜色、编辑器装订线与行历史对汇总目录下的文件按未跟踪处理;把汇总移到 ChangeList 后暂存并提交,提交范围包含其文件。 Core真实仓库回归核对status argv/output不含201个无关文件、200个长路径分批且未选文件保留、方括号字面文件名不影响邻居、以??开头的重命名源不误解析为未跟踪;macOS测试核对同级展开保留、旧目录列出不能覆盖新局部状态,实机大型仓库滚动与延迟仍需验收。
#1385:Core 的 git.status 新增 summarizeUntrackedDirectories,使用 Git 的 normal 未跟踪视图,只汇总不含嵌套仓库的整目录;git.untrackedDirectory 按层列出。macOS 变更列表改为扁平行直接交给 LazyVStack,只构建可见行。Windows 由写入 repositoryStatuses 的状态读取开启汇总,展开内容在同一次读取中列出并发布,Shelf 等一次性读取保持逐文件;状态列表原本已虚拟化。 共享Core回滚查询仅扫描字面所选路径,复用porcelain v2解析消费重命名源记录,状态和clean按路径预算分批;不再按每个文件枚举全库未跟踪目录。macOS局部发布只清理已确认根的展开状态,过期子项读取不能恢复旧行或折叠较新展开。
版本控制 / Git行级修改历史:编辑器行号右键查询一基闭区间行范围的提交历史;以未保存编辑器快照为查询基准,映射到钉住的 HEAD 提交(工作区与 .git 只读,快照经平台临时目录比对),插入行提示尚无提交历史、改写行提示无法可靠对应;多行选区仅在右键落在选区行范围内时整体查询,行首光标不多查一行;删除行不扩大追踪区间;重命名跟随并记录历史路径;第一父链语义,合并条目标注相对第一父的比较基准,分支内部提交不单列,纯重命名不列为内容变更;条目携带定位范围,点开单文件提交差异并定位相关变更块;上限截断提示、超时取消与迟到结果丢弃
git-line-history
未实现
不适用
证据路径
rust/lithe-core/src/git/mod.rs
shared/contracts/rust-core-api.md
已实现
待验证
证据路径
windows/tauri/src/features/git/api/git-line-history-api.ts
windows/tauri/src/features/git/api/git-line-history-api.test.ts
windows/tauri/src/features/git/components/git-line-history-popup.tsx
windows/tauri/src/features/git/utils/line-history-selection.ts
windows/tauri/src/features/git/utils/line-history-selection.test.ts
windows/tauri/src/features/editor/context-menu/editor-context-menu-items.tsx
windows/tauri/src/features/editor/components/monaco-editor.tsx
rust/lithe-core/src/tests/git.rs
GitWindows:未保存顶部插行后右键原内容行,历史归属正确且不串行;右键纯新增行提示尚无提交历史、右键改写行提示无法可靠对应;选中多行后分别右键范围内与范围外行号,确认查询范围服从落点且行首光标不多查一行;删除中间行后查询两侧行,中行专属提交不出现;重命名文件后历史仍可追溯且条目显示历史路径;构造分支合并后查询主线行,合并条目显示相对第一父徽标,被合入分支内部提交不单列;点开普通条目与合并条目,确认打开单文件差异并定位到相关变更块、合并条目与列表使用同一比较基准;构造超过上限的历史确认截断提示;关闭弹层后确认在途查询被取消且迟到结果不重开界面。macOS:共享 Core 命令已具备,界面入口未实现,待后续接入。
版本控制 / Git本地 ChangeList:持久化文件分组、按当前列表批量暂存及提交范围保护
git-local-changelists
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Git/GitChangelistBar.swift
macos/Sources/Lithe/Views/Git/ChangesSidebarView.swift
macos/Sources/LitheGitModule/Application/GitFeatureModel+Changelists.swift
macos/Sources/LitheGitModule/Application/GitFeatureModel+WorkspaceCommit.swift
macos/Sources/Lithe/Platform/MacOS/Storage/MacGitChangelistStorage.swift
macos/Tests/LitheGitModuleTests/GitLocalChangelistsTests.swift
macos/Tests/LitheGitModuleTests/GitModuleTests.swift
macos/Tests/LitheTests/MacGitChangelistStorageTests.swift
shared/fixtures/git/local-changelist-scope-v1.json
macos/Sources/Lithe/Application/Composition/CommitWorkflowComposition.swift
macos/Sources/Lithe/Application/Features/CommitWorkflowCoordinator.swift
macos/Tests/LitheTests/CommitWorkflowChangelistTests.swift
macos/Tests/LitheTests/ContextMenuCoverageTests.swift
macos/Sources/Lithe/Views/Components/LitheCenteredPopup.swift
macos/Tests/LitheTests/LitheCenteredPopupTests.swift
macos/Sources/Lithe/Views/Components/LitheCommitDialogStyle.swift
已实现
待验证
证据路径
windows/tauri/src/features/git/components/git-changelist-bar.tsx
windows/tauri/src/features/git/components/status/git-status-panel.tsx
windows/tauri/src/features/git/stores/git-changelists.store.ts
windows/tauri/src/features/git/utils/git-changelists.ts
rust/lithe-core/src/git/workspace_commit/path_scope.rs
shared/fixtures/git/local-changelist-scope-v1.json
windows/tauri/src/features/git/stores/git-changelists.store.test.ts
rust/lithe-core/src/tests/git_workspace_commit.rs
windows/tauri/src/features/git/api/git-changelist-storage.ts
windows/tauri/src/features/git/components/git-changelist-bar.test.tsx
windows/tauri/src/features/git/components/status/git-workspace-status-panel.test.tsx
windows/tauri/src/features/settings/components/tabs/git-settings.tsx
GitmacOS Commit 文件树使用 13pt 文件名、路径及计数、24pt 行高、19pt 层级缩进、16pt 文件类型图标和 24pt 三态复选框画布;按 Islands 编辑配色显示修改、新增、删除、重命名、冲突及未跟踪,分组无常驻选中背景。核对明暗主题、普通/部分/全选、禁用/键盘焦点、行点击、Command/Shift 多选和原暂存目标;资源回归不能代替完整应用验收。macOS 共享下拉选择器闭合框遵循 Islands:深色底 #26282C、浅色白底,1pt 普通边框、2pt 展开或键盘聚焦描边,28pt 高及 4pt 圆角;验证设置页与 Commit 的深浅外观、键盘聚焦及选择功能。macOS 变更列表行的新增、重命名、删除图标成组靠右,下拉选择器保持左侧;调整面板宽度时检查对齐与点击。macOS Commit/Shelf 标题页签首项左侧留白 8pt、可见页签间距 8pt,文字距选中框左右各 8pt;核对深浅主题、切换及窄面板时右侧按钮可用。macOS Commit 对话框打开时,点击后台新增/编辑不会覆盖当前名称或编辑对象;关闭后恢复,字段和按钮继承应用语言。macOS 与 Windows 分别创建本地配置列表,将 application.yaml 移入其中并保持默认列表为当前提交列表;点击全部暂存只能包含默认列表。外部暂存配置文件时提交必须被拦截,取消暂存后只提交功能文件,保留其后续未暂存编辑及配置内容。验证新建、重命名、删除确认、文件多选移动(Windows 同时支持目录)、分组勾选、当前列表切换、重启及文件干净后再次修改的归属;多仓库、工作树与项目互不串组,重命名的旧新路径都受保护。子模块父引用被排除时提交失败,关闭父引用联动后可提交子仓库。保存数据损坏或写入失败时禁止继续暂存和提交。 Windows 两个项目窗口先同时初始化,交错修改不同工作区后用第三个实例重载,配置归属和提交排除范围都必须保留;验证旧格式迁移不覆盖原数据。macOS 在差异读取或 AI 生成期间切换列表、切走再切回或修改归属,旧结果不得回填当前提交说明。 macOS 更改列表下拉使用共享 LitheSettingsSelect,按列表 ID 切换;默认名称随界面语言本地化,自定义名称原样显示,提交中或存储不可用时禁止编辑和切换。 macOS 新建与重命名弹窗使用共享输入框、主次按钮和浮层外观;检查名称输入、中文组合输入、Enter 保存、Escape 取消及错误提示。 macOS 变更列表选择器使用共享菜单最小宽度,与新增、重命名及删除按钮按 Commit 工具栏间距紧凑排列;三个按钮使用 IDEA 明暗图标及共享工具栏按钮样式,禁用状态弱化且无悬停高亮。批量暂存与提交范围说明只在选择器悬停提示中显示,父仓库引用选项独占下一行。 macOS 新建及重命名变更列表使用 LitheCenteredPopup 的带标题栏对话框配置;确认输入焦点、Enter 保存、Escape 取消和主窗口移动时居中。 确认新建、重命名变更列表使用独立的共享对话框样式;新建文件/目录保留 lithePopupNameField;中文组合输入及 Enter 提交正常。 macOS 共享居中弹窗需在单次点击后立即显示,关闭和重新打开无需其他交互;重复点击不得新增窗口,取消或卸载后不得显示过期弹窗。原生 SwiftUI 状态回归由 LitheCenteredPopupTests 覆盖。 macOS Commit 新建、重命名变更列表试用 LitheCommitDialogStyle:原生标题栏、带直角焦点边框的名称框和共享主次按钮,保留现有名称、Cancel/Save、校验及存储逻辑;不添加备注、激活选项或自动命名。失焦保留,Esc/关闭取消。新建文件/目录的轻量输入框不受影响。 Windows 窄面板检查正常状态显示列表管理栏及独立的父仓库引用选项,悬停当前列表选择器显示含当前列表名称的提交范围说明;切换列表后提示随之更新,配置损坏时错误仍可见,范围外已暂存文件仍阻止提交。Windows 设置 > Git > 视图中“显示变更列表”和“显示更新父仓库引用”默认开启(仅 Windows):关闭前者后选择器、新建/重命名/删除按钮和变更树分组节点消失,所有文件直接列出,已暂存文件无论原属哪个列表都可一起提交,已保存的分配保留并在重新开启后恢复;关闭后者只隐藏勾选并按开启提交;两者都关闭时整栏不显示。
双端均已接入本地分组、持久化及共享 Core pathScope 提交保护。分组按完整文件路径,不支持单文件内按 hunk 拆分;不自动重写暂存区。macOS 使用偏好存储 adapter,Windows 使用按工作区独立键保存的 WebView 本地存储。两端原生构建和交互验收均待目标平台验证。 Windows 与 macOS 一样将普通提交范围说明放到 ChangeList 选择器的悬停提示中,不再常驻占用列表高度;配置不可用仍显示错误,暂存与提交范围保护不变。 Windows 父仓库引用选项移到 ChangeList 栏并由共同父组件持有;选择器使用线框填充样式,默认列表名称与 Swift 相同,文件不再按 tracked/untracked 拆开同一 ChangeList。 Windows 提交面板与提交历史文件树的同级排序对齐 intellij-community 的 TreeModelBuilder:目录节点先于文件节点,文件名按 FileNameComparator 语义自然排序(数字按数值、忽略大小写、大小写仅作平级决断、'-' 与 '_' 等价);项目树等其他视图保持原排序。
版本控制 / Git多仓库变更折叠分组
git-multi-repository-change-groups
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Git/ChangesSidebarView.swift
macos/Sources/Lithe/Views/Git/GitChangeSectionsCache.swift
macos/Sources/LitheGitModule/Models/GitModels.swift
rust/lithe-core/src/git/mod.rs
已实现
待验证
证据路径
windows/tauri/src/features/git/components/status/git-status-panel.tsx
windows/tauri/src/features/git/components/git-commit-panel.tsx
windows/tauri/src/features/git/components/git-workspace-commit-review.tsx
windows/tauri/src/features/git/services/git-workspace-commit-workflow.ts
windows/tauri/src/features/git/services/git-workspace-commit-workflow.test.ts
windows/tauri/src/features/git/components/status/git-workspace-status-panel.test.tsx
windows/tauri/src-tauri/src/platform.rs
shared/fixtures/git/workspace-commit-workflow-v1.json
Git在同一工作区打开多个 Git 仓库,确认变更按仓库折叠分组;只剩一个仓库有变更时仍显示仓库名。仓库级和文件级勾选与 Git 暂存区同步;子模块只有未提交文件时显示提示,不能勾选未变化的引用。
两端直接消费共享 Rust Core 的计划、依赖排序、执行结果与重试。平台负责真实暂存勾选、确认与结果界面、认证取消和项目生命周期。原生界面实测待平台验收。
版本控制 / Git多仓库引用面板:分组、配色与引用操作
git-multi-repository-references
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Git
macos/Sources/LitheGitModule/Application/GitFeatureModel.swift
macos/Tests/LitheGitModuleTests/GitModuleTests.swift
已实现
已验证
证据路径
windows/tauri/src/features/git
windows/tauri/src/features/git/components/log/git-reference-tree.tsx
windows/tauri/src/features/git/components/git-branch-manager.tsx
.agents/notes/implemented/feature/2026-09-24-windows-git-log-multi-repository-groups.md
windows/tauri/src/features/git/hooks/use-git-log-tag-deletion.ts
windows/tauri/src/features/git/hooks/use-git-log-tag-deletion.test.tsx
Git在多仓库工作区打开 Git Log:确认按仓库分组、仓库配色、非活动仓库分组只读,点其它仓库的引用会切换活动仓库且只加载一次,Pull 弹窗可选择远程分支与策略。 Windows 无已保存折叠设置时,单仓库与多仓库的 Tags 默认折叠、Local / Remote 默认展开;手动展开 Tags 后重新打开面板仍保留选择,已有折叠设置继续生效。 Windows 明暗主题中普通本地、远程分支均复用顶部分支按钮的空心 VcsIcon,当前分支勾选、收藏星标、标签与文件夹提示保持可辨认。 macOS 在两个分支名不同的仓库间切换时不得查询旧分支;目标历史读取失败也不能保留旧仓库的提交、分页或文件详情。 Windows Git Log 本地和远程分支右键菜单的拷贝分支名称在删除之前,删除是最后一个操作并单独分组;当前分支无删除入口,执行 Git 写操作时删除仍禁用。 Windows Git Log Tags 标签节点右键菜单最后一组提供 Delete,点击后直接删除活动仓库本地标签,不弹二次确认;失败保留引用和选择,成功后清除被删标签的历史筛选并刷新。非活动仓库及写操作期间禁用;旧工作区/仓库的动作回调不得发起删除,迟到结果不得刷新新仓库或释放新请求状态。 Windows Tags 的 Delete 与分支和提交节点删除复用相同 TrashIcon,明暗主题图标与禁用状态一致。
2026-10-06:用户确认 PR #1083 涉及的 Windows 功能改动均已完成实机测试,未发现问题;实机验收依据为用户反馈。
版本控制 / GitRebase 与 Stash
git-rebase-stash
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Git
macos/Sources/LitheGitModule/Models/GitSavedChangesSnapshot.swift
rust/lithe-core/src/git/rebase_session.rs
rust/lithe-core/src/protocol/cancellation.rs
rust/lithe-core/src/tests/git_history_rewrite.rs
已实现
待验证
证据路径
windows/tauri/src/features/git
rust/lithe-core/src/git/rebase_session.rs
rust/lithe-core/src/protocol/cancellation.rs
rust/lithe-core/src/tests/git_history_rewrite.rs
windows/tauri/src/features/git/components/stash/git-saved-changes.tsx
windows/tauri/src/features/git/components/stash/git-saved-changes.test.tsx
windows/tauri/src/features/git/api/git-stash-diff-api.test.ts
windows/tauri/src/features/git/hooks/use-git-saved-changes-operations.ts
windows/tauri/src/features/git/stores/git-saved-changes-operations.store.ts
windows/tauri/src/features/git/stores/git-saved-changes-operations.store.test.ts
windows/tauri/src/features/git/services/git-shelf-workflow.test.ts
windows/tauri/src/features/git/api/git-patch-api.test.ts
windows/tauri/src-tauri/src/shelf_storage.rs
rust/lithe-core/src/git/patch_exchange.rs
rust/lithe-core/src/tests/git_patch_exchange.rs
Git执行 Rebase 和 Stash 保存/恢复,确认冲突处理。macOS Stash 页使用上下可调整分栏;中间图标打开创建 Stash/Shelf 弹窗,名称和 Untracked 原语义不变。选择保存记录后查看含未跟踪文件的文件树,复用 Git Log 只读 Diff;Shelf 暂存/工作区补丁分版本查看。验证 Apply/Pop/Restore 与右键删除、切换记录和仓库时旧加载不覆盖新选择。组件和 Core 检查后仍需真实界面深浅主题验收;Windows 未同步此布局。 分支标签按上游分支类型着色,hover 原位展开完整名称/日期/分支且不改变行布局;展开区域仍可右键操作。Stash 分隔条悬停/拖动不变亮;从保存记录 Diff 返回 Git Log 文件时必须显示历史内容,Git 自定义颜色/无前缀设置不得影响保存记录文件路径。连续切换文件时左右 Diff 滚动条标记须同步替换,切到无差异内容须清空旧标记。 共享原生 rebase 执行后的状态读取沿用正常请求剩余期限和取消能力;仅在读取前已取消或超时才启用独立两秒清理期限。运行取消模块确定性回归和真实仓库历史改写用例,核对 edit/conflict、continue/skip/abort、过期 amendment、清理超时与异常后的状态恢复;两端真实原生界面验收仍为 pending。 Windows 默认及舒适密度下检查 Shelf/Stash 树正文随界面字号变化,深浅主题下点击循环箭头可刷新保存记录。 补充真实 Git 回归:暂存删除后保留与 HEAD 相同或不同内容的原路径,以及暂存重命名后重建源路径,搁置后工作区干净,恢复后索引与磁盘内容均保持原样。
Windows Stash 页签聚合 Shelf 与 Git Stash,提供搜索、文件树和只读 Diff;Stash 按不可变 OID 执行 Apply/Pop/Drop。Shelf 先持久化暂存与工作区补丁,再通过 Core 方向校验清理;恢复按暂存、工作区顺序执行,全部成功后删除记录,冲突或部分失败保留记录。重试复用 Core 只读逆向检查,仅跳过已恢复的补丁层;暂存层只检查索引,检查失败不删除记录,两层恢复后删除失败可继续重试。存储位于 app data 并按工作区隔离,原生运行时验收 pending。 Windows 保存改动列表使用随界面字号变化的 ui-text-sm,默认 13px;刷新按钮使用 IDEA refresh.svg。 列表和选择绑定仓库会话及加载版本,切换或刷新立即隐藏旧记录,加载失败阻止写入并允许刷新重试;A→B→A 后旧删除确认和恢复守卫仍失效。原生 Shelf 键区分 WSL UNC 路径大小写,普通 Windows 键保持兼容;旧 WSL 桶保留且不自动迁移。验收需延迟或拒绝 B 仓库加载后尝试操作 A 记录,并核对 WSL Repo/repo 保存、恢复和删除互不影响。工作区存储按仓库和操作标识持锁,整个 Git 面板卸载后重挂载仍不释放未完成操作;验证 A 的迟到成功或失败不解锁 B,回到 A 时不能重复写入,直到 A 的原操作结束。新面板在旧操作完成后重载记录,验证原生删除延迟完成后旧记录消失,以及暂存层已恢复、工作区层冲突和记录删除失败后的重试。 同一组件保持挂载切换 A→B→A 后,已派发的原生删除完成仍会刷新列表。Stash Diff 的缓存与在途读取均使用 OID,验收需覆盖列表重排及旧读取自动重试,避免不同记录共用旧位置的 Diff;未提供 OID 的旧入口保留按位置读取。 Shelf 的完整工作区层由 Core 使用 includeUntracked 的 unstaged 导出,以真实索引为基线;保留已删除的磁盘路径或重建重命名源路径均按新增文件处理,不再拼接 HEAD 基线补丁。
版本控制 / Git仓库自动发现排除隐藏目录与构建缓存
git-repository-discovery
已实现
待验证
证据路径
rust/lithe-core/src/git/mod.rs
rust/lithe-core/src/tests/git_repository_discovery.rs
macos/Sources/Lithe/Core/Rust/RustGitOperations.swift
已实现
待验证
证据路径
rust/lithe-core/src/git/mod.rs
rust/lithe-core/src/tests/git_repository_discovery.rs
windows/tauri/src-tauri/src/platform.rs
windows/tauri/src/features/git/api/git-repo-api.ts
Git打开含 .build/checkouts、macos/.build/checkouts、.cache、node_modules 与可见嵌套仓库的项目,确认 Git 状态和引用只包含主仓库及可见源码仓库;.worktrees 和 .worktree 中的真实工作树仍可发现,其构建缓存仍被排除。直接打开隐藏仓库及其源码子目录应能使用 Git。
两端复用共享扫描规则和 fixture;Linux Core 集成验证不能代替 macOS、Windows 原生界面验收。
版本控制 / GitWindows 默认主题 Git 状态配色与 IDEA 对齐(修改/重命名蓝、新增绿、删除灰、未跟踪暖红、gutter 浅色)
git-status-colors-idea-alignment
平台专属
不适用
证据路径
macos/Sources/Lithe/Views/Workspace/ProjectSidebarView.swift
已实现
待验证
证据路径
windows/tauri/src/extensions/themes/builtin/lithe.json
windows/tauri/src/styles/theme.css
windows/tauri/src/features/file-explorer/lib/file-tree-git-status.ts
windows/tauri/src/features/editor/styles/monaco-editor.css
windows/tauri/src/features/git/components/git-operation-banner.tsx
windows/tauri/src/features/git/utils/git-file-status-visuals.ts
Git在 Windows 打开包含已修改、已暂存修改、新增、删除、重命名、未跟踪文件与 .gitignore 忽略项的仓库,在 Lithe 明暗主题下确认:文件树、Commit 面板变更列表与 Git Log 提交文件树中已修改和重命名为蓝色(暂存修改为浅蓝)、新增为绿色、删除为灰色、未跟踪为暖红、忽略文件仍为置灰半透明;编辑器 gutter 修改/新增/删除标记为 IDEA 浅蓝/浅绿/灰色;diff 删除行与 -N 计数仍为红色;切换到未定义新 token 的其他内置主题时颜色回退正常;rebase/patch/历史改写对话框的警告文案与操作横幅保持琥珀警示色。
对齐 IntelliJ IDEA 新 UI 的 FILESTATUS 与 *_LINES_COLOR(来源 intellij-community expUI_lightScheme/expUI_darkScheme):modified 与 renamed #0033B3/#70AEFF、added #067D17/#73BD79、deleted 文件 #6C707E/#6F737A(新增可选 token git-file-deleted)、untracked #B23247/#E88F89;编辑器 gutter 使用可选 token git-gutter-added/modified/deleted(#7FC784/#88ADF7/#767A8A,暗色 #549159/#375FAD/#868A91)。git-deleted 保持红色,继续用于 diff 删除行与删除计数;git-modified-staged 为蓝色浅化派生。其他主题未定义新 token 时回退到 git-deleted/git-added/git-modified。原误用 text-git-modified 作为警告色的 rebase/patch/历史改写对话框与操作横幅改回 text-warning。变更列表与提交文件树不再使用 text-info/灰色/红色临时映射,统一走 git-* token。macOS 项目树配色体系不同(modified 用 accent),不属于本行对齐范围。
版本控制 / Git状态、暂存与提交
git-status-commit
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Git
macos/Sources/Lithe/Services
macos/Sources/LitheGitModule/Application/GitFeatureModel.swift
macos/Tests/LitheGitModuleTests/GitModuleTests.swift
macos/Tests/LitheTests/GitStatusObservationTests.swift
.agents/notes/implemented/feature/2026-09-27-workspace-git-commit-plans.md
macos/Sources/Lithe/Views/Git/GitRollbackDialog.swift
macos/Sources/LitheGitModule/Models/GitRollbackSelection.swift
macos/Tests/LitheGitModuleTests/GitRollbackSelectionTests.swift
macos/Tests/LitheTests/GitRollbackDialogTests.swift
.agents/notes/implemented/feature/2026-10-29-git-rollback-confirmation.md
macos/Sources/Lithe/Application/Features/CommitFileDeletionFeatureModel.swift
macos/Sources/Lithe/Views/Git/CommitFileDeletionPresentation.swift
macos/Tests/LitheTests/CommitFileDeletionTests.swift
macos/Tests/LitheTests/CommitDraftFeatureModelTests.swift
.agents/notes/implemented/feature/2026-10-29-commit-file-context-actions.md
macos/Sources/LitheWorkspaceModule/Application/WorkspaceFeatureModel.swift
macos/Tests/LitheTests/LitheCoreLogicTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/git
shared/contracts/application-boundary.md
windows/tauri/src/features/git/api/git-repository-path.ts
rust/lithe-core/tests/git_path_roundtrip.rs
shared/fixtures/git/windows-paths.json
windows/tauri/src/features/git/hooks/use-git-commit-area-resize.ts
windows/tauri/src/features/git/stores/git-commit-panel-preferences.store.ts
windows/tauri/src/features/git/components/status/git-status-panel.tsx
windows/tauri/src/features/sidebar/components/sidebar-tree.tsx
windows/tauri/src/features/git/utils/idea-control-styles.ts
windows/tauri/src/features/git/hooks/use-git-commit-picker.ts
windows/tauri/src/features/git/hooks/use-git-commit-picker.test.tsx
windows/tauri/src/features/git/hooks/use-commit-diff-review.ts
windows/tauri/src/features/git/services/commit-diff-review.ts
windows/tauri/src/features/git/utils/commit-diff-blocks.ts
windows/tauri/src/features/git/utils/commit-diff-blocks.integration.test.ts
windows/tauri/src/features/git/hooks/use-git-commit-area-resize.test.tsx
windows/tauri/src/features/git/components/status/git-workspace-status-panel.test.tsx
windows/tauri/src/features/git/components/stash/git-saved-changes.tsx
windows/tauri/src/features/git/services/git-shelf-workflow.ts
windows/tauri/src/features/git/components/git-commit-panel.css
windows/tauri/src/features/git/components/git-changelist-bar.tsx
windows/tauri/src/features/git/components/git-changelist-bar.test.tsx
GitmacOS 补充验证 #1033:在临时仓库对已提交文件执行 git rm --cached 并保留磁盘文件,打开项目及重复刷新 Git 状态应不闪退,保留暂存删除和未跟踪两条记录;暂存或取消暂存时旧快照不能提前清除待确认状态,两种记录顺序结果一致;实际暂存或取消暂存后,文件恢复干净时待确认状态必须清除。多仓库手动刷新时,A 成功且已干净、B 读取失败不能解除 B 的暂存等待状态或提交保护;B 随后返回旧状态仍保留乐观勾选值,只有成功读取到确认状态或干净快照后才解除。修改、暂存、取消暂存并提交文件,确认状态、提交消息和错误回显。 Windows 另验证原生 UNC/verbatim 输入、中文/空格/长路径仓库往返及 linked worktree;末尾点/空格必须明确拒绝,外部提交/切换须触发元数据刷新。 Windows 另验证提交区(对齐 IntelliJ 非模态提交面板):顶部为 Amend last commit、AI 与实际已暂存文件数(悬停显示按状态统计的图例);中间为提交说明编辑框(占位文字为“Commit Message/提交说明”,不带省略号;4px 圆角,常态 1px 控件边框,聚焦 2px 强调色边框,失败时错误色边框);底部左侧为 IDEA 线框样式的 Commit 与 Commit and Push... 按钮(28px 高、4px 圆角、1px 边框),右侧为设置按钮。提交区与变更列表之间只有一条分割线、无外框,拖动分割线(或聚焦后按上/下方向键)可调整提交说明编辑框高度:向上拖动变高,变更列表至少保留 160px(40px 操作栏和 120px ChangeList 区域),编辑框最小 50px,松开后保存并在重启后恢复,拖动过程中不写入持久化。提交按钮在未选文件或说明为空时禁用;快捷键显示缺少文件或提交说明的提示。默认普通提交,勾选 Amend 后在审核计划中明确追加提交;切换仓库、分支和成功提交后重置 Amend。变更列表按当前 Swift 分为默认更改列表与命名 ChangeList,已跟踪和未跟踪文件同组,节点名后显示灰色“N 个文件”,复选框为三态(部分包含时显示短横);文件、文件夹、分组节点的包含复选框位于展开箭头之后、图标之前,箭头为 IDEA 细线 chevron(16px、1px 描边,亮色 #818594、暗色 #B4B8BF,悬停不变色),图标与文字在行内垂直居中,箭头/复选框/图标/文字间距 4px,文件夹名后紧跟灰色文件数;长文件名不再截断,变更列表出现横向滚动条。 变更列表工具栏有 IDEA 式“视图选项”(更多图标,眼睛用于预览首项),菜单中直接列出“目录 / 平铺显示”并勾选当前项,两次点击即可切换(平铺时文件名后附灰色目录),选择持久化;文件行末尾不再显示暂存 +/- 按钮;列表很长时纵向/横向滚动条滑块按可视比例显示长度,笔记本触控板左右滑动可横向滚动;面板从隐藏切回显示、侧栏改宽或字体加载完成后,长文件名仍完整显示而不被截断;名称超出面板可视右边缘时,鼠标悬停该行会像 IDEA 一样在行上方弹出完整名称(含文件数或目录),移开、滚动或点击即消失。 Windows 补充验证:先拉高提交说明,再缩小窗口或侧栏可用高度、触发按钮换行,确认变更列表仍保留 160px;恢复空间后恢复原高度偏好,隐藏时不覆盖偏好,继续拖动从实际高度开始。提交比较选择器查询失败时显示错误和重试;重试成功且结果为空才显示无提交;关闭、切换仓库或工作区后迟到结果不得覆盖当前状态。 审核回归另核对无末尾换行、CRLF-only 和内容伴随 CRLF:不能用有损行投影显示已包含或写入块,整文件暂存及实际提交的 blob 字节必须与磁盘一致。暂存 B 后磁盘恢复 HEAD 的 a,仍应显示暂存版本和文件框;二进制 A→B 暂存后磁盘 C,文件框显示部分包含,点击包含剩余内容。Unix 在公共可遍历父目录验证临时上下文没有组/其他用户访问权限,Drop 清理 HEAD/index;本机 Windows 权限执行范围与 macOS CI 断言应分别记录。 Windows 单文件 Diff 上箭头在首处继续进入上一文件最后一处,下箭头在末处进入下一文件首处,集合首尾不循环、加载中禁用;Commit 文件列表随跨文件导航更新选中行并展开祖先、滚动到可见位置,保留编辑器焦点和 include 状态;同文件刷新、历史 Diff、无关仓库和迟到读取不扰动列表。 Windows 在默认及舒适密度下修改界面字号,检查 Commit/Stash 树正文与 Project 一致;核对 Git 菜单、分支及仓库选择器的刷新图标和原有加载反馈。 以当前 Swift 五个源文件为基准检查 Commit/Shelf 圆角页签、操作栏顺序与活动列表范围、父仓库选项传入计划及忙时禁用。检查 218/320/449px、中英文和明暗主题下按钮不掉行、说明框不包含配置项,暂存计数不随行选择变化;保留目录偏好、无保存偏好默认平铺,拖动不重置已有说明框高度。 另检查多仓库名称、完整路径提示及三态框范围;关闭行点击 Diff 后,预览按钮仍打开完整首项比较。窄宽切换、隐藏父路径后无 React 更新循环;提交说明实际计算字体为编辑器字体及 13px 默认字号。Windows Commit 面板与 macOS 对齐:ChangeList 下拉保持固定宽度、新建/重命名/删除按钮靠右;ChangeList 标题为常规字重,仅仓库行加粗;父仓库选项使用 caption 字号;多仓库时仓库行文件夹图标按工作区仓库顺序着色;工具栏不再有独立的“选择差异来源”按钮,该入口位于“视图选项”的子菜单中。 新增 macOS 回滚回归:检查提交多选框默认纳入、行选择和窗口勾选分离、取消及空集合无写入、批量和部分暂存恢复、未选文件保持、新增及意向新增文件保留/删除、复制来源不变、重命名/删除及保留磁盘副本、linked Worktree 隔离;中英文深浅主题检查确认文件树及关闭/确认按钮,忙时互斥、首错停止及取消/重置有界回归。仍需完整工作台人工验收,verificationStatus 保持 pending。 通过 GitModuleTests 的 commitFiles 与 GitStatusObservationTests 的 realGitCommitFiles 验证执行顺序、变更列表、最终真实索引、部分暂存、复制来源、目录汇总展开、失败/重置/重入;CommitFileDeletionTests 验证原生确认/取消、编辑器同步后脏状态及过期保护、首错停止和干净文档清理。完整产品菜单工作流仍需实机验收。 临时真实仓库验证 staged-new 删除后绿色行立即消失、批次部分失败只清除已删除项、跟踪删除仍可提交、复制源和无关索引不变。受控异步测试阻塞解冻/同级扫描/旧状态/目录列出,确认本根行和Diff先更新、同级展开不折叠、最后完成写入对应最终状态、重置后旧刷新不结束新刷新;工作区解冻调度与取消有界验证。仍需完整产品测量操作到行更新的延迟,不以测试耗时宣称实机性能。 新增有界gate回归阻塞项目重载,验证普通事件与写入后解冻仍刷新Git并继续接收后续批次;取消在途读取后保留请求,切换工作区后旧读取不能释放新读取。真实临时Git仓库挂载同一个ChangesSidebarView,外部修改、新建、删除通过MacDirectoryWatcher自动更新模型及原生无障碍行;暂存后阻塞Stash只读,真实回滚按钮仍可点击并打开正确纳入集合,取消后真实索引不变。模块层另阻塞同级仓库旧读取,完成回滚后释放旧结果不得恢复行。完整工作台人工与大型仓库延迟测量仍pending。
Windows Commit Diff 增加块级包含:复选框来自真实 Git 暂存区,支持相邻块独立包含/取消、部分包含三态、暂存插入后的索引坐标;Commit 仅提交已包含块,文件列表部分包含不会退回整文件暂存。包含/回退及刷新持有提交保护,关闭预览后等待已发出的写入结束才释放;回退沿用未暂存修改契约。验证两个相邻修改只勾选一块后实际提交、随后取消/继续包含、另仓库事件隔离与回退校验期间文件变化;双箭头回退对应未包含块并保留已包含内容,2026-10-17 起同样遵守「丢弃前确认」设置。新增/删除使用整文件块,重命名/二进制等保留整文件操作。目标产品端到端验收仍 pending。 Commit 单文件比较保留文件顺序,末个差异后下箭头按需打开下一文件,块包含和刷新不丢失导航;同时收紧中央行号/图标留白并使块方框居中。 审核修复:EOF/CRLF 有损显示标识阻止新旧 Diff 的块写入,保留整文件入口;HEAD 到磁盘为空时显示真实暂存区内容并标注版本,显示回退不改变写入身份。整文件三态直接读取 staged/worktree,覆盖二进制、重命名及没有安全块的情况。新旧 Diff 块级双箭头 2026-10-17 起与文件/整仓库的丢弃确认统一遵守设置,设置描述已同步更新范围。Unix 临时索引目录在创建时设置 0700,保持原子占有及错误/正常销毁清理;Windows 保持用户临时目录继承权限。 Windows 上下差异箭头补齐双向跨文件导航;Commit 列表从活动工作区预览的仓库/路径同步行选择和一次性虚拟滚动,沿用原有加载代次保护。组件回归覆盖双向边界、嵌套仓库、折叠展开、刷新及焦点/include 保持,完整原生验收 pending。 Windows 提交面板提供 Commit/Shelf 页签,Amend 默认关闭。切换页签保留提交草稿;无文件或说明为空时按钮禁用,快捷键保留校验提示。变更行支持 Ctrl/Shift 范围选择,选中与包含状态独立。Shelf 和 Stash 写操作互斥于提交、暂存和 changelist 操作。 Windows Commit 与保存改动树正文使用共同的 ui-text-sm 字号;相关 Git 刷新入口复用 RefreshIcon 对应的 IDEA refresh.svg,保持重做图标原有映射。 按当前 Swift 源码重排:41px 圆角页签标题栏、40px 操作栏在 ChangeList 之前;父仓库选项由 GitView 持有并移到选择器下方;文件按 ChangeList 统一分组,新配置默认平铺。底部包含带历史图标的 Amend last commit、11px 线框 AI、12px 暂存计数和 50px 默认等宽说明框;窄侧栏只对顶部控件有序换行,两个提交按钮与设置同行。用户原有布局偏好保留,原生视觉验收 pending。 仓库标题使用普通树行、仓库名和前置三态框;窄面板隐藏父路径。首项预览独立于行点击偏好,始终打开完整 Diff。宽度测量保留隐藏描述的零文字宽度,避免空 flex 槽触发无限扩宽。
版本控制 / Git子模块先提交与推送、自动更新父引用、计划变化再次确认
git-submodule-commit-plan
已实现
待验证
证据路径
macos/Sources/LitheGitModule/Application/GitFeatureModel+WorkspaceCommit.swift
macos/Sources/Lithe/Views/Git/CommitAreaView.swift
macos/Tests/LitheGitModuleTests/GitModuleTests.swift
rust/lithe-core/src/git/commit_state.rs
rust/lithe-core/src/tests/git_workspace_commit.rs
rust/lithe-core/src/git/workspace_commit.rs
rust/lithe-core/src/git/workspace_commit/tests.rs
shared/fixtures/git/workspace-commit-workflow-v1.json
已实现
待验证
证据路径
windows/tauri/src/features/git/components/status/git-status-panel.tsx
windows/tauri/src/features/git/components/git-commit-panel.tsx
windows/tauri/src/features/git/components/git-workspace-commit-review.tsx
windows/tauri/src/features/git/services/git-workspace-commit-workflow.ts
windows/tauri/src/features/git/services/git-workspace-commit-workflow.test.ts
windows/tauri/src/features/git/components/status/git-workspace-status-panel.test.tsx
windows/tauri/src-tauri/src/platform.rs
shared/fixtures/git/workspace-commit-workflow-v1.json
windows/tauri/src/features/git/runtime/git-workspace-commit-host.tsx
windows/tauri/src/features/git/runtime/git-workspace-commit-host.test.tsx
Git只勾选孙仓库文件,确认计划自动列出父祖仓库的引用更新且可关闭;确认期间改变暂存内容或分支,必须显示新计划再次确认。父仓库未暂存文件不能被带入;只勾选父引用时先推送子仓库现有提交,Git 发布检查应拒绝未发布的子引用。子仓库元数据被外部删除后必须拒绝读取和写入,不能向上回退父仓库。
两端直接消费共享 Rust Core 的计划、依赖排序、执行结果与重试。平台负责真实暂存勾选、确认与结果界面、认证取消和项目生命周期。原生界面实测待平台验收。
版本控制 / Git失败后只重试未完成的提交或推送步骤
git-workspace-commit-retry
已实现
待验证
证据路径
macos/Sources/LitheGitModule/Application/GitFeatureModel+WorkspaceCommit.swift
macos/Sources/Lithe/Views/Git/CommitAreaView.swift
macos/Tests/LitheGitModuleTests/GitModuleTests.swift
rust/lithe-core/src/git/commit_state.rs
rust/lithe-core/src/tests/git_workspace_commit.rs
rust/lithe-core/src/git/workspace_commit.rs
rust/lithe-core/src/git/workspace_commit/tests.rs
shared/fixtures/git/workspace-commit-workflow-v1.json
已实现
待验证
证据路径
windows/tauri/src/features/git/components/status/git-status-panel.tsx
windows/tauri/src/features/git/components/git-commit-panel.tsx
windows/tauri/src/features/git/components/git-workspace-commit-review.tsx
windows/tauri/src/features/git/services/git-workspace-commit-workflow.ts
windows/tauri/src/features/git/services/git-workspace-commit-workflow.test.ts
windows/tauri/src/features/git/components/status/git-workspace-status-panel.test.tsx
windows/tauri/src-tauri/src/platform.rs
shared/fixtures/git/workspace-commit-workflow-v1.json
windows/tauri/src/features/git/runtime/git-workspace-commit-host.tsx
windows/tauri/src/features/git/runtime/git-workspace-commit-host.test.tsx
Git让子仓库推送失败,确认父仓库被阻塞、独立仓库成功;重试计划应显示子仓库只推送,验证子仓库提交数不增加,随后才提交和推送父仓库。
两端直接消费共享 Rust Core 的计划、依赖排序、执行结果与重试。平台负责真实暂存勾选、确认与结果界面、认证取消和项目生命周期。原生界面实测待平台验收。
版本控制 / Git按文件所属仓库批量提交及推送,保留每仓库结果
git-workspace-staged-commit
已实现
待验证
证据路径
macos/Sources/LitheGitModule/Application/GitFeatureModel+WorkspaceCommit.swift
macos/Sources/Lithe/Views/Git/CommitAreaView.swift
macos/Tests/LitheGitModuleTests/GitModuleTests.swift
rust/lithe-core/src/git/commit_state.rs
rust/lithe-core/src/tests/git_workspace_commit.rs
rust/lithe-core/src/git/workspace_commit.rs
rust/lithe-core/src/git/workspace_commit/tests.rs
shared/fixtures/git/workspace-commit-workflow-v1.json
已实现
待验证
证据路径
windows/tauri/src/features/git/components/status/git-status-panel.tsx
windows/tauri/src/features/git/components/git-commit-panel.tsx
windows/tauri/src/features/git/components/git-workspace-commit-review.tsx
windows/tauri/src/features/git/services/git-workspace-commit-workflow.ts
windows/tauri/src/features/git/services/git-workspace-commit-workflow.test.ts
windows/tauri/src/features/git/components/status/git-workspace-status-panel.test.tsx
windows/tauri/src-tauri/src/platform.rs
shared/fixtures/git/workspace-commit-workflow-v1.json
windows/tauri/src/features/git/runtime/git-workspace-commit-host.tsx
windows/tauri/src/features/git/runtime/git-workspace-commit-host.test.tsx
Git勾选两个独立仓库文件,一次提交并推送,验证各自 HEAD 和远程;停止一个操作后其余独立仓库继续,已成功仓库不会回滚。
两端直接消费共享 Rust Core 的计划、依赖排序、执行结果与重试。平台负责真实暂存勾选、确认与结果界面、认证取消和项目生命周期。原生界面实测待平台验收。
版本控制 / GitWorktree 管理
git-worktrees
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Git
macos/Tests/LitheTests/GitWorktreeAppearanceTests.swift
macos/Sources/LitheGitModule/Application/GitFeatureModel.swift
macos/Tests/LitheGitModuleTests/GitModuleTests.swift
macos/Sources/Lithe/Application/Features/WorktreeCommitSession.swift
macos/Tests/LitheTests/GitStatusObservationTests.swift
macos/Sources/Lithe/Views/Git/GitRollbackDialog.swift
macos/Sources/LitheGitModule/Models/GitRollbackSelection.swift
macos/Tests/LitheGitModuleTests/GitRollbackSelectionTests.swift
macos/Tests/LitheTests/GitRollbackDialogTests.swift
.agents/notes/implemented/feature/2026-10-29-git-rollback-confirmation.md
.agents/notes/implemented/feature/2026-10-29-commit-file-context-actions.md
macos/Sources/Lithe/Views/Git/GitWorktreeActions.swift
macos/Sources/Lithe/Application/Features/CommitFileDeletionFeatureModel.swift
macos/Tests/LitheTests/CommitFileDeletionTests.swift
macos/Sources/LitheWorkspaceModule/Application/WorkspaceFeatureModel.swift
macos/Tests/LitheTests/LitheCoreLogicTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/git
Git列出、创建、切换和删除 Worktree,确认路径、分支和安全检查。 macOS 深浅主题核对搜索及清除、列表焦点/失焦和窗口失活选中态、上下键选择(首尾边界不重复触发选择回调)、相同宽度下筛选/刷新导致的列表行数增减与底部可达性、详情标签、窄宽度、提交历史滚动与新建弹窗;检查右键菜单的保护/忙碌状态保持不变。 检查#1503工作树动作自然宽度、6pt间距、宽窄换行、主工作区禁用色;聚焦父区域及鼠标悬停时边框按钮无文字下划线,Tab仍可定位操作。 检查列表选中背景内左右12pt对称留白、路径随整行可用宽度自适应、宽栏完整显示与窄栏收缩,悬停截断路径显示完整内容,移到名称/分支或空白后关闭展开。 GitWorktreeAppearanceTests 原生深浅色视口检查溢出/短内容、接近底部、同页去重、同宽追加高度与偏移、缩放、失败/耗尽停止和查询重置;GitModuleTests 检查 50 条续页、cursor 关闭、5000 条上限、选择切换与取消、失败显式重试、状态扫描不覆盖追加历史。实机需在大型历史工作树持续滚动并切换工作树/搜索,确认无需点击且位置稳定。 GitWorktreeAppearanceTests 用真实原生事件验证复选框不打开Diff、Command/Shift选区、空格与Return、右键批量目标、禁用状态、共享动作挂载与选中工作树Diff回调,并检查深浅主题及320/600/850pt布局。GitModuleTests 验证暂存/取消暂存/回滚根目录隔离、部分暂存、Diff刷新关闭、历史cursor保留、旧目标拒绝、首错停止、扫描失败保留、在途去重、选择切换及取消/重置迟到错误隔离。实机仍需验证确认弹窗取消/确认及真实文件结果;Windows无更改详情,不宣称对应功能运行验收。 GitModuleTests 与 GitWorktreeAppearanceTests 额外覆盖:暂存请求在 Git 返回前即显示目标状态、失败回落真实状态、点击被拒绝期间仍显示请求状态、状态扫描完成即空闲而不等项目刷新、工具栏按钮启用条件、历史视口在空闲/加载/失败及120/300/600pt高度下撑满,失败保留显式重试;新增模块回归覆盖主工作区状态同步、HEAD未变时工作树刷新补读状态、未变快照版本保持、失败保留旧行及历史cursor不重置。实机仍需在大型仓库测量点击复选框到状态更新的真实延迟。 新增更改页深浅色分组展开/勾选分离及分组行键盘偏移、左右/上下切换保留选择和草稿、同轴缩放保留原生文档、尺寸边界及每根独立草稿回归;模块测试检查唯一根提交范围、ChangeList隔离/主根同步、存储故障同步与重置失效。真实Git集成用例通过共享Core提交linked工作树,断言主仓库HEAD和暂存文件不变;新增真实Git参数用例分别覆盖主checkout和工作区外linked中的独立嵌套仓库,首次检查、显式/自动/独立模型刷新、全部暂存及提交不产生mode-160000条目或.gitmodules,嵌套HEAD和索引保持不变。受控有界gate在提交计划读取后暂停准备返回,验证父Diff直接文件和区块暂存/取消暂存无service写调用,释放后提交成功且写入口恢复。实机仍需验收完整工作台分栏拖动、ChangeList管理、提交确认和推送流程;verificationStatus保持pending。 新增 macOS 回滚回归:检查提交多选框默认纳入、行选择和窗口勾选分离、取消及空集合无写入、批量和部分暂存恢复、未选文件保持、新增及意向新增文件保留/删除、复制来源不变、重命名/删除及保留磁盘副本、linked Worktree 隔离;中英文深浅主题检查确认文件树及关闭/确认按钮,忙时互斥、首错停止及取消/重置有界回归。仍需完整工作台人工验收,verificationStatus 保持 pending。 在非当前 linked worktree 多选文件,分别核对提交准备、回滚、删除取消和新标签差异都使用该 checkout,主工作区索引不变;GitWorktreeAppearanceTests 检查实际工具栏及范围多选,完整新增菜单整机验收保持 pending。 用有界gate阻塞工作区解冻,确认Worktree本地状态、暂存勾选与忙状态先完成;分别从父更改页和固定checkout模型写入,确认只读目标根、同级无额外扫描、目录展开与80条历史及cursor保持。真实linked仓库回滚与删除流程仍结合GitStatusObservationTests核对主仓库索引不变,完整产品端到端验收保持pending。 GitModuleTests新增阻塞后台全量读取时回滚可用并拒绝旧行回填的共享模型回归;固定checkout完整产品人工流程仍保持pending。
协作 / GitHubPull Request 列表与详情
github-prs
已实现
待验证
证据路径
macos/Sources/Lithe/Views/GitHub
macos/Sources/Lithe/Services/GitHub
已实现
待验证
证据路径
windows/tauri/src/features/github
shared/contracts/application-boundary.md
GitHub使用测试仓库验证 PR 列表、筛选、详情、分支比较和浏览器跳转。
协作 / GitHubReview 与评论
github-reviews-comments
已实现
待验证
证据路径
macos/Sources/Lithe/Views/GitHub
已实现
待验证
证据路径
windows/tauri/src/features/github
GitHub创建、查看和回复 Review/评论,确认权限错误和网络失败不会丢失草稿。
语言支持 / GoGo 社区插件:gopls、运行与 go test(由 Lithe Store 社区插件提供)
go-support-plugin
已实现
待验证
证据路径
macos/Tests/LitheTests/Fixtures/RetiredOfficialPlugins/GoSupport/plugin.json
macos/Sources/LitheModuleAPI/Catalog/BuiltInModuleCatalog.swift
macos/Sources/Lithe/Views/App/PluginManagementView.swift
macos/Sources/Lithe/Application/Features/PluginMarketplace.swift
macos/Tests/LitheTests/LanguageExtensionProcessLifecycleTests.swift
shared/contracts/plugins/v1/fixtures/command-plans.json
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginManager.swift
macos/Sources/Lithe/Platform/MacOS/MacApplicationRelauncher.swift
macos/Tests/LitheTests/PluginManagerTests.swift
未实现
不适用
证据路径
shared/contracts/plugins/v1/fixtures/language-system-command.plugin.json
Go Support(社区插件 Lithe-IDEA/lithe-plugin-go)macOS 打开插件管理,确认“Lithe 官方”源不再列出 Go Support,而 Lithe Store 社区源列出 io.github.lithe-idea.go-support 0.1.0;安装后启用无需重启,打开含 go.mod 的项目并点开 .go 文件,确认使用用户安装的 gopls 启动语言服务器;运行 main.go、运行整套与单文件、单个测试函数的 go test;禁用后 gopls 和运行进程退出。未安装 gopls 时给出缺失提示而不是崩溃。已安装旧官方包 dev.lithe.plugin.go-support 的环境:插件管理显示“已迁移到社区插件”提示、没有官方更新、可以卸载;旧包还在时插件市场里社区版显示“需先卸载旧版”且不可安装,卸载后点“重启 Lithe”按钮(未保存文件和运行中进程照常确认,取消则不重启)重启进入同一个应用,再安装社区版并重启,确认社区版是启用状态、LSP/运行/测试可用;卸载前手动关闭过的则保持关闭,旧包仍按官方签名要求校验;卸载后从市场安装社区版。Windows 暂无 Go 插件。
工作台 / 本地历史恢复、删除与持久化
history-restore
已实现
待验证
证据路径
macos/Sources/Lithe/Views/History
已实现
待验证
证据路径
windows/tauri/src/features/local-history
windows/tauri/src/features/local-history/components/project-local-history.tsx
windows/tauri/src/features/local-history/utils/history-metadata.ts
Local History验证恢复、删除、应用重启后持久化和失败回滚。
Windows 新增项目历史聚合入口与路径筛选,可进入既有单文件时间线比较和恢复;存储改按规范化工作区哈希隔离,Core 秒级时间转换为界面毫秒。项目历史入口只对原生本地工作区开放,WSL 与远程 provider 路径不会展示或调用不支持的 Core 查询。旧全局历史不含可靠工作区归属,原样保留但不自动归入新时间线。
工作台 / 本地历史快照列表与 Diff
history-snapshots
已实现
待验证
证据路径
macos/Sources/Lithe/Views/History
macos/Sources/Lithe/Services
macos/Sources/LitheLocalHistoryModule
macos/Tests/LitheLocalHistoryModuleTests/LocalHistoryModuleTests.swift
rust/lithe-core/src/project/history.rs
macos/Sources/Lithe/Views/App/LocalHistorySettingsControl.swift
macos/Tests/LitheTests/LocalHistoryIgnoreRulesTests.swift
macos/Sources/Lithe/Application/Features/LocalHistoryStorageSettingsModel.swift
macos/Tests/LitheTests/LocalHistorySettingsTests.swift
rust/lithe-core/src/tests/project.rs
shared/fixtures/history/relocation-v1.json
macos/Tests/LitheTests/LitheCoreLogicTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/local-history
windows/tauri/src/features/local-history/components/project-local-history.tsx
windows/tauri/src/features/local-history/utils/history-metadata.ts
Local History编辑同一文件多次,比较快照时间、内容 Diff 和文件范围。 macOS 外部变更和目录操作按批记录历史,仅首个成功快照触发全库过期清理;验证跳过文件、连续批次、取消及单文件保存,4000 文件变化后 CPU 回落且历史仍可读取。 编辑同一文件多次,比较快照时间、内容 Diff 和文件范围。存储上限:Rust 测试覆盖基线跳过生成目录与嵌套仓库、保存时清理旧版本留下的排除目录基线、超过 100MB 先淘汰旧基线再淘汰编辑和标签、基线预算 50MB。忽略规则:Rust 测试覆盖通配符与正则忽略新记录但保留已有历史、正则不区分大小写且无效或空正则不匹配、预览报告无效正则行和命中规则(隐藏、通配符含内置文件夹、正则)、拒绝越界路径、占用统计与清空项目历史。内置项可改:Rust 测试覆盖内置文件夹以 `**/名称/` 通配符规则生效、命中时报告该规则、`!**/名称/` 或 `!名称` 关闭内置项后重新记录;隐藏路径的 `!` 条目关闭内置隐藏目录。上限可配:Rust 测试覆盖默认 100MB、配置值生效并限定在 10MB–100GB、基线预算为上限一半。Git 对照:Rust 测试覆盖测试路径在 Git 仓库中返回是否被 .gitignore 忽略、非仓库返回空。 PR #1615 回归:关闭内置隐藏项和历史忽略项后,添加无关通配符仍可预览及记录;清空前取消并等待已有保存和外部变更任务,清空代次拒绝在途批次续写,清空后新保存可记录;隐藏路径变化纳入预览请求身份并重新计算结果。 容量输入仅接受完整非负整数与可选 MB 后缀,指数、负数、字母、溢出等无效输入不改变已保存值;回车和失焦均验证恢复或范围限定。清空失败显示中英错误与需再次确认的重试入口,回读剩余用量;重试成功清除错误并显示新用量。 PR #1597 历史迁移回归:文件与目录已有历史后排除索引,再重命名或移动,按历史元数据迁移精确路径和后代,保留内容、ID及相对后缀,同名前缀兄弟不变;工作区回归使用真实文件操作与空索引候选,不能为迁移历史重新纳入索引。目标平台原生历史界面验收仍待完成。
Windows 新增项目历史聚合入口与路径筛选,可进入既有单文件时间线比较和恢复;存储改按规范化工作区哈希隔离,Core 秒级时间转换为界面毫秒。项目历史入口只对原生本地工作区开放,WSL 与远程 provider 路径不会展示或调用不支持的 Core 查询。旧全局历史不含可靠工作区归属,原样保留但不自动归入新时间线。每个项目的本地历史上限 100MB(按 4KB 分配块计),其中项目基线最多 50MB;node_modules、.venv、target、.claude 等依赖、缓存和构建输出文件夹作为内置通配符忽略规则(`**/名称/`),基线和编辑都不记录;基线另外跳过嵌套 Git 仓库。超限时在下次保存时按基线、普通编辑、带标签条目的顺序从旧到新淘汰,两端共用 Core 行为。macOS 设置 › 通用 › 本地历史可配置只作用于本地历史的忽略规则(通配符或正则,每行一条,应用后生效),项目树仍显示这些文件;测试路径实时显示被哪条规则忽略,无效正则提示行号并跳过;显示本项目占用/上限,可确认后清空本项目历史。通配符忽略规则和隐藏路径都以文本框列出内置项,删掉一行即关闭该内置项(保存为 `!条目`,后续版本新增的内置项仍会生效);用量按二进制单位显示(100 MB)。每个项目的上限可在「已用」旁用步进器调整(50–5000 MB,默认 100 MB),保存时按新上限淘汰;上限也可直接输入数值;测试路径旁有 ⓘ 说明,结果分两行显示本地历史是否记录、Git 是否忽略(仅作对照,本地历史不跟随 .gitignore)。Windows 暂无忽略规则与上限设置,但 Core 的 history.record 已支持 ignoreRules。
AI / IDE MCP插件与 MCP 查询和修改项目 Java/Maven 默认环境,并返回实际选择结果
ide-api-environment
已实现
待验证
证据路径
macos/Sources/Lithe/Application/Features/IdeCapabilitiesFeatureModel.swift
macos/Sources/Lithe/Views/App/McpSettingsView.swift
macos/Tests/LitheTests/IdeCapabilitiesTests.swift
rust/lithe-ide-host/src/lib.rs
已实现
待验证
证据路径
windows/tauri/src/features/host-api/ide-capabilities.ts
windows/tauri/src/features/host-api/mcp-settings.tsx
windows/tauri/src/features/host-api/ide-capabilities.test.ts
rust/lithe-ide-host/src/lib.rs
Agent读取环境、修改一个默认值,检查其他字段保留;对照设置页与实际启动路径,验证保存失败及项目切换。 运行前后对比安装目录文件清单与哈希;当前 Linux 仅执行共享协议及前端验证,原生运行待验证。
AI / IDE MCP插件与 MCP 读取 Maven 模块和 Profile,保存配置、重载并执行既有生命周期和插件目标
ide-api-maven
已实现
待验证
证据路径
macos/Sources/Lithe/Application/Features/IdeCapabilitiesFeatureModel.swift
macos/Sources/Lithe/Views/App/McpSettingsView.swift
macos/Tests/LitheTests/IdeCapabilitiesTests.swift
rust/lithe-ide-host/src/lib.rs
已实现
待验证
证据路径
windows/tauri/src/features/host-api/ide-capabilities.ts
windows/tauri/src/features/host-api/mcp-settings.tsx
windows/tauri/src/features/host-api/ide-capabilities.test.ts
rust/lithe-ide-host/src/lib.rs
Agent双端对同一示例项目设置 Profile/skipTests,重载、执行 clean verify,核对按钮与 MCP 的命令、输出、失败和取消。 运行前后对比安装目录文件清单与哈希;当前 Linux 仅执行共享协议及前端验证,原生运行待验证。
插件与扩展 / IDE API / MCP插件调用已授权项目的环境、Maven 与运行 API
ide-api-plugins
已实现
待验证
证据路径
macos/Sources/LitheModuleAPI/Plugins/IDECapabilities.swift
macos/Sources/Lithe/Application/Composition/IdeCapabilityRegistry.swift
已实现
待验证
证据路径
Plugins/win/SDK/ide-capabilities.ts
windows/tauri/src/extensions/ui/services/ide-extension-host.ts
windows/tauri/src/extensions/ui/services/ide-extension-host.test.ts
IDE API双端插件枚举显式授权的项目,读取环境并调用已允许的操作;撤销项目权限后拒绝调用,Windows 未声明 permissions.ide 的 Worker 无法访问。
复用 MCP 的同一应用功能和参数校验,不扩张语言包权限;原生运行验收待完成。
AI / IDE MCP插件与 MCP 列举运行配置、启动重启,按执行 ID 读取增量输出和停止
ide-api-run-output
已实现
待验证
证据路径
macos/Sources/Lithe/Application/Features/IdeCapabilitiesFeatureModel.swift
macos/Sources/Lithe/Views/App/McpSettingsView.swift
macos/Tests/LitheTests/IdeCapabilitiesTests.swift
rust/lithe-ide-host/src/lib.rs
已实现
待验证
证据路径
windows/tauri/src/features/host-api/ide-capabilities.ts
windows/tauri/src/features/host-api/mcp-settings.tsx
windows/tauri/src/features/host-api/ide-capabilities.test.ts
rust/lithe-ide-host/src/lib.rs
Agent运行服务、读增量输出、清空日志验证 reset、重启后拒绝旧 ID,停止正确进程,检查退出码及资源清理。 运行前后对比安装目录文件清单与哈希;当前 Linux 仅执行共享协议及前端验证,原生运行待验证。
AI / IDE MCP从设置侧栏独立的 MCP 配置页按项目开启连接,分别授权配置与执行,复制 stdio 客户端配置;关闭项目撤销访问
ide-mcp-connection
已实现
待验证
证据路径
macos/Sources/Lithe/Application/Features/IdeCapabilitiesFeatureModel.swift
macos/Sources/Lithe/Application/Features/McpServerLibraryFeatureModel.swift
macos/Sources/Lithe/Views/App/McpSettingsView.swift
macos/Tests/LitheTests/IdeCapabilitiesTests.swift
rust/lithe-ide-host/src/lib.rs
macos/Sources/Lithe/Views/App/SettingsView.swift
scripts/ide-mcp/test-ide-mcp.mjs
已实现
待验证
证据路径
windows/tauri/src/features/host-api/ide-capabilities.ts
windows/tauri/src/features/host-api/mcp-settings.tsx
windows/tauri/src/features/host-api/ide-capabilities.test.ts
rust/lithe-ide-host/src/lib.rs
windows/tauri/src/features/settings/components/mcp-configuration-settings.tsx
windows/tauri/src-tauri/src/platform.rs
windows/tauri/src/features/host-api/mcp-lifecycle.test.ts
windows/tauri/src/features/host-api/mcp-lifecycle.ts
windows/tauri/src/platform/ide-request-events.ts
windows/tauri/src/features/host-api/mcp-events.integration.test.ts
Agent检查设置侧栏 MCP 配置入口与搜索跳转;未打开项目时资源库照常列出全局服务器,Lithe IDE 访问段显示打开项目提示;切换项目后展示对应授权。双端打包启动后开启连接,配置真实 Agent,验证工具发现、默认拒绝写入、启用权限、禁用、项目关闭和多窗口隔离。macOS 打开 MCP 配置页确认状态徽标与状态卡文案跟随启用状态变化,header ⓘ 可打开完整安全说明,配置代码块只在存在配置时出现且可选中复制;启用后确认项目级 lithe 条目写入两个 Agent 的配置,禁用后条目清理,外部修改过的条目保留并提示。运行前后对比安装目录文件清单与哈希;当前 Linux 仅执行共享协议及前端验证,原生运行待验证。 Windows 验证开启请求通过真实 Host 解码、客户端不能覆盖窗口所有者、关闭其他窗口保留连接及所属窗口关闭删除连接文件。 验证旧版、新版直接发现与初始化后新版发现三个独立 stdio 会话;Windows 验证原生通知、过期领取拒绝、失败后新请求恢复、最小化与休眠恢复、系统时钟回拨、丢失通知后交付新请求、打开失败和关闭后监听释放、中英文错误提示及无重复执行。
macOS 设置页把 MCP 授权整理为“服务器资源库 + Lithe IDE 访问”两段:资源库负责第三方服务器发现与编辑,见独立能力 mcp-server-library;Lithe IDE 访问段保留状态徽标、状态卡、项目权限和 Agent 配置,安全说明收进 ⓘ。开启授权时还会把随包的 lithe-mcp 写入当前项目的 Claude Code(projects.<path>.mcpServers)与 Codex(<项目>/.codex/config.toml)配置,并在关闭授权或项目时按账本清理;全局配置不受影响。 Windows 原生开启请求使用 ownerId 绑定当前窗口;关闭窗口仍使用 closeOwner 的 ownerID,避免严格字段校验拒绝开启请求。 Windows 改用窗口定向独立事件通知和执行前 claim,取消 WebView 轮询心跳依赖;过期、取消和重复通知不会执行操作,单次失败保留授权且不重放操作。设置页分别展示授权和最近请求结果,错误提示使用共享翻译。独立事件避免序号缺失阻塞后续请求,Windows 单调时钟阻止系统时间回拨延长请求有效期。共享 MCP helper 为新版协议补齐 ttlMs/cacheScope。
Java / Java/Maven构建输出与编译诊断
java-build-diagnostics
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Run
macos/Sources/Lithe/Services/Diagnostics
rust/lithe-core/src/lsp/languages/java_launch.rs
shared/fixtures/lsp/java-launch-preparation-v1.json
shared/fixtures/lsp/document-save-v1.json
已实现
待验证
证据路径
windows/tauri/src/features/maven
windows/tauri/src/features/diagnostics
windows/tauri/src/features/maven/components/maven-run-pane.tsx
windows/tauri/src/features/run/components/run-output-text.tsx
windows/tauri/src/features/editor/services/save-workspace-before-launch.ts
windows/tauri/src/features/editor/stores/editor-app.store.test.ts
rust/lithe-core/src/lsp/languages/java_launch.rs
shared/fixtures/lsp/java-launch-preparation-v1.json
shared/fixtures/lsp/document-save-v1.json
Java / Maven使用成功、编译失败和进程失败构建 fixture,对比诊断位置、输出和退出状态。 Windows Maven 构建输出使用 Geist Mono 显示 ====、==>、=>、!=、>=,确认禁用连字后逐字符显示且复制文本与原始输出一致;检查有输出与空态、ANSI 颜色、自动换行切换及横向滚动;验证构建终态为编译错误或构建器失败时提供重建 Java 索引的恢复动作(取消与未知结果不提供),构建证据随失败上报。 Java Run/Debug 使用同一个 Core 启动准备操作,验证同名主类按源码归属选择、多入口按配置消歧、构建后才解析路径、取消或超时后不继续、构建失败可用目标携带报告;macOS 命名 Java 配置启动前保存所有脏文档,保存失败不发起构建。 两端验证保存依赖源码后运行得到新输出;保存期间继续编辑不得被旧保存通知覆盖;语言服务保存通知失败必须阻止启动。未打开文件的外部变更另行验证,不能以编辑器保存用例代替。
Java / Java/Gradle在 Gradle 工作区显式声明 Buildship 导入开关,并把 Gradle 工程结构纳入 Windows 工作区指纹。声明的开关与 JDT LS 默认值相同,导入结果不变;实际行为变化是 settings.gradle 或 wrapper 描述文件变化时换用新的 JDT 数据目录
java-gradle-project-import
部分实现
待验证
证据路径
rust/lithe-core/src/lsp/languages/jdt.rs
rust/lithe-core/src/lsp/interface/engine.rs
macos/Sources/Lithe/Platform/MacOS/Plugins/HostIntegrations/Jdt/MacJdtHostIntegration.swift
macos/Sources/Lithe/Models/AppModel/AppModel+BuildSystems.swift
macos/Sources/LitheExecutionModule/Services/BuildSystemService.swift
macos/Sources/Lithe/Core/Rust/RustLanguageServerRuntimeAdapter.swift
macos/Tests/LitheLanguageIntelligenceModuleTests/LanguageIntelligenceModuleTests.swift
已实现
待验证
证据路径
rust/lithe-core/src/lsp/languages/jdt.rs
rust/lithe-core/src/lsp/interface/engine.rs
windows/tauri/src-tauri/src/lsp.rs
windows/tauri/src-tauri/src/lsp/jdt_workspace.rs
windows/tauri/src/features/editor/lsp/java-lsp-host-api.ts
windows/tauri/src/features/editor/lsp/resolve-editor-lsp-launch.ts
windows/tauri/src/features/editor/lsp/resolve-editor-lsp-launch.test.ts
windows/tauri/src/platform/lsp-core-adapter.ts
windows/tauri/src/platform/lsp-core-adapter.test.ts
Java / Gradle单元测试覆盖配置形状与透传:rust/lithe-core 断言存在 Gradle 上下文时初始化选项携带 java.import.gradle、无 wrapper 描述文件时省略 wrapper 字段、无 Gradle 上下文时不下发 java.import、按 section 查询返回对应取值、叶子合并保留调用方已声明的 offline 与 version;windows/tauri 的 lsp 测试断言工作区指纹识别 settings.gradle 与 gradle/wrapper/gradle-wrapper.properties 且忽略 gradle.properties,仅有 gradlew 脚本时不认为存在 wrapper,纯 Maven 工作区不产生 Gradle 上下文;TS 测试断言有上下文时原样转发、无上下文时为 null。待实机验证:在 Windows 打开一个带 wrapper 描述文件的 Gradle 工程,确认 JDT LS 经 Buildship 导入工程、依赖解析完成,源码可跳转、补全与语义高亮到 Gradle 依赖中的类型;改动 settings.gradle 的模块结构后重开工程,确认指纹变化触发重新导入;改写 gradle.properties 后重开,确认不触发冷导入。macOS 已通过构建插件的 languageImport 声明消费 Core 归一化的 wrapperPresent/offline/userHome,启动前等待配置并类型化转交 javaGradle,不按插件 ID 或 buildSystemID 特判;选项变化在下次会话启动生效,没有插件输入时仍按 Buildship 默认值导入。macOS 工作区指纹尚未纳入额外 Gradle 结构文件,故保持 partial;需在带该声明的插件启用/停用、改选项和关闭再重开项目时验证导入行为,真实 JDT 验收尚未运行。
Java / 语言服务设置“打开 Java 项目时导入”:自动、询问(通知中可选导入或先配置 Maven)、手动(打开 Java 文件、运行或重新加载 Maven 时再导入)
java-import-on-open-policy
未实现
不适用
证据路径
macos/Sources/Lithe/Application/Composition/JavaLanguageServerPreparationCoordinator.swift
已实现
待验证
证据路径
windows/tauri/src/features/editor/lsp/java-import-on-open.ts
windows/tauri/src/features/file-system/stores/file-system.store.ts
windows/tauri/src/features/editor/lsp/java-workspace-language-server.ts
windows/tauri/src/features/settings/components/settings-panels.tsx
windows/tauri/src/features/settings/lib/settings-normalization.ts
windows/tauri/src/features/editor/lsp/java-import-on-open.test.ts
windows/tauri/src/features/run/services/java-entrypoint-discovery.ts
windows/tauri/src/features/run/stores/run.store.ts
windows/tauri/src/features/run/stores/run.store.java-discovery.test.ts
Language ToolingWindows:在“语言服务”设置中分别选择三种策略后打开 Maven 工程。自动:立即开始导入。询问:出现通知,点“导入”开始导入,点“先配置”打开 Maven 设置且不导入;在导入过程中切换项目标签再切回不重复询问。手动:打开项目不导入,打开 Java 文件或运行时开始导入。打开项目时运行列表自动生成运行配置,在询问和手动模式下不得因此开始导入,导入开始后运行列表自动补全 Java 入口;在运行面板手动点击生成仍会导入。未知的已保存值回退为自动。
Java / 语言服务状态栏显示 Java 导入百分比、细进度条、当前模块与正在下载的依赖,就绪后列出语言服务器后台任务;导入期间跳转提示导入进度并按语法定位类型与本文件成员,较慢的跳转请求显示“正在查找”
java-import-progress-feedback
未实现
不适用
证据路径
macos/Sources/Lithe/Application/Composition/JavaLanguageServerPreparationCoordinator.swift
已实现
待验证
证据路径
windows/tauri/src/features/run/stores/language-server-progress.store.ts
windows/tauri/src/features/run/components/project-preparation-status.tsx
windows/tauri/src/features/run/components/language-server-tasks-status.tsx
windows/tauri/src/platform/lsp-core-adapter.ts
windows/tauri/src/features/keymaps/commands/navigation-command-actions.ts
windows/tauri/src/features/editor/lsp/slow-request-notice.ts
rust/lithe-core/src/lsp/languages/jdt_progress.rs
windows/tauri/src/features/run/stores/language-server-progress.store.test.ts
windows/tauri/src/features/editor/lsp/slow-request-notice.test.ts
windows/tauri/src/features/editor/lsp/java-syntax-definition.ts
windows/tauri/src/features/editor/lsp/java-syntax-definition.test.ts
Language ToolingWindows:清空 JDT 缓存后打开多模块 Maven 工程,状态栏随导入推进显示百分比和进度条,展开后显示当前模块与下载中的依赖;就绪后进度消失,构建等后台任务出现在状态栏并在结束后消失。导入期间按 F12/Ctrl+点击跳转,提示包含导入百分比;光标在导入过的类型或本文件成员上时直接跳转并提示“仅按语法定位”,嵌套类型里的调用跳到当前类型自己的同名成员;在 `other.save()` 这类成员访问、局部变量、被局部变量遮蔽的字段和可能继承来的名字上不跳转,只保留导入提示;就绪后在后台构建期间跳转,超过 300ms 出现“正在查找定义”并在完成或失败后消失。停止或重启语言服务后不残留任务。
后台任务不提供取消:Core 不发送 window/workDoneProgress/cancel,按钮只能隐藏任务而服务器仍在运行。导入期间的跳转仍不会在就绪后自动执行,避免用户已切换上下文时编辑器突然移动。语法定位只用 Core 现有的 java.sourceDefinition 和 workspace.snapshot,不建索引、不缓存,语言服务就绪后不再使用;无法确定的名字不猜测。
Java / Java/MavenProfile 与依赖树
java-maven-profiles-dependencies
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Run
macos/Sources/Lithe/Services/Java
macos/Sources/LitheExecutionModule/Services/MavenService.swift
macos/Sources/Lithe/Platform/MacOS/Persistence/MacMavenDependencyOutputStore.swift
rust/lithe-core/src/project/maven_dependency_tree.rs
已实现
待验证
证据路径
windows/tauri/src/features/maven
windows/tauri/src-tauri/src/maven.rs
rust/lithe-core/src/project/maven_dependency_tree.rs
Java / Maven切换 Maven profile 并刷新依赖树,确认模块归属、顺序、版本冲突/重复/依赖管理标注和错误边界;在依赖节点超过 6,000 个的项目中确认依赖树完整加载。 Windows 在 Maven 面板展开「依赖项」应直接加载依赖树,失败时显示宿主返回的真实原因,而不是通用的“无法加载 Maven 依赖”(#970)。
Java / Java/Maven按项目配置 Maven 工具链、settings.xml 与本地仓库;项目默认值明确标注“本机 · 此项目”,运行配置区分本机保存与团队共享
java-maven-project-settings
已实现
待验证
证据路径
macos/Sources/Lithe/Views/App/ProjectRuntimeSettingsView.swift
macos/Sources/Lithe/Services/Java/ProjectRuntimeService.swift
macos/Sources/Lithe/Views/Run/JavaRunConfigurationEditorView.swift
macos/Resources/zh-Hans.lproj/Localizable.strings
已实现
待验证
证据路径
windows/tauri/src/features/settings/components/tabs/maven-settings-panel.tsx
windows/tauri/src/features/maven/stores/maven.store.ts
windows/tauri/src-tauri/src/maven.rs
windows/tauri/src-tauri/src/maven/settings_xml.rs
windows/tauri/src/features/maven/components/maven-detected-value.test.tsx
windows/tauri/src/features/settings/components/tabs/maven-settings-panel.test.tsx
windows/tauri/src/features/run/stores/run.store.ts
windows/tauri/src/features/run/stores/run-maven-context.test.ts
windows/tauri/src/features/settings/components/project-environment-settings.tsx
Java / Maven在 macOS 项目设置和 Windows Maven 设置页分别切换两个项目,配置 Maven、JDK、settings.xml 与本地仓库,验证保存重开、自动检测展示及项目间隔离;Windows 还需验证写盘失败后可直接重试。 Windows 自定义 settings.xml 后,仓库留空应显示该文件中的目录;验证 XML 实体和 CDATA、继承的项目 JDK/Maven、切换项目丢弃未保存草稿;冷启动 Wrapper 不应触发下载,版本探测卡住时设置窗口保持响应并在超时后清理探测进程;Run 配置显式选择的 Maven/JDK 优先于项目设置,未设置的字段分别继承 Maven 设置;确认主任务与前置任务使用相同工具链,Maven 设置上下文缺失时仍保留显式覆盖,均未配置时交由平台自动发现。 双端中英文检查项目 JDK/Maven 页的“本机 · 此项目”副标题、默认继承与团队共享说明,以及运行配置的本机/项目保存范围;原有 JDK、Maven、项目环境关键词仍能搜索到页面。 Windows 成对配置读取和保存使用同一事务锁,验证并发保存不会争用临时文件或返回混合配置。
Java / Java/Maven项目根、模块与源码集识别
java-maven-project
已实现
待验证
证据路径
macos/Sources/Lithe/Services/Java
shared/contracts/application-boundary.md
已实现
待验证
证据路径
windows/tauri/src/features/maven
windows/tauri/src/features/workspace
Java / Maven使用单模块、多模块和非标准源码目录 fixture 对比项目模型。
Java / Java/MavenMaven 设置与重新加载实时作用于 Java 语言服务,并展示依赖解析问题
java-maven-settings-reach-jdt
部分实现
待验证
证据路径
macos/Sources/LitheLanguageIntelligenceModule/Services/LanguageToolingSessionManager.swift
macos/Sources/LitheExecutionModule/Services/MavenService.swift
macos/Sources/LitheExecutionModule/Services/BuildSystemService.swift
macos/Sources/Lithe/Models/AppModel/AppModel+BuildSystems.swift
macos/Sources/Lithe/Models/AppModel/AppModel+JavaIndex.swift
macos/Tests/LitheExecutionModuleTests/BuildSystemServiceTests.swift
macos/Sources/Lithe/Models/Java/MavenResolutionProblems.swift
macos/Tests/LitheLanguageIntelligenceModuleTests/LanguageIntelligenceModuleTests.swift
macos/Sources/Lithe/Application/Composition/JavaLanguageServerPreparationCoordinator.swift
macos/Tests/LitheTests/JavaLanguageServerRuntimeTests.swift
rust/lithe-core/src/lsp/languages/jdt_maven_settings.rs
已实现
待验证
证据路径
windows/tauri/src/features/maven/services/java-maven-configuration.ts
windows/tauri/src/features/maven/services/reload-maven-workspace.ts
windows/tauri/src/features/maven/hooks/use-maven-resolution-problems.ts
windows/tauri/src/platform/lsp-core-adapter.ts
windows/tauri/src/platform/tauri-core.ts
rust/lithe-core/src/lsp/languages/jdt_maven_settings.rs
Java / MavenmacOS:内置 Maven 工具窗口已由构建插件窗口取代,pom.xml 依赖解析问题暂不在构建窗口中列出(编辑器诊断仍显示);JDT 的 Maven 配置已优先消费 Core build.languageImport 归一化的插件选项,与原生插件窗口构建计划使用同一实例的生效值;检测、选项修改、模型加载和插件停用通过唯一回调发布,宿主不按插件名字反推设置。项目打开时在插件注册结束后等待导入,Java 运行时准备结束后、同步启动前再等待最新配置,覆盖首次等待结束后又被监听文件变化失效的顺序;选项发布时优先原地热更新,若会话因启动时没有 Maven 输入而拒绝更新,则通过 reloadJavaWorkspace 恢复重启。连续选项发布先取消并等待旧恢复清理,再应用最新输入;工作区关闭、同路径重开代次或停用 Java 会阻止旧任务继续启动。未声明对应导入输入时保留 MavenService 兼容设置;Maven 插件停用且兼容输入也为空时,仅向曾带 Maven 输入的同一活动会话发送空配置清除旧 Profiles/settings/仓库/工具路径,停止后释放记录,纯 Gradle 首次启动和重开保持无 Maven 输入。Gradle 输入经同一通路传递并在下次启动生效。macOS 与现有 Windows 路径均需验收:打开依赖尚未下载的 Maven 项目,在 Java 导入过程中修改 settings.xml、本地仓库或镜像并保存,确认第三方 import 在导入完成后解析成功;修改 settings.xml 内容(路径不变)后重新加载,确认语言服务不重启而依赖重新解析;故意写错依赖版本,检查编辑器诊断和跳转,Windows 另检查原 Maven 问题列表;初始化期间设置不变时重新加载,就绪后仍执行一次强制更新;旧 profile 请求失败或超时期间切换 profile,确认最终应用最新选择;保存与重新加载交错时,已发送的 settings 副本保持可读。本次未执行真实 Java 导入或 Windows 验收,保持 pending。
Java / Java/MavenMaven 工具栏提示;macOS 使用 IDEA 原色 SVG、共享按钮与单行树样式
java-maven-toolbar-tooltips
部分实现
待验证
证据路径
macos/Sources/Lithe/Views/Run/BuildSystemToolWindowView.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchHoverTooltip.swift
macos/Tests/LitheTests/WorkbenchHoverTooltipTests.swift
macos/Resources/IDEAIcons/NOTICE.txt
macos/Sources/Lithe/Theme/LitheTheme.swift
macos/Tests/LitheTests/AgentMavenAppearanceTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/maven/components/maven-pane.tsx
Java / MavenmacOS 的 Maven 窗口由构建插件声明,通用 BuildSystemToolWindowView 沿用共享按钮、悬停提示和单行树样式;窗口标题取 displayName、不显示项目副标题,窗口与开关图标取清单并保留明暗资源和原色,无图标时使用通用图标。隔离回归:BuildSystemToolWindowTests 校验窗口与选项图标只读加载及参数任务作用范围;ContextMenuCoverageTests、WorkbenchRenderingSafetyTests、LitheTreeRowStyleTests 检查共享交互边界。仍需真实 UI 验收:安装 Maven 插件后逐一悬停运行、参数任务、刷新、插件开关、折叠和选项按钮,确认提示与动作一致、禁用状态及窄窗口换行和边缘约束;在明暗主题核对 16pt 原色图标、22pt 按钮及 hover/pressed、开关选中、默认箭头,展开工程、任务分组、Profiles 和依赖,检查共享行高、同一行说明、焦点与非焦点选中、双击运行及右键菜单。Windows 仍使用原 Maven 面板,需在 Windows 逐项验收现有按钮提示。本次未运行真实 Lithe UI 或 Windows,保持 pending。
Java / Java/MavenJDK、Maven / mvnd 工具链发现、安装设置同步及按项目要求自动选择 JDK
java-runtime-discovery
已实现
待验证
证据路径
macos/Sources/Lithe/Services/Java
macos/Sources/Lithe/Views/Run
macos/Sources/Lithe/Core/Ports/RuntimeLocator.swift
macos/Tests/LitheTests/MavenRuntimeTests.swift
rust/lithe-core/src/execution/java_selection.rs
macos/Sources/Lithe/Platform/MacOS/Runtime/MacRuntimeProbeCache.swift
macos/Tests/LitheTests/MacRuntimeProbeCacheTests.swift
macos/Tests/LitheTests/ProjectRuntimeLoadingTests.swift
macos/Tests/LitheExecutionModuleTests/ExecutionModuleTests.swift
macos/Sources/Lithe/Platform/MacOS/Runtime/MacRuntimeDiscovery.swift
macos/Tests/LitheTests/MacRuntimeDiscoveryTests.swift
rust/lithe-core/src/project/maven.rs
rust/lithe-core/src/tests/languages.rs
shared/fixtures/execution/maven-runtime-versions.json
.agents/notes/implemented/architecture/2026-09-21-maven-settings-reach-the-language-server.md
.agents/notes/implemented/bug-fix/2026-10-30-login-shell-environment-and-jdk-selection.md
macos/Tests/LitheTests/ProjectRuntimeSettingsTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/maven
windows/tauri/src/features/workspace
windows/tauri/src-tauri/src/run.rs
shared/fixtures/run-configuration/automatic-java-selection.json
windows/tauri/src/features/run/utils/run-configuration.ts
windows/tauri/src/features/run/utils/run-configuration.test.ts
rust/lithe-core/src/project/maven.rs
rust/lithe-core/src/tests/languages.rs
shared/fixtures/execution/maven-runtime-versions.json
.agents/notes/implemented/architecture/2026-09-21-maven-settings-reach-the-language-server.md
.agents/notes/implemented/bug-fix/2026-10-30-login-shell-environment-and-jdk-selection.md
windows/tauri/src/features/editor/lsp/java-lsp-host-api.test.ts
Java / Maven两端安装 JDK 8/17/21:项目要求 17 且 JAVA_HOME 为 8 时验证自动选择兼容版本;核对设置、Run、Maven 目标、测试使用同一 JDK。验证显式选择不变、没有兼容版本时回退并提示,以及无要求时的平台默认顺序。 macOS 恢复已有运行配置时检查主队列仍能处理交互;同一工具与符号链接别名只探测一次,并发请求共用结果;工具文件变化或手动刷新后重新探测,失败结果可重试。验证切换项目和取消打开后旧探测结果不再应用。 两端验证 mvnd 根目录、bin 目录和启动器三种显式选择,执行仍使用 mvnd 客户端;同目录显式 mvn 保持普通 Maven 设置。自动选择保留有效 Wrapper、普通 Maven、mvnd 顺序,覆盖仅 MVND_HOME、仅 PATH、无效 MVND_HOME 回退。版本读取内嵌 Apache Maven 行,忽略 daemon 标题,使用共享版本 fixture。核对 JDT 全局设置读取 mvnd 的 mvn/conf/settings.xml,缺失时不回退 daemon conf;普通 Maven 目录缺启动器、Wrapper 和失效链接均不冒充安装,macOS 目录与客户端符号链接跟随真实安装。Core languages 测试仅验证共享设置规则;各原生系统还需以独立临时项目、仓库和 daemon 状态目录实际构建、验证 JDT 设置并清理进程,完成前两端保持待验证。 两端在项目声明 Java 8、JAVA_HOME 为 21 且另装 JDK 8 时验证选择 JDK 8;项目声明 11、只装 17 和 21 时选择 17。macOS 验证 mise(含 Contents/Home 布局)、asdf、~/.jdks 下的 JDK 和 SDKMAN/mise/asdf 的 Maven 能被自动发现,PATH 中的 mise/asdf shims 不被当作 Maven home;Windows 验证 mise、asdf、Scoop(apps/*/current)、Semeru、OpenJDK 目录下的 JDK 和 mise、asdf、SDKMAN、Scoop 的 Maven,且排在显式配置、Wrapper 和 PATH 之后。 #1618:两端 LSP 使用 Run 的项目 JDK 选择并标记 JDT 默认 runtime;验证 bundled 21 与项目 25 分离、自定义目录、同版本多安装、无效显式设置。
Run/Debug / Java 服务更新运行中的 Spring Boot DevTools 服务手动保存并编译更新
java-service-devtools-update
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Run/RunView.swift
已实现
待验证
证据路径
windows/tauri/src/features/run/components/run-pane.tsx
Run/Debug在双端运行 Spring Boot HTTP 服务,修改方法体并更新,检查响应、PID、DevTools 日志与断点暂停状态;覆盖编译失败、JVM 拒绝结构修改、连续点击、停止/重启、依赖路径变化。对比运行前后安装目录清单/哈希。Linux 仅完成共享 Core 和前端测试,原生验证待完成。
Run/Debug / Java 服务更新本地 Java Debug 服务手动编译并热替换代码
java-service-hot-code-replace
已实现
待验证
证据路径
macos/Sources/LitheDebugModule/Application/GenericDebugFeatureModel.swift
已实现
待验证
证据路径
windows/tauri/src/features/debugger/components/java-service-update.tsx
Run/Debug在双端运行 Spring Boot HTTP 服务,修改方法体并更新,检查响应、PID、DevTools 日志与断点暂停状态;覆盖编译失败、JVM 拒绝结构修改、连续点击、停止/重启、依赖路径变化。对比运行前后安装目录清单/哈希。Linux 仅完成共享 Core 和前端测试,原生验证待完成。
语言支持 / JavaJava 语言服务器作为随应用发行的声明式插件:JDT LS、Lombok、调试与测试扩展及其 JDK 由插件包拥有,可卸载和恢复;运行、测试、调试仍由宿主内置实现提供,由插件在 jdt 集成的 capabilities 中声明;支持 packageTrust 1 的宿主按来源校验内置副本与发布者签名更新,安装时验证自带运行时和入口;双架构独立发布配置已准备但尚未启用上架;同 ID 安装保留默认启用和显式禁用,卸载不重新启用内置副本;缺包按需提示与模板安装入口;完整双架构索引上架后构建自动省去内置 JDT/JDK
java-support-plugin
已实现
待验证
证据路径
Plugins/mac/Official/JavaSupport/plugin.json
Plugins/mac/Official/JavaSupport/assemble-package.sh
macos/Sources/Lithe/Platform/MacOS/Plugins/HostIntegrations/Jdt/MacJdtHostIntegration.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginLanguageServerLaunchResolver.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginPackageStore.swift
macos/Tests/LitheTests/PluginLanguageServerLaunchResolverTests.swift
macos/Tests/LitheTests/RealJavaDebugIntegrationTests.swift
shared/contracts/plugins/v1/fixtures/language-host-integration.plugin.json
macos/Sources/Lithe/Core/Language/PluginLanguageProviderCatalogSource.swift
macos/Tests/LitheTests/LanguageProviderCatalogSourceTests.swift
macos/Tests/LitheTests/RunWorkflowCoordinatorTests.swift
macos/Tests/LitheTests/PluginBundledPublisherTrustTests.swift
shared/contracts/plugins/v1/fixtures/publisher-bundled.plugin.json
scripts/plugins/official-plugin-releases.mjs
Plugins/marketplace/official-plugins.json
macos/Sources/Lithe/Application/Features/JavaPluginTransition.swift
scripts/plugins/official-plugin-distribution.mjs
scripts/macos/verify/verify-macos-package.sh
macos/Tests/LitheTests/PluginLiveActivationTests.swift
macos/Sources/Lithe/Models/AppModel/AppModel+JavaPlugin.swift
macos/Tests/LitheTests/PluginInstallationGuidancePresentationTests.swift
docs/assets/java-installation-guidance/README.md
macos/Sources/Lithe/Application/Features/PluginSettingsRegistry.swift
macos/Tests/LitheTests/JavaLanguageServerRuntimeTests.swift
未实现
不适用
证据路径
scripts/windows/build/build-windows.ps1
shared/contracts/plugins/v1/README.md
Java SupportmacOS:全新安装后打开插件管理,确认 Java Support 已安装且默认启用;打开 Maven 项目并点开 .java 文件,确认语言服务器启动,补全、诊断、跳转到 JDK 与依赖 jar 中的类(jdt://)、Lombok 生成的方法、运行标记可用;在打包出的应用里逐项确认宿主能力:工具栏调试能停在断点并继续,测试面板列出并能运行 Java 测试,“当前文件”与 Java main 运行配置能启动(Spring Boot 等 Maven 配置走另一条路径,不能替代这一项);用 lsof 或进程参数确认 JDT LS 及其 java 进程来自 Lithe.app/Contents/Resources/OfficialPlugins/dev.lithe.plugin.java-support,且应用内不存在 Contents/Resources/LanguageServers。卸载 Java Support 并重启:打开 .java 文件时提示需要安装或恢复该插件,语法高亮、Maven 面板和其他语言不受影响,<app-support>/Lithe/PluginState 下该插件的目录被删除,app bundle 文件清单不变(scripts/macos/verify/verify-runtime-bundle-immutability.sh)。点击恢复并重启后 Java 功能恢复。从旧版本升级:首次打开 Java 项目会重建一次索引,之后正常。Windows:JDT LS 与 JDK 仍随应用安装目录分发,尚未接入该插件契约。 独立分发第一阶段:PluginBundledPublisherTrustTests 使用真实 Core 和注入测试公钥覆盖内置副本、已签名更新、用户目录伪造 bundled 来源、缺失运行时与篡改拒绝;官方发布索引回归验证双架构哈希与 tag 对应 API/requires。正式发布包、Intel 真机和完整产品下载迁移仍待验收,releaseEnabled 保持 false。 后续迁移回归覆盖默认启用/显式禁用、跳过过渡版的安装、旧移除标记不清理新状态、卸载更新不恢复内置副本;缺包提示不触发自动安装。verify-macos-package.sh 的默认与 --slim 模式分别验证空索引保留资源及完整 fixture 索引省去资源;fixture 不代表真实市场已经上线。 安装入口与实时插件激活共用同一安装流程:普通、市场、磁盘安装各覆盖默认启用和显式禁用选择,成功后迁移并保留包字节,失败不写偏好;不改变其他插件的实时激活/撤回规则,Java 宿主集成仍等待重启。 缺包判断按安装状态而非快照 ID:真实安装→卸载→prepareForLaunch→重新扫描后,.removed 内置快照不再抑制 Java 文件和项目提示;已安装(含禁用)、暂存更新及仍待重启的卸载继续使用原管理流程。状态矩阵覆盖两种启用选择与四种 Java/Maven/Gradle 文件;深浅主题原生视图验证缺包通知与新建项目安装按钮,只在用户点击后发出市场搜索,不自动安装或执行工具。 macOS:Java Support 插件设置中的类和方法跳转默认关闭;启用后 Command 悬停/点击和定义命令可用,关闭及禁用插件后释放专属交互并拒绝旧回复,现有标签和分屏不关闭。插件详情及 Java 设置页共用插件值,不保留编辑器全局开关。settings 3 未在 Windows 声明,旧宿主须拒绝此能力要求。 全局跳转开关同步所有已有项目窗口,新项目读取存储值;双项目反复切换验证旧操作失效与对象释放。未声明 editorNavigation 的语言保留原有点击/F12,包含 MyBatis XML 属性、Spring properties/YAML 和其他 LSP;不增加其悬停查询。WebKit 100 次切换验证监听恢复基线、窗口监听清零及模型/编辑器数量不增长;该结果不是长期堆内存采样。 回归选择器接受虚拟源码目标后到达关闭回调,延迟源码仍打开;加载期间关闭功能则丢弃回复,用户取消仍清理 operation。真实 WebKit 验证插件语言 bash/properties 与 Monaco shell/ini 不同,以及共用 ini 语法的文档和分屏独立应用策略、同模型身份切换释放旧动作。
设置 / 应用配置快捷键查看与自定义
keymap-customization
已实现
待验证
证据路径
macos/Sources/Lithe/Views/App/KeyboardShortcutSettingsView.swift
macos/Sources/Lithe/Models/Keymap
已实现
待验证
证据路径
windows/tauri/src/features/keymaps
windows/tauri/src/features/settings/components/settings-panels.tsx
windows/tauri/src/features/settings/components/tabs/keyboard-settings.tsx
windows/tauri/src/features/settings/components/keyboard-settings-routing.test.tsx
SettingsmacOS 从设置 → 快捷键依次选择 macOS、IntelliJ IDEA Classic、Eclipse,核对运行、调试、查找等操作在界面和实际监听器中的绑定;IDEA Classic 的 Stop Run 应为 Control-F2,Eclipse 的 Resume 应为 F8,继承父 keymap 的命令应使用上游绑定,Find、Replace、GotoImplementation 等显式清空的命令应无绑定;检查分类树初始折叠、全部展开和折叠、分类展开、搜索时自动显示匹配操作、选中行高亮、右侧紧凑键帽及工具栏编辑菜单;通过键帽、工具栏或右键菜单新增、删除与恢复默认,并检查键盘辅助功能;分别修改两套预设的同一命令,切换与重启后确认自定义绑定互不覆盖,并验证旧版单套覆盖迁移到 macOS;按命令名称、ID 和按键搜索,制造冲突并恢复当前预设或应用全部默认;导出再导入 keybindings.json,确认预设与自定义绑定恢复且命令实际执行。Windows 保持现有快捷键编辑、导出和导入验证。
Windows 已接入现有快捷键编辑器,修复 #718 的占位入口;Linux 前端回归验证不替代 Windows WebView2、原生文件对话框和快捷键实际执行验收。
运行与调试 / 运行配置从 Finder / Dock 启动时继承登录 shell 的环境
login-shell-environment
已实现
待验证
证据路径
macos/Sources/Lithe/Platform/MacOS/Runtime/MacLoginShellEnvironment.swift
macos/Sources/Lithe/Platform/MacOS/MacApplicationEntryPoint.swift
macos/Sources/Lithe/Platform/MacOS/Runtime/MacRuntimeLocator.swift
macos/Sources/Lithe/Platform/MacOS/Process/MacManagedProcess.swift
macos/Tests/LitheTests/MacLoginShellEnvironmentTests.swift
.agents/notes/implemented/bug-fix/2026-10-30-login-shell-environment-and-jdk-selection.md
平台专属
不适用
证据路径
.agents/notes/implemented/bug-fix/2026-10-30-login-shell-environment-and-jdk-selection.md
RunmacOS:在 ~/.zshrc 里通过 mise 或 SDKMAN 提供 mvn、java 并导出 JAVA_HOME,不设置 MAVEN_HOME。删除 Caches 下的 login-path 后从 Finder 启动 Lithe,打开 Maven 项目:Maven 工具窗口和项目设置能自动检测到 mise/SDKMAN 的 Maven 与 JDK,运行 Maven 目标和 package.json 脚本不再报找不到命令;login-path 只含 PATH。再次启动时立即使用缓存,修改 rc 后第二次重启生效。rc 中加入 sleep 10 时首次启动在 3 秒内继续。设置 LITHE_SKIP_SHELL_ENV=1 从终端 open 时不读取 shell。Windows GUI 程序从注册表继承完整用户环境,没有这个问题。
Java / 语言服务补全与 Hover
lsp-completion-hover
已实现
待验证
证据路径
macos/Sources/Lithe/Core/Language
rust/lithe-core/src/lsp/languages/jdt.rs
rust/lithe-core/src/lsp/interface/engine.rs
shared/fixtures/lsp/java-completion-v1.json
shared/fixtures/lsp
shared/fixtures/lsp/completion-refresh-v1.json
已实现
待验证
证据路径
windows/tauri/src/features
rust/lithe-core/src/lsp/languages/jdt.rs
rust/lithe-core/src/lsp/interface/engine.rs
shared/fixtures/lsp/java-completion-v1.json
shared/fixtures/lsp
shared/fixtures/lsp/completion-refresh-v1.json
Language Tooling在相同 Java fixture 中验证补全、Hover、排序、超时和空结果。Java 构造器和方法补全使用 JDT LS 的 guessMethodArguments=off:输入 new No 后接受 Node 候选应得到 Node(),光标在括号内;方法调用同样不插入参数名,构造器重载候选由 JDT LS 合并为类型候选。验证 initialize、didChangeConfiguration 与 workspace/configuration 三个配置入口一致,父级和叶级 section 均保留插件 favoriteStaticMembers、filteredTypes 等其他补全配置,其他语言 snippet、Java 方法补全签名展示及自动导入仍正常。 连续输入时保留 isIncomplete 并通过 LSP triggerKind=3 重新请求候选;验证空未完整列表、完整/空响应、触发字符、快速修改及文档关闭/会话替换后的过期结果。
语言支持 / 语言服务大型工作区的 LSP 设置页后台识别、快照缓存与可及时取消的页面等待
lsp-control-center-performance
已实现
待验证
证据路径
macos/Sources/Lithe/Application/Features/LSPProjectUsage.swift
macos/Sources/Lithe/Application/Features/LanguageToolingFeatureModel.swift
macos/Sources/Lithe/Views/Language/LSPControlCenterView.swift
macos/Tests/LitheTests/LSPProjectUsageTests.swift
macos/Sources/Lithe/Views/Diagnostics/SettingsPageLatencyProbe.swift
macos/Sources/Lithe/Views/Components/LitheSplitPaneView.swift
macos/Tests/LitheTests/SettingsPageLatencyTraceTests.swift
macos/Tests/LitheTests/LitheSplitPaneCollapseTests.swift
macos/Tests/LitheTests/AppModelSettingsChangesTests.swift
macos/Tests/LitheTests/WorkspaceLanguageServerPreferencesTests.swift
.agents/notes/implemented/bug-fix/2026-10-28-lsp-project-usage-cancellation.md
平台专属
不适用
证据路径
windows/tauri/src/features/editor/lsp
LanguageToolingFeatureModel / LSP 设置页2026-10-28 Review 修复在本机 Swift6.4/Xcode27.1 上通过51项定向Swift测试、7个suite,逐项HTML/JUnit计时已生成;其中原生挂载测试最慢1.332秒(两种语言合计)。取消回归以有界gate证明:旧扫描忽略取消且未释放时,新请求及旧消费方已完成;共享消费方、最后一方取消、reset、模型释放与热缓存复用均通过。完整SettingsView保持同一宿主,README→Go→Java→README四份快照自动更新,settingsChanges保持0;不可变输入绑定同一快照ID和文件数组。真实中英文AX加载名称在相反父locale下通过。另在已打包现有翻译/字体/图标的独立原生测试宿主通过5项补充测试,导出16张加载/提示/空状态/缩放截图;宿主前后584个文件和链接条目及内容哈希不变。现有30万URL算法与132.45ms窗口更新p95数据来自原PR测量,本次未重测性能,不代表显示器物理呈现。原提交59ea6353的Swift6.3.3/Xcode26.6 CI已通过Swift测试及ARM64打包;本次修复尚无该固定工具链CI结果,100ms目标及macOS13运行兼容性仍待验证,保持pending。
Java / 语言服务诊断与编译错误定位
lsp-diagnostics
已实现
待验证
证据路径
macos/Sources/Lithe/Core/Language
macos/Sources/Lithe/Services/Diagnostics
rust/lithe-core/src/lsp/interface/engine.rs
rust/lithe-core/src/lsp/interface/engine_real_jdt_tests.rs
已实现
待验证
证据路径
windows/tauri/src/features/diagnostics
shared/fixtures/lsp
rust/lithe-core/src/lsp/interface/engine.rs
windows/tauri/src/features/editor/lsp/lsp-client-diagnostics-batch.test.ts
Language Tooling制造语法和类型错误,比较诊断等级、消息、行列号和清理行为;通过符号链接路径打开的工作区(macOS 的 /tmp、/var 下的项目)中,Java 类型错误同样出现在编辑器波浪线和问题面板,修正后消失。导入大型 Java 工程时,一次推送数百个文件的诊断,编辑器输入和补全不卡顿,问题面板只按最新一批诊断更新一次。
Java / 语言服务LSP/JDTLS 启动与工作区准备
lsp-lifecycle
已实现
待验证
证据路径
macos/Sources/Lithe/Core/Language
macos/Sources/Lithe/Services/Language
rust/lithe-core/src/lsp/languages/jdt.rs
rust/lithe-core/src/lsp/languages/jdt_configuration.rs
rust/lithe-core/src/lsp/languages/jdt_progress.rs
shared/fixtures/lsp/jdt-readiness-v1.json
.agents/notes/implemented/bug-fix/2026-10-09-jdtls-heap-ceiling-and-duplicate-maven-coordinates.md
macos/Sources/Lithe/Application/Composition/LanguageIntelligenceModuleCoordinator.swift
macos/Sources/Lithe/Application/Composition/JavaLanguageServerPreparationCoordinator.swift
macos/Tests/LitheTests/LanguageIntelligenceModuleCoordinatorTests.swift
macos/Tests/LitheTests/JavaLanguageServerRuntimeTests.swift
macos/Sources/LitheLanguageIntelligenceModule/Runtime/LanguageServerSession.swift
macos/Sources/Lithe/Core/Rust/RustLanguageServerRuntimeAdapter.swift
macos/Tests/LitheTests/RunConfigurationIntegrationTests.swift
macos/Tests/LitheTests/AppModelLanguageSessionShutdownTests.swift
macos/Tests/LitheTests/RustLanguageServerLaunchTests.swift
docs/assets/java-startup-navigation/java-ready.png
docs/assets/java-startup-navigation/get-order-definition.png
rust/lithe-core/src/lsp/languages/java_workspace.rs
shared/fixtures/lsp/jdt-workspace-fingerprint-v1.json
.agents/notes/implemented/feature/2026-10-11-gradle-project-import-settings.md
rust/lithe-core/src/lsp/interface/engine.rs
macos/Sources/Lithe/Platform/MacOS/Plugins/HostIntegrations/Jdt/MacJdtWorkspaceState.swift
macos/Tests/LitheTests/MacJdtWorkspaceStateTests.swift
macos/Tests/LitheTests/MacBuildProviderSessionsTests.swift
已实现
待验证
证据路径
windows/tauri/src/features
windows/tauri/src-tauri/src/lsp.rs
rust/lithe-core/src/lsp/languages/jdt.rs
rust/lithe-core/src/lsp/languages/jdt_configuration.rs
shared/fixtures/lsp
rust/lithe-core/src/lsp/languages/jdt_progress.rs
shared/fixtures/lsp/jdt-readiness-v1.json
.agents/notes/implemented/bug-fix/2026-10-09-jdtls-heap-ceiling-and-duplicate-maven-coordinates.md
rust/lithe-core/src/lsp/languages/java_workspace.rs
shared/fixtures/lsp/jdt-workspace-fingerprint-v1.json
.agents/notes/implemented/feature/2026-10-11-gradle-project-import-settings.md
rust/lithe-core/src/lsp/interface/engine.rs
windows/tauri/src-tauri/src/lsp/jdt_workspace.rs
Language Tooling在两端启动真实 JDTLS,验证项目准备、重启、超时、取消和资源清理,并确认典型工作流后已安装程序包(macOS app bundle、Windows 安装目录)的文件清单不变。 验证 Maven 导入连续 45 秒无进度只警告、之后 ServiceReady 可正常就绪,且 10 分钟总期限、显式失败和取消仍有效。 检查 JDT LS 启动参数的最大堆高于 1.5 GB,并在待导入模块超过 50 个、且子模块 Maven 坐标重复的聚合工程中确认工作区准备不再以 serviceReadyFailed 终止整个 Java 服务。 macOS #1524:暂停旧模块图清理后请求普通语言能力、后台 Java 维护及文档激活,确认等待结束后才读取缓存或启动新会话;等待期间取消不得重新激活;匹配 operation 的停止应清除 preparing,旧 operation 的停止不得影响新准备。 macOS #1523:通过插件入口启动 Java,确认宿主集成、Maven/Gradle 与缓存参数不丢失,连续失败最多自动启动三次,显式重启可恢复,且包内文件哈希保持不变。 macOS 最终关闭场景:暂停旧模块清理、排队文档和维护激活、关闭项目会话、释放清理;即使 AppModel 保留工作区 URL 与打开文档,也不能重新发布语言能力或启动 LSP。 macOS 生产 RustCoreBridge 与本地协议进程验证插件身份、host services、配置值和 JDT 缓存启动上下文;修复后的 Java ready 与 getOrder 定义导航截图见 evidence。 PR #1573:在两端打开已导入的 Maven 工程,修改 pom.xml(如增加依赖)后确认 JDT -data 目录不变、jdtls 增量更新而不是重新导入整个工作区;Windows 修改 gradle-wrapper.properties 的 distributionUrl 后确认切换到新的 -data 目录。检查 JDT LS 进程参数包含 -XX:+UseParallelGC、-XX:GCTimeRatio=4、-XX:AdaptiveSizePolicyWeight=90、-Xlog:disable 与 -DDetectVMInstallationsJob.disabled=true,导入完成后常驻内存回落。macOS 在大型工程导入期间打字、滚动与补全不掉帧(事件 drain 已移出主线程)。
JDT LS 统一以 -Xmx2048m 启动(#1156):打包的 1.61.0 在待导入模块超过 50 个且最大堆不超过 1.5 GB 时会走带缺陷的分批导入,重复 Maven 坐标会让 null 工程进入 IProject.open 并终止整个 Java 服务;上游修复进入下个里程碑前用这条堆上限规避。代价是语言服务 JVM 的堆上限从 1 GB 提到 2 GB,-Xms 仍为 256m。坐标完全相同的模块仍只有第一个成为 Java 工程,其余由 m2e 跳过。 JDT -data 工作区 key 只按构建文件是否存在、直接 Maven 模块、JDT LS 版本(以及 Windows 的 Gradle wrapper distributionUrl)计算,不再包含修改时间与大小:jdtls 自己检测 pom 与 Gradle 脚本的修改并增量更新。升级到该版本后每个 Java 工程首次打开会重建一次索引。JDT LS 额外以 vscode-java 与上游 CI 的 GC/日志默认值启动,插件同键参数优先。
Java / 语言服务跳转、引用、语义标记与编辑
lsp-navigation-edits
已实现
待验证
证据路径
macos/Sources/Lithe/Core/Language
shared/contracts/rust-core-api.md
frontend/editor/src/workbench.ts
macos/Sources/Lithe/Models/AppModel/AppModel+CodeNavigation.swift
macos/Tests/LitheTests/LanguageNavigationCoordinatorTests.swift
macos/Experiments/Monaco/workbench.integration.ts
macos/EditorFrontend/main.ts
macos/Tests/LitheTests/MonacoWorkbenchThemeTests.swift
macos/Sources/Lithe/Views/Language/JavaReferencesView.swift
macos/Tests/LitheTests/ContextMenuCoverageTests.swift
macos/Tests/LitheTests/AppModelSettingsChangesTests.swift
Plugins/mac/Official/JavaSupport/plugin.json
macos/Tests/LitheTests/PluginSettingsTests.swift
已实现
待验证
证据路径
windows/tauri/src/features
shared/fixtures/lsp
windows/tauri/src/features/editor/engines/monaco/definition-link.test.ts
windows/tauri/src/features/editor/engines/monaco/definition-link-scheduler.test.ts
Language Tooling验证定义、引用、语义标记和 UTF-16 文本编辑的坐标转换。 Windows 验证 Ctrl+点击临时失败后无需修改源码即可重试成功,服务重启或文档重新连接后不复用旧位置,切换编辑器时丢弃迟到结果。 macOS 验证 Command 悬停仅在定义可用时显示链接颜色、下划线和手形,松键/移出/切换文档后清除;点击单目标直接打开定义,同文件方法调用不误转实现查询,主/分屏均保留原生导航历史。 macOS 普通说明悬停 500 ms,Command 提示在语义解析后立即显示;深浅主题及透明编辑器背景下,说明面板复用共享 popup chrome 并保持不透明,代码和说明文字分别使用编程/UI 字体。 macOS 悬停生命周期回归:普通说明与 Command 提示分别拥有状态;松键仅关闭 Command 提示;Esc、滚动、编辑、模型切换和失焦清除提示,取消后迟到结果不得重开;鼠标进入面板仍可交互。Command 内边距对齐 IDEA 6/6/5/6,普通说明保留原排版。运行真实 WebKit 生命周期检查;完整应用人工视觉验收待补。 macOS 实现选择列表使用原生共享 litheDropdown,验证 Esc、点击外部、关闭后重开、选择目标与切换标签关闭,并清除旧导航操作。共享搜索框、行选择样式及外框,列表按结果数收缩;上下键与回车可操作,输入法组合不误导航。查询语义分流问题不在本轮布局修复范围内。 Command 候选符号在异步解析期间立即使用稳定视图层小手光标,链接色与下划线仍等待确认;负结果在同一手势内不重复查询,松键/移出后允许重试。真实 WebKit 使用原生回复闸门验证慢服务、重绘、逐像素移动和迟到回复不造成指针闪烁或残留。 macOS Command 导航提示使用 Monaco Delayed 模式及既有 500ms hover 延迟,避免快速经过符号时立即弹窗;手形/下划线独立反馈。WebKit 验证延迟模式与首刻不显示,并覆盖松键、滚动、失焦、编辑、切换取消及统一样式。 Command 悬停候选词同步呈现手形、变色、下划线,不等待 native definitionHover;面板仍在语义确认后延迟 500ms,与即时导航装饰分离。无目标或失败撤销候选反馈,同一词内移动不重复闪动;真实导航仍由点击请求解析。WebKit 显式阻塞 native 回复验证即时装饰,并验证负结果清除。 Command hover 与点击复用 Monaco/TextMate token 类型过滤注释、字符串和正则正文;多行注释不凭单行文本猜测。词法解析成本过高时暂不显示候选。WebKit 覆盖行注释、多行注释、字符串不高亮且不导航,真实代码慢回复仍即时反馈。 macOS 定义跳转默认关闭;在 Java Support 插件设置启用后验证 Command 悬停/点击和 F12,关闭后验证专属手势监听、动作、装饰与延迟提示被释放,停止发出定义可用性请求,迟到回复不能恢复提示或结果。覆盖重复开关、现存/新建分屏、插件设置持久化、恢复默认值和插件禁用撤销;补全、诊断、普通文档悬停和独立的用法/继承标记功能保持可用。Windows 尚未实现此开关。 全局跳转开关同步所有已有项目窗口,新项目读取存储值;双项目反复切换验证旧操作失效与对象释放。未声明 editorNavigation 的语言保留原有点击/F12,包含 MyBatis XML 属性、Spring properties/YAML 和其他 LSP;不增加其悬停查询。WebKit 100 次切换验证监听恢复基线、窗口监听清零及模型/编辑器数量不增长;该结果不是长期堆内存采样。
编辑器 / 语言服务LSP 状态栏控制与按服务器查看日志
lsp-status-logs
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Workbench/LanguageServerStatusView.swift
macos/Sources/Lithe/Views/Language/LanguageServerLogsView.swift
macos/Sources/Lithe/Application/Features/LanguageServerLogsModel.swift
macos/Sources/Lithe/Application/Features/LanguageToolingFeatureModel.swift
macos/Sources/Lithe/Application/Features/LSPControlCenterPresentation.swift
macos/Sources/Lithe/Models/AppModel/AppModel+LanguageServerRuntime.swift
macos/Tests/LitheTests/LanguageServerStatusTests.swift
.agents/notes/implemented/architecture/2026-09-13-language-tooling-and-lsp-runtime-ownership.md
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginManager.swift
macos/Tests/LitheTests/PluginManagerTests.swift
macos/Sources/LitheLanguageIntelligenceModule/Runtime/LanguageServerSession.swift
macos/Sources/LitheLanguageIntelligenceModule/Services/LanguageToolingSessionManager.swift
macos/Tests/LitheTests/MacBuildProviderSessionsTests.swift
未实现
不适用
证据路径
windows/tauri/src/features/editor/lsp
Language Tooling在 macOS 打开至少两种已安装语言插件的源文件,检查右下角 LSP 状态及数量、绿色运行、蓝色启动、黄色停止和红色故障。入口在没有打开源文件、没有活跃会话和语言模块未激活时仍显示。菜单仅由当前启用且已注册的插件的 LSP 声明注入(内置可管理插件也需显式启用);没有插件时列表为空,宿主内置语言目录不得出现。启用 Java 等插件后才显示对应服务器;名称取插件已声明的服务器 executableNames;runtime 启动取关联描述元数据现有的 languageServerLaunch.executableNames,不显示 java/node 运行时名。无该字段则直接显示插件 ID,不回退语言名、插件展示名或服务器自报名称;元数据不得单独贡献服务器行。不新增插件字段和版本。禁用、隔离、安全模式抑制或未注册插件不贡献行。显示真实运行、未启动、停止和工作区停用状态,不以当前文件类型过滤运行服务;空列表仍能查看日志和打开设置,重启/停止全部只处理已有会话。代码诊断错误不改变运行状态;菜单按名称及 ID 稳定排序。分别重启和停止单个及全部服务器,确认不写工作区启用偏好、停止阻止旧异步激活重新启动、下一次显式文档打开或编辑仍按需启动;无打开文档的预热服务器也能重启。查看日志打开普通编辑器中的 LSP 日志标签并选择对应服务器;重复查看复用同一标签,不创建底部工具窗口。关闭日志标签返回原文件且不丢失未保存内容,支持共享标签排序与分组。验证服务器切换、最低级别筛选、保留原文、复制、清空当前服务器视图、新日志继续出现和其他服务器不受影响。检查服务器停止后日志标签仍可见,在中英语言、明暗主题、窄窗口及标签拖动分组后正常显示。Trace 与 RPC 原始消息暂不采集,信息提示明确说明;不得把同一日志伪装成多个通道。真实产品流程结束后关闭本次实例,比较 app bundle 文件清单不变。Windows 暂无该状态项与专用日志视图,不宣称两端一致。 PR #1631 review:延迟旧服务 shutdown 与异步资源释放,确认重启期间保持 stopping、旧资源释放前不启动替代会话,等待超时不重启;等待时再次停止或换工作区不能复活服务。Java 与另一服务同时运行时重建 Java 索引,确认另一服务状态和所选日志保持,后续同状态日志不需要触发投影重建。
界面 / 全局字体macOS 界面默认使用随安装包分发的 Inter,编辑器、终端和显式等宽内容默认使用 JetBrains Mono 2.304(代码编辑器的编程字体族可由用户在设置中改为其他已安装等宽字体,见 editor-font-family),SwiftUI 与 AppKit 共用字体入口
macos-bundled-default-ui-font
已实现
待验证
证据路径
macos/Sources/Lithe/Theme/LitheTheme.swift
macos/Sources/Lithe/Platform/MacOS/UI/MacBundledFontRegistry.swift
macos/Resources/Fonts
macos/Sources/Lithe/LitheApp.swift
macos/Sources/Lithe/Platform/MacOS/MonacoWorkbenchEditor.swift
macos/EditorFrontend/index.html
scripts/macos/verify/verify-macos-package.sh
macos/Tests/LitheTests/BundledUIFontTests.swift
平台专属
不适用
证据路径
windows/tauri/src
macOS UI在未安装 Inter 或 JetBrains Mono 的 macOS 上安装构建包,检查欢迎页、主工作区、设置、Search、Database、Git、Commit 及菜单使用 Inter;Project 树使用 13pt;编辑器和终端默认使用 JetBrains Mono(编辑器未改过字体设置时),显式等宽内容保留等宽字形;输入中文时系统回退字形正常,各控件原有字号、字重、输入/选中操作不变;安装包 Fonts 目录包含 Inter 4.1 的 18 个静态 OTF(内部版本 4.001)及许可、JetBrains Mono 2.304 的 16 个静态字型及许可/作者信息,CoreText 按 process 范围注册打包字体;UI 的 Regular、Medium、SemiBold、Bold 和 Black 请求分别匹配真实 Inter 字型,SwiftUI 不重复加权;WebKit 从同一只读 Fonts 目录加载,字体加载后重新度量 Monaco;比较字体文件清单及 SHA-256,确认启动和使用不会修改签名 bundle。编辑器字体族被用户改为其他系统字体后的行为由 editor-font-family 覆盖,本条只保证默认字体与打包资源身份。Windows 本次不变。 TextStyle 字体入口须保留显式 monospaced design,caption 与 headline 均验证等宽字型。
界面 / 全局共享控件macOS 侧边栏与工具栏悬浮提示共用 IDEA Islands 的背景、边框、圆角及文字样式
macos-shared-hover-tooltip-style
已实现
待验证
证据路径
macos/Sources/Lithe/Theme/LitheTheme.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchHoverTooltip.swift
macos/Tests/LitheTests/WorkbenchHoverTooltipTests.swift
.agents/notes/implemented/simplification/2026-09-30-macos-shared-dropdown-style.md
平台专属
不适用
证据路径
windows/tauri/src/ui
macOS UI对照 IDEA Community ManyIslands 明暗主题、HelpTooltip、AbstractPopup 与 macOS 圆角窗口边框路径:深色背景/边框 #33353B、文字 #D1D3D9,浅色背景 #FFFFFF、边框 #D1D3D9、文字 #000000;共享 1pt 内边框、4pt 圆角、13pt 字号及左右 12pt/上 8pt/下 9pt 内边距。现有侧边栏、Git Log 与工具栏消费者共用 litheHoverTooltipSurface,保留延时、定位、屏幕边界、隐藏与拖动暂停语义;深浅实际像素及定位组件测试已运行,四周侧栏完整应用 hover 验收仍 pending。
界面 / 全局共享控件macOS 全部产品操作菜单、选值下拉框与自定义弹窗使用 Git Log 筛选、设置和 Project 共同使用的共享外框及行尺寸,直接打开且无系统弹跳动画;顶部项目/分支按钮打开期间保持原hover底色;Monaco 编辑区现有右键菜单同样使用共享呈现器及 IDEA 官方原色图标;顶部项目菜单按内容宽度布局,分支菜单共享 375pt 基准及全局搜索输入框,菜单锚点位于完整工具栏槽位下缘,内容图标使用官方 16pt 明暗 SVG;配置侧边子菜单支持原文名称与简短说明,按实际宽度测量多行行高,键盘滚动后的选择保持到真实指针移动;原生浮层更新与尺寸反馈合并到后续主队列执行,关闭或锚点卸载取消待执行请求;操作菜单保留所属窗口焦点和开启开关的颜色
macos-shared-product-dropdowns
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Components/LitheDropdown.swift
macos/Sources/Lithe/Views/Components/LitheContextMenu.swift
macos/Sources/Lithe/Views/Components/LitheSettingsControls.swift
macos/Sources/Lithe/Theme/LitheTheme.swift
macos/Sources/Lithe/Views/Git/GitLogView.swift
macos/Sources/Lithe/Views/Workspace/ProjectSidebarView.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchView.swift
macos/Sources/Lithe/Views/Agent/AgentSessionSelectors.swift
macos/Sources/Lithe/Views/Debug/GenericDebugView.swift
macos/Tests/LitheTests/ContextMenuCoverageTests.swift
macos/Tests/LitheTests/WorkbenchRenderingSafetyTests.swift
.agents/skills/develop-lithe/SKILL.md
.agents/notes/implemented/simplification/2026-09-30-macos-shared-dropdown-style.md
macos/EditorFrontend/context-menu.ts
macos/Sources/Lithe/Views/Editor/MonacoEditorContextMenu.swift
macos/Tests/LitheTests/MonacoEditorContextMenuTests.swift
macos/Experiments/Monaco/context-menu.integration.ts
macos/Sources/Lithe/Views/Workspace/ProjectSwitcherPopover.swift
macos/Sources/Lithe/Views/Git/BranchSwitcherPopover.swift
macos/Sources/Lithe/Views/Workspace/ProjectIdentityAppearance.swift
macos/Tests/LitheTests/BundledUIFontTests.swift
macos/Sources/Lithe/Views/Agent/AgentPanelStyle.swift
macos/Tests/LitheTests/AgentMavenAppearanceTests.swift
macos/Tests/LitheTests/SettingsSelectPopupGeometryTests.swift
macos/Tests/LitheTests/AgentSessionSelectorLayoutTests.swift
macos/Tests/LitheTests/AgentSessionSelectorInteractionTests.swift
macos/Tests/LitheTests/AgentActivityPresentationTests.swift
macos/Tests/LitheTests/LitheActionMenuFocusTests.swift
平台专属
不适用
证据路径
windows/tauri/src/ui
macOS UI按 PR 迁移清单逐项打开 Agent、App/设置、Database、Debug、Editor、Git、GitHub、Java、Search、Diff、Workbench 的菜单与选择面板,检查同一共享外框、圆角、边框、单行行高、字体和无弹跳展开;选中项、禁用条件、动作、动态列表、危险操作确认及键盘操作保持原语义。顶部项目/分支按钮打开期间保持原hover底色,移入菜单后仍保留,关闭后释放;不使用蓝色菜单选中色。原生子菜单保留父面板并只接收自己的按键,Esc/外部点击按层关闭,所有方向保持屏幕边界,锚点卸载/移出窗口清理面板与监视器。真实 NSHostingView 回归验证环境对象/语言完整继承。保留系统应用菜单、系统对话框、编辑器补全/悬停文档与显式 segmented 选项;静态门禁禁止产品恢复 SwiftUI Menu、popover、NSPopUpButton 或非 segmented 的原生 Picker。完整人工视觉验收保持 pending,Windows 本次不改。 Monaco 编辑区保留既有条目与命令,剪切/复制/粘贴/格式化使用 IDEA 官方 16pt 明暗 SVG,无图标的 action 留空并对齐;确认主编辑区、分屏和 diff 的右键菜单取消/关闭、焦点与现有动作正常;执行 scripts/macos/probe/probe-macos-monaco.sh --workbench-tests 验证正式前端的菜单桥接和命令事件。 右键编辑器标签的 Copy Path / Reference 子菜单从触发行旁展开;父菜单有分隔线或滚动时仍对齐可见行。打开/关闭/切换子菜单固定主菜单,屏幕边缘允许子菜单上移或向左展开;Copy Relative Path 完整显示,带快捷键、勾选和图标的宽度计算保持一致。 顶部项目菜单确认随名称/路径宽度自然变化、长路径受共享边界限制,项目徽标20pt;两个入口按钮与菜单留出工具栏槽位内的4/5pt间距。分支输入框复用 Git Log 全局样式,输入法未提交时隐藏占位并在hover显示I-beam,官方16pt图标和共享蓝色hover正常。 项目徽标字母使用共享ProjectAvatarBadge,20pt标识对应13pt JetBrains Mono SemiBold;核对顶部、项目菜单和欢迎页,颜色与大小保留。 共享 LitheIcons 资源入口兼容省略 .svg 的调用,明暗兄弟路径使用正确后缀;实际打包资源检查直接路径/显式后缀解析一致,不再因后缀缺失显示空图标或错误回退。 Project/Dependencies、Terminal shell 和动作菜单均按触发控件边界定位,鼠标点击位置和键盘触发不改变锚点。 Agent 主画布与编辑器共用 editor 背景,标题、上下文区和边框读取共享主题 token;明暗及应用配色切换后不得残留局部固定灰色。 从原生菜单执行剪切、复制、粘贴时恢复 WebKit 焦点并使用原生编辑命令,避免异步菜单回调丢失 DOM 用户手势;桥接返回 handled 防止 Monaco 重复执行,其他命令仍由 Monaco 运行。实际 WKWebView 剪贴板与前端 workbench 集成检查覆盖该路径。 另检查分组折叠/恢复、搜索焦点与 Git Log 共享外框、子菜单横向定位及两层 Esc 关闭。 深浅主题下分别验证动作菜单与自定义弹窗:再次左键点击原按钮关闭,点击另一按钮直接切换,点击空白处关闭;打开嵌套菜单后仍保留父窗口。 深浅主题下检查 Agent 速度/思考独立子菜单:主面板固定、子窗口贴齐触发行并在右缘向左翻转,说明换行不越出行高、长列表可键盘滚动至末项;滚动完成并捕获渲染后按 Return 仍选择键盘目标,静止鼠标的合成悬停不能抢走选择;实际移动鼠标后恢复指针选择。Esc 按层关闭,选值和锚点拆除释放所有子窗口。 同一配置 ID 的 choices、currentValue 或说明变化时,已打开的子菜单关闭,模型面板及搜索保留;重新打开使用最新选项、说明和勾选。原生窗口回归覆盖模型搜索输入法组合后提交,以及键盘滚动后 mouseMoved 恢复指针选择;其他选项更新不关闭当前子菜单。 原生窗口回归另检查连续内容/尺寸变化只交付最新值,尺寸回调不会同步重入,深浅外观下更新合并为一个面板;关闭或卸载发生在首次打开或更新交付之前时,不得重新打开旧面板。 打开技能三个点纯操作菜单,所属设置窗口保持 key 身份、开启开关保持颜色且不发配置写入;方向键/Return/Esc 可用,真正保存期间仍禁用。搜索下拉继续获得输入焦点,嵌套子动作菜单优先接收按键;所属窗口失焦或应用切换关闭菜单并移除监听。
顶部分支菜单的 Recent/Local/Remote/Tags 支持点击折叠,Recent 按命名空间分组;搜索覆盖全部引用,清空后保留各组折叠状态。分支动作在右侧按触发行对齐,屏幕边缘自动向左展开。 搜索框共用 Git Log 的控件尺寸、占位、IME 和焦点外框,按上游 SearchFieldWithExtension 显式使用弹窗背景;弹出时焦点留在面板,直接输入或 ⌘F 才进入编辑器。 共享弹窗显式观察应用 colorScheme,内容与外框继承同一环境,原生面板同步明暗外观;应用外观与系统外观不同时不再出现黑色搜索框和浅色文字。 见 #1138:已确认原生布局递归栈溢出,具体触发控件未确定;当前验证覆盖同步反馈风险的防护,不代表原始崩溃已经完整复现。
工作台 / 界面样式macOS 共享滚动条样式
macos-shared-scrollbar-style
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Components/LitheScrollViewChrome.swift
macos/Sources/Lithe/Views/Diff/DiffScrollSynchronization.swift
macos/Sources/Lithe/Views/Diff/DiffHorizontalScrollSupport.swift
macos/Tests/LitheTests/LitheScrollBarStyleTests.swift
.agents/notes/implemented/feature/2026-10-02-macos-shared-scrollbar.md
平台专属
不适用
证据路径
windows/tauri/src/styles/scrollbars.css
Workbench在 macOS 深浅色核对 Project/Dependencies、Settings/Keyboard Shortcuts/Project Runtime、LSP、Git Log/Console/Worktrees 共享轨道与滑块;默认 chrome 消费者使用共享绘制,AppKit 比例、页点击、嵌套滚轮边界与自动隐藏语义保留。Diff 横向/两侧/单栏入口共用编辑器用途配色和胶囊;标记与滑块在不同横向区域,左 rail 镜像,点击仍导航且 hover 不改变位置。真实 NSHostingView/NSScrollView 深浅像素与几何组件检查不代替完整应用滚动视觉验收;后者 pending。
工作台 / 界面样式macOS 普通选中行主题与区域和窗口焦点
macos-shared-selection-focus
已实现
待验证
证据路径
macos/Sources/Lithe/Theme/LitheTheme.swift
macos/Sources/Lithe/Views/Components/LitheToolWindowTabStyle.swift
macos/Tests/LitheTests/LitheTreeRowStyleTests.swift
macos/Tests/LitheTests/EditorTabOrderFeatureModelTests.swift
.agents/notes/implemented/simplification/2026-09-30-macos-shared-dropdown-style.md
平台专属
不适用
证据路径
windows/tauri/src/features/file-explorer/styles/file-explorer-tree.css
Workbench深浅主题下分别点击 Project、Commit、Maven、Run、Git Log、PR、Redis/Nacos、SQL 历史、本地历史、Tests、Debug 堆栈、Agent 历史、Settings 和插件列表;独立列表间及详情编辑器间转移焦点,窗口失焦变灰、激活恢复,选择和布局不变。验证多选、方向键、共用 field editor 转移和快速内外点击;折叠卸载后转移焦点再展开,挂载在下一次主队列按当前焦点重算,销毁真实 SwiftUI State 宿主不触发独占访问冲突;点击列表后详情程序化聚焦,较早鼠标回调不得覆盖新焦点。共享样式真实像素回归覆盖窗口 key/inactive;原生 Git 图谱和文件树需检查窗口切换时及时重绘。完整应用全部入口及非默认主题验收仍 pending。
工作台 / 公共控件macOS 原生树与列表使用完整公共入口,统一焦点、两侧留白、悬停、活动/失焦选择、方向键、范围多选、双击展开及回车;项目树与插件树共用展开箭头控件;既有页面与声明式插件共用;保留原生视口、拖放、业务加载与输入编辑;右键选择与数据库打开分离,空节点菜单不拦截行内业务菜单,无障碍默认按下执行激活并保留独立行内按钮;外部选择更新同步键盘游标及范围锚点,Shift扩缩选保留锚点,上下键跳过普通不可选标题并保留可展开分组导航
macos-shared-tree-list-control
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Components/LitheTreeList.swift
macos/Tests/LitheTests/LitheTreeListTests.swift
macos/Tests/LitheTests/LitheTreeRowStyleTests.swift
macos/Sources/Lithe/Views/Workspace/ProjectSidebarView.swift
macos/Sources/Lithe/Views/Workbench/PluginNativeToolWindowView.swift
.agents/notes/implemented/simplification/2026-09-30-macos-shared-dropdown-style.md
未实现
不适用
证据路径
windows/tauri/src/ui
Workbench UI运行 LitheTreeListTests、LitheTreeRowStyleTests、PluginNativeUITests、ProjectTreeSelectionTests、GitChangeSelectionTests、原生 Git 文件树和 Worktree 及焦点回归;实机验证 Sample Explorer 与 Project/Commit/构建/设置列表的两侧留白、焦点边框、选择、悬停、方向键、范围选择、双击名称展开/收起、箭头一致性、回车与嵌入输入;深浅色及窗口失焦分别验收。组件验证不代替全部页面实机验收;Windows 后续独立同步。 #1423审查回归:表A保留单元格草稿/新增行/删除行时,右键表B再Escape不改变活动表且三类草稿不丢;明确打开B仍可导航。单选/多选节点空菜单时运行/依赖内嵌菜单可打开并执行;无障碍默认按下打开对应结果文档,行内按钮保持独立。 运行 externalSelectionRetargetsMountedKeyboardAndPreservesShiftAnchor 和 problemsKeyboardCrossesFileHeaderAndOpensTheNextDiagnostic,验证 Return、连续 Shift 扩缩选和 Problems 跨文件后实际打开目标行列。
编辑器 / Markdown图片导入与链接定位
markdown-images-links
已实现
待验证
证据路径
macos/Sources/Lithe/Services/Markdown
macos/Sources/Lithe/Platform/MacOS/MarkdownPreviewWebView.swift
已实现
待验证
证据路径
windows/tauri/src/features/editor/markdown
windows/tauri/src/features/viewer
Editor验证本地图片、远程图片、相对链接和打开源文件行为。
编辑器 / MarkdownMarkdown 预览目录默认展开、全高滚动与标题跳转
markdown-preview-outline
已实现
待验证
证据路径
macos/Sources/Lithe/Resources/MarkdownPreview/preview.js
macos/Sources/Lithe/Resources/MarkdownPreview/preview.css
未实现
不适用
证据路径
windows/tauri/src/features/editor/markdown/markdown-preview.tsx
Editor在 macOS 原生 Lithe 打开含 60 节标题的 Markdown,验证默认展开、全高目录独立滚动、末尾标题跳转后保持展开、按钮与 Escape 收起;分栏中编辑保存及外部刷新保留折叠选择,删除全部标题隐藏目录,恢复标题保留展开偏好;检查短文档与无标题文档、宽预览正文避让和窄预览可收起。Windows 目录入口待实现。 补充无标题时按 Escape 关闭图片后恢复标题的展开偏好验证。
编辑器 / MarkdownMarkdown 预览与富文本渲染;macOS 离线数学公式、mhchem 化学方程式与物理单位、Mermaid、脚注及上下标;内嵌 HTML 的徽章图片保持行内排版,并保留容器、段落与标题的安全对齐属性;PlantUML 代码块可离线显示时序图与类图
markdown-rendering
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Editor/MarkdownPreviewView.swift
macos/Sources/Lithe/Core/Ports/MarkdownRendering.swift
macos/Sources/Lithe/Resources/MarkdownPreview/index.html
macos/Tests/LitheTests/MarkdownPreviewRichContentTests.swift
rust/lithe-core/src/project/markdown.rs
shared/fixtures/editor/markdown-rich-content-v1.json
macos/Sources/Lithe/Resources/MarkdownPreview/preview.css
macos/Tests/LitheTests/MarkdownPreviewHTMLTests.swift
shared/fixtures/editor/markdown-html-v1.json
macos/Sources/Lithe/Platform/MacOS/MarkdownPlantUMLRenderer.swift
macos/Tests/LitheTests/MarkdownPlantUMLTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/editor/markdown
windows/tauri/src/features/editor/markdown/use-highlighted-markdown.test.tsx
Editor使用代码高亮、表格、Mermaid、链接和相对路径 fixture 对比渲染结果。打开含上千个代码块的大型 Markdown 预览,渲染不卡住,编辑时预览不会先闪成未高亮的代码;代码里的 `$&`、`$1` 按原文显示。macOS 在深浅主题运行 markdown-rich-content-v1.json:行内数学、块级化学反应、物理单位均生成可访问 MathML,没有 katex-error;Mermaid 生成真实 SVG,脚注链接及回链存在;H~2~O 与 x^2^ 正确,双波浪线仍是删除线,代码内语法保持原文。运行前后逐文件比较预览资源哈希,确认无网络脚本和远程资源请求、bundle 不变。macOS 使用 markdown-html-v1.json 及仓库 README 验证:宽预览中同一段内多个徽章同行居中,窄分栏按可用宽度自然折行;div/p/h1 的 align 生效,显式 br 和普通段落保留,正文行内图片不拆行,相对图片与点击放大仍可用。深浅主题均检查,脚本、事件处理器、危险 URL 和任意 style 仍被剥离。 macOS PlantUML:在深浅主题打开时序图和类图 fenced block,离线生成可放大的 SVG 图片,不能在文档 DOM 执行 SVG;多个代码块顺序执行,切换文档拒绝旧结果;本地 include 被拒绝且保留源码与本地化提示,超大输入立即失败,关闭和取消释放渲染器;运行前后比较预览资源 SHA-256。
Windows 预览中屏幕外的段落、标题、列表和代码块使用 content-visibility: auto 跳过排版(表格除外,避免溢出被裁切);8.6 万行文档打开预览的最长主线程任务由约 10 秒降到约 1.3 秒,滚动最长任务由约 3.8 秒降到约 0.23 秒。2026-11-01 #1623:macOS 图片不再全局 display:block,Core 保留 div/p/h1-h6 的 align,但不开放 style;新增共享输入和真实 WKWebView 回归。2026-11-01 #706 增强第一批:macOS 加载与 KaTeX 0.16.0 匹配的离线 mhchem 3.3.0 扩展,Core 开启 Comrak 下标,并增加真实 WKWebView 的数学、化学、Mermaid、脚注和上下标回归。Windows 仍使用独立简化解析器,未在本批迁移,也未修改或验证其 HTML 行为;不能宣称 #706 已整体完成。完整产品和 Windows 真机验收保持 pending。 2026-11-01 PlantUML:仅 macOS 接入官方 MIT @plantuml/core 1.2026.9,使用内置 Smetana;独立非持久 WebView、固定资源白名单、256KiB 源码/4MiB SVG/4096px/八秒预算,输出为被动 SVG 图片。无在线服务器、Java、Graphviz、WASM 或跨文件 include;可选主题和扩展库不打包,Windows 未修改。
Java / Java/MavenMaven 设置页在没有打开项目时也能编辑用户级 ~/.m2/settings.xml 的本地仓库:读取并回显真实值或标注的 Maven 默认值,确认后只改写该元素,读取后被修改时拒绝覆盖并保留草稿
maven-user-settings-editing
未实现
不适用
证据路径
macos/Sources/Lithe/Views/App/ProjectRuntimeSettingsView.swift
已实现
待验证
证据路径
windows/tauri/src-tauri/src/maven/user_settings.rs
windows/tauri/src-tauri/src/maven/settings_xml.rs
windows/tauri/src-tauri/src/maven.rs
windows/tauri/src/features/settings/components/tabs/maven-user-settings-group.tsx
windows/tauri/src/features/settings/components/tabs/maven-settings-panel.tsx
windows/tauri/src/features/maven/api/maven-host-api.ts
rust/lithe-core/src/project/maven.rs
windows/tauri/src/features/settings/components/tabs/maven-user-settings-group.test.tsx
Java / MavenWindows:不打开项目进入 Maven 设置页,用户设置组显示 settings.xml 路径与状态;文件不存在时回显 Maven 默认仓库且打开页面不创建文件;保存后文件只新增或改写 <localRepository>,注释、镜像、服务器与凭据保持不变,页面回显读回的值。保存前用外部编辑器修改文件,保存被拒绝并保留输入,“重新读取”后可再保存。格式错误的文件只读且不被改写。打开项目时保存后提示重新加载 Maven,重新加载后项目使用新仓库。
Maven 可执行文件和 JDK 的应用级全局默认值未在本项实现:现有项目链路(run/local.json 与 Maven 本地文档)已回退到本机自动检测,再加一层 Lithe 默认值需要单独设计回退顺序。
AI / IDE MCP同页上方管理服务器资源库,下方默认显示离线可用的内置精选;搜索时查询官方 MCP Registry、分页并与精选去重,失败保留可用匹配并提供显式直连重试;静态远程或简单固定版本 npm/PyPI 入口进入平铺编辑弹窗,选择 Agent 并确认后保存;十个常用精选随应用打包品牌图标和运行方式标签,GitHub 令牌及 Filesystem 允许目录须补全后保存;在线连续结果接近底部自动续页,不再逐页点击
mcp-registry-discovery
已实现
待验证
证据路径
rust/lithe-core/src/mcp/registry.rs
shared/contracts/mcp-registry-page.json
macos/Sources/Lithe/Core/Ports/McpRegistry.swift
macos/Sources/Lithe/Platform/MacOS/MCP/MacMcpRegistry.swift
macos/Sources/Lithe/Application/Features/McpRegistryFeatureModel.swift
macos/Sources/Lithe/Views/App/McpDiscoveryView.swift
macos/Tests/LitheTests/McpRegistryTests.swift
rust/lithe-core/src/mcp/featured.json
macos/Tests/LitheTests/McpRegistryIntegrationTests.swift
macos/Sources/Lithe/Theme/McpBrandIcon.swift
macos/Sources/Lithe/Resources/McpIcons/NOTICE.json
macos/Tests/LitheTests/McpArgumentRoundTripTests.swift
shared/fixtures/mcp/featured-setup-v1.json
macos/Sources/Lithe/Views/Components/LitheScrollLoadTrigger.swift
macos/Tests/LitheTests/ScrollLoadTriggerTests.swift
未实现
不适用
证据路径
shared/contracts/rust-core-api.md
AgentCore 验证精选目录、删除记录过滤、固定包版本、复杂输入不猜配置、链接和大小上限;模型覆盖离线首页不请求网络、失败保留精选、显式直连和路由分页隔离、在线连接去重、取消和旧响应。实机打开页面立即显示精选,标题右侧来源标记为灰色普通文字“精选,以及官方 MCP Registry”,辅助功能树不包含该标记的链接或按钮;系统代理失败时仍显示匹配,点击直连重试后经生产 adapter 查询官方目录并加载更多,再切回系统代理确认模式生效;添加草稿取消不改 Agent 配置。公开目录请求继续校验证书,系统代理、Agent 网络和发行目录保持不变。联网集成用 LITHE_RUN_MCP_REGISTRY_INTEGRATION=1 显式开启,普通测试不依赖网络。Windows UI 尚未接入。 新增精选应检查十项本地图标完整且公开条目回退传输图标;深浅色宽窄卡片保持可读;GitHub 空令牌、Filesystem 缺少或相对目录不能保存,补全后经两 Agent 原生格式写入并回读,目录空格保持。未执行或联网调用服务器不计作实际服务验收。 续页专项检查原生与 SwiftUI 视口离屏不请求、接近尾部自动请求、短列表与尺寸变化、追加偏移保持、同页去重/卸载;McpRegistryTests 覆盖失败暂停与同 cursor 重试、空页和循环停止、查询/路由隔离。在生产设置页在线搜索后持续滚到底部,确认自动续页与网络错误不会形成重试风暴。
AI / IDE MCP在设置页统一发现、合并、编辑并删除 Codex 与 Claude Code 已注册的 MCP 服务器,按 Agent 独立启用;项目授权开启时自动写入 Lithe MCP,关闭时按账本清理;支持资源库搜索、原生弹窗编辑和标准 mcpServers JSON 预览导入;紧凑图标配置弹窗及精确命令行参数投影,主动 stdio/Streamable HTTP 工具检测,按 Codex/Claude 原生规则独立管理工具开关并保留外部禁用项;关闭及删除后的 Codex 原生工具名单按路径/名称保留,再添加时恢复
mcp-server-library
已实现
待验证
证据路径
macos/Sources/Lithe/Application/Features/McpServerLibraryFeatureModel.swift
macos/Sources/Lithe/Core/Ports/McpConfigurationStore.swift
macos/Sources/Lithe/Platform/MacOS/MCP/MacAgentMcpConfigurationStore.swift
macos/Sources/Lithe/Views/App/McpServerLibraryView.swift
macos/Tests/LitheTests/McpServerLibraryTests.swift
macos/Tests/LitheTests/McpBatchTransactionTests.swift
macos/Tests/LitheTests/McpServerSummaryTests.swift
macos/Tests/LitheTests/McpExcludePreservationTests.swift
rust/lithe-core/src/mcp/mod.rs
rust/lithe-core/src/mcp/plan.rs
rust/lithe-core/src/mcp/tests.rs
macos/Tests/LitheTests/McpArgumentRoundTripTests.swift
macos/Tests/LitheTests/McpSymlinkConfigurationTests.swift
macos/Tests/LitheTests/McpWriteProtectionTests.swift
macos/Sources/Lithe/Views/App/McpDiscoveryView.swift
macos/Sources/Lithe/Platform/MacOS/MCP/MacMcpTools.swift
macos/Sources/Lithe/Application/Features/McpToolsFeatureModel.swift
macos/Sources/Lithe/Views/App/McpToolsPanel.swift
rust/lithe-agent-host/src/mcp_probe.rs
rust/lithe-core/src/mcp/tools.rs
macos/Tests/LitheTests/McpToolsFeatureTests.swift
平台专属
不适用
证据路径
windows/tauri/src/features/host-api/mcp-settings.tsx
Agent运行 cargo test -p lithe-core mcp:: 与 ./scripts/macos/test/test-macos.sh --filter "McpServerLibraryTests|McpBatchTransactionTests|McpServerSummaryTests|McpExcludePreservationTests|McpArgumentRoundTripTests|McpSymlinkConfigurationTests",注入两次写入之间的外部修改,确认先前文件恢复、账本不变、回滚时保留外部修改并提示路径;验证 args 与 URL 凭据不在摘要中,以及非 UTF-8 exclude 规则保留、读取失败保护和幂等;覆盖双窗口按顺序保存后旧草稿被拒绝(包括刷新列表、可见字段恰好等于新版本)、各 Agent 使用自己的完整来源哈希、未建模认证或超时变化阻止删除/重命名/项目清理、旧账本显式重新接管,以及双 Agent 合并、门禁冲突、接管所有权、保格式编辑、项目注册与外部修改保留。实机打开设置 → MCP:无项目时资源库仍列出 Codex/Claude 已有服务器;编辑 env 并保存后检查原文件注释与未知键未丢、备份生成;按 Agent 关闭外部条目被拒绝,接管后可移除。打开项目并启用 MCP,确认 ~/.claude.json 项目条目与 <项目>/.codex/config.toml 写入、.git/info/exclude 包含 .codex/config.toml;禁用后清理,外部改过的条目保留并提示。运行 ./scripts/macos/test/test-macos.sh --filter "McpWriteProtectionTests|FileStorageReplacementTests|McpFeatureBatchFailureTests" 验证备份后外部保存保留、条件删除、非普通文件目标拒绝、发布失败后批量恢复且不发布账本;回滚保留更新保存的路径、临时文件从创建起为 0600、不支持交换的卷 fail closed。 运行前后对比安装目录文件清单与哈希,确认运行时未写入发行目录。 覆盖仅改 env 时空参数、纯空白与嵌入换行的无损往返;两个 Agent 的相对/绝对符号链接读取、生成计划、备份、保存、故障回滚、外部目标修改保护及大小/UTF-8 校验。 在无项目和已打开项目两种状态下检查资源库搜索、添加/编辑弹窗、JSON 预览选择;取消不改配置。检查 900 点宽与深浅主题,项目授权区保留。 检测需显式触发,本地命令须确认;覆盖分页、工具数量/字节上限、实际 stdio/本地 HTTP、取消、虚拟超时和子进程清理。逐 Agent 关闭/开启自有规则并回读,外部 deny/allow-list 不放宽,过期快照不覆盖文件。全局页打开不启动服务器;验证工具列表与编辑器深浅色宽窄布局。SSE 配置保留但检测明确不支持,未验收的原生会话工具行为不能据配置测试宣称 verified。 McpArgumentRoundTripTests.disabledToolsSurviveServerRemovalAndReopening 对 Agent 开关、编辑器保存、删除重加三条真实隔离文件路径验证:工具仍禁用,外部 deny/allow-list 不放宽、另一 Agent 不变、新页面读回且仅 Lithe 自有规则可重新开启。Core 回归覆盖空 allow-list、非法类型、现存原生规则优先及恢复后完整哈希。CI test-stability-macos 产物包含 mcp-ui 的真实产品编辑器及工具面板深浅主题、宽窄截图。 验证禁用自有工具后重命名、重新读取并开启,外部 deny/allow-list 保持不可编辑,旧名重用不继承所有权;检测后及探测期间新增、移除 Agent 时刷新对应策略并释放旧快照,读取失败可见且不影响另一 Agent,服务器探测次数保持一次。
macOS 新增 MCP 服务器资源库:Core 解析 Claude JSON 与 Codex TOML 并生成保格式修改计划,macOS 适配器负责路径、备份和原子写,应用模型以“名称 + 定义哈希”合并列表,以覆盖未知字段的完整来源哈希维护所有权账本。草稿保存保留打开编辑器时各 Agent 的来源版本并作为独立 expectedHash 前置条件,刷新列表和共享账本更新都不能授权旧草稿覆盖新版本;自动删除和项目清理检测认证、超时等未建模字段的外部改动,旧账本需显式重新接管。只替换或删除 Lithe 写过的条目,外部创建的条目需要显式接管所有权。项目授权开启时把随包分发的 lithe-mcp 写入当前项目的 Claude projects.<path>.mcpServers 和 .codex/config.toml;新建的 Codex 项目配置追加到 .git/info/exclude。保存与项目注册采用批量失败恢复,整批成功后再更新所有权账本;恢复时保留外部新修改并提示未恢复路径;聚合首次写入与恢复阶段的失败时一并带出保留副本路径。列表摘要隐藏所有命令参数,并移除 URL userinfo、查询和 fragment;Git exclude 保留非 UTF-8 原始字节,已有文件读取失败则停止追加。首版不自动启动服务器做健康检查,env/header 值只在 UI 中遮蔽。Windows 尚未实现该资源库,暂标记为平台专属。 参数显示文本未改动时保留原始 argv 数组,修改时保留空行与纯空白行;配置读写及回滚共用符号链接目标解析,保留原链接和用户路径诊断。保存与回滚删除采用同目录临时文件和原子交换/移开的条件操作:备份或预检之后落地的外部保存会被保留并返回冲突,换回后会核对被换出的版本,换回失败或换出更新外部保存时保留临时文件并在错误中报告保留路径;不支持交换标志的卷返回不支持错误而不退回无条件覆盖;临时文件从创建起为 0600。 Codex 移除成功后只保留允许/禁用工具名到无 sourceHash 的账本条目,重新插入时恢复;已有原生条目和重命名不被旧保留值覆盖,格式错误拒绝移除,空允许名单仍拒绝全部工具。保留名单不构成现存文件所有权,不保存认证信息。取消探测复用 Core 注册回调,无重试计时器。 Codex 成功重命名后移动同一配置路径下的精确工具名所有权并清除旧名记录,不接管外部规则或合并目标旧记录;批量失败不迁移。已检测行的 Agent 来源改变时释放旧快照并重读本地策略,探测中变化采用最新来源,不重复连接服务器。
可观测性 / 通知与资源应用与语言服务内存监控
memory-monitor
已实现
待验证
证据路径
macos/Sources/Lithe/Services/Monitoring/MemoryUsageMonitor.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchStatusViews.swift
已实现
待验证
证据路径
windows/tauri/src/features/layout/services/memory-api.ts
windows/tauri/src/platform/tauri-core.ts
Workbench打开内存指标并观察应用、语言服务和总内存变化,确认采样失败不会阻塞工作台。macOS 状态栏只显示内存芯片图标,不再显示总计与 Lithe 数值;悬停提示显示总计、Lithe、LSP 和服务内存,点击图标打开托管内存详情并在关闭后停止详细采样,VoiceOver 读出托管内存及当前总计。同一状态栏中帧率只显示数字和 FPS 单位,不带图标;只读锁和内存图标按钮使用 18pt 紧凑尺寸,相邻项之间不再留出大块空白。Windows 状态栏仍显示总计与 Lithe 数值。
Java / Spring / MyBatisMyBatis Mapper/XML 导航
mybatis-navigation
已实现
待验证
证据路径
macos/Sources/Lithe/Application/Features/MybatisFeatureModel.swift
macos/Sources/Lithe/Application/Composition/DocumentFeatureComposition.swift
macos/Tests/LitheTests/MybatisFeatureModelTests.swift
rust/lithe-core/src/tests/mybatis.rs
已实现
待验证
证据路径
windows/tauri/src/features/mybatis
windows/tauri/src/features/mybatis/utils/mybatis-index-paths.test.ts
rust/lithe-core/src/tests/mybatis.rs
Java / MyBatis使用 Mapper/XML fixture 对比索引、导航、文件变更刷新和失效处理。 在同一已打开 Java 缓冲区移除最后一个匹配方法后恢复,以及新增第一个匹配方法,均应重新索引并恢复导航。
Core 只读取 XML 命名空间对应的 Java 候选文件;宿主保留 Java 编辑失效,不能把已成功配对的语句当作完整候选集。
通用 / 网络在设置 › 外观与行为 › 网络配置应用自身 HTTP 流量的代理:跟随系统、不走代理、自定义代理服务器(HTTP/SOCKS5、服务器地址、端口、可选用户名与 Keychain 保存的密码、逗号分隔的排除列表),并提供有界的测试连接;插件市场、GitHub、AI 提供方与稳定版回滚下载经统一会话工厂解析代理策略,配置变化后对新请求生效
network-proxy-settings
已实现
待验证
证据路径
macos/Sources/Lithe/Models/Settings/NetworkProxyPreferences.swift
macos/Sources/Lithe/Models/Settings/AppSettings.swift
macos/Sources/Lithe/Core/Ports/NetworkProxyChecking.swift
macos/Sources/Lithe/Platform/MacOS/Network/MacNetworkSessionProvider.swift
macos/Sources/Lithe/Platform/MacOS/Network/MacNetworkProxyTester.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginPackageDownloader.swift
macos/Sources/Lithe/Platform/MacOS/GitHub/MacGitHubHTTPTransport.swift
macos/Sources/Lithe/Platform/MacOS/AI/MacURLSessionTransport.swift
macos/Sources/Lithe/Platform/MacOS/Updates/MacStableRollback.swift
macos/Sources/Lithe/Models/AppModel/AppModel+NetworkSettings.swift
macos/Sources/Lithe/Views/App/NetworkSettingsView.swift
macos/Tests/LitheTests/NetworkProxySettingsTests.swift
macos/Tests/LitheTests/MacNetworkSessionProviderTests.swift
macos/Tests/LitheTests/MacNetworkProxyTesterTests.swift
rust/lithe-core/src/network/tests.rs
平台专属
不适用
证据路径
windows/tauri/src/features/settings
Settings已完成实机验收(2026-10-29,macOS 15.8.1 Intel,打包构建):设置 › 外观与行为 › 网络三档切换生效;自定义 HTTP 代理 + 测试连接返回成功耗时,错误端口返回失败原因;保存后重启保留且密码经 Keychain 不回显;经自定义代理完成插件市场访问与安装。自动化:运行 ./.agents/skills/write-stable-tests/scripts/test-stability-macos.sh -- --filter 'NetworkProxySettingsTests|MacNetworkSessionProviderTests' 与 ./scripts/macos/test/test-macos.sh --filter 'NetworkProxySettingsTests|MacNetworkSessionProviderTests|AppSettingsTests|SettingsSidebarLayoutTests|SettingsSearchVocabularyTests';运行前后对比安装目录文件清单与哈希,确认运行时未写入发行目录。 本次安全与生命周期修复的真实认证代理/完整产品流程尚待复验,不沿用原实机验收作为新行为的 verified 证据。 本次修复本地验证:Swift 6.3.3 + macOS 26.5 SDK,逐项计时运行 8 套件 85 测试全过;Rust Core 1373 单元测试与 32 集成测试全过,网络策略 4 项另有逐项计时;i18n 35 项测试、语言/生成检查、共享契约、服务边界、bundle 只读、Agent Notes 与 Windows 静态边界门禁通过。
设置模型(模式/类型/地址/端口/用户名/排除列表)走 AppSettings 的 KeyValueStore 端口持久化;密码不入偏好存储,由组合根经 MacKeychainSecureStore 加载并推入 NetworkProxyPreferences 线程安全快照,保存走 AppModel 的 SecureStore 端口。MacNetworkSessionProvider 按快照缓存会话;配置变化时只替换缓存,覆盖完整请求和流消费的租约释放后才 finishTasksAndInvalidate 旧会话;稳定版回滚通过 makeSession 复用代理与认证装配,同时保留自带超时;三个 URLSession 传输(插件市场、GitHub、AI HTTPS)改为按请求解析 sessionProvider,故设置变化对新请求生效、无需重建服务。自定义未填完整地址/端口时按跟随系统处理,不静默断网。认证质询由 MacProxySessionDelegate 应答(Basic/Digest/NTLM,previousFailureCount 为 0 时),错误凭据不会循环重试。排除列表映射 kCFNetworkProxiesExceptionsList;SOCKS5 使用独立字典键。测试连接经端口 NetworkProxyChecking 由 MacNetworkProxyTester 实现,HEAD https://github.com、10 秒超时、不抛错只回结果。明确不接管:Sparkle 更新(SPUDownloader 写死 defaultSessionConfiguration 且无注入 API,天然跟随系统代理,跟随系统档行为不变)、AI 明文 HTTP 的 NWConnection 分支、Agent/git CLI 子进程、JVM 依赖下载。Windows 是独立的 Tauri/reqwest 网络栈,本条目标记平台专属,由后续 PR 接入。 2026-10-30 评审修复:钥匙串将代理身份与密码原子保存,Rust 校验身份后才复用已存密码;旧版无身份密码要求重新输入。三个传输改用覆盖完整响应消费的会话租约,最后拥有者释放才退役;稳定版回滚使用同一工厂装配认证并保留独立超时。测试连接增加资源总超时与视图取消/过期结果隔离。
启动与窗口 / 首次启动欢迎页、项目入口与首次启动引导
onboarding-welcome
已实现
待验证
证据路径
macos/Sources/Lithe/Views/App/WelcomeView.swift
macos/Sources/Lithe/Views/Workspace
macos/Sources/Lithe/Views/Components/LitheActionButtonStyle.swift
macos/Sources/Lithe/Models/Workspace/RecentProject.swift
macos/Sources/Lithe/Platform/MacOS/RecentProjectBranchReader.swift
macos/Tests/LitheTests/RecentProjectBranchMetadataTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/onboarding
windows/tauri/src/features/bootstrap
Onboarding清空首次启动状态,验证打开项目、克隆项目、最近项目和跳过引导;在 macOS 深色与浅色模式检查欢迎页布局、颜色和交互,内容容器四周保留 8pt 外边距,默认与最小窗口尺寸下按钮文案完整且项目行可操作,确认默认及最小内容尺寸均为 800×650、可向屏幕可用区域放大,左下角齿轮菜单采用设置页下拉框配色并可进入设置与检查更新;最近项目整行(含文字外空白和边缘)悬停时高亮并显示小手光标,移出后恢复默认光标,项目按钮上下空白可点击打开,右侧菜单悬停底框为 22pt、点击范围保留 28pt,菜单独立操作,失效路径不可打开。 macOS 欢迎页 New Project、Open、Clone Repository 三个按钮在明暗主题使用 4pt 圆角、至少 72pt 宽、6pt 按钮间距;默认及最小窗口尺寸下长文案按内容扩展且不显示省略号,搜索区保持 180–220pt,放不下完整操作组时 Clone Repository/Remote Development 收入更多菜单,按钮水平内容留白为 14pt,28pt 高度、文字、边框、悬停与焦点表现保持原有实现,搜索区不应用按钮组间距;顶部保持单行与原高度,窗口最小尺寸不变;搜索区显示原始 16pt IDEA 搜索图标及明暗资源颜色,提示使用共享输入组件的 13pt Regular 和专用提示色;验证中文组合输入、搜索过滤及三个原有动作仍可用。 欢迎页按钮使用共享 LitheActionButtonStyle,悬停配色统一来自 LitheTheme.hoverBackground、页面不单独覆盖,表单保留原有外部留白、主按钮和禁用状态;验证长文字宽度与欢迎页无额外外部按钮留白。 打开一个 Git 项目后返回欢迎页,确认最近项目行在名称和路径下显示上次记录的分支(无需启动 Git 即可出现),非 Git 文件夹不显示分支行;确认行距紧凑、悬停高亮与省略号菜单行为不变。 最近项目分支图标按 Community c7f91397daa3a961b4e78bc634fe467a0a7d9ade 的 RecentProjectFilteringTree.kt → AllIcons.Vcs.Branch → PlatformIconMappings.json → expui/general/vcs.svg 使用原始 16pt 明暗资源及路径失焦文字色,不显示旧列表占位图标或缩为 11pt;深浅主题核对分支、名称、路径和点击动作。 欢迎页最近项目按 Community c7f91397 的 RecentProjectComponent 对齐:20pt 头像顶部对齐且比文字顶部低 2pt,头像到文字 12pt,标题/路径/分支行间距 4pt,分支图文间距 4pt,标题 13pt、路径及分支 12pt;上下各 8pt、左侧 10pt、右侧 8pt 留白,行高随可选分支增加而非固定 56pt。运行 welcomeRowsGrowForBranchesWithoutOverlapping,在深浅主题及 800/1100pt 宽度验证真实欢迎页的两行/三行条目不重叠、横向一致,人工检查打开、禁用和菜单动作。 欢迎页溢出入口为本地化 More/更多文字。克隆仓库表单使用 LitheTextField/LitheFormField,目录选择按钮与输入框并列,外层使用 LitheCenteredPopup 有标题居中面板,移除系统 sheet 与内容自绘标题行;面板无展开动画,高度随表单增长;取消/成功关闭复位呈现状态,克隆期间禁止手动关闭。运行 CloneRepositoryStyleTests 深浅主题验证输入区域不裁剪、13pt 共享字体及 URL 自动建议文件夹名;人工验收目录选择、取消和真实克隆。
编辑器 / 代码结构当前文件 Outline 与符号树
outline-symbols
部分实现
待验证
证据路径
macos/Sources/Lithe/Views/Language
macos/Sources/Lithe/Views/Search
已实现
待验证
证据路径
windows/tauri/src/features/outline
Language Tooling使用 Java 文件验证符号树、展开折叠、排序和跳转;确认 macOS 是否提供同等独立 Outline 入口。
语言支持 / PHPPHP 插件按需安装与生命周期(macOS 为 Lithe Store 社区插件)
php-optional-plugin
已实现
待验证
证据路径
macos/Tests/LitheTests/Fixtures/RetiredOfficialPlugins/PhpSupport/plugin.json
macos/Sources/LitheModuleAPI/Catalog/BuiltInModuleCatalog.swift
macos/Sources/Lithe/Platform/MacOS/Plugins
macos/Sources/Lithe/Views/App/PluginManagementView.swift
macos/Sources/Lithe/Views/Language/LSPControlCenterView.swift
macos/Sources/Lithe/Application/Features/PluginMarketplace.swift
macos/Tests/LitheTests/PluginMarketplaceFeatureModelTests.swift
macos/Tests/LitheTests/PluginPackageStoreTests.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginManager.swift
macos/Sources/Lithe/Platform/MacOS/MacApplicationRelauncher.swift
macos/Tests/LitheTests/PluginManagerTests.swift
已实现
待验证
证据路径
Plugins/win/Official/PhpSupport
windows/tauri/src/extensions/registry/extension-store-lifecycle.ts
windows/tauri/src-tauri/src/language_tools.rs
windows/tauri/src/extensions/packages/local-extension-package.ts
scripts/windows/verify/verify-windows-plugin-isolation.mjs
PHP Support(macOS 社区插件 Lithe-IDEA/lithe-plugin-php)macOS 在干净安装上打开插件管理,确认“Lithe 官方”源不再列出 PHP,Lithe Store 社区源列出 io.github.lithe-idea.php-support 0.1.0;安装后启用无需重启。社区包不打包 Intelephense(其许可证禁止再分发):未安装时 LSP 显示缺失提示而不是崩溃;`npm install -g intelephense` 后从 Dock 启动(精简 PATH)打开 PHP 项目并点开 `.php` 文件,确认 intelephense 通过 `LITHE_NODE_PATH` 找到 Homebrew 或 nvm/volta/fnm 安装的 Node 并启动。已安装旧官方包 dev.lithe.plugin.php-support 的环境:插件管理显示“已迁移到社区插件”提示、没有官方更新、可以卸载;旧包还在时插件市场里社区版显示“需先卸载旧版”且不可安装,卸载后点“重启 Lithe”按钮(未保存文件和运行中进程照常确认,取消则不重启)重启进入同一个应用,再安装社区版并重启,确认社区版是启用状态、LSP/运行/测试可用;卸载前手动关闭过的则保持关闭;对旧官方包将 plugin.json 的 signatureRequirement 从 publisherPackage 篡改为 sameTeamAsHost,确认 MacPluginPackageStore 仍按宿主 OfficialPluginCatalog 拒绝降级;旧包与社区包同时安装时,社区包因语言冲突被拒绝,需先卸载旧包。Windows 从独立 .lithe-extension 文件导入,默认禁用;启用后重启确认能恢复,卸载后重启确认不恢复。
语言支持 / PHPPHP 插件运行与 PHPUnit 测试
php-run-test
已实现
待验证
证据路径
macos/Tests/LitheTests/Fixtures/RetiredOfficialPlugins/PhpSupport/plugin.json
rust/lithe-core/src/plugins/declarative.rs
shared/contracts/plugins/v1/fixtures/command-plans.json
macos/Sources/LitheExecutionModule/Modules/BundledLanguageExecutionModule.swift
macos/Tests/LitheTests/RealPhpIntegrationTests.swift
部分实现
待验证
证据路径
Plugins/win/Official/PhpSupport/plugin.ts
windows/tauri/src/extensions/run
windows/tauri/src/extensions/ui/services/ui-extension-worker-runtime.test.ts
PHP SupportmacOS 安装 Lithe Store 社区 PHP 插件后运行 PHP 文件和单条/整套 PHPUnit(命令由声明式插件模板经 Rust Core 展开,与 shared/contracts/plugins/v1/fixtures/command-plans.json 一致);Windows 运行字符串/数组 Composer script 和整套 PHPUnit。禁用后菜单消失、运行进程退出,特殊文件名保持原样。Windows 暂不支持单方法发现。
扩展 / 插件与主题插件后端 v2 与工作区上下文:requires.backend 2 的后端可由 onWorkspaceOpen 或 onCommand 激活,不依赖网页,启用插件时已有工作区打开即启动;函数协议 3 提供 lithe/host/getCapabilities、subscriptions/dispose、workspace/listContexts|getContext|getFolders,调用带 {contextID, generation},换工作区发新 contextID,rootID 按插件加密钥,远程工作区不暴露路径;宿主错误码各有独立 JSON-RPC 码并可带 details;宿主经 lsp.hostNotify 推送 didChangeContexts、订阅事件和 commands/didRun
plugin-backend-workspace-context
部分实现
待验证
证据路径
rust/lithe-core/src/lsp/interface/plugin_function.rs
rust/lithe-core/src/lsp/interface/engine.rs
rust/lithe-core/src/plugins/backend.rs
shared/contracts/plugins/v1/README.md
shared/contracts/plugins/v1/fixtures/function-protocol.json
shared/contracts/plugins/v1/fixtures/backend-workspace.plugin.json
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginBackendSessions.swift
macos/Sources/Lithe/Application/Features/PluginHostServiceDispatch.swift
macos/Sources/Lithe/Application/Features/PluginWorkspaceContexts.swift
macos/Tests/LitheTests/PluginHostServiceDispatchTests.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginRootIDSecret.swift
macos/Tests/LitheTests/MacPluginBackendSessionsTests.swift
macos/Tests/LitheTests/PluginPublicHostAPITests.swift
未实现
不适用
证据路径
shared/contracts/plugins/v1/README.md
Extensions共享 Core:cargo test --manifest-path rust/Cargo.toml -p lithe-core,核对 function-protocol.json 的 hostRequests/hostFailures/hostNotifications、v2 清单拒绝 onStartupFinished 与 *、旧宿主拒绝 backend 2、v3 会话第 17 个挂起请求返回 plugin.host.limitExceeded(-32014)、$/cancelRequest 立即返回 -32800 并发布 hostRequestCancelled、details 只以不超过 4 KiB 的对象送到 v3 后端、v2 会话的 lsp.hostNotify 返回 delivered:false。macOS 宿主:scripts/macos/test/test-macos.sh --filter "PluginHostServiceDispatchTests|MacPluginBackendSessionsTests"。macOS 原生验收:debug 应用安装一个 backend 2、声明 onWorkspaceOpen 与 workspace.metadata 的示例插件,打开本地工作区后确认后端自动启动、listContexts/getFolders 返回该窗口的根;同一窗口换工作区后收到 didChangeContexts,旧 contextID 得到 plugin.host.contextExpired;执行插件命令后后端收到 commands/didRun;打开远程工作区时 folders 不含 path;关闭窗口、停用插件后用 pgrep 确认后端不残留。
本条覆盖 #1548 计划的 API-01、API-05、API-40、API-41(M0)以及 PR #1595 评审补充(宿主通知、错误码细分与 details、换工作区发新 contextID、按插件的 rootID、listContexts 不建目录、能力表只列有 handler 的服务)。macOS 已有 Core 共享测试与宿主单测,尚未做原生验收,所以验证状态为待验证。新安装带后端的包仍需重启才能激活;启动预算未定。工作区信任暂不引入。Windows/Tauri 尚无插件后端宿主。协议 3 内只增不改:新的宿主服务、选项和错误码靠 getCapabilities 发现,不再升协议版本;v3 请求里不认识的字段回 plugin.host.unsupportedOption(-32018)并在 details.option 写明。 本轮增加 ui:4 纯后端命令、初始化中排队与崩溃后再激活、后台两路启动、逐方法授权、128 项通知队列、发送 watchdog、会话 token 隔离和 context 关闭时取消。
运行与调试 / 调试器插件提供调试适配器:声明式 debugAdapters 经共享 Core 校验,宿主按已安装插件拉起适配器、启动与附加调试、调试控制台提示符与补全,安装、更新、启停、卸载免重启生效;原生启动配置保留明确适配器身份,支持无源文件目标及同语言多适配器的会话路由;debugAdapters v2 绑定受限的目标参数与环境,并接收同包 Provider 原生调试准备
plugin-debug-adapters
已实现
待验证
证据路径
shared/contracts/plugins/v1/fixtures/debug-adapter.plugin.json
shared/contracts/plugins/v1/fixtures/debug-adapter-language-server.plugin.json
shared/contracts/plugins/v1/fixtures/debug-adapter-remote-attach.plugin.json
shared/contracts/plugins/v1/fixtures/debug-adapter-rejections.json
rust/lithe-core/src/debug/adapters.rs
macos/Sources/LitheCoreContracts/Plugins/DeclarativePluginContracts.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacLivePluginRegistry.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginLanguageServerLaunchResolver.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginDebugExecutableResolver.swift
macos/Sources/Lithe/Platform/MacOS/Debug/MacPluginDebugAdapterTransport.swift
macos/Sources/Lithe/Platform/MacOS/Debug/MacHostedPortDebugAdapterTransport.swift
macos/Sources/LitheLanguageIntelligenceModule/Services/LanguageToolingSessionManager.swift
macos/Sources/Lithe/Platform/MacOS/MacServiceContainer.swift
macos/Sources/LitheDebugModule/Runtime/CoreDebugAdapterProtocolSession.swift
macos/Sources/LitheDebugModule/Runtime/DebugAdapterSessionManager.swift
macos/Sources/LitheDebugModule/Application/DebugConsoleCompletion.swift
macos/Tests/LitheTests/PluginLiveActivationTests.swift
macos/Tests/LitheTests/PluginDebugAdapterTests.swift
macos/Tests/LitheTests/MacBuildProviderSessionsTests.swift
macos/Tests/LitheTests/DebugExecutableResolverTests.swift
macos/Tests/LitheDebugModuleTests/DebugModuleTests.swift
shared/fixtures/debug/adapter-selection-v1.json
macos/Sources/LitheCoreContracts/Debug/DebugAdapterContracts.swift
macos/Sources/LitheCoreContracts/Debug/DebugProviderDescriptor.swift
rust/lithe-core/src/build/debug_preparation.rs
macos/Sources/Lithe/Platform/MacOS/Debug/MacBuildDebugLaunchResolver.swift
macos/Tests/LitheLanguageIntelligenceModuleTests/LanguageIntelligenceModuleTests.swift
macos/Tests/LitheTests/MacNativeProviderDebugIntegrationTests.swift
未实现
不适用
证据路径
rust/lithe-core/src/debug/adapters.rs
shared/contracts/plugins/v1/fixtures/debug-adapter.plugin.json
shared/contracts/plugins/v1/fixtures/debug-adapter-language-server.plugin.json
shared/contracts/plugins/v1/fixtures/debug-adapter-remote-attach.plugin.json
DebugmacOS:安装声明了 debugAdapters 的插件,在其语言文件上启动调试,确认适配器按声明的 stdio 传输由宿主拉起并命中断点;可执行文件缺失时显示插件设置里的安装提示而不是笼统错误;声明 tcpPort 或 tcpAnnounced 传输的适配器在启动进程前被拒绝并说明原因。声明 tcpLanguageServer 传输的适配器(调试服务随同一插件的语言服务器运行,如 Java Debug Server 之于 JDT LS)不由宿主拉起进程:宿主启动该插件声明的语言服务器,用 endpoint.command 向它要端口并连接 127.0.0.1,端口无效、语言服务器不属于该插件或不可用时会话以原因结束。从保存配置直接启动且未打开源码时也会激活、登记语言服务器并探测工具;停止调试取消端口命令而不停止共享语言服务器,拒绝工作区或会话替换后的旧端口。适配器只声明 attach,或 selectors 的 targetKinds 不含 file 时,不会被选作文件启动的调试器;Java 在迁入 Java Support 插件前仍使用宿主自带适配器。capabilities.disabled 中的能力在调试会话里不可用,并随 debug.createSession 传给 Core。会话进行中禁用、更新或卸载该插件,或在模块设置里停用它,只停止该插件拥有的会话,同语言其他插件的会话继续运行。启动后 app bundle 文件清单不变(scripts/macos/verify/verify-runtime-bundle-immutability.sh)。远程 attach 目前只有 Core 契约:attach 配置可声明 targetBindings.connection,Core 校验主机、端口与路径映射并按适配器自己的参数路径写入启动参数,非 localhost、127.0.0.0/8、::1 的端点返回 remote:true;macOS 宿主尚未接入 attach 与“附加到远程”对话框,因此本项暂不能在应用里验证远程附加,接入后补充:连接新的非回环端点前必须弹确认且默认不记住,附加结束只断开不结束远端程序。Windows:宿主尚未接入 debugAdapters,Core 校验通过不代表 Windows 能调试插件语言。 原生宿主路由回归:使用 shared/fixtures/debug/adapter-selection-v1.json 验证自动文件选择、明确身份、无源文件目标、空身份、已撤回身份和 launch/attach 不匹配;同语言多个适配器分别收到断点,重试保持身份,附加会话启动失败保留原会话。这里只验证宿主交接与受控会话,Provider 原生程序准备 RPC 有受控流程与真实 SDK 进程覆盖;真实适配器的完整工作流与 Windows 接入仍未验收。 真实原生调试集成:公开 Node SDK Provider 用 Clang 编译 C 程序,经生产 macOS 会话、Core 准备、Registry 明确身份、生产 stdio 传输和 LLDB 命中源码断点、读取 main 栈帧、保留空格参数后继续并退出码 0;包 SHA-256/权限不变,所有本次进程回收。测试显式选择 SDK/工具,完整 UI、正式发行与 Windows 尚未验收,verification 保持 pending。 与显式 DAP 端点同时使用时,先按当前 Registry 身份校验请求能力,再调用端点工厂;launch/attach 与默认/明确身份的组合回归覆盖不会回退到本地适配器,配置编码与步进变换保留两个字段。
普通 TCP 生命周期与用户显式 DAP 端点入口见 debug-tcp-transport;不放宽插件 tcpLanguageServer 回环约束,tcpPort/tcpAnnounced 托管模式仍拒绝。
插件 / 插件管理已安装插件详情分为概览、功能、设置、权限与程序、版本与来源五个页签,信任与迁移提示固定在头部;已安装列表可按能力、更新、来源和启用状态过滤,搜索框输入 / 列出过滤选项;窗口缩放及调整列表宽度时详情保持在分隔线右侧,过窄的设置表单可横向滚动查看完整控件和状态
plugin-detail-tabs
已实现
待验证
证据路径
macos/Sources/Lithe/Views/App/PluginDetailView.swift
macos/Sources/Lithe/Views/App/PluginManagementView.swift
macos/Sources/Lithe/Application/Features/PluginManagement.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginManager.swift
macos/Tests/LitheTests/PluginManagementPresentationTests.swift
macos/Tests/LitheTests/PluginManagerTests.swift
macos/Tests/LitheTests/PluginDetailLayoutTests.swift
未实现
不适用
证据路径
windows/tauri/src/features/settings
Plugin PlatformmacOS:打开设置 › 插件 › 已安装,选中 Java Support。头部显示名称、官方徽标、版本和状态胶囊,右侧有启用/禁用、卸载按钮。依次切换五个页签:概览显示状态、提供的能力、来源和设置数量,“在设置中配置”可跳到 LSP 和运行配置页;功能页签列出 Java 语言、语言服务器(使用插件自带的 java 运行)以及由 Lithe 提供的运行、测试、调试;设置页签显示最大内存和日志级别,修改后出现“重启语言服务器”,“恢复默认值”可一键还原;权限与程序页签列出 languageServer.launch 与 JDT LS 启动命令,内容与安装确认弹窗一致;版本与来源显示当前版本、插件 ID 和签名。安装一个社区插件,确认社区提示固定在页签上方,任何页签都能看到。在左侧点“语言服务”“社区 / 磁盘”“已禁用”等过滤芯片,确认列表随之变化并按“已启用 / 已禁用”分组;在搜索框输入 /,确认出现过滤选项,选中后搜索框清空并切换过滤。更新过的插件在版本与来源页签显示上一版本和“回滚…”,确认后需要重启 Lithe。布局:在浅色和深色下缩放设置窗口、往返拖动插件列表分隔条,切换 Java/Cargo 与各页签,确认标题、页签和正文不越过分隔线;窄设置表单可横向滚动至末尾,输入控件保持同一实例,扩大后恢复填满正文。运行 PluginDetailLayoutTests 检查这些边界。Windows:扩展管理尚未拆分页签。
扩展 / 插件与主题普通工具插件的独立编辑器动作:运行期注册文件选择器,收集文档范围与同插件函数绑定,点击复用普通 invocation;不接 LSP/Build/Run/Debug
plugin-editor-actions
部分实现
待验证
证据路径
rust/lithe-core/src/plugins/editor_actions.rs
macos/Sources/Lithe/Application/Features/PluginEditorActionHostService.swift
frontend/editor/src/plugin-editor-actions.ts
shared/contracts/plugins/v1/fixtures/editor-actions.plugin.json
未实现
不适用
证据路径
shared/contracts/plugins/v1/README.md
Extensions用 HTTP 与 SQL 两种解析函数注册动作;验证当前脏文档版本、同一行多动作、明确点击执行、编辑取消旧解析、撤回/关闭/会话替换清理,不自动重试副作用。慢收集保持未完成时刷新立即确认,仍能输入并完成保存屏障;整批只使用八秒预算。
当前仅 macOS 接线;真机和完整用户流程仍待验证。共享校验通过不代表 Windows 已实现。
扩展 / 插件与主题独立插件语法高亮与编辑配置:不依赖 LSP/Run,配置可独立于 grammar,语法仅在可终止 worker 执行
plugin-editor-grammars
部分实现
待验证
证据路径
rust/lithe-core/src/plugins/grammar.rs
frontend/editor/src/plugin-languages.ts
frontend/editor/src/plugin-grammar-tokenizer.ts
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginEditorLanguages.swift
macos/Tests/LitheTests/PluginEditorLanguagesTests.swift
未实现
不适用
证据路径
shared/contracts/plugins/v1/README.md
Extensions安装纯语法插件后打开 .http;验证即时出现、停用撤回、配置独立应用、病态语法不阻塞输入和保存;安装目录哈希不变。语法源文本经 Core/Swift/worker 往返保持 cases 顺序并显式默认 root;properties 等仅配置别名保留高亮、撤回不销毁基础 tokenizer;模块状态观察回调不持有运行时。
当前仅 macOS 接线,只接受清单与包内 JSON 静态资源,grammar.kind 仅支持 monarch;没有运行期传 JSON 注册/替换/释放高亮 Provider 的公共方法,也未开放独立语言语义 Provider 的普通函数绑定。静态插件生命周期即时更新不等于动态注册 API。高亮超过 128 Ki UTF-16 单位或 10,000 行时保持普通文本,嵌入语言按普通文本处理;SDK 新能力封装/发布和真实插件完整安装验收仍待完成。共享校验通过不代表 Windows 已实现。
扩展 / 插件与主题插件、语言服务与主题管理
plugin-extension-management
已实现
待验证
证据路径
macos/Sources/Lithe/Views/App/PluginManagementView.swift
macos/Sources/Lithe/Views/App/SettingsView.swift
macos/Sources/Lithe/Models/AppModel/AppModel+PluginManagement.swift
macos/Tests/LitheTests/PluginManagementPresentationTests.swift
macos/Sources/Lithe/Platform/MacOS/Plugins
macos/Sources/Lithe/Views/App/PluginMarketplaceView.swift
已实现
待验证
证据路径
windows/tauri/src/extensions
windows/tauri/src/features/settings
windows/tauri/src-tauri/src/language_tools.rs
windows/tauri/src/extensions/registry/extension-store-lifecycle.test.ts
windows/tauri/src/features/plugins/declarative-plugins-section.tsx
windows/tauri/src-tauri/src/plugin_host/install.rs
windows/tauri/src-tauri/src/plugin_host/lifecycle.rs
windows/tauri/src/features/plugins/plugin-lifecycle-listener.test.ts
ExtensionsmacOS 全新安装时打开插件页,确认“已安装”标签不再显示 PHP 未安装占位项(改由“插件市场”标签提供安装),齿轮菜单可“从磁盘安装插件”选择已签名的插件包;社区插件在“已安装”中显示来源仓库与社区维护提示,可卸载;安装后可搜索并启用、禁用 PHP,确认状态与重启恢复,且页面不显示无恢复路径的卸载操作;同时打开 Maven 面板确认插件内容不被遮挡。Windows 检查扩展管理入口和持久化。契约 v1 插件在设置的独立“声明式插件”页管理(启用/停用/卸载/回滚,与 Worker 扩展分开列出,隔离原因直接展示),管理命令走 plugin_host 的 Tauri 命令。 Windows 缺少 Bun 或语言服务器时更新扩展,确认旧扩展的安装、启用和待更新状态保留,错误给出安装依赖后重试的提示;预检期间禁用或卸载扩展,确认返回后不会继续安装或重新启用;手动将 Marksman 等语言服务器安装到 PATH 后重启,确认能识别并启用。 Windows 契约插件:同时在两个产品窗口启动语言服务/运行任务,在启动尚未返回时分别禁用、卸载、更新和回滚;确认先撤销入口、等待两窗口所有进程和原生探测退出,再改包目录。停止失败、窗口断开或确认超时发生在改包前,文件保留且插件继续阻断;改包后重新扫描失败也必须报错并保持阻断,不能使用旧目录缓存;重试可恢复,不能出现占用可执行文件导致的半删除。 不同插件并发管理时,全盘扫描必须从读取到提交缓存串行,最终缓存包含所有已经成功安装的包;检查 tests.rs 的有序发布回归。
扩展 / 插件与主题插件私有函数:插件后端通过 litheFunctions v1 协商和注册,宿主按插件归属调用,接收结果与进度,并支持取消、超时和撤回;领域操作仍使用类型化契约;官方 Node、Java(Java 8+)与 Rust 后端 SDK(在 lithe-plugin-docs 仓库)实现后端一侧
plugin-functions
部分实现
已验证
证据路径
rust/lithe-core/src/lsp/interface/plugin_function.rs
rust/lithe-core/src/lsp/interface/engine.rs
shared/contracts/plugins/v1/fixtures/function-protocol.json
macos/Sources/Lithe/Application/Features/PluginWebBridge.swift
macos/Sources/Lithe/Platform/MacOS/Build/MacBuildProviderSessions.swift
macos/Sources/LitheLanguageIntelligenceModule/Runtime/LanguageServerSession.swift
macos/Tests/LitheTests/PluginWebBridgeTests.swift
macos/Tests/LitheTests/MacBuildProviderSessionsTests.swift
部分实现
待验证
证据路径
rust/lithe-core/src/lsp/interface/plugin_function.rs
rust/lithe-core/src/lsp/interface/engine.rs
shared/contracts/plugins/v1/README.md
Extensions共享 Core:cargo test --manifest-path rust/Cargo.toml -p lithe-core --lib plugin_function 及 --lib lsp::interface::engine,核对共享 fixture、初始化发现事件、动态增删、归属拒绝、结果与插件错误码、超时取消撤回。插件会话成功完成 initialize 函数协议协商后发布初始 functionsChanged(含空注册表),无 pluginId 的宿主会话不协商、不保留或广播函数。每次后端调用使用唯一且不透明的 operationID,进度转换回宿主 operationId,所有终止路径清除关联;复用宿主 ID 后,旧进度与撤回不得影响新函数或构建请求。后端请求 lithe/function/invoke 或 lithe/build/* 时拒绝递归派发,lithe/host/* 在 v1 全部拒绝。平台验收:宿主接入后,从同一插件的界面发现并调用函数,验证另一插件无法调用、终止后的旧进度不污染新调用,关闭项目和停用插件后不残留进程;分别在 macOS 和 Windows 完成原生验收后才标记 verified。 macOS 宿主:scripts/macos/test/test-macos.sh --filter "PluginWebBridgeTests|MacBuildProviderSessionsTests",覆盖插件网页只能访问本插件实例并经同意、结果/进度/pluginErrorCode 到达页面、取消与关闭页面取消函数、构建 Provider 以插件会话启动并带 pluginId、Core 拒绝码原样保留、停用插件停止 Provider。 macOS 原生验收:debug 应用安装带网页窗口的 sample-build(PR #1365)与另一个带构建系统的插件,在示例工作区的页面上依次调用 functions.list、functions.invoke(带 call 观察 functions.progress)、functions.cancel,核对结果与 pluginErrorCode;从另一插件页面访问该实例应得到 plugin.web.forbidden;调用进行中关闭项目、停用插件后用 pgrep 确认 Provider 与构建子进程不残留。 官方 SDK(在 lithe-plugin-docs 仓库中运行):node --test sdk/node/test/*.test.mjs;mvn -B -f sdk/java/pom.xml verify(CI 以 -Djvm 指向 Java 8 运行测试);cargo +1.87 test --locked --manifest-path sdk/rust/Cargo.toml;node scripts/sdk-e2e.mjs 把 sdk/e2e 复制进契约副本锁定的主仓库 commit 并运行 plugin_sdk_node、plugin_sdk_java、plugin_sdk_rust:Node 与 Java 示例插件经真实 Core 会话完成构建模型/依赖、函数结果/进度/失败/取消、重启恢复状态,Java 示例按插件打包形态(plugin.json + shade 后的 JAR)运行;Rust 示例后端按 packaged 启动计划运行,完成函数结果/进度/失败/取消、宿主请求(测试扮演宿主应答 hostRequest:凭据,以及协议 3 的工作区、文件监视订阅与窗口消息,过期上下文与取消转发的 $/cancelRequest)、命令与工作区变化通知、重启恢复状态与未授权时的拒绝;三者插件包文件清单都不变;CI 每周再以 --ref HEAD 对主仓库最新 Core 运行一次。
macOS 已接入宿主入口:插件网页通过 functions.list / functions.invoke / functions.cancel 调用自己构建 Provider 进程的函数,共享语言服务器不提供函数;2026-10-20 已在 macOS debug 应用中用 Node SDK 的示例插件 sample-build(PR #1365,当时在主仓库 sdk/node/examples,加一个只用于验收的网页窗口)完成原生验收:functions.list/invoke 的结果、functions.progress、动态注册的 snapshot.clear、pluginErrorCode(sample.buildFailed)、取消后的 requestCancelled 都到达页面,取消会结束构建子进程;另一插件的页面访问该实例得到 plugin.web.forbidden;调用进行中关闭项目或停用插件后 Provider 及其子进程均不残留。Windows 尚无插件后端宿主;不能以共享测试通过替代平台功能验收。函数不新增清单字段,不改变 pluginAPIVersion 或 requires;litheBuild v1 与旧后端继续独立工作,lithe/host/* 暂不开放,协议不提供操作系统级沙盒。 官方 Node SDK(lithe-plugin-docs 的 sdk/node)只实现契约、不新增线上字段,进程树清理在 POSIX 由端到端测试覆盖,Windows 的 taskkill 路径尚未在 Windows 上验证。 官方 Java SDK(lithe-plugin-docs 的 sdk/java)同样只实现契约;Java 9+ 取消时结束整棵进程树,Java 8 只结束直接子进程,其余由宿主的后端进程标记兜底;目前只经共享 Core 端到端验证,macOS 原生验收随 Maven 插件的 Java 后端一起完成。运行时启动计划的 java 版本探测改用 -version,Java 8 后端不再被误判为不可用。 官方 Rust SDK(lithe-plugin-docs 的 sdk/rust)同样只实现契约,用于 packaged 插件后端:实现函数协议及其宿主服务,不含构建与 VCS Provider;目前只经共享 Core 端到端验证。
扩展 / 插件与主题插件公共宿主服务:按方法授权的文档读取、选区、版本化编辑、工作区文件/搜索/watch、编辑器打开、HTML 预览与外部浏览器、窗口消息
plugin-host-editor-file-window-services
部分实现
待验证
证据路径
macos/Sources/Lithe/Application/Features/EditorDocumentService.swift
macos/Sources/Lithe/Models/AppModel/AppModel+EditorDocumentService.swift
frontend/editor/src/plugin-edits.ts
macos/Sources/Lithe/Platform/MacOS/FileSystem/MacPluginWorkspaceFileService.swift
macos/Sources/Lithe/Platform/MacOS/FileSystem/MacWorkspaceSecurePath.swift
macos/Sources/Lithe/Application/Features/PluginHostEditorService.swift
macos/Sources/Lithe/Application/Features/PluginHostPreviewService.swift
macos/Sources/Lithe/Application/Features/PluginHostBrowserService.swift
macos/Sources/Lithe/Application/Features/PluginHostMessageService.swift
macos/Tests/LitheTests/EditorTextEditPlannerTests.swift
macos/Tests/LitheTests/EditorDocumentServiceTests.swift
macos/Tests/LitheTests/PluginWorkspaceFileServiceTests.swift
macos/Tests/LitheTests/PluginHostEditorServiceTests.swift
macos/Tests/LitheTests/PluginHostBrowserServiceTests.swift
macos/Tests/LitheTests/PluginHostMessageServiceTests.swift
macos/Tests/LitheTests/HTMLPreviewBridgeIsolationTests.swift
macos/Sources/Lithe/Application/Features/PluginDocumentHostService.swift
macos/Sources/Lithe/Application/Features/PluginFileHostService.swift
macos/Sources/Lithe/Application/Features/PluginWindowHostService.swift
macos/Tests/LitheTests/PluginPublicHostAPITests.swift
macos/Experiments/Monaco/workbench.integration.ts
macos/Tests/LitheTests/PluginHostProcessIntegrationTests.swift
未实现
不适用
证据路径
docs/development/macos-plugin-api-plan.md
ExtensionsmacOS 单测:scripts/macos/test/test-macos.sh --filter "EditorTextEditPlannerTests|EditorDocumentServiceTests|PluginWorkspaceFileServiceTests|PluginHostEditorServiceTests|PluginHostBrowserServiceTests|PluginHostMessageServiceTests|HTMLPreviewBridgeIsolationTests";前端:frontend/editor 下运行 plugin-edits.test.ts。服务接入宿主分发、对插件开放后,按计划 §7 用三个验收插件(选区转换器、分页文件浏览器、HTML 预览启动器)在 debug 应用中原生验收:版本冲突与 IME 组字时编辑被拒、撤销一步回退整批编辑;符号链接与 .. 越界被拒、远程工作区返回 authorityUnsupported;后台窗口打开文件不抢焦点、消息限频生效;验收后关闭应用并确认无残留进程。 显式设置 LITHE_PLUGIN_HOST_TEST_NODE 后运行 PluginHostProcessIntegrationTests,验证真实 Node 后端经 Core 请求宿主、编辑 dirty 缓冲区、退出清理及插件包字节不变;scripts/macos/probe/probe-macos-monaco.sh --workbench-tests 验证真实 WebKit 的整批编辑与一次撤销。
公共方法已注册到 Core 与 Mac dispatcher;新增权限生成逐方法授权,不扩大 workspace.metadata。窗口入口统一解析 PluginWorkspaceContext,内部类型仅为 owner 适配值。HTML 预览显式设置呈现模式,支持 previewOnly;editor.open 返回 documentID/version。文件 lease 绑定 contextID,不用稳定 rootID 作为关闭边界。findText 的上游只给行号,range 如实为 null;纯命令通过 ui:4 开放。不含 Windows 实现。保留 pending,直到完成真实安装插件的整机验收。 纯命令入口同时修复命令面板鼠标点击禁用行仍执行的问题;回归由现有 PluginUIIconTests 覆盖。
扩展 / 插件与主题工具链领域框架:共享 Core 校验插件贡献、来源与四层解析;macOS 提供只读的运行环境和环境来源设置页,目录、工具、版本文件、固定值、登录 Shell 与版本管理器均来自已启用插件的声明和磁盘上的真实文件。自动检测按插件声明真实扫描本机安装并运行定义的版本探测;版本管理器通过插件后端的 toolchains/query 报告安装和项目/全局要求,回复经 Core 校验后显示,监视的文件变化时整份重查;每行哪一层生效由 Core toolchains.resolve 按同一份事实决定。Lithe 全局默认、保存与运行时消费者仍未接入,不能把只读页面当作已生效配置。
plugin-injected-toolchains
部分实现
待验证
证据路径
rust/lithe-core/src/toolchain/mod.rs
rust/lithe-core/src/toolchain/definitions.rs
rust/lithe-core/src/toolchain/query.rs
rust/lithe-core/src/toolchain/pins.rs
rust/lithe-core/src/toolchain/resolution.rs
rust/lithe-core/src/tests/toolchain_definitions.rs
rust/lithe-core/src/tests/toolchain_queries.rs
rust/lithe-core/src/tests/toolchain_pins.rs
rust/lithe-core/src/tests/toolchain_resolution.rs
shared/contracts/plugins/v1/toolchains.md
macos/Sources/Lithe/Core/Ports/ToolchainSettings.swift
macos/Sources/Lithe/Application/Features/ToolchainSettingsFeatureModel.swift
macos/Sources/Lithe/Platform/MacOS/Runtime/MacToolchainSettingsLoader.swift
macos/Sources/Lithe/Platform/MacOS/Runtime/MacToolchainDiscovery.swift
macos/Sources/Lithe/Views/App/ToolchainEnvironmentSettingsView.swift
macos/Sources/Lithe/Views/App/ToolchainSourcesSettingsView.swift
macos/Tests/LitheTests/ToolchainSettingsFeatureTests.swift
macos/Tests/LitheTests/ToolchainSettingsLoaderTests.swift
macos/Tests/LitheTests/ToolchainSettingsLayoutTests.swift
macos/Tests/LitheTests/MacToolchainDiscoveryTests.swift
rust/lithe-core/src/lsp/interface/toolchain_provider.rs
macos/Sources/Lithe/Platform/MacOS/Runtime/MacToolchainDiscovery+Providers.swift
macos/Sources/Lithe/Platform/MacOS/Runtime/MacToolchainInputWatcher.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginBackendSessions.swift
部分实现
待验证
证据路径
rust/lithe-core/src/toolchain/paths.rs
rust/lithe-core/src/toolchain/query.rs
rust/lithe-core/src/toolchain/resolution.rs
rust/lithe-core/src/tests/toolchain_queries.rs
shared/contracts/plugins/v1/plugin-manifest.schema.json
shared/contracts/plugins/v1/toolchains.md
Plugin Platform共享 Core:cargo test --manifest-path rust/Cargo.toml -p lithe-core --lib toolchain,核对定义独占与官方短 ID、第二种通用工具、旧候选边界、答案身份/代次、Windows 路径大小写、工作区排除、固定值失效不回落、最近项目要求、冲突选择、最低版本、环境隔离和纯声明扫描;按逐项计时工具生成 HTML/JUnit。macOS 与 Windows 原生后续验收均需先实现对应 adapter:启动提供方并协商、取消/超时和过期结果隔离、输入新建/删除后整体重查、目录固定保存/取消/冲突回读、插件停用撤回、真实 Build/LSP/Run 消费者取得同一选择、发行目录哈希不变与子进程清理。未完成原生流程前保持 pending,不以 Core 测试代替实机验证。 提供方查询:cargo test -p lithe-core --lib toolchain(含 lsp 引擎脚本后端:只有插件后端被提供 litheToolchains、未协商的提供方不写请求、错误回复原样返回;别名链接只有链接路径事实时仍选中规范 home);MacToolchainDiscoveryTests 用真实临时目录与注入的查询验证同一轮查询共享代次而 operationID 各不相同、链接 home 规范化、工作区内 home 整份拒绝,以及 toolchains.resolve 选出项目要求、未安装的要求记为 unmet 并退到下一层、固定值只在自己的目录生效且失效时不回落,以及超时和后端不可用的提供方经 toolchains.failureReply 交给 Core 记为 providerUnavailable(cause 区分两者)并由下一层决定;ToolchainSettingsLoaderTests 验证每行读取其固定值目录或最近版本文件目录的解析结果;ToolchainSettingsFeatureTests 验证监视文件连续变化只重载一次、外部输入观察随关闭释放。真实 mise 插件端到端尚未在应用内验证。 原生布局回归 ToolchainSettingsLayoutTests:同一设置宿主按900/1180/1400/900重复缩放,真实分隔条拖动;来源页按500/666/946/500缩放,检查AX控件边界、卡片不重叠、选择和快照不改变。此几何验证不代表提供方查询或保存功能已完成。 声明式扫描 MacToolchainDiscoveryTests:真实临时目录、注入的用户目录与探测,覆盖 homeLayouts 首个匹配、隐藏与未匹配条目、链接到工作区的条目不探测、只探测 Core 返回的可执行文件、同版本冲突、被拒声明不扫描,以及隔离预览样例清单通过 Core 准入;不运行本机安装的工具。
本条仅记录 #1581 重设计的 Core 基础切片。两端共享同一确定性模型但均未接原生产品,不广告工具链 hostCapabilities;现有 Java/Maven/Node 发现与选择未迁移。安装来源支持两条途径:工具定义里的声明式扫描(由宿主展开)和提供方查询(toolchains/query,可只报告安装);Core 在自动层把两条途径按规范化目录合并;macOS 设置页已接入声明式扫描(宿主按 discoveryPlan 展开、收集文件事实、只探测 toolchains.candidates 返回的可执行文件,扫描与探测有数量和时长上限),macOS 设置页已接入提供方查询(启动或复用插件后端、协商 litheToolchains、同一轮查询共享代次而每次查询独立 operationID、超时 15 秒、取消发送 $/cancelRequest,回复交 toolchains.decodeReply 用宿主读取的文件事实校验,失败原样显示提供方原因;超时或后端不可用时由 toolchains.failureReply 生成错误回复交 Core 记为 providerUnavailable,工具行写出哪个版本管理器未响应或不可用);Windows 仍未接。Core 不运行 mise/SDKMAN、不解析其文件格式、不下载、不监听或写配置。通用 runtime 消费者、环境/来源界面、项目环境 symlink 完整原生验证及带后端免重启仍未完成;没有新增运行时资源或可复用下载目录。 macOS 设置页只读:运行环境页按目录列出工具,展开后按固定、项目文件、全局、自动四个来源排列并框出 Core toolchains.resolve 选中的来源,提供方报告的要求与版本显示在项目与全局步骤中,固定值由 Core 校验、不可用时显示原因,来源冲突只显示原因;环境来源页显示登录 Shell 的读取状态、变量数(不显示值)、耗时和 PATH 各目录的来源,以及插件声明的版本管理器在本项目找到的版本文件。未实现的添加、切换、保存和冲突选择入口不显示。Debug 隔离预览只有插件清单是样例,工作区文件、固定值和登录 Shell 均真实读取,不启动工具、不写真实配置。Core 独立位于 rust/lithe-core/src/toolchain/,插件只是声明贡献入口。
扩展 / 插件与主题插件市场、插件仓库源与社区插件市场/磁盘安装;macOS 安装准备期间在详情操作区显示带说明的线性不定进度条
plugin-marketplace
已实现
待验证
证据路径
macos/Sources/Lithe/Views/App/PluginMarketplaceView.swift
macos/Sources/Lithe/Views/App/PluginManagementView.swift
macos/Sources/Lithe/Application/Features/PluginMarketplace.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginMarketplaceService.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginPackageDownloader.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginUIIconLoader.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginDiskPackageImporter.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginManager.swift
macos/Sources/Lithe/Platform/MacOS/MacServiceContainer.swift
macos/Sources/LitheModuleAPI/Plugins/PluginTypes.swift
macos/Sources/Lithe/Models/AppModel/AppModel+PluginManagement.swift
macos/Sources/Lithe/Platform/MacOS/UI/MacPlatformUI.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginPackageStore.swift
macos/Tests/LitheTests/PluginMarketplaceServiceTests.swift
macos/Tests/LitheTests/PluginMarketplaceFeatureModelTests.swift
macos/Tests/LitheTests/PluginRepositoryPresentationTests.swift
macos/Tests/LitheTests/MacPluginPackageDownloaderTests.swift
macos/Tests/LitheTests/MacPluginDiskPackageImporterTests.swift
macos/Tests/LitheTests/PluginDiskInstallationTests.swift
macos/Tests/LitheTests/PluginPackageStoreTests.swift
macos/Tests/LitheTests/PluginManagerTests.swift
shared/contracts/plugins/v1/README.md
scripts/resources/worktree-resources.json
scripts/resources/reuse-worktree-resources.mjs
scripts/resources/test-reuse-worktree-resources.mjs
scripts/macos/verify/verify-runtime-bundle-immutability.sh
rust/lithe-core/src/plugins/marketplace.rs
Plugins/marketplace/index.json
.github/workflows/release-official-plugins.yml
macos/Sources/Lithe/Views/App/ApplicationRestartAction.swift
macos/Sources/Lithe/Platform/MacOS/MacApplicationRelauncher.swift
macos/Tests/LitheTests/MacApplicationRelauncherTests.swift
macos/Tests/LitheTests/PluginMarketplaceLayoutTests.swift
部分实现
不适用
证据路径
windows/tauri/src-tauri/src/plugin_host/install.rs
windows/tauri/src-tauri/src/plugin_host/install_tests.rs
windows/tauri/src/features/plugins/declarative-plugin-launch.ts
windows/tauri/src/features/plugins/declarative-plugins-section.tsx
rust/lithe-core/src/plugins/marketplace.rs
shared/contracts/plugins/v1/fixtures/marketplace
ExtensionsmacOS 打开插件管理,确认有“插件市场 / 已安装”两个标签和齿轮菜单;默认有“Lithe 官方”源(不能删除)和预置的社区源 Lithe Store(默认开启、可停用和删除,删除后重启不会再出现),Lithe Store 中能看到 Lua、Go、PHP 三个社区语言插件并可安装,“Lithe 官方”源当前没有可下载插件(Go/PHP 已迁到 Lithe Store),刷新后索引缓存写在 Caches 而 app bundle 不变。安装、更新或卸载插件后,插件管理顶部出现“插件变更将在重启 Lithe 后生效”横幅和“重启 Lithe”按钮,市场列表与详情里的“重启后生效”也变成该按钮;点击后走正常退出确认,确认后应用退出并自动重新打开(不会多开),取消任一确认则不重启。插件详情显示作者、来源仓库、标签、版本、许可证、发布日期和支持平台;索引带 SVG 或 PNG `icon` 的插件(如 Lithe Store 的 Go、PHP、Lua、Maven、Gradle)在列表、详情和“已安装”里显示自己的图标;图标缺失、非法、超限或仍在加载时显示 IDEA 风格首字母头像(英文取两个字母、中文取一个字,颜色按插件 ID 固定),只有未选择插件的空状态显示默认插件图标;断网导致的失败在网络恢复后再次打开页面或刷新仓库即可恢复,刷新仓库后分支 URL 的新图标会替换旧图标,快速切换插件时详情头部不会出现上一个插件的图标;图标不写 bundle;索引里没有当前架构的包时显示“暂不支持 <平台> 平台”且不可安装,插件 API 版本不满足时显示不支持原因。在“管理插件仓库”中添加一个 GitHub 仓库地址,确认解析到仓库根目录的 lithe-plugin-index.json,可刷新、停用和删除;弹窗按设计稿呈现:仓库列在圆角卡片里,每行是名称(旁边有标签:“Lithe 官方”和预置的 Lithe Store 为“官方”,用户添加的仓库为“社区”)、等宽索引地址和状态行(“已于 刚刚 刷新”随时间变为“5 分钟前”,超过一周显示日期;有被忽略条目时追加“已忽略条目:N”,停用的源标注“已禁用”,刷新失败显示原因),右侧依次是启用开关、“刷新”和红色“移除”;“Lithe 官方”行只能停用,用灰色“默认”代替“移除”;底部左侧“全部刷新”,右侧“完成”。第三方源列出 dev.lithe.* 插件时该条目被忽略。安装社区插件时先校验 SHA-256(不匹配则不解压),超过下载上限的响应在下载中途被中止,解压后过大或文件过多的压缩包(含谎报大小的 ZIP)被拒绝且不留临时文件,再弹出确认框列出权限、要运行的程序和来源仓库,取消则不安装;已安装后改动插件目录内任意文件,重启后该插件拒绝加载;本地磁盘社区首次安装、更新、重装和同版本替换每次都必须明确确认,即使权限和程序未变;市场入口保持首次/缺少审批/出现 newPrograms 时确认的既有规则,无新程序的市场更新可沿用审批。确认框展示 Rust installReview 的全部权限与完整 canonical program 内容,包括参数、参数模板、验证探测、初始化选项、运行时与构建声明,已识别程序展开 Full Program Declaration 阅读完整 JSON,未知程序直接显示完整 JSON;同一插件出现在多个源时由用户选源,更新只走安装时记录的源。官方源只接受 Lithe 签名包。分别在英文和简体中文界面下检查列表、详情、安装确认框和仓库管理窗口,文字(含刷新时间格式)都跟随 Lithe 的语言设置,插件描述在有 localizedDescriptions 翻译时显示对应语言,否则显示默认英文描述;用辅助功能“按下”列表行只会选中,不会触发安装。索引里最新版本在本机不可用时,详情的版本、发布日期和平台显示实际会安装的版本,并单独注明最新版本不可用。磁盘验收:安装声明内置 Python 或其他已安装插件语言的社区包,重启拒绝冲突包后,原拥有者未设置、显式关闭或开启的偏好均保持原值;正常首次确认安装仍自动启用,更新保留选择。分别在市场下载和磁盘导入入口构造显式 ZIP 条目未超限但唯一隐式父目录超限的包,以及累计规范化路径 UTF-8 字节超限的包,确认在启动解压前拒绝并清理;显式目录与共享隐式父目录只计一次,恰好预算的合法包可解压。在隔离的用户配置与注入临时根下,从齿轮菜单分别选择一个合法社区 ZIP 与解包目录;准备后检查只生成本次 lithe-plugin-disk-<UUID> 私有快照,ZIP 的 archiveSHA256 与快照 archive.zip 实测 SHA-256 相同,目录无归档摘要,界面显示本地文件名/内容摘要并明确未认证发布者或仓库。先取消,确认未安装且本次目录删除;再确认安装并重启,核对 installation.json 仅有 disk 来源、内容 digest 与完整 canonical approvedPrograms,没有伪造 marketplace 来源。分别导入程序未变的新版、相同版本原包及相同版本改过脚本的包,每次必须完整展示权限和程序并等待确认;取消不得改变已安装版本。确认框等待时更换原始 ZIP/目录,安装内容应仍等于准备快照;在受控测试中改动已准备快照后提交,应在 install staging 重验失败;安装后增加/删除/改动文件应在 scan 拒绝加载,改动上一版本后 rollback 应失败。正常升级再回滚时,当前/上一版本各自保留 origin、disk/marketplace 来源;同版本替换保留既有上一版本。刷新包含同 ID 的市场源,确认磁盘版本不出现可自动接管的更新/重装入口。以符号链接、Finder alias、特殊文件、多个 plugin.json、超过 64 层的目录、落在源目录内的临时根、中央目录/local header 路径类型冲突或重复条目的 ZIP、超限或损坏 ZIP、非法声明、冒用官方 ID/namespace 的包验证拒绝与清理;官方 publisher 签名、sameTeamAsHost 的 bundle 边界及仅 DEBUG 可用的 localDevelopment 包仍按原策略。导入和待确认期间关闭插件页,确认任务取消、已有快照立即清理、迟到的准备结果只清理而不会安装;成功、取消和失败后检查本次快照和 staging 无残留;在典型工作流前后比较发行 bundle 文件清单/哈希相同,关闭本次应用与子进程。静态及资源验证命令:node scripts/resources/test-reuse-worktree-resources.mjs、./scripts/agent-notes/verify-agent-notes.sh、./scripts/platform-feature-matrix/verify-platform-feature-matrix.sh、./scripts/macos/verify/verify-runtime-bundle-immutability.sh;macOS 产品测试使用 ./.agents/skills/write-stable-tests/scripts/test-stability-macos.sh -- --filter 'PluginMarketplace|PluginDiskInstallation|MacPluginDiskPackageImporter|PluginPackageStore|PluginManager',核对报告包含实际磁盘用例,未运行产品验收前保持 pending。Windows 已实现契约插件的磁盘导入链:ZIP/目录→私有快照(拒绝 reparse point、路径逃逸、超限文件与恶意 ZIP 条目)→plugins.marketplace.installReview 全量审查(权限+完整程序清单,界面明示未认证发布者)→确认时摘要比对拒绝快照调包→staging 复验后激活→卸载/回滚/启停。磁盘导入的取消清理、快照篡改拒绝与 staging 失败清理由 Rust 测试覆盖;多仓库源市场 UI 仍缺失(M3+),实机验收前 verificationStatus 保持 not-applicable。Worker 扩展模型的非语言市场安装命令(install_extension_from_url 等)现注册为显式占位错误,等待独立后端。;市场列表与详情之间的分隔条使用真实页面回归:中英文描述与深浅主题下缩放窗口、拖动后释放,再刷新索引,详情视口始终位于分隔条右侧;正文按视口宽度换行,窄于来源选择器和提示卡所需宽度时可横向滚动至末端,短详情保持顶部对齐。测试使用私有临时偏好域,关闭窗口后清理;仅原生组件证据,整体实机验收仍 pending。;安装下载较慢时,详情显示“正在下载并校验插件…”及线性不定进度条,不虚构百分比;准备完成、失败或取消后恢复对应操作。
macOS 已在隔离实例实际验证社区 ZIP/目录选择与确认、本地来源和摘要、完整程序 JSON 展开、同版本再次确认及取消不改原记录、安装字节、重启扫描与 bundle 哈希不变;磁盘信任及受影响安装流程已运行定向回归,后台审查通过工作线程独占 Store 与文件管理器保持界面可取消,取消后等待读取结束再清理快照。页面关闭与迟到结果清理由状态回归覆盖,完整市场源管理、双语和全部磁盘组合尚未逐项实机验收,因此整体 verificationStatus 保持 pending。最终 Maven/Gradle 新清单还依赖待合入的共享契约和宿主能力,本次 preview 基线的受控包验收不替代最终插件整体验收。Windows 未实现本次声明式磁盘安装链,partial 不表示可以运行 macOS 流程。
扩展 / 插件与主题插件自有原生终端:直接 argv 创建、显示、关闭、带有界显示上下文的 reopen、dispose 与按 generation 的退出订阅
plugin-native-terminals
已实现
待验证
证据路径
macos/Sources/Lithe/Application/Features/PluginTerminalHostService.swift
macos/Sources/Lithe/Models/AppModel/AppModel+PluginTerminal.swift
macos/Sources/LitheTerminalModule/Ports/TerminalTransport.swift
macos/Sources/Lithe/Platform/MacOS/Terminal/MacTerminalTransport.swift
macos/Tests/LitheTests/PluginTerminalHostServiceTests.swift
macos/Tests/LitheTests/PluginTerminalNativeTests.swift
macos/Sources/Lithe/Views/Workbench/PluginHostMessageDetailsView.swift
macos/Sources/Lithe/Platform/MacOS/Process/MacStoppedChildProcessReaper.swift
未实现
不适用
证据路径
shared/contracts/plugins/v1/README.md
Extensions / Terminal运行 PluginTerminalHostServiceTests、PluginTerminalNativeTests 与 TerminalModuleTests:权限和归属、argv 原样、远程拒绝、取消和工作区关闭、真实 PTY create/close/reopen、UTF-8 历史字节预算、只恢复显示而不重放输入、dispose 释放及迟到 generation 隔离。在真实安装插件中核对本窗口终端标签、焦点、输入、Ctrl-C、缩放、用户关标签重开、插件停用与退出无残留进程;完成整机验收后再更新 verified。三个官方 SDK 在 lithe-plugin-docs 独立分支验证。 回归验证 show:false 创建/重开保留已有活动终端;用户关标签与自然退出后,在退出通知前释放原生会话和完整渲染缓冲区,按 0/8 字节保留历史;长参数和工作目录可完整滚动、选择、复制,取消确认不启动终端。 本次在 Swift 6.3.3 + macOS 26.5 SDK 下运行 75 项相关 Swift 测试全部通过(含四种真实 PTY 退出释放场景);HTML/JUnit 逐项计时在 .artifacts/test-stability/plugin-terminal-review-fixes.*。完整安装插件的 GUI 验收仍 pending。
首版本机 macOS,复用现有终端 owner;终端权限要求 backend:2,方法由函数协议 3 能力发现。未开放 sendText/输出读取。close 保留内存句柄和默认 16 KiB(最多 256 KiB)显示上下文,reopen 启动新进程,dispose 或会话/工作区结束彻底释放;不跨重启持久化。 后台创建不改变当前选择;关闭与自然退出都先清理并释放原生缓冲区,再发送退出事件。执行确认的完整详情使用原生文本视口。 show:false 不挂载原生标签,显式 show 后才注册标签并选择,避免仅有编辑器终端时工具面板默认展示后台会话。
工作区 / 项目新建项目窗口按 IDEA 的布局列出“新建项目”和“生成器”两组条目:空项目由宿主提供,其余条目由插件通过 projectGenerators 1 注入(随 Lithe 内置的 Java Support 直接提供 Java、Maven Archetype、Spring Boot)。名称、位置、创建 Git 仓库由宿主绘制;字段、派生默认值、显示条件和生成计划由 Rust Core 计算;先在目标目录旁的临时目录生成,完成后整体移动到位,失败或取消不留残留。条目需要的语言或构建系统插件未启用时提示一键启用,未安装时跳转插件市场搜索;所选 JDK 写入新项目的运行时设置,模板指定的文件随项目一起打开
plugin-project-generators
已实现
待验证
证据路径
rust/lithe-core/src/project_generators/
shared/contracts/plugins/v1/fixtures/project-generator.plugin.json
shared/contracts/plugins/v1/fixtures/project-plans.json
Plugins/mac/Official/JavaSupport/plugin.json
macos/Sources/Lithe/Views/Workspace/NewProjectView.swift
macos/Sources/Lithe/Application/Features/NewProjectFeatureModel.swift
macos/Sources/Lithe/Services/ProjectGeneration/ProjectGenerationService.swift
macos/Sources/Lithe/Platform/MacOS/ProjectGeneration/MacProjectGenerationPlatform.swift
macos/Tests/LitheTests/ProjectGenerationTests.swift
未实现
不适用
证据路径
shared/contracts/plugins/v1/README.md
Plugin PlatformmacOS:从欢迎页和项目切换器点“新建项目”,确认左栏有“新建项目”(Java、空项目)和“生成器”(Maven Archetype、Spring Boot)两组且可搜索。Java 选 Maven、默认 JDK 创建,确认生成 pom.xml(maven.compiler.release 等于所选 JDK 主版本)、.gitignore 和 src/main/java/org/example/Main.java,项目打开后 Main.java 已打开、Build 工具窗口识别 Maven 项目。勾选“创建 Git 仓库”时项目根目录有 .git。Spring Boot 选几个依赖创建,确认从 start.spring.io 下载并解压、mvnw 可执行;把服务器 URL 改成不可达地址时报错且目标目录下没有残留的 .*.lithe-creating-* 临时目录。Maven Archetype 在已安装 mvn 时生成 quickstart 项目,未安装时提示找不到 mvn。停用 Java Support 后,三个条目变灰、创建按钮不可用,只出现一条“启用 Java Support”,点击后条目恢复可用;未安装 Maven 插件时出现“在插件市场中查找”并跳到市场搜索 maven。目标目录已存在时拒绝创建且不改动原目录。Windows:宿主不声明 projectGenerators,需要它的插件在市场中隐藏。
插件 / 插件管理插件通过 settings 2 在 plugin.json 里把设置项和按钮注册到“语言与框架 › <语言>”或“构建、执行、部署 › <构建系统>”页,按 section 分组;设置可声明项目级覆盖(写入项目 .lithe/plugin-settings.json)和生效方式(重启、立即、重新加载、下次运行),“立即生效”的值经 workspace/configuration 推给正在运行的语言服务器;按钮调用插件自己的插件函数。宿主只提供通用页面、控件和语言服务状态卡,不内置任何语言或构建工具的页面;路径选择按钮保持完整可见,窄面板由输入框和标题列缩短以容纳状态标签
plugin-registered-settings-pages
已实现
待验证
证据路径
rust/lithe-core/src/plugins/settings.rs
rust/lithe-core/src/plugins/declarative.rs
macos/Sources/Lithe/Application/Features/PluginSettingsRegistry.swift
macos/Sources/Lithe/Models/AppModel/AppModel+PluginSettings.swift
macos/Sources/Lithe/Views/App/ContributedSettingsPageView.swift
macos/Sources/Lithe/Views/App/PluginSettingsSection.swift
macos/Sources/Lithe/Views/App/SettingsView.swift
macos/Tests/LitheTests/PluginSettingsTests.swift
shared/contracts/plugins/v1/fixtures/settings-v2.plugin.json
shared/contracts/plugins/v1/plugin-manifest.schema.json
scripts/plugins/plugin-settings-schema.test.mjs
macos/Sources/Lithe/Views/Components/LitheSettingsControls.swift
macos/Tests/LitheTests/PluginSettingsLayoutTests.swift
未实现
不适用
证据路径
shared/contracts/plugins/v1/README.md
Plugin PlatformmacOS:先使用 Swift 6.3.3 构建 Release,确认插件页选择回调不触发编译器崩溃;在 Release 应用中选择插件设置页,确认其侧栏分组自动展开。macOS:安装一个声明了 settings 2 页面(page/section/scope/effect/settingActions)的插件并启用,确认设置侧栏的对应分组下出现该语言或构建系统页,页内按插件和 section 分组显示设置与按钮;搜索设置标题能定位到该页。打开项目后把 scope 为 project 的设置切到“此项目”并修改,确认项目下生成 .lithe/plugin-settings.json 且显示“已在此项目覆盖”,恢复默认后文件被删除。修改 effect 为 immediate 的设置,确认语言服务器不重启而配置生效;修改 restart 设置时出现重启提示。点击带 confirm 的按钮先弹确认,再调用插件函数并给出结果通知。停用插件后页面消失。macOS 布局回归:运行 PluginSettingsLayoutTests,检查 480/640/900 点宽、深浅主题的路径控件与选择按钮不重叠且留在容器内,点击选择按钮写入所选路径;在插件详情的窄设置页确认“选择…”文字完整。Windows:宿主仍只声明 settings/languageServers 1,需要 v2 的插件在市场中隐藏。契约 Schema:用 draft 2020-12 校验器(先加载 native-ui.schema.json)校验 settings-v2.plugin.json,确认通过;把 requires.settings 改为 1 或去掉 requires.languageServers 2 后应被拒,确认 Schema 与 Core 对 settings 2 的结构规则一致。
插件 / 插件界面插件可以在宿主管理的工具窗口里显示自己包内的 HTML 页面(ui 2、ui.web 权限):只读取已安装包内的文件,CSP 禁止联网、内联脚本和 eval,网页存储不持久;页面通过 window.lithe 桥接只能操作本插件的构建系统和当前工作区,启动构建工具前由宿主确认,输出进入 Build Output,页面只可取消本次实际启动的运行;任务与测试在确认后最终启动前拒绝已有运行,保留宿主或其他页面的运行及 Build Output,包含等待确认期间新启动的运行;选择必须唯一命中模型,目标以经过校验的完整 tags 集合区分同名同目录的 binary/example,最终执行参数从模型重建,拒绝歧义和伪造标签;模型保留 Core 的声明运行项和任务类别;异步激活、检测和依赖请求复核工作区并受本地期限约束;直接关闭原生项目窗口时,在会话首次异步退出前同步销毁隐藏页面并撤销进程许可,即使设置窗口继续持有项目模型,待处理和后续桥接请求也被拒绝,不能重新激活执行模块;插件禁用、更新或卸载时同进程所有项目窗口(含隐藏页)都被销毁,新项目窗口继承阻断状态,包变更后的旧管理器重新启用不能在重启前重建页面;页面申请摄像头或麦克风时默认没有权限,由宿主逐次弹窗确认(写明这是插件并附插件 ID,只认本插件主框架,页面不在窗口里直接拒绝,视图离开窗口即结束采集);桥接版本 2(lithe.version)增加 dialog.openFile 与 dialog.saveFile:由宿主弹出文件对话框并写明发起的插件,同一页面同时只开一个,页面只拿到用户选中的绝对路径(取消为 null),读写交给插件后端,页面关闭后不再返回选择结果
plugin-web-tool-windows
已实现
待验证
证据路径
macos/Sources/Lithe/Application/Features/PluginWebBridge.swift
macos/Sources/Lithe/Application/Features/PluginWebPages.swift
macos/Sources/Lithe/Application/Features/PluginWebPageLifecycle.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/Web/MacPluginWebContent.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/Web/MacPluginWebPage.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/Web/MacPluginWebSurface.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/Web/MacPluginWebStateStore.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginManager.swift
macos/Sources/LitheExecutionModule/Services/BuildSystemService.swift
macos/Sources/LitheCoreContracts/Execution/BuildSystemContracts.swift
macos/Sources/Lithe/Platform/MacOS/Plugins/MacPluginPackageStore.swift
macos/Tests/LitheTests/PluginPackageStoreTests.swift
macos/Tests/LitheTests/PluginManagerTests.swift
macos/Tests/LitheTests/PluginDiskInstallationTests.swift
macos/Tests/LitheExecutionModuleTests/BuildSystemServiceTests.swift
scripts/resources/worktree-resources.json
scripts/resources/test-reuse-worktree-resources.mjs
macos/Sources/Lithe/Models/AppModel/AppModel+PluginWeb.swift
macos/Sources/Lithe/Models/AppModel/AppModel.swift
macos/Sources/Lithe/Models/Workspace/ProjectSessionManager.swift
macos/Sources/Lithe/Views/Workbench/DeclarativeToolWindowView.swift
macos/Tests/LitheTests/PluginWebBridgeTests.swift
macos/Sources/Lithe/Platform/MacOS/WebMediaCapture.swift
macos/Tests/LitheTests/PluginWebCaptureTests.swift
macos/Tests/LitheTests/WebMediaCaptureTests.swift
shared/contracts/plugins/v1/fixtures/web-panel.plugin.json
部分实现
待验证
证据路径
windows/tauri/src-tauri/src/plugin_host/web.rs
windows/tauri/src-tauri/src/plugin_host/tests.rs
windows/tauri/src/features/plugins/declarative-plugins-section.tsx
shared/contracts/plugins/v1/fixtures/web-panel.plugin.json
windows/tauri/src/features/plugins/plugin-web-appearance.ts
windows/tauri/src/features/plugins/plugin-web-appearance.test.ts
windows/tauri/src/features/plugins/plugin-web-open-file.test.ts
windows/tauri/src-tauri/capabilities/plugin-web.json
windows/tauri/src-tauri/permissions/declarative-web/bridge.toml
windows/tauri/src-tauri/src/plugin_host/web_network.rs
windows/tauri/src-tauri/src/plugin_host/lifecycle.rs
windows/tauri/src/features/plugins/plugin-web-open-file.ts
windows/tauri/src/features/plugins/plugin-lifecycle-listener.test.ts
windows/tauri/src/features/workspace/services/workspace-lifecycle.test.ts
Plugin Platform自动回归:文件对话框见 PluginWebBridgeTests 的 fileDialogsNameThePluginAndReturnOnlyTheChosenPath 与 oneFileDialogAtATimeAndAClosedPageLearnsNoChoice;LITHE_TEST_WINDOW_MODE=isolated ./.agents/skills/write-stable-tests/scripts/test-stability-macos.sh -- --filter 'PluginWeb|PluginManagerTests|PluginDiskInstallationTests|BuildSystemServiceTests',检查包内脚本、CSP、主题事件、nonPersistent 数据存储和包文件字节不变;验证错误方法/参数、跨插件/工作区/符号链接逃逸、激活中工作区切换、等待期限、关闭后释放、真实 resetDedicatedWindowSession 在设置窗口仍强持项目模型且网页隐藏时同步关闭页面并清空登记表(TestGate 挂起检测和模块退出,待处理/退出中/退出后请求均返回 plugin.web.forbidden,桥接激活次数不增且退出后 Execution 未重新激活;新回归编译和运行待 CI 验证)、拒绝启动时不认领其他运行、任务与测试两入口遇 busy 均不取消现有运行或清空输出(含 TestGate 控制等待确认期间出现新运行)、同名 demo application/example 依完整 tags 唯一选中且最终参数来自模型、真实 Cargo 模型经桥接选中 example 后通过 Core targetTags 校验并生成 run --example demo、缺少区分信息或伪造/错误类型 tags 被拒绝、停用后旧视图无法重建且工作区关闭不撤销停用、安装和回滚校验失败保留旧页面、社区磁盘同版本替换及升级经真实审查和管理器入口在修改资源及安装记录前同步关闭双项目隐藏页面,拒绝已批准的进程许可并阻止后注册窗口及重新启用在重启前重建(PluginDiskInstallationTests/diskReplacementClosesEveryProjectPageBeforeMutation;篡改快照校验失败保留旧页面)、替换前关闭页面、模型任务类别及声明运行项完整转发、双项目页面与同意记录同步失效、后注册窗口继承阻断、包变更后旧管理器启用不能解锁、弱引用不保留关闭窗口。node scripts/resources/test-reuse-worktree-resources.mjs 拒绝网页状态跨工作树复用。产品界面验收仍 pending。macOS:在开发版里用“从磁盘安装插件”安装 web-panel 夹具(plugin.json 旁放 ui/index.html 和 icons/panel.svg),重启后打开右侧 Web Panel 窗口,确认页面显示、根元素带 data-theme 和 --lithe-* 变量,切换浅色/深色后 ui.themeChanged 到达;页面里的内联脚本和 fetch 外网被 CSP 拦截。在页面控制台调用 lithe.request('ui.setState', {state:{a:1}}),隐藏再显示窗口后 ui.getState 仍返回该值;调用未知方法得到 plugin.web.unknownMethod,openFile 传 ../ 得到 plugin.web.forbidden。在设置 › 插件里停用该插件,窗口消失;重新启用后窗口回到原来的停靠位置并重新加载页面。打开过网页窗口后运行 scripts/macos/verify/verify-runtime-bundle-immutability.sh 通过。摄像头与麦克风:自动回归 ./scripts/macos/test/test-macos.sh --filter 'PluginMediaCapture|MockCapture|WebMedia',插件页在真实 WKWebView 里用 WebKit 模拟设备验证:用户点 Allow 才授权且问题记录的请求者是插件名加 ID,拒绝得到 NotAllowedError,缺用途说明、页面不在窗口里、非本插件主框架一律不弹窗直接拒绝,隐藏窗口后采集结束,点 Allow 之后页面才被隐藏时才启动的设备也被立即停掉,隐藏之后才点的 Allow 不生效,源码扫描保证每个 WKWebView 都有人回答请求且 .grant 只出现在 WebMediaCapture.swift;补上 Info.plist 用途说明后,在开发版里用调用 getUserMedia 的插件页确认弹窗写明插件和 ID、隐藏工具窗口后系统菜单栏的绿点或橙点消失、再显示后同一页面第二次调用是否再询问(WebKit 可能复用同一文档里已批准的授权,按实测校对弹窗说明)(当前构建没有用途说明,页面里 navigator.mediaDevices 不存在,这一步尚不能做)。Windows:ui 2 宿主已实现 state/openFile 与 locale/theme。运行 WindowsRust 和 Frontend 计时 harness,验证包外来源拒绝、内部/外部 junction 的真实目标边界、原生桥脚本的主题初值与事件;在真实 WebView2 中检查同包导航可用,外站导航、弹窗和下载被拒绝,外站得不到桥;切换语言和主题,确认 context、data-theme 与 --lithe-* 同步。设置页与 Web 窗口视觉验收仍 pending,不能以脚本测试代替。 Windows ACL 回归读取实际编译的 Tauri authority:插件私有来源仅允许 declarative-web request,拒绝 fs/http/event 及常规宿主命令,外站与主窗口不能借此调用桥;实机必须验证 state 往返成功,不能只验证拒绝分支。 Windows 请求层:页面加载前安装 WebResourceRequested 过滤器;本机 HTTP 计数器必须证明外站导航 GET 为零,不能仅以导航被取消或 URL 不变判断隔离成功。 Windows 双工作区回归:同一插件的页面和 state 分别归属创建窗口及工作区;A 页 openFile 只在 A 编辑器打开,切换工作区、路径拒绝或编辑器失败须向页面返回错误,不能先返回成功。关闭 A 清理其页面/状态但保留 B;禁用插件同时撤销全部页面与待处理请求,包变更等待资源读取退出。页面仍使用独立 WebView,停靠及布局恢复保持 partial。 关闭工作区与页面写状态/打开文件交错时,先原子撤销所属页面,再清状态与待确认请求;旧页面实例和关闭前发起的异步页面创建都必须被拒绝,重新打开同一工作区的新请求仍可用。
运行与调试 / 运行退出前逐个确认仍在运行程序的终端和 Agent 后台任务(Agent 任务确认窗口用卡片显示状态、工作区和已运行时长,命令里的 JSON 参数自动识别并缩进排版,超出固定高度时滚动,可一键复制原始命令),后台服务在有界虚拟化滚动列表中逐项选择结束或保留,原生文本视口缓存长命令排版并只绘制可见文字,复选框仅在视口附近挂载且离屏选择不丢失,完整命令与详情换行且可复制,支持全选、全不选和选择数量;只列出本实例启动的进程;设置页“进程终止策略”可调整每类确认,每个选项有 ⓘ 悬停说明
process-termination-policy
部分实现
待验证
证据路径
macos/Sources/Lithe/Application/Features/ProcessExitCoordinator.swift
macos/Sources/Lithe/Platform/MacOS/UI/MacProcessExitConfirmationPresenter.swift
macos/Sources/Lithe/Platform/MacOS/Agent/MacAgentProcessRegistry.swift
macos/Sources/Lithe/Views/App/ProcessTerminationSettingsView.swift
macos/Sources/Lithe/Views/Components/LitheInfoTip.swift
rust/lithe-core/src/process/lifecycle.rs
shared/fixtures/process-lifecycle/exit-plan-v1.json
shared/fixtures/process-lifecycle/settle-v1.json
macos/Tests/LitheTests/ProcessLifecycleFixtureTests.swift
macos/Tests/LitheTests/AgentProcessRetentionTests.swift
macos/Tests/LitheTests/MacRetainedProcessLifecycleTests.swift
macos/Tests/LitheTests/MacRecoveredSessionTests.swift
macos/Tests/LitheTests/MacTerminalBusyProcessTests.swift
shared/fixtures/process-lifecycle/inventory-v1.json
macos/Sources/Lithe/Views/App/AgentTaskExitConfirmationView.swift
macos/Sources/Lithe/Views/App/CommandLineDisplayFormatter.swift
macos/Tests/LitheTests/AgentTaskExitConfirmationViewTests.swift
macos/Tests/LitheTests/CommandLineDisplayFormatterTests.swift
macos/Sources/Lithe/Platform/MacOS/UI/BackgroundResourceSelectionView.swift
macos/Tests/LitheTests/BackgroundResourceSelectionViewTests.swift
未实现
不适用
证据路径
rust/lithe-core/src/process/lifecycle.rs
rust/lithe-core/src/process/inventory.rs
RunmacOS:在两个终端分别运行 Spring Boot 和空闲 shell,让 Agent 启动一个长时间命令,再在终端里 setsid 启动一个后台服务;退出时应只对忙碌终端逐个确认(可跳到终端或取消),再逐个确认 Agent 任务(带 --settings JSON 的命令应按层级缩进显示,长命令在命令框内上下滚动,复制得到原始命令),最后在列表中勾选后台服务;选择保留的进程退出后仍存活,取消退出时不结束任何进程。在 Lithe 外启动的进程不出现。修改设置页各选项后流程相应跳过确认;悬停 ⓘ 约 0.3 秒出现说明,点击可固定,读屏可读出;中英文文案齐全;设置搜索能找到该页。 后台服务验证单条跨多屏长命令及不含空格的参数换行、完整选择复制、200 项滚动到最后一项且挂载按钮数随视口有界,滚动不重建文本存储或改变固定容器宽度,返回后保留按资源 ID 的勾选,全选/全不选包含离屏项并更新数量,读屏保留的同一复选框元素在单项和批量变更后实时回读勾选值且身份稳定,变更发送辅助功能值通知,仅识别服务出现记住选项;深浅主题原生弹窗高度有界,真实工作区连续滚动需另做帧性能验收,按选择退出、全部结束和取消继续沿用现有语义。
识别规则(如 Gradle Daemon)和 Docker 容器的资源提供者尚未接入,后台服务目前靠脱离会话识别;Agent 任务弹窗暂无“打开所属会话”按钮。确认规则与结算在 Rust Core,两端共用 fixture。Review 回归覆盖所有项目先提交保留、未保留基础设施清理、终端设置等待预算、已观测后代持续持久化,以及首进程已退出的后台 session;瞬时 double-fork 的准确血缘仍需独立任务启动标记;退出确认后新发现且未批准的 Agent 身份会延期,并保持实例记录供下次启动逐树确认,已批准的兄弟任务和基础设施仍清理。第二轮回归还覆盖关闭单连接隔离、PID 复用、原始应用 session 恢复、旧记录无会话时不自动清理,以及终端 exec 替换和同组子程序。真实 GUI 退出、更新和崩溃、Windows 与锁定 CI 工具链仍待验收,不视为完整验收。
工作台 / 项目侧边栏项目树、标签页和搜索结果为常见项目文件显示专用图标:.gitignore/.gitattributes 用 Git 图标,go.mod/go.sum 用 Go 图标,Makefile 与 *.mk 用 Makefile 图标,package.json 用 Node.js 图标,bun.lock、Cargo.lock、package-lock.json 等锁文件用锁图标,README 用信息图标,LICENSE/COPYING 用许可证图标
project-file-type-icons
已实现
待验证
证据路径
macos/Sources/Lithe/Theme/LitheIcons.swift
macos/Resources/IDEAIcons/fileTypes
macos/Tests/LitheTests/LitheCoreLogicTests.swift
macos/Tests/LitheTests/FileTypeIconResourceTests.swift
已实现
待验证
证据路径
windows/tauri/scripts/idea-file-icon-mappings.json
windows/tauri/scripts/generate-idea-file-icons.ts
windows/tauri/scripts/lithe-file-icons
windows/tauri/src/extensions/bundled/icon-themes/idea/extension.json
windows/tauri/src/extensions/bundled-extension-manifests.test.ts
Workbench在深浅主题下打开含 go.mod、go.sum、Makefile、.gitignore、.gitattributes、bun.lock、package.json、README.md、LICENSE、NOTICE 的项目,核对项目树、编辑器标签和 Search Everywhere/快速打开中的图标与上述分类一致,不再显示问号或纯文本图标;NOTICE 等未分类文本仍显示文本图标。Windows 使用 IDEA Icons 主题核对同一组文件,PowerShell 文件仍显示原 Windows 四格图标。
工作台 / 项目侧边栏项目侧边栏标题与项目树行块左缘对齐,只显示右侧 IDEA Community 下拉箭头;定位当前文件与刷新按钮使用 16pt 明暗 SVG
project-sidebar-header-icons
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Workspace/ProjectSidebarView.swift
macos/Resources/IDEAIcons/expui/general/chevronDown.svg
macos/Resources/IDEAIcons/expui/general/locate.svg
macos/Resources/IDEAIcons/expui/general/refresh.svg
平台专属
不适用
证据路径
windows/tauri/src/features/panes
WorkbenchmacOS 深浅主题下打开项目并核对 Project 文字与下方项目树行块左缘对齐、标题只有右侧下拉箭头;点击 Project 切换视图,确认弹层操作正常;核对两个按钮的 16pt 图标及 22pt 悬停块与 IDEA SVG 一致,鼠标进入标题行时渐显、离开时隐藏,悬停保持箭头光标,定位当前文件和刷新操作正常。 不悬停时 Reveal/Refresh 仍能通过无障碍树访问,键盘或 VoiceOver 焦点进入按钮时显示;hover 不决定无障碍可达性。
工作台 / 项目侧边栏项目树展开与折叠箭头使用 IDEA Community 明暗 SVG,目录行保持默认箭头光标和 24pt 连续行距
project-sidebar-tree-disclosure-icons
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Workspace/ProjectSidebarView.swift
macos/Sources/Lithe/Theme/LitheTheme.swift
macos/Resources/IDEAIcons/expui/general/chevronRight.svg
macos/Resources/IDEAIcons/expui/general/chevronDown.svg
平台专属
不适用
证据路径
windows/tauri/src/features/panes
WorkbenchmacOS 深浅主题下检查项目树箭头 SVG 的尺寸、笔画与 IDEA Community 一致;展开和折叠多层目录,确认 24pt 连续行距、目录行默认箭头光标及操作正常。
编辑器 / 代码结构引用结果面板与引用跳转
references-pane
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Language/JavaReferencesView.swift
已实现
待验证
证据路径
windows/tauri/src/features/references
Language Tooling从符号发起引用查询,验证结果分组、文件定位、关闭和重新查询。
工作区 / 远程开发在 SSH 主机、容器和远程 Mac 上打开并开发项目
remote-development-workspace
部分实现
待验证
证据路径
macos/Sources/Lithe/Views/Workspace/RemoteConnectionsView.swift
macos/Sources/Lithe/Application/Features/RemoteConnectionsFeatureModel.swift
macos/Sources/Lithe/Services/Remote/RemoteWorkspaceRouting.swift
macos/Tests/LitheTests/RemoteConnectionsTests.swift
macos/Tests/LitheTests/RemoteRuntimeDiscoveryTests.swift
macos/Tests/LitheTests/RemoteTerminalTransportTests.swift
macos/Tests/LitheTests/RemoteShellDiscoveryTests.swift
macos/Sources/Lithe/Platform/MacOS/Remote/MacRemoteTerminalTransport.swift
macos/Sources/Lithe/Platform/MacOS/Remote/MacRemoteRuntimeLocator.swift
rust/lithe-core/src/remote/sessions_integration_tests.rs
rust/lithe-core/src/remote
rust/lithe-remote/src/client/launch.rs
rust/lithe-remote
shared/contracts/remote-workspace-protocol-v1.md
.agents/notes/implemented/feature/2026-10-24-remote-ssh-connections.md
.agents/notes/implemented/architecture/2026-10-24-remote-workspace-routing.md
.agents/notes/proposed/architecture/2026-10-24-remote-development-workspace-host.md
macos/Sources/Lithe/Views/Workspace/OpenProjectPanel.swift
macos/Sources/Lithe/Views/Components/LitheSettingsControls.swift
macos/Sources/Lithe/Services/Remote/RemoteDirectoryObservation.swift
macos/Tests/LitheTests/RemoteDirectoryObservationTests.swift
macos/Tests/LitheTests/RemoteBuildExecutionTests.swift
macos/Tests/LitheTests/RemotePluginDeploymentTests.swift
macos/Sources/Lithe/Platform/MacOS/Remote/MacRemoteBuildCommandRunner.swift
macos/Sources/Lithe/Platform/MacOS/Remote/MacRemotePluginPackageDeployer.swift
macos/Sources/Lithe/Platform/MacOS/Remote/MacRemotePluginLaunchPreparer.swift
macos/Tests/LitheTests/RemotePluginLaunchPreparerTests.swift
rust/lithe-remote/src/server/connection/tests.rs
rust/lithe-remote/src/server/run_directory.rs
rust/lithe-remote/tests/run_directories.rs
rust/lithe-remote/src/server/upload/tests.rs
macos/Sources/LitheExecutionModule/Services/BuildSystemService.swift
rust/lithe-core/src/execution/workspace_scan.rs
未实现
不适用
证据路径
windows/tauri/src/features/wsl/controllers/wsl-workspace.ts
Workspace欢迎页点“远程开发”:新建 Linux SSH 连接,分别验证 SSH Agent、私钥、密码和 2FA,核对主机信息卡片;打开项目后验证文件树、编辑保存和外部修改冲突。在远程终端运行 pwd,检查真实主机目录;探测 Shell,确认仅出现远端可执行程序,连续缩放与取消启动无残留进程。刷新 JDK/Maven,确认读取远端环境且断线不回退本机。在远端仓库验证状态、暂存、提交、历史分页和 Git 设置来源;检查选择文件提交保留无关暂存,未保存缓冲区的行历史正确,worktree 创建、列举、锁定、删除及克隆均只操作远端目录;Shift+Shift 搜索远端文件与内容。Core 远端文件装入内存不超过 32 MiB,原子写入不超过 8 MiB,超限和断线均明确失败且不覆盖现有内容;更大的 Git 临时内容尚不支持。上述 I/O 路径已有适配和隔离 fixture,真实 SSH 完整流程待验收;构建 I/O、工具解析、状态目录、插件资源部署和通用 stdio 提供者接入已有实现;真实 SSH 上的完整构建和插件启动尚未验收。远程 Java 原生集成、SVN 兼容目标包和完整流程、Agent 执行位置选择、远端服务强制终止后的快照安全回收、远程 Mac 和容器入口仍待完成。运行 scripts/remote/verify-remote-workspace.sh、RemoteRuntimeDiscoveryTests、RemoteTerminalTransportTests、RemoteShellDiscoveryTests 和 Core remote::sessions 集成测试。Linux musl 两种架构服务各保持不超过 1.5 MiB。远程开发窗口与 Open 面板在 800×650 父窗口中验证信息换行、架构标签、底部按钮和编辑期间尺寸稳定。 文件树新建、目录、复制、重命名与主机废纸篓已接入,14 项 Swift 路由/监听 fixture 通过;真实 SSH 验证外部创建、编辑、移动、删除、溢出重扫和 watcher 取消后无资源残留。 RemoteBuildExecutionTests、RemotePluginDeploymentTests 与 MacBuildProviderSessionsTests 覆盖字节/参数保留、信号和错误、上传完整性、原连接清理、异步准备及迟到启动;补充真实 SSH stdio 顺序、断线、背压与取消后再更新验证状态。 通用资源启动在读取请求时预留身份,启动期间的关闭由创建者保留最终清理责任;验证清理早于注册、工作线程饱和、失败启动、无效关闭参数,以及不同资源独立性;区分常驻会话断线保留、非驻留断线清理和会话关闭/空闲到期后的迟到资源清理。RemotePluginLaunchPreparerTests 使用真实声明覆盖目标架构、远端状态目录、缺失资源、准备中重连和取消清理;本机 fixture 不替代 SSH/Linux 验收。Java/JDT 等语言专属集成不在本轮通用能力续作范围。 会话拥有完整插件快照:验证分配回复丢失后按原身份释放、重复释放不接管已有目录、跨会话隔离、父目录权限与链接拒绝、删除失败(包括等待创建者清理)保留原身份供重试、普通断线清理、常驻断线保留及关闭/空闲到期回收;服务端强杀后的回收仍未实现。上传验证同文件并发 BUSY、不同文件独立提交,以及取消/到期不等待文件锁。Agent 后续单独处理,本轮不扩展。 远端子目录与符号链接根:验证发现父仓库后,仅用返回 URL 查询状态和暂存仍选择原连接;同名本机哨兵仓库的索引和文件保持不变,同一远端路径在不同连接上隔离;外部 Git 元数据监听的订阅与事件使用同一可逆身份。 运行配置发现与生成(runConfig.inspect 等)尚未接入远程工作区,Core 对它们返回 NotSupported,目前只有 runConfig.selectJava 可用,不得把本机扫描结果当作远端项目。共享运行扫描的远程契约由 Core 集成测试 shared_run_scan_reads_the_host_tree_and_stops_when_the_link_drops 覆盖:读取主机目录树且占位目录保持为空、主机报告的单目录错误记为扫描不完整、链路中断时整体失败而不发布截断结果。运行准备与测试发现复用远程构建的状态租约(BuildSystemService.withPlanContext),真实 SSH 上的验收仍待完成。 macOS 远程开发主面板经 LitheCenteredPopup 有标题表单入口居中无动画打开,复用统一窗口外框;取消、保存成功、关闭窗口复位呈现状态并清理任务。输入框和按钮样式不变,内部认证/目录浏览 sheet 保留。运行 LitheCenteredPopupTests、RemoteConnectionsTests 和 RemoteWorkspaceRoutingTests;人工验证欢迎页和菜单入口。
工作区 / 远程开发远程连接与远程路径工作区
remote-workspace
部分实现
待验证
证据路径
macos/Sources/Lithe/Services/Remote/RemoteWorkspaceRouting.swift
macos/Sources/Lithe/Views/Workspace/RemoteConnectionsView.swift
macos/Tests/LitheTests/RemoteConnectionsTests.swift
macos/Sources/Lithe/Services/Remote/RemoteDirectoryObservation.swift
macos/Tests/LitheTests/RemoteDirectoryObservationTests.swift
macos/Tests/LitheTests/RemoteBuildExecutionTests.swift
macos/Tests/LitheTests/RemotePluginDeploymentTests.swift
macos/Sources/Lithe/Platform/MacOS/Remote/MacRemoteBuildCommandRunner.swift
macos/Sources/Lithe/Platform/MacOS/Remote/MacRemotePluginPackageDeployer.swift
macos/Sources/Lithe/Platform/MacOS/Remote/MacRemotePluginLaunchPreparer.swift
macos/Tests/LitheTests/RemotePluginLaunchPreparerTests.swift
rust/lithe-remote/src/server/connection/tests.rs
rust/lithe-remote/src/server/run_directory.rs
rust/lithe-remote/tests/run_directories.rs
rust/lithe-remote/src/server/upload/tests.rs
rust/lithe-remote/src/server/daemon.rs
rust/lithe-remote/tests/persistence.rs
已实现
待验证
证据路径
windows/tauri/src/features/remote
windows/tauri/src/features/file-system
RemoteWindows 验证连接、密码提示、远程路径、断线和重连;macOS 从欢迎页远程开发入口连接 Linux SSH 主机,验证文件树、编辑保存冲突、断线通知与重连。macOS 路由与断线 fixture 已有自动测试,真实 SSH 流程仍待验收;完整远程开发进度见 remote-development-workspace。 文件树新建、目录、复制、重命名与主机废纸篓已接入,14 项 Swift 路由/监听 fixture 通过;真实 SSH 验证外部创建、编辑、移动、删除、溢出重扫和 watcher 取消后无资源残留。 构建与插件接入进度同步至 remote-development-workspace;本行保持 partial/pending,不能以本机 fixture 替代真实 SSH 验收。 通用资源启动在读取请求时预留身份,启动期间的关闭由创建者保留最终清理责任;验证清理早于注册、工作线程饱和、失败启动、无效关闭参数,以及不同资源独立性;区分常驻会话断线保留、非驻留断线清理和会话关闭/空闲到期后的迟到资源清理。RemotePluginLaunchPreparerTests 使用真实声明覆盖目标架构、远端状态目录、缺失资源、准备中重连和取消清理;本机 fixture 不替代 SSH/Linux 验收。Java/JDT 等语言专属集成不在本轮通用能力续作范围。 会话拥有完整插件快照:验证分配回复丢失后按原身份释放、重复释放不接管已有目录、跨会话隔离、父目录权限与链接拒绝、删除失败(包括等待创建者清理)保留原身份供重试、普通断线清理、常驻断线保留及关闭/空闲到期回收;服务端强杀后的回收仍未实现。上传验证同文件并发 BUSY、不同文件独立提交,以及取消/到期不等待文件锁。Agent 后续单独处理,本轮不扩展。 常驻服务并发启动按身份先取得有界.start文件锁,重新检查socket后才创建daemon;锁覆盖至socket就绪,关闭描述符释放,inode保留。验证互斥、立即期限、释放后可重取,以及竞争连接收到server.shutdown确认后daemon不重新启动。macOS真实进程回归与Linux/macOS编译检查分别记录,Linux运行结果以CI为准。
运行与调试 / 运行配置入口点与运行配置发现
run-discovery
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Run
macos/Tests/LitheTests/RunConsolePresentationTests.swift
shared/fixtures/run-configuration
rust/lithe-core/src/lsp/interface/engine_real_jdt_tests.rs
macos/Tests/LitheTests/RealJavaDebugIntegrationTests.swift
macos/Tests/LitheTests/RunEntryPointTests.swift
macos/Sources/LitheExecutionModule/Services/RunService.swift
macos/Tests/LitheExecutionModuleTests/ExecutionModuleTests.swift
rust/lithe-core/src/execution/workspace_scan.rs
rust/lithe-core/src/execution/configuration.rs
rust/lithe-core/src/execution/generated_layer.rs
macos/Sources/Lithe/Platform/MacOS/RunConfiguration/MacRunConfigurationStore.swift
rust/lithe-core/src/tests/run_configuration.rs
已实现
待验证
证据路径
windows/tauri/src/features/run
rust/lithe-core/src/project/maven.rs
rust/lithe-core/src/execution/detectors/maven.rs
rust/lithe-core/src/languages/text.rs
rust/lithe-core/src/languages/java.rs
windows/tauri/src/features/run/components/run-configuration-browser.tsx
windows/tauri/src/features/run/components/run-configuration-browser.test.tsx
windows/tauri/src/features/run/components/run-configuration-list-split.tsx
windows/tauri/src/features/run/utils/run-configuration-list-layout.test.ts
windows/tauri/src/features/run/utils/run-configuration-language.ts
windows/tauri/src/features/run/utils/run-output-selection.test.ts
windows/tauri/src/features/run/components/run-pane.test.tsx
windows/tauri/src/features/run/components/run-configuration-list.tsx
windows/tauri/src/features/run/components/run-configuration-list.test.tsx
windows/tauri/src/features/run/utils/run-configuration-presentation.ts
windows/tauri/src/features/run/utils/run-configuration-presentation.test.tsx
shared/fixtures/run-configuration
windows/tauri/src/features/run/services/java-context-entrypoint.ts
windows/tauri/src/features/run/services/java-main-launch.test.ts
rust/lithe-core/src/lsp/interface/engine.rs
rust/lithe-core/src/execution/workspace_scan.rs
rust/lithe-core/src/execution/configuration.rs
rust/lithe-core/src/execution/generated_layer.rs
windows/tauri/src/features/run/stores/run-project-load.test.ts
rust/lithe-core/src/tests/run_configuration.rs
windows/tauri/src/features/run/stores/run-prelaunch.test.ts
windows/tauri/src/features/host-api/ide-capabilities.test.ts
windows/tauri/src/features/maven/services/maven-module-debug.test.ts
Run验证 Spring Boot、Java、Maven、Gradle、npm、Cargo、Go、Python 和 Docker Compose 入口识别;Maven 框架 plugin 只在父 POM 声明时,子模块沿 <parent> 链继承后仍识别为对应服务,父 POM 按 groupId:artifactId:version 完整坐标匹配、仅同名 artifactId 或版本不符的不继承、含未解析 ${...} 表达式的坐标不作数,聚合但未声明 <parent> 的模块不继承、<inherited>false</inherited> 的 plugin 不下传且对更深层级保持阻断、<pluginManagement> 声明保持不生效、框架 plugin 按完整坐标 groupId:artifactId 识别:每个框架的全部官方坐标组均被接受(Quarkus 的 io.quarkus 与平台再发布的 io.quarkus.platform,Micronaut 3.x 的 io.micronaut.build 与 4+ 的 io.micronaut.maven,Spring Boot 的 org.springframework.boot)、省略 <groupId> 的声明按 Maven 默认组 org.apache.maven.plugins 处理,其他组下的同名插件与含 ${...} 表达式的 group 不识别为框架,子模块的同名自定义 plugin 也不遮蔽父继承的正品;源码根与报告目录的提取同样按完整坐标匹配,build-helper 执行级源根与 Surefire/Failsafe 独立 reportsDirectory 均有官方组与自定义组对照;Java 运行入口缺少主类时 inspect 报 staleJavaEntrypoint 并提示重新生成,重新生成后由 JDT 答案恢复;多模块项目把服务工作目录改成模块目录后,服务仍留在列表中并以该目录启动;填写不存在的目录或 ${workspaceFolder} 等变量时,保存被拒绝并提示原因;在 Windows 确认重新扫描服务使用双箭头刷新图标,配置按语言生态、类型与实例呈现三栏布局,Java 下展示 Maven、Gradle 与 Spring Boot 等已识别类型,Node.js 下展示包管理器与框架;语言切换和外部选中能定位配置,空生态不显示,语言和配置栏不显示重复栏头,生态不显示配置数量;语言侧栏通过拖动阈值折叠和展开,收起与展开阈值不同以避免边界跳动,不显示专门折叠按钮;键盘可调整宽度及恢复展开,保存展开宽度与拖动折叠状态,拖动期间只更新局部宽度和紧凑标记,文字与图标对齐即时切换,结束后保存;语言行、类型行和实例行使用一致的紧凑行高,去掉列表上下留白和选中实例的圆角边距;窄面板自动缩成带提示的图标栏且扩大后恢复,右侧输出保留可用空间,窗口缩放或卸载时清理正在进行的拖动;所选配置的日志、运行状态、顶部停止按钮、清空输出与标准输入均指向其自身会话;保持选中 application 并后台启动服务后,顶部停止仍指向该应用的独立会话,不停止后台服务,左侧使用 SVG 箭头和类型图标,基础设施默认折叠,选择配置自动展开所在分组,运行、停止、编辑和完整名称提示可用;根据 Core 提供的 npm、Gradle 和 Python 元数据展示明确识别的框架图标,构建与测试任务保留工具图标,未知类型回退通用图标;同名自定义 provider 与已知框架分别分组且折叠状态独立,相同已知框架跨 Maven/Gradle provider 合组,项目与基础设施不合组;Java 生态分组使用 Java 文件类型图标,Java 启动类实例使用原始 Class 与 RunnableMark SVG 同画布叠加图标;Maven 启动的框架服务使用 MavenRunConfigurationType 对应的 Maven 图标,Make 外部任务分组使用任务文件夹、实例使用 Shell 配置图标,均保留原始明暗 SVG,运行或失败不改变类型图标,深浅主题均可辨认;macOS Run 缺少配置且可重新生成时,检查空状态文字与链接在深浅主题下按 IDEA 工具窗口样式显示、窄面板不截断,并确认“识别并生成”仍触发原有生成流程;应用语言设为英文而系统语言为中文时,Run 空状态及其他本面板文案仍应显示英文;Run 顶部标题字号、颜色、41pt 高度和底部分隔线应与 Terminal、Git Log 等工具窗口一致;有项目配置或 Current File 正在运行/已有退出结果时,运行、重启、重新扫描和软换行按钮显示在独立的 36pt 操作栏,检查 16pt IDEA 图标、22pt 共享按钮的悬停、按下、选中及禁用状态;操作栏只保留一个运行/重运行动作:首次启动显示 Run,当前配置已运行过后显示 Rerun;右侧固定停止按钮,未运行禁用、运行中启用,两者始终指向当前选中配置;操作栏不重复显示 Running 圆点及状态文字,重运行按钮复用顶部工具栏的绿色 rerun_stroke 图标;标题栏菜单中的清空输出与原操作一致,收起按钮沿用共享样式;仅有 Current File 的项目启动后也可从 Run 操作栏停止,结束后保留重运行入口;Run 内容区不额外插入 Java 项目准备状态行,准备进度和失败入口保留在工作台状态栏;Run 标题、操作栏、配置列表标题、控制台标签底边及两侧纵向分割线统一使用工具窗口边框颜色和 1pt 绘制,左侧图标栏不出现 5pt 实心粗线,栏内分组线与 Git Log 一致使用共享 divider 颜色、22pt 宽度、1pt 高度及上下 3pt 间距;操作按钮组之间使用专用 ActionToolbar.separator,详情编辑按钮的边框由共享按钮样式负责,拖动命中范围保持不变;配置树直接显示分组与数量,不显示 Application types 标题;默认隐藏勾选框,通过更多菜单或右键进入批量选择,退出清空选择;配置单行显示名称,类型及服务地址放到悬停提示,行内仅运行/停止,编辑/固定/打开服务保留在共享右键菜单,固定后显示标记;分组与配置使用共享树行高、缩进及焦点选择样式;Run 范围筛选以固定图标栏呈现,应用范围筛选及当前运行导航使用中性 ToolWindowRun 图标,实际运行操作继续使用绿色 Execute 图标;全部采用 IDEA groups、服务采用 server 图标,固定、应用及任务沿用对应 IDEA 原始资源;检查所有图标的 16pt 尺寸、明暗 SVG 自动切换、提示和筛选,右键勾选范围和配置行勾选共享同一批量选择;配置行使用 IDEA 固定、编辑、运行及停止图标,悬停与点击维持箭头光标;配置过期提示使用共享中性通知表面及警告图标,操作仍可重新识别;Run 标题栏仅显示 Run,移除重复配置名与右侧状态胶囊;Console 和 Configuration details 标签位于运行操作按钮组右侧,配置列表选中项表示当前配置,内容区直接显示日志或详情;配置详情使用共享 13pt 字体、原生 Grid 自适应标签列、可选择且可换行的路径及值,编辑配置按钮复用共享 LitheCommitDialogButtonStyle 与 IDEA EditSource 图标,检查深浅主题、窄列及点击跳转设置,服务链接保留原动作;两个标签使用共享 LitheToolWindowTabStyle,检查 13pt 文字、28pt 标签、原始明暗 SVG、悬停及内容区聚焦/失焦状态,保留标签切换;Run 与 Debug 均启用共享 OutputTextView 的 IDEA 渲染入口,运行日志采用一致的 13pt 字体、1.2 倍行高和 ANSI 配色,不给普通 INFO 日志整行染蓝,源码链接继续跳转;Copy 与 Jump to latest 为共享图标按钮,复制不带 ANSI,向上滚动后可恢复跟随;其他配置恢复状态保留各自提示。 Current File 运行一次后修改未保存并切换编辑标签,重运行应先保存原运行文件再构建启动计划;原文件保存失败时提示错误并中止重启,当前焦点文档不被误保存;调整 Run 面板高度,外层横向操作栏固定为 36pt,剩余高度交给配置树和控制台。 缓存目录不可访问时仍可发现兄弟目录和隐藏源码;可选子目录不可读时保留其旧配置并显示 incompleteProjectScan,不误报删除或新鲜;根目录不可读仍失败,完整重新生成后解除未知基线。 两端 Run 面板显示扫描不完整的共享中英文提示;恢复访问权限后重新识别。 Java 文件枚举达到 8,000 条上限后不再访问后续目录,返回顺序稳定;不可读兄弟目录不阻断结果,完整指纹扫描仍继续遍历。 保存 Maven/Gradle 构建任务后重启,确认用户任务和 Spring Boot 等自动入口同时恢复;再次加载不重复生成。 自动 Spring 服务必须同时具备 Maven 插件和同模块唯一的 JDT 已确认非测试 Spring 入口;继承插件的库模块、只有测试 main 的模块、只有子模块入口的父模块不能成为服务,多入口保留独立 Java 配置。验证传空 paths 不影响确认入口的模块归属、JDT 未就绪保留已确认结果、明确空结果移除自动服务,已有服务 ID 和用户配置保持兼容。 #1562:Windows 普通应用 A/B 独立会话和输出;先启动 A 再 B,停止及重跑 B 不影响 A,切换配置只显示所属输出,关闭项目清理两者。 IDE API 在 primary 忙碌时仍能启动独立应用,同一配置准备期间拒绝重复启动;保存期间会话可见且可停止,停止后不再启动进程,顶部停止不影响后台服务;旧 Debug 回调不能停止重跑后的应用。 缺少工具链时错误只归属目标应用,不覆盖 primary 或后台会话,也不把已运行的目标实例标记为退出。
Windows普通Java文件的main入口在工作区搜索遗漏时,先保存并让JDT对当前文件确认,再生成命名运行配置;拒绝过期入口、准备失败和工作区切换结果。Java入口源码按容错UTF-8读取(非法字节替换为占位符),GBK项目不再因单个非UTF-8文件导致整个运行列表生成失败,Spring Boot注解等ASCII分类标记不受影响。 macOS 运行就绪要求匹配快照且工具链和配置选择加载完成,加载中的清单不可作为启动许可;受控工具链与快照测试验证完成前后状态,以及 Current File 不被迟到的默认配置覆盖。 远程工作区尚未接入运行配置发现:Core 对 runConfig.inspect 返回 NotSupported,仅 runConfig.selectJava 可用;共享扫描的远程契约与进度见 remote-development-workspace。 识别结果只保存在 Core 进程内存中,宿主不再写入工作区的 .lithe/run/generated.json、.lithe/toolchains/requirements.json、.lithe/project.json 和 .lithe/.gitignore;上次的 Java 入口缓存在应用缓存目录(run-configurations/),旧版本留下的 generated.json 只作只读的上次入口来源。本进程尚未识别的工作区在加载时自动识别(只读扫描、不启动进程),自动识别不提示入口数量;未写 defaultRunConfiguration 时由 Core 优先选框架服务。识别前 JDK 选择从 pom.xml、.java-version 与 Maven Wrapper 推导最低版本。 保存过构建任务的工作区重启后仍按 Core requiresGeneration 标记自动识别,保留用户任务并恢复其他检测入口;同一进程完成识别后不重复生成。
运行与调试 / 运行配置超长 Java 类路径自动缩短
run-java-long-classpath
已实现
待验证
证据路径
macos/Sources/Lithe/Platform/MacOS/RunConfiguration/MacJavaLaunchArgumentPreparer.swift
macos/Sources/LitheExecutionModule/Services/RunService.swift
rust/lithe-core/src/execution/launch_command.rs
已实现
待验证
证据路径
windows/tauri/src-tauri/src/run/launch_arguments.rs
rust/lithe-core/src/execution/launch_command.rs
rust/lithe-core/src/execution/classpath_jar.rs
windows/tauri/src-tauri/src/run.rs
Run使用包含大量依赖的 Java 项目运行 main,确认超长类路径自动写入参数文件、进程可启动且参数文件在退出后清理。 Windows 上分别用 JDK 8 和 JDK 17 运行同一个依赖很多、路径含空格和中文的项目 main:JDK 8 应在临时目录生成只含 META-INF/MANIFEST.MF 的 .classpath.jar 并以 -cp 引用,JDK 17 仍使用 @argfile;两者都能启动,进程退出或启动失败后临时文件被删除,安装目录与 JDK 目录不新增文件。 在慢速网络盘 classpath 准备期间确认工作台可交互;停止或重新运行后,旧准备结果不得启动进程,旧 executionId 的停止请求不得影响新执行。
运行与调试 / 运行配置Java main 与测试运行
run-java-test
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Run
shared/fixtures/debug
macos/Sources/Lithe/Views/Language/LanguageTestsView.swift
macos/Tests/LitheExecutionModuleTests/ExecutionModuleTests.swift
macos/Sources/Lithe/Views/Workbench/OutputTextView.swift
macos/Tests/LitheTests/LanguageTestPresentationTests.swift
macos/Sources/Lithe/Platform/MacOS/Debug/MacProcessTreePerformanceSampler.swift
macos/Tests/LitheTests/ProcessTreePerformanceTests.swift
macos/Sources/Lithe/Platform/MacOS/Debug/MacTestJVMPerformance.swift
macos/Sources/Lithe/Application/Features/TestJVMPerformanceFeatureModel.swift
macos/Sources/Lithe/Views/Language/TestJVMPerformanceView.swift
macos/Tests/LitheTests/TestJFRIntegrationTests.swift
macos/Tests/LitheTests/TestJVMPerformanceFeatureTests.swift
macos/Sources/Lithe/Views/Workbench/LitheConsoleStyle.swift
macos/Tests/LitheTests/ConsolePresentationTests.swift
macos/Sources/Lithe/Views/Components/LitheCommitDialogStyle.swift
macos/Sources/Lithe/Models/Java/ActiveTestTarget.swift
macos/Tests/LitheTests/RunEntryPointTests.swift
rust/lithe-core/src/project/maven_test_reports.rs
rust/lithe-core/src/tests/build_systems.rs
shared/fixtures/maven/testcase-durations-v1.json
已实现
待验证
证据路径
windows/tauri/src/features/run
shared/fixtures/debug
windows/tauri/src/features/run/components/run-pane.tsx
windows/tauri/src/features/run/components/run-output-text.tsx
Run运行 main、单测试和测试类,验证参数、输出、失败状态和终端策略。 Windows Run 运行输出使用 Geist Mono 显示 ====、==>、=>、!=、>=,确认禁用连字后逐字符显示且复制文本与原始输出一致;检查有输出与空态、ANSI 颜色、自动换行切换及横向滚动。 macOS Tests 顶部核对 41pt 无图标/计数标题、统一底线、运行名称标签的活动/非活动状态;运行中和完成后关闭标签均清理本次运行,保留发现列表并可重新运行。 核对第二行刷新、重跑、停止、清空的 IDEA 原始 16pt 明暗 SVG 与 22pt 按钮悬停范围。 Tests 详情无重复标题/文字 Run 按钮、工具栏右侧无运行状态;第二行首个 Run/Rerun 图标按选中提供方与精确作用域切换,运行中禁用,Stop 常驻;切换测试后运行当前选择,Java 单项 Debug 入口保留。 Tests 布局核对左侧报告状态树(通过/失败/跳过和组折叠)、顶部单行结果摘要、IDEA 控制台及右侧导航/换行/滚动/打印/清空动作;右侧 Details 复用共享收缩条与分隔容器,展开保留作用域、命令和失败定位。控制台左右工具栏均验证明暗主题、背景与原生文本身份。 第二行核对刷新紧挨垃圾桶左侧,两者继续执行发现刷新和输出清空。 Test 的 Performance 展开采集本次进程树 CPU 与 Resident Memory(含构建启动器和测试子进程),复用 Debug 图表及共享折叠条;收起/隐藏停止采集,重跑不混旧数据,结束保留历史,Details 继续显示原有作用域、命令与失败定位。 Stop 等图标禁用时使用 IDEA 灰度,只有可用停止动作保留红色;Performance 收起再展开后时间轴继续保持进程年龄。 Test 右侧 Performance/Details 共用一个可收缩区域,顶部两个标签切换;核对11pt常规标题和Islands文字色。Java选择本次启动器后代中的JUnit/Surefire/Gradle测试JVM,实时CPU/堆曲线,多个worker切换。开始/停止JFR录制、Show Results查看JDK热点方法和分配报告,结束/重跑/关闭正确取消及清理。非Java测试继续用明确标注的CPU/RSS;缺失worker或工具明确提示,不采样Maven/Gradle启动器。 macOS:Run、Debug、Test 共用 OutputTextView/LitheConsoleStyle 默认字体、行高和日志等级色;纯文本及 Maven/Spring ANSI 日志的 INFO 标签均为绿色、WARN 黄色、ERROR 红色,正文及其他 ANSI 片段保留;检查明暗主题、复制、折叠与源码链接。 Test Performance 录制和 Show Results 核对明暗主题、原始录制 SVG、禁用灰度不叠加透明度;Show Results 复用 Commit 的共享 LitheActionButtonStyle,核对28pt可见高度、3pt外留白、13pt常规字、透明/白色背景和独立禁用文字/边框,录制结束后可打开结果。 Show Results 结果窗口使用共享 LitheCenteredPopup 原生标题栏与对话框背景/底部关闭动作,验证 Esc、关闭按钮、系统关闭、重复打开、父窗口关闭及明暗主题,内容保持共享 OutputTextView 的复制和横纵滚动。 Test 结果摘要下方移除普通横线,核对3pt半圆端状态条:失败/错误红色优先于通过绿色;无结果、运行准备和全部跳过不画,重跑清空旧状态。深浅主题使用 ProgressBar 专用色,保持摘要文字和控制台工具栏不变。 调整面板宽度时状态条右端始终停在控制台右侧工具栏左边,不覆盖工具栏及其分隔线。 非Maven无结构化报告时核对成功、失败、取消和超时摘要与状态条;Gradle内置测试通过--no-daemon保持worker属于本次进程树,真实集成先启动兼容常驻daemon,再确认发现与采样的worker身份及独立清理。 Test左侧结果树:根/方法名13pt常规文字、共享Tree文字色;原始16pt明暗SVG覆盖未运行/通过/断言失败/执行错误/跳过和展开箭头,errors保留Error图标而非Failed;核对24pt行高、19pt缩进、12pt两侧留白、折叠、选中/失焦/hover及长名称省略,明暗主题不重染SVG。 结果摘要核对IDEA连续文案(失败、通过、忽略)、中英文单复数、13ptRegular、Label专用失败/警告色、灰色总数和16pt状态图标,覆盖通过但含忽略和全部忽略,不造耗时。结果树类/目录行双击名称展开或折叠,单击选择、箭头点击不变,叶子双击不折叠、不运行。 Test发现列表在首次运行、刷新和重跑等待结果时按工作区/文件/类/方法区分16pt图标,文件复用共享分类;明暗SVG不缺失,结果生成后状态图标优先,保留共享字体、行高、选中与双击展开。 Test未运行且无结构化结果时不显示摘要空态行,仅保留共享控制台的Run a test to see its output提示;运行中及无报告的成功、失败、取消、超时仍显示摘要。 Maven编译失败产生零计数报告、部分测试通过但整体非零退出时,保留Failed/Timed Out文字、错误图标和红色状态条;Gradle同时启用fork编译和测试时,Performance仅发现带Gradle Test Executor身份的worker,不采样通用Gradle Worker Daemon。 回归验证单测→workspace/file→顶栏Run/Debug仍保留新scope;共享testcase-durations-v1.json贯穿Rust报告解析、聚合、通用build.decodeTestResults与Swift呈现,覆盖不同方法耗时、重复调用、部分缺失、非法/负值/超大值及零值;实际Windows UI尚未验收。 回归普通配置仍运行时选择测试,顶栏Run只运行当前测试;单方法JDT启动标签为logsIn()时暂停/继续仍关联所选scope。合成结果树的渲染、选择与默认选中共用节点,报告类/方法可重跑;无语义源码关联的报告节点明确禁用Debug,不猜测源码路径。 macOS边界回归:A处于running/paused时切换测试B,实际注册Debug动作必须准备B;保持同一目标时才重启。混合Java/Node/Python项目只在当前运行的provider组展示报告结果、状态和耗时;关闭或清空带真实方法结果的运行后恢复工作区、文件和未执行测试入口,同时保留编辑器标记历史,并可重新选择文件/工作区运行。
顶栏保留并重跑完整测试scope,工作区/文件/类方法切换不会回退旧单测。方法耗时由Core读取Surefire XML的time并通过可选durationMillis传递,参数化调用累加,任一缺失/非法/溢出则隐藏;控制台整次摘要不作为方法耗时。通用Maven构建结果保留同一字段,Windows契约允许可选值。 顶栏测试动作优先于底层普通配置重启,普通配置运行样式不会串到测试目标。合成结果节点进入统一选择集合;保留JDT发现节点的源码关联,无源码报告节点禁用Debug。 当前报告与provider绑定,Tests列表不使用编辑器历史testOutcomes回填;顶栏Debug先校验当前测试目标再决定重启。
运行与调试 / 运行配置Node 生态运行脚本的启动 PATH
run-node-launch-path
已实现
待验证
证据路径
macos/Sources/Lithe/Services/Java/RunLaunchEnvironment.swift
macos/Sources/Lithe/Services/Java/RunExecutableResolver.swift
macos/Sources/Lithe/Platform/MacOS/Runtime/MacRuntimeLocator.swift
macos/Tests/LitheTests/RunLaunchEnvironmentTests.swift
已实现
待验证
证据路径
windows/tauri/src-tauri/src/run.rs
Run从 Finder 启动的 Lithe 打开 pnpm 或 npm 项目,在运行工具窗口执行 package.json 脚本(例如 `pnpm run clean`),确认不再出现 `env: node: No such file or directory`,脚本内部再调用 node 或 npm 仍解析到同一套工具;项目 `.lithe` 自带的 node 不会进入子进程 PATH。macOS 由 RunLaunchEnvironmentTests 覆盖补齐、去重、顺序、项目内排除、缺失 PATH 使用平台注入的默认值以及显式空 PATH 不被默认值覆盖,并确认其他进程的基础环境不变;Windows 由 run.rs 的 prepend_runtime_paths 路径覆盖。
两端都会把已选运行时目录和解析出的可执行文件目录加入 PATH;Windows 前置,macOS 追加以保留运行配置里的显式 PATH 优先级,并排除项目根目录与项目内解释器。
运行与调试 / 运行输出运行输出快照:右键菜单把当前缓冲的进程输出冻结为只读编辑器标签,环形缓冲继续淘汰旧行时快照内容保持不变,创建即固定防止标签自动淘汰
run-output-snapshot
未实现
不适用
证据路径
macos/Sources/Lithe/Views/Workbench/OutputTextView.swift
已实现
待验证
证据路径
windows/tauri/src/features/run/components/run-pane.tsx
windows/tauri/src/features/run/components/run-output-text.tsx
windows/tauri/src/features/run/utils/run-output-snapshot.ts
windows/tauri/src/features/run/utils/run-output-snapshot.test.ts
windows/tauri/src/features/run/components/run-output-text.test.tsx
RunWindows:运行持续输出的服务,在输出区右键选择「快照当前输出」,确认编辑器区出现以捕获时间命名的只读标签,内容与当时的缓冲一致;继续产生输出并使其超过环形上限后,快照内容不变且可搜索、复制;连续创建多个快照各自独立成标签;把 maxOpenTabs 调小并打开大量其他文件,快照标签不被自动淘汰,仅用户手动关闭后消失;无输出时右键菜单不显示快照项。macOS:待实现后按同等场景验证。
运行与调试 / 运行退出 IDE 时结束它启动的全部运行、终端、服务、测试、语言服务器和插件子进程,不留下孤儿进程;IDE 崩溃或被强制结束时由监护进程兜底
run-processes-end-with-ide
已实现
待验证
证据路径
macos/Sources/LitheExecutionModule/Module/ExecutionFeatureGraph.swift
macos/Sources/Lithe/Platform/MacOS/Process/MacManagedProcess.swift
macos/Sources/Lithe/Platform/MacOS/Process/MacProcessScope.swift
macos/Sources/Lithe/Platform/MacOS/Process/MacProcessLifecycle.swift
macos/Sources/Lithe/Platform/MacOS/Process/MacProcessInventoryReader.swift
macos/Sources/Lithe/LitheApp.swift
rust/lithe-core/src/process/inventory.rs
shared/fixtures/process-lifecycle/inventory-v1.json
macos/Tests/LitheExecutionModuleTests/ExecutionModuleTests.swift
macos/Tests/LitheTests/MacProcessRunnerTests.swift
macos/Tests/LitheTests/ProcessLifecycleFixtureTests.swift
macos/Sources/Lithe/Application/Features/ProcessExitCoordinator.swift
macos/Sources/Lithe/Application/Features/WorkspaceSessionCoordinator.swift
rust/lithe-core/src/process/lifecycle.rs
shared/fixtures/process-lifecycle/exit-plan-v1.json
部分实现
待验证
证据路径
windows/tauri/src-tauri/src/main.rs
windows/tauri/src-tauri/src/run.rs
windows/tauri/src-tauri/src/debug.rs
windows/tauri/src-tauri/src/owned_processes.rs
rust/lithe-git-host/src/lib.rs
rust/lithe-git-host/tests/process.rs
rust/lithe-core/src/lsp/interface/process.rs
rust/lithe-core/src/process/lifecycle.rs
windows/tauri/src/features/window/components/window-close-guard.tsx
windows/tauri/src/features/window/services/run-services-exit.ts
windows/tauri/src/features/window/services/run-services-exit.test.ts
windows/tauri/src/features/settings/stores/update.store.ts
Run运行一个长驻服务(如 Spring Boot)、一个 setsid 脱离的后台进程和一个忽略终止信号的程序,分别通过菜单退出、更新重启和对主进程 kill -9 关闭 IDE,确认除用户选择保留的项目外,带本实例 LITHE_PROCESS_SCOPE 的进程全部退出、端口已释放;主进程和监护进程同时被结束后再次启动,确认残留进程出现在启动清扫确认中。 Windows Run 原生测试按父 PID 和 ping.exe 名称唯一识别夹具后代,覆盖快照乱序、大小写、缺失和歧义;停止前持有该后代进程句柄,以两秒退出信号确认根进程和后代结束,以零等待确认另一窗口仍在运行;cmd 禁用 AutoRun,首字节就绪等待有界,夹具在断言失败时也清理所属进程树。
macOS 用 LITHE_PROCESS_SCOPE 标记本实例启动的进程,退出时做最终清扫;崩溃由随应用启动的监护进程兜底(Agent 任务和后台服务留到下次启动再确认)。分类规则在 Rust Core(processLifecycle.inventory),Windows 可直接复用。两端在关闭项目或窗口、退出、安装更新前按 Rust Core 的 runServicesOnExit 规则列出运行服务并询问(可设为直接停止)。Windows 的运行会话、调试适配器和语言服务器放在 Job Object 中,停止和 IDE 崩溃时都按整组结束;菜单退出走窗口关闭守卫,更新安装前先停止运行服务。Windows 终端和 Agent 进程树尚未放入 Job Object,也没有监护进程和启动清扫,IDE 崩溃时它们仍可能残留。
运行与调试 / 运行配置保存前同步与工具链解析
run-save-toolchain
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Run
macos/Sources/Lithe/Services/Java
macos/Tests/LitheExecutionModuleTests/ExecutionModuleTests.swift
rust/lithe-core/src/execution/configuration.rs
macos/Sources/LitheExecutionModule/Services/RunService.swift
macos/Sources/LitheLanguageIntelligenceModule/Services/LanguageToolingSessionManager.swift
macos/Tests/LitheLanguageIntelligenceModuleTests/LanguageIntelligenceModuleTests.swift
rust/lithe-core/src/lsp/interface/engine_real_jdt_tests.rs
rust/lithe-core/src/execution/environment.rs
shared/fixtures/execution/launch-environment-v1.json
已实现
待验证
证据路径
windows/tauri/src/features/run
windows/tauri/src/features/maven
rust/lithe-core/src/execution/configuration.rs
windows/tauri/src/features/run/stores/run-prelaunch.test.ts
windows/tauri/src-tauri/src/run.rs
windows/tauri/src/platform/lsp-core-adapter.ts
windows/tauri/src/platform/lsp-core-adapter.test.ts
rust/lithe-core/src/lsp/interface/engine_real_jdt_tests.rs
rust/lithe-core/src/execution/environment.rs
shared/fixtures/execution/launch-environment-v1.json
Run修改未保存文件后运行,验证同步、JDK/Maven 选择和版本不匹配诊断;Maven Java Main 与 Spring Boot 直启在 JDT 构建后、JVM 启动前执行 Maven 原生资源处理,覆盖模块依赖、Profile、settings、测试资源和自定义 cwd;资源处理失败或超过十分钟期限不得启动 JVM,超时提示“Pre-launch step timed out after 600 seconds.”。 Issue #379:分别从 Run 面板和编辑器启动 Maven 主源码及测试源码中的 main(含默认包 MainTests、自定义源码/测试输出目录、test scope 依赖与多模块),确认 JDT 自动选择 classpath/module-path,测试入口包含测试输出和依赖,主源码入口排除测试输出;Run、Debug 与服务更新路径校验采用相同的自动 scope。 运行配置与工具链完成解析后才发布快照就绪状态;重叠加载不得保存临时 Current File 选择,已完成加载后的用户选择须保留。 打开运行配置编辑对话框,确认标题栏显示运行时图标、类型与生效来源胶囊,保存范围和 Maven 测试项使用共享分段控件,项目环境入口整行可点击;保存范围、继承/覆盖说明和环境变量格式默认收进 ⓘ,路径输入、环境变量编辑器以及保存/取消按钮与设置页样式一致;窄窗口下内容仍可滚动且底部按钮可见。 项目 JDK 为 8、Maven JDK 为 21 时,Maven goal 和资源前置步骤使用 21,Java 主程序使用 8;显式 JAVA_HOME 优先于选择,Windows 不同大小写环境键不产生冲突。 Windows 并发保存运行配置、生成配置及 Maven 配置时,读取快照、写入和回滚由同一事务锁保护;失败任务不能恢复掉另一个已完成任务的新值。
搜索 / 搜索与导航全局命令与设置搜索
search-global
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Search
macos/Tests/LitheTests/SearchEverywhereAppearanceTests.swift
.agents/notes/implemented/simplification/2026-09-30-macos-shared-dropdown-style.md
macos/Sources/Lithe/Views/Components/LitheCenteredPopup.swift
macos/Tests/LitheTests/SearchEverywhereBehaviorTests.swift
rust/lithe-core/src/project/name_matching.rs
shared/fixtures/search/name-matching.json
shared/fixtures/search/exclusions.json
rust/lithe-core/src/project/search_index.rs
macos/Sources/Lithe/Application/Features/DocumentFeatureModel.swift
shared/fixtures/search/path-fallback.json
macos/Sources/LitheSearchModule/Application/SearchFeatureModel.swift
shared/fixtures/search/unicode-contiguous.json
macos/Sources/Lithe/Views/Components/LitheSplitPaneView.swift
macos/Tests/LitheTests/LitheSplitPaneCollapseTests.swift
rust/lithe-core/src/project/files.rs
macos/Sources/Lithe/Core/Rust/RustWorkspaceOperations.swift
macos/Tests/LitheSearchModuleTests/SearchModuleTests.swift
rust/lithe-core/src/project/search_paging.rs
macos/Sources/Lithe/Views/Components/LitheScrollLoadTrigger.swift
已实现
待验证
证据路径
windows/tauri/src/features/global-search
windows/tauri/src/features/command-palette
rust/lithe-core/src/project/search_index.rs
Search使用快捷键搜索命令、设置和工作区内容,确认结果来源和跳转行为。 macOS 双 Shift 打开 Search Everywhere,按 Community Islands 源码核对普通字重的圆角分类选中框、统一弹窗背景、内嵌圆角搜索框及 IDEA 明暗搜索/筛选/关闭图标;在深浅主题与窄窗口检查外框裁剪、搜索框不越界、输入焦点与中文组词,切换分类、清除、筛选、Esc、点击外部及执行命令保持原行为。 搜索弹窗使用独立无边框 NSPanel 和系统 NORMAL 阴影,不绘制 SwiftUI 模糊投影;父窗口移动/缩放后仍居中于顶部指定位置,点击外部与失焦关闭,筛选子菜单获焦时搜索保留;关闭与重新打开均无残留子窗口。 空查询只显示分类与搜索框,输入后展开、清空后收起;原生窗口使用 sRGB backing store,顶部分类复用共享标签聚焦/失焦状态,并从面板自身读取 controlActiveState,父窗口失焦不将活动分类错误画灰。 打开后无需点击即可直接输入首个字符;搜索进行中在输入框右侧、命令提示之前显示加载指示器,分类栏不重复显示;完成后加载指示器消失,输入后命令提示仍保留。 使用同一工作区输入 name,确认 .build/checkouts/Name.swift、rust/target 中的名称及 NativeMenu/navigation-menu 的分段命中;文件名范围来自 Core 的 UTF-16 nameMatchRanges,选中行高亮,名称先排序再按来源截断。漏斗只筛选已实现的 Classes/Files/Symbols/Actions,All/None/Invert 生效,All 包含动作;单独标签不受 All 来源筛选影响。预览按钮开启后,单击/上下键选中文件更新独立只读 Monaco,不能输入、格式化或重命名;回车/双击仍打开,关闭预览不改变主编辑器可写状态或未保存内容。生成目录名称更新沿用索引刷新;未覆盖 IDEA 的外部库、语言服务全量符号、历史/机器学习排序。 点击只读预览后结果行仍为活动焦点色;鼠标选择文件保持列表滚动偏移和面板位置/尺寸不变,上下键仅在必要时滚动显示选中项,不强制居中。 新查询或切换来源仍恢复首项可见。 在深浅主题与宽窄窗口按住顶部空白区拖向右下,确认窗口实际位置改变(原生命中区域须填满标题栏高度),输入展开、预览切换和父窗缩放后保持拖动位置,重开恢复默认;标签/输入/按钮不被拖动区域抢占。筛选行按名称排序,使用原始 IDEA 明暗复选框与共享行悬停/选中,固定底部 72×28 All/None/Invert 按钮,200pt 最小高度、共享弹层外框;连续勾选和批量操作不关闭菜单。 筛选内容背景沿 Islands Table/Panel 继承 tool-window-bg(深/浅 #191A1C/#FFFFFF),共享原生下拉面板使用 sRGB;复选框保留 24pt viewBox 自带边距,不叠加普通菜单图标的水平内边距。 筛选行 hover 是共享失焦灰,点击才保留主体蓝,移动到另一行同时保留蓝色选中行与灰色 hover 行,hover 不改变勾选。批量按钮上方使用滚动列表的 1pt 内侧矩形底边(Borders.color,深/浅 #26282C/#D1D3D9),不使用系统 Divider。 关闭时按来源保存非空查询,会话内每来源去重保留 50 条,All 重开恢复最后草稿并全选(包括空草稿);清空关闭后重开必须为空,不从非空历史回填,项目 reset 清除历史,侧栏查询保持独立。输入框清除按钮使用 16pt 槽位。结果文件名复用 Git 文件状态前景色,选中匹配片段保留金底黑字;被 Git 忽略的文件由 Core 批量 check-ignore 获取真实规则,包含 info/exclude、否定规则和已跟踪文件例外,按 Islands Dark/Light 的 #D69A6B/#8C4F00 着色;Git 不可用时保留未知,不按目录名猜测。右上角设置左侧的搜索图标与双 Shift 调用同一动作,提示快捷键,无工作区时禁用;浅深主题和宽窄窗口核对位置、hover 和点击。Windows 仅兼容可选 isIgnored 字段,ignored 前景色与此工具栏入口尚未同步。 打开搜索时激活并刷新惰性 Git 模块,将已归一化的 GitTreeStatusProjection 发布到当前搜索会话,未打开 Commit 也能得到未跟踪/修改状态色;工作区切换或关闭后不回写旧快照。 顶栏搜索使用 Community 原始 search@20x20 明暗 SVG,不放大 16pt 图标;与设置同用 LitheMainToolbarButtonStyle,放入 spacing=0 的同组工具栏,移除外层 9pt 间距和侧栏 37pt 槽位差异。 关闭搜索释放干净的暂存预览并撤销未完成打开;有未保存输入则保留为正式文档,项目替换仍显示时由替换面板继续持有并负责清理。 Text 预览沿用当前大小写/整词/正则选项,名称预览保持默认;生成名称索引扫描和增量更新均排除嵌套 linked worktree。 审核修复:Problems 与搜索共用或分别预览时,关闭搜索只释放搜索使用权,最后使用方退出才清理;待加载共享请求亦同。Text 只读预览用实际 Monaco nativeFind 显示大小写/整词/正则匹配而不抢焦点。搜索使用用户指定 Git且保持非交互。macOS 双 Shift 漏斗面板可编辑、应用并持久保存仅此窗口生效的排除表达式(*.log、**/.*/、.*、cache/),通用设置入口移除,侧栏搜索、项目替换和 Agent 补全不受影响;树与监听不隐藏;清空应用后重开仍为空并恢复范围,不同规则缓存随文件修改同步。Windows 共享 Rust 换行文件名仅 Unix 创建,保留全平台空格文件名测试;Windows 设置 UI 未同步。 全局搜索显式启用生成目录名称,Agent 的空 @ 与 @Name 都只用项目可见性,不受 *.log 搜索排除影响。cache/ 与 **/.*/ 必须在进入目录前剪枝,真实枚举探针不记录这些目录;直接上报排除后代的增量事件也不回填。连续修改排除规则只使搜索缓存失效,不重建项目树;失效屏障不被后续更新跳过,每根目录最多一个内容及一个名称缓存,旧分配在请求完成后释放;覆盖 32 次切换和更新。 排除规则改为漏斗列表首项(Actions 上方),与来源行共用复选框和 hover/点击样式,右侧原始 16pt 编辑图标打开由搜索窗口持有的独立编辑弹窗;漏斗不再内嵌文本框。应用按钮使用主题主色,应用保存并关闭、取消/Escape 丢弃未保存草稿但不关闭搜索;多行 Enter 换行。勾选开关独立记忆,取消勾选不删除规则,编辑已禁用规则不重新启用,重新勾选刷新当前搜索;来源批量按钮不改此开关。覆盖保存、取消、清空、关闭重开及禁用后重新启用,侧栏/替换/Agent 范围继续不受影响。 排除规则右侧编辑按钮按 Community ActionButton 小动作规格使用原始 16pt 明暗 edit.svg、22pt 点击和 hover 区、四边各 3pt 留白及 4pt 圆角,采用专用 ActionButton hover/pressed 主题色而非通用按钮底色;默认箭头光标,不影响行勾选。深浅主题检查普通、hover、按下、移出恢复及点击打开弹窗。 规则编辑输入框打开即获得原生焦点,点击弹窗空白保留光标/选区;复用共享多行输入框的单一外部焦点绑定与 2pt 焦点描边/向外 1pt 扩展,不能重复绑定导致焦点色或宽度脱节。深浅主题检查真实 firstResponder、空白点击不丢选区及两列边框像素,取消/应用和 Tab 导航仍可用。 排除规则行的灰色悬停和蓝色选中背景覆盖右侧编辑按钮区域,与来源行右边缘对齐;编辑按钮独立悬停,点击只编辑、不切换规则开关。 名称索引遇到不可访问或消失的后代目录时保留正常源码和 Text 结果,根目录错误及取消仍传播;搜索预览连续切换 A/B/C、清空结果或收起时按路径和请求标识释放旧持有,保留其他面板及未保存内容,旧请求晚返回不得误清新请求。 核对 src/Foo/src/Foo.swift 的路径回退以及 Agent @src 候选,文件名命中排在目录回退之前,路径命中不绘制文件名片段;Actions-only 不发送工作区请求,Text-only 不构建生成名称索引,Files-only 不构建正文索引,All 切换来源会重查并丢弃过期来源响应。2000 个生成文件冷索引回归核对构建种类、目录访问及驻留文件数。预览开启后单击只选择,辅助功能默认 Open、命名 Open 与 Return 可打开文件;VoiceOver 实机状态单独验收。 Unicode 名称连续匹配保持整串小写语义:i、i 加组合点及组合点本身均命中 İ.txt;补充非 BMP 前缀与希腊 sigma 回归,并核对原始 UTF-16 范围。 #1564:macOS 开启预览,在深浅主题下分别返回 199 和 200 条文件结果;列表大批结果到达后,文件列表与预览仍各在自己的面板内、互不重叠,鼠标选择、键盘滚动与 Return 打开保持有效;共享分隔容器覆盖横纵布局的空、单项及多项面板。 #1564 增量搜索:macOS 文件名候选先于正文/符号索引发布,首批立即发送,后续约100ms替换快照刷新并在来源结束flush;最终结果保留排名、上限及Git忽略状态。真实Rust桥接、取消、旧查询晚返回、reset及突发批次最终结果回归;深浅主题40/199/200条结果追加高排名候选后选择、预览与滚动保持稳定。输入防抖仍180ms,冷名称枚举及失效屏障仍需完成;Text随最终结果返回。Windows仍等待最终响应,未宣称流式展示验收。 #1564 自动分页:删除更多提示及每来源200条总上限,每来源50条、接近底部自动续查;首屏仍流式,后续整页去重追加并保持已加载页和动作顺序。深浅主题实际滚动加载257文件,保持非零像素偏移、选择和预览;Core四来源超过200、整页/空页耗尽、错误/跨查询游标拒绝。模块覆盖失败暂停、显式Retry、重复游标/无新增停止;取消与过期响应仍隔离。名称/符号每页扫描已有索引,只保留51个候选;实时索引游标前新增项需重查。Windows保留旧最终响应,未同步自动分页。 默认选择与主动选择分开:未进行鼠标/键盘导航时,Actions先到或首屏更优候选后到,预览和Enter跟随当前首项;主动选择后仍按ID保持,所选项消失才退回默认首项。原生窗口回归覆盖两种到达顺序并保留主动选择重排用例。 #1624:macOS 查询不等待内容预热;Core 名称和正文构建独立,Text 冷查询按文件清单匹配当前页。原生拖动右下角可缩放,左上角与输入不跳;Text 代码主行、路径次行。覆盖深浅主题、窄窗口、查询清空恢复、索引失效和取消;Windows 共享 Core 查询改善,原生缩放与两行呈现未同步,真实大项目延迟仍需验收。
搜索 / 搜索与导航项目范围文本搜索
search-project
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Search
macos/Sources/Lithe/Services/Language
macos/Sources/Lithe/Theme/LitheTheme.swift
macos/Tests/LitheTests/LitheSearchFieldStyleTests.swift
macos/Sources/Lithe/Views/Workspace/ProjectSidebarView.swift
macos/Sources/Lithe/Models/AppModel/AppModel+SearchModule.swift
已实现
待验证
证据路径
windows/tauri/src/features/file-search
Search使用同一项目和查询 fixture 对比命中路径、行号、列号和结果排序;在 macOS 深浅主题检查搜索框输入、焦点与失焦、工具按钮及文件类型图标;点击侧栏 Search 时第一个输入框不自动获得焦点,使用 Cmd+Shift+F 时仍获得焦点。 Search 查询与文件掩码、Database 连接搜索、Redis Key pattern 和 Nacos 配置/服务搜索均直接使用 Git Log 同源的全局唯一 LitheSearchFieldStyle;在深浅主题核对 36pt 外框、30pt 可见高度、4pt 圆角、1pt 常态边框、2pt 聚焦边框、3pt 外留白及 13pt 常规文字和提示色,确认无局部背景或原生边框叠加,并保留搜索、清除与键盘提交行为。 使用原生 NSHostingView 渲染验证共享 LitheSearchTextField 的占位文字在深浅主题均为 IDEA Component.infoForeground 对应的 #73767C、13pt 常规字重;空输入框单独绘制占位文字,避免 SwiftUI 原生 prompt 替换其颜色与字重,有内容时占位文字消失并保留原生编辑和主文字色。 中文输入法组词期间,即使绑定文本仍为空,共享 LitheSearchTextField 占位文字立即隐藏;取消组词或删空后恢复,确认中文后仍隐藏。原生 setMarkedText 回归覆盖明暗主题和两个输入框互不影响;保留焦点、键盘提交、搜索/过滤语义及占位字号颜色。原生背景观察视图卸载和移出窗口时清理通知,匹配当前窗口的字段编辑器及所属输入区域,不修改业务绑定。 共享搜索字段未聚焦时悬停立即显示文本编辑光标,离开或禁用时恢复箭头;保留中文组词、焦点及键盘动作。 macOS 项目树文件、目录、项目根和多选右键菜单均显示 Find in Files,调用已有项目范围搜索并聚焦查询框;验证编辑器选中文字预填与现有搜索规则。该菜单入口沿用整个项目范围。
搜索 / 搜索与导航快速打开文件与符号
search-quick-open
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Search
macos/Sources/Lithe/Views/Workbench
已实现
待验证
证据路径
windows/tauri/src/features/quick-open
windows/tauri/src/features/quick-open/hooks/use-file-search.test.tsx
windows/tauri/src/features/quick-open/hooks/use-file-loader.test.tsx
Search使用文件名、路径和符号查询,确认排序、键盘导航和打开位置。 Windows 搜索当前已打开的 independent-commit-diff.ts,使用完整名称、去掉连字符的名称和路径,确认结果可打开当前文件;空查询不重复显示当前文件。输入期间不重新扫描目录,重开后新建或删除文件更新;切换工作区后迟到结果不覆盖新列表。
搜索 / 搜索与导航项目替换与取消
search-replace
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Search
macos/Sources/Lithe/Services/Language
macos/Sources/Lithe/Views/Workspace/ProjectSidebarView.swift
macos/Sources/Lithe/Models/AppModel/AppModel+SearchModule.swift
已实现
待验证
证据路径
windows/tauri/src/features/file-search
Search执行替换预览、确认替换和取消操作,确认未保存文件与异常文件不会被静默覆盖。 macOS 项目树文件、目录、项目根和多选右键菜单均显示 Replace in Files,打开已有项目范围替换面板;验证查询预填、预览、确认与取消流程,菜单点击本身不写入文件。该菜单入口沿用整个项目范围。
工作台 / 外观普通文字动作按钮采用欢迎页完整几何与间距:28高、4圆角、14水平留白、72最小宽、内容自适应且无固定最大宽、相邻间距6;主操作使用独立标准实蓝及无外框焦点提示;原生声明式插件动作复用同一入口,实验包fill提示不再改变文字按钮宽度,动作组空间不足时纵排
shared-action-button-style
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Components/LitheActionButtonStyle.swift
macos/Sources/Lithe/Theme/LitheTheme.swift
macos/Sources/Lithe/Views/Editor/GoToLineDialog.swift
macos/Tests/LitheTests/CommitActionButtonStyleTests.swift
macos/Sources/Lithe/Views/Run/JavaLaunchDecisionDialog.swift
macos/Tests/LitheTests/RunEntryPointTests.swift
macos/Sources/Lithe/Views/App/PluginDetailView.swift
macos/Tests/LitheTests/PluginDetailLayoutTests.swift
macos/Sources/Lithe/Views/Workbench/PluginNativeToolWindowView.swift
macos/Tests/LitheTests/PluginNativeUITests.swift
部分实现
待验证
证据路径
windows/tauri/src/ui/button.tsx
windows/tauri/src/styles/theme.css
Workbench分别在macOS和Windows深浅主题检查Welcome、设置、插件管理、Git提交/推送/工作树、数据库和运行/调试表单的普通及主操作按钮;核对悬停、按下、禁用、加载、长中文文案、紧凑布局、Tab和Return/Esc,无点击焦点外框;确认列表选择、输入焦点、复选框及运行/停止颜色不变。Go To Line 输入无效值时OK禁用,Return不跳转,Esc取消。 检查短文案最小宽72、长中文/英文按钮随内容增长且不省略,水平留白14、可见边缘间距6;确认/取消组在窄窗口换行并保持完整内边距;选择器、标签和图标按钮不被扩大成文字按钮。 Java构建失败窗口在英文及中文、带/不带重建索引动作时所有按钮完整位于内容区;设置页短文案按钮最小宽72;插件安装确认两个按钮采用共享样式、间距6,Return仍取消。 提交区使用父分隔容器默认/最小高度,在宽→窄→宽过程中核对输入区至少50pt、纵排按钮完整位于分配范围且不重叠;Search Everywhere过滤弹窗宽238pt并保留批量按钮和勾选状态。 插件详情中英文、深浅主题、长版本号及多个操作在最小设置窗口可用宽度和160pt详情下限均不越界,更新动作可用;核对共享样式及已有外层指针的后代所有权和页面关闭手形的环境开关,实际悬停/退出仍需产品交互验收。 提交区在无结果195pt/有失败结果285pt父面板高度、输入区至少50pt和页脚完整边界。 检查#1503工作树动作自然宽度、6pt间距、宽窄换行、主工作区禁用色;聚焦父区域及鼠标悬停时边框按钮无文字下划线,Tab仍可定位操作。
普通文字按钮以 macOS Welcome 的28高、4圆角、13常规字、14水平留白、72最小宽为准;普通文字动作取消紧凑/额外焦点留白/局部宽度覆盖,横竖相邻间距6,不设固定最大宽且按文案自然增长;图标/链接/菜单/选择器保留各自形态。主操作常态#2D62CC、hover#2453B3、按下#1D4699,不改变全局主题accent/primary;危险操作保留红色语义。组件检查不替代完整产品及Windows实机验收。 本次仅交付macOS;Windows保留原有按钮组件,尚未同步本条完整标准。 提交区默认/最小195pt预算同时覆盖Amend换行和底部按钮纵排,输入区至少50pt,不通过拖动中的测量状态更新父页面。 共享样式恢复手形反馈并避免外层指针重复压栈;插件详情组内支持纵排,极长版本使用紧凑更新文案并保留提示/无障碍版本值。macOS 13 Tab焦点外圈尚未实机验证。 提交结果的清除/查看重试动作纳入原有90pt结果滚动区,避免共享按钮尺寸挤压输入区和页脚。 #1503:带边框动作不再用父区域焦点绘制文字下划线,恢复平台按钮键盘焦点反馈;纯文字链接的悬停下划线不变。
设置 / 语言与本地化共享内置翻译完整来源:macOS 全部原生字符串表、Windows 全部产品字典及页面内双语文案构建时生成,语言清单驱动选项、回退和打包,保留平台措辞、原生 ABI 与已有设置标识
shared-i18n
已实现
待验证
证据路径
shared/i18n
scripts/i18n/generate-i18n.mjs
scripts/macos/package/package-macos-localizations.sh
macos/Sources/Lithe/Models/Settings/AppLanguage.generated.swift
macos/Tests/LitheTests/SharedI18nTests.swift
macos/Tests/LitheTests/LocalizationPackagingTests.swift
macos/Sources/LitheModuleAPI/Localization/InterfaceLanguage.swift
scripts/i18n/verify-app-language-localization.mjs
已实现
待验证
证据路径
shared/i18n
windows/tauri/src/i18n/locale.ts
windows/tauri/src/i18n/shared.generated.ts
windows/tauri/src/i18n/shared-i18n.test.ts
windows/tauri/src/features/settings/components/settings-panels.tsx
Settings运行 node scripts/i18n/generate-i18n.mjs --check 与 node --test --test-timeout=60000 scripts/i18n/test-i18n.mjs,验证重复 key、参数、覆盖率、平台范围与过期输出拒绝;临时增加 ja-JP,确认生成语言选项、Swift 枚举和原生打包列表并按显式链回退。macOS 运行 SharedI18nTests、AppLocalizationTests、LocalizationPackagingTests,检查语义 key 与旧 key、原生格式化和打包源字节不变;运行 verify-runtime-bundle-immutability.sh。两端真实产品切换中英文,检查通用操作、语言设置、文件数量、Finder/File Explorer 文案、其他模块页面与关闭重开后的语言;默认值与保存标识保持。Windows 在 WebView2 实机验收,前端自动化不替代原生检查。 另在系统语言与应用语言不一致时(如系统中文、应用英文,反之亦然)检查设置窗口标题、错误提示、弹窗和 Java 调试页,确认均按应用语言显示;运行 node scripts/i18n/verify-app-language-localization.mjs。
全部自有语言资源已迁入shared/i18n,删除Windows旧字典并迁出95处原生页面双语表达式。未把上游消息、用户内容或搜索同义词当作翻译改写;原先缺译的文案保留英文回退,无运行时语言包。 本地证据:macOS原生资源与日志页中英文深浅渲染通过;Windows VM生成器、53项前端回归、完整类型检查与生产前端构建通过。全工作台手工巡检及Windows原生安装包尚未验证,故整机verificationStatus仍为pending。 已同步preview 3a8e94d08新增的293条原生词条与122条Windows词条(含Hook字典),共享源共9078条;原生en 2174条、zh-Hans 3926条和Windows每语言5089条基线逐项比对一致。 视图之外的 macOS 文案(错误、弹窗、状态)统一经 L10n.string 按应用语言取词,不再随系统语言;verify-app-language-localization.mjs 拒绝裸 String(localized:)、缺词条的 key 与 errorDescription/NSAlert 裸英文,并要求 SwiftUI 文案字面量在共享词条中存在(Issue #1494)。系统语言与应用语言不一致的真实界面尚未逐页验收。
Java / Spring / MyBatisSpring HTTP 接口筛选与源码跳转
spring-endpoints-search
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Run/SpringEndpointsView.swift
macos/Sources/Lithe/Application/Features/SpringFeatureModel.swift
已实现
待验证
证据路径
windows/tauri/src/features/spring/components/spring-endpoints-pane.tsx
windows/tauri/src/features/spring/hooks/use-spring-index.ts
windows/tauri/src/features/spring/hooks/use-spring-index.test.tsx
windows/tauri/src/features/keymaps/commands/view-command-actions.ts
Java / Spring在两端打开 Spring fixture,按路由、控制器、方法名和 HTTP 方法筛选,再点击接口核对源码行列;Windows 使用命令面板打开 Spring Endpoints,验证同项目刷新和失败保留结果、源码目录重命名或删除、全量重扫、扫描中切换或关闭项目、窄面板方法集合截断及超过 200 个接口的滚动与跳转。
Java / Spring / MyBatisSpring 配置、Bean 与 Endpoint 索引
spring-index
已实现
待验证
证据路径
macos/Sources/Lithe/Application/Features
macos/Sources/Lithe/Views/Run
shared/fixtures/spring
rust/lithe-core/src/languages/spring.rs
已实现
待验证
证据路径
windows/tauri/src/features/spring
windows/tauri/src/features/quick-open
shared/fixtures/spring
windows/tauri/src/features/spring/hooks/use-spring-index.ts
windows/tauri/src/features/spring/hooks/use-spring-index.test.tsx
windows/tauri/src/features/spring/utils/spring-property-completion.ts
windows/tauri/src/features/spring/utils/spring-property-completion.test.ts
windows/tauri/src/features/editor/engines/monaco/lsp-providers.ts
rust/lithe-core/src/languages/spring.rs
.github/workflows/ci-windows.yml
Java / Spring使用 Spring fixture 对比配置、Bean、Endpoint 索引、刷新和失效处理。 Windows配置补全:打开Java/Spring项目的application.properties及profile配置,验证依赖属性补全、前缀替换、持续编辑与Java导入完成后的元数据刷新;注释、值、续行及其他项目不得提供错误建议。 Windows Quick Open:双击 Shift 后输入接口路由、控制器或处理方法,确认接口结果与文件结果共用键盘导航,回车打开控制器并定位到注解行;输入 @ 或 # 时不混入接口结果。 Windows实际 Spring hook 回归以真实 LSP store 的 serviceReady 触发依赖元数据刷新,兼容 fullyReady 且同一 ready 阶段不重复刷新;覆盖恢复后的重新就绪、其他/已退役工作区和真实订阅卸载,使用手动调度而非计时等待。 资源边界:持续编辑时同一工作区只允许一个 Spring 索引在途,期间的触发合并为一次补充刷新;切换工作区或卸载会取消在途 Core 请求;并发请求共享同一次依赖仓库扫描,取消或超时能在扫描途中释放工作线程。
Windows通过既有Core Spring索引提供Monaco配置键补全,保留元数据仓库并在JDT导入完成后刷新。Quick Open 直接筛选同一份Endpoint索引,按路由精确/前缀/包含、控制器或处理方法排序,不新增注解解析器;索引未就绪时文件搜索仍可用。Core 对同一依赖仓库的元数据扫描做 single-flight,并在工作区源码与归档扫描中响应协作式取消,避免持续编辑产生多份并发全量索引。此能力不修复资源复制到target/classes的新鲜度。
Java / Spring / MyBatisSpring 符号导航与代码关联
spring-navigation
已实现
待验证
证据路径
macos/Sources/Lithe/Application/Features
macos/Sources/Lithe/Views/Language
已实现
待验证
证据路径
windows/tauri/src/features/spring
Java / Spring从 Bean、配置和 Endpoint 结果跳转到源代码并返回,确认行列号一致。
工作台 / 终端macOS 终端 Metal 画布按预乘语义清屏:无壁纸时画布自身承载不透明编辑器底色,有壁纸时清屏为透明 (0,0,0,0) 由壁纸透出;OSC 11 应答与画布清屏色一致(无壁纸报告编辑器底色,有壁纸报告黑色);已打开终端随 Color theme 变化刷新背景和前景及 OSC 11/10 应答;背景变化时仅向订阅 kitty DEC mode 2031 的终端应用推送 OSC 11 与 DSR 997,997;1n 报暗、997;2n 报亮
terminal-canvas-compositing
已实现
待验证
证据路径
macos/Sources/Lithe/Platform/MacOS/Terminal/MacTerminalTransport.swift
macos/Sources/Lithe/Views/Terminal/TerminalSurfaceView.swift
macos/Tests/LitheTests/TerminalInputFocusTests.swift
macos/Tests/LitheTests/MacTerminalBackgroundReportingTests.swift
平台专属
不适用
证据路径
windows/tauri/src/features/terminal
Terminal无壁纸时分别使用 Dark+Lithe、Dark+Codex、Dark+Linear,在同一已打开终端切换 Color theme 后查询 OSC 11,确认分别报告 rgb:1919/1a1a/1c1c、rgb:1111/1111/1111、rgb:0f0f/0f0f/1111;Light 模式分别查询 OSC 11 和 OSC 10,确认 Lithe 与 Codex 的 OSC 11 都为白色、Linear 为 rgb:fcfc/fcfc/fdfd,OSC 10 可区分 Lithe rgb:1f3b/2312/2937、Codex rgb:0d0d/0d0d/0d0d、Linear rgb:1b1b/1b1b/1b1b。Dark OSC 10 前景依次应为 Lithe rgb:dfff/e1c9/e5e2、Codex rgb:fcfc/fcfc/fcfc、Linear rgb:e3e3/e4e4/e6e6。切换主题后 shell PID 不变;开启壁纸后确认壁纸透出、字缘干净且 OSC 11 报告 rgb:0000/0000/0000。明暗切换或开关壁纸时,仅已运行且订阅 kitty DEC mode 2031 的 TUI(如 oh-my-pi)应收到背景变化通知并无需重启即跟随重查;未订阅的 zsh/cat 切换时不得收到回显字节;验证订阅、退订、跨输出块切分及终端 RIS 重置;DSR 997 暗色发送 997;1n、亮色发送 997;2n。亮色主题下同时确认字缘无白色小框、正文不发浅。SwiftTerm 1.15 的 nativeBackgroundColor 同时用作 Metal 清屏色与 OSC 11 应答值且无法拆分,因此有壁纸时按既有取舍报告黑色;有壁纸时 COLORFGBG 导出深色 15;0,与 OSC 11 黑色应答和 DSR 997;1n 同源一致;若上游改为预乘清屏可恢复报告编辑器底色。
工作台 / 终端Windows 终端在有选中内容时用 Ctrl+C 复制,无选中时仍然中断运行中的命令
terminal-copy-shortcut
平台专属
不适用
证据路径
macos/Sources/Lithe/Platform/MacOS/Terminal/MacTerminalTransport.swift
已实现
待验证
证据路径
windows/tauri/src/features/terminal/utils/terminal-keyboard.ts
windows/tauri/src/features/terminal/utils/terminal-keyboard.test.ts
windows/tauri/src/features/terminal/components/terminal.tsx
Terminal仅在 Windows 生效。终端里选中一段输出后按 Ctrl+C,确认复制到剪贴板且不向程序发送 0x03;不选中任何内容时按 Ctrl+C,确认运行中的命令被中断(例如一个持续输出的循环),说明 SIGINT 未被拦截。Ctrl+Shift+C 在两种情况下都应仍可复制。核对本项不影响已有的终端复制粘贴、搜索和拖放路径。macOS 不使用该绑定:复制走系统 Cmd+C,由 SwiftTerm 与系统菜单处理,因此该平台标记为平台专属。真实 Windows 产品交互验收 pending。
工作台 / 终端终端向 TUI 程序传递带修饰键的按键(如 Shift+Enter 换行)
terminal-extended-keyboard
已实现
待验证
证据路径
Package.swift
macos/Sources/Lithe/Platform/MacOS/Terminal/MacTerminalTransport.swift
已实现
待验证
证据路径
windows/tauri/src/features/terminal/utils/terminal-keyboard.ts
windows/tauri/src/features/terminal/utils/terminal-keyboard.test.ts
windows/tauri/src/features/terminal/utils/terminal-keyboard-protocol.ts
windows/tauri/src/features/terminal/utils/terminal-keyboard-protocol.test.ts
windows/tauri/src/features/terminal/hooks/use-terminal-connection.ts
windows/tauri/src-tauri/build.rs
scripts/windows/prepare/prepare-conpty.ps1
third_party/conpty/manifest.json
windows/tauri/src-tauri/tauri.jdtls.conf.json
Terminal在运行 kimi 等 TUI 程序的终端里按 Shift+Enter,确认插入换行而不是提交;Ctrl+Enter、Alt+Enter 同样在程序协商成功后发送 CSI 13;<modifier>u。 键盘协议由 Lithe 在原始输出里回应:程序发 CSI > 7 u 与 CSI ? u 后应收到 CSI ? 1 u,只有收到答复后程序才启用增强按键。对未协商的程序(如 PowerShell、cmd 提示符),Shift+Enter 必须回落到终端自身的回车编码,不能把 [13;2u 当文本打在命令行上。 macOS 由 SwiftTerm 1.15.0 实现该协议,Lithe 不拦截按键。Windows 必须使用随应用分发的 conpty.dll 与 OpenConsole.exe:系统 Windows 10 的 conhost 会丢弃该序列,因此安装目录需要这两个文件,且可执行文件同目录优先于系统宿主。核对卸载或手动删除这两个文件后 Shift+Enter 失效而终端其余功能正常,确认降级不崩溃。 Windows 已完成的部分:dev 实例实测确认 lithe-windows 加载的是构建输出目录下的 conpty.dll(非系统 conhost),同目录的 OpenConsole.exe 以其为宿主拉起 powershell.exe;在该 PowerShell 会话中按 Shift+Enter 行为正常,命令行不再出现 [13;2u 字面量。字节级对照亦确认系统 conhost 收不到 CSI 13;2u 而本组件可收到。 尚未执行因而保持 pending:cmd、Git Bash、WSL 三种 shell 的同类确认,Tab 补全与 Ctrl+C 中断,窗口 resize,超长命令粘贴(7000 字符回退路径),Vim/less 等全屏 TUI,以及删除两个文件后的降级路径。 macOS 侧真实产品交互验收同样 pending。
工作台 / 终端复制粘贴、搜索、调整大小、Control 组合键直达终端及 macOS 终端 Nerd Font 优先选择
terminal-interaction
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Terminal
macos/Sources/Lithe/Platform/MacOS/Terminal/MacTerminalTransport.swift
macos/Tests/LitheTests/BundledUIFontTests.swift
macos/Sources/Lithe/Platform/MacOS/UI/MacBundledFontRegistry.swift
macos/Tests/LitheTests/TerminalPlacementFeatureModelTests.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchToolWindowDock.swift
macos/Tests/LitheTests/WorkbenchSurfaceBackgroundTests.swift
macos/Sources/Lithe/Platform/MacOS/UI/MacShortcutDetector.swift
macos/Tests/LitheTests/TerminalShortcutInputPolicyTests.swift
macos/Sources/Lithe/Views/Workbench/SplitHandleView.swift
macos/Sources/Lithe/Views/Components/LitheSplitPaneView.swift
macos/Tests/LitheTests/GitLogReferenceResizeTests.swift
macos/Tests/LitheTests/SplitHandleHitTestTests.swift
macos/Tests/LitheTests/DiffScrollSynchronizationTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/terminal
windows/tauri/src/features/terminal/hooks/use-terminal-addons.ts
.agents/notes/implemented/simplification/2026-10-08-windows-terminal-direct-web-links.md
windows/tauri/src/features/terminal/utils/terminal-keyboard.ts
windows/tauri/src/features/terminal/utils/terminal-keyboard.test.ts
Terminal验证复制粘贴、终端搜索、调整面板大小和高频输入不丢失。 macOS 安装原有支持列表中的 Nerd Font Mono,使用 Starship pastel-powerline 核对圆弧、Git/Bun 图标和拼接效果;注册打包 UI 字体后终端选择与 12.5pt 字号不变,未安装 Nerd Font 时回退到 Menlo 或系统等宽字体。 安装包必须包含完整 JetBrains Mono Nerd Font Mono 四个字型及许可;在未安装 Nerd Font 的机器上仍能直接显示完整提示符,粗斜体符号与文字使用相同字体度量,发行 bundle 字节不变。 Windows 终端点击识别出的 localhost、127.0.0.1 和 HTTPS 网页链接时直接打开系统默认浏览器,不显示外部链接确认;文件路径继续打开 IDE 文件,浏览器打开失败记录错误。真实 Windows 产品交互验收 pending。 macOS 保留宿主:在明暗主题切换无背景图→有图→无图,真实终端标题栏和正文随之透明/恢复,宿主及输入控件身份保持。隐藏终端后聚焦编辑器,再从活动栏重开已有会话,first responder 回到同一终端输入控件;连续调整面板尺寸和环境值不抢焦点,重开后立即隐藏会取消待交付的激活请求。运行 TerminalPlacementFeatureModelTests.retainedTerminalRestoresFocusAndWallpaperWithoutRecreatingItsSurface,并通过实际应用截图及交互验收。 隐藏保留的工具终端后,从工具会话 B 切到编辑器会话 C,确认工具会话回退到 A 并重新挂载时不请求焦点、窗口 first responder 仍为 C;同步出现任务和延迟原生回调都遵守隐藏祖先检查。重开工具窗口后才显式激活 A,缩放不抢焦点。;macOS 保留宿主圆角需在明暗主题、侧栏顶部与移动后、项目辉光改变、渐变开关及背景图切换时,与原工作台树四角像素一致(WorkbenchSurfaceBackgroundTests.retainedPaneCornersMatchWorkbenchGradient)。 终端持有键盘焦点时,纯 Control 组合键(Ctrl-D 结束输入、Ctrl-R 历史搜索、Ctrl-W 删词)原样交回终端写入 PTY,不再被应用键位的 Debug/Run 截获;带 Command、Shift 或 Option 的组合键仍走应用键位,Ctrl+Shift+F 等项目级命令不受影响(TerminalShortcutInputPolicyTests)。 Windows 聚焦终端或终端搜索框后按 Ctrl+Shift+F,须打开项目搜索而不弹出终端内搜索;Ctrl+F 仍搜索当前终端输出,Ctrl+Alt+F/AltGr 输入及已被其他命令处理的按键不能误开终端搜索。使用 terminal-keyboard.test.ts 验证快捷键边界,WebView2 实机验收保持 pending。 macOS #1542:显示保留的 Git Log/终端时,横纵分隔条中央及两侧偏移 4pt 仍经窗口事件完成拖动且只提交一次,宿主身份不变;根命中查询深度始终为 1,面板内部连续 100 次查询不产生额外根查询,鼠标移动不回查祖先 SwiftUI。验证禁用、收起(含嵌套分隔条)、恢复、卸载、跨窗口与登记表隔离、实时移动/裁剪、隐藏/透明和弱引用释放;保留宿主内部仍正常命中,外层边缘优先。Diff 两端收起后在普通与保留侧栏下均能经窗口拖回,不触发外层拖动。运行 GitLogReferenceResizeTests、SplitHandleHitTestTests 和 DiffScrollSynchronizationTests;旧实现先出现嵌套命中断言失败,新实现通过。较新 macOS 原生组件回归不替代 macOS 13 Intel 原报告崩溃验收,目标环境验证保持 pending。
工作台 / 终端Windows Shell 超长命令输入
terminal-long-command-input
平台专属
不适用
证据路径
macos/Sources/Lithe/Views/Terminal
已实现
待验证
证据路径
windows/tauri/crates/terminal/src/connection.rs
windows/tauri/src-tauri/src/terminal.rs
Terminal在 Windows cmd.exe 和 PowerShell 中执行超过 Shell 单行限制的 IDE 多行命令,确认脚本执行、原始命令内容和终端关闭后的临时文件清理。
仅在 IDE 后端为 cmd.exe/PowerShell 的超长多行文本创建一次性脚本;不修改系统 Shell 配置。
工作台 / 终端macOS 终端 ANSI 配色逐项按与 Lithe 编辑器背景的 WCAG 对比度门控(至少 4.5);通过门控时优先使用 Terminal.app 描述文件颜色,未通过时逐项回退到 Lithe ANSI 配色
terminal-native-palette
已实现
待验证
证据路径
macos/Sources/Lithe/Platform/MacOS/Terminal/MacTerminalTransport.swift
macos/Tests/LitheTests/TerminalInputFocusTests.swift
平台专属
不适用
证据路径
windows/tauri/src/features/terminal
Terminal核对 macOS Terminal.app 默认描述文件的普通文字及 16 个 ANSI 颜色:每个 ANSI 颜色分别根据其与 Lithe 编辑器背景的 WCAG 对比度(至少 4.5)决定是否导入;对比度不足或颜色缺失、无效时,仅该项回退到 Lithe 对应 ANSI 默认值,浅色编辑器背景使用高对比度浅色调色板。背景、字体、字号、光标和选区保持原设置,保留 shell 的粗体与显式真彩色语义,不写入 Terminal.app 或 shell 配置。
工作台 / 终端多会话与标签;macOS 终端标签边缘分屏和工具窗往返保留 PTY;Windows 文件夹右键与全局入口统一在底部终端面板创建会话
terminal-sessions
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Terminal
macos/Sources/LitheTerminalModule/Runtime/TerminalSession.swift
macos/Sources/Lithe/Models/AppModel/AppModel+Terminal.swift
macos/Tests/LitheTerminalModuleTests/TerminalModuleTests.swift
macos/Tests/LitheTests/TerminalPlacementFeatureModelTests.swift
macos/Resources/IDEAIcons/expui/general/chevronDownLarge.svg
macos/Resources/IDEAIcons/expui/general/chevronDownLarge_dark.svg
macos/Sources/Lithe/Views/Editor/EditorGroupContainer.swift
macos/Sources/Lithe/Application/Features/EditorTabOrderFeatureModel.swift
macos/Tests/LitheTests/EditorTabOrderFeatureModelTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/terminal
windows/tauri/src/features/file-explorer/hooks/use-file-explorer-context-menu.tsx
windows/tauri/src/features/terminal/utils/terminal-launch-actions.test.ts
windows/tauri/src/features/terminal/utils/terminal-profiles.test.ts
windows/tauri/src/features/layout/components/bottom-pane/bottom-pane-terminal-lifecycle.test.tsx
Terminal创建多个终端会话并切换、重命名、关闭,确认子进程生命周期和资源清理;macOS 默认标签依次显示 Local、Local (2)、Local (3),从下拉框选择 zsh 后依次显示 zsh、zsh (2),不同 Shell 分别编号;终端与 Git Log 标签悬停有反馈,点击各自区域时选中标签背景显示活动色、点击外部时显示非活动色,文字始终保持相同颜色与常规字重;macOS 终端标题栏的加号、下拉箭头、更多操作和收起图标在明暗主题分别使用 IDEA 的 #6C707E 和 #CED0D6 颜色,按钮动作及悬停效果保持一致;macOS 关闭终端会话直接停止进程,最后一个底部终端关闭后收起面板,编辑区的其他终端会话继续运行;Windows 横向标签栏的新建终端与 Shell 配置按钮紧跟最后一个标签,标签溢出时按钮保持可见;标签栏右侧最小化按钮隐藏终端面板且会话继续运行,重新打开时恢复为停靠状态。 Terminal 失焦通知必须清除标签活动态,包含键盘与程序化切焦。 Windows 隐藏底部终端后,右键含空格的子目录打开终端,确认只创建一个底部会话、工作目录为所选目录、编辑器标签与分栏不变;已有终端时再次从文件夹和工具栏打开,均留在底部面板。自定义 profile 的 Shell 与启动命令继续生效,但文件夹入口显式目录优先于 profile 的启动目录;全局入口仍保留 profile 默认目录。WSL/本地目录相互切换时按最终工作目录选取 Shell;拖动终端到编辑区与拖回底部的既有操作仍可用。 终端全屏后用菜单或快捷键隐藏,再从文件夹或全局入口创建终端,验证监听器保持挂载、面板恢复显示且每次只创建一个会话。 macOS 交互式终端的 shell 自然退出(Ctrl+D 或 exit)后自动关闭标签并重选相邻会话,最后一个底部终端关闭后收起面板;宿主主动关闭、重启或启动失败不触发自动关闭,调试与运行终端进程结束后保留输出(TerminalModuleTests、TerminalPlacementFeatureModelTests)。 Windows 窗口关闭必须回收已有终端,拒绝关闭后迟到的连接登记并关闭其新建进程;其他窗口会话不受影响。 macOS 将工具窗终端拖到编辑分组中心和四边,检查加入标签或上下/左右分屏;拖入空编辑区后再拖回工具窗正文,保留同一会话、PTY、输入和 scrollback。工具窗已有 A、B 时,将编辑器终端 C 分别拖到 A 左半区及 B 右半区,检查前后插入顺序;工具窗内重排、关闭按钮和右键菜单保持可用。调整工具窗高度后,原生正文覆盖层不截获标签栏;同一编辑分屏落点内连续移动或重复经过无效落点,仅在目标变化时发布预览更新。聚焦组件测试不替代系统原生拖放和 Windows 实机验收,verificationStatus 保持 pending。
工作台 / 终端Shell 发现与终端配置(默认 Shell、回滚行数)
terminal-shell
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Terminal
macos/Sources/Lithe/Views/App/SettingsView.swift
macos/Sources/Lithe/Views/App/SettingsSearchVocabulary.swift
macos/Sources/Lithe/Services
macos/Sources/Lithe/Models/Settings/AppSettings.swift
macos/Sources/Lithe/Platform/MacOS/Terminal/MacTerminalTransport.swift
macos/Tests/LitheTests/TerminalScrollbackSettingsTests.swift
macos/Tests/LitheTests/SettingsSearchVocabularyTests.swift
macos/Sources/LitheTerminalModule/Runtime/TerminalSession.swift
macos/Tests/LitheTerminalModuleTests/TerminalModuleTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/terminal
windows/tauri/src/features/settings/components/settings-panels.tsx
windows/tauri/src/features/settings/lib/default-shell-options.ts
windows/tauri/src-tauri
Terminal验证设置页默认 Shell 选项与终端「新建终端」菜单检测到的 Shell 一致、可选 Git Bash 并生效;macOS 新建终端下拉框复用 Project 下拉框的共享菜单样式,菜单操作与原有 Shell 选择、重新检测功能一致;验证环境变量、工作目录和不可用 Shell 的提示。 设置页终端分组新增回滚行数配置(默认 2000,范围 100–50000,步进 500),读取、写入、恢复默认均做上下限夹取,对新建会话生效(TerminalScrollbackSettingsTests);设置搜索按界面名称 Terminal scrollback/终端回滚行数/行数 均可命中终端页(SettingsSearchVocabularyTests)。 macOS 终端环境随 TERM_PROGRAM=Lithe 一并导出 TERM_PROGRAM_VERSION(取应用打包版本,无法取得时不写入),与 Windows 端一致,供工具按版本门控终端能力(TerminalModuleTests);按当前外观导出 COLORFGBG(浅色 0;15、深色 15;0,宿主无法判定时不写入),TUI 无需 OSC 查询即可选择配色(TerminalModuleTests)。
发行与更新 / 应用更新检查、下载与安装更新
updates-check-download
已实现
待验证
证据路径
macos/Sources/Lithe/Views/App/UpdateControl.swift
macos/Sources/Lithe/Views/App/UpdateChannelControl.swift
macos/Sources/Lithe/Platform/MacOS/Updates
macos/Tests/LitheTests/AppUpdateChannelTests.swift
macos/Tests/LitheTests/MacAppIdentityTests.swift
macos/Sources/Lithe/Platform/MacOS/Persistence/MacDevelopmentProfileMigration.swift
macos/Tests/LitheTests/MacDevelopmentProfileMigrationTests.swift
scripts/release/sparkle/test-sparkle-update.rb
scripts/release/sparkle/verify-release-signature.mjs
scripts/release/macos/verify-macos-release-install.sh
macos/Tests/LitheTests/UpdateDownloadRelayTests.swift
macos/Tests/LitheTests/SparkleRelayEndToEndTests.swift
scripts/release/sparkle/test-sparkle-relay-e2e.sh
macos/Sources/Lithe/Views/App/UpdateSourceControl.swift
macos/Tests/LitheTests/AppUpdateSourceTests.swift
部分实现
待验证
证据路径
windows/tauri/src/features/layout/components/app-update-details-dialog.tsx
windows/tauri/src/features/layout/components/installed-build-label.test.tsx
windows/tauri/src/features/settings/components/update-channel-selector.tsx
windows/tauri/src/features/settings/lib/update-channel.test.ts
windows/tauri/src/features/settings/lib/profile-migration.test.ts
windows/tauri/src-tauri/src/main.rs
windows/tauri/src-tauri/src/profile_migration.rs
windows/tauri/src-tauri/src/profile_migration_tests.rs
windows/tauri/src/features/settings/stores/update.store.test.ts
docs/releases/windows-updater.md
Release共享渠道与时间 fixture 覆盖正式版/独立开发版首次默认值、显式选择优先、损坏偏好和渠道安装路径。此前完成 macOS 11 项身份/渠道 Swift 测试、Windows 9 项前端测试、14 项工作树资源复用测试及 Sparkle 五个签名归档场景。新增 macOS/Windows 迁移回归覆盖首次独立复制、已有数据保护、无源数据标记、失败重试、中断快照恢复、Windows 占用拒绝及前端载入前只清理一次渠道/跳过版本;Sparkle 新增非法元数据/归档精确退出码及真实发布链中止场景。新增 macOS 真实数据库键、背景访问记录与仅有这些键的开发版保护回归;Windows 新增不可访问源下完成标记、已有配置和冻结快照恢复,以及新快照仍拒绝不可访问源的回归。按用户要求,这些新增回归、review 修复及 TS2769 修复均未运行本地测试/构建/静态门禁,需 CI 验证。当前主机 hdiutil 对最小输入也报目录非空,真实 DMG 创建/安装未通过;真实双架构签名升级及 Windows 原生安装/WebView 首次复制与双应用独立写入仍待对应平台验证,状态保留 pending。运行时发行包不可写。Windows 迁移引导插件显式使用空配置类型 (),避免 Tauri Builder 的配置泛型推断导致 E0283;验收时先完成 Release/NSIS 构建,再在无开发版数据且正式版已关闭时首次启动,确认 WebView 初始化前注册引导脚本、迁移设置可读且渠道/跳过版本只清理一次。PR #1219 的 69c7a987 已通过真实 Windows CI 宿主编译、现有 Rust 测试及汇总门禁;必须保留 WindowsRust lane 对真实 Tauri 启动入口的编译检查,不能只验证共享 Core。该结果不代替 Release/NSIS 安装、首次迁移和双应用独立写入验收,verificationStatus 继续 pending。macOS 下载断点续传:UpdateDownloadRelayTests 覆盖续传、重试耗尽保留断点、服务器无视过期 If-Range 时不拼接旧前缀、按网络原因分类失败;scripts/release/sparkle/test-sparkle-relay-e2e.sh 用本地服务器和真实 Sparkle 安装器跑通增量/全量断线续传、跨会话续传和同名重传五个场景。macOS 更新源:AppUpdateSourceTests 覆盖地址规范化、拒绝非本机 http 与带凭据/查询的地址、镜像 appcast 与归档地址换算、appcast 解析忽略增量包、连接测试的成功/缺清单/缺归档提示,以及 AutoBuild 安装或选择 AutoBuild 渠道时禁用自定义源。
设置提供正式版(推荐)和 AutoBuild;正式版选择 AutoBuild 需要明确确认风险,持续提醒普通用户使用正式版。AutoBuild 安装为 Lithe-Dev,macOS/Windows 使用独立应用标识,设置、默认日志、缓存、凭据与正式版隔离;正式版保留历史标识及路径。独立开发版首次启动且没有自己的用户数据时,从正式版独立复制设置和工作区并标记完成;已有开发版数据不覆盖,之后两版各自保存。更新渠道、跳过版本、旧日志目的地、缓存及锁不迁移;Windows 在任何 WebView 创建前只复制关闭后的 localStorage 数据库与原生设置/Maven JSON,占用或复制失败提示重试且不标记成功,中断后从暂存快照继续。系统凭据仍隔离,相关账号可能需要重新登录。独立开发版缺少渠道偏好时默认 AutoBuild,显式保存值优先;旧共享身份 AutoBuild 须单独安装新开发版,跨身份基线不生成增量。独立开发版回到正式版打开下载页并保留两个应用,旧共享身份预览版仍使用原有签名回退。AutoBuild 显示构建自 YYYY-MM-DD HH:mm:ss UTC,用同一 UTC 时间的 YYYYMMDD.HHMMSS 判断先后,不使用 workflow 序号。macOS 同渠道保留 Sparkle 更新,跨渠道要求全量安装;Windows 正式版保留 Tauri 更新,AutoBuild 与跨渠道显式打开安装器下载页,因缺少签名滚动清单,不宣称已是最新版或支持自动安装。个人应用更新地址、正式回退与下载页指向个人仓库;插件市场组织地址和信任规则不变。macOS 的 Sparkle 下载经本机回环转发,断点保存在 Caches/Lithe/UpdateDownloads,网络中断时自动重试约 15 秒,失败提示区分超时、无法连接和服务器错误,并说明已下载的数据会保留、重试可继续;文件 ETag/Last-Modified 变化时丢弃断点重新下载。启动时清理已完成或废弃的回退暂存。Windows 暂无断点续传。macOS 设置可配置正式版更新源,默认是仓库最新 Release 下载目录;镜像需平铺提供同名 appcast-<arch>.xml 和更新包,仍由 Sparkle 校验签名的 appcast 与归档 EdDSA 签名。输入后先测试连接(读取清单并 HEAD 最新归档)再应用,失败提示带镜像主机名;AutoBuild 安装或选择 AutoBuild 渠道时禁用并使用官方源。回退仍走官方地址。Windows 暂不支持自定义更新源。
发行与更新 / 应用更新失败重试与回滚
updates-failure-rollback
部分实现
待验证
证据路径
macos/Sources/Lithe/Platform/MacOS/Updates
已实现
待验证
证据路径
docs/releases/windows-updater.md
windows/tauri/src/features/settings/hooks/use-updater.ts
ReleasemacOS StableRollbackTests、UpdateCheckerTests 与 AppUpdateChannelTests 覆盖下载/校验失败、取消与恢复、忙碌期间禁止换渠道、旧提示失效及全量回退。Windows store 与 selector 测试覆盖保存失败、未确认拒绝 AutoBuild、手动下载浏览器失败、原生 handle 释放及未保存文件预检查互斥。真实安装器回退仍待验证。
macOS AutoBuild 提供独立的签名全量返回正式版入口,允许版本降低并保留项目与设置,但新设置可能无法被旧版识别。Windows AutoBuild 与跨渠道通过明确提示的发布页全量安装,不宣称支持原生自动回滚或签名滚动更新。
版本控制 / 统一 VCS统一 VCS 模型与插件 VCS Provider:同一工作区可识别 Git 与 Subversion 等不同 VCS 的根,变更列表、提交、回滚、更新、文件历史、Annotate、项目树文件状态和 gutter 按 Provider 声明的能力工作;Subversion 由独立仓库的社区插件通过系统 svn 命令行接入
vcs-subversion-and-plugin-providers
部分实现
待验证
证据路径
shared/contracts/vcs-provider-v1.md
shared/fixtures/vcs/model-v1.json
rust/lithe-core/src/vcs
rust/lithe-core/src/lsp/interface/vcs_provider.rs
rust/lithe-core/src/tests/vcs.rs
shared/contracts/plugins/v1/fixtures/vcs-provider.plugin.json
Plugins/mac/README.md
macos/Sources/LitheModuleAPI/Catalog/BuiltInModuleCatalog.swift
macos/Sources/LitheCoreContracts/Vcs/VcsProviderContracts.swift
macos/Sources/Lithe/Core/Rust/RustVcsOperations.swift
macos/Sources/Lithe/Platform/MacOS/Vcs
macos/Sources/Lithe/Application/Features/VcsProvidersFeatureModel.swift
macos/Sources/Lithe/Models/AppModel/AppModel+VcsProviders.swift
macos/Sources/Lithe/Views/Vcs
macos/Sources/Lithe/Views/Workbench/VcsProviderToolWindowRegistration.swift
macos/Sources/Lithe/Views/Workspace/ProjectSidebarView.swift
macos/Sources/LitheModuleAPI/Plugins/PluginTypes.swift
macos/Tests/LitheTests/VcsProviderHostTests.swift
.agents/notes/proposed/architecture/2026-10-22-unified-vcs-provider-model.md
macos/Sources/Lithe/Application/Features/VcsHistoryListModel.swift
macos/Sources/Lithe/Views/Components/LitheScrollLoadTrigger.swift
macos/Tests/LitheTests/VcsHistoryListTests.swift
macos/Tests/LitheTests/ScrollLoadTriggerTests.swift
macos/Sources/Lithe/Application/Features/CommitFileDeletionFeatureModel.swift
macos/Sources/Lithe/Views/Git/CommitFileDeletionPresentation.swift
macos/Tests/LitheTests/CommitFileDeletionTests.swift
.agents/notes/implemented/feature/2026-10-29-commit-file-context-actions.md
未实现
不适用
证据路径
shared/contracts/vcs-provider-v1.md
shared/fixtures/vcs/model-v1.json
rust/lithe-core/src/vcs
rust/lithe-core/src/lsp/interface/vcs_provider.rs
rust/lithe-core/src/tests/vcs.rs
shared/contracts/plugins/v1/fixtures/vcs-provider.plugin.json
GitCore 共享层自动化:cargo test -p lithe-core vcs、cargo test -p lithe-core --lib lsp 与 scripts/architecture/verify-shared-contracts.sh,覆盖 vcsProviders 清单校验与 git 保留、onVcsRoot 激活、svn 根识别(嵌套、歧义目录与映射、git worktree 文件、工作区位于工作副本内部、剪枝目录、深度上限)、vcs.ownerOf 最深根归属、litheVcs 只向插件会话提供、协商缺必需能力时拒绝、lsp.vcsRequest 按操作生成请求与能力检查、Provider 错误码白名单、vcs.decodeReply 的回复校验用例;Node SDK 的 litheVcs 与示例 Provider 端到端测试在 lithe-plugin-docs 运行(scripts/sdk-e2e.mjs)。Subversion 社区插件:独立源码由 https://github.com/Lithe-IDEA/lithe-plugin-svn 维护;插件 CI 校验固定 SDK 的源码哈希,用 svn 录制的 status/info/log/blame --xml 与错误输出样例覆盖解析和错误码映射,并按 sdk.lock.json 的宿主提交构建 Core 桥接,在 svnadmin create 建立的 file:// 仓库上经 Core 跑通状态(含 changelist 中的路径)、提交、过期提交、更新与冲突、resolve、回滚、移动(未版本化文件不覆盖已有目标)、删除、历史分页、Annotate 和二进制文件;固定宿主基线不代表已验证未来 preview。主仓库只保留通用 VCS 契约回归(清单 fixture 与 Core 测试)。macOS 宿主自动化:VcsProviderHostTests 覆盖根识别与状态着色、每个根单独监听元数据目录(含包住工作区的工作副本)、工作区内新出现的工作副本重新识别、项目树移动两端都归同一个根才交给 Provider、等待归属判断时开始别的操作则退回磁盘移动、找不到 VCS 客户端时报 vcs.tool.unavailable、关闭项目窗口后停止 Provider 且之后的工作区加载不再启动、工具窗口使用通用版本控制图标。宿主验收:从磁盘或 Lithe Store 安装 Subversion 社区插件后,在本地 svnadmin create 建立的 file:// 仓库检出的工作副本上验证根识别、文件状态颜色、gutter、提交、更新、回滚、add/move/delete 跟踪、文件历史、Annotate 和冲突显示;同时打开一个包含 Git 仓库与 SVN 工作副本的工作区,确认文件只归属最深的根,Git 行为不变;运行前后 app bundle 文件清单不变(scripts/macos/verify/verify-runtime-bundle-immutability.sh)。 VcsHistoryListTests 覆盖修订去重、耗尽/无进展/循环 cursor、失败保留与显式同页重试、在途去重、重置旧回复及取消;VcsProviderHostTests 使用 fake Provider 和真实 SwiftUI/NSScrollView 验证工作副本/单文件历史自动请求第二页、50条限额、追加偏移不动和耗尽停止。真实插件历史仍需 macOS 实机连续滚动验收,不据组件测试标记全部能力已验证。 VcsProviderHostTests 验证真实菜单回调的排序精确 .add/.delete 批次、缺能力、嵌套/歧义根、迟到所有权、串行操作及重置;CommitFileDeletionTests 验证Provider删除确认与成功后的干净文档关闭;在真实SVN社区插件工作副本上仍需验证添加、跟踪删除、取消不写及新标签完整流程,不能用fake Provider代替插件验收。
Issue #827。Rust Core 已实现 vcs.detectRoots、vcs.ownerOf、vcs.decodeReply、lsp.vcsRequest 与 litheVcs 协商,Node SDK 的 litheVcs 支持随 SDK 迁到 lithe-plugin-docs(P1);Subversion 社区插件在独立仓库 Lithe-IDEA/lithe-plugin-svn 实现全部 11 种操作,ID 为 io.github.lithe-idea.svn-support,不需要 Lithe 签名(P2)。macOS 宿主已声明 vcsProviders:打开工作区时识别根并记住歧义目录的选择,插件的左侧工具窗口使用通用版本控制图标,首次读取状态时显示读取中,列出冲突、变更和未版本化文件,行支持辅助功能的选择、打开和勾选操作,支持勾选提交、更新、回滚、标记解决、清理、文件与工作副本历史、与基线比较;项目树按 Provider 状态着色并在右键菜单提供比较,项目树中的重命名和移动在两端都属于同一个根时交给 Provider 跟踪;项目树、搜索和索引像 .git 一样隐藏 .svn,每个根单独监听自己的元数据目录(含工作区位于工作副本内部时的上层 .svn),工作区里新检出的工作副本会被识别;找不到 svn 客户端时提示安装;关闭项目窗口即停止该窗口的 Provider;安装审核显示 Provider 的启动命令、客户端命令和是否联网(P3)。macOS 尚未接入编辑器 gutter 与 Annotate,所以记为部分实现;插件要等带 vcsProviders 能力的 Lithe 版本发布后再在 Lithe Store 上架。Windows 宿主尚未接入。分阶段计划见提议 Note。
编辑器 / 编辑模式Vim 模式与命令状态
vim-mode
未实现
不适用
证据路径
macos/Sources/Lithe/Views/Editor
已实现
待验证
证据路径
windows/tauri/src/features/vim
windows/tauri/src/features/editor
EditorWindows 验证 Normal/Insert/Visual 模式、命令执行和设置持久化;macOS 需要确认产品范围。
工作台 / 窗口管理标题栏控制窗口最小化、最大化/还原与关闭;macOS 绿色按钮可进入原生全屏 Space(而非主桌面最大化);命令面板可最小化、最大化及切换全屏
window-controls
已实现
待验证
证据路径
macos/Sources/Lithe/LitheApp.swift
macos/Sources/Lithe/Views/App/RootView.swift
macos/Tests/LitheTests/LitheCoreLogicTests.swift
macos/Tests/LitheTests/WindowFullScreenCapabilityGuardTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/window/components/title-bar/window-controls.tsx
windows/tauri/src/features/command-palette/constants/window-actions.tsx
windows/tauri/src/features/window/utils/window-actions.ts
Workbench在 macOS 检查系统标题栏控制及全屏入口,并确认绿色按钮进入独立全屏 Space(窗口 styleMask 出现 fullScreen、frame 覆盖整屏)而不是在主桌面最大化,退出后窗口回到原位置;进入全屏后确认工作台顶栏内容从左缘开始、不再保留红绿灯按钮空位,退出全屏后恢复按钮预留;在 Windows 验证标题栏最小化、最大化/还原和关闭,以及命令面板的窗口操作,确认图标语义、最大化/还原状态与按钮标签一致,并确认悬停关闭按钮背景贴合窗口右边缘。 macOS 同一窗口角色下更新模型和标题时保留 SwiftUI 宿主测量的最小内容尺寸,切换欢迎页/工作台角色仍应用对应尺寸,避免重复覆盖引发窗口布局反馈。
工作台 / 窗口管理Windows 原生窗口标题显示「项目名 – 当前编辑文件」,编辑区未打开文件时仅显示项目名,任务栏悬停预览与 Alt+Tab 据此区分窗口内容;超长标题由系统自动折叠
window-title-active-file
平台专属
不适用
证据路径
macos/Sources/Lithe/Views/App/RootView.swift
已实现
待验证
证据路径
windows/tauri/src/features/window/components/native-window-title-host.tsx
windows/tauri/src/features/window/utils/window-title.ts
windows/tauri/src/workbench-app.tsx
Workbench在 Windows 运行应用并打开项目:任务栏图标悬停预览标题显示「项目名 – 文件名」,切换编辑区文件后标题随之更新;关闭全部编辑标签或聚焦终端/欢迎页后标题回落为项目名;无项目时显示 Lithe;打开超长文件名的文件确认预览卡片由系统折叠显示,悬停任务栏图标可看到完整标题。
macOS 原生标题由 RootView 单独推导(工作区名或独立文件名),不采用「项目 – 文件」组合形式。Windows 侧文件名取当前活动缓冲区;终端、搜索、欢迎页等工具标签视为未打开文件,仅显示项目名;项目段复用标题栏项目菜单的显示名(含别名后缀)。标题以字符串选择器订阅,缓冲区高频编辑不会触发工作台重渲染或重复 IPC。依赖 capabilities/main.json 中的 core:window:allow-set-title 权限。
工作台 / 命令与布局Windows 文件菜单在“关闭标签页”上方提供带齿轮图标的“设置”入口,点击打开设置对话框
windows-file-menu-settings
平台专属
不适用
证据路径
macos/Sources/Lithe/LitheApp.swift
已实现
待验证
证据路径
windows/tauri/src/features/window/components/window-menu-bar.tsx
windows/tauri/src/features/window/components/window-menu-bar.test.ts
shared/i18n/messages.json
Workbench在 Windows 工作台点击标题栏左端菜单(紧凑模式先点汉堡按钮展开“文件”菜单),确认“文件”菜单中“关闭标签页”上方有齿轮图标加“设置”文字的入口,上下以分隔线与相邻分组隔开,并显示 Ctrl+, 快捷键提示;点击后打开设置对话框,菜单收起;切换中英文确认文字为“设置”/“Settings”。macOS 使用系统菜单栏的设置入口,不适用。
项目 / 文件创建Windows New菜单与Java类型/包创建
windows-java-new-menu
平台专属
不适用
证据路径
shared/contracts/application-boundary.md
已实现
待验证
证据路径
windows/tauri/src/features/file-explorer/components/new-java-entry-dialog.tsx
windows/tauri/src/features/file-explorer/components/file-explorer-tree.tsx
windows/tauri/src/features/file-explorer/lib/java-source-template.ts
windows/tauri/src/features/file-explorer/lib/java-source-template.test.ts
windows/tauri/src/features/file-explorer/lib/tree-dom-event.ts
windows/tauri/src/features/file-explorer/lib/tree-dom-event.test.tsx
windows/tauri/src/features/file-explorer/services/create-java-entry.ts
windows/tauri/src/features/file-explorer/services/create-java-entry.test.ts
windows/tauri/src/features/file-explorer/stores/new-entry.store.ts
windows/tauri/src/features/file-explorer/stores/new-entry.store.test.ts
windows/tauri/src/features/file-explorer/components/new-entry-dialog-host.tsx
windows/tauri/src/features/file-explorer/hooks/use-file-explorer-context-menu.tsx
windows/tauri/src/features/window/components/window-menu-bar.tsx
windows/tauri/src/features/window/components/title-bar/title-bar.tsx
Windows / Explorer从File→New与资源树New创建文件、目录、Java类型和包;确认类/接口/枚举/record/注解/异常/抽象类/package-info模板、名称校验、同名保护、选中目录及workspace切换保护;检查树中的portal菜单不会被树键盘/鼠标事件拦截。
这是初始源码模板与产品菜单,不是Java语义模型。包名仅根据常规源码目录提供建议,自定义源码根需要用户确认;模块向导是后续独立改动。
工作台 / 窗口管理Windows 启动和新窗口在页面渲染前就用当前主题背景色,不再闪白屏;Agent 面板探测、订阅和 MCP 检查启动的子进程不再弹出控制台窗口
windows-startup-feedback
平台专属
不适用
证据路径
macos/Sources/Lithe/Views/Workbench/WorkbenchView.swift
已实现
待验证
证据路径
windows/tauri/src-tauri/src/window_background.rs
windows/tauri/src-tauri/src/main.rs
windows/tauri/src-tauri/src/host.rs
windows/tauri/src/features/window/utils/native-window-background.ts
windows/tauri/src/features/settings/lib/settings-effects.ts
rust/lithe-agent-host/src/environment.rs
rust/lithe-agent-host/src/subscription.rs
rust/lithe-agent-host/src/mcp_probe.rs
Windows ShellWindows:分别用深色、浅色和自定义主题冷启动(含上次最大化退出),从启动到页面渲染不出现白屏;新建项目窗口同样使用主题背景。切换主题后重启,首帧背景随之变化;删除应用本地数据目录下的 window-background.json 后以 Lithe Dark 背景启动。打开 Agent 面板、刷新订阅额度、检测 MCP,全程不出现控制台窗口闪烁。确认背景文件只写入应用本地数据目录,安装目录文件清单不变。
不采用先隐藏窗口再显示的方案:window-state 插件恢复最大化时 tao 会调用 ShowWindow(SW_MAXIMIZE),隐藏的窗口会被直接显示。改为原生窗口创建时即使用上次保存的主题背景色。macOS 原生窗口没有 WebView2 白底问题。
工作区 / 工作区生命周期Windows 任务栏与 Alt+Tab 显示项目展示名和活动文件,同名项目附加路径,工具页只显示项目
windows-taskbar-project-titles
平台专属
不适用
证据路径
.agents/notes/implemented/feature/2026-10-02-windows-taskbar-project-titles.md
已实现
待验证
证据路径
windows/tauri/src/features/window/utils/window-title-context.ts
windows/tauri/src/features/window/services/window-title-source.ts
windows/tauri/src/features/window/services/window-title-focus.ts
windows/tauri/src/features/window/services/window-title-sync.ts
windows/tauri/src/features/window/hooks/use-native-window-title.ts
windows/tauri/src-tauri/src/window_title.rs
WorkspaceWindows:打开两个不同项目与不同目录的同名项目,检查任务栏悬停和 Alt+Tab 标题;切换项目、分屏、文件、终端、搜索与 Diff,确认文件名只来自当前活动文件。搜索侧栏获得焦点时清除文件名,返回编辑器时恢复;仅可见不清除文件名。修改项目别名、关闭项目或窗口,确认其余窗口的重名路径同步恢复。覆盖独立文件、预览源文件、中文、UNC 路径、启动恢复与初始化身份刷新;测试已应用但应答失败后的 A/B/A 恢复、登记快照复用、路径回退、统一截止时间、迟到回调及窗口销毁,生成前端和宿主逐测试计时报告。
仅 Windows 原生标题展示;复用已有项目与窗口归属,不改变应用内布局。Windows 11 初版已验证原生标题、文件切换、Markdown 预览、终端焦点、跨窗口重名恢复及 Alt+Tab 标题;2026-10-05 修复后另用临时样例验证搜索聚焦清除文件名、侧栏可见时返回编辑器恢复文件名、关闭侧栏恢复。失败与超时由可控回归测试验证;任务栏悬停和 Windows 10 外观仍待验证。
工作台 / 工作台布局活动栏贴合窗口外沿
workbench-activity-rail-window-edge
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Workbench/WorkbenchView.swift
已实现
待验证
证据路径
windows/tauri/src/features/layout/components/main-layout.tsx
windows/tauri/src/features/layout/components/plugin-activity-rail.tsx
windows/tauri/src/features/layout/components/sidebar/main-sidebar.tsx
Workbench打开工作区,检查左右活动栏与窗口外沿齐平,外侧没有留白、圆角或边框;缩放窗口并切换活动面板后确认布局仍贴边。 macOS 右侧底部的检查更新与背景选择是居中的纯图标按钮,复用其他活动栏按钮的槽位、背景和 hover 提示;背景面板向上展开。
工作台 / 工作台布局活动栏图标的稳定悬停说明
workbench-activity-tooltips
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Workbench/WorkbenchHoverTooltip.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchView.swift
macos/Tests/LitheTests/WorkbenchHoverTooltipTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/layout/components/sidebar/sidebar-pane-selector.tsx
windows/tauri/src/features/layout/components/footer/footer-tab-control.tsx
windows/tauri/src/features/layout/components/plugin-activity-rail.tsx
Workbench逐一悬停左上导航、左下工具入口及右侧通知/插件/Maven,快速切换图标并移出活动栏;确认始终只显示当前图标说明,面板更新和滚动后不残留旧提示,禁用入口可显示说明,短文字自适应且提示不超出窗口边缘。
工作台 / 命令与布局紧凑菜单栏可在标题栏左侧原位展开完整水平菜单,并在点击外部或按 Escape 后收起,不遮挡工作区
workbench-compact-menu-bar
平台专属
不适用
证据路径
macos/Sources/Lithe/LitheApp.swift
已实现
待验证
证据路径
windows/tauri/src/features/window/components/title-bar/title-bar.tsx
windows/tauri/src/features/window/components/title-bar/title-project-menu.tsx
windows/tauri/src/features/window/components/window-menu-bar.tsx
windows/tauri/src/features/window/hooks/use-compact-menu-bar-dismissal.ts
windows/tauri/src/features/window/hooks/use-compact-menu-bar-dismissal.test.tsx
Workbench在 Windows 工作台点击标题栏左端菜单按钮,确认汉堡按钮由“文件”菜单项取代,“文件”项处于选中状态且其下拉菜单立即展开;菜单与标题栏同高,不覆盖编辑区域,项目/分支控件在展开时隐藏。检查常驻品牌标识与下方活动栏图标列对齐且不可选中,并确认项目菜单显示当前项目图标(无自定义图标时显示项目缩写)。点击其他菜单项时菜单条保持展开并执行动作;点击工作区、标题栏空白和右侧控件或按 Escape 后收起;按 Escape 后确认焦点返回菜单入口;窄窗口确认菜单在标题栏内水平滚动且不挤压窗口控件。macOS 保持系统菜单栏行为。
工作台 / 外观IntelliJ Islands 外观:Islands 配色、10px 圆角面板卡片、控件 4px 圆角、卡片式查找栏与编辑器通知、Islands 滚动条颜色,窗口失焦时外框(标题栏、侧边按钮条、状态栏)降到 0.56 透明度
workbench-islands-appearance
部分实现
待验证
证据路径
macos/Sources/Lithe/Views/App/RootView.swift
macos/Sources/Lithe/Views/Components/WorkbenchSurfaceBackground.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchView.swift
macos/Tests/LitheTests/WorkbenchSurfaceBackgroundTests.swift
已实现
已验证
证据路径
windows/tauri/src/extensions/themes/builtin/lithe.json
windows/tauri/src/styles/theme.css
windows/tauri/src/styles/base.css
windows/tauri/src/styles/scrollbars.css
windows/tauri/src/styles/utilities.css
windows/tauri/src/features/window/components/title-bar/title-bar.tsx
windows/tauri/src/features/window/components/title-bar/title-project-menu.tsx
windows/tauri/src/features/git/components/git-branch-manager.tsx
windows/tauri/src/features/editor/styles/monaco-editor.css
windows/tauri/src/ui/button.tsx
windows/tauri/src/utils/control-variants.ts
windows/tauri/src/features/layout/components/sidebar/sidebar-pane-selector.tsx
windows/tauri/src/features/layout/components/plugin-activity-rail.tsx
Workbench在 Windows 使用 Lithe Dark 与 Lithe Light:确认窗口底色、面板卡片、选中色与 IntelliJ Islands 一致;面板卡片为 10px 圆角,按钮与输入框为 4px 圆角;Ctrl+F 查找栏为离顶部 6px 的圆角浮动卡片;外部修改冲突提示为内缩圆角卡片;切换到其他应用后标题栏、侧边按钮条与状态栏变淡而编辑器正文不变,切回后恢复;在后台打开新窗口时一开始即为变淡状态;切换到 Dracula 或高对比主题确认标签与滚动条使用该主题自身颜色。 左右两侧按钮条的按钮为 30px 高亮区、6px 圆角、20px 图标、间隔 10px(IntelliJ StripeToolbar.Button),标题栏搜索、设置和菜单按钮为 30px、20px 图标(IntelliJ MainToolbar.Button)。 标题栏项目名和分支名常态使用主题 foreground 主文字色,深浅主题与 IDEA 主工具栏对照;悬停、菜单打开、加载禁用和窗口失焦后仍保持原有反馈,其他分支入口、箭头、图标和字重不变。 左上 Project、Commit 和左下 Run、Terminal、Problems、Git Log 选中入口在 Islands 深浅主题均为 #3871E1 蓝底、白色原始图标轮廓;悬停及键盘聚焦保留蓝底,关闭或切换侧栏、底部面板后旧入口恢复。禁用入口不显示选中蓝底,其他列表和 Search 活动项不变,第三方主题保留自己的配色与图标。 macOS 深浅外观在同一工作台中选择、更换和移除背景图,逐一检查 Agent 对话/欢迎/历史、Run/Maven/Tests 输出、模块加载、媒体与替换预览、数据库工具栏透出壁纸且移除后恢复底色;输入框、选择、通知及弹窗保持可读。
Windows 的 Lithe 主题使用 IntelliJ ManyIslands 色板;其他内置主题只继承布局与圆角,标签和滚动条颜色由主题自身颜色推导。失焦置淡只作用于外框,编辑器与工具窗口内容保持不透明,与 IntelliJ IslandsInactiveFrameGraphics2D 的作用范围一致。macOS 尚未实现失焦置淡,配色未逐项对齐 Islands。 2026-10-06:用户确认 PR #1083 涉及的 Windows 功能改动均已完成实机测试,未发现问题;实机验收依据为用户反馈。 macOS 工作台壁纸结构背景统一通过 litheWorkbenchSurface 与宿主环境值传递,Agent 的页面/标题/历史/标签背景、共享输出、模块加载、搜索替换预览、媒体查看和数据库工具栏跟随背景图变化;独立窗口没有背景宿主时恢复主题底色,输入/菜单/通知仍保留专用表面。
可观测性 / 通知与资源操作通知、错误提示与自动消失,重复消息合并计数
workbench-notifications
已实现
待验证
证据路径
macos/Sources/Lithe/Application/Features/WorkbenchNotificationFeatureModel.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchNotificationBanner.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchNotificationPresentation.swift
macos/Tests/LitheTests/WorkbenchNotificationTests.swift
macos/Sources/Lithe/Views/Components/LitheBanner.swift
macos/Tests/LitheTests/LitheBannerAppearanceTests.swift
macos/Sources/Lithe/Application/Lifecycle/CancellationReporting.swift
macos/Tests/LitheTests/SearchModuleCoordinatorTests.swift
macos/Tests/LitheTests/WorkspaceLanguageServerPreferencesTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/notifications
windows/tauri/src/features/notifications/stores/notifications.store.test.ts
windows/tauri/src/features/notifications/utils/notification-occurrences.test.ts
windows/tauri/src/features/notifications/components/notification-list-item.test.tsx
Workbench触发成功、警告和失败通知,验证队列、关闭、超时和重复通知。同一文案连续触发两次,确认通知栏只保留一条并在文案后显示计数(第二次 `(2)`、第三次 `(3)`),不同文案、不同类型或不同描述的通知仍各自独立;重复出现时该条回到列表顶部并重新标为未读,列表中显示的时间刷新为最后一次出现时间。重复通知使用固定 key 时,确认关闭后再次出现会继续累加而不是停在 1;把其中一个已合并的来源改写成另一段文案,确认只有该来源的次数随文案移动,原组剩余次数不变、新文案不被算成出现过两次。macOS 深浅主题检查共享卡片、官方图标、圆角边框、两行长消息与展开/收起。验证三条上限、旧消息折叠及历史入口,并确认重复一条带“还有 N 条通知”的气泡后该历史入口仍然存在;单条悬停不暂停其他通知,应用后台暂停全部、回到前台按剩余时间关闭;关闭与超时保留历史,清空历史关闭所有气泡。确定性时间测试覆盖计时与折叠,重复消息复核气泡置顶与计时重置,实际工作台检查叠放、关闭和通知中心。 macOS 各面板提示检查深浅主题下的共享 InlineBanner 与编辑器平面提示:六种状态背景/边框、13pt 正文、12pt 内边距或编辑器上下10pt、官方16pt图标、换行、动作链接和关闭按钮的实际点击。 在系统语言与应用语言不同时触发 Java 准备、就绪、超时和失败通知,检查气泡、通知历史及重复计数均跟随应用语言。 带错误详情的 Java 失败通知保留原始键和参数,在中文收到后切到 English,气泡与历史重新格式化;不同详情不合并,相同详情重复计数。中文 Maven 未准备就绪异常仍显示中文。 macOS 打开项目启动时(模块图重建、可见工具窗口和 Java 语言服务器被打断重启),确认不出现“未能完成操作(Swift.CancellationError 错误 1)”之类的取消通知;让模块激活抛出普通错误时仍弹出失败通知。 语言服务器激活进行中时在工作区关闭该语言服务器或关闭触发文档,确认之后不再弹出 “Could not start … language server”。
macOS 通知外观使用 Community Islands 主题,颜色/边框/6pt 圆角/5pt 线性阴影由 LitheTheme.Notification 统一提供。普通 timeline 通知显示 10 秒,单条悬停和应用后台暂停剩余计时;最多显示三条,新通知向上叠放,溢出的旧通知折叠为历史入口。关闭气泡保留历史,打开通知中心关闭气泡并标为已读;沿用 100 条历史上限。长正文默认两行,可展开,超过十行在气泡内滚动。重复消息合并:macOS 以消息文本为身份,Windows 以类型+文案+描述为身份;命中已有条目时只累加出现次数、置顶并标为未读,不新增重复条目。计数从第二次出现开始显示,英文为 `xxxx (2)`,简体中文为 `xxxx(2)`(`%@ (%lld)` / `notifications.occurrenceCount`)。macOS 重复消息会重启该气泡自己的 10 秒窗口并移到气泡栈顶,气泡已消失时重新弹出;`createdAt` 保留首次出现时间,列表和通知中心显示 `updatedAt`。溢出计数只存在于活跃气泡上,因此刷新一条带折叠数的气泡时会把它交还给最旧的存活气泡,不能随被替换的历史副本一起丢失。Windows 侧合并作用于通知栏列表,仍然逐条出现的 sonner 弹出提示保持原样。合并身份分两层:聚合组由内容决定(因此组 id 由内容派生,不会与来源 id 混用),来源由 toast id 决定。为防止 `NotificationRecorder` 在 toast 列表变化时重复上报同一 toast 导致计数虚增,`partitionNewOccurrences` 按 toast id 区分“新出现”和“仍在屏上”,只有新出现的才传 `isNewOccurrence`;同一 id 再次以 `isNewOccurrence:true` 上报(固定 key 关闭后重新出现)仍会累加。每个条目记录贡献它的来源及各自次数(有条数上限,超出后仅失去“随文案迁移”的能力,次数仍保留在 `count` 中):某个来源改写文案时只把它自己的次数从旧组扣除并并入新内容所在的组,不会把整组次数带到新文案上,旧组没有来源后即移除。macOS 气泡的 `occurrenceCount` 是必填参数,漏传会直接编译失败,另有渲染断言以同一文案在有/无计数时的像素差异兜底。两平台未读角标都按合并后的条目数计算,因此同一消息刷屏不再抬高角标数字。 面板内提示统一由 LitheBanner/LitheTheme.Banner 提供 Community 915c3c26 的 InlineBanner 与 EditorNotificationPanel 展示规则,各调用方只保留业务内容和动作;不把系统确认对话框、字段验证或日志渲染当作提示条。 macOS 模块激活的取消(用户取消或会话/模块图拆除)不作为失败通知展示:各模块协调器、工具窗口激活、Agent 会话激活、语言运行扩展激活和语言服务器激活失败记录(取消不计入启动失败、不触发重试;已在工作区关闭该语言服务器、工作区已切换或触发文档已关闭时,过期的激活失败也不提示)统一用 `Error.isCancellation`(`CancellationError` 或当前任务已取消)在调用方过滤,不在通知层按文案过滤。
工作台 / 命令与布局分栏、面板与工具窗布局
workbench-panes
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Workbench
macos/Sources/Lithe/Application/Features/WorkbenchFeatureModel.swift
macos/Sources/Lithe/Views/Components/LitheToolWindowHeader.swift
macos/Sources/Lithe/Views/Workspace/ProjectSidebarView.swift
macos/Sources/Lithe/Views/Components/LitheSplitPaneView.swift
macos/Sources/Lithe/Services/Workbench/WorkbenchLayoutStore.swift
macos/Sources/Lithe/Views/App/RootView.swift
macos/Sources/Lithe/LitheApp.swift
macos/Sources/Lithe/Theme/LitheTheme.swift
macos/Resources/IDEAIcons/expui
macos/Resources/IDEAIcons/terminal
macos/Tests/LitheTests/WorkbenchContributionHostTests.swift
macos/Tests/LitheTests/WorkbenchModuleUIRegistryTests.swift
shared/fixtures/modules/built-in-v1.json
macos/Sources/LitheApplicationKernel/Lifecycle/ModuleRuntime.swift
macos/Sources/Lithe/Views/Components/WorkbenchSurfaceBackground.swift
macos/Sources/Lithe/Views/Workbench/OutputTextView.swift
macos/Tests/LitheTests/ConsoleInlineInputTests.swift
macos/Tests/LitheTests/LitheToolWindowHoverTests.swift
macos/Tests/LitheTests/WorkbenchMavenLayoutTests.swift
macos/Tests/LitheTests/CommitActionButtonStyleTests.swift
.agents/notes/implemented/architecture/2026-09-13-resizable-ui-performance-boundaries.md
macos/Tests/LitheTests/LitheSplitPaneCollapseTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/panes
windows/tauri/src/features/layout
Workbench打开、关闭、移动和调整面板,验证布局持久化及高频拖动稳定性;macOS 主工作区窗口不再被固定的 980×640 内容下限阻止缩小,侧栏、右侧工具窗、编辑区和底部工具窗按 IDEA 主分隔器默认 30pt 下限与实时可用空间调整,无固定 520/760pt 上限,极窄窗口不产生负尺寸或越界,恢复窗口后保留原先保存的面板宽度;拖动右侧 Maven 工具窗时保留当前 Commit 侧栏宽度并由编辑区承受剩余空间变化,底部 Git Log 与终端始终横跨 Project、编辑区及右侧 Maven 所在的整行,向上拖动时上半行按共享 30pt 主分隔器下限收缩,Commit 不设专属高度下限;未打开文件时,将编辑区缩窄或缩矮,空状态提示保持原始文字尺寸、不换行或缩字,超出内容在编辑区内裁剪,恢复尺寸后完整显示;编辑区和左右工具窗共用按可见尺寸布局的面板容器,在 30pt 高度下 Project、Commit、Search 及右侧 Maven 标题仍贴顶且四角圆角保持可见;macOS Project、Commit、Search、Database 和 Pull Requests 侧栏标题右端使用 IDEA 明暗收起图标与共用悬停样式,点击后收起侧栏并保留活动栏和编辑区,再点击对应活动栏图标恢复侧栏及原宽度;在 macOS 启用背景图后检查项目栏、编辑器、底部及右侧工具窗之间是否仍有清晰的分割区间;将 macOS 左侧工具窗缩至 30pt 并确认目录树始终贴左、不随宽度向右移动、内容不溢出、右上和右下圆角仍可见,关闭并重新打开项目后仍保持窄侧栏及其他布局尺寸,重新展开后布局正常;在 Maven 项目产生构建输出时确认左侧模块按钮可滚动、设置按钮始终完整显示;在亮色主题且有未读通知时确认未打开的铃铛图标清晰可见、打开通知面板后白色图标与蓝色背景成对出现;在深色 Lithe 主题下对照外框渐变、面板对比度、背景图片回退、左右工具窗的 40pt 按钮槽、30pt 选中块及 IDEA Community 图标对比度,悬停工具窗按钮时确认箭头光标,检查项目栏标题颜色和弹窗主按钮主题色;检查 macOS 40pt 顶栏 Logo 与系统窗口按钮垂直居中,项目切换器使用 20pt 项目字母头像和 30pt 悬停块,项目与分支切换块悬停保持箭头光标,红绿灯右侧留白与 IDEA 接近,项目头像、欢迎列表及切换菜单按标准化项目路径共享稳定颜色(超过 9 个项目、移除后重开仍一致),顶栏运行配置使用 16pt 图标与 13pt Regular 文字、内容自然宽度和 6pt 图文间距;运行与调试使用 Community 描边资源、34×40pt 槽位及 30×30pt 悬停区域,运行、调试、更新和背景按钮悬停保持默认箭头,检查深浅主题、菜单开合、窄窗口和原动作;顶栏使用 IDEA Islands 主题项目色并按 85% 混色、600pt 水平和 300pt 垂直范围渐变,深色窗口分隔条四角与底栏缺口无浅色亮斑,缩放窗口及从欢迎页进入工作区再返回后仍对齐。 macOS 主工具栏仅保留运行配置、Run、Debug 及执行中的 Stop;确认右上角无新增搜索和设置按钮,原运行/调试动作及既有快捷键、应用菜单入口正常。 macOS 共享分隔条普通、hover 和按住拖动使用相同分隔线颜色,不增亮;原调整光标、命中范围和释放保存尺寸保持可用。 macOS 设置入口位于主工具栏最右侧,移除左下重复入口,沿用 IDEA settings SVG 和原设置动作,核对点击、悬停与窄窗口显示。 右上设置按钮先打开共享动作菜单,仅有设置/插件、分隔线、主题/快捷键四项,设置显示当前 Keymap 快捷键;各项打开现有通用/插件/快捷键分类,主题在通用主题设置中配置,Esc/外部点击关闭菜单。 右上齿轮与右侧通知/数据库入口共用竖直中心线,窄宽窗口保持对齐;右侧活动栏不再显示插件按钮,齿轮菜单插件项仍有效。 设置图标普通、悬停及菜单展开时使用右侧入口的 toolWindowButtonText 前景色,深浅主题跟随相同 token;保留现有菜单和悬停背景。 运行配置/运行/调试组与末端设置之间有可收缩留白,宽窗口对照参考位置左移,窄窗口收缩留白且设置保持右侧栏对齐;打开运行配置弹窗及运行/调试动作保持原行为。 A/B 分屏后在 A 发起跨文件 Rename/Code Action,验证 B 的同步 owner 与保存/关闭屏障不被接管,待处理输入先排空,修订递增并检查撤销;各组右键 Other/Left/Right/All 按组内重排后的可见顺序关闭文档,不关闭其他组或混合终端标签。 macOS 内置与声明式插件工具窗口通过稳定贡献 ID 注册,宿主菜单支持底部/右侧位置、顺序、入口显隐和默认布局恢复;几何尺寸提交不覆盖这些偏好。 macOS Project、Commit、Search 和 Pull Requests 入口通过贡献注册表显示(Pull Requests 仍受原功能开关限制);把内置侧栏和插件工具窗移动到左侧/右侧/底部,检查原内容、收起按钮、独立显隐与按工作区保存的入口顺序,重开项目恢复左栏选择和展开状态;旧会话名称与旧尺寸配置继续可读,禁用模块不实例化且关闭内容,插件左栏恢复必须激活所属模块。 macOS 动作状态:确认窗口入口、工具栏、菜单与命令面板共用可用和勾选状态,激活中命令禁用且 Enter/鼠标均不能触发,窗口入口允许取消;同时打开同一插件的两个窗口只构造一次模块,取消其中一个不影响另一个;激活中禁用再启用,确认无资源残留或晚到贡献,旧动作引用不绕过状态校验。 插件卸载后恢复包含旧侧栏 ID 的会话,确认回退项目入口且不出现未知底部加载窗口。 macOS Run/Debug/Stop 主工具栏入口与插件按钮共用显隐和顺序偏好,重开项目及尺寸提交后保持;找回隐藏工具栏或菜单入口不执行命令,菜单项可从菜单命令管理入口恢复。 恢复先前可见的 Services 后,不借助其他入口完成所属模块激活并能操作;Show 不会 toggle 关闭已经可见的窗口。Maven renderer 在非 Maven 项目不可见时,旧布局中的可见标记不占据停靠内容空间。prepareForSleep 挂起时并发 activate 等待休眠完成,只在新实例中重新激活,贡献不重复发布、旧实例资源全部释放。 关闭模块在 gate 暂停时取消等待激活的调用方,放行关闭后构造与贡献发布仍各一次,无实例及资源残留;首次点击和 Show 打开 A 时暂停激活,同组选择 B 后放行 A,最终仍显示 B,不同组可以同时显示;默认右侧 Database → Agent → Maven 中将 Maven 前移,再后移,检查实际 tools(in:) 顺序随之变化。 开启/替换/关闭工作台背景时,检查Debug Console正文、左侧工具栏及Performance展开/收起区均露出同一工作台背景;移除背景恢复主题底色,保留ANSI背景、选区、输入草稿和原生文本控件身份。 所有主工具窗口隐藏按钮共用整块面板悬停环境;鼠标离开时隐藏且不可鼠标命中,保留槽位与键盘/VoiceOver 焦点显示;分别检查普通宿主与 Terminal/Git 保留宿主,Project 正文悬停也显示定位、刷新和展开/收起动作。 新工作区检查侧栏默认 360pt 及底部约28%高度;中英文明暗 Commit 原生布局验证修订提交一行且不与 AI/暂存数重叠;保存320pt侧栏和自定义上半高度后重开仍保持原值,极窄布局、底部隐藏恢复与拖动不回跳。资源截图不替代完整工作台验收。 共享分隔容器在横向/纵向、面板为空或含多个直接子视图时,仍保留两块独立面板及分隔条;搜索的更多提示不改变面板数量。核对尺寸限制、收起恢复、嵌套拖动和原生表面身份不变。
工作台共享表面向后代传递背景图片状态,原生输出视图使用同一状态控制滚动视图底色,防止局部不透明背景遮挡;同样覆盖既有共享输出调用者。
工作台 / 外观用颜色区分项目:窗口顶部按项目颜色绘制 IntelliJ Islands 渐变(项目组件处最浓,水平 600px、垂直 300px 淡出,覆盖标题栏、侧边按钮条、状态栏与面板之间的缝隙);标题栏、项目菜单与欢迎页的项目头像使用 IntelliJ AvatarIcon 样式,颜色与渐变一致
workbench-project-color-gradient
部分实现
待验证
证据路径
macos/Sources/Lithe/Views/Workspace/ProjectIdentityAppearance.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchView.swift
已实现
已验证
证据路径
windows/tauri/src/styles/project-gradient.css
windows/tauri/src/features/window/hooks/use-project-gradient.ts
windows/tauri/src/features/window/utils/project-gradient.ts
windows/tauri/src/features/settings/lib/settings-effects.ts
windows/tauri/src/features/settings/components/tabs/appearance-settings.tsx
windows/tauri/src/features/window/components/project-avatar.tsx
windows/tauri/src/features/window/utils/project-avatar.ts
Workbench在 Windows 用 Lithe Dark 与 Lithe Light 打开项目,确认渐变在标题栏项目名图标处最浓并向右、向下淡出,侧边栏与编辑区之间的缝隙同样带渐变;打开另一个项目确认颜色可能不同且重新打开时保持一致;在外观设置关闭“用颜色区分项目”、开启窗口透明度或切换到非 Lithe 主题时渐变消失;切换到其他应用时渐变减弱。在 macOS 打开同一路径的项目,确认颜色序号与 Windows 一致。 确认标题栏左上角项目头像颜色与渐变同色、为 4px 圆角渐变方块且首字母按 IntelliJ 规则(如 Lithe-IDEA-issue-35-ci 显示 LC);项目菜单和欢迎页最近项目使用同一头像,已不存在的项目头像为灰色。
两端都用项目路径的 64 位 FNV-1a 哈希从 IntelliJ Islands 的 9 种 RecentProject 颜色中取色(不存储、不可自定义),并以 0.85 混入窗口底色;Windows 额外忽略路径大小写与分隔符差异。Windows 提供“用颜色区分项目”开关(默认开启,对应 IntelliJ differentiateProjects),仅在 Lithe 主题且关闭窗口透明时绘制,窗口失焦时按 0.56 减弱;macOS 无开关与失焦减弱。 两端深色项目色相同;macOS 浅色项目色沿用旧版 IntelliJ New UI(expUI_light_with_light_header)的取值,Windows 浅色使用 ManyIslandsLight 的取值,两者略有差异。
工作台 / 命令与布局从工作台 chrome 打开设置:Windows 点击标题栏搜索按钮右侧的齿轮,macOS 通过应用菜单及面板内入口
workbench-settings-entry
已实现
待验证
证据路径
macos/Sources/Lithe/Models/LitheAction.swift
macos/Sources/Lithe/Views/App/SettingsView.swift
已实现
待验证
证据路径
windows/tauri/src/features/window/components/title-bar/title-bar.tsx
windows/tauri/src/features/layout/components/sidebar/sidebar-pane-selector.tsx
windows/tauri/src/features/layout/config/item-order.ts
Workbench在 Windows 打开工作区,确认左侧活动栏底部不再显示设置齿轮,活动栏右键“在活动栏中显示”列表不包含设置项;点击标题栏右上搜索按钮右侧的齿轮打开设置对话框并再次关闭;携带旧版设置文件(活动栏排序或隐藏列表含 settings)启动后确认遗留条目被清理且活动栏显示正常。macOS 通过应用菜单和各面板入口打开设置保持不变。
工作台 / 命令与布局工具窗口拖动、分组、排序与布局恢复
workbench-tool-window-docking
已实现
待验证
证据路径
macos/Sources/Lithe/Application/Features/WorkbenchFeatureModel.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchToolWindowDock.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchView.swift
macos/Sources/Lithe/Services/Workbench/WorkbenchLayoutStore.swift
macos/Tests/LitheTests/ToolWindowDockingTests.swift
macos/Tests/LitheTests/LitheSplitPaneCollapseTests.swift
部分实现
待验证
证据路径
windows/tauri/src/features/layout/components/terminal-dock-layout.tsx
windows/tauri/src/features/layout/components/sidebar/sidebar-pane-selector.tsx
windows/tauri/src/features/layout/components/plugin-activity-rail.tsx
windows/tauri/src/features/layout/components/bottom-pane/bottom-pane.tsx
windows/tauri/src/features/layout/components/bottom-pane/bottom-pane-terminal-lifecycle.test.tsx
windows/tauri/src/features/settings/lib/settings-normalization.test.ts
WorkbenchmacOS 将 Project、Database、Terminal、Git Log、Maven 和 Agent 入口拖到左/右主组、第二组及底部左右组,组内拖动排序;核对同组互斥、跨组同时打开、原动作和模块会话保留、标题收起只关闭对应窗口、右键移动和键盘可用性。取消与窗口外释放保持原位置,切换工作区和重启恢复位置/顺序/显隐/尺寸及组内比例,旧布局迁移、损坏与重复标识安全恢复。深浅主题核对 IDEA 资源和落点 token,窄窗口连续调整尺寸不产生负值且仅结束写入设置。Windows 已实现直接拖动活动栏终端图标在左侧、右侧及底部停靠,入口随位置移到对应侧栏,普通点击及键盘激活切换显隐;终端工具栏移动按钮保留,位置及尺寸随应用设置恢复;完整工具分组、排序与各工作区布局仍缺失。实机检查从左下角终端入口拖到左右两侧及底部(包括两侧栏的下角),隐藏时拖动须等有效释放才打开,已有会话需在显示提交后获得输入焦点(取消仍保持编辑器焦点),取消须保留原工具和显隐,落点遮罩与释放位置一致,左侧分隔条向右增加宽度、Esc/失焦/窗口外/切换项目取消、不重复触发点击、窄窗口调整宽高、隐藏后再次展开和重启恢复;确认 PTY、输出、输入、工作目录、终端标签排序及编辑器拖入不变。组件回归保持同一 TerminalContainer 和输入 DOM,不能替代 WebView2 验收。 激活入口的浮动拖动预览显示普通图标和 IDEA 灰色圆角背景/同色 1pt 边框,边角透明,不带源按钮激活或 hover 背景;活动栏自身仍保留正常 hover 提示。 左、右及底部双分组各有独立背景和圆角,组间是工作台间距;核对 Project 与 Terminal 相邻时不连成一个面板,调整比例后仍保留终端输入和其他面板。 分隔器松开到父布局回传期间保持最终尺寸,不回跳;低于10%及高于90%的合法窄面板比例保存后和重启后不被二次夹紧。 将 9 个工具入口放入 280pt 滚动视口,滚动后点击或拖动邻组按钮,验证隐藏入口不截获事件、不进入落点快照;部分可见入口只在可见区域接受按下与释放,隐藏祖先也不能响应。 拖动源不留空槽,相邻按钮即时补位且浮动图标和鼠标生命周期不中断;蓝色插入槽内目标稳定,补位后的按钮使用实时可见边界命中。底部入口平移进入当前底部面板时保持 Bottom Left/Right,进入上方侧面区域才切换侧面停靠;遮罩使用当前面板真实高度,双组使用真实比例而非固定二分,调整面板大小后重新拖动仍一致。侧面空槽只沿编辑区高度预测,未打开底部时按 Community 200pt/四分之一默认值;取消恢复源入口,不修改持久布局。 将组内第二个按钮保持 Y 不变水平拖入内容区,蓝色占位必须保留中间位置,不能跳到列表末尾;上下经过按钮中点后顺序才改变,真正移到所有按钮下方才追加。直接经过侧栏和移入内容区使用相同主轴投影判定。 主工具栏不显示 Workbench Actions 省略号及其 tooltip;验证现有工具窗口和工具栏入口的右键管理动作、注册贡献执行及偏好存储仍正常,不新增替代菜单入口。 在无背景图且目标区域已显示 Git Log 或终端时,拖入底部左右目标,落点高亮和位置文字应显示在不透明内容上方;明暗主题及带偏移的工作区保持正确坐标,提示不截获鼠标,取消后消失且保留内容宿主不重建(ToolWindowDockingTests.dropPreviewStaysAboveRetainedPane)。
工作区 / 工作区生命周期脏状态、保存与外部修改
workspace-document-sync
已实现
待验证
证据路径
macos/Sources/Lithe/Models/Editor
macos/Sources/Lithe/Application/Features/DocumentFeatureModel.swift
macos/Sources/Lithe/Services/Workspace
macos/Sources/Lithe/Platform/MacOS/FileSystem/MacWorkspaceFileOperations.swift
macos/Sources/Lithe/Platform/MacOS/UI/MacPlatformUI.swift
macos/Tests/LitheTests/DocumentHardLinkTests.swift
macos/Tests/LitheTests/DocumentOpenAndHardLinkWorkflowTests.swift
macos/Sources/Lithe/Services/Remote/RemoteWorkspaceRouting.swift
macos/Tests/LitheTests/RemoteConnectionsTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/editor
windows/tauri/src/features/file-system
windows/tauri/src/features/editor/stores/editor-app.store.ts
windows/tauri/src/features/editor/stores/editor-app.store.test.ts
Workspace编辑未保存文件、外部修改文件并重启应用,确认冲突、保存和恢复行为;另在 Windows 于写入进行中继续连续编辑,确认更晚的正文仍被写入且未保存标记消失;再制造写入失败并关闭自动保存,确认不会自动补写。 macOS 创建两个硬链接 POM,分别验证独立保存不改别名、更新全部保留同一底层文件、取消不丢失编辑、自动保存不写盘且不弹确认、关闭/运行前保存取消会中止后续动作;自动检查尚未完成时触发手动保存,应在同一次操作里弹出确认并保存最新输入,显式编码须保留,取消/重置/关闭/移走再移回不得接续,普通权限错误不重试;确认期间更改目标/内容/链接数须拒绝覆盖。核对权限、超过 32 MB、无效编码、符号链接、目录与命名管道的中英文提示;完整产品弹窗验收仍 pending。 Windows 连续输入时自动保存在停顿 1 秒后写入,切到其他窗口、终端或其他面板时立即写入;运行前保存不受该延迟影响。
Windows 延迟自动保存对齐 macOS 的“写入成功但仍有更晚输入就继续保存”语义:写入进行中到期的那次自动保存不再被丢弃,而是在被等待的写入成功结束后继续保存最新正文;该写入失败或冲突时按 operationId 取消续存,每次领取前重读实时自动保存开关,关闭即取消,请求被更晚编辑取代或文档关闭时停止,失败与冲突不重试。被等待的写入若在领取被拒与重读之间结束,则只按其 lifecycle savedRevision 是否前进(即是否真的落盘)决定继续还是丢弃,不再仅凭 dirty 续写。共享生命周期状态机不变,前端回归改为注入手动计时器验证成功续存、写入失败、关闭自动保存、手动保存失败,以及领取拒绝窗口内写入成功/失败两条路径;完整产品实机验收仍为 pending。 macOS #1419:硬链接文本允许打开和编辑,保存时逐次确认“保存为独立文件 / 更新所有硬链接 / 取消”;自动保存暂停并提示手动选择;显式保存若已在等待该自动检查,则按自己的编码与确认策略接续保存,重新检查取消、会话、文档归属和位置,不重试普通 I/O 失败或冲突,确认后继续校验底层对象身份、链接数和字节基线,原地写明确不保证原子性,回撤仍拒绝多链接对象。打开失败区分缺失、权限、目录、大小、解码、符号链接、特殊文件与真正非文本,成功解码的非文本可探测二进制查看器,解码失败只接受明确二进制签名,不凭扩展名吞掉编码错误;其他读取失败不走查看器。本地/远程路由转发本地授权、拒绝用本地对象授权写远程文件,原地写后即使失败也主动核对打开的别名,保护别名中的未保存输入。Windows 保持既有硬链接策略,未声称两端一致。 Windows 自动保存防抖为 1 秒(与 VS Code 默认值一致),失焦时立即写入;每次写入都会触发语言服务重新加载文件,所以不能在单词间隙写入。
工作区 / 工作区生命周期文件树与文件操作
workspace-files
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Workspace
macos/Sources/Lithe/Views/Components/LitheCenteredPopup.swift
macos/Sources/Lithe/Models/Workspace/ProjectTreeLoader.swift
macos/Sources/LitheWorkspaceModule/Application/WorkspaceFeatureModel.swift
macos/Tests/LitheTests/ProjectTreeLoaderTests.swift
macos/Tests/LitheTests/LazyProjectTreeInventoryTests.swift
macos/Sources/Lithe/Platform/MacOS/UI/ProjectTreeRowInteraction.swift
macos/Tests/LitheTests/ProjectTreeSelectionTests.swift
macos/Sources/LitheGitModule/Models/GitModels.swift
macos/Tests/LitheGitModuleTests/GitModuleTests.swift
macos/Sources/Lithe/Theme/LitheIcons.swift
macos/Tests/LitheTests/ProjectTreeLayoutMetricsTests.swift
macos/Tests/LitheTests/IDEAIconRasterizationTests.swift
macos/Sources/LitheCoreContracts/Workspace/FileVisibilityRules.swift
rust/lithe-core/src/project/files.rs
rust/lithe-core/src/tests/project.rs
.agents/notes/implemented/feature/2026-10-29-skip-python-environments-in-workspace-scans.md
macos/Tests/LitheTests/LitheCoreLogicTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/file-system
windows/tauri/src/features/file-search/lib/file-search-api.ts
windows/tauri/src/features/file-search/lib/file-search-api.test.ts
rust/lithe-core/src/project/files.rs
rust/lithe-core/src/tests/project.rs
.agents/notes/implemented/feature/2026-10-29-skip-python-environments-in-workspace-scans.md
Workspace新建、移动、重命名、删除文件和目录,并确认相对路径与错误提示一致。 macOS 新建文件与目录复用居中无边框 LitheCenteredPopup,主窗口移动/关闭及失焦取消保持原行为;创建输入框保留原有 plain 样式、13pt 字体、IDEA NewItemSimplePopupPanel 的 32pt 高度及 13pt 输入留白,聚焦时无独立边框和底色;focusedNewItemFieldBlendsIntoPopup 验证深浅模式实际聚焦渲染,文件重命名输入框使用共享 litheSettingsTextField,检查初始焦点、中文输入、空名称拒绝与 Enter 提交。 macOS 共享居中弹窗需在单次点击后立即显示,关闭和重新打开无需其他交互;重复点击不得新增窗口,取消或卸载后不得显示过期弹窗。原生 SwiftUI 状态回归由 LitheCenteredPopupTests 覆盖。 macOS 项目树包压缩读取结果在有界内存中消费复用;验证同一包展开不重复列目录、并发展开与定位共用请求、取消一个等待者不影响另一个,以及文件事件、刷新、过滤规则变化、切换或关闭工作区后不应用旧结果;深层包名与全树转换保持一致。实际项目分别检查首次展开、再次展开、大目录、快速展开收起和定位,记录交互耗时;Windows 保留现有目录加载路径。 目录名称双击在第二次按下时开始展开,松开不重复切换;验证修饰键多选、拖动、文件双击、方向键、定位及切换 Dependencies 后的展开状态保留;无关 AppModel 更新不得重新生成可见树。 macOS 单子目录链自动连续展开且保留各级行,遇到文件、兄弟项、隐藏目录或空目录停止,手动收起不会被无关更新重开;空目录及仅含过滤项的目录无展开箭头,新增文件后恢复内容;验证原版 IDEA 明暗图标、Compose 文件图标和共享树间距。 目录名称只取自身 Git 状态,子文件的删除和冲突不得染红祖先目录,精确文件状态保持;检查本机 IDEA 展开箭头资源与实际留白。 单子目录链在一个后台请求中准备完成后一次发布,首次可见行与箭头状态直接使用整条链的展开集合,不出现 docker 再到 database-validation 的中间帧;校验分叉不预取、失败不发布半链、64 层深度上限和包压缩列表复用。 Project 顶部新增 IDEA 原版全部展开/全部收起:遍历所有分支但不重建文件库存;收起保留项目根并取消在途展开,取消/切换工作区不应用旧状态;定位、刷新、展开/收起随整个项目区悬停显示。 共享 IDEA SVG 渲染先生成 4x 透明位图再按原逻辑尺寸显示;真实 chevronRight/Down、expandAll/collapseAll 在深浅模式和 1x/2x 保持边缘对称,实际检查端点、转角及工具栏按钮原动作。 连续展开探测省略不可读或消失的子路径时,普通目录与压缩包保留可读父层和未加载末端,同批其他目录仍可发布;取消仍拒绝发布。 工作区扫描默认跳过 .venv、venv、__pycache__ 目录和 *.pyc 文件:在含 Python 虚拟环境的项目中打开工作区,确认快速打开、全局搜索和 Spring/MyBatis/Maven 索引不再出现这些路径,且普通源码文件不受影响;macOS 文件树不再显示 .venv,设置页内置隐藏规则列表包含这四项;Windows 文件树仍能看到 .venv(由前端隐藏路径设置控制),其 __pycache__ 与 *.pyc 默认已隐藏。Windows 请求快照时只取文件清单(includeTree: false),打开项目后观察内存不再因整棵树的序列化而出现额外高峰,实机验收 pending。 macOS 外部文件事件使用随库存更新的文件及祖先目录集合查询,规范化事件去重;运行 largeExternalEditBatchUsesInventoryMembershipWithoutRescanning 固定 4000 文件批次计时,以及连续增删、目录类型替换、工作区重置回归。大型真实工作区仍需采样确认主线程占用和空闲 CPU 回落。
工作区 / 工作区生命周期目录索引排除与 Git 自动排除
workspace-indexing-exclusions
部分实现
待验证
证据路径
macos/Sources/LitheWorkspaceModule/Application/WorkspaceFeatureModel.swift
macos/Sources/Lithe/Views/App/WorkspaceIndexingSettingsView.swift
rust/lithe-core/src/project/indexing.rs
shared/fixtures/workspace/indexing-policy-v1.json
rust/lithe-core/src/lsp/languages/indexing.rs
macos/Tests/LitheTests/RemoteConnectionsTests.swift
macos/Sources/Lithe/Views/Workspace/ProjectSidebarView.swift
macos/Sources/Lithe/Views/App/GitExecutionSettingsView.swift
macos/Tests/LitheTests/SettingsSearchVocabularyTests.swift
.agents/notes/implemented/architecture/2026-10-28-workspace-indexing-exclusions.md
macos/Tests/LitheTests/LazyProjectTreeInventoryTests.swift
macos/Tests/LitheTests/WorkspaceSessionCoordinatorTests.swift
macos/Tests/LitheTests/GitStatusObservationTests.swift
macos/Tests/LitheTests/RunEntryPointTests.swift
shared/fixtures/workspace/directory-actions-v1.json
macos/Sources/Lithe/Models/AppModel/AppModel+LanguageServerRuntime.swift
部分实现
待验证
证据路径
windows/tauri/src/features/file-explorer/stores/workspace-indexing.ts
windows/tauri/src/features/settings/components/workspace-indexing-settings.tsx
rust/lithe-core/src/project/indexing.rs
shared/fixtures/workspace/indexing-policy-v1.json
rust/lithe-core/src/lsp/languages/indexing.rs
windows/tauri/src/features/file-explorer/hooks/use-file-explorer-context-menu.tsx
windows/tauri/src/features/settings/components/git-execution-settings.tsx
windows/tauri/src/features/settings/components/git-indexing-settings.test.tsx
windows/tauri/src/features/file-explorer/stores/directory-marks.test.ts
windows/tauri/src/features/file-system/stores/file-system.store.ts
windows/tauri/src/features/editor/lsp/lsp-client-indexing.test.ts
windows/tauri/src/features/file-search/lib/file-search-api.test.ts
windows/tauri/src/features/file-search/hooks/use-fff-search.test.tsx
windows/tauri/src/features/file-explorer/stores/workspace-indexing.test.ts
windows/tauri/src/features/editor/hooks/use-lsp-integration-indexing.test.tsx
windows/tauri/src-tauri/src/core.rs
windows/tauri/src/features/workspace/services/workspace-lifecycle.ts
windows/tauri/src/features/file-system/services/file-watcher-listener.ts
windows/tauri/src/features/file-system/services/file-watcher-listener.test.ts
windows/tauri/src/features/file-explorer/stores/directory-marks-storage.ts
windows/tauri/src/features/global-search/hooks/use-content-search.integration.test.tsx
shared/fixtures/workspace/directory-actions-v1.json
windows/tauri/crates/project/src/indexing_refresh.rs
windows/tauri/crates/project/src/git_watcher.rs
windows/tauri/src/features/git/runtime/git-metadata-watch-host.tsx
windows/tauri/src/features/editor/lsp/mounted-lsp-documents.ts
Workspace2026-11-01:18841d18的Windows前端、共享Core和真实JDT通过,宿主测试因原始路径与规范化刷新表键混用失败。后续仅修正宿主测试:真实临时目录、请求别名与规范化身份分离、共享刷新状态和最后租约释放回归、失败清理;生产代码及预算不变。静态门禁和只读审查通过,本机Windows测试按用户要求不运行,修复后的Windows CI另按提交核验,原生产品验收仍pending。 本轮整合基线4e47d784后的目录动作、租约刷新及监听所有权补修随本记录提交到PR1597,准确提交身份见PR说明;本地源码哈希与验证报告保存在.artifacts/pr1597-final-verification。Core完整门禁、桥接、Swift聚焦33条和静态门禁通过。macOS独立QA已验证Git忽略→取消排除→源码角色、真实搜索与落盘例外;自动化窗口连接故障使第二方向菜单和重启界面验收未完成。用户要求本机不进行Windows测试,最新LSP所有权和在途编辑补修仅静态检查/审查,新增回归未运行;此前Bun79、project Rust41、宿主5条组件结果不覆盖后续源码,也不代替Windows A/B切换、多仓库、共享根和LSP恢复原生验收。两端本轮验证保持pending,历史记录按各自源码阅读。 较早本地验收阶段未执行 Windows/Frontend 测试;用户随后授权 Ready 触发完整自动 CI,原生界面验证仍单独记录。整合 preview a1ed8f4c 后,补修源码921c888c通过完整Core1484项、本机Swift6.4.2/Xcode27.2受影响182条(含完整Git观察28条)、Rust↔Swift桥接及Core边界检查;编译与测试按现有CI分离,未放宽计时预算。完整开发App原生验收确认排除目录与后代仍可浏览并显示排除图标,冷JDT仅导入visible且实际返回PrintStream补全,外部stage/commit自动更新且JDT和补全保持;用户操作取消排除后由代理核验搜索、落盘、重启持久化及A/B项目查询与关闭隔离。损坏配置随App语言中英即时切换且原值保留,修正后显式重试成功;真实权限失败分别显示中英文错误,权限恢复后观察到项目重载,代理未点击该流程的Retry。1419包文件/9符号链接及签名不变;QA/JDT/辅助进程清理,用户Dev保留,开发偏好精确恢复,新增缓存归档。4e7b8441的插件512条及合成库存10202/201剪枝结果保留原版本,不能当作UI或LSP后台性能基准。较早源码的普通角色、linked-worktree和子模块原生证据见Note。macOS在上述能力范围完成本机运行验证,固定Xcode26.6完整CI与本机结果分别核对;Windows新回归仅书写和静态复审,原生仍pending。Java显式构建模块仍可能扫描,Go/Rust配置送达不等于后台零扫描。 后续补修内容搜索首次请求、加载更多及索引状态的错误呈现:保存类型化错误,按当前语言使用共享词条,不拼接内部错误码;本机Bun1.3.13的19条逐项计时及TypeScript检查通过,损坏偏好保留、语言切换不重搜及加载更多保留结果有回归。真实页面有结果时显示紧凑错误和重试,失败暂停自动翻页;新增回归接入Windows CI隔离分组;该补修的固定工具链及Windows CI按对应提交的PR报告单独记录,Windows原生界面保持pending。 批量Run夹具增加首扫完成与快照UUID同步,本机Swift6.4.2完整Run入口21条通过,固定工具链结果以对应PR提交报告为准。 继而统一全部10处Run/Debug/单项/批量/服务/重启首次库存发布:在主actor空闲边界释放库存,重查排队刷新状态并核验准确快照UUID,保留刻意门控的调用方刷新任务;本机完整Run入口21条在三个独立进程中通过。 目录标记读取由树与索引配置共用版本、结构、角色和相对路径校验,真实内容搜索API回归用于核验非法JSON、空结构、null、错误marks类型及越界路径均显示共享中英错误,切语言不重搜、不调用Core安装空策略、不覆盖原始存储。
工作区 / 工作区生命周期打开工作区与切换项目
workspace-open-switch
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Workspace
macos/Sources/Lithe/Views/App/WelcomeView.swift
macos/Sources/Lithe/Services/Workspace
macos/Sources/Lithe/Application/Composition/WorkspaceProjectionComposition.swift
macos/Sources/LitheGitModule/Application/GitRepositorySetupFeatureModel.swift
macos/Tests/LitheTests/ProjectSwitcherBranchTests.swift
macos/Tests/LitheTests/ContextMenuCoverageTests.swift
macos/Sources/Lithe/Views/Workspace/OpenProjectLocationDialog.swift
macos/Sources/Lithe/Views/Components/LitheActionButtonStyle.swift
macos/Sources/Lithe/Views/Workspace/OpenProjectPanel.swift
macos/Sources/Lithe/Models/AppModel/AppModel+LocalFolders.swift
已实现
待验证
证据路径
windows/tauri/src/features/workspace
windows/tauri/src/features/file-system/controllers/project-open-destination.ts
Workspace打开多个项目并在项目之间切换,确认当前项目、文件树和编辑器状态正确;macOS 重启并恢复上次在 Search 等其他侧栏打开的工作区时,默认显示 Project 侧栏,打开的编辑器文件仍恢复。 macOS 欢迎页应用名、Projects、普通项目名及 New Project/Open/Clone Repository 按钮使用 Inter Regular 常规字重,与 IDEA WelcomeScreenComponentFactory 的 Font.PLAIN 和项目默认标签一致;搜索提示与项目路径保持常规字重。 打开多个项目并在项目之间切换,确认当前项目、文件树和编辑器状态正确。Windows 端询问弹窗提供 This Window(替换当前项目)/ New Window / Attach / Cancel 四个选项,勾选"不再询问"后记住所选目的地(设置项 projectOpenDefaultDestination),替换前对未保存缓冲区只弹一次确认,确认后原项目即锁定为关闭中(不可切回编辑),新项目打开失败时回滚保留原项目;关闭项目时若后继项目切换失败则中止关闭并保留原项目。 macOS 项目切换菜单按名称、路径和当前分支内容测量宽度,仅受屏幕可见区域限制;打开项目和最近项目中的 Git 仓库在路径下显示分支图标与名称,普通目录不显示该行。外部切换分支后重新打开菜单读取最新名称,元数据读取不覆盖 Git 身份草稿;检查明暗主题和长路径。 macOS 项目打开位置提示使用带标题的 LitheCenteredPopup、共享勾选框和统一按钮;在明暗主题及中英文验证长项目名换行、统一悬停底色、默认动作 Return、取消 Escape/关闭窗口、不再询问持久化、新窗口和此窗口打开。仅请求所属窗口显示,旧请求取消不得影响新请求,父窗口输入在提示期间被阻止。 Windows 端点击路径已不存在(或已不是文件夹)的最近项目时,弹出“Recent Project Unavailable”确认框,选择“Remove From List”会把该项从最近项目移除,取消则保留并标记为缺失;标题栏项目菜单的最近项目行悬浮显示移除按钮(聚焦行按 Delete/Backspace 同样移除),缺失项目头像和文字灰显且移除按钮常驻,点击移除不会打开项目也不会关闭菜单。 macOS 已保存 SSH 连接时,Open(欢迎页、菜单 Open Project…、项目切换器)弹出统一选择面板:左侧「本地文件夹」与各 SSH 连接,右侧在面板内浏览目录并显示修改时间与大小,选 SSH 主机时自动连接并浏览远程目录,点 Open 在当前窗口打开所选目录;没有保存连接时直接弹系统选择面板。在 800×650 的小窗口和大窗口验证面板完整显示、连续点击后尺寸不变,进入桌面等受保护文件夹时系统授权弹窗出现一次,Esc 取消,左下角“远程开发”进入连接管理。
工作区 / 工作区生命周期多项目与多标签
workspace-tabs-projects
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Workspace
macos/Sources/Lithe/Views/Editor
macos/Sources/Lithe/Views/Workbench/WorkbenchView.swift
macos/Sources/Lithe/Views/Workbench/WorkbenchToolWindowDock.swift
macos/Tests/LitheTests/ToolWindowDockingTests.swift
已实现
待验证
证据路径
windows/tauri/src/features/workspace
windows/tauri/src/features/tabs
windows/tauri/src-tauri/src/project_windows.rs
windows/tauri/src-tauri/src/project_window_registry.rs
windows/tauri/src/features/window/services/project-window-router.ts
Workspace同时打开多个项目和文件,确认标签、项目上下文和关闭恢复行为。 Windows 重复打开同一本地目录(含大小写、分隔符和目录链接别名)时,恢复并聚焦已有窗口及项目标签;连续打开只产生一个窗口,关闭或打开失败后可以重试。 macOS 明暗主题检查紧凑项目标签:按名称、当前文档及 Agent 提醒测量宽度(120~360pt),28pt 高度、4pt 圆角、6pt 间距;选中中性底色、悬停轻量底色,无外框或下划线。标签栏位于左右工具栏之间,三者顶端对齐,中间列两侧及标签栏下方保留 4pt 间隔,标签栏外容器复用工作台面板的 10pt 圆角及渐变收口;单项目隐藏标签栏且保持原间距,其他面板设计不变。名称为 13pt Regular,目录和关闭图标为原始 16pt IDEA 资源。验证切换、关闭、关闭显隐、长名称截断、窄窗口滚动及 Agent 提醒仍可用。主工作窗口红色关闭按钮应确认本窗口全部未保存文档并等待全部项目清理,再回到欢迎页;取消或保存失败保留所有项目,重复点击不重复清理。标签关闭仍仅关闭单个项目;独立窗口、Cmd+W 及其他窗口项目隔离保持原行为。 macOS 同窗口打开多个项目并反复切换,点击 Agent、Terminal 等工具入口只展开或收起当前项目的面板;按下或拖动期间切换不触发旧项目的点击或移动,浮动预览及时关闭。两个窗口分别保留自己的当前项目,首次点击可用。标题栏、项目标签栏、工具栏、字体、间距和面板外观保持原样。
工作区 / 工作区生命周期项目树独立多选、范围选择及批量拖动移动、复制、重复和移到废纸篓
workspace-tree-batch-files
已实现
待验证
证据路径
macos/Sources/Lithe/Views/Workspace/ProjectSidebarView.swift
macos/Sources/Lithe/Views/Workspace/ProjectTreeSelection.swift
macos/Sources/LitheWorkspaceModule/Application/WorkspaceFeatureModel.swift
macos/Sources/Lithe/Platform/MacOS/UI/ProjectTreeKeyboardCommands.swift
macos/Sources/Lithe/Platform/MacOS/UI/ProjectTreeRowInteraction.swift
macos/Tests/LitheTests/ProjectTreeSelectionTests.swift
macos/Tests/LitheTests/ProjectTreeBatchFileWorkflowTests.swift
macos/Tests/LitheTests/LitheCoreLogicTests.swift
.agents/notes/implemented/bug-fix/2026-10-05-project-tree-selection-and-moves.md
未实现
不适用
证据路径
windows/tauri/src/features/file-system
WorkspacemacOS:单击目录名称只选中本行,箭头展开/折叠,子项不继承高亮;⌘ 点击增减独立选择,Shift 正反向选择,Control 点击右键、右键未选中子项只作用于该行;⌘A 仍选择焦点项同级。拖动已选项携带整组,拖动未选项只携带该项,目录整体移动,父子去重;同窗口项目目录接收拖放,项目根不能移动,同目录无操作,同名整批拒绝,目录移入自身/后代和符号链接越界拒绝;中途失败报告已完成数量、保留剩余源项,切换工作区停止后续项。确认未保存文件保护、成功移动后打开文档路径/历史/目录标记更新;外部拖放仍提供文件 URL。大目录分别测量选择、展开和滚动,懒加载行应能滚动到末尾,折叠与定位保持正确。保留复制/粘贴/副本/废纸篓、快捷键焦点和双击可执行文件回归。Windows 尚无该多选入口;macOS 实机事件、性能及 Swift 测试需在目标平台验证。
Windows 专属 / WSL跨 WSL 边界移动与重命名
wsl-boundaries
平台专属
不适用
证据路径
macos/Sources/Lithe
已实现
待验证
证据路径
windows/tauri/src/features/wsl
windows/tauri/src/features/file-system
Windows PlatformWindows 验证本地、同发行版、跨发行版移动/重命名及明确错误提示。
Windows 专属 / WSLWSL 文件与工作区路径
wsl-paths
平台专属
不适用
证据路径
macos/Sources/Lithe
已实现
待验证
证据路径
windows/tauri/src/features/wsl
windows/tauri/src/features/file-system
Windows PlatformWindows 验证本地文件、WSL 文件、发行版识别和工作区打开。