diff --git a/platform/execution/src/com/intellij/execution/configurations/UnknownRunConfiguration.java b/platform/execution/src/com/intellij/execution/configurations/UnknownRunConfiguration.java
index 05fd0f35f113..b930b2207e5c 100644
--- a/platform/execution/src/com/intellij/execution/configurations/UnknownRunConfiguration.java
+++ b/platform/execution/src/com/intellij/execution/configurations/UnknownRunConfiguration.java
@@ -7,6 +7,7 @@ import com.intellij.execution.Executor;
import com.intellij.execution.RunManager;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.ide.plugins.PluginFeatureService;
+import com.intellij.ide.plugins.UltimateDependencyChecker;
import com.intellij.ide.plugins.PluginManagerConfigurableService;
import com.intellij.ide.plugins.advertiser.FeaturePluginData;
import com.intellij.openapi.options.SettingsEditor;
@@ -109,7 +110,8 @@ public final class UnknownRunConfiguration implements RunConfiguration, WithoutO
return;
}
FeaturePluginData plugin = PluginFeatureService.Companion.__getPluginForFeature(RunManager.CONFIGURATION_TYPE_FEATURE_ID, typeId);
- if (plugin != null) {
+ if (plugin != null &&
+ UltimateDependencyChecker.getInstance().canBeEnabled(plugin.pluginData.getPluginId())) {
RuntimeConfigurationError err = new RuntimeConfigurationError(
ExecutionBundle.message("dialog.message.broken.configuration.missing.plugin", plugin.displayName));
err.setQuickFix(() -> {
diff --git a/platform/ide-core/plugins/api-dump.txt b/platform/ide-core/plugins/api-dump.txt
index 0941c5856a63..ca57e02b7e8f 100644
--- a/platform/ide-core/plugins/api-dump.txt
+++ b/platform/ide-core/plugins/api-dump.txt
@@ -1,3 +1,9 @@
com.intellij.ide.plugins.PluginManagerConfigurableService
- s:getInstance():com.intellij.ide.plugins.PluginManagerConfigurableService
- a:showPluginConfigurableAndEnable(com.intellij.openapi.project.Project,java.lang.String[]):V
+com.intellij.ide.plugins.UltimateDependencyChecker
+- sf:Companion:com.intellij.ide.plugins.UltimateDependencyChecker$Companion
+- a:canBeEnabled(com.intellij.openapi.extensions.PluginId):Z
+- s:getInstance():com.intellij.ide.plugins.UltimateDependencyChecker
+f:com.intellij.ide.plugins.UltimateDependencyChecker$Companion
+- f:getInstance():com.intellij.ide.plugins.UltimateDependencyChecker
diff --git a/platform/ide-core/plugins/src/com/intellij/ide/plugins/UltimateDependencyChecker.kt b/platform/ide-core/plugins/src/com/intellij/ide/plugins/UltimateDependencyChecker.kt
new file mode 100644
index 000000000000..0e4ca7cea2ed
--- /dev/null
+++ b/platform/ide-core/plugins/src/com/intellij/ide/plugins/UltimateDependencyChecker.kt
@@ -0,0 +1,24 @@
+// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+package com.intellij.ide.plugins
+
+import com.intellij.openapi.application.ApplicationManager
+import com.intellij.openapi.components.service
+import com.intellij.openapi.extensions.PluginId
+
+interface UltimateDependencyChecker {
+ companion object {
+ @JvmStatic
+ fun getInstance(): UltimateDependencyChecker = ApplicationManager.getApplication().service()
+ }
+
+ /**
+ * Checks whether a plugin with the specified [pluginId] can be enabled in the current IDE context.
+ *
+ * The result depends on whether the Ultimate plugin is enabled and whether the given plugin requires the Ultimate plugin.
+ * If the Ultimate plugin is disabled and the plugin has a dependency on it, this method will return `false`.
+ *
+ * @param pluginId the unique identifier of the plugin to check.
+ * @return `true` if the plugin can be enabled in the current IDE context, `false` otherwise.
+ */
+ fun canBeEnabled(pluginId: PluginId): Boolean
+}
\ No newline at end of file
diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/UltimateDependencyCheckerImpl.kt b/platform/platform-impl/src/com/intellij/ide/plugins/UltimateDependencyCheckerImpl.kt
new file mode 100644
index 000000000000..34d66565ab38
--- /dev/null
+++ b/platform/platform-impl/src/com/intellij/ide/plugins/UltimateDependencyCheckerImpl.kt
@@ -0,0 +1,16 @@
+// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+package com.intellij.ide.plugins
+
+import com.intellij.openapi.extensions.PluginId
+
+internal class UltimateDependencyCheckerImpl : UltimateDependencyChecker {
+ override fun canBeEnabled(pluginId: PluginId): Boolean {
+ if (!PluginManagerCore.isDisabled(PluginManagerCore.ULTIMATE_PLUGIN_ID)) return true
+
+ val pluginIdMap = PluginManagerCore.buildPluginIdMap()
+ val pluginSet = PluginManagerCore.getPluginSet()
+ val contentModuleIdMap = pluginSet.buildContentModuleIdMap()
+
+ return !pluginRequiresUltimatePlugin(pluginId, pluginIdMap, contentModuleIdMap)
+ }
+}
\ No newline at end of file
diff --git a/platform/platform-resources/src/META-INF/PlatformExtensions.xml b/platform/platform-resources/src/META-INF/PlatformExtensions.xml
index b9f00e500b2f..d9bb85bfe71c 100644
--- a/platform/platform-resources/src/META-INF/PlatformExtensions.xml
+++ b/platform/platform-resources/src/META-INF/PlatformExtensions.xml
@@ -149,6 +149,8 @@
+