-
v0.10.0 Stable
released this
2026-05-20 07:13:00 +00:00 | 544 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 | 549 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 | 552 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 | 556 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 | 560 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 | 563 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
-
v0.7.0 Stable
released this
2026-05-19 23:41:25 +00:00 | 586 commits to main since this release변경사항 (since v0.5.0)
- #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
- #138 chore: bump version 0.5 → 0.6
- #137 feat(fb-39b): embedding upgrade — multilingual-e5-large default
- #136 feat(fb-39): eval foundation — precision_at_k_chunk metric
- #135 docs(claude): cargo clean routinely between merges
- #134 feat(fb-42): bulk multi-query — kebab search --bulk + mcp__kebab__bulk_search
- #133 chore(handoff): sync release roadmap with shipped state
- #132 feat(fb-40): fact-grounded answer — rag-v2 prompt template
- #131 feat(fb-38): score semantics — score_kind on search_hit.v1 + RRF formula docs
Rust 코드 색인 활성화 —.rs파일이 이제kebab ingest/kebab search/kebab ask의 1급 매체. 머지 commit 으로부터 kebab 자기 자신을 dogfooding 가능.
사용자-가시 surface 변경
kebab ingest:.rs파일이 Markdown / PDF / Image 옆에 추가됨. tree-sitter Rust AST chunker (code-rust-ast-v1) 가 함수 / 메서드 / struct / trait / impl block / macro 단위로 chunk.parser_version = "code-rust-v1",chunker_version = "code-rust-ast-v1".kebab search --json: code chunk hit 의citation은 신규kind = "code"variant (path,line_start,line_end,symbol,lang). SearchHit top-level 에code_lang+repo필드 채워짐 (1A-1 에서 schema 만 추가됐던 두 필드를 실제 backfill).--code-lang/--repo/--media codefilter (1A-1) 가 1A-2 머지 시점부터 실효.kebab schema --json:stats.code_lang_breakdown실제 카운트 채워짐.stats.media_breakdown에"code"카테고리 등장.- wire schema: 모두 additive minor — 기존 consumer 무영향.
Citation::Codevariant 는 1A-1 wire 에 이미 존재했음. [ingest.code]config 절 (1A-1 도입): default 그대로 동작.extra_skip_globs로 사용자 추가 skip 패턴 지정 가능.- MediaType::Code(String) 추가 — 1A 는
"rust"만 활성화. 다른 코드 확장자는 후속 phase.
알려진 동작 (HOTFIXES 2026-05-19)
AST_CHUNK_MAX_LINES = 200은kebab-chunk/src/code_rust_ast_v1.rs모듈 상수.Chunkertrait 이 per-medium config 미노출 → 현재IngestCodeCfg::default().ast_chunk_max_lines와 동일하므로 user-visible 차이 없음. 적합한 해결은 per-medium chunker registry (P+)..rs파일은SourceType::Note로 분류 (kebab-coreSourceType::Codevariant 미존재).--media code/--code-lang rustfilter 는 정상 동작 —MediaType::Code("rust")로 별도 분류됨. 적합한 해결은SourceType::Codeadditive 추가 (후속).
검증 절차
docs/SMOKE.md의 P10-1A-2 절 — 격리된 TempDir 워크스페이스에.rs파일 1개 두고kebab ingest --json/kebab search --code-lang rust --json/kebab schema --json | jq .stats.code_lang_breakdown로 wiring 확인.사전 알림
crates/kebab-eval/tests/runner.rs::runner_lexical_is_deterministic_per_query_payload가 full-suite 첫 실행에서 간헐적으로 실패 (elapsed_ms: 0vs1) 후 isolated 재실행 시 통과 — pre-existing timing flake, 1A-2 변경과 무관 (해당 파일 본 PR 에서 미수정). 후속 정리 권장.Downloads
-
v0.6.0 Stable
released this
2026-05-10 15:03:45 +00:00 | 630 commits to main since this releasev0.6.0 = RAG quality batch. fb-38 + fb-40 + fb-42 + fb-39 + fb-39b 5건 묶음.
신규 surface
kebab search--bulk(fb-42) — stdin ndjson 으로 N query 한 번에 (cap 100). 응답 = stdout per-query ndjson + stderr summary. agent loop 효율.- 응답 hit 의
score_kind필드 (fb-38) —"rrf"(hybrid) /"bm25"(lexical) /"cosine"(vector). top-levelscore의 의미 declarative. agent confidence 오해 방지.
kebab ask- 기본 prompt template
rag-v2(fb-40) — V1 의 4 규칙 + 3 신규: fact 인용 시 verbatim span / 학습 지식 동원 금지 / 근거 모호 시 "확실하지 않다" 명시. user TOMLprompt_template_version = "rag-v1"명시 시 legacy 동작.
kebab eval runprecision_at_k_chunkmetric (fb-39) — P@5, P@10. binary relevance viaexpected_chunk_ids. 분모 = k 고정. lever 적용 (chunk policy / RRF / cross-encoder / embedding) precision 비교용 측정 도구.kebab eval compare가 P@k delta surface — markdown table + JSON deltas.
MCP
mcp__kebab__bulk_search신규 tool (tools/list 7 → 8). N query JSON envelopebulk_search_response.v1(results + summary).mcp__kebab__search응답 안score_kind필드 (fb-38) — agent guidance.mcp__kebab__ask응답 strict (fb-40 rag-v2) — 학습 지식 거부 / "확실하지 않다" 출현.
Embedding
- 기본 모델
multilingual-e5-large(1024 dim, fb-39b) — 이전multilingual-e5-small(384 dim) 대비 한국어 retrieval precision 강화. fastembed 자동 다운로드 (~1.3 GB 첫 실행). user TOMLmodel = "multilingual-e5-small"명시 시 backwards-compat.
Cascade
embedding_version변경 — 모든 chunk 재-embed (fb-23 incremental ingest 자동). 옛 LanceDB table (chunk_embeddings_multilingual-e5-small_384) orphan. 정리:kebab reset --vector-only && kebab ingest.prompt_template_version변경 — 기존 eval_runs frozen, rag-v2 비교는 신규 run.
호환성
- wire 모든 추가 additive minor — 기존 consumer 무영향.
score_kind/bulk_search_*schemas additive (bulk_search_item.v1+bulk_search_response.v1신규).- 기존 user config TOML pinning 그대로 honored — opt-out path.
도그푸딩 가이드
# embedding 업그레이드 (신규 모델 ONNX 다운로드 + 전체 re-embed) kebab reset --vector-only && kebab ingest # bulk multi-query printf '{"query":"a"}\n{"query":"b"}\n' | kebab search --bulk --json # precision 측정 (golden 의 expected_chunk_ids 채워서) kebab eval run # rag-v2 행태 확인 kebab ask "..." --json | jq .answer # "확실하지 않다" 출현 가능의존성
- 신규 dep 없음.
- fastembed 4.9.1 의
MultilingualE5Largeenum variant 활용 (이미 시드).
Downloads
-
v0.5.0 Stable
released this
2026-05-10 08:10:06 +00:00 | 680 commits to main since this release변경사항 (since v0.3.3)
- #130 chore: bump version 0.4 → 0.5
- #129 feat(fb-37): trace + stats — search debug + KB health surface
- #128 chore: sync Cargo.lock for kebab-mcp time dep (fb-36)
- #127 feat(fb-36): search filter args (--media / --ingested-after / --doc-id + 4 existing)
- #126 feat(fb-35): verbatim fetch (chunk / doc / span)
- #125 feat(fb-34): output budget controls
- #124 feat(fb-33): streaming ask (ndjson delta)
- #123 chore: bump version 0.3.3 → 0.4.0
- #122 feat(fb-32): per-hit + per-citation freshness indicators
- #121 docs(skill): MCP-first guidance + CLI as fallback
v0.5.0 은 도그푸딩 피드백 일괄 batch — search/ingest 의 agent 친화 surface 6가지를 한 번에 추가. wire schema 변경은 모두 additive minor (기존 consumer 무영향, schema bump 없음).
신규 surface
kebab search--max-tokens N/--snippet-chars N/--cursor(fb-34) — 응답 크기 budget + pagination. 결과는search_response.v1envelope (기존 baresearch_hit.v1[]대체, 기존 호환 유지).--media md|pdf|image|audio|other/--ingested-after RFC3339/--doc-id ID(fb-36) + 기존 4종 노출 (--tag,--lang,--path-glob,--trust-min).--trace(fb-37) — pre-fusion lex/vec list + RRF union + per-stage timing 을 응답의 optionaltrace필드로 emit. 캐시 우회 (debug intent — fresh run 보장).- search hit 의
stale+indexed_at필드 (fb-32) —config.search.stale_threshold_days기준 stale 판정.
kebab ask--stream(fb-33) — token-by-token answer 를answer_event.v1ndjson 으로 stderr emit. 최종 answer 는 기존answer.v1로 stdout.
kebab fetch(신규 명령, fb-35)kebab fetch chunk <chunk_id> [--context N]— chunk verbatim + context.kebab fetch doc <doc_id>— doc 전체 verbatim.kebab fetch span <doc_id> --line-start N --line-end M— 라인 범위 verbatim.- 응답 schema
fetch_result.v1. PDF/audio span 은error.v1.code = span_not_supported.
kebab schemastats객체 4 신규 필드 (fb-37):media_breakdown(5키 패딩),lang_breakdown(NULL 키는"null"),index_bytes(sqlite + lancedb 디스크 합),stale_doc_count.
MCP
kebab__search- 위 search surface 거울: 7 신규 filter 입력 (fb-36), 3 budget 입력 (fb-34),
trace: bool입력 (fb-37).
TUI Search pane
t키 (fb-37) — TracePopup 모달, lex/vec/rrf 후보 + per-stage timing scroll.
호환성
- wire 모든 변경 additive minor — 기존
search_response.v1/schema.v1consumer 무영향.*.v2cascade 없음. - pre-1.0 minor convention — 0.x.y 의 minor bump 는 surface 추가 누적, breaking change 없음.
SearchOpts/SearchResponse/SearchFilters/IndexStats도메인 type 의 신��� 필드는#[serde(default)]로 옛 JSON deserialize 보존.
도그푸딩 가이드
# Trace 디버그 kebab search "rust async" --trace --json | jq .trace # KB 건강 점검 kebab schema --json | jq .stats # Filter 조합 kebab search "API" --media md --ingested-after 2026-01-01 --json # Verbatim fetch kebab fetch chunk c-abc123 --context 1 # Streaming ask kebab ask "how does X work?" --stream의존성 추가
timeworkspace dep 가kebab-mcp로 확장 (fb-36 RFC3339 파싱).Downloads
-
v0.4.0 Stable
released this
2026-05-09 03:42:43 +00:00 | 752 commits to main since this release변경사항 (since v0.3.2)
- #123 chore: bump version 0.3.3 → 0.4.0
- #122 feat(fb-32): per-hit + per-citation freshness indicators
- #121 docs(skill): MCP-first guidance + CLI as fallback
- #120 fix(progress): one draw per file — drop set_message in TTY AssetStarted
- #119 fix(progress): eliminate duplicate TTY frame per asset
- #118 fix(config): use XDG-standard paths on macOS (prevent DataOnly reset deleting config)
- #116 fix(progress): eliminate duplicate bar frame per asset in TTY mode
- #115 docs(tasks): mark fb-30 + fb-31 merged in INDEX.md
- #114 chore: bump version 0.3.2 → 0.3.3
- #113 feat(fb-26,fb-28): ingest log consistency + --readonly/--quiet flags + schema sync
Downloads