From a1b30c29feb40a3a4c563bbee7fc09dcc5b52288 Mon Sep 17 00:00:00 2001 From: Codebuddy Date: Sat, 15 Aug 2026 17:35:42 +0800 Subject: [PATCH] =?utf8?q?fix:=20=E4=B8=8A=E4=BC=A0/=E6=9B=B4=E6=96=B0=20s?= =?utf8?q?kill=20=E6=97=B6=E6=8C=89=20zip=20=E5=86=85=E5=A3=B0=E6=98=8E?= =?utf8?q?=E5=90=8D=E8=A6=86=E7=9B=96=E5=B7=B2=E5=AD=98=E5=9C=A8=E6=8A=80?= =?utf8?q?=E8=83=BD=EF=BC=8C=E9=81=BF=E5=85=8D=E4=BA=A7=E7=94=9F=E9=87=8D?= =?utf8?q?=E5=A4=8D=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit - _do_upload_skill 在解析出技能名后,若 zip 内 frontmatter name 对应一个已存在的技能目录, 则安装到该目录(覆盖)而非新建,修复“更新后列表出现两个同名技能”的问题 --- backend/app.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/backend/app.py b/backend/app.py index 2dc80ad..97671ec 100644 --- a/backend/app.py +++ b/backend/app.py @@ -957,6 +957,13 @@ def _do_upload_skill(body: dict): else: fallback = (body.get("filename") or "skill").rsplit(".", 1)[0] name = fallback + # 防重复:若 zip 内声明的 skill 名对应一个已存在的技能目录,则覆盖该目录, + # 而不是新建一个(避免“更新/上传”后列表出现两个同名技能)。 + zf_fm = _skill_name_from_zip(zf) + if zf_fm: + existing = SKILLS_ROOT / zf_fm + if existing.exists() and existing.resolve() != (SKILLS_ROOT / name).resolve(): + name = zf_fm if not _NAME_RE.match(name): zf.close() return JSONResponse({"error": f"skill 名称非法: {name}(仅允许字母数字 - _,长度 1-64)"}, status_code=400) -- 2.43.0