Help us improve
Share bugs, ideas, or general feedback.
From backend-skills
Provides IntelliJ Platform SDK knowledge for writing, debugging, and migrating JetBrains IDE plugins — covers plugin.xml, services, actions, PSI/VFS, threading, custom languages, code insight, Kotlin UI DSL v2, tool windows, run configs, Gradle plugin, dynamic reload, verifier, signing, and Marketplace publishing.
npx claudepluginhub buyoung/skills --plugin devops-skillsHow this skill is triggered — by the user, by Claude, or both
Slash command
/backend-skills:jetbrains-plugin-developmentThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill carries the IntelliJ Platform SDK domain knowledge needed to write, debug, and modify
examples/README.mdexamples/action_basics/DynamicGreetingsGroup.ktexamples/action_basics/HelloAction.ktexamples/action_basics/plugin.xmlexamples/folding_builder/ExampleFoldingBuilder.ktexamples/folding_builder/plugin.xmlexamples/inline_completion_provider/ExampleInlineCompletionProvider.ktexamples/inline_completion_provider/plugin.xmlexamples/settings_persistence/MyAppSettings.ktexamples/settings_persistence/MyConfigurable.ktexamples/settings_persistence/plugin.xmlexamples/simple_language_plugin/Simple.bnfexamples/simple_language_plugin/Simple.flexexamples/simple_language_plugin/SimpleAnnotator.ktexamples/simple_language_plugin/SimpleColorSettingsPage.ktexamples/simple_language_plugin/SimpleCommenter.ktexamples/simple_language_plugin/SimpleCompletionContributor.ktexamples/simple_language_plugin/SimpleFile.ktexamples/simple_language_plugin/SimpleFileType.ktexamples/simple_language_plugin/SimpleLanguage.ktGenerates JetBrains IDE VM options for version-specific GC selection and memory/performance tuning (JDK 17/21, IDE 222+). Useful for IDE freezes, slow indexing, and OOM errors.
Packages IDA Pro plugins for distribution via the IDA Plugin Manager and plugins.hex-rays.com. Guides creation of ida-plugin.json manifests, archive packaging, directory restructuring, and GitHub Releases publishing.
Installs the Amplicode IntelliJ plugin into IntelliJ IDEA (Ultimate/Community) and GigaIDE via JetBrains CLI, detecting existing installations and filtering compatible IDEs.
Share bugs, ideas, or general feedback.
This skill carries the IntelliJ Platform SDK domain knowledge needed to write, debug, and modify
JetBrains IDE plugins competently. It is opinionated toward 2024.1+ targets (Kotlin coroutines,
IntelliJ Platform Gradle Plugin 2.x, light services with @Service, dynamic plugin defaults) and
calls out where pre-2024.1 patterns are still required.
plugin.xml of a feature line up — open the matching folder under examples/.Do not invent extension point names, attribute names, or API signatures. The Platform is highly
specific about strings (language="JAVA" vs "java", EP IDs, attribute spellings); a wrong
character is enough to silently disable a feature. When unsure, surface the question to the user
with the relevant reference cited — and verify the spelling in the IDE's plugin.xml editor,
which auto-completes valid EP names from the loaded plugin set and underlines unknown ones.
These five invariants explain almost every "why doesn't this work?" question.
plugin.xml is the contract. A class is invisible to the IDE until it is registered.
@Service, @Service(cs) annotations and a few META-INF/ filename conventions are the
only exceptions; everything else (extensions, listeners, actions, EPs you define, dependencies)
must appear in plugin.xml (or a config-file of an <depends optional> block).@Service / @Service(Service.Level.PROJECT)), and have extensions look it up on demand.writeAction/backgroundWriteAction). Long work belongs on a background thread
with progress and cancellation. EDT freezes are user-visible; lock violations are immediate
exceptions or data corruption. New code on 2024.1+ uses Kotlin coroutines
(Dispatchers.EDT, readAction { }, writeAction { }, cs.launch { }).Disposer is how lifecycle works. Resources tie into a Disposable parent and the
platform calls dispose() post-order when the parent goes away. Services are usually the
right parent. Never use Application or Project directly as a parent — that traps
resources past plugin unload and leaks the classloader. CoroutineScope injection on a
@Service is the modern alternative to Disposable.require-restart="false". To stay reloadable: every EP your plugin contributes to and
defines must be dynamic, no static caches of plugin classes, no object singletons holding
state, no listeners parented to Application/Project, no overrides="true" services.Use this section as a router. Do not bulk-read every reference. Start with the single most specific reference below, then add companion references only when the task crosses that boundary.
Reference filenames are prefixed by category for fast scanning: 01_core, 02_runtime,
03_lifecycle, 04_threading, 05_file_model, 06_code_insight, 07_language,
08_ui, 09_project, 10_execution, and 11_distribution.
plugin.xml, required descriptor elements, file naming conventions, and descriptor blocks for listeners/actions.<depends>, optional dependency config files, sinceBuild, untilBuild, and platform branch targeting.CoroutineScope, and persistent-state handoff.MessageBus, Topic, manual subscriptions, and listener lifetime.AnAction, update, ActionUpdateThread, action groups, keymaps, and action skeletons.TypedHandlerDelegate, EditorActionHandler, typing interception, autopopup routing, and multi-caret editor actions.ApplicationComponent, ProjectComponent, or ModuleComponent to services, extensions, listeners, and startup activities.Disposable trees, safe parent selection, cleanup patterns, Alarm, and disposal triggers.LeakHunter, sandbox checks, and leak-prone patterns.ReadAction.nonBlocking, WriteCommandAction, invokeLater, modality, and annotations.Task.Backgroundable, progress indicators, cancellation, synchronous progress, and fire-and-forget work.Dispatchers.EDT, suspending read/write actions, progress, and runBlockingCancellable.Thread, ExecutorService, and Task.Backgroundable with coroutine-based code.VirtualFile, file lookup, refresh, listeners, VFS lifecycle, and identity.Document, document lookup, reads, writes, synchronization with PSI, listeners, and guarded ranges.PsiElement, PSI lookup, tree walking, modifications, whitespace, and formatting.SmartPsiElementPointer, PsiReference, named elements, multi-language files, and CachedValue.UElement/UMethod/UCallExpression, sourcePsi vs javaPsi, AbstractBaseUastLocalInspectionTool, and UastHintedVisitorAdapter.FileBasedIndex, stub indexes, and AstLoadingFilter.Editor, caret, selection, multi-caret behavior, and editor coordinate systems.RangeMarker, MarkupModel, RangeHighlighter, scrolling, editor lifecycle, console filters, and guarded blocks.FileEditorProvider, custom editor tabs, preview editors, fake files, and editor disposal.LineMarkerProvider, gutter icons, leaf-element rules, slow markers, and Dumb Mode behavior.FoldingBuilder, descriptors, callbacks, custom folding settings, non-owned languages, and missing-fold diagnostics.FormattingModelBuilder + Block (indent/wrap/SpacingBuilder/getChildAttributes) for Ctrl+Alt+L, and Commenter for Ctrl+/ line/block comment toggles.LocalInspectionTool, inspections, intentions, and quick fixes.RefactoringSupportProvider and Rename/Safe Delete/Inline preconditions tied to PsiNamedElement.setName, Find Usages, and PsiReference.isReferenceTo.DocumentationTarget, PSI/symbol documentation providers, hover documentation, pointers, and legacy migration.ParameterInfoHandler, structure view, breadcrumbs, choose-by-name, and spellchecking.SurroundDescriptor, Surrounder, selection-based code wrapping, and caret/formatting rules.LineMarkerProvider/FoldingBuilder/Annotator/IntentionAction pitfalls.Language singleton, LanguageFileType, case-sensitive Language ID, and <fileType> registration with mandatory fieldName="INSTANCE"..flex files, FlexLexer/FlexAdapter, %unicode requirement, --charat Gradle flag, and TokenType.WHITE_SPACE/BAD_CHARACTER conventions.psiClassPrefix/psiPackage/elementTypeHolderClass settings, mixin classes for custom logic (never edit generated *Impl), and hand-rolled PsiParser skeleton.ParserDefinition wiring (lexer/parser/IFileElementType/comment & whitespace token sets/element factory), PsiFileBase root file, and <lang.parserDefinition> registration.SyntaxHighlighterBase, TextAttributesKey with DefaultLanguageHighlighterColors fallbacks), <lang.syntaxHighlighterFactory> registration, and ColorSettingsPage for user-themable colors.Annotator for PSI-based semantic warnings/errors, AnnotationHolder builder API (.create() is mandatory), Annotator vs LocalInspectionTool decision, and stateless/cheap/cached-resolution rules.HighlightInfoFilter, syntax/error highlighting suppression, external annotator filters, and false-positive control.CompletionContributor, CompletionType (BASIC/SMART/CLASS_NAME), CompletionParameters/CompletionResultSet, LookupElementBuilder, prefix matchers, runRemainingContributors, and <completion.contributor> registration.InlineCompletionProvider, gray inline suggestions, provider registration, debounce, direct calls, and update behavior.PostfixTemplateProvider, postfix completion registration, description resources, and applicability diagnostics.PsiReference, PsiReferenceContributor, multi-resolve, and search support.FindUsagesProvider, WordsScanner, usage presentation, result grouping, Rename, and Safe Delete prerequisites.PlatformPatterns/StandardPatterns/PsiJavaPatterns matcher DSL — gating completion and reference contributors via .withParent/.withSuperParent/.afterLeaf/.afterSibling/custom PatternCondition.MultiHostInjector for injecting another language into string literals (regex inside Java strings, SQL inside Kotlin templates) so the inner language gets full PSI/completion/inspection.DeclarativeInlayHintsProvider (2023.2+) and legacy <inlayHintsProvider> for parameter/type hints, <codeVision.provider> for usages/refs counts, and Polysymbols for polyglot web files.language= casing ("JAVA" vs "java"), reused stateful Lexer, BNF mixin work in generated *Impl, uncached annotator resolution, no-op setName, missing BAD_CHARACTER and <colorSettingsPage>.PersistentStateComponent, BaseState, immutable state, @State, @Storage, and PasswordSafe.Configurable settings pages.DialogWrapper and modal dialogs.ToolWindowFactory and tool-window content.JBCefBrowser, support checks, browser/client disposal, handlers, and JavaScript bridge safety.JBSplitter, JBTabs, and layout helpers.JBTable, TableView, and ListTableModel.DnDSupport.Notification and EditorNotificationProvider.IconLoader.getIcon(...)), SVG resources under resources/icons/, dark-theme _dark.svg pairing, size conventions, and AllIcons.* catalog.JBColor, named colors, themeMetadataProvider, custom theme keys, and theme-change-safe color lookup.UiDataProvider and DataContext.BaseState var fields, missing @JvmField on SerializablePersistentStateComponent, roamingType rules, Configurable.apply not flushing, leaked Configurable panels holding Editor/Project, non-DumbAware ToolWindowFactory, missing <notificationGroup>.Project lookup and lifecycle (e.project, service injection, ProjectManager.getInstance(), defaultProject caveats), messageBus, and isDisposed/isOpen.Module, roots, content entries, order entries, and ProjectFileIndex.LibraryTablesRegistrar and modifying libraries via Write Action, AdditionalLibraryRootsProvider/SyntheticLibrary, ProjectJdkTable and custom SdkType/ProjectSdkSetupValidator, and FacetManager/FacetType for per-module tech config.ImmutableEntityStorage/MutableEntityStorage, WorkspaceEntity subclasses (ModuleEntity, ContentRootEntity, LibraryEntity), suspend WorkspaceModel.update, change Flow<VersionedStorageChange>, and SymbolicEntityId/ExternalMappingKey for external-system tracking.TreeStructureProvider to re-bucket/hide/decorate children, ProjectViewNodeDecorator for suffix/icon overlays, AbstractProjectViewPane for custom panes, and public selection helpers without internal pane extractor APIs.ProjectActivity (suspend) and StartupActivity.DumbAware via <postStartupActivity>, ProjectManagerListener, ModuleListener, ModuleRootListener.defaultProject misuse, holding Project references on application-level state, root-model edits outside Write Action, missing model.commit()/dispose(), EDT iteration of ProjectFileIndex, ignoring isExcluded, non-DumbAware StartupActivity.RunProfileState, runners, run line markers, and before-run tasks.ProcessHandler, ConsoleView, filters, and embedded terminal.DomElement interfaces with @Attribute/@Required/GenericAttributeValue, DomFileDescription, Converter/ResolvingConverter for reference resolution, and <dom.fileDescription>/<dom.extender>.RunProfileState.execute running on EDT, missing ProcessTerminatedListener.attach (no exit-code line), global OkHttpClient on a service blocking unload, DOM isMyFile namespace bugs, EDT-bound ErrorReportSubmitter/HttpRequests.@Nls, and language-pack contributions.<internalFileTemplate> for New-File templates (Velocity .ft files under resources/fileTemplates/internal/, name must match) and <defaultLiveTemplates> XML at resources/liveTemplates/.AbstractVcs, ChangeProvider, VcsDirtyScopeManager, ContentRevision/FilePath/VcsRevisionNumber, VcsRoot/VcsRootChecker, diff/merge tools, and when to extend the existing Git plugin via <depends optional config-file> instead of a new AbstractVcs.verifyPlugin Gradle task (2.x replacement for runPluginVerifier) — pluginVerification.ides { recommended()/create()/local() }, blocking issues (missing classes, @Internal usage from outside, plugin-class static reachability) vs informational @Experimental warnings.These are decision sketches — they tell you which references to combine, not the full answer.
AnAction subclass — see 02_runtime_actions.md.<actions> in plugin.xml — see 01_core_plugin_xml.md.update() cheap; declare getActionUpdateThread() — see 02_runtime_actions.md.04_threading_background_work_progress.md or 04_threading_coroutines_2024.md.07_language_pipeline.md, then walk the step-specific language references in order: 07_language_file_type.md, 07_language_lexer_jflex.md, 07_language_grammar_kit_bnf.md, 07_language_parser_definition_psi_file.md, 07_language_syntax_highlighting.md, 07_language_annotator.md, 07_language_completion.md, and 07_language_references_resolution.md.07_language_find_usages_provider.md, 06_code_insight_documentation_target_api.md, or 06_code_insight_refactoring_documentation_structure.md.06_code_insight_line_markers.md, 06_code_insight_folding.md, 06_code_insight_formatter_commenter.md, 06_code_insight_inspections_intentions_quick_fixes.md, 07_language_postfix_templates.md, or 06_code_insight_surround_with.md.examples/simple_language_plugin/.08_ui_tool_windows.md.02_runtime_services.md and 08_ui_settings_persistent_state.md.08_ui_settings_configurable.md.08_ui_kotlin_ui_dsl.md.Thread/ExecutorService/Task.Backgroundable to coroutines"Read 04_threading_thread_to_coroutine_migration.md first. Add 04_threading_coroutines_2024.md for API details, 02_runtime_services.md for injected CoroutineScope, and 04_threading_background_work_progress.md when replacing progress indicators.
ApplicationComponent/ProjectComponent to a modern shape"Read 02_runtime_legacy_component_migration.md first. Add 02_runtime_services.md, 02_runtime_listeners_message_bus.md, 09_project_lifecycle.md, and 02_runtime_deprecated_api_migrations.md as needed.
Read 08_ui_surface_selection.md first. Then route to 08_ui_kotlin_ui_dsl.md, 08_ui_tool_windows.md, 08_ui_dialogs.md, 08_ui_tables.md, 08_ui_choosers.md, 08_ui_status_bar_widgets.md, 08_ui_notifications.md, or 08_ui_data_context.md based on the chosen surface.
Read 01_core_extension_diagnostics.md. Add 01_core_plugin_xml.md, 01_core_dependencies.md, or 01_core_extensions.md if the diagnosis points to descriptor, dependency, or EP spelling issues.
Read the provider-specific reference first — for example 06_code_insight_folding.md, 06_code_insight_line_markers.md, 07_language_annotator.md, 07_language_completion.md, 07_language_inline_completion.md, or 06_code_insight_inspections_intentions_quick_fixes.md. Then read 06_code_insight_diagnostics.md for cross-cutting pipeline checks.
Read 02_runtime_typed_handlers_editor_actions.md first. Add 06_code_insight_editor_model.md, 05_file_model_documents.md, and 04_threading_read_write_actions.md if the handler changes text or caret state.
Read 07_language_inline_completion.md first. Add 06_code_insight_editor_model.md, 05_file_model_documents.md, and 04_threading_coroutines_2024.md if the provider needs editor state, document reads, debouncing, or cancellable background work.
Read 07_language_next_edit_suggestions.md first. Do not invent a Next Edit provider EP; if the user wants a third-party implementable suggestion source, route the implementation through 07_language_inline_completion.md.
Read 01_core_split_mode_remote_development.md first. Add 08_ui_tool_windows.md, 08_ui_dialogs.md, 02_runtime_typed_handlers_editor_actions.md, or 06_code_insight_file_editor_provider.md when the feature has frontend UI or latency-sensitive editing behavior.
Read 06_code_insight_file_editor_provider.md first for editor tabs. Add 08_ui_jcef_embedded_browser.md only when the custom editor or tool window genuinely needs browser rendering.
Run through this whenever you touch plugin code or plugin.xml. Most regressions show up here.
plugin.xml parses (open in IDE, no red underlines; XML DTD validation enabled).<depends>com.intellij.modules.platform</depends> is present.plugin.xml
completion (which only offers EPs from the plugins your <depends> resolved).
Language IDs spelled correctly (case-sensitive).final/class (not object), parameterless
constructor (or only Project/Module/CoroutineScope), no static initializers, no work
in the constructor.@Service) unless there is a real reason not to.
Constructors only take 0–2 of: Project, Module, CoroutineScope. No other services
injected via constructor.Disposable registers under a plugin-controlled parent, not Application/Project.ProgressManager.checkCanceled() or uses
coroutine suspension points, and re-throws ProcessCanceledException /
CancellationException rather than swallowing them.WriteCommandAction (or writeCommandAction { }),
so they participate in undo.Dispatchers.Main, GlobalScope, kotlinx.coroutines.runBlocking,
raw new Thread(...), or Executors.new*ThreadPool() — replaced with Dispatchers.EDT,
injected cs, runBlockingCancellable, and AppExecutorUtil.runIde boots, the changed feature works in the sandbox, and the IDE log
(idea.log in the sandbox config dir) has no new exceptions related to the plugin.verifyPlugin Gradle task (2.x; older guides
may call it runPluginVerifier) passes against the declared sinceBuild and a
recent build.autoReload = true, install/uninstall in sandbox without IDE restart).com.intellij.openapi.progress.ProcessCanceledException.@Service (no plugin.xml).@ApiStatus: Internal is forbidden for plugin code,
Experimental may break across versions, Obsolete has a stable replacement, plain public
is stable. Where a reference notes "Experimental", treat it as a deliberate trade-off.The skill is self-contained — references explain the why, examples show the how:
references/ — capability-indexed deep dives. Read the one that matches your task before
editing.examples/simple_language_plugin/ — full custom-language skeleton.examples/action_basics/ — AnAction + dynamic ActionGroup + keymap registration.examples/settings_persistence/ — @Service + SimplePersistentStateComponent + Kotlin
UI DSL v2 Configurable.examples/inline_completion_provider/ — minimal InlineCompletionProvider plus
plugin.xml registration.examples/folding_builder/ — minimal FoldingBuilderEx plus plugin.xml
registration for a known host language.When the user reports a behaviour you can't explain from these alone, stop and ask rather
than fabricate API names or attribute spellings. The IDE's plugin.xml editor (with
auto-complete and validation against the resolved plugin set) is the authoritative live
verification surface.