fix(market): 技能包名称解析——优先从 SKILL.md frontmatter 取 name,修复根目录 zip 名称变成 SKILL.md 的 bug
This commit is contained in:
+14
-1
@@ -452,6 +452,7 @@ async def admin_upload_bundle(
|
||||
def _parse_skill_bundle(data: bytes) -> dict:
|
||||
"""读取 zip 内 SKILL.md(frontmatter + content)→ bundle 结构。"""
|
||||
import zipfile
|
||||
import re
|
||||
from io import BytesIO
|
||||
try:
|
||||
with zipfile.ZipFile(BytesIO(data)) as zf:
|
||||
@@ -465,7 +466,19 @@ def _parse_skill_bundle(data: bytes) -> dict:
|
||||
if n.startswith("__MACOSX") or n.endswith("/") or n.endswith((".DS_Store", "Thumbs.db")):
|
||||
continue
|
||||
files[n] = zf.read(n).decode("utf-8", errors="replace")
|
||||
return {"name": skill_md.split("/SKILL.md")[0].strip("/"), "content": content, "files": files}
|
||||
# 从 frontmatter 解析技能名称(优先),其次用 zip 内目录名,最后用文件名
|
||||
name = ""
|
||||
fm_match = re.match(r"^---\s*\n(.*?)\n---", content, re.DOTALL)
|
||||
if fm_match:
|
||||
for line in fm_match.group(1).splitlines():
|
||||
if line.strip().startswith("name:"):
|
||||
name = line.split(":", 1)[1].strip().strip('"').strip("'")
|
||||
break
|
||||
if not name:
|
||||
# zip 路径形如 "my-skill/SKILL.md" → 取目录名 "my-skill";根目录 "SKILL.md" → 留空
|
||||
parts = skill_md.rsplit("/", 1)
|
||||
name = parts[0] if len(parts) > 1 else ""
|
||||
return {"name": name, "content": content, "files": files}
|
||||
except zipfile.BadZipFile:
|
||||
return {}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user