feat(p10-1C-Go): tree-sitter-go AST extractor + chunker — Go 코드 색인 활성화 #151
Reference in New Issue
Block a user
Delete Branch "feat/p10-1c-go"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
요약
1A-2 (Rust) + 1B (Python/TS/JS) 인프라 위에 Go AST 색인 활성화. 사용자 결정으로 1C 의 3 언어 (Go + Java + Kotlin) 를 2 PR 로 분할 — Go 가 method receiver / package convention 면에서 Java/Kotlin (JVM family) 과 다르므로. Java + Kotlin 은 후속 PR.
frozen design:
docs/superpowers/specs/2026-05-15-kebab-code-ingest-design.md§1C.task spec (frozen on merge):
tasks/p10/p10-1c-go-ast-chunker.md.plan:
docs/superpowers/plans/2026-05-20-p10-1c-go-ast-chunker.md.동결된 설계 결정
package선언에서 추출 (design §3.4 그대로). 1B 의 workspace-path 변환과 다름 — Go 는 언어 자체에packagedeclaration 이 있어 그게 canonical source. tree-sitter-go 의package_clause → package_identifier에서 추출.chunk.(*MdHeadingV1Chunker).ChunkDoc(포인터),chunk.(MdHeadingV1Chunker).Name2(value). tree-sitter-go 의method_declaration.receiverfield 의parameter_declaration.type슬라이스가 leading*포함.func TestXxx(t *testing.T)는 일반 fn 으로 emit (ranking 보정 영향은 본 task 범위 밖 — ranking brainstorm 보류 memory 따름).변경
tree-sitter-go = "0.25".kebab-parse-code/src/go.rs:GoAstExtractor+PARSER_VERSION = "code-go-v1".function_declaration/method_declaration(receiver pointer detection) /type_declaration의type_spec각 / glue (import/const/var). Glue grouping +<top-level>post-pass (1B Python 패턴).kebab-chunk/src/code_go_ast_v1.rs: 1A-2code-rust-ast-v1near-duplicate (language-agnostic body 동일).kebab-source-fs/src/media.rs:.go→MediaType::Code("go").kebab-app/src/lib.rs: dispatch allowlist 에"go"추가 + 4 match arm 활성화.extractor_supports_only_media_code_go+go_units_match_design_3_4_symbols(chunk.Free,chunk.init,chunk.MdHeadingV1Chunker,chunk.(*MdHeadingV1Chunker).ChunkDoc,chunk.(MdHeadingV1Chunker).Name2,chunk.Stringer,chunk.<top-level>) + determinismpolicy_hash_matches_md_heading_v1code_go_ast_snapshot+code_go_ast_chunks_are_deterministicgo_file_ingests_and_searches_as_code_citation(chunk.ParseDoc)0.11.1 → 0.12.0(minor — dogfooding surface 확장).검증
cargo test --workspace --no-fail-fast -j 1→ exit 0, all green.cargo clippy --workspace --all-targets -- -D warnings→ clean.chunk.ParseDoc,citation.lang = "go",code_lang_breakdown: { "go": 1 }.영향
Citation::Code/SearchHit.code_lang이미 존재; 1C-Go 는 그 surface 위 lang"go"확장).다음 PR (별도)
p10-1C-JavaKotlin — Java + Kotlin AST chunkers (
code-java-ast-v1,code-kotlin-ast-v1). JVM family 공통 (package com.foo.bar형식), 별 PR 진행 예정.🤖 Generated with Claude Code
Duplicate of code-rust-ast-v1 / code-{python,ts,js}-ast-v1 with language-agnostic body unchanged. Cross-chunker policy_hash identity asserted vs md-heading-v1. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>Mirrors code_python_ast_snapshot / code_ts_ast_snapshot patterns. In-memory CanonicalDocument (no kebab-parse-code dep — boundary §6.3 respected). verify: - cargo test -p kebab-chunk --test code_go_ast_snapshot → 2/2 - cargo test --workspace --no-fail-fast -j 1 → 0 failures (all green) - cargo clippy --workspace --all-targets -- -D warnings → clean - SMOKE: chunk.ParseDoc symbol + code_lang_breakdown {"go": 1} 확인 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>회차 1 — Go AST extractor + chunker 활성화. 정확성·경계·테스트 모두 양호, APPROVE.
총평
1A-2 (Rust) / 1B (Python/TS/JS) 패턴을 충실히 미러링하며 Go 특유의 두 가지 결정(package prefix 를 workspace path 가 아닌 소스 AST 에서 추출, method receiver 포인터 여부를 텍스트 그대로 포함)을 정확히 구현했습니다.
검증 결과
테스트 결과
칭찬
코멘트 (inline 참조)
@@ -0,0 +173,4 @@if sub.kind() == "package_identifier" {return Some(src[sub.start_byte()..sub.end_byte()].to_string());}}[Good]
extract_package가named_children()로package_identifier에 접근하는 방식이 tree-sitter-go 0.25 grammar 와 정확히 일치합니다. node-types.json 확인 결과package_clause는children배열(named)에package_identifier하나만 가지므로,child_by_field_name("name")대신named_children()를 순회하는 현재 코드가 올바릅니다.package_clause에fields가 없음을 grammar 스펙이 명시 — 방어적으로 필드 접근하지 않은 선택이 적절합니다.@@ -0,0 +254,4 @@glue.retain(|(_, gs, _)| *gs < s);flush_glue(&mut glue, &mut units, &mod_prefix);let sym = join_symbol(&mod_prefix, &[], name);units.push((sym, s, e, true));[Good]
receiver_type_text에서child_by_field_name("type")으로 추출한 텍스트가*MdHeadingV1Chunker(pointer_type) /MdHeadingV1Chunker(type_identifier) 그대로 포함됩니다. tree-sitter-go grammar 에서parameter_declaration.type필드가_typeunion 이므로pointer_type노드일 경우src[start..end]슬라이스에*가 포함돼 있어 design §3.4 의package.(*Receiver).Method형식이 자연스럽게 생성됩니다. 테스트chunk.(*MdHeadingV1Chunker).ChunkDoc과chunk.(MdHeadingV1Chunker).Name2두 케이스로 포인터/값 receiver 모두 커버 — 완벽합니다.@@ -0,0 +297,4 @@let sym = join_symbol(&mod_prefix, &[], name);units.push((sym, spec_s, spec_e, true));}}[Minor / FYI]
glue.retain(|(_, gs, _)| *gs < s)는 unit_start() 의 doc-comment fold 가s를 glue 아이템보다 앞으로 당겼을 때 해당 glue 아이템을 drop 하는 경로가 있습니다. 실제 Go 코드에서는 import/const/var 와 뒤따르는 함수 사이에 doc 코멘트가 glue 아이템을 가로질러 역전되는 경우가 없어 문제 없고,go_units_match_design_3_4_symbols가chunk.<top-level>그룹을 정확히 검증합니다. 다만 이 케이스를 명시하는 주석 한 줄(// retain drops glue items that fall within the doc-comment fold range) 을 추가하면 미래 유지보수자에게 도움이 될 것입니다. 필수 수정은 아닙니다.[Minor / FYI]
| 1B symbol path |테이블 행이 Python/TS/JS/Rust 만 기술하고 Go 는 누락돼 있습니다. Go 의 symbol prefix 는 workspace path 변환이 아닌 소스 내package선언에서 직접 추출 — 1B/1A-2 와 다른 특성인데, README 에는 설명이 있지만 ARCHITECTURE.md 에는 없습니다. 해당 행에Go = 소스-추출 package prefix (package 선언 AST 노드, workspace path 변환 아님)한 줄 추가를 권장합니다. 이 PR 에 포함하거나 JavaKotlin PR 에서 일괄 갱신해도 무방합니다.정정 (회차 1 review summary 손상 수정): 직전 review 의 inline 코멘트 목록 마지막 줄 "pointer receiver 텍스트 추출 ���확성 확인" 에서 '정'(U+C815) 이 세 바이트 replacement char 로 손상됐습니다. 올바른 텍스트는 "pointer receiver 텍스트 추출 정확성 확인" 입니다. 내용 변경은 없으며 review 판정 (APPROVE) 도 그대로입니다.
Correction (review ID 263 body corruption): inline comment list, last line: '...pointer receiver ASCII 추출 [corrupted]확성 확인' should read '정확성 확인' (Korean: correctness). The U+C815 glyph (jeong) was corrupted to 3 replacement bytes by tea's stdin path. Review judgment (APPROVE) is unchanged.