跳到正文
cccskills
免费在 GitHub 公开

jetbrains-ui

Build and review JetBrains plugin interfaces using Swing and IntelliJ Platform components. Follow concrete rules for layouts, theme colors, fonts, spacing, dialogs, and tool windows while keeping shared style values consistent.

中文简介正在准备中。当前显示英语简介。

原文查看原文说明

Use when writing or reviewing UI code in packages/kilo-jetbrains/ — Swing layout, platform components, UiStyle tokens, theme colors/fonts/borders, Stack/Align layouts, tool windows/dialogs/popups/notifications, settings pages, and the pre-return UI checklist.

查看安装方法

适用场景

  • Building tool windows and settings screens
  • Reviewing theme colors, fonts, and spacing
  • Choosing components for dialogs and notifications
  • Organizing rows and columns with Stack and Align

包含的文件(1)

  • SKILL.md27.2 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

JetBrains Plugin UI Guidelines

Detailed UI reference for packages/kilo-jetbrains/. See packages/kilo-jetbrains/AGENTS.md for the hard restrictions (no Compose/DSL/JCEF) and the reuse-first index; this skill covers the how.

Technology Choices

Do not use Kotlin UI DSL v2 (com.intellij.ui.dsl.builder) in this plugin. Use standard Swing with IntelliJ Platform components for all UI layout. The JetBrains modular template and some older sections of the codebase reference the DSL, but Kilo should not introduce it.

Do not use Kotlin Compose or intellij.platform.compose in this plugin. The JetBrains modular template uses Compose for its demo tool window, but Kilo should use standard Swing with IntelliJ Platform components only. Keep all plugin UI in the existing Swing-based stack.

Do not use JCEF (JBCefBrowser) in this plugin. JCEF does not work in JetBrains remote development (split mode): the frontend process runs on the client machine but JCEF requires a display on the host, making it effectively unusable for remote users. Use standard Swing with IntelliJ Platform components for all UI.

NeedAPI
Any layout, forms, panelsStandard Swing with IntelliJ Platform component replacements
Tool windowsSimpleToolWindowPanel + ToolWindow.contentManager
Menus and toolbarsAction System
DialogsExtend DialogWrapper

Style Tokens

UiStyle (frontend/src/main/kotlin/ai/kilocode/client/ui/UiStyle.kt) is the single source of truth for reusable UI constants in this plugin.

Before introducing any new reusable color, spacing value, border, size, font, or helper:

  1. Check the IntelliJ source ($INTELLIJ_REPO) or public repository for an existing standard API or named key (e.g. JBUI.CurrentTheme.*, UIUtil.*, NamedColorUtil.*, JBColor.namedColor(...), JBFont.*).
  2. If a standard platform key exists, use it directly — do not copy the value into UiStyle.
  3. If no standard key fits, add the new reusable token to UiStyle. Do not scatter constants into component-local fields, pass them through constructors, or duplicate them across files.

UiStyle contents:

  • UiStyle.Gap — DPI-aware spacing primitives (xs, sm, md, lg, pad). Use for borders, gaps, and insets anywhere in the plugin.
  • UiStyle.Colors — theme-aware generic colors (bg, fg, weak, editorBackground, errorLabelForeground, warningLabelForeground).
  • UiStyle.Components — small reusable Swing helpers (e.g. transparent()).

SessionUiStyle (frontend/src/main/kotlin/ai/kilocode/client/session/ui/style/SessionUiStyle.kt) owns static tokens specific to the chat/session UI:

  • SessionUiStyle.SessionLayout — transcript list geometry and scroll increments.
  • SessionUiStyle.View — card sizing, card borders, surfaces, hover colors, and nested objects for Prompt, Reasoning, Message, and Tool.
  • SessionUiStyle.RecentSessions — recent sessions list limits.
  • SessionUiStyle.Timeline — activity-indicator colors for the session header timeline.

Rules:

  • Generic layout constants (gaps, generic colors, reusable helpers) → UiStyle.
  • Session-specific constants (transcript layout, prompt chrome, card geometry, session colors) → SessionUiStyle.
  • Do not create extra fields whose only purpose is to hold a constant value. Reference the constant object directly, e.g. UiStyle.Gap.lg() or SessionUiStyle.View.Prompt.EDITOR_LINES.
  • Do not pass style constants through constructors or method parameters. Using the constant directly at the call site is correct and preferred. Only introduce parameters for values that are genuinely variable or test-controlled.

Primary UI Rules

  • Use IntelliJ platform components instead of raw Swing where an equivalent exists (see Platform Components table below).
  • When implementing a new user-facing action, consider adding metrics so usage can be tracked.
  • Do not set default Swing properties explicitly. Avoid isOpaque = false unless the component default differs or there is a documented rendering reason.
  • Avoid hardcoded dimensions, colors, and font sizes — use the platform style APIs described in Theme-Derived Colors, Theme-Derived Fonts, and Borders, Insets, and Spacing.
  • Put user-visible strings in *.properties files.
  • Do not add decorative helper functions, wrappers, or defensive UI code unless they materially improve clarity or correctness.

Platform Components and Utilities

Use IntelliJ platform components instead of raw Swing. Inspection Plugin DevKit | Code | Undesirable class usage highlights raw Swing usage where a platform replacement exists.

Instead ofUsePackage
JLabelJBLabelcom.intellij.ui.components
JTextFieldJBTextFieldcom.intellij.ui.components
JTextAreaJBTextAreacom.intellij.ui.components
JListJBListcom.intellij.ui.components
JScrollPaneJBScrollPanecom.intellij.ui.components
JTableJBTablecom.intellij.ui.table
JTreeTreecom.intellij.ui.treeStructure
JSplitPaneJBSplittercom.intellij.ui
JTabbedPaneJBTabscom.intellij.ui.tabs
JCheckBoxJBCheckBoxcom.intellij.ui.components
Raw runtime colorsUIUtil, JBUI.CurrentTheme, NamedColorUtil, JBColor.namedColor, JBColor.lazycom.intellij.util.ui, com.intellij.ui
EmptyBorderJBUI.Borders.empty()com.intellij.util.ui
Hardcoded pixel sizesJBUI.scale(px)com.intellij.util.ui

Generic utilities:

NeedPreferred API
Concise border layoutBorderLayoutPanel, JBUI.Panels.simplePanel(...)
Platform panel helpersJBPanel.withBorder(...), .andTransparent(), .andOpaque()
Platform label behaviorJBLabel
Context helpContextHelpLabel
LinksHyperlinkLabel, LinkLabel
High-performance rich fragmentsSimpleColoredComponent
List renderersColoredListCellRenderer
Tree renderersColoredTreeCellRenderer
Renderer text stylesSimpleTextAttributes
Editable list toolbarToolbarDecorator
Platform listJBList
Platform treeTree

Multi-line and Rich Text

NeedComponent
Rich HTML with modern CSS, icons, shortcutsJBHtmlPane (com.intellij.ui.components.JBHtmlPane)
Simple multi-line label with HTMLJBLabel + XmlStringUtil.wrapInHtml()
Single-line transcript text (tool headers, file links, to-do rows)PlainLabel (ai.kilocode.client.ui.PlainLabel) with underline/strike; never <html> text, because Swing re-parses every HTML label each time an editor tab is detached or re-attached
Scrollable / wrapping HTML panelSwingHelper.createHtmlViewer()
High-performance colored text fragments in trees/lists/tablesSimpleColoredComponent
Plain-text newline splittingMultiLineLabel — legacy, do not use in new code
  • Build HTML programmatically with HtmlChunk/HtmlBuilder (com.intellij.openapi.util.text.HtmlChunk). Avoid raw HTML string concatenation — it risks injection and breaks localization.
  • For simple wrapping/escaping: XmlStringUtil.wrapInHtml(content), XmlStringUtil.wrapInHtmlLines(lines...), XmlStringUtil.escapeString(text).
  • Selectable/copyable label text: JBLabel.setCopyable(true). Use setAllowAutoWrapping(true) for auto-wrap.
  • When creating a JEditorPane manually, always use HTMLEditorKitBuilder instead of constructing HTMLEditorKit directly.
  • Single-line overflow/ellipsis: use SwingTextTrimmer. Do not manually truncate strings.
  • All user-visible strings go in *.properties files; HTML markup in values is acceptable.

Theme-Derived Colors

Do not hardcode runtime colors. IntelliJ UI colors must come from the current theme, component state, editor color scheme, or a centralized semantic named color key.

Prefer semantic helpers for common UI roles:

NeedPreferred API
Ordinary label textUIUtil.getLabelForeground()
Secondary/help textUIUtil.getContextHelpForeground()
Error label textUIUtil.getErrorForeground()
Warning label textJBUI.CurrentTheme.Label.warningForeground()
Inactive secondary textNamedColorUtil.getInactiveTextColor()
Bounds and standard border colorNamedColorUtil.getBoundsColor() / JBColor.border()
LinksJBUI.CurrentTheme.Link.Foreground.ENABLED / HOVERED / PRESSED
List renderer text/backgroundUIUtil.getListForeground(selected, focused) / UIUtil.getListBackground(selected, focused)
Tree renderer text/backgroundUIUtil.getTreeForeground(selected, focused) / UIUtil.getTreeBackground(selected, focused)
Popup backgroundJBUI.CurrentTheme.Popup.BACKGROUND
Validation errorsJBUI.CurrentTheme.Validator.errorBorderColor() / errorBackgroundColor()
Validation warningsJBUI.CurrentTheme.Validator.warningBorderColor() / warningBackgroundColor()

Use JBColor.lazy { ... } for colors that depend on runtime state or the active editor color scheme. Use JBColor.namedColor("Some.Semantic.Key", fallback) when defining or consuming a semantic color key. For HTML/CSS snippets, compute the color from a theme API and convert it with ColorUtil.toHtmlColor(...).

Avoid inline Color(...), numeric JBColor(...), Gray.xNN, JBColor.GRAY, and hex color literals in runtime UI code. The exception is a centralized semantic color definition with a named color key when no existing platform key exists.

Theme-Derived Fonts

Do not hardcode font sizes or font families.

  • Prefer component default fonts when no style change is needed.
  • Use JBFont.h1() through JBFont.h4() for headings.
  • Use .asBold(), .asItalic(), and .asPlain() for style changes on JBFont values.
  • Use JBFont.regular(), JBFont.medium(), and JBFont.small() for regular and secondary text.
  • Use RelativeFont when adjusting an existing component font relatively.
  • For errors, grayed text, shortcuts, and links in renderers, prefer SimpleTextAttributes.ERROR_ATTRIBUTES, GRAYED_ATTRIBUTES, SHORTCUT_ATTRIBUTES, and LINK_ATTRIBUTES.

Avoid Font("..."), raw font sizes, and deriveFont(14f) style calls.

Borders, Insets, and Spacing

  • Always create borders via JBUI.Borders.empty(top, left, bottom, right) and insets via JBUI.insets() — DPI-aware and auto-update on zoom.
  • Use JBUI.scale(int) for any pixel dimension to ensure proper HiDPI scaling.
  • Do not use EmptyBorder, raw Insets, or raw Dimension unless there is no platform alternative.
  • Theme-dependent borders, insets, colors, and corner arcs must be re-evaluated when the Look and Feel changes. Do not assign a theme-derived border once in a constructor for a long-lived component. Prefer overriding updateUI() or subscribing to LafManagerListener.TOPIC.
  • Use JBValue.UIInteger for themeable arc and spacing values. Call .get() during layout and size calculation; do not cache the resolved Int in a constructor or property initializer.

For common spacing lookups, prefer JBUI.CurrentTheme area-specific insets (e.g. JBUI.CurrentTheme.ActionsList.cellPadding(), JBUI.CurrentTheme.Toolbar.toolbarButtonInsets(), JBUI.CurrentTheme.ToolWindow.headerLabelLeftRightInsets()) over inventing numbers.

NeedPreferred source
Manual Swing empty paddingJBUI.Borders.empty(...)
Manual Swing insetsJBUI.insets(...), JBUI.emptyInsets(), JBUI.insetsTop(...)
Manual Swing dimensionsJBUI.size(...), JBDimension, JBUI.scale(...)
Side separatorsJBUI.Borders.customLineTop(...), customLineBottom(...)
Composed bordersJBUI.Borders.compound(...), JBUI.Borders.merge(...)
Simple BorderLayout panelsJBUI.Panels.simplePanel(...), BorderLayoutPanel
One-dimensional multi-component rows/columnsai.kilocode.client.ui.layout.Stack — see section below
Fluent platform panelsJBPanel.withBorder(...), .andTransparent(), .andOpaque(), .withBackground(...)
Single-component alignment wrapperai.kilocode.client.ui.layout.Align — see section below

Stack — One-Dimensional Multi-Component Layout

Use Stack (ai.kilocode.client.ui.layout.Stack) when multiple Swing components should be laid out as one vertical column or one horizontal row without visual chrome. It is a transparent, no-border, no-color JPanel(null) that lays out visible children in insertion order.

Behavior:

ModeLayout behaviorSize contribution
Stack.vertical(gap)Children are placed top-to-bottom; each child fills the available container width; each child keeps its bounded preferred heightWidth is max child width; height is summed child heights plus gaps
Stack.horizontal(gap)Children are placed left-to-right; each child fills the available container height; each child keeps its bounded preferred widthWidth is summed child widths plus gaps; height is max child height

"Bounded preferred" means the child's preferred size on the stack axis is coerced into the effective [min, max] range. On the cross axis, layout tracks the container size even if that ignores an individual child's preferred/minimum/maximum size.

Factories and fluent additions:

Stack.vertical()
    .next(header)
    .next(body)

Stack.horizontal(gap = UiStyle.Gap.md())
    .next(icon)
    .next(label)

Stack.vertical(gap = UiStyle.Gap.sm())
    .next(summary)
    .gap(UiStyle.Gap.lg())
    .next(details)

Stack.vertical()
    .next(header)
    .fill(UiStyle.Gap.pad())
    .next(body)

Stack.horizontal()
    .next(icon)
    .fill(UiStyle.Gap.sm())
    .next(label)

Rules:

  • Prefer Stack.vertical(...) or Stack.horizontal(...) over one-off JPanel + BoxLayout or simple single-line FlowLayout rows/columns.
  • Use the constructor gap for the normal spacing between adjacent visible children.
  • Use gap(size) for an explicit one-off gap only when the next added child is the next visible child. It is ignored when it is trailing or when a hidden component appears before the next visible child.
  • Use fill(size), Stack.verticalFiller(size), or Stack.horizontalFiller(size) for persistent leading, trailing, or interstitial whitespace. Do not use Box or gap(size) for persistent spacing.
  • Use Stack for simple retained Swing rows/columns where children should track the cross-axis size. Use Align for positioning one child inside available space.
  • Do not use Stack for padding, borders, colors, wrapping rows, flexible glue, or transcript components that need width-aware HTML reflow. Use JBUI.Borders.empty(...), UiStyle.Gap, purpose-built layouts, or SessionLayout for those concerns.
  • Stack and Align ask each child for its minimum, preferred and maximum size, so measuring a deep invalid tree grows with every nesting level. A tree that is invalidated and measured over and over, such as a list renderer stamp, should run each layout or size read inside LayoutPass.measure { ... }, which answers each size once per container for that pass. Do not change the measured content inside the pass.

Align — Single-Component Alignment Wrapper

Use Align (ai.kilocode.client.ui.layout.Align) when a single Swing component must be positioned inside available space without adding visual chrome. It is a transparent, no-border, no-color JPanel(null) that lays out its one child according to independent horizontal (HAlign) and vertical (VAlign) modes. CenterShrinkPanel has been removed; use child.align(HAlign.CENTER, VAlign.CENTER) as a direct replacement.

Alignment modes:

ModeAxisLayout behaviorWrapper size contribution
HAlign.TRACK / VAlign.TRACKeitherChild always fills all available space; ignores child min/preferred/maxZero (wrapper reports insets only on that axis)
HAlign.FIT / VAlign.FITeitherChild fills available space clamped to child's effective [min, max] rangeChild min/preferred/max respected
HAlign.LEFT / VAlign.TOPH / VChild placed at left/top edge at bounded preferred size; shrinks to available when necessaryChild min/preferred/max respected
HAlign.CENTER / VAlign.CENTERH / VChild centered at bounded preferred size; shrinks to available when necessaryChild min/preferred/max respected
HAlign.RIGHT / VAlign.BOTTOMH / VChild placed at right/bottom edge at bounded preferred size; shrinks to available when necessaryChild min/preferred/max respected

"Bounded preferred" means the child's preferred size coerced into the effective [min, max] range. If available space is smaller than the effective minimum, the layout shrinks the child to available space to avoid overflow.

Factory extension on Component:

child.align(HAlign.LEFT, VAlign.TOP)      // left-aligned, top-pinned
child.align(HAlign.CENTER, VAlign.CENTER) // centered (replaces CenterShrinkPanel)
child.align(HAlign.TRACK, VAlign.CENTER)  // fill width, center vertically
child.align(HAlign.TRACK, VAlign.TRACK)   // fill all available space

Rules:

  • Prefer child.align(h, v) over creating one-off JPanel(FlowLayout(...)) or BorderLayoutPanel wrappers just to control alignment.
  • Use TRACK when the child must occupy all available space on an axis and must not reserve any space in the parent's size negotiation on that axis. Use FIT when you want to fill available space but still respect child min/max constraints.
  • All non-TRACK modes include the child's min, preferred, and max sizes in the wrapper's own min/preferred/max size. This means parent layout managers see the child constraints through the wrapper.
  • Do not use Align for spacing, padding, borders, colors, or multi-child layout — use JBUI.Borders.empty(...), UiStyle.Gap, or an appropriate layout manager for those concerns.

IntelliJ UI Surfaces

Tool Windows

  • Register declaratively in module XML via com.intellij.toolWindow extension point (already done in kilo.jetbrains.frontend.xml).
  • Implement ToolWindowFactory.createToolWindowContent() — called lazily on first click.
  • Use SimpleToolWindowPanel(vertical = true) as a convenient base — supports toolbar + content layout.
  • Add tabs via ToolWindow.contentManager: create content with ContentFactory.getInstance().createContent(component, title, isLockable), then contentManager.addContent().
  • For conditional display, implement ToolWindowFactory.isApplicableAsync(project).
  • Always use ToolWindowManager.invokeLater() instead of Application.invokeLater() for tool-window-related EDT tasks.

Dialogs

  • Extend DialogWrapper. Call init() from the constructor. Override createCenterPanel() to return UI content.
  • Override getPreferredFocusedComponent() for initial focus, getDimensionServiceKey() for size persistence.
  • Show with showAndGet() (modal, returns boolean) or show() (then use getExitCode()).
  • Input validation: call initValidation() in constructor, override doValidate() — return null if valid or ValidationInfo(message, component) if not.
  • For hand-built Swing forms, use ComponentValidator with withValidator, withFocusValidator, and andRegisterOnDocumentListener instead of custom tooltip/error border logic.

Notifications

  • Declare in module XML: <notificationGroup id="Kilo Code" displayType="BALLOON"/>.
  • Show: Notification("Kilo Code", "message", NotificationType.INFORMATION).notify(project).
  • Add actions: .addAction(NotificationAction.createSimpleExpiring("Label") { ... }).
  • Sticky (user must dismiss): displayType="STICKY_BALLOON" + .setSuggestionType(true).
  • Tool-window-bound: displayType="TOOL_WINDOW" toolWindowId="Kilo Code".
  • Prefer non-modal notifications over Messages.show*() dialogs.

Popups

  • Use JBPopupFactory.getInstance() for lightweight floating UI (no chrome, auto-dismiss on focus loss).
  • createComponentPopupBuilder(component, focusable) for arbitrary Swing content; createPopupChooserBuilder(list) for item selection; createActionGroupPopup() for action menus.
  • Show with showInBestPositionFor(editor), showUnderneathOf(component), or showInCenterOf(component).

Lists and Trees

  • JBList not JList — adds empty text, busy indicator, tooltip truncation.
  • Tree not JTree — adds wide selection painting, auto-scroll on DnD.
  • Custom renderers: ColoredListCellRenderer / ColoredTreeCellRenderer — append() for styled text, setIcon() for icons.
  • Speed search: ListSpeedSearch(list) / TreeSpeedSearch(tree).
  • Editable list with add/remove/reorder toolbar: ToolbarDecorator.createDecorator(list).setAddAction { }.setRemoveAction { }.createPanel().
  • Use ListUtil.installAutoSelectOnMouseMove(list) for popup-like hover-selection behavior.
  • Use ScrollingUtil.installActions(list) for keyboard navigation.
  • Use CollectionListModel<T> for simple item storage; FilteringListModel<T> for filtering with speed search.

Icons and SVG Assets

The icon-jetbrains skill (.kilo/skills/icon-jetbrains/SKILL.md) is the single source of truth for SVG icon authoring: canvas sizes, palette colors, dark variants, composition rules, placement, and validation. Always load that skill when creating, modifying, or reviewing icon assets. Do not duplicate its guidance here.

This section covers only the Kotlin/runtime integration side:

  • For compact icon-only actions, use ai.kilocode.client.ui.HoverIcon so the control gets the standard 24×24 hover treatment. Do not create JButton(icon) or wrap a bare icon in a button just to make it clickable.
  • Reuse platform icons: browse at https://intellij-icons.jetbrains.design. Access via AllIcons.* constants.
  • Custom icons: SVG files in resources/icons/. Load via IconLoader.getIcon("/icons/foo.svg", MyClass::class.java).
  • Organize in an icons package or a *Icons object with @JvmField on each constant.
  • Sizing, dark variants, and filename patterns: see the icon-jetbrains skill for the authoritative Icon roles table, canvas sizes, filename patterns, and dark variant conventions. Do not duplicate sizing or palette values here.

IntelliJ does not theme SVG icons with currentColor, CSS classes, CSS variables, <style> blocks, or inherited styles. SVGLoader patches icon colors by matching literal hex values in fill and stroke attributes against the active theme palette. Use hardcoded palette hex values in SVG assets and provide dark variants. This exception applies to icon asset files only; runtime Swing UI code must still derive colors from theme APIs.

Themes can override palette colors through icons.ColorPalette in the theme JSON.

Official references:

Before Returning UI Code

Review generated UI code and remove:

  • Explicit default property assignments such as unnecessary isOpaque = false
  • Unnecessary preferredSize, minimumSize, or maximumSize
  • Raw Dimension, Insets, EmptyBorder, or Color
  • Inline runtime colors: Color(...), numeric JBColor(...), Gray.xNN, JBColor.GRAY, or hex color literals
  • Raw CSS color literals (use ColorUtil.toHtmlColor(themeColor) when the source is theme-derived)
  • Hardcoded font families, raw font sizes, or numeric-size deriveFont(...) calls
  • Raw Swing components where IntelliJ replacements exist
  • Hardcoded spacing that should be a JBUI value or UiStyle.Gap constant
  • Cached JBValue.UIInteger(...).get() values in custom layouts — call .get() during layout/sizing instead
  • Theme-derived borders, insets, colors, or arcs assigned once in constructors without updateUI() override
  • SVG assets using currentColor, CSS variables, CSS classes, <style> blocks, or inherited styling
  • Extra helpers that do not make the UI clearer or more reusable
  • Any Kotlin UI DSL (com.intellij.ui.dsl.builder) introduced by accident

Settings UI

Settings UI has reusable primitives in frontend/src/main/kotlin/ai/kilocode/client/settings/base/. Check these before adding new settings components or custom Swing assemblies.

Base Pages And Messaging

  • Use BaseSettingsUi for app-backed draft settings that need app-state collection, workspace loading/refreshing, draft/baseline tracking, save progress, save failure handling, and login/banner integration.
  • Use SettingsPanel and SettingsOverlayPanel as the settings surface so progress and errors go through showProgress, updateProgress, showError, and clearProgress.
  • Use SettingsTop for settings banners and login prompts rather than ad hoc labels, notifications, or dialog prompts embedded in the form.
  • Use SettingsDraftState and SettingsDraftPage for modified/reset/apply behavior instead of maintaining unrelated local dirty-state mechanisms.
  • Use the base loading and refresh flow (BaseSettingsUi or SettingsListPanel.reload / mutateAndReload) so busy state, refresh selection, and app readiness are handled consistently.
  • Communicate load, refresh, validation, and save errors through the common settings messaging mechanisms: overlay showError, SettingsMessageException for user-facing list mutation errors, failedText() / saveError in BaseSettingsUi, and SettingsTop banners for persistent page-level problems.

Rows And Forms

  • Use SettingsRow, SettingsStackedRow, and SettingsRows for reusable setting rows, stacked text/editing rows, keyed dynamic rows, and setting sections.
  • Do not create a custom row panel for each setting unless the common row classes cannot represent the behavior.
  • Keep settings UI on the EDT and continue using existing platform Swing components, Stack, Align, UiStyle, and localized KiloBundle strings according to the UI guidance above.

Lists And Add/Remove Collections

  • For add/remove/edit collections, use the shared list infrastructure: SettingsListPanel, SettingsListView, SettingsListItem, SettingsListCell, SettingsListSelection, and SettingsToolbarAction where applicable.
  • When a setting is a list of values that can be added or removed inline, represent it with common list/editor primitives, toolbar actions, and in-place cells/buttons as needed.
  • Do not build a bespoke set of Swing components for each add/remove list situation.
  • Prefer list action cells (SettingsListCell) for row-local actions like edit/delete and toolbar actions for global add/import/refresh actions.

Settings Test Coverage Pattern

  • Each settings page that writes state needs a fake-RPC frontend test that proves UI interactions call the expected client service/RPC method.
  • Each backend-backed settings write path needs a *RpcApiImpl or manager test against MockCliServer that asserts the exact CLI HTTP body and that a subsequent reload observes the persisted value.
  • Navigation-only settings pages should still have BasePlatformTestCase coverage for rendered child links, stable child IDs, and inert isModified/apply behavior.

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

chart

免费

Creates charts from numerical data using the chart tool and Chart.js v4. Supports bars, lines, pies, scatter plots, and other formats to show comparisons, trends, proportions, and relationships, with options for dataset colors and mixed charts.

中文简介正在准备中。当前显示英语简介。

  • Comparing values across categories with a bar chart
  • Showing monthly changes with a line chart
  • Displaying proportions with a pie or doughnut chart
Kilo-Org/kilocode2.8万2026年10月18日 更新

effect

免费

Develop TypeScript services and workflows with Effect v4 by checking its source and existing project examples. Guides data schemas, typed errors, explicit dependencies, and tests that follow the project's established patterns.

中文简介正在准备中。当前显示英语简介。

  • Implementing services with Effect v4
  • Defining data schemas and typed errors
  • Organizing dependencies and HTTP handlers
Kilo-Org/kilocode2.8万2026年10月18日 更新

gh-issues

免费

Create and manage GitHub issues for the Kilo VS Code extension or JetBrains plugin using gh, GitHub's command-line tool. Guides template selection, clear titles, required project board assignment, and authentication permissions.

中文简介正在准备中。当前显示英语简介。

  • Reporting a bug in the VS Code extension
  • Requesting a feature for the JetBrains plugin
  • Filing usage or design questions
Kilo-Org/kilocode2.8万2026年10月18日 更新

Create and review SVG icons for IntelliJ New UI. Choose sizes by interface role, prepare matching light and dark versions, refine shapes and strokes, and place the assets in the plugin’s resource folders.

中文简介正在准备中。当前显示英语简介。

  • Creating icons for actions and tool windows
  • Preparing matching light and dark SVG versions
  • Adapting existing icons to a 16×16 canvas
Kilo-Org/kilocode2.8万2026年10月18日 更新

Create and review icons for Kilo’s VS Code extension and webviews, the extension’s embedded interface panels. Choose existing icons or suitable SVG assets, register them correctly, and check theme appearance and accessible button names.

中文简介正在准备中。当前显示英语简介。

  • Choosing icons for commands, menus, and view containers
  • Adding icons to webview registries
  • Rescaling SVGs while preserving visual weight
Kilo-Org/kilocode2.8万2026年10月18日 更新

Guides development across the Kilo JetBrains plugin’s shared, frontend, and backend modules. Explains remote calls between modules, UI thread rules, dependency packaging, and testing practices, including serialization failures that require checks in a running IDE.

中文简介正在准备中。当前显示英语简介。

  • Placing new code in the appropriate plugin module
  • Defining frontend and backend communication
  • Reviewing UI threading and coroutine usage
Kilo-Org/kilocode2.8万2026年10月18日 更新

查看 Kilo-Org 的全部技能

报告此技能的问题