"""Skill Manifest:将现有 Skill 记录转换为运行时无 IO 描述。""" from __future__ import annotations from dataclasses import dataclass from typing import Protocol class SkillLike(Protocol): name: str description: str trigger: str prompt_fragment: str risk_level: str status: str tool_bindings_json: str @dataclass(frozen=True) class SkillManifest: """一次运行需要的技能声明。""" name: str description: str triggers: tuple[str, ...] prompt: str allowed_tools: tuple[str, ...] risk_level: str def parse_skill_manifest(skill: SkillLike, tool_bindings: list[str]) -> SkillManifest: """从既有 Skill ORM 构建 manifest,避免改变数据库结构。""" return SkillManifest( name=skill.name, description=skill.description, triggers=tuple(item.strip() for item in skill.trigger.split(",") if item.strip()), prompt=skill.prompt_fragment, allowed_tools=tuple(tool_bindings), risk_level=skill.risk_level, )