Feature Description
Implement Option A from #101: the canonical registry ID is category/skill_name derived from the skill folder path; manifest.yaml name must match.
Behavior
- On
SkillLoader.load_skill(...), after resolving the skill directory and loading manifest.yaml, compute:
expected_id = f"{skill_dir.parent.name}/{skill_dir.name}"
actual = manifest.get("name", "")
- If
actual != expected_id: warn in v1 (deprecation period) or fail once legacy skills are migrated (see migration issue).
- Inject or expose
registry_id on the returned bundle (optional) so callers don't re-derive from YAML alone.
Also update
Out of scope
Rationale
Three identity sources today (folder path, CLI list ID, LLM tool name from manifest["name"]) still disagree for legacy skills (office/pdf_form_filler, defi/evm_tx_handler). #101 RFC should close with this as the v1 contract; loader validation prevents new drift and gives contributors a clear error at load time.
Implementation Idea
- Add
_expected_registry_id(resolved_path: Path) -> str in loader.py.
- Call after YAML load; use
warnings.warn(..., SkillwareIdentityWarning) initially.
- Flip to
ValueError or ImportError after migration issue merges.
- Document registry ID vs provider tool name (slashes vs underscores) in
docs/usage/agent_loops.md if not already complete.
- Depends on / coordinates with legacy manifest migration issue.
Blocks: consistent example tool dispatch (#178); unblocks alias design (#12).
Related: #101 (decision), migration issue below.
Feature Description
Implement Option A from #101: the canonical registry ID is
category/skill_namederived from the skill folder path;manifest.yamlnamemust match.Behavior
SkillLoader.load_skill(...), after resolving the skill directory and loadingmanifest.yaml, compute:actual != expected_id: warn in v1 (deprecation period) or fail once legacy skills are migrated (see migration issue).registry_idon the returned bundle (optional) so callers don't re-derive from YAML alone.Also update
templates/python_skill/manifest.yaml—name: "<category>/<skill_name>"placeholderCONTRIBUTING.md— one paragraph decision record (Option A); link [RFC]: Skill identity in manifest.yaml — composite name vs category + skill_name #101tests/test_loader.pyfor match, mismatch, and missingnameOut of scope
category+skill_namemanifest fields (Option B)load_skill_by_idaliases ([Feat]: Implement Skill Library Mapping and Simplified Import Mechanism #12)Rationale
Three identity sources today (folder path, CLI list ID, LLM tool name from
manifest["name"]) still disagree for legacy skills (office/pdf_form_filler,defi/evm_tx_handler). #101 RFC should close with this as the v1 contract; loader validation prevents new drift and gives contributors a clear error at load time.Implementation Idea
_expected_registry_id(resolved_path: Path) -> strinloader.py.warnings.warn(..., SkillwareIdentityWarning)initially.ValueErrororImportErrorafter migration issue merges.docs/usage/agent_loops.mdif not already complete.Blocks: consistent example tool dispatch (#178); unblocks alias design (#12).
Related: #101 (decision), migration issue below.