use crate::server::skills::BundledSkill;
pub fn library_bundled_skills() -> Vec<BundledSkill> {
vec![
BundledSkill {
name: "grep",
body: include_str!("bundled_skills/grep.md"),
},
BundledSkill {
name: "read_source",
body: include_str!("bundled_skills/read_source.md"),
},
BundledSkill {
name: "list_source",
body: include_str!("bundled_skills/list_source.md"),
},
BundledSkill {
name: "github_issues",
body: include_str!("bundled_skills/github_issues.md"),
},
BundledSkill {
name: "repo_management",
body: include_str!("bundled_skills/repo_management.md"),
},
]
}
#[cfg(test)]
mod tests {
use super::*;
use crate::server::skills::parse_skill;
use std::path::PathBuf;
#[test]
fn library_bundled_skills_returns_five_skills() {
let skills = library_bundled_skills();
assert_eq!(skills.len(), 5);
let names: Vec<&str> = skills.iter().map(|s| s.name).collect();
assert_eq!(
names,
vec![
"grep",
"read_source",
"list_source",
"github_issues",
"repo_management",
]
);
}
#[test]
fn bundled_skill_names_are_unique() {
let skills = library_bundled_skills();
let mut names: Vec<&str> = skills.iter().map(|s| s.name).collect();
names.sort();
let before = names.len();
names.dedup();
assert_eq!(before, names.len(), "duplicate bundled skill name");
}
#[test]
fn each_framework_bundled_skill_parses() {
for skill in library_bundled_skills() {
let path = PathBuf::from(format!("bundled_skills/{}.md", skill.name));
let (fm, body) = parse_skill(skill.body, &path).unwrap_or_else(|err| {
panic!("bundled skill `{}` failed to parse: {err}", skill.name)
});
assert!(
!fm.name.is_empty(),
"bundled skill `{}` has empty frontmatter name",
skill.name
);
assert!(
!fm.description.is_empty(),
"bundled skill `{}` has empty frontmatter description",
skill.name
);
assert!(
!body.trim().is_empty(),
"bundled skill `{}` has empty body after frontmatter",
skill.name
);
}
}
#[test]
fn each_bundled_skill_frontmatter_name_matches_lookup_key() {
for skill in library_bundled_skills() {
let path = PathBuf::from(format!("bundled_skills/{}.md", skill.name));
let (fm, _body) = parse_skill(skill.body, &path).unwrap();
assert_eq!(
fm.name, skill.name,
"lookup key `{}` does not match frontmatter name `{}`",
skill.name, fm.name
);
}
}
#[test]
fn bundled_skills_fit_under_size_limit() {
const HARD_LIMIT: usize = 16 * 1024;
for skill in library_bundled_skills() {
let size = skill.body.len();
assert!(
size <= HARD_LIMIT,
"bundled skill `{}` is {size} bytes, exceeds {HARD_LIMIT} byte hard limit",
skill.name
);
}
}
}