feat(cli/wire): add reset_report.v1 schema + wire_reset helper

JSON Schema 7 frozen surface for `kebab reset --json`. Mirrors the
ResetReport struct from kebab-app. Test asserts schema_version tag,
scope serialization (snake_case enum), removed_paths array, and
embedding_rows_truncated u64.

p9-fb-06 task 3.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-02 18:28:24 +00:00
parent c3a48a88a5
commit 233b708624
2 changed files with 50 additions and 0 deletions

View File

@@ -108,6 +108,12 @@ pub fn wire_doctor(d: &DoctorReport) -> Value {
tag_object(v, "doctor.v1")
}
/// Wrap a [`kebab_app::ResetReport`] as `reset_report.v1`.
pub fn wire_reset(r: &kebab_app::ResetReport) -> Value {
let v = serde_json::to_value(r).expect("ResetReport serializes");
tag_object(v, "reset_report.v1")
}
#[cfg(test)]
mod tests {
use super::*;
@@ -172,4 +178,23 @@ mod tests {
let tagged = tag_object(v, "x.v1");
assert_eq!(schema_of(&tagged), Some("x.v1"));
}
#[test]
fn reset_wrapper_tags_schema_version_and_serializes_scope() {
let r = kebab_app::ResetReport {
scope: kebab_app::ResetScope::DataOnly,
removed_paths: vec![std::path::PathBuf::from("/tmp/x")],
embedding_rows_truncated: 0,
};
let v = wire_reset(&r);
assert_eq!(schema_of(&v), Some("reset_report.v1"));
assert_eq!(v.get("scope").and_then(Value::as_str), Some("data_only"));
assert_eq!(
v.get("embedding_rows_truncated").and_then(Value::as_u64),
Some(0)
);
let paths = v.get("removed_paths").and_then(Value::as_array).unwrap();
assert_eq!(paths.len(), 1);
assert_eq!(paths[0].as_str(), Some("/tmp/x"));
}
}

View File

@@ -0,0 +1,25 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://kb.local/wire/v1/reset_report.schema.json",
"title": "ResetReport v1",
"description": "Result of `kebab reset` — what scope was requested and what was actually removed off-disk. A path that did not exist before the call is omitted (the wipe is idempotent).",
"type": "object",
"required": [
"schema_version",
"scope",
"removed_paths",
"embedding_rows_truncated"
],
"properties": {
"schema_version": { "const": "reset_report.v1" },
"scope": {
"type": "string",
"enum": ["all", "data_only", "vector_only", "config_only"]
},
"removed_paths": {
"type": "array",
"items": { "type": "string" }
},
"embedding_rows_truncated": { "type": "integer", "minimum": 0 }
}
}