IntelliJ `AnAction` 클래스를 구현하거나 수정하고 `plugin.xml`에 등록하도록 안내합니다. 표시 이름과 설명은 메시지 번들에 두고, 필요하면 아이콘을 설정하며, 이벤트 코루틴 범위에서 중단 함수를 실행해 동기식 처리로 IDE가 멈추는 일을 방지합니다.
- IDE 메뉴에 새 동작 추가
- 동작 등록이나 아이콘 변경
- 동작 이름과 설명 정리
Jewel 테마와 컴포넌트로 데스크톱 Compose UI를 구성하는 방법을 안내합니다. IntelliJ 플러그인과 독립 앱에 맞는 테마를 고르고, 화면에 맞는 컨트롤과 아이콘을 선택하며 플랫폼 로직을 컴포저블 밖에 둡니다.
Build UI with Jewel components and themes.
실행 점수 미검증
설치 방법 보기이 스킬은 Jewel의 테마, 컴포넌트, 레이아웃, 아이콘, 타이포그래피를 사용해 Compose UI를 구현하는 방법을 안내합니다. 먼저 실행 환경이 IntelliJ 플러그인인지 독립 Compose Desktop 앱인지 구분하고, 각각에 맞는 SwingBridgeTheme 또는 IntUiTheme를 선택합니다. 버튼, 선택 컨트롤, 입력 필드 등은 상호작용에 맞춰 고르고, 색상과 크기는 테마에서 가져오는 방법을 설명합니다. 아이콘을 불러오는 방식, 사용자 정의 테마, 화면을 작은 컴포저블로 나누는 방법도 다룹니다. IntelliJ Platform의 상태와 서비스는 컴포저블 밖에 두고, 상태를 UI에 전달하며 이벤트는 콜백으로 돌려주는 구성을 안내합니다.
IntelliJ 스타일의 데스크톱 화면을 만들거나, 플러그인과 독립 앱 중 실행 환경에 맞는 테마를 선택하거나, 화면에 어울리는 Jewel 컴포넌트와 아이콘을 확인할 때 유용합니다.
Jewel은 글꼴과 렌더링을 완전하게 처리하려면 JetBrains Runtime이 필요합니다. Compose와 Swing을 임베드하는 방법은 이 스킬의 범위가 아닙니다. ToolWindow 또는 ComposePanel 설정이 주된 작업이라면 jewel-swing-interop을 사용합니다.
이 소개문은 공개된 SKILL.md를 바탕으로 AI(OpenAI Codex)가 작성했습니다. 정확한 사양은 아래 원문을 확인하세요.
AI가 SKILL.md의 내용에서 주의가 필요한 작업과 도입 전제를 확인했습니다. 점수는 실제로 실행한 결과(실행 검증)만으로 매깁니다.
점수에는 넣지 않았습니다. 2026년 10월 28일 기준으로 AI(OpenAI Codex)가 판정했습니다. 참고용이므로 설치 전에 원문도 확인해 주세요.
설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
Implement UI with Jewel by first selecting the runtime context, then applying the correct theme wrapper, then using Jewel components and icon APIs.
Standalone:
IntUiTheme(isDark = false) {
App()
}
IntelliJ plugin:
SwingBridgeTheme {
App()
}
Icon loading:
object MyIcons {
val Settings = PathIconKey("icons/settings.svg", MyIcons::class.java)
}
Icon(key = MyIcons.Settings, contentDescription = "Settings")
Decorated window (standalone, custom title bar):
IntUiTheme(
theme = themeDefinition,
styling = ComponentStyling.default().decoratedWindow(
titleBarStyle = TitleBarStyle.light(),
),
) {
DecoratedWindow(onCloseRequest = ::exitApplication) {
TitleBar { /* title bar content */ }
App()
}
}
Customize the title bar (colors, metrics, and fullscreen-control handling) by passing TitleBarStyle to
ComponentStyling.default().decoratedWindow(...), not through IntUiTheme(isDark = ...) alone.
This skill covers Jewel's theme wrappers, components, layout, icons, and typography — the Compose side of the UI. It does not cover Compose-in-Swing embedding mechanics. If the user's question is primarily about:
ToolWindowFactory / ToolWindow contentComposePanel or wiring setContentplugin.xml tool window extensionsenableNewSwingCompositing and related compositing/AWT flagsLocalComponent and Swing ↔ Compose bidirectional integration…the correct response is to name jewel-swing-interop explicitly as the skill for that work and stop. Do not walk
through ToolWindowFactory / ComposePanel / plugin.xml setup here, even if you know how. You can still state that
content inside the ComposePanel must use SwingBridgeTheme (a theming concern, in scope), and defer the rest to
jewel-swing-interop.
Decide runtime before writing code:
SwingBridgeTheme) and IntelliJ bundled modules.IntUiTheme and standalone Jewel dependencies.For agent-generated desktop UI prototypes, prefer a Jewel/desktop preview or sandbox when one is available. Choose Material-style mobile previews only deliberately for mobile/Android-targeting prototypes or when the user explicitly wants a mobile device-frame preview; Material styling is not the general desktop default.
If context is unclear, inspect build files and imports first:
org.jetbrains.jewel.bridge.theme.SwingBridgeTheme implies plugin context.org.jetbrains.jewel.intui.standalone.theme.IntUiTheme implies standalone context.Use STANDALONE-VS-BRIDGE.md for dependency and wrapper snippets.
Do not leak or access IntelliJ Platform APIs (IJPL) directly or indirectly inside Jewel/Compose composition.
Composables must render explicit state and emit events; IntelliJ Platform interaction belongs at the presenter,
controller, service, or action boundary.
Avoid calling or indirectly reaching from composition into platform services, application state, registry, action system, project model, PSI, VFS, message bus, disposables, or other platform-owned mutable/thread-bound APIs. This protects recomposition stability, preview/test isolation, and compatibility across IntelliJ Platform updates.
Preferred pattern:
If direct or indirect platform access from composition is unavoidable, pass an injected collaborator as a parameter or composition-local dependency that tests can replace with a fake. Keep the collaborator surface minimal and exclude platform objects from stable UI state. Manage threading, read/write actions, disposables, and Compose stability explicitly.
Use the simplest valid theme API first:
IntUiTheme(isDark = ...).IntUiTheme(theme = ..., styling = ..., swingCompatMode = ...).SwingBridgeTheme { ... }.When implementing custom standalone themes:
ThemeDefinition via JewelTheme.lightThemeDefinition(...) or JewelTheme.darkThemeDefinition(...).JewelTheme.createDefaultTextStyle() and JewelTheme.createEditorTextStyle().ComponentStyling.default().with(...) (or specialized style builders).Use THEMING.md for concrete patterns. Use THEMING-COLORS.md for color-palette and semantic-color guidance. Use TYPOGRAPHY.md for text-style guidance and when-to-use rules.
Do not key remember only by JewelTheme.name, a LaF name, or another human-readable label when the cached value is
derived from theme data. Colours, metrics, typography, icon data, and Swing defaults can change while the visible theme
name stays the same.
Prefer the narrowest correct key:
remember.JewelTheme.instanceUuid.Use JewelTheme.instanceUuid as an invalidation token for theme-instance changes, not as a blanket replacement for
precise keys. Avoid JewelTheme.name as a proxy for theme state.
Before writing component code, check COMPONENT-SELECTION.md for the when-to-use rule. Jewel implements the JetBrains IntelliJ Platform UI Guidelines — those guidelines constrain which control fits a given interaction, not just which APIs exist.
Most common decisions:
RadioButtonRow under a GroupHeader (label ends with :). Do not
use three DefaultButtons.CheckboxRow controls, and use
ThreeStateCheckbox for a "select all" parent.ListComboBox / ComboBox.DefaultButton for the primary action in a form or dialog and OutlinedButton for secondary or cancel actions.
Never place two DefaultButton controls side by side.Tooltip carrying the action name + keyboard shortcut. Every icon-only control needs
one.TextField for one-line; TextArea for multi-line / newline-valid content (commit messages,
descriptions, code).Use COMPONENT-SELECTION.md for the full decision tables and LABEL-RULES.md for label-writing conventions.
Use Jewel components from org.jetbrains.jewel.ui.component for IntelliJ-styled UI.
Row, Column, Box) for composition.DefaultButton, OutlinedButton, TextField, Checkbox, Tabs, etc.) for interactive
primitives.Use local samples as source-of-truth examples:
Use LAYOUT-PATTERNS.md for composition archetypes extracted from those sample apps. Use COMPONENTS-CATALOG.md for component-by-component catalog guidance.
Treat composables like any other production code: keep them clean, clear, and as small as practical. Avoid huge composables with deep nesting and mixed responsibilities. Extract sub-composables when a branch, section, row, toolbar, footer, popup, or repeated layout block has a distinct purpose.
Organize files so readers can follow the UI top-down: put public entry-point composables near the top, then the private sub-composables they call in usage order. Keep helper functions, constants, and state-holder glue close to the code that uses them unless project conventions say otherwise.
Reusable composables are APIs. Give public or cross-file reusable composables KDoc that states their purpose, key parameters, slot expectations, and any non-obvious behavior. For high-level API design, use the AndroidX Compose guidance as a reference, adapted for Desktop/Jewel rather than Android-only APIs:
Do not copy those guidelines wholesale into this skill; link to the source so the guidance stays current.
Use IconKey-based loading for portability across standalone and bridge:
PathIconKey(path, iconClass) when icon path is the same across old/new UI.IntelliJIconKey(oldUiPath, newUiPath, iconClass) when paths differ.Icon(key = ..., contentDescription = ...) or Image(iconKey = ...) instead of deprecated raw
painterResource.AllIconsKeys for IntelliJ platform icons.When using AllIconsKeys in standalone apps, make sure IntelliJ icons are on the classpath (recommended:
com.jetbrains.intellij.platform:icons).
Use PainterHint only when you need stateful or dynamic paths or runtime icon patching behavior.
When debugging icon-not-found errors, confirm runtime context (standalone vs plugin) before recommending a fix —
AllIconsKeys availability and classpath layout differ between the two. Ask the user if context is not clear from the
question.
Use ICONS.md for icon patterns and pitfalls.
When citing source in responses, prefer master links for always-latest behavior:
Icon composable)Treat this skill as Jewel-version scoped.
libs.versions.toml, build.gradle.kts) first; ask only if ambiguous.master links with release-tag links.Before finishing:
IntUiTheme vs SwingBridgeTheme).IconKey and classpath-friendly resource resolution.remember values are either uncached, keyed by the concrete values they use, or keyed by
JewelTheme.instanceUuid when broad theme/LaF state is the dependency; do not key them by JewelTheme.name alone.아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
IntelliJ `AnAction` 클래스를 구현하거나 수정하고 `plugin.xml`에 등록하도록 안내합니다. 표시 이름과 설명은 메시지 번들에 두고, 필요하면 아이콘을 설정하며, 이벤트 코루틴 범위에서 중단 함수를 실행해 동기식 처리로 IDE가 멈추는 일을 방지합니다.
IntelliJ JPS 테스트 모듈을 Bazel로 옮기고 Bazel에서만 발생하는 실패를 조사하는 안내서입니다. 의존성, 플러그인, 테스트 데이터와 runfiles 문제를 확인하고 생성된 대상과 이전된 테스트를 검증합니다.
IntelliJ 프로젝트 규칙에 맞춰 Kotlin과 Java 코드를 작성하거나 검토합니다. 언어 선택, 서식, 봉인 타입, 스레드 주석, 제어 흐름 예외 처리를 확인합니다.
이 가이드는 IntelliJ 프로젝트의 변경 사항을 목적별로 나누고 프로젝트 형식에 맞는 커밋 메시지를 작성하도록 돕습니다. 티켓이 있으면 번호와 변경 설명을, 없으면 레이블과 하위 시스템명을 사용하며 필요에 따라 이유와 판단을 본문에 담습니다.
여러 Python 타입 검사기로 코드 조각이나 파일의 타입 추론과 오류 판정을 비교합니다. 도구별 결과, 실행 시간, 진단 내용을 Markdown 보고서로 모아 저장할 수 있습니다.
Compose Desktop 화면을 구성할 때 컴포저블은 렌더링을 맡고 프레젠터나 코디네이터는 앱 결정을 맡도록 구조를 정리합니다. 상태 소유권, Effect, 재사용 컴포넌트 API, 지연 목록 키, 애니메이션과 성능을 개별 UI 변경에 맞춰 살펴봅니다.