Convert Product DSL module sets into generated plugin wrappers and handle the surrounding generation flow. Use when pluginizing a module set like `recentFiles` or `grid.core`, updating bundled plugin registration, regenerating wrapper artifacts, or fixing validation/build ordering bugs where wrapper plugin descriptors are needed before generated files exist on disk.
Use this workflow when a Product DSL ModuleSet should become a generated plugin wrapper.
community/platform/build-scripts/product-dsl/.claude/rules/product-dsl.md before changing product-dsl sources.recentFiles() or vcsFrontend(), and mirror its packaging pattern before inventing a new one.intellij.moduleSets.<name>.xml path.moduleSet("name") to plugin("name").moduleSet(...) inclusions from aggregate module sets if the wrapper should no longer be inlined there.intellij.moduleSet.plugin.<name>DEFAULT_BUNDLED_PLUGINSProductModulesLayout.ktIf pluginization causes failures like "plugin missing" or unresolved dependencies before generated wrapper files exist on disk, preload wrapper plugin content in memory.
PluginContentCache.PluginContentInfo objects for pluginized module sets from the same data used by ModuleSetPluginGenerator.ModelBuildingStage before plugin extraction and validation start.community/module-set-plugins/generated/intellij.moduleSet.plugin.<name>/ with:
<module>.imlplugin-content.yamlresources/META-INF/plugin.xmlBUILD.bazel after JPS-to-Bazel synccommunity/module-set-plugins/generated/intellij.moduleSet.plugin.main/community/platform/platform-resources/generated/META-INF/intellij.moduleSets.<name>.xml.idea/modules.xml and community/.idea/modules.xml updates after generator + JPS-to-Bazel syncRun these in order after the source edits:
bazel run //platform/buildScripts:plugin-model-tool
./build/jpsModelToBazel.cmd
./build/jpsModelToBazel.cmd is required because generated wrapper .iml files and BUILD.bazel files change together.
lint_files() on every changed Kotlin source and test file.AllProductsPackagingTest first via mcp__ijproxy__execute_run_configuration with configurationName = "AllProductsPackagingTest".Fast Project Structure Tests run configuration via mcp__ijproxy__execute_run_configuration with configurationName = "Fast Project Structure Tests".UltimateProjectTestsStructureTest after that via mcp__ijproxy__execute_run_configuration with configurationName = "UltimateProjectTestsStructureTest".IdeaUltimatePluginModuleDependenciesTest after that via mcp__ijproxy__execute_run_configuration with configurationName = "IdeaUltimatePluginModuleDependenciesTest".All Packaging Tests after that via mcp__ijproxy__execute_run_configuration with configurationName = "All Packaging Tests"../tests.cmd -Dintellij.build.test.patterns=org.jetbrains.intellij.build.productLayout.generator.ModuleSetPluginGeneratorTest
./tests.cmd -Dintellij.build.test.patterns=org.jetbrains.intellij.build.productLayout.pipeline.ModelBuildingStageTest
./tests.cmd -Dintellij.build.test.patterns=org.jetbrains.intellij.build.productLayout.validator.ModuleSetPluginizationValidatorTest
./tests.cmd -Dintellij.build.test.patterns=org.jetbrains.intellij.build.productLayout.dependency.PluginDependencyGraphTest
Add product-specific packaging tests only if the generated diff or failing tests show downstream expectations need updates.