
    RS"j9                       S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKrSSKrSSKJr  \" \5      R'                  5       R(                  S   r\S-  S-  r\S-  S	-  r\S
-  S	-  r\S-  rS\R4                  " S\R6                  5      4S\R4                  " S\R6                  5      4S\R4                  " S\R6                  5      4S\R4                  " S\R6                  5      4S\R4                  " S\R6                  5      4S\R4                  " S\R6                  5      4S\R4                  " S\R6                  5      4S\R4                  " S\R6                  5      4/r1 SkrS2S jrS3S jrS4S5S jjr S6S7S  jjr!S6S8S! jjr"S9S" jr#S:S# jr$S;S$ jr%S<S% jr&S=S& jr'S>S' jr(S?S( jr)S?S) jr*S@S* jr+              SAS+ jr,SBS, jr-SCS- jr.SDS. jr/SES/ jr0SFS0 jr1\2S1:X  a  \3" \1" 5       5      eg)GzRCollect SKILL.md directories from public GitHub repos for offline SkillHub import.    )annotationsN)Path   configzgithub-skill-sources.jsonzseed-skillsgithub	downloadsreportszshell-downloadz\b(curl|wget)\b.+\|\s*(sh|bash)zrecursive-deletez\brm\s+-rf\bsudoz\bsudo\bevalz\beval\s+[`\"'$]zbase64-decodez\bbase64\b.+\b(-d|--decode)\bnetcatz\b(nc|netcat)\b\s+zprivate-keyzBEGIN [A-Z ]*PRIVATE KEYzsecret-tokenz5\b(api[_-]?key|secret|token)\s*[:=]\s*['\"][^'\"]{8,}>    .js.md.py.rb.sh.ts.css.csv.env.ini.mjs.sql.txt.xml.yml.bash.html.json.toml.yaml.jsonlc                    [        U SS9  g )NT)flush)print)messages     scripts/collect-github-skills.pylogr(   ?   s    	'    c                T    U R                  5       R                  S5      n U S;   a  S$ U $ )N/)r   .r,   )strip)values    r'   normalize_pathr/   C   s*    KKM$E9$3/%/r)   c                    U R                  5       R                  SS5      n [        R                  " SSU 5      n [        R                  " SSU 5      R	                  S5      n U =(       d    U$ )N_-z[^a-z0-9.-]+z-{2,}z.-)lowerreplaceresubr-   )r.   fallbacks     r'   slugifyr8   H   sT    KKM!!#s+EFF?C/EFF8S%(..t4EHr)   c                    SS0nU(       a  SU 3US'   [         R                  R                  XS9n[         R                  R                  USS9 nUR	                  5       sS S S 5        $ ! , (       d  f       g = f)Nz
User-Agentzskillhub-offline-collector/1.0zBearer Authorization)headers<   )timeout)urllibrequestRequesturlopenread)urltokenr;   r?   responses        r'   request_bytesrF   O   sf    =>G%,UG#4 nn$$S$:G					4}} 
5	4	4s   A))
A7c                ^    [         R                  " [        X5      R                  S5      5      $ )Nutf-8)jsonloadsrF   decode)rC   rD   s     r'   request_jsonrL   X   s!    ::mC/66w?@@r)   c                   U R                  SS5      u  pE[        U5       S[        U5       S[        U5       S3nX&-  nUR                  5       (       a.  UR                  5       R                  S:  a  [        SU 35        U$ [        R                  R                  USS9nS	U SU S
U 3n	[        SU  SU 35        UR                  R                  SSS9  UR                  [        X5      5        U$ )Nr+   r   --z.zipr   zUsing cached archive: r   )safezhttps://codeload.github.com/z/zip/zDownloading @Tparentsexist_ok)splitr8   existsstatst_sizer(   r>   parsequoteparentmkdirwrite_bytesrF   )
reporefdownloads_dirrD   ownernamearchive_namearchive_pathencoded_refrC   s
             r'   download_archivere   \   s    **S!$KEen%RbdKL /L!2!2!4!<!<q!@$\N34,,$$Sr$2K(qeK=
IC,tfAcU#$dT:]367r)   c           
         [        SU  3U5      nU UR                  S5      UR                  S5      UR                  S5      UR                  S5      UR                  S5      =(       d    0 R                  S5      UR                  S5      UR                  S	5      S
.$ ! [        R                  R                  [
        R                  4 a  nU [        U5      S.s S nA$ S nAff = f)Nzhttps://api.github.com/repos/default_branchstargazers_countforks_countopen_issues_countlicensespdx_idhtml_url	pushed_at)r]   rg   rh   ri   rj   rk   rm   rn   )r]   metadata_error)rL   getr>   errorURLErrorrI   JSONDecodeErrorstr)r]   rD   dataexcs       r'   fetch_repo_metadatarw   l   s    :;D6BEJ"hh'78 $); <88M2!%*=!>+1r66yA,+.	
 		
 LL!!4#7#78 :C99:s   BB .C#CC#C#c                   UR                  5       (       a  [        R                  " U5        UR                  SS9  [        R
                  " U 5       nUR                  U5        S S S 5        UR                  5        Vs/ s H  o3R                  5       (       d  M  UPM     nn[        U5      S:w  a  [        SU  35      eUS   $ ! , (       d  f       Nf= fs  snf )NTrR   r   zUnexpected archive root for r   )rU   shutilrmtreer[   zipfileZipFile
extractalliterdiris_dirlenRuntimeError)archivework_dirzfpathchildrens        r'   extract_archiver   }   s    hNN4N 		!R
h 
"!)!1!1!3E!3{{}!3HE
8}9'CDDA; 
"	!Es   C=CC
Cc                    [        U5      n[        U 5      n US:H  =(       d    X:H  =(       d    U R                  US-   5      $ )Nr,   r+   )r/   
startswith)r   bases     r'   is_underr      s9    $D$D3;E$,E$//$**EEr)   c                  ^  U=(       d    S/ Vs/ s H  n[        U5      PM     nnU=(       d    /  Vs/ s H  n[        U5      PM     nn[        U 4S jU 5       5      =(       a    [        U 4S jU 5       5      (       + $ s  snf s  snf )Nr,   c              3  <   >#    U  H  n[        TU5      v   M     g 7fNr   .0itemrel_dirs     r'   	<genexpr>selected.<locals>.<genexpr>   s     <84x&&8   c              3  <   >#    U  H  n[        TU5      v   M     g 7fr   r   r   s     r'   r   r      s      I,4D$Hr   )r/   any)r   includeexcluder   includesexcludess   `     r'   selectedr      s    181ASE1AB1At$1AHB18B?t$H?<8<< S I,4I F B  C?s
   BBc                   U R                  S5      (       d  0 $ U R                  5       n0 nUSS   H  nUR                  5       S:X  a    U$ [        R                  " SU5      nU(       d  M:  UR                  S5      R                  5       R                  S5      X$R                  S5      R                  5       R                  5       '   M     U$ )N---r   z^([A-Za-z0-9_-]+):\s*(.*)$   z"')r   
splitlinesr-   r5   matchgroupr3   )textlinesru   liner   s        r'   parse_frontmatterr      s    ??5!!	OOEDab	::<5  K 6=538;;q>3G3G3I3O3OPU3VDQ%%'--/0  Kr)   c                    U R                  5        HB  n[        R                  " SU5      nU(       d  M#  UR                  S5      R	                  5       s  $    g )Nz^#\s+(.+?)\s*$r   )r   r5   r   r   r-   )r   r   r   s      r'   first_headingr      sE    !*D15;;q>'')) " r)   c                    U R                  5        HF  nUR                  5       nU(       a%  UR                  S5      (       d  US:X  d	  SUS S ;   a  MA  US S s  $    g )N#r   :       )r   r-   r   )r   r   s     r'   first_sentencer      sV    !zz|ts++tu}tCRy@PDSz	 "
 r)   c                   U R                  SSS9n[        U5      nUR                  S5      =(       d(    [        U5      =(       d    U R                  R
                  nUR                  S5      =(       d,    [        U5      =(       d    SU R                  R
                   S3n[        X0R                  R
                  5      UUUR                  S5      UUS	.$ )
NrH   r4   encodingerrorsra   descriptionzImported skill from r,   rk   )ra   titler   rk   frontmatterr   )	read_textr   rp   r   rZ   ra   r   r8   )
skill_filer   r   ra   r   s        r'   read_skill_metadatar      s    CD#D)K??6"SmD&9SZ=N=N=S=SD& 	<$	<!*"3"3"8"8!9;  //445"??9-" r)   c           	        U S-  n0 nUR                  5       (       a$   [        R                  " UR                  SS95      nUR                  SUS   5        UR                  SS5        UR                  SUS   5        UR                  SS	UR                  S
S5      S   UR                  S
S5      S   /5        UR                  SUR                  S5      =(       d    UR                  S5      =(       d    S5        UUUSU SU S
U 3S.US'   UR                  [        R                  " USSS9S-   SS9  g ! [        R                   a    0 n GNf = f)Nzpackage.jsonrH   r   ra   versionz0.1.0r   keywordszgithub-importr+   r   r   rk   UNKNOWNzhttps://github.com/z/tree/)r]   r^   r   rC   sourceTr   ensure_asciiindent
)
rU   rI   rJ   r   rs   
setdefaultrT   rp   
write_textdumps)	skill_dirmetadatarepo_metadatasource_repo
source_refsource_pathpackage_pathpackages           r'   ensure_package_jsonr      s\    ~-LG	jj!7!7!7!IJG vx/0y'*}h}&=>zO[5F5FsA5Nq5QS^SdSdehjkSlmnSo#pqy(,,y"9"f]=N=Ny=Y"f]fg$[M
|1[MR	GH DJJwT!LtS^ef ## 	G	s   #D5 5EEc                v   / nU R                  S5       H  nUR                  5       (       a  UR                  R                  5       S:w  a  M8  UR                  R                  U 5      R                  5       n[        XQU5      (       d  Mt  UR                  UR                  5        M     [        [        U5      5      $ )N*skill.md)rglobis_filera   r3   rZ   relative_toas_posixr   appendsortedset)rootr   r   
skill_dirsr   r   s         r'   find_skill_dirsr      s    Jjjo
!!##z'<'<'>*'L##//5>>@Gg..j//0 & #j/""r)   c                $   / nU R                  S5       H  nUR                  5       (       d  M  UR                  U 5      R                  5       nUR                  R                  5       [        ;  a  M]  UR                  5       R                  S:  a2  UR                  USUR                  5       R                   S3S.5        M  UR                  SSS9n[         H1  u  pVUR                  U5      (       d  M  UR                  X5S	S.5        M3     M     U$ )
Nr   i   z
large-filez bytes)filekinddetailrH   ignorer   zpattern matched)r   r   r   r   suffixr3   TEXT_EXTENSIONSrV   rW   r   r   DANGEROUS_PATTERNSsearch)r   findingsr   relr   r   patterns          r'   scan_directoryr      s    H$||~~y)224;;o599;,OOS,TYY[M`M`LaagJhij~~wx~@/MD~~d##FW XY 0 % Or)   c                   [         R                  " U R                  R                  SS95      n[        R
                  R                  S5      nU R                  nU R                  n[        S-  S-  nUR                  SSS9  UR                  SSS9  / n/ nUS    GH  nUS	   n	UR                  S
S5      n
UR                  S5      =(       d    [        U	R                  SS5      5      n[        U	R                  SS5      5      nX<-  nUR                  5       (       a  [        R                  " U5        UR                  SS9  [!        X5      n[#        XXB5      n[%        XU-  5      n['        UUR                  SS/5      UR                  S/ 5      5      nU R(                  (       a  US U R(                   nU	U
UUR                  S5      UR                  S5      U[+        U5      S.nUR-                  U5        [/        S[+        U5       SU	 35        [1        5       nU GHd  nUR3                  U5      R5                  5       n[7        S UR9                  5        5       5      n[;        U5      nUS   nUU;   a$  [        UR<                  R>                   SU 35      nURA                  U5        UU-  n[        RB                  " UU5        US-  nUR                  5       (       d  URE                  US   SS9  [G        UUXU
U5        [I        U5      nUR-                  UUS   US   UU	U
UUR3                  [        5      R5                  5       UR                  S5      =(       d    UR                  S5      =(       d    S US!.
5        GMg     GM     US"-  nURE                  [         RJ                  " USS#S$9S%-   SS9  US&-  nURE                  [         RJ                  " USS#S$9S%-   SS9  Xg4$ )'NrH   r   GITHUB_TOKENz.tmpzgithub-skill-collectorTrQ   sourcesr]   r^   main	namespacer+   r2   rN   ry   r   r,   r   selection_reasonlicense_note)r]   r^   r   r   r   r   skill_countzFound z skills in c              3     #    U  H=  oR                  5       (       d  M  UR                  R                  5       S :X  d  M9  Uv   M?     g7f)r   N)r   ra   r3   )r   r   s     r'   r   collect.<locals>.<genexpr>1  s1      %!5DIIOOL]akLk!5s   AA	Ara   r   r   r   r   rk   r   )
ra   r   r   r   r   r   r   package_dirrk   security_findingsz_catalog.jsonr   r   r   z_sources.json)&rI   rJ   r   r   osenvironrp   outputr   ROOTr[   r8   r4   rU   rz   r{   rw   re   r   r   limit_per_repor   r   r(   r   r   r   nextr   r   rZ   ra   addcopytreer   r   r   r   )argsr   rD   output_rootr_   	work_rootcatalogrepo_summariesr   r]   r^   r   	repo_slugrepo_outputr   r   	extractedr   repo_summary
used_slugs
source_dirr   source_skill_filer   
skill_slug
target_dirtarget_skill_filer   catalog_path	repo_paths                                 r'   collectr    s   ZZ...@AFJJNN>*E++KNNMv 88IdT2t4G!#N#f~jj'JJ{+Nwt||C7M/N	DLLd34	!-MM+&$'+D8"4mC#G-BC	$Y

9se0LfjjYbdfNgh
#$9d&9&9:J " &

+= >"JJ~6%z?
 	l+fS_%[78"u
$J ,,Y7@@BG $ %!+!3!3!5% ! ++<=H!&)JZ'$
(9(9(>(>'?q%MN
NN:&$z1JOOJ
3 *Z 7$++--!,,Xf-=,P
Hm3PWX%j1HNN&%g.#+M#:!*#'"%#*#-#9#9$#?#H#H#J'||I6c-:K:KI:VcZc)1' %= $@ 0LDJJwT!LtS^efo-INaPSWWbij""r)   c                    UR                  SSS9  US-  nSSS[        R                  R                  [        R                  R
                  5      R                  5        3SSS/nU H  nUR                  S0 5      nUR                  S	US
    SUS    SUS    S3SUR                  SS5       SUR                  SS5       SUR                  SS5       3SUR                  S5       3SUR                  S5       3/5        M     UR                  / SQ5        U  Vs/ s H  owS   (       d  M  UPM     nnU(       d  UR                  S5        O[U HU  nUR                  S	US    SUS    S US!    SUS"    35        US    H   n	UR                  S#U	S$    S%U	S&    35        M"     MW     UR                  / S'Q5        U  H&  nUR                  S	US    SUS    S(US)    35        M(     UR                  S*R                  U5      S*-   S+S,9  U$ s  snf )-NTrQ   zgithub-skill-import-report.mdz# GitHub Skill Import Reportr   zGenerated at: z
## Sourcesr   z- r]   z (r   z): r   z skillsz  - Stars: rh   unknownz	; forks: ri   z; license: rk   z  - Reason: r   z  - License note: r   )r   z## Skill Findingsr   r   z9No simple static risk patterns matched in imported files.r+   ra   z from r   r   z  - r   z: r   )r   z## Imported Skillsr   z - r   r   rH   r   )r[   dtdatetimenowtimezoneutc	isoformatrp   extendr   r   join)
r  reposreports_dirreport_pathr   r]   metar   riskyfindings
             r'   write_reportr!  X  sq   dT2 ??K&

9CCEFG

E xx
B'T&\N"T+%6$7s4;N:OwWdhh'99EFiPTPXPXYfhqPrOss~  @D  @H  @H  IR  T]  @^  _  `txx(:;<=$TXXn%=$>?		
  
LL./%Cgd.A)BTgECPQDLL2d;/0$v,vd=FYEZZ[\`an\o[pqr 34tGFO#4Bwv6GHI 5  
LL	
 r${+,Ad6l^3tM?R>STU 499U+d2WE% Ds   H,Hc                 X   [         R                  " [        S9n U R                  S[        [
        S9  U R                  S[        [        S9  U R                  S[        [        S9  U R                  S[        [        S9  U R                  S[        SS	S
9  U R                  5       n [        U5      u  p#[        X#UR                  5      n[%        S['        U5       SUR(                   35        [%        SU 35        g! [         a%  n[        SU 3[         R"                  S9   S nAgS nAff = f)N)r   z	--sources)typedefaultz--outputz--downloadsz	--reportsz--limit-per-repor   z,For smoke tests; 0 imports all found skills.)r#  r$  helpzcollect-github-skills failed: )r   r   z	Imported z skills into zReport: )argparseArgumentParser__doc__add_argumentr   DEFAULT_SOURCESDEFAULT_OUTPUTDEFAULT_DOWNLOADSDEFAULT_REPORTSint
parse_argsr  r!  r	   	Exceptionr%   sysstderrr(   r   r   )parserr   r  r  r  rv   s         r'   r   r     s
   $$9F
$H

~F
D:KL
$H
*aFtuD "74<<@
 )CL>t{{m<=(;- !  .se43::Fs   $#C: :
D)D$$D)__main__)r&   rt   returnNone)r.   rt   r5  rt   )skill)r.   rt   r7   rt   r5  rt   r   )rC   rt   rD   
str | Noner5  bytes)rC   rt   rD   r8  r5  dict)
r]   rt   r^   rt   r_   r   rD   r8  r5  r   )r]   rt   rD   r8  r5  r:  )r   r   r   r   r5  r   )r   rt   r   rt   r5  bool)r   rt   r   	list[str]r   r<  r5  r;  )r   rt   r5  r:  )r   rt   r5  r8  )r   r   r5  r:  )r   r   r   r:  r   r:  r   rt   r   rt   r   rt   r5  r6  )r   r   r   r<  r   r<  r5  z
list[Path])r   r   r5  
list[dict])r   zargparse.Namespacer5  ztuple[list[dict], list[dict]])r  r=  r  r=  r  r   r5  r   )r5  r.  )4r(  
__future__r   r&  r  r  rI   r   r5   rz   r1  urllib.errorr>   urllib.parseurllib.requestr|   pathlibr   __file__resolverR   r   r*  r+  r,  r-  compileIr   r   r(   r/   r8   rF   rL   re   rw   r   r   r   r   r   r   r   r   r   r   r  r!  r   __name__
SystemExit r)   r'   <module>rJ     s'   X "    	 	  
      H~''*/$??%0;&1 " rzz"DbddKLORTT:;RZZRTT*+RZZ+RTT23bjj!A244HIrzz/67BJJ:BDDABRZZ XZ\Z^Z^_`	 40
A :"	F&ggg g 	g
 g g 
g<#$Q#h(V* z
TV
 r)   