
    i0P              	          d Z ddlZddlZddlZddlZddlmZ  ed      Zg dg dddgd	d
gg dg dg dg ddZg dg dg dg dg dg dg dg ddZ	i Z
ej                         D ]  \  ZZeD ]  Zee
e<   	  d-dZd Zd Zd Zd Zd Zd Zd  Zd! Zd" Zd# Zd$ Zd% Zd& Zd.d'Zd( Zd) Zd* Z d+ Z!e"d,k(  r e!        yy)/zK
design_md_search.py - CLI tool for searching and browsing DESIGN.md files
    N)Pathz'/home/jay/workspace/resources/design-md)claudecohereminimax
mistral.ainvidiaollamaopencode.ai	replicateztogether.aix.ai
elevenlabsrunwaymlcursorlovable)airtablecalfigmaframer
linear.appmintlifymiroposthograycastresendsanitysentrysupabasevercel	voltagentwarpwebflowzapier	hashicorpexpo
clickhousemongodb	pinterestspotify)coinbasekrakenrevolutstripewise)ibmintercomnotion
superhumanuber)bmwferrarilamborghinirenaultteslaspacex)airbnbappleclaycomposio)AIDevToolInfraDesignFintech
Enterprise
AutomotiveOther)r   r   r   r   )r,   r+   r-   r)   r*   )r0   r   r1   r   )r   r   r    r   r8   )r   r   r!   r   )r   r   r   r
   )r4   r5   r3   r:   )r"   r/   r   r   )	dashboardfintechminimaldarklandingailuxurysaasc                     | |z  S N )charwidths     //home/jay/workspace/scripts/design_md_search.py	separatorrS   ;   s    %<    c                      g } t         j                         rbt        t         j                               D ]B  }|j	                         s|dz  j                         s(| j                  |j                         D | S )z@Return sorted list of all site names that have a DESIGN.md file.	DESIGN.md)DESIGN_MD_DIRexistssortediterdiris_dirappendname)sitespaths     rR   get_all_sitesr`   ?   s`    E=0023 	(D{{}$"4!<!<!>TYY'	( LrT   c                     t         | z  dz  S )NrV   )rW   sites    rR   get_design_md_pathrd   I   s    4+--rT   c                 ^    t        |       }|j                         sy |j                  d      S )Nzutf-8)encoding)rd   rX   	read_text)rc   r_   s     rR   read_design_mdrh   M   s)    d#D;;=>>7>++rT   c                 H   | j                         }g }d}|D ]g  }t        j                  ||t        j                        rd}|j	                  |       <|s?t        j                  d|      r n|j	                  |       i |rdj                  |      j                         S dS )zAExtract a section from DESIGN.md by matching the heading pattern.FTz^##\s+\d+\.
 )
splitlinesrematch
IGNORECASEr\   joinstrip)contentsection_patternlinesresult_lines
in_sectionlines         rR   extract_sectionrx   T   s     ELJ 	&88OT2==9J%xx-%	& /;499\"((*BBrT   c                     t        | d      }|sg S g }|j                         D ]5  }|j                         }|j                  d      s%|j	                  |       7 |S )z=Extract the Key Characteristics bullet points from section 1.^##\s+1\.\s+Visual Themez- )rx   rl   rq   
startswithr\   )rr   sectionbulletsrw   strippeds        rR   extract_key_characteristicsr   f   s`    g'BCG	G""$ %::<t$NN8$% NrT   c                     t        | d      S )z.Extract the Color Palette section (section 2).z^##\s+2\.\s+Color Palette)rx   )rr   s    rR   extract_color_paletter   s   s    7$@AArT   c                    t        | d      }g }|j                         D ]h  }|j                         }|j                  d      s%d|j	                         v sd|j	                         v sIt        |      dk  sX|j                  |       j |dd S )z4Extract typography font family lines from section 3.^##\s+3\.\s+Typography- **fonttypeface   N   )rx   rl   rq   r{   lowerlenr\   )rr   r|   fontsrw   r~   s        rR   extract_typographyr   x   s    g'@AGE""$ '::<v&&HNN4D*D
V^VdVdVfHf8}s"X&	'
 !9rT   c                    t        | d      }|j                  d      D cg c]#  }|j                         s|j                         % }}|D ]-  }|j                  d      rt	        j
                  |dd      c S  yc c}w )z0Extract first paragraph of Visual Theme section.rz   z

#i  ...rQ   placeholderrk   )rx   splitrq   r{   textwrapshorten)rr   r|   p
paragraphsparas        rR   extract_theme_summaryr      sv    g'BCG%,]]6%:Haggi!'')HJH Hs###DGGH  Is
   A=A=c                 .    t         j                  | d      S )NrD   )SITE_TO_CATEGORYgetrb   s    rR   site_categoryr      s    g..rT   c                     t         j                         D ]*  \  }}|j                         | j                         k(  s(|c S  g S )z:Return sites for a given category name (case-insensitive).)
CATEGORIESitemsr   )category_namecatr^   s      rR   sites_in_categoryr      sA     &&( 
U99;---//L IrT   c           	         t               }t        |      }t        t                      t        d       t        t                      t                d}t        j                         D ]  \  }}|D cg c]	  }||v s| }}|st        d| dt        |       d       t        t        dd             t        |d      D ]  \  }}	t        d	|d
d|	         t                |t        |      z  } t        j                         D ch c]  }|D ]  }|  }
}}|D cg c]	  }||
vs| }}|rMt        d       t        t        dd             |D ]  }	t        d|	         t                |t        |      z  }t        t                      t        d| d       t        t                      y c c}w c c}}w c c}w )Nz  DESIGN.md Site Catalogr   []  (z sites)-H        z>2. z[Uncategorized]       z	  Total: z sites)	r`   setprintrS   r   r   r   	enumeratevalues)_args	all_sitessite_settotalr   r^   s	availableirc   categorizeduncategorizeds               rR   cmd_listr      s   I9~H	)+	
$%	)+	GE &&( 	 
U %71hQ7	7#d3y>*'23iR ! A. 	'GAtBqfBtf%&	'Y	  #-"3"3"5EuE!1E1EKE )B1Qk-AQBMB iR !! 	$DGD6"#	$]##	)+	IeWF
#$	)+/ 8 FBs   1	F7;F7F<"	G,Gc                    | j                   }| j                  }t               }|r~t        |      }|sSt	        d| d       t	        ddj                  t        j                               z          t        j                  d       |D cg c]  }|t        |      v s| }}n|}t        j                  t        j                  |      t        j                        }t	        t                      t	        d| d|rd| d	nd
z          t	        t                      t	                d}d}	|D ]?  }
t!        |
      }||j#                         }g }t%        |d      D ]R  \  }}|j'                  |      s|j)                         }t+        j,                  |dd      }|j/                  ||f       T |s|	dz  }	t1        |
      }t	        d|
 d| dt3        |       dt3        |      dk7  rdnd
 d	       t	        t        dd             |d d }|D ]  \  }}t	        d|dd|         t3        |      dkD  rt	        dt3        |      dz
   d       t	                |t3        |      z  }B t	        t                      |	dk(  rt	        d| d       nt	        d| d|	 d        t	        t                      y c c}w )!N[ERROR] Unknown category: ''Available categories: , r   z  Search: ""  [category: ]rk   r   x   r   r   r     [r   z matches)r   r      z    Lz>4z: z          ... and z more match(es)z  No matches found for "z  Found z match(es) across z site(s))keywordcategoryr`   r   r   rp   r   keyssysexitr   rm   compileescapero   rS   rh   rl   r   searchrq   r   r   r\   r   r   )argsr   category_filterr   filteredr   sites_to_searchpatternmatch_count
site_countrc   rr   rt   matcheslinenorw   contextr   shownctxs                       rR   
cmd_searchr      s   llGmmOI$_5//@BC*TYYz7H-IIJHHQK&/F1H3E1FF#jj7+R]];G	)+	L	
$o-7H(Jce
fg	)+	GKJ ( &?""$%eQ/ 	2LFD~~d#**,"**7#5Q01	2 !OJ%CBtfCuDWfS\UVEVT\^<__`ab)C$%BQKE$ 2fR[3%0127|a*3w<!+;*<OLMG3w<'K3(6 
)+Q)'"56%7
|8LM	)+] Gs   	J=J=c                 @   | j                   }t               }||vr|D cg c]%  }|j                         |j                         v s$|' }}t        |      dk(  r|d   }nt        |      dkD  r:t	        d| d       |D ]  }t	        d|         t        j                  d       nNt	        d| d       t	                t	        d       |D ]  }t	        d	|         t        j                  d       t        |      }|#t	        d
|        t        j                  d       t        |      }t	        t                      t	        d| d| d       t	        t                      t	                t	        |       t	                t	        t                      y c c}w )Nr   r   z[ERROR] Ambiguous site name 'z'. Did you mean one of:z  - [ERROR] Site '' not found.zAvailable sites:r   z&[ERROR] DESIGN.md not found for site: z  DESIGN.md  --  r   r   )
rc   r`   r   r   r   r   r   rh   r   rS   )r   rc   r   r   
candidatescrr   r   s           rR   cmd_showr   
  sc   99DI9!*HAdjjlaggi.GaH
Hz?aa=D_q 1$7NOP "QCj!"HHQKN4&56G$%  1#h HHQKT"G6tf=>

C	)+	dV3se1
-.	)+	G	'N	G	)+9 Is   %FFc                     t        t        |       t        |            }t        |      D ]B  }|t        |       k  r| |   nd}|t        |      k  r||   nd}t        |d| d| |        D y)zPrint two lists side-by-side.rk   <N)maxr   ranger   )
left_linesright_lines	col_widthguttermax_rowsr   lrs           rR   print_two_columnsr   3  sw    3z?C$45H8_ .Z0JqMb#k"22KN1YKp- ,-.rT   c                   " | j                   }| j                  }t               }g }||fD ]  }||vs|j                  |        |r+|D ]  }t	        d| d        t        j                  d       t        |      }t        |      }t        |      }	t        |      }
d"d}t	        t                      t	        d| d|	 d| d|
 d		       t	        t                      t	                t	        d
       t	        t        dd             t        |      }t        |      }t        j                  |xs d"      }t        j                  |xs d"      }t	        dd|z   dz   d" d| d|z   dz           t	        dt        d"       | t        d"              t        t        |      t        |            }t        |      D ]C  }|t        |      k  r||   nd}|t        |      k  r||   nd}t	        d|d" d| |        E t	                t	        d       t	        t        dd             t!        |      }t!        |      }t	        dd|z   dz   d" d| d|z   dz           t	        dt        d"       | t        d"              g }g }|D ]@  }t        j                  |"      D ]  }|j                  |        |j                  d       B |D ]@  }t        j                  |"      D ]  }|j                  |        |j                  d       B |sdg}|sdg}t        t        |      t        |            }t        |      D ]C  }|t        |      k  r||   nd}|t        |      k  r||   nd}t	        d|d" d| |        E t	                t	        d       t	        t        dd             t#        |      }t#        |      }"fd} ||      } ||      }t	        dd|z   dz   d" d| d|z   dz           t	        dt        d"       | t        d"              t        t        |      t        |            }t        |      D ]C  }|t        |      k  r||   nd}|t        |      k  r||   nd}t	        d|d" d| |        E t	                t	        d       t	        t        dd             "fd} ||      }  ||      }!t	        dd|z   dz   d" d| d|z   dz           t	        dt        d"       | t        d"              t        t        |       t        |!            }t        |      D ]C  }|t        |       k  r| |   nd}|t        |!      k  r|!|   nd}t	        d|d" d| |        E t	                t	        t                      y )Nr   r   r   "    | z  Comparing: z [z]  vs  r   z  VISUAL THEME SUMMARYr   r   z(no summary)rQ   r   z[ z ]r   rk   z  KEY CHARACTERISTICSz(none found)z&  COLOR PALETTE  (first colors listed)c                 H   g }| j                         D ]  }|j                         }|r|j                  d      r't        j                  d|      s|j                  d      r)t        j                  |d      }|j                  |       t        |      dk\  s n |xs dgS )Nr   z#[0-9A-Fa-f]{3,6}r   r   r      z(no color data))	rl   rq   r{   rm   r   r   r   r\   r   )textrt   rw   r~   shortr   s        rR   color_linesz cmd_compare.<locals>.color_lines  s    OO% 		Dzz|Hx2237yy-x8H<O<OPV<W ((PUVU#5zR		 +*++rT   z  TYPOGRAPHYc                 D   t        | d      }g }|j                         D ]w  }|j                         rj                  d      r't	        fddD              r-t        j                  d      }||vr|j                  |       t        |      dk\  sw n |xs dgS )	Nr   r   c              3   B   K   | ]  }|j                         v   y wrN   )r   ).0kwr~   s     rR   	<genexpr>z2cmd_compare.<locals>.font_lines.<locals>.<genexpr>  s#       Bb2))  Bs   )r   r   headlinebodysansserifmonodisplayr   r   
   z(no typography data))	rx   rl   rq   r{   anyr   r   r\   r   )rr   r|   rt   rw   r   r~   r   s        @rR   
font_lineszcmd_compare.<locals>.font_lines  s    !'+DE&&( 		Dzz|Hx2237  B  5A  B  B ((PUV%LL'5zR		 0/00rT   )site1site2r`   r\   r   r   r   rh   r   rS   r   r   wrapr   r   r   r   r   )#r   site_asite_br   errorsrc   e	content_a	content_bcat_acat_br   	summary_a	summary_b	wrapped_a	wrapped_br   r   r   r   chars_achars_bwrapped_chars_awrapped_chars_bbulletrw   	palette_a	palette_br   colors_acolors_br  fonts_afonts_br   s#                                     @rR   cmd_comparer  <  s   ZZFZZFIF   y MM$   	4AN1#\23	4v&Iv&I&!E&!EIF	)+	M&E7'&E7!
DE	)+ 
G	
"#	)C
%i0I%i0Ii9>KIi9>KI	Btf}t#Ai[ =1&$-$:N9O
PQ	Byi()&)C2K1L
MN3y>3y>2H8_ 0I.IaLBI.IaLB1QykM"6(1#./0 
G	
!"	)C
))4G))4G	Btf}t#Ai[ =1&$-$:N9O
PQ	Byi()&)C2K1L
MN OO #MM&	: 	)D""4(	)r"#  #MM&	: 	)D""4(	)r"#
 )*)*3'_)=>H8_ 0"#c/&:":OA"#c/&:":OA1QykM"6(1#./0 
G	
23	)C
%i0I%i0I, 9%H9%H	Btf}t#Ai[ =1&$-$:N9O
PQ	Byi()&)C2K1L
MN3x=#h-0H8_ 0s8},HQK"s8},HQK"1QykM"6(1#./0 
G	.	)C
1 #G#G	Btf}t#Ai[ =1&$-$:N9O
PQ	Byi()&)C2K1L
MN3w<W.H8_ 0c'l*GAJc'l*GAJ1QykM"6(1#./0
 
G	)+rT   c                    | j                   }| j                  }|t        vrvt        d| d       t                t        d       t        j	                         D ]&  \  }}t        d|dddj                  |              ( t        j                  d       t        |   }|r}t        t        |            }|sSt        d	| d       t        d
dj                  t        j                               z          t        j                  d       |D cg c]	  }||v s| }}t               }t        |      }t        t                      t        d| d|rd| dndz          t        t                      t                |s)t        d       t                t        t                      y t        |d      D ]  \  }	}
|
|v }t        |
      }|rdnd}t        d|	 d|
 d| d|        |rt!        |
      }|rwt#        |      }|r/t%        j&                  |d      }|d d D ]  }t        d|         t)        |      }|d d D ](  }t%        j*                  |dd      }t        d|        * t                 t        t                      t        dt-        |       d| d       t        t                      y c c}w )Nz[ERROR] Unknown use-case: 'r   zAvailable use-cases:r   z<12z  ->  r   r   r   r   z  Recommendations for: "r   r   r   rk   z-  No recommendations match the given filters.z  [DESIGN.md not found]r   r   B   r      r   r   r   z site(s) recommended for ')usecaser   RECOMMENDATIONSr   r   rp   r   r   r   r   r   r   r`   rS   r   r   rh   r   r   r  r   r   r   )r   use_caser   ucr^   	cat_sitesr   r   r   rankrc   r   r   statusrr   summarywrappedrw   charsrP   r   s                        rR   cmd_recommendr-    s   ||HmmO&+H:Q78$%(..0 	9IBBr#hfTYYu%5$678	9H%E)/:;	//@BC*TYYz7H-IIJHHQK!4qQ)^44I9~H	)+	%hZr
21@]?+1-bJ K	)+	G=>ikq) 
dH$	D! &?4&4&C5&23$T*G/8&mmG2>G ' 0v./0 4G<!"1I -D$,,TOEGE7+,- 	'* 
)+	Bs5zl4XJa
@A	)+Q 5s   	J;J;c                  Z   t        j                  ddt         j                  t        j                  d            } | j                  dd      }d|_        |j                  d	d
      }|j                  t               |j                  dd      }|j                  dd       |j                  dddd       |j                  t               |j                  dd      }|j                  dd       |j                  t               |j                  dd      }|j                  dd       |j                  dd       |j                  t               |j                  d d!      }|j                  d"d#       |j                  dddd$       |j                  t               | S )%Nzdesign_md_search.pyz/Search and browse DESIGN.md files for 58 sites.a              examples:
              python3 design_md_search.py list
              python3 design_md_search.py search "dark theme"
              python3 design_md_search.py search "gradient" --category AI
              python3 design_md_search.py show claude
              python3 design_md_search.py compare claude vercel
              python3 design_md_search.py recommend dashboard
              python3 design_md_search.py recommend dark --category DevTool
        )progdescriptionformatter_classepilogcommandCOMMAND)destmetavarTlistz%List all 58 sites grouped by category)help)funcr   z)Search keyword across all DESIGN.md filesr   z$Keyword to search (case-insensitive)z
--categoryz-cCATz_Limit search to a category (AI, DevTool, Infra, Design, Fintech, Enterprise, Automotive, Other))r6  r8  showzShow full DESIGN.md for a siterc   z'Site name (e.g. claude, vercel, stripe)comparezCompare two sites side-by-sider  zFirst site namer  zSecond site name	recommendz$Get site recommendations by use-caser#  zGUse-case (dashboard, fintech, minimal, dark, landing, ai, luxury, saas)z"Filter recommendations by category)argparseArgumentParserRawDescriptionHelpFormatterr   dedentadd_subparsersrequired
add_parserset_defaultsr   add_argumentr   r   r  r-  )parser
subparsersp_listp_searchp_show	p_comparep_recommends          rR   build_parserrN    s   $$"E << 	  		F  &&Iy&IJJ ""60W"XF
X& $$X4_$`H)*PQdn  
 z* ""60P"QF
%NO
X& %%i6V%WI7):;7);<, '':`'aKV   d1  
 -0MrT   c                  Z    t               } | j                         }|j                  |       y rN   )rN  
parse_argsr9  )rG  r   s     rR   mainrQ  V  s"    ^FDIIdOrT   __main__)=r   )r   r   )#__doc__r   rm   r>  r   pathlibr   rW   r   r$  r   r   r   r^   rc   rS   r`   rd   rh   rx   r   r   r   r   r   r   r   r   r   r   r  r-  rN  rQ  __name__rO   rT   rR   <module>rW     s3    	    >?
 I&I&BEQ4#
, AB8>:
;89	  ""$ %JC %!$%%.,C$
B
		/"R:B"R.St<F:z zF rT   