From 90229ffeaff7b85c90b7ba35a8ed475f45f8dd02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E6=BD=AE?= Date: Fri, 17 Apr 2026 11:43:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96skill=E8=A6=86=E7=9B=96?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/multi_project_manager.py | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/utils/multi_project_manager.py b/utils/multi_project_manager.py index 5ca31bd..59bcf98 100644 --- a/utils/multi_project_manager.py +++ b/utils/multi_project_manager.py @@ -401,23 +401,30 @@ def _extract_skills_to_robot(bot_id: str, skills: List[str], project_path: Path) skills_target_dir.mkdir(parents=True, exist_ok=True) logger.info(f"Copying skills to {skills_target_dir}") + managed_skill_names = set() + for base_dir in skills_source_dirs: + if not base_dir.exists(): + continue + for item in base_dir.iterdir(): + if item.is_dir(): + managed_skill_names.add(item.name) + # 清理不在列表中的多余 skill 文件夹 expected_skill_names = {Path(skill.lstrip("@")).name for skill in skills} if skills_target_dir.exists(): for item in skills_target_dir.iterdir(): - if item.is_dir() and item.name not in expected_skill_names: - logger.info(f" Removing stale skill directory: {item}") + if not item.is_dir() or item.name in expected_skill_names: + continue + if item.name in managed_skill_names: + logger.info(f" Removing managed stale skill directory: {item}") shutil.rmtree(item) + else: + logger.info(f" Keeping unmanaged skill directory: {item}") for skill in skills: skill_name = Path(skill.lstrip("@")).name target_dir = skills_target_dir / skill_name - # 如果目标目录已存在,跳过复制 - if target_dir.exists(): - logger.info(f" Skill '{skill}' already exists in {target_dir}, skipping") - continue - source_dir = None if skill.startswith("@"): @@ -440,7 +447,7 @@ def _extract_skills_to_robot(bot_id: str, skills: List[str], project_path: Path) continue try: - shutil.copytree(source_dir, target_dir) - logger.info(f" Copied: {source_dir} -> {target_dir}") + shutil.copytree(source_dir, target_dir, dirs_exist_ok=True) + logger.info(f" Synced: {source_dir} -> {target_dir}") except Exception as e: logger.error(f" Failed to copy {source_dir}: {e}")