""" Skill Tool - Tool for Agent to load Skills on-demand Implements Progressive Disclosure (Level 2): Load full skill content when needed """ from typing import Any, Dict, List, Optional from .base import Tool, ToolResult from .skill_loader import SkillLoader class GetSkillTool(Tool): """Tool to get detailed information about a specific skill""" def __init__(self, skill_loader: SkillLoader): self.skill_loader = skill_loader @property def name(self) -> str: return "get_skill" @property def description(self) -> str: return "Get complete content and guidance for a specified skill, used for executing specific types of tasks" @property def parameters(self) -> Dict[str, Any]: return { "type": "object", "properties": { "skill_name": { "type": "string", "description": "Name of the skill to retrieve (use list_skills to view available skills)", } }, "required": ["skill_name"], } async def execute(self, skill_name: str) -> ToolResult: """Get detailed information about specified skill""" skill = self.skill_loader.get_skill(skill_name) if not skill: available = ", ".join(self.skill_loader.list_skills()) return ToolResult( success=False, content="", error=f"Skill '{skill_name}' does not exist. Available skills: {available}", ) # Return complete skill content result = skill.to_prompt() return ToolResult(success=True, content=result) def create_skill_tools( skills_dir: str = "./skills", ) -> tuple[List[Tool], Optional[SkillLoader]]: """ Create skill tool for Progressive Disclosure Only provides get_skill tool - the agent uses metadata in system prompt to know what skills are available, then loads them on-demand. Args: skills_dir: Skills directory path Returns: Tuple of (list of tools, skill loader) """ # Create skill loader loader = SkillLoader(skills_dir) # Discover and load skills skills = loader.discover_skills() print(f"✅ Discovered {len(skills)} Claude Skills") # Create only the get_skill tool (Progressive Disclosure Level 2) tools = [ GetSkillTool(loader), ] return tools, loader