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:
@@ -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"));
|
||||
}
|
||||
}
|
||||
|
||||
25
docs/wire-schema/v1/reset_report.schema.json
Normal file
25
docs/wire-schema/v1/reset_report.schema.json
Normal 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 }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user