@dataclass(frozen=True)
class SkillSpec:
"""Metadata and content for one reusable ChemSpace skill."""
slug: str
title: str
summary: str
version: str
status: str
tags: tuple[str, ...]
keywords: tuple[str, ...]
depends_on: tuple[str, ...]
profiles: tuple[str, ...]
permissions: tuple[str, ...]
input_artifacts: tuple[ArtifactContract, ...]
output_artifacts: tuple[ArtifactContract, ...]
required_tools: tuple[str, ...]
optional_tools: tuple[str, ...]
artifact_outputs: tuple[str, ...]
example_prompts: tuple[str, ...]
skill_md: str
path: Path
def as_dict(self, *, include_content: bool = False) -> dict[str, Any]:
payload: dict[str, Any] = {
"slug": self.slug,
"title": self.title,
"summary": self.summary,
"version": self.version,
"status": self.status,
"tags": list(self.tags),
"keywords": list(self.keywords),
"depends_on": list(self.depends_on),
"profiles": list(self.profiles),
"permissions": list(self.permissions),
"input_artifacts": [contract.as_dict() for contract in self.input_artifacts],
"output_artifacts": [contract.as_dict() for contract in self.output_artifacts],
"required_tools": list(self.required_tools),
"optional_tools": list(self.optional_tools),
"artifact_outputs": list(self.artifact_outputs),
"example_prompts": list(self.example_prompts),
}
if include_content:
payload["skill_md"] = self.skill_md
return payload