
    i5                        d Z ddlZddlZddlZddlmZ ddlmZmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ ddlmZ  e            Zd	ed
edefdZdeeef         dee         fdZdefdZdedefdZ ej        d          Z ej        d          Zd	edefdZde	e         fdZdOdededede
e         fdZ dede	e         defdZ!	 	 dPd ed!ed"e"d
e
e         ddf
d#Z#	 	 dQd&e"d'e"d!ed
e
e         ddf
d(Z$	 	 	 	 dRded+ed,ed
e
e         d-ed.ed/eddfd0Z%dSded
e
e         ddfd1Z&dTd&e"d'e"d!ede'fd2Z(dede
e'         fd3Z)	 	 	 dUd4ed5ed
e
e         ddfd6Z*dVd	e
e         d
e
e         ddfd7Z+dVd	e
e         d
e
e         ddfd8Z,dVd	e
e         d
e
e         ddfd9Z-	 	 	 dWd	ed
e
e         d-ed.eddf
d:Z.	 	 	 	 dXd	ed;ed
e
e         d-ed.eddfd<Z/dYd=ed>ed
e
e         ddfd?Z0	 	 dZdAedBed>ed
e
e         ddf
dCZ1dAedDedEede2fdFZ3dSdGed
e
e         ddfdHZ4	 	 d[dIed,ed
e
e         ddfdJZ5d\dKZ6dSdLed
e
e         ddfdMZ7d
eddfdNZ8dS )]uW  
Skills Hub CLI — Unified interface for the Hermes Skills Hub.

Powers both:
  - `hermes skills <subcommand>` (CLI argparse entry point)
  - `/skills <subcommand>` (slash command in the interactive chat)

All logic lives in shared do_* functions. The CLI entry point and slash command
handler are thin wrappers that parse args and delegate.
    N)Path)AnyDictListOptional)Console)Panel)Table)display_hermes_homenameconsolereturnc           	      (    ddl m} |pt          }|                    d  d            | |dd          } fd|D             }t	          |          d	k    r1|                    d
|d         j         d           |d         j        S t	          |          d	k    r|                    d  d           t                      }|                    dd           |                    dd           |                    dd           |D ]]}dddd                    |j	        d          }	|j
        dk    rdn|j	        }
|                    |j
        d|	 d|
 d|j                   ^|                    |           |                    d           dS |ra|                    d  d           |dd          D ]'}|                    d!|j         d"|j                    (|                                 dS |                    d#  d$           dS )%a,  
    Resolve a short skill name (e.g. 'pptx') to a full identifier by searching
    all sources. If exactly one match is found, returns its identifier. If multiple
    matches exist, shows them and asks the user to use the full identifier.
    Returns empty string if nothing found or ambiguous.
    r   )unified_searchz[dim]Resolving 'z'...[/]all   source_filterlimitc                 r    g | ]3}|j                                                                         k    1|4S  )r   lower).0rr   s     :/home/ubuntu/.hermes/hermes-agent/hermes_cli/skills_hub.py
<listcomp>z'_resolve_short_name.<locals>.<listcomp>1   s5    BBB116<<>>TZZ\\#A#AQ#A#A#A       z[dim]Resolved to: [/]z 
[yellow]Multiple skills named 'z' found:[/]SourcedimstyleTrust
Identifier	bold cyanbright_cyangreenyellowbuiltintrusted	communityofficial[]z<[bold]Use the full identifier to install a specific one.[/]
 z[yellow]No exact match for 'z '. Did you mean one of these?[/]N   z  [cyan]u   [/] — z$[bold red]Error:[/] No skill named 'z' found in any source.
)tools.skills_hubr   _consoleprintlen
identifierr
   
add_columngettrust_levelsourceadd_rowr   )r   sourcesr   r   cresultsexacttabler   trust_styletrust_labels   `          r   _resolve_short_namerD   "   sx    0/////8AGG,t,,,---nT7%rJJJG CBBBBBBE
5zzQ	=U1X%8===>>>Qx""
5zzA~~	EDEEEFFF///...[999 	V 	VA&3V^__ccdedqsxyyK()J(>(>**AMKMM!($F$F$Fk$F$F$FUUUU		OPPPr  	UtUUUVVV! 	? 	?AGG=qv==q|==>>>>				rGGQ4QQQRRR2r   extrac                    g }| s|S |                      d          r|                    d| d                     |                      d          r|                    d| d                     |                      d          r|                    d| d                     |                      d          r|                    d| d                     |                      d	          r|                    d
| d	                     |                      d          |                    d| d                     |                      d          r|                    d| d                     |                      d          }t          |t                    rX|rVd                    d t          |                                          D                       }|                    d|            |S )Nrepo_urlz[bold]Repo:[/] 
detail_urlz[bold]Detail Page:[/] 	index_urlz[bold]Index:[/] endpointz[bold]Endpoint:[/] install_commandz[bold]Install Command:[/] installsz[bold]Installs:[/] weekly_installsz[bold]Weekly Installs:[/] security_audits, c              3   *   K   | ]\  }}| d | V  dS )=Nr   )r   r   statuss      r   	<genexpr>z/_format_extra_metadata_lines.<locals>.<genexpr>g   s4      \\<4t..f..\\\\\\r   z[bold]Security:[/] )r9   append
isinstancedictjoinsorteditems)rE   linessecurityordereds       r   _format_extra_metadata_linesr]   Q   s   E yy <:uZ'8::;;;yy ECeL.ACCDDDyy ><k(:<<===yy @>5+<>>???yy"## NL%8I2JLLMMMyy(>5+<>>???yy"## NL%8I2JLLMMMyy*++H(D!! 6h 6))\\6(..JZJZC[C[\\\\\4744555Lr   r7   c                 4   d}d}d}|D ]}|-	 |                     |           }|r|}n# t          $ r d}Y nw xY w	 |                    |           }n# t          $ r d}Y nw xY w|r/|}|)	 |                     |           }n# t          $ r d}Y nw xY w n|||fS )z6Resolve metadata and bundle for a specific identifier.N)inspect	Exceptionfetch)r7   r=   metabundlematched_sourcesrcs         r   _resolve_source_meta_and_bundlerf   m   s   DFN  <{{:.. )%(N   	YYz**FF 	 	 	FFF	 	 N| ;;z22DD       DDD E	 ''s/   (77AA A *B  BBinstall_pathc                 \    t          |           }t          |j                  }|dk    rdn|S )N.r1   )r   strparent)rg   pathrk   s      r   "_derive_category_from_install_pathrm      s0    DF322F*r   z^[a-z][a-z0-9_-]*$z^[a-z][a-z0-9_/-]*$c                     t          | t                    sdS |                                                                 }|r|dv rdS t	          t
                              |                    S )zAAccept identifier-shaped names, reject empty / sentinel-y values.F>   unnamed-skillindexskillreadme)rU   rj   stripr   bool_VALID_NAME_REmatch)r   	candidates     r   _is_valid_installed_skill_namerx      sf    dC   u

""$$I 	%RRRu$$Y//000r   c                     ddl m}  g }	 |                                 D ]}|                                r|j                            d          r1|dz                                  rI	 t          |                    d                    r|	                    |j                   # t          $ r Y w xY wn# t          t          f$ r g cY S w xY wt          t          |                    S )a!  Return sorted subdirectory names under ``~/.hermes/skills/`` that look
    like category buckets (contain at least one ``SKILL.md`` somewhere below).

    Used to suggest reusable categories when interactively installing from a
    URL. Hidden dirs (``.hub``, ``.trash``) are skipped.
    r   
SKILLS_DIRri   SKILL.md)r3   r{   iterdiris_dirr   
startswithexistsanyrglobrT   OSErrorFileNotFoundErrorrX   set)r{   outentrys      r   _existing_categoriesr      s    ,+++++C'')) 	 	E<<>> UZ%:%:3%?%?  
"**,, u{{:..// +JJuz***   	 w'   			#c((s6   AB6 (<B%$B6 %
B2/B6 1B22B6 6CCr1   r>   urldefaultc                 |   |                                   |                      d| d           |rd| dnd}|                      d| d           	 t          d                                          }n# t          t          f$ r Y d	S w xY w|s|r|}t          |          s|                      d
|d           d	S |S )zBPrompt interactively for a skill name. Returns None on cancel/EOF.z[yellow]The SKILL.md at zx doesn't declare a `name:` in its frontmatter,[/]
[yellow]and the URL path doesn't produce a valid identifier either.[/]z [r0   r1   z[bold]Enter a skill namezT:[/] [dim](lowercase letters, digits, hyphens, underscores; starts with a letter)[/]zName: Nz[bold red]Invalid name:[/] z. Aborting install.
)r5   inputrs   EOFErrorKeyboardInterruptrx   )r>   r   r   default_hintanswers        r   _prompt_for_skill_namer      s   GGIIIGG	!3 	! 	! 	!  
 '.5?????2LGG	[< 	[ 	[ 	[  x&&(('(   tt g )&11 	MfMMMNNNtMs   !A4 4B	B	existingc                    |                                   |rB|                      d           |                      dd                    |           d           n|                      d           	 t          d                                          }n# t          t
          f$ r Y dS w xY w|sdS t                              |          s|                      d|d	           dS |S )
zIPrompt interactively for a category. Empty/None input means flat install.zk[bold]Pick a category[/] [dim](reuse an existing bucket, type a new one, or press Enter to install flat)[/]z[dim]Existing: rO   r   u`   [bold]Category[/] [dim](optional — press Enter to install flat at ~/.hermes/skills/<name>/)[/]z
Category: r1   z[dim]Invalid category u    — installing flat.[/])r5   rW   r   rs   r   r   _VALID_CATEGORY_RErv   )r>   r   r   s      r   _prompt_for_categoryr      s   GGIII 	
	a	
 	
 	
 	
:$))H"5"5:::;;;;	n	
 	
 	
|$$**,,'(   rr r##F++ 	KKKKLLLrMs   /!B B&%B&r   
   queryr;   r   c                    ddl m}m}m} |pt          }|                    d|              |            } ||          }	|                    d          5   || |	||          }
ddd           n# 1 swxY w Y   |
s|                    d           dS t          dt          |
           d	
          }|	                    dd           |	                    dd           |	                    dd           |	                    dd           |	                    dd           |
D ]}dddd
                    |j        d          }|j        dk    rdn|j        }|                    |j        |j        dd         t          |j                  dk    rdndz   |j        d| d| d|j                   |                    |           |                    d           dS ) z6Search registries and display results as a Rich table.r   )
GitHubAuthcreate_source_routerr   z
[bold]Searching for:[/] z[bold]Searching registries...r   Nz-[dim]No skills found matching your query.[/]
u   Skills Hub — z
 result(s)titleNamer&   r"   Description<   	max_widthr    r!   r$   r%   r'   r(   r)   r*   r.   ...r1   r/   r0   r   zj[dim]Use: hermes skills inspect <identifier> to preview, hermes skills install <identifier> to install[/]
)r3   r   r   r   r4   r5   rR   r
   r6   r8   r9   r:   r;   r<   r   descriptionr7   )r   r;   r   r   r   r   r   r>   authr=   r?   rA   r   rB   rC   s                  r   	do_searchr      s    RQQQQQQQQQ8AGG000111:<<D""4((G	
1	2	2 T T .vUSSST T T T T T T T T T T T T T T  	@AAAB#g,,BBBCCCE	V;///	]b111	XU+++	WE***	\/// 	
 	
"/GRZ[[__`a`motuu$%H
$:$:jjFM#2#3q}+=+=+B+B%%KH...k...L	
 	
 	
 	
 GGENNNGG A B B B B Bs   A22A69A6r   r   page	page_sizec                 p	  ! ddl m}m}m} t	          dt          |d                    }|pt          } |            } ||          }	dddd!ddd	dd
dd
d}
|                    d          5   ||	d|
|d          \  }}}ddd           n# 1 swxY w Y   |s|                    d           dS i }|D ]Z}!	                    |j
        d          }|j        |vs*|!	                    ||j                 j
        d          k    r
|||j        <   [t          |                                          }|                    !fd           t          |          }t	          d||z   dz
  |z            }t	          dt          | |                    } | dz
  |z  }t          ||z   |          }|||         }t!          d |D                       }|dk    rd| nd}| d}|r|dt          |           dz  }|                    d| d| d|  d| d	           |dk    r| dk    r|                    d | d!           |                                 t#          d"d#$          }|                    d%d&d'd()           |                    d*d+d,-           |                    d.d	/           |                    d0d&d12           |                    d3d45           t'          ||dz   6          D ]\  }}d7d8d9d	                    |j
        d&          }|j        d:k    rd;n|j
        }|j        dd	         }t          |j                  d	k    r|d<z  }|                    t/          |          |j        ||j        d=| d>| d?           |                    |           g }| dk    r|                    d@| dz
   dA           | |k     r|                    d@| dz    dB           |r+|                    dCdD                    |                      |dk    rY|rWdE t5          |                                          D             } |                    dFd                    |            d?           |r,|                    dGd                    |           dH           |                    dI           dS )JzBrowse all available skills across registries, paginated.

    Official skills are always shown first, regardless of source filter.
    r   )r   r   parallel_search_sourcesr   d         r*      2   i  r.   z	skills-shz
well-knowngithubclawhubzclaude-marketplacelobehubz([bold]Fetching skills from registries...r1      )r   per_source_limitsr   overall_timeoutNz+[dim]No skills found in the Skills Hub.[/]
c                                          | j        d           | j        dk    | j                                        fS Nr   r.   r9   r:   r;   r   r   r   _TRUST_RANKs    r   <lambda>zdo_browse.<locals>.<lambda>K  s7    		*	**	J	  r   keyc              3   0   K   | ]}|j         d k    dV  dS )r.   r   Nr;   r   r   s     r   rS   zdo_browse.<locals>.<genexpr>Z  s.      FFqqx:/E/E/E/E/E/EFFr   r   u   — u   — all sourcesz skills loadedrO   z source(s) still loadingu   
[bold]Skills Hub — Browse z[/]  [dim](z, page /z)[/]u   [bright_cyan]★ z1 official optional skill(s) from Nous Research[/]Tbold)show_headerheader_style#r!      right)r#   widthjustifyr   r&      )r#   r   r   r   r       )r#   r   r$   r   )r   )startr'   r(   r)   r.   u   ★ officialr   r/   r0   r   z[cyan]--page u   [/] ← prevu   [/] → nextz  z | c                 "    g | ]\  }}| d | S ): r   )r   sidcts      r   r   zdo_browse.<locals>.<listcomp>  s&    MMMGCC2MMMr   z  [dim]Sources: u$     [yellow]⚡ Slow sources skipped: u$    — run again for cached results[/]zR[dim]Tip: 'hermes skills search <query>' searches deeper across all registries[/]
)r3   r   r   r   maxminr4   rR   r5   r9   r:   r   listvaluessortr6   sumr
   r8   	enumerater;   r   r<   rj   rT   rW   rX   rY   )"r   r   r;   r   r   r   r   r>   r   r=   _PER_SOURCE_LIMITall_resultssource_counts	timed_outseenr   rankdedupedtotaltotal_pagesr   end
page_itemsofficial_countsource_labelloaded_labelrA   irB   rC   desc	nav_partspartsr   s"                                    @r   	do_browser     sR            
 As9c**++I8A:<<D""4((G  AA>>Kc#S  
<	=	= 
 
0G0G/ 1
 1
 1
-]I
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  	>??? D  q}a006QV8PRS(T(T!T!TDL4;;==!!G LL    L    LLEa%)+a/I=>>Kq#dK(())DAX"E
ei
'
'Cs#J FFGFFFFFN '-oo?&???;LL+++L FES^^EEEEGG E\ E E#E E,0E E3>E E E F F Fdaii	eNeeefffGGIII d888E	SQ@@@	V;"===	]b111	XU"555	WB'''*EAI666 
 
1"/G$,. ..1c!-.G.G 	()J(>(>nnAM}SbS!q}""EMDFFFH...k...	
 	
 	
 	
 GGENNN Iaxx????@@@k????@@@ .	,UZZ	**,,--- =MMvm6I6I6K6K/L/LMMM	8499U#3#3888999 8	 7tyy7K7K 7 7 7 	8 	8 	8 GGabbbbbs   -BBBFTcategoryforceskip_confirminvalidate_cachename_overridec                 V   ddl m}m}m}	m}
m}m} ddlm}m	}m
} |pt          } |	              |            } ||          }d| vrt          | ||          } | sdS |                    d|             t          | |          \  }}}|s`t          d |D                       }|                    d|  d	           |r|                    d
           n|                                 dS t!          |di           pi }|j        dk    r	|j        r|                    d          r|r.t)          |          r|                                |_        d|d<   n|r|                    d|d           dS |r8|                    d          p| }|                    d| d| d| d           dS |                    d          p| }t-          ||          }|s|                    d           dS ||_        d|d<   ||j        |_        |j        |_        |j        dk    r |s|st1          |t3                                }|j        dk    r7|s5|j                            d          }t9          |          dk    r|d         } |            }|                    |j                  }|r?|                    d|j         d|d                     |s|                    d           dS t=          t!          |di           pi           }|                    t!          |di           pi            	  |
|          }nc# t@          $ rV}|                    d| d           dd l m!}   | d!|j        |j        |j"        d"tG          |                     Y d}~dS d}~ww xY w|                    d#|$                    |j%        j%        j%                   d$           |                    d%           t!          |d&d'          pt!          |d&d'          p| }! |||!(          }"|                     ||"                      ||"|)          \  }#}$|#so|                    d*|$            tM          j'        |d+,           dd l m!}   | d!|j        |j        |j"        |"j(        t9          |"j)                   d-           dS |rItU          |          }%|%r8|                    tW          d,                    |%          d.d/0                     |sL|sI|                                 |j        dk    rG|                    tW          d1t[                       d2|r|dz   nd' |j         d3d4d50                     nF|                    tW          d6t[                       d2|r|dz   nd' |j         d3d7d80                     |                    d9|j         d:           	 t]          d;                                          /                                }&n# t`          tb          f$ r d<}&Y nw xY w|&d=vr-|                    d           tM          j'        |d+,           dS 	  |||j        |||"          }'ny# t@          $ rl}|                    d| d           tM          j'        |d+,           dd l m!}   | d!|j        |j        |j"        d"tG          |                     Y d}~dS d}~ww xY wdd>l m2}( |                    d?|'$                    |(                      |                    d@dA,                    |j3        4                                           dB           |r&	 ddCl5m6})  |)d+D           dS # tn          $ r Y dS w xY w|                    dE           |                    dF           dS )Ga  Fetch, quarantine, scan, confirm, and install a skill.

    ``name_override`` lets non-interactive callers (slash commands, gateway,
    scripts) supply a skill name when the upstream SKILL.md lacks a valid
    ``name:`` frontmatter field. On interactive TTY surfaces, a missing name
    triggers a prompt instead; ``skip_confirm=True`` means "non-interactive"
    (so pair it with ``name_override`` when installing from a URL that has
    no frontmatter).
    r   )r   r   ensure_hub_dirsquarantine_bundleinstall_from_quarantineHubLockFile)
scan_skillshould_allow_installformat_scan_reportr   Nz
[bold]Fetching:[/] c              3   x   K   | ]5}t          |d d          pt          t          |dd          d d          V  6dS )is_rate_limitedFr   N)getattr)r   re   s     r   rS   zdo_install.<locals>.<genexpr>  sg       
 
  C*E22 OwsHd335FNN
 
 
 
 
 
r   z%[bold red]Error:[/] Could not fetch 'z' from any source.z[yellow]Hint:[/] GitHub API rate limit exhausted (unauthenticated: 60 requests/hour).
Set [bold]GITHUB_TOKEN[/] in your .env or install the [bold]gh[/] CLI and run [bold]gh auth login[/] to raise the limit to 5,000/hr.
metadatar   awaiting_nameFz[bold red]Invalid --name:[/] z`. Must be a lowercase identifier (letters, digits, hyphens, underscores; starts with a letter).
z&[bold red]Cannot install from URL:[/] z
[yellow]The SKILL.md has no `name:` in its frontmatter, and the URL path doesn't produce a valid identifier.[/]

Retry with an explicit name:
  [bold]/skills install z5 --name <your-name>[/]
  [bold]hermes skills install zm --name <your-name>[/]

[dim]Or ask the SKILL.md's author to add a `name:` field to its YAML frontmatter.[/]
z [dim]Installation cancelled.[/]
r.   r   r   z[yellow]Warning:[/] 'z' is already installed at rg   zUse --force to reinstall.
rE   z#[bold red]Installation blocked:[/] 
)append_audit_logBLOCKEDinvalid_pathz[dim]Quarantined to r   z![bold]Running security scan...[/]r7   r1   r   r   z$
[bold red]Installation blocked:[/] T)ignore_errors	_findingszUpstream Metadatablue)r   border_stylez[bold bright_cyan]This is an official optional skill maintained by Nous Research.[/]

It ships with hermes-agent but is not activated by default.
Installing will copy it to your skills directory where the agent can use it.

Files will be at: [cyan]z/skills/z/[/]zOfficial Skillr'   a  [bold yellow]You are installing a third-party skill at your own risk.[/]

External skills can contain instructions that influence agent behavior,
shell commands, and scripts. Even after automated scanning, you should
review the installed files before use.

Files will be at: [cyan]
Disclaimerr)   z[bold]Install ''?[/]Confirm [y/N]: nyyesrz   z[bold green]Installed:[/] z[dim]Files: rO   [/]
 clear_skills_system_prompt_cacheclear_snapshotz5[dim]Skill will be available in your next session.[/]zl[dim]Use /reset to start a new session now, or --now to activate immediately (invalidates prompt cache).[/]
)8r3   r   r   r   r   r   r   tools.skills_guardr   r   r   r4   rD   r5   rf   r   r   r;   r   r9   rx   rs   r   rl   r   r   r7   splitr6   get_installedrV   update
ValueErrorr   r:   rj   relative_tork   shutilrmtreeverdictfindingsr]   r	   rW   r   r   r   r   r   r{   fileskeysagent.prompt_builderr  r`   )*r7   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r>   r   r=   rb   rc   _matched_sourcerate_limitedbundle_metar   chosenid_partslockr   extra_metadataq_pathexcr   scan_sourceresultallowedreasonmetadata_linesr   install_dirr{   r  s*                                             r   
do_installr.    sV
                   XWWWWWWWWW8AO :<<D""4((G *(Wa@@
 	FGG0J00111$CJPW$X$X!D&/  
 
 
 
 
 
 

 	
V
VVVWWW 		GG4    GGIII &*b117RK}v{kooo6V6V !	1;MJJ !	1'--//FK+0K(( 	1GG8 8 8 8  
 F 	1 //%((6JCGG- - - ,/	- -
 25- - -	 	 	 F //%((6JC+As33F ;<<< FK+0K( DIDI
 }h|'+?+A+ABB }
""8"$**3//x==A{H ;==D!!&+..H 	iiixXfOgiijjj 	GG1222F'$44:;;N'&*b99?R@@@""6**   	=c===>>>555555FK+^SXX	G 	G 	G GGW6#5#5fm6J6Q#R#RWWWXXX GG/000&,33dwt\SU7V7VdZdKZ{333FGGv&&''' +*6???OGV 	@@@AAAfD1111555555FK+V^00;;;	= 	= 	= 	 f5nEE 	fGGE$))N33;N]cdddeee   				=J&&GGE@ ,?+@+@@ @ ]eJl(UX..jl@ ouny@ @ @ '*       GGE@ ,?+@+@	@ @ ]eJl(UX..jl	@ ouny	@ @ @
 #%      	
4&+444555	,--3355;;==FF+, 	 	 	FFF	%%GG7888M&5555F--ffk8VU[\\   	=c===>>>fD1111555555FK+^SXX	G 	G 	G ,+++++GGN)@)@)L)LNNOOOGG@499V\%6%6%8%899@@@AAA 	A	MMMMMM,,DAAAAAA 	 	 	DD	 	
GHHH	  	A  	A  	A  	A  	AsV   +L7 7
NANN3X
 
X X Y* *
[ 4A![[ ]. .
]<;]<c                    ddl m}m} |pt          } |            } ||          }d| vrt	          | ||          } | sdS t          | |          \  }}}	|s|                    d|  d           dS |                                 ddd	d
                    |j        d          }
|j	        dk    rdn|j        }d|j
         d|j         d|j	         d|
 d| dd|j         g}|j        r0|                    dd                    |j                              |                    t#          |j                             |                    t'          d                    |          d|j
                              |rd|j        v r|j        d         }t+          |t,                    r|                    dd          }|                    d          }d                    |dd                   }t3          |          dk    r|dt3          |          dz
   dz  }|                    t'          |d d!"                     |                                 dS )#z6Preview a skill's SKILL.md content without installing.r   r   r   r   Nz$[bold red]Error:[/] Could not find 'z' in any source.
r'   r(   r)   r*   r!   r.   z[bold]Name:[/] z[bold]Description:[/] z[bold]Source:[/] z[bold]Trust:[/] [r0   r   z[bold]Identifier:[/] z[bold]Tags:[/] rO   r   zSkill: r   r|   utf-8replaceerrorsr   

... ( more lines)zSKILL.md Previewz%hermes skills install <id> to install)r   subtitle)r3   r   r   r4   rD   rf   r5   r9   r:   r;   r   r   r7   tagsrT   rW   extendr]   rE   r	   r  rU   bytesdecoder  r6   )r7   r   r   r   r>   r   r=   rb   rc   r  rB   rC   
info_linescontentrZ   previews                   r   
do_inspectr?  s  s   AAAAAAAA8A:<<D""4((G
*(Wa@@
 	F$CJPW$X$X!D&/ 	UzUUUVVVGGIII+hWW[[\`\lnsttK $z 9 9**t?OK 	&$)%%3!133)DK)):K::+:::111J y DBDIIdi,@,@BBCCC24:>>???GGE$))J''/D/D/DEEEFFF 	l*,,,z*gu%% 	@nnWYn??Gd##))E#2#J''u::??@3u::?@@@@G	g%7BijjjkkkGGIIIIIr   c                    ddl m}m} t          dt	          |d                    }ddddddddd	d	d	d
} |            } ||          }g }|D ]z}	|	                                }
|dk    r|
|k    r|
dk    r)	 |                    |
d	          }|                    |	                    d|                     k# t          $ r Y ww xY w|sg ddddS i }|D ]Z}                    |j
        d          }|j        |vs*|                    ||j                 j
        d          k    r
|||j        <   [t          |                                          }|                    fd           t          |          }t          d||z   dz
  |z            }t          dt	          | |                    } | dz
  |z  }||t	          ||z   |                   }d |D             | ||dS )zPaginated hub browse for programmatic callers (e.g. TUI gateway).

    Returns ``{"items": [...], "page": int, "total_pages": int, "total": int}``.
    r   r0  r   r   r   r   r*   r   r   r   r   r.   r1   )r   )rY   r   r   r   c                                          | j        d           | j        dk    | j                                        fS r   r   r   s    r   r   zbrowse_skills.<locals>.<lambda>  s9    !B!B BAHPZDZ\]\b\h\h\j\jk r   r   c                 D    g | ]}|j         |j        |j        |j        d S ))r   r   r;   trust)r   r   r;   r:   r   s     r   r   z!browse_skills.<locals>.<listcomp>  sG     A A A01 6!-18], , A A Ar   )r3   r   r   r   r   	source_idr9   r9  searchr`   r:   r   r   r   r   r6   )r   r   r;   r   r   r   r   r=   r   re   r   r   r   r   r   r   r   r   r   r   r   s                       @r   browse_skillsrF    s{   
 BAAAAAAAAs9c**++IAA>>K%(s"X[hj/1bB B:<<D""4((GK  mmooU??sf}}
1B1B	%))#r22Eszz"Ez::;;;; 	 	 	H	 FQq1EEED  q}a006QV8PRS(T(T!T!TDL4;;==!!GLLkkkkLlllLLEa%)+a/I=>>Kq#dK(())DAX"EUY%6!>!>>?JA A5?A A A"  s   ;A B<<
C	C	c                    ddl m}m}  G d d          } |            } |            } ||          }| }d|vrt          |||          }|sdS t	          ||          \  }}	}
|sdS |j        |j        |j        |j        |j	        rt          |j	                  ng d}|	rd|	j        v r|	j        d         }t          |t                    r|                    d	d
          }|                    d          }d                    |dd                   }t#          |          dk    r|dt#          |          dz
   dz  }||d<   |S )z=Skill metadata (+ SKILL.md preview) for programmatic callers.r   r0  c                       e Zd Zd ZdS )inspect_skill.<locals>._Qc                     d S Nr   )selfaks      r   r5   zinspect_skill.<locals>._Q.print  s    Dr   N)__name__
__module____qualname__r5   r   r   r   _QrI    s#        	 	 	 	 	r   rR  r   N)r   r   r;   r7   r8  r|   r1  r2  r3  r   r   r5  r6  skill_md_preview)r3   r   r   rD   rf   r   r   r;   r7   r8  r   r  rU   r:  r;  r  rW   r6   )r7   r   r   rR  r>   r   r=   identrb   rc   _r   r=  rZ   r>  s                  r   inspect_skillrV    s   AAAAAAAA        	A:<<D""4((GE
%#E7A66 	45eWEEOD&! t	'+o#'94TY" C  **,,,z*gu%% 	@nnWYn??Gd##))E#2#J''u::??@3u::?@@@@G")Jr   r   enabled_onlyc                    ddl m}m} ddlm} ddlm} ddlm} |pt          } |              |            }	d |	
                                D             }
t           |                      } |d          } |            }d	}|r|d
z  }t          |          }|                    dd           |                    dd           |                    dd           |                    dd           |                    dd           d}d}d}d}d}t          |d           D ]}|d         }|                    dd          }|
                    |          }|r/d}|                    dd          }|                    dd          }n||v rd}d}d}nd}d}d}| dk    r| |k    r||v}|r|s|dk    r|d z  }n|dk    r|d z  }n|d z  }|r|d z  }d!}n|d z  }d"}d#d$d%dd&                    |d          }|d'k    rd'n|}|                    |||d(| d)| d*|           |                    |           d+| d,| d-| d.} |r
| d/| d0z  } n| d/| d1| d2z  } | d3z  } |                    |            d4S )5u  List installed skills, distinguishing hub, builtin, and local skills.

    Args:
        source_filter: ``all`` | ``hub`` | ``builtin`` | ``local``.
        enabled_only: If True, hide disabled skills from the output.

    Enabled/disabled state is resolved against the currently active profile's
    config — ``hermes -p <profile> skills list`` reads that profile's
    ``skills.disabled`` list because ``-p`` swaps ``HERMES_HOME`` at process
    start.  No explicit profile flag needed here.
    r   )r   r   )_read_manifest)_find_all_skills)get_disabled_skill_namesc                      i | ]}|d          |S r   r   )r   es     r   
<dictcomp>zdo_list.<locals>.<dictcomp>  s    AAAaQvYAAAr   T)skip_disabledzInstalled Skillsz (enabled only)r   r   r&   r"   Categoryr!   r    r$   Statusc                 @    |                      d          pd| d         fS )Nr   r1   r   r9   )ss    r   r   zdo_list.<locals>.<lambda>'  s     1553D3D3JAfI2V r   r   r   r   r1   hubr;   r:   r-   r+   localr   r   z[bold green]enabled[/]z[dim red]disabled[/]r'   r(   r)   )r+   r,   r-   rg  r.   r/   r0   r   [dim]z hub-installed, z
 builtin, z localu    — z enabled shownz
 enabled, z	 disabledr  N)r3   r   r   tools.skills_syncrY  tools.skills_toolrZ  agent.skill_utilsr[  r4   list_installedr   r
   r8   rX   r9   r<   r5   )!r   rW  r   r   r   rY  rZ  r[  r>   r$  hub_installedbuiltin_names
all_skillsdisabled_namesr   rA   	hub_countbuiltin_countlocal_countenabled_countdisabled_countrq   r   r   	hub_entrysource_typesource_displayrC  
is_enabledstatus_cellrB   rC   summarys!                                    r   do_listr|    s    >=======000000222222::::::8AO;==DAA4+>+>+@+@AAAM(())M "!555J--//NE #""E	V;///	Zu---	XU+++	WE***	XU+++IMKMN
(V(VWWW )g )gV}99Z,,!%%d++	 	K&]]8U;;NMM-==EE]""#K&NEE!K$NEE!!m{&B&B/
 	
 	%NIII%%QMM1K 	1QM2KKaN0K"/GRZejkkoopuw|}}$2j$@$@jjedHn6X+6X6X6X6X6XZeffffGGENNN]i]]]]+]]]G N8=8888M=MMNMMMMwGGGGr   c           	      v   ddl m} |pt          } ||           }|s|                    d           dS t	          d          }|                    dd	
           |                    dd
           |                    dd
           |D ]U}|                    |                    dd          |                    dd          |                    dd                     V|                    |           t          d |D                       }|                    d| dt          |           d           dS )z0Check hub-installed skills for upstream updates.r   )check_for_skill_updatesr]  z*[dim]No hub-installed skills to check.[/]
NzSkill Updatesr   r   r&   r"   r    r!   rb  r   r1   r;   rR   c              3   L   K   | ]}|                     d           dk    dV   dS )rR   update_availabler   Nrd  r   r   s     r   rS   zdo_check.<locals>.<genexpr>o  s9      [[U81D1DHZ1Z1Zq1Z1Z1Z1Z[[r   rh  z update(s) available across z checked skill(s)[/]
)
r3   r~  r4   r5   r
   r8   r<   r9   r   r6   )r   r   r~  r>   r?   rA   r   update_counts           r   do_checkr  \  s_   8888888A%%4000G 	=>>>(((E	V;///	XU+++	XU+++ _ _eii++UYYx-D-DeiiPXZ\F]F]^^^^GGENNN[[g[[[[[LGGbLbbc'llbbbcccccr   c                    ddl m}m} |pt          } |            }d  ||           D             }|s|                    d           dS |D ]{}|                    |d                   }|r#t          |                    dd	                    nd	}	|                    d
|d                     t          |d         |	d|           ||                    dt          |           d           dS )z2Update hub-installed skills with upstream changes.r   )r   r~  c                 D    g | ]}|                     d           dk    |S )rR   r  rd  r  s     r   r   zdo_update.<locals>.<listcomp>y  s0    rrr		RZH[H[_qHqHquHqHqHqr   r]  z[dim]No updates available.[/]
Nr   rg   r1   z[bold]Updating:[/] r7   Tr   r   r   z[bold green]Updated z skill(s).[/]
)
r3   r   r~  r4   r5   r  rm   r9   r.  r6   )
r   r   r   r~  r>   r$  updatesr   	installedr   s
             r   	do_updater  s  s)   EEEEEEEE8A;==Drr"9"9t"D"D"DrrrG 	1222 R R&&uV}55	\em5immNTV6W6WXXXkm	5eFm556665&qQQQQQGG@3w<<@@@AAAAAr   c           	          ddl m}m} ddlm}m} |pt          } |            }|                                }|s|                    d           dS |}	 r+ fd|D             }	|	s|                    d  d           dS |                    d	t          |	           d
           |	D ]}
||
d         z  }|
                                s(|                    d|
d          d|
d                     I |||
                    d|
d                             }|                     ||                     |                                 dS )z-Re-run security scan on installed hub skills.r   )r   r{   r   r   z*[dim]No hub-installed skills to audit.[/]
Nc                 ,    g | ]}|d          k    |S r]  r   )r   r^  r   s     r   r   zdo_audit.<locals>.<listcomp>  s'    ===1V9+<+<1+<+<+<r   z[bold red]Error:[/] 'z ' is not a hub-installed skill.
z
[bold]Auditing z skill(s)...[/]
rg   z[yellow]Warning:[/] r   u    — path missing: r7   r;   r   )r3   r   r{   r  r   r   r4   rl  r5   r6   r   r9   )r   r   r   r{   r   r   r>   r$  r  targetsr   
skill_pathr)  s   `            r   do_auditr    s   88888888AAAAAAAA8A;==D##%%I 	=>>>G ====i=== 	GGSDSSSTTTFGG?G???@@@  %"77
  "" 	GGd5=ddUSaMbddeeeJuyyuX/W/WXXX	""6**+++					 r   c                 X   ddl m} |pt          }|s|                    d|  d           	 t	          d                                                                          }n# t          t          f$ r d}Y nw xY w|dvr|                    d           d	S  ||           \  }}|rm|                    d
| d           |r&	 ddl	m
}	  |	d           d	S # t          $ r Y d	S w xY w|                    d           |                    d           d	S |                    d| d           d	S )z/Remove a hub-installed skill with confirmation.r   )uninstall_skillz
[bold]Uninstall 'r  r  r	  r
  [dim]Cancelled.[/]
N[bold green]r  r  Tr  5[dim]Change will take effect in your next session.[/]i[dim]Use /reset to start a new session now, or --now to apply immediately (invalidates prompt cache).[/]
[bold red]Error:[/] r   )r3   r  r4   r5   r   rs   r   r   r   r  r  r`   )
r   r   r   r   r  r>   r   successmsgr  s
             r   do_uninstallr    s    1000008A  	1d111222	,--3355;;==FF+, 	 	 	FFF	%%GG*+++F"?4((LGS 0	)s)))*** 	BQQQQQQ00EEEEEE    GGKLLLGG  A  B  B  B  B  B	.s.../////s#   3A   A65A6 C 
C"!C"restorec                    ddl m} |pt          }|s|r|                    d|  d           |                    d           	 t	          d                                                                          }n# t          t          f$ r d}Y nw xY w|dvr|                    d	           d
S  || |          }|d         s!|                    d|d          d           d
S |                    d|d          d           |	                    d          pi }	|		                    d          r2|                    dd
                    |	d                    d           |		                    d          r2|                    dd
                    |	d                    d           |                                 |r&	 ddlm}
  |
d           d
S # t          $ r Y d
S w xY w|                    d           |                    d           d
S )zNReset a bundled skill's manifest tracking (+ optionally restore from bundled).r   )reset_bundled_skillz
[bold]Restore 'z' from bundled source?[/]zK[dim]This will DELETE your current copy and re-copy the bundled version.[/]r  r	  r
  r  N)r  okr  messager   r  r   syncedcopiedz[dim]Copied: rO   updatedz[dim]Updated: r  Tr  r  r  )ri  r  r4   r5   r   rs   r   r   r   r9   rW   r  r  r`   )r   r  r   r   r   r  r>   r   r)  r  r  s              r   do_resetr    s{   
 6555558A 	G 		CDCCCDDD	]^^^	,--3355;;==FF+, 	 	 	FFF	%%GG*+++F  w777F$< 	<vi'8<<<===GG16),111222ZZ!!'RFzz( B	@		&*: ; ;@@@AAAzz) D	B6)+<!=!=BBBCCCGGIII ~	MMMMMM,,DAAAAAA 	 	 	DD	 	
GHHH	|}}}}}s$   3A7 7BB<G 
GGactionrepoc                 *   ddl m} |pt          } |            }| dk    r|                                }|s|                    d           dS t          d          }|                    dd	
           |                    dd
           |D ]l}|                    d          p*|                    d          p|                    dd          }	|                    |	|                    dd                     m|                    |           |                                 dS | dk    rd|s|                    d           dS |	                    |          r|                    d| d           dS |                    d| d           dS | dk    rd|s|                    d           dS |
                    |          r|                    d| d           dS |                    d| d           dS |                    d|  d           dS )z)Manage taps (custom GitHub repo sources).r   TapsManagerr   z?[dim]No custom taps configured. Using default sources only.[/]
NzConfigured Tapsr   Repor&   r"   r   r!   r  r   rl   unknownskills/addzK[bold red]Error:[/] Repo required. Usage: hermes skills tap add owner/repo
z[bold green]Added tap:[/] r   z[yellow]Tap already exists:[/] removezN[bold red]Error:[/] Repo required. Usage: hermes skills tap remove owner/repo
z[bold green]Removed tap:[/] z#[bold red]Error:[/] Tap not found: z![bold red]Unknown tap action:[/] z. Use: list, add, remove
)r3   r  r4   	list_tapsr5   r
   r8   r9   r<   r  r  )
r  r  r   r  r>   mgrtapsrA   tlabels
             r   do_tapr    s[   ,,,,,,8A
+--C}} 	GGVWWWF-...{333u--- 	; 	;AEE&MMNQUU6]]NaeeFI6N6NEMM%vy!9!9::::								5 	GGbcccF774== 	@GG9999:::::GG>d>>>?????	8		 	GGefffF::d 	DGG;4;;;<<<<<GGB$BBBCCCCC 	
VFVVVWWWWWr   r   r  targetc                    ddl m}m} ddlm}m} |pt          }t          |           }	|	                                s||	z  }	|		                                r|	dz  	                                s|
                    d|	 d           dS ddl}
|	dz                      d	          }i }|                    d
          reddl} |j        d|dd                   }|rF	 |
                    |d|                                dz                      pi }n# |
j        $ r Y nw xY w|                    d|	j                  }|                    dd          }|s|
                    d           dS |
                    d| d            ||	d          }|
                     ||                     |j        dk    r|
                    d           dS |dk    r|s|
                    d           dS  |            }|                                s'|
                    dt/                       d           dS |
                    d| d| d           t1          |	|||          \  }}|r|
                    d| d           dS |
                    d | d           dS |d!k    r|
                    d"           dS |
                    d#| d$           dS )%zFPublish a local skill to a registry (GitHub PR or ClawHub submission).r   )r   r{   r  r|   z)[bold red]Error:[/] No SKILL.md found at r   Nr1  )encodingz---z
\n---\s*\nr   r   r   r1   zG[bold red]Error:[/] SKILL.md must have a 'description' in frontmatter.
z[bold]Scanning 'z' before publish...[/]rL  r   	dangerousz<[bold red]Cannot publish a skill with DANGEROUS verdict.[/]
r   zz[bold red]Error:[/] --repo required for GitHub publish.
Usage: hermes skills publish <path> --to github --repo owner/repo
zH[bold red]Error:[/] GitHub authentication required.
Set GITHUB_TOKEN in z/.env or run 'gh auth login'.
z[bold]Publishing 'z' to z...[/]r  r  r  r   za[yellow]ClawHub publishing is not yet supported. Submit manually at https://clawhub.ai/submit[/]
z[bold red]Unknown target:[/] z. Use 'github' or 'clawhub'.
)r3   r   r{   r  r   r   r4   r   is_absoluter   r5   yaml	read_textr   rerE  	safe_loadr   	YAMLErrorr9   r   r  is_authenticatedr   _github_publish)r  r  r  r   r   r{   r   r   r>   rl   r  skill_mdfmr  rv   r   r   r)  r   r  r  s                        r   
do_publishr  #  s    87777777AAAAAAAA8A
D  !D ;;== 
!2 : : < < 	DDDDDEEE KKKz!,,g,>>H	B5!! 				-!""66 	^^HQu{{}}q/@-@$ABBHb>    66&$)$$D&&++K 	Z[[[ GG;t;;;<<<ZV,,,FGGv&&'''~$$	OPPP 	GG Z [ [ [Fz||$$&& 	GG b+>+@+@b b b c c cF	<T<<<<<===&tT4>> 	4GG-3---.....GG2322233333	9			 D 	E 	E 	E 	E 	E 	
VVVVWWWWWs   4D 
DD
skill_nametarget_repoc           
      b   ddl }|                                }	 |                    d| d|d          }|j        dv r|                                }|d         }n|j        d	k    rd
S dd| d|j         fS n# |j        $ r}	dd|	 fcY d}	~	S d}	~	ww xY w	 |                    d| |d          }|                                                    dd          }
n# t          $ r d}
Y nw xY w	 |                    d| d|
 |d          }|                                d         d         }n# t          $ r}	dd|	 fcY d}	~	S d}	~	ww xY wd| }	 |                    d| d|dd| |d           n# t          $ r}	dd|	 fcY d}	~	S d}	~	ww xY w|                     d          D ]}|	                                st          |                    |                     }d| d| }	 ddl}|                    |                                                                          }|                    d| d| |dd | d!| ||d"           # t          $ r}	dd#| d|	 fcY d}	~	c S d}	~	ww xY w	 |                    d| d$|dd%| d&| d'|                    d          d          d(| |
d)          }|j        d*k    r/|                                                    d+d,          }d-d.| fS dd/|j         d0|j        dd1          fS # |j        $ r}	dd2|	 fcY d}	~	S d}	~	ww xY w)3zHCreate a PR to a GitHub repo with the skill. Returns (success, message).r   Nzhttps://api.github.com/repos/z/forksr   )headerstimeout)r      	full_namei  )Fz+GitHub token lacks permission to fork reposFzFailed to fork r   zNetwork error forking repo:    default_branchmainz/git/refs/heads/objectshazFailed to get base branch: z
add-skill-z	/git/refszrefs/heads/)refr  )r  r  jsonzFailed to create branch: *r  r   z
/contents/zAdd z skill: )r  r=  branchzFailed to upload z/pullszAdd skill: zSubmitting the `zd` skill via Hermes Skills Hub.

This skill was scanned by the Hermes Skills Guard before submission.:)r   bodyheadbase   html_urlr1   TzPR created: zFailed to create PR:  r   zNetwork error creating PR: )httpxget_headerspoststatus_coder  	HTTPErrorr9   r`   r   is_filerj   r  base64	b64encode
read_bytesr;  putr  text)r  r  r  r   r  r  respfork	fork_repor^  r  base_shabranch_namefrelupload_pathr  content_b64pr_urls                      r   r  r  h  s	    LLL  G9zz?K???R  
 
 z))99;;D[)II$$GGMKMM4;KMMMM	 
 ? 9 9 98Q8888888889 yy9K99R  
 
 )96BB       8yyWIWW~WWR  
 
 99;;x(/ 8 8 87A7777777778 ,z++K6

@I@@@R4{44XFF 	 	
 	
 	
 	

  6 6 65!5555555556 c"" 9 9yy{{ 	!--
++,,2
22S22	9MMM **1<<>>::AACCKIIR	RR[RR?j??#??*)        	9 	9 	98c88Q88888888888	98zz?K???R3z33`: ` ` `$??3//2BB[BB&   

 

 s""YY[[__Z44F00000V$2BVVTYtPSt_VVVV? 8 8 87A7777777778s   AA9 )A9 9
BB	BBAC C+*C+/>D. .
E	8E>E	E	#E6 6
F FFF+A&I
I2	I-%I2-I26B L 7L 
L.L)#L.)L.output_pathc                    ddl m}m} |pt          } |            } |            }|                                }|                                }dt          d          j                            t          d          j	        j
                                                  d |D             |d}	t          j        |	dd	          d
z   }
| dk    r ddl}|j                            |
           dS t#          |           }|                    |
           |                    d|            |                    dt)          |           dt)          |           d           dS )z?Export current hub skill configuration to a portable JSON file.r   )r   r  z0.1.0datetimec                    g | ]}|d          |                     dd          |                     dd          d|                     dd          v r5t          t          |                     dd                    j                  nddS )r   r;   r1   r7   r   rg   )r   r;   r7   r   )r9   rj   r   rk   r  s     r   r   z&do_snapshot_export.<locals>.<listcomp>  s     	
 	
 	
  f))Hb11#iib99"eii&C&CCC  UYY~r%B%B C C JKKKIK 	
 	
 	
r   )hermes_versionexported_atskillsr  r   F)indentensure_asciir   -Nz"[bold green]Snapshot exported:[/] rh  z skill(s), z tap(s)[/]
)r3   r   r  r4   rl  r  
__import__r  nowtimezoneutc	isoformatr  dumpssysstdoutwriter   
write_textr5   r6   )r  r   r   r  r>   r$  r  r  tap_listsnapshotpayloadr  r   s                r   do_snapshot_exportr    s   999999998A;==D;==D##%%I~~H "!*--6::z""+/
 

)++	
 	
 #	
 	
 	
  H$ j!%@@@4GGc



!!!!!;w	:S::;;;	NINN3x==NNNOOOOOr   
input_pathc                    ddl m} |pt          }t          |           }|                                s|                    d| d           dS 	 t          j        |                                          }n/# t          j	        $ r |                    d| d           Y dS w xY w|
                    dg           }|rw |            }|D ]D}	|	
                    dd	          }
|
r*|                    |
|	
                    d
d                     E|                    dt          |           d           |
                    dg           }|s|                    d           dS |                    dt          |           d           |D ]}|
                    dd	          }|
                    dd	          }|s.|                    d|
                    dd           d           ^|                    d|
                    d|           d           t          ||||           |                    d           dS )z'Re-install skills from a snapshot file.r   r  z$[bold red]Error:[/] File not found: r   Nz$[bold red]Error:[/] Invalid JSON in r  r  r1   rl   r  z[dim]Restored z
 tap(s)[/]r  z*[dim]No skills in snapshot to install.[/]
z[bold]Importing z skill(s) from snapshot...[/]
r7   r   z+[yellow]Skipping entry with no identifier: r   ?r   z
[bold]--- z ---[/]r  z)[bold green]Snapshot import complete.[/]
)r3   r  r4   r   r   r5   r  loadsr  JSONDecodeErrorr9   r  r6   r.  )r  r   r   r  r>   inpr  r  r  tapr  r  r   r7   r   s                  r   do_snapshot_importr    s    -,,,,,8A
z

C::<< 	>s>>>???:cmmoo..   	>s>>>???
 <<##D 8kmm 	: 	:C7762&&D :cggfi88999	6T666777 \\(B''F 	=>>>GGKs6{{KKKLLL J JYY|R00
99Z,, 	GG]%))FTWBXBX]]]^^^	CUYYvz::CCCDDD:qIIIIIGG899999s   &A6 6(B"!B"c                 >   t          | dd          }|dk    r#t          | j        | j        | j                   dS |dk    r#t          | j        | j        | j                   dS |dk    rEt          | j	        | j
        | j        t          | dd	          t          | d
d          pd           dS |dk    rt          | j	                   dS |dk    r't          | j        t          | dd	                     dS |dk    r!t          t          | d
d                     dS |dk    r!t          t          | d
d                     dS |dk    r!t!          t          | d
d                     dS |dk    rt#          | j                   dS |dk    r7t'          | j        t          | dd	          t          | dd	                     dS |dk    r7t)          | j        t          | dd          t          | dd                     dS |dk    rvt          | dd          }|d k    rt-          | j                   dS |d!k    r't1          | j        t          | d"d	          #           dS t4                              d$           dS |d%k    rdt          | d&d          }t          | dd          pt          | d
d          }|st4                              d'           dS t9          ||(           dS t4                              d)           t4                              d*           dS )+uK   Router for `hermes skills <subcommand>` — called from hermes_cli/main.py.skills_actionNbrowse)r   r   r;   rE  )r;   r   installr  Fr   r1   )r   r   r   r   r_   r   rW  )r   rW  checkr]  r  audit	uninstallresetr  )r  r   publishtor   r  )r  r  r  snapshot_actionexportimportr   r  z.Usage: hermes skills snapshot [export|import]
r  
tap_actionz+Usage: hermes skills tap [list|add|remove]
)r  zrUsage: hermes skills [browse|search|install|inspect|list|check|update|audit|uninstall|reset|publish|snapshot|tap]
z2Run 'hermes skills <command> --help' for details.
)r   r   r   sizer;   r   r   r   r.  r7   r   r   r?  r|  r  r  r  r  r   r  r  r  r  outputr  r   r4   r5   r  )argsr  snap_actionr  r  s        r   skills_commandr   $  s   T?D11FtyDIdkJJJJJJ	8		$*T[
CCCCCC	9		4?T]$* 'eU ; ;!(vr!:!:!@b	B 	B 	B 	B 	B 	B 
9		4?#####	6		+ ~u==	
 	
 	
 	
 	
 	
 
7		gdFD11222222	8		wtVT22333333	7		gdFD11222222	;		TY	7		GD)U$C$C%dE599	; 	; 	; 	; 	; 	;	9		O4x00vr**	
 	
 	
 	
 	
 	

 
:		d$5t<<(""t{+++++H$$tzw1N1NOOOOOONNLMMMMM	5T<66
tVR((EGD&",E,E 	NNIJJJFz%%%%%%  M  	N  	N  	NLMMMMMr   cmdc           	      &   |pt           }|                                                                 }|r(|d                                         dk    r
|dd         }|st	          |           dS |d                                         }|dd         }|dk    rd}d}d}d}	|	t          |          k     r||	         dk    rF|	dz   t          |          k     r0	 t          ||	dz                      }n# t          $ r Y nw xY w|	d	z  }	n||	         d
k    rF|	dz   t          |          k     r0	 t          ||	dz                      }n# t          $ r Y nw xY w|	d	z  }	n8||	         dk    r'|	dz   t          |          k     r||	dz            }|	d	z  }	n|	dz  }	|	t          |          k     t          ||||           dS |dk    r|s|	                    d           dS d}d}
g }d}	|	t          |          k     r||	         dk    r'|	dz   t          |          k     r||	dz            }|	d	z  }	nr||	         dk    rF|	dz   t          |          k     r0	 t          ||	dz                      }
n# t          $ r Y nw xY w|	d	z  }	n |
                    ||	                    |	dz  }	|	t          |          k     t          d                    |          ||
|           dS |dk    r|s|	                    d           dS |d         }d}d}d}d|v }d|v }t          |          D ]T\  }	}|dk    r"|	dz   t          |          k     r||	dz            }-|dk    r!|	dz   t          |          k     r||	dz            }Ut          |||||||           dS |dk    r2|s|	                    d           dS t          |d         |           dS |dk    rXd}d |v pd!|v }d|v r6|                    d          }|dz   t          |          k     r||dz            }t#          |||"           dS |d#k    r|r|d         nd}t%          ||$           dS |d%k    r|r|d         nd}t'          ||$           dS |d&k    r|r|d         nd}t)          ||$           dS |d'k    r:|s|	                    d(           dS d}d|v }t+          |d         |||)           dS |d*k    ri|sA|	                    d+           |	                    d,           |	                    d-           dS |d         }d.|v }d|v }t-          |||d|/           dS |d0k    r|s|	                    d1           dS |d         }d2}d}t          |          D ]S\  }	}|d3k    r!|	dz   t          |          k     r||	dz            }|d4k    r!|	dz   t          |          k     r||	dz            }Tt/          ||||5           dS |d6k    r|s|	                    d7           dS |d         }|d8k    r,t          |          dk    rt1          |d         |           dS |d9k    r1t          |          dk    rd|v }t3          |d         ||:           dS |	                    d7           dS |d;k    rN|st5          d|           dS |d         }t          |          dk    r|d         nd}t5          |||<           dS |d=v rt	          |           dS |	                    d>|            t	          |           dS )?a  
    Parse and dispatch `/skills <subcommand> [args]` from the chat interface.

    Examples:
        /skills search kubernetes
        /skills install openai/skills/skill-creator
        /skills install openai/skills/skill-creator --force
        /skills install https://example.com/path/SKILL.md
        /skills inspect openai/skills/skill-creator
        /skills list
        /skills list --source hub
        /skills check
        /skills update
        /skills audit
        /skills audit my-skill
        /skills uninstall my-skill
        /skills tap list
        /skills tap add owner/repo
        /skills tap remove owner/repo
    r   /skillsr   Nr  r   r   z--pager   z--sizez--source)r   r   r;   r   rE  zg[bold red]Usage:[/] /skills search <query> [--source skills-sh|well-known|github|official] [--limit N]
r   z--limitr  )r;   r   r   r  zm[bold red]Usage:[/] /skills install <identifier-or-url> [--name <name>] [--category <cat>] [--force] [--now]
r1   Tz--forcez--nowz
--categoryz--name)r   r   r   r   r   r   r_   z1[bold red]Usage:[/] /skills inspect <identifier>
r   r   z--enabled-onlyz	--enabled)r   rW  r   r  )r   r   r  r  r  z5[bold red]Usage:[/] /skills uninstall <name> [--now]
)r   r   r   r  z=[bold red]Usage:[/] /skills reset <name> [--restore] [--now]
zd[dim]Clears the bundled-skills manifest entry so future updates stop marking it as user-modified.[/]zR[dim]Pass --restore to also replace the current copy with the bundled version.[/]
z	--restore)r  r   r   r   r  zS[bold red]Usage:[/] /skills publish <skill-path> [--to github] [--repo owner/repo]
r   z--toz--repo)r  r  r   r  zT[bold red]Usage:[/] /skills snapshot export <file> | /skills snapshot import <file>
r  r  )r   r   r  )r  r   )helpz--helpz-hz[bold red]Unknown action:[/] )r4   rs   r  r   _print_skills_helpr6   intr  r   r5   rT   r   rW   r   r.  r?  rp   r|  r  r  r  r  r  r  r  r  r  )r!  r   r>   r   r  r  r   r   r;   r   r   query_partsr7   r   r   r   r   r   rM  r   rW  idxr   r  r  r  r  r  r  s                                r   handle_skills_slashr*  `  s	   * 	8AIIKKE  q!!Y..abb	 11X^^F9D	#d))mmAw(""q1us4yy'8'8tAE{++DD!   DQaH$$QT):): #DQK 0 0II!   DQaJ&&1q53t99+<+<a!eQQ# #d))mm$ 	tyKKKKKK	8		 	GG~F#d))mmAw*$$QT):):a!eQaI%%!a%#d))*;*;QU,,EE!   DQ""47+++Q #d))mm 	#((;''eQOOOOOO	9		 	GG  E  F  F  FF!W
 T! #d?dOO 	, 	,DAqL  QUSYY%6%6A;h1q53t99#4#4 $QU: ,?O!.	; 	; 	; 	; 	; 	; 
9		 	GGHIIIF47A&&&&&&	6		'4/F;$3F**Z((CQwT"" $S1Wm,PQRRRRRR	7		(tAwwDdA&&&&&&	8		(tAwwDtQ''''''	7		(tAwwDdA&&&&&&	;		 	GGLMMMF"d?T!Wal&6	8 	8 	8 	8 	8 	8 
7		 	GGTUUUGGz{{{GGijjjFAw%"d?w"2	4 	4 	4 	4 	4 	4 
9		 	GGjkkkF!W
dOO 	# 	#DAqF{{q1us4yy00a!eH}}QT!2!2AE{:f4CCCCCC	:		 	GGklllF1g(""s4yy1}}tAw222222H$$TQ%EtAweQ??????GGklllll	5 	61%%%%F!W
d))a--tAwwRza000000	+	+	+1 	
8889991s6   C/ /
C<;C<(E 
EEI! !
I.-I.c                 N    |                      t          dd                     dS )z)Print help for the /skills slash command.a1  [bold]Skills Hub Commands:[/]

  [cyan]browse[/] [--source official]   Browse all available skills (paginated)
  [cyan]search[/] <query>              Search registries for skills
  [cyan]install[/] <identifier>        Install a skill (with security scan)
  [cyan]inspect[/] <identifier>        Preview a skill without installing
  [cyan]list[/] [--source hub|builtin|local] [--enabled-only]
       List installed skills; --enabled-only filters to the active profile's live set
  [cyan]check[/] [name]                Check hub skills for upstream updates
  [cyan]update[/] [name]               Update hub skills with upstream changes
  [cyan]audit[/] [name]                Re-scan hub skills for security
  [cyan]uninstall[/] <name>            Remove a hub-installed skill
  [cyan]reset[/] <name> [--restore]    Reset bundled-skill tracking (fix 'user-modified' flag)
  [cyan]publish[/] <path> --repo <r>   Publish a skill to GitHub via PR
  [cyan]snapshot[/] export|import      Export/import skill configurations
  [cyan]tap[/] list|add|remove         Manage skill sources
r#  r   N)r5   r	   r$  s    r   r&  r&  '  s>    MM%	H !       r   )r1   )r   r   N)r   r   r   N)r1   FNFTr1   rK  )r   r   r   )r   FN)NN)NFT)FNFT)r1   N)r   r1   N)FN)r   N)9__doc__r  r  r  pathlibr   typingr   r   r   r   rich.consoler   
rich.panelr	   
rich.tabler
   hermes_constantsr   r4   rj   rD   r   r]   rf   rm   compileru   r   rt   rx   r   r   r   r'  r   r   r.  r?  rV   rF  rV  r|  r  r  r  r  r  r  r  tupler  r  r  r   r*  r&  r   r   r   <module>r5     s  	 	  				        , , , , , , , , , , , ,                         1 0 0 0 0 0799,c ,W , , , , ,^S#X 49    8( ( ( ( (<+S +S + + + + 122RZ 677 1 1 1 1 1 1d3i    : g C # xPS}    2G tCy S    2 =?+/%B %BS %B# %Bc %B(%B48%B %B %B %BP AF+/{c {cC {c {c# {c({c48{c {c {c {c| CHGL(,$&XA XA3 XA# XA4 XA )XA@DXA!%XA "XA ,0XA XA XA XAv/ /3 /'): /d / / / /d+ + +C +c +d + + + +\#c #htn # # # #L "'!&)-` `3 ``g&`26` ` ` `Fd d8C= d(72C dt d d d d.B BHSM B8G3D BPT B B B B( 8C= (72C t    B :>&+*. 0  0s  0Xg%6  0# 0#' 037 0  0  0  0F ).*."'&**~ *~3 *~ *~w'*~*~  $*~ 04*~ *~ *~ *~Z(X (X3 (Xc (X'1B (Xd (X (X (X (XV EG,0BX BX3 BX BXc BX )BX59BX BX BX BXJ^8 ^8# ^8C ^8"^8 ^8 ^8 ^8B%P %PC %P(72C %Pt %P %P %P %PP 7<48,: ,:3 ,:t ,: ( 1,:=A,: ,: ,: ,:f5N 5N 5N 5NxD DS D8G+< D D D D DN D      r   