+
    lHàj—¸  ã                   ó¬  a € R– t~0 t R t^ RIt^ RIt^ RIt^ RIHtHt ^ RI	t	^ RI
t
^ RIt^ RIHt ^ RIHtHtHtHtHt ^ RIt^ RIHt ^ RIHtHt ^ RIHt ^ RIHtHtH t!H"t" ^ R	I#H$t$H%t%H&t&H't'H(t(H)t)H*t*H+t+H,t,H-t. ^ R
I/H0t0H1t1H2t2H3t3H4t4 ^ RI5H6t6H7t7H8t8 ]	Pr                  ! ]:4      t;R R lt<R R lt=]! 4       t>]>R,          t?]?t@R R ltAR R ltBR R ltCR tD^@tERtFRtGRtH]
P’                  ! R4      tJ0 R—mtK]
P’                  ! R4      tLRtMR R ltNR  R! ltOR" R# ltPR$R%/R& R' lltQR˜R( R) lltRR* R+ ltSR™R, R- lltTR. R/ ltUR0 R1 ltVR2 R3 ltWR4 R5 ltXRšR6 R7 lltYR8 R9 ltZR: R; lt[RšR< R= llt\R> R? lt]R@ RA lt^R™RB RC llt_RD RE lt`R™RF RG lltaRH RI ltbR›RJ RK lltcR™RL RM lltdRN RO lteRP RQ ltfRR RS ltg]PÐ                  ! RTR%RU7      ti] ^ k RV tjRW tkRœtlR` Ra ltmRb Rc ltnRd toReRf RgRh Ri]oRjRk RlRm RnRo /tpRp Rq ltqR�Rr Rs lltrRt Ru ltsRvRw/ttRvRwRxRy/tuRvRwRxRz/tvRvRwRxR{/twR| R} ltxR~RRx]s! 4       R€RvR�R‚R_RvRƒRxR„R…R†]x! ReRXRvRwRxR‡/RYRvRwRxRˆ//Rž4      ]x! RiR\]uR]]vR‰RvRŠRxR‹/RZRvRwRxRŒ//RŸ4      ]x! RiRXRvRwRxR�//Rž4      ]x! RlRZ]wR[RvRwRxRŽ//R 4      ]x! RnRZRvRwRxR�//R¡4      ]x! RjR^RvRwRxR�//R¢4      .///R‘R_.//ty^ R’IzH{t{H|t| ]{Pú                  ! RR]yR“R” R•7       R# )£u‘  Skill Manager Tool â€” agent-managed skill creation & editing.

Skills are the agent's procedural memory (narrow "how to do X"; MEMORY.md/USER.md are
broad, declarative). New skills land in ~/.hermes/skills/ (or ``skills.create_dir``);
existing skills (bundled, hub, user) are modified in place. Layout:
``<skills>/[category/]<skill>/SKILL.md`` + optional ``references/ templates/ scripts/ assets/``.
N)Ú	ExitStackÚsuppress©ÚPath)ÚAnyÚDictÚListÚOptionalÚTuple)Úget_hermes_home)Úatomic_write_textÚis_truthy_value)Úcfg_get)Úextract_skill_descriptionÚ)is_skill_description_truncated_for_promptÚparse_frontmatterÚSKILL_PROMPT_DESC_LIMIT)
Ú_background_review_delete_guardÚ_background_review_preflightÚ*_background_review_read_before_write_guardÚ_containing_skills_rootÚ#_curator_consolidation_delete_guardÚ_is_path_redirectÚ_pinned_guardÚ_validate_delete_targetÚ_is_background_reviewÚ_refusal)Ú_PATCH_EITHER_ORÚ_PATCH_NEEDS_NEW_STRINGÚ_PATCH_NEEDS_OLD_STRINGÚ_op_shape_errorÚ_skill_manage_batch)Ú
scan_skillÚshould_allow_installÚformat_scan_reportc                ó$   € V ^8„  d   QhR\         /# ©é   Úreturn)Úbool)Úformats   "Ú=/home/ubuntu/.hermes/hermes-agent/tools/skill_manager_tool.pyÚ__annotate__r,   )   s   € ÷ ñ ¤dñ ó    c                 ón   €  ^ RI Hp  \        \        V ! 4       RR4      RR7      #   \         d     R# i ; i)u]   skills.guard_agent_created (default False): opt-in â€” terminal() runs the same code ungated.©Úload_configÚskillsÚguard_agent_createdF©Údefault)Úhermes_cli.configr0   r   r   Ú	Exceptionr/   s    r+   Ú_guard_agent_created_enabledr7   )   s6   € ðÝ1Üœw¡{£}°hÐ@UÓVÐ`eÔfÐføÜô Úðús   ‚"% ¥4³4c                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r'   Ú	skill_dirr(   ©r   r	   Ústr)r*   s   "r+   r,   r,   2   s   € ÷ ñ ¤Dð ¬X´c­]ñ r-   c                ó&  € \        4       '       g   R#  \        V RR7      p\        V4      w  r#Vf   \        P	                  RV4       VRJd   RV R\        V4       2#  R#   \         d$   p\        P	                  RYRR	7        Rp?R# Rp?ii ; i)
z Post-write scan (opt-in); error string if blocked, else None. An "ask" verdict
(dangerous findings) is surfaced as an error so the agent can retry without them.Nzagent-created)Úsourcez4Agent-created skill blocked (dangerous findings): %sTz"Security scan blocked this skill (z):
zSecurity scan failed for %s: %s©Úexc_info)r7   r"   r#   ÚloggerÚwarningr$   r6   )r9   ÚresultÚallowedÚreasonÚes   &    r+   Ú_security_scan_skillrF   2   sž   € ô (×)Ò)ÙðWÜ˜I¨oÔ>ˆÜ.¨vÓ6‰ˆØŠ?Ü�N‰NÐQÐSYÔZØ˜$ÓØ7¸°x¸tÔDVÐW]ÓD^ÐC_Ð`Ð`ð ñ øô ô WÜ�‰Ð8¸)ÐQUˆ×VÐVÙûðWús   ”A
A" Á"BÁ-BÂBr1   c                ó$   € V ^8„  d   QhR\         /# r&   r   )r*   s   "r+   r,   r,   I   s   € ÷ _ñ _”Tñ _r-   c                 ó\   € \        \        4      p V \        8w  d   V # \        4       R,          # )aw  Active profile's skills dir at call time (multi-profile runtimes rebind per session).
An explicitly patched module-level ``SKILLS_DIR`` (tests) wins over the live HERMES_HOME.

Long-lived multi-profile runtimes (Dashboard/TUI/Desktop backend, cron, kanban workers) import this
module once under the launch HERMES_HOME and later bind a different profile per session (#40677).
r1   )r   Ú
SKILLS_DIRÚ_SKILLS_DIR_AT_IMPORTr   )Ú
configureds    r+   Ú_skills_dirrL   I   s*   € ô ”jÓ!€JØ#Ô'<Ô<ˆ:Ð^Ä/ÓBSÐV^ÕB^Ð^r-   c                ó0   € V ^8„  d   QhR\         R\        /# ©r'   Únamer(   ©r;   r   )r*   s   "r+   r,   r,   T   s   € ÷ 7ñ 7œ3ð 7¤4ñ 7r-   c                óÆ   € \         P                  ! \        V 4      P                  P	                  RR4      4      P                  4       p\        4       R,          V R2,          # )a]  Per-skill lock file under ``<skills>/.locks/`` (same idiom as the usage ledger's
``.usage.json.lock``), never inside the skill dir so delete/recreate cannot unlink it under a
waiting writer. Keyed by a digest of the basename so ``foo`` and ``category/foo`` share one
lock and no name can hit a filesystem limit (callers validate the basename first).úutf-8Úsurrogatepassz.locksz.lock)ÚhashlibÚsha256r   rO   ÚencodeÚ	hexdigestrL   )rO   Údigests   & r+   Ú_skill_lock_pathrY   T   sI   € ô
 �^Š^œD ›JŸO™O×2Ñ2°7¸OÓLÓM×WÑWÓY€FÜ‹=˜8Õ#¨¨°Ð&6Õ6Ð6r-   c                ó$   € V ^8„  d   QhR\         /# )r'   rO   ©r;   )r*   s   "r+   r,   r,   ]   s   € ÷ 3ñ 3œsñ 3r-   c                ó0   € ^ RI Hp V! \        V 4      4      # )zRExclusive lock held across one skill's whole read-modify-write; thread-re-entrant.©Úskill_file_lock)Útools.skill_usager^   rY   )rO   r^   s   & r+   Ú_skill_mutation_lockr`   ]   s   € å1ÙÔ+¨DÓ1Ó2Ð2r-   c                ó´   € ^ RI Hp \        4       p\        V  Uu0 uF  p\	        V4      kK  	  up4       F  pVP                  V! V4      4       K  	  V# u upi )z`Every lock of an atomic batch, acquired in one stable path order (deadlock-free across batches).r]   )r_   r^   r   ÚsortedrY   Úenter_context)Únamesr^   ÚstackÚnÚ	lock_paths   &    r+   Ú_skill_mutation_locksrh   c   sO   € å1Ü‹K€EÜ¹%Ó@¹%°QÔ-¨aÖ0¹%Ñ@ÖAˆ	Ø×Ñ™O¨IÓ6Ö7ñ Bà€Lùò As   šAi   i † i   z^[a-z0-9][a-z0-9._-]*$z
\n---\s*\nz?Use lowercase letters, numbers, hyphens, dots, and underscores.c          	      ó^   € V ^8„  d   QhR\         R\         R\         R\        \         ,          /# )r'   ÚvalueÚlabelÚinvalidr(   ©r;   r	   )r*   s   "r+   r,   r,   x   s,   € ÷ ;ñ ;œSð ;¬ð ;´sð ;¼xÌ½}ñ ;r-   c                 ó€   € \        V 4      \        8”  d   V R \         R2# \        P                  V 4      '       d   R# T# )z	 exceeds ú characters.N)ÚlenÚMAX_NAME_LENGTHÚVALID_NAME_REÚmatch)rj   rk   rl   s   &&&r+   Ú_check_identifierrt   x   s=   € Ü
ˆ5ƒz”OÔ#Ø�˜	¤/Ð!2°,Ð?Ð?Ü ×&Ñ& u×-Ò-ˆ4Ð:°7Ð:r-   c                óF   € V ^8„  d   QhR\         R\        \         ,          /# rN   rm   )r*   s   "r+   r,   r,   ~   s"   € ÷ mñ mœð m¤¬#¥ñ mr-   c           	      óF   € V '       g   R # \        V RRV  R\         R24      # )zSkill name is required.z
Skill namezInvalid skill name 'ú'. z# Must start with a letter or digit.)rt   Ú
_NAME_RULE©rO   s   &r+   Ú_validate_namerz   ~   s/   € ßÙ(ÜØˆlÐ2°4°&¸¼J¸<ÐGjÐkómð mr-   c                ó\   € V ^8„  d   QhR\         \        ,          R\         \        ,          /# )r'   Úcategoryr(   )r	   r;   )r*   s   "r+   r,   r,   …   s"   € ÷ 
<ñ 
<¤¬#¥ð 
<´8¼Cµ=ñ 
<r-   c                 ó
  € V e-   \        V \        4      '       d   V P                  4       '       g   R # \        V \        4      '       g   R# V P                  4       p RV  R\         R2pRV 9   g   RV 9   d   V# \	        V RV4      # )NzCategory must be a string.zInvalid category 'rw   z, Categories must be a single directory name.Ú/Ú\ÚCategory)Ú
isinstancer;   Ústriprx   rt   )r|   rl   s   & r+   Ú_validate_categoryrƒ   …   sz   € ØÒœJ x´×5Ò5¸h¿n¹n×>NÒ>NÙÜ�h¤×$Ò$Ù+Ø�~‰~Ó€HØ# H :¨S´°ð ==ð =€Gà
ˆh„˜$ (Ô*ØˆÜ˜X z°7Ó;Ð;r-   Ú	new_skillFc                óR   € V ^8„  d   QhR\         R\        R\        \         ,          /# )r'   Úcontentr„   r(   )r;   r)   r	   )r*   s   "r+   r,   r,   ’   s&   € ÷ !ñ !¤3ð !´dð !ÄxÔPSÅ}ñ !r-   c               ót  € V P                  4       '       g   R# V P                  R4      p V P                  R4      '       g   R# \        P	                  V R,          4      pV'       g   R#  \
        P                  ! V ^VP                  4       ^,            4      p\        T\        4      '       g   R	# R F  pYS9  g   K  RT R2u # 	  \        TR
,          4      p\        T4      \        8”  d   R\         R2# T'       dd   \        TP                  4       P                  R4      4      \        8”  d3   R\        TP                  4       4       R\         R\        ^,
           R2# YP                  4       ^,           R P                  4       '       g   R# R#   \
        P                   d   pRT 2u Rp?# Rp?ii ; i)a  Validate frontmatter (name + description) and a non-empty body. ``new_skill`` (create
only) also enforces SKILL_PROMPT_DESC_LIMIT so new skills never lose routing signal to
index truncation; edit/patch skip it so existing over-limit skills stay maintainable.zContent cannot be empty.u   ï»¿z---zPSKILL.md must start with YAML frontmatter (---). See existing skills for format.ºé   NNzISKILL.md frontmatter is not closed. Ensure you have a closing '---' line.zYAML frontmatter parse error: Nz6Frontmatter must be a YAML mapping (key: value pairs).ÚdescriptionzFrontmatter must include 'z' field.zDescription exceeds ro   z'"zDescription is u#    chars â€” new skills must fit the z-char system-prompt budget (one sentence, trigger first, ends with a period). The skill index truncates longer descriptions to zO chars + '...', destroying the routing signal. Move detail into the skill body.zRSKILL.md must have content after the frontmatter (instructions, procedures, etc.).)rO   rŠ   )r‚   ÚlstripÚ
startswithÚ_FRONTMATTER_END_REÚsearchÚyamlÚ	safe_loadÚstartÚ	YAMLErrorr�   Údictr;   rp   ÚMAX_DESCRIPTION_LENGTHr   Úend)r†   r„   Ú	end_matchÚparsedrE   ÚfieldÚdescs   &$     r+   Ú_validate_frontmatterrš   ’   s|  € ð �=‰=�?Š?Ù)Ø�n‰n˜XÓ&€GØ×Ñ˜e×$Ò$ÙaÜ#×*Ñ*¨7°2­;Ó7€IßÙZð4Ü—’ ¨¨)¯/©/Ó*;¸aÕ*?Ð @ÓAˆô �fœd×#Ò#ÙGÛ(ˆØÖØ/°¨w°hÐ?Ò?ñ )ô ˆv�mÕ$Ó%€DÜ
ˆ4ƒyÔ)Ô)Ø%Ô&<Ð%=¸\ÐJÐJß”S˜Ÿ™›×+Ñ+¨EÓ2Ó3Ô6MÔMàœc $§*¡*£,Ó/Ð0Ð0SÜ&Ð'ð (Uä&¨Õ*Ð+ð ,/ð0ð	1ð —=‘=“? QÕ&Ð'Ð(×.Ñ.×0Ò0ÙcÙøô' �>‰>ô 4Ø/°¨sÐ3Õ3ûð4ús   Á*.F ÆF7Æ(F2Æ,F7Æ2F7c                óR   € V ^8„  d   QhR\         R\         R\        \         ,          /# )r'   r†   rk   r(   rm   )r*   s   "r+   r,   r,   ¶   s%   € ÷ ñ ¤Cð ´ð ÄXÌcÅ]ñ r-   c                 ób   € \        V 4      \        8”  d   V R \        V 4      R R\        R R2# R# )z content is Ú,z characters (limit: za). Consider splitting into a smaller SKILL.md with supporting files in references/ or templates/.N)rp   ÚMAX_SKILL_CONTENT_CHARS)r†   rk   s   &&r+   Ú_validate_content_sizerŸ   ¶   sB   € Ü
ˆ7ƒ|Ô-Ô-àˆg�\¤# g£,¨qÐ!1Ð1EÔF]Ð^_ÐE`ð að ð	ñ r-   c                ó0   € V ^8„  d   QhR\         R\         /# )r'   r†   r(   r[   )r*   s   "r+   r,   r,   ¿   s   € ÷ ñ ¤#ð ¬#ñ r-   c           
     óh  € \        \        4      ;_uu_ 4        \        P                  V R,          4      pV'       dY   \	        \
        P                  ! V ^VP                  4       ^,            4      P                  RR4      4      R,          uuRRR4       #  RRR4       R#   + '       g   i     R# ; i)zBFirst 120 chars of the frontmatter description; '' on any failure.rˆ   rŠ   Ú :Néx   NN)	r   r6   r�   rŽ   r;   r�   r�   r‘   Úget)r†   Úfm_ends   & r+   Ú_description_previewr¦   ¿   s~   € ä	”)×	Õ	Ü$×+Ñ+¨G°B­KÓ8ˆßÜ”t—~’~ g¨a°·±³ÀÕ0BÐ&CÓD×HÑHÈÐXZÓ[Ó\Ð]aÕb÷ 
Ò	à÷ 
ñ ÷	 
Ö	ñ ús   ˜A2B Â B1	c                óJ   € V ^8„  d   QhR\         R\         R,          R\        /# )r'   rO   r|   Nr(   rP   )r*   s   "r+   r,   r,   È   s%   € ÷ *ñ *œSð *¬C°$­Jð *Ä$ñ *r-   c                óÈ   € \        4       p ^ RIHp V! 4       ;'       g    TpY!;'       g    R,          V ,          #   \         d    \        P                  RRR7        L=i ; i)zFNew-skill dir; honors ``skills.create_dir`` (e.g. a shared fleet dir).)Úget_skill_create_dirzskills.create_dir lookup failedTr>   r¢   )rL   Úagent.skill_utilsr©   r6   r@   Údebug)rO   r|   Úbaser©   s   &&  r+   Ú_resolve_skill_dirr­   È   s\   € ä‹=€DðGÝ:Ù#Ó%×-Ð-¨ˆð —>�>˜rÕ" TÕ)Ð)øô ô GÜ�‰Ð6ÀˆÖFðGús   Œ<  < ¼"A!Á A!c                ó$   € V ^8„  d   QhR\         /# )r'   Úrootr   )r*   s   "r+   r,   r,   Ó   s   € ÷ "ñ "œ4ñ "r-   c              #   ó†   "  € ^ RI Hp V P                  R4       F!  pV! V4      '       d   K  VP                  x € K#  	  R# 5i)é    )Úis_excluded_skill_pathúSKILL.mdN)rª   r²   ÚrglobÚparent)r¯   r²   Úskill_mds   &  r+   Ú_iter_skill_dirsr·   Ó   s0   é € Ý8Ø—J‘J˜zÖ*ˆÙ% h×/Ô/Ø—/‘/Ô!ó +ùs
   ‚&A­Ac                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r'   r¶   r(   r:   )r*   s   "r+   r,   r,   Ú   s   € ÷ ñ ¤Tð ¬h´s­mñ r-   c                ó  €  ^ RI Hp V P                  RRR7      R,          pV! V4      w  r4TP                  R
4      p\        T\        4      '       d
   TR	\         # R	#   \         d    \        P                  RT RR7        R	# i ; i)ue  Read a SKILL.md's frontmatter ``name:`` â€” the name skills_list displays.

Fail-quiet on unreadable files: the fallback lookup in ``_find_skill``
must never break the directory-name match, and an unreadable SKILL.md
simply has no second name to offer. The value is truncated with the
same ``MAX_NAME_LENGTH`` budget skills_list applies when displaying it.
)r   ú	utf-8-sigÚreplace)ÚencodingÚerrors:Ni   Nzfrontmatter read failed for %sTr>   NrO   )
rª   r   Ú	read_textÚOSErrorr@   r«   r¤   r�   r;   rq   )r¶   r   r†   ÚfrontmatterÚ_rO   s   &     r+   Ú_read_frontmatter_namerÂ   Ú   s…   € ðÝ7à×$Ñ$¨kÀ)Ð$ÓLÈUÕSˆÙ*¨7Ó3‰ˆð �?‰?˜6Ó"€DÜ�$œ×ÒØÐ$”_Ð%Ð%Ùøô ô Ü�‰Ð5°xÈ$ˆÔOÚðús   ‚*A Á#BÂBc                óh   € V ^8„  d   QhR\         R\        \        \         \        3,          ,          /# rN   ©r;   r	   r“   r   )r*   s   "r+   r,   r,   ð   s'   € ÷ 5ñ 5”cð 5œh¤t¬C´¨H¥~Õ6ñ 5r-   c           	     ó  € ^ RI Hp RpRV 9   g   RV 9   d    \        4       P                  4       p. p\        4       pV! 4        EF  pVP                  4       '       g   K  \        V4       Fï  pVP                  V 8X  d	   RV/u u # VeT   VP                  4       pVP                  V4      '       d-   VP                  V4      P                  4       V 8X  d	   RV/u u # \        VR	,          4      V 8X  g   KŒ  VR	,          p\        \         4      ;_uu_ 4        VP                  4       pRRR4       W„9  g   KÍ  VP#                  V4       VP%                  V4       Kñ  	  EK  	  \'        V4      ^8X  d   RV^ ,          /# V'       d8   \
        P)                  R
V \'        V4      RP+                  R V 4       4      4       R#   \         d&    \
        P                  RRR7       \        4       p EL½i ; i  + '       g   i     LÒ; i)u,  Find a skill (local skills dir, then skills.external_dirs) -> ``{"path": Path}`` | None.

Accepts the bare dir name (``axolotl``; matches category-nested skills too) and the
categorized relative path (``mlops/axolotl``) â€” the two forms skill_view resolves. The
categorized form matches RELATIVE to the local root only (relative_to raises for external dirs).

As a last resort the frontmatter ``name:`` is matched too, so the name ``skills list``
and the dashboard display (frontmatter name wins over the directory name there)
resolves everywhere instead of failing with a misleading "not found in active
profile" error when the two names diverge. Directory-name matches keep priority â€”
a frontmatter match is only considered after the whole scan found no
directory/categorized match, so one skill's frontmatter cannot shadow another
skill's directory. A display name held by two or more distinct skills resolves to
nothing: like skill_view's same-tier collision refusal, refusing to guess beats
silently mutating the wrong skill; the directory name still resolves.)Úget_all_skills_dirsNr~   r   zOskills dir resolve failed; categorized lookups fall back to the unresolved pathTr>   Úpathr³   uy   Skill display name '%s' is ambiguous (%d skills claim it: %s) â€” refusing to guess; resolve it by directory name insteadz; c              3   ó8   "  € T F  p\        V4      x € K  	  R # 5i©Nr[   )Ú.0Úps   & r+   Ú	<genexpr>Ú_find_skill.<locals>.<genexpr>$  s   é € Ð1RÁ/¸Q´#°a·&°&Ã/ùs   ‚)rª   rÆ   rL   Úresolver¿   r@   r«   ÚsetÚexistsr·   rO   Úis_relative_toÚrelative_toÚas_posixrÂ   r   r6   ÚaddÚappendrp   rA   Újoin)	rO   rÆ   Ú
local_rootÚdisplay_matchesÚseen_displayÚ
skills_dirr9   ÚresolvedÚkeys	   &        r+   Ú_find_skillrÝ   ð   sµ  € õ  6Ø€JØ
ˆd„{�d˜d”lð	'Ü$›×.Ñ.Ó0ˆJð #%€OÜ›€LÙ)×+ˆ
Ø× Ñ ×"Ò"ÙÜ)¨*Ö5ˆIØ�~‰~ Ô%Ø 	Ð*Ô*ØÒ%Ø$×,Ñ,Ó.�Ø×+Ñ+¨J×7Ò7Ø$×0Ñ0°Ó<×EÑEÓGÈ4ÔOØ" IÐ.Ô.Ü% i°*Õ&<Ó=ÀÖEØ *Õ,�Üœi×(Õ(ØŸ+™+›-�C÷ )àÖ*Ø ×$Ñ$ SÔ)Ø#×*Ñ*¨9Ö5ô 6ñ ,ô$ ˆ?Ó˜qÔ Ø˜¨Õ*Ð+Ð+ßÜ�‰ð3à”#�oÓ&¨¯	©	Ñ1RÁ/Ó1RÓ(Rô	Tñ øôA ô 	'Ü�L‰LØaØð ô ô %›‹Jð		'ú÷( )×(ús   ˜F> ÄG1	Æ>,G.Ç-G.Ç1Hc                óh   € V ^8„  d   QhR\         R\        \        \         \        3,          ,          /# rN   )r;   ÚlistÚtupler   )r*   s   "r+   r,   r,   (  s(   € ÷ #ñ #¬ð #´´U¼3Ä¸9Õ5EÕ0Fñ #r-   c           	     ór  a € . p ^ RI Hp V! 4       p\        4       pTP	                  4       '       d   TP                  4       MTp. p\        \        \        4      ;_uu_ 4        TR,          P                  4       T8w  d   TP                  RTR,          34       RRR4       TR,          P                  4       '       d›   \        \        4      ;_uu_ 4        TR,          P                  4        F_  pTP                  4       '       g   K   TR,          P                  4       T8X  d   K:   TP                  TP                  TR,          34       Ka  	  RRR4       T Fr  w  r‰T	P                  4       '       g   K  \        \        4      ;_uu_ 4        \        T 3R l\        T	4       4       R4      p
T
e   TP                  YŠ34       RRR4       Kt  	  T#   \         d    Tu # i ; i  + '       g   i     ELU; i  \        \        3 d     EK!  i ; i  + '       g   i     LÊ; i  + '       g   i     KÜ  ; i)zŒ``(profile, skill_dir)`` pairs for OTHER profiles holding ``name`` (so the not-found
error can explain a wrong-profile mistake). Fail-quiet.)Úget_default_hermes_rootr1   r4   NÚprofilesc              3   óL   <"  € T F  qP                   S8X  g   K  Vx € K  	  R # 5irÉ   ry   )rÊ   ÚdrO   s   & €r+   rÌ   Ú0_find_skill_in_other_profiles.<locals>.<genexpr>H  s   øé € ÐRÑ#?˜aÇ6Á6ÈTÁ>ŸšÓ#?ùs   ƒ$š
$)Úhermes_constantsrâ   r6   rL   rÐ   rÎ   r   r¿   ÚRuntimeErrorrÕ   Úis_dirÚiterdirrO   Únextr·   )rO   Úmatchesrâ   r¯   Ú_activeÚ
active_dirÚ
candidatesÚentryÚprofile_namerÚ   Úhits   f          r+   Ú_find_skill_in_other_profilesró   (  sÇ  ø€ ð ')€GðÝ<Ù&Ó(ˆô ‹m€GØ&-§n¡n×&6Ò&6�—‘Ô"¸G€Jð *,€JÜ	”'œ<×	(Õ	(Ø�8�O×$Ñ$Ó&¨*Ô4Ø×Ñ˜y¨$°­/Ð:Ô;÷ 
)ð 	ˆzÕ×!Ñ!×#Ò#Ü”g×ÕØ Õ+×4Ñ4Ö6�Ø—|‘|—~’~ÙðØ Õ(×1Ñ1Ó3°zÔAÙ ð Bð ×!Ñ! 5§:¡:¨u°xÕ/?Ð"@ÖAñ 7÷ ó %/Ñ ˆØ× Ñ ×"Ò"ÙÜ”g×ÕÜÔRÔ#3°JÔ#?ÓRÐTXÓYˆCØŠØ—‘ Ð2Ô3÷ Ññ %/ð €Nøô9 ô ØŠðú÷ 
)×	(Ð	(ûô  ¤Ð.ô Ûðú÷ ×ú÷ ×ÐúsY   …G Á"7G%Ã3HÄ	G9Ä%+HÆ6H%ÇG"Ç!G"Ç%G6	Ç9H	È
HÈH	ÈHÈH"	È%H6c                ó<   € V ^8„  d   QhR\         R\         R\         /# )r'   rO   Úsuffixr(   r[   )r*   s   "r+   r,   r,   N  s!   € ÷ ñ ¤ð ¬cð ¼3ñ r-   c                ó8  € ^ RI Hp RV  RV! 4        R2p\        V 4      p\        V4      ^8X  d'   V^ ,          w  rVVRV RV RV R2,          pW1,           # V'       d.   R	P	                  R
 V 4       4      pVRV R2,          pW1,           # VR,          pW1,           # )zKNot-found error naming other profiles that hold the skill, plus ``suffix``.)Ú_resolve_active_profile_nameúSkill 'z' not found in active profile 'ú'.z) A skill by that name exists in profile 'ú' (z+). To edit it, switch profiles (`hermes -p z5`) or edit the file directly (file tools / terminal).ú, c              3   ó2   "  € T F  w  rR V R 2x € K  	  R# 5i)Ú'N© )rÊ   rË   rÁ   s   &  r+   rÌ   Ú)_skill_not_found_error.<locals>.<genexpr>Z  s   é € Ð6©v¡t q˜A˜a˜S �(«vùs   ‚z. Skills by that name exist in other profiles: zi. Switch profiles (`hermes -p <name>`) to edit there, or edit the files directly (file tools / terminal).z+ Use skills_list() to see available skills.)Úagent.file_safetyr÷   ró   rp   rÖ   )rO   rõ   r÷   r¬   ÚothersÚother_profileÚ
other_pathrd   s   &&      r+   Ú_skill_not_found_errorr  N  sÏ   € å>Ø�T�FÐ9Ñ:VÓ:XÐ9YÐY[Ð\€DÜ*¨4Ó0€FÜ
ˆ6ƒ{�aÔØ$*¨1¥IÑ!ˆØØ7¸°ÀcÈ*Èð V/Ø/<¨oð >'ð(õ	)ˆð �=Ð÷ 
Ø—	‘	Ñ6©vÓ6Ó6ˆØØ<¸U¸Gð DZð [õ	\ˆð
 �=Ðð 	Ð=Õ=ˆØ�=Ðr-   c                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r'   Ú	file_pathr(   rm   )r*   s   "r+   r,   r,   c  s   € ÷ ñ ¤3ð ¬8´C­=ñ r-   c                ó|  € ^ RI Hp V '       g   R# \        V 4      P                  pV! V 4      '       d   R# V'       d!   VR,          R8X  d   \	        V4      R9   d   R# V'       d   V^ ,          \
        9  d(   RP                  \        \
        4      4      pRV RV  R	2# \	        V4      ^8  d   R
V^ ,           R2# R# )zKValidate a write_file/remove_file path: under an allowed subdir, no escape.)Úhas_traversal_componentzfile_path is required.z%Path traversal ('..') is not allowed.r³   Nrû   zFile must be under one of: z. Got: 'rý   z5Provide a file path, not just a directory. Example: 'z/myfile.md'éÿÿÿÿ)é   r'   )Útools.path_securityr  r   Úpartsrp   ÚALLOWED_SUBDIRSrÖ   rb   )r  r  r  rC   s   &   r+   Ú_validate_file_pathr  c  sœ   € å;ßÙ'Ü�‹O×!Ñ!€Eá˜y×)Ò)Ù6ç��r•˜jÔ(¬S°«Z¸6Ô-AÙß�E˜!•H¤OÔ3Ø—)‘)œF¤?Ó3Ó4ˆØ,¨W¨I°X¸i¸[ÈÐJÐJÜ
ˆ5ƒz�A„~ØFÀuÈQÅxÀjÐP[Ð\Ð\Ùr-   c                ó0   € V ^8„  d   QhR\         R\        /# )r'   r9   r  )r   r;   )r*   s   "r+   r,   r,   w  s   € ÷ 8ñ 8¬ð 8¼ñ 8r-   c                óš   € ^ RI Hp Y;'       g    R,          p\        V4      ;'       g	    V! W04      pV'       d   R\        V4      3# VR3# )zjValidate ``file_path`` and resolve it inside ``skill_dir``
-> ``(target, None)`` | ``(None, error_dict)``.)Úvalidate_within_dirr¢   N)r  r  r  Ú_err)r9   r  r  ÚtargetÚerrs   &&   r+   Ú_resolve_supporting_filer  w  sG   € õ 8ØŸ/˜/ rÕ*€FÜ
˜iÓ
(×
RÐ
RÑ,?ÀÓ,R€Cß #ˆD”$�s“)ÐÐ7¨&°$¨Ð7r-   c                ó<   € V ^8„  d   QhR\         R\         R\         /# )r'   rO   ÚactionÚnot_found_suffixr[   )r*   s   "r+   r,   r,   €  s!   € ÷ 9ñ 9œCð 9¬ð 9Äñ 9r-   c                ó®   € \        V 4      pV'       g   R\        \        W4      4      3# VR,          pVR8X  d   \        W4      MRpV'       d   RV3# VR3# )zxFind the skill; a delete also runs the background-review delete guard -> ``(skill_dir, None)``
| ``(None, error_dict)``.NrÇ   Údelete)rÝ   r  r  r   )rO   r  r  Úexistingr9   Úguards   &&&   r+   Ú_locate_for_writer  €  s\   € ô ˜4Ó €HßØ”TÔ0°ÓHÓIÐIÐIØ˜Õ €IØ@FÈ(Ô@RÔ+¨DÔ<ÐX\€Eß!ˆD�%ˆ=Ð8¨	°4Ð'8Ð8r-   c                ó¤   € V ^8„  d   QhR\         R\        R\        R\         R\         R\         R\        \        \         \        3,          ,          /# )r'   rO   r9   r  r  rk   r†   r(   )r;   r   r	   r“   r   )r*   s   "r+   r,   r,   ‹  sM   € ÷ ñ œð ¬ð ´tð ÄSð ÔQTð ÜðÜ$,¬T´#´s°(­^Õ$<ñr-   c                óV  € RpVP                  4       '       d)   \        WW44      ;p'       d   V# VP                  RR7      p^ RIHp V! VP
                  4       \        W%RRR7       \        V4      p	V	'       g   R# Ve   \        W&RR7       MVP                  RR	7       \        V	4      # )
z¨Read-before-write guard (existing targets only), atomic write, then the security scan;
a blocked scan restores the original (or unlinks a new file). Error dict or None.Nrº   ©r¼   ©Úmkdir_under_hermes_homeTi¤  )Úpreserve_modeÚcreate_mode)r#  )Ú
missing_ok)
rÐ   r   r¾   rç   r"  rµ   r   rF   Úunlinkr  )
rO   r9   r  r  rk   r†   ÚoriginalÚ
read_guardr"  Ú
scan_errors
   &&&&&&    r+   Ú_guarded_writer*  ‹  s”   € ð €HØ‡}�}‡‚ÜCÀDÐRXÓ`Ð`ˆ:Ö`ØÐØ×#Ñ#¨[Ð#Ó9ˆÝ8Ù˜FŸM™MÔ*Ü�f°TÀuÕMÜ% iÓ0€JßÙØÒÜ˜&¸$Ö?à�‰ ˆÔ&Ü�
ÓÐr-   c                ó€   € V ^8„  d   QhR\         \        \        3,          R\        R\         \        \        3,          /# )r'   rB   r†   r(   ©r“   r;   r   )r*   s   "r+   r,   r,   ¡  s4   € ÷ ñ ¬D´´c°­Nð ÄSð ÌTÔRUÔWZÐRZÍ^ñ r-   c                 ó‚   € \        V4      w  r#\        V4      '       d!   R \        V4       R\        ^,
           R2V R&   V # )zSystem prompt will show: "u3   " â€” keep the trigger self-contained in the first z chars.Úsystem_prompt_preview)Ú_parse_frontmatterr   r   r   )rB   r†   ÚfmrÁ   s   &&  r+   Ú_add_description_prompt_previewr1  ¡  sR   € Ü˜wÓ'�E€BÜ0°×4Ò4à)Ô*CÀBÓ*GÐ)Hð I+Ü+BÀQÕ+FÐ*GÀwðPð 	Ð&Ñ'ð €Mr-   c                óx   € V ^8„  d   QhR\         \        \        3,          R\        R\        \        ,          RR/# )r'   rB   r¶   Úbeforer(   N)r“   r;   r   r   r	   )r*   s   "r+   r,   r,   ª  s<   € ÷ [ñ [¤$¤s¬C x¥.ð [¼Dð [Ì(ÔSVÍ-ð [Ðcgñ [r-   c           	     ó   €  ^ RI HpHp V! V4      pVeO   V! W!P                  R7       Uu0 uF  qfP                  kK  	  ppV Uu. uF  qfP                  V9  g   K  VNK  	  ppT'       g   R# T Uu. uF)  pRTP                  RTP                  RTP                  /NK+  	  upT R&   RT R	&   R# u upi u upi   \
         d    Rp Lci ; iu upi )
a
  Attach ADVISORY authoring findings (hard rejects already ran in _validate_frontmatter).
With ``before`` (the pre-write content) only rules the write INTRODUCED are attached, so a
patch reports the line it crossed rather than re-listing the skill's standing findings.)Úlint_contentÚ
lint_skillN)r9   ÚseverityÚruleÚmessageÚlint_warningsu¤   The write succeeded. These are advisory authoring-convention findings (not blockers) â€” fix them with skill_manage(action='patch') to match Hermes skill standards.Ú	lint_hint)Útools.skill_linterr5  r6  rµ   r8  r6   r7  r9  )rB   r¶   r3  r5  r6  ÚfindingsÚfÚstandings   &&&     r+   Ú_attach_lint_findingsr@  ª  sÎ   € ðß?Ù˜hÓ'ˆØÒÙ(4°VÇÁÕ(WÓXÑ(W 1ŸœÑ(WˆHÐXÙ#+ÓF¡8˜a¯v©v¸XÑ/EŸ˜¡8ˆHÐF÷ ÙáPXóZÙPXÈ1ˆ�Q—Z‘Z ¨¯©°¸A¿I¹IÓFÑPXñZ€Fˆ?Ñð	Zð ˆ;Óùò YùÚFøÜô ØŠðüòZs9   ‚)B8 «B.¿B8 ÁB3ÁB3Á"B8 Á2/CÂ.
B8 Â8CÃCc                óH   € V ^8„  d   QhR\         R\        R\         R\         /# )r'   Útextrf   Úellipsisr(   )r;   Úint)r*   s   "r+   r,   r,   ¿  s(   € ÷ :ñ :”ð :œð :¤sð :¬sñ :r-   c                 óJ   € V R V \        V 4      V8”  d	   V,           # R,           # )Nr¢   )rp   )rB  rf   rC  s   &&&r+   Ú_cliprF  ¿  s%   € Ø��ˆ8¤3 t£9¨q¤=�xÕ9Ð9°bÕ9Ð9r-   c          
      óx   € V ^8„  d   QhR\         R\         R\         R,          R\        \         \        3,          /# )r'   rO   r†   r|   Nr(   ©r;   r“   r   )r*   s   "r+   r,   r,   Å  s7   € ÷ &ñ &œð &¤cð &´S¸4µZð &Ì4ÔPSÔUXÐPXÍ>ñ &r-   c                 ó‚  € \        V 4      ;'       g4    \        V4      ;'       g!    \        VR R7      ;'       g    \        V4      ;p'       d   \	        V4      # \        V 4      ;p'       d   \	        RV  RVR,           R24      # \        W4      p^ RIHp V! VP                  4        VP                  RR7       VR,          p\#        WVRRV4      ;p	'       d3   \%        \         4      ;_uu_ 4        VP'                  4        RRR4       V	# \)        4       p
VP+                  V
4      '       d   VP-                  V
4      MTpRR RRV  R2R\/        V4      R\/        V4      RR\1        V4      //V'       d   RV/M/ CRRV  R2/Cp\3        \5        WÁ4      V4       V#   \         d„     \        T4      '       * ;'       d7    TP                  4       ;'       d    \        TP                  4       4      '       * pM  \          d    Rp Mi ; iT'       g   \	        R	T  R
T R24      u #  ELmi ; i  + '       g   i     T	# ; i)T)r„   zA skill named 'z' already exists at rÇ   Ú.r!  F)Úexist_okzCannot create skill 'ú': zq already exists (not an empty directory, or unreadable). Choose another name, or move/remove that path and retry.r³   ÚcreateNÚsuccessr9  rø   z
' created.r¶   Ú_changerŠ   r|   Úhintz[To add reference files, templates, or scripts, use skill_manage(action='write_file', name='z9', file_path='references/example.md', file_content='...'))rz   rƒ   rš   rŸ   r  rÝ   r­   rç   r"  rµ   ÚmkdirÚFileExistsErrorr   ré   Úanyrê   r¿   r*  r   ÚrmdirrL   rÑ   rÒ   r;   r¦   r@  r1  )rO   r†   r|   r  r  r9   r"  Úusabler¶   r  r¯   ÚdisplayrB   s   &&&          r+   Ú_create_skillrW  Å  sa  € Ü˜dÓ#÷ dð dÔ'9¸(Ó'C÷ dð dÜ'¨¸4Ô@÷dð dÜDZÐ[bÓDcðe€sö eä�C‹yÐÜ˜tÓ$Ð$€xÖ$Ü�o d VÐ+?ÀÈÕ@PÐ?QÐQRÐSÓTÐTÜ" 4Ó2€IÝ8Ù˜I×,Ñ,Ô-ðoØ�‰ ˆÔ'ð ˜:Õ%€HÜ˜t°¸(ÀJÐPWÓXÐX€uÖXÜ”g×ÕØ�O‰OÔ÷ àˆÜ‹=€DØ-6×-EÑ-EÀd×-KÒ-Kˆi×#Ñ# DÔ)ÐQZ€Gà�4˜ g¨d¨V°:Ð$>ÀÌÈGËØ”C˜“M 9¨}Ô>RÐSZÓ>[Ð.\ð'÷ &.ˆJ˜Ñ!°2ð'ð 	ð ;Ø;?¸&ð A&ð&ñ	'€Fô Ô9¸&ÓJÈHÔUØ€Møô7 ô oð	Ü+¨IÓ6Ô6÷ 7ð 7¸9×;KÑ;KÓ;M÷ 7ð 7Ü! )×"3Ñ"3Ó"5Ó6Ô6ñ øäô 	ØŠFð	úçÜÐ/°¨v°S¸¸ð Dnð nó oò oò ðoú÷ ÖàˆúsT   Â*F Ã3H-ÆH*Æ(G7Æ?G7ÇG7Ç6H*Ç7HÈH*ÈHÈ
H*ÈH*È)H*È-H>	c                ó^   € V ^8„  d   QhR\         R\         R\        \         \        3,          /# )r'   rO   r†   r(   rH  )r*   s   "r+   r,   r,   î  s)   € ÷ <ñ <”cð <¤Cð <¬D´´c°­Nñ <r-   c                ó.  € \        V4      ;'       g    \        V4      ;p'       d   \        V4      # \        V R4      w  r4T;'       g    \	        WVR,          RRV4      ;p'       d   V# RRRRV  R2R\        V4      R	R
\        V4      //p\        WQ4      # )z:Replace the SKILL.md of any existing skill (full rewrite).Úeditr³   rN  Tr9  rø   z' updated (full rewrite).rÇ   rO  rŠ   )rš   rŸ   r  r  r*  r;   r¦   r1  )rO   r†   r  r9   r  rB   s   &&    r+   Ú_edit_skillr[  î  s§   € ä# GÓ,×OÐOÔ0FÀwÓ0OÐO€sÖOÜ�C‹yÐÜ(¨¨vÓ6Ñ€Ià×mÐmœ¨¸ÀZÕ9OÐQWÐYcÐelÓmÐm€uÖmØˆà�4˜ g¨d¨VÐ3LÐ$MØ”�I“ 	¨MÔ;OÐPWÓ;XÐ+Yð[€Fô +¨6Ó;Ð;r-   c                ó�   € V ^8„  d   QhR\         R\         R\         R\         R,          R\        R\        \         \        3,          /# )r'   rO   Ú
old_stringÚ
new_stringr  NÚreplace_allr(   )r;   r)   r“   r   )r*   s   "r+   r,   r,   ü  sD   € ÷ 3ñ 3”sð 3¬ð 3¼ð 3ÌÈtÍð 3Ü"ð3Ü/3´C¼°H­~ñ3r-   c                óN  € V'       g   \        \        4      # Vf   \        \        4      # \        V R4      w  rVV'       d   V# T;'       g    RpV'       d   \	        WS4      w  r‰V	'       d   V	# M	VR,          pVP                  4       '       g   \        RVP                  V4       24      # \        WRV4      ;p
'       d   V
# TP                  RR7      p^ RI	H
p . pV! W±W$VR7      w  rïppV'       dW   \        \        4      ;_uu_ 4        ^ R	I	Hp VV! VWñV4      ,          pRRR4       \        V4      R
\        VRR4      /,          # \        WçR7      ;p	'       d   \        V	4      # V'       g"   \!        V4      ;p	'       d   \        RV	 24      # \#        WVRW~4      ;p'       d   V# RRRRT RT  RT RV^8”  d   RMR R2	RR\        V^ÈR4      R\        V^ÈR4      //pV'       d   RP%                  V4      VR&   V'       g   \'        VW‹R7       V#   + '       g   i     Lú; i) zfTargeted find-and-replace in SKILL.md (default) or a supporting file; unique match unless replace_all.NÚpatchr³   zFile not found: rº   r   )Úfuzzy_find_and_replace)Úcorrection_notes)Úformat_no_match_hintÚfile_previewiô  z...©rk   z&Patch would break SKILL.md structure: rN  Tr9  zPatched z in skill 'rú   z replacementÚsr¢   ú).rO  Úoldu   â€¦ÚnewÚ
Únote)r3  )r  r   r   r  r  rÐ   rÒ   r   r¾   Útools.fuzzy_matchrb  r   r6   rd  rF  rŸ   rš   r*  rÖ   r@  )rO   r]  r^  r  r_  r9   r  Útarget_labelr  r  r(  r†   rb  rc  Únew_contentÚmatch_countÚ	_strategyÚmatch_errorrd  rB   s   &&&&&               r+   Ú_patch_skillrs  ü  s)  € ÷ ÜÔ+Ó,Ð,ØÒÜÔ+Ó,Ð,ô )¨¨wÓ7Ñ€IßØˆØ×*Ð* 
€LßÜ.¨yÓD‰ˆßØˆJð ð ˜ZÕ'ˆØ�=‰=�?Š?ÜÐ& v×'9Ñ'9¸)Ó'DÐ&EÐFÓGÐGÜ?ÀÈgÐWcÓdÐd€zÖdØÐØ×Ñ¨ÐÓ4€Gõ 9ØÐÙ7MØ˜ZÐGWô8YÑ4€K˜i¨çÜ”i× Õ Ý>ØÑ/°¸[ÐV]Ó^Õ^ˆK÷ !ô �KÓ  N´E¸'À3ÈÓ4NÐ#OÕOÐOÜ$ [ÔEÐE€sÖEÜ�C‹yÐßÔ!6°{Ó!CÐC˜#ÖCÜÐ<¸S¸EÐBÓCÐCÜ˜t°¸ÀÓ[Ð[€uÖ[Øˆà�4Ø�X˜l˜^¨;°t°f¸CÀ¸}ÈLÐ`kÐnoÔ`oÑY\ÐuwÐXxÐxzÐ{Ø�Eœ5 ¨S°%Ó8¸%ÄÀzÐSVÐX]ÓA^Ð_ða€F÷ ØŸ™Ð#3Ó4ˆˆv‰÷ Ü˜f fÕ=Ø€M÷) !× ús   Ä
HÈH$	c                ót   € V ^8„  d   QhR\         R\        \         ,          R\        \         \        3,          /# )r'   rO   Úabsorbed_intor(   rÄ   )r*   s   "r+   r,   r,   2  s2   € ÷ "Sñ "Sœð "S¬H´S­Mð "SÄTÌ#ÌsÈ(Å^ñ "Sr-   c           	     ó   € \        V R4      w  r#T;'       g    \        W4      ;p'       d   V# \        V 4      ;p'       d   \        V4      # \	        V\
        4      '       d   VP                  4       MRpV'       d6   WP8X  d   \        RV R24      # \        V4      '       g   \        RV R24      # \        V4      p\        V4      ;p'       d   \        V4      # V'       d   RV R2MRp\        4       '       d6    ^ RIHp	 V	! V 4      w  r«T
'       g   \        T4      # RRRRT  RT RT 2RR/# \        P                  ! V4       \!        VP"                  V4       RRRRV  RV 2/#   \         d   p\        R	T  R
T 24      u Rp?# Rp?ii ; i)z·Delete a skill. ``absorbed_into``: None = undeclared (legacy, accepted); "" = explicit prune;
"<skill>" = absorbed into that umbrella, which must exist (so the model can't claim one).r  r¢   zabsorbed_into='z'' cannot equal the skill being deleted.zR' does not exist. Create or patch the umbrella skill first, then retry the delete.z Content absorbed into 'rù   )Úarchive_skillzfailed to archive 'rL  NrN  Tr9  rø   z' archived (rh  Ú	_archivedz
' deleted.)r  r   r   r  r�   r;   r‚   rÝ   r   r   r   r_   rw  r6   ÚshutilÚrmtreeÚ_rmdir_if_emptyrµ   )rO   ru  r9   r  Ú
pinned_errÚabsorbed_targetÚskills_rootÚunsafeÚabsorbed_noterw  ÚokÚarchive_msgrE   s   &&           r+   Ú_delete_skillrƒ  2  s°  € ô )¨¨xÓ8Ñ€IØ×QÐQÔ<¸TÓQÐQ€uÖQØˆÜ" 4Ó(Ð(€zÖ(Ü�JÓÐÜ/9¸-Ì×/MÒ/M�m×)Ñ)Ô+ÐSU€OßØÔ"Ü˜/¨/Ð):Ð:aÐbÓcÐcÜ˜?×+Ò+Ü˜/¨/Ð):ð ;[ð \ó ]ð ]ä)¨)Ó4€KÜ(¨Ó3Ð3€vÖ3Ü�F‹|Ð÷ GVÐ.¨Ð.?¸rÑBÐ[]€MÜ×Òð	<Ý7Ù+¨DÓ1‰OˆB÷ Ü˜Ó$Ð$Ø˜4Ø˜W T F¨,°{°mÀ2ÀmÀ_ÐUØ˜Tð#ð 	#ô ‡M‚M�)ÔÜ�I×$Ñ$ kÔ2Ø�t˜Y¨'°$°°zÀ-ÀÐ(QÐRÐRøô ô 	<ÜÐ-¨d¨V°3°q°cÐ:Ó;Õ;ûð	<ús   Ã;E' Å'FÅ2FÆFÆFc                ó4   € V ^8„  d   QhR\         R\         RR/# )r'   rµ   Ústopr(   Nr   )r*   s   "r+   r,   r,   W  s!   € ÷ ñ œDð ¬ð °ñ r-   c                 ó¨   € W8w  dL   V P                  4       '       d4   \        V P                  4       4      '       g   V P                  4        R # R # R # R # rÉ   )rÐ   rS  rê   rT  )rµ   r…  s   &&r+   r{  r{  W  s5   € Ø„~˜&Ÿ-™-Ÿ/š/´#°f·n±nÓ6F×2GÒ2GØ�‰Žñ 3H™/�~r-   c          
      ój   € V ^8„  d   QhR\         R\         R\         R\        \         \        3,          /# )r'   rO   r  Úfile_contentr(   rH  )r*   s   "r+   r,   r,   \  s0   € ÷ ñ ”cð ¤cð ¼ð ÄÄcÌ3ÀhÅñ r-   c                óz  € \        V4      ;p'       d   \        V4      # V'       g   VR8w  d   \        R4      # \        VP                  R4      4      ;p\        8”  d   \        RVR R\        R R24      # \        W!R7      ;p'       d   \        V4      # \        V R	R
4      w  rVV'       d   V# \        WQ4      w  rsT;'       g    \        WVR	W4      ;p'       d   V# RRRRV RV  R2R\        V4      /pVP                  R4      '       d0   VR,          P                  4       '       d   \        W…R,          4       V# )z>Add or overwrite a supporting file within any skill directory.r¢   zfile_content is required.rR   zFile content is r�   z bytes (limit: z7 bytes / 1 MiB). Consider splitting into smaller files.rf  Ú
write_filez& Create it first with action='create'.rN  Tr9  úFile 'z' written to skill 'rù   rÇ   zreferences/r³   )r  r  rp   rV   ÚMAX_SKILL_FILE_BYTESrŸ   r  r  r*  r;   rŒ   rÐ   r@  )	rO   r  rˆ  r  Úcontent_bytesr9   r  r  rB   s	   &&&      r+   Ú_write_filerŽ  \  sI  € ä! )Ó,Ð,€sÖ,Ü�C‹yÐß˜L¨BÔ.ÜÐ/Ó0Ð0Ü˜\×0Ñ0°Ó9Ó:Ð:ˆÔ>RÔRÜÐ& }°QÐ&7°ÔG[Ð\]ÐF^ð _Mð Nó Oð 	Oä$ \ÔCÐC€sÖCÜ�C‹yÐÜ(¨¨|Ð=eÓfÑ€IßØˆÜ*¨9Ó@�K€FØ×eÐe”~ d°v¸|ÈYÓeÐe€uÖeØˆØ˜˜y¨F°9°+Ð=QÐRVÐQWÐWYÐ*ZÐ\bÔdgÐhnÓdoÐp€Fð ×Ñ˜M×*Ò*°	¸JÕ0F×/NÑ/N×/PÒ/PÜ˜f°*Õ&<Ô=Ø€Mr-   c                ó^   € V ^8„  d   QhR\         R\         R\        \         \        3,          /# )r'   rO   r  r(   rH  )r*   s   "r+   r,   r,   u  s.   € ÷ \ñ \”sð \¤sð \¬t´C¼°H­~ñ \r-   c           
     ó¨  € \        V4      ;p'       d   \        V4      # \        V R4      w  r4V'       d   V# \        W14      w  rRV'       d   V# VP	                  4       '       g¡   \
         UUu. uFp  pW6,          P	                  4       '       g   K!  W6,          P                  R4       F4  qwP                  4       '       g   K  \        VP                  V4      4      NK6  	  Kr  	  ppp\        RV RV  R2T;'       g    RR7      # \        WRV4      ;p	'       d   V	# VP                  4        \        VP                  V4       RR	R
RV RV  R2/# u uppi )z2Remove a supporting file from any skill directory.Úremove_fileÚ*r‹  z' not found in skill 'rù   N)Úavailable_filesrN  Tr9  z' removed from skill ')r  r  r  r  rÐ   r  r´   Úis_filer;   rÒ   r   r&  r{  rµ   )
rO   r  r  r9   r  r  Úsubdirr>  Ú	availabler(  s
   &&        r+   Ú_remove_filer—  u  s9  € ä! )Ó,Ð,€sÖ,Ü�C‹yÐÜ(¨¨}Ó=Ñ€IßØˆÜ*¨9Ó@�K€Fß
Øˆ
Ø�=‰=�?Š?ÝAPô oÁ°vØ"Õ+×3Ñ3×5ô 3Ø@IÕ@R×?YÑ?YÐZ]Ö?^¸!×bkÑbk×bmô 3”S˜Ÿ™ yÓ1Ö2Ù?^ñ 3Áˆ	ñ oä�f˜Y˜KÐ'=¸d¸VÀ2ÐFÐXa×XiÐXiÐeiÔjÐjÜ?ÀÈmÐ]fÓgÐg€zÖgØÐØ
‡M�M„OÜ�F—M‘M 9Ô-Ø�t˜Y¨&°°Ð;QÐRVÐQWÐWYÐ(ZÐ[Ð[ùóos   Á-EÂ,EÃ"EÚskill_gate_bypassr3   c                ó¶  €  ^ RI Hp TP                  TP                  4      pTP
                  '       d   R# TP                  '       d   \        TP                  RR7      # T ! T4      w  r4TP                  TP                  Y4TP                  4       R7      p\        P                  ! RRRRR	TR
,          RTRTP                  /RR7      #   \         d     R# i ; i)z¿Shared write gate: None to proceed, else a JSON tool result (blocked/staged).
``build_staging(wa) -> (payload, gist)`` runs only when staging. Fails open if
write_approval cannot be imported.)Úwrite_approvalNF©rN  )ÚsummaryÚoriginrN  TÚstagedÚ
pending_idÚidÚgistr9  ©Úensure_ascii)Útoolsrš  r6   Úevaluate_gateÚSKILLSÚallowÚblockedÚ
tool_errorr9  Ústage_writeÚcurrent_originÚjsonÚdumps)Úbuild_stagingÚwaÚdecisionÚpayloadr¡  Úrecords   &     r+   Ú_run_write_gater³  ‘  sÇ   € ðÝ.ð ×Ñ §	¡	Ó*€HØ‡~‡~€~ÙØ××ÐÜ˜(×*Ñ*°EÔ:Ð:Ù! "Ó%�M€GØ�^‰^˜BŸI™I wÀR×EVÑEVÓEXˆ^ÓY€FÜ�:Š:�y $¨°$¸ÀfÈTÅlØ˜t Y°×0@Ñ0@ðBØPUôWð Wøô ô Úðús   ‚C	 Ã	CÃCc                ó|   a aa€ S \         9  g   \        P                  4       '       d   R# V VV3R lp\        V4      # )z[Flat-shape gate: stage the full kwargs so approval can replay them; bypassed during replay.Nc                 óú   <€ R SRS/SP                  4        UUu/ uF  w  rVf   K  WbK  	  uppCpR Uu/ uF  pTSP                  V4      ;'       g    RbK!  	  ppW0P                  ! SS3/ VB 3# u uppi u upi )r  rO   r¢   )r†   r  r]  r^  )Úitemsr¤   Ú
skill_gist)r¯  ÚkÚvr±  Úgist_kwr  rO   Úpayload_kwargss   &    €€€r+   Ú_stagingÚ)_apply_skill_write_gate.<locals>._staging¨  s¡   ø€ Ø˜V V¨Tð QØ'5×';Ñ';Ô'=ÔOÑ'=™t˜qÀ”d�a’dÑ'=ÒOðQˆñ QóRÙP�qð �n×(Ñ(¨Ó+×1Ð1¨rÒ1ÙPð 	ð RàŸš f¨dÑ>°gÑ>Ð>Ð>ùó PùòRs   šA2§A2¶A8ÁA8)Ú_ACTION_HANDLERSÚ_skill_gate_bypassr¤   r³  )r  rO   r»  r¼  s   ffl r+   Ú_apply_skill_write_gaterÀ  ¤  s0   ú€ àÔ%Ô%Ô);×)?Ñ)?×)AÒ)AÙ÷?ô ˜8Ó$Ð$r-   r†   r|   r  rˆ  r]  r^  ru  Ú
operationsc                óR   € V ^8„  d   QhR\         \        \        3,          R\        /# ©r'   r±  r(   r,  )r*   s   "r+   r,   r,   µ  s"   € ÷ ?ñ ?¤¤S¬# X¥ð ?¼Cñ ?r-   c                óØ   € \        RRV P                  RR4      RV P                  RR4      RV P                  RR4      /\         Uu/ uF  q"V P                  V4      bK  	  upBVB # u upi )z_Call ``skill_manage`` with the flat-shape fields (and absorbed_into/operations) of ``payload``.r  r¢   rO   r_  Frþ   )Úskill_manager¤   Ú_FLAT_OP_KEYS)r±  Úextrar¸  s   &, r+   Ú_skill_manage_fromrÈ  µ  s{   € äñ ?Ø�{‰{˜8 RÓ(ð?Ø/6¯{©{¸6À2Ó/Fð?à—K‘K ¨uÓ5ð?õ '4Ó
4¡m ˆg�k‰k˜!‹nÒ¡mÑ
4ð?ð 9>ñ?ð ?ùò 5s   ÁA'c                óR   € V ^8„  d   QhR\         \        \        3,          R\        /# rÃ  r,  )r*   s   "r+   r,   r,   ½  s"   € ÷ (ñ (¤¤c¬3 h¥ð (´Cñ (r-   c                ó¢   € \         P                  R4      p \        V 4      \         P                  V4       #   \         P                  T4       i ; i)zNReplay a staged skill write, bypassing the gate (the /skills approve handler).T)r¿  rÏ   rÈ  Úreset)r±  Útokens   & r+   Úapply_skill_pendingrÍ  ½  s=   € ä×"Ñ" 4Ó(€Eð(Ü! 'Ó*ä× Ñ  Õ'øÔ× Ñ  Õ'ús	   —
7 ·Ac                ó,  € V R,          '       d,   V R,          '       g   V R,          e   \        \        RR7      # V R,          '       d   \        V R,          V R,          4      # \        V R,          V R,          V R,          V R,          V R,          4      # )	z¶Two shapes: old_string/new_string = targeted replacement (validated in _patch_skill so the
tool and the helper give the same guidance); content alone = full rewrite (the old 'edit').r†   r]  r^  Fr›  rO   r  r_  )r©  r   r[  rs  ©Úas   &r+   Ú
_act_patchrÑ  Æ  st   € ð 	ˆ‡|„|˜˜<Ÿœ¨A¨l­OÒ,GÜÔ*°EÔ:Ð:Øˆ‡|„|Ü˜1˜V�9 a¨	¥lÓ3Ð3Ü˜˜&�	 1 \¥?°A°lµOÀQÀ{Å^ÐUVÐWdÕUeÓfÐfr-   rM  c                 óF   € \        V R ,          V R,          V R,          4      # )rO   r†   r|   )rW  rÏ  s   &r+   Ú<lambda>rÓ  Ó  s   € œ a¨¥i°°9µ¸qÀ½}ÔMr-   rZ  c                 ó6   € \        V R ,          V R,          4      # )rO   r†   )r[  rÏ  s   &r+   rÓ  rÓ  Ô  s   € ”k ! F¥)¨Q¨y­\Ô:r-   ra  r  c                 ó8   € \        V R ,          V R,          R7      # )rO   ru  )ru  )rƒ  rÏ  s   &r+   rÓ  rÓ  Ö  s   € œ a¨¥i¸qÀÕ?QÕRr-   rŠ  c                 óF   € \        V R ,          V R,          V R,          4      # )rO   r  rˆ  )rŽ  rÏ  s   &r+   rÓ  rÓ  ×  s   € œK¨¨&­	°1°[µ>À1À^ÕCTÔUr-   r‘  c                 ó6   € \        V R ,          V R,          4      # )rO   r  )r—  rÏ  s   &r+   rÓ  rÓ  Ø  s   € œ\¨!¨F­)°Q°{µ^ÔDr-   c                ó   € V ^8„  d   QhRR/# )r'   r(   Nrþ   )r*   s   "r+   r,   r,   Û  s   € ÷ "ñ "Ø26ñ"r-   c          
     óV  € \        \        4      ;_uu_ 4        ^ RIHp \	        V4      p	V R8X  d   RVR\        VP                  R4      4      /M/ p
T
P                  RV3RV33 UUu/ uF  w  r¼V'       g   K  W¼bK  	  upp4       TP                  YVe   TM. V	'       d
   V	R	,          MRV
R
7       RRR4       \        \        4      ;_uu_ 4        ^ RI	H
p V! RR7       RRR4       \        \        4      ;_uu_ 4        ^ RIHpHpHp ^ RIHp V R8X  d   V! VV! 4       WVR7       M8V R9   d   V! WWVR7       M&V R8X  d    VP                  R4      '       g	   V! V4       RRR4       R# u uppi   + '       g   i     LÇ; i  + '       g   i     L«; i  + '       g   i     R# ; i)zžBest-effort post-mutation side effects (never break the tool): ledger, prompt-cache
clear, curator telemetry (which fires ``on_skill_lifecycle`` for plugins).©Úskill_ledgerr  ru  Úarchivedrx  Ú
session_idr  NrÇ   )r3  Ú
after_rootÚevidence)Ú clear_skills_system_prompt_cacheT)Úclear_snapshot)Ú
bump_patchÚforgetÚrecord_created)Úis_background_reviewrM  )Úagent_createdÚtask_idrÝ  )r  rç  rÝ  >   rZ  ra  rŠ  r‘  )r   r6   r¤  rÛ  rÝ   r)   r¤   ÚupdateÚrecord_mutationÚagent.prompt_builderrà  r_   râ  rã  rä  Útools.skill_provenancerå  )r  rO   rB   r  ru  rç  rÝ  Úledger_beforeÚ_ledgerÚ_postÚ	_evidencer¸  r¹  rà  râ  rã  rä  rå  s   &&&$$$$$          r+   Ú_record_successrð  Û  sd  € ô 
”)×	Õ	Ý1Ü˜DÓ!ˆð  (Ô*ð & }°jÄ$ÀvÇzÁzÐR]ÓG^ÓB_Ñ`Ø02ð 	à×Ñ¨\¸:Ð,FÈÐV_ÐH`Ñ+aÔgÑ+a¡4 1Ôefœ$˜!š$Ñ+aÒgÔhØ×ÑØ°-Ò2K¡ÐQSß(-�u˜V–}°4À)ð 	 ô 	M÷ 
ô 
”)×	Õ	ÝIÙ(¸Õ=÷ 
ô 
”)×	Õ	ßHÑHõ 	@Ø�XÔÙ˜4Ñ/CÓ/EØ#*öCàÐEÔEÙ�t°GÖSØ�xÔ¨¯
©
°;×(?Ò(?Ù�4ŒL÷ 
Ñ	ùó h÷ 
×	ú÷ 
×	ú÷ 
×	Ð	úsI   ˜AE1Á'E+Á8E+Á>"E1Â!E1ÃFÄ AFÅFÅ+E1Å1F	ÆF	ÆF(	c                ó2  € V ^8„  d   QhR\         R\         R\         R,          R\         R,          R\         R,          R\         R,          R\         R,          R	\         R,          R
\        R\         R,          R\         R,          R\         R,          R\         /# )r'   r  rO   r†   Nr|   r  rˆ  r]  r^  r_  ru  rç  rÝ  r(   )r;   r)   )r*   s   "r+   r,   r,      s©   € ÷ 12ñ 12Üð12Üð12Ü%(¨4¥Zð12ÜBEÈÅ*ð12Ü`cÐfjÕ`jð12ä˜•*ð12ä14°tµð12äPSÐVZÕPZð12ô ð12ô /2°D­jð12ô KNÐPTÍ*ð12ô �d•
ð	12ô 8;ñ	12r-   c                óü  a € Ve   \        YÁ;'       g    RW«R7      # \        S V4      ;pe   \        P                  ! VRR7      # \	        W#WEWgVV	R7      p\        S V3/ VB ;pe   V# \        S V4      ;pe   \        VRR7      # \        S R8X  g	   V'       g   TM\        V4      P                  4      ;pe"   \        P                  ! \        V4      RR7      # \        V4      ;_uu_ 4        Rp\        \        4      ;_uu_ 4        ^ RIHp \#        V4      pTP%                  V'       d
   VR	,          MRS R
8H  VR7      pRRR4       \&        P)                  S V 3R l4      pV! RV/VC4      p\+        V\,        4      '       d   VuuRRR4       # VP)                  R4      '       d   \/        S VVWIW«VR7       RRR4       \        P                  ! XRR7      #   + '       g   i     L ; i  + '       g   i     L;; i)z†Dispatch to the action handler -> JSON string. ``operations`` (atomic batch shape,
see _skill_manage_batch) overrides the flat fields.N)Údefault_namerç  rÝ  Fr¢  )r†   r|   r  rˆ  r]  r^  r_  ru  r›  rM  rÚ  rÇ   r  )Úcomplete_packageÚskillc                 ó"   <€ \        R S R24      # )zUnknown action 'z<'. Use: create, edit, patch, delete, write_file, remove_file)r  )rÐ  r  s   &€r+   rÓ  Úskill_manage.<locals>.<lambda>(  s   ø€ ¼Ø˜v˜hÐ&bÐcô:er-   rO   rN  )r  ru  rç  rÝ  rì  )r!   r   r¬  r­  r“   rÀ  r    r©  rz   r   rO   r  r`   r   r6   r¤  rÛ  rÝ   Úcapture_beforer¾  r¤   r�   r;   rð  )r  rO   r†   r|   r  rˆ  r]  r^  r_  ru  rç  rÝ  rÁ  Ú	preflightÚargsÚgate_resultÚ	shape_errÚname_errÚ_ledger_beforerí  Ú_preÚhandlerrB   s   f&&&&&&&&&&&&          r+   rÅ  rÅ     sÎ  ø€ ð ÒÜ"Ø§\ \¨T¸7ô[ð 	[ä1°&¸$Ó?Ð?ˆ	ÒLÜ�zŠz˜)°%Ô8Ð8ô ˜¸iØ%È+Ø+ô-€Dô /¨v°tÑD¸tÑDÐDˆÒQØÐÜ$ V¨TÓ2Ð2ˆ	Ò?Ü˜)¨UÔ3Ð3ô #¨6°XÔ+=ÇT¡4ÌtÐTXËzÏÉÓ_Ð_ˆÒlÜ�zŠzœ$˜x›.°uÔ=Ð=ô 
˜d×	#Õ	#ð ˆÜ”i× Õ Ý5Ü˜tÓ$ˆDØ$×3Ñ3ß $��V–¨$À&ÈHÑBTÐ]að 4ó cˆN÷ !ô
 #×&Ñ& vô 0eó fˆá˜& $Ð/¨$Ð/Ó0ˆÜ�fœc×"Ò"Ø÷! 
$Ò	#ð" �:‰:�i× Ò ÜØ˜˜f°	ØÀnõV÷% 
$ô* �:Š:�f¨5Ô1Ð1÷ !× ú÷ 
$×	#ús1   Ã,G+Ä:G	Å AG+ÆG+Æ'G+ÇG(Ç#G+Ç+G;	c                ó$   € V ^8„  d   QhR\         /# r&   r[   )r*   s   "r+   r,   r,   6  s   € ÷ ñ ¤3ñ r-   c                  ó   €  R # )uŽ  Create, update, or delete skills â€” your procedural memory for recurring task types. The call is an operations array (a single edit is a list of one); it applies atomically â€” any failure rolls every touched skill back. Ops: create (full SKILL.md; lands in the profile's skills directory or configured skills.create_dir; must precede that skill's other ops), patch (targeted old_string/new_string fix â€” preferred; content alone REPLACES the whole file, read it via skill_view() first), write_file/remove_file (supporting files), delete (sole op only). Existing skills are modified wherever they live. Keep the description's first 57 chars a self-contained trigger: 'Use when <trigger>. <one-line behavior>.' Write lessons, not logs: imperative rule + why, no PR numbers/dates/incident narration, one rule per lesson, references/ named by topic (extend before adding). skill_view() shows format conventions.rþ   rþ   r-   r+   Ú_skill_manage_descriptionr  6  s   € ð	1ñr-   ÚtypeÚstringrŠ   z9Text to find (same matching semantics as the patch tool).z,Replacement; empty string deletes the match.u§   Path RELATIVE to the skill's own directory, e.g. 'references/api.md' â€” no leading slash, never absolute; first segment references/, templates/, scripts/, or assets/.c                óH   € V ^8„  d   QhR\         R\        R\        R\        /# )r'   r  ÚpropsÚrequiredr(   )r;   r“   rà   )r*   s   "r+   r,   r,   V  s(   € ÷ 7ñ 7”sð 7¤4ð 7´5ð 7¼Tñ 7r-   c                ó<   € RRRRRR\         RRRR	V .//VCR
RR.VO/# )zžOne self-contained per-action op shape. ``additionalProperties: false`` is what lets a
grammar-constrained backend refuse another action's text slot outright.r  ÚobjectÚadditionalPropertiesFÚ
propertiesrO   r  r  Úenumr  )Ú_NAME)r  r  r  s   &&&r+   Ú
_op_schemar  V  sG   € ð �HÐ4°eØ˜6¤5¨(°V¸XÀvÐPVÈxÐ4XÐbÐ\aÐbØ˜ Ð5¨HÐ5ð7ð 7r-   rO   rÅ  Ú
parametersr
  r  Úarrayz�Ordered ops; each names its target skill (lowercase, hyphens/underscores, max 64 chars). Each action is its own shape; another action's text slot is invalid.r¶  ÚanyOfz6Full SKILL.md text (YAML frontmatter + markdown body).z)Optional category subdir (e.g. 'devops').r_  Úbooleanz(Replace all occurrences (default false).z@Optional supporting file (write_file's shape); default SKILL.md.z=Full SKILL.md rewrite (REPLACES the whole file; last resort).z!Full text of the supporting file.z%Supporting file (write_file's shape).zOCurator consolidation only: umbrella skill that absorbed this one (must exist).r  )Úregistryr©  u   ðŸ“�c                 óX   € \        WP                  R 4      VP                  R4      R7      # )rç  rÝ  )rç  rÝ  )rÈ  r¤   )rú  Úkws   &,r+   rÓ  rÓ  Ÿ  s"   € Ô1Ø—f‘f˜YÓ'°B·F±F¸<Ó4Hõ Jr-   )rO   ÚtoolsetÚschemaÚemojir   c                ój   € V ^8„  d   Qh/ ^ \         9   d   \        P                  \        ,          ;R&   # )r'   r¿  )Ú__conditional_annotations__Ú_ctxvarsÚ
ContextVarr)   )r*   s   "r+   r,   r,      s/   € ÷ ñ ÷V(ò (”H×'Ñ'¬Õ-ñ (òWr-   >   ÚassetsÚscriptsÚ	templatesÚ
references)r³   rÉ   )r¢   )NF)r†   r|   r  rˆ  r]  r^  ru  rÁ  )NNNNNNFNNNN)r†   )r]  r^  )r  rˆ  )r  rþ   )r  Ú__doc__Úcontextvarsr  rT   r¬  Ú
contextlibr   r   ÚloggingÚrery  Úpathlibr   Útypingr   r   r   r	   r
   Úhermes_yamlr�   rç   r   Úutilsr   r   r5   r   rª   r   r   r   r/  r   Útools.skill_manager_guardsr   r   r   r   r   r   r   r   r   r   r  Útools.skill_manager_batchr   r   r   r    r!   Útools.skills_guardr"   r#   r$   Ú	getLoggerÚ__name__r@   r7   rF   ÚHERMES_HOMErI   rJ   rL   rY   r`   rh   rq   r”   rž   rŒ  Úcompilerr   r  r�   rx   rt   rz   rƒ   rš   rŸ   r¦   r­   r·   rÂ   rÝ   ró   r  r  r  r  r*  r1  r@  rF  rW  r[  rs  rƒ  r{  rŽ  r—  r  r¿  r³  rÀ  rÆ  rÈ  rÍ  rÑ  r¾  rð  rÅ  r  r  Ú_OLD_STRINGÚ_NEW_STRINGÚ
_FILE_PATHr  ÚSKILL_MANAGE_SCHEMAÚtools.registryr  r©  Úregisterr,   )r  s   @r+   Ú<module>r8     sï  øðöó Û Û ß *Û Û 	Û Ý ß 3Õ 3ã å ,ß 4Ý %÷ó ÷
F÷ F÷ F÷nõ nç SÑ Sà	×	Ò	˜8Ó	$€õõñ$ Ó€Ø˜8Õ#€
Ø"Ð õ_õ7õ3òð €ØÐ Ø!Ð Ø Ð Ø—
’
Ð4Ó5€ÚB€Ø—j’j Ó/Ð ØN€
õ
;õmõ
<ð!¸U÷ !÷Hõ÷*õ"õõ,5õp#÷Lõ*õ(8÷9õõ,÷[õ*:÷&õR<÷3÷l"SõJõ
õ2\ð0 19×0CÒ0CØ ô1(Ð ó (òWò&
%ð0€õ?õ(ògð ÑMØ
Ñ:ØˆZØÑRØÑUØÑDðFÐ õ"÷J12õlð& 
�Ð€Ø�xØÐYð[€à�x Ð0^Ð_€à
ˆHØð	^ð€
õ7ð ˆNð Ñ,Ó.ØØ�ØØØ˜Øðjð ˜'Ù˜xØ! F¨HØ$1Ð3kð$mà" V¨XØ%2Ð4_ð%að*ð
 $ó%ñ ˜wØ$ k°<ÀØ%¨°	Ø(5Ð7að(cà# f¨hØ&3Ð5wð&yð	)ð 4ó5ñ ˜wØ! F¨HØ$1Ð3rð$tð)ð $ó%ñ ˜|Ø# ZØ&¨°¸=ÐJmÐ(nð.ð 5ó6ñ ˜}Ø# f¨h¸ÐGnÐ%oð/à%ó'ñ ˜xØ'¨&°(Ø*7ð :`ð*að*ð ó	ð9!$ð !ð+ð.
ð^ 	�\�Nðc2ð9Ð ÷z 0à × Ò Ø	 Ð2EÈVñJ÷Kr-   