Skip to content

feat(debug): #1210 远程 attach 契约与普通 TCP 生命周期边界 - #1525

Merged
xiaoyumuxi merged 5 commits into
previewfrom
feat/1210-remote-attach-contract
Oct 27, 2026
Merged

xiaoyumuxi merged 5 commits into
previewfrom
feat/1210-remote-attach-contract

Conversation

@xiaoyumuxi

@xiaoyumuxi xiaoyumuxi commented Oct 27, 2026 •

Copy link
Copy Markdown
Collaborator

这个 PR 做什么

#1210 的远程 attach 契约:让调试适配器附加到另一台机器上的被调试程序(JVM 开了 -agentlib:jdwp、Node --inspect、gdbserver 等需要主机和端口的场景)。本 PR 只做共享契约和 Rust Core 校验,不改变任何用户可见的调试行为:macOS 宿主还没有接入 attach,“附加到远程”对话框在后续 PR。

基线已更新:#1520 已合并到 preview。本 PR 已将 preview(cdeec194935a3450ebb17c1ef1204cf1aa7fac6f)合入并将 base 改为 preview;使用普通 merge commit cf4ffab70648e8260c116b0866279e8b6172da1c 解决冲突,没有改写历史或 force push。diff 只保留本 PR 的远程 attach 契约和设计说明。

先说范围:普通 TCP 与生命周期,网络通路另案

按本次讨论收敛:当前传输这轮只完成普通 TCP 正常连接与生命周期,复用 #1520,不再另写一套 TCP;保留 stdio。代理、隧道、端口转发、跳板和 SSH 远端执行不在本轮实现,也不作为 TCP 交付的前置。 本次追加提交只更新设计和说明,没有新增这些能力的实现。

独立的范围与验收 Note:2026-10-27-debug-network-paths-and-tcp-lifecycle.md。本轮连接实现应覆盖:

  • 正常建连和有序双向收发;端点解析、建连、请求和停止有界,待发数据有资源上限,不给调试会话设置总时长。
  • 取消、超时、拒绝连接、读写失败、EOF 和停止进入幂等清理链;回调绑定会话及连接代次,过期结果不污染新连接,终止通知只发一次。
  • 仅释放本会话拥有的 socket / 进程,不结束共享语言服务器、外部 DAP 服务、attach 目标或用户建立的 VPN / 隧道;不自动重连或重放 DAP 请求。
  • feat(debug): #1210 tcpLanguageServer 调试传输:调试适配器随插件语言服务器运行(Java 迁入插件的第一步) #1520 的 tcpLanguageServer 仍只接收同插件 LSP 提供的回环端口,不直接放宽为任意远端地址。用户提供的外部 DAP 端点(G2)需要独立入口、校验和确认,并复用已有 socket 生命周期。

要区分两条连接:

IDE -- DAP(stdio 或 TCP)--> 调试适配器 -- JDWP / GDB Remote 等 --> 被调试程序

targetBindings.connection 描述的是后者的适配器参数,不能拿来直接作为 IDE 的 DAP socket 地址。Java、GDB 的远端程序可以由本机适配器连接;默认 debugpy --listen 则会在目标机器上启动 DAP 适配器,需要 IDE 直连那个 DAP 端点,不能只在本机另起适配器并填 connect.host/port 就声称支持。

远程调试不以 SSH 可用为统一前提。端点可直接可达,也可由用户自行提供 VPN / 隧道后的端点;Lithe 本轮不管理这些网络设施。裸 TCP 不带认证和加密,不推荐把调试端口直接暴露到公网。

原 2026-10-27-remote-debug-adapter-over-ssh.md 保留为暂缓的 SSH 子方案草案,不再作为本轮下一步。路径映射优先复用适配器能力,同一对路径空间只转换一次,不预设远端适配器必须由 Core 翻译。

实现现状不变:#1525 仍只有契约和 Rust 校验,macOS 宿主尚未接入 attach / 外部 DAP 直连;上面的范围与验收要求不是已完成声明。

声明形态

attach 配置的 targetBindings 新增 connection,目标种类 connection(TARGET_KINDS 里原本就有,之前没有事实和绑定)。下面展示嵌套参数绑定与映射形状,不是完整的 debugpy --listen 连接配置:

"configurations": {
  "attach": {
    "arguments": { "timeout": 5000 },
    "targetBindings": {
      "connection": {
        "host": "connect.host",
        "port": "connect.port",
        "pathMappings": { "shape": "objects", "argument": "pathMappings",
                          "localKey": "localRoot", "remoteKey": "remoteRoot" }
      }
    }
  }
}
  • 值是适配器参数里的目的地路径,不是固定的目标参数名。各适配器给主机和端口起的名字、嵌套都不一样(hostName/port、connect.host/connect.port、一个 host:port 字符串),按固定名字就得让宿主为每个适配器记名字,等于重新按名字分支。路径最多 4 段,中间对象由 Core 创建。
  • host + port 成对,或 address(一个 host:port 字符串,IPv6 带方括号);至少要有其中一种。
  • pathMappings 可选,四种形状,覆盖按上游文档核对过的主流适配器:objects(对象列表:debugpy pathMappings、delve substitutePath)、first(唯一一条映射写成 local/remote 两个字符串:js-debug)、dictionary(以 keyedBy 一侧为键的对象:CodeLLDB sourceMap、PHP pathMappings)、pairs(二元数组列表,order 为 remoteLocal/localRemote:lldb-dap sourceMap)。
  • 目的地冲突在声明期拒绝:与其他目的地、processId/cwd 参数,或同一配置默认 arguments 里已有的名字相同、包含或被包含,清单就是 plugin.manifest.invalid。否则“默认值优先”会让适配器连到用户没有确认的主机。
  • connection 只允许在 attach 下;selectors[].targetKinds 列 connection 时适配器必须声明该绑定。

运行时行为(debug.adapters.startArguments)

  • 目标 {kind: "connection", host, port, pathMappings?}。主机是 DNS 名或 IP 字面量(1–253 字符,标签 ≤63、不以 - 开头或结尾;不接受 scheme、端口、方括号、空白、用户名;全数字点分必须是合法 IPv4);端口 1–65535;映射最多 16 条(first 形状只接受 1 条),每个根 1–1024 字符且无控制字符,本地根必须是绝对路径。错误码 debug.target.invalid,字段 target.host / target.port / target.pathMappings / target.kind。
  • 映射装不下就拒绝,不截断、不丢弃:适配器没有路径映射绑定、first 收到多于 1 条、dictionary 在键的一侧出现同一个根两次,都返回 debug.target.invalid(target.pathMappings)。丢掉的话会话能启动但断点对不上源码,比启动失败更难排查。
    • 行为修正,请注意:本 PR 第一版的 first 只取第一条映射、静默丢掉其余的,与上面的原则矛盾,审计时发现后改成拒绝。debugAdapters 属于尚未发布的 API 4,没有已发布的契约被改动。
  • 响应新增 connection: {host, port, remote}。remote 只在字面量是 localhost(不分大小写)、127.0.0.0/8、::1 时为 false,其余一律 true,包括 0.0.0.0、::ffff:127.0.0.1、localhost.example.org。Core 不解析域名、不开 socket;判断不了就当远端,最多多问一次。
  • 启动计划的 debugAdapter.remoteAttach 是 {pathMappings: bool, maxPathMappings: n} 或 null(first 为 1,其余映射形状为 16,无映射为 0),宿主据此决定是否显示“连接到远程主机”、映射列表以及最多几行,不按适配器名字判断。
  • 不新增权限:debug.attach 已覆盖,权限表里补了说明。宿主以后对每个新的非回环端点单独确认、默认不记住(和摄像头/麦克风“每次请求都不默认有权限”同一原则)。

改动清单

Rust Core

  • debug/adapters.rs:新增 DebugConnectionBinding、DebugPathMappingBinding(objects/first/dictionary/pairs);DebugConfiguration::validate 增加 attach-only、成对、目的地冲突校验;TargetFacts 增加 host/port/pathMappings;新增 bind_connection、set_argument(只写空位、自动建中间对象)、主机/端口/映射/回环判断;start_arguments 返回 StartArguments { arguments, connection };plan_descriptor 增加 remoteAttach;plan() 对不支持 connection 的请求或适配器拒绝 connection 目标。
  • plugins/declarative.rs:debug.adapters.startArguments 返回 connection。
  • tests/declarative_plugins.rs:新增 9 个 Core 测试(四种参数形状写入、IPv6、四种路径映射形状、回环分类、非法主机/端口、不可用映射及 first/dictionary 装不下时的拒绝、launch/无绑定适配器拒绝、逐适配器的 remoteAttach 描述符);拒绝 fixture 驱动器支持可选的 context.request。

契约与文档

  • plugin-manifest.schema.json:connection 及 debugArgumentName/debugArgumentPath/debugConnectionBinding 定义(host↔port dependentRequired,host 或 address 至少一个)。
  • 新增 fixture debug-adapter-remote-attach.plugin.json(六个适配器,覆盖 flat、nested+objects、scalar+first、joined address、keyed+dictionary、paired+pairs);debug-adapter-rejections.json 新增 28 条用例。
  • 契约 README.md:新增“Remote attach”一节、configurations 行和 debug.attach 权限行;rust-core-api.md:startArguments 的目标字段、响应和错误;shared/proposals/debug-adapters-1210/README.md:targetBindings 段落。
  • [Feature] 类型化 DebugAdapter Registry 与第三方 DAP 接入现有 Debug UI #1210 Agent Note 新增“远程 attach”一节:决策表、被否方案、没做的内容与原因;新增“兼容性审计”:逐个适配器标注每条结论是“已核对”(读过上游文档)还是“待核验”(来自记忆),列出 11 个缺口(G1–G11)的现状、决定和触发条件,以及后续路线;原“下一步:适配器在远端”改为暂缓子方案,并同步调整后续路线。
  • 新增 Agent Note 2026-10-27-debug-network-paths-and-tcp-lifecycle.md(提议中):普通 TCP 与独立网络通路的范围、两条连接的区别、复用 feat(debug): #1210 tcpLanguageServer 调试传输:调试适配器随插件语言服务器运行(Java 迁入插件的第一步) #1520、取消 / 超时 / 过期回调 / 幂等清理 / 资源所有权的验收,以及后续网络方案待评审事项。没有预增代理或隧道清单字段。
  • Agent Note 2026-10-27-remote-debug-adapter-over-ssh.md 保留原有设计探索,但明确暂缓。修正“远端适配器必须由 Core 翻译路径”的过度断言:debugpy 的原生 pathMappings.localRoot 是客户端路径前缀,不要求该目录存在于适配器机器;优先上游映射,不重复转换。主 Note、契约 README 和声明草案同步区分 debuggee 参数与 DAP 端点。
  • 功能矩阵 plugin-debug-adapters.json:补证据和验证说明(macOS 宿主尚未接入,Windows 仍为 missing)。

没做的(有意)

  • 网络代理、隧道、端口转发、跳板、SSH 远端执行:独立方案评审,本轮不新增相关清单字段、认证界面或辅助进程。现有远程工作区的 TransportChain / PortForward 是后续复用候选,不代表调试宿主已经接入或具备完整的托管清理能力。
  • 兼容性审计里编号的缺口(G1–G11):保留记录,不在本次设计更新中预先实现。G2 包括 debugpy --listen、Godot 和 dlv dap --listen 的 DAP 直连入口;它应与适配器连接 debuggee 的 connection 分开,也不强制绑定 attach 请求。G4 的监听 attach、空闲端口、URI、命令模板、带参数 LSP 命令等按真实插件需求单独推进。导入 launch.json 不支持的远程字段时拒绝并说明,不悄悄忽略。
  • IPv6 zone ID、国际化域名:前者依赖本机网卡、写进可分享配置不可移植;后者请用 punycode。
  • 绑定键等于参数名的写法:见上,已否决。

注意:fixture 和参数形状不是适配器运行验收结论,Core 不内置任何一个参数名。此次额外核对了 debugpy 1.8.22 的 listen 启动 DAP 适配器、客户端路径映射 和 GDB 16.3 的 attach target:GDB 接受裸 host:port,自己拼 target remote,无需额外前缀。其余未核验组合仍保持待核验,不能宣称“兼容所有调试器”。

本地验证

2026-10-27 合入 preview 与冲突处理

  • feat(debug): #1210 tcpLanguageServer 调试传输:调试适配器随插件语言服务器运行(Java 迁入插件的第一步) #1520 合并后撤掉堆叠基线,保留其后补的完整实现:从保存配置启动时主动激活语言服务器、端口命令的取消与期限、工作区 / 会话替换后的旧结果保护;相关 macOS 源码和测试与本次 preview 基线逐字节一致。
  • 共享测试保留本 PR 的远程 attach fixture 和绑定校验;Agent Note 与功能矩阵同时保留 feat(debug): #1210 tcpLanguageServer 调试传输:调试适配器随插件语言服务器运行(Java 迁入插件的第一步) #1520 新增的生命周期说明、证据和本 PR 的契约说明。相对 preview 仍是原有 13 个文件,没有新增网络代理、转发或宿主 attach 实现。
  • Rust 逐例计时通过:1296/1296,无超时、无超预算。命令:GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=init.defaultBranch GIT_CONFIG_VALUE_0=master node .agents/skills/write-stable-tests/scripts/run-rust-tests-with-timing.mjs --manifest rust/Cargo.toml --package lithe-core --suite-timeout-ms 1200000 --report .artifacts/test-stability/pr1525-merge-rust-master.json。HTML / JUnit / JSON 均已核对,本 PR 9 个远程契约测试为 8–19 ms,最慢为 debug_start_arguments_refuse_a_remote_target_without_a_usable_endpoint(19 ms)。
  • 首次 Rust 运行的环境限制(保留记录):933 例通过后,既有 git_line_history_keeps_first_parent_chain 在 checkout master 失败;该测试在 git init 后硬编码 master,本机 init.defaultBranch=main。上面的完整通过记录仅在测试进程设置 init.defaultBranch=master 后获得,未改全局 Git 配置,也未修改该基线测试。
  • verify-agent-notes(162 篇)、verify-shared-contracts、verify-runtime-bundle-immutability、verify-service-boundaries、verify-windows-boundaries、verify-rust-core-comments、verify-rust-core-layout、Rust 格式检查、i18n 校验、generate-i18n --check、测试稳定性静态门禁和 diff 空白检查均通过。
  • 精确提交矩阵门禁通过:./scripts/verify-platform-feature-matrix-change.sh cdeec194935a3450ebb17c1ef1204cf1aa7fac6f cf4ffab70648e8260c116b0866279e8b6172da1c;./scripts/verify-platform-feature-matrix.sh 通过(209 项能力)。
  • Swift 本地未验证成功:使用仓库指定 Swift 6.3.3 运行 test-stability-macos.sh --report .artifacts/test-stability/pr1525-merge-swift.json -- --filter 'PluginDebugAdapterTests|LanguageIntelligenceModuleTests|MacBuildProviderSessionsTests',在依赖 manifest 编译阶段因本机 Xcode 27 SDK / 编译器组合报 unknown argument: '-target-arch-variant',0 个测试执行;未改工具链固定版本或测试来绕过。Swift 与 Windows 运行验证仍需对应 CI,不能把本地边界检查当成平台测试通过。
  • 本次没有启动 Lithe 应用或 SSH 隧道;测试进程已退出。本地计时报告在 .artifacts/test-stability/index.html 与 pr1525-merge-rust-master.html,不提交生成物。

上一次范围与文档更新的验证记录(保留)

  • ./scripts/verify-agent-notes.sh:162 篇 active Note 通过。
  • ./scripts/verify-shared-contracts.sh:通过(共享 i18n 与 debug v1 基线检查包含在内)。
  • ./scripts/verify-platform-feature-matrix-change.sh 979ba5ae58b45ccddbeb81f9c26622c4d611b12a b1452a6b08cec2a68fe807215b56915532c08fba、./scripts/verify-platform-feature-matrix.sh:通过(209 项能力)。
  • ./scripts/verify-runtime-bundle-immutability.sh、git diff --check:通过。
  • 仅更新设计 / 契约说明,没有修改 Rust / Swift / TypeScript 实现或测试;没有启动 Lithe、适配器或 SSH 进程,也没有重跑下面的原契约实现全量测试。

原契约实现提交的验证记录(保留)

以下是原 PR 已有记录,不冒称在本次文档更新中重新运行;全部通过,除其中两条说明:

  • cargo test -p lithe-core:1264 + 2 + 25 + 5 个测试通过,0 失败(其中包含本 PR 新增的 9 个 Core 测试和拒绝 fixture 驱动的 28 条新用例)。
  • cargo fmt -p lithe-core -- --check、bash scripts/verify-rust-core-comments.sh:通过。
  • zsh scripts/verify-shared-contracts.sh(契约 fixture、i18n 9372/9372 完整、debug v1 基线 15 项:covered 14、partial 1)、zsh scripts/verify-agent-notes.sh(161 篇)、zsh scripts/verify-platform-feature-matrix.sh(209 项能力)、git diff --check:通过。
  • 平台功能矩阵变更门禁(verify-platform-feature-matrix-change):通过。
  • clippy 说明:cargo clippy -p lithe-core --all-targets --no-deps -- -D warnings 在较新的工具链(1.96)上报 62 条,全部在本 PR 没有改动的行上(例如 debug/adapters.rs 里 3 处 map_or(true, …) 在基线 HEAD 就存在;plugins/declarative.rs 和 tests/declarative_plugins.rs 没有任何条目)。仓库脚本只门禁 rustfmt,不门禁 lithe-core 的 clippy,所以我没有顺手改这些旧代码,避免扩大 diff。
  • verify-rust-core-crates.sh 说明:整套脚本曾因 node --test scripts/test-ide-mcp.mjs 首次运行时 initialize 超时而退出 1(冷启动,与本 PR 无关);单独再跑通过。
  • 没有启动 Lithe 应用,核对后无 Lithe/ssh 残留进程。macOS 宿主未接入 attach,所以应用内的行为验证留给宿主接入的 PR。

后续(不在本次文档更新)

debugAdapters 新增 tcpLanguageServer 传输,用于调试服务寄居在同一插件语言服务器里的适配器(Java Debug Server 之于 JDT LS)。该传输没有 launch.process,endpoint 只有 {languageID, command}:languageID 必须是同一插件 languageServers[] 里声明过的,command 限 [A-Za-z0-9._:-]{1,128}。宿主不拉起进程,而是启动该插件的语言服务器,用 workspace/executeCommand 执行 command,把返回值解析成 1…65535 的端口后连接 127.0.0.1。

Rust Core:DebugLaunch.process 改为可选(其他传输仍必填),新增 DebugTransport::TcpLanguageServer 与 DebugEndpoint 校验;programs() 产出 languageServerDebugAdapter,命令变化需要重新批准;debug_adapter_launch_plan 对无进程适配器返回插件语言服务器的启动计划和 debugAdapter 描述符。

macOS:DebugAdapterProcess 换成 DebugAdapterLaunch(host 为 .process 或 .languageServer);MacJavaDebugAdapterTransport 改名 MacHostedPortDebugAdapterTransport,端口来源由宿主注入,不再知道 Java;LanguageToolingSessionManager 新增 startHostedDebugAdapter,校验语言服务器确由该插件拥有,内置 Java 语言服务被拒绝;端口解析抽成 debugAdapterPort(from:)。tcpPort、tcpAnnounced、attach 和 runSelectedRuntime 仍被拒绝,拒绝文案改为只支持 stdio 与语言服务器承载的适配器。

契约与文档:plugin-manifest.schema.json、契约 README、rust-core-api.md、声明草案和 #1210 Agent Note 同步,新增 debug-adapter-language-server 契约 fixture;功能矩阵补充证据与验证说明。i18n:3 条 Java 专属文案改为通用文案,新增 3 条,调整传输拒绝文案,并重新生成产物。

测试:Rust 新增 3 个 Core 测试;Swift 新增解析器、传输、端口解析(16 个用例)与语言服务器归属测试。
- attach 配置的 targetBindings 新增 connection:host+port 或 address,目的地是适配器参数里的点分路径(最多 4 段),可选 pathMappings(objects/first 两种形状)
- 声明期拒绝目的地冲突(与其他目的地、processId/cwd 参数或默认 arguments 重名/包含),运行期 set_argument 只写空位
- debug.adapters.startArguments 支持 connection 目标,校验主机/端口/映射,返回 connection:{host,port,remote};回环只按字面量判断,其余一律 remote:true
- 适配器没有路径映射绑定而目标带了映射时拒绝,而不是悄悄丢弃
- plan 描述符新增 remoteAttach:{pathMappings},宿主据此决定界面,不按适配器名字判断
- 不新增权限,debug.attach 已覆盖;契约 README、schema、rust-core-api、fixture(含 22 条新拒绝用例)、功能矩阵同步
- 新增 Agent Note:适配器运行在远端——经 SSH 的 stdio 调试(仅设计,待确认四项默认选择后再实现),并更新统一调试 Note
@ghfind-review ghfind-review Bot added the review: medium ghfind author score; see https://ghfind.com label Oct 27, 2026
…与路线图

按各调试器上游文档核对“附加到远端程序”的参数写法后,路径映射就四种写法:
- objects:对象列表(debugpy pathMappings、delve substitutePath)
- first:唯一一条映射写成两个字符串(js-debug localRoot/remoteRoot)
- dictionary:以 local 或 remote 一侧为键的对象(CodeLLDB sourceMap、PHP pathMappings)
- pairs:二元数组列表,order 为 remoteLocal 或 localRemote(lldb-dap sourceMap)

形状装不下用户给的映射就拒绝,不截断:first 只接受一条(此前只取第一条,与
“不悄悄丢映射”的原则矛盾,属于未发布 API 4 内的行为修正),dictionary 在键的
一侧不能出现同一个根两次,违反返回 debug.target.invalid(target.pathMappings)。
plan.debugAdapter.remoteAttach 增加 maxPathMappings,宿主据此决定最多显示几行。

契约与 fixture:schema 增加两个 oneOf 分支;remote-attach fixture 增加 keyed、
paired 两个适配器(共 6 个);拒绝用例新增 6 条(共 28 条)。

Note:#1210 统一 Note 新增“兼容性审计”,逐个适配器标注“已核对 / 待核验”,列出
G1–G11 缺口(空闲端口占位符、tcpConnect、监听 attach、URI 目标、命令模板等)的
现状、决定和触发条件,并更新后续路线;SSH Note 说明适配器原生映射与 Core 路径翻译
是叠加的两层,远端适配器必须由 Core 翻译。
@xiaoyumuxi xiaoyumuxi changed the title feat(debug): #1210 远程 attach 契约,并写下适配器在远端(SSH)的设计(堆叠在 #1520 上) feat(debug): #1210 远程 attach 契约+适配器在远端(SSH)的设计 Oct 27, 2026
@xiaoyumuxi
xiaoyumuxi marked this pull request as ready for review October 27, 2026 05:05
@lithe-code-review

lithe-code-review Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

Lithe Review

结论: ✅ 通过
范围: feat/1210-java-debug-plugin ← feat/1210-remote-attach-contract · head: c9df5b7

未发现需要阻塞合并的问题。

Scope Check

  • 关联 Issue 或需求是否完成:[Feature] 类型化 DebugAdapter Registry 与第三方 DAP 接入现有 Debug UI #1210 的整体验收仍未完成。本 PR 完成远程 attach 的共享契约与 Rust Core 校验这一部分。
  • 已完成范围:声明 schema、主机/端口和路径映射验证、参数绑定、remoteAttach 描述符、拒绝与成功 fixture,以及相关文档和测试。
  • 未完成范围:macOS 宿主的 attach 输入与非回环确认、Windows 宿主接入,以及合并后的 lithe-plugin-docs 契约同步;这些在 PR 范围说明和功能矩阵中均标为后续工作。
  • 是否复用了已有上游能力,或对自研边界给出充分证据:Core 负责把通用目标事实写入适配器声明的参数路径,没有重建 DAP 调试器行为。架构笔记列出了参数形状和未覆盖的连接方式;本次未独立核验外部适配器文档。
  • 每个 Finding 是否由本次变更引入或加剧:未列出 Finding。
  • 是否属于本次变更职责范围:检查范围内的代码、契约与文档职责一致;宿主端到端接入明确不属于本 PR。

Summary

远程目标校验、目的地冲突拒绝、路径映射形状转换及映射容量不足时拒绝的逻辑与新增契约相符。Core 测试覆盖了参数写入、回环分类、无效输入、映射拒绝和计划描述符。此 PR 尚未让产品宿主执行远程 attach;当前 macOS Swift 包装器仍未传递新目标字段或向调用方提供 connection 元数据,需由后续宿主接入完成。

Verification

  • 实际检查:给定 base...head 的 12 个文件差异;Rust Core 实现、声明式命令、测试与拒绝 fixture、manifest schema、API/插件契约文档、功能矩阵和相关 Agent Notes;并查看了 base 中对应的 Core 与 macOS API 形状。
  • 已提供的测试或 CI 结果:PR 描述报告 cargo test -p lithe-core、格式和若干契约/笔记/矩阵验证通过;提供的 head Check Run 列表中 Rust Core tests 标为 skipped。这些结果未在本次独立复跑。
  • 本次未运行的测试:所有测试、验证脚本和应用;未访问网络。
  • 仍存在的非阻塞风险或平台验证缺口:macOS 尚未接入远程 attach,Windows 插件调试宿主仍标为 missing;因此远程连接确认和实际会话行为尚无本 PR 内的宿主验证。

@xiaoyumuxi xiaoyumuxi changed the title feat(debug): #1210 远程 attach 契约+适配器在远端(SSH)的设计 feat(debug): #1210 远程 attach 契约与普通 TCP 生命周期边界 Oct 27, 2026
Resolve conflicts after #1520 merged, preserving preview's hosted debugger lifecycle fixes and this PR's remote attach contract and TCP-only design scope.
@xiaoyumuxi
xiaoyumuxi changed the base branch from feat/1210-java-debug-plugin to preview October 27, 2026 12:05
@xiaoyumuxi
xiaoyumuxi merged commit c3bd669 into preview Oct 27, 2026
11 of 16 checks passed
1lck added a commit that referenced this pull request Oct 29, 2026
* feat(debug): #1210 tcpLanguageServer 调试传输:调试适配器随插件语言服务器运行(Java 迁入插件的第一步) (#1520)

* feat(debug): #1210 tcpLanguageServer 调试传输:调试适配器随插件语言服务器运行(Java 迁入插件的第一步)

debugAdapters 新增 tcpLanguageServer 传输,用于调试服务寄居在同一插件语言服务器里的适配器(Java Debug Server 之于 JDT LS)。该传输没有 launch.process,endpoint 只有 {languageID, command}:languageID 必须是同一插件 languageServers[] 里声明过的,command 限 [A-Za-z0-9._:-]{1,128}。宿主不拉起进程,而是启动该插件的语言服务器,用 workspace/executeCommand 执行 command,把返回值解析成 1…65535 的端口后连接 127.0.0.1。

Rust Core:DebugLaunch.process 改为可选(其他传输仍必填),新增 DebugTransport::TcpLanguageServer 与 DebugEndpoint 校验;programs() 产出 languageServerDebugAdapter,命令变化需要重新批准;debug_adapter_launch_plan 对无进程适配器返回插件语言服务器的启动计划和 debugAdapter 描述符。

macOS:DebugAdapterProcess 换成 DebugAdapterLaunch(host 为 .process 或 .languageServer);MacJavaDebugAdapterTransport 改名 MacHostedPortDebugAdapterTransport,端口来源由宿主注入,不再知道 Java;LanguageToolingSessionManager 新增 startHostedDebugAdapter,校验语言服务器确由该插件拥有,内置 Java 语言服务被拒绝;端口解析抽成 debugAdapterPort(from:)。tcpPort、tcpAnnounced、attach 和 runSelectedRuntime 仍被拒绝,拒绝文案改为只支持 stdio 与语言服务器承载的适配器。

契约与文档:plugin-manifest.schema.json、契约 README、rust-core-api.md、声明草案和 #1210 Agent Note 同步,新增 debug-adapter-language-server 契约 fixture;功能矩阵补充证据与验证说明。i18n:3 条 Java 专属文案改为通用文案,新增 3 条,调整传输拒绝文案,并重新生成产物。

测试:Rust 新增 3 个 Core 测试;Swift 新增解析器、传输、端口解析(16 个用例)与语言服务器归属测试。

* fix(debug): activate hosted language servers and cancel stale adapter starts

* fix(ci): respect runtime boundaries and stabilize native regression tests

* Merge pull request #1534 from 1lck/codex/remove-bot-pr-workflow

chore(ci): remove unused GitHub App Bot PR workflow

* feat(debug): #1210 远程 attach 契约与普通 TCP 生命周期边界 (#1525)

* feat(debug): #1210 tcpLanguageServer 调试传输:调试适配器随插件语言服务器运行(Java 迁入插件的第一步)

debugAdapters 新增 tcpLanguageServer 传输,用于调试服务寄居在同一插件语言服务器里的适配器(Java Debug Server 之于 JDT LS)。该传输没有 launch.process,endpoint 只有 {languageID, command}:languageID 必须是同一插件 languageServers[] 里声明过的,command 限 [A-Za-z0-9._:-]{1,128}。宿主不拉起进程,而是启动该插件的语言服务器,用 workspace/executeCommand 执行 command,把返回值解析成 1…65535 的端口后连接 127.0.0.1。

Rust Core:DebugLaunch.process 改为可选(其他传输仍必填),新增 DebugTransport::TcpLanguageServer 与 DebugEndpoint 校验;programs() 产出 languageServerDebugAdapter,命令变化需要重新批准;debug_adapter_launch_plan 对无进程适配器返回插件语言服务器的启动计划和 debugAdapter 描述符。

macOS:DebugAdapterProcess 换成 DebugAdapterLaunch(host 为 .process 或 .languageServer);MacJavaDebugAdapterTransport 改名 MacHostedPortDebugAdapterTransport,端口来源由宿主注入,不再知道 Java;LanguageToolingSessionManager 新增 startHostedDebugAdapter,校验语言服务器确由该插件拥有,内置 Java 语言服务被拒绝;端口解析抽成 debugAdapterPort(from:)。tcpPort、tcpAnnounced、attach 和 runSelectedRuntime 仍被拒绝,拒绝文案改为只支持 stdio 与语言服务器承载的适配器。

契约与文档:plugin-manifest.schema.json、契约 README、rust-core-api.md、声明草案和 #1210 Agent Note 同步,新增 debug-adapter-language-server 契约 fixture;功能矩阵补充证据与验证说明。i18n:3 条 Java 专属文案改为通用文案,新增 3 条,调整传输拒绝文案,并重新生成产物。

测试:Rust 新增 3 个 Core 测试;Swift 新增解析器、传输、端口解析(16 个用例)与语言服务器归属测试。

* feat(debug): #1210 远程 attach 契约:attach 配置声明 connection 绑定,适配器在远端的设计 Note

- attach 配置的 targetBindings 新增 connection:host+port 或 address,目的地是适配器参数里的点分路径(最多 4 段),可选 pathMappings(objects/first 两种形状)
- 声明期拒绝目的地冲突(与其他目的地、processId/cwd 参数或默认 arguments 重名/包含),运行期 set_argument 只写空位
- debug.adapters.startArguments 支持 connection 目标,校验主机/端口/映射,返回 connection:{host,port,remote};回环只按字面量判断,其余一律 remote:true
- 适配器没有路径映射绑定而目标带了映射时拒绝,而不是悄悄丢弃
- plan 描述符新增 remoteAttach:{pathMappings},宿主据此决定界面,不按适配器名字判断
- 不新增权限,debug.attach 已覆盖;契约 README、schema、rust-core-api、fixture(含 22 条新拒绝用例)、功能矩阵同步
- 新增 Agent Note:适配器运行在远端——经 SSH 的 stdio 调试(仅设计,待确认四项默认选择后再实现),并更新统一调试 Note

* feat(debug): #1210 远程 attach 兼容性审计:路径映射补 dictionary / pairs 两种形状,缺口清单与路线图

按各调试器上游文档核对“附加到远端程序”的参数写法后,路径映射就四种写法:
- objects:对象列表(debugpy pathMappings、delve substitutePath)
- first:唯一一条映射写成两个字符串(js-debug localRoot/remoteRoot)
- dictionary:以 local 或 remote 一侧为键的对象(CodeLLDB sourceMap、PHP pathMappings)
- pairs:二元数组列表,order 为 remoteLocal 或 localRemote(lldb-dap sourceMap)

形状装不下用户给的映射就拒绝,不截断:first 只接受一条(此前只取第一条,与
“不悄悄丢映射”的原则矛盾,属于未发布 API 4 内的行为修正),dictionary 在键的
一侧不能出现同一个根两次,违反返回 debug.target.invalid(target.pathMappings)。
plan.debugAdapter.remoteAttach 增加 maxPathMappings,宿主据此决定最多显示几行。

契约与 fixture:schema 增加两个 oneOf 分支;remote-attach fixture 增加 keyed、
paired 两个适配器(共 6 个);拒绝用例新增 6 条(共 28 条)。

Note:#1210 统一 Note 新增“兼容性审计”,逐个适配器标注“已核对 / 待核验”,列出
G1–G11 缺口(空闲端口占位符、tcpConnect、监听 attach、URI 目标、命令模板等)的
现状、决定和触发条件,并更新后续路线;SSH Note 说明适配器原生映射与 Core 路径翻译
是叠加的两层,远端适配器必须由 Core 翻译。

* docs(debug): separate network paths from TCP lifecycle scope

* feat(debug): #1210 内置汇编级调试:反汇编、指令步进、指令断点、寄存器与只读内存 (#1527)

* feat(debug): #1210 内置汇编级调试:反汇编、指令步进、指令断点、寄存器与只读内存

内核按适配器能力开放汇编级调试,插件只负责启动 lldb-dap/gdb 等适配器;能力快照 supported = 适配器声明 ∧ 已注册扩展 ∧ 已授权。

- 无源码栈帧:栈帧不伪造文件和第 1 行,显示函数名与地址,暂停后自动打开反汇编

- 反汇编:debug.inspect disassemble 与反汇编视图,高亮当前指令,保持最小滚动,剩余不足时向后续读

- 指令步进:debug.execute 增加 granularity,仅适配器声明 supportsSteppingGranularity 时生效;反汇编打开时步过/步入按指令前进,面板头部与按钮提示同步变化,不支持时提示仍按源码行前进

- 指令断点:debug.setInstructionBreakpoints,点击地址栏设置或移除;只属于当前会话,不持久化、不重放

- 寄存器:作用域 presentationHint registers 显示为寄存器标签;宿主不内置 CPU 寄存器表

- 内存:debug.inspect readMemory,接受地址或保存着地址的表达式,从目标前 64 字节读起并分页;目标字节在十六进制和 ASCII 两侧高亮并滚入可见区;右侧显示设置可切换进制、每格字节数、每行字节数、字节序与 ASCII 列;读不到的字节显示为缺失;只读,不开放 writeMemory

- 单步局部刷新:next/stepIn/stepOut/stepBack 保留现有检查数据并原地替换,线程、调用栈、变量、反汇编、内存与 JSON 视图不再整面板清空,变化的内存字节被标出;继续、暂停、结束才清空

- 变量 JSON 视图:修复顶部空白带,key/value 分色高亮

- i18n:新增词条走 shared/i18n 并生成;功能矩阵新增 debug-disassembly(Windows 待实现);设计笔记补充真实 lldb-dap 验证结论

* fix(debug): #1210 guard retained inspection across steps and cancellation

Freeze the old variable tree before the next stop reloads scopes and keep inspection controls read-only until replacement. Retire disassembly and memory callbacks before synchronous cancellation, and reject stale disassembly retries after session changes. Clear retained inspection when transport fails or the session terminates.

Label memory offsets relative to the requested reference, use shared text-input and font owners, and update the owning decision note and platform verification steps.

Add four deterministic regressions reproduced against the original PR. Validation: 152 selected Swift tests and 72 Rust debug tests passed; i18n, shared contracts, platform boundaries, test stability, Agent Notes, matrix gates and runtime bundle immutability passed. Real GUI and Windows runtime validation remain pending.

* feat(debug): #1210 实现普通 TCP 调试连接与有界生命周期 (#1538)

* feat(debug): #1210 implement direct TCP adapter lifecycle

Unify hosted and external DAP byte streams behind a replaceable connection provider; reserve the seam for future network routes without adding proxy or tunnel behavior.

Add explicit endpoint validation, per-connection remote consent, a one-shot launch/attach entry, bounded startup/write buffering, generation-fenced callbacks, and bounded disconnect draining. Keep the debuggee target separate and external resources user-owned.

Cover routing, cancellation, queue limits, cleanup and real loopback Core DAP initialize/attach/disconnect. Update shared fixtures, localization, architecture notes and the platform capability matrix. Windows host and real debugger acceptance remain out of scope.

* fix(debug): #1210 修复 TCP 调试连接评审问题

- 被拒绝或不可达的端口立即以系统原因失败,不再停在 .waiting 等满超时
- 端点发现与建连各自独立计时:发现 120 秒(语言服务器冷启动),建连 10 秒
- 外部适配器会话初始化期限改为 10 秒建连加 10 秒握手,不再抢在建连之前结束
- 连接对话框在连接启动前保持打开,失败原因留在对话框内并保留已填内容
- connectExternalDebugAdapter 返回失败原因,不再静默丢弃请求
- 当前文件没有调试提供方时,"连接调试适配器…"菜单项不可用;主机名先去除首尾空白
- 删除宿主端口传输中无人使用的错误分支
- 补充发现/建连两段期限与真实回环拒绝连接的测试,同步 Agent Note 与功能矩阵

* refactor(debug): #1210 将 TCP 调试连接生命周期下沉到 Rust Core

连接状态转换、取消规则、代次令牌与过期结果拒绝、只结束一次、
建连/写入/排空期限、待发字节与消息预算、单个在途写入,原先都写在
macOS 的 MacTCPDebugAdapterTransport 里,Windows 接入要重写并重新
证明同一套规则。现在这些规则由 Core 的独立状态机持有,平台只做 I/O。

Core(rust/lithe-core/src/debug/transport_lifecycle.rs)
- 与 DAP 协议状态机独立,按 transportId 登记。
- 新增命令 debug.transport.policy / handle / release:平台发送事件,
  Core 返回新代次、阶段、结果和有序效果(发现端点、设置或取消计时器、
  连接、写入、投递数据、关闭、报告失败、通知终止)。
- Core 没有时钟,只决定期限长短和到期后的转换;待发数据只以字节数
  越过 JSON 边界,真实字节、socket 与计时器句柄留在平台。
- 共享 fixture shared/fixtures/debug/transport-lifecycle-v1.json 覆盖
  约 28 个场景,Rust 逐步回放;已登记到 v1-baseline。

macOS
- 新增 RustDebugTransportCore.swift 类型化桥接。
- MacTCPDebugAdapterTransport 只拥有 NWConnection、端点发现任务、待发帧
  字节和系统计时器,并执行 Core 返回的效果;core 参数贯穿托管端口、
  插件和外部端点三条传输,会话初始化期限改读 Core 策略。
- 计时器触发后也释放句柄,避免排空计时器继续持有传输。
- Core 调用本身失败时本地静默拆除并向所有者报告一次。

已接受的行为差异:观察者在错误输出回调里调用 stop() 时,终止通知
现在仍会送达(旧实现把它当作生命周期被替换而吞掉);重启仍会使旧
通知作废。

文档:更新 Agent Note、功能矩阵与 rust-core-api 契约。

* feat(plugins): Java Support 独立分发、迁移与按需安装 (#1483)

* feat(plugins): 支持 Java 签名安装与双架构独立发布基础

* feat(plugins): 完成 Java Support 迁移与按需分发入口

* fix(plugins): suggest Java restoration after completed removal

* docs(plugins): inventory Maven and Java migration for #1495 (#1513)

* fix(run): 统一跨平台启动环境、容错扫描与构建事件过滤 (#1543)

* fix(run): share launch environment and resilient workspace policies

* fix(run): stop shared Java enumeration at its source limit

* docs(plugins): plan macOS public APIs and SDK documentation (#1548)

* feat(plugins): #1495 原生 Provider 工作流与只读工程模型共享 (#1517)

* feat(plugins): execute native build tasks in workspace providers (#1495)

* feat(plugins): discover and execute native provider tests (#1495)

* feat(plugins): prepare and persist provider application runs (#1495)

* feat(plugins): prepare native provider debug sessions (#1495)

* feat(plugins): share read-only provider model inputs (#1495)

* fix(build): isolate producer revisions and own run saves

* feat(plugins): Java Support 独立分发、迁移与按需安装 (#1483)

* feat(plugins): 支持 Java 签名安装与双架构独立发布基础

* feat(plugins): 完成 Java Support 迁移与按需分发入口

* fix(plugins): suggest Java restoration after completed removal

* docs(plugins): inventory Maven and Java migration for #1495 (#1513)

* fix(run): 统一跨平台启动环境、容错扫描与构建事件过滤 (#1543)

* fix(run): share launch environment and resilient workspace policies

* fix(run): stop shared Java enumeration at its source limit

* docs(plugins): plan macOS public APIs and SDK documentation (#1548)

---------

Co-authored-by: Lichenkang <2188718831@qq.com>
Co-authored-by: Xiaoyumuxi <23722032@bjtu.edu.cn>

* fix(macos): 修复 Java 启动竞态、插件启动参数与无限重试 (#1526)

* fix(macos): stabilize Java startup and plugin launch (#1523, #1524)

* test(macos): bound language startup regression task waits

* test(macos): allow disk image creation margin within integration budget

* fix(macos): revoke deferred language activation when project session closes

* test(macos): cover production language launch and navigation evidence

* fix(ide-host): include ttlMs and cacheScope in MCP tools/list (#1545) (#1546)

The helper advertises protocol revision 2026-07-28 through server/discover.
For that revision ListToolsResult extends CacheableResult, where ttlMs and
cacheScope are required, but building the result with ..Default::default()
left both fields absent. Clients validating the negotiated wire shape
rejected the whole server with INVALID_RESULT (ZCode 0.17.0, Qoder).

The catalog describes live IDE state, so the result is immediately stale
(ttlMs 0) and private to the connected client.

Co-authored-by: jiaqizhang258 <321343564+jiaqizhang258@users.noreply.github.com>
Co-authored-by: Lichenkang <2188718831@qq.com>

* fix(mcp): 稳定 Windows 请求调度与授权生命周期 (#1549)

* fix(mcp): stabilize Windows request delivery and protocol discovery

* fix(mcp): recover independent notifications and enforce monotonic deadlines

* fix(macos): 独立多 Diff 标签与连续滚动、工作树管理体验 (#1555)

* fix(macos): support independent diff tabs and continuous Git browsing

- isolate diff sessions, editor groups, focus, navigation and async reads
- auto-load disassembly, Git/worktree history, VCS and MCP discovery lists
- preserve scroll anchors and suppress background Git command noise
- add worktree change management and shared localized actions
- organize develop-lithe guidance in Chinese and update capability records
- repair per-toolchain SwiftPM resource caches and add regression coverage
- align affected macOS code with the pinned Swift 6.3.3 compiler

Refs #1210

* fix(macos): 工作树更改页即时暂存、工具栏精简与 Git 控制台取消过滤

工作树「更改」页
- 勾选复选框后立即显示目标暂存状态(乐观显示),Git 完成后以实际结果为准;
  仅等待本工作树状态扫描完成即恢复可点击,不再被全项目刷新阻塞。
- 工具栏只保留有实际动作的按钮:刷新、暂存全部、丢弃所选、显示 Diff;
  移除灰显无作用的占位按钮,启用条件与选区/可暂存项一致。
- 提交历史页脚在加载中/失败/空闲都有固定行高内容,不再留空白带。
- 概览动作改为自然宽度的单一换行流,宽窗口详情自适应两列。

Git 控制台
- 在任何命令启动前就被取消(被后续请求取代)的请求不再显示为失败行;
  已启动命令的取消仍保留并标注原因。同步更新共享契约、fixture 与 Windows journal。

其他
- Git Log 筛选弹窗/图/Diff 的布局与滚动细节调整,补充对应测试与中英词条。
- 同步 git-worktrees 平台能力记录。

* fix(macos): 修复多 Diff 标签刷新、历史重试、反汇编宽度与保存更改比较的评审问题

- 状态刷新只在本次真正读取过状态的仓库内才把"缺席"当作文件已干净;链接工作树的标签不再被
  工作区刷新误关,由该工作树自己的状态读取(refreshWorktreeChanges)决定是否关闭
- 工作区/目录比较刷新内容未变时不再给会话的 @published 属性赋值(不重绘、不丢滚动位置);
  新增 GitRepositoryDiffSession.updateDocument,同时比较补丁与行(与 HEAD 的比较没有补丁文本)
- 目录比较刷新改为就地更新(showDirectoryDiff 增加 refreshingConfirmedRoots),不再清空行并闪现加载态
- 提交历史加载失败后的显式重试按已加载条数重新打开窗口,不缩回首页、不移动选择
- 反汇编列表只对最长候选行做文字测量,不再每次 body 求值都测量全部行
- 保存更改比较恢复"快照属于当前仓库"的校验,并在打开标签前校验版本与文件,避免留下空标签
- 补充回归测试,并更新两份 Agent Note

* fix(remote): #1507 远程工作区、构建与插件执行适配 (#1515)

* fix(remote): adapt workspace I/O and plugin execution for #1507

* fix(remote): continue #1507 common backend lifecycle and plugin validation

Integrate PR #1515 onto the preview baseline, preserving plugin live activation and shared i18n changes. Reserve pending process, terminal and watch starts before dispatch; retain cleanup ownership across cancellation, worker saturation, disconnect and session shutdown.

Add deterministic lifecycle and declarative remote launch regressions; isolate the empty connection registry test, fix Swift fixture shadowing and synchronize terminal resize with shell readiness. Update contracts, Agent Notes and partial/pending capability evidence. Java/JDT integration remains out of scope.

* fix(remote): own plugin snapshots and isolate upload I/O

Add session-owned run directory allocation and cleanup with retryable errors, original-session macOS deployment cleanup, and per-upload I/O isolation.

Cover lifecycle and upload ordering regressions, update contracts/resource boundaries and capability evidence, and record optional transfer/environment candidates without expanding Agent or Java scope.

* fix(remote): preserve repository identity and consolidate remote crate

Keep remote Git repository roots and external metadata bound to their original host, including parent repositories and symlink roots.

Consolidate client, protocol and server into lithe-remote with isolated client/server features, preserving the standalone server binary. Update consumers, packaging, CI selection, resource validation, contracts and regression coverage.

* fix(remote): 修复合并后的 Agent Notes 路径,补齐能力矩阵并收紧远程扫描失败判定

- 两条 proposed 笔记的适用范围仍指向已合并的 rust/lithe-remote-client,
  改为 rust/lithe-remote/src/client/,修复 Verify Agent Notes。
- 能力矩阵:remote-development-workspace 增加 BuildSystemService 与共享扫描证据,
  写明运行配置发现尚未接入远程(Core 对 runConfig.inspect 返回 NotSupported,
  仅 runConfig.selectJava 可用);run-discovery 增加同一说明。状态不变。
- 远程共享运行扫描只在链路取消、超时或中断时整体失败;主机对单个目录报告的
  错误仍记为扫描不完整,与本机一致。判断集中到 workspace_io::is_transport_failure,
  detectors/scan.rs 与 workspace_scan.rs 共用,修正此前两处不一致。
- 新增集成测试:读取主机目录树且占位目录保持为空、单目录错误记为不完整、
  根目录之下链路中断时扫描失败。

* fix(macos): avoid reentrant workbench hit testing (#1542) (#1557)

* chore(scripts): 按作用语义整理 scripts 目录层级 (#1563)

* chore(scripts): 按作用语义整理 scripts 目录层级

把 scripts/ 根目录下 127 个平铺脚本移入分类子目录,根目录不再放任何脚本。
全部使用 git mv,历史可追溯。

新目录:
- ci/{common,cancel-closed-pr-runs,update-repo-charts}:CI 脚本,按工作流名分目录
- macos/{build,package,prepare,test,verify,perf,probe}
- windows/{build,prepare,package,test,verify}
- release/{sparkle,macos,autobuild,windows,notes}
- rust-core、architecture、i18n、agent-notes、platform-feature-matrix、
  plugins、remote、ide-mcp、editor、git-graph、agent、resources

同步修改:
- classify-ci-changes.sh 路径模式、plan-ci-lane-reuse.mjs 基础设施规则、
  对应测试夹具(夹具复制脚本时按新目录深度建目录)
- ci-macos.yml 的 scripts/**/*.sh 循环、verify-i18n.yml 等工作流路径与 paths 过滤
- sparkle 的三个 Ruby 脚本改为 require_relative "../autobuild/autobuild-identity"
- tauri.conf.json 的 beforeDevCommand / beforeBuildCommand
- README、docs、Agent 笔记、Skill 和 Fonts NOTICE 中的脚本路径
- develop-lithe Skill 新增“脚本放置与分类”一节,AGENTS.md 增加入口提醒:
  脚本必须在 scripts/ 下按作用分类,不得放在 scripts/ 根目录

验证:
- 127 个脚本在旧分类器/新分类器下的 lane 结果一致,未知路径仍然 fail closed
- 127 个脚本的规划器基础设施规则一致
- 受影响的 node/bun/shell/ruby/python 测试与 i18n、特性矩阵、Agent 笔记、
  共享契约、模块/服务/编辑器边界、运行时 bundle 只读校验均通过

* fix(scripts): 修复 scripts 分类整理的评审问题

- Windows 前端安装测试移到 scripts/windows/build/,与被测脚本同目录,
  测试夹具里复制脚本的路径、ci-windows.yml 的运行命令、分类器 windows 分支
  和 Agent Note 里的路径同步更新
- 分类器空分支删除 3 个已不存在的平铺脚本名,避免过期名字被误当成已登记
- 规划器的 Windows 规则改为按目录匹配(windows/、release/windows/),
  并单独登记 ide-mcp/build-windows-ide-mcp.mjs,补齐测试期望,
  与分类器的路由保持一致
- develop-lithe Skill 补充:平台专属脚本留在所属跨平台领域目录的例外、
  手工验收脚本放 test/、tauri.conf.json / package.json / official-plugins.json
  inputPaths / worktree-resources.json 里硬编码脚本路径的检查清单

* fix(windows): 补全 JavaSelectionRequest.requirements,修复 Windows 安装包构建 (#1507) (#1565)

#1515 给 lithe-core 的 JavaSelectionRequest 新增了必填字段 requirements,
但 Windows 的 select_project_java 仍按旧字段构造,导致 Release AutoBuild
的 Windows 安装包步骤报 E0063 编译失败。

- windows/tauri/src-tauri/src/run.rs:Windows 传 root,requirements 与 root
  互斥,所以填 None
- develop-lithe Skill:补充 lithe-core 公开 Rust 类型/签名也是兼容面,
  Windows 直接链接 Core,改动时要同步检查调用点并给出检查方法

* docs: refresh WeChat community QR code (#1569)

---------

Co-authored-by: Xiaoyumuxi <23722032@bjtu.edu.cn>
Co-authored-by: muchen <145200703+Mucheen@users.noreply.github.com>
Co-authored-by: arkleselect <166632698+arkleselect@users.noreply.github.com>
Co-authored-by: jiaqizhang258 <549728022@qq.com>
Co-authored-by: jiaqizhang258 <321343564+jiaqizhang258@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review: medium ghfind author score; see https://ghfind.com

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant