IntelliJ IDEA Plugin Development
This Skill provides guidance for developing IntelliJ IDEA plugins using standardized templates. It covers two types of plugins: standard plugins (without AI) and AI-integrated plugins (with IntelliAI Engine).
When to Use This Skill
Use this Skill when:
- Creating a new IntelliJ IDEA plugin project
- Setting up plugin structure and configuration
- Implementing actions, settings pages, or UI components
- Integrating AI capabilities via IntelliAI Engine
- Following best practices for IntelliJ plugin development
- Working with plugin templates (
template-without-aiortemplate-with-ai)
Plugin Types
1. Standard Plugin (template-without-ai)
Use for: Plugins that don't require AI functionality.
Features:
- Simplified Action (right-click menu)
- Icon management class
- Notification utilities
- Internationalization support
- Basic project structure
Key Components:
ExampleAction- Single action exampleExampleIcons- Icon managementNotificationUtil- Notification helperExampleBundle- Internationalization
2. AI-Integrated Plugin (template-with-ai)
Use for: Plugins that need AI capabilities via IntelliAI Engine.
Additional Features:
- AI provider selection in settings
- Prompt template management
- Settings page with advanced options
- Integration with IntelliAI Engine
Key Components:
- All standard plugin components
SettingsState- Persistent configurationExampleSettingsConfigurable- Settings UIExampleSettingsPanel- Settings panel with AI provider dropdown and prompt templates
Project Structure
Standard Plugin Structure
template-without-ai/
├── src/main/java/dev/dong4j/zeka/stack/idea/plugin/example/
│ ├── action/ # Actions
│ ├── icons/ # Icon management
│ └── util/ # Utilities (Bundle, Notification)
├── src/main/resources/
│ ├── icons/ # Icon resources (SVG)
│ ├── META-INF/
│ │ └── plugin.xml # Plugin configuration
│ └── messages*.properties # Internationalization
├── includes/ # Plugin description and changelog
├── docs/ # User manual
├── build.gradle.kts # Build configuration
└── gradle.properties # Plugin properties
AI-Integrated Plugin Structure
template-with-ai/
├── src/main/java/dev/dong4j/zeka/stack/idea/plugin/example/
│ ├── action/ # Actions
│ ├── icons/ # Icon management
│ ├── settings/ # Settings (State, Configurable, Panel)
│ └── util/ # Utilities
├── ... (same as standard)
└── build.gradle.kts # Includes AI Engine dependencies
Development Steps
Step 1: Choose Template Type
For standard plugins:
- Use
template-without-aias base - No AI Engine dependencies needed
- Simpler configuration
For AI-integrated plugins:
- Use
template-with-aias base - Requires IntelliAI Engine plugin
- Includes settings page and AI provider management
Step 2: Configure Project
-
Update
gradle.properties:pluginGroup=dev.dong4j.zeka.stack pluginName=Your Plugin Name pluginVersion=2025.3.1 kitVersion=2025.3.1 rootProjectName=your-plugin-name -
Update
plugin.xml:- Change plugin ID
- Update plugin name
- Register your actions and services
-
Update package names:
- Replace
dev.dong4j.zeka.stack.idea.plugin.examplewith your package - Update all Java files
- Update
plugin.xmlreferences
- Replace
Step 3: Implement Actions
Standard Action Pattern:
public class ExampleAction extends AnAction {
public ExampleAction() {
super(
ExampleBundle.message("action.example.title"),
ExampleBundle.message("action.example.description"),
ExampleIcons.EXAMPLE_16
);
}
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
Project project = e.getProject();
PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE);
if (project == null || psiFile == null) {
NotificationUtil.showError(project, ExampleBundle.message("error.no.file"));
return;
}
// Your action logic here
NotificationUtil.showInfo(project, "Action executed");
}
}
Register in plugin.xml:
<action id="your.package.action.ExampleAction"
class="your.package.action.ExampleAction">
<add-to-group group-id="EditorPopupMenu" anchor="last"/>
</action>
Step 4: Icon Management
Create Icon Class:
public class ExampleIcons {
@NotNull
private static Icon load(@NotNull String iconPath) {
return IconLoader.getIcon(iconPath, ExampleIcons.class);
}
public static final Icon EXAMPLE_16 = load("/icons/example_16.svg");
}
Add Icon Resources:
- Place SVG files in
src/main/resources/icons/ - Use 16x16 for actions, 24x24 for notifications, 32x32 for dialogs
Step 5: Internationalization
Add Messages:
messages.properties (English):
action.example.title=Example Action
action.example.description=Execute example action
error.no.file=No file found
messages_zh_CN.properties (Chinese):
action.example.title=示例操作
action.example.description=执行示例操作
error.no.file=未找到文件
Use in Code:
String message = ExampleBundle.message("action.example.title");
Step 6: Settings Page (AI-Integrated Only)
Create SettingsState:
@State(
name = "ExamplePluginSettings",
storages = @Storage("example-settings.xml")
)
public class SettingsState implements PersistentStateComponent<SettingsState> {
public AIProviderConfig providerConfig;
public boolean showAdvancedSettings = false;
public String systemPrompt = getDefaultSystemPrompt();
public String exampleTemplate = getDefaultExampleTemplate();
public static SettingsState getInstance() {
return ApplicationManager.getApplication().getService(SettingsState.class);
}
}
Create Settings Panel:
public class ExampleSettingsPanel {
private JComboBox<AIProviderConfig> providerComboBox;
private JBTextArea systemPromptTextArea;
// Create AI provider selection panel
private JPanel createAIProviderSelectionPanel() {
List<AIProviderConfig> providers = getAiProviderTypes();
// Build UI with FormBuilder
}
}
Register in plugin.xml:
<applicationService serviceImplementation="your.package.settings.SettingsState"/>
<applicationConfigurable
parentId="tools"
instance="your.package.settings.ExampleSettingsConfigurable"
id="your.package.settings.ExampleSettingsConfigurable"
displayName="Your Plugin"/>
Step 7: Build Configuration
Standard Plugin (build.gradle.kts):
dependencies {
intellijPlatform {
create(providers.gradleProperty("platformType"),
providers.gradleProperty("platformVersion"))
bundledPlugin("com.intellij.java")
// No AI Engine dependency
}
}
AI-Integrated Plugin (build.gradle.kts):
dependencies {
intellijPlatform {
// ... same as standard
// plugin("dev.dong4j.zeka.stack.idea.plugin.common.ai") // Uncomment for marketplace
}
compileOnly("dev.dong4j.zeka.stack:intelli-ai-engine:1.1.0")
}
tasks {
// Add buildAiCommonPlugin and copyAiCommonPlugin tasks
// for local development
}
Step 8: Testing
-
Build plugin:
./gradlew buildPlugin -
Run in sandbox:
./gradlew runIde -
Verify:
- Action appears in right-click menu
- Settings page loads (AI-integrated)
- Notifications work
- Internationalization works
Best Practices
Code Organization
-
Package Structure:
action/- User actionsicons/- Icon managementsettings/- Settings (AI-integrated only)util/- Utilities (Bundle, Notification)
-
Naming Conventions:
- Actions:
*Action.java - Settings:
*SettingsState.java,*SettingsConfigurable.java,*SettingsPanel.java - Icons:
*Icons.java - Bundles:
*Bundle.java
- Actions:
UI Components
-
Use IntelliJ UI Components:
JBLabel,JBTextField,JBCheckBox(not JLabel, JTextField)FormBuilderfor layoutsToolbarDecoratorfor tablesJBTablefor data tables
-
Settings Page:
- Use
FormBuilderfor consistent layout - Add emojis to labels for better UX (🤖, ⚙️, 📝, etc.)
- Support collapsible advanced settings
- Use
JBTabbedPanefor multiple prompt templates
- Use
Internationalization
-
Always use Bundle:
- Never hardcode strings
- Use
ExampleBundle.message(key, params...) - Provide both English and Chinese
-
Key Naming:
action.*- Action labelssettings.*- Settings labelserror.*- Error messagessuccess.*- Success messages
Configuration
-
Persistent State:
- Use
@Stateannotation - Implement
PersistentStateComponent - Initialize collections to avoid null
- Use
-
Settings UI:
- Implement
ConfigurableorSearchableConfigurable - Check
isModified()before save - Reset UI in
reset()method
- Implement
Common Patterns
Notification Pattern
// Success
NotificationUtil.showInfo(project, ExampleBundle.message("success.action.executed"));
// Error
NotificationUtil.showError(project, ExampleBundle.message("error.no.file"));
// Warning
NotificationUtil.showWarning(project, ExampleBundle.message("warning.message"));
Action Update Pattern
@Override
public void update(@NotNull AnActionEvent e) {
Project project = e.getProject();
PsiFile file = e.getData(CommonDataKeys.PSI_FILE);
e.getPresentation().setEnabled(project != null && file != null);
}
Settings Validation Pattern
@Override
public void apply() throws ConfigurationException {
if (!validateSettings()) {
throw new ConfigurationException("Invalid settings");
}
settingsPanel.apply(settings);
}
Differences: Standard vs AI-Integrated
| Feature | Standard Plugin | AI-Integrated Plugin | |-----------------------|-----------------|-------------------------------------------| | AI Engine Dependency | ❌ No | ✅ Yes (compileOnly) | | Settings Page | ❌ No | ✅ Yes | | AI Provider Selection | ❌ No | ✅ Yes | | Prompt Templates | ❌ No | ✅ Yes | | Build Tasks | Basic | + buildAiCommonPlugin, copyAiCommonPlugin | | plugin.xml | Actions only | + SettingsState, SettingsConfigurable |
Troubleshooting
Plugin doesn't load
- Check
plugin.xmlsyntax - Verify package names match
- Check for missing dependencies
Settings not persisting
- Verify
@Stateannotation - Check
getState()andloadState()methods - Ensure fields are
public
AI provider not available
- Check IntelliAI Engine plugin is installed
- Verify provider is configured and tested
- Check
AIProviderSettings.getInstance().getVerifiedProviders()
Icons not showing
- Verify icon path starts with
/icons/ - Check SVG file exists in resources
- Ensure
IconLoader.getIcon()path is correct
References
- Template projects:
template-without-ai/andtemplate-with-ai/ - IntelliJ Platform SDK: https://plugins.jetbrains.com/docs/intellij/
- IntelliAI Engine: See
intelli-ai-engine/project - Example implementations:
intelli-ai-changelog/,intelli-ai-javadoc/
Examples
Creating a Standard Plugin
- Copy
template-without-aito your project - Update
gradle.propertieswith your plugin info - Rename package from
exampleto your package - Implement your action in
action/package - Add icons and internationalization
- Build and test
Creating an AI-Integrated Plugin
- Copy
template-with-aito your project - Follow standard plugin steps
- Configure AI provider in settings
- Implement prompt templates
- Use
AIService.getInstance()to call AI - Build and test (ensure IntelliAI Engine is available)
Scan to join WeChat group