
    iI                     |
   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<   dd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/	 dd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	 dd&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	 dd.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<dd9e$d:e$de+fd;Z=d<d=d>e+deee$ef                  fd?Z>d@edee$         fdAZ?ddBe$dCe$de$fdDZ@dEedFe$dGe$de$fdHZAdd9e$dIe$dCe$de$fdJZBedKk    ro	  eCdL            eCdM            eCdN            ejD         e@                      ZEeEdO         r eCdPeEdQ          dR eFeEG                    dSg                      dT            eCdUeEG                    dSg                        eCdV           eEd         ddW         D ]MZHeHG                    dB          rdXeHdB          dYndZZI eCd[eI eHd9          d\eHd]         dd^          d_           Nn eCd`eEda                      eCdb            ejD         eBdc                    ZEeEdO         r eCddeEd9                      eCdeeEG                    d]df          ddg          d_            eCdh eFeEd3                    di           eEG                    dj          r eCdkeEdj                     n eCd`eEda                      eCdl            ejD         eBdcdm                    ZEeEdO         rP eCdneEdo                      eCdh eFeEd3                    di            eCdpeEd3         ddq          d_           n eCd`eEda                     drdsdtdBdudvdwig dxdyZJdzd{dtdud|dwdud}dwd~d9gdxdyZK ejL        drdeJd e8d            ejL        dzdeKd 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 |                                 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#="'N)r   existsopenstrip
startswith	partition)env_pathenv_varsflinekey_values          9/home/agentuser/.hermes/hermes-agent/tools/skills_tool.pyload_envr-   k   s.     6)H!H?? 	 CA 	C 	CD::<<D CDOOC00 CSD[[ $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,   r/   r/   {   s        I!LKKKr:   r/   )	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_callbackr@      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_utilsrC   )rA   _impls     r,   rC   rC      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 r9   strr"   ).0items     r,   
<listcomp>z2_normalize_prerequisite_values.<locals>.<listcomp>   s3    ===$3t99??+<+<=CII===r:   )
isinstancerI   )r+   s    r,   _normalize_prerequisite_valuesrN      s<     	% ==%====r:   c                     |                      d          }|rt          |t                    sg g fS t          |                     d                    t          |                     d                    fS )Nprerequisitesr&   commands)getrM   dictrN   )rA   prereqss     r,   _collect_prerequisite_valuesrU      so     ooo..G *Wd33 2v&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_secretsrX   rY   env_var promptEnter value for provider_urlurlsecretT)rZ   r\   r`   )rR   rM   rS   rI   r"   listboolappend)rA   rW   	help_textnormalized_helpcollect_secrets_rawrY   rK   rZ   r\   r^   entrys              r,   _normalize_setup_metadatarh      s   OOG$$EeT"" 5444		&!!I i%%	*3//*;*;	I   ))$566%t,, 423)400 ! ,.O# & &$%% 	dhhy))/R006688 	TXXh''G+Gg+G+GHHNNPP488N33LtxxL"MMSSUU 488Hd3344!
 !

  	1$0E.!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_variablesrg   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namerZ   r[   r\   r]   )rm   r\   rX   r^   r_   required_foroptionalT)rI   rR   r"   _ENV_VAR_NAME_REmatchrM   addrc   )rg   env_name
normalizedrd   rn   requiredseenrW   s        r,   _append_requiredz=_get_required_environment_variables.<locals>._append_required   s   uyy((FEIIi,@,@FBGGMMOO 	8t++F%%h// 	F %))H--N1NH1N1NOOUUWW&
 &

 IIf !yy((!yy! yy  	 	 i%% 	3)//*;*; 	3!*!2!2Jvyy00lC(( 	>\-?-?-A-A 	>)5););)=)=J~&99Z   	*%)Jz"
#####r:   rm   rY   rZ   r\   r^   rX   )rm   r\   rX   )
rh   rR   rM   rS   ra   setr   rI   r   rU   )
rA   ri   required_rawrw   rK   r*   rZ   ru   rv   rW   s
          @@@r,   #_get_required_environment_variablesrz      s    &k22E??#CDDL,%% &$~lD)) %'HUUD$S#X $4 $ $ $ $ $ $ $ $>  # #dC   	fd^,,,dD!! 	#T"""'( 
 
++((8,,00EEIIf4E4E 	
 	
 	
 	
 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 rm   r9   )rJ   rg   s     r,   rL   z;_capture_required_environment_variables.<locals>.<listcomp>/  s    @@@uU6]@@@r:   r{   rX   rn   rm   r\   z#Secret capture callback failed for Texc_info)success	stored_as	validatedskippedr   r   )_is_gateway_surface_gateway_setup_hintr>   rR   	ExceptionloggerwarningrM   rS   rb   rc   )
r{   r|   r~   r   remaining_namesrg   metadatacallback_resultr   r   s
             r,   '_capture_required_environment_variablesr   $  s7     
""&
 
 	
 A@@@@M 
*""5"7"7
 
 	
  '*""&
 
 	
 M!#O  ". ". *-99V 	-$V}HV99^$$ 	=',^'<H^$	6fh OO
  		 		 		NNEeFmEEPT     !"6]"	 OOO			 _d33 
	**9
 9
 _d33 
	**9
 9
  	7 	uV}---- )&"  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   rb   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)rI   r   r   r"   lowerr9   r:   r,   _get_terminal_backend_namer   s  s9    ry112288::@@BBMgMr:   var_nameenv_snapshotc                     |t                      }| |v r"t          |                    |                     S t          t          j        |                     S r=   )r-   rb   rR   r   r   )r   r   s     r,   _is_env_var_persistedr   w  sR     zz<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~   rm   ro   )rx   r-   rR   r   rc   )r   r   r   r~   	remainingrg   rm   s          r,   %_remaining_required_environment_namesr     s     788MzzI" # #V}99Z   	=  (=dL(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 . )r/   r7   join)r   r   r   missing_strnotes        r,   _build_setup_noter     se    
 /<<<,3Qdii(((9QNNNN 	*))Z)))4r:   c                      dS )zOSkills are always available -- the directory is created on first use if needed.Tr9   r9   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)rD   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_DIRrD   r   extendr   relative_topartslen
ValueError)r   dirs_to_checkr   
skills_dirrel_pathr   s         r,   _get_category_from_pathr     s      LM>>>>>>55778888   #  
	!--j99HNE5zzQQx  	 	 	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 r9   rH   rJ   ts     r,   rL   z_parse_tags.<locals>.<listcomp>  s+    8881a8A888r:   []   c                     g | ]=}|                                 |                                                      d           >S )r   )r"   r   s     r,   rL   z_parse_tags.<locals>.<listcomp>  s9    OOOqQWWYYOAGGIIOOE""OOOr:   ,)rM   ra   rI   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OJ,<,<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)rD   r   r   s    r,   _get_disabled_skill_namesr     s%     ;:::::##%%%r:   rm   platformc                 0   ddl }	 ddlm}  |            }|                    di           }|p |j        d          }|r/|                    di                               |          }|| |v S | |                    dg           v S # t
          $ r Y dS w xY w)	z'Check if a skill is disabled in config.r   N)load_configr   HERMES_PLATFORMplatform_disableddisabledF)r   hermes_cli.configr   rR   r   r   )rm   r   r   r   config
skills_cfgresolved_platformr   s           r,   _is_skill_disabledr     s    III111111ZZ"--
$D		2C(D(D 	1 */BB G G K KL] ^ ^ ,000z~~j"5555   uus   A(B /B 
BBF)skip_disabledr   c           	         ddl 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   SKILL.mdc              3   (   K   | ]}|t           v V  d S r=   )_EXCLUDED_SKILL_DIRS)rJ   parts     r,   	<genexpr>z#_find_all_skills.<locals>.<genexpr>*  s(      KKD4//KKKKKKr:   utf-8encodingNi  rm   descriptionr[   
r   r   ...)rm   r   categoryz Failed to read skill file %s: %sz)Skipping skill at %s: failed to parse: %sTr   )rD   r   rx   r   r   r    rc   r   rglobanyr   parent	read_textr   rC   rR   rm   MAX_NAME_LENGTHr"   r   r#   r   MAX_DESCRIPTION_LENGTHr   rr   UnicodeDecodeErrorPermissionErrorr   debugr   )r   r   r   
seen_namesr   dirs_to_scanscan_dirskill_md	skill_dirr   rA   bodyrm   r   r(   r   es                    r,   _find_all_skillsr    s    ;:::::FeeJ &Fsuuu+D+F+FH L (J'''0022333  / / z22 .	 .	HKKHNKKKKK  I(",,g,>>uuE$6w$?$?!T-k:: "vy~>>?O?OP:%%8##)oomR@@" " $

 2 24 8 8 " "#zz|| "(<(< "*.K!E{##&<<<"-.I/E/I.I"JU"RK28<<t$$$ #. (      '8   ?1MMM   ?1W[     	U.	` Ms7   ?H,H8H=CHJ+IJI>>J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   rR   r"   r   r#   r   r   r   r   r   r   r   r   )r	  	desc_filer   rA   r  r   r(   r  s           r,   _load_category_descriptionr  \  s    //I t%%w%77.w77T "oomR88 	

**400  zz||  4 4 "&KE {444%&B(>(B&BCeKK)3{{t30   A9aPPPttttt   7APT 	 	
 	
 	
 ttttt	s$   CC) )E:DE)EEr   task_idc                 r    	 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             }|                    d
            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   rR   )rJ   sr   s     r,   rL   zskills_list.<locals>.<listcomp>  s/    QQQ1553D3D3P3P!3P3P3Pr:   c                 @    |                      d          pd| d         fS )Nr   r[   rm   r  )r  s    r,   <lambda>zskills_list.<locals>.<lambda>  s     quuZ'8'8'>B&	&J r:   )r)   c              3   j   K   | ].}|                     d           |                     d           V  /dS )r   Nr  rJ   r  s     r,   r   zskills_list.<locals>.<genexpr>  s?      KKaz9J9J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  sortsortedrx   r   r   r   rI   )r   r  
all_skillsr  r  s   `    r,   skills_listr%    s   31  "" 
	TD999:# "$nObOdOdnnn	  #    &''
 		:# "$F	  #     	RQQQQZQQQJ 	JJKKK KK:KKKKK
 

 z$(ZZ  	
 	
 	
 		
  1 1 1#a&&%0000000001s+   AD #*D A5D 
D6D1+D61D6r  	namespacebarec           
      B   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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   r,  r   c              3   D   K   | ]}|                                 v V  d S r=   )r   )rJ   pr   s     r,   r   z&_serve_plugin_skill.<locals>.<genexpr>  s0      
=
=A1
=
=
=
=
=
=r:   zIPlugin skill '%s:%s' contains patterns that may indicate prompt injectionr   r[   r   r   c                      g | ]
}|k    |S r9   r9   )rJ   r  r'  s     r,   rL   z'_serve_plugin_skill.<locals>.<listcomp>  s*     
 
 
Dyy yyr:   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.]

T)r   rm   r   r   linked_filesr   )hermes_cli.pluginsr)  r*  r   r!  r   r   r   rC   r/   r8   r+   r   r;   r   r   rI   rR   r   r   list_plugin_skillsr   r6   )r  r&  r'  r)  r*  r  parsed_frontmatterr*   r   siblingssib_listbannerr   s     `         @r,   _serve_plugin_skillr=    s    MLLLLLLL))++++z Iy I I=FI I  	
 	
 	
 		

$$g$66 
 
 
z(Y(Y(YT(Y(YVW(Y(YZZ
 
 
 	
 	
 	
 	
 	
 	

 *, 27 ; ;AA    ""455 
z Y9YYtYYY$8$D$J 
 
 
 
 	
 
=
=
=
=)<
=
=
=== 
Wt	
 	
 	

 (,,]B??@@K
;000!">$:Q$>">?%G
 
 
 
))++>>yII
 
 
  	^yy**H`y ` `#+` `?H` `KSTU;` ` ` F ^I]]]F    : ))4))/5B&+'+++7&  4 > D	
 	
 
 
 
 
sB   A 
B!A?9B?B
B 
B*)B*9AG G%$G%	file_pathc                   DEFGH 	 d| v r'ddl m}m} ddlm}m}  ||           \  F} |F          s t          j        ddF d|  dd	d
          S  |              |            }|                    |           }	|	Z|		                                s5|
                    |            t          j        dd|  d|	 dd	d
          S t          |	F|          S |                    F          }
|
rBt          j        dd| dF dFfd|
D             dF dt          |
           ddd
          S ddl m} g }t          	                                r|                    t                     |                     |                       |st          j        ddd	d
          S dHd}|D ]y}|| z  }|                                r |dz  	                                r	|H|dz  } n?|                    d          	                                r|                    d          } nz|s<|D ]9}|                    d          D ]}|j        j        | k    r|j        H|} n|r n:|s3|D ]0}|                    |  d          D ]}|j        dk    r|} n|r n1|r|	                                s?d t/                      dd         D             }
t          j        dd|  d|
ddd
          S 	 |                    d          }n6# t2          $ 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# t2          $ r Y nw xY w|D ]=}	 |                                                    |           d} n# t8          $ r Y :w xY w|                                Dt=          Dfd%t>          D                       }|s|ryg }|r|                    d&|            |r|                    d'           ddl }|!                    tD                    #                    d(| d)$                    |                     i }	 tK          |          \  }}n# t2          $ r i }Y nw xY wtM          |          s-t          j        dd|  d*tN          j(        j)        d+d
          S |*                    d,|j        j                  }tW          |          rt          j        dd| d-d	d
          S |rHrdd.l,m-}m.}  ||          rt          j        dd/d0d1d
          S H|z  } ||H          } | rt          j        d| d0d1d
          S |	                                sg g g g g d2}!H                    d3          D ]/}"|"/                                r|"j        dk    rta          |"                    H                    }#|#1                    d4          r|!d5                             |#           w|#1                    d6          r|!d7                             |#           |#1                    d8          r|!d9                             |#           |#1                    d:          r|!d;                             |#           |"j2        d<v r|!d=                             |#           1d> |!3                                D             }!t          j        dd?| d@|  d|!dAdBd
          S 	 |                    d          }nO# th          $ rB t          j        d"| |dC|j         dD|5                                j6         dEd"dFd
          cY S w xY wt          j        d"| |||j2        dGd
          S |}$g }%g }&g }'g }(HrXHd5z  })|)	                                r!HfdH|)7                    dI          D             }%Hd7z  }*|*	                                r9dJD ]6}+|&                    HfdK|*                    |+          D                        7Hd9z  },|,	                                ra|,                    d3          D ]K}"|"/                                r5|'                    ta          |"                    H                               LHd;z  }-|-	                                r9dLD ]6}+|(                    HfdM|-7                    |+          D                        7i }.|$*                    dN          }/tq          |/tr                    r|/*                    dOi           pi }.tu          |.*                    dP          p|$*                    dPdQ                    }0tu          |.*                    dR          p|$*                    dRdQ                    }1i }2|%r|%|2d5<   |&r|&|2d7<   |'r|'|2d9<   |(r|(|2d;<   	 ta          |                    t                              }3nO# t8          $ rB |j        j        r,ta          |                    |j        j                            n|j        }3Y nw xY w|$*                    d,Hs|j;        nHj                  }4ty          |$          \  }5}t{          |$|5          }6t}                      }7t                      EEfdS|6D             }8t          |4|8          }9|8rt                      Et          |6|9ET          Gt          G          }:GfdU|6D             };|;r@	 ddVlCmD}<  |<|;           n-# t2          $ r  t          F                    dW|4d"X           Y nw xY w|$*                    dYg           }=tq          |=t                    sg }=g }>|=rD	 ddZlHmI}?  |?|=          }>|>rd"}:n-# t2          $ r  t          F                    d[|4d"X           Y nw xY wi d\d"d,|4d]|$*                    d]dQ          dP|0dR|1d^|d_|3d`Hrta          H          ndda|2r|2nddb|2rdcnddd|6deg dfGdg|>dhg di|:dj|9dj         dk|:rtN          jJ        j)        ntN          jK        j)        i}@t          dl |6D             d          }A|Ar|A|@dm<   |9dn         r|9dn         |@dn<   |:r`do GD             dp |>D             z   }Bt          tN          jJ        |B|A          }C|7t          v r|Cr|C dq|7O                                 dr}C|Cr|C|@ds<   |$*                    dt          r|$dt         |@dt<   tq          |/tr                    r|/|@dN<   t          j        |@d
          S # t2          $ r(}t          ta          |          du          cY d}~S d}~ww xY w)va  
    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

    Returns:
        JSON string with skill content or error message
    r.  r   )is_valid_namespaceparse_qualified_name)discover_pluginsr*  FzInvalid namespace 'z' in 'z('. Namespaces must match [a-zA-Z0-9_-]+.r+  r  Nr0  z' file no longer exists at uT   . The registry entry has been cleaned up — try again after the plugin is reloaded.z' not found in plugin 'z'.c                     g | ]	} d | 
S )r.  r9   )rJ   r  r&  s     r,   rL   zskill_view.<locals>.<listcomp>c  s'    ,S,S,SA	-?-?A-?-?,S,S,Sr:   zThe 'z' plugin provides z
 skill(s).)r   r,  available_skillsr  r   zISkills directory does not exist yet. It will be created on first install.r   .mdc                     g | ]
}|d          S r   r9   r  s     r,   rL   zskill_view.<locals>.<listcomp>  s    DDDq6DDDr:      z' not found.z+Use skills_list to see all available skillsr   r   r-  r/  Tc              3   >   K   | ]}|                                 V  d S r=   )resolve)rJ   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=   r9   )rJ   r4  _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; r1  r2  rm   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   r,  r  )
references	templatesassetsscriptsother*zreferences/rO  z
templates/rP  zassets/rQ  zscripts/rR  )rE  z.pyz.yamlz.ymlz.jsonz.texz.shrS  c                     i | ]
\  }}|||S r9   r9   )rJ   kvs      r,   
<dictcomp>zskill_view.<locals>.<dictcomp>2  s#    "Q"Q"QDAqq"Q1a"Q"Q"Qr:   zFile 'z' not found in skill 'z0Use one of the available file paths listed above)r   r,  available_filesr  z[Binary file: z, size: z bytes])r   rm   filer   	is_binary)r   rm   rZ  r   	file_typec                 T    g | ]$}t          |                                        %S r9   rI   r   rJ   r'   r  s     r,   rL   zskill_view.<locals>.<listcomp>e  s:     # # #67Ci0011# # #r:   *.md)r`  *.pyz*.yamlz*.ymlz*.jsonz*.tex*.shc                 T    g | ]$}t          |                                        %S r9   r^  r_  s     r,   rL   zskill_view.<locals>.<listcomp>u  s=        !  i 8 899  r:   )ra  rb  z*.bashz*.jsz*.tsz*.rbc                 T    g | ]$}t          |                                        %S r9   r^  r_  s     r,   rL   zskill_view.<locals>.<listcomp>  s-    VVV1Q]]95566VVVr:   r   hermestagsr[   related_skillsc                 j    g | ]/}|                     d           t          |d                   -|0S )ro   rm   )rR   r   )rJ   r  r   s     r,   rL   zskill_view.<locals>.<listcomp>  sS     %
 %
 %
55$$%
 *!F)\BB	%
%
 %
 %
r:   r   c                 4    g | ]}|d          v|d          S r   r9   )rJ   r  remaining_missing_required_envss     r,   rL   zskill_view.<locals>.<listcomp>  s7     
 
 
y ??? fI???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   r   pathr  r6  
usage_hintzzTo view linked files, call skill_view(name, file_path) where file_path is e.g. 'references/api.md' or 'assets/config.yaml'rk   required_commands&missing_required_environment_variablesmissing_credential_filesmissing_required_commandsr1   r   r   c              3   P   K   | ]!}|                     d           |d          V  "dS )rX   Nr  )rJ   r  s     r,   r   zskill_view.<locals>.<genexpr>  s5      QQ155==Q1V9QQQQQQr:   r   r   c                     g | ]}d | S )zenv $r9   )rJ   rs   s     r,   rL   zskill_view.<locals>.<listcomp>  s.       '/"""  r:   c                     g | ]}d | S )zfile r9   )rJ   rn  s     r,   rL   zskill_view.<locals>.<listcomp>  s+       #'  r:   r   zW-backed skills need these requirements available inside the remote environment as well.
setup_notecompatibilityr  )QrD   r@  rA  r7  rB  r*  r   r!  find_plugin_skillr    remove_plugin_skillr=  r8  r   r   r   rc   r   is_dirwith_suffixr   r   rm   r  r   r   rI  r   r   r   r   r;   logging	getLoggerr3   r   r   r   rC   r/   r8   r+   rR   r   tools.path_securityrM  rN  is_filerI   r#   suffixitemsr   statst_sizeglobrM   rS   r   stemrU   rz   r   r-   r   r   rb   tools.env_passthroughrk  r   r   ra   tools.credential_filesrm  r7   r6   nextr   _REMOTE_ENV_BACKENDSupperr   )Irm   r>  r  r@  rA  rB  r*  r'  pmplugin_skill_mdr0   r   all_dirsr  
search_dirdirect_pathfound_skill_mdfound_mdr   r  _outside_skills_dir_trusted_dirs_td_injection_detected	_warnings_loggingr9  r*   resolved_namerM  rN  target_filetraversal_errorrY  r'   relrA   reference_filestemplate_filesasset_filesscript_filesreferences_dirtemplates_dirext
assets_dirscripts_dirhermes_metar   rf  rg  r6  r   r{   ri   r   backendmissing_required_env_varsr   r1   available_env_namesrk  required_cred_files_rawmissing_cred_filesrm  resultr   missing_itemsrw  rL  r   r&  rj  r  sI                                                                       @@@@@r,   
skill_viewr  $  s   r1 $;;RRRRRRRROOOOOOOO22488OIt%%i00 
z#(E) E E4 E E E  "'	 	 	 	 ##%%B 22488O*&--// **4000:',!7$ !7 !7#2!7 !7 !7  &+    +?ItLLL --i88I 	z#(!U4!U!U	!U!U!U,S,S,S,S,S,S,S _	 _ _S^^ _ _ _	  "'    	?>>>>>  	(OOJ'''0022333 	:$h  #    	 # 		 		J$t+K!!## z)A(I(I(K(K '	&3((//6688 &22599
  	&  
&0&6&6z&B&B  N%,1T99$2$9	#1 :  E  	&  
 * 0 0D > >  H}
22#+ 3  E  
	x00 
	DD,<,>,>ss,CDDDI:$9t999(1I	  #   		(('(::GG 	 	 	:$BdBBqBB  #        	 ##++--.	   C Chqrrl C C CCCCC 	 	 	D	  	 	C  ""..s333&+#   
 !!!S!S!S!S?R!S!S!SSS 	t"5 	tI" x  !vlt!v!vwww" g  !efff&&&&x((001VX\^b^g^ghq^r^rsss-/	$$6w$?$?! 	$ 	$ 	$!#	$ &&899 	:$QtQQQ(<(H(N 
 #    +..vx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IO z#(!0 P 
 "'    %%'' , #%!# !# # #-- A AAyy{{ Aqv';';!!--	":":;;>>-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"QO4I4I4K4K"Q"Q"Qz#(!S)!S!S4!S!S!S+: R	  "'   %///AA%   z#' $ )#qK4D#q#qkN^N^N`N`Nh#q#q#q%)  "'	 	 	 	 	 	 :# %&!,!3  #	 	 	 	 )  %	&5N$$&& # # # #;I;N;Nv;V;V# # # &3M##%%   C #))   %2%8%8%=%=      #X-J  "" J#))#.. J JAyy{{ J#**3q}}Y/G/G+H+HIII#i/K!!## M  C ''VVVV@P@PQT@U@UVVV    ??:..h%% 	;",,x44:K;??622Qkoofb6Q6QRR$OO,--VAQSU1V1V
 

  	9)8L& 	7(6L% 	1%0L" 	3&2L#	v8//
;;<<HH 	v 	v 	vLTOLbus8//0FGGHHHhphuHHH	v !__FHMM	
 

 :+FF?
 
 -..zz%
 %
 %
 %
&%
 %
 %
! A%
 
 % 	&#::L*O%+
 +
 +
'
 ;<<

 
 
 
&
 
 

  
		JJJJJJ(()<====   E!       #.//2Mr"R"R1488 	)&(##%" 	LLLLLL%>%>?V%W%W"% (#'L   F!      
t
J
 ;??="==
 D	

 n
 w
 H
 9>Y$
 LBLLd
   W  W
 -.?
  
 56U
  '(:!
" (#
$ L%
& ^O<'
( !6 4 A G G%/5-
 
2 QQ.?QQQSWXX
 	.#-F< ./ 	P+9:N+OF'( 	2 3R   +=  M
 +$1 J
 ...:. *  V  VW]]__  V  V  V
 2'1|$ ???++ 	C&1/&BF?#h%% 	*!)F:z&u5555 1 1 1#a&&%0000000001s  Au A3u 	u Au 3A2u &Eu /L u 
L9L4.L9/u 4L99u 'N  u 
Nu Nu )O?u 
Ou OB6u R u R'$u &R''>u &Au 22u %,u F"u 6] u A	^u ^#u =H7u 5'h u A	i)&u (i))Cu .m  ?u  'm*'u )m**4u n5 4u 5'ou oE6u 
v v=vv__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: r,  u   
📖 Viewing skill 'axolotl':axolotlzName: zDescription: zN/Ad   zContent length: z charsr6  zLinked files: uE   
📄 Viewing reference file 'axolotl/references/dataset-formats.md':zreferences/dataset-formats.mdzFile: rZ  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  
propertiesru   )rm   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.zThe skill name (use skills_list to see available skills). For plugin-provided skills, use the qualified form 'plugin:skill' (e.g. 'superpowers:writing-plans').zOPTIONAL: 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.)rm   r>  c                 p    t          |                     d          |                    d                    S )Nr   r  )r   r  )r%  rR   argskws     r,   r  r  }  s2    {*%%rvvi/@/@      r:   u   📚)rm   toolsetschemahandlercheck_fnemojic                     t          |                     dd          |                     d          |                    d                    S )Nrm   r[   r>  r  )r>  r  )r  rR   r  s     r,   r  r    sB    z(=(=rvviGXGX      r:   )r   Nr=   )NN)M__doc__r   r}  hermes_constantsr   r   r   reenumr   pathlibr   typingr   r   r	   r
   r   r   tools.registryr   r   r~  r3   r   HERMES_HOMEr   r   r   _PLATFORM_MAPcompilerp   	frozensetr   r  r>   rI   r-   r/   r;   ra   __annotations__r@   rb   rC   rN   rU   rh   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r%  r=  r  printloadsr  r   rR   skillcatSKILLS_LIST_SCHEMASKILL_VIEW_SCHEMAregisterr9   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  $sCx.              3      
 
 
 T 
 
 
( ( ( (
S#X 4    ># >$s) > > > >	c3h	
49d3i 	 	 	 	*4S> *d38n * * * *^ )-B Bc3hB#Y%B 
$sCx.B B B BJEE$sCx.)E 
#s(^E E E EP<T < < < <NC N N N N
 :>% %%!%c3h$!6%	% % % % +/	  DcN+cN sCx.4'	
 
#Y   (bS b b b b " *#Y d
 	4Z	   4    
& &d38nc.A(B & & & & #    4PtCy P P P P>&3s8 & & & & S C 4    " /4 J J Jt JT#s(^8L J J J JZ(T (hsm ( ( ( (VA1 A1# A1s A1c A1 A1 A1 A1NSSS S 		S S S Sl1 1S 1S 1# 1 1 1 1 1H z	E
!"""	E(OOO 
E
&'''TZ&&Fi 
+_VG___VZZb5Q5Q1R1R___	
 	
 	
 	;VZZb99;;<<<"###H%crc* 	Q 	QE/4yy/D/DL+eJ'++++"CEO3OfOO}1Ecrc1JOOOPPPP	Q 	)w))*** 
E
+,,,TZ

9--..Fi +'vf~''(((Ifjj>>ttDIIIJJJ?VI%6!7!7???@@@::n%% 	=E;6.#9;;<<<)w))*** 
E
RSSSTZ

9.MNNOOFi +'vf~''(((?VI%6!7!7???@@@6&+DSD16667777)w))*** k K 
 	 	     ~ !  A 
 !  F 	
 	
 H   &  	  '
	 	 	 	  	  '
	 	 	 	 	 	r:   