+
    lHàj [  ã                   ó"  € R t ^ RIt^ RIt^ RIt^ RIt^ RI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HtHt ]P*                  ]P,                  3 FA  t]! ]R4      '       g   K  ]! ]]4      ;_uu_ 4        ]P7                  RRR	7       RRR4       KC  	  ^ R
IHtHt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+ ]PX                  ! ]-4      t.]! 4       t/]/R,          t0]0R,          t1]/t2]0t3]1t4R R lt5R R lt6R R lt7R R lt8Rt9R R lt:R R lt;R R lt<RfR! R" llt=RfR# R$ llt>R% R& lt?R' R( lt@R) R* ltAR+ R, ltBR- R. ltCR/ R0 ltDR1R /R2 R3 lltERgR4 R5 lltFR6 R7 ltGR8 R9 ltHR: R; ltI]
 ! R< R=4      4       tJR> R? ltKR@ RA ltLRB RC ltMRD RE ltNRF RG ltORH RI ltPRfRJ RK lltQRL RM ltR]-RN8X  Ed7   ]S! RO4       ]Q! R RP7      tT]U! ]TRQ,          4       RR2]U! ]TRS,          4       RT2]TRU,           RV2.tV]TRW,          ;tW'       d\   RXP±                  ]WRY,          4      ]U! ]W4      ^8”  d   RZ]U! ]W4      ^,
           R[2MR\,           tY]VPµ                  ]U! ]W4       R]]Y 24       ]TR^,          '       d"   ]VPµ                  ]U! ]TR^,          4       R_24       ]TP·                  R`4      ;t\'       d   ]VPµ                  ]U! ]\4       Ra24       ]S! RbRXP±                  ]V4       Rc]TRd,           Re24       R# R#   + '       g   i     EK·  ; i)ha<  Skills Sync -- manifest-based seeding and updating of bundled skills. Copies repo skills/ into
~/.hermes/skills/, tracking each synced skill's origin hash in .bundled_manifest (v2 "name:hash"
lines; v1 plain names auto-migrate). NEW skills are copied and recorded; EXISTING skills update
only when bundled changed AND the user copy still matches the origin hash (else user-customized
-> SKIP); user-DELETED skills are not re-added; upstream-REMOVED ones leave the manifest once no active or
archived copy remains (the entry is that copy's only built-in provenance record).N)Úsuppress)Ú	dataclassÚfield©ÚPath)ÚDictÚIteratorÚListÚOptionalÚSetÚTupleÚreconfigureúutf-8Úreplace)ÚencodingÚerrors)Úget_bundled_skills_dirÚget_hermes_homeÚget_optional_skills_dir)ÚESSENTIAL_SKILLSÚis_excluded_skill_path)Úread_skill_name)Ú_backfill_optional_provenanceÚ_ignore_runtime_cacheÚ_is_runtime_cacheÚ_read_hub_install_paths)Úatomic_write_textÚskillsú.bundled_manifestc                ó0   € V ^8„  d   QhR\         R\         /# )é   Ú	at_importÚreturnr   )Úformats   "Ú6/home/ubuntu/.hermes/hermes-agent/tools/skills_sync.pyÚ__annotate__r%   5   s   € ÷ Mñ M¤ð M´Dñ Mó    c                óF   € \        V 4      V8w  d   \        V 4      # V! 4       # )zJThe patched module global if it changed since import, else the live value.r   )Ú
configuredr!   Úfallbacks   &&&r$   Ú_liver*   5   s    € ä# JÓ/°9Ô<Œ4�
ÓÐLÁ(Ã*ÐLr&   c                ó$   € V ^8„  d   QhR\         /# ©r    r"   r   )r#   s   "r$   r%   r%   :   s   € ÷ Gñ G”dñ Gr&   c                  ó4   € \        \        \        \        4      # ©N)r*   ÚHERMES_HOMEÚ_HERMES_HOME_AT_IMPORTr   © r&   r$   Ú_hermes_homer2   :   s   € Ü”Ô4´oÓFÐFr&   c                ó$   € V ^8„  d   QhR\         /# r,   r   )r#   s   "r$   r%   r%   >   s   € ÷ Wñ W”Tñ Wr&   c                  ó.   € \        \        \        R  4      # )c                  ó$   € \        4       R ,          # ©r   )r2   r1   r&   r$   Ú<lambda>Ú_skills_dir.<locals>.<lambda>?   s   € ¼L»NÈXÖ<Ur&   )r*   Ú
SKILLS_DIRÚ_SKILLS_DIR_AT_IMPORTr1   r&   r$   Ú_skills_dirr;   >   s   € Ü”Ô2Ñ4UÓVÐVr&   c                ó$   € V ^8„  d   QhR\         /# r,   r   )r#   s   "r$   r%   r%   B   s   € ÷ gñ gœñ gr&   c                  ó.   € \        \        \        R  4      # )c                  ó$   € \        4       R ,          # )r   )r;   r1   r&   r$   r7   Ú _manifest_file.<locals>.<lambda>C   s   € Ä+Ã-ÐReÖBer&   )r*   ÚMANIFEST_FILEÚ_MANIFEST_FILE_AT_IMPORTr1   r&   r$   Ú_manifest_filerB   B   s   € Ü”Ô 8Ñ:eÓfÐfr&   z.no-bundled-skillsc                ó$   € V ^8„  d   QhR\         /# r,   r   )r#   s   "r$   r%   r%   K   s   € ÷ Kñ Kœ$ñ Kr&   c                  óh   € \        \        \        4      P                  P                  R ,          4      # r6   )r   r   Ú__file__Úparentr1   r&   r$   Ú_get_bundled_dirrG   K   s"   € Ü!¤$¤x£.×"7Ñ"7×">Ñ">ÀÕ"IÓJÐJr&   c                ó$   € V ^8„  d   QhR\         /# r,   r   )r#   s   "r$   r%   r%   O   s   € ÷ Uñ Uœ4ñ Ur&   c                  óh   € \        \        \        4      P                  P                  R ,          4      # )zoptional-skills)r   r   rE   rF   r1   r&   r$   Ú_get_optional_dirrJ   O   s#   € Ü"¤4¬£>×#8Ñ#8×#?Ñ#?ÐBSÕ#SÓTÐTr&   c                ó0   € V ^8„  d   QhR\         R\        /# )r    Úpathr"   )r   Ústr)r#   s   "r$   r%   r%   S   s   € ÷ 6ñ 6œDð 6¤Sñ 6r&   c                 óP   € V P                  \        4       4      P                  4       # r.   )Úrelative_tor;   Úas_posix)rL   s   &r$   Ú_rel_skills_posixrQ   S   s   € Ø×ÑœK›MÓ*×3Ñ3Ó5Ð5r&   Fc                óR   € V ^8„  d   QhR\         R\        R\        \         ,          /# )r    ÚrootÚsortr"   )r   Úboolr   )r#   s   "r$   r%   r%   W   s%   € ÷ ñ œ$ð ¤dð ´xÄµ~ñ r&   c              #  óØ   "  € V P                  4       '       d   V P                  R4      M
\        R4      pV'       d   \        V4      MT F  p\	        V4      '       d   K  Vx € K  	  R# 5i)zRYield every non-excluded SKILL.md under ``root`` (nothing when it does not exist).úSKILL.mdNr1   )ÚexistsÚrglobÚiterÚsortedr   )rS   rT   ÚfoundÚskill_mds   &&  r$   Ú_iter_skill_mdsr^   W   sH   é € à&*§k¡k§m¢mˆD�J‰J�zÔ"¼¸b»€Eß%)”F˜5”M¨uÒ4ˆÜ% h×/Ô/ØŒNó 5ùs   ‚:A*½A*Á 
A*c                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r    rT   r"   )rU   r   r   )r#   s   "r$   r%   r%   _   s   € ÷ 0ñ 0¤ð 0´(¼4µ.ñ 0r&   c                ó*   € \        \        4       V 4      # )z<Yield every non-excluded SKILL.md in the user's skills tree.)r^   r;   )rT   s   &r$   Ú_iter_active_skill_mdsra   _   s   € äœ;›=¨$Ó/Ð/r&   c                ó:   € V ^8„  d   QhR\         \        ,          /# r,   )ÚsetrM   )r#   s   "r$   r%   r%   d   s   € ÷ 
ñ 
¤S¬¥Xñ 
r&   c            	     óü   € ^ RI Hp Hp V! 4        \        4       pV ! 4        FF  p\	        V4       F4  pVP                  VP                  P                  \        VR4      04       K6  	  KH  	  VP                  R4       V# )z‡Names (directory and frontmatter) of every skill provided by external_dirs,
so sync_skills never shadows an externally-delegated skill.)Úget_external_skills_dirsÚ_external_dirs_cache_clearÚ )
Úagent.skill_utilsre   rf   rc   r^   ÚupdaterF   Únamer   Údiscard)re   rf   Úexternal_namesÚext_dirr]   s        r$   Ú_build_external_skill_indexrn   d   sl   € ÷ WÙÔ Ü"›u€NÙ+Ö-ˆÜ'¨Ö0ˆHØ×!Ñ! 8§?¡?×#7Ñ#7¼ÈÐSUÓ9VÐ"WÖXó 1ñ .ð ×Ñ˜2ÔØÐr&   c                óF   € V ^8„  d   QhR\         \        \        3,          /# r,   ©ÚdictrM   )r#   s   "r$   r%   r%   q   s   € ÷ ñ œœS¤#˜X�ñ r&   c                 óF  €  / p \        4       P                  RR7      P                  4        F^  pVP                  4       pV'       g   K  RV9   d7   VP	                  R4      w  r#pVP                  4       WP                  4       &   KZ  RW&   K`  	  V #   \
         d    / u # i ; i)zZ``{skill_name: origin_hash}``; v1 plain-name lines get an empty hash (migrates next sync).ú	utf-8-sig©r   Ú:rg   )rB   Ú	read_textÚ
splitlinesÚstripÚ	partitionÚOSError)ÚresultÚlinerj   Ú_Úhash_vals        r$   Ú_read_manifestr   q   s•   € ðØˆÜ"Ó$×.Ñ.¸Ð.ÓD×OÑOÖQˆDØ—:‘:“<ˆDßÙØ�dŒ{à$(§N¡N°3Ó$7Ñ!�˜Ø'/§~¡~Ó'7�—z‘z“|Ó$ð  "�“ñ Rð ˆøÜô ØŠ	ðús   ‚BB ÂB ÂB c                ó$   € V ^8„  d   QhR\         /# r,   )rc   )r#   s   "r$   r%   r%   …   s   € ÷ ñ ¤ñ r&   c                 óº  €  ^ RI Hp  V ! 4       #   \         dÁ    \        4       R,          pTP	                  4       '       g   \        4       u # \        4       p TP                  RR7      P                  4        FG  pTP                  4       pT'       g   K  TP                  R4      '       d   K6  TP                  T4       KI  	  M  \         d     Mi ; iTu # i ; i)u  Built-in skills the curator pruned â€” must NOT be re-seeded on sync.

Delegates to ``tools.skill_usage`` (single source of truth) and falls back
to reading ``~/.hermes/skills/.curator_suppressed`` directly if that import
is unavailable in a packaged/update context.
)Úread_suppressed_namesz.curator_suppressedrs   rt   Ú#)Útools.skill_usager‚   Ú	Exceptionr;   rX   rc   rv   rw   rx   Ú
startswithÚaddrz   )r‚   rL   Únamesr|   s       r$   Ú_read_suppressed_namesr‰   …   s®   € ðÝ;á$Ó&Ð&øÜô Ü‹}Ð4Õ4ˆØ�{‰{�}Š}Ü“5ŠLÜ“ˆð	ØŸ™°˜Ó<×GÑGÖI�Ø—z‘z“|�ß‘4 §¡°× 4Ô 4Ø—I‘I˜d–Oò Jøô ô 	Ùð	úàŠðúsE   ‚ �<CÁ
CÁ8CÂCÂ.CÃCÃCÃCÃCÃCÃCc                óF   € V ^8„  d   QhR\         \        \        3,          /# )r    Úentriesrp   )r#   s   "r$   r%   r%   Ÿ   s   € ÷ cñ cœT¤#¤s (�^ñ cr&   c                óH  € ^ RI Hp V! \        4       P                  4        RP	                  R \        V P                  4       4       4       4      p\        \        4       VRRR7       R	#   \         d-   p\        P                  R\        4       TRR7        R	p?R	# R	p?ii ; i)
zOAtomic v2 write, preserving an existing file's mode/owner (not mkstemp's 0600).)Úmkdir_under_hermes_homerg   c              3   ó6   "  € T F  w  rV R V R2x € K  	  R# 5i)ru   Ú
Nr1   )Ú.0ÚnÚhs   &  r$   Ú	<genexpr>Ú"_write_manifest.<locals>.<genexpr>¤   s    é € ÐHÑ0G©¨˜!˜˜A˜a˜S •|Ó0Gùs   ‚z.bundled_manifest_T)Ú
tmp_prefixÚpreserve_modez&Failed to write skills manifest %s: %s©Úexc_infoN)Úhermes_constantsr�   rB   rF   Újoinr[   Úitemsr   r…   ÚloggerÚdebug)r‹   r�   ÚdataÚes   &   r$   Ú_write_manifestr    Ÿ   s}   € å8ÙœNÓ,×3Ñ3Ô4ðcØ�w‰wÑH´°w·}±}³Ô0GÓHÓHˆÜœ.Ó*¨DÐ=QÐae×føÜô cÜ�‰Ð=¼~Ó?OÐQRÐ]aˆ×bÒbûðcús   ¢AA* Á*B!Á5!BÂB!c                óh   € V ^8„  d   QhR\         R\        \        \        \         3,          ,          /# )r    Úbundled_dirr"   )r   ÚlistÚtuplerM   )r#   s   "r$   r%   r%   ª   s,   € ÷ 	Vñ 	V¬$ð 	V´4¼¼cÄ4¸iÕ8HÕ3Iñ 	Vr&   c                ó  € V P                  4       '       g   . # V P                  R4       Uu. uFR  p\        VP                  V 4      V R7      '       d   K'  \	        WP
                  P                  4      VP
                  3NKT  	  up# u upi )zî``(skill_name, skill_dir)`` per SKILL.md under the bundled dir. Exclusions are evaluated
relative to the bundled tree: the install prefix itself may contain ``venv``/``site-packages``
(which once made wheel installs discover zero skills).rW   )rS   )rX   rY   r   rO   r   rF   rj   )r¢   Úmds   & r$   Ú_discover_bundled_skillsr§   ª   s|   € ð ×Ñ×ÒØˆ	ð ×#Ñ# JÔ/óVá/ˆBÜ% b§n¡n°[Ó&AÈ×TÐTô 	9Œ˜ŸY™YŸ^™^Ó	,¨b¯i©iÓ8Ù/ñVð Vùò Vs   ¬$BÁ/Bc                ó<   € V ^8„  d   QhR\         R\         R\         /# )r    Ú	skill_dirr¢   r"   r   )r#   s   "r$   r%   r%   ¶   s!   € ÷ >ñ >¤dð >¼ð >Ä$ñ >r&   c                óB   € \        4       V P                  V4      ,          # )zZDestination preserving category structure (bundled/mlops/axolotl -> skills/mlops/axolotl).)r;   rO   )r©   r¢   s   &&r$   Ú_compute_relative_destr«   ¶   s   € ä‹=˜9×0Ñ0°Ó=Õ=Ð=r&   Úinclude_runtime_cachec                ó<   € V ^8„  d   QhR\         R\        R\        /# )r    Ú	directoryr¬   r"   )r   rU   rM   )r#   s   "r$   r%   r%   »   s!   € ÷ ñ œð ¼ð Ìñ r&   c          
     ó&  € \         P                  ! 4       p\        \        4      ;_uu_ 4        \	        V P                  R4      4       F�  pV'       g   \        W04      '       d   K  VP                  4       '       g   K6  VP                  \        VP                  V 4      4      P                  R4      4       VP                  VP                  4       4       K�  	  RRR4       VP                  4       #   + '       g   i     TP                  4       # ; i)zÔMD5 of package paths/content, excluding generated runtime state.

The legacy option is only for proving an exact pre-filter origin match.
Keep the original path encoding so clean existing manifests remain valid.
Ú*r   N)ÚhashlibÚmd5r   rz   r[   rY   r   Úis_fileri   rM   rO   ÚencodeÚ
read_bytesÚ	hexdigest)r®   r¬   ÚhasherÚfpaths   &$  r$   Údir_hashr¹   »   s»   € ô �[Š[‹]€FÜ	”'×	Õ	Ü˜IŸO™O¨CÓ0Ö1ˆEß%Ô->¸u×-PÔ-PÐV[×VcÑVc×VeÔVeØ—‘œc %×"3Ñ"3°IÓ">Ó?×FÑFÀwÓOÔPØ—‘˜e×.Ñ.Ó0Ö1ñ 2÷ 
ð
 ×ÑÓÐ÷ 
Ö	ð
 ×ÑÓÐús   ­4C1Á&C1Á>AC1Ã1D	c                ó^   € V ^8„  d   QhR\         R\        R\        \        ,          R\        /# )r    r®   Úorigin_hashÚ	user_hashr"   )r   rM   r
   rU   )r#   s   "r$   r%   r%   Ê   s4   € ÷ 
dñ 
d¤Dð 
d´sð 
dÄxÔPSÅ}ð 
dÔ`dñ 
dr&   c                óp   € V'       g   R# Vf   \        V 4      MTpW18H  ;'       g    \        V RR7      V8H  # )a  Prove unchanged package ownership against a clean OR exact legacy hash.

Never re-baseline a differing package merely because it contains a cache:
if legacy cached bytes changed/disappeared, the old origin cannot be proven.
A genuinely edited package must remain protected in that case.
FT)r¬   )r¹   )r®   r»   r¼   Úcurrents   &&& r$   Ú_matches_origin_hashr¿   Ê   s9   € ÷ ÙØ%.Ò%6Œh�yÔ!¸I€GØÑ!×cÐc¤X¨iÈtÔ%TÐXcÑ%cÐcr&   c                ó4   € V ^8„  d   QhR\         R\         RR/# ©r    ÚsrcÚdestr"   Nr   )r#   s   "r$   r%   r%   ×   s!   € ÷ %ñ %”4ð %œtð %¨ñ %r&   c                 ó’   € VP                   P                  R R R7       \        P                  ! \	        V 4      \	        V4      4       R# )T©ÚparentsÚexist_okN)rF   ÚmkdirÚshutilÚmoverM   ©rÂ   rÃ   s   &&r$   Ú	_move_dirrÌ   ×   s/   € Ø‡K�K×Ñ˜d¨TÐÔ2Ü
‡K‚K”�C“œ#˜d›)Ö$r&   c                ó4   € V ^8„  d   QhR\         R\         RR/# rÁ   r   )r#   s   "r$   r%   r%   Ü   s!   € ÷ =ñ =”4ð =œtð =¨ñ =r&   c                 óx   € VP                   P                  R R R7       \        P                  ! W\        R7       R# )TrÅ   ©ÚignoreN)rF   rÈ   rÉ   Úcopytreer   rË   s   &&r$   Ú	_copy_dirrÒ   Ü   s(   € Ø‡K�K×Ñ˜d¨TÐÔ2Ü
‡O‚O�CÔ&;×<r&   c          	      óV   € V ^8„  d   QhRRR\         R\        R\        \         ,          /# )r    ÚstÚ
_SyncStateÚ
skill_namerÃ   r"   )rM   r   r
   )r#   s   "r$   r%   r%   á   s-   € ÷ #ñ #˜|ð #¼ð #ÄDð #ÌXÔVYÍ]ñ #r&   c                óœ  € V P                   P                  VR4      pV'       g   R# V P                  fz   / V n        \        4        FU  pV P                  P	                  \        WDP                  P                  4      . 4      P                  VP                  4       KW  	  \        4       V n
        V P                  P                  V. 4       FÁ  pWR8X  g   VP                  4       '       g   K!   \        V4      pY`P                  9   d   K?  \        YS4      '       g*   T P                  RT R\        T4       RT RT R2	4       Ky   \!        YR4       \$        P)                  RYR4       T P                  RT RT R\        T4       R24       Tu # 	  R#   \         d     KÕ  i ; i  \"         d    \$        P'                  RYRR	R
7         R# i ; i)u  Move a bundled skill's stale copy to its new canonical path after an upstream RENAME /
RECATEGORIZATION (else it is misread as user-deleted and stranded forever). Only a copy
byte-identical to the origin hash â€” proof *we* placed it â€” moves. Returns rel source path.rg   Nõ     âš  z: upstream moved this skill to z, but your modified copy at uD    was kept â€” it will not receive updates. Run `hermes skills reset z( --restore` to move to the new location.z)Could not relocate renamed skill %s -> %sTr—   z)Relocated renamed bundled skill: %s -> %su     â†’ z (moved u    â†’ Ú))ÚmanifestÚgetÚactive_indexra   Ú
setdefaultr   rF   rj   Úappendr   Ú	hub_pathsÚis_dirrQ   Ú
ValueErrorr¿   ÚsayrÌ   rz   rœ   ÚwarningÚinfo)rÔ   rÖ   rÃ   r»   r¦   Ú	candidateÚrels   &&&    r$   Ú_recover_renamed_skillrç   á   s¥  € ð —+‘+—/‘/ *¨bÓ1€KßÙØ	‡�ÒØˆŒÜ(Ö*ˆBØ�O‰O×&Ñ&¤°r¿9¹9¿>¹>Ó'JÈBÓO×VÑVÐWY×W`ÑW`Öañ +ä.Ó0ˆŒØ—_‘_×(Ñ(¨°RÖ8ˆ	ØÔ I×$4Ñ$4×$6Ò$6Ùð	Ü# IÓ.ˆCð —,‘,ÔÙÜ# I×;Ò;Ø�F‰FØ˜˜Ð$CÔDUÐVZÓD[ÐC\ð ]$Ø$' 5ð ),Ø,6¨<Ð7_ðaôbñ ð	Ü�iÔ&ô 	�‰Ð?ÀÔQØ
�‰�˜
�| 8¨C¨5°Ô6GÈÓ6MÐ5NÈaÐPÔQØŠ
ñ- 9ñ. øô% ô 	Úð	ûô ô 	Ü�N‰NÐFÈ	ÐbfˆNÔgÛð	ús$   Ã,FÅF#ÆF ÆF Æ##GÇ
Gc                   óÈ   a € ] tR tRt o Rt^ t]! ]R7      t]! ]R7      t	]! ]R7      t
]! ]R7      t]! ]R7      t]! ]R7      tRt]! ]R7      tV 3R lR ltV 3R ltRtV tR# )	rÕ   i  z;Mutable accumulator threaded through one sync_skills() run.)Údefault_factoryNc                ó$   <€ V ^8„  d   QhRS[ RR/# )r    Úmsgr"   N)rM   )r#   Ú__classdict__s   "€r$   r%   Ú_SyncState.__annotate__  s   ø€ ÷ ñ ‘sð ˜tñ r&   c                óD   € V P                   '       g   \        V4       R # R # r.   )ÚquietÚprint)Úselfrë   s   &&r$   râ   Ú_SyncState.say  s   € Ø�z�zˆzÜ�#ŽJñ r&   c                óZ  <€ V ^8„  d   Qh/ S[ S[S[3,          ;R&   S[;R&   S[;R&   S[S[,          ;R&   S[S[,          ;R&   S[S[,          ;R&   S[S[,          ;R&   S[S[,          ;R&   S[S[,          ;R	&   S[S[ S[S[S[,          3,          ,          ;R
&   S[S[,          ;R&   # )r    rÚ   rï   ÚskippedÚcopiedÚupdatedÚuser_modifiedÚ
suppressedÚ	relocatedÚshadowed_by_externalrÜ   rß   )rq   rM   rU   Úintr£   r
   r   rc   )r#   rì   s   "€r$   r%   rí     sÉ   ø‡ ‚ ñ ‘3™�8�nÑñ ñ �Kñ	 ñ
 Ññ ñ ‘�IÑ3ñ ñ ‘#�YÑ4ñ ñ ™•9Ñ:ñ ñ ‘S•	Ñ7ñ ñ ‘C�yÑ6ñ ñ ™s�)ÑAñ ñ ™4¡¡T©$¥Z Õ0Õ1Ñ8ñ ñ ‘3�xÑ4ò r&   r1   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rô   r   r£   rõ   rö   r÷   rø   rù   rú   rÜ   rc   rß   râ   Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__)rì   s   @r$   rÕ   rÕ     sl   ø‡ € áEð €GÙ¨dÔ3€FÙ¨tÔ4€GÙ$°TÔ:€MÙ!°$Ô7€JÙ °Ô6€IÙ&+¸DÔ&AÐØ48€LÙ°Ô4€I÷ð ÷ ƒ r&   rÕ   c                ó(   € V ^8„  d   QhR\         RR/# )r    rÃ   r"   Nr   )r#   s   "r$   r%   r%     s   € ÷ 	`ñ 	`¤ð 	`¨$ñ 	`r&   c                ó   € V P                  R4      pVP                  4       '       d=   V P                  4       '       g%    \        W4       \        P	                  RV4       R# R# R#   \
         d    \        P                  RTRR7        R# i ; i)z‹If an interrupted update left the user's only copy in ``dest.bak`` with dest gone, move it
back so the skill isn't misread as user-deleted.ú.bakz#Recovered orphaned skill backup: %sz*Could not recover orphaned skill backup %sTr—   N)Úwith_suffixrX   rÌ   rœ   rä   rz   rã   )rÃ   Úorphans   & r$   Ú_recover_orphan_backupr	    st   € ð ×Ñ˜fÓ%€FØ‡}�}‡‚˜tŸ{™{Ÿ}š}ð	`Ü�fÔ#Ü�K‰KÐ=¸vÖFñ  -�øô ô 	`Ü�N‰NÐGÈÐZ^ˆN×_ð	`ús   ¿!A& Á&#BÂBc          
      óL   € V ^8„  d   QhR\         R\        R\        R\        RR/# )r    rÔ   rÖ   rÃ   Úbundled_hashr"   N©rÕ   rM   r   )r#   s   "r$   r%   r%   '  s1   € ÷ 
*ñ 
*œ:ð 
*´3ð 
*¼dð 
*ÔRUð 
*ÐZ^ñ 
*r&   c                ób  € V P                   P                  V4       V ;P                  ^,          un        V P                  RV R24       VP	                  4       '       dP   \        V4      V8X  d>   \        V4       V P                  RV 24       V P                  P                  VR4       R# R# R# )zîAn external_dirs source provides this skill; a local copy would be a name collision the
loader refuses. Defer for ALL manifest states; remove a stale local shadow from an earlier
sync only when byte-identical (a user's own skill differs).u     â‡¢ z7 (deferred to external_dirs, not written to local tree)u     âœ“ removed stale shadow of N)	rú   rÞ   rô   râ   rX   r¹   Ú_rmtree_writablerÚ   Úpop)rÔ   rÖ   rÃ   r  s   &&&&r$   Ú_defer_to_externalr  '  s†   € ð ×Ñ×"Ñ" :Ô.Ø‡J‚J�!…O…JØ‡F�FˆV�J�<ÐVÐWÔXØ‡{�{‡}‚}œ $›¨<Ô7Ü˜ÔØ
�‰Ð/°
¨|Ð<Ô=Ø
�‰�‰˜
 DÖ)ñ 8�}r&   c                óX   € V ^8„  d   QhR\         R\        R\        R\        R\        RR/# ©r    rÔ   rÖ   Ú	skill_srcrÃ   r  r"   Nr  )r#   s   "r$   r%   r%   4  s8   € ÷ 8ñ 8œ:ð 8´3ð 8Ä4ð 8Ìtð 8Ôcfð 8Ðkoñ 8r&   c                óÊ  €  VP                  4       '       dT   V ;P                  ^,          un        \        V4      V8X  d   W@P                  V&   R# V P	                  RV RV R24       R# \        W#4       V P                  P                  V4       W@P                  V&   V P	                  RV 24       R#   \         d#   pT P	                  RT RT 24        Rp?R# Rp?ii ; i)z6Handle a skill never offered before (not in manifest).rØ   uw   : bundled version shipped but you already have a local skill by this name â€” yours was kept. Run `hermes skills reset z)` to replace it with the bundled version.z  + z  ! Failed to copy ú: N)	rX   rô   r¹   rÚ   râ   rÒ   rõ   rÞ   rz   )rÔ   rÖ   r  rÃ   r  rŸ   s   &&&&& r$   Ú_install_new_skillr  4  sË   € ð8Ø�;‰;�=Š=ð �JŠJ˜!�O�JÜ˜‹~ Ô-Ø*6—‘˜JÓ'à—‘Ø˜Z˜Lð )QØQ[ÐP\ð ];ð<ö=ô
 �iÔ&Ø�I‰I×Ñ˜ZÔ(Ø&2�K‰K˜
Ñ#Ø�F‰F�T˜*˜Ð&Ö'øÜô 8Ø
�‰Ð$ Z L°°1°#Ð6×7Ò7ûð8ús)   ‚B5 ˜7B5 ÁB5 Á+AB5 Â5C"Ã CÃC"c                ó4   € V ^8„  d   QhR\         R\         RR/# )r    r  rÃ   r"   Nr   )r#   s   "r$   r%   r%   K  s&   € ÷ Jñ J¤$ð J¬dð J°tñ Jr&   c                óÄ  € VP                  R4      pVP                  4       '       d   \        V4       \        P                  ! \        V4      \        V4      4        \        P                  ! W\        R7        \        T4       R#   \         d¤    TP                  4       '       dŒ   TP                  4       '       d7    \        T4       M)  \         d    \        P                  RTRR7        Mi ; iTP                  4       '       g*   \        P                  ! \        T4      \        T4      4       h i ; i  \         d    \        P                  RTRR7        R# i ; i)z[Replace ``dest`` with a fresh copy of ``skill_src`` via a .bak sibling; restore on failure.r  rÏ   z.Could not clear partial copy %s during restoreTr—   zCould not remove backup %sN)r  rX   r  rÉ   rÊ   rM   rÑ   r   rz   rœ   rã   r�   )r  rÃ   Úbackups   && r$   Ú_replace_skill_dirr  K  s  € à×Ñ˜fÓ%€FØ‡}�}‡‚Ü˜Ô Ü
‡K‚K”�D“	œ3˜v›;Ô'ðÜ�Š˜	Ô0EÕFðJÜ˜Ö øô ô 
Ø�=‰=�?Š?Ø�{‰{�}Š}ð2Ü$ TÕ*øÜô 2Ü—N‘NÐ#SÐUYØ,0ð #ö 2ð2úð —;‘;—=’=Ü—’œC ›K¬¨T«Ô3Øð
ûô ô JÜ�‰Ð1°6ÀDˆ×IðJúsN   ÁB Á:D8 Â D5Â(D5Â?CÃ
D5Ã#C1Ã.D5Ã0C1Ã1D5Ä
+D5Ä8#EÅEc                óX   € V ^8„  d   QhR\         R\        R\        R\        R\        RR/# r  r  )r#   s   "r$   r%   r%   d  s9   € ÷ ,ñ ,œzð ,´sð ,Ätð ,ÔSWð ,Ôgjð ,Ðosñ ,r&   c                ó„  € V P                   P                  VR4      pV'       d"   WE8X  d   V ;P                  ^,          un        R# \        V4      pV'       g*   W`P                   V&   V ;P                  ^,          un        R# \	        W5V4      '       g3   V P
                  P                  V4       V P                  RV R24       R#  \        W#4       Y@P                   T&   T P                  P                  T4       T P                  RT R24       R#   \         d#   pT P                  RT RT 24        Rp?R# Rp?ii ; i)	z3Handle a skill that is in the manifest AND on disk.rg   Nz  ~ z (user-modified, skipping)z  ! Failed to update r  u     â†‘ z
 (updated))rÚ   rÛ   rô   r¹   r¿   r÷   rÞ   râ   r  rz   rö   )rÔ   rÖ   r  rÃ   r  r»   r¼   rŸ   s   &&&&&   r$   Ú_update_existing_skillr  d  s  € à—+‘+—/‘/ *¨bÓ1€Kß�|Ô2Ø
�
Š
�a��
ÙÜ˜“€IßØ"+�‰�JÑØ
�
Š
�a��
ÙÜ °9×=Ò=Ø
×Ñ×Ñ 
Ô+Ø
�‰��j�\Ð!;Ð<Ô=ÙðÜ˜9Ô+ð +‡K�K�
ÑØ‡J�J×Ñ�jÔ!Ø‡F�FˆV�J�<˜zÐ*Ö+øô ô Ø
�‰Ð& z l°"°Q°CÐ8Ô9Ýûðús   ÃD ÄD?ÄD:Ä:D?c                ó`   € V ^8„  d   QhR\         R\        \        \         ,          ,          RR/# )r    r¢   Ú	only_dirsr"   N)r   r
   rc   )r#   s   "r$   r%   r%   ~  s+   € ÷ >ñ >¬Tð >¼hÄsÌ4ÅyÕ>Qð >ÐVZñ >r&   c                ó–  € V P                  R4       F„  p\        4       VP                  V 4      ,          pVe   VP                  V9  g   VP	                  4       '       d   KP   VP                  P                  RRR7       \        P                  ! W#4       K†  	  R#   \         d"   p\        P                  RY$4        Rp?K±  Rp?ii ; i)z’Copy category DESCRIPTION.md files not already present; ``only_dirs`` restricts
seeding to the essential skills' categories on opted-out profiles.zDESCRIPTION.mdNTrÅ   zCould not copy %s: %s)rY   r;   rO   rF   rX   rÈ   rÉ   Úcopy2rz   rœ   r�   )r¢   r  Údesc_mdÚ	dest_descrŸ   s   &&   r$   Ú_seed_category_descriptionsr$  ~  s£   € ð ×$Ñ$Ð%5Ö6ˆÜ“M G×$7Ñ$7¸Ó$DÕDˆ	ØÒ! i×&6Ñ&6¸iÔ&GÈI×L\ÑL\×L^ÒL^Ùð	>Ø×Ñ×"Ñ"¨4¸$Ð"Ô?Ü�LŠL˜Ö,ó 7øô ô 	>Ü�L‰LÐ0°'×=Ò=ûð	>ús   Á#3BÂCÂ'CÃCc                ó0   € V ^8„  d   QhR\         R\        /# )r    rï   r"   )rU   rq   )r#   s   "r$   r%   r%   Œ  s   € ÷ =+ñ =+”tð =+¬ñ =+r&   c                óH  € \        4       \        ,          P                  4       pV'       d   V '       g   \        R4       \	        4       pVP                  4       '       g   R. R. R^ R. R. R. R^ R	. /# \        4       P                  R
R
R7       \        V4      pV'       d$   V UUu. uF  w  rEV\        9   g   K  WE3NK  	  ppp\        4       p\        4       p\        \        4       V R7      pV EF  w  ršW–9   d)   V	\        9  d   VP                  P                  V	4       K4  \        W¢4      p\!        V
4      p\#        V4       VP                  4       '       g>   W˜P$                  9   d.   \'        W‰V4      '       d   VP(                  P                  V	4       W—9   d   \+        W‰W¼4       K¼  W˜P$                  9  d   \-        W‰W«V4       KÛ  VP                  4       '       d   \/        W‰W«V4       EK  V;P0                  ^,          un        EK  	  V'       d   . M8\3        \5        VP$                  4      V UUu0 uF  w  rMVkK	  	  upp,
          4      p\5        4       pV'       d±   \        4       R,          p\7        4        Uu0 uF#  p\9        VVP:                  P<                  4      kK%  	  upVP?                  4       '       dC   VPA                  4        Uu0 uF'  pVP?                  4       '       g   K  VP<                  kK)  	  upM	\5        4       ,          pV Uu. uF  qDV9  g   K  VNK  	  ppV F  pVP$                  V K  	  \C        TV'       d*   V UUu0 uF  w  rÕ\        WR4      P:                  kK  	  uppMR4       \E        VP$                  4       RVPF                  RVPH                  RVP0                  RVPJ                  RVRVP                  RVP(                  R\M        V4      R	\O        V R7      RVPP                  RV/# u uppi u uppi u upi u upi u upi u uppi )zÉSync bundled skills into ~/.hermes/skills/ using the manifest; returns the per-category
result dict. Opted-out profiles seed ONLY ESSENTIAL_SKILLS (the system prompt always
points at ``hermes-agent``).u`     (profile opted out of bundled skills via .no-bundled-skills â€” seeding essential skills only)rõ   rö   rô   r÷   Úcleanedrø   Útotal_bundledÚoptional_provenance_backfilledTrÅ   )rÚ   rï   z.archiveNrù   ©rï   rú   Úskipped_opt_out))r2   ÚNO_BUNDLED_SKILLS_MARKERrX   rð   rG   r;   rÈ   r§   r   r‰   rn   rÕ   r   rø   rÞ   r«   r¹   r	  rÚ   rç   rù   r  r  r  rô   r[   rc   ra   r   rF   rj   rà   Úiterdirr$  r    rõ   rö   r÷   Úlenr   rú   )rï   Úessential_onlyr¢   Úbundled_skillsrj   rÂ   rø   Úexternal_indexrÔ   rÖ   r  rÃ   r  r}   ÚremovedÚpresentÚarchiver¦   Úpr'  s   &                   r$   Úsync_skillsr6  Œ  sJ  € ô #“nÔ'?Õ?×GÑGÓI€NßŸeÜÐpÔqÜ"Ó$€KØ×Ñ×ÒØ˜"˜i¨¨Y¸¸?ÈBÐPYÐ[]Ø˜b /°1Ð6VÐXZð\ð 	\äƒM×Ñ ¨tÐÔ4Ü-¨kÓ:€NßÙ7EÔb±~©)¨$ÈÔQaÑIaœ+˜4›+±~ˆÑbÜ'Ó)€JÜ0Ó2€NÜ	œ^Ó-°UÔ	;€Bä!/Ñˆ
àÔ#¨
Ô:JÔ(JØ�M‰M× Ñ  Ô,ÙÜ% iÓ=ˆÜ 	Ó*ˆä˜tÔ$Ø�{‰{�}Š} ¯{©{Ô!:Ô?UÐVXÐfj×?kÒ?kØ�L‰L×Ñ 
Ô+ØÔ'Ü˜r¨tÖBØŸ{™{Ô*Ü˜r¨yÀÖMØ�[‰[�]Š]Ü" 2°9ÀL×Qà�JŠJ˜!�O�JˆJñ% "0÷. #‰b¬¬s°2·;±;Ó/?ÑWeÔBfÑWeÉGÈDÃ4ÑWeÒBfÕ/fÓ(g€GÜ‹e€GßÜ“- *Õ,ˆÜAWÔAYÓZÑAY¸2”? 2 r§y¡y§~¡~Ö6ÑAYÑZØAHÇÁ×AQÒAQ˜WŸ_™_Ô.Ó=Ñ.˜°!·(±(·*ŒVˆQ�VŒVÑ.Ò=ÔWZÓW\õ^ˆá 'Ó?¡˜°wÑ+>�tˆt¡€GÐ?ÛˆØ�K‰K˜Òñ äØßZhÁ~ÔVÁ~¹V¸QÔ	 Ó	1×	8Ô	8Á~ÓVÐnrôtô �B—K‘KÔ à�"—)‘)˜Y¨¯
©
°I¸r¿z¹zÈ?Ð\^×\lÑ\lØ�7˜L¨"¯-©-¸ÀbÇlÁlØœ˜^Ó,Ø(Ô*GÈeÔ*TØ × 7Ñ 7Ø˜>ð+ð +ùóS cùó8 Cgùò [ùÚ=ùÚ?ùó
 	Ws6   Â$PÂ8PÈ4P	É>)PËPË.PÌPÌ"PÍ Pc                ó(   € V ^8„  d   QhR\         RR/# )r    rL   r"   Nr   )r#   s   "r$   r%   r%   Ì  s   € ÷ +ñ +œ4ð + Dñ +r&   c                óä   € \        V 4      P                  4       p\        4       P                  4       pW!P                  9  d   \	        RV: RV: R24      hR p\
        P                  ! WR7       R# )a`  rmtree that first makes read-only entries writable (Nix/deb/rpm keep r-x dirs; unlinking
a child needs a writable parent, so chmod both). Scope guard: refuses anything not a STRICT
child of the active skills root (bad join / missing HERMES_HOME / malicious manifest entry).

Handles immutable package sources (Nix store, deb/rpm installs) that preserve read-only permissions on
copied files *and* directories (``r-xr-xr-x``). Removing a child requires write permission on its parent
directory, so the retry handler makes the failing path **and its parent** writable before re-attempting.
See #34860, #34972.
zrefusing to rmtree z: not strictly under u    (scope guard â€” see #48200)c                 ó  € \         P                  P                  V4      V3 FH  p\        \        4      ;_uu_ 4        \         P
                  ! V\        P                  4       R R R 4       KJ  	  V ! V4       R #   + '       g   i     Kg  ; ir.   )ÚosrL   Údirnamer   rz   ÚchmodÚstatÚS_IRWXU)Úfuncr¸   r˜   r5  s   &&& r$   Ú	_on_errorÚ#_rmtree_writable.<locals>._on_errorÛ  sX   € Ü—'‘'—/‘/ %Ó(¨%Ó0ˆAÜœ'×"Õ"Ü—’˜œDŸL™LÔ)÷ #Ñ"ñ 1ñ 	ˆUŽ÷ #×"Ð"ús   ¼&A8Á8B	)ÚonerrorN)r   Úresolver;   rÆ   rá   rÉ   Úrmtree)rL   ÚtargetÚskills_rootr@  s   &   r$   r  r  Ì  s`   € ô �$‹Z×ÑÓ!€FÜ“-×'Ñ'Ó)€KØŸ.™.Ô(ÜÐ.¨v©jÐ8MÈkÉ_Ð\yÐzÓ{Ð{òô
 ‡M‚M�$×*r&   Ú__main__z1Syncing bundled skills into ~/.hermes/skills/ ...r*  rõ   z newrö   z updatedrô   z
 unchangedr÷   z, :Né   Nz, +z morerg   z user-modified (kept): r'  z cleaned from manifestr)  z official optional backfilledz
Done: z. r(  z total bundled.)Fr.   )]r   r±   Úloggingr:  rÉ   r=  ÚsysÚ
contextlibr   Údataclassesr   r   Úpathlibr   Útypingr   r   r	   r
   r   r   ÚstdoutÚstderrÚ_streamÚhasattrrá   Ú	TypeErrorr   r™   r   r   r   rh   r   r   r„   r   Útools.skills_sync_optionalr   r   r   r   Úutilsr   Ú	getLoggerrü   rœ   r/   r9   r@   r0   r:   rA   r*   r2   r;   rB   r,  rG   rJ   rQ   r^   ra   rn   r   r‰   r    r§   r«   r¹   r¿   rÌ   rÒ   rç   rÕ   r	  r  r  r  r  r$  r6  r  rð   r{   r.  Úpartsrˆ   rš   ÚshownrÞ   rÛ   Ú
backfilledr1   r&   r$   Ú<module>rZ     sí  ðñUó Û Û 	Û Û Û 
Ý ß (Ý ß =× =ð —
‘
˜CŸJ™JÓ'€GÙˆw˜×&Ô&Ù�j )×,Õ,Ø×Ñ¨¸ÐÔC÷ -Ñ,ñ (÷ ^Ñ ]ß FÝ -÷ó õ $à	×	Ò	˜8Ó	$€áÓ€Ø˜8Õ#€
ØÐ0Õ0€ð %Ð Ø"Ð Ø(Ð õMõ
GõWõgð 0Ð õKõUõ6÷÷0õ

õõ(õ4cõ	Võ>ð
¸u÷ ÷
dõ%õ
=õ
#ðL ÷ð ó ðõ&	`õ
*õ8õ.Jõ2,õ4>÷=+õ@+ð. ˆzÕÙ	Ð
=Ô>Ù˜uÔ%€FÙ�F˜8Õ$Ó%Ð& dÐ+±°F¸9Õ4EÓ0FÐ/GÀxÐ-PÐU[Ð\eÕUfÐTgÐgqÐRrÐs€EØ�Õ'Ð'€uÖ'Ø—	‘	˜% �)Ó$ÁsÈ5ÃzÐTUÄ~¨#©c°%«j¸1­nÐ-=¸UÑ(CÐ[]Õ^ˆØ�‰™˜E›
�|Ð#:¸5¸'ÐBÔCØˆi×ÔØ�‰™˜F 9Õ-Ó.Ð/Ð/EÐFÔGØ—Z‘ZÐ @ÓAÐA€zÖAØ�‰™˜J›Ð(Ð(EÐFÔGÙ	ˆH�T—Y‘Y˜uÓ%Ð& b¨°Õ)@Ð(AÀÐ
QÖRñ ÷W -×,Ñ,ús   Á<K<Ë<L