crabtalk_runtime/skill/
registry.rs1use std::collections::BTreeMap;
4
5#[derive(Debug, Clone, Default)]
7pub struct SkillRegistry {
8 skills: Vec<Skill>,
9}
10
11impl SkillRegistry {
12 pub fn new() -> Self {
14 Self::default()
15 }
16
17 pub fn add(&mut self, skill: Skill) {
19 self.skills.push(skill);
20 }
21
22 pub fn upsert(&mut self, skill: Skill) {
24 self.skills.retain(|s| s.name != skill.name);
25 self.skills.push(skill);
26 }
27
28 pub fn skills(&self) -> Vec<&Skill> {
30 self.skills.iter().collect()
31 }
32
33 pub fn len(&self) -> usize {
35 self.skills.len()
36 }
37
38 pub fn is_empty(&self) -> bool {
40 self.skills.is_empty()
41 }
42
43 pub fn contains(&self, name: &str) -> bool {
45 self.skills.iter().any(|s| s.name == name)
46 }
47}
48
49#[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}