Repository navigation
feat(architecture): 新增宿主语言特定内容闸门并固定 Java 拆分计划(Refs #1495) - #1727
Conversation
verify-no-host-language-specifics.mjs 扫描 Core、macOS、共享前端、插件契约和 Windows 六个目录,统计 Java、Maven、Gradle、Spring、MyBatis 等词表命中、名字比较、 工具名常量表和 schema 封闭枚举。 - 默认棘轮:计数上升或出现新文件失败;计数下降须用 --update-baseline 同项收紧 - --strict 供最终清理 PR 使用,不看 baseline,仅白名单豁免 - --base <ref> 拒绝 baseline 增长和白名单新增条目 - 六个旧 token 在任何模式下都失败,沿用 verify-java-semantic-ownership 的规则 - 白名单每项必须有 reason、issue、removeWhen,未被使用的条目报错 - 附 16 个单元测试和首份基线(23810 处命中,693 个文件) Refs #1495
- verify-core.sh 在旧的 Java 语义检查之后运行新闸门,两者并存直到最终清理 PR - 新增 verify-host-language-specifics 工作流,只在 Linux 运行,PR 上带 --base 对比合并基点,push 到 preview 时只做棘轮检查 - CI 变更分类器和 lane 复用规则把闸门脚本、baseline、白名单视为独立工作流, 不触发 macOS 和 Windows 产品 lane Refs #1495
- 新增 Agent 笔记,固定 Java 拆分用到的通用接口(对应 API-12/19/20/22/23/25/26/ 27/29/30/33/35/37,不新增编号)、API-35 第一阶段的 Core 中转插件函数调用规则、 PR 拆分与依赖、Windows legacy crate 过渡和闸门脚本的棘轮规则 - 旧的 Maven/Java 迁移笔记 §八 改为指向新笔记,保留无中间状态与资源复用两条规则 - 插件 API 计划在相关条目补充计划说明,API-35 标为第一阶段进行中 Refs #1495
Lithe Review结论: 未发现需要阻塞合并的问题。以下两项均为 P2 非阻塞建议。 Findings
Scope Check
Suggestions
Summary业务代码未改变,CI 接线与交付边界基本清楚。主要不足是闸门存在两类漏检,现有测试尚未覆盖这些输入。 Verification
|
Lithe 运行验收版本: 对照:共同祖先
未覆盖:
工作副本与运行状态已清理;可复用编译缓存按 12 GiB / 7 天预算保留。 |
#1558 让 Java Support 通过自己的 debugAdapters 声明调试能力,功能页因此把 debug 列为插件提供(detail 为 none),不再是宿主集成。preview 的 CI 因 lane 复用跳过了 Swift tests,这条过时断言一直没有暴露。run/test 仍断言为宿主集成。
Lithe 运行验收版本: 对照:共同祖先
未覆盖:
工作副本与运行状态已清理;可复用编译缓存按 12 GiB / 7 天预算保留。 |
- stripComments:return、typeof 等关键字后的 / 按正则字面量处理, 字符类里的 /* 不再被当成块注释吞掉后续源码;属性名 .in / 仍是除号。 - toolTables 改为统计合格常量表的条目数,schemaEnums 改为统计 tool、runtime、languageImport.kind 的封闭取值个数和 hostIntegration 的集成名个数(至少 1),已有列表新增 python 等成员时棘轮会失败。 - 补充对应单元测试和棘轮端到端测试。
preview 新增的 Java 词条和本次改为按成员统计的常量表、schema 枚举 一起计入基线,Note 同步计数规则和快照数字。
- Plan doc: keep this PR's delivered API-22/23/30 rows, take preview's API-29 rows, and keep the C-LS setStatus note. - A declared features.hotCodeReplace now wins over the host's legacy service update, which only remains for adapters that declared nothing, matching the legacy_java narrowing in the debug engine. Adds a test that one button shows. - Contract README no longer names runtimes when describing the closed tool lists of serverProcess 1 to 3. - Lock the lowered counts: engine.rs nameComparisons 6 -> 5 and the manifest schema's schemaEnums 13 -> 5.
- Plan doc: keep this PR's delivered API-12/20/22/25 rows and the other PRs' plan notes; take preview's rows elsewhere. - The new startPluginLanguageServer overload carries the session policy and no build-tool or host-integration parameters. A server with a session policy and no hostIntegration starts through it; any other server keeps preview's start unchanged. - The manifest schema forbids hostIntegration on a backend-resolved launch with not/required instead of a false property schema; the meaning is the same.
概述
Refs #1495(Java/Maven/Gradle 等语言和构建工具的专属逻辑从 Core 与 macOS 宿主迁出到插件)。
这是拆分的第一个 PR(A0):只新增检查脚本、CI 接线和文档,不改 Core、Swift、前端的业务代码。它做两件事:
功能点
闸门脚本
scripts/architecture/verify-no-host-language-specifics.mjsrust/lithe-core/src、macos/Sources、frontend/editor/src、shared/contracts/plugins/v1、windows/tauri/src、windows/tauri/src-tauri/src;跳过vendor、node_modules和以点开头的目录。java、jdt、jdtls、jvm、maven、mvn、gradle、spring、mybatis、lombok、junit、testng、m2e、surefire;按 camelCase、snake_case、.、/、-切词后整词匹配,JavaScript不算。match、switch分支。node、go、python的const、static字符串数组;按条目计数,已有表再加一个工具也会让计数上升。tool、runtime、languageImport.kind,以及每个hostIntegration属性;按取值个数计数(hostIntegration数集成名,至少 1),已有枚举加成员也会让计数上升。--update-baseline:只允许调低;基线不存在时才可创建。--strict:不看基线,任何命中都失败,只有白名单文件豁免;留给最终清理 PR,不能和--update-baseline同用。--base <ref>:与该提交里的基线和白名单对比,基线增长或白名单新增条目都失败,防止靠改基线放行。is_main_method、main_declaration_index、main_class_exists、containsJavaMainMethod、java.runConfigurations、java.testMethods)沿用旧脚本的规则,任何模式下都失败,白名单文件里也一样。--root <repository>可指定仓库根(测试用)。基线与白名单
language-specifics-baseline.json:每个文件一行,减少并行 PR 的合并冲突。language-specifics-allowlist.json:13 项,每项必须有glob、reason、issue(#\d+)、removeWhen;没有被任何文件用到的条目算错误。3 项是共享前端的 TextMate 语法、主题、语言目录(决定保留),10 项是 Windows 的 Maven/Java/Spring/MyBatis TypeScript 文件(Windows 迁移前的过渡)。c63bcd243):rust/lithe-core/srcmacos/Sourcesfrontend/editor/srcshared/contracts/plugins/v1windows/tauri/srcwindows/tauri/src-tauri/src另有名字比较 458、工具名常量表条目 163(18 张表)、schema 封闭取值 13;30 个白名单文件不计数。
变更历史:初版基线是 23781 处,rebase 到 preview 后(#1724 在 Core 里新增了 29 处)重建为 23810 处;处理评审意见时合入 preview
c63bcd243(新增 27 处词表命中),并把常量表和 schema 枚举改为按成员计数后再次重建,得到 23837 处。测试
verify-no-host-language-specifics.test.mjs:17 个用例,覆盖切词(含JavaScript中性词)、注释与字符串处理(含return、typeof后带/*字符类的正则)、名字比较、大文件线性扫描、Rust 工具名常量表和 schema 封闭枚举的成员计数(已有列表加python时棘轮失败)、跳过目录、白名单(缺字段和未使用条目)、旧 token、棘轮、--strict、--base、参数错误和 glob 匹配;每个用例都带显式超时。CI 接线
scripts/architecture/verify-core.sh:在旧的verify-java-semantic-ownership.mjs之后运行新闸门;旧脚本只扫三个目录,是新脚本的子集,由最终清理 PR 删除。.github/workflows/verify-host-language-specifics.yml:只在 ubuntu 运行,不占用 macOS、Windows runner;pull_request和 push 到 preview 按paths触发,也支持手动运行;步骤是脚本测试(输出 JUnit)、闸门(PR 上带--base HEAD^1)、耗时报告和产物上传。scripts/ci/common/classify-ci-changes.sh与其测试:四个闸门文件被当作独立工作流,不触发产品 lane。scripts/ci/common/plan-ci-lane-reuse.mjs与其测试:新增同样的规则,并断言verify-java-semantic-ownership.mjs不属于基础设施。文档
.agents/notes/proposed/architecture/2026-11-04-java-extraction-generic-apis-and-gate.md(状态:提议中):通用 API 映射、API-35 第一阶段规则、导入配置怎样使用中转、版本与权限、PR 拆分与依赖、Windows legacy crate、闸门规则与基线变化预期、Q1-Q8 决定、备选方案、验收标准、风险。2026-10-26-maven-java-domain-plugin-migration.md§八:原来的 C1/C2/D1/D2/E1/E2/F 拆分改为指向新笔记,保留“不留中间状态”和“新增资源须更新 worktree 复用清单”两条规则。旧笔记是阶段 A 的静态清单(268 行),拆分和 API 映射变了,所以另写新笔记,不在清单里塞决策。docs/development/macos-plugin-api-plan.md:完成度总表和 §3 里相关条目补充计划说明,API-35 状态写成“第一阶段进行中”,§6 增加指向新笔记的链接,顶部状态行补一句日期说明;不新增任何 API 编号,计划仍是 API-01–44。修复 preview 上过时的 Swift 断言
macos/Tests/LitheTests/PluginManagementPresentationTests.swift的javaFeaturesIncludeHostIntegratedCapabilities:feat(plugins): #1495 Maven 模型、配置、测试与服务运行迁移(阶段 D 进行中) #1558 让 Java Support 通过自己的debugAdapters声明调试能力,功能页因此把 debug 列为插件提供(detail 为.none),不再是宿主集成。断言改为 run/test 仍是宿主集成、debug 是插件提供。preview 的 macOS CI 因 lane 复用跳过了 Swift tests,这条断言一直没暴露;本 PR 标为 ready 后完整 CI 跑到它才失败。只改测试,不改产品代码。涉及的 API 条目
只更新已有条目的说明,不改变其他状态:
jdt://做成按 scheme 注册的通用只读 content providertemporaryDirectorysetStatus、输出链接匹配器run/start、run/stop、工具 ID 引用、requiresToolsalternatives、reveal、CodeLens、运行与测试标记debug/start、debugAdapters 3的features与defaultsprojectGenerators 2增加type:"tool"localeAPI-35 第一阶段:不是安装依赖
插件之间的通信走 Core 中转的插件函数调用(插件 1 → Core → 插件 2):接收方在清单里显式导出函数 ID,调用方声明函数 ID(不写插件 ID);Core 校验双方声明与启用,记录调用链并拒绝环路,限制深度、并发、字节和超时,取消沿链传递;信任不传递,被调方用自己的权限;远程工作区按 API-40 拒绝;旧的
wrongPlugin、recursiveCall检查保留,lithe/build/*仍然不对后端开放。它不是安装依赖:不参与安装闭包,不做版本求解,禁用某个插件只是调用时找不到提供方。因此
2026-10-25-plugin-dependencies-and-exports.md里“第一版先不加入弱依赖、可选依赖”的规则不受影响;该笔记继续留在proposed/,由 C-IMPORT 落地时更新。本 PR 只写规则,不改 Core。验证
在 rebase 到 preview
4dd316591之后运行:node --test scripts/architecture/verify-no-host-language-specifics.test.mjsnode scripts/architecture/verify-no-host-language-specifics.mjsRatchet verified: every count matches the baseline.node scripts/architecture/verify-no-host-language-specifics.mjs --base origin/preview与--base HEAD^1node scripts/architecture/verify-java-semantic-ownership.mjsJava semantic ownership verified./scripts/agent-notes/verify-agent-notes.shok: 204 active Agent Note(s) verifiedgit diff --check origin/previewbash scripts/ci/common/test-classify-ci-changes.shCI change classifier tests passednode --test scripts/ci/common/plan-ci-lane-reuse.test.mjs scripts/ci/common/ci-workflow-gates.test.mjs./.agents/skills/write-stable-tests/scripts/verify-test-stability.sh --platform all --base origin/preview --head HEADTest stability check passed./scripts/architecture/verify-shared-contracts.sh./scripts/architecture/verify-service-boundaries.sh./scripts/macos/verify/verify-runtime-bundle-immutability.shscripts/macos/test/test-macos.sh --jobs 4 --filter PluginManagementPresentationTestsPlugin management presentation7 个测试全部通过node scripts/i18n/verify-app-language-localization.mjs、node scripts/i18n/generate-i18n.mjs --check没有运行
scripts/architecture/verify-core.sh全量:它的第一步是swift run LitheCoreVerifier,本 PR 只改了一个 Swift 测试断言,其余各步已单独运行。上一轮完整 CI 里另外两项失败与本 PR 无关:MarkdownPreviewHTMLTests.htmlBadgesUseInlineFlowAndPreserveAlignment是 WebKit 页面加载超时;Windows shared-1 的git_patch_exchange::shelf_clean_and_retry_restore_preserve_staged_working_and_untracked在 Windows git 上用了 15.6 秒,超出单测试时间预算。没有启动任何 Lithe 应用。已知限制与未完成
--base防新增条目,但不防条目内部增长。javac、javadoc、mvnw、gradlew、springframework不计入;目录裁剪列表里的.gradle会被当成工具名常量表;shared.generated.ts带 Spring 字符串。最终清理前要逐个核对。--strict时,Windows 的 334 个 TypeScript 文件和 14 个 Rust 文件仍会命中:要么 Windows 迁移完成,要么由用户决定扩大白名单。buildSystems枚举只到 3,而 Core 和 README 支持到 4;README 能力表里serverProcess只写了1,正文已描述版本 2。lithe-legacy-java由 W1 创建,本 PR 只记录设计;跟踪 Issue 待用户确认后再提交。verify-windows-boundaries.ps1本 PR 没有改,最终清理 PR 再切换。