From 5e54656d45b9f2f7f8d6e956b5941c1887bbd88a Mon Sep 17 00:00:00 2001 From: YoVinchen Date: Fri, 21 Nov 2025 15:02:01 +0800 Subject: [PATCH] fix(skills): resolve third-party skills installation failure (#268) - Add skills_path field to Skill struct - Use skills_path to construct correct source path during installation - Fix installation for repos with custom skill subdirectories --- src-tauri/src/commands/skill.rs | 2 +- src-tauri/src/services/skill.rs | 20 +++++++++++++++++--- src/lib/api/skills.ts | 1 + 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src-tauri/src/commands/skill.rs b/src-tauri/src/commands/skill.rs index 64a5c18..fc5a544 100644 --- a/src-tauri/src/commands/skill.rs +++ b/src-tauri/src/commands/skill.rs @@ -62,7 +62,7 @@ pub async fn install_skill( .clone() .unwrap_or_else(|| "main".to_string()), enabled: true, - skills_path: None, // 安装时使用默认路径 + skills_path: skill.skills_path.clone(), // 使用技能记录的 skills_path }; service diff --git a/src-tauri/src/services/skill.rs b/src-tauri/src/services/skill.rs index 2af22b3..f32a186 100644 --- a/src-tauri/src/services/skill.rs +++ b/src-tauri/src/services/skill.rs @@ -32,6 +32,9 @@ pub struct Skill { /// 分支名称 #[serde(rename = "repoBranch")] pub repo_branch: Option, + /// 技能所在的子目录路径 (可选, 如 "skills") + #[serde(rename = "skillsPath")] + pub skills_path: Option, } /// 仓库配置 @@ -234,6 +237,7 @@ impl SkillService { repo_owner: Some(repo.owner.clone()), repo_name: Some(repo.name.clone()), repo_branch: Some(repo.branch.clone()), + skills_path: repo.skills_path.clone(), }); } Err(e) => log::warn!("解析 {} 元数据失败: {}", skill_md.display(), e), @@ -312,6 +316,7 @@ impl SkillService { repo_owner: None, repo_name: None, repo_branch: None, + skills_path: None, }); } } @@ -442,12 +447,21 @@ impl SkillService { .await .map_err(|_| anyhow!("下载仓库 {}/{} 超时", repo.owner, repo.name))??; - // 复制到安装目录 - let source = temp_dir.join(&directory); + // 根据 skills_path 确定源目录路径 + let source = if let Some(ref skills_path) = repo.skills_path { + // 如果指定了 skills_path,源路径为: temp_dir/skills_path/directory + temp_dir.join(skills_path.trim_matches('/')).join(&directory) + } else { + // 否则源路径为: temp_dir/directory + temp_dir.join(&directory) + }; if !source.exists() { let _ = fs::remove_dir_all(&temp_dir); - return Err(anyhow::anyhow!("技能目录不存在")); + return Err(anyhow::anyhow!( + "技能目录不存在: {}", + source.display() + )); } // 删除旧版本 diff --git a/src/lib/api/skills.ts b/src/lib/api/skills.ts index c0ddb87..a455401 100644 --- a/src/lib/api/skills.ts +++ b/src/lib/api/skills.ts @@ -10,6 +10,7 @@ export interface Skill { repoOwner?: string; repoName?: string; repoBranch?: string; + skillsPath?: string; // 技能所在的子目录路径,如 "skills" } export interface SkillRepo {