@@ -97,11 +97,16 @@ impl CommandIndex {
9797 }
9898 }
9999
100- fn load_command ( & self , path : & Path , name : & str , source : CommandSource ) -> Result < Command > {
100+ fn load_command ( & mut self , path : & Path , name : & str , source : CommandSource ) -> Result < Command > {
101101 let content = std:: fs:: read_to_string ( path) ?;
102102
103103 // Parse optional YAML frontmatter
104- let ( meta, content) = parse_frontmatter ( & content) ;
104+ let ( meta, content, warning) = parse_frontmatter ( & content) ;
105+
106+ // Record warning but still load the command
107+ if let Some ( warn) = warning {
108+ self . errors . push ( ( path. to_path_buf ( ) , warn) ) ;
109+ }
105110
106111 Ok ( Command {
107112 name : name. to_string ( ) ,
@@ -130,11 +135,12 @@ impl CommandIndex {
130135}
131136
132137/// Parse optional YAML frontmatter from markdown content
133- fn parse_frontmatter ( content : & str ) -> ( CommandMeta , String ) {
138+ /// Returns (metadata, body, optional_warning)
139+ fn parse_frontmatter ( content : & str ) -> ( CommandMeta , String , Option < String > ) {
134140 let trimmed = content. trim_start ( ) ;
135141
136142 if !trimmed. starts_with ( "---" ) {
137- return ( CommandMeta :: default ( ) , content. to_string ( ) ) ;
143+ return ( CommandMeta :: default ( ) , content. to_string ( ) , None ) ;
138144 }
139145
140146 // Find the closing ---
@@ -143,11 +149,15 @@ fn parse_frontmatter(content: &str) -> (CommandMeta, String) {
143149 let rest = & trimmed[ 3 + end_pos + 4 ..] . trim_start ( ) ;
144150
145151 match serde_yaml:: from_str ( yaml_content) {
146- Ok ( meta) => ( meta, rest. to_string ( ) ) ,
147- Err ( _) => ( CommandMeta :: default ( ) , content. to_string ( ) ) ,
152+ Ok ( meta) => ( meta, rest. to_string ( ) , None ) ,
153+ Err ( e) => (
154+ CommandMeta :: default ( ) ,
155+ content. to_string ( ) ,
156+ Some ( format ! ( "invalid YAML frontmatter: {}" , e) ) ,
157+ ) ,
148158 }
149159 } else {
150- ( CommandMeta :: default ( ) , content. to_string ( ) )
160+ ( CommandMeta :: default ( ) , content. to_string ( ) , None )
151161 }
152162}
153163
@@ -158,9 +168,10 @@ mod tests {
158168 #[ test]
159169 fn test_parse_frontmatter_no_frontmatter ( ) {
160170 let content = "Just some content" ;
161- let ( meta, body) = parse_frontmatter ( content) ;
171+ let ( meta, body, warning ) = parse_frontmatter ( content) ;
162172 assert ! ( meta. description. is_none( ) ) ;
163173 assert_eq ! ( body, "Just some content" ) ;
174+ assert ! ( warning. is_none( ) ) ;
164175 }
165176
166177 #[ test]
@@ -173,13 +184,14 @@ allowed_tools:
173184---
174185
175186The actual command content"# ;
176- let ( meta, body) = parse_frontmatter ( content) ;
187+ let ( meta, body, warning ) = parse_frontmatter ( content) ;
177188 assert_eq ! ( meta. description, Some ( "A test command" . to_string( ) ) ) ;
178189 assert_eq ! (
179190 meta. allowed_tools,
180191 Some ( vec![ "Read" . to_string( ) , "Grep" . to_string( ) ] )
181192 ) ;
182193 assert_eq ! ( body, "The actual command content" ) ;
194+ assert ! ( warning. is_none( ) ) ;
183195 }
184196
185197 #[ test]
0 commit comments