+
    jHàj
  ã                  ó$  € R t ^ RIHt ^ RIt^ RIt^ RIHtHtHt ^ RIH	t	 ^ RI
Ht R R ltR R	 ltR§R
 R lltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltRR¨RR©/tR R ltR  R! ltR" R# ltR$ R% ltR& R' ltR( R) ltR* R+ ltR, R- ltR. R/ lt R0 R1 lt!R2 R3 lt"R4 R5 lt#R6 R7 lt$R8 R9 lt%R: R; lt&R< R= lt'R> R? lt(R@RA R3RBRC R3RDRE R3/t)RF RG lt*RH t+]+! RIRJRK7      t,]+! RLRMRNRORP7      t-].! RNRQ7      t/RRRS]3RTRU]*]+! RVRªRDRWRX7      ]+! RYR«RRZRX7      ]+! R¬/ ]/BR[R\/B 3R]R^]]+! R­R_R`/]/BR[Ra/B ]+! R®R_Rb/]/BR[Rc/B ]+! R¯R_Rd/]/BR[Re/B ]+! R°R_Rf/]/BR[Rg/B 3RhRi]3RjRk]3RlRm]],3RnRo]],3RpRq]3RrRs]]+! RIRtRuRv7      ]+! R±/ ]/BR[Rw/B ]+! R¯/ ]/BR[Rx/B ]+! R²/ ]/BR[Ry/B 3RzR{]],3R|R}](3R~R]],3R€R�]!]+! R‚]0RRƒR„7      ]-]+! R¯R_Rd/]/BR[R…/B 3R†R‡]"]+! RˆRR‰RŠ7      3R‹RŒ]']+! R�RŽRR�R�7      ]+! R³/ ]/BR[R‘/B ]+! R’R“RR”R•7      ]+! R´/ ]/BR[R–/B 3R—R˜]#]+! R™RRšRŠ7      ]+! R›]0^RœR„7      ]+! Rµ/ ]/BR[R�/B 3RžRŸ]$]+! R‚]0RR R„7      ]+! R¯R_Rd/]/BR[R¡/B ]-33t1R¢ R£ lt2R¶R¤ R¥ llt3]4R¦8X  d   ]Pj                  ! ]3! 4       4       R# R# )·z.CLI subcommand: `hermes curator <subcommand>`.)ÚannotationsN)ÚdatetimeÚtimezoneÚUTC)ÚPath)ÚOptionalc               ó   € V ^8„  d   QhRR/# )é   ÚreturnzOptional[datetime]© )Úformats   "Ú7/home/ubuntu/.hermes/hermes-agent/hermes_cli/curator.pyÚ__annotate__r      s   € ÷ ?ñ ?Ð'ñ ?ó    c                ó¬   €  \         P                  ! V 4      pTP                  f   TP                  \        R7      # T#   \        \        3 d     R# i ; i)z>ISO timestamp -> aware UTC datetime, or None when unparseable.N)Útzinfo)r   ÚfromisoformatÚ	TypeErrorÚ
ValueErrorr   Úreplacer   )ÚtsÚdts   & r   Ú	_parse_tsr      sQ   € ðÜ×#Ò# BÓ'ˆð &(§Y¡YÒ%6ˆ2�:‰:œSˆ:Ó!Ð>¸BÐ>øô ”zÐ"ô Úðús   ‚> ¾AÁAc               ó    € V ^8„  d   QhRRRR/# )r	   r   zOptional[str]r
   Ústrr   )r   s   "r   r   r      s   € ÷ 
#ñ 
#�ð 
# #ñ 
#r   c                ó  € V '       g   R # \        V 4      pVf   \        V 4      # \        \        P                  ! \
        4      V,
          P                  4       4      pR F  w  r4pW%8  g   K  W$,           V R2u # 	  VR,           R2# )Úneveré€Q z agozd ago))Úsé   é<   )Úmr    é  )Úhr"   r   )r   r   Úintr   Únowr   Útotal_seconds)r   r   ÚsecsÚunitÚdivÚlimits   &     r   Ú_fmt_tsr+      s{   € ßÙÜ	�2‹€BØ	‚zÜ�2‹wˆÜ”—’œSÓ! BÕ&×5Ñ5Ó7Ó8€DÛOÑˆ�5ØŽ<Ø•k�] 4 &¨Ð-Ò-ñ Pð �e�mˆ_˜EÐ"Ð"r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r	   Úpromptr   ÚcancelÚ
eof_prefixr
   Úboolr   )r   s   "r   r   r   "   s)   € ÷ ñ �Sð  #ð Àð ÐPTñ r   c                óÄ   €  \        V 4      P                  4       P                  4       R9   d   R#  \        V4       R#   \        \        3 d    \        TRR7        L-i ; i)zXAsk ``prompt``; print ``cancel`` (prefixed on EOF/Ctrl-C) and return False unless y/yes.TÚ )ÚendF>   ÚyÚyes)ÚinputÚstripÚlowerÚEOFErrorÚKeyboardInterruptÚprint)r-   r.   r/   s   &&&r   Ú_confirmr<   "   sZ   € ð"Ü�‹=×ÑÓ ×&Ñ&Ó(¨LÔ8Ùð 9ô 
ˆ&„MÙøô Ô'Ð(ô "Üˆj˜b×!ð"ús   ‚,> ¾AÁAc               ó$   € V ^8„  d   QhRRRRRR/# )r	   Útitler   ÚrowsÚlistr
   ÚNoner   )r   s   "r   r   r   -   s&   € ÷ 	Cñ 	C˜Sð 	C¨ð 	C°ñ 	Cr   c                ó8  € \        R V  R24       V F„  p\        RVR,          R RVP                  R^ 4      R RVP                  R	^ 4      R R
VP                  R^ 4      R RVP                  R^ 4      R R\        VP                  R4      4       24       K†  	  R# )Ú
Ú:ú  ÚnameÚ40sz  activity=Úactivity_countÚ3dz  use=Ú	use_countz  view=Ú
view_countz
  patches=Úpatch_countú  last_activity=Úlast_activity_atN)r;   Úgetr+   )r>   r?   Úrs   && r   Ú_print_skill_rowsrQ   -   s³   € Ü	ˆBˆuˆg�Qˆ-ÔÛˆÜØ��6•˜3�ð  ØŸ™Ð.°Ó2°2Ð6ð 7Ø—5‘5˜ aÓ(¨Ð,ð -Ø—E‘E˜,¨Ó*¨2Ð.ð /Ø—u‘u˜]¨AÓ.¨rÐ2ð 3Ü$ Q§U¡UÐ+=Ó%>Ó?Ð@ðBö	Có r   c               ó   € V ^8„  d   QhRR/# ©r	   r
   rA   r   )r   s   "r   r   r   9   s   € ÷ ^ñ ^ $ñ ^r   c                 ó2  € ^ RI Hp   V P                  4       pT'       g   R# \	        R T 4       4      p\        T4      T,
          p\        R\        T4       R24       \        RT 24       \        RT 24       \        R4       R#   \         d     R# i ; i)	züReport curation-eligible skills that carry no provenance marker: only background-review
creations get ``created_by: agent``; older skills and every foreground ``skill_manage(create)``
are eligible but unmanaged, so no automatic transition touches them.©Úskill_usageNc              3  óV   "  € T F  qP                  R 4      '       d   K  ^x € K!  	  R# 5i)Úhas_provenance_keyN©rO   )Ú.0rP   s   & r   Ú	<genexpr>Ú+_print_unmanaged_summary.<locals>.<genexpr>D   s   é € ÐI™I�q¯U©UÐ3G×-H—’›Iùs   ‚)Ÿ
)z#
unmanaged (no provenance marker): z totalz  pre-dates marker    z  foreground-created  uP     never auto-staled or archived â€” `hermes curator adopt <name>` hands one over)ÚtoolsrV   Úunmanaged_reportÚ	ExceptionÚsumÚlenr;   )rV   Ú	unmanagedÚlegacyÚ
foregrounds       r   Ú_print_unmanaged_summaryre   9   s”   € õ "ðØ×0Ñ0Ó2ˆ	÷ ÙÜÑI™IÓIÓI€FÜ�Y“ &Õ(€JÜ	Ð0´°Y³Ð0@ÀÐ
GÔHÜ	Ð" 6 (Ð
+Ô,Ü	Ð" : ,Ð
/Ô0Ü	Ð
\Ö]øô ô Úðús   ˆB ÂBÂBc               ó   € V ^8„  d   QhRR/# rS   r   )r   s   "r   r   r   L   s   € ÷ Lñ L dñ Lr   c                óÜ  € V P                  4       pVP                  R R4      '       d   RMV P                  4       '       d   RMRp\        RV 24       \        RVP                  R^ 4       24       \        R\	        VP                  R	4      4       24       VP                  R
4      ;'       g    RpRV9   d   VP                  4       MV.vrE\        RV 24       V F  p\        RV 24       K  	  VP                  R4      pV'       d2   \        RT \        V4      P                  4       '       d   RMR 24       V P                  4       p\        RV^,          ^ 8X  d   V^8¼  d   V^,           R2MV R2 24       \        RV P                  4        R24       \        RV P                  4        R24       V P                  4       p	\        RV	'       d   RMR V	'       d   RMR 24       R# )ÚpausedFÚPAUSEDÚENABLEDÚDISABLEDú	curator: z  runs:           Ú	run_countz  last run:       Úlast_run_atÚlast_run_summaryz(none)rC   z  last summary:   z                  Úlast_report_pathz  last report:    r2   z
 (missing)z  interval:       every Údr#   z  stale after:    zd unusedz  archive after:  z  consolidate:    ÚonÚoffz$ (prune-only; LLM merge pass opt-in)N)Ú
load_staterO   Ú
is_enabledr;   r+   Ú
splitlinesr   ÚexistsÚget_interval_hoursÚget_stale_after_daysÚget_archive_after_daysÚget_consolidate)
ÚcuratorÚstateÚstatus_lineÚsummaryÚfirstÚrestÚlineÚreportÚihÚconsolidates
   &         r   Ú_print_curator_configr†   L   sÐ  € Ø×ÑÓ €Eà—I‘I˜h¨×.Ò.‰Ø!×,Ñ,×.Ò.‰Y°Jð ô 
ˆI�k�]Ð
#Ô$Ü	Ð˜uŸy™y¨°aÓ8Ð9Ð
:Ô;Ü	Ðœw u§y¡y°Ó'?Ó@ÐAÐ
BÔCð �i‰iÐ*Ó+×7Ð7¨x€GØ+/°7¬?�7×%Ñ%Ô'ÀÀ	€L€EÜ	Ð˜u˜gÐ
&Ô'ÛˆÜÐ" 4 &Ð)Ö*ñ à�Y‰YÐ)Ó*€FßÜÐ" 6 (´°f³×1DÑ1D×1FÒ1F©2ÈLÐ*YÐZÔ[Ø	×	#Ñ	#Ó	%€BÜ	Ð$°r¸BµwÀ!´|ÈÈbÌ¨¨b­ z°¡^ÐY[ÐX\Ð\]ÐV^Ð$_Ð
`ÔaÜ	Ð˜w×;Ñ;Ó=Ð>¸hÐ
GÔHÜ	Ð˜w×=Ñ=Ó?Ð@ÀÐ
IÔJØ×)Ñ)Ó+€KÜ	Ø
§[™T°eÐ<ß‰2Ð"HÐ
Ið	KöLr   c               ó   € V ^8„  d   QhRR/# ©r	   r
   r$   r   )r   s   "r   r   r   h   s   € ÷ &ñ &˜ñ &r   c                ó\  € ^ RI Hp ^ RIHp \	        V4       VP                  4       pV'       g   \        R4       \        4        ^ # / pV F4  pVP                  VP                  RR4      . 4      P                  V4       K6  	  V Uu. uF$  qUP                  R4      '       g   K  VR,          NK&  	  ppV Uu. uF  qUP                  RR	4      NK  	  pp\        R
\        V4       RVP                  R	4       RVP                  R4       R24       R F.  p\        RVR R\        VP                  V. 4      4       24       K0  	  V'       d*   \        R\        V4       RRP                  V4       24       \        4        VP                  R. 4      p	V	'       g   ^ # \        V	R R7      p
\        RV
R,          4       R p\        W›RR7      R,          pV^ ,          P                  R4      ;'       g    ^ ^ 8”  d   \        RV4       \        R\        W›R7      R,          4       ^ # u upi u upi ) é    ©r|   rU   z
no curator-managed skillsr}   ÚactiveÚpinnedrF   Ú
provenanceÚagentz
curator-managed skills: z total  (agent-created=ú
  bundled=ÚbundledÚ)rE   Ú10sÚ z	
pinned (z): z, c                ój   € V P                  R 4      ;'       g    V P                  R4      ;'       g    R# )rN   Ú
created_atr2   rY   ©rP   s   &r   Ú<lambda>Ú_cmd_status.<locals>.<lambda>„   s+   €  !§%¡%Ð(:Ó";×"XÐ"X¸q¿u¹uÀ\Ó?R×"XÐ"XÐVXÐ"Xr   ©Úkeyzleast recently active (top 5):Né   Nc                ón   € V P                  R 4      ;'       g    ^ V P                  R4      ;'       g    R3# )rH   rN   r2   rY   r—   s   &r   Ú_freqÚ_cmd_status.<locals>._freq‡   s1   € Ø—‘Ð&Ó'×,Ð,¨1¨a¯e©eÐ4FÓ.G×.MÐ.MÈ2ÐNÐNr   T©r›   ÚreverserH   zmost active (top 5)zleast active (top 5))rŒ   ÚstaleÚarchived)r�   r|   r]   rV   r†   Úcurated_reportr;   re   Ú
setdefaultrO   Úappendra   ÚcountÚjoinÚsortedrQ   )Úargsr|   rV   r?   Úby_staterP   r�   rŽ   Ú
state_nameÚ
active_allÚrecencyrž   Úmost_actives   &            r   Ú_cmd_statusr°   h   sê  € ÝÝ!Ü˜'Ô"Ø×%Ñ%Ó'€DßÜÐ+Ô,Ü Ô"ÙØ€HÛˆØ×Ñ˜AŸE™E '¨8Ó4°bÓ9×@Ñ@ÀÖCñ á!%Ó9¡˜A¯©¨x¯Œiˆa��iˆi¡€FÐ9Ù8<Ó=¹°1—%‘%˜ gÖ.¹€JÐ=Ü	Ð&¤s¨4£y kð 2Ø&×,Ñ,¨WÓ5Ð6°jÀ×AQÑAQÐR[ÓA\Ð@]Ð]^ð`ô aã5ˆ
Ü��:˜cÐ" !¤C¨¯©°ZÀÓ(DÓ$EÐ#FÐGÖHñ 6çÜ�
œ3˜v›;˜- s¨4¯9©9°VÓ+<Ð*=Ð>Ô?ÜÔð —‘˜h¨Ó+€JßÙÜØÑXôZ€GäÐ5°w¸rµ{ÔCòOô ˜¸Ô=¸bÕA€KØ�A�×ÑÐ+Ó,×1Ð1°°QÔ6ÜÐ/°Ô=ÜÐ,¬f°ZÔ.KÈBÕ.OÔPÙùò5 :ùÚ=s   ÂH$Â$H$Â7H)c               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r   ‘   s   € ÷ )ñ )�cñ )r   c                ón  € ^ RI Hp VP                  4       '       g   \        R4       ^# \	        \        V RR4      4      p\	        \        V RR4      4      p\	        \        V RR4      4      ;'       g    V'       * p\        V RR4      '       d   RMR	p\        V'       d   R
MR4       Vf"   VP                  4       '       g   \        R4       VP                  \        WBVR7      pVP                  R/ 4      pV'       d)   V'       d!   \        RVP                  R^ 4       R24       M_V'       dX   \        RVP                  R^ 4       RVP                  R^ 4       RVP                  R^ 4       RVP                  R^ 4       24       V'       g   \        R4       V'       d   \        V'       d   RMR4       ^ # )rŠ   r‹   zAcurator: disabled via config; enable with `curator.enabled: true`Údry_runFÚ
backgroundÚsynchronousr…   TNz7curator: running DRY-RUN (report only, no mutations)...zcurator: running review pass...u§   curator: consolidation is off â€” running prune-only (deterministic stale/archive). Pass --consolidate or set `curator.consolidate: true` to enable the LLM merge pass.)Ú
on_summaryrµ   r³   r…   Úauto_transitionszauto (preview): Úcheckedu9    candidate skill(s) â€” no transitions applied in dry-runzauto: checked=z stale=Úmarked_stalez
 archived=r£   z reactivated=ÚreactivateduF   llm pass running in background â€” check `hermes curator status` laterzzdry-run: no changes applied. Read the report with `hermes curator status` and run `hermes curator run` (no flag) to apply.z‰dry-run: no changes applied. When the report lands, read it with `hermes curator status` and run `hermes curator run` (no flag) to apply.)	r�   r|   ru   r;   r0   Úgetattrr{   Úrun_curator_reviewrO   )rª   r|   Údryr´   rµ   r…   ÚresultÚautos   &       r   Ú_cmd_runrÀ   ‘   s¡  € ÝØ×Ñ×ÒÜÐQÔRÙÜ
Œw�t˜Y¨Ó.Ó
/€CÜ”g˜d L°%Ó8Ó9€JÜ”w˜t ]°EÓ:Ó;×MÐMÀ:¼~€Kô " $¨°u×=Ò=‘$À4€KÜ	ßEHÑAØ.ô0ð Ò 7×#:Ñ#:×#<Ò#<ÜðHô	Ið ×'Ñ'Ü kÈKð (ó Y€Fà�:‰:Ð(¨"Ó-€Dß—ÜØ˜tŸx™x¨	°1Ó5Ð6ð 74ð 4õ	5÷ 
ÜØ˜TŸX™X i°Ó3Ð4ð 5Ø—X‘X˜n¨aÓ0Ð1ð 2ØŸ™ ¨QÓ/Ð0ð 1ØŸ8™8 M°1Ó5Ð6ð8ô	9÷
 ÜÐVÔWß
Ü÷ ñWðWô		Xñ r   c               ó    € V ^8„  d   QhRRRR/# )r	   rh   r0   r
   r$   r   )r   s   "r   r   r   ½   s   € ÷ ñ ˜ð  ñ r   c                ó^   € ^ RI Hp VP                  V 4       \        V '       d   RMR4       ^ # )rŠ   r‹   zcurator: pausedzcurator: resumed)r�   r|   Ú
set_pausedr;   )rh   r|   s   & r   Ú_set_pausedrÄ   ½   s$   € ÝØ×Ñ�vÔÜ	ŸvÑ
Ð+=Ô>Ùr   c               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r   Ä   s   € × 5Ñ 5˜Ñ 5r   c                ó   € \        R 4      # ©T©rÄ   ©rª   s   &r   Ú
_cmd_pauserÊ   Ä   s   € ¤K°Ó$5Ð5r   c               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r   Å   s   € × 7Ñ 7˜Ñ 7r   c                ó   € \        R 4      # ©FrÈ   rÉ   s   &r   Ú_cmd_resumerÎ   Å   s   € ¤[°Ó%7Ð7r   TFc               ó    € V ^8„  d   QhRRRR/# )r	   r�   r0   r
   r$   r   )r   s   "r   r   r   Û   s   € ÷ ñ ˜4ð  Cñ r   c                óÎ  € ^ RI Hp \        V,          w  r4rVV P                  pVP	                  V4      '       g   \        RV RV 24       ^# VP                  Wq4      '       g%   \        RVP                  RV4      ,           4       ^# VP                  V4      '       g%   \        RVP                  RV4      ,           4       ^ # \        RVP                  RV4      ,           4       ^ # )rŠ   rU   ú
curator: 'u"   ' is bundled or hub-installed â€” rl   z{skill})	r]   rV   Ú_PIN_MESSAGESÚskillÚis_agent_createdr;   Ú
set_pinnedr   Úis_curator_managed)rª   r�   rV   Ú	not_agentÚnot_eligiblerb   ÚdonerÓ   s   &&      r   Ú_set_pinrÚ   Û   s¾   € Ý!Ü/<¸VÕ/DÑ,€I˜YØ�J‰J€EØ×'Ñ'¨×.Ò.Ü�
˜5˜'Ð!CÀIÀ;ÐOÔPÙØ×!Ñ! %×0Ò0Üˆk˜L×0Ñ0°¸EÓBÕBÔCÙØ×)Ñ)¨%×0Ò0Üˆk˜I×-Ñ-¨i¸Ó?Õ?Ô@ÙÜ	ˆ+˜Ÿ™ Y°Ó6Õ
6Ô7Ùr   c               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r   ì   s   € × 6Ñ 6�cÑ 6r   c                ó   € \        V R 4      # rÇ   ©rÚ   rÉ   s   &r   Ú_cmd_pinrÞ   ì   s   € ¤(¨4°Ó"6Ð6r   c               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r   í   s   € × 9Ñ 9˜Ñ 9r   c                ó   € \        V R 4      # rÍ   rÝ   rÉ   s   &r   Ú
_cmd_unpinrá   í   s   € ¤H¨T°5Ó$9Ð9r   c               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r   ð   s   € ÷ ñ  ñ r   c                óÎ  € ^ RI Hp VP                  4       pV'       g   \        R4       ^ # \        R\	        V4       R24       \        VR R7       F„  pVP                  R4      '       d   RVP                  R	4      ;'       g    R
 2MRp\        RVR,          R RVP                  R^ 4      R R\        VP                  R4      4      R RV R2	4       K†  	  \        R4       ^ # )zNItemize the unmanaged population that `status` summarizes (input for `adopt`).rU   u@   curator: no unmanaged skills â€” every eligible skill is managedzunmanaged skills (z):c                ó   € V R ,          # ©rF   r   )Úxs   &r   r˜   Ú%_cmd_list_unmanaged.<locals>.<lambda>ø   s   € ¨¨&®	r   rš   rX   zcreated_by:Ú
created_byÚnullz	no markerrE   rF   Ú44sz
 activity=rH   Ú4drM   rN   Ú14sz  (r’   za
adopt one with `hermes curator adopt <name>`, or all with `hermes curator adopt --all-unmanaged`)r]   rV   r^   r;   ra   r©   rO   r+   )rª   rV   r?   rP   Úwhys   &    r   Ú_cmd_list_unmanagedrî   ð   sã   € å!Ø×'Ñ'Ó)€DßÜÐPÔQÙÜ	Ðœs 4›y˜k¨Ð
,Ô-Ü�DÑ1×2ˆØ?@¿u¹uÐEY×?ZÒ?Z�˜AŸE™E ,Ó/×9Ð9°6Ð:Ñ;Ð`kˆÜØ��6•˜3�˜z¨!¯%©%Ð0@À!Ó*DÀRÐ)Hð IÜ$ Q§U¡UÐ+=Ó%>Ó?ÀÐDÀCÈÀuÈAðOö	Pñ 3ô
 
ð ?ô @ár   c               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r     s   € ÷ $ñ $˜ñ $r   c                óV  € ^ RI Hp \        \        V RR4      ;'       g    . 4      p\	        \        V RR4      4      pV'       d;   V'       d   \        R4       ^# VP                  4       pV'       g   \        R4       ^ # V'       g   \        R4       ^# \        V R	R4      '       d2   \        R
\        V4       R24       V F  p\        RV 24       K  	  ^ # V'       dM   \        V RR4      '       g:   \        R\        V4       R24       \        R4       \        RRRR7      '       g   ^# ^ pV F1  pVP                  V4      w  rg\        RV 24       WV'       * ,          pK3  	  \        V4      ^8”  d+   \        R\        V4      V,
           R\        V4       24       V'       d   ^# ^ # )zÁHand unmanaged skills to the curator by explicit user declaration: provenance cannot be
inferred from telemetry (a high patch count proves the agent MAINTAINS a skill, not that it
AUTHORED it).rU   rÓ   NÚall_unmanagedFz=curator: pass either skill names or --all-unmanaged, not bothz%curator: no unmanaged skills to adoptz7curator: name a skill to adopt, or pass --all-unmanagedr³   zcurator: would adopt z skill(s) (dry run):z  + r5   zcurator: adopt z, unmanaged skill(s) into curator management?z9  they become eligible for automatic staleness + archivalz  proceed? [y/N] úcurator: abortedr2   )r/   rl   zcurator: adopted Ú/)
r]   rV   r@   r»   r0   r;   Úlist_unmanaged_skill_namesra   r<   Úadopt_skill)rª   rV   ÚnamesÚ	adopt_allÚnÚfailedÚokÚmsgs   &       r   Ú
_cmd_adoptrü     sp  € õ "Ü”˜˜w¨Ó-×3Ð3°Ó4€EÜ”W˜T ?°EÓ:Ó;€IßßÜÐQÔRÙØ×6Ñ6Ó8ˆßÜÐ9Ô:ÙßÜÐGÔHÙÜˆt�Y ×&Ò&ÜÐ%¤c¨%£j \Ð1EÐFÔGÛˆAÜ�D˜˜�*Öñ áçœ  u¨e×4Ò4Ü�¤ E£
˜|Ð+WÐXÔYÜÐIÔJÜÐ+Ð-?ÈB×OÓOÙØ€FÛˆØ×)Ñ)¨!Ó,‰ˆÜ�	˜#˜ÐÔ Ø”&ÕŠñ ô ˆ5ƒz�A„~ÜÐ!¤# e£*¨vÕ"5Ð!6°a¼¸E»
°|ÐDÔEßˆ1Ð˜AÐr   c               ó    € V ^8„  d   QhRRRR/# )r	   rÓ   r   r
   r$   r   )r   s   "r   r   r   )  s   € ÷ 	ñ 	˜ð 	 ñ 	r   c                óÈ   € ^ RI Hp VP                  R4      p V ! V4      w  rEVP                  V4       \	        RV 24       V'       d   ^ # ^#   TP                  T4       i ; i)zURun a skill mutation with the ledger actor set to ``user``; print and map its result.©Úskill_ledgerÚuserrl   )r]   r   Úset_ledger_actorÚreset_ledger_actorr;   )ÚfnrÓ   r   Útokrú   rû   s   &&    r   Ú_as_userr  )  sa   € å"Ø
×
'Ñ
'¨Ó
/€Cð-Ù�U“)‰ˆà×'Ñ'¨Ô,Ü	ˆI�c�UÐ
Ôßˆ1Ð˜Ðøð 	×'Ñ'¨Õ,ús   ™
A ÁA!c               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r   5  s   € ÷ ;ñ ;˜#ñ ;r   c                óN   € ^ RI Hp \        VP                  V P                  4      # )rŠ   rU   )r]   rV   r  Úrestore_skillrÓ   ©rª   rV   s   & r   Ú_cmd_restorer  5  s   € Ý!Ü�K×-Ñ-¨t¯z©zÓ:Ð:r   c               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r   :  s   € ÷ ;ñ ;˜#ñ ;r   c                óþ   € ^ RI Hp VP                  V P                  4      P	                  R4      '       d)   \        RV P                   RV P                   R24       ^# \        VP                  V P                  4      # )z;Manually archive an agent-created skill. Refuses if pinned.rU   r�   rÑ   u7   ' is pinned â€” unpin first with `hermes curator unpin Ú`)r]   rV   Ú
get_recordrÓ   rO   r;   r  Úarchive_skillr
  s   & r   Ú_cmd_archiver  :  si   € å!Ø×Ñ˜dŸj™jÓ)×-Ñ-¨h×7Ò7ÜØ˜Ÿ™˜ð %%Ø%)§Z¡Z L°ð3ô	4ñ Ü�K×-Ñ-¨t¯z©zÓ:Ð:r   c               ó    € V ^8„  d   QhRRRR/# )r	   ÚrecordÚdictr
   zOptional[int]r   )r   s   "r   r   r   E  s   € ÷ Iñ I�tð I ñ Ir   c                ó  € V P                  R4      ;'       g    V P                  R4      pV'       d   \        \        V4      4      MRpVf   R# \        ^ \        P
                  ! \        4      V,
          P                  4      # )z•Days since last activity, falling back to ``created_at`` so never-used skills aren't
immortal; None only when both fields are missing or unparseable.rN   r–   N)rO   r   r   Úmaxr   r%   r   Údays)r  r   r   s   &  r   Ú
_idle_daysr  E  s`   € ð 
�‰Ð&Ó	'×	CÐ	C¨6¯:©:°lÓ+C€Bß!Œ”3�r“7Ô	 t€BØ’:ˆ4ÐH¤3 q¬8¯<ª<¼Ó+<¸rÕ+A×*GÑ*GÓ#HÐHr   c               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r   M  ó   € ÷ #ñ #˜ñ #r   c                óš  € ^ RI Hp ^ RIHp \	        V RR4      pVf   VP                  4       pV^8  d"   \        RV R2\        P                  R7       ^# VP                  4        Uu. uFb  pVP                  R4      '       d   K  VP                  R	4      VP                  8X  d   K>  \        V4      ;pf   KO  WS8¼  g   KW  VR
,          V3NKd  	  ppV'       g   \        RV R24       ^ # VP                  R R7       \        R\        V4       RV R24       V F  w  ru\        RVR RV R24       K  	  \	        V RR4      '       d   \        R4       ^ # \	        V RR4      '       g"   \        R\        V4       R2R4      '       g   ^# V UUu. uF  w  rxV.VP!                  V4      O5NK  	  p	ppV	 UU
Uu. uF  w  rzqº'       d   K  W{3NK  	  pp
pp\        R\        V	4      \        V4      ,
           R\        V4       24       V'       d*   \        R4       V F  w  r{\        RV R V 24       K  	  ^# ^ # u upi u uppi u upp
pi )!zYBulk-archive curator-managed skills idle for >= N days (pinned exempt, archived skipped).r‹   rU   r  Nz"curator: --days must be >= 1 (got r’   )Úfiler�   r}   rF   z6curator: nothing to prune (no unpinned skills idle >= zd)c                ó   € V ^,          ) # )r   r   )Úcs   &r   r˜   Ú_cmd_prune.<locals>.<lambda>^  s
   €  1 Q¥4¡%r   rš   rl   z skill(s) idle >= úd:rE   rG   z idle rq   r³   Fu   
(dry run â€” no changes made)r5   z	
Archive z skill(s)? [y/N] rò   z
curator: archived ró   z	failures:ú: )r�   r|   r]   rV   r»   rz   r;   ÚsysÚstderrr¤   rO   ÚSTATE_ARCHIVEDr  Úsortra   r<   r  )rª   r|   rV   r  rP   ÚidleÚ
candidatesrF   Ú_Úresultsrú   rû   Úfailuress   &            r   Ú
_cmd_pruner+  M  s-  € åÝ!Ü�4˜ Ó&€DØ‚|Ø×-Ñ-Ó/ˆØˆa„xÜÐ2°4°&¸Ð:ÄÇÁÕLÙà#.×#=Ñ#=Ô#?óBÙ#?˜aØ—‘�h—ô 	Ø#$§5¡5¨£>°[×5OÑ5OÑ#Oô 	ä “]Ð"ˆTô 	à48±Lô 	ˆˆ6��DÓÑ#?ð ð B÷ ÜÐFÀtÀfÈBÐOÔPÙØ‡O�O™€OÔ(Ü	ˆI”c˜*“oÐ&Ð&8¸¸¸bÐ
AÔBÛ ‰
ˆÜ��4˜�*˜F 4 &¨Ð*Ö+ñ !äˆt�Y ×&Ò&ÜÐ/Ô0ÙÜ�4˜ ×&Ò&¬xØ
”S˜“_Ð%Ð%6Ð7Ð9K÷0Mò 0MáÙGQÔRÁz¹G¸D�Ð7�{×0Ñ0°Ó6Ô7Áz€GÑRÙ18ÕC±¡ ¨#Ã”�“±€HÒCÜ	Ð ¤ W£´°H³Õ!=Ð >¸aÄÀJÃÐ?PÐ
QÔRßÜˆkÔÛ!‰IˆDÜ�B�t�f˜B˜s˜eÐ$Ö%ñ "áÙùò3Bùó" SùÜCs0   Á(H;ÂH;Â(H;Â9H;ÃH;Æ I Æ9IÇ
Ic               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r   s  s   € ÷ ñ ˜ñ r   c                óø   € ^ RI Hp VP                  4       '       g   \        R4       ^# TP	                  \        V RR4      ;'       g    RR7      pVf   \        R4       ^# \        RVP                   24       ^ # )	zOManual skills-tree snapshot (same mechanism as the automatic pre-run snapshot).©Úcurator_backupzacurator: backups are disabled via config (`curator.backup.enabled: false`); re-enable to snapshotÚreasonNÚmanual)r0  uE   curator: snapshot failed â€” check logs (backup disabled or IO error)z?curator: snapshot created at ~/.hermes/skills/.curator_backups/)r�   r/  ru   r;   Úsnapshot_skillsr»   rF   )rª   r/  Úsnaps   &  r   Ú_cmd_backupr4  s  su   € å$Ø×$Ñ$×&Ò&ÜðGô	Hñ Ø×)Ñ)´¸¸xÈÓ1N×1ZÐ1ZÐRZÐ)Ó[€DØ‚|ÜÐUÔVÙÜ	ÐKÈDÏIÉIÈ;Ð
WÔXÙr   c               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r   ƒ  s   € ÷ ñ ˜ñ r   c                ó’  € ^ RI Hp \        V RR4      '       d[   VP                  4       w  r#pVP	                  4       w  rV\        RV RVR#,          R RVR#,          R RV R	VR#,          R R
24       ^ # TP                  \        V RR4      \        V RR4      ;'       g    ^R7      pV'       g   \        R4       ^ # \        RR RRR RRR RRR R24       V Fß  pVP                  R4      ;'       g    / p	Rp
V	P                  R4      '       d   RV	R,           R2p
M#V	P                  R4      '       d   RV	R,           2p
\        VP                  RR 4      R R\        VP                  R!4      4      R RVP                  RR 4      R RVP                  RR 4      R RVP                  RR 4       V
 2
4       Ká  	  \        R"4       ^ # )$zTList per-mutation audit ledger entries (newest first), or compact the file in place.rÿ   ÚcompactFu   curator: ledger compacted â€” z
 entries, z.1fu    MB â†’ z MB; z unreferenced blob(s) removed (z MB)rÓ   Nr*   )rÓ   r*   z8curator: ledger is empty (or skills.ledger is disabled).Úidz<14r”   Úwhenz<12Úactorz<8Úactionz skillÚevidencer2   Úabsorbed_intou     â†’ absorbed into 'Ú'Úrollback_targetu     â†’ rollback of Ú?r   z�
Roll back a single mutation with `hermes curator rollback <id>`; whole-tree snapshots remain available via `hermes curator rollback --list`.i   )	r]   r   r»   Úcompact_ledgerÚgc_blobsr;   Úlist_entriesrO   r+   )rª   r   ÚentriesÚbeforeÚafterÚblobsÚfreedr?   rP   r<  Úextras   &          r   Ú_cmd_ledgerrJ  ƒ  sí  € å"Üˆt�Y ×&Ò&Ø!-×!<Ñ!<Ó!>Ñˆ˜Ø#×,Ñ,Ó.‰ˆÜÐ.¨w¨i°zÀ&È5Å.ÐQTÐAUÐU]Ð^cÐfkÕ^kÐloÐ]pÐpuØ�Ð6°u¸uµ}ÀSÐ6IÈðOô 	PáØ×$Ñ$Ü�d˜G TÓ*´'¸$ÀÈÓ2N×2TÐ2TÐRTð %ó V€DçÜÐHÔIÙÜ	ˆT�#ˆJ�a˜˜s�| 1 W¨R L°°(¸3°¸vÐ
FÔGÛˆØ—5‘5˜Ó$×*Ð*¨ˆØˆØ�<‰<˜×(Ò(Ø+¨H°_Õ,EÐ+FÀaÐH‰EØ�\‰\Ð+×,Ò,Ø(¨Ð2CÕ)DÐ(EÐFˆEÜØ�u‰u�T˜3Ó Ð$ A¤g¨a¯e©e°D«kÓ&:¸3Ð%?¸qØ�u‰u�W˜cÓ" 2Ð& a¨¯©¨h¸Ó(<¸SÐ'AÀØ�u‰u�W˜cÓ"Ð# E 7ð,ö	-ñ ô 
ð	VôWñ r   c               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r   £  s   € ÷ =ñ =˜ñ =r   c           
     óŽ  aaaa€ ^ RI p^ RIp^ RIHpHp ^ RIHpHo \        V RR4      pVf%   \        V! V! 4       RR^ R7      ;'       g    ^ 4      pV^ 8:  d   \        R4       ^# SP                  4       pVP                  4       '       g   \        R	4       ^ # VP                  4       VR
,          ,
          oSP                  4       oR VV3R llo\        VV3R lVP                  4        4       4      pV'       g   \        RV R24       ^ # \        RV R24       V F  p	\        RV	P                    24       K  	  \        V RR4      '       d   \        R4       ^ # \        V RR4      '       g!   \#        R\%        V4       R24      '       g   ^# ^ p
V Fi  p	VP'                  V	RV	P                   R7      p VP)                  V	4       TP-                  RT	P                   T;'       g    . . RRT/R 7       T
^,          p
Kk  	  \        R!V
 R"24       ^ #   \*         d'   p\        RT	P                    RT 24        Rp?Kª  Rp?ii ; i)#uæ   Delete archived skills older than curator.archive_ttl_days. Explicit only â€” never
automatic; each purged skill is captured (before-blobs) and recorded as a 'purge' ledger
entry, so even a purge is auditable and blob-recoverable.N)Úcfg_getÚload_config)r   rV   r  r|   Úarchive_ttl_days)Údefaultz�curator: purge disabled (curator.archive_ttl_days is 0). Set the config key or pass --days N to purge archives older than N days.u3   curator: no archive directory â€” nothing to purge.r   c               ó    € V ^8„  d   QhRRRR/# )r	   Úpr   r
   Úfloatr   )r   s   "r   r   Ú _cmd_purge.<locals>.__annotate__º  s   € ÷ 	Sñ 	S˜ð 	S ñ 	Sr   c                ó¶  <€ SP                  SP                  V R ,          V P                  R7      4      ;'       g    / pVP                  R4      SP                  8H  pV'       d!   SP	                  VP                  R4      4      MRpV'       d3   \        VP                  4       V P                  4       P                  4      # V P                  4       P                  # )zSKILL.md)Úfallbackr}   Úarchived_atN)	rO   Úread_skill_namerF   r$  Ú_parse_iso_timestampr  Ú	timestampÚstatÚst_mtime)rR  Úrecr£   ÚatrV   Úusages   &   €€r   Ú_archived_tsÚ _cmd_purge.<locals>._archived_tsº  s�   ø€ ð �i‰i˜×3Ñ3°A¸
µNÈQÏVÉVÐ3ÓTÓU×[Ð[ÐY[ˆØ—7‘7˜7Ó# {×'AÑ'AÑAˆßIQˆ[×-Ñ-¨c¯g©g°mÓ.DÔEÐW[ˆß9;Œs�2—<‘<“> 1§6¡6£8×#4Ñ#4Ó5ÐRÀÇÁÃ×ARÑARÐRr   c              3  ót   <"  € T F-  qP                  4       '       g   K  S! V4      S8  g   K)  Vx € K/  	  R # 5i©N)Úis_dir)rZ   rR  r`  Úcutoffs   & €€r   r[   Ú_cmd_purge.<locals>.<genexpr>Å  s+   øé € ð VÙ)ˆa¯X©X¯ZŒ¹LÈ»OÈfÑ<T�ŠÓ)ùs   ƒ8Ÿ
8®
8z'curator: no archived skills older than zd.zArchived skills older than r   rE   r³   Fu   (dry run â€” nothing deleted)r5   zPermanently delete z archived skill(s)? [y/N] T)Úcomplete_packagerÓ   zcurator: failed to purge r!  Úpurger  Úttl_days)rE  rF  r:  r<  zcurator: purged z, archived skill(s). Ledger entries recorded.)ÚshutilÚtimeÚhermes_cli.configrM  rN  r]   r   rV   r»   r$   r;   Ú_archive_dirrw   Ú
load_usager©   ÚiterdirrF   r<   ra   Úcapture_beforeÚrmtreeÚOSErrorÚappend_entry)rª   rj  rk  rM  rN  r   ri  Úarchive_rootr'  rR  ÚpurgedrE  Úer`  re  rV   r_  s   &            @@@@r   Ú
_cmd_purgerw  £  s1  û€ ó Ûß6ß/Ü�t˜V TÓ*€HØÒÜ‘w™{›}¨iÐ9KÐUVÔW×\Ð\Ð[\Ó]ˆØ�1„}ÜðOô	Pñ Ø×+Ñ+Ó-€LØ×Ñ× Ò ÜÐCÔDÙØ�Y‰Y‹[˜8 eÕ+Õ+€FØ×"Ñ"Ó$€E÷	Sñ 	Sô õ VØ×'Ñ'Ô)óVó V€JçÜÐ7¸°zÀÐDÔEÙÜ	Ð'¨ z°Ð
4Ô5ÛˆÜ��1—6‘6�(ˆmÖñ äˆt�Y ×&Ò&ÜÐ-Ô.ÙÜ�4˜ ×&Ò&¬xØ
œc *›oÐ.Ð.HÐI÷0Kò 0KáØ€FÛˆØ×,Ñ,¨QÀÈQÏVÉVÐ,ÓTˆð	Ø�M‰M˜!Ôð 	×!Ñ!Ø�Q—V‘V F§L L¨b¸À&Ø  (Ð+ð 	"ô 	-ð 	�!�Šñ ô 
Ð˜V˜HÐ$PÐ
QÔRÙøô ô 	ÜÐ-¨a¯f©f¨X°R¸°sÐ;Ô<Ýûð	ús   Æ7HÈIÈH?È?Ic               ó$   € V ^8„  d   QhRRRRRR/# )r	   rú   r0   rû   r   r
   r$   r   )r   s   "r   r   r   ã  s!   € ÷ ñ ˜ð  Cð ¨Cñ r   c                óP   € \        V '       d   R V 2MRV 24       V '       d   ^ # ^# )rl   u   curator: rollback failed â€” )r;   )rú   rû   s   &&r   Ú_report_rollbackrz  ã  s*   € Ü	ŸrˆI�c�UÑ
Ð)FÀsÀeÐ'LÔMßˆ1Ð˜Ðr   c               ó    € V ^8„  d   QhRRRR/# )r	   Úentry_idr   r
   r$   r   )r   s   "r   r   r   è  s   € ÷ Dñ D¨3ð D°3ñ Dr   c                óÊ  € ^ RI Hp VP                  V4      pVf   \        RV R24       ^# \        RV 24       \        RVP	                  RR4       24       \        RVP	                  R	R4       24       \        R
VP	                  RR4       24       \        RVP	                  RR4       24       VP	                  R4      ;'       g    . VP	                  R4      ;'       g    . ,            Uu0 uF  qDP	                  R4      kK  	  pp\        R\        V4       24       \        V RR4      '       g   \        R4      '       g   ^# \        VP                  V4      !  # u upi )z²Restore exactly the files touched by one ledger entry (from content-addressed blobs); a
pre-rollback safety ledger entry is taken first and it fails closed if that capture fails.rÿ   zcurator: no ledger entry 'zh'. See `hermes curator ledger` for entry ids, or use `--id <snapshot>` for whole-tree snapshot rollback.zRollback target: ledger entry z
  action: r;  r@  z
  skill:  rÓ   z
  actor:  r:  z
  when:   r   rE  rF  Úpathz
  files:  r5   Fz,Restore this mutation's before-state? [y/N] )
r]   r   Ú	get_entryr;   rO   ra   r»   r<   rz  Úrollback_entry)rª   r|  r   ÚentryÚiÚtoucheds   &&    r   Ú_rollback_ledger_entryr„  è  sM  € õ #Ø×"Ñ" 8Ó,€EØ‚}ÜØ(¨¨
ð 3Bð Bô	Cñ Ü	Ð*¨8¨*Ð
5Ô6Ü	ˆJ�u—y‘y ¨3Ó/Ð0Ð
1Ô2Ü	ˆJ�u—y‘y ¨#Ó.Ð/Ð
0Ô1Ü	ˆJ�u—y‘y ¨#Ó.Ð/Ð
0Ô1Ü	ˆJ�u—y‘y  sÓ+Ð,Ð
-Ô.Ø',§y¡y°Ó':×'@Ð'@¸bÀUÇYÁYÈwÓEW×E]ÐE]Ð[]Ö&^Ó_Ñ&^ �u‰u�VŽ}Ñ&^€GÐ_Ü	ˆJ”s˜7“|�nÐ
%Ô&Ü�4˜ ×&Ò&¬xØ6÷08ò 08áÜ˜\×8Ñ8¸ÓBÑCÐCùò `s   Ã0E c               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r      s   € ÷ -%ñ -%˜3ñ -%r   c                ó¬  € ^ RI Hp \        V RR4      pV'       d   \        W4      # \        V RR4      '       d   \	        VP                  4       4       ^ # \        V RR4      pVP                  V4      pVfs   VP                  4       '       g   \	        R4       ^# \	        RV'       d   R	\        V4      ,           MR
 R24       \	        R4       \	        VP                  4       4       ^# VP                  V4      p\	        RVP                   24       V'       dâ   \	        RVP                  RR4       24       \	        RVP                  RR4       24       \	        RVP                  RR4       24       VP                  R4      ;'       g    / p\        V\        4      '       dW   VP                  R4      '       d!   \	        RVP                  R^ 4       R24       M\	        RVP                  RR4       R24       \	        R4       \        V RR4      '       g   \        R4      '       g   ^# VP                  VP                  R 7      w  rxp	\!        Wx4      # )!zTRestore the skills tree from a snapshot, or a single mutation from the audit ledger.r.  r|  Nr@   FÚ	backup_idzhcurator: no snapshots exist yet. Take one with `hermes curator backup` or wait for the next curator run.zcurator: no snapshot matching zid z
your queryÚ.z
Available:zRollback target: z  reason:      r0  r@  z  created_at:  r–   z  skill files: Úskill_filesÚ	cron_jobsÚ	backed_upz  cron jobs:   Ú
jobs_countz. (will be restored for skill-link fields only)z   cron jobs:   not in snapshot (znot capturedr’   a  
This will replace the current ~/.hermes/skills/ tree (a safety snapshot of the current state is taken first so this is undoable). Cron jobs that still exist will have their skills/skill fields restored from the snapshot; all other cron fields are left alone.r5   zProceed? [y/N] )r‡  )r�   r/  r»   r„  r;   Úsummarize_backupsÚ_resolve_backupÚlist_backupsÚreprÚ_read_manifestrF   rO   Ú
isinstancer  r<   Úrollbackrz  )
rª   r/  r|  r‡  Útarget_pathÚmanifestÚcronrú   rû   r(  s
   &         r   Ú_cmd_rollbackr—     s  € å$Ü�t˜Z¨Ó.€HßÜ% dÓ5Ð5Üˆt�V˜U×#Ò#Üˆn×.Ñ.Ó0Ô1ÙÜ˜˜k¨4Ó0€IØ ×0Ñ0°Ó;€KØÒØ×*Ñ*×,Ò,ÜðLôMñ ô Ø0ß.7�5œ4 	›?Ö*¸\ÐJÈ!ðMôNô �,ÔÜ�.×2Ñ2Ó4Ô5ÙØ×,Ñ,¨[Ó9€HÜ	Ð˜k×.Ñ.Ð/Ð
0Ô1ßÜ� §¡¨X°sÓ ;Ð<Ð=Ô>Ü� §¡¨\¸3Ó ?Ð@ÐAÔBÜ� §¡¨]¸CÓ @ÐAÐBÔCØ�|‰|˜KÓ(×.Ð.¨BˆÜ�dœD×!Ò!Ø�x‰x˜×$Ò$ÜØ% d§h¡h¨|¸QÓ&?Ð%@ð ADð EõFô Ð8¸¿¹À(ÈNÓ9[Ð8\Ð\]Ð^Ô_Ü	ð	LôMô
 �4˜ ×&Ò&¬xÐ8I×/JÒ/JÙØ×(Ñ(°;×3CÑ3CÐ(ÓD�J€BˆQÜ˜BÓ$Ð$r   c               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r   0  s   € ÷ ñ  ñ r   c                óz   € ^ RI Hp VP                  4       p\        V'       d   RP	                  V4      MR4       ^ # )z#List archived (recoverable) skills.rU   rC   zcurator: no archived skills)r]   rV   Úlist_archived_skill_namesr;   r¨   )rª   rV   rö   s   &  r   Ú_cmd_list_archivedr›  0  s,   € å!Ø×1Ñ1Ó3€EÜ	Ÿeˆ$�)‰)�EÔ
Ð)FÔGÙr   rF   c                ó   € V R ,          # rå   r   r—   s   &r   r˜   r˜   9  s   € �q˜–yr   Úrecentc                ó8   € V P                  R 4      ;'       g    R# )rN   r2   rY   r—   s   &r   r˜   r˜   :  s   € ˜Ÿ™Ð1Ó2×8Ð8°bÐ8r   Úactivityc                ó&   € V P                  R ^ 4      # )rH   rY   r—   s   &r   r˜   r˜   ;  s   € ˜1Ÿ5™5Ð!1°1Ô5r   c               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r   >  r  r   c                ór  € ^ RI p^ RIHp VP                  4       p\	        V RR4      pV'       d)   V Uu. uF  qUP                  R4      V8X  g   K  VNK  	  pp\        P                  \	        V RR4      \        R,          4      w  rgVP                  WgR7       \	        V RR4      '       d    \        VP                  V^RR	7      4       ^ # V'       g   \        R
4       ^ # V Uu. uF  qUP                  RR4      NK  	  ppR* U	u/ uF  q™VP                  V	4      bK  	  p
p	\        R\        V4       RV
R,           RV
R,           RV
R,           RV
R,           R24       \        RRR RRR RRR RRR RRR RRR R 24       V FŸ  p\        RVR!,          R",          R RVP                  RR4      R RVP                  R#^ 4      R$ RVP                  R%^ 4      R$ RVP                  R&^ 4      R' RVP                  R(^ 4      R$ R\        VP                  R)4      4       24       K¡  	  ^ # u upi u upi u up	i )+zQUsage telemetry for ALL skills on disk (bundled + hub included), with provenance.NrU   rŽ   r%  rŸ  r    ÚjsonF)ÚindentÚensure_asciizcurator: no skills foundr�   r‘   ÚhubÚexternalzskills: z total  (agent=r�   z  hub=z  external=z)
rE   rÓ   rG   ÚoriginÚ8sÚusez>4sÚviewÚpatchz>5sÚactz  last_activityrF   :Né(   NrJ   z>4drK   rL   z>5drH   rN   ©r�   r‘   r¦  r§  )r£  r]   rV   Úusage_reportr»   rO   Ú_USAGE_SORTSr%  r;   Údumpsr§   ra   r+   )rª   Ú_jsonrV   r?   Úprov_filterrP   r›   r¡   rŽ   ÚkÚcountss   &          r   Ú
_cmd_usager·  >  sL  € ãÝ!Ø×#Ñ#Ó%€DÜ˜$ ¨dÓ3€KßÙÓF™4�a§5¡5¨Ó#6¸+Ñ#E—�™4ˆÐFô  ×#Ñ#¤G¨D°&¸*Ó$EÄ|ÐT^ÕG_Ó`�L€CØ‡I�I�#€IÔ'Üˆt�V˜U×#Ò#Üˆe�k‰k˜$ q°uˆkÓ=Ô>ÙßÜÐ(Ô)ÙÙ8<Ó=¹°1—%‘%˜ gÖ.¹€JÐ=Ù.UÓVÑ.U¨�×!Ñ! !Ó$Ò$Ñ.U€FÐVÜ	Ø
”3�t“9�+ð Ø˜•/Ð" *¨V°IÕ->Ð,?¸vÀfÈUÅmÀ_ÐT_Ð`fÐgqÕ`rÐ_sÐsvð	xôyô 
Ø
ˆW�SˆM˜˜H R˜=¨Ø�ˆ+�R˜˜s�| 2 g¨c ]°"°U¸3°K¸ð	PôQó ˆÜØ��6•˜3• Ð$ BØ�u‰u�\ 7Ó+¨BÐ/¨rØ�u‰u�[ !Ó$ SÐ)¨Ø�u‰u�\ 1Ó% cÐ*¨"Ø�u‰u�] AÓ& sÐ+¨2Ø�u‰uÐ% qÓ)¨#Ð.¨bÜ�q—u‘uÐ/Ó0Ó1Ð2ð4ö	5ñ ñ ùò9 Gùò >ùÚVs   ´H*ÁH*Ã#H/ÄH4c                 ó   € W3# rc  r   )ÚflagsÚkwargss   *,r   Ú_argr»  d  s
   € Øˆ=Ðr   rÓ   z
Skill name©Úhelpú-yú--yesÚ
store_truezSkip the confirmation prompt)r;  r½  )r;  Ústatusz#Show curator status and skill statsr_  zJShow usage telemetry for ALL skills (built-in, hub, agent) with provenancez--sortzlSort order: activity (most-used first, default), recent (most-recently-active first), or name (alphabetical))ÚchoicesrP  r½  z--provenancezOnly show skills of this originr½  z/Emit the full report as JSON instead of a tableÚrunzTrigger a curator review nowÚdestrµ   z@Wait for the LLM review pass to finish (default for manual runs)r´   zGStart the LLM review pass in a background thread and return immediatelyr³   uk   Report only â€” no state changes, no archives, no consolidation (use this to preview what curator would do)r…   z»Force the LLM umbrella-building consolidation pass on for this run, overriding the config default (off). Without this flag the run is prune-only unless `curator.consolidate: true` is set.ÚpausezPause the curator until resumedÚresumezResume a paused curatorÚpinz4Pin a skill so the curator never auto-transitions itÚunpinzUnpin a skillzlist-unmanagedz7List curation-eligible skills with no provenance markerÚadoptzGHand unmanaged skills to the curator (provenance is a user declaration)Ú*z8Skill name(s) to adopt. Omit when using --all-unmanaged.)Únargsr½  zAAdopt every curation-eligible skill that has no provenance markerz3List what would be adopted without writing anythingz0Skip the confirmation prompt for --all-unmanagedÚrestorezRestore an archived skillzlist-archivedzList archived skillsÚarchivezBManually archive a skill (move to .archive/, excluded from prompt)Úprunez\Bulk-archive curator-managed skills idle for >= N days (default: curator.archive_after_days)z--dayszQArchive skills idle for at least N days (default: curator.archive_after_days, 30))ÚtyperP  r½  z,Show what would be archived without doing itÚbackupzoTake a manual tar.gz snapshot of ~/.hermes/skills/ (curator also does this automatically before every real run)z--reasonz;Free-text label stored in manifest.json (default: 'manual'))rP  r½  r“  zxRestore ~/.hermes/skills/ from a curator snapshot, or a single mutation by ledger entry id (see `hermes curator ledger`)r|  r@  zsLedger entry id for single-mutation rollback (from `hermes curator ledger`). Omit for whole-tree snapshot rollback.)rË  rP  r½  z3List available snapshots and exit without restoringz--idr‡  z6Snapshot id to restore (see `--list`); default: newest)rÄ  rP  r½  zSkip confirmation promptÚledgerzIList the per-mutation skill audit ledger (all actors: curator/agent/user)z--skillz Only show entries for this skillz--limitz!Max entries to show (default: 20)zYRewrite the ledger dropping unchanged paths from every entry (ids and rollback preserved)rh  uv   Delete archived skills older than curator.archive_ttl_days (explicit only â€” never automatic; recorded in the ledger)z5Override curator.archive_ttl_days for this invocationz*Show what would be purged without deletingc               ó    € V ^8„  d   QhRRRR/# )r	   Úparentzargparse.ArgumentParserr
   rA   r   )r   s   "r   r   r   Æ  s   € ÷ 'ñ 'Ð0ð '°Tñ 'r   c                óø   a € S P                  V 3R lR7       S P                  RR7      p\         FF  vr#rEVP                  W#R7      pV F  w  rxVP                  ! V/ VB  K  	  VP                  VR7       KH  	  R# )z)Attach `curator` subcommands to *parent*.c                ó6   <€ SP                  4       ^ 3^,          # )rŠ   )Ú
print_help)ÚarÓ  s   &€r   r˜   Úregister_cli.<locals>.<lambda>È  s   ø€ ¨×(9Ñ(9Ó(;¸QÐ'?ÀÖ'Br   )ÚfuncÚcurator_command)rÄ  r¼  N)Úset_defaultsÚadd_subparsersÚ_SUBCOMMANDSÚ
add_parserÚadd_argument)	rÓ  ÚsubsrF   Ú	help_textÚhandlerÚ	argumentsÚsubr¹  Ú
arg_kwargss	   f        r   Úregister_cliræ  Æ  sy   ø€ à
×ÑÔBÐÔCØ× Ñ Ð&7Ð Ó8€Dß0<Ð,ˆ˜Ø�o‰o˜dˆoÓ3ˆÛ!*ÑˆEØ×Ò˜eÐ2 zÔ2ñ "+à×Ñ˜gÐÖ&ó	 1=r   c               ó   € V ^8„  d   QhRR/# rˆ   r   )r   s   "r   r   r   Ñ  s   € ÷ %ñ %˜3ñ %r   c                ó°   € \         P                  ! RR7      p\        V4       VP                  V 4      p\	        VP                  V4      ;'       g    ^ 4      # )z>Standalone entry (also usable by hermes_cli.main fallthrough).zhermes curator)Úprog)ÚargparseÚArgumentParserræ  Ú
parse_argsr$   rÙ  )ÚargvÚparserrª   s   &  r   Úcli_mainrï  Ñ  sF   € ä×$Ò$Ð*:Ô;€FÜ�ÔØ×Ñ˜TÓ"€DÜˆt�y‰y˜‹×#Ð# !Ó$Ð$r   Ú__main__)Ú	cancelledrC   )z>cannot pin (only agent-created skills participate in curation)u§   could not pin '{skill}' â€” the skill is not curation-eligible (protected built-in or external). `hermes curator list-unmanaged` shows which skills the curator tracks.u¢   pinned '{skill}' (recorded; this skill is unmanaged â€” auto-transitions never consider it. Run `hermes curator adopt {skill}` to put it under curator management)z/pinned '{skill}' (will bypass auto-transitions))zCthere's nothing to unpin (curator only tracks agent-created skills)ub   could not unpin '{skill}' â€” the skill is not curation-eligible (protected built-in or external).ul   unpinned '{skill}' (recorded; this skill is unmanaged â€” it was never under auto-transitions to begin with)zunpinned '{skill}')rŸ  r�  rF   r¯  )z--json)z--syncz--synchronous)z--background)z	--dry-run)z--consolidate)z--all-unmanaged)r¿  )z--list)r¾  r¿  )z	--compactrc  )6Ú__doc__Ú
__future__r   rê  r"  r   r   r   Úpathlibr   Útypingr   r   r+   r<   rQ   re   r†   r°   rÀ   rÄ   rÊ   rÎ   rÒ   rÚ   rÞ   rá   rî   rü   r  r  r  r  r+  r4  rJ  rw  rz  r„  r—  r›  r±  r·  r»  Ú_SKILLÚ_YESr  Ú_STORE_TRUEr$   rÝ  ræ  rï  Ú__name__Úexitr   r   r   Ú<module>rû     s}  ðÙ 4å "ã Û 
ß ,Ñ ,Ý Ý õ?õ
#÷õ	Cõ^õ&Lõ8&õR)õXõ 6Ý 7ð 	ð ;ð 
ð ð€õ&õ" 7Ý 9õõ$$õN	õ;õ
;õIõ#õLõ õ@=õ@õ
Dõ0-%õ`ð Ñ  %Ð(ØÑ8¸$Ð?ØÑ5°tÐ<ð>€õ#òLñ 
ˆg˜LÔ	)€ÙˆD�' ,Ð5SÔT€Ù˜,Ô'€ð Ð4°kÐBàÐ]ØÙˆXÐ=ÀzðIô	Jñ 	ˆ^Ð%LÐVZØ3ô	5áÑ]˜Ñ]Ð+\Ò]ð_ð 	Ð-¨xÙñ 	V¨]ð 	V¸kñ 	VØTò	Váñ 	] ,ð 	]°+ñ 	]Ø[ò	]áñ 	A˜yð 	A¨Kñ 	Að@ò	Añ 	ñ 	R =ð 	R°Kñ 	RðQò	RðSð Ð/°Ð<ØÐ(¨+Ð6Ø
ÐBÀHÈfÐUØˆo˜z¨6Ð2ØÐPØðð 	ÐZØÙˆW˜CÐ&`ÔaÙñ 	W +ñ 	WØUò	Wáñ 	I˜Kñ 	IØGò	IáÑ]˜Ñ]Ð*\Ò]ð_ð Ð+¨\¸6ÐBØÐ,Ð.@ÐAØÐTÐVbØðð 	ÐoØÙˆX˜C¨Øeô	gàÙñ 	B˜yð 	B¨Kñ 	BØ@ò	BðCð 	ð	GàÙˆZ ØOô	QðRð 	ð	DàÙˆZ˜s¨DðUô	Vñ 	Ña˜ÑaÐ+`ÒaÙˆV˜+¨tØJô	LáÑK˜kÑKÐ0JÒKðMð 	Ð]ØÙˆY Ð+MÔNÙˆY˜S¨"Ð3VÔWÙñ 	o˜Kñ 	oØmò	oðpð 	ð	FàÙˆX˜C¨ØIô	Káñ 	@˜yð 	@¨Kñ 	@Ø>ò	@àð	ð[V€õr'÷%ð ˆzÔØ‡H‚H‰X‹ZÖñ r   