Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
4f43fe4
feat(windows): unify plugin parity delivery and fixture coverage
Mucheen Oct 25, 2026
bb0e29a
fix(windows): bind plugin approval and recover install transactions
Mucheen Oct 25, 2026
672a699
feat(windows): integrate plugin sources details and build foundations
Mucheen Oct 25, 2026
5ec3ff4
feat(windows): integrate plugin marketplace and build model workflows
Mucheen Oct 25, 2026
fdb0540
chore: sync preview localization updates
Mucheen Oct 25, 2026
f60f62a
Merge commit '80101d861ffcc0c311ba890ff947875aa4d04f01' into codex/wi…
Mucheen Oct 25, 2026
38171fb
feat(windows): extend plugin build execution and model approvals
Mucheen Oct 26, 2026
3a76a0f
feat(windows): wire plugin build actions and refresh LSP attachments
Mucheen Oct 26, 2026
bfe2fcc
feat(windows): add plugin dependencies, Java imports and web build ac…
Mucheen Oct 26, 2026
3639578
feat(windows): add provider sessions and reviewed plugin execution
Mucheen Oct 26, 2026
2e66c8c
feat(windows): connect plugin providers and workspace workflows
Mucheen Oct 26, 2026
268fea2
feat(windows): add archive generators, settings reload and VCS status
Mucheen Oct 27, 2026
bafae6f
feat(windows): extend plugin actions, generator forms and VCS roots
Mucheen Oct 27, 2026
64c5865
feat(windows): connect plugin functions, native panels and VCS history
Mucheen Oct 27, 2026
0db6a86
Merge remote-tracking branch 'origin/preview' into codex/windows-plug…
Mucheen Oct 27, 2026
2d6c727
feat(windows): integrate scoped plugin reload and native VCS actions
Mucheen Oct 27, 2026
e700c56
Merge latest preview into Windows plugin parity integration
Mucheen Oct 27, 2026
7ee2f1e
feat(windows): 补齐插件停靠与 VCS 解决清理工作流
Mucheen Oct 27, 2026
90214f2
feat(windows): guard VCS file actions and strengthen plugin acceptance
Mucheen Oct 27, 2026
01bef2c
feat(windows): honor native plugin icons and pinnable info tips
Mucheen Oct 27, 2026
33a9ccf
Merge preview into Windows plugin parity integration
Mucheen Oct 28, 2026
ae89d43
feat(windows): add search clearing and verify plugin settings workflows
Mucheen Oct 28, 2026
272f2e3
fix(windows): harden plugin acceptance diagnostics and native controls
Mucheen Oct 28, 2026
f84ddef
fix(windows): preserve native tree keyboard menus and verify web fall…
Mucheen Oct 28, 2026
6e96c64
fix(plugins): stack native actions and add bounded text acceptance
Mucheen Oct 28, 2026
a22945c
test(windows): maintain bounded native plugin browser regression
Mucheen Oct 28, 2026
839949c
test(windows): verify native tree menus and harden acceptance prepara…
Mucheen Oct 28, 2026
8742ef1
fix(windows): select native JDTLS tar and verify plugin form grids
Mucheen Oct 28, 2026
8a05359
test(windows): verify native plugin control input workflows
Mucheen Oct 28, 2026
ae8a365
test(windows): cover native plugin workbench workflows
Mucheen Oct 28, 2026
2193e60
Fix Windows frozen dependency installation sources and proxy lifecycle
Mucheen Oct 28, 2026
732a4ad
fix(windows): preserve installer identity and reject invalid proxy ro…
Mucheen Oct 28, 2026
71229ce
Merge preview into Windows plugin parity R26 baseline
Mucheen Oct 28, 2026
04f4118
test(windows): verify installed plugin bytes across native lifecycle
Mucheen Oct 28, 2026
b5dd6ed
Fix plugin build-input identity and empty-root detection
Mucheen Oct 29, 2026
acb36e0
feat(windows): dock declarative plugin tools in the workbench
Mucheen Oct 29, 2026
0b03109
fix(windows): align docked web clients and retain shutdown cleanup
Mucheen Oct 29, 2026
c933fbe
fix(windows): show docked webviews above the workbench
Mucheen Oct 30, 2026
a9b864d
merge: integrate preview host responsiveness and settings transactions
Mucheen Oct 30, 2026
09ca988
test(windows): document bounded native installer watchdogs
Mucheen Oct 30, 2026
a7f36d0
merge: integrate preview with Windows plugin parity baseline
Mucheen Oct 30, 2026
cffc4be
fix(windows): preserve plugin drafts and validate generator workflows
Mucheen Oct 30, 2026
23dbcf4
merge: preserve plugin workflows with preview LSP and host APIs
Mucheen Oct 30, 2026
c7e3f72
feat(windows): admit consent-bound project generators
Mucheen Oct 30, 2026
4b9f091
merge: preserve plugin workflows with preview performance and Java up…
Mucheen Oct 31, 2026
7e327ea
fix(test): open the compact menu before generator workflows
Mucheen Oct 31, 2026
9ceb197
test(windows): bind generator acceptance to the opened workspace
Mucheen Oct 31, 2026
5f2371b
test(core): bound push fixtures and budget measured Windows cases
Mucheen Oct 31, 2026
31b8635
test(core): bound multi-call Git inspection fixtures
Mucheen Oct 31, 2026
326b3d3
fix(windows): support fieldless generators and isolate acceptance output
Mucheen Oct 31, 2026
ddd5fb7
merge: preserve Windows plugin workflows with preview editor APIs
Mucheen Oct 31, 2026
7bf927e
fix(ci): classify independent editor plugin fixtures
Mucheen Oct 31, 2026
29c46ab
test(windows): add generated Java workflow acceptance driver
Mucheen Oct 31, 2026
aaa934e
Fix Windows generator workspace handoff and real JDK acceptance
Mucheen Oct 31, 2026
7130d94
Fix acceptance capability parsing for test-only host override
Mucheen Oct 31, 2026
81ed9ef
Add gated Windows Java workflow acceptance entry points
Mucheen Oct 31, 2026
d11614a
Add gated Windows Java package candidate and publisher trust
Mucheen Oct 31, 2026
d5e47e1
fix(macos): 修复分支列表悬停长分支名时触控板无法滚动 (#1621) (#1625)
ZJUSCODE Oct 31, 2026
4518758
Fix native folder picker input in Windows acceptance
Mucheen Oct 31, 2026
a0aa559
fix(macos): forward hidden branch expansion clicks and clean up on cl…
xiaoyumuxi Oct 31, 2026
d010689
Fix native picker confirmation through its actual button
Mucheen Oct 31, 2026
1f7ba56
Compare the selected JDK home in its native field
Mucheen Oct 31, 2026
6476208
Merge verified Windows plugin baseline for R33 tasks
Mucheen Oct 31, 2026
0d18ab3
fix(plugins): validate frozen Windows Java signing inputs
Mucheen Oct 31, 2026
65c7d89
Preserve Windows acceptance process identity failure diagnostics
Mucheen Nov 1, 2026
2f10056
Add variant-bound Maven and Gradle workflow preflight
Mucheen Nov 1, 2026
8313f08
Wire Java signing and variant evidence into Windows validation
Mucheen Nov 1, 2026
ae0c12d
feat(macos): 状态栏内存只显示图标,帧率去掉图标并收紧间距 (#1630)
xiaoyumuxi Nov 1, 2026
92d98b5
fix(macos): 虚拟化后台服务退出列表并补充滚动性能规范 (#1627) (#1633)
xiaoyumuxi Nov 1, 2026
a432c2d
fix(agent): 修复 Codex 会话启动与历史漏查,新增供应商筛选 (#1632)
xiaoyumuxi Nov 1, 2026
705ac69
feat(macos): 彩色 LSP 状态菜单与普通日志标签页 (#1631)
xiaoyumuxi Nov 1, 2026
8ce4e2c
fix(windows): retain providers across native plugin workflows
Mucheen Nov 1, 2026
5e31898
fix(markdown): preserve inline HTML image layout and alignment (#1623…
xiaoyumuxi Nov 1, 2026
8a58999
feat(markdown): render PlantUML diagrams offline on macOS (#1637)
xiaoyumuxi Nov 1, 2026
b9def66
feat(markdown): add offline chemistry formulas and subscripts on macO…
xiaoyumuxi Nov 1, 2026
9c22adc
Fix Windows plugin scope checks during concurrent reads
Mucheen Nov 1, 2026
35c8aad
feat(macos): 终端标签任意拖拽分屏并保留 PTY (#1638)
icefery Nov 1, 2026
f55f388
fix(plugins): integrate Windows workflow handoffs and close review re…
Mucheen Nov 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,49 @@

## 决策

### 状态栏只投影会话,日志面板不接管协议

macOS 的 LSP 入口始终保留,即使没有源文件、可选语言模块尚未激活或没有运行会话。
列表只能来自平台插件管理器中已接受、已注册且当前启用的插件的语言服务器声明;
内置但作为可管理插件注册的语言服务也必须通过同一个模块启用检查,不能默认列出。
宿主内置语言目录、文件扩展名识别和工具候选不等于服务器注册,不能填充此列表。
禁用、隔离、安全模式抑制、等待首次重启注册或卸载的插件不贡献行。

名称复用现有服务器可执行名字段。插件直接声明 packaged/systemCommand 时取其
`executableNames`;runtime 启动不能把 `java` 或 `node` 当服务器名,改读该插件
languageID 对应描述元数据已有的 `languageServerLaunch.executableNames`(例如 jdtls)。
元数据只补名称,不能绕过已启用插件注册来新增行。没有这个字段时直接显示插件 ID,
不回退语言名、插件展示名或服务器自报名称;不新增清单字段、版本或工具名映射。
状态与版本继续由现有会话投影,代码诊断不改变服务器状态,不按当前文档类型过滤。
空列表仍提供日志和设置入口;批量操作只针对已有会话,不因打开菜单启动服务器。
颜色使用现有主题的成功、强调、警告和错误色,与 LSP 设置页一致。

单个或全部服务器的停止与重启只影响当前会话,不改工作区启用偏好。停止同时
使该提供方已排队的激活请求失效;下一次打开、切换或编辑匹配文档仍可按需启动。
专属准备任务通过在依赖组装处登记的取消回调结束,通用状态菜单不按语言名称分支。
重启先发起停止,等待旧进程的终止事件及异步资源释放,再重新同步匹配的打开文档;
没有打开文档时也重启同一个预热提供方,不把“重启”静默变成“停止”。等待期间保留
`.stopping` 状态和提供方的占位,文档激活不能另起替代进程。停止完成等待有本地期限;
超时返回失败并保留占位,不冒险与旧 JDT 工作区目录锁重叠。等待期间的再次停止、
工作区替换或停用会撤销重启意图,旧关闭完成不能复活服务器。异步/远程启动在取消后
才返回时,同样先停止并销毁该迟到会话,再释放包快照。

重建 Java 索引只重置 Java 的应用状态,不调用工作区整体重置。其他语言服务的
运行投影、日志选择及订阅必须保留;不能清空被 `removeDuplicates` 去重的共享投影后,
指望日志或无变化的状态通知重新填回。

“查看日志”打开或聚焦普通编辑器标签页中的 LSP 日志,不新增底部工具窗口。
日志标签复用混合标签顺序、拖动分组、选择和关闭机制;切换服务器仍使用同一标签。它直接观察现有的最多 100 条会话事件
和服务器输出,按提供方与最低级别筛选;日志更新不经整个 AppModel 广播。
“清空视图”只记住所选提供方当前可见缓冲条目的身份,不删除持久诊断日志,
也不影响其他提供方。标记随缓冲淘汰,不建立另一个无界日志存储。

正确做法是按当前会话事件显示真实内容。不要在 Swift 再实现 JSON-RPC(语言服务器
使用的请求响应协议)抓包器,或把现有文本日志复制成 Server Trace、RPC Messages
三个假通道。当前 Core 没有提供原始跟踪/消息采集,日志标签的工具栏明确提示不可用;
将来确需采集时,应在 Core 既有协议所有者处设计显式启用、脱敏和预算,再扩展契约。
本次没有新缓存目录、下载或安装资源写入,运行时只读发行基线不变。

LSP 子进程、stdio、JSON-RPC 状态机、文档版本、请求 deadline、诊断和
结果归一化统一收归 Rust Core([`rust/lithe-core/src/lsp/`](../../../../rust/lithe-core/src/lsp/)),
平台 adapter 只负责可执行文件与运行环境发现。Swift 只保留 UI 投影和
Expand Down Expand Up @@ -295,6 +338,12 @@ capability 为准。

## 验证

macOS 状态栏投影、停止/重启的偏好边界、过期激活身份、按服务器过滤与清空由
`macos/Tests/LitheTests/LanguageServerStatusTests.swift` 覆盖。使用
`./.agents/skills/write-stable-tests/scripts/test-stability-macos.sh -- --filter LanguageServerStatusTests`
记录逐项计时,并运行 `./scripts/macos/verify/verify-runtime-bundle-immutability.sh`。
这些组件回归不替代真实多语言服务、明暗主题及编辑器标签交互验收。

本次等待策略由 `jdt_progress.rs` 的受控时钟测试和 `engine.rs` 的模拟服务测试
覆盖:45 秒静默仍可就绪、警告去重、变化后再次警告、持续进展也不能越过总期限。
共享示例位于 `shared/fixtures/lsp/jdt-readiness-v1.json`。Windows 的
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ LSP 控制中心和语言工具发现沿用现有 Rust Core LSP 会话。组合

macOS 使用声明式插件包和 publisher Ed25519 包签名;Windows 使用自己的 Tauri 插件包和平台签名、缓存适配器,接入共享契约 `shared/contracts/plugins/v1/` 时复用同一份声明语义。Windows 不得因为跨平台而把 macOS 的目录或构建脚本复制到 Windows。两端都必须满足:插件自有资源、构建时校验、运行时只读安装目录、禁用和卸载可清理自有资源。

Windows Java 候选由 `Plugins/win/Official/JavaSupport/` 与 `scripts/plugins/assemble-windows-java-support.py` 独立维护,离线校验固定下载并选择 Windows JDK、PE 架构和 JDT configuration。候选输出与输入回执走不可复用的 `official-plugin-packages` 路由,只有既有哈希校验路由覆盖的 JDT/JDK 下载缓存可以复用。Windows 文件签名不封装相邻资源,当前未签名 bundled Java 仍拒绝,生产 `packageTrust` 保持关闭;具体门槛见 [Java 来源与独立发布笔记](2026-10-25-java-plugin-distribution-foundation.md)。

## 考虑过的备选方案

1. 把所有语言服务器随主程序打包:启动简单,但增加主程序体积和每个用户的维护成本,也无法实现按需安装。
Expand All @@ -79,20 +81,23 @@ macOS 使用声明式插件包和 publisher Ed25519 包签名;Windows 使用

用户只为安装的语言承担下载和索引成本,插件包可以独立发布、验证、重装和卸载。构建过程需要访问固定的上游归档,发布环境必须准备对应架构和签名身份;Node.js 等外部运行时仍由平台能力检查,不由插件偷偷写入安装目录。

插件包、解压结果、语言服务器下载缓存和运行时语言工具没有可靠的跨工作树身份标记,继续在 `scripts/resources/worktree-resources.json` 中作为隔离资源处理,不能通过工作树复用脚本复制。
插件包、解压结果和运行时语言工具没有可靠的跨工作树身份标记,继续在 `scripts/resources/worktree-resources.json` 中作为隔离资源处理。只有注册表明确列出、按固定版本/平台/架构及来源哈希独立校验的下载缓存允许复用,不能用下载哈希替代完整包签名或运行时状态归属。

## 验证

- `./scripts/plugins/verify-official-plugins.sh`:检查官方插件组装、语言服务器清单、启动器、包内无原生代码和包签名。
- `./scripts/macos/verify/verify-runtime-bundle-immutability.sh`:确认典型启动和插件工作流不会改写已安装 bundle。
- `node scripts/resources/test-reuse-worktree-resources.mjs`:确认语言服务器下载和插件包不能跨工作树复用。
- `node scripts/resources/test-reuse-worktree-resources.mjs`:确认未注册的资源与完整插件包拒绝复用,固定下载缓存只走独立校验路由。
- `python scripts/plugins/test-assemble-windows-java-support.py`:确认离线 Windows 候选的完整资源、架构、输入哈希和归档安全边界;不当作正式签名或真实 JDT 验收。
- `./scripts/agent-notes/verify-agent-notes.sh`:确认本笔记格式、路径和验证命令有效。
- 相关 macOS 测试:`MacPluginPackageDownloaderTests`、`LanguageServerToolServiceTests`、`LanguageExtensionProcessLifecycleTests` 和 `PluginPackageStoreTests`。
- 新增插件还必须验证下载失败、校验失败、取消、等待重启、重装、回滚、禁用和卸载后的进程与文件清理。

## 适用范围

- `Plugins/mac/Official/`
- `Plugins/win/Official/JavaSupport/`
- `scripts/plugins/assemble-windows-java-support.py`
- `scripts/plugins/build-official-plugins.sh`
- `macos/Sources/Lithe/Platform/MacOS/Plugins/`
- `macos/Sources/Lithe/Platform/MacOS/Runtime/MacRuntimeToolDiscovery.swift`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,21 @@ Git 的工作区、工作树、目录、分支、历史提交和 Stash/Shelf 比
关闭或移走最后一个标签后合并空组;新标签进入当前聚焦的组。文件和会话生命周期不交给布局树。
分隔器继续使用 `LitheSplitPaneView`,尺寸变化留在局部视图,只在释放后提交比例。
分组是当前项目会话状态,本次不增加重启恢复编辑分屏或跨窗口传输。
LSP 日志同样是普通编辑器标签,不登记底部工具窗口。单个工作区只打开一个日志标签,
再次查看另一服务器时复用标签并更新筛选;标签可参与重排和分组。日志不拥有文件缓冲区,
选择它应清除活动文件/媒体/终端投影,关闭后通过混合标签选择恢复原内容,不能关闭未保存文件。
文件通过功能模型直接打开时,也必须让日志标签让出活动选择;工作区重置移除日志标签。
与数据库 PR #17 集成后,数据库标签继续使用其共享工作区和查询状态,统一保留在同一个编辑分组,只允许组内重排;不能直接开放跨组移动,否则两个分组会显示同一数据库上下文。数据库工具窗口及 Services 工具窗口仍支持停靠分组。

### 终端标签使用独立的 AppKit 拖放

终端标签不能继续使用 SwiftUI `.onDrag`。Monaco 所在的 `WKWebView` 会消费拖放目标,祖先视图的 `.onDrop` 收不到终端 payload;带文本兜底的 `NSItemProvider` 还会把 “Terminal” 当文本插入编辑器。
拖拽源因此改为 AppKit `NSDraggingSession`,pasteboard 只写私有 `com.lithe.terminal-tab`;编辑器工作区、空编辑器和工具窗正文各放一个只在终端拖拽期间可命中的 AppKit drop overlay。工具窗覆盖层只包住终端正文,不覆盖工具栏,让拖回已有标签左侧或右侧的操作继续使用 SwiftUI 的前后插入逻辑;不能整窗截获后统一追加到末尾。编辑器内继续复用 `EditorGroupDragState` 的分栏预览,标签栏仍交给 SwiftUI 重排。所有预览目标通过同一个去重入口发布,相同落点和重复清空不通知整个编辑分组布局。
外部标签通过 `EditorTabOrderFeatureModel.insert` 加入布局:边缘总是新建分组,中心加入现有分组;工具窗与编辑器之间只移动 placement,不重建终端会话或 PTY。

正确做法:把工具窗终端拖到编辑器底边得到上下分屏,再把同一标签拖回工具窗,shell 提示符和 scrollback 保持连续。
不要这样做:为拖拽重建终端会话,或让工作区继续依赖 Monaco 不会转发的 SwiftUI `.onDrop` payload。

### Git Diff 也属于普通编辑标签

所有仓库比较入口通过 `AppModel` 的共享标签动作进入 `EditorTabItem.repositoryDiff(UUID)`。
Expand Down Expand Up @@ -70,7 +83,7 @@ Git Log 的当前提交选择与已打开的历史比较分开,上一文件/

根编辑区使用稳定的局部状态持有落点几何;不能在每次父视图重建时重新创建被观察对象,否则几何未改变时不会再发布偏好,真实预览会丢失落点。
每个标签组只安装一个原生鼠标监听,完整处理标签按下、拖动和松开,避免 SwiftUI 进入局部鼠标跟踪后漏接跨原生编辑器的快速拖动。
关闭按钮、Control 点击和终端原生拖放仍交给原控件;普通点击、辅助功能动作和原右键菜单继续走现有选择动作。
关闭按钮、Control 点击和终端标签的 AppKit 原生拖放仍交给原控件;普通点击、辅助功能动作和原右键菜单继续走现有选择动作。
鼠标监听按原生 `visibleRect`(经祖先与滚动视口裁剪后的可见区域)命中,隐藏标签不能截获相邻分组点击。分组记录实际标签栏矩形,完整排除第二、第三行再检测正文边缘,不能假设单行 36pt 高度。正文焦点进入时调用完整文档选择动作,清除终端/数据库活动标志;保留的文档 ID 不能代替当前活动项判断。
预览几何在拖动开始冻结,鼠标移动只移动原生面板;目标改变才发布临时半区。
Esc、来源卸载和取消均清理面板;无效落点不改布局。焦点进入另一组文件时,菜单命令同步作用于该文件。
Expand Down Expand Up @@ -104,6 +117,8 @@ Windows 的既有分栏实现不受此次 macOS 呈现改动影响,完整两
- `./scripts/platform-feature-matrix/verify-platform-feature-matrix.sh`
- `./scripts/agent-notes/verify-agent-notes.sh`
- 原生事件检查右侧、底部半区、释放提交、Esc 取消、重排、关闭与焦点;实机预览另检查真实字体资源、代码输入、灰色浮动标签及分隔器调整。
- 终端标签拖放:聚焦测试覆盖外部插入/边缘分屏、私有 pasteboard 与拖拽状态、工具窗终端拖入编辑器不重建进程;真实窗口录屏确认工具窗→底边分屏→右侧分屏→工具窗往返中 PTY 未重建。
- `TerminalPlacementFeatureModelTests.toolTerminalDropOverlayLeavesTheTabBarAvailable` 在两种面板高度挂载真实工具窗视图,检查正文覆盖层不命中标签栏;`EditorTabOrderFeatureModelTests.editorGroupDropPreviewPublishesOnlyChangedTargets` 检查相同落点、目标切换和重复清空的发布次数。实机拖放仍需检查拖回已有标签前后的位置,组件命中验证不代替系统拖放验收。
- `EditorTabOrderFeatureModelTests` 对工作区、目录、分支/引用、历史、保存更改、冲突与行标记入口在深浅主题下挂载原生编辑分组,检查普通标签、切换保留、分屏与共享关闭;`GitModuleTests` 检查独立会话并发加载、关闭一个会话、刷新及迟到结果隔离。组件验证不替代完整产品与 Windows 实机验收。
- `EditorTabOrderFeatureModelTests.explicitNewDiffTabKeepsAnIndependentSessionWhileOrdinaryOpenReusesItsPreview`
验证同文件显式新标签与普通去重共存;`VcsProviderAppModelTests.providerDiffTabsOwnTheirPendingRequestsWithoutStealingFocus`
Expand All @@ -114,8 +129,14 @@ Windows 的既有分栏实现不受此次 macOS 呈现改动影响,完整两
- `macos/Sources/Lithe/Application/Features/EditorTabOrderFeatureModel.swift`
- `macos/Sources/Lithe/Application/Features/EditorGroupLayout.swift`
- `macos/Sources/Lithe/Models/AppModel/AppModel+EditorGroups.swift`
- `macos/Sources/Lithe/Models/AppModel/AppModel+Terminal.swift`
- `macos/Sources/Lithe/Views/Editor/EditorAreaView.swift`
- `macos/Sources/Lithe/Views/Editor/EditorGroupContainer.swift`
- `macos/Sources/Lithe/Views/Editor/EditorTabFrameStore.swift`
- `macos/Sources/Lithe/Views/Terminal/TerminalTabInteraction.swift`
- `macos/Sources/Lithe/Views/Terminal/TerminalTabDragPayload.swift`
- `macos/Sources/Lithe/Views/Terminal/TerminalView.swift`
- `macos/Tests/LitheTests/EditorTabOrderFeatureModelTests.swift`
- `macos/Tests/LitheTests/EditorTabLayoutTests.swift`
- `macos/Tests/LitheTests/TerminalPlacementFeatureModelTests.swift`
- `macos/Tests/LitheTests/MonacoWorkbenchSessionLifetimeTests.swift`
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ Rust Core 负责校验声明、识别工程、展开每一条命令行,并把

没有声明的能力不报错,也不会出现在界面上。例如 Cargo fixture 没有声明依赖树,Build 工具窗口就不显示依赖区。

`build.detect` 对普通文件根或不存在的根保留空实例结果,这属于检测入口的既有兼容边界。共用工作区扫描器后仍在此入口区分根的类型;真实目录的读取、权限或扫描失败继续返回拒绝,不能把所有 I/O 错误当作“未检测到项目”。不要为了修复 Windows 的非目录错误而放宽共用扫描器,也不要让宿主按操作系统错误码猜测空结果。

字段全集只写在 `shared/contracts/plugins/v1/README.md` 的 “API level 3: build systems” 一节和 `plugin-manifest.schema.json` 里,本 Note 不重复。四个 fixture 各示范一种模型来源,按能力命名而不是按真实插件命名:`build-static-file`(读项目文件,内容用 Cargo)、`build-command-stdout`(解码命令输出,内容用 Go)、`build-command-output-file`(解码命令写出的文件,内容用 Gradle)、`build-host-integration`(交给宿主集成,内容用 Maven)。`build-provider`、`build-provider-language-server` 分别示范 Provider 的两种写法。

### 2. Core 与宿主的分工
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,12 @@ Swift 和 Windows 各写一遍合并规则最直接,但两边一旦有细微
- 代价:项目设置文件会出现在用户仓库里,团队需要决定是否提交它。
- 现有的 Java/Maven 项目设置页(`ProjectRuntimeSettingsView`、`LSPControlCenterView` 中的 Maven 重试)仍是宿主代码,属于历史遗留,后续应迁移到 Java 插件的声明里,不能作为新增特判的先例。

Windows 设置验收使用独立 API3 受控插件,而不是删减正式包的 requires。受控包包含既有 LSP fixture,因此必须披露语言服务器权限和完整程序声明,并把获批声明及归档摘要与安装记录逐项比较。注册语言设置页与真实双窗口覆盖保存、空值、重置、字节冲突、项目及全局重载、升级停用卸载;这些受控检查不能替代正式发布包或插件函数验收。

验收观察器适配锁定 Tauri 的 Windows fetch IPC 与真实 callback Map,不改写被冻结的 invoke,不替换原生命令或回复。收尾先恢复 fetch,随后等待已接纳回调有界排空,再正常退出宿主,最后比较运行镜像和插件资源;未退出、未排空、丢失调用或资源变化都不能报告通过。postMessage 回退传输未覆盖,仍是待验范围。

公共搜索清空的产品验收从已开放的插件设置列表进入,保留明确选中的已安装包与原始行身份。通过浏览器输入通道发送 Enter/Space down/up,观察同一输入节点重新获得焦点、零匹配过滤恢复、原选中项和详情不变;不使用合成 DOM 键盘事件或补发 click。该操作应没有声明式插件 IPC。测试失败也保留部分快照、释放元素句柄,并继续执行观察器、原生进程及资源快照的收尾。CDP 输入不能证明物理键盘或真实输入法。

## 验证

- Windows `plugin_host::settings::transaction_tests` 覆盖两个后台编辑保留各自字段、读取到前一次提交以及临时文件回收;既有 `settings_tests` 覆盖删除最后一个值、保留其他插件及损坏文件不被重置。
Expand Down
Loading