Auftragsbuch: 'wartung/skills-text-kategorie-fix' angenommen (Ein-Klick-Gate)
This commit is contained in:
@@ -12,7 +12,12 @@ def get_overview() -> dict:
|
|||||||
return eigenleben.overview()
|
return eigenleben.overview()
|
||||||
|
|
||||||
|
|
||||||
@router.get("/eigenleben/skill/{skill_id}")
|
# :path — Kategorie-Skills haben einen Schrägstrich in der ID (autonomous-ai-agents/
|
||||||
|
# hermes-agent). Als normales {skill_id}-Segment matcht die Route dann nicht, der Request
|
||||||
|
# fällt in den SPA-Fallback (index.html, Status 200) und die UI zeigt „Konnte den
|
||||||
|
# Skill-Text nicht laden". Die Pfad-Validierung (max. eine Ebene, keine . /..) macht
|
||||||
|
# services.eigenleben.skill_text.
|
||||||
|
@router.get("/eigenleben/skill/{skill_id:path}")
|
||||||
def get_skill(skill_id: str) -> dict:
|
def get_skill(skill_id: str) -> dict:
|
||||||
text = eigenleben.skill_text(skill_id)
|
text = eigenleben.skill_text(skill_id)
|
||||||
if text is None:
|
if text is None:
|
||||||
|
|||||||
@@ -157,6 +157,10 @@ def skill_text(skill_id: str) -> str | None:
|
|||||||
"""Voller SKILL.md-Text („wie funktioniert der Skill") — max. Kategorie/Name, keine Pfad-Tricks."""
|
"""Voller SKILL.md-Text („wie funktioniert der Skill") — max. Kategorie/Name, keine Pfad-Tricks."""
|
||||||
if not re.fullmatch(r"[\w.-]+(/[\w.-]+)?", skill_id or ""):
|
if not re.fullmatch(r"[\w.-]+(/[\w.-]+)?", skill_id or ""):
|
||||||
return None
|
return None
|
||||||
|
# Das Zeichen-Set oben erlaubt „." und „.." als Segment — seit die Route ein
|
||||||
|
# :path-Parameter ist, hier explizit raus (kein Klettern über SKILLS_DIR hinaus).
|
||||||
|
if any(seg in (".", "..") for seg in skill_id.split("/")):
|
||||||
|
return None
|
||||||
md = SKILLS_DIR / skill_id / "SKILL.md"
|
md = SKILLS_DIR / skill_id / "SKILL.md"
|
||||||
if not md.is_file():
|
if not md.is_file():
|
||||||
return None
|
return None
|
||||||
|
|||||||
Reference in New Issue
Block a user