§
    ‰eîi Ó  ã                   óð
  — U d Z ddlZddlZddlmZmZ ddlZddlZddlm	Z	 ddl
mZ ddlmZmZmZmZmZmZ ddlmZmZ  ej        e¦  «        Z e¦   «         Zedz  Zd	Zd
ZddddœZ ej        d¦  «        Z e d¦  «        Z! e h d£¦  «        Z"da#dee$e$f         fd„Z% G d„ de$e	¦  «        Z&g d¢Z'e(e)d<   d‰d„Z*dee$ef         de+fd„Z,dedee$         fd„Z-dee$ef         deee$         ee$         f         fd„Z.dee$ef         dee$ef         fd„Z/	 dŠdee$ef         dee$         dz  deee$ef                  fd „Z0d!e$d"eee$ef                  dee$ef         fd#„Z1de+fd$„Z2de$fd%„Z3	 dŠd&e$d'ee$e$f         dz  de+fd(„Z4dd)œd*eee$ef                  d+ee$ef         d'ee$e$f         dz  dee$         fd,„Z5de$fd-„Z6	 dŠd.e&d/ee$         d0e$dz  de$dz  fd1„Z7de+fd2„Z8d3e$deee$ef         e$f         fd4„Z9d5edee$         fd6„Z:dee$         fd7„Z;dee$         fd8„Z<de$fd9„Z=dŠd:e$d;e$de+fd<„Z>d=d>œd?e+deee$ef                  fd@„Z?deee$ef                  deee$ef                  fdA„Z@dBedee$         fdC„ZAd‹dDe$dEe$de$fdF„ZBdGddHœdIedJe$dKe$dLe+dMe$dz  de$fdN„ZC	 	 	 dŒd:e$dOe$dEe$dLe+de$f
dP„ZDedQk    �ro	  eEdR¦  «          eEdS¦  «          eEdT¦  «          ejF         eB¦   «         ¦  «        ZGeGdU         rÁ eEdVeGdW         › dX eHeG I                    dYg ¦  «        ¦  «        › dZ�¦  «          eEd[eG I                    dYg ¦  «        › �¦  «          eEd\¦  «         eGd         dd]…         D ]MZJeJ I                    dD¦  «        rd^eJdD         › d_�nd`ZK eEdaeK› eJd:         › dbeJdc         ddd…         › de�¦  «         ŒNn eEdfeGdg         › �¦  «          eEdh¦  «          ejF         eDdi¦  «        ¦  «        ZGeGdU         r‡ eEdjeGd:         › �¦  «          eEdkeG I                    dcdl¦  «        ddm…         › de�¦  «          eEdn eHeGd3         ¦  «        › do�¦  «         eG I                    dp¦  «        r eEdqeGdp         › �¦  «         n eEdfeGdg         › �¦  «          eEdr¦  «          ejF         eDdids¦  «        ¦  «        ZGeGdU         rP eEdteGdu         › �¦  «          eEdn eHeGd3         ¦  «        › do�¦  «          eEdveGd3         ddw…         › de�¦  «         n eEdfeGdg         › �¦  «         dxdydzdDd{d|d}œig d~œdœZLd€d�dzd{d‚d}œd{dƒd}œd„œd:gd~œdœZM ejN        dxdeLd…„ e8d†¬‡¦  «          ejN        d€deMdˆ„ e8d†¬‡¦  «         dS )�u  
Skills Tool Module

This module provides tools for listing and viewing skill documents.
Skills are organized as directories containing a SKILL.md file (the main instructions)
and optional supporting files like references, templates, and examples.

Inspired by Anthropic's Claude Skills system with progressive disclosure architecture:
- Metadata (name â‰¤64 chars, description â‰¤1024 chars) - shown in skills_list
- Full Instructions - loaded via skill_view when needed
- Linked Files (references, templates) - loaded on demand

Directory Structure:
    skills/
    â”œâ”€â”€ my-skill/
    â”‚   â”œâ”€â”€ SKILL.md           # Main instructions (required)
    â”‚   â”œâ”€â”€ references/        # Supporting documentation
    â”‚   â”‚   â”œâ”€â”€ api.md
    â”‚   â”‚   â””â”€â”€ examples.md
    â”‚   â”œâ”€â”€ templates/         # Templates for output
    â”‚   â”‚   â””â”€â”€ template.md
    â”‚   â””â”€â”€ assets/            # Supplementary files (agentskills.io standard)
    â””â”€â”€ category/              # Category folder for organization
        â””â”€â”€ another-skill/
            â””â”€â”€ SKILL.md

SKILL.md Format (YAML Frontmatter, agentskills.io compatible):
    ---
    name: skill-name              # Required, max 64 chars
    description: Brief description # Required, max 1024 chars
    version: 1.0.0                # Optional
    license: MIT                  # Optional (agentskills.io)
    platforms: [macos]            # Optional â€” restrict to specific OS platforms
                                  #   Valid: macos, linux, windows
                                  #   Omit to load on all platforms (default)
    prerequisites:                # Optional â€” legacy runtime requirements
      env_vars: [API_KEY]         #   Legacy env var names are normalized into
                                  #   required_environment_variables on load.
      commands: [curl, jq]        #   Command checks remain advisory only.
    compatibility: Requires X     # Optional (agentskills.io)
    metadata:                     # Optional, arbitrary key-value (agentskills.io)
      hermes:
        tags: [fine-tuning, llm]
        related_skills: [peft, lora]
    ---

    # Skill Title

    Full instructions and content here...

Available tools:
- skills_list: List skills with metadata (progressive disclosure tier 1)
- skill_view: Load full skill content (progressive disclosure tier 2-3)

Usage:
    from tools.skills_tool import skills_list, skill_view, check_skills_requirements

    # List all skills (returns metadata only - token efficient)
    result = skills_list()

    # View a skill's main content (loads full instructions)
    content = skill_view("axolotl")

    # View a reference file within a skill (loads linked file)
    content = skill_view("axolotl", "references/dataset-formats.md")
é    N)Úget_hermes_homeÚdisplay_hermes_home)ÚEnum)ÚPath)ÚDictÚAnyÚListÚOptionalÚSetÚTuple)ÚregistryÚ
tool_errorÚskillsé@   i   ÚdarwinÚlinuxÚwin32)Úmacosr   Úwindowsz^[A-Za-z_][A-Za-z0-9_]*$)z.gitz.githubz.hub>   ÚsshÚmodalÚdockerÚdaytonaÚsingularityÚreturnc                  óÈ  — t          ¦   «         dz  } i }|                      ¦   «         s|S |                      d¬¦  «        5 }|D ]†}|                     ¦   «         }|rn|                     d¦  «        sYd|v rU|                     d¦  «        \  }}}|                     ¦   «                              d¦  «        ||                     ¦   «         <   Œ‡	 ddd¦  «         n# 1 swxY w Y   |S )z@Load profile-scoped environment variables from HERMES_HOME/.env.z.envúutf-8©Úencodingú#Ú=ú"'N)r   ÚexistsÚopenÚstripÚ
startswithÚ	partition)Úenv_pathÚenv_varsÚfÚlineÚkeyÚ_Úvalues          ú3/home/div/.hermes/hermes-agent/tools/skills_tool.pyÚload_envr0   k   s4  € åÑ Ô  6Ñ)€HØ!€HØ�?Š?ÑÔð Øˆà	�Š ˆÑ	(Ô	(ð C¨AØð 	Cð 	CˆDØ—:’:‘<”<ˆDØð C˜DŸOšO¨CÑ0Ô0ð C°S¸D°[°[Ø $§¢¨sÑ 3Ô 3‘��Q˜Ø(-¯ª©¬×(;Ò(;¸EÑ(BÔ(B�˜Ÿš™œÑ%øð		CðCð Cð Cñ Cô Cð Cð Cð Cð Cð Cð Cøøøð Cð Cð Cð Cð €Os   Á B
CÃCÃCc                   ó   — e Zd ZdZdZdZdS )ÚSkillReadinessStatusÚ	availableÚsetup_neededÚunsupportedN)Ú__name__Ú
__module__Ú__qualname__Ú	AVAILABLEÚSETUP_NEEDEDÚUNSUPPORTED© ó    r/   r2   r2   {   s   € € € € € Ø€IØ!€LØ€K€K€Kr=   r2   )	zignore previous instructionszignore all previouszyou are nowzdisregard yourzforget your instructionsznew instructions:zsystem prompt:z<system>z]]>Ú_INJECTION_PATTERNSc                 ó
   — | a d S ©N)Ú_secret_capture_callback)Úcallbacks    r/   Úset_secret_capture_callbackrC   �   s   € à'ÐÐÐr=   Úfrontmatterc                 ó$   — ddl m}  || ¦  «        S )uÑ   Check if a skill is compatible with the current OS platform.

    Delegates to ``agent.skill_utils.skill_matches_platform`` â€” kept here
    as a public re-export so existing callers don't need updating.
    r   )Úskill_matches_platform)Úagent.skill_utilsrF   )rD   Ú_impls     r/   rF   rF   ”   s'   € ð BÐAÐAÐAÐAÐAØˆ5�ÑÔÐr=   r.   c                 óR   — | sg S t          | t          ¦  «        r| g} d„ | D ¦   «         S )Nc                 ón   — g | ]2}t          |¦  «                             ¦   «         ¯#t          |¦  «        ‘Œ3S r<   ©Ústrr%   )Ú.0Úitems     r/   ú
<listcomp>z2_normalize_prerequisite_values.<locals>.<listcomp>£   s3   € Ð=Ð=Ð=˜$­3¨t©9¬9¯?ª?Ñ+<Ô+<Ð=�C�‰IŒIÐ=Ð=Ð=r=   )Ú
isinstancerL   )r.   s    r/   Ú_normalize_prerequisite_valuesrQ   ž   s<   € Øð Øˆ	Ý�%�ÑÔð Ø�ˆØ=Ð= %Ð=Ñ=Ô=Ð=r=   c                 óê   — |                       d¦  «        }|rt          |t          ¦  «        sg g fS t          |                      d¦  «        ¦  «        t          |                      d¦  «        ¦  «        fS )NÚprerequisitesr)   Úcommands)ÚgetrP   ÚdictrQ   )rD   Úprereqss     r/   Ú_collect_prerequisite_valuesrX   ¦   so   € ð �oŠo˜oÑ.Ô.€GØð �* W­dÑ3Ô3ð Ø�2ˆvˆå& w§{¢{°:Ñ'>Ô'>Ñ?Ô?Ý& w§{¢{°:Ñ'>Ô'>Ñ?Ô?ðð r=   c           	      óò  — |                       d¦  «        }t          |t          ¦  «        sd g dœS |                      d¦  «        }t          |t          ¦  «        r5|                     ¦   «         r!t          |¦  «                             ¦   «         nd }|                      d¦  «        }t          |t          ¦  «        r|g}t          |t
          ¦  «        sg }g }|D �]}t          |t          ¦  «        sŒt          |                      d¦  «        pd¦  «                             ¦   «         }|sŒRt          |                      d¦  «        pd|› �¦  «                             ¦   «         }t          |                      d	¦  «        p|                      d
¦  «        pd¦  «                             ¦   «         }	||t          |                      dd¦  «        ¦  «        dœ}
|	r|	|
d	<   |                     |
¦  «         �Œ||dœS )NÚsetup)ÚhelpÚcollect_secretsr[   r\   Úenv_varÚ ÚpromptúEnter value for Úprovider_urlÚurlÚsecretT)r]   r_   rc   )rU   rP   rV   rL   r%   ÚlistÚboolÚappend)rD   rZ   Ú	help_textÚnormalized_helpÚcollect_secrets_rawr\   rN   r]   r_   ra   Úentrys              r/   Ú_normalize_setup_metadatark   ²   s  € Ø�OŠO˜GÑ$Ô$€EÝ�e�TÑ"Ô"ð 5Ø°Ð4Ð4Ð4à—	’	˜&Ñ!Ô!€Iõ �i¥Ñ%Ô%ð	Ø*3¯/ª/Ñ*;Ô*;ð	�ˆI‰Œ×ÒÑÔÐàð ð  Ÿ)š)Ð$5Ñ6Ô6ÐÝÐ%¥tÑ,Ô,ð 4Ø2Ð3ÐÝÐ)­4Ñ0Ô0ð !Ø Ðà,.€OØ#ð &ñ &ˆÝ˜$¥Ñ%Ô%ð 	Øå�d—h’h˜yÑ)Ô)Ð/¨RÑ0Ô0×6Ò6Ñ8Ô8ˆØð 	Øå�T—X’X˜hÑ'Ô'ÐGÐ+G¸gÐ+GÐ+GÑHÔH×NÒNÑPÔPˆÝ˜4Ÿ8š8 NÑ3Ô3ÐL°t·x²xÀ±´ÐLÈ"ÑMÔM×SÒSÑUÔUˆð ØÝ˜4Ÿ8š8 H¨dÑ3Ô3Ñ4Ô4ð!
ð !
ˆð
 ð 	1Ø$0ˆE�.Ñ!Ø×Ò˜uÑ%Ô%Ð%Ñ%ð  Ø*ðð ð r=   Úlegacy_env_varsc                 óÄ  ‡‡‡	— t          | ¦  «        Š	|                      d¦  «        }t          |t          ¦  «        r|g}t          |t          ¦  «        sg }g Št          ¦   «         Šdt          t          t          f         dd fˆˆˆ	fd„}|D ]E}t          |t          ¦  «        r |d|i¦  «         Œ%t          |t          ¦  «        r ||¦  «         ŒF‰	d         D ]_} ||                     d¦  «        |                     d¦  «        |                     d	¦  «        p‰	                     d
¦  «        dœ¦  «         Œ`|€t          | ¦  «        \  }}|D ]} |d|i¦  «         Œ‰S )NÚrequired_environment_variablesrj   r   c                 ó¸  •— t          |                      d¦  «        p|                      d¦  «        pd¦  «                             ¦   «         }|r|‰v rd S t                               |¦  «        sd S |t          |                      d¦  «        pd|› �¦  «                             ¦   «         dœ}|                      d¦  «        p>|                      d¦  «        p)|                      d	¦  «        p‰                     d¦  «        }t          |t           ¦  «        r+|                     ¦   «         r|                     ¦   «         |d<   |                      d
¦  «        }t          |t           ¦  «        r+|                     ¦   «         r|                     ¦   «         |d
<   |                      d¦  «        rd|d<   ‰                     |¦  «         ‰                     |¦  «         d S )NÚnamer]   r^   r_   r`   )rp   r_   r[   ra   rb   Úrequired_forÚoptionalT)rL   rU   r%   Ú_ENV_VAR_NAME_REÚmatchrP   Úaddrf   )rj   Úenv_nameÚ
normalizedrg   rq   ÚrequiredÚseenrZ   s        €€€r/   Ú_append_requiredz=_get_required_environment_variables.<locals>._append_requiredí   sÓ  ø€ Ý�u—y’y Ñ(Ô(ÐF¨E¯IªI°iÑ,@Ô,@ÐFÀBÑGÔG×MÒMÑOÔOˆØð 	˜8 tÐ+Ð+ØˆFÝ×%Ò% hÑ/Ô/ð 	ØˆFð Ý˜%Ÿ)š) HÑ-Ô-ÐNÐ1NÀHÐ1NÐ1NÑOÔO×UÒUÑWÔWð&
ð &
ˆ
ð �IŠI�fÑÔð !Ø�yŠy˜Ñ(Ô(ð!à�yŠy˜ÑÔð!ð �yŠy˜Ñ Ô ð	 	õ �i¥Ñ%Ô%ð 	3¨)¯/ª/Ñ*;Ô*;ð 	3Ø!*§¢Ñ!2Ô!2ˆJ�vÑà—y’y Ñ0Ô0ˆÝ�l¥CÑ(Ô(ð 	>¨\×-?Ò-?Ñ-AÔ-Að 	>Ø)5×);Ò);Ñ)=Ô)=ˆJ�~Ñ&à�9Š9�ZÑ Ô ð 	*Ø%)ˆJ�zÑ"à�Š�ÑÔÐØ�Š˜
Ñ#Ô#Ð#Ð#Ð#r=   rp   r\   r]   r_   ra   r[   )rp   r_   r[   )
rk   rU   rP   rV   rd   Úsetr   rL   r   rX   )
rD   rl   Úrequired_rawrz   rN   r-   r]   rx   ry   rZ   s
          @@@r/   Ú#_get_required_environment_variablesr}   ß   s¿  øøø€ õ & kÑ2Ô2€EØ—?’?Ð#CÑDÔD€LÝ�,¥Ñ%Ô%ð &Ø$�~ˆÝ�l¥DÑ)Ô)ð Øˆà%'€HÝ‘U”U€Dð$¥¥S­# X¤ð $°4ð $ð $ð $ð $ð $ð $ð $ð $ð> ð #ð #ˆÝ�d�CÑ Ô ð 	ØÐ˜f d˜^Ñ,Ô,Ð,ØÝ�d�DÑ!Ô!ð 	#ØÐ˜TÑ"Ô"Ð"øàÐ'Ô(ð 
ð 
ˆØÐàŸš Ñ+Ô+ØŸ(š( 8Ñ,Ô,ØŸš Ñ0Ô0ÐE°E·I²I¸fÑ4EÔ4Eðð ñ	
ô 	
ð 	
ð 	
ð ÐÝ9¸+ÑFÔFÑˆ˜Ø"ð ,ð ,ˆØÐ˜& 'Ð*Ñ+Ô+Ð+Ð+à€Or=   Ú
skill_nameÚmissing_entriesc                 ó  — |sg dd dœS d„ |D ¦   «         }t          ¦   «         r|dt          ¦   «         dœS t          €|dd dœS d}g }|D �]9}d| i}|                     d¦  «        r|d         |d<   |                     d¦  «        r|d         |d<   	 t          |d         |d         |¦  «        }nB# t          $ r5 t
                               d	|d         › �d
¬¦  «         d|d         dd
dœ}Y nw xY wt          |t          ¦  «        o!t          |                     d¦  «        ¦  «        }t          |t          ¦  «        o!t          |                     d¦  «        ¦  «        }	|r|	s�Œd
}| 
                    |d         ¦  «         �Œ;||d dœS )NF)Úmissing_namesÚsetup_skippedÚgateway_setup_hintc                 ó   — g | ]
}|d          ‘ŒS ©rp   r<   )rM   rj   s     r/   rO   z;_capture_required_environment_variables.<locals>.<listcomp>/  s   € Ð@Ð@Ð@ u�U˜6”]Ð@Ð@Ð@r=   r~   r[   rq   rp   r_   z#Secret capture callback failed for T©Úexc_info)ÚsuccessÚ	stored_asÚ	validatedÚskippedrˆ   r‹   )Ú_is_gateway_surfaceÚ_gateway_setup_hintrA   rU   Ú	ExceptionÚloggerÚwarningrP   rV   re   rf   )
r~   r   r�   r‚   Úremaining_namesrj   ÚmetadataÚcallback_resultrˆ   r‹   s
             r/   Ú'_capture_required_environment_variablesr”   $  s7  € ð ð 
àØ"Ø"&ð
ð 
ð 	
ð AÐ@°Ð@Ñ@Ô@€MÝÑÔð 
à*Ø"Ý"5Ñ"7Ô"7ð
ð 
ð 	
õ  Ð'à*Ø"Ø"&ð
ð 
ð 	
ð €MØ!#€Oà ð ".ñ ".ˆØ  *Ð-ˆØ�9Š9�VÑÔð 	-Ø$ Vœ}ˆH�VÑØ�9Š9�^Ñ$Ô$ð 	=Ø',¨^Ô'<ˆH�^Ñ$ð	Ý6Ø�f”Ø�h”Øñô ˆOˆOøõ
 ð 		ð 		ð 		Ý�NŠNØE°e¸F´mÐEÐEÐPTð ñ ô ð ð !Ø" 6œ]Ø"Øð	ð ˆOˆOˆOð			øøøõ ˜_­dÑ3Ô3ð 
½Ø×Ò 	Ñ*Ô*ñ9
ô 9
ˆõ ˜_­dÑ3Ô3ð 
½Ø×Ò 	Ñ*Ô*ñ9
ô 9
ˆð ð 	˜7ð 	ÙàˆØ×Ò˜u Vœ}Ñ-Ô-Ð-Ñ-ð )Ø&Ø"ðð ð s   ÂB.Â.<C-Ã,C-c                  ój   — t          j        d¦  «        rdS ddlm}  t	           | d¦  «        ¦  «        S )NÚHERMES_GATEWAY_SESSIONTr   ©Úget_session_envÚHERMES_SESSION_PLATFORM)ÚosÚgetenvÚgateway.session_contextr˜   re   r—   s    r/   rŒ   rŒ   l  sE   € Ý	„yÐ)Ñ*Ô*ð ØˆtØ7Ð7Ð7Ð7Ð7Ð7Ý��Ð 9Ñ:Ô:Ñ;Ô;Ð;r=   c                  ó’   — t          t          j        dd¦  «        ¦  «                             ¦   «                              ¦   «         pdS )NÚTERMINAL_ENVÚlocal)rL   rš   r›   r%   Úlowerr<   r=   r/   Ú_get_terminal_backend_namer¡   s  s9   € Ý�rŒy˜¨Ñ1Ô1Ñ2Ô2×8Ò8Ñ:Ô:×@Ò@ÑBÔBÐMÀgÐMr=   Úvar_nameÚenv_snapshotc                 ó°   — |€t          ¦   «         }| |v r"t          |                     | ¦  «        ¦  «        S t          t          j        | ¦  «        ¦  «        S r@   )r0   re   rU   rš   r›   )r¢   r£   s     r/   Ú_is_env_var_persistedr¥   w  sR   € ð ÐÝ‘z”zˆØ�<ÐÐÝ�L×$Ò$ XÑ.Ô.Ñ/Ô/Ð/Ý•”	˜(Ñ#Ô#Ñ$Ô$Ð$r=   ©r£   Úrequired_env_varsÚcapture_resultc                óì   — t          |d         ¦  «        }|€t          ¦   «         }g }| D ]I}|d         }|                     d¦  «        rŒ ||v st          ||¦  «        s|                     |¦  «         ŒJ|S )Nr�   rp   rr   )r{   r0   rU   r¥   rf   )r§   r¨   r£   r�   Ú	remainingrj   rp   s          r/   Ú%_remaining_required_environment_namesr«   �  s�   € õ ˜ Ô7Ñ8Ô8€MàÐÝ‘z”zˆØ€IØ"ð #ð #ˆØ�VŒ}ˆØ�9Š9�ZÑ Ô ð 	ØØ�=Ð Ð Õ(=¸dÀLÑ(QÔ(QÐ Ø×Ò˜TÑ"Ô"Ð"øØÐr=   c                  óX   — 	 ddl m}  | S # t          $ r dt          ¦   «         › d�cY S w xY w)Nr   ©Ú*GATEWAY_SECRET_CAPTURE_UNSUPPORTED_MESSAGEziSecure secret entry is not available. Load this skill in the local CLI to be prompted, or add the key to z/.env manually.)Úgateway.platforms.baser®   rŽ   r   r­   s    r/   r�   r�   •  s~   € ðbØUÐUÐUÐUÐUÐUà9Ð9øÝð bð bð bð bõ  |Oñ  |Qô  |Qð  bð  bð  bð  	bð  	bð  	bðbøøøs   ‚
 Š)¨)Úreadiness_statusÚmissingÚ
setup_helpc                 óz   — | t           j        k    r*|rd                     |¦  «        nd}d|› d�}|r|› d|› �S |S d S )Nú, zrequired prerequisitesz.Setup needed before using this skill: missing ú.Ú )r2   r:   Újoin)r°   r±   r²   Úmissing_strÚnotes        r/   Ú_build_setup_noterº   ž  se   € ð
 Õ/Ô<Ò<Ð<Ø,3ÐQ�d—i’i Ñ(Ô(Ð(Ð9QˆØNÀÐNÐNÐNˆØð 	*ØÐ)Ð)˜ZÐ)Ð)Ð)ØˆØˆ4r=   c                  ó   — dS )zOSkills are always available -- the directory is created on first use if needed.Tr<   r<   r=   r/   Úcheck_skills_requirementsr¼   ¬  s   € àˆ4r=   Úcontentc                 ó$   — ddl m}  || ¦  «        S )u½   Parse YAML frontmatter from markdown content.

    Delegates to ``agent.skill_utils.parse_frontmatter`` â€” kept here
    as a public re-export so existing callers don't need updating.
    r   )Úparse_frontmatter)rG   r¿   )r½   r¿   s     r/   Ú_parse_frontmatterrÀ   ±  s'   € ð 4Ð3Ð3Ð3Ð3Ð3ØÐ˜WÑ%Ô%Ð%r=   Ú
skill_pathc                 ó  — t           g}	 ddlm} |                      |¦   «         ¦  «         n# t          $ r Y nw xY w|D ]L}	 |                      |¦  «        }|j        }t          |¦  «        dk    r
|d         c S Œ=# t          $ r Y ŒIw xY wdS )zÜ
    Extract category from skill path based on directory structure.

    For paths like: ~/.hermes/skills/mlops/axolotl/SKILL.md -> "mlops"
    Also works for external skill dirs configured via skills.external_dirs.
    r   ©Úget_external_skills_dirsé   N)	Ú
SKILLS_DIRrG   rÄ   ÚextendrŽ   Úrelative_toÚpartsÚlenÚ
ValueError)rÁ   Údirs_to_checkrÄ   Ú
skills_dirÚrel_pathrÉ   s         r/   Ú_get_category_from_pathrÏ   »  s×   € õ  �L€MðØ>Ð>Ð>Ð>Ð>Ð>Ø×ÒÐ5Ð5Ñ7Ô7Ñ8Ô8Ð8Ð8øÝð ð ð Øˆðøøøà#ð ð ˆ
ð	Ø!×-Ò-¨jÑ9Ô9ˆHØ”NˆEÝ�5‰zŒz˜QŠˆØ˜Q”x���ð øåð 	ð 	ð 	ØˆHð	øøøàˆ4s   Š#. ®
;º;Á6A=Á=
B
Â	B
c                 ó4  — | sg S t          | t          ¦  «        rd„ | D ¦   «         S t          | ¦  «                             ¦   «         } |                      d¦  «        r|                      d¦  «        r
| dd…         } d„ |                      d¦  «        D ¦   «         S )uB  
    Parse tags from frontmatter value.

    Handles:
    - Already-parsed list (from yaml.safe_load): [tag1, tag2]
    - String with brackets: "[tag1, tag2]"
    - Comma-separated string: "tag1, tag2"

    Args:
        tags_value: Raw tags value â€” may be a list or string

    Returns:
        List of tag strings
    c                 óT   — g | ]%}|¯t          |¦  «                             ¦   «         ‘Œ&S r<   rK   ©rM   Úts     r/   rO   z_parse_tags.<locals>.<listcomp>é  s+   € Ð8Ð8Ð8 1°aÐ8•�A‘”—’‘”Ð8Ð8Ð8r=   Ú[Ú]é   éÿÿÿÿc                 ó„   — g | ]=}|                      ¦   «         ¯|                      ¦   «                               d ¦  «        ‘Œ>S )r"   )r%   rÒ   s     r/   rO   z_parse_tags.<locals>.<listcomp>ð  s9   € ÐOÐOÐO qÀQÇWÂWÁYÄYÐOˆA�GŠG‰IŒI�OŠO˜EÑ"Ô"ÐOÐOÐOr=   Ú,)rP   rd   rL   r%   r&   ÚendswithÚsplit)Ú
tags_values    r/   Ú_parse_tagsrÝ   Õ  s­   € ð ð Øˆ	õ �*�dÑ#Ô#ð 9Ø8Ð8¨
Ð8Ñ8Ô8Ð8õ �Z‘”×&Ò&Ñ(Ô(€JØ×Ò˜SÑ!Ô!ð & j×&9Ò&9¸#Ñ&>Ô&>ð &Ø  " Ô%ˆ
àOÐO¨J×,<Ò,<¸SÑ,AÔ,AÐOÑOÔOÐOr=   c                  ó"   — ddl m}   | ¦   «         S )u½   Load disabled skill names from config.

    Delegates to ``agent.skill_utils.get_disabled_skill_names`` â€” kept here
    as a public re-export so existing callers don't need updating.
    r   ©Úget_disabled_skill_names)rG   rà   rß   s    r/   Ú_get_disabled_skill_namesrá   ô  s%   € ð ;Ð:Ð:Ð:Ð:Ð:Ø#Ð#Ñ%Ô%Ð%r=   c                  óL   — 	 ddl m}   | d¦  «        pdS # t          $ r Y dS w xY w)zéResolve the current platform from gateway session context.

    Mirrors the platform-resolution logic in
    ``agent.skill_utils.get_disabled_skill_names`` so that
    ``_is_skill_disabled`` respects ``HERMES_SESSION_PLATFORM``.
    r   r—   r™   r^   )rœ   r˜   rŽ   r—   s    r/   Ú_get_session_platformrã   þ  sQ   € ðØ;Ð;Ð;Ð;Ð;Ð;ØˆÐ8Ñ9Ô9Ð?¸RÐ?øÝð ð ð Øˆrˆrðøøøs   ‚ •
#¢#rp   Úplatformc                 óL  — 	 ddl m}  |¦   «         }|                     di ¦  «        }|p!t          j        d¦  «        pt          ¦   «         }|r/|                     di ¦  «                             |¦  «        }|�| |v S | |                     dg ¦  «        v S # t          $ r Y dS w xY w)	a  Check if a skill is disabled in config.

    Resolves the active platform from (in order of precedence):
    1. Explicit ``platform`` argument
    2. ``HERMES_PLATFORM`` environment variable
    3. ``HERMES_SESSION_PLATFORM`` from gateway session context
    r   )Úload_configr   ÚHERMES_PLATFORMÚplatform_disabledNÚdisabledF)Úhermes_cli.configræ   rU   rš   r›   rã   rŽ   )rp   rä   ræ   ÚconfigÚ
skills_cfgÚresolved_platformrè   s          r/   Ú_is_skill_disabledrî     sÒ   € ðØ1Ð1Ð1Ð1Ð1Ð1Ø�‘”ˆØ—Z’Z ¨"Ñ-Ô-ˆ
Ø$Ð_­¬	Ð2CÑ(DÔ(DÐ_ÕH]ÑH_ÔH_ÐØð 	1Ø *§¢Ð/BÀBÑ GÔ G× KÒ KÐL]Ñ ^Ô ^ÐØ Ð,ØÐ0Ð0Ð0Ø�z—~’~ j°"Ñ5Ô5Ð5Ð5øÝð ð ð Øˆuˆuðøøøs   ‚A:B Á=B Â
B#Â"B#F)Úskip_disabledrï   c           	      ó  — ddl m}m} g }t          ¦   «         }| rt          ¦   «         nt	          ¦   «         }g }t
                               ¦   «         r|                     t
          ¦  «         |                      |¦   «         ¦  «         |D �]ô} ||d¦  «        D �]ã}t          d„ |j
        D ¦   «         ¦  «        rŒ"|j        }		 |                     d¬¦  «        dd…         }
t          |
¦  «        \  }}t          |¦  «        sŒj|                     d	|	j        ¦  «        dt"          …         }||v rŒ—||v rŒœ|                     d
d¦  «        }|sY|                     ¦   «                              d¦  «        D ]1}|                     ¦   «         }|r|                     d¦  «        s|} nŒ2t+          |¦  «        t,          k    r|dt,          dz
  …         dz   }t/          |¦  «        }|                     |¦  «         |                     |||dœ¦  «         �Œy# t2          t4          f$ r'}t6                               d||¦  «         Y d}~�Œ¬d}~wt:          $ r)}t6                               d||d¬¦  «         Y d}~�ŒÝd}~ww xY w�Œö|S )a^  Recursively find all skills in ~/.hermes/skills/ and external dirs.

    Args:
        skip_disabled: If True, return ALL skills regardless of disabled
            state (used by ``hermes skills`` config UI). Default False
            filters out disabled skills.

    Returns:
        List of skill metadata dicts (name, description, category).
    r   )rÄ   Úiter_skill_index_filesúSKILL.mdc              3   ó(   K  — | ]}|t           v V — Œd S r@   )Ú_EXCLUDED_SKILL_DIRS)rM   Úparts     r/   ú	<genexpr>z#_find_all_skills.<locals>.<genexpr>=  s(   è è € ÐKÐK°D�4Õ/Ð/ÐKÐKÐKÐKÐKÐKr=   r   r   Ni   rp   Údescriptionr^   Ú
r    rÅ   ú...)rp   r÷   Úcategoryz Failed to read skill file %s: %sz)Skipping skill at %s: failed to parse: %sTr†   )rG   rÄ   rñ   r{   rá   rÆ   r#   rf   rÇ   ÚanyrÉ   ÚparentÚ	read_textrÀ   rF   rU   rp   ÚMAX_NAME_LENGTHr%   rÛ   r&   rÊ   ÚMAX_DESCRIPTION_LENGTHrÏ   ru   ÚUnicodeDecodeErrorÚPermissionErrorr�   ÚdebugrŽ   )rï   rÄ   rñ   r   Ú
seen_namesré   Údirs_to_scanÚscan_dirÚskill_mdÚ	skill_dirr½   rD   Úbodyrp   r÷   r+   rú   Úes                     r/   Ú_find_all_skillsr
  "  sû  € ð SÐRÐRÐRÐRÐRÐRÐRà€FÝ‘e”e€Jð &ÐF�s‰uŒuˆuÕ+DÑ+FÔ+F€Hð €LÝ×ÒÑÔð (Ø×Ò�JÑ'Ô'Ð'Ø×ÒÐ0Ð0Ñ2Ô2Ñ3Ô3Ð3à ð /ñ /ˆØ.Ð.¨x¸ÑDÔDð .	ñ .	ˆHÝÐKÐK¸H¼NÐKÑKÔKÑKÔKð Øà œˆIð(Ø"×,Ò,°gÐ,Ñ>Ô>¸uÀ¸uÔE�Ý$6°wÑ$?Ô$?Ñ!�˜Tå-¨kÑ:Ô:ð Øà"—’ v¨y¬~Ñ>Ô>Ð?OÅÐ?OÔP�Ø˜:Ð%Ð%ØØ˜8Ð#Ð#Øà)Ÿošo¨m¸RÑ@Ô@�Ø"ð "Ø $§
¢
¡¤× 2Ò 2°4Ñ 8Ô 8ð "ð "˜Ø#Ÿzšz™|œ|˜Øð "¨¯ª¸Ñ(<Ô(<ð "Ø*.˜KØ!˜Eøå�{Ñ#Ô#Õ&<Ò<Ð<Ø"-Ð.IÕ/EÈÑ/IÐ.IÔ"JÈUÑ"R�Kå2°8Ñ<Ô<�à—’˜tÑ$Ô$Ð$Ø—’Ø Ø#.Ø (ðð ñ ô ð ñ øõ '­Ð8ð ð ð Ý—’Ð?ÀÈ1ÑMÔMÐMØ���‘øøøøÝð ð ð Ý—’Ø?ÀÈ1ÐW[ð ñ ô ð ð ���‘øøøøð	øøøñU.	ð` €Ms7   Ã?HÄ,HÄ1HÄ6CHÈI<È$IÉI<ÉI7É7I<c                 ó&   — t          | d„ ¬¦  «        S )z3Keep every skill listing path ordered the same way.c                 ó@   — |                       d¦  «        pd| d         fS )Nrú   r^   rp   ©rU   )Úss    r/   ú<lambda>z_sort_skills.<locals>.<lambda>q  s    € ¨¯ª¨zÑ):Ô):Ð)@¸bÀ!ÀFÄ)Ð(L€ r=   )r,   )Úsorted)r   s    r/   Ú_sort_skillsr  o  s   € å�&ÐLÐLÐMÑMÔMÐMr=   Úcategory_dirc                 óª  — | dz  }|                      ¦   «         sdS 	 |                     d¬¦  «        }t          |¦  «        \  }}|                     dd¦  «        }|sY|                     ¦   «                              d¦  «        D ]1}|                     ¦   «         }|r|                     d¦  «        s|} nŒ2t          |¦  «        t          k    r|dt          d	z
  …         d
z   }|r|ndS # t          t          f$ r'}t                               d||¦  «         Y d}~dS d}~wt          $ r)}t                               d||d¬¦  «         Y d}~dS d}~ww xY w)zÃ
    Load category description from DESCRIPTION.md if it exists.

    Args:
        category_dir: Path to the category directory

    Returns:
        Description string or None if not found
    zDESCRIPTION.mdNr   r   r÷   r^   rø   r    rÅ   rù   z*Failed to read category description %s: %sz)Error parsing category description %s: %sTr†   )r#   rý   rÀ   rU   r%   rÛ   r&   rÊ   rÿ   r   r  r�   r  rŽ   r�   )r  Ú	desc_filer½   rD   r  r÷   r+   r	  s           r/   Ú_load_category_descriptionr  t  sœ  € ð Ð/Ñ/€IØ×ÒÑÔð ØˆtðØ×%Ò%¨wÐ%Ñ7Ô7ˆå.¨wÑ7Ô7Ñˆ�Tð "—o’o m°RÑ8Ô8ˆØð 	ØŸ
š
™œ×*Ò*¨4Ñ0Ô0ð ð �Ø—z’z‘|”|�Øð  §¢°Ñ 4Ô 4ð Ø"&�KØ�Eøõ ˆ{ÑÔÕ4Ò4Ð4Ø%Ð&BÕ(>ÀÑ(BÐ&BÔCÀeÑKˆKà)Ð3ˆ{ˆ{¨tÐ3øÝ¥Ð0ð ð ð Ý�ŠÐAÀ9ÈaÑPÔPÐPØˆtˆtˆtˆtˆtøøøøÝð ð ð Ý�ŠØ7¸ÀAÐPTð 	ñ 	
ô 	
ð 	
ð ˆtˆtˆtˆtˆtøøøøð	øøøs$   �CC) Ã)EÃ:DÄEÄ)EÅErú   Útask_idc                 ób  ‡ — 	 t                                ¦   «         sGt                                dd¬¦  «         t          j        dg g dt          ¦   «         › d�dœd¬¦  «        S t          ¦   «         }|st          j        dg g ddœd¬¦  «        S ‰ rˆ fd	„|D ¦   «         }t          |¦  «        }t          t          d
„ |D ¦   «         ¦  «        ¦  «        }t          j        d||t          |¦  «        ddœd¬¦  «        S # t          $ r(}t          t          |¦  «        d¬¦  «        cY d}~S d}~ww xY w)aÂ  
    List all available skills (progressive disclosure tier 1 - minimal metadata).

    Returns only name + description to minimize token usage. Use skill_view() to
    load full content, tags, related files, etc.

    Args:
        category: Optional category filter (e.g., "mlops")
        task_id: Optional task identifier used to probe the active backend

    Returns:
        JSON string with minimal skill info: name, description, category
    T)ÚparentsÚexist_okz-No skills found. Skills directory created at z/skills/)rˆ   r   Ú
categoriesÚmessageF©Úensure_asciiz%No skills found in skills/ directory.c                 óF   •— g | ]}|                      d ¦  «        ‰k    ¯|‘ŒS )rú   r  )rM   r  rú   s     €r/   rO   zskills_list.<locals>.<listcomp>Ê  s/   ø€ ÐQÐQÐQ °1·5²5¸Ñ3DÔ3DÈÒ3PÐ3P˜!Ð3PÐ3PÐ3Pr=   c              3   ój   K  — | ].}|                      d ¦  «        ¯|                      d ¦  «        V — Œ/dS )rú   Nr  ©rM   r  s     r/   rö   zskills_list.<locals>.<genexpr>Ñ  s?   è è € ÐKÐK a¸¿º¸zÑ9JÔ9JÐK�—’�jÑ!Ô!ÐKÐKÐKÐKÐKÐKr=   z@Use skill_view(name) to see full content, tags, and linked files)rˆ   r   r  ÚcountÚhint©rˆ   N)rÆ   r#   ÚmkdirÚjsonÚdumpsr   r
  r  r  r{   rÊ   rŽ   r   rL   )rú   r  Ú
all_skillsr  r	  s   `    r/   Úskills_listr(  Ÿ  sª  ø€ ð31Ý× Ò Ñ"Ô"ð 
	Ý×Ò T°DÐÑ9Ô9Ð9Ý”:à#Ø Ø"$ØnÕObÑOdÔOdÐnÐnÐnð	ð ð #ðñ ô ð õ &Ñ'Ô'ˆ
àð 		Ý”:à#Ø Ø"$ØFð	ð ð #ðñ ô ð ð ð 	RØQÐQÐQÐQ ZÐQÑQÔQˆJõ " *Ñ-Ô-ˆ
õ ÝÐKÐK¨:ÐKÑKÔKÑKÔKñ
ô 
ˆ
õ ŒzàØ$Ø(Ý˜Z™œØZðð ð ð	
ñ 	
ô 	
ð 		
øõ ð 1ð 1ð 1Ý�#˜a™&œ&¨%Ð0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0øøøøð1øøøs+   ƒAC< Á#*C< ÂA-C< Ã<
D.ÄD)Ä#D.Ä)D.T©Ú
preprocessÚ
session_idr  Ú	namespaceÚbarer*  r+  c          
      óÜ  ‡‡— ddl m}m} | |¦   «         v rt          j        dd|› d|› �dœd¬¦  «        S 	 |                      d¬	¦  «        Šn9# t          $ r,}t          j        dd
|› d‰› d|› �dœd¬¦  «        cY d}~S d}~ww xY wi }	 t          ‰¦  «        \  }}	n# t          $ r Y nw xY wt          |¦  «        s0t          j        dd|› d‰› d�t          j
        j        dœd¬¦  «        S t          ˆfd„t          D ¦   «         ¦  «        rt                               d|‰¦  «         t!          |                     dd¦  «        ¦  «        }
t%          |
¦  «        t&          k    r|
dt&          dz
  …         dz   }
	 ˆfd„ |¦   «                              |¦  «        D ¦   «         }|r+d                     |¦  «        }d|› d|› d|› d|d         › d�	}nd|› d�}n# t          $ r d}Y nw xY w‰}|rI	 ddlm}  |‰| j        |¬¦  «        }n.# t          $ r! t                               d |‰d!¬"¦  «         Y nw xY wt          j        d!|› d‰› �|r|› |› �n||
dt          j        j        d#œd¬¦  «        S )$z8Read a plugin-provided skill, apply guards, return JSON.r   )Ú_get_disabled_pluginsÚget_plugin_managerFzPlugin 'z5' is disabled. Re-enable with: hermes plugins enable ©rˆ   Úerrorr  r   r   úFailed to read skill 'ú:ú': NúSkill 'ú$' is not supported on this platform.©rˆ   r2  r°   c              3   óD   •K  — | ]}|‰                      ¦   «         v V — Œd S r@   )r    )rM   Úpr½   s     €r/   rö   z&_serve_plugin_skill.<locals>.<genexpr>  s0   øè è € Ð
=Ð
= Aˆ1�—’‘”ÐÐ
=Ð
=Ð
=Ð
=Ð
=Ð
=r=   zIPlugin skill '%s:%s' contains patterns that may indicate prompt injectionr÷   r^   rÅ   rù   c                 ó    •— g | ]
}|‰k    ¯|‘ŒS r<   r<   )rM   r  r-  s     €r/   rO   z'_serve_plugin_skill.<locals>.<listcomp>"  s*   ø€ ð 
ð 
ð 
ØØ�DŠyˆyð Øˆyˆyr=   r´   z,[Bundle context: This skill is part of the 'z' plugin.
Sibling skills: z..
Use qualified form to invoke siblings (e.g. z).]

z' plugin.]

©Úpreprocess_skill_content©r+  z'Could not preprocess plugin skill %s:%sTr†   )rˆ   rp   r½   r÷   Úlinked_filesr°   )Úhermes_cli.pluginsr/  r0  r%  r&  rý   rŽ   rÀ   rF   r2   r;   r.   rû   r>   r�   r�   rL   rU   rÊ   rÿ   Úlist_plugin_skillsr·   Úagent.skill_preprocessingr=  rü   r  r9   )r  r,  r-  r*  r+  r/  r0  r	  Úparsed_frontmatterr-   r÷   ÚsiblingsÚsib_listÚbannerÚrendered_contentr=  r½   s     `             @r/   Ú_serve_plugin_skillrH  æ  s7  øø€ ð MÐLÐLÐLÐLÐLÐLÐLàÐ)Ð)Ñ+Ô+Ð+Ð+ÝŒzà ðI˜yð Ið IØ=FðIð Iðð ð ð	
ñ 	
ô 	
ð 		
ð
Ø×$Ò$¨gÐ$Ñ6Ô6ˆˆøÝð 
ð 
ð 
ÝŒzØÐ(YÀÐ(YÐ(YÈTÐ(YÐ(YÐVWÐ(YÐ(YÐZÐZØð
ñ 
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øøøøð
øøøð *,ÐðÝ 2°7Ñ ;Ô ;ÑÐ˜A˜AøÝð ð ð Øˆðøøøõ "Ð"4Ñ5Ô5ð 
ÝŒzà ØY 9ÐYÐY¨tÐYÐYÐYÝ$8Ô$DÔ$Jðð ð
 ð
ñ 
ô 
ð 	
õ Ð
=Ð
=Ð
=Ð
=Õ)<Ð
=Ñ
=Ô
=Ñ=Ô=ð 
Ý�ŠØWØ�tñ	
ô 	
ð 	
õ
 Ð(×,Ò,¨]¸BÑ?Ô?Ñ@Ô@€KÝ
ˆ;ÑÔÕ0Ò0Ð0Ø!Ð">Õ$:¸QÑ$>Ð">Ô?À%ÑGˆðð
ð 
ð 
ð 
Ø)Ð)Ñ+Ô+×>Ò>¸yÑIÔIð
ñ 
ô 
ˆð ð 	^Ø—y’y Ñ*Ô*ˆHð`¸yð `ð `Ø#+ð`ð `à?Hð`ð `àKSÐTUÌ;ð`ð `ð `ð ˆFð ^ÀIÐ]Ð]Ð]ˆFøøÝð ð ð Øˆˆˆðøøøð ÐØð ð	ØJÐJÐJÐJÐJÐJà7Ð7ØØ”Ø%ð ñ  ô  ÐÐøõ
 ð 	ð 	ð 	Ý�LŠLØ9¸9ÀdÐUYð ñ ô ð ð ð ð	øøøõ
 Œ:àØ Ð)Ð) 4Ð)Ð)Ø8>ÐT˜&Ð4Ð"2Ð4Ð4Ð4ÐDTØ&Ø Ý 4Ô >Ô Dð	
ð 	
ð ð
ñ 
ô 
ð 
sT   ·A Á
BÁ!A?Á9BÁ?BÂ
B Â
B*Â)B*Å9AG ÇG%Ç$G%Ç-H È(H2È1H2Ú	file_pathc                 ó´  ‡G‡H‡I‡J‡K— 	 d| v �r*ddl m}m} ddlm}m}  || ¦  «        \  ŠI} |‰I¦  «        s t          j        dd‰I› d| › d�d	œd¬
¦  «        S  |¦   «           |¦   «         }	|	                     | ¦  «        }
|
�]|
 	                    ¦   «         s5|	 
                    | ¦  «         t          j        dd| › d|
› d�d	œd¬
¦  «        S t          |
‰I|||¬¦  «        S |	                     ‰I¦  «        }|rBt          j        dd|› d‰I› d�ˆIfd„|D ¦   «         d‰I› dt          |¦  «        › d�dœd¬
¦  «        S ddl m} g }t           	                    ¦   «         r|                     t          ¦  «         |                      |¦   «         ¦  «         |st          j        ddd	œd¬
¦  «        S dŠKd}|D ]y}|| z  }|                     ¦   «         r |dz   	                    ¦   «         r	|ŠK|dz  } n?|                     d¦  «         	                    ¦   «         r|                     d¦  «        } nŒz|s9|D ]6}ddl m}  ||d¦  «        D ]}|j        j        | k    r|j        ŠK|} nŒ|r nŒ7|s3|D ]0}|                     | › d�¦  «        D ]}|j        dk    r|} nŒ|r nŒ1|r| 	                    ¦   «         sLd„ t1          t3          ¦   «         ¦  «        dd…         D ¦   «         }t          j        dd| › d�|ddœd¬
¦  «        S 	 |                     d ¬!¦  «        }n6# t6          $ r)}t          j        dd"| › d#|› �d	œd¬
¦  «        cY d}~S d}~ww xY wd$}t                               ¦   «         g}	 |                     d%„ |d&d…         D ¦   «         ¦  «         n# t6          $ r Y nw xY w|D ]=}	 |                     ¦   «                              |¦  «         d} n# t<          $ r Y Œ:w xY w|                     ¦   «         ŠGtA          ˆGfd'„tB          D ¦   «         ¦  «        }|s|rtg }|r|                     d(|› �¦  «         |r|                     d)¦  «         tE          j#        tH          ¦  «         %                    d*| d+ &                    |¦  «        ¦  «         i }	 tO          |¦  «        \  }}n# t6          $ r i }Y nw xY wtQ          |¦  «        s-t          j        dd| › d,�tR          j*        j+        d-œd¬
¦  «        S | ,                    d.|j        j        ¦  «        }t[          |¦  «        rt          j        dd|› d/�d	œd¬
¦  «        S |�rˆ‰K�r…dd0l.m/}m0}  ||¦  «        rt          j        dd1d2d3œd¬
¦  «        S ‰K|z  }  || ‰K¦  «        }!|!rt          j        d|!d2d3œd¬
¦  «        S |  	                    ¦   «         �sŽg g g g g d4œ}"‰K                     d5¦  «        D �]/}#|# 1                    ¦   «         �r|#j        dk    �rte          |#                     ‰K¦  «        ¦  «        }$|$ 3                    d6¦  «        r|"d7                              |$¦  «         Œw|$ 3                    d8¦  «        r|"d9                              |$¦  «         Œ¨|$ 3                    d:¦  «        r|"d;                              |$¦  «         ŒÙ|$ 3                    d<¦  «        r|"d=                              |$¦  «         �Œ|#j4        d>v r|"d?                              |$¦  «         �Œ1d@„ |" 5                    ¦   «         D ¦   «         }"t          j        ddA|› dB| › d�|"dCdDœd¬
¦  «        S 	 |                      d ¬!¦  «        }nO# tl          $ rB t          j        d$| |dE| j        › dF|  7                    ¦   «         j8        › dG�d$dHœd¬
¦  «        cY S w xY wt          j        d$| ||| j4        dIœd¬
¦  «        S |}%g }&g }'g }(g })‰K�rX‰Kd7z  }*|* 	                    ¦   «         r!ˆKfdJ„|* 9                    dK¦  «        D ¦   «         }&‰Kd9z  }+|+ 	                    ¦   «         r9dLD ]6},|'                     ˆKfdM„|+                     |,¦  «        D ¦   «         ¦  «         Œ7‰Kd;z  }-|- 	                    ¦   «         ra|-                     d5¦  «        D ]K}#|# 1                    ¦   «         r5|(                     te          |#                     ‰K¦  «        ¦  «        ¦  «         ŒL‰Kd=z  }.|. 	                    ¦   «         r9dND ]6},|)                     ˆKfdO„|. 9                    |,¦  «        D ¦   «         ¦  «         Œ7i }/|% ,                    dP¦  «        }0tu          |0tv          ¦  «        r|0 ,                    dQi ¦  «        pi }/ty          |/ ,                    dR¦  «        p|% ,                    dRdS¦  «        ¦  «        }1ty          |/ ,                    dT¦  «        p|% ,                    dTdS¦  «        ¦  «        }2i }3|&r|&|3d7<   |'r|'|3d9<   |(r|(|3d;<   |)r|)|3d=<   	 te          |                     t          ¦  «        ¦  «        }4nO# t<          $ rB |j        j        r,te          |                     |j        j        ¦  «        ¦  «        n|j        }4Y nw xY w|% ,                    d.‰Ks|j=        n‰Kj        ¦  «        }5t}          |%¦  «        \  }6}t          |%|6¦  «        }7t�          ¦   «         }8tƒ          ¦   «         ŠHˆHfdU„|7D ¦   «         }9t…          |5|9¦  «        }:|9rtƒ          ¦   «         ŠHt‡          |7|:‰H¬V¦  «        ŠJt‰          ‰J¦  «        };ˆJfdW„|7D ¦   «         }<|<r@	 ddXlEmF}=  |=|<¦  «         n-# t6          $ r  tŽ           H                    dY|5d$¬Z¦  «         Y nw xY w|% ,                    d[g ¦  «        }>tu          |>t’          ¦  «        sg }>g }?|>rD	 dd\lJmK}@  |@|>¦  «        }?|?rd$};n-# t6          $ r  tŽ           H                    d]|5d$¬Z¦  «         Y nw xY w|}A|rC	 dd^lLmM}B  |B|‰K|¬_¦  «        }An-# t6          $ r  tŽ           H                    d`|5d$¬Z¦  «         Y nw xY wi dad$“d.|5“db|% ,                    dbdS¦  «        “dR|1“dT|2“dc|A“dd|4“de‰Krte          ‰K¦  «        nd“df|3r|3nd“dg|3rdhnd“di|7“djg “dk‰J“dl|?“dmg “dn|;“do|:do         “dp|;rtR          jN        j+        ntR          jO        j+        i¥}Ct¡          dq„ |7D ¦   «         d¦  «        }D|Dr|D|Cdr<   |:ds         r|:ds         |Cds<   |;r`dt„ ‰JD ¦   «         du„ |?D ¦   «         z   }Et£          tR          jN        |E|D¦  «        }F|8t¤          v r|Fr|F› dv|8 S                    ¦   «         › dw�}F|Fr|F|Cdx<   |% ,                    dy¦  «        r|%dy         |Cdy<   tu          |0tv          ¦  «        r|0|CdP<   t          j        |Cd¬
¦  «        S # t6          $ r(}t©          te          |¦  «        d¬z¦  «        cY d}~S d}~ww xY w){aØ  
    View the content of a skill or a specific file within a skill directory.

    Args:
        name: Name or path of the skill (e.g., "axolotl" or "03-fine-tuning/axolotl").
            Qualified names like "plugin:skill" resolve to plugin-provided skills.
        file_path: Optional path to a specific file within the skill (e.g., "references/api.md")
        task_id: Optional task identifier used to probe the active backend
        preprocess: Apply configured SKILL.md template and inline shell rendering
            to main skill content. Internal slash/preload callers disable this
            because they render the skill message themselves.

    Returns:
        JSON string with skill content or error message
    r4  r   )Úis_valid_namespaceÚparse_qualified_name)Údiscover_pluginsr0  FzInvalid namespace 'z' in 'z('. Namespaces must match [a-zA-Z0-9_-]+.r1  r  Nr6  z' file no longer exists at uT   . The registry entry has been cleaned up â€” try again after the plugin is reloaded.r)  z' not found in plugin 'z'.c                 ó   •— g | ]	}‰› d |› �‘Œ
S )r4  r<   )rM   r  r,  s     €r/   rO   zskill_view.<locals>.<listcomp>›  s'   ø€ Ð,SÐ,SÐ,SÀA°	Ð-?Ð-?¸AÐ-?Ð-?Ð,SÐ,SÐ,Sr=   zThe 'z' plugin provides z
 skill(s).)rˆ   r2  Úavailable_skillsr"  rÃ   zISkills directory does not exist yet. It will be created on first install.rò   ú.md)rñ   c                 ó   — g | ]
}|d          ‘ŒS r…   r<   r   s     r/   rO   zskill_view.<locals>.<listcomp>Û  s   € ÐRÐRÐR q˜˜6œÐRÐRÐRr=   é   z' not found.z+Use skills_list to see all available skillsr   r   r3  r5  Tc              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r@   )Úresolve)rM   Úds     r/   rö   zskill_view.<locals>.<genexpr>÷  s*   è è € Ð CÐ C° §¢¡¤Ð CÐ CÐ CÐ CÐ CÐ Cr=   rÖ   c              3   ó    •K  — | ]}|‰v V — Œ	d S r@   r<   )rM   r:  Ú_content_lowers     €r/   rö   zskill_view.<locals>.<genexpr>  s(   øè è € Ð!SÐ!S¸! ! ~Ð"5Ð!SÐ!SÐ!SÐ!SÐ!SÐ!Sr=   zHskill file is outside the trusted skills directory (~/.hermes/skills/): zBskill content contains patterns that may indicate prompt injectionz#Skill security warning for '%s': %sz; r7  r8  rp   zT' is disabled. Enable it with `hermes skills` or inspect the files directly on disk.)Úvalidate_within_dirÚhas_traversal_componentz%Path traversal ('..') is not allowed.z.Use a relative path within the skill directory)rˆ   r2  r"  )Ú
referencesÚ	templatesÚassetsÚscriptsÚotherÚ*zreferences/rZ  z
templates/r[  zassets/r\  zscripts/r]  )rP  z.pyz.yamlz.ymlz.jsonz.texz.shr^  c                 ó   — i | ]
\  }}|¯||“ŒS r<   r<   )rM   ÚkÚvs      r/   ú
<dictcomp>zskill_view.<locals>.<dictcomp>k  s#   € Ð"QÐ"QÐ"Q©D¨A¨qÈqÐ"Q 1 aÐ"QÐ"QÐ"Qr=   zFile 'z' not found in skill 'z0Use one of the available file paths listed above)rˆ   r2  Úavailable_filesr"  z[Binary file: z, size: z bytes])rˆ   rp   Úfiler½   Ú	is_binary)rˆ   rp   re  r½   Ú	file_typec                 óT   •— g | ]$}t          |                     ‰¦  «        ¦  «        ‘Œ%S r<   ©rL   rÈ   ©rM   r*   r  s     €r/   rO   zskill_view.<locals>.<listcomp>ž  s:   ø€ ð #ð #ð #Ø67•C˜Ÿš iÑ0Ô0Ñ1Ô1ð#ð #ð #r=   ú*.md)rk  ú*.pyz*.yamlz*.ymlz*.jsonz*.texú*.shc                 óT   •— g | ]$}t          |                     ‰¦  «        ¦  «        ‘Œ%S r<   ri  rj  s     €r/   rO   zskill_view.<locals>.<listcomp>®  s=   ø€ ð ð ð à !õ   §¢¨iÑ 8Ô 8Ñ9Ô9ðð ð r=   )rl  rm  z*.bashz*.jsz*.tsz*.rbc                 óT   •— g | ]$}t          |                     ‰¦  «        ¦  «        ‘Œ%S r<   ri  rj  s     €r/   rO   zskill_view.<locals>.<listcomp>¿  s-   ø€ ÐVÐVÐV¸1�˜QŸ]š]¨9Ñ5Ô5Ñ6Ô6ÐVÐVÐVr=   r’   ÚhermesÚtagsr^   Úrelated_skillsc                 ój   •— g | ]/}|                      d ¦  «        °t          |d         ‰¦  «        °-|‘Œ0S )rr   rp   )rU   r¥   )rM   r	  r£   s     €r/   rO   zskill_view.<locals>.<listcomp>ç  sS   ø€ ð %
ð %
ð %
àØ—5’5˜Ñ$Ô$ð%
õ *¨!¨F¬)°\ÑBÔBð	%
Øð%
ð %
ð %
r=   r¦   c                 ó4   •— g | ]}|d          ‰v¯|d          ‘ŒS r…   r<   )rM   r	  Úremaining_missing_required_envss     €r/   rO   zskill_view.<locals>.<listcomp>ý  s7   ø€ ð 
ð 
ð 
àØ�ŒyÐ ?Ð?Ð?ð ˆfŒIà?Ð?Ð?r=   )Úregister_env_passthroughz/Could not register env passthrough for skill %sr†   Úrequired_credential_files)Úregister_credential_filesz0Could not register credential files for skill %sr<  r>  z)Could not preprocess skill content for %srˆ   r÷   r½   Úpathr  r?  Ú
usage_hintzzTo view linked files, call skill_view(name, file_path) where file_path is e.g. 'references/api.md' or 'assets/config.yaml'rn   Úrequired_commandsÚ&missing_required_environment_variablesÚmissing_credential_filesÚmissing_required_commandsr4   r‚   r°   c              3   óP   K  — | ]!}|                      d ¦  «        ¯|d          V — Œ"dS )r[   Nr  )rM   r	  s     r/   rö   zskill_view.<locals>.<genexpr>K  s5   è è € ÐQÐQ¨À1Ç5Â5ÈÁ=Ä=ÐQ˜1˜Vœ9ÐQÐQÐQÐQÐQÐQr=   r²   rƒ   c                 ó   — g | ]}d |› �‘ŒS )zenv $r<   )rM   rv   s     r/   rO   zskill_view.<locals>.<listcomp>S  s.   € ð ð ð Ø'/Ð"˜Ð"Ð"ðð ð r=   c                 ó   — g | ]}d |› �‘ŒS )zfile r<   )rM   ry  s     r/   rO   zskill_view.<locals>.<listcomp>U  s+   € ð ð ð Ø#'�˜��ðð ð r=   r¶   zW-backed skills need these requirements available inside the remote environment as well.Ú
setup_noteÚcompatibilityr#  )UrG   rK  rL  r@  rM  r0  r%  r&  Úfind_plugin_skillr#   Úremove_plugin_skillrH  rA  rÊ   rÄ   rÆ   rf   rÇ   Úis_dirÚwith_suffixrñ   rü   rp   Úrglobr  r
  rý   rŽ   rT  rÈ   rË   r    rû   r>   ÚloggingÚ	getLoggerr6   r�   r·   rÀ   rF   r2   r;   r.   rU   rî   Útools.path_securityrX  rY  Úis_filerL   r&   ÚsuffixÚitemsr   ÚstatÚst_sizeÚglobrP   rV   rÝ   ÚstemrX   r}   r¡   r0   r”   r«   re   Útools.env_passthroughrv  r�   r  rd   Útools.credential_filesrx  rB  r=  r:   r9   Únextrº   Ú_REMOTE_ENV_BACKENDSÚupperr   )Lrp   rI  r  r*  rK  rL  rM  r0  r-  ÚpmÚplugin_skill_mdr3   rÄ   Úall_dirsr  Ú
search_dirÚdirect_pathrñ   Úfound_skill_mdÚfound_mdr½   r	  Ú_outside_skills_dirÚ_trusted_dirsÚ_tdÚ_injection_detectedÚ	_warningsrC  r-   Úresolved_namerX  rY  Útarget_fileÚtraversal_errorrd  r*   ÚrelrD   Úreference_filesÚtemplate_filesÚasset_filesÚscript_filesÚreferences_dirÚtemplates_dirÚextÚ
assets_dirÚscripts_dirÚhermes_metar’   rq  rr  r?  rÎ   r~   rl   r§   ÚbackendÚmissing_required_env_varsr¨   r4   Úavailable_env_namesrv  Úrequired_cred_files_rawÚmissing_cred_filesrx  rG  r=  Úresultr²   Úmissing_itemsr‚  rW  r£   r,  ru  r  sL                                                                          @@@@@r/   Ú
skill_viewr¹  N  s¬  øøøøø€ ð*H1ð �$ˆ;‰;ØRÐRÐRÐRÐRÐRÐRÐRØOÐOÐOÐOÐOÐOÐOÐOà2Ð2°4Ñ8Ô8‰OˆI�tØ%Ð% iÑ0Ô0ð 
Ý”zà#(ðE°)ð Eð EÀ4ð Eð Eð Eðð ð "'ð	ñ 	ô 	ð 	ð ÐÑÔÐØ#Ð#Ñ%Ô%ˆBØ ×2Ò2°4Ñ8Ô8ˆOàÐ*Ø&×-Ò-Ñ/Ô/ð à×*Ò*¨4Ñ0Ô0Ð0Ýœ:à',ð!7¨$ð !7ð !7Ø#2ð!7ð !7ð !7ðð ð &+ðñ ô ð õ +Ø#ØØØ)Ø&ðñ ô ð ð ×-Ò-¨iÑ8Ô8ˆIØð 	Ý”zà#(Ø!U¨4Ð!UÐ!UÈ	Ð!UÐ!UÐ!UØ,SÐ,SÐ,SÐ,SÈÐ,SÑ,SÔ,SØ _¨	Ð _Ð _ÅSÈÁ^Ä^Ð _Ð _Ð _ð	ð ð "'ðñ ô ð ð 	?Ð>Ð>Ð>Ð>Ð>ð ˆÝ×ÒÑÔð 	(Ø�OŠO�JÑ'Ô'Ð'Ø�ŠÐ0Ð0Ñ2Ô2Ñ3Ô3Ð3àð 	Ý”:à$Øhðð ð #ðñ ô ð ð ˆ	Øˆð #ð 		ð 		ˆJà$ tÑ+ˆKØ×!Ò!Ñ#Ô#ð ¨°zÑ)A×(IÒ(IÑ(KÔ(Kð Ø'�	Ø&¨Ñ3�Ø�Ø×(Ò(¨Ñ/Ô/×6Ò6Ñ8Ô8ð Ø&×2Ò2°5Ñ9Ô9�Ø�ðð
 ð 
	Ø&ð 	ð 	�
ØDÐDÐDÐDÐDÐDà&<Ð&<¸ZÈÑ&TÔ&Tð ð �NØ%Ô,Ô1°TÒ9Ð9Ø$2Ô$9˜	Ø#1˜Ø˜ð :ð ð Ø�Eðð ð 	Ø&ð ð �
Ø *× 0Ò 0°D°°°Ñ >Ô >ð ð �HØ”}¨
Ò2Ð2Ø#+˜Ø˜ð 3ð ð Ø�Eðð ð 
	˜xŸšÑ0Ô0ð 
	ØRÐR­LÕ9IÑ9KÔ9KÑ,LÔ,LÈSÈbÈSÔ,QÐRÑRÔRˆIÝ”:à$Ø9 tÐ9Ð9Ð9Ø(1ØIð	ð ð #ðñ ô ð ð		Ø×(Ò(°'Ð(Ñ:Ô:ˆGˆGøÝð 	ð 	ð 	Ý”:à$ØB°dÐBÐB¸qÐBÐBðð ð #ðñ ô ð ð ð ð ð ð øøøøð	øøøð #ÐÝ#×+Ò+Ñ-Ô-Ð.ˆð	Ø× Ò Ð CÐ C°h¸q¸r¸r´lÐ CÑ CÔ CÑCÔCÐCÐCøÝð 	ð 	ð 	ØˆDð	øøøà ð 	ð 	ˆCðØ× Ò Ñ"Ô"×.Ò.¨sÑ3Ô3Ð3Ø&+Ð#Ø�øÝð ð ð Ø�ðøøøð
 !Ÿš™œˆÝ!Ð!SÐ!SÐ!SÐ!SÕ?RÐ!SÑ!SÔ!SÑSÔSÐàð 	sÐ"5ð 	sØˆIØ"ð xØ× Ò Ð!vÐltÐ!vÐ!vÑwÔwÐwØ"ð gØ× Ò Ð!eÑfÔfÐfÝÔ�hÑ'Ô'×/Ò/Ð0UÐW[Ð]a×]fÒ]fÐgpÑ]qÔ]qÑrÔrÐrà-/Ðð	$Ý$6°wÑ$?Ô$?Ñ!Ð  øÝð 	$ð 	$ð 	$Ø!#ÐÐÐð	$øøøõ &Ð&8Ñ9Ô9ð 	Ý”:à$ØQ tÐQÐQÐQÝ(<Ô(HÔ(Nðð ð
 #ðñ ô ð ð +×.Ò.¨v°x´Ô7KÑLÔLˆÝ˜mÑ,Ô,ð 
	Ý”:à$ð` -ð `ð `ð `ðð ð #ð	ñ 	ô 	ð 	ð ñ b	˜ñ b	ØXÐXÐXÐXÐXÐXÐXÐXð 'Ð& yÑ1Ô1ð Ý”zà#(Ø!HØ Pðð ð
 "'ðñ ô ð ð $ iÑ/ˆKð 2Ð1°+¸yÑIÔIˆOØð Ý”zà#(Ø!0Ø Pðð ð
 "'ðñ ô ð ð ×%Ò%Ñ'Ô'ñ ,ð #%Ø!#Ø Ø!Øð#ð #�ð #Ÿš¨Ñ-Ô-ð Añ A�AØ—y’y‘{”{ñ A q¤v°Ò';Ñ';Ý! !§-¢-°	Ñ":Ô":Ñ;Ô;˜ØŸ>š>¨-Ñ8Ô8ð AØ+¨LÔ9×@Ò@ÀÑEÔEÐEÐEØ Ÿ^š^¨LÑ9Ô9ð AØ+¨KÔ8×?Ò?ÀÑDÔDÐDÐDØ Ÿ^š^¨IÑ6Ô6ð AØ+¨HÔ5×<Ò<¸SÑAÔAÐAÐAØ Ÿ^š^¨JÑ7Ô7ð AØ+¨IÔ6×=Ò=¸cÑBÔBÐBÑBØœXð *ð ð ð ,¨GÔ4×;Ò;¸CÑ@Ô@Ð@ùð #RÐ"Q°O×4IÒ4IÑ4KÔ4KÐ"QÑ"QÔ"Q�å”zà#(Ø!S¨)Ð!SÐ!SÈ4Ð!SÐ!SÐ!SØ+:Ø Rð	ð ð "'ðñ ô ð ðØ%×/Ò/¸Ð/ÑAÔA��øÝ%ð ð ð å”zà#'Ø $Ø )Ø#q°KÔ4DÐ#qÐ#qÈk×N^ÒN^ÑN`ÔN`ÔNhÐ#qÐ#qÐ#qØ%)ðð ð "'ð	ñ 	ô 	ð 	ð 	ð 	ðøøøõ ”:à#Ø Ø%Ø&Ø!,Ô!3ðð ð #ð	ñ 	ô 	ð 	ð )ˆð ˆØˆØˆØˆàñ %	Ø&¨Ñ5ˆNØ×$Ò$Ñ&Ô&ð ð#ð #ð #ð #Ø;I×;NÒ;NÈvÑ;VÔ;Vð#ñ #ô #�ð &¨Ñ3ˆMØ×#Ò#Ñ%Ô%ð ðð ð �Cð #×)Ò)ðð ð ð à%2×%8Ò%8¸Ñ%=Ô%=ðñ ô ñô ð ð ð # XÑ-ˆJØ× Ò Ñ"Ô"ð JØ#×)Ò)¨#Ñ.Ô.ð Jð J�AØ—y’y‘{”{ð JØ#×*Ò*­3¨q¯}ª}¸YÑ/GÔ/GÑ+HÔ+HÑIÔIÐIøà# iÑ/ˆKØ×!Ò!Ñ#Ô#ð ØMð ð �CØ ×'Ò'ØVÐVÐVÐVÀ×@PÒ@PÐQTÑ@UÔ@UÐVÑVÔVñô ð ð ð ˆØ—?’? :Ñ.Ô.ˆÝ�h¥Ñ%Ô%ð 	;Ø"Ÿ,š, x°Ñ4Ô4Ð:¸ˆKå˜;Ÿ?š?¨6Ñ2Ô2ÐQ°k·o²oÀfÈbÑ6QÔ6QÑRÔRˆÝ$Ø�OŠOÐ,Ñ-Ô-ÐV°·²ÐAQÐSUÑ1VÔ1Vñ
ô 
ˆð
 ˆØð 	9Ø)8ˆL˜Ñ&Øð 	7Ø(6ˆL˜Ñ%Øð 	1Ø%0ˆL˜Ñ"Øð 	3Ø&2ˆL˜Ñ#ð	vÝ˜8×/Ò/µ
Ñ;Ô;Ñ<Ô<ˆHˆHøÝð 	vð 	vð 	vàLTÌOÔLbÐu•s˜8×/Ò/°´Ô0FÑGÔGÑHÔHÐHÐhpÔhuˆHˆHˆHð	vøøøð !—_’_Ø¨ÐF�H”M�M¸	¼ñ
ô 
ˆ
õ :¸+ÑFÔFÑˆ˜Ý?Ø˜ñ
ô 
Ðõ -Ñ.Ô.ˆÝ‘z”zˆð%
ð %
ð %
ð %
à&ð%
ñ %
ô %
Ð!õ AØØ%ñ
ô 
ˆð %ð 	&Ý#™:œ:ˆLÝ*OØØØ%ð+
ñ +
ô +
Ð'õ
 Ð;Ñ<Ô<ˆð

ð 
ð 
ð 
à&ð
ñ 
ô 
Ðð
 ð 
	ð	ØJÐJÐJÐJÐJÐJà(Ð(Ð)<Ñ=Ô=Ð=Ð=øÝð ð ð Ý—’ØEØØ!ð ñ ô ð ð ð ðøøøð #.§/¢/Ð2MÈrÑ"RÔ"RÐÝÐ1µ4Ñ8Ô8ð 	)Ø&(Ð#Ø#%ÐØ"ð 	ðØLÐLÐLÐLÐLÐLà%>Ð%>Ð?VÑ%WÔ%WÐ"Ø%ð (Ø#'�LøøÝð ð ð Ý—’ØFØØ!ð ñ ô ð ð ð ðøøøð #ÐØð 	ðØNÐNÐNÐNÐNÐNà#;Ð#;ØØØ&ð$ñ $ô $Ð Ð øõ
 ð ð ð Ý—’Ø?ÀÐVZð ñ ô ð ð ð ðøøøð

Ø�tð
à�Jð
ð ˜;Ÿ?š?¨=¸"Ñ=Ô=ð
ð �Dð	
ð
 ˜nð
ð Ð'ð
ð �Hð
ð ¨9Ð>�˜Y™œ˜¸$ð
ð ¨LÐB˜L˜L¸dð
ð Øðð  Wð  Wàð
ð -Ð.?ð
ð   ð
ð 5Ð6Uð
ð  'Ð(:ð!
ð" (¨ð#
ð$ ˜Lð%
ð& ˜^¨OÔ<ð'
ð( Øð!6Õ 4Ô AÔ GÐ Gå%Ô/Ô5ð-
ð 
ˆõ2 ÐQÐQÐ.?ÐQÑQÔQÐSWÑXÔXˆ
Øð 	.Ø#-ˆF�<Ñ àÐ.Ô/ð 	PØ+9Ð:NÔ+OˆFÐ'Ñ(àð 	2ðð Ø3Rðñ ô ðð Ø+=ðñ ô ñˆMõ
 +Ý$Ô1ØØñô ˆJð
 Õ.Ð.Ð.°:Ð.Ø *ð  Vð  V¨W¯]ª]©_¬_ð  Vð  Vð  V�
Øð 2Ø'1��|Ñ$ð �?Š?˜?Ñ+Ô+ð 	CØ&1°/Ô&BˆF�?Ñ#Ý�h¥Ñ%Ô%ð 	*Ø!)ˆF�:ÑåŒz˜&¨uÐ5Ñ5Ô5Ð5øåð 1ð 1ð 1Ý�#˜a™&œ&¨%Ð0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0øøøøð1øøøs¶  ‡Av% ÁA3v% Ã	v% ÃAv% Ä6A2v% Æ)Ev% Ë<L Ìv% Ì
MÌMÌ;MÌ<v% ÍMÍv% Í&'N Îv% Î
NÎv% ÎNÎv% Î#)OÏv% Ï
OÏv% ÏOÏB1v% ÒR  Òv% Ò R/Ò,v% Ò.R/Ò/>v% Ó.Av% Ô:2v% Õ-,v% ÖF"v% Ü>] Ýv% ÝA	^!Þv% Þ ^!Þ!#v% ßH7v% ç='h% è$v% è%A	i1é.v% é0i1é1Cv% ì6m ív% í'm2í/v% í1m2í24v% î'n= î<v% î='o'ï$v% ï&o'ï'v% ï/p ðv% ð'p.ð+v% ð-p.ð.E6v% ö%
wö/w÷w÷wÚ__main__u   ðŸŽ¯ Skills Tool Testz<============================================================u   
ðŸ“‹ Listing all skills:rˆ   zFound r!  z skills in r  z categorieszCategories: z
First 10 skills:é
   rÔ   z] r^   u     â€¢ z: r÷   é<   rù   zError: r2  u   
ðŸ“– Viewing skill 'axolotl':ÚaxolotlzName: zDescription: zN/Aéd   zContent length: z charsr?  zLinked files: uE   
ðŸ“„ Viewing reference file 'axolotl/references/dataset-formats.md':zreferences/dataset-formats.mdzFile: re  z	Preview: é–   r(  zVList available skills (name + description). Use skill_view(name) to load full content.ÚobjectÚstringz*Optional category filter to narrow results)Útyper÷   )rÂ  Ú
propertiesrx   )rp   r÷   Ú
parametersr¹  ah  Skills allow for loading information about specific tasks and workflows, as well as scripts and templates. Load a skill's full content or access its linked files (references, templates, scripts). First call returns SKILL.md content plus a 'linked_files' dict showing available references/templates/scripts. To access those, call again with file_path parameter.zŸThe skill name (use skills_list to see available skills). For plugin-provided skills, use the qualified form 'plugin:skill' (e.g. 'superpowers:writing-plans').z¤OPTIONAL: Path to a linked file within the skill (e.g., 'references/api.md', 'templates/config.yaml', 'scripts/validate.py'). Omit to get the main SKILL.md content.)rp   rI  c                 óp   — t          |                      d¦  «        |                     d¦  «        ¬¦  «        S )Nrú   r  )rú   r  )r(  rU   ©ÚargsÚkws     r/   r  r  Å  s2   € �{Ø—’˜*Ñ%Ô%¨r¯vªv°iÑ/@Ô/@ð ñ  ô  € r=   u   ðŸ“š)rp   ÚtoolsetÚschemaÚhandlerÚcheck_fnÚemojic                 óš   — t          |                      dd¦  «        |                      d¦  «        |                     d¦  «        ¬¦  «        S )Nrp   r^   rI  r  )rI  r  )r¹  rU   rÆ  s     r/   r  r  Ï  sB   € �zØ�Š�˜ÑÔ¨¯ª°Ñ(=Ô(=ÀrÇvÂvÈiÑGXÔGXð ñ  ô  € r=   )r   Nr@   )NN)NNT)OÚ__doc__r%  r‰  Úhermes_constantsr   r   rš   ÚreÚenumr   Úpathlibr   Útypingr   r   r	   r
   r   r   Útools.registryr   r   rŠ  r6   r�   ÚHERMES_HOMErÆ   rþ   rÿ   Ú_PLATFORM_MAPÚcompilers   Ú	frozensetrô   r–  rA   rL   r0   r2   r>   rd   Ú__annotations__rC   re   rF   rQ   rX   rk   r}   r”   rŒ   r¡   r¥   r«   r�   rº   r¼   rÀ   rÏ   rÝ   rá   rã   rî   r
  r  r  r(  rH  r¹  ÚprintÚloadsr·  rÊ   rU   ÚskillÚcatÚSKILLS_LIST_SCHEMAÚSKILL_VIEW_SCHEMAÚregisterr<   r=   r/   ú<module>râ     sÖ  ððAð Að AðF €€€Ø €€€à AÐ AÐ AÐ AÐ AÐ AÐ AÐ AØ 	€	€	€	Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8à /Ð /Ð /Ð /Ð /Ð /Ð /Ð /à	ˆÔ	˜8Ñ	$Ô	$€ð ˆoÑÔ€Ø˜8Ñ#€
ð €ØÐ ð
 ØØðð €ð
 �2”:Ð9Ñ:Ô:Ð Ø �yÐ!<Ñ=Ô=Ð Ø �yÐ!UÐ!UÐ!UÑVÔVÐ ØÐ ð�$�s˜C�x”.ð ð ð ð ð  ð  ð  ð  ð  ˜3 ñ  ô  ð  ð
ð 
ð 
Ð �Tð 
ð 
ñ 
ð(ð (ð (ð (ð
¨¨S°#¨X¬ð ¸4ð ð ð ð ð>¨#ð >°$°s´)ð >ð >ð >ð >ð	Ø�c˜3�h”ð	à
ˆ4�Œ9�d˜3”iÐÔ ð	ð 	ð 	ð 	ð*¨4°°S°¬>ð *¸dÀ3ÈÀ8¼nð *ð *ð *ð *ð^ )-ðBð BØ�c˜3�h”ðBà˜#”Y Ñ%ðBð 
ˆ$ˆs�CˆxŒ.ÔðBð Bð Bð BðJEØðEà˜$˜s C˜xœ.Ô)ðEð 
ˆ#ˆsˆ(„^ðEð Eð Eð EðP<˜Tð <ð <ð <ð <ðN Cð Nð Nð Nð Nð
 :>ð%ð %Øð%Ø!% c¨3 h¤°$Ñ!6ð%à	ð%ð %ð %ð %ð +/ð	ð ð Ø˜D  c œNÔ+ðà˜˜c˜”Nðð �s˜C�x”. 4Ñ'ð	ð
 
ˆ#„Yðð ð ð ð(b˜Sð bð bð bð bð "ðð Ø*ðà�#ŒYðð �d‘
ðð 	ˆ4�Zð	ð ð ð ð 4ð ð ð ð ð
& ð &¨¨d°3¸°8¬n¸cÐ.AÔ(Bð &ð &ð &ð &ð¨ð °¸#´ð ð ð ð ð4P˜t Cœyð Pð Pð Pð Pð>& 3 s¤8ð &ð &ð &ð &ð˜sð ð ð ð ðð ˜Sð ¨Cð ¸4ð ð ð ð ð, /4ð Jð Jð J tð J¸¸TÀ#ÀsÀ(¼^Ô8Lð Jð Jð Jð JðZN˜˜d 3¨ 8œnÔ-ð N°$°t¸CÀ¸H´~Ô2Fð Nð Nð Nð Nð
(¨Tð (°h¸s´mð (ð (ð (ð (ðVA1ð A1˜#ð A1¨sð A1¸cð A1ð A1ð A1ð A1ðX Ø!ðeð eð eØðeàðeð ðeð
 ðeð �d‘
ðeð 	ðeð eð eð eðT ØØð	]1ð ]1Ø
ð]1àð]1ð ð]1ð ð	]1ð
 	ð]1ð ]1ð ]1ð ]1ðD ˆzÒÑØØ	€EÐ
!Ñ"Ô"Ð"Ø	€Eˆ(�O„O€Oð 
€EÐ
&Ñ'Ô'Ð'ØˆTŒZ˜˜™œÑ&Ô&€FØˆiÔð 
+ØˆØ_�V˜G”_Ð_Ð_°°°V·Z²ZÀÈbÑ5QÔ5QÑ1RÔ1RÐ_Ð_Ð_ñ	
ô 	
ð 	
ð 	ˆÐ;˜VŸZšZ¨°bÑ9Ô9Ð;Ð;Ñ<Ô<Ð<ØˆÐ"Ñ#Ô#Ð#Ø˜HÔ% c r cÔ*ð 	Qð 	QˆEØ/4¯yªy¸Ñ/DÔ/DÐLÐ+�e˜JÔ'Ð+Ð+Ð+Ð+È"ˆCØˆEÐO˜3ÐO  f¤ÐOÐO°°}Ô1EÀcÀrÀcÔ1JÐOÐOÐOÑPÔPÐPÐPð	Qð 	ˆÐ)˜˜wœÐ)Ð)Ñ*Ô*Ð*ð 
€EÐ
+Ñ,Ô,Ð,ØˆTŒZ˜
˜
 9Ñ-Ô-Ñ.Ô.€FØˆiÔð +ØˆÐ'�v˜f”~Ð'Ð'Ñ(Ô(Ð(ØˆÐI˜fŸjšj¨¸Ñ>Ô>¸tÀ¸tÔDÐIÐIÐIÑJÔJÐJØˆÐ?   V¨IÔ%6Ñ!7Ô!7Ð?Ð?Ð?Ñ@Ô@Ð@Ø�:Š:�nÑ%Ô%ð 	=ØˆEÐ; 6¨.Ô#9Ð;Ð;Ñ<Ô<Ð<øàˆÐ)˜˜wœÐ)Ð)Ñ*Ô*Ð*ð 
€EÐ
RÑSÔSÐSØˆTŒZ˜
˜
 9Ð.MÑNÔNÑOÔO€FØˆiÔð +ØˆÐ'�v˜f”~Ð'Ð'Ñ(Ô(Ð(ØˆÐ?   V¨IÔ%6Ñ!7Ô!7Ð?Ð?Ð?Ñ@Ô@Ð@ØˆÐ6˜& Ô+¨D¨S¨DÔ1Ð6Ð6Ð6Ñ7Ô7Ð7Ð7àˆÐ)˜˜wœÐ)Ð)Ñ*Ô*Ð*ð ØkààØ ØKðð ð
ð ð	ð 	ðð Ð ð  ð ~àð !ð  Aðð ð
 !ð  Fðð ð	
ð 	
ð �Hðð ðð Ð ð& €Ô Ø	ØØðð ð 'Ø
ð	ñ 	ô 	ð 	ð €Ô Ø	ØØðð ð 'Ø
ð	ñ 	ô 	ð 	ð 	ð 	r=   