feat: manage_skill + 全局 skills 目录
新增: - manage_skill: LLM 可调用的 Skill 创建/删除/列出工具 (High) - 全局 skills 支持: ~/.ias/skills/ 自动加载 - SkillRegistry::register_skill() 动态注册 - SkillRegistry::load() 三元加载: system → global → user manage_skill 操作: create: 写 SKILL.md + 执行脚本到 skills/<name>/ delete: 移除 skills/<name>/ list: 列出所有自定义 Skill 目前一共 9 个系统 Skills
This commit is contained in:
+2
-1
@@ -211,10 +211,11 @@ mod tests {
|
||||
));
|
||||
match result {
|
||||
Ok(registry) => {
|
||||
assert_eq!(registry.count(), 8, "应该有 8 个系统技能");
|
||||
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"));
|
||||
|
||||
+16
-1
@@ -34,7 +34,15 @@ impl SkillRegistry {
|
||||
registry.load_from_dir(system_dir, SkillSource::System, &mut errors);
|
||||
}
|
||||
|
||||
// 加载用户 skills
|
||||
// 加载全局 skills (~/.ias/skills/)
|
||||
if let Ok(home) = std::env::var("HOME") {
|
||||
let global_dir = format!("{}/.ias/skills", home);
|
||||
if Path::new(&global_dir).exists() {
|
||||
registry.load_from_dir(&global_dir, SkillSource::User, &mut errors);
|
||||
}
|
||||
}
|
||||
|
||||
// 加载用户 skills(项目目录)
|
||||
if Path::new(user_dir).exists() {
|
||||
registry.load_from_dir(user_dir, SkillSource::User, &mut errors);
|
||||
}
|
||||
@@ -110,6 +118,13 @@ impl SkillRegistry {
|
||||
self.skills.len()
|
||||
}
|
||||
|
||||
/// 动态注册一个技能(运行时添加,不持久化到文件)
|
||||
pub fn register_skill(&mut self, spec: SkillSpec, dir: std::path::PathBuf, execute_command: String) {
|
||||
let skill = Arc::new(Skill::new(spec, SkillSource::User, dir, execute_command));
|
||||
let name = skill.spec.name.clone();
|
||||
self.skills.insert(name, skill);
|
||||
}
|
||||
|
||||
// ─── 执行 ───
|
||||
|
||||
/// 执行技能(含审批流程)
|
||||
|
||||
Reference in New Issue
Block a user