# p10-1C-JavaKotlin โ€” Java + Kotlin AST chunkers **Status:** ๐ŸŸก ์ง„ํ–‰ ์ค‘ **Contract sections:** ยง3.3 (chunker_version `code-java-ast-v1` + `code-kotlin-ast-v1`), ยง3.4 (symbol path โ€” Java/Kotlin `package.Class.method`), ยง3.5 (code_lang `java` + `kotlin`, ext `.java` / `.kt` / `.kts`), ยง6.1 (`kebab-parse-code/src/{java,kotlin}.rs`), ยง6.2 (`kebab-chunk/src/code_{java,kotlin}_ast_v1.rs`), ยง9.1 (Tier 1 AST per-language + oversize fallback). **Design:** [2026-05-15-kebab-code-ingest-design.md](../../docs/superpowers/specs/2026-05-15-kebab-code-ingest-design.md) ยง1C (Java + Kotlin ๋ถ€๋ถ„ โ€” Go ๋Š” PR #151 / v0.12.0 ๋ณ„ PR ์™„๋ฃŒ). **Plan:** [2026-05-20-p10-1c-jk-ast-chunker.md](../../docs/superpowers/plans/2026-05-20-p10-1c-jk-ast-chunker.md). ## Goal 1C-Go (PR #151 / v0.12.0) ์˜ ์ž๋งค PR. ๊ฐ™์€ 1C phase ์˜ JVM family (Java + Kotlin) ๋ฌถ์Œ. ๋จธ์ง€ ์‹œ์ ๋ถ€ํ„ฐ `.java` / `.kt` / `.kts` ํŒŒ์ผ dogfooding ๊ฐ€๋Šฅ. ## ๋™๊ฒฐ๋œ ์„ค๊ณ„ ๊ฒฐ์ • (์ด task ๋กœ ํ™•์ •) - **Symbol prefix = ์†Œ์Šค ์ฝ”๋“œ์˜ `package` ์„ ์–ธ์—์„œ ์ถ”์ถœ** (design ยง3.4 ๊ทธ๋Œ€๋กœ, 1C-Go ๋ชจ๋ธ๊ณผ ๋™์ผ). 1B ์˜ workspace-path ๋ณ€ํ™˜๊ณผ ๋‹ค๋ฆ„. - **Java**: tree-sitter-java ์˜ `package_declaration` โ†’ ์•ˆ์˜ `scoped_identifier` ๋˜๋Š” `identifier` ํ…์ŠคํŠธ (e.g. `com.kebab.chunk`). ์—†์œผ๋ฉด ``. - **Kotlin**: tree-sitter-kotlin ์˜ `package_header` โ†’ `identifier` ํ…์ŠคํŠธ. ์—†์œผ๋ฉด (default package) ``. - **Symbol ํ˜•์‹** (design ยง3.4): `package.Class.method`. ์˜ˆ์‹œ: `com.kebab.chunk.MdHeadingV1Chunker.chunkDoc`. - **Java AST mapping**: - `class_declaration` (name) โ†’ 1 unit + recurse body - `interface_declaration` (name) โ†’ 1 unit + recurse - `enum_declaration` (name) โ†’ 1 unit - `record_declaration` (Java 14+) (name) โ†’ 1 unit - `annotation_type_declaration` โ†’ 1 unit - Inside class/interface/enum: `method_declaration` (name) โ†’ unit `package.Class.method` (class nesting like 1B Python) - `import_declaration`, `package_declaration` ์ž์ฒด โ†’ glue `` - Top-level fn ์—†์Œ (Java ์ž์ฒด์— ์—†์Œ) - **Kotlin AST mapping**: - `class_declaration` (name) โ†’ 1 unit + recurse class_body. `data class` / `sealed class` / `enum class` ๋„ ๊ฐ™์€ ๋…ธ๋“œ. - `object_declaration` (name) โ†’ 1 unit + recurse class_body (singleton) - `function_declaration` (name) โ€” **top-level ๊ฐ€๋Šฅ** โ†’ unit `package.fnName`. Class ๋‚ด๋ถ€๋ฉด `package.Class.method`. - `property_declaration` at top-level โ†’ glue - `interface` (in tree-sitter-kotlin ๋ณดํ†ต `class_declaration` with `interface` modifier ๋˜๋Š” ๋ณ„ ๋…ธ๋“œ) โ†’ 1 unit - `import_header`, `package_header` ์ž์ฒด โ†’ glue `` - **Glue grouping**: 1B Python / 1C-Go ํŒจํ„ด ๋™์ผ โ€” imports + ๊ธฐํƒ€ โ†’ ํ•˜๋‚˜์˜ `` (๋˜๋Š” `` post-pass if file has zero real units). - **Tree-sitter Kotlin crate ์„ ํƒ**: tree-sitter-kotlin ์˜ ๊ฐ€์žฅ ์ž˜ ์œ ์ง€๋˜๋Š” crate ์‚ฌ์šฉ (`tree-sitter-kotlin` ๋˜๋Š” fork). resolve ์‹œ active maintainer ํ™•์ธ. - frozen design ์ž์ฒด ๋ณ€๊ฒฝ ์—†์Œ โ€” ยง10.1 ์— 1C-JK ํ™œ์„ฑํ™” ํ•œ ์ค„. ## Acceptance criteria - `cargo test --workspace --no-fail-fast -j 1` passes. - `cargo clippy --workspace --all-targets -- -D warnings` passes. - Java/Kotlin fixture ๊ฐ๊ฐ (`tests/fixtures/sample.java`, `tests/fixtures/sample.kt`) ingest โ†’ chunk snapshot ์•ˆ์ • + symbol ์ด ยง3.4 ์ปจ๋ฒค์…˜ ์ผ์น˜. - ๊ฒฉ๋ฆฌ TempDir KB ์— `.java` / `.kt` ํŒŒ์ผ ๋‘๊ณ  `kebab search --code-lang java --json` / `--code-lang kotlin --json` ๊ฐ€ `Citation::Code` ๋ฐ˜ํ™˜. - `kebab schema --json | jq .stats.code_lang_breakdown` ์— `"java"` + `"kotlin"` ์นด์šดํŠธ. - README + HANDOFF + ARCHITECTURE + SMOKE + tasks/INDEX + tasks/p10/INDEX ๊ฐฑ์‹ . - frozen design ยง10.1 ํ•œ ์ค„. - workspace `Cargo.toml` minor bump (0.12.0 โ†’ 0.13.0). ## Allowed dependencies - `kebab-parse-code` ์— `tree-sitter-java` + `tree-sitter-kotlin` ์ถ”๊ฐ€. ๊ธฐ์กด deps ์œ ์ง€. - `kebab-chunk` ์˜ ์ƒˆ ๋ชจ๋“ˆ 2๊ฐœ (`code_java_ast_v1.rs`, `code_kotlin_ast_v1.rs`) โ€” language-agnostic body. tree-sitter import ๊ธˆ์ง€. - `kebab-app`, `kebab-source-fs` โ€” ์ƒˆ crate dep ์—†์Œ. ## Forbidden dependencies - `kebab-chunk` ๊ฐ€ tree-sitter-java / tree-sitter-kotlin import ๊ธˆ์ง€ (boundary ยง6.3). - UI crate ๊ฐ€ `kebab-parse-code` ์ง์ ‘ import ๊ธˆ์ง€. - `kebab-parse-code` ๊ฐ€ store / embed / llm / rag ์ง์ ‘ import ๊ธˆ์ง€. ## Risks / notes - tree-sitter-kotlin: ๊ณต์‹ ๋˜๋Š” ๊ฐ€์žฅ ํ™œ๋ฐœํžˆ ์œ ์ง€๋˜๋Š” crate (`tree-sitter-kotlin` ๋˜๋Š” fork) ์„ ํƒ ํ•„์š”. resolve ์‹œ metadata ํ™•์ธ. - Kotlin ์˜ grammar ๊ฐ€ ๋‹ค๋ฅธ tree-sitter-* ๋ณด๋‹ค update ๋นˆ๋„ ๋‚ฎ์„ ์ˆ˜ ์žˆ์–ด grammar field ๋ช… ๋ณ€๋™ ๊ฐ€๋Šฅ โ€” ํ…Œ์ŠคํŠธ fixture ๋กœ contract ๊ณ ์ •. - Java record (Java 14+) โ€” tree-sitter-java ์—์„œ `record_declaration` ๋…ธ๋“œ (ํ™•์ธ ํ•„์š”). - Kotlin sealed class / data class / object declaration ๋“ฑ ๋ณ€์ข… ๋…ธ๋“œ โ€” tree-sitter-kotlin ์˜ ์ •ํ™•ํ•œ node kind ๋ช… ํ™•์ธ ํ•„์š” (grammar.json / node-types.json). - Java class ์•ˆ์˜ inner class โ€” Python ํŒจํ„ด (recursion with class name pushed) ๋™์ผ ์ฒ˜๋ฆฌ. - Kotlin top-level fn ์€ 1B Python ์˜ top-level fn ํŒจํ„ด + 1C-Go ์˜ package-prefix ํŒจํ„ด hybrid โ€” `package.fnName`. - ๋จธ์ง€ ํ›„ deviation ์€ `tasks/HOTFIXES.md` dated ๋กœ๊ทธ + ๋ณธ spec `Risks / notes` cross-link.