feat(bootstrap): add agentguard builtin skill

Signed-off-by: dongmucat <1127093059@qq.com>
This commit is contained in:
dongmucat 2026-06-15 14:45:09 +08:00
parent 4776550391
commit abdad25df3
3 changed files with 57 additions and 0 deletions

View file

@ -4,6 +4,11 @@
"slug": "skillhub-hello",
"version": "1.0.0",
"url": "https://bjcdn.openstorage.cn/aicontest/2026-06-11/f8a59af3-30d4-4031-80f6-ebff74b05195.zip"
},
{
"slug": "agentguard",
"version": "1.1",
"url": "https://bjcdn.openstorage.cn/aicontest/2026-06-12/9d063bc7-223a-4762-adeb-305c268aa29e.zip"
}
]
}

View file

@ -50,6 +50,9 @@ public class SkillMetadataParser {
String name = extractRequiredField(frontmatter, "name");
String description = extractRequiredField(frontmatter, "description");
String version = extractOptionalField(frontmatter, "version");
if (version == null) {
version = extractNestedOptionalField(frontmatter, "metadata", "version");
}
return new SkillMetadata(name, description, version, body, frontmatter);
}
@ -122,4 +125,13 @@ public class SkillMetadataParser {
Object value = frontmatter.get(fieldName);
return value == null ? null : value.toString();
}
private String extractNestedOptionalField(Map<String, Object> frontmatter, String objectFieldName, String fieldName) {
Object nestedValue = frontmatter.get(objectFieldName);
if (!(nestedValue instanceof Map<?, ?> nestedMap)) {
return null;
}
Object value = nestedMap.get(fieldName);
return value == null ? null : value.toString();
}
}

View file

@ -123,6 +123,46 @@ class SkillMetadataParserTest {
assertNull(metadata.version());
}
@Test
void testUsesMetadataVersionWhenTopLevelVersionIsMissing() {
String content = """
---
name: agentguard
description: Agent security guard
metadata:
author: GoPlusSecurity
version: "1.1"
---
Body
""";
SkillMetadata metadata = parser.parse(content);
assertEquals("agentguard", metadata.name());
assertEquals("Agent security guard", metadata.description());
assertEquals("1.1", metadata.version());
}
@Test
void testTopLevelVersionTakesPrecedenceOverMetadataVersion() {
String content = """
---
name: versioned-skill
description: Prefer top-level version
version: 2.0.0
metadata:
version: "1.1"
---
Body
""";
SkillMetadata metadata = parser.parse(content);
assertEquals("versioned-skill", metadata.name());
assertEquals("Prefer top-level version", metadata.description());
assertEquals("2.0.0", metadata.version());
}
@Test
void testFallsBackToLooseFrontmatterParsingWhenYamlSyntaxIsNotStrict() {
String content = """