Koog is a Kotlin and Java framework for building AI agents that use tools, interact with people, and run multi-step workflows. JVM and Kotlin developers use it to deploy agents across platforms such as JVM, Android, iOS, JavaScript, and WebAssembly, with features for persistence, fault recovery, model switching, and monitoring. The catalogue entries provide agents, skills, and instructions for building with Koog.
Borrowing it
Nothing to install: this file belongs to JetBrains/koog. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/JetBrains/koog/develop/.claude/skills/split-jvm-nonjvm/SKILL.mdgit clone --depth 1 https://github.com/JetBrains/koogWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/jetbrains/koog/split-jvm-nonjvm)<a href="https://agentmods.dev/skills/jetbrains/koog/split-jvm-nonjvm"><img src="https://agentmods.dev/badge/skills/jetbrains/koog/split-jvm-nonjvm.svg" alt="Measured on agentmods" height="20"></a>- NVIDIA SkillSpector pass
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00068 | $0.01830 |
| Opus 5 | $0.00034 | $0.00915 |
| Sonnet 5 | $0.00014 | $0.00366 |
| Haiku 4.5 | $0.00007 | $0.00183 |
Grade A, and why
split-jvm-nonjvm scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 8d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 234 lines — stays where its author put it; the contents beside it link to each section on GitHub.
The following example shows how to split a class into JVM and non-JVM parts. When using this skill, avoid unnecessarily looking at existing implementations of the split in the project, just follow this instruction. You can, however, check existing implementations for reference if you have a complex case or otherwise stuck.
Here's a sample class in a commonMain source set
package com.example
/**
* A sample class with an external dependency, some logic and public methods
* @param name Some public property
* @param myRepo Some external dependency, private property
*/
public class MyClass(
public val name: String,
private val myRepo: MyRepo,
) {
/**
* Public API method
*/
public fun doSomething(): String {
return fetchData()
}
/**
* Private implementation logic
*/
private fun fetchData(): String {
return myRepo.getData()
}
/*
* Internal method
*/
internal fun doInternal(): String {
return "Internal"
}
}
In the same package as MyClass in commonMain, create the following files. The original MyClass.kt file will be overwritten with the expect class (see step three).
First, the API interface describing the contract. It should contain only public symbols from the MyClass.
Take KDocs from the respective symbols in MyClass and add them to the interface.
package com.example
/**
* API for [MyClass]
*/
public interface MyClassAPI {
/**
* Some public property
*/
public val name: String
/**
* Public API method
*/
public fun doSomething(): String
}
Second, MyClassImpl.kt — implementation of the API interface providing the implementation logic. The filename matches the class name.
internal class MyClassImpl(
override val name: String,
private val myRepo: MyRepo,
) : MyClassAPI {
override fun doSomething(): String {
return fetchData()
}
private fun fetchData(): String {
return myRepo.getData()
}
internal fun doInternal(): String {
return "Internal"
}
}
Third, the original class becomes expect class
MyClass should extend MyClassAPI and override all public symbols from MyClassAPI, without method bodies and property values, since expect classes can't have any.
If MyClass had any internal symbols, these should also be listed in the expect class along with their KDocs.
If MyClass had a KDoc, add it on top of the expect class without parameters/properties description.
If MyClass original KDoc described certain parameters/properties that it accepted in its constructor, add these to KDoc of the expect class secondary constructor.
This constructor KDoc can't have @property tag for parameters, use only @param for all parameters, even if the original was @property.
package com.example
/**
* A sample class with an external dependency, some logic and public methods
*/
public expect class MyClass internal constructor(
delegate: MyClassImpl,
) : MyClassAPI {
/**
* Constructs a new instance of [MyClass]
*
* @param name Some public property
* @param myRepo Some external dependency,
*/
public constructor(
name: String,
myRepo: MyRepo,
)
internal val delegate: MyClassImpl
override val name: String
override fun doSomething(): String
/**
* Internal method
*/
internal fun doInternal(): String
}
Fourth, ensure that jvmCommonMain and nonJvmCommonMain source sets have a package directory for MyClass, i.e., com.example. If not, create missing package directories.
The source sets themselves are already declared in the Gradle convention plugin — you do NOT need to add them to the module's build.gradle.kts unless you need to add dependencies specifically for these source sets.
Then, create MyClass.kt files in jvmCommonMain and nonJvmCommonMain source sets.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 8d ago First seen · 234 lines · 68 tokens per session scan A 2fc3b537f36a
split-jvm-nonjvm is a skill published in the GitHub repository JetBrains/koog (4,559 stars, last pushed 6d ago), licensed Apache-2.0. It adds 68 tokens to every session and 1,830 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
temporal-python-testing
Test Temporal workflows with pytest, time-skipping, and mocking strategies. Covers unit testing, integration testing, replay testing, and local development setup. Use when implementing Temporal workflow tests or debugging test failures.
fastapi-templates
Create production-ready FastAPI projects with async patterns, dependency injection, and comprehensive error handling. Use when building new FastAPI applications or setting up backend API projects.
android-development
Android development with Kotlin, Jetpack Compose, and modern Android architecture. Use when building Android apps, implementing Material Design, or following Android best practices.
ios-development
Comprehensive guide for building native Apple platform applications.
software-android-native
Guides native Android development with Kotlin, Jetpack Compose, and Views interop. Use when building, rewriting, or reviewing modern Android apps after establishing runtime truth.
software-ios-native
Guides native iOS with Swift, SwiftUI, UIKit interop, concurrency, and persistence. Use when building or reviewing iPhone/iPad apps after establishing runtime truth.