
    jX"j.                       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  SSKJrJrJr  Sr\" \	R,                  R/                  S\R0                  " 5       S-  5      5      r\S	-  r " S
 S\5      rS S!S j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5      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,S+S jr-S S,S jjr.\/S:X  a  \0" \." 5       5      eg)-z2Minimal offline-friendly ClawHub CLI for SkillHub.    )annotationsN)Path)errorparserequestzhttp://127.0.0.1:8080CLAWHUB_CONFIG_DIRz.clawhubzcookies.txtc                      \ rS rSrSrg)CliError    N)__name__
__module____qualname____firstlineno____static_attributes__r       cli/clawhubr
   r
      s    r   r
   c                    U =(       dR    [         R                  R                  S5      =(       d,    [         R                  R                  S5      =(       d    [        nUR	                  S5      $ )NCLAWHUB_REGISTRYSKILLHUB_REGISTRY/)osenvirongetDEFAULT_REGISTRYrstrip)valueraws     r   registry_urlr      sA    

p2::>>"45
pH[9\
p`pC::c?r   c                     [         R                  " U R                  SS95      $ ! [         a  n[	        SU  35      UeS nAf[         R
                   a  n[	        SU  SU 35      UeS nAff = f)Nutf-8)encodingzFile not found: zInvalid JSON in : )jsonloads	read_textFileNotFoundErrorr
   JSONDecodeError)pathexcs     r   	read_jsonr+   #   ss    Bzz$..'.:;; ;)$01s: B)$r#78cABs   "% 
A,>A,A''A,c                    U (       d  g U R                  SSS9n [        R                  " U5      $ ! [        R                   a    Us $ f = f)Nr!   replaceerrors)decoder$   r%   r(   )r   texts     r   response_payloadr2   ,   sH    ::gi:0Dzz$ s   0 A	A	c                F    [        U [        5      (       a  SU ;   a  U S   $ U $ )Ndata)
isinstancedictpayloads    r   unwrap_datar9   6   s%    '4  Vw%6vNr   c                B    [        [        R                  " U SSS95        g )NF   )ensure_asciiindent)printr$   dumpsr7   s    r   
print_jsonr@   <   s    	$**W5
;<r   c                     [         R                  R                  [        [        5      5      n [        R                  5       (       a   U R                  SSS9  U $ U $ ! [         R                  R                   a     U $ f = f)NTignore_discardignore_expires)http	cookiejarMozillaCookieJarstrCOOKIE_FILEexistsload	LoadErrorjars    r   load_cookiesrO   @   sm    
..
)
)#k*:
;C	HHDH> J3J ~~'' 	J	s   A A=<A=c                L    [         R                  SSS9  U R                  SSS9  g )NT)parentsexist_okrB   )
CONFIG_DIRmkdirsaverM   s    r   save_cookiesrV   J   s%    TD1HHDH6r   c                  N    \ rS rSrSS	S jjrSSSS.           S
S jjrSrg)ClientO   Nc                   UR                  S5      U l        U=(       dE    [        R                  R	                  S5      =(       d    [        R                  R	                  S5      U l        U(       a
  [        5       O[        R                  R                  5       U l
        [        R                  " [        R                  " U R                  5      5      U l        g )Nr   CLAWHUB_TOKENSKILLHUB_TOKEN)r   base_urlr   r   r   tokenrO   rE   rF   rG   cookiesr   build_openerHTTPCookieProcessoropener)selfr]   r^   use_cookiess       r   __init__Client.__init__P   sy     ,abjjnn_=aP`Aa
)4|~$..:Y:Y:[**7+F+Ft||+TUr   x   r4   headerstimeoutc                  U R                    U 3nSS0nU(       a  UR                  U5        U R                  (       a  SU R                   3US'   [        R                  " XcXqS9n U R
                  R                  XS9 n	[        U	R                  5       5      n
[        U R                  5        U
sS S S 5        $ ! , (       d  f       g = f! [        R                   ah  nUR                  5       R                  SSS	9nUR                  5       =(       d    UR                  n[!        S
UR"                   SU SU SU 35      UeS nAf[        R$                   a!  n[!        SU SUR                   35      UeS nAff = f)Nz
User-Agentzclawhub-offline-cli/0.1.0zBearer Authorization)r4   ri   methodrj   r!   r-   r.   zHTTP  r#   zCannot reach )r]   updater^   r   Requestrb   openr2   readrV   r_   r   	HTTPErrorr0   stripreasonr
   codeURLError)rc   rm   r)   r4   ri   rj   urlall_headersreqrespr8   r*   bodydetails                 r   r   Client.requestV   sB    v&#%@Aw'::-4TZZL+AK(oockQ
	I!!#!74*499;7T\\* 877  	Q88:$$WY$?DZZ\/SZZFU388*AfXQse2fXFGSP~~ 	I]3%r#**>?SH	IsC   &C
 ?0B9/	C
 9
CC
 C
 
E9A#EE9E44E9)r]   r_   rb   r^   )NT)r]   rH   r^   
str | Nonerd   bool)rm   rH   r)   rH   r4   zbytes | Noneri   zdict[str, str] | Nonerj   intreturnobject)r   r   r   r   re   r   r   r   r   r   rX   rX   O   s_    V ")-II I
 I 'I I 
I Ir   rX   c                   U R                  5       n U R                  5       (       d  [        SU  35      eU S-  R                  5       (       d  [        SU  35      eU S-  R                  5       (       d  [        SU  35      e[	        U S-  5      nUR                  S5      (       d  [        SU S-   35      eUR                  S5      (       d  [        S	U S-   35      e[        [        R                  " S
S95      nX!S    SUS    S3-  n[        R                  " US[        R                  S9 n[        U R                  S5      5       Hz  nUR                  5       (       d  M  [        S UR                  U 5      R                    5       5      (       a  ML  UR#                  XUR                  U 5      R%                  5       5        M|     S S S 5        U$ ! , (       d  f       U$ = f)NzSkill directory not found: zpackage.jsonzMissing package.json in zskill.mdzMissing skill.md in namez package.json must include name: versionz#package.json must include version: zclawhub-publish-)prefix-z.zipw)compression*c              3  *   #    U  H	  oS ;   v   M     g7f)>   __pycache__node_modules.gitNr   ).0parts     r   	<genexpr>#make_package_zip.<locals>.<genexpr>   s     qOptBBOps   )resolveis_dirr
   is_filer+   r   r   tempfilemkdtempzipfileZipFileZIP_DEFLATEDsortedrglobanyrelative_topartswriteas_posix)	skill_dirpackagetemp_dirzip_pathzfr)   s         r   make_package_zipr   s   s   !!#I4YK@AA&//111)=>>
"++---i[9::	N23G;;v9)n:T9UVWW;;y!!<Y=W<XYZZH$$,>?@HV_-Qwy/A.B$GGH	3G4H4H	IR9??3/0D<<>>qtO_O_`iOjOpOpqqqHHT++I6??AB 1 
J O 
J	I Os   -BG
Gc           	        S[         R                  " 5       R                   3n/ nU R                  5        HU  u  pEUR	                  SU S3R                  5       SU S3R                  5       [        U5      R                  5       S/5        MW     UR                  5        H  u  pFUR                  n[        R                  " U5      S   =(       d    SnUR	                  SU S3R                  5       SU S	U S
3R                  5       SU S3R                  5       UR                  5       S/5        M     UR                  SU S3R                  5       5        SR                  U5      SU 34$ )Nz----clawhub-z--z
z&Content-Disposition: form-data; name="z"

s   
r   zapplication/octet-streamz"; filename="z"
zContent-Type: z

z--
r   zmultipart/form-data; boundary=)uuiduuid4hexitemsextendencoderH   r   	mimetypes
guess_type
read_bytesappendjoin)	fieldsfilesboundarychunksr   r   r)   filenamectypes	            r   multipart_formr      sX   djjl../0HF||~XJd#**,8iHOOQE
!!#		
 & kkm
99$$X.q1O5OXJd#**,8mH:UZ[bbd x0779!	
 $ MMBxj'..0188F=hZHHHr   c           	         [        [        [        U SS 5      5      [        U SS 5      SS9nUR                  SSSS9n[	        U5        g	)
Nregistryr^   F)r^   rd   GETz/actuator/health
   rn   r   rX   r   getattrr   r@   argsclientr8   s      r   
cmd_healthr      sK    Lz4!@AQUW^`dIesxyFnnU$6nCGwr   c           	         [        [        [        U SS 5      5      [        U SS 5      S9nUR                  SS5      n[	        U5        g)Nr   r^   r^   r   z/api/cli/v1/authr   r   r   s      r   
cmd_whoamir      sD    Lz4!@AQUW^`dIefFnnU$67Gwr   c           	        U R                   =(       d    [        S5      nU R                  =(       d    [        R                  " S5      n[	        [        [        U SS 5      5      [        U SS 5      S9n[        R                  " XS.5      R                  S5      nUR                  SS	US
S0S9n[        UR                  5        [        U5        [        S[         3[         R"                  S9  g)Nz
Username: z
Password: r   r^   r   )usernamepasswordr!   POSTz/api/v1/auth/local/loginContent-Typeapplication/jsonr4   ri   zSaved session cookies to filer   )r   inputr   getpassrX   r   r   r$   r?   r   r   rV   r_   r@   r>   rI   sysstderr)r   r   r   r   r}   r8   s         r   	cmd_loginr      s    }}3l 3H}}= =HLz4!@AQUW^`dIefF::8BCJJ7SDnn"!34	  G  w	%k]
3#**Er   c           	     "   [        [        [        U SS 5      5      [        U SS 5      S9n[        R                  " U R
                  U R                  U R                  S.5      R                  S5      nUR                  SSUSS	0S
9n[        U5        g)Nr   r^   r   )r   scopes	expiresAtr!   r   z/api/v1/tokensr   r   r   r   )rX   r   r   r$   r?   r   scope
expires_atr   r   r@   )r   r   r}   r8   s       r   cmd_token_creater      s    Lz4!@AQUW^`dIefF::IIjj	
 fWo 	 nn!34	  G wr   c                   [        [        [        U SS 5      5      [        U SS 5      S9n[        [	        U R
                  5      5      n SU R                  0n[        USU05      u  pES[        R                  " U R                  5       S3nUR                  SUUS	U0U R                  S
9n[        U5      nU R                  (       a  [        U5        O[!        U["        5      (       a  UR%                  SU R                  5      n	UR%                  S5      =(       d    [	        U R
                  5      R&                  n
UR%                  S5      =(       d    SnUR%                  S5      =(       d    U R                  n[)        SU	 SU
 SU SU S3	5        O[        U5         [*        R,                  " UR.                  SS9  g! [*        R,                  " UR.                  SS9  f = f)Nr   r^   r   
visibilityr   z/api/cli/v1/skills/z/publishr   r   rh   	namespaceslugr   unknownz
Published r   @z ()T)ignore_errorsr   )rX   r   r   r   r   r   r   r   r   quoter   r   rj   r9   r$   r@   r5   r6   r   r   r>   shutilrmtreeparent)r   r   r   r   r}   content_typer)   r8   r4   r   r   r   r   s                r   cmd_publishr      s   Lz4!@AQUW^`dIefFT^^ 45H;0+FVX4FG$U[[%@$AJ..#\2LL ! 
 7#99wd##dnn=I88F#@tDNN';'@'@Dhhy)6YG,/B4??JJyk4&'"ZLJKwhooT:hooT:s   	EF= =!Gc           	        [        [        [        U SS 5      5      [        U SS 5      S9n[        R                  " U R
                  U R                  U R                  =(       d    SS.5      nUR                  SSU 35      n[        U5        g)	Nr   r^   r    )qlimitr   r   z/api/cli/v1/skills/search?r   )
rX   r   r   r   	urlencodequeryr   r   r   r@   )r   r   r   r8   s       r   
cmd_searchr      sz    Lz4!@AQUW^`dIefFOOZZ-2	
E nnU&@$HIGwr   c                    [         R                  " SS9n U R                  S[         R                  S[         3S9  U R                  S[         R                  SS9  [         R                  " SS	U /S
9nUR                  SSS9nUR                  SSU /S9nUR                  [        S9  UR                  SSU /S9nUR                  [        S9  UR                  SSU /S9nUR                  S5        UR                  S5        UR                  [        S9  UR                  SSU /S9nUR                  SSS9  UR                  SS/ SS 9  UR                  S!S S"S9  UR                  [        S9  UR                  S#S$U /S9nUR                  S%5        UR                  S&SS'9  UR                  S(S)/ S*QS+9  UR                  S,[        S-S.9  UR                  S/S0S1S29  UR                  [        S9  UR                  S3S4U /S9nUR                  S55        UR                  S&5        UR                  S6[        S7S.9  UR                  [        S9  U$ )8NF)add_helpz
--registryz SkillHub API base URL. Default: )defaulthelpz--tokenz7API token. Defaults to CLAWHUB_TOKEN or SKILLHUB_TOKEN.clawhubzSkillHub/ClawHub offline CLI)progdescriptionrQ   commandT)destrequiredhealthzCheck SkillHub backend health)r   rQ   )funcwhoamizShow authenticated userloginz:Login with local username/password and save session cookiez
--usernamez
--passwordztoken-createz-Create an API token using the current sessionz--namezclawhub-cli)r   z--scoper   zToken scope; may be repeated)actionr   r   z--expires-atz-ISO timestamp or server-supported date stringpublishzPublish a skill directoryr   z--namespace)r   z--visibilityPUBLIC)r  PRIVATEINTERNAL)r   choicesz	--timeout   )typer   z--json
store_truezPrint full JSON response)r  r   searchz!Search skills through the CLI APIr   z--limit   )argparseArgumentParseradd_argumentSUPPRESSr   add_subparsers
add_parserset_defaultsr   r   r   r   r   r   r   )	commonparsersubr   r   r   token_creater  r
  s	            r   build_parserr    s   $$e4F
!!/0@/AB  
 !!F   $$2F
 

Y

>C^^H+JU[T\^]F
Z(^^H+Dvh^WF
Z(NN7)epvowNxE	|$	|$	I&>>< " L
 h>i"KijndApq#34nnY-HSYRZn[G%6Cde3<,=WXk*^^H+NY_X`^aF
 
&
	R8
Z(Mr   c                   [        5       nUR                  U 5      n UR                  U5      $ ! [         a%  n[	        SU 3[
        R                  S9   S nAgS nAf[         a    [	        S[
        R                  S9   gf = f)Nz	clawhub: r      zclawhub: interrupted   )r  
parse_argsr   r
   r>   r   r   KeyboardInterrupt)argvr  r   r*   s       r   mainr  B  sn    ^FT"Dyy 	#cjj1 $3::6s   . 
B A%B ?B __main__)N)r   r   r   rH   )r)   r   r   r6   )r   bytesr   r   )r8   r   r   r   )r8   r   r   None)r   http.cookiejar.MozillaCookieJar)rN   r"  r   r!  )r   r   r   r   )r   zdict[str, str]r   zdict[str, Path]r   ztuple[bytes, str])r   zargparse.Namespacer   r   )r   zargparse.ArgumentParser)r  zlist[str] | Noner   r   )1__doc__
__future__r   r  r   http.cookiejarrE   r$   r   r   r   r   r   r   r   pathlibr   urllibr   r   r   r   r   r   homerS   rI   	Exceptionr
   r   r+   r2   r9   r@   rO   rV   rX   r   r   r   r   r   r   r   r   r  r  r   
SystemExitr   r   r   <module>r+     s    8 "      	  
     ( ( + "**..!5tyy{Z7OPQ
=(	y 	
B=7
!I !IH6I8"&;<7t
 z
TV
 r   