From 6826d49f010523e1d1c8d12f04778f8a080999ff Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 20 Aug 2026 12:00:09 +0800 Subject: [PATCH] =?UTF-8?q?fix(skill=5Fpack):=20ensure=5Forg=5Fskills=20?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=20pipelines/(=E4=BA=A7=E7=BA=BFcommon+?= =?UTF-8?q?=E8=A7=92=E8=89=B2skills)=20=E5=88=B0=E6=9C=BA=E6=9E=84?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 此前 ensure_org_skills 只复制 global+packs,产线技能(pipelines/{pid}/common/ 与 pipelines/{pid}/roles/{role}/)未同步到机构运行时目录,导致角色 agent 加载不到 角色技能。新增 _sync_tree 递归增量同步 + PIPELINES_DIR 常量。 --- pipeline_core/skill_pack.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/pipeline_core/skill_pack.py b/pipeline_core/skill_pack.py index c878379..ed8931d 100644 --- a/pipeline_core/skill_pack.py +++ b/pipeline_core/skill_pack.py @@ -32,6 +32,29 @@ def get_skills_base(): SKILLS_BASE = get_skills_base() PACKS_DIR = os.path.join(SKILLS_BASE, "packs") ALL_DIR = os.path.join(SKILLS_BASE, "global") # 公共技能 = 全局模板(源头) +PIPELINES_DIR = os.path.join(SKILLS_BASE, "pipelines") # 产线技能(common/roles),源头在 build.sh 6b 复制 + + +def _sync_tree(src_dir, dst_dir): + """递归增量同步目录树:src 里 dst 缺失的文件/子目录复制过去(不覆盖已存在的)。 + + 用于产线技能 pipelines/(结构是 pipelines/{pid}/common/{skill} 与 + pipelines/{pid}/roles/{role}/{skill},比 global/packs 深一层)。 + """ + if not os.path.isdir(src_dir): + return + os.makedirs(dst_dir, exist_ok=True) + for name in os.listdir(src_dir): + src = os.path.join(src_dir, name) + dst = os.path.join(dst_dir, name) + if os.path.isdir(src): + if not os.path.exists(dst): + shutil.copytree(src, dst) + else: + _sync_tree(src, dst) + else: + if not os.path.exists(dst): + shutil.copy2(src, dst) def get_org_skills_dir(workspace_base, org_id): @@ -81,6 +104,13 @@ def ensure_org_skills(workspace_base, org_id): shutil.copytree(src, dst) else: shutil.copy2(src, dst) + # 产线技能(pipelines/:common + roles):首次全量复制,之后递归增量同步 + org_pipelines = os.path.join(org_skills, "pipelines") + if not os.path.isdir(org_pipelines): + if os.path.isdir(PIPELINES_DIR): + shutil.copytree(PIPELINES_DIR, org_pipelines) + else: + _sync_tree(PIPELINES_DIR, org_pipelines) return org_skills