-
v0.13.0 Stable
released this
2026-05-20 11:58:11 +00:00 | 382 commits to main since this releaseMinor release — Java + Kotlin AST 색인 활성화 (p10-1C phase 완성).
사용자-가시 변경
.java파일 색인 활성. tree-sitter-java AST chunker (code-java-ast-v1). 5 type declarations (class / interface / enum / record / annotation_type) + method + constructor + nested class. Symbol:com.foo.Foo.bar(package.Class.method, design §3.4)..kt/.kts파일 색인 활성. tree-sitter-kotlin-ng AST chunker (code-kotlin-ast-v1). Class / data class / sealed class / enum class / interface (oneclass_declarationnode) +object_declaration+companion_object+ top-levelfunction_declaration(Kotlin-specific) +secondary_constructor. Symbol: samepackage.Class.method또는package.<top-level-fn>.kebab search --code-lang java --json/--code-lang kotlin --json가Citation::Code { kind: "code", lang, symbol, ... }반환.kebab schema --json | jq .stats.code_lang_breakdown에"java"+"kotlin"카운트.
동결된 설계 결정
- Symbol prefix = 소스의
package선언 (1C-Go 모델 동일):- Java:
package_declaration→scoped_identifier/identifier. - Kotlin:
package_header→qualified_identifier.
- Java:
- tree-sitter-kotlin-ng 선택 (bare
tree-sitter-kotlin = "0.3.8"는 tree-sitter 0.21-0.23 만 지원 → 0.26 incompatible;-ngfork 가tree-sitter-language = "0.1"shim 으로 0.24+ 호환).
검증
cargo test --workspace --no-fail-fast -j 1exit 0cargo clippy --workspace --all-targets -- -D warningsclean- Manual SMOKE: Java
com.foo.Foo.bar, Kotlin classcom.foo.Bar.baz, Kotlin top-level fncom.foo.freeFn
1C phase 완성
Sub-PR Lang Release 1C-Go (#151) Go v0.12.0 1C-JK (#152) Java + Kotlin v0.13.0 다음 phase: p10-1D (C + C++).
영향
- wire schema additive (1A-2
Citation::Code그대로, lang values 확장). - frozen design 변경 없음.
- 기존 색인 데이터 invalidation 없음.
누적 코드 색인 활성화
Phase Languages Release 1A-2 Rust v0.7.0 1B Python + TypeScript + JavaScript v0.8.0 1C-Go Go v0.12.0 1C-JK Java + Kotlin v0.13.0 1D C + C++ ⏳ next Downloads
-
v0.12.0 Stable
released this
2026-05-20 10:16:39 +00:00 | 395 commits to main since this releaseMinor release — Go AST 색인 활성화 (p10-1C 의 첫 절반).
사용자-가시 변경
.go파일 색인 활성. tree-sitter-go AST chunker (code-go-ast-v1) 가 function / method / type (struct/interface/type alias) / glue (import/const/var) 단위로 chunk. parser_versioncode-go-v1.- Symbol path: design §3.4 그대로 —
<pkg>.<Func>/<pkg>.(*Receiver).<Method>(포인터) /<pkg>.(Receiver).<Method>(value). 예:chunk.ParseDoc,chunk.(*MdHeadingV1Chunker).ChunkDoc. pkg 은 소스의package <name>선언에서 추출 (1B 의 workspace-path 변환과 다른 모델). kebab search --code-lang go --json가citation.kind = "code",citation.lang = "go",citation.symbol(위 형식),repo반환.kebab schema --json | jq .stats.code_lang_breakdown에"go"카운트.
변경 위치
tree-sitter-go = "0.25"workspace dep.crates/kebab-parse-code/src/go.rs:GoAstExtractor(source-sidepackage_clause추출 + method receiver pointer detection).crates/kebab-chunk/src/code_go_ast_v1.rs: 1A-2code-rust-ast-v1near-duplicate.crates/kebab-source-fs/src/media.rs:.go라우팅.crates/kebab-app/src/lib.rs: dispatch allowlist + 4 match arm 활성화.- 회귀 통합 테스트 (
go_file_ingests_and_searches_as_code_citation) + extractor 단위 테스트 (3) + chunker 단위 테스트 (6) + snapshot (2). - README + HANDOFF + ARCHITECTURE + SMOKE + tasks/INDEX + tasks/p10/INDEX + design §10.1.
안전 보장 (이전 PR invariants 유지)
- twin-file idempotent (PR #146) ✅
- file deletion auto-purge (PR #148) ✅
- reset --orphans-only (PR #149) ✅
- assets.workspace_path semantic (PR #150) ✅
영향
- wire schema additive (
code_lang = "go"값 추가, 1A-2 wire shape 동일). - frozen design 변경 없음 (§3.4 Go row 가 이미 본 구현과 일치, §10.1 dated note 만 추가).
- 기존 색인 데이터 invalidation 없음.
다음 PR
p10-1C-JavaKotlin — Java + Kotlin AST chunkers (
code-java-ast-v1,code-kotlin-ast-v1). JVM family 공통 (package com.foo.bar형식), 별 PR 진행 예정.Downloads
-
v0.11.1 Stable
released this
2026-05-20 08:09:48 +00:00 | 405 commits to main since this releasePatch release — dogfood semantic cleanup (PR #150).
사용자-가시 변경
- (rare) twin file (동일 content / 다른 path) 의
kebab fetch span <doc_id> <start> <end>가 잘못된 asset row 의media_type으로 PDF/audio 분기 판단할 가능성 fix. - 외부 wire / CLI / config surface 변경 없음 — internal lookup 만 document-centric 으로 일관화.
변경
- 새 internal trait method
DocumentStore::get_asset(asset_id) -> Option<RawAsset>— asset_id PK 직접 조회, flip-flop immune. fetch.rs::fetch_span:get_asset_by_workspace_path(&doc.workspace_path)→get_asset(&doc.source_asset_id)2-step lookup.assets.workspace_path의 "last-registered path" semantic 을 UPSERT doc-comment 에 명시 (미래 reader 가 flip-flop 을 "fix" 하려고 시도하지 않도록).get_asset_by_workspace_pathtrait method 는 보존 (back-compat — production caller 0 이나 store-sqlite round-trip test 유지).- 회귀 통합 테스트
twin_files_fetch_span_uses_correct_asset추가.
영향
- wire schema 변경 없음.
- frozen design 변경 없음 (semantic doc 만 명시).
- 기존 색인 데이터 invalidation 없음.
Dogfood 사이클 사실상 종료
본 PR 로 multi-root dogfooding 의 모든 bug + 우선순위 1, 3 issue 처리 완료.
남은 후보:
- Ranking 편향 (본문 vs 테스트 code 우선) — design brainstorm 필요한 별도 큰 task
get_asset_by_workspace_path#[deprecated]annotation — PR #150 review 제안, 선택적 cleanup
Downloads
- (rare) twin file (동일 content / 다른 path) 의
-
v0.11.0 Stable
released this
2026-05-20 07:53:57 +00:00 | 408 commits to main since this releaseMinor release —
kebab reset --orphans-only(dogfooding follow-up to v0.10.0).사용자-가시 변경
- 새 CLI flag
kebab reset --orphans-only: walker scope 외 stored doc 들을 명시 reconcile. PR #148 (v0.10.0) sweep 의 explicit complement — sweep 은 fs 에 살아있는 file 은 건드리지 않지만, 사용자가include좁히거나 sub-dir 옮긴 후 명시 정리 원할 때 이 명령 사용. - 동작: 현재 config 로 walker scan →
stored - scanned의 모든 path purge (fs existence 검사 없음). Twin-file 보호 + vector store delete_by_chunk_ids 동시 처리. - Confirm UI (TTY): orphan count + sample 5 paths +
[y/N]. non-TTY 는--yes필수. - 새 wire 필드 (additive):
ResetReport.orphans_purged: u32+purged_paths: Vec<WorkspacePath>(#[serde(default)]로 back-compat). - README +
docs/wire-schema/v1/reset_report.schema.json동시 갱신.
안전 보장
- Twin-file 보호:
purge_deleted_workspace_path의 COUNT-check (PR #146 invariant) 유지 — 동일 content 다른 path 의 asset row 가 다른 doc 에 의해 참조되면 보존. - Vector store None (lexical-only) 케이스: vector delete 단계 skip.
- 사용자 데이터 안전: confirm prompt (TTY) 또는 explicit
--yes(non-TTY) 필수. - fs file 은 절대 안 건드림 — store-internal purge only.
영향
- wire schema additive (back-compat).
- frozen design 변경 없음.
- 기존 색인 데이터 invalidation 없음.
다음 dogfood 후보
- Asset table
workspace_pathflip-flop (PR #146 이후 user-impact 0, semantic cleanup). - Ranking 편향 (본문 vs 테스트 코드 우선) — design brainstorm 필요.
Downloads
- 새 CLI flag
-
v0.10.0 Stable
released this
2026-05-20 07:13:00 +00:00 | 412 commits to main since this releaseMinor release — filesystem deletion 자동 reconcile (dogfooding follow-up).
사용자-가시 변경
rm a.md후kebab ingest시 stored doc/chunks/embeddings 가 자동 purge. 이전: 그대로 남아 search 에 ghost citation. 이후: walker scan 직후 sweep 단계에서fs::try_exists()확인 → file 부재 시 SQLite cascade delete + (copied모드면) on-disk storage 파일 best-effort 정리 + vector storedelete_by_chunk_ids.IngestReport.purged_deleted_files: u32새 wire 필드 (#[serde(default)], additive minor).- CLI summary 에
purged N표기 (count > 0 일 때만).
안전 보장 (사용자 데이터 보호)
config.workspace.include좁아짐으로 walker scope 가 좁아진 경우 → purge 안 함 (file 이 fs 에 살아있으므로). 사용자 명시kebab reset명령 필요.- transient FS error (
EACCES/ NFS hiccup / 권한 변경) 시 → 보수적으로 "file 존재" 가정 → purge 안 함. - Twin-file 보호: 동일 content 다른 path 의 두 파일 중 하나 삭제 시 → 해당 doc 만 purge, 공유
assetsrow 는 다른 doc 이 참조하면 보존 (PR #146 invariant 유지).
변경 위치
crates/kebab-core::DocumentStore::all_workspace_pathstrait method.crates/kebab-store-sqlite::SqliteStore::all_workspace_paths구현.crates/kebab-store-sqlite::purge_deleted_workspace_path새 fn (twin-file COUNT-check 포함).crates/kebab-app::sweep_deleted_files(walker scan 직후 호출).crates/kebab-core::IngestReport.purged_deleted_files필드.crates/kebab-cli::main.rssummary 출력.- 2 회귀 통합 테스트 (
file_deletion_auto_purge+include_scope_narrowing_does_not_purge). - snapshot baseline 갱신.
영향
- wire schema additive (back-compat).
- frozen design 변경 없음.
- 기존 색인 데이터 invalidation 없음.
남은 dogfood 후보
- Ranking 편향 (본문 vs 테스트 코드 우선) — design brainstorm 필요.
- Asset table
workspace_pathflip-flop (semantic minor, user-impact 없음). - Config scope 좁아짐 시 stored orphan reconcile (
kebab reset --orphans같은 explicit 명령) — 후속.
Downloads
-
v0.9.0 Stable
released this
2026-05-20 06:29:29 +00:00 | 417 commits to main since this releaseMinor release — 확장자 routing 확장 (dogfooding issue #6).
사용자-가시 변경
.mts(ESM TypeScript) /.cts(CommonJS TypeScript) 가 색인됨.LANGUAGE_TYPESCRIPTgrammar 가 처리.code-ts-ast-v1chunker, symbol path 도 normal TS와 동일 (예:src/Foo.Foo.bar)..mdx(Markdown + JSX) 가 색인됨. md parser 가 JSX islands 를 raw passthrough 로 처리 (pulldown-cmark 의 HTML event drop). chunkermd-heading-v1.kebab schema --json | jq .stats.code_lang_breakdown에 typescript 카운트가 늘어남 (.ts/.tsx와 합산).
변경 위치
crates/kebab-source-fs/src/media.rs:mts/cts→ typescript,mdx→ markdown 라우팅 arms.crates/kebab-parse-code/src/lang.rs:code_lang_for_path매치 +module_path_for_tsjsext strip 확장.crates/kebab-parse-code/src/typescript.rs:select_grammardoc 갱신 (로직 변경 없음 — non-tsx 는 이미 LANGUAGE_TYPESCRIPT 로 라우팅).- 회귀 테스트 2건 추가, 기존 테스트 케이스 2개 확장.
영향 없음
- wire schema / frozen design 변경 없음.
- 기존 색인 데이터 invalidation 없음 — 다음 ingest 시 새 파일만 추가됨.
남은 dogfood 후보
- Ranking 편향 (본문 vs 테스트 코드 우선): BM25 + path weighting 검토 필요 — 별도 후속.
- Asset table workspace_path flip-flop (semantic minor, user-impact 없음).
Downloads
-
v0.8.3 Stable
released this
2026-05-20 06:20:37 +00:00 | 420 commits to main since this releaseBug fix release — multi-root dogfooding 의 3번째 발견 production bug fix.
사용자-가시 변경
- Idempotent re-ingest 가 twin files (동일 content / 다른 path — 예: 빈
__init__.py×3,AGENTS.md↔CLAUDE.md동일 content, 중복 로고 PDF/JPG) 에 대해 정확히Unchanged반환. 이전: 매 ingest 마다Updated로 잘못 분류.
진단 요약
assets.asset_id(= blake3 content hash) 가 PRIMARY KEY 라 동일 content 두 파일이 한 asset row 공유. UPSERTON CONFLICT(asset_id) DO UPDATE SET workspace_path = excluded.workspace_path가 매번 path 를 덮어씀 →get_asset_by_workspace_path(path)가 잘못된/None 반환.Fix
try_skip_unchanged를 document-centric lookup 으로 전환.documents.workspace_path는 V001 부터 이미 UNIQUE,id_for_doc(path, asset_id, parser_version)이 path 포함이라 twin files 각자 별도 doc row 안정. Schema migration 불필요.변경 위치
crates/kebab-core/src/traits.rs:DocumentStore::get_document_by_workspace_pathtrait method 추가crates/kebab-store-sqlite/src/documents.rs: 구현 (기존get_document의 SELECT + row 변환 재사용)crates/kebab-app/src/lib.rs::try_skip_unchanged: document-side lookup + explicit parser_version 비교crates/kebab-app/tests/twin_files_idempotent.rs: 회귀 통합 테스트
영향 없음
- wire schema 변경 없음.
- frozen design 변경 없음.
- 데이터 invalidation 없음.
남은 minor issue
assets.workspace_path가 twin files 사이 flip-flop —try_skip_unchanged는 이제 무관하지만 asset row 의 path semantic 모호. 별도 follow-up cleanup PR 가치 (선택).
Downloads
- Idempotent re-ingest 가 twin files (동일 content / 다른 path — 예: 빈
-
v0.8.2 Stable
released this
2026-05-20 05:20:50 +00:00 | 424 commits to main since this releaseBug fix release — multi-root dogfooding (kebab-docs + httpx + zod + lodash) 으로 발견된 1A-1/1A-2 origin 누락 surface 복원.
사용자-가시 변경
kebab schema --json | jq .stats.repo_breakdown가 실제 채워짐. 이전: 항상{}. 이후:metadata.reposet 된 doc 들의 repo→count 매핑 (e.g.{"httpx": 60, "zod": 401, "lodash": 50}).workspace.includeconfig glob 이 walker 에서 실제 enforce. 이전: 무시 → 모든 파일 색인. 이후: allow-list (empty=모두, non-empty=매치 필요) + exclude AND.
변경 위치
crates/kebab-store-sqlite/src/store.rs:repo_breakdown()query (Task 9 의code_lang_breakdown패턴 mirror).crates/kebab-app/src/schema.rs:BTreeMap::new()placeholder →store.repo_breakdown()?.crates/kebab-source-fs/src/walker.rs:WalkOverrides.include+build_include_globset()+ per-file allow-list 검사.crates/kebab-source-fs/src/connector.rs: 잘못된 안내log_scope_include_warning삭제 +&scope.include전달.- 회귀 테스트 4건 추가.
영향 없음
- wire schema 변경 없음.
- frozen design 변경 없음.
- 데이터 invalidation 없음.
남은 dogfood 항목
asset deduplication ⊥ workspace_path uniqueness — 동일 content twin files (e.g. 빈
__init__.py) 에서 idempotent re-ingest 깨짐. V005 schema migration 필요한 별도 후속 PR 예정.Downloads
-
v0.8.1 Stable
released this
2026-05-20 03:35:38 +00:00 | 428 commits to main since this releaseBug fix release — p10-1A-1 (PR #139) 이후 잠복했던
--code-lang/--repofilter 무시 버그 수정. p10-1B (PR #142) 머지 후 httpx + zod + lodash dogfooding 으로 표면화.사용자-가시 변경
kebab search --code-lang LANG/--repo NAME이 실제로 filter 적용. 이전: filter 무시 → 모든 doc (markdown / pdf / image 섞임). 이후: 지정된 code_lang / repo 의 chunk 만 반환.SearchHit.code_lang과SearchHit.repo가 filter-only-code-hits 일 때 정상 populated (이전엔 markdown hit 포함되며 backfill 미스로 None).- citation.lang / citation.symbol 이 design §3.4 형식 (Python dotted / TS·JS slash-style) 그대로 반환.
변경 위치
crates/kebab-search/src/lexical.rs— FTS SQL 에json_extract(d.metadata_json, '$.code_lang')/'$.repo'IN-list filter 추가.crates/kebab-store-sqlite/src/filters.rs—filter_chunks에 동일 filter 추가 (vector retriever 가 post-filter 로 사용).- 회귀 테스트 4건 추가.
영향 없음
- wire schema 변경 없음.
- frozen design 변경 없음.
- 기존 데이터 invalidation 없음 — 동일 doc / chunk / metadata, SQL filter 만 정상화.
Downloads
-
v0.8.0 Stable
released this
2026-05-20 02:31:53 +00:00 | 431 commits to main since this release변경사항 (since v0.6.0)
- #143 fix(p10-1b): apply round-1 lang.rs doc + tests/ test case missed in
4503b5b - #142 feat(p10-1B): Python + TS/JS AST chunkers — tree-sitter-{python,typescript,javascript} 코드 색인 활성화
- #141 test(eval): normalize elapsed_ms before determinism comparison (flake fix)
- #140 feat(p10-1A-2): Rust AST chunker — tree-sitter-rust 코드 색인 활성화
- #139 feat(p10-1a-1): code ingest framework — wire schema + parse-code crate + filter flags
Python / TypeScript / JavaScript 코드 색인 활성화 — 1A-2 가 깐 Rust 인프라 위에 3 언어 AST extractor + chunker 추가. 머지 commit 부터 Python / TS / JS 프로젝트도 dogfooding 가능.
사용자-가시 surface 변경
kebab ingest:.py/.pyi/.ts/.tsx/.js/.mjs/.cjs/.jsx파일이 새로 지원. 언어별 tree-sitter AST chunker (code-python-ast-v1/code-ts-ast-v1/code-js-ast-v1) 가 함수 / 클래스 / 메서드 / interface / type alias / decorator-folded unit 단위로 chunk. parser_versioncode-{python,ts,js}-v1.kebab search --json: code chunk hit 의citation.lang이"python"/"typescript"/"javascript"일 수 있음. SearchHit top-levelcode_lang+repo자동 채움.--code-lang python/--code-lang typescript/--code-lang javascriptfilter (1A-1 도입) 가 이제 실효.kebab schema --json:stats.code_lang_breakdown에python/typescript/javascript카운트 등장.stats.media_breakdown의"code"카테고리에 합산.- Symbol path 규약: workspace 경로 → module path 변환 (design §3.4 충실):
- Python:
kebab_eval/metrics.py의def compute_mrr()→kebab_eval.metrics.compute_mrr.pkg/__init__.py→pkg. 자동 strip prefix:src/,lib/,crates/<name>/src/.tests//examples//benches/는 의도적으로 보존 (테스트/예제 namespace 유지). - TS/JS:
src/Foo.ts의 methodbar→src/Foo.Foo.bar.export default function ()→<prefix>.default. TSX 는LANGUAGE_TSXgrammar 자동 선택.
- Python:
- wire schema: 모두 additive minor — 기존 consumer 무영향. wire 의
Citation::Codevariant 는 1A-1 부터 존재. SearchHitcode_lang/repo는 1A-1 추가 + 1A-2 (Rust) / 1B (Python/TS/JS) 부터 실제 채워짐.
동결된 설계 결정
- tree-sitter 위치 = parser (
kebab-parse-code), chunker 아님 (design §6.3). - TypeScript:
LANGUAGE_TYPESCRIPT(.ts) /LANGUAGE_TSX(.tsx) 두 grammar, 단일 chunker. - JavaScript: 단일
LANGUAGEgrammar 로.js/.mjs/.cjs/.jsx모두 처리. - App dispatch 일반화:
ingest_one_code_asset(code_lang: &str)가 4-arm match 로 lang 별 Extractor + Chunker 선택. Rust 동작 byte-identical 보존.
알려진 동��� (HOTFIXES 2026-05-20, 3 항목)
module_path_for_python/module_path_for_tsjs가 path-sanitize 안 함 (특수문자 / 공백 그대로 prefix 에 포함). 후속 phase 에서 NFKC + 사용금지 문자 변환 검토.- TS/JS expression-level 함수 (arrow fn, function expression assigned to const) 는
<top-level>glue 로 처리. 후속 phase 에서lexical_declarationunwrap 검토. - Rust 1A-2 의 symbol path 는 file-scope nesting 만 (workspace prefix 없음) — 1B 와 비일관. 1A retrofit 은 사용자 명시 요청 시 (chunker_version bump + reindex cascade).
검증 절차
docs/SMOKE.md의 P10-1B 절 — 격리된 TempDir 워크스페이스에.py/.ts/.js파일 1개씩 두고 ingest / search / schema 로 wiring 확인.Downloads
- #143 fix(p10-1b): apply round-1 lang.rs doc + tests/ test case missed in