ワンクリックで
jsonconvert
JSON을 Kotlin Data Class로 변환하여 파일로 저장한다. 중첩 객체는 하위 패키지로 생성. "JSON 변환", "Data Class 만들어줘", "JSON을 코틀린으로" 등의 요청 시 사용.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
JSON을 Kotlin Data Class로 변환하여 파일로 저장한다. 중첩 객체는 하위 패키지로 생성. "JSON 변환", "Data Class 만들어줘", "JSON을 코틀린으로" 등의 요청 시 사용.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
/plan 실행 전 사전 정보를 정리하는 스킬. 사용자와 실시간 대화로 PROMPT/PRD/SPEC 3개 문서를 docs/agents/output/plan/{타임스탬프}/ 에 작성한다. PRD/SPEC은 이후 /plan 모드에 전달된다. 트리거: /BeforePlan, "plan 준비", "사전 계획 문서", "PRD/SPEC 먼저 작성", "/plan 전 정리".
Android 라이브러리 코드 리뷰 스킬. 우선순위 5단계(아키텍처→기능→로직→품질→명명) 순서로 점검하고 100점 평가한다. 코드 리뷰가 필요할 때 슬래시 명령 `/CodeReview`로 실행한다(자동 호출 비활성 — 자연어 "코드 리뷰" 요청은 review 에이전트 담당).
프로젝트의 Skill(.claude/skills/)과 구식 커맨드(.claude/commands/)를 품질 루브릭(6섹션 30항목, 규칙/모델 검사 분리, S~F 등급)으로 점검하고 등급표와 개선 조치를 보고한다. 스킬을 새로 만들었거나 수정한 직후, 또는 스킬이 호출되지 않거나 이상 동작할 때 반드시 사용한다. 트리거: /SkillReview, "스킬 점검", "스킬 품질 검사", "스킬 평가", "SKILL.md 검사", "skill review", "루브릭 점검", "스킬이 왜 호출 안 되지".
ktlint, lint, apiDump 정적 분석 일괄 실행 스킬. "품질 체크", "ktlint", "lint 체크", "api dump", "정적 분석" 요청 시 사용.
Android app 모듈에 파일 세트를 생성한다. FQCN을 입력하면 suffix로 타입(Activity/Fragment/DialogFragment/Adapter/Layout)을 자동 감지하여 Kotlin 파일과 XML 레이아웃을 함께 생성한다. "만들어줘", "생성해줘", "Activity/Fragment 추가" 등의 요청 시 사용.
PRD/SPEC을 입력으로 구현 계획(PLAN)을 작성하는 절차. /plan 진입 시 mainAgent가 이 절차를 따른다. 선행 PRD/SPEC을 알 때만 적용(세션 내 BeforePlan 산출물 또는 사용자 명시 참조), 모르면 기본 /plan 수행. PRD/SPEC의 생성·포맷은 BeforePlan이 단일 소유한다. EnterPlanMode/ExitPlanMode와 plan_format_check로 검증한다. 트리거: /plan (PRD/SPEC을 아는 경우), /MakePlan, "구현 계획 작성", "PLAN 작성".
| name | JsonConvert |
| description | JSON을 Kotlin Data Class로 변환하여 파일로 저장한다. 중첩 객체는 하위 패키지로 생성. "JSON 변환", "Data Class 만들어줘", "JSON을 코틀린으로" 등의 요청 시 사용. |
| disable-model-invocation | true |
| argument-hint | {패키지명.클래스명} {JSON 내용} |
JSON을 Kotlin Data Class로 변환하여 지정 패키지 경로에 파일로 저장한다.
/JsonConvert {패키지명.클래스명} {JSON}
예시:
/JsonConvert kr.open.library.simple_ui.core.model.UserInfo {"userId": 1, "name": "홍길동", "address": {"city": "서울"}}
$ARGUMENTS에서 FQCN과 JSON을 분리한다.
{ 또는 [ 문자 앞까지 (공백 제거) → FQCN{ 또는 [ 부터 끝까지 → JSON 내용kr.open.library.simple_ui.core.model.UserInfo
→ 패키지명: kr.open.library.simple_ui.core.model
→ 클래스명: UserInfo
실패 조건 (즉시 중단):
파싱 완료 후, 아래 형식으로 반드시 출력한 뒤 STEP 1로 진행한다.
> FQCN: {FQCN}
> 패키지: {패키지명}
> 클래스: {클래스명}
패키지명 prefix로 저장할 모듈을 결정한다.
| 패키지 prefix | 모듈 | 소스 루트 경로 |
|---|---|---|
kr.open.library.simple_ui.core | simple_core | simple_core/src/main/java/ |
kr.open.library.simple_ui.xml | simple_xml | simple_xml/src/main/java/ |
| 그 외 | app | app/src/main/java/ |
감지된 모듈의 build.gradle.kts (또는 build.gradle)를 직접 읽어 직렬화 라이브러리를 확인한다.
| 감지 키워드 | 라이브러리 | 어노테이션 스타일 |
|---|---|---|
kotlinx-serialization / kotlin.serialization | kotlinx.serialization | @Serializable + @SerialName |
gson | Gson | @SerializedName |
moshi | Moshi | @Json(name = "...") |
jackson | Jackson | @JsonProperty |
| 없음 | 없음 | 순수 Data Class (어노테이션 없음) |
아래 질문을 사용자에게 한다.
⚠️ 직렬화 라이브러리를 찾을 수 없습니다.
어떻게 진행할까요?
1) 어노테이션 없이 순수 Data Class 생성
2) kotlinx.serialization 으로 진행
3) Gson 으로 진행
4) Moshi 로 진행
5) Jackson 으로 진행
6) 기타 (라이브러리명 직접 입력)
7) 취소
라이브러리를 build.gradle에 추가할까요?
1) 라이브러리 추가 후 진행
2) 라이브러리 추가 없이 진행 (어노테이션 스타일만 적용)
어떤 버전을 사용할까요?
1) 최신 버전 사용
2) 특정 버전 직접 입력
라이브러리명과 버전을 입력해 주세요. (예: com.example:my-json-lib:1.0.0)
dependencies { } 블록에 추가./gradlew {모듈}:dependencies 실행하여 의존성 해석 검증
아래 질문을 사용자에게 한다.
여러 직렬화 라이브러리가 감지됐습니다.
어떤 라이브러리로 생성할까요?
1) {감지된 라이브러리 1}
2) {감지된 라이브러리 2}
...
선택 후 해당 라이브러리 스타일로 진행한다.
별도 질문 없이 해당 라이브러리 스타일로 바로 진행한다.
| 라이브러리 | build.gradle.kts 추가 내용 |
|---|---|
| kotlinx.serialization | 플러그인: kotlin("plugin.serialization") + 의존성: implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:{버전}") |
| Gson | implementation("com.google.code.gson:gson:{버전}") |
| Moshi | implementation("com.squareup.moshi:moshi-kotlin:{버전}") |
| Jackson | implementation("com.fasterxml.jackson.module:jackson-module-kotlin:{버전}") |
의존성 추가 위치: 해당 모듈의
build.gradle.ktsdependencies { }블록 내gradle/libs.versions.toml도 함께 확인하여 version catalog 방식이면 해당 파일에도 추가한다.
JSON을 분석하여 변환할 Data Class 목록과 패키지 구조를 도출한다.
| JSON 타입 | Kotlin 타입 |
|---|---|
| String | String |
| Int (정수, 2,147,483,647 이하) | Int |
| Long (정수, 2,147,483,647 초과) | Long |
| Float/Double | Double |
| Boolean | Boolean |
| Object | 별도 Data Class |
| Object (nullable, JSON 값이 null이지만 구조 존재) | {ClassName}? + // TODO: nullable 중첩 객체 - 런타임에 null 가능성 있음. 초기화 로직 확인 필요 주석 |
| Array (primitive) | List<T> (첫 번째 요소 타입 기준 결정) |
| Array (object) | List<ClassName> |
| Array (빈 배열) | List<Any> + // TODO: 빈 배열 - 실제 타입으로 교체 필요 주석 |
| Array (혼합 타입) | List<Any> + // TODO: 혼합 타입 - 실제 타입으로 교체 필요 주석 |
| null | Any? + // TODO: null 값으로 타입 불명확 - 실제 타입으로 교체 필요 주석 |
예시:
입력: kr.open.library.simple_ui.core.model.UserInfo
JSON: {"userId": 1, "address": {"city": "서울"}}
생성 결과:
kr.open.library.simple_ui.core.model → UserInfo.kt (address 필드 타입: Address)
kr.open.library.simple_ui.core.model.address → Address.kt (city 필드 타입: String)
3단계 이상 중첩 예시:
입력: kr.open.library.simple_ui.core.model.UserInfo
JSON: {"address": {"city": {"name": "서울"}}}
생성 결과:
kr.open.library.simple_ui.core.model → UserInfo.kt
kr.open.library.simple_ui.core.model.address → Address.kt
kr.open.library.simple_ui.core.model.address.city → City.kt
중첩 깊이 제한 없음. 필드명 기준으로 계속 하위 패키지로 내려간다.
camelCase 변환 후 프로퍼티명이 Kotlin hard keyword와 충돌하는 경우 {keyword}Field로 변경한다.
Kotlin hard keyword 목록:
as, break, class, continue, do, else, false, for, fun, if, in, interface, is, null, object, package, return, super, this, throw, true, try, typealias, typeof, val, var, when, while
처리 방식:
직렬화 라이브러리가 있는 경우 → {keyword}Field로 프로퍼티명 변경 + 어노테이션에 원본 키 보존
// 예: JSON 키 "class" → Gson 사용 시
@SerializedName("class")
val classField: String,
순수 Data Class인 경우 → {keyword}Field로 변경 + TODO 주석 추가
// 예: JSON 키 "class" → 라이브러리 없을 때
val classField: String, // TODO: 'class'는 Kotlin 예약어 - 원본 JSON 키와 이름이 다름. 직렬화 시 주의 필요
충돌 발생 시 STEP 3 계획 보고 및 STEP 7 결과 보고에 해당 필드를 명시한다.
users → User items → Item
categories → Category buses → Bus
status → Status data → Data
/JsonConvert kr.open.library.simple_ui.core.model.UserInfo [{"userId": 1}, {"userId": 2}]
→ UserInfo.kt 생성 (배열 요소 구조 기반)
파일 생성 전 아래 형식으로 계획을 먼저 보고한다.
변환 계획
- 적용 라이브러리: {감지된 라이브러리 이름 or "없음 (순수 Data Class)"}
- build.gradle 수정 예정: {모듈}/build.gradle.kts ← 2~5번 선택 + 라이브러리 추가 선택 시에만 표시
- build.gradle 수정 완료: {모듈}/build.gradle.kts ← 6번 기타 선택 + 빌드 검증 성공 시에만 표시
- 클래스 수: N개
- 생성 파일 목록:
· {경로}/UserInfo.kt → package kr.open.library.simple_ui.core.model
· {경로}/address/Address.kt → package kr.open.library.simple_ui.core.model.address
- ⚠️ TODO 항목: {필드명} - {사유} ← 없으면 생략
- ⚠️ Kotlin 예약어 충돌: {원본키} → {keyword}Field 로 변경 예정 ← 예약어 충돌 발생 시에만 표시
- ⚠️ Long 타입 생성 예정: {필드명} (Int 범위 초과) ← Long 타입이 생성될 경우에만 표시
- ⚠️ nullable 중첩 객체: {필드명}({ClassName}?) - JSON 값이 null ← nullable 중첩 객체가 있는 경우에만 표시
계획 보고 후 사용자 승인 없이 STEP 4(충돌 체크)로 바로 진행한다.
생성 예정 파일 중 이미 존재하는 파일이 있으면 즉시 중단하고 안내한다.
라이브러리 추가를 선택한 경우에만 실행한다. 그 외에는 STEP 5-2로 바로 진행한다.
6번 기타 선택 시: build.gradle 수정 및 빌드 검증이 STEP 1-1에서 이미 완료됐으므로 이 STEP은 건너뛴다.
gradle/libs.versions.toml 존재 여부 확인
libs.versions.toml에 버전 및 라이브러리 항목 추가 후 build.gradle.kts에 catalog 참조 형식으로 추가dependencies { } 블록에 직접 추가build.gradle 추가 대상 라이브러리별 의존성 테이블 기준으로 적용충돌 없음이 확인된 후 파일을 생성한다.
STEP 1-1에서 감지된 라이브러리에 따라 아래 스타일을 적용한다.
kotlinx.serialization:
package {패키지명}
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class {ClassName}(
@SerialName("{원본키}")
val {camelCaseKey}: {Type},
)
Gson:
package {패키지명}
import com.google.gson.annotations.SerializedName
data class {ClassName}(
@SerializedName("{원본키}")
val {camelCaseKey}: {Type},
)
Moshi:
package {패키지명}
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class {ClassName}(
@Json(name = "{원본키}")
val {camelCaseKey}: {Type},
)
Jackson:
package {패키지명}
import com.fasterxml.jackson.annotation.JsonProperty
data class {ClassName}(
@JsonProperty("{원본키}")
val {camelCaseKey}: {Type},
)
없음 (순수 Data Class):
package {패키지명}
data class {ClassName}(
val {camelCaseKey}: {Type},
)
공통 규칙:
.kt파일 생성 완료 후 반드시 terminal 도구를 사용하여 프로젝트를 빌드하고 컴파일 에러가 없는지 확인한다.
./gradlew :simple_core:assembleDebug --quiet
# 또는
./gradlew :simple_xml:assembleDebug --quiet
빌드 실패 시 → 오류 내용을 사용자에게 안내하고 생성된 파일을 수정한다.
✅ 완료
- 적용 라이브러리: {감지된 라이브러리 이름 or "없음 (순수 Data Class)"}
- 생성 파일:
· {경로} (클래스명, 필드 N개)
- ⚠️ TODO 항목: {필드명} - {사유} ← 없으면 생략
- ⚠️ Kotlin 예약어 충돌: {원본키} → {keyword}Field 로 변경됨. 직렬화 시 원본 키 매핑 확인 필요 ← 예약어 충돌 발생 시에만 표시
- ⚠️ Long 타입 사용: {필드명}은 Int 범위(2,147,483,647)를 초과하여 Long으로 생성됨. 서버 응답값 범위가 변경될 경우 타입 검토 필요 ← Long 타입이 생성된 경우에만 표시
- ⚠️ nullable 중첩 객체: {필드명}({ClassName}?)은 JSON 값이 null이었음. 런타임 null 가능성 있으므로 초기화 로직 확인 필요 ← nullable 중첩 객체가 있는 경우에만 표시
- ⚠️ 직렬화 라이브러리 없음: 어노테이션 없이 생성됨. 필요 시 라이브러리 추가 후 재실행 권장 ← 1번(순수 Data Class) 선택 시에만 표시
- ⚠️ 라이브러리 추가 필요: 어노테이션은 적용됐지만 build.gradle에 의존성이 없습니다. 직접 추가하지 않으면 컴파일 오류가 발생합니다. ← 2~5번 선택 + 라이브러리 추가 없이 진행 선택 시에만 표시
- ⚠️ Gradle Sync 필요: build.gradle에 의존성이 추가됐습니다. Android Studio에서 Sync를 실행하세요. ← build.gradle 수정 시에만 표시
- ⚠️ 어노테이션 직접 추가 필요: 기타 라이브러리는 어노테이션 스타일을 자동 적용할 수 없습니다. 각 필드에 직접 추가해 주세요. ← 6번 기타 선택 시에만 표시