Working with Registry

SkillDev tools

Guidelines for using the IntelliJ Registry API. Use when working with registry keys or feature flags.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Working with Registry skill

What this skill tells your AI

The instructions your AI receives, as published by jetbrains/mps in .agents/skills/registry/SKILL.md and read by ahel’s review.

Guidelines for using the IntelliJ Registry API.

Documentation

Quick Reference

Defining a Registry Key

Always prefer declaring in plugin.xml (not registry.properties):

<registryKey key="my.feature.enabled"
             defaultValue="true"
             description="Enables my feature"
             restartRequired="false"/>

To override in a dependent plugin:

<registryKey key="my.feature.enabled"
             defaultValue="false"
             description="Enables my feature"
             restartRequired="false"
             overrides="true"/>

Accessing the Registry

In suspending code:

val isEnabled = RegistryManager.getInstanceAsync().get("my.key")

In blocking code:

val isEnabled = RegistryManager.getInstance().get("my.key")

Access via Registry.get() or Registry.is() is effectively deprecated, since it might cause problems during early IDE startup. Always prefer the RegistryManager when possible.

Early Startup: Registry.is() with Default Value

When code may run before COMPONENTS_LOADED state (e.g., during EULA dialog, splash screen), you MUST use Registry.is(key, defaultValue) with an explicit default:

// Required for early startup code
Registry.`is`("my.key", false)  // default must match registry.properties

How to find the default value:

  1. Search in community/platform/util/resources/misc/registry.properties
  2. Or check the <registryKey> declaration in plugin.xml

Why: Registry.is(key) without default throws an exception if called before LoadingState.COMPONENTS_LOADED. The safe overload returns the provided default when Registry is not yet initialized.

Override via Command Line

For testing or run configurations:

-Dmy.registry.key=value

Registry in Tests

Use @RegistryKey annotation instead of Registry.get().setValue():

@Test
@RegistryKey(key = "my.registry.key", value = "true")
fun testWithRegistryEnabled() { ... }

See writing-tests.md for more test patterns.

Signals

GitHub stars
2k
Forks
309
Last commit
Sep 2026

ahel recommends instead

Advanced
Catalog kind
skill
Gateway key
registry-2
Source
github.com/jetbrains/mps