| 180 | } |
| 181 | |
| 182 | fn discover_skills(base: &Path) -> Vec<SkillInfo> { |
| 183 | let mut by_name: HashMap<String, SkillInfo> = HashMap::new(); |
| 184 | for root in collect_skill_roots(base) { |
| 185 | for skill in scan_skill_root(&root) { |
| 186 | by_name.insert(skill.name.clone(), skill); |
| 187 | } |
| 188 | } |
| 189 | |
| 190 | let mut skills: Vec<SkillInfo> = by_name.into_values().collect(); |
| 191 | skills.sort_by(|a, b| a.name.cmp(&b.name)); |
| 192 | skills |
| 193 | } |
| 194 | |
| 195 | fn sample_skill_files(skill: &SkillInfo, limit: usize) -> Vec<PathBuf> { |
| 196 | let Some(base_dir) = skill.location.parent() else { |