feat: 导入的 skills 默认存到 ~/.ias/skills/

- Import/Delete 目标改为 ~/.ias/skills/(全局共享)
- SkillRegistry::load() 返回 (Self, Vec<String>) 替代 Result
  允许部分加载:格式不兼容的 skill 记录警告但不阻止加载
- 新增 global_skills_dir() 辅助函数
This commit is contained in:
2026-06-02 10:02:54 +08:00
parent e88f3240c4
commit f7ba23db94
13 changed files with 40 additions and 1570 deletions
+16 -21
View File
@@ -210,32 +210,27 @@ mod tests {
#[test]
fn test_load_all_system_skills() {
let rt = tokio::runtime::Runtime::new().unwrap();
let result = rt.block_on(crate::tools::registry::SkillRegistry::load(
let (registry, errors) = rt.block_on(crate::tools::registry::SkillRegistry::load(
"resources/skills",
"/nonexistent",
));
match result {
Ok(registry) => {
assert_eq!(registry.count(), 9, "应该有 9 个系统技能");
let names: Vec<&str> = registry.list_specs().iter().map(|s| s.name.as_str()).collect();
println!("已加载技能: {:?}", names);
assert!(names.contains(&"manage_memos"));
assert!(names.contains(&"manage_skill"));
assert!(names.contains(&"get_current_datetime"));
assert!(names.contains(&"query_weather"));
assert!(names.contains(&"search_web"));
assert!(names.contains(&"email"));
assert!(names.contains(&"execute_shell"));
assert!(names.contains(&"list_scheduled_tasks"));
assert!(names.contains(&"manage_scheduled_task"));
}
Err(errors) => {
for e in &errors {
eprintln!("加载失败: {}", e);
}
panic!("技能加载失败");
if !errors.is_empty() {
for e in &errors {
eprintln!("加载警告: {}", e);
}
}
assert_eq!(registry.count(), 9, "应该有 9 个系统技能");
let names: Vec<&str> = registry.list_specs().iter().map(|s| s.name.as_str()).collect();
println!("已加载技能: {:?}", names);
assert!(names.contains(&"manage_memos"));
assert!(names.contains(&"manage_skill"));
assert!(names.contains(&"get_current_datetime"));
assert!(names.contains(&"query_weather"));
assert!(names.contains(&"search_web"));
assert!(names.contains(&"email"));
assert!(names.contains(&"execute_shell"));
assert!(names.contains(&"list_scheduled_tasks"));
assert!(names.contains(&"manage_scheduled_task"));
}
#[test]