chart
無料Use when the user asks to visualize data with charts, graphs, or plots using the `chart` tool (bar, line, scatter, pie, time series, etc.).
日本語の概要は準備中です。原文の説明を表示しています。
Use when adding or moving code across shared/frontend/backend modules in packages/kilo-jetbrains/ — split-mode RPC contracts, serialization classloader pitfall, threading/EDT annotations, services and coroutine scopes, EDT test rules, dependency bundling, and the CLI server protocol.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Detailed reference for packages/kilo-jetbrains/ module boundaries, RPC, threading, and dependency rules. See packages/kilo-jetbrains/AGENTS.md for the hard restrictions summary; this skill covers the how and why.
When looking for IntelliJ Platform API usage, implementation examples, extension points, services, actions, inspections, PSI/VFS/editor behavior, or plugin patterns, prefer real IntelliJ source code over Gradle caches, downloaded jars, generated parser artifacts, or decompiled classes.
Do not use IntelliJ Platform APIs marked as internal in the IntelliJ source repository. Find a public API alternative or keep the integration behind supported extension points. Experimental APIs are acceptable when needed, but warn the user that the integration relies on an experimental IntelliJ API.
Use this priority order:
$INTELLIJ_REPO is set and points to a readable IntelliJ Community checkout.
platform/, plugins/, java/, xml/, json/, jvm/, and related modules.$INTELLIJ_REPO is unset, empty, unreadable, or does not appear to contain an IntelliJ source checkout, tell the user to set it up.
Set INTELLIJ_REPO to the path of a local intellij-community checkout, for example: export INTELLIJ_REPO=/path/to/intellij-communityAvoid starting searches in ~/.gradle/caches, .gradle/, downloaded dependency jars, generated parser artifacts, or decompiled library sources.
The JetBrains reference template mirrors our overall structure well: root project assembles the final plugin, shared holds contracts, frontend holds UI, and backend holds project-local logic. Copy its split-mode wiring and RPC layout, but do not copy its Compose UI approach.
In monolithic IDE mode (non-remote), all three modules load in one process — split plugins work fine without remote dev.
kilo.jetbrains.backend.xml under <extensions defaultExtensionNs="com.intellij"><applicationService> (or <projectService>).shared/. Data sent over RPC must use kotlinx.serialization. In monolithic mode RPC is just an in-process suspend call.shared with @Rpc, RemoteApi<Unit>, and suspend methods only.@Serializable. Keep shared lightweight and avoid pulling frontend-only or backend-only APIs into it.backend and register them via com.intellij.platform.rpc.backend.remoteApiProvider when RPC is introduced.shared and frontend use the RPC/serialization plugins, and the backend adds the required backend RPC platform modules.frontend coroutines only. Never call RPC on the EDT; do not paper over this with blocking wrappers.durable {} so they survive reconnects and backend restarts.Plugin DevKit | Code | Frontend and Backend API Usage when adding or moving split-mode code.IntelliJ Platform provides method-level annotations to declare threading and coroutine context requirements. All annotations live in com.intellij.util.concurrency.annotations. Source in $INTELLIJ_REPO: platform/core-api/src/com/intellij/util/concurrency/annotations/.
| Annotation | Requirement |
|---|---|
@RequiresEdt | Must run on EDT. Injects a runtime assertion by default. |
@RequiresBackgroundThread | Must run off EDT. Injects a runtime assertion by default. |
@RequiresReadLock | Must hold read or write lock. |
@RequiresWriteLock | Must hold write lock. |
@RequiresReadLockAbsence | Must not hold any read or write lock. |
@RequiresBlockingContext | Must not be called from a suspend context. Source-retained only, no runtime assertion. |
All five Requires* thread/lock annotations accept generateAssertion = false to document intent without injecting a runtime check.
For custom dispatchers/context return types that are IO-safe or non-blocking, use @BlockingExecutor / @NonBlockingExecutor from org.jetbrains.annotations.
For blocking I/O in coroutines, move the dispatcher switch inside the callee using withContext(Dispatchers.IO). There is no annotation that requires Dispatchers.IO; the BlockingMethodInNonBlockingContextInspection static analysis covers this.
Decision guide:
| Situation | Solution |
|---|---|
| Method must run on EDT | @RequiresEdt |
| Method must run off EDT | @RequiresBackgroundThread |
| Method requires read or write access | @RequiresReadLock |
| Method requires write access | @RequiresWriteLock |
| Method must not hold any lock | @RequiresReadLockAbsence |
| Blocking function, suspend alternative exists | @RequiresBlockingContext |
| Blocking I/O work in a coroutine | withContext(Dispatchers.IO) inside the callee |
| Custom IO-safe dispatcher | @BlockingExecutor on the return type or class |
| Custom non-blocking dispatcher | @NonBlockingExecutor on the return type or class |
@RequiresEdt and ThreadingAssertions.SessionModel with @RequiresEdt.revalidate()/repaint() from a background thread or coroutine. Use ApplicationManager.getApplication().invokeLater { } or withContext(Dispatchers.Main) to switch to the EDT.ToolWindowManager.invokeLater() instead of Application.invokeLater().@Service (or @Service(Service.Level.PROJECT)) instead of registering in XML when the service won't be overridden or exposed as API. Light services must be final in Java (no open in Kotlin), cannot use constructor injection of other services, and don't support os/client/overrides attributes.service<T>() at the call site.CoroutineScope: the recommended way to launch coroutines. Each service gets its own scope (child of an intersection scope). The scope is cancelled on app/project shutdown or plugin unload. Supported signatures: MyService(CoroutineScope) for app services, MyService(Project, CoroutineScope) for project services.Dispatchers.Default and CoroutineName(serviceClass). Switch to Dispatchers.IO for blocking I/O.runBlockingCancellable exists but is not recommended — use service scopes instead. For actions, use currentThreadCoroutineScope() which lets the Action System cancel the coroutine.BasePlatformTestCase to get a real IntelliJ Application and EDT in tests. The session package already uses SessionControllerTestBase which wraps this.internal accessors, helper methods, or synthetic seams just so tests can inspect private implementation details. If a test needs this, either assert observable UI/action behavior or refactor the production API so the new seam has real product value.delay, sleeps, or repeated polling to guess when asynchronous work is done unless the behavior under test is timing-specific.implementation in the relevant build.gradle.kts so they ship inside the plugin JAR and load from the plugin's own classloader.kotlinx.coroutines is the one mandatory exception — it is provided by the platform and must not be bundled (the IntelliJ Platform Gradle plugin enforces this automatically).gradle/libs.versions.toml and reference them via the version catalog (libs.*) in build.gradle.kts. Never hardcode version strings in build.gradle.kts.frontend or backendshared/ declares no kotlinx-serialization dependency, so its @Serializable DTOs bind to the platform's copy. frontend/ and backend/ each bundle their own kotlinx-serialization-json. Touching a shared DTO's generated serializer from either module therefore resolves KSerializer from two different classloaders and fails at runtime with:
java.lang.LinkageError: loader constraint violation: when resolving method
'kotlinx.serialization.KSerializer ai.kilocode.rpc.dto.SomeDto$Companion.serializer()'
In frontend/ and backend/, do not call Json.decodeFromString<SharedDto>(...), Json.encodeToString(dto), decodeFromJsonElement<SharedDto>(...), or SharedDto.serializer(). Module-local @Serializable types (for example WorktreeNamesFile) and built-ins like List<String> are fine, because the class and the serialization runtime come from the same loader — this is the reason two different patterns are used in KiloBackendMarketplaceManager:
MarketplaceResultDto), decode into a private module-local wire type (e.g. WireResult) with Json.decodeFromString<WireResult>(...), then map its fields onto the shared DTO by hand. Prefer this over raw JsonObject field extraction — it is real deserialization instead of hand-parsing, and any wire/DTO field mismatch fails at decode time instead of silently reading null.MarketplaceItemDto's installedProject/methods/relevant) — there is no serializer to safely call regardless of classloaders, so parse into a JsonObject and construct the DTO by hand; see toDecoded() in KiloBackendMarketplaceManager and KiloCliDataParser.Tests cannot catch this. Gradle test runs put shared, the module under test, and kotlinx-serialization on one flat classpath, so the split only exists in a real IDE. Verify RPC paths that return shared DTOs in a sandbox run (runIdeSplitMode), not only under ./gradlew test.
kilo serve --port 0 (OS assigns random port) and reads stdout for listening on http://...:(\d+) to discover the port.KILO_SERVER_PASSWORD env var for Basic Auth.KILO_CLIENT=jetbrains, KILO_PLATFORM=jetbrains, KILO_APP_NAME=kilo-code, KILO_ENABLE_QUESTION_TOOL=true, KILO_DISABLE_CLAUDE_CODE=true, KILOCODE_FEATURE=jetbrains-plugin.KILO_CONFIG_CONTENT to make edit and bash permissions ask by default for JetBrains-launched CLI processes.packages/kilo-vscode/src/services/cli-backend/server-manager.ts).まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Use when the user asks to visualize data with charts, graphs, or plots using the `chart` tool (bar, line, scatter, pie, time series, etc.).
日本語の概要は準備中です。原文の説明を表示しています。
Work with Effect v4 / effect-smol TypeScript code in this repo
日本語の概要は準備中です。原文の説明を表示しています。
Use when creating, triaging, or commenting on GitHub issues for the Kilo VS Code extension or JetBrains plugin via `gh`. Covers issue templates, project board assignment, title conventions, and required `gh` scopes.
日本語の概要は準備中です。原文の説明を表示しています。
Create or review IntelliJ New UI SVG icons, theme variants, sizes, and palette.
日本語の概要は準備中です。原文の説明を表示しています。
Create or review icons for Kilo's VS Code extension, webviews, and shared icon registry.
日本語の概要は準備中です。原文の説明を表示しています。
Use when pinning or unpinning the CLI version the Kilo JetBrains plugin uses, or fresh-regenerating the local repo CLI. Cleans all leftover CLI binaries and build artifacts in the current worktree so every operation starts from a fresh, artifact-free state.
日本語の概要は準備中です。原文の説明を表示しています。