Skip to main content

crabtalk_runtime/skill/
registry.rs

1//! Crabtalk skill registry — skill storage and lookup.
2
3use std::collections::BTreeMap;
4
5/// A registry of loaded skills.
6#[derive(Debug, Clone, Default)]
7pub struct SkillRegistry {
8    skills: Vec<Skill>,
9}
10
11impl SkillRegistry {
12    /// Create an empty registry.
13    pub fn new() -> Self {
14        Self::default()
15    }
16
17    /// Add a skill to the registry.
18    pub fn add(&mut self, skill: Skill) {
19        self.skills.push(skill);
20    }
21
22    /// Add or replace a skill by name.
23    pub fn upsert(&mut self, skill: Skill) {
24        self.skills.retain(|s| s.name != skill.name);
25        self.skills.push(skill);
26    }
27
28    /// Get all loaded skills.
29    pub fn skills(&self) -> Vec<&Skill> {
30        self.skills.iter().collect()
31    }
32
33    /// Number of loaded skills.
34    pub fn len(&self) -> usize {
35        self.skills.len()
36    }
37
38    /// Whether the registry has no skills.
39    pub fn is_empty(&self) -> bool {
40        self.skills.is_empty()
41    }
42
43    /// Whether a skill with the given name is already registered.
44    pub fn contains(&self, name: &str) -> bool {
45        self.skills.iter().any(|s| s.name == name)
46    }
47}
48
49/// A named unit of agent behavior (agentskills.io format).
50#[derive(Debug, Clone)]
51pub struct Skill {
52    pub name: String,
53    pub description: String,
54    pub license: Option<String>,
55    pub compatibility: Option<String>,
56    pub metadata: BTreeMap<String, String>,
57    pub allowed_tools: Vec<String>,
58    pub body: String,
59}