cut PR v0.18.0 전 마지막 정리. 사용자 요청: "전체 코드베이스를 깔끔하고 알아보기 쉽게".
## Workspace lints
- `Cargo.toml` 의 `[workspace.lints.clippy]` 에 `pedantic = "warn"` (priority -1) + 의도적 allow-list 추가:
- cast_possible_truncation / cast_possible_wrap / cast_sign_loss / cast_precision_loss — ONNX i64 / hash modular reduction 등 의도적 truncation.
- doc_markdown / missing_errors_doc / missing_panics_doc — cosmetic doc style.
- too_many_lines / module_name_repetitions / must_use_candidate / needless_pass_by_value / manual_let_else / items_after_statements / similar_names — informational only.
- format_collect / match_wildcard_for_single_variants / trivially_copy_pass_by_ref / unnecessary_wraps — intentional patterns (exhaustive match, future Result variants 등).
- default_trait_access — `Foo::default()` 가 idiomatic.
- float_cmp — NLI / RRF score 의 explicit threshold 비교 의도.
- struct_excessive_bools / case_sensitive_file_extension_comparisons / naive_bytecount / ignore_without_reason — domain-specific 의도.
- format_push_string / return_self_not_must_use / match_same_arms — builder / wire-label / hot-path 패턴 보존.
- needless_continue / used_underscore_binding / nonminimal_bool / unreadable_literal / many_single_char_names / doc_link_with_quotes / assigning_clones / collapsible_str_replace / trivial_regex / elidable_lifetime_names / range_plus_one / explicit_iter_loop / implicit_hasher / ref_option — remaining low-value style.
- 각 24 crate `Cargo.toml` 에 `[lints] workspace = true` 추가.
## Auto-fix
`cargo clippy --workspace --all-targets --fix` 적용 — 128 files changed, 552 insertions / 472 deletions. 주로:
- uninlined_format_args (~18): `format!("{}", x)` → `format!("{x}")`.
- redundant_closure_for_method_calls (~33): `.map(|x| x.foo())` → `.map(T::foo)`.
- 그 외 mechanical refactor.
## 검증
- `cargo clippy --workspace --all-targets -j 1 -- -D warnings` clean (pedantic + 모든 lint group).
- `cargo test --workspace --no-fail-fast -j 1` — **1293 tests pass + 1 pre-existing flaky fail** (`kebab-mcp::tools_call_ask_multi_hop::ask_tool_routes_multi_hop_true_to_decompose_first`, HOTFIX candidate, cleanup 무관). 회귀 0.
Wire 영향: 없음.
Behavior 영향: 없음 (mechanical refactor only).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
101 lines
2.5 KiB
Rust
101 lines
2.5 KiB
Rust
//! Integration: spawn `kebab ingest-stdin --title X` with stdin pipe.
|
|
|
|
use std::fs;
|
|
use std::io::Write;
|
|
use std::process::{Command, Stdio};
|
|
|
|
#[test]
|
|
fn cli_ingest_stdin_emits_ingest_report_v1() {
|
|
let dir = tempfile::tempdir().unwrap();
|
|
let workspace = dir.path().join("notes");
|
|
let data = dir.path().join("data");
|
|
fs::create_dir_all(&workspace).unwrap();
|
|
fs::create_dir_all(&data).unwrap();
|
|
|
|
let cfg_path = dir.path().join("config.toml");
|
|
fs::write(
|
|
&cfg_path,
|
|
format!(
|
|
r#"schema_version = 1
|
|
|
|
[workspace]
|
|
root = "{workspace}"
|
|
exclude = [".git/**"]
|
|
|
|
[storage]
|
|
data_dir = "{data}"
|
|
sqlite = "{{data_dir}}/kebab.sqlite"
|
|
vector_dir = "{{data_dir}}/lancedb"
|
|
asset_dir = "{{data_dir}}/assets"
|
|
artifact_dir = "{{data_dir}}/artifacts"
|
|
model_dir = "{{data_dir}}/models"
|
|
runs_dir = "{{data_dir}}/runs"
|
|
copy_threshold_mb = 100
|
|
|
|
[indexing]
|
|
max_parallel_extractors = 2
|
|
max_parallel_embeddings = 1
|
|
watch_filesystem = false
|
|
|
|
[chunking]
|
|
target_tokens = 500
|
|
overlap_tokens = 80
|
|
respect_markdown_headings = true
|
|
chunker_version = "md-heading-v1"
|
|
|
|
[models.embedding]
|
|
provider = "none"
|
|
model = "none"
|
|
version = "v0"
|
|
dimensions = 0
|
|
batch_size = 1
|
|
|
|
[models.llm]
|
|
provider = "ollama"
|
|
model = "none"
|
|
context_tokens = 4096
|
|
endpoint = "http://127.0.0.1:11434"
|
|
temperature = 0.0
|
|
seed = 0
|
|
|
|
[search]
|
|
default_k = 10
|
|
hybrid_fusion = "rrf"
|
|
rrf_k = 60
|
|
snippet_chars = 220
|
|
|
|
[rag]
|
|
prompt_template_version = "rag-v1"
|
|
score_gate = 0.30
|
|
explain_default = false
|
|
max_context_tokens = 8000
|
|
"#,
|
|
workspace = workspace.display(),
|
|
data = data.display(),
|
|
),
|
|
).unwrap();
|
|
|
|
let bin = env!("CARGO_BIN_EXE_kebab");
|
|
let mut child = Command::new(bin)
|
|
.args([
|
|
"--json", "--config", cfg_path.to_str().unwrap(),
|
|
"ingest-stdin", "--title", "X",
|
|
])
|
|
.stdin(Stdio::piped())
|
|
.stdout(Stdio::piped())
|
|
.stderr(Stdio::piped())
|
|
.spawn()
|
|
.unwrap();
|
|
{
|
|
let stdin = child.stdin.as_mut().unwrap();
|
|
stdin.write_all(b"## Body\n\nbody text.\n").unwrap();
|
|
}
|
|
let out = child.wait_with_output().unwrap();
|
|
assert!(out.status.success(), "stderr: {}", String::from_utf8_lossy(&out.stderr));
|
|
|
|
let stdout = String::from_utf8_lossy(&out.stdout);
|
|
let v: serde_json::Value = serde_json::from_str(stdout.trim()).unwrap();
|
|
assert_eq!(v.get("schema_version").and_then(|s| s.as_str()), Some("ingest_report.v1"));
|
|
assert_eq!(v.get("new").and_then(serde_json::Value::as_u64), Some(1));
|
|
}
|