Repository navigation
feat: 项目生成器增加通用工具字段(projectGenerators 2,API-33) - #1740
Conversation
新增 type:"tool" 字段:由 tool 指定工具定义 ID,minimumVersion 过滤过旧的安装,
pinAs:"project" 让计划带出创建后要写入的工具 pin。步骤里可用 ${field.<id>} 和
${field.<id>.executable}。表单返回候选安装与 toolTooOld 问题,目录条目返回声明
该工具的插件。版本 1 的 runtime 字段保持不变,版本 2 不允许 runtime 字段,
版本 1 不允许 tool 字段。
Refs #1495
README 增加 Tool fields 小节、模板变量 ${field.<id>.executable}、表单 tools 输入、
installations 输出、toolTooOld 问题、计划 toolPins 与目录 tools。manifest schema 接受
projectGenerators 2、tool 字段类型、tool 与 pinAs 属性。共享契约校验脚本检查
project-plans 用例指定的 manifest 夹具存在。
Refs #1495
- 新建项目窗口为 type:tool 字段显示工具下拉:候选来自通用的工具发现,低于最低版本的安装置灰,找不到工具时提示启用或到插件市场查找 - 新增 MacProjectToolInstallations:新建项目没有工作区,在空的临时目录里复用设置页的工具发现,用完删除 - 新增 MacProjectToolPins:创建成功后把所选安装写入新项目的工具 pin(.lithe/run/local.json),与设置页共用同一个存储;写入失败不让创建失败,改为提示 - 新建项目窗口监听插件变化并重新载入条目;当前生效的插件由启动时登记的插件和实时注册表合并得到 - hostCapabilities 声明 projectGenerators 1 和 2 - 新增 5 条中英文界面文案并重新生成 Localizable.strings Refs #1495
- canActivateWithoutRestart 放行 projectGeneratorsExtension 和 toolchainsExtension:生成器清单和工具定义是宿主每次用到时才读取的数据,不依赖启动时构建的模块图 - 含语言服务器、构建等其他贡献或后端的插件(例如 Java Support)判断不变,仍然重启后生效 Refs #1495
- ProjectGenerationTests:工具字段的目录候选、表单版本检查、计划里的工具 pin 与命令展开、创建后写 pin、pin 写失败的提示、没有工具定义时的市场提示、插件变化后重新载入 - ProjectToolAdaptersTests:临时目录里的工具发现与清理,工具 pin 写入设置页同一个存储且不覆盖已有 pin - PluginLiveActivationTests、ToolchainPluginAdmissionTests:生成器和工具定义插件满足免重启谓词,安装与卸载即时生效;工具链 provider 仍需重启 Refs #1495
- 计划:API-33 状态改为 projectGenerators 2 增加通用工具字段,能力版本列表加入 projectGenerators 2 - 跨平台功能矩阵:补充工具字段、免重启和对应验证步骤,Windows 不变 - Agent 笔记:新建项目向导增加工具字段一节(职责划分、pin 失败不回滚、被否方案);热激活笔记更新谓词范围和已知边界 - rust-core-api:说明工具候选由宿主提供、Core 只做选择与校验 Refs #1495
工具定义插件现在可以免重启生效,已打开的工具链设置页也应立即看到新增或移除的工具定义。 AppModel 已有的 pluginRegistrationChanges 订阅额外通知 ToolchainSettingsFeatureModel, 后者复用文件变化的合并重载路径;页面加载前不触发读取。同步更新热激活与新建项目向导 Note。
Lithe Review结论: 未发现需要阻塞合并的问题。以下均为 P2 非阻塞建议;当前失败 CI 的原因尚未确认。 Findings
Scope Check
Suggestions
Summary主要实现复用了现有基础设施,Core 与原生 I/O 的职责总体清晰。现有测试覆盖了基本成功和失败路径,但遗漏了跨条目的缓存失效、等价版本、可选字段仅有旧安装及临时目录失败等边界。 Verification
|
Lithe 运行验收版本: 对照:共同祖先
未覆盖:
工作副本与运行状态已清理;可复用编译缓存按 12 GiB / 7 天预算保留。 |
- Core 解析工具字段时,固定版本已卸载或列表为空回退到可用安装,并补测试 - 查找已安装工具失败时记录日志、在新建项目窗口显示原因和重试按钮,不再当成没有安装 - 插件变化后清空已缓存的工具列表;未选工具时保留空选项,选中后不再出现空行 - 临时目录创建/清理失败写日志,不再静默吞掉 - 契约 README 与 fixtures、Agent Note、i18n 词条同步更新
# Conflicts: # docs/development/macos-plugin-api-plan.md
# Conflicts: # macos/Tests/LitheTests/PluginLiveActivationTests.swift # macos/Tests/LitheTests/ToolchainPluginAdmissionTests.swift # rust/lithe-core/src/tests/declarative_plugins.rs # shared/contracts/plugins/v1/README.md # shared/contracts/plugins/v1/fixtures/project-generators/project-plans.json # shared/platform-feature-matrix/features/plugin-project-generators.json
- ProjectGenerationTests 的工具字段与工具定义 fixtures 改从 project-generators/ 与 toolchains/ 读取 - 工具字段测试从定义 fixture 读取工具与插件 ID,运行时测试改用 KNOWN_RUNTIMES,语言名闸门回到基线
Refs #1495
做了什么(API-33)
项目生成器可以声明通用的"工具"字段。用户新建项目时从任意工具定义的已有安装里选一个,选择结果写进新项目的工具 pin。不新增 API 编号,不改
pluginAPIVersion,Windows 行为不变。契约与 Rust Core
projectGenerators: 2,字段为{type:"tool", tool, minimumVersion, pinAs:"project", optional}。tool是工具定义 ID,没有封闭枚举。runtime,版本 1 不允许tool;plugins.declarative.validate接受type:tool。tools。Core 负责选择(保留用户的选择,否则取最新版本,同版本保持宿主给的顺序)和最低版本检查,返回installations(含meetsMinimum)以及toolTooOld/required问题。${field.<id>}和${field.<id>.executable},计划结果返回toolPins。tools(声明该工具的插件及启用状态)。<pluginID>:<id>)原来匹配不到提供插件,现在按限定 ID 匹配。verify-shared-contracts.sh检查夹具是否存在。runtime(Java)不变,旧路径等 Java 逻辑迁出时再删。macOS
MacProjectToolInstallations:新建项目时还没有工作区,所以在一个空的临时目录里复用设置页的工具发现,用完删除。MacProjectToolPins:项目创建后通过设置页同一个存储写.lithe/run/local.json。写失败不让创建失败(项目已经移到位,回滚没有意义),改为提示toolPinWarning。MacServiceContainer把启动时登记的插件和实时注册表合并成"当前生效的插件",生成器列表、工具发现、pin 的只读目录检查都读这一份。ToolchainPluginAdmissionTests的独立定义用例、PluginLiveActivationTests中的 project-generator),热激活 Note 的清单同步更新。hostCapabilities声明projectGenerators: [1, 2];新增中英文词条,都走shared/i18n和L10n.string。文档与测试
plugin-project-generators、新建项目向导 Note(新增"工具字段"一节和两个被否方案)、热激活 Note、rust-core-api.md都已同步。project_generators用例;SwiftProjectGenerationTests、新文件ProjectToolAdaptersTests(用真实的MacToolchainPreferencesStore)、PluginLiveActivationTests、ToolchainPluginAdmissionTests、ToolchainSettingsFeatureTests(新增"只有打开的页面才重读"用例)。评审修复(lithe-code-review)
shared/i18n和L10n.string)。同步 preview(含 #1727、#1744、#1747、#1748、#1750)
project-generator-tool-field.plugin.json和project-plans.json已移到fixtures/project-generators/。verify-shared-contracts.sh里project-plans.json的路径改成新目录。ProjectGenerationTests改为从fixtures/project-generators/和fixtures/toolchains/读取 fixtures(之前读根目录,有 14 个测试失败)。catalog_names_the_plugins_that_define_each_tool从工具定义 fixture 里读插件 ID 和工具 ID;form.rs的版本 1 runtime 用例改用KNOWN_RUNTIMES[0]。基线计数没有调高。验证
已通过:
cargo test --lib project_generators:41 个通过;之前plugins::有 101 个、toolchain有 99 个通过scripts/macos/test/test-macos.sh --filter 'ProjectGenerationTests|ProjectToolAdaptersTests|PluginLiveActivationTests|ToolchainPluginAdmissionTests|ToolchainSettingsFeatureTests':5 个套件 83 个测试通过(同步 preview 后重跑)verify-no-host-language-specifics.mjs(Ratchet verified)、verify-shared-contracts.sh、verify-log-usage.mjs、verify-rust-core-comments.sh、generate-i18n.mjs --check、verify-app-language-localization.mjs、verify-agent-notes.mjs、test-stability 静态闸门、功能矩阵 change 闸门、rustfmtverify-service-boundaries.sh(含运行时 bundle 不可变检查)、verify-module-boundaries.sh、verify-java-semantic-ownership.mjs;在 macOS 上cargo checkWindows 目标没有新增错误。Windows 实机没跑。已知未完成
runtime和 Java 专用路径保留,等 Java 逻辑迁出时删除。projectGenerators)。node scripts/contract.mjs sync --revision <合并后的 preview commit>同步契约。在同一个 PR 里,把本 PR(projectGenerators: 2)登记进reference/protocol-changelog.md,新版本号写进"按协议查首次出现"表,并在 PR 描述里 @ 本 PR 作者核对。