diff --git a/agent/skills/fsskills/source.go b/agent/skills/fsskills/source.go index 18a428d4..369df8b0 100644 --- a/agent/skills/fsskills/source.go +++ b/agent/skills/fsskills/source.go @@ -37,7 +37,7 @@ var ( var ( frontmatterRegex = regexp.MustCompile(`(?ms)\A^---\s*$(.+?)^---\s*$`) yamlKeyValueRegex = regexp.MustCompile(`(?m)^([\w-]+)\s*:\s*(?:["'](.+?)["']|(.+?))\s*$`) - yamlMetadataBlockRegex = regexp.MustCompile(`(?m)^metadata\s*:\s*$\n((?:[ \t]+\S.*\n?)+)`) + yamlMetadataBlockRegex = regexp.MustCompile(`(?m)^metadata\s*:\s*$\n((?:[ \t]+\S.*\n?|[ \t]*\n)+)`) yamlIndentedKeyValueRegex = regexp.MustCompile(`(?m)^\s+([\w-]+)\s*:\s*(?:["'](.+?)["']|(.+?))\s*$`) ) diff --git a/agent/skills/fsskills/source_test.go b/agent/skills/fsskills/source_test.go index a2a5763c..557024b4 100644 --- a/agent/skills/fsskills/source_test.go +++ b/agent/skills/fsskills/source_test.go @@ -706,3 +706,29 @@ func createSymlink(t *testing.T, linkPath, targetPath string) { t.Skipf("symlink creation unavailable: %v", err) } } + +func TestFileSource_MetadataWithBlankLine_KeepsAllKeys(t *testing.T) { + root := t.TempDir() + createSkillDirRaw(t, root, "gap-meta", strings.Join([]string{ + "---", + "name: gap-meta", + "description: d", + "metadata:", + " a: 1", + "", + " b: 2", + " c: 3", + "---", + "Body.", + }, "\n")) + + source := fsskills.NewSource(os.DirFS(root)) + loaded, err := source.Skills(t.Context()) + if err != nil { + t.Fatal(err) + } + m := loaded[0].Frontmatter.Metadata + if m["a"] != "1" || m["b"] != "2" || m["c"] != "3" { + t.Fatalf("metadata keys dropped after blank line: %#v", m) + } +}