models
This commit is contained in:
@@ -1,11 +1,20 @@
|
||||
from collections.abc import Iterable
|
||||
from collections.abc import Mapping
|
||||
from dataclasses import dataclass
|
||||
from fnmatch import fnmatch
|
||||
from importlib.resources.abc import Traversable
|
||||
from itertools import groupby
|
||||
from itertools import starmap
|
||||
from pathlib import PurePosixPath
|
||||
from typing import Self
|
||||
|
||||
from personal_mcp.registry.models.common import ReferenceEntry
|
||||
from personal_mcp.registry.models.skill import SkillFrontmatter
|
||||
from personal_mcp.registry.models.skill import StoredSkill
|
||||
from personal_mcp.registry.models.skill import StoredSkillReference
|
||||
from personal_mcp.skills.document_loader import _reference_id_from_filename
|
||||
from personal_mcp.skills.document_loader import _title_from_reference_filename
|
||||
|
||||
from .document import MarkdownDocument
|
||||
|
||||
|
||||
@@ -49,3 +58,50 @@ def group_skill_paths(docs: Iterable[MarkdownDocument]) -> dict[str, set[Markdow
|
||||
)
|
||||
grouped = groupby(s, key=lambda doc: doc.skill_slug)
|
||||
return {k: set(g) for k, g in grouped if k}
|
||||
|
||||
|
||||
def _discover_reference_entries(bundle: SkillFilesBundle) -> dict[str, ReferenceEntry]:
|
||||
discovered: dict[str, ReferenceEntry] = {}
|
||||
for reference_doc in bundle.references:
|
||||
ref_id = _reference_id_from_filename(reference_doc.relpath.name)
|
||||
if ref_id is None:
|
||||
continue
|
||||
discovered[ref_id] = ReferenceEntry(
|
||||
path=PurePosixPath("references").joinpath(reference_doc.relpath.name).as_posix(),
|
||||
title=_title_from_reference_filename(reference_doc.relpath.name),
|
||||
)
|
||||
return discovered
|
||||
|
||||
|
||||
def build_stored_skill(
|
||||
*,
|
||||
bundle: SkillFilesBundle,
|
||||
docs_by_relpath: Mapping[PurePosixPath, MarkdownDocument],
|
||||
) -> StoredSkill:
|
||||
frontmatter = SkillFrontmatter.from_raw_yaml(bundle.skill.frontmatter)
|
||||
metadata = frontmatter.x_personal_mcp
|
||||
merged_entries = _discover_reference_entries(bundle)
|
||||
merged_entries.update(dict(metadata.references))
|
||||
|
||||
references: dict[str, StoredSkillReference] = {}
|
||||
for ref_id, entry in sorted(merged_entries.items()):
|
||||
ref_relpath = PurePosixPath("skills").joinpath(bundle.slug).joinpath(entry.path)
|
||||
if ref_relpath not in docs_by_relpath:
|
||||
raise KeyError(f"reference document not found for '{metadata.id}:{ref_id}' at {ref_relpath.as_posix()}")
|
||||
ref_doc = docs_by_relpath[ref_relpath]
|
||||
references[ref_id] = StoredSkillReference(
|
||||
ref_id=ref_id,
|
||||
relpath=ref_relpath,
|
||||
content=ref_doc.content,
|
||||
entry=entry,
|
||||
)
|
||||
|
||||
return StoredSkill.model_validate(
|
||||
{
|
||||
"skill_id": metadata.id,
|
||||
"relpath": bundle.skill.relpath,
|
||||
"content": bundle.skill.content,
|
||||
"frontmatter": frontmatter,
|
||||
"references": references,
|
||||
}
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user