@@ -5,7 +5,10 @@ use crate::skills;
55pub ( super ) fn run_doctor ( workspace : PathBuf , json : bool , strict : bool ) -> anyhow:: Result < ( ) > {
66 let report = skills:: doctor ( & workspace) ?;
77 if json {
8- println ! ( "{}" , serde_json:: to_string_pretty( & report) ?) ;
8+ println ! (
9+ "{}" ,
10+ serde_json:: to_string_pretty( & build_skills_doctor_json( & report) ?) ?
11+ ) ;
912 } else {
1013 println ! ( "discovered_skills: {}" , report. discovered_count) ;
1114 if report. issues . is_empty ( ) {
@@ -38,3 +41,51 @@ pub(super) fn run_doctor(workspace: PathBuf, json: bool, strict: bool) -> anyhow
3841 }
3942 Ok ( ( ) )
4043}
44+
45+ fn build_skills_doctor_json (
46+ report : & skills:: SkillsDoctorReport ,
47+ ) -> anyhow:: Result < serde_json:: Value > {
48+ Ok ( serde_json:: to_value ( report) ?)
49+ }
50+
51+ #[ cfg( test) ]
52+ mod tests {
53+ use super :: * ;
54+ use crate :: skills:: { SkillsDoctorIssue , SkillsDoctorLevel , SkillsDoctorReport } ;
55+ use serde_json:: json;
56+
57+ #[ test]
58+ fn build_skills_doctor_json_keeps_expected_shape_and_omits_missing_paths ( ) {
59+ let report = SkillsDoctorReport {
60+ ok : false ,
61+ discovered_count : 2 ,
62+ issues : vec ! [
63+ SkillsDoctorIssue {
64+ level: SkillsDoctorLevel :: Warn ,
65+ id: "warn.test" . to_string( ) ,
66+ message: "warning" . to_string( ) ,
67+ path: None ,
68+ } ,
69+ SkillsDoctorIssue {
70+ level: SkillsDoctorLevel :: Error ,
71+ id: "error.test" . to_string( ) ,
72+ message: "error" . to_string( ) ,
73+ path: Some ( "/tmp/skill.toml" . to_string( ) ) ,
74+ } ,
75+ ] ,
76+ } ;
77+
78+ let out = build_skills_doctor_json ( & report) . unwrap ( ) ;
79+ assert_eq ! (
80+ out,
81+ json!( {
82+ "ok" : false ,
83+ "discovered_count" : 2 ,
84+ "issues" : [
85+ { "level" : "warn" , "id" : "warn.test" , "message" : "warning" } ,
86+ { "level" : "error" , "id" : "error.test" , "message" : "error" , "path" : "/tmp/skill.toml" } ,
87+ ]
88+ } )
89+ ) ;
90+ }
91+ }
0 commit comments