§
    øžyjªv  ã                  ó0  — d Z ddlmZ ddlZddlZddlmZmZ ddlmZ ddl	m
Z
 d'd„Zd(d„Zd)d„Zd)d„Zd)d„Zd)d„Zd)d„Zd)d„Zd)d„Zd)d„Zd)d„Zd)d„Zd*d„Zd)d„Zd)d„Zd)d„Zd)d „Zd)d!„Zd+d$„Zd,d)d%„Zed&k    r ej          e¦   «         ¦  «         dS dS )-u0  CLI subcommand: `hermes curator <subcommand>`.

Thin shell around agent/curator.py and tools/skill_usage.py. Renders a status
table, triggers a run, pauses/resumes, and pins/unpins skills.

This module intentionally has no side effects at import time â€” main.py wires
the argparse subparsers on demand.
é    )ÚannotationsN)ÚdatetimeÚtimezone)ÚPath)ÚOptionalÚtsúOptional[str]ÚreturnÚstrc                ó²  — | sdS 	 t          j        | ¦  «        }n&# t          t          f$ r t	          | ¦  «        cY S w xY w|j        € |                     t          j        ¬¦  «        }t          j	        t          j        ¦  «        |z
  }t          |                     ¦   «         ¦  «        }|dk     r|› d�S |dk     r|dz  › d�S |dk     r|dz  › d�S |dz  › d	�S )
NÚnever©Útzinfoé<   zs agoi  zm agoi€Q zh agozd ago)r   ÚfromisoformatÚ	TypeErrorÚ
ValueErrorr   r   Úreplacer   ÚutcÚnowÚintÚtotal_seconds)r   ÚdtÚdeltaÚsecss       ú8/home/ragecks/.hermes/hermes-agent/hermes_cli/curator.pyÚ_fmt_tsr      s  € Øð ØˆwðÝÔ# BÑ'Ô'ˆˆøÝ•zÐ"ð ð ð Ý�2‰wŒwˆˆˆðøøøà	„yÐØ�ZŠZ�xœ|ˆZÑ,Ô,ˆÝŒL�œÑ&Ô&¨Ñ+€EÝˆu×"Ò"Ñ$Ô$Ñ%Ô%€DØˆb‚y€yØˆ~ˆ~ˆ~ÐØˆd‚{€{Ø˜"‘*Ð#Ð#Ð#Ð#Øˆe‚|€|Ø˜$‘,Ð%Ð%Ð%Ð%Ø�e‰mÐ"Ð"Ð"Ð"s   † › >½>ÚNonec                 ód  — ddl m}  	 |                      ¦   «         }n# t          $ r Y dS w xY w|sdS t	          d„ |D ¦   «         ¦  «        }t          |¦  «        |z
  }t          dt          |¦  «        › d�¦  «         t          d|› �¦  «         t          d|› �¦  «         t          d	¦  «         dS )
uò  Report curation-eligible skills that carry no provenance marker.

    A skill only becomes curator-managed once ``created_by: agent`` lands on
    its usage record, which happens ONLY for background-review creations.
    Skills predating that marker, plus every foreground
    ``skill_manage(create)``, are eligible but unmanaged â€” no automatic
    transition ever considers them. Printing just the managed count made a
    large library look fully curated while a big slice was untouchable.
    r   ©Úskill_usageNc              3  óD   K  — | ]}|                      d ¦  «        °dV — ŒdS )Úhas_provenance_keyé   N©Úget)Ú.0Úrs     r   ú	<genexpr>z+_print_unmanaged_summary.<locals>.<genexpr>9   s4   è è € ÐIÐI�q¨Q¯UªUÐ3GÑ-HÔ-HÐI�ÐIÐIÐIÐIÐIÐIó    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)Útoolsr!   Úunmanaged_reportÚ	ExceptionÚsumÚlenÚprint)r!   Ú	unmanagedÚlegacyÚ
foregrounds       r   Ú_print_unmanaged_summaryr4   '   sø   € ð "Ð!Ð!Ð!Ð!Ð!ðØ×0Ò0Ñ2Ô2ˆ	ˆ	øÝð ð ð Øˆˆðøøøàð ØˆÝÐIÐI˜IÐIÑIÔIÑIÔI€FÝ�Y‘” &Ñ(€JÝ	Ð
Gµ°Y±´Ð
GÐ
GÐ
GÑHÔHÐHÝ	Ð
+ 6Ð
+Ð
+Ñ,Ô,Ð,Ý	Ð
/ :Ð
/Ð
/Ñ0Ô0Ð0Ý	ð	7ñô ð ð ð s   ˆ �
+ª+r   c                ó(  — ddl m} ddlm} |                     ¦   «         }|                     ¦   «         }|                     dd¦  «        }|                     d¦  «        }|                     d¦  «        pd}|                     d	d¦  «        }|r|sd
n|rdnd}	t          d|	› �¦  «         t          d|› �¦  «         t          dt          |¦  «        › �¦  «         d|v r@| 	                    ¦   «         ^}
}t          d|
› �¦  «         |D ]}t          d|› �¦  «         Œnt          d|› �¦  «         |                     d¦  «        }|r9t          |¦  «                             ¦   «         rdnd}t          d|› |› �¦  «         |                     ¦   «         }|dz  dk    r|dk    r|dz  › d�n|› d�}t          d|› �¦  «         t          d|                     ¦   «         › d�¦  «         t          d|                     ¦   «         › d�¦  «         t          d|                     ¦   «         rdnd › |                     ¦   «         rdnd!› �¦  «         |                     ¦   «         }|st          d"¦  «         t#          ¦   «          dS g g g d#œ}g }d}d}|D ]ž}|                     d$d%¦  «        }|                     |g ¦  «                             |¦  «         |                     d&¦  «        r|                     |d'         ¦  «         |                     d(d)¦  «        }|d)k    r|d*z  }Œ“|d+k    r|d*z  }ŒŸt          d,t)          |¦  «        › d-|› d.|› d/�¦  «         d#D ];}|                     |g ¦  «        }t          d0|d1›d2t)          |¦  «        › �¦  «         Œ<|r5t          d3t)          |¦  «        › d4d5                     |¦  «        › �¦  «         t#          ¦   «          t-          |                     d%g ¦  «        d6„ ¬7¦  «        d d8…         }|r²t          d9¦  «         |D ] }t          |                     d:¦  «        ¦  «        }t          d0|d'         d;›d<|                     d=d¦  «        d>›d?|                     d@d¦  «        d>›dA|                     dBd¦  «        d>›dC|                     dDd¦  «        d>›dE|› �¦  «         Œ¡|                     d%g ¦  «        }|�r¾t-          |dF„ dG¬H¦  «        d d8…         }|rÓ|d                              d=¦  «        pddk    r²t          dI¦  «         |D ] }t          |                     d:¦  «        ¦  «        }t          d0|d'         d;›d<|                     d=d¦  «        d>›d?|                     d@d¦  «        d>›dA|                     dBd¦  «        d>›dC|                     dDd¦  «        d>›dE|› �¦  «         Œ¡t-          |dJ„ ¬7¦  «        d d8…         }|r²t          dK¦  «         |D ] }t          |                     d:¦  «        ¦  «        }t          d0|d'         d;›d<|                     d=d¦  «        d>›d?|                     d@d¦  «        d>›dA|                     dBd¦  «        d>›dC|                     dDd¦  «        d>›dE|› �¦  «         Œ¡dS )LNr   ©Úcuratorr    ÚpausedFÚlast_run_atÚlast_run_summaryz(none)Ú	run_countÚENABLEDÚPAUSEDÚDISABLEDú	curator: z  runs:           z  last run:       Ú
z  last summary:   z                  Úlast_report_pathÚ z
 (missing)z  last report:    é   ÚdÚhz  interval:       every z  stale after:    zd unusedz  archive after:  z  consolidate:    ÚonÚoffz$ (prune-only; LLM merge pass opt-in)z
no curator-managed skills)ÚactiveÚstaleÚarchivedÚstaterH   ÚpinnedÚnameÚ
provenanceÚagentr$   Úbundledz
curator-managed skills: z total  (agent-created=ú
  bundled=ú)ú  Ú10sÚ z	
pinned (z): z, c                óZ   — |                       d¦  «        p|                       d¦  «        pdS )NÚlast_activity_atÚ
created_atrB   r%   ©r(   s    r   ú<lambda>z_cmd_status.<locals>.<lambda>˜   s)   € �a—e’eÐ.Ñ/Ô/ÐL°1·5²5¸Ñ3FÔ3FÐLÈ"€ r*   ©Úkeyé   z
least recently active (top 5):rW   Ú40sz  activity=Úactivity_countÚ3dz  use=Ú	use_countz  view=Ú
view_countz
  patches=Úpatch_countú  last_activity=c                ó^   — |                       d¦  «        pd|                       d¦  «        pdfS ©Nr_   r   rW   rB   r%   rY   s    r   rZ   z_cmd_status.<locals>.<lambda>±   ó0   € ˜1Ÿ5š5Ð!1Ñ2Ô2Ð7°a¸¿ºÐ?QÑ9RÔ9RÐ9XÐVXÐY€ r*   T©r\   Úreversez
most active (top 5):c                ó^   — |                       d¦  «        pd|                       d¦  «        pdfS rf   r%   rY   s    r   rZ   z_cmd_status.<locals>.<lambda>Ã   rg   r*   z
least active (top 5):)rO   r7   r+   r!   Ú
load_stateÚ
is_enabledr&   r0   r   Ú
splitlinesr   ÚexistsÚget_interval_hoursÚget_stale_after_daysÚget_archive_after_daysÚget_consolidateÚcurated_reportr4   Ú
setdefaultÚappendr/   ÚjoinÚsorted)Úargsr7   r!   rK   Úenabledr8   Úlast_runÚsummaryÚrunsÚstatus_lineÚfirstÚrestÚlineÚ_reportÚsuffixÚ_ihÚ_interval_labelÚrowsÚby_staterL   Úagent_countÚbundled_countr(   Ú
state_nameÚprovÚbucketrH   ÚlastÚ
active_allÚmost_activeÚleast_actives                                  r   Ú_cmd_statusr�   D   s£  € ØÐÐÐÐÐØ!Ð!Ð!Ð!Ð!Ð!à×ÒÑ Ô €EØ× Ò Ñ"Ô"€GØ�YŠY�x Ñ'Ô'€FØ�yŠy˜Ñ'Ô'€HØ�iŠiÐ*Ñ+Ô+Ð7¨x€GØ�9Š9�[ !Ñ$Ô$€Dð ð 	 Vð 	ˆ	ˆ	Øð 	ˆˆØð õ
 
Ð
#�kÐ
#Ð
#Ñ$Ô$Ð$Ý	Ð
%˜tÐ
%Ð
%Ñ&Ô&Ð&Ý	Ð
2�w xÑ0Ô0Ð
2Ð
2Ñ3Ô3Ð3ð ˆw€€Ø×)Ò)Ñ+Ô+ˆˆ�ÝÐ* 5Ð*Ð*Ñ+Ô+Ð+Øð 	/ð 	/ˆDÝÐ- tÐ-Ð-Ñ.Ô.Ð.Ð.ð	/õ 	Ð, 7Ð,Ð,Ñ-Ô-Ð-Ø�iŠiÐ*Ñ+Ô+€GØð 6Ý˜G‘}”}×+Ò+Ñ-Ô-Ð?��°<ˆÝÐ4 7Ð4¨FÐ4Ð4Ñ5Ô5Ð5Ø
×
$Ò
$Ñ
&Ô
&€Cà ™8 qš=˜=¨S°BªY¨Yˆ3�"‰9ˆˆˆˆØˆYˆYˆYð õ 
Ð
6 _Ð
6Ð
6Ñ7Ô7Ð7Ý	Ð
G˜w×;Ò;Ñ=Ô=Ð
GÐ
GÐ
GÑHÔHÐHÝ	Ð
I˜w×=Ò=Ñ?Ô?Ð
IÐ
IÐ
IÑJÔJÐJÝ	ð	Y W×%<Ò%<Ñ%>Ô%>ÐI˜T˜TÀEð 	YØ×(Ò(Ñ*Ô*ÐVˆ2ˆ2Ð0Vð	Yð 	Yñô ð ð
 ×%Ò%Ñ'Ô'€DØð ÝÐ+Ñ,Ô,Ð,Ý Ñ"Ô"Ð"Øˆqà r°rÐ:Ð:€HØ€FØ€KØ€MØð 	ð 	ˆØ—U’U˜7 HÑ-Ô-ˆ
Ø×Ò˜J¨Ñ+Ô+×2Ò2°1Ñ5Ô5Ð5Ø�5Š5�‰?Œ?ð 	%Ø�MŠM˜!˜Fœ)Ñ$Ô$Ð$Ø�uŠu�\ 7Ñ+Ô+ˆØ�7Š?ˆ?Ø˜1ÑˆKˆKØ�YÒÐØ˜QÑˆMøå	ð D¥s¨4¡y¤yð Dð DØ'ðDð DØ3@ðDð Dð Dñ Eô Eð Eà5ð 3ð 3ˆ
Ø—’˜j¨"Ñ-Ô-ˆÝÐ1�:Ð1Ð1Ð1¥C¨¡K¤KÐ1Ð1Ñ2Ô2Ð2Ð2àð @ÝÐ>�3˜v™;œ;Ð>Ð>¨4¯9ª9°VÑ+<Ô+<Ð>Ð>Ñ?Ô?Ð?õ ÑÔÐõ
 Ø�Š�X˜rÑ"Ô"ØLÐLðñ ô ð 	€q€bô
€Fð ð ÝÐ0Ñ1Ô1Ð1Øð 		ð 		ˆAÝ˜1Ÿ5š5Ð!3Ñ4Ô4Ñ5Ô5ˆDÝð(�Q�v”YÐ&ð (ð (ØŸEšEÐ"2°AÑ6Ô6Ð=ð(ð (à—u’u˜[¨!Ñ,Ô,Ð3ð(ð (ð Ÿš˜l¨AÑ.Ô.Ð5ð(ð (ð Ÿ5š5 °Ñ2Ô2Ð9ð	(ð (ð
 "&ð(ð (ñô ð ð ð —’˜h¨Ñ+Ô+€JØñ "ÝØØYÐYØð
ñ 
ô 
ð ˆ1ˆ"ô	ˆð
 ð 	˜K¨œN×.Ò.Ð/?Ñ@Ô@ÐEÀAÈÒJÐJÝÐ*Ñ+Ô+Ð+Ø ð 	ð 	�Ý˜qŸušuÐ%7Ñ8Ô8Ñ9Ô9�Ýð,˜˜6œÐ*ð ,ð ,Ø !§¢Ð&6¸Ñ :Ô :ÐAð,ð ,àŸ5š5 ¨aÑ0Ô0Ð7ð,ð ,ð ŸEšE ,°Ñ2Ô2Ð9ð,ð ,ð  !Ÿušu ]°AÑ6Ô6Ð=ð	,ð ,ð
 &*ð,ð ,ñô ð ð õ ØØYÐYð
ñ 
ô 
ð ˆ1ˆ"ôˆð ð 	ÝÐ+Ñ,Ô,Ð,Ø!ð 	ð 	�Ý˜qŸušuÐ%7Ñ8Ô8Ñ9Ô9�Ýð,˜˜6œÐ*ð ,ð ,Ø !§¢Ð&6¸Ñ :Ô :ÐAð,ð ,àŸ5š5 ¨aÑ0Ô0Ð7ð,ð ,ð ŸEšE ,°Ñ2Ô2Ð9ð,ð ,ð  !Ÿušu ]°AÑ6Ô6Ð=ð	,ð ,ð
 &*ð,ð ,ñô ð ð ð ˆ1r*   c                óâ  — ddl m} |                     ¦   «         st          d¦  «         dS t	          t          | dd¦  «        ¦  «        }t	          t          | dd¦  «        ¦  «        }t	          t          | dd¦  «        ¦  «        p| }t	          t          | d	d¦  «        ¦  «        rd
nd }|rt          d¦  «         nt          d¦  «         |€#|                     ¦   «         st          d¦  «         d"d„}|                     ||||¬¦  «        }|                     di ¦  «        }|r•|r(t          d|                     dd¦  «        › d�¦  «         nkt          d|                     dd¦  «        › d|                     dd¦  «        › d|                     dd¦  «        › d|                     dd¦  «        › �¦  «         |st          d¦  «         |r!|rt          d ¦  «         nt          d!¦  «         dS )#Nr   r6   zAcurator: disabled via config; enable with `curator.enabled: true`r$   Údry_runFÚ
backgroundÚsynchronousÚconsolidateTz7curator: 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.Úmsgr   r
   r   c                ó$   — t          | ¦  «         d S ©N)r0   )r–   s    r   Ú_on_summaryz_cmd_run.<locals>._on_summaryí   s   € Ýˆc‰
Œ
ˆ
ˆ
ˆ
r*   )Ú
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=rJ   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   r
   r   )	rO   r7   rl   r0   ÚboolÚgetattrrr   Úrun_curator_reviewr&   )	rx   r7   Údryr“   r”   r•   r™   ÚresultÚautos	            r   Ú_cmd_runr¥   Õ   s•  € ØÐÐÐÐÐØ×ÒÑÔð ÝÐQÑRÔRÐRØˆqå
�w�t˜Y¨Ñ.Ô.Ñ
/Ô
/€CÝ•g˜d L°%Ñ8Ô8Ñ9Ô9€JÝ•w˜t ]°EÑ:Ô:Ñ;Ô;ÐMÀ:¸~€Kõ �w t¨]¸EÑBÔBÑCÔCÐM�$�$È€KØ
ð 1ÝÐGÑHÔHÐHÐHåÐ/Ñ0Ô0Ð0ØÐ 7×#:Ò#:Ñ#<Ô#<ÐÝðHñ	
ô 	
ð 	
ðð ð ð ð ×'Ò'ØØØØð	 (ñ ô €Fð �:Š:Ð(¨"Ñ-Ô-€DØð Øð 	Ýð8 4§8¢8¨I°qÑ#9Ô#9ð 8ð 8ð 8ñô ð ð õ
 ð< §¢¨)°QÑ!7Ô!7ð <ð <ØŸš .°!Ñ4Ô4ð<ð <à ŸHšH Z°Ñ3Ô3ð<ð <ð  $Ÿxšx¨°qÑ9Ô9ð<ð <ñô ð ð ð XÝÐVÑWÔWÐWØ
ð 
Øð 		Ýð[ñô ð ð õ
 ð[ñô ð ð ˆ1r*   c                óZ   — ddl m} |                     d¦  «         t          d¦  «         dS )Nr   r6   Tzcurator: paused©rO   r7   Ú
set_pausedr0   ©rx   r7   s     r   Ú
_cmd_pauserª     s<   € ØÐÐÐÐÐØ×Ò�tÑÔÐÝ	Ð
ÑÔÐØˆ1r*   c                óZ   — ddl m} |                     d¦  «         t          d¦  «         dS )Nr   r6   Fzcurator: resumedr§   r©   s     r   Ú_cmd_resumer¬     s<   € ØÐÐÐÐÐØ×Ò�uÑÔÐÝ	Ð
ÑÔÐØˆ1r*   c                óà   — ddl m} |                     | j        ¦  «        st	          d| j        › d�¦  «         dS |                     | j        d¦  «         t	          d| j        › d�¦  «         dS )	Nr   r    ú
curator: 'u`   ' is bundled or hub-installed â€” cannot pin (only agent-created skills participate in curation)r$   Tzcurator: pinned 'z ' (will bypass auto-transitions)©r+   r!   Úis_agent_createdÚskillr0   Ú
set_pinned©rx   r!   s     r   Ú_cmd_pinr´   "  sš   € Ø!Ð!Ð!Ð!Ð!Ð!Ø×'Ò'¨¬
Ñ3Ô3ð ÝðB˜œð Bð Bð Bñ	
ô 	
ð 	
ð ˆqØ×Ò˜4œ: tÑ,Ô,Ð,Ý	Ð
J˜dœjÐ
JÐ
JÐ
JÑKÔKÐKØˆ1r*   c                óà   — ddl m} |                     | j        ¦  «        st	          d| j        › d�¦  «         dS |                     | j        d¦  «         t	          d| j        › d�¦  «         dS )	Nr   r    r®   ue   ' is bundled or hub-installed â€” there's nothing to unpin (curator only tracks agent-created skills)r$   Fzcurator: unpinned 'ú'r¯   r³   s     r   Ú
_cmd_unpinr·   /  sš   € Ø!Ð!Ð!Ð!Ð!Ð!Ø×'Ò'¨¬
Ñ3Ô3ð ÝðR˜œð Rð Rð Rñ	
ô 	
ð 	
ð ˆqØ×Ò˜4œ: uÑ-Ô-Ð-Ý	Ð
- ¤
Ð
-Ð
-Ð
-Ñ.Ô.Ð.Øˆ1r*   c                óÐ  — ddl m} |                     ¦   «         }|st          d¦  «         dS t          dt	          |¦  «        › d�¦  «         t          |d„ ¬¦  «        D ]v}|                     d¦  «        rd	nd
}t          |                     d¦  «        ¦  «        }t          d|d         d›d|                     dd¦  «        d›d|d›d|› d�	¦  «         Œwt          d¦  «         dS )z¶List curation-eligible skills that carry no provenance marker.

    The same population `status` summarizes, itemized. Useful before deciding
    what to hand over with `adopt`.
    r   r    u@   curator: no unmanaged skills â€” every eligible skill is managedzunmanaged skills (z):c                ó   — | d         S ©NrM   © )Úxs    r   rZ   z%_cmd_list_unmanaged.<locals>.<lambda>J  s
   € ¨¨&¬	€ r*   r[   r#   zcreated_by:nullz	no markerrW   rS   rM   Ú44sz
 activity=r_   Ú4drd   Ú14sz  (rR   za
adopt one with `hermes curator adopt <name>`, or all with `hermes curator adopt --all-unmanaged`)r+   r!   r,   r0   r/   rw   r&   r   )rx   r!   r…   r(   ÚwhyrŒ   s         r   Ú_cmd_list_unmanagedrÁ   <  sM  € ð "Ð!Ð!Ð!Ð!Ð!à×'Ò'Ñ)Ô)€DØð ÝÐPÑQÔQÐQØˆqå	Ð
,�s 4™yœyÐ
,Ð
,Ð
,Ñ-Ô-Ð-Ý�DÐ1Ð1Ð2Ñ2Ô2ð 
ð 
ˆØ#$§5¢5Ð)=Ñ#>Ô#>ÐOÐÐÀKˆÝ�q—u’uÐ/Ñ0Ô0Ñ1Ô1ˆÝð��6”Ð!ð ð ØŸšÐ.°Ñ2Ô2Ð9ðð à!Ð)ðð ð ðð ð ñ	
ô 	
ð 	
ð 	
õ 
ð ?ñ @ô @ð @àˆ1r*   c                óD  — ddl m} t          t          | dd¦  «        pg ¦  «        }t	          t          | dd¦  «        ¦  «        }|r:|rt          d¦  «         dS |                     ¦   «         }|st          d	¦  «         dS |st          d
¦  «         dS t	          t          | dd¦  «        ¦  «        }|r9t          dt          |¦  «        › d�¦  «         |D ]}t          d|› �¦  «         ŒdS |r°t	          t          | dd¦  «        ¦  «        s’t          dt          |¦  «        › d�¦  «         t          d¦  «         	 t          d¦  «         	                    ¦   «          
                    ¦   «         }n# t          t          f$ r d}Y nw xY w|dvrt          d¦  «         dS d}|D ]3}|                     |¦  «        \  }}	t          d|	› �¦  «         |s|dz  }Œ4t          |¦  «        dk    r2t          dt          |¦  «        |z
  › dt          |¦  «        › �¦  «         |rdndS )u¶  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 (the agent edits
    user-written skills on the user's behalf constantly). So adoption is never
    automatic â€” the user names what they're handing over, or passes
    ``--all-unmanaged`` to hand over every eligible skill at once.
    r   r    r±   NÚall_unmanagedFz=curator: pass either skill names or --all-unmanaged, not bothr$   z%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  + Úyeszcurator: adopt z, unmanaged skill(s) into curator management?z9  they become eligible for automatic staleness + archivalz  proceed? [y/N] rB   >   ÚyrÄ   úcurator: abortedr?   zcurator: adopted ú/)r+   r!   Úlistr    rŸ   r0   Úlist_unmanaged_skill_namesr/   ÚinputÚstripÚlowerÚEOFErrorÚKeyboardInterruptÚadopt_skill)
rx   r!   ÚnamesÚ	adopt_allr’   ÚnÚreplyÚfailedÚokr–   s
             r   Ú
_cmd_adoptrÖ   X  s’  € ð "Ð!Ð!Ð!Ð!Ð!å•˜˜w¨Ñ-Ô-Ð3°Ñ4Ô4€EÝ•W˜T ?°EÑ:Ô:Ñ;Ô;€IØð Øð 	ÝÐQÑRÔRÐRØ�1Ø×6Ò6Ñ8Ô8ˆØð 	ÝÐ9Ñ:Ô:Ð:Ø�1Øð ÝÐGÑHÔHÐHØˆqå•7˜4 ¨EÑ2Ô2Ñ3Ô3€GØð ÝÐF¥c¨%¡j¤jÐFÐFÐFÑGÔGÐGØð 	ð 	ˆAÝ�*˜�*�*ÑÔÐÐØˆqð ð 	��g d¨E°5Ñ9Ô9Ñ:Ô:ð 	ÝÐX¥ E¡
¤
ÐXÐXÐXÑYÔYÐYÝÐIÑJÔJÐJð	ÝÐ-Ñ.Ô.×4Ò4Ñ6Ô6×<Ò<Ñ>Ô>ˆEˆEøÝÕ+Ð,ð 	ð 	ð 	ØˆEˆEˆEð	øøøà˜Ð$Ð$ÝÐ$Ñ%Ô%Ð%Ø�1à€FØð ð ˆØ×)Ò)¨!Ñ,Ô,‰ˆˆCÝÐ˜#ÐÐÑ Ô Ð Øð 	Ø�a‰KˆFøÝ
ˆ5�z„z�A‚~€~ÝÐD¥# e¡*¤*¨vÑ"5ÐDÐD½¸E¹
¼
ÐDÐDÑEÔEÐEØÐˆ1ˆ1˜AÐs   Ä=3E1 Å1FÆFc                óx   — ddl m} |                     | j        ¦  «        \  }}t	          d|› �¦  «         |rdndS )Nr   r    r?   r$   )r+   r!   Úrestore_skillr±   r0   ©rx   r!   rÕ   r–   s       r   Ú_cmd_restorerÚ   �  sR   € Ø!Ð!Ð!Ð!Ð!Ð!Ø×'Ò'¨¬
Ñ3Ô3�G€BˆÝ	Ð
�cÐ
Ð
ÑÔÐØˆ>ˆ1ˆ1˜Ðr*   c                ó  — ddl m} |                     | j        ¦  «                             d¦  «        r"t          d| j        › d| j        › d�¦  «         dS |                     | j        ¦  «        \  }}t          d|› �¦  «         |rdndS )	zÕManually archive an agent-created skill. Refuses if pinned.

    The auto-curator archives stale skills on its own schedule; this verb is
    for the user who wants to archive *now* without waiting for a run.
    r   r    rL   r®   u7   ' is pinned â€” unpin first with `hermes curator unpin ú`r$   r?   )r+   r!   Ú
get_recordr±   r&   r0   Úarchive_skillrÙ   s       r   Ú_cmd_archiverß   —  sº   € ð "Ð!Ð!Ð!Ð!Ð!Ø×Ò˜dœjÑ)Ô)×-Ò-¨hÑ7Ô7ð Ýð3˜œð 3ð 3Ø%)¤Zð3ð 3ð 3ñ	
ô 	
ð 	
ð ˆqØ×'Ò'¨¬
Ñ3Ô3�G€BˆÝ	Ð
�cÐ
Ð
ÑÔÐØˆ>ˆ1ˆ1˜Ðr*   ÚrecordÚdictúOptional[int]c                óŠ  — |                       d¦  «        p|                       d¦  «        }|sdS 	 t          j        t          |¦  «        ¦  «        }n# t          t
          f$ r Y dS w xY w|j        € |                     t          j	        ¬¦  «        }t          dt          j        t          j	        ¦  «        |z
  j        ¦  «        S )u  Days since the skill's last activity (view / use / patch).

    Falls back to ``created_at`` so a skill that was authored but never used
    can still be pruned â€” otherwise never-touched skills would be immortal.
    Returns None only when both fields are missing or unparseable.
    rW   rX   Nr   r   )r&   r   r   r   r   r   r   r   r   r   Úmaxr   Údays)rà   r   r   s      r   Ú
_idle_daysræ   ©  s¹   € ð 
�ŠÐ&Ñ	'Ô	'Ð	C¨6¯:ª:°lÑ+CÔ+C€BØð ØˆtðÝÔ#¥C¨¡G¤GÑ,Ô,ˆˆøÝ•zÐ"ð ð ð Øˆtˆtðøøøà	„yÐØ�ZŠZ�xœ|ˆZÑ,Ô,ˆÝˆq•8”<¥¤Ñ-Ô-°Ñ2Ô8Ñ9Ô9Ð9s   °!A ÁA'Á&A'c                ó8  — ddl m} t          | dd¦  «        }|dk     r!t          d|› d�t          j        ¬¦  «         d	S t          t          | d
d¦  «        ¦  «        }t          t          | dd¦  «        ¦  «        }g }|                     ¦   «         D ]l}|                     d¦  «        rŒ|                     d¦  «        |j	        k    rŒ7t          |¦  «        }|�||k     rŒO|                     |d         |f¦  «         Œm|st          d|› d�¦  «         dS |                     d„ ¬¦  «         t          dt          |¦  «        › d|› d�¦  «         |D ]\  }}t          d|d›d|› d�¦  «         Œ|rt          d¦  «         dS |s‚	 t          dt          |¦  «        › d�¦  «                             ¦   «                              ¦   «         }	n'# t"          t$          f$ r t          d¦  «         Y dS w xY w|	d vrt          d!¦  «         dS d}
g }|D ]<\  }}|                     |¦  «        \  }}|r|
dz  }
Œ%|                     ||f¦  «         Œ=t          d"|
› d#t          |¦  «        › �¦  «         |r.t          d$¦  «         |D ]\  }}t          d|› d%|› �¦  «         ŒdS dS )&a  Bulk-archive curator-managed skills idle for >= N days.

    Pinned skills are exempt. Already-archived skills are skipped. Default
    ``--days 90`` matches a conservative read of the curator's own archive
    threshold; adjust with ``--days``. Use ``--dry-run`` to preview.
    r   r    rå   éZ   r$   z"curator: --days must be >= 1 (got rR   )Úfileé   r’   FrÄ   rL   rK   NrM   z6curator: nothing to prune (no unpinned skills idle >= zd)c                ó   — | d          S )Nr$   r»   )Úcs    r   rZ   z_cmd_prune.<locals>.<lambda>Û  s   €  1 Q¤4 %€ r*   r[   r?   z skill(s) idle >= zd:rS   r^   z idle rD   u   
(dry run â€” no changes made)z	
Archive z skill(s)? [y/N] z
curator: aborted>   rÅ   rÄ   rÆ   z
curator: archived rÇ   z	failures:z: )r+   r!   r    r0   ÚsysÚstderrrŸ   rs   r&   ÚSTATE_ARCHIVEDræ   ru   Úsortr/   rÊ   rË   rÌ   rÍ   rÎ   rÞ   )rx   r!   rå   r’   Úskip_confirmÚ
candidatesr(   ÚidlerM   rÓ   rJ   ÚfailuresÚ_rÕ   r–   s                  r   Ú
_cmd_prunerö   ¼  sG  € ð "Ð!Ð!Ð!Ð!Ð!Ý�4˜ Ñ$Ô$€DØˆa‚x€xÝÐ:°4Ð:Ð:Ð:ÅÄÐLÑLÔLÐLØˆqå•7˜4 ¨EÑ2Ô2Ñ3Ô3€GÝ�  e¨UÑ3Ô3Ñ4Ô4€Là€JØ×'Ò'Ñ)Ô)ð -ð -ˆØ�5Š5�‰?Œ?ð 	ØØ�5Š5�‰>Œ>˜[Ô7Ò7Ð7ØÝ˜!‰}Œ}ˆØˆ<˜4 $š;˜;ØØ×Ò˜1˜Vœ9 dÐ+Ñ,Ô,Ð,Ð,àð ÝÐOÀtÐOÐOÐOÑPÔPÐPØˆqà‡O‚O˜˜€OÑ(Ô(Ð(Ý	Ð
A•c˜*‘o”oÐ
AÐ
A¸Ð
AÐ
AÐ
AÑBÔBÐBØ ð ,ð ,‰
ˆˆdÝÐ*�4Ð*Ð*Ð* 4Ð*Ð*Ð*Ñ+Ô+Ð+Ð+àð ÝÐ/Ñ0Ô0Ð0Øˆqàð ð	ÝÐI¥s¨:¡¤ÐIÐIÐIÑJÔJ×PÒPÑRÔR×XÒXÑZÔZˆEˆEøÝÕ+Ð,ð 	ð 	ð 	ÝÐ&Ñ'Ô'Ð'Ø�1�1ð	øøøð ˜Ð$Ð$ÝÐ$Ñ%Ô%Ð%Ø�1à€HØ€HØð )ð )‰ˆˆaØ×+Ò+¨DÑ1Ô1‰ˆˆCØð 	)Ø˜‰MˆHˆHà�OŠO˜T 3˜KÑ(Ô(Ð(Ð(å	Ð
= Ð
=Ð
=­C°
©O¬OÐ
=Ð
=Ñ>Ô>Ð>Øð ÝˆkÑÔÐØ!ð 	&ð 	&‰IˆD�#ÝÐ$�tÐ$Ð$˜sÐ$Ð$Ñ%Ô%Ð%Ð%ØˆqØˆ1s   ÆAG	 Ç	 G-Ç,G-c                ó  — ddl m} |                     ¦   «         st          d¦  «         dS t	          | dd¦  «        pd}|                     |¬¦  «        }|€t          d	¦  «         dS t          d
|j        › �¦  «         dS )zuTake a manual snapshot of the skills tree. Same mechanism as the
    automatic pre-run snapshot, just user-initiated.r   ©Úcurator_backupzacurator: backups are disabled via config (`curator.backup.enabled: false`); re-enable to snapshotr$   ÚreasonNÚmanual)rú   uE   curator: snapshot failed â€” check logs (backup disabled or IO error)z?curator: snapshot created at ~/.hermes/skills/.curator_backups/)rO   rù   rl   r0   r    Úsnapshot_skillsrM   )rx   rù   rú   Úsnaps       r   Ú_cmd_backuprþ      s¬   € ð %Ð$Ð$Ð$Ð$Ð$Ø×$Ò$Ñ&Ô&ð ÝðGñ	
ô 	
ð 	
ð ˆqÝ�T˜8 TÑ*Ô*Ð6¨h€FØ×)Ò)°Ð)Ñ8Ô8€DØ€|ÝÐUÑVÔVÐVØˆqÝ	Ð
WÈDÌIÐ
WÐ
WÑXÔXÐXØˆ1r*   c                óÞ  — ddl m} t          | dd¦  «        r#t          |                     ¦   «         ¦  «         dS t          | dd¦  «        }|                     |¦  «        }|€|                     ¦   «         }|st          d¦  «         nWt          d|rd	t          |¦  «        z   nd
› d�¦  «         t          d¦  «         t          |                     ¦   «         ¦  «         dS |                     |¦  «        }t          d|j	        › �¦  «         |�rt          d| 
                    dd¦  «        › �¦  «         t          d| 
                    dd¦  «        › �¦  «         t          d| 
                    dd¦  «        › �¦  «         | 
                    d¦  «        pi }t          |t          ¦  «        rf| 
                    d¦  «        r(t          d| 
                    dd¦  «        › d�¦  «         n)| 
                    dd¦  «        }t          d|› d�¦  «         t          d¦  «         t          | dd¦  «        sq	 t          d ¦  «                             ¦   «                              ¦   «         }n'# t           t"          f$ r t          d!¦  «         Y dS w xY w|d"vrt          d#¦  «         dS |                     |j	        ¬$¦  «        \  }	}
}|	rt          d%|
› �¦  «         dS t          d&|
› �¦  «         dS )'a7  Restore the skills tree from a snapshot. Defaults to newest.

    ``--list`` prints available snapshots and exits. ``--id <stamp>`` picks
    a specific one. Without ``-y``, prompts for confirmation. A safety
    snapshot of the current tree is always taken first, so rollbacks are
    themselves undoable.
    r   rø   rÈ   FÚ	backup_idNzhcurator: 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:r$   zRollback target: z  reason:      rú   ú?z  created_at:  rX   z  skill files: Úskill_filesÚ	cron_jobsÚ	backed_upz  cron jobs:   Ú
jobs_countz. (will be restored for skill-link fields only)znot capturedz   cron jobs:   not in snapshot (rR   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.rÄ   zProceed? [y/N] z

cancelled>   rÅ   rÄ   Ú	cancelled)r   r?   u   curator: rollback failed â€” )rO   rù   r    r0   Úsummarize_backupsÚ_resolve_backupÚlist_backupsÚreprÚ_read_manifestrM   r&   Ú
isinstancerá   rÊ   rË   rÌ   rÍ   rÎ   Úrollback)rx   rù   r   Útarget_pathr…   ÚmanifestÚcronrú   ÚansrÕ   r–   rõ   s               r   Ú_cmd_rollbackr    s}  € ð %Ð$Ð$Ð$Ð$Ð$åˆt�V˜UÑ#Ô#ð Ýˆn×.Ò.Ñ0Ô0Ñ1Ô1Ð1Øˆqå˜˜k¨4Ñ0Ô0€IØ ×0Ò0°Ñ;Ô;€KØÐØ×*Ò*Ñ,Ô,ˆØð 	6ÝðLñô ð ð õ
 ðMØ.7ÐI�5�4 	™?œ?Ñ*Ð*¸\ðMð Mð Mñô ð õ �,ÑÔÐÝ�.×2Ò2Ñ4Ô4Ñ5Ô5Ð5Øˆqà×,Ò,¨[Ñ9Ô9€HÝ	Ð
0˜kÔ.Ð
0Ð
0Ñ1Ô1Ð1Øñ DÝÐ= §¢¨X°sÑ ;Ô ;Ð=Ð=Ñ>Ô>Ð>ÝÐA §¢¨\¸3Ñ ?Ô ?ÐAÐAÑBÔBÐBÝÐB §¢¨]¸CÑ @Ô @ÐBÐBÑCÔCÐCØ�|Š|˜KÑ(Ô(Ð.¨BˆÝ�d�DÑ!Ô!ð 	DØ�xŠx˜Ñ$Ô$ð DÝðE d§h¢h¨|¸QÑ&?Ô&?ð Eð Eð Eñô ð ð ð
 Ÿš (¨NÑ;Ô;�ÝÐB¸ÐBÐBÐBÑCÔCÐCÝ	ð	Lñô ð õ �4˜ Ñ&Ô&ð ð	ÝÐ)Ñ*Ô*×0Ò0Ñ2Ô2×8Ò8Ñ:Ô:ˆCˆCøÝÕ+Ð,ð 	ð 	ð 	Ý�-Ñ Ô Ð Ø�1�1ð	øøøð �lÐ"Ð"Ý�+ÑÔÐØ�1à×(Ò(°;Ô3CÐ(ÑDÔD�J€BˆˆQØ	ð ÝÐ˜#ÐÐÑ Ô Ð ØˆqÝ	Ð
/¨#Ð
/Ð
/Ñ0Ô0Ð0Øˆ1s   È63I* É* JÊJc                óˆ   — ddl m} |                     ¦   «         }|st          d¦  «         dS |D ]}t          |¦  «         ŒdS )z#List archived (recoverable) skills.r   r    zcurator: no archived skills)r+   r!   Úlist_archived_skill_namesr0   )rx   r!   rÐ   rM   s       r   Ú_cmd_list_archivedr  \  sb   € à!Ð!Ð!Ð!Ð!Ð!Ø×1Ò1Ñ3Ô3€EØð ÝÐ+Ñ,Ô,Ð,ØˆqØð ð ˆÝˆd‰ŒˆˆØˆ1r*   c                óî  ‡— ddl }ddlm} |                     ¦   «         }t	          | dd¦  «        Š‰rˆfd„|D ¦   «         }t	          | dd¦  «        }|dk    r|                     d	„ ¬
¦  «         n7|dk    r|                     d„ d¬¦  «         n|                     d„ d¬¦  «         t	          | dd¦  «        r't          |                     |dd¬¦  «        ¦  «         dS |st          d¦  «         dS ddddœ}|D ]F}|                     |                     dd¦  «        d¦  «        dz   ||                     dd¦  «        <   ŒGt          dt          |¦  «        › d|d         › d|d         › d|d         › d�	¦  «         t          ¦   «          t          dd d!›dd"d#›dd$d%›dd&d%›dd'd(›dd)d%›d*�¦  «         |D ]À}t          |                     d+¦  «        ¦  «        }t          d|d         dd,…         d!›d|                     dd¦  «        d#›d|                     d-d¦  «        d.›d|                     d/d¦  «        d.›d|                     d0d¦  «        d1›d|                     d2d¦  «        d.›d|› �¦  «         ŒÁdS )3u  Show usage telemetry for ALL skills, with provenance.

    Unlike `status` (curator-scoped to curated candidates), this lists
    every skill on disk â€” bundled built-ins and hub-installed included â€” so you
    can see how often each is actually used regardless of curation.
    r   Nr    rN   c                óF   •— g | ]}|                      d ¦  «        ‰k    ¯|‘ŒS )rN   r%   )r'   r(   Úprov_filters     €r   ú
<listcomp>z_cmd_usage.<locals>.<listcomp>v  s/   ø€ ÐFÐFÐF�a 1§5¢5¨Ñ#6Ô#6¸+Ò#EÐ#E�Ð#EÐ#EÐ#Er*   rð   ÚactivityrM   c                ó   — | d         S rº   r»   rY   s    r   rZ   z_cmd_usage.<locals>.<lambda>z  s
   €   &¤	€ r*   r[   Úrecentc                ó0   — |                       d¦  «        pdS )NrW   rB   r%   rY   s    r   rZ   z_cmd_usage.<locals>.<lambda>}  s   €  §¢Ð&8Ñ 9Ô 9Ð ?¸R€ r*   Trh   c                ó.   — |                       dd¦  «        S )Nr_   r   r%   rY   s    r   rZ   z_cmd_usage.<locals>.<lambda>  s   €  §¢Ð&6¸Ñ :Ô :€ r*   ÚjsonFrê   )ÚindentÚensure_asciizcurator: no skills found©rO   rP   ÚhubrO   r$   zskills: z total  (agent=rQ   rP   z  hub=r$  rR   rS   r±   r^   ÚoriginÚ8sÚusez>4sÚviewÚpatchz>5sÚactz  last_activityrW   é(   ra   z>4drb   rc   z>5dr_   )r   r+   r!   Úusage_reportr    rð   r0   Údumpsr&   r/   r   )	rx   Ú_jsonr!   r…   Úsort_keyÚcountsr(   rŒ   r  s	           @r   Ú
_cmd_usager1  h  s©  ø€ ð ÐÐÐØ!Ð!Ð!Ð!Ð!Ð!à×#Ò#Ñ%Ô%€Då˜$ ¨dÑ3Ô3€KØð GØFÐFÐFÐF˜4ÐFÑFÔFˆå�t˜V ZÑ0Ô0€HØ�6ÒÐØ�	Š	Ð)Ð)ˆ	Ñ*Ô*Ð*Ð*Ø	�XÒ	Ð	à�	Š	Ð?Ð?Èˆ	ÑNÔNÐNÐNà�	Š	Ð:Ð:ÀDˆ	ÑIÔIÐIåˆt�V˜UÑ#Ô#ð Ýˆe�kŠk˜$ q°uˆkÑ=Ô=Ñ>Ô>Ð>Øˆqàð ÝÐ(Ñ)Ô)Ð)Øˆqð  Q¨qÐ1Ð1€FØð _ð _ˆØ/5¯zªz¸!¿%º%ÀÈgÑ:VÔ:VÐXYÑ/ZÔ/ZÐ]^Ñ/^ˆˆq�uŠu�\ 7Ñ+Ô+Ñ,Ð,Ý	ð	W•3�t‘9”9ð 	Wð 	WØ˜”/ð	Wð 	WØ-3°IÔ->ð	Wð 	WØFLÈUÄmð	Wð 	Wð 	Wñô ð õ 
�G„G€GÝ	ð	PˆWÐ+ð 	Pð 	P˜HÐ+ð 	Pð 	PØÐOð	Pð 	PØÐOð	Pð 	PØ&-ÐOð	Pð 	PØ5:ÐOð	Pð 	Pð 	Pñô ð ð ð 

ð 

ˆÝ�q—u’uÐ/Ñ0Ô0Ñ1Ô1ˆÝð��6”˜3˜B˜3”Ð'ð ð Ø�uŠu�\ 7Ñ+Ô+Ð2ðð à�uŠu�[ !Ñ$Ô$Ð,ðð ð �uŠu�\ 1Ñ%Ô%Ð-ðð ð �uŠu�] AÑ&Ô&Ð.ð	ð ð
 �uŠuÐ% qÑ)Ô)Ð1ðð ð ðð ñ	
ô 	
ð 	
ð 	
ð ˆ1r*   Úparentúargparse.ArgumentParserc                ót
  ‡ — ‰                       ˆ fd„¬¦  «         ‰                      d¬¦  «        }|                     dd¬¦  «        }|                      t          ¬¦  «         |                     dd	¬¦  «        }|                     d
ddd¬¦  «         |                     dddd¬¦  «         |                     ddd¬¦  «         |                      t
          ¬¦  «         |                     dd¬¦  «        }|                     ddddd¬¦  «         |                     dddd ¬¦  «         |                     d!d"dd#¬¦  «         |                     d$d%dd&¬¦  «         |                      t          ¬¦  «         |                     d'd(¬¦  «        }|                      t          ¬¦  «         |                     d)d*¬¦  «        }|                      t          ¬¦  «         |                     d+d,¬¦  «        }|                     d-d.¬¦  «         |                      t          ¬¦  «         |                     d/d0¬¦  «        }|                     d-d.¬¦  «         |                      t          ¬¦  «         |                     d1d2¬¦  «                              t          ¬¦  «         |                     d3d4¬¦  «        }	|	                     d-d5d6¬7¦  «         |	                     d8dd9¬¦  «         |	                     d!dd:¬¦  «         |	                     d;dd<¬¦  «         |	                      t          ¬¦  «         |                     d=d>¬¦  «        }
|
                     d-d.¬¦  «         |
                      t          ¬¦  «         |                     d?d@¬¦  «                              t          ¬¦  «         |                     dAdB¬¦  «        }|                     d-d.¬¦  «         |                      t          ¬¦  «         |                     dCdD¬¦  «        }|                     dEt           dFdG¬H¦  «         |                     dId;ddJ¬¦  «         |                     d!d"ddK¬¦  «         |                      t"          ¬¦  «         |                     dLdM¬¦  «        }|                     dNddO¬P¦  «         |                      t$          ¬¦  «         |                     dQdR¬¦  «        }|                     dSddT¬¦  «         |                     dUdVddW¬X¦  «         |                     dId;ddY¬¦  «         |                      t&          ¬¦  «         dS )Zz™Attach `curator` subcommands to *parent*.

    main.py calls this with the ArgumentParser returned by
    ``subparsers.add_parser("curator", ...)``.
    c                ó<   •— ‰                      ¦   «         dfd         S )Nr   r$   )Ú
print_help)Úar2  s    €r   rZ   zregister_cli.<locals>.<lambda>®  s   ø€ ¨×(9Ò(9Ñ(;Ô(;¸QÐ'?ÀÔ'B€ r*   )ÚfuncÚcurator_command)ÚdestÚstatusz#Show curator status and skill stats)ÚhelpÚusagezJShow usage telemetry for ALL skills (built-in, hub, agent) with provenancez--sort)r  r  rM   r  zlSort order: activity (most-used first, default), recent (most-recently-active first), or name (alphabetical))ÚchoicesÚdefaultr<  z--provenancer#  NzOnly show skills of this originz--jsonÚ
store_truez/Emit the full report as JSON instead of a table)Úactionr<  ÚrunzTrigger a curator review nowz--syncz--synchronousr”   z@Wait for the LLM review pass to finish (default for manual runs))r:  rA  r<  z--backgroundr“   zGStart the LLM review pass in a background thread and return immediatelyz	--dry-runr’   uk   Report only â€” no state changes, no archives, no consolidation (use this to preview what curator would do)z--consolidater•   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 itr±   z
Skill nameÚ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<  z--all-unmanagedzAAdopt every curation-eligible skill that has no provenance markerz3List what would be adopted without writing anythingz--yesz0Skip 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)ÚprunezCBulk-archive curator-managed skills idle for >= N days (default 90)z--daysrè   z5Archive skills idle for at least N days (default: 90))Útyper?  r<  z-yzSkip the confirmation promptz,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'))r?  r<  r  zJRestore ~/.hermes/skills/ from a curator snapshot (defaults to the newest)z--listz3List available snapshots and exit without restoringz--idr   z6Snapshot id to restore (see `--list`); default: newest)r:  r?  r<  zSkip confirmation prompt)Úset_defaultsÚadd_subparsersÚ
add_parserr�   Úadd_argumentr1  r¥   rª   r¬   r´   r·   rÁ   rÖ   rÚ   r  rß   r   rö   rþ   r  )r2  ÚsubsÚp_statusÚp_usageÚp_runÚp_pauseÚp_resumeÚp_pinÚp_unpinÚp_adoptÚ	p_restoreÚ	p_archiveÚp_pruneÚp_backupÚ
p_rollbacks   `              r   Úregister_clira  ¨  sh  ø€ ð ×ÒÐBÐBÐBÐBÐÑCÔCÐCØ× Ò Ð&7Ð Ñ8Ô8€Dà�Š˜xÐ.SˆÑTÔT€HØ×Ò�{ÐÑ+Ô+Ð+à�oŠoØØYð ñ ô €Gð ×ÒØÐ8À*ðDð ñ ô ð ð
 ×ÒØÐ ;ÀTØ.ð ñ ô ð ð ×ÒØ˜Ø>ð ñ ô ð ð ×Ò�jÐÑ)Ô)Ð)à�OŠO˜EÐ(FˆOÑGÔG€EØ	×ÒØ�/¨¸lØOð ñ ô ð ð 
×ÒØ˜\°,ØVð ñ ô ð ð 
×ÒØ˜)¨Lð;ð ñ ô ð ð
 
×ÒØ˜m°LðLð ñ ô ð ð 
×Ò�HÐÑ%Ô%Ð%à�oŠo˜gÐ,MˆoÑNÔN€GØ×Ò�jÐÑ)Ô)Ð)à�Š˜xÐ.GˆÑHÔH€HØ×Ò�{ÐÑ+Ô+Ð+à�OŠO˜EÐ(^ˆOÑ_Ô_€EØ	×Ò�w \ÐÑ2Ô2Ð2Ø	×Ò�HÐÑ%Ô%Ð%à�oŠo˜g¨OˆoÑ<Ô<€GØ×Ò˜ |ÐÑ4Ô4Ð4Ø×Ò�jÐÑ)Ô)Ð)à‡O‚OØØFð ñ ô ÷ ‚lÕ+€lÑ,Ô,Ð,à�oŠoØØVð ñ ô €Gð ×ÒØ�sØGð ñ ô ð ð ×ÒØ ,ØPð ñ ô ð ð ×ÒØ˜LØBð ñ ô ð ð ×ÒØ˜Ø?ð ñ ô ð ð ×Ò�jÐÑ)Ô)Ð)à—’ 	Ð0K�ÑLÔL€IØ×Ò˜7¨ÐÑ6Ô6Ð6Ø×Ò¥ÐÑ-Ô-Ð-à‡O‚O�OÐ*@€OÑAÔAß	ŠÕ-ˆÑ	.Ô	.Ð	.à—’ØØQð  ñ ô €Ið ×Ò˜7¨ÐÑ6Ô6Ð6Ø×Ò¥ÐÑ-Ô-Ð-à�oŠoØØRð ñ ô €Gð ×ÒØ•s BØDð ñ ô ð ð ×ÒØˆg˜lØ+ð ñ ô ð ð ×ÒØ˜)¨LØ;ð ñ ô ð ð ×Ò�jÐÑ)Ô)Ð)à�ŠØðLð ñ ô €Hð
 ×ÒØ˜DØJð ñ ô ð ð ×Ò�{ÐÑ+Ô+Ð+à—’Øð(ð !ñ ô €Jð
 ×ÒØ˜ØBð ñ ô ð ð ×ÒØ�[¨$ØEð ñ ô ð ð ×ÒØˆg˜lØ'ð ñ ô ð ð ×Ò¥ÐÑ/Ô/Ð/Ð/Ð/r*   c                óú   — t          j        d¬¦  «        }t          |¦  «         |                     | ¦  «        }t	          |dd¦  «        }|€|                     ¦   «          dS t           ||¦  «        pd¦  «        S )z>Standalone entry (also usable by hermes_cli.main fallthrough).zhermes curator)Úprogr8  Nr   )ÚargparseÚArgumentParserra  Ú
parse_argsr    r6  r   )ÚargvÚparserrx   Úfns       r   Úcli_mainrj  E  s~   € åÔ$Ð*:Ð;Ñ;Ô;€FÝ�ÑÔÐØ×Ò˜TÑ"Ô"€DÝ	��v˜tÑ	$Ô	$€BØ	€zØ×ÒÑÔÐØˆqÝˆrˆr�$‰xŒxˆ}˜1ÑÔÐr*   Ú__main__)r   r	   r
   r   )r
   r   )r
   r   )rà   rá   r
   râ   )r2  r3  r
   r   r˜   )!Ú__doc__Ú
__future__r   rd  rí   r   r   Úpathlibr   Útypingr   r   r4   r�   r¥   rª   r¬   r´   r·   rÁ   rÖ   rÚ   rß   ræ   rö   rþ   r  r  r1  ra  rj  Ú__name__Úexitr»   r*   r   ú<module>rr     sP  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø 
€
€
€
Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ð#ð #ð #ð #ð(ð ð ð ð:Nð Nð Nð Nðb<ð <ð <ð <ð~ð ð ð ðð ð ð ð
ð 
ð 
ð 
ð
ð 
ð 
ð 
ðð ð ð ð85ð 5ð 5ð 5ðpð ð ð ðð ð ð ð$:ð :ð :ð :ð&Að Að Að AðHð ð ð ð&Fð Fð Fð FðR	ð 	ð 	ð 	ð9ð 9ð 9ð 9ð@Z0ð Z0ð Z0ð Z0ðz	ð 	ð 	ð 	ð 	ð ˆzÒÐØ€C„HˆXˆX‰ZŒZÑÔÐÐÐð Ðr*   