refactor(rename): kb crates → kebab — Cargo packages, folders, Rust modules
프로젝트 이름 `kb` → `kebab` rename 의 첫 단계. - workspace `Cargo.toml`: members `crates/kb-*` → `crates/kebab-*`, repository URL `altair823/kb` → `altair823/kebab`. - 18 crate 폴더 rename via `git mv` (history 보존). - 각 crate `Cargo.toml`: `name = "kb-*"` → `"kebab-*"`, path deps `../kb-*` → `../kebab-*`. - 모든 `.rs`: `kb_<id>` snake-case 모듈 path 18 개 (`kb_core`, `kb_config`, `kb_app`, `kb_cli`, `kb_eval`, `kb_search`, `kb_chunk`, `kb_normalize`, `kb_source_fs`, `kb_parse_md`, `kb_parse_types`, `kb_store_sqlite`, `kb_store_vector`, `kb_embed`, `kb_embed_local`, `kb_llm`, `kb_llm_local`, `kb_rag`) → `kebab_<id>` 일괄 sed (단어 경계 \\b 사용해 영어 문장 안의 "kb" 약어 미오염). CLI binary 이름 (`[[bin]] name = "kb"`), 환경변수 `KB_*`, XDG paths, tracing target, 그리고 docs sweep 은 다음 commit 에서. ## 검증 - `cargo check --workspace` clean — 모든 crate 빌드 통과 후 commit. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
99
crates/kebab-store-sqlite/tests/ingest_report_snapshot.rs
Normal file
99
crates/kebab-store-sqlite/tests/ingest_report_snapshot.rs
Normal file
@@ -0,0 +1,99 @@
|
||||
//! Snapshot test pinning the JSON wire form of `kebab_core::IngestReport`
|
||||
//! for an inline fixture run. The store crate doesn't (yet) write
|
||||
//! IngestReports — that's `kb-app`'s job — but the wire schema lives in
|
||||
//! `kb-core`, and we want a determinism pin that fails loudly if the
|
||||
//! shape drifts.
|
||||
//!
|
||||
//! Set `UPDATE_SNAPSHOTS=1` to re-bake the baseline.
|
||||
|
||||
use std::path::PathBuf;
|
||||
|
||||
use kebab_core::{
|
||||
AssetId, ChunkerVersion, DocumentId, IngestItem, IngestItemKind, IngestReport,
|
||||
ParserVersion, SourceScope, WorkspacePath,
|
||||
};
|
||||
use serde_json::Value;
|
||||
|
||||
fn baseline_path() -> PathBuf {
|
||||
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
|
||||
.join("snapshots")
|
||||
.join("ingest_report.snapshot.json")
|
||||
}
|
||||
|
||||
fn fixture_report() -> IngestReport {
|
||||
IngestReport {
|
||||
scope: SourceScope {
|
||||
root: PathBuf::from("/home/u/KB"),
|
||||
include: vec!["**/*.md".into()],
|
||||
exclude: vec![".git/**".into()],
|
||||
},
|
||||
scanned: 3,
|
||||
new: 2,
|
||||
updated: 1,
|
||||
skipped: 0,
|
||||
errors: 0,
|
||||
duration_ms: 187,
|
||||
items: Some(vec![
|
||||
IngestItem {
|
||||
kind: IngestItemKind::New,
|
||||
doc_id: Some(DocumentId("a".repeat(32))),
|
||||
doc_path: WorkspacePath::new("notes/alpha.md".into()).unwrap(),
|
||||
asset_id: Some(AssetId("a".repeat(32))),
|
||||
byte_len: Some(1234),
|
||||
block_count: Some(7),
|
||||
chunk_count: Some(3),
|
||||
parser_version: Some(ParserVersion("pulldown-cmark-0.x".into())),
|
||||
chunker_version: Some(ChunkerVersion("md-heading-v1".into())),
|
||||
warnings: vec![],
|
||||
error: None,
|
||||
},
|
||||
IngestItem {
|
||||
kind: IngestItemKind::Updated,
|
||||
doc_id: Some(DocumentId("b".repeat(32))),
|
||||
doc_path: WorkspacePath::new("notes/beta.md".into()).unwrap(),
|
||||
asset_id: Some(AssetId("b".repeat(32))),
|
||||
byte_len: Some(2048),
|
||||
block_count: Some(12),
|
||||
chunk_count: Some(5),
|
||||
parser_version: Some(ParserVersion("pulldown-cmark-0.x".into())),
|
||||
chunker_version: Some(ChunkerVersion("md-heading-v1".into())),
|
||||
warnings: vec!["malformed frontmatter".into()],
|
||||
error: None,
|
||||
},
|
||||
]),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ingest_report_wire_form_is_stable() {
|
||||
let report = fixture_report();
|
||||
let actual = serde_json::to_value(&report).unwrap();
|
||||
let baseline = match std::fs::read_to_string(baseline_path()) {
|
||||
Ok(s) => s,
|
||||
Err(_) if std::env::var("UPDATE_SNAPSHOTS").is_ok() => {
|
||||
std::fs::create_dir_all(baseline_path().parent().unwrap()).unwrap();
|
||||
let pretty = serde_json::to_string_pretty(&actual).unwrap();
|
||||
std::fs::write(baseline_path(), format!("{pretty}\n")).unwrap();
|
||||
return;
|
||||
}
|
||||
Err(e) => panic!(
|
||||
"missing baseline {}; run with UPDATE_SNAPSHOTS=1: {e}",
|
||||
baseline_path().display()
|
||||
),
|
||||
};
|
||||
let expected: Value = serde_json::from_str(&baseline).unwrap();
|
||||
if actual != expected {
|
||||
if std::env::var("UPDATE_SNAPSHOTS").is_ok() {
|
||||
let pretty = serde_json::to_string_pretty(&actual).unwrap();
|
||||
std::fs::write(baseline_path(), format!("{pretty}\n")).unwrap();
|
||||
return;
|
||||
}
|
||||
let pretty = serde_json::to_string_pretty(&actual).unwrap();
|
||||
panic!(
|
||||
"ingest_report snapshot drift\n\
|
||||
--- expected ({}) ---\n{baseline}\n\
|
||||
--- actual ---\n{pretty}",
|
||||
baseline_path().display()
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user