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