From 023b2c6145a235e47ca97e8c4a480885de2781c1 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Sun, 23 Aug 2026 21:43:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8A=80=E8=83=BD=20publish=20?= =?UTF-8?q?=E8=90=BD=E7=82=B9=E6=8C=89=20org=5Fid=20=E5=88=86=E6=B5=81?= =?UTF-8?q?=E2=80=94=E2=80=94=E7=BB=84=E7=BB=87=E8=87=AA=E6=9C=89=E8=A7=84?= =?UTF-8?q?=E8=8C=83=E8=90=BD=20org=20scope?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 机构技能层架构配套:技能提议 publish 时按提案 org_id 决定落点—— org_id='0'(ocai/平台)写 global(所有组织缺省共享);org_id≠'0' 写 skills/orgs/{org_id}/(组织自有开发规范,经 get_merged 的 org 缺省继承 + 组织覆盖机制,该组织项目角色可见且覆盖 ocai 同名)。 --- wwwroot/api/skill_proposals.dspy | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/wwwroot/api/skill_proposals.dspy b/wwwroot/api/skill_proposals.dspy index 4c65849..c2f2e34 100644 --- a/wwwroot/api/skill_proposals.dspy +++ b/wwwroot/api/skill_proposals.dspy @@ -91,9 +91,17 @@ async with DBPools().sqlorContext(dbname) as sor: return json.dumps({"success": False, "error": "提议缺少 name 或 content"}, ensure_ascii=False) - # 写 SKILL.md 到全局模板 skills/global/{name}/(单一技能树,所有机构共享读,无需同步副本) + # 写 SKILL.md 到技能树。落点按提案 org_id 分流(机构技能层架构): + # - org_id='0'(ocai 组织/平台缺省)→ skills/global/{name}/(平台通用规范,所有组织缺省共享) + # - org_id≠'0'(其他组织)→ skills/orgs/{org_id}/{name}/(组织自有开发规范, + # 经 get_merged 的 org 缺省继承 + 组织覆盖机制,该组织项目角色可见且覆盖 ocai 同名) from pipeline_core.skill_pack import get_skills_base - skill_dir = os.path.join(get_skills_base(), "global", name) + proposal_org = (getattr(r, 'org_id', '') or '').strip() or '0' + base = get_skills_base() + if proposal_org and proposal_org != '0': + skill_dir = os.path.join(base, "orgs", proposal_org, name) + else: + skill_dir = os.path.join(base, "global", name) os.makedirs(skill_dir, exist_ok=True) with open(os.path.join(skill_dir, "SKILL.md"), "w", encoding="utf-8") as f: f.write(content)