PluginBench
Skill
Official
Pass
Audit score 90

kotlin-tooling-java-to-kotlin

kotlin/kotlin-agent-skills

Convert Java source files to idiomatic Kotlin with framework-aware guidance and 4-step methodology.

What is kotlin-tooling-java-to-kotlin?

Converts Java source files to Kotlin using a disciplined 4-step conversion process with invariant checking. Detects frameworks (Spring, Lombok, Hibernate, Jackson, Micronaut, Quarkus, Dagger/Hilt, RxJava, JUnit, Guice, Retrofit, Mockito) and applies framework-specific guidance to preserve API semantics and idiomatic patterns.

  • Scans Java imports to detect frameworks and load matching conversion guides
  • Applies 4-step conversion methodology: faithful translation, nullability/mutability audit, collection type conversion, idiomatic transformations
  • Checks 5 invariants after each step to ensure correctness
  • Preserves git blame history via two-phase rename-then-replace workflow
  • Handles batch conversion with dependency-order sorting for multiple files
  • Validates converted code against compilation, tests, and annotation site targets

How to install kotlin-tooling-java-to-kotlin

npx skills add https://github.com/kotlin/kotlin-agent-skills --skill kotlin-tooling-java-to-kotlin
Claude Code
Cursor
Windsurf
Cline

How to use kotlin-tooling-java-to-kotlin

  1. 1.Specify the Java file(s) to convert
  2. 2.The skill scans imports and loads matching framework guides (Spring, Lombok, Hibernate, Jackson, etc.)
  3. 3.Conversion applies 4-step methodology: faithful translation → nullability audit → collection conversion → idiomatic transformations
  4. 4.Converted .kt file is written to the same directory as the original .java file
  5. 5.Git history is preserved via rename-then-replace workflow (or direct file replacement if not using Git)
  6. 6.Verification runs: compilation check, test execution, annotation site target validation, behavioral change confirmation

Use cases

Good for
  • Migrate a single Java class to Kotlin while preserving Spring annotations and bean behavior
  • Convert an entire package of Java files to Kotlin in dependency order to avoid cross-reference issues
  • Refactor a Lombok-based Java codebase to Kotlin, handling annotation transformations
  • Convert JUnit test files to Kotlin while maintaining test structure and mocking setup
  • Migrate a Retrofit/OkHttp client from Java to Kotlin with proper API preservation
Who it's for
  • Java developers modernizing codebases to Kotlin
  • Teams migrating Spring Boot or Micronaut applications to Kotlin
  • Developers maintaining projects with mixed Java/Kotlin source
  • Build engineers planning large-scale Java-to-Kotlin migrations

kotlin-tooling-java-to-kotlin FAQ

What frameworks are supported?

Spring, Lombok, Hibernate, Jackson, Micronaut, Quarkus, Dagger/Hilt, RxJava, JUnit, Guice, Retrofit, and Mockito. The skill detects frameworks from import statements and loads matching conversion guides.

How does it handle batch conversions?

Files are sorted by dependency order (leaf dependencies first), then converted one at a time through the full workflow. Cross-references between converted files are updated automatically.

Does it preserve git history?

Yes. It uses a two-phase approach: first rename the file (creating rename tracking), then replace content (tracked as modification). If not using Git, the .java file is deleted after conversion.

What happens if conversion fails a verification step?

The skill reverts to the previous step and redoes the conversion. The 5 invariants are checked after each of the 4 steps to catch issues early.

Can it handle Kotlin keyword conflicts?

Yes. The skill references KNOWN-ISSUES.md which covers Kotlin keyword conflicts (when, in, is, object), SAM conversion ambiguity, platform types, and other Java-to-Kotlin pitfalls.

Full instructions (SKILL.md)

Source of truth, from kotlin/kotlin-agent-skills.


name: kotlin-tooling-java-to-kotlin description: > Use when converting Java source files to idiomatic Kotlin, when user mentions "java to kotlin", "j2k", "convert java", "migrate java to kotlin", or when working with .java files that need to become .kt files. Handles framework-aware conversion for Spring, Lombok, Hibernate, Jackson, Micronaut, Quarkus, Dagger/Hilt, RxJava, JUnit, Guice, Retrofit, and Mockito. license: Apache-2.0 metadata: author: JetBrains version: "1.0.0"

Java to Kotlin Conversion

Convert Java source files to idiomatic Kotlin using a disciplined 4-step conversion methodology with 5 invariants checked at each step. Supports framework-aware conversion that handles annotation site targets, library idioms, and API preservation.

Workflow

digraph j2k_workflow {
  rankdir=TB;
  "User specifies files" -> "Step 0: Scan & Detect";
  "Step 0: Scan & Detect" -> "Load framework guides";
  "Load framework guides" -> "Step 1: Convert";
  "Step 1: Convert" -> "Step 2: Write .kt";
  "Step 2: Write .kt" -> "Step 3: Git rename";
  "Step 3: Git rename" -> "Step 4: Verify";
  "Step 4: Verify" -> "Next file?" [label="pass"];
  "Step 4: Verify" -> "Fix issues" [label="fail"];
  "Fix issues" -> "Step 1: Convert";
  "Next file?" -> "Step 0: Scan & Detect" [label="batch: yes"];
  "Next file?" -> "Done" [label="no more files"];
}

Step 0: Scan & Detect Frameworks

Before converting, scan the Java file's import statements to detect which frameworks are in use. Load ONLY the matching framework reference files to keep context focused.

Framework Detection Table

Import prefixFramework guide
org.springframework.*SPRING.md
lombok.*LOMBOK.md
javax.persistence.*, jakarta.persistence.*, org.hibernate.*HIBERNATE.md
com.fasterxml.jackson.*JACKSON.md
io.micronaut.*MICRONAUT.md
io.quarkus.*, javax.enterprise.*, jakarta.enterprise.*QUARKUS.md
dagger.*, dagger.hilt.*DAGGER-HILT.md
io.reactivex.*, rx.*RXJAVA.md
org.junit.*, org.testng.*JUNIT.md
com.google.inject.*GUICE.md
retrofit2.*, okhttp3.*RETROFIT.md
org.mockito.*MOCKITO.md

If javax.inject.* is detected, check for Dagger/Hilt vs Guice by looking for other imports from those frameworks. If ambiguous, load both guides.

Step 1: Convert

Apply the conversion methodology from CONVERSION-METHODOLOGY.md.

This is a 4-step chain-of-thought process:

  1. Faithful 1:1 translation — exact semantics preserved
  2. Nullability & mutability audit — val/var, nullable types
  3. Collection type conversion — Java mutable → Kotlin types
  4. Idiomatic transformations — properties, string templates, lambdas

Five invariants are checked after each step. If any invariant is violated, revert to the previous step and redo.

Apply any loaded framework-specific guidance during step 4 (idiomatic transformations).

Step 2: Write Output

Write the converted Kotlin code to a .kt file with the same name as the original Java file, in the same directory.

Step 3: Preserve Git History

To preserve git blame history, use a two-phase approach:

# Phase 1: Rename (creates rename tracking)
git mv src/main/java/com/example/Foo.java src/main/kotlin/com/example/Foo.kt
git commit -m "Rename Foo.java to Foo.kt"

# Phase 2: Replace content (tracked as modification, not new file)
# Write the converted Kotlin content to Foo.kt
git commit -m "Convert Foo from Java to Kotlin"

If the project keeps Java and Kotlin in the same source root (e.g., src/main/java/), rename in place:

git mv src/main/java/com/example/Foo.java src/main/java/com/example/Foo.kt

If the project does not use Git, simply write the .kt file and delete the .java file.

Step 4: Verify

After conversion, verify using checklist.md:

  • Attempt to compile the converted file
  • Run existing tests
  • Check annotation site targets
  • Confirm no behavioral changes

Batch Conversion

When converting multiple files (a directory or package):

  1. List all .java files in the target scope
  2. Sort by dependency order — convert leaf dependencies first (files that don't import other files in the conversion set), then work up to files that depend on them
  3. Convert one file at a time — apply the full workflow (steps 0-4) for each
  4. Track progress — report which files are done, which remain
  5. Handle cross-references — after converting a file, update imports in other Java files if needed (e.g., if a class moved packages)

For large batches, consider converting in packages (bottom-up from leaf packages).

Common Pitfalls

See KNOWN-ISSUES.md for:

  • Kotlin keyword conflicts (when, in, is, object)
  • SAM conversion ambiguity
  • Platform types from Java interop
  • @JvmStatic / @JvmField / @JvmOverloads usage
  • Checked exceptions and @Throws
  • Wildcard generics → Kotlin variance