Module: SwarmSDK::V3::Skills::Loader
- Defined in:
- lib/swarm_sdk/v3/skills/loader.rb
Overview
Stateless utility for discovering skills and generating XML metadata
Skills are directories containing a SKILL.md file with YAML frontmatter. The loader scans configured directories, parses frontmatter, and produces XML metadata for injection into agent system prompts.
Constant Summary collapse
- SKILL_FILENAME =
"SKILL.md"
Class Method Summary collapse
-
.format_xml(manifests) ⇒ String
Format manifests as XML for system prompt injection.
-
.scan(directories) ⇒ Array<Manifest>
Scan directories recursively for SKILL.md files and return parsed manifests.
Class Method Details
.format_xml(manifests) ⇒ String
Format manifests as XML for system prompt injection
Produces an ‘<available_skills>` XML block following the agentskills.io standard. Values are HTML-escaped for safety.
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/swarm_sdk/v3/skills/loader.rb', line 58 def format_xml(manifests) return "" if manifests.empty? entries = manifests.map { |m| format_skill_entry(m) } skills_block = "<available_skills>\n#{entries.join("\n")}\n</available_skills>" <<~PROMPT.strip # Skills You have skills available. Each skill has a name, description, and a SKILL.md file location. When a user's task matches a skill description, activate the skill by reading its SKILL.md file to get full instructions. Do NOT read SKILL.md files unless you are actually activating a skill to perform a task. The name and description below are sufficient for listing or discussing available skills. #{skills_block} PROMPT end |
.scan(directories) ⇒ Array<Manifest>
Scan directories recursively for SKILL.md files and return parsed manifests
SKILL.md is the definitive marker for a skill directory per the agentskills.io spec. Uses Dir.glob with ‘**/SKILL.md` for fast recursive discovery. Skips missing directories and invalid YAML silently via DebugLog. Deduplicates by absolute SKILL.md path.
33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/swarm_sdk/v3/skills/loader.rb', line 33 def scan(directories) seen = {} Array(directories).each do |dir| next unless File.directory?(dir) Dir.glob(File.join(dir, "**", SKILL_FILENAME)).sort.each do |skill_path| parse_and_register(skill_path, seen) end end seen.values end |