npx skills add ...
npx skills add quarkusio/skills --skill migrate-spring-to-quarkus
Migrates Spring Boot applications to Quarkus using a modular, gate-driven approach.
npx skills add quarkusio/skills --skill migrate-spring-to-quarkus
Modular, gate-driven migration of Spring Boot applications to Quarkus.
// TODO: Migration required — <reason> comment explaining what needs to change and why. This applies to:
// REMOVED: comment at the same location.<target> after each phase (cd <target> && ./mvnw clean compile -DskipTests for Maven, cd <target> && ./gradlew clean compileJava -x test for Gradle). Never move to the next phase with a broken build.<source>. All changes go into <target>. The only exception is <source>/migration-metadata/, where extraction metadata may be written.Load the relevant reference file when working on a module:
| Reference | Use during |
|---|---|
| references/dependency-map.md | Build module: dependency and plugin mapping |
| references/annotation-map.md | Code module: annotation, DI, REST, Data, Security migration |
| references/config-map.md | Build module: configuration property migration |
<source>. A module executes only when its gate status is: PASS.<source> to determine the gate result -- do not rely on blind grep commands; use your understanding of the codebase.| Module | Gate Check | Gate Result |
|---|---|---|
| prerequisite | JDK version, build tool (Maven ≥ 3.6 recommended 3.9+ / Gradle ≥ 7 recommended 8.x), container runtime | ALWAYS — ABORT entire migration if any hard check fails; no subsequent module runs |
| planning | Prerequisite check passed | ALWAYS — generates <target>/migration-spec.yaml |
| build | Spring Boot parent/starters/spring-boot-maven-plugin in pom.xml, or Spring Boot/io.spring.dependency-management plugins in build.gradle(.kts) | PASS if Spring Boot build markers found; SKIP otherwise |
| code | Spring annotations in Java sources (@Component, @Service, @Controller, @Repository, @Entity, @Autowired, etc.) | PASS if Spring annotations found; SKIP otherwise |
| messaging | @KafkaListener, @RabbitListener, @JmsListener, @SendTo, @EnableKafka, @EnableRabbit, KafkaTemplate, RabbitTemplate, or JmsTemplate in Java sources | PASS if any found; SKIP otherwise |
| frontend | Thymeleaf/JSP templates in templates/ or static resources in static/ | PASS if view layer found; SKIP otherwise |
| testing | Spring test annotations in test sources (@SpringBootTest, @WebMvcTest, @MockBean) | PASS if Spring tests found; SKIP otherwise |
| cleanup | Leftover Spring artifacts after all other modules | ALWAYS -- runs after all other modules |
To run a single module outside the full migration flow, read all the files in the module folder directly:
modules/build/build.md and execute it"The module will use the current <source> and <target> paths and the chosen strategy (if already decided). If no strategy has been chosen, the module will ask.
All verification checks run against <target>. Run each check in order. A check fails = stop and fix before continuing.
| # | Check | Command (run in <target>) | Pass criteria |
|---|---|---|---|
| 1 | Builds | cd <target> && ./mvnw clean package -DskipTests / cd <target> && ./gradlew clean build -x test | Exit code 0, no compilation errors |
| 2 | No Spring deps | Search <target> build file for org.springframework | Zero Spring deps (except Spring compat extensions if using that strategy) |
| 3 | Has Quarkus | Search <target> build file for io.quarkus | Quarkus BOM and at least one extension present |
| 4 | Tests pass | cd <target> && ./mvnw test / cd <target> && ./gradlew test | All tests pass using @QuarkusTest |
| 5 | Starts up | cd <target> && ./mvnw quarkus:dev / cd <target> && ./gradlew quarkusDev | App starts, curl http://localhost:8080/q/health returns UP |
| 6 | No leftover templates | Search <target> for Thymeleaf/JSP references | None remaining (unless intentionally kept) |
After verification completes, run the reporting module. It reads the verification results and all per-module data to produce:
<target>/migration-metadata/execution-metadata.json -- agent, model, tokens, cost, timing, verification results<target>/migration-summary.md -- full 13-section migration reportThe reporting module must run after verification so that it can include check results and record an accurate finished_at timestamp.
After the reporting module completes, present the following directly to the user so they get an immediate overview without opening the generated files.
Answer each question honestly:
// TODO: Migration required comment and why.Then present the review as a structured report:
## Migration Report: [app-name]
### Summary
- Source: [source directory path]
- Target: [target directory path]
- Strategy: [Full Migration / Spring Compatibility]
- Agent: [AI agent name - e.g claude, pi, opencode, gemini, etc]
- Model: [model name — e.g. claude-sonnet-4-6, check system context]
- Modules completed: [X/8]
- Checks passed: [X/6]
- Token usage: [input tokens / output tokens — check session stats]
- Estimated cost: [~$X.XX — token counts × per-model pricing from anthropic.com/pricing]
### Changes by Module
| Module | Files changed | Key changes |
|--------|--------------|-------------|
| build | pom.xml or build.gradle(.kts), application.properties | ... |
| code | ... | ... |
| frontend | ... | ... |
| testing | ... | ... |
### Validation Results
| Check | Result | Notes |
|-------|--------|-------|
| Builds | PASS/FAIL | |
| No Spring deps | PASS/FAIL | |
| Has Quarkus | PASS/FAIL | |
| Tests pass | PASS/FAIL | |
| Starts up | PASS/FAIL | |
| No leftover templates | PASS/FAIL | |
### Unmigrated Code (TODOs)
| File | Line | What | Why not migrated |
|------|------|------|-----------------|
### Removed Code
| File | What was removed | Justification |
|------|-----------------|---------------|
### Skill Improvement Suggestions
- [Any missing mappings, unclear instructions, or edge cases discovered]