From 8e131fe604ebfdaba81cd064ac4a441f5e436d7e Mon Sep 17 00:00:00 2001 From: Jake Strawn Date: Thu, 26 Mar 2026 05:22:14 -0400 Subject: [PATCH 1/8] docs: add social card image + update README badges Co-Authored-By: Claude Sonnet 4.6 --- README.md | 5 +++++ assets/social-card.webp | Bin 0 -> 6578 bytes 2 files changed, 5 insertions(+) create mode 100644 assets/social-card.webp diff --git a/README.md b/README.md index de39877..f449170 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@
+HELiXiR — MCP Server for Web Component Libraries + # HELiXiR **Give AI agents full situational awareness of any web component library.** @@ -13,6 +15,9 @@ Stop AI hallucinations. Ground every component suggestion in your actual Custom [![Node 20+](https://img.shields.io/badge/node-%3E%3D20-brightgreen)](https://nodejs.org) [![Build](https://img.shields.io/github/actions/workflow/status/bookedsolidtech/helixir/build.yml?branch=main&label=build)](https://github.com/bookedsolidtech/helixir/actions/workflows/build.yml) [![Tests](https://img.shields.io/github/actions/workflow/status/bookedsolidtech/helixir/test.yml?branch=main&label=tests)](https://github.com/bookedsolidtech/helixir/actions/workflows/test.yml) +[![MCP Protocol](https://img.shields.io/badge/MCP-protocol-purple)](https://modelcontextprotocol.io) +[![TypeScript](https://img.shields.io/badge/TypeScript-strict-blue?logo=typescript)](https://www.typescriptlang.org) +[![Tools](https://img.shields.io/badge/tools-87%2B-purple)](https://www.npmjs.com/package/helixir) [Quick Start](#quick-start) · [Why HELiXiR](#why-helixir) · [Tools Reference](#tools-reference) · [Configuration](#configuration) · [AI Tool Configs](#ai-tool-configs) diff --git a/assets/social-card.webp b/assets/social-card.webp new file mode 100644 index 0000000000000000000000000000000000000000..8b8a77239ed4dfaa7fbfedf5eafed216eaed298c GIT binary patch literal 6578 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 literal 0 HcmV?d00001 From ba6ec2b5a9a039fd93988391b01ceebb3dfaea44 Mon Sep 17 00:00:00 2001 From: Jake Strawn Date: Thu, 26 Mar 2026 09:33:57 -0400 Subject: [PATCH 2/8] docs: update social card with color-branded export Replace webp-only social card with PNG exported from Playwright. helixir purple (#8b5cf6) branded at 1200x630. Co-Authored-By: Claude Sonnet 4.6 --- assets/social-card.png | Bin 0 -> 166713 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/social-card.png diff --git a/assets/social-card.png b/assets/social-card.png new file mode 100644 index 0000000000000000000000000000000000000000..8e9bdcf2a906ce4616705436981be4c5d0eb8f49 GIT binary patch literal 166713 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%0D?7D%U*@ zoA@oSGK`eR@sB7&nV*{FIMVsCoTqK)I^Ma?ehC+hJv7X8S&a@vv{Tjd#(wpNe@zdl z{%K1f*l&BA*Yxqnyh9M@a(TVZcwR<*N1oj2soi(eP|mj^xw`h&$%$?{kHSj6W;AKB z%ek-o6+4%!L1f1a^){Rdociq*W~&PG4smJ*^Ad|c&QI%vy>X4osAr^eB!hxr))20w z4^B2J-eMj_2Ek5O=bX^Yau20mSaV|eY;IW|9TYaaZantMUG@H>3&F*^xsOgGhZ>(f zC0p_$E|ohc_6sfd#pK^vPv+TZHautr_Z86~Xa4Xm$gws`I(+T* zJKulgd>z6s+RHSf!KN6HtC`VUKJN_+vC6(K2!zQ@V0ei-f(>9AiEgRiK4AzItCfvc zYrV+XZ#C$$Wa9oPEiAxkVC}m4{UCbt7euwcDEmdHTzT~ybA~xHda9F%#CTkSeGlFj zhE$9*RZtJKmlC=Mk>NC5On$(`?g5_dC&EmsHCo(+E28}$o=F7zth05EMJXk6qGG*a zaL>y9p`{b_&7MWeD5=>f$e>~QWl)LGXXQJc>bnoschjXOJox)A6^-KuU3Hf|GwRo0 zSsh&G7Y^)gJh8%9q+5=-qODTwJlAOi5go?3f6;6`63Dy4$2SOMf#->9#)q(g?NroY zL4A&`#H`4DIcaChqKv8J!u&U4>$VHo3j*%9{Ick z(a<q^M-OmV3;f-qD~}lD4t%ce1yg_)}w}euUs^Q037$#7AW)O z;OOZrV(e7{RZeDYFl7)(>MH=%7d=1;cAMgxi5e zx!$Tg3puZCs}BkBil<8hm2pLr?L^F(ysouIr{h!Asjqbr8PFxD^L#}C|ItBd+#QEf zW+lS5p0kk{Iuptx4OxP0Ps@-Xw_|i`d(NJJXyhW<7fcXngxR)0NKtDT8%4!o(i2@? z)fLyOSSOmM1s##8(jh^8<5FR6f(|fJyu2!zY*yaa`XHWS8m}39ZWp49)bxnHa#w=1=)?SEJ)-}LC zGV&Eb*8x%ipqK-tOAZGJ9E!w`93lf#ZUdyBKQYgJb1|`IAlo~@U2`iJ1{5Bk=0h5W z2wFn=Cmhr&_r5%V!5Cr{Pj`LfI4ray7%w+ZbqZ{#pDu|AHlb?g;=XsD97oXX2r;WQIPJAfws%2 zqmPJhCh}3ZSr&090w%C{&NNmmHt}8FpGhf;b?_fB2jZibNF}*!^aF}th;Kn*&4+sS z$z}mrUnu1kkB8?BO5vp`HXSSaWEk=)y{4HB9H)VMD_YG;w86#~EGCS*5DGn+gsK9ZL?|Nk@hwIaHF(FqVyfuh{t ziO@CLAOsLCN(-fFgax{51wwE+-?17m2o(HGHBJ?tYJ|4S*ws5M37ll1DLI?TdzFtQ zWHZJ}`IohD9yAC7U9kZ8+=8CNYOHUHsMrOUQWnq$@~tEz4|WhP1)xau_OEAJOfc;i z7ceN2IAdg#)go@vhi5rscKPjBBYI^Z9dV*;QhUmFriR%)a?DCeqIKQv(aWF%2-8&G zg~bctl_+rHEtXN9$19|5OyDScKoz#wdy(eGmZ@e^S@@YUK;PeDt(pT>c92zw0qLVs zo#$DG#;WHl|4;emN8yY>Q|0%qNDl#j`BYc$dimU?F06O&4Y7D+4^1#WtX zKJVd&9p07^vD{sJ@{GZ8sj$EMK?7M8a;iu?B7iN3vx1Zy^d<{X;g{mvxkzJn$jKuP zd7np#tRu%Hdi#PPxXxh;SPa)A2iGZx$F@c(G?+>R{-r0Iq7UXUC6D z53{pCXS>D_sK|y|`&xK1@R{|(L@M@Kxvbn3RxR!`dtfaKJVfs`i??&0zoU{8%Q_wC z6P)=OLS8f()>IbxhPE6Bh#wx|-sSK8k#mo#jI5Y3ibP2Y&Y~w6m zggjyrWP$gqzZu*cj2(z-@-%+p+z9<+MmbT+J$t9KFC?gLAh4~%)k~!<`64WkoVB;f za!*o`P&204_sydFV?<=?%u8iQ0qe`89*-r-XVty^;$w0VDeM+=@%}Btm$f;bKK4L4 zk07>#%UFV@6~n&&r;mhWb&2@v)|jQDJvRf2 zY(Kt?n*Uj(LEII82;gny%yuL-rMN=r+t)lEOz0ewCSeCD)mO?|_q8W}r8{>Mho|KJ(ng?L+7ciL`@#x6Ml7DEp7yx${ETN5}{x?qH3<4ntd;F;OWmZnvL~?)5 zAt6(xay`45=RUw@YQ<^@tw**S%!n}_bwx<6Z6;;WW2Lk6h%p3aJ!0sS``s+RvFrS3 z{KMa>BU<$yrI=^ZZd$z(3c|hMv-eDIt1OJo9IEhs%G?GB4i82xmPizkfcX_e|^(s++a}+>x#9<;{1UC*R!3rH>sT)c~-=*Qgl%he;iPVND%=hvxA1_jta= z^zo7-jK)8}0YKvbd8Vel-VT6>I>jPcTWB6?kE95IbU#ML=NFqwgB|a2@1{i$wOuOkyF|yx zy~7AC3M?^*giHa-5eH$49nkgLvk!NDq%;ijgaSe1Ut5EC(=e%TGmwW0b$g}d;cN-$ zfCgyc6K4dW@frh0&z7pQQG7y8Rt<3M-**b8l*YxD3X!rGi)7)cCjxj;AEtj;jrczH z89rTFgsa7JH2Lp$z0hV-_p(mz$XHwM_$y`jY2)e8uIk_ddK3U63z>du7g53kR0ySd z{Z{awgF38WiGlwP@D`8)*u3hcu2oZuYKVqls{@#pq_Krkl>%(GlEo1}1}_9&rfwc- z)9HYP(g)|20RgQUDAzSz5cAx@As&2)f+toN<1#w2oEj)QMnA~2^e}xapMfAC+oHdC z>;b|Bl9G6>pWaA$Qog95U_PZ7kjPImTM_k5)Yp}R9Zh_s-Eb7B;auWa)kyE(TTnu< z&OoFOZ{|IjVjX!0u*wUED)J9ux5I@sDcl0JFmhq2J~635y|7QS6s8Nhv^4FT3gHf< zI^pOnX&shiV|C=pekq!t_@SW#c>=wI5BmCt8+Fxwhx9>0X!Ft{g1~!~1I!}gl+Q7=R1Qo5c9nx9%^5tO4+Or_N8P%{hi*OvCHTky_;3 z9T3HHI?Zd=XZaB`deByzqxc#{QgT6EbEu1@QU9hm8 zA?(c0P_$AMqW`r!VxClYkpQY_cyv|>J*#f61Pb+H$BW& zlR!d}%L&%Mz;9+wB0LN0D7zo5{@_+c(KxJ|elz<;hC^Q6szk}8MJA(1U1#y7OED&5!T%vtV<#%!s-0c^@T921e>0>}qf(D49o*i;*YS|$wRXRJErO}1m^#%xC zbDlW%4VrD!mxqO+hbh&E4b`y7Bbb(3Q1h*o=yn>+ov87~bKWF5VV4GjTYnQep)6k< z2c$=+vr9OwA3(ug2*<=ATAH%ovj$Qe$-QocvDkH-L0T9!%`IlPDz91uJht};g$e_q z`r3N19Ms8Lp#%Exju0la&7<0Cv0Uw>XBcm{8YqEf0oX<&03(QnDJF-NjDWbje8hb@LRH{fubwj$zy$289kw0l|?Whbhmp>@4I$fSCJ(%1Rc) zr9vGu>q*^0E7bR(&>*>9ZyWOhVSMI`rwMMk(RB#+-=I^+DDv~z*Dvh0O^TqPea<*vW~LATOe&k3`J?c^VD3fO z@u-0KrC`9I_k~hy@c{A~efW&jTMViD&^xUE{op{Flx4*k%C8f4Vnx`An>8S{DEP~h z<^e=a>CXvks^XUlS10!wF>(f^F9)M|qcmiXvf!ow{R#7TojZj=D3~DJB0-lZS!b6~ zBj-uwhOP-7dQX1d2LFgFWoJk~VxbR;um(ufig?~VMP8wGXyxSo+L$( zrB#njDH{z|dNUvZoN$XLjlkOdz&>v5VPO?=3%W$LK$j-Sva-FP568|lWg`{N7-;3g zCM_v$uh$zGZ|1F~CKIM9WLK}3LLj}GLX5zrQx^Omz^z2)Nk`BRS;j8JS8oK_n*1hI zRtGf-KrjIAzOm>a0yqnlcXkB7SPTh*2ywElbD%6wC=*G3meeh>r#&R8q@@C#Yynbs$I|Z84(MMWNgw zHsJET10|P!7E8Lc@kZhGYK3rLxW^X!+<{)?doBE1wSVWcb;#}TALtidi8?EdAZb3@ zplws_&{q@2V*J(O9VHBC069$Vf1~b&qMg?7LdqC&R|DjV0P7cp`!QrQ8DS{kZBCdU zkhb;W%m_k^_v3x%O|*dHfPgH;!^@M*$oo`835X29s#gx9)@i>mzG9GI9H3b0_kWPK z=qpU||1e_T&OzK>dn$KJ&h;fv%QcO)E^_7ld-h3@FOaV8*F-O>m^yx}e2dgMM z5Y*;9A1}LZKNa__>H4R8u6n;3>zJIA_yEX^8Su`OY;`?a@=05- zuL(vR$7=EYDn715;fe*T+)LZ*DZ43yLg-de?Qsegccq{cm5ebl@SMPROojtT`3u(} z4xUAmjTU9k6~8vlJ4;}sf{oU!H5Xag(q1~uDyJt5zc+w1uSG9)rLv`buO>7qm&=@+ z0Ru}2>dSy-#AU+@ntSJNLT{+(&qL~glyAJH`mUzB_syI{O&2v_itPEv4w%B3;7Y%_ z$UKtV6-(S`@AKp~$&Bm0GZXo{_sz|EqNK8{SdMYPLMQlEXao=vJ#|Enk&Xu;&cW)` zxTZMBobr6*IrdiY!yLs{!!zu7e0Iz^IvG|BApT>kG*)l1=SqHS^t1fPJ)RDCsee!V z{goAhy`qeGHxQ3ShagfpW@2sFDI-1u#3BgVKjBgWs@)b*e-3bDtN~H*J{0&yA1+11 z8;Soc)b(3wGetzlW<9_LE<@|rx`ufn5{H~Mm>orh==eb5O3X?@9tLjK596~28kb2L zsfS^Wyp0*`g@OwxF|80#D@SFoU)TdmVV*P&Y8@Ip`vidmQK@V}pqGe1JduW%e|?s+ zc}C1pZu>6Ru8VX6Ef$d9a9O7dFKK1aF#(CZ6)J?AW+MU|Vo}T_MI~2e`zgwbk!Az& z`-!iNIQJZQoTj%Wf~|>q5RfxNf-;cc%my)svlkG)Abo|f19-Lv2pj;T0&yW&u>3)d zgpyk}?9he*;qy-p68I3CK71(*Eb7MV$ceur`NLqI*VI}G&eG-?)RBQ-4gh%b!$cj# zstp41zL37h#zX*gzn^d{Ll5TY|Ev9ge1Jt}C!|+j+g(>F;};>6T3!mkUyrA+nW}bU zL)Jl}A?QVdyz9?cLD*y8DS-z#!o~j_)J3dVkcC_uD!glgLD95hz+z0m{M2yE04gXj z?A@fcFuMwUO>N*e1W%R=$s$*8UvLiue~qM6<R6E=F4;9F1?E*o7HiE{j{9pg|W4P=~@mX)uNdA{n+m9({NrtxFu? z9+E7u+fn)vkmt_--A#(^zf5{EzmMxi8hnLvsbdpAVYIongJ~Iz4v@o@ffbQW&&K@%(mCe`9WFxo~f+$HZIJceoVzoXI#g&YV5*!PgSLksJ1ME zB}^nHUa#SC*SbEH-*x5`)@RGgMeHlU_M$~aEXtuyJHvd?{tMl5V$}p8k7k*2O(KbF z4&Nb@K66=GV5}}r3dw$X+OMBob-BJz+I8&-C%O~sJzc)z?pT?1wf#cPFj`rEEmb7_ zclSqm!j}!;`4ZLb?AF8#xDLXv50 z-?{j-fw_~i39y&e3+2)hwe~kw40587^il(Mof=jhh+}8H-f^kjy!2?lRuOg*ZYw$9 zWX6Rl$e^u=u{a*MJuGklg6n5y*pEx4$5zQN0B5pSb3(X7*a>bZf`|k%h0jOi(Fq9C z5#L(cXe|PK#=b1h>kaN-Io%c+?uIW>+C%>x#UNS?K&=KPV>+QALHdA%>$^VOg<7fM zI`bB4CW8{Zinj<@7*J>m^gjwhCLp&C0@?s@&BIVixYZ;8b3zDJyFn#G2q2ItXYe7x zUr`X=R$#+Mv49KI@i@HYxPYJ2as#dmw2^q6+}4mRSi6$E+jc2SX%>|L5g7DSfLOA| z)RhPVVc;ssNo)Sa`QXDoPJI3kNJq5-whbWAG2-8mgz$Um)gBNPcv0Xt02)Cjm4kci zSNP~IOpvmab;hqk5)FAk0kxw2&AAb=fy2SY(m_aj@UXQ+ZkTKd;sEZt5H^mOfeN62 z7+l{Z4MYC#E{-wjfjt7)-j)E7{d=M^5T-y&ByfQrWQgjC=H2(V8$D6yf&Be%$So}{ zp9o3Bg-FHt_L44x$3*NuR(2 zsCV)ZC^!Hz-P75Bl{r@+Uc*CXk@jW;{SunTR1}XsG0+~PqA?)qVMx4$aGL?CgJb ztES(V`O%?~O>zl1-qADB`TsV0Kn%~+o$uz_JIL6dRBbEr} zDckFJcIsZq_@@_nHGUKl*A{l}a)WwQ@R3k`2Jy{L+?d-L1wO8ZcLX9uCHAnhd{ndC zrDGs#m1`@ck_}8$wH^<0BCE~#E$^W(W3(Ubl%j55;<#oSOFm&zL`7GnZC5LW{642W zcuT{z_2Z$k<&#hreNod`4RM=@hbYPo4-w)#x*`}R8BFys4VlAxlN#Uk8HA{_jYVfO=&B? zAJ^(ReU&)yUC4mSf7aMWO0G z%C0q$*18^5G{wu@CqSnGE&d7cBX0y=Cd#_GR_&H3z4RyEupR0_6^=^YiTQ#a3%* z+wKjD^Xfc&7v&?&6;Ryox@Hr<#W(=(mr;1wZ$2$wxYjfT6SZ@Gm(nwz>T+3URnI^M zgPCGQRD#&tIB7GAD+#yta-*SMZ!H@HZ1(4v!Scf(k#H<>| zj`YSjgvy#qzqq#V3LF(|d^SU`yUZbf(w2O8r=^C2nL%&E_QRuzGlq-w3_C+TWB7b0oryk! zsR+fr!FSjs1JRo%;zg&EfsN9N=dT|Ta#)U;$)ZiigyVz+2RsC|jul^=a-U| zr?BW{W`D=b*^1K8Z6wFcT<+c9#$C3m6-k)S2`g~@`aM;uR$ricM7T3({$tay1-uiF zCTHPxBa8nX2MfmvKj*??Qvk0??WNQj#&cqGgAu*!Ow2P(YS$z^Ry&yfX_{(-E_&I# z(Gsc`)Di2SL#H@7i>p$L*}3{Qx?s_C~vJM_+dxg2fu~=;3ikhW9cFk92-Q z_A<@3)hVqhnhT+Y2%8%vIUs`JjylsFA@?N zB#Xx$9J za2Us>?qyfX1ZPXSgtpzofF~H(4y{tNxgIw7v`@`fFy$}yykXR2Hd$sOUF&Xzn1XlO zz0!n9?LRo074Xms{t0=rrE8#D!D#7Nq+>@zyTXjcG_FKoVLoxhAwR67Q;6cOufl#~ zUjHo{a!54uB^ts^M8|e1fT@7KdLR?9J>9R@tddgXtjFIo>uWwx(c%OcD*X% zb(Aj^@kl^-_Z%b1&N|y2T7J&vsa_WWfy^%Nnjb`$O6mx>l8)X7Qv*xvVOg4@t zYRRp*L<2`Lk|9q=_ zxJ+kl0=zV|XoK35kh9M$PAss$DyQ<5S+0SDOsCtaM6#(~ai6YW%u9`M^BJYZ!;o?& ziz&j2xfo@Qk1^Tvco$3cjH^9m(KpBuP60o8`@B*+j#+Rr1IP_>Usk@5cfdG=O)$qa z>Dza0c%8SslsQdS_<|ZZuWYsoRhFbPyO!Ek5wijxtLox0^IMD4TF@kFC=)G36}IU~ z@o_7?Kl@=c?6q(~8BVyJ-U{LGdiEt}t%3NRzO7r#xO(iyaE}+8`pnBh54|o|SD6fR z2&9uKBj(3L!mVc`yMpeNPR6itf@JlFjOvvacqZcyA{5*jdT*b7_v*CSlUxiZN)iuv zlZvSK Date: Thu, 26 Mar 2026 16:02:07 -0400 Subject: [PATCH 3/8] refactor: fix: align @modelcontextprotocol/sdk versions across monorepo packages --- build | 1 + node_modules | 1 + packages/core/package.json | 2 +- packages/mcp/package.json | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) create mode 120000 build create mode 120000 node_modules diff --git a/build b/build new file mode 120000 index 0000000..5df8d8b --- /dev/null +++ b/build @@ -0,0 +1 @@ +/Volumes/Development/booked/helixir/build \ No newline at end of file diff --git a/node_modules b/node_modules new file mode 120000 index 0000000..07c009a --- /dev/null +++ b/node_modules @@ -0,0 +1 @@ +/Volumes/Development/booked/helixir/node_modules \ No newline at end of file diff --git a/packages/core/package.json b/packages/core/package.json index 11856c5..c0c49ba 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -16,7 +16,7 @@ }, "license": "MIT", "dependencies": { - "@modelcontextprotocol/sdk": "^1.26.0", + "@modelcontextprotocol/sdk": "^1.27.1", "zod": "^3.22.0" }, "peerDependencies": { diff --git a/packages/mcp/package.json b/packages/mcp/package.json index 839f973..5ce658c 100644 --- a/packages/mcp/package.json +++ b/packages/mcp/package.json @@ -46,7 +46,7 @@ "homepage": "https://github.com/bookedsolidtech/helixir/tree/main/packages/mcp#readme", "peerDependencies": { "helixir": ">=0.5.0", - "@modelcontextprotocol/sdk": "^1.26.0", + "@modelcontextprotocol/sdk": "^1.27.1", "zod": "^3.22.0" }, "devDependencies": { From f94ea7ba058a484f835262fe218c48c03fe06955 Mon Sep 17 00:00:00 2001 From: Jake Strawn Date: Thu, 26 Mar 2026 16:02:20 -0400 Subject: [PATCH 4/8] refactor: fix: wire scaffold_component and extend_component into MCP server --- src/mcp/index.ts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/mcp/index.ts b/src/mcp/index.ts index 37aea86..c3c49bd 100644 --- a/src/mcp/index.ts +++ b/src/mcp/index.ts @@ -92,6 +92,16 @@ import { handleThemeCall, isThemeTool, } from '../../packages/core/src/tools/theme.js'; +import { + SCAFFOLD_TOOL_DEFINITIONS, + handleScaffoldCall, + isScaffoldTool, +} from '../../packages/core/src/tools/scaffold.js'; +import { + EXTEND_TOOL_DEFINITIONS, + handleExtendCall, + isExtendTool, +} from '../../packages/core/src/tools/extend.js'; import { createErrorResponse } from '../../packages/core/src/shared/mcp-helpers.js'; import type { MCPToolResult } from '../../packages/core/src/shared/mcp-helpers.js'; @@ -199,6 +209,8 @@ export async function main(): Promise { ...TYPEGENERATE_TOOL_DEFINITIONS, ...STYLING_TOOL_DEFINITIONS, ...THEME_TOOL_DEFINITIONS, + ...SCAFFOLD_TOOL_DEFINITIONS, + ...EXTEND_TOOL_DEFINITIONS, ...tsTools, ]; @@ -290,6 +302,20 @@ export async function main(): Promise { ); return handleThemeCall(name, typedArgs, resolveCem(libraryId, cemCache)); } + if (isScaffoldTool(name)) { + if (cemCache === null || cemReloading) + return createErrorResponse( + 'CEM not yet loaded — server is still initializing. Please retry.', + ); + return handleScaffoldCall(name, typedArgs, config, resolveCem(libraryId, cemCache)); + } + if (isExtendTool(name)) { + if (cemCache === null || cemReloading) + return createErrorResponse( + 'CEM not yet loaded — server is still initializing. Please retry.', + ); + return handleExtendCall(name, typedArgs, resolveCem(libraryId, cemCache)); + } if (isBenchmarkTool(name)) return handleBenchmarkCall(name, typedArgs, config); if (isTypegenerateTool(name)) { if (cemCache === null || cemReloading) From 692886be0bfa37c0c379057d1aae3020237e7be6 Mon Sep 17 00:00:00 2001 From: Jake Strawn Date: Thu, 26 Mar 2026 16:25:34 -0400 Subject: [PATCH 5/8] feat: scaffold packages/vscode VS Code extension MVP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the helixir-vscode VS Code extension package at packages/vscode/. The extension registers helixir as an MCP server definition provider (vscode.lm, VS Code ≥ 1.99.0) so AI assistants receive full component library awareness automatically when a workspace is opened. Files created: - packages/vscode/package.json — extension manifest with publisher, mcpServerDefinitionProviders contribution, Run Health Check command, helixir.configPath setting, and vsce/ovsx scripts - packages/vscode/tsconfig.json — extends root tsconfig, noEmit for type-check-only (esbuild handles transpilation) - packages/vscode/esbuild.config.mjs — dual-bundle config: extension.js (CJS, vscode externalized) + mcp-server.js (ESM, bundles helixir) - packages/vscode/src/extension.ts — activate/deactivate exports, wires MCP provider and Run Health Check command - packages/vscode/src/mcpProvider.ts — registerMcpServerDefinitionProvider call; spawns bundled mcp-server.js via stdio with MCP_WC_PROJECT_ROOT set to the current workspace folder; degrades gracefully on older VS Code - packages/vscode/src/mcp-server-entry.ts — imports helixir/mcp and calls main(); bundled into the self-contained dist/mcp-server.js - packages/vscode/.vscodeignore — excludes src, tsconfig, node_modules, and build artefacts from the .vsix package - packages/vscode/README.md — marketplace listing with setup, config reference, commands table, and troubleshooting guide Co-Authored-By: Claude Sonnet 4.6 --- packages/vscode/.vscodeignore | 30 +++++++++ packages/vscode/README.md | 84 +++++++++++++++++++++++++ packages/vscode/esbuild.config.mjs | 69 ++++++++++++++++++++ packages/vscode/package.json | 67 ++++++++++++++++++++ packages/vscode/src/extension.ts | 39 ++++++++++++ packages/vscode/src/mcp-server-entry.ts | 16 +++++ packages/vscode/src/mcpProvider.ts | 68 ++++++++++++++++++++ packages/vscode/tsconfig.json | 15 +++++ 8 files changed, 388 insertions(+) create mode 100644 packages/vscode/.vscodeignore create mode 100644 packages/vscode/README.md create mode 100644 packages/vscode/esbuild.config.mjs create mode 100644 packages/vscode/package.json create mode 100644 packages/vscode/src/extension.ts create mode 100644 packages/vscode/src/mcp-server-entry.ts create mode 100644 packages/vscode/src/mcpProvider.ts create mode 100644 packages/vscode/tsconfig.json diff --git a/packages/vscode/.vscodeignore b/packages/vscode/.vscodeignore new file mode 100644 index 0000000..aa8e76e --- /dev/null +++ b/packages/vscode/.vscodeignore @@ -0,0 +1,30 @@ +# Source files — not needed in the packaged extension +src/ +tsconfig.json +esbuild.config.mjs + +# Development dependencies and lock files +node_modules/ +.pnpm-store/ +pnpm-lock.yaml +package-lock.json + +# Test artefacts +coverage/ +*.test.ts +*.spec.ts + +# Build intermediates (keep dist/) +*.map + +# Editor and OS artefacts +.vscode/ +.DS_Store +*.log + +# Root-level workspace files that should not be bundled +../../node_modules/ +../../src/ +../../build/ +../../packages/ +../../.github/ diff --git a/packages/vscode/README.md b/packages/vscode/README.md new file mode 100644 index 0000000..689b2fb --- /dev/null +++ b/packages/vscode/README.md @@ -0,0 +1,84 @@ +# Helixir — VS Code Extension + +**AI-powered web component intelligence for VS Code.** + +Helixir gives AI assistants full situational awareness of any web component library by wiring the [helixir MCP server](https://github.com/bookedsolidtech/helixir) directly into VS Code's MCP layer. + +## Features + +- **MCP server auto-registration** — the helixir MCP server starts automatically with VS Code, no manual configuration required +- **30+ MCP tools** — component discovery, health scoring, breaking-change detection, TypeScript diagnostics, design token lookup, and more +- **Zero hallucinations** — every AI component suggestion is grounded in your actual `custom-elements.json` +- **Framework-agnostic** — works with Lit, Stencil, FAST, Spectrum, Shoelace, or any library that produces a Custom Elements Manifest + +## Requirements + +- VS Code **≥ 1.99.0** +- A component library with a `custom-elements.json` (Custom Elements Manifest) +- Node.js **≥ 20** on `PATH` + +## Getting Started + +1. Install the extension from the VS Code Marketplace +2. Open your component library folder in VS Code +3. The Helixir MCP server will register automatically with AI assistants that support MCP (e.g., GitHub Copilot, Claude) + +### Optional: Configure the Config Path + +If your `mcpwc.config.json` is not at the workspace root, set the path via VS Code settings: + +```json +// .vscode/settings.json +{ + "helixir.configPath": "packages/web-components/mcpwc.config.json" +} +``` + +The path can be relative to the workspace root or absolute. + +## Commands + +| Command | Description | +|---------|-------------| +| `Helixir: Run Health Check` | Guides you to run a health check via your AI assistant | + +## Extension Settings + +| Setting | Type | Default | Description | +|---------|------|---------|-------------| +| `helixir.configPath` | `string` | `""` | Path to `mcpwc.config.json`. Empty = workspace root. | + +## How It Works + +When the extension activates, it registers a **MCP server definition provider** (`helixir`) with VS Code's language model API (`vscode.lm`). VS Code spawns the bundled helixir MCP server (`dist/mcp-server.js`) as a child process over stdio. + +The server reads your `custom-elements.json` and exposes 30+ tools that AI models can call to look up component APIs, run health scans, generate type declarations, and more. + +## Configuration Reference + +The helixir server is configured via environment variables passed by the extension: + +| Variable | Description | +|----------|-------------| +| `MCP_WC_PROJECT_ROOT` | Set to your workspace folder automatically | +| `MCP_WC_CONFIG_PATH` | Set when `helixir.configPath` is configured | + +Additional configuration (token path, component prefix, health history dir) belongs in `mcpwc.config.json`. See the [helixir documentation](https://github.com/bookedsolidtech/helixir) for the full config reference. + +## Troubleshooting + +**MCP server not appearing in AI assistant tools** +- Verify VS Code ≥ 1.99.0 is installed +- Confirm your workspace contains a `custom-elements.json` +- Check the Output panel → Helixir for error messages + +**"No workspace folder" error from Run Health Check** +- Open a folder (not just a file) in VS Code — the extension uses the workspace folder as the project root + +**Server starts but returns no components** +- Ensure `custom-elements.json` exists at the workspace root or configure `helixir.configPath` +- Regenerate the manifest: `npm run analyze:cem` (or your CEM generation script) + +## License + +MIT — see [LICENSE](../../LICENSE) diff --git a/packages/vscode/esbuild.config.mjs b/packages/vscode/esbuild.config.mjs new file mode 100644 index 0000000..85e5030 --- /dev/null +++ b/packages/vscode/esbuild.config.mjs @@ -0,0 +1,69 @@ +/** + * esbuild configuration for the Helixir VS Code extension. + * + * Produces two bundles: + * dist/extension.js — VS Code extension host entry (CJS, externalizes 'vscode') + * dist/mcp-server.js — Helixir MCP server entry (ESM, bundles helixir) + */ + +import * as esbuild from 'esbuild'; + +const isProduction = process.argv.includes('--production'); +const isWatch = process.argv.includes('--watch'); + +const sharedOptions = { + bundle: true, + sourcemap: !isProduction, + minify: isProduction, + logLevel: 'info', + platform: 'node', + target: 'node20', +}; + +/** + * Bundle 1: VS Code extension host entry + * - CommonJS (VS Code extension host requires CJS) + * - 'vscode' is externalized — provided by the VS Code runtime + */ +const extensionConfig = { + ...sharedOptions, + entryPoints: ['src/extension.ts'], + outfile: 'dist/extension.js', + format: 'cjs', + external: ['vscode'], +}; + +/** + * Bundle 2: Helixir MCP server + * - ESM format (helixir is an ES module) + * - Bundles helixir and its dependencies so the extension is self-contained + * - Spawned as a child process via stdio by the VS Code extension + */ +const mcpServerConfig = { + ...sharedOptions, + entryPoints: ['src/mcp-server-entry.ts'], + outfile: 'dist/mcp-server.js', + format: 'esm', + banner: { + js: '#!/usr/bin/env node\n// Helixir MCP Server — bundled by esbuild', + }, +}; + +async function build() { + const extensionCtx = await esbuild.context(extensionConfig); + const mcpServerCtx = await esbuild.context(mcpServerConfig); + + if (isWatch) { + await Promise.all([extensionCtx.watch(), mcpServerCtx.watch()]); + console.log('[helixir-vscode] Watching for changes...'); + } else { + await Promise.all([extensionCtx.rebuild(), mcpServerCtx.rebuild()]); + await Promise.all([extensionCtx.dispose(), mcpServerCtx.dispose()]); + console.log('[helixir-vscode] Build complete.'); + } +} + +build().catch((err) => { + console.error('[helixir-vscode] Build failed:', err); + process.exit(1); +}); diff --git a/packages/vscode/package.json b/packages/vscode/package.json new file mode 100644 index 0000000..5d419f4 --- /dev/null +++ b/packages/vscode/package.json @@ -0,0 +1,67 @@ +{ + "name": "helixir-vscode", + "displayName": "Helixir", + "description": "AI-powered web component intelligence for VS Code — powered by helixir MCP", + "version": "0.1.0", + "publisher": "bookedsolidtech", + "private": true, + "engines": { + "vscode": "^1.99.0" + }, + "categories": [ + "Other", + "AI" + ], + "keywords": [ + "mcp", + "web components", + "helixir", + "ai", + "custom elements" + ], + "activationEvents": [ + "onStartupFinished" + ], + "main": "./dist/extension.js", + "contributes": { + "mcpServerDefinitionProviders": [ + { + "id": "helixir", + "label": "Helixir" + } + ], + "commands": [ + { + "command": "helixir.runHealthCheck", + "title": "Helixir: Run Health Check", + "category": "Helixir" + } + ], + "configuration": { + "title": "Helixir", + "properties": { + "helixir.configPath": { + "type": "string", + "default": "", + "description": "Path to mcpwc.config.json (relative to workspace root or absolute). Leave empty to use workspace root defaults." + } + } + } + }, + "scripts": { + "vscode:prepublish": "node esbuild.config.mjs --production", + "build": "node esbuild.config.mjs", + "watch": "node esbuild.config.mjs --watch", + "package": "vsce package --no-dependencies", + "publish": "vsce publish --no-dependencies" + }, + "dependencies": { + "helixir": "workspace:*" + }, + "devDependencies": { + "@types/vscode": "^1.99.0", + "@vscode/vsce": "^3.0.0", + "esbuild": "^0.25.0", + "ovsx": "^0.9.0" + } +} diff --git a/packages/vscode/src/extension.ts b/packages/vscode/src/extension.ts new file mode 100644 index 0000000..47192ac --- /dev/null +++ b/packages/vscode/src/extension.ts @@ -0,0 +1,39 @@ +import * as vscode from 'vscode'; +import { registerMcpProvider } from './mcpProvider.js'; + +/** + * Called when the extension is activated. + * Registers the Helixir MCP server definition provider and the + * "Helixir: Run Health Check" command. + */ +export function activate(context: vscode.ExtensionContext): void { + registerMcpProvider(context); + + const healthCheckCommand = vscode.commands.registerCommand( + 'helixir.runHealthCheck', + async () => { + const workspaceFolders = vscode.workspace.workspaceFolders; + if (!workspaceFolders || workspaceFolders.length === 0) { + await vscode.window.showErrorMessage( + 'Helixir: No workspace folder is open. ' + + 'Open a component library folder to run a health check.' + ); + return; + } + + await vscode.window.showInformationMessage( + 'Helixir: MCP server is active. ' + + 'Ask your AI assistant to call score_all_components via the Helixir MCP server.' + ); + } + ); + + context.subscriptions.push(healthCheckCommand); +} + +/** + * Called when the extension is deactivated. + */ +export function deactivate(): void { + // Subscriptions are disposed automatically via context.subscriptions. +} diff --git a/packages/vscode/src/mcp-server-entry.ts b/packages/vscode/src/mcp-server-entry.ts new file mode 100644 index 0000000..ef0068d --- /dev/null +++ b/packages/vscode/src/mcp-server-entry.ts @@ -0,0 +1,16 @@ +/** + * Helixir MCP Server — entry point for the bundled server. + * + * This file is bundled by esbuild into dist/mcp-server.js (ESM format). + * It is spawned as a child process by the VS Code extension (mcpProvider.ts) + * using stdio transport. + * + * The helixir/mcp module exports a `main()` function that initialises and + * starts the MCP server, listening on stdin/stdout. + */ +import { main } from 'helixir/mcp'; + +main().catch((err: unknown) => { + process.stderr.write(`[helixir-mcp] Fatal: ${String(err)}\n`); + process.exit(1); +}); diff --git a/packages/vscode/src/mcpProvider.ts b/packages/vscode/src/mcpProvider.ts new file mode 100644 index 0000000..0bf1e95 --- /dev/null +++ b/packages/vscode/src/mcpProvider.ts @@ -0,0 +1,68 @@ +import * as path from 'path'; +import * as vscode from 'vscode'; + +/** + * Registers helixir as an MCP server definition provider with VS Code. + * + * The provider spawns dist/mcp-server.js (the bundled helixir MCP server) + * as a child process via stdio. VS Code passes it to connected AI models + * (e.g., GitHub Copilot, Claude) automatically. + * + * The server is configured with the workspace folder as MCP_WC_PROJECT_ROOT + * so helixir reads the correct custom-elements.json. + * + * Requires VS Code ≥ 1.99.0 (MCP server definition provider API). + */ +export function registerMcpProvider(context: vscode.ExtensionContext): void { + const provider = { + provideMcpServerDefinitions() { + const serverScriptPath = path.join( + context.extensionPath, + 'dist', + 'mcp-server.js' + ); + + const workspaceFolder = + vscode.workspace.workspaceFolders?.[0]?.uri.fsPath ?? process.cwd(); + + const configPath = vscode.workspace + .getConfiguration('helixir') + .get('configPath', ''); + + const env: Record = { + MCP_WC_PROJECT_ROOT: workspaceFolder, + }; + + // If the user specified a custom config path, resolve it and pass it on. + if (configPath && configPath.trim() !== '') { + env['MCP_WC_CONFIG_PATH'] = path.isAbsolute(configPath) + ? configPath + : path.join(workspaceFolder, configPath); + } + + return [ + { + label: 'Helixir', + command: 'node', + args: [serverScriptPath], + env, + }, + ]; + }, + }; + + // vscode.lm.registerMcpServerDefinitionProvider was introduced in VS Code 1.99. + // We guard the call so the extension degrades gracefully on older hosts. + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const lm = vscode.lm as any; + if (typeof lm?.registerMcpServerDefinitionProvider === 'function') { + context.subscriptions.push( + lm.registerMcpServerDefinitionProvider('helixir', provider) as vscode.Disposable + ); + } else { + console.warn( + '[helixir-vscode] vscode.lm.registerMcpServerDefinitionProvider is not available. ' + + 'Upgrade to VS Code ≥ 1.99.0 to enable MCP server support.' + ); + } +} diff --git a/packages/vscode/tsconfig.json b/packages/vscode/tsconfig.json new file mode 100644 index 0000000..cb042b5 --- /dev/null +++ b/packages/vscode/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "outDir": "dist", + "rootDir": "src", + "lib": ["ES2022"], + "strict": true, + "noEmit": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} From 02ee086eb3a0867635103a8b29511ae0191739e2 Mon Sep 17 00:00:00 2001 From: Jake Strawn Date: Thu, 26 Mar 2026 16:56:41 -0400 Subject: [PATCH 6/8] fix: replace TODO placeholder with var() fallback in theme handler default case Replaces the '/* TODO: set value */' literal in the default branch of lightPlaceholder() with var(${tokenName}), which produces valid CSS that degrades gracefully when a token category is unknown. Adds a test case that exercises the default code path by creating a CEM with a token name that does not match any known CATEGORY_PATTERNS entry, causing it to land in the 'other' bucket and hit the default switch case. Co-Authored-By: Claude Sonnet 4.6 --- packages/core/src/handlers/theme.ts | 2 +- tests/handlers/theme.test.ts | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/core/src/handlers/theme.ts b/packages/core/src/handlers/theme.ts index d10eaf8..55a6e94 100644 --- a/packages/core/src/handlers/theme.ts +++ b/packages/core/src/handlers/theme.ts @@ -145,7 +145,7 @@ function lightPlaceholder(tokenName: string, category: string): string { return '200ms'; default: - return '/* TODO: set value */'; + return `var(${tokenName})`; } } diff --git a/tests/handlers/theme.test.ts b/tests/handlers/theme.test.ts index 38e0098..4e03a48 100644 --- a/tests/handlers/theme.test.ts +++ b/tests/handlers/theme.test.ts @@ -169,6 +169,18 @@ describe('createTheme', () => { // Dark CSS should have dark values for bg expect(result.darkModeCSS).toContain('#1a1a1a'); }); + + it('produces a var() fallback for tokens with unknown categories', () => { + // --my-custom-widget does not match any known category pattern, + // so it lands in "other" and hits the default case in lightPlaceholder. + const cem = makeCem([ + { tagName: 'my-widget', cssProperties: [{ name: '--my-custom-widget' }] }, + ]); + const result = createTheme(cem); + // The generated CSS should contain var(--my-custom-widget) instead of a TODO comment + expect(result.lightModeCSS).toContain('var(--my-custom-widget)'); + expect(result.lightModeCSS).not.toContain('TODO'); + }); }); // ─── applyThemeTokens ───────────────────────────────────────────────────────── From fd40ef2bad8339cd359ddcc92420186b1f3d6eb1 Mon Sep 17 00:00:00 2001 From: Jake Strawn Date: Thu, 26 Mar 2026 17:03:09 -0400 Subject: [PATCH 7/8] test: add test suite for styling tools (29 tools, 75 tests) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add comprehensive test coverage for packages/core/src/tools/styling.ts — previously the single largest untested file in the codebase (1089 lines, zero coverage). - Tests all 29 MCP tool handlers via mocked dependencies - Verifies happy paths, missing-arg validation errors, and error propagation - Covers isStylingTool guard and the handleStylingCall dispatcher - Designed to achieve 80%+ line coverage per vitest thresholds Co-Authored-By: Claude Sonnet 4.6 --- tests/tools/styling.test.ts | 1260 +++++++++++++++++++++++++++++++++++ 1 file changed, 1260 insertions(+) create mode 100644 tests/tools/styling.test.ts diff --git a/tests/tools/styling.test.ts b/tests/tools/styling.test.ts new file mode 100644 index 0000000..6bcfed2 --- /dev/null +++ b/tests/tools/styling.test.ts @@ -0,0 +1,1260 @@ +/** + * Test suite for packages/core/src/tools/styling.ts + * + * Tests the handleStylingCall dispatcher and isStylingTool guard. + * All handler imports are mocked so no real CEM file reads or heavy + * computation happens during unit tests. + */ +import { describe, it, expect, vi, afterEach } from 'vitest'; +import { handleStylingCall, isStylingTool } from '../../packages/core/src/tools/styling.js'; +import type { Cem } from '../../packages/core/src/handlers/cem.js'; +import { MCPError, ErrorCategory } from '../../packages/core/src/shared/error-handling.js'; + +// --------------------------------------------------------------------------- +// Mock every handler that handleStylingCall delegates to +// --------------------------------------------------------------------------- + +vi.mock('../../packages/core/src/handlers/cem.js', () => ({ + parseCem: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/styling-diagnostics.js', () => ({ + diagnoseStyling: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/shadow-dom-checker.js', () => ({ + checkShadowDomUsage: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/html-usage-checker.js', () => ({ + checkHtmlUsage: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/event-usage-checker.js', () => ({ + checkEventUsage: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/quick-ref.js', () => ({ + getComponentQuickRef: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/theme-detection.js', () => ({ + detectThemeSupport: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/import-checker.js', () => ({ + checkComponentImports: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/slot-children-checker.js', () => ({ + checkSlotChildren: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/attribute-conflict-checker.js', () => ({ + checkAttributeConflicts: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/a11y-usage-checker.js', () => ({ + checkA11yUsage: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/css-var-checker.js', () => ({ + checkCssVars: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/code-validator.js', () => ({ + validateComponentCode: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/token-fallback-checker.js', () => ({ + checkTokenFallbacks: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/composition-checker.js', () => ({ + checkComposition: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/method-checker.js', () => ({ + checkMethodCalls: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/theme-checker.js', () => ({ + checkThemeCompatibility: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/recommend-checks.js', () => ({ + recommendChecks: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/suggest-fix.js', () => ({ + suggestFix: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/specificity-checker.js', () => ({ + checkCssSpecificity: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/layout-checker.js', () => ({ + checkLayoutPatterns: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/scope-checker.js', () => ({ + checkCssScope: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/shorthand-checker.js', () => ({ + checkCssShorthand: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/color-contrast-checker.js', () => ({ + checkColorContrast: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/transition-checker.js', () => ({ + checkTransitionAnimation: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/shadow-dom-js-checker.js', () => ({ + checkShadowDomJs: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/css-api-resolver.js', () => ({ + resolveCssApi: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/styling-preflight.js', () => ({ + runStylingPreflight: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/css-file-validator.js', () => ({ + validateCssFile: vi.fn(), +})); + +vi.mock('../../packages/core/src/handlers/dark-mode-checker.js', () => ({ + checkDarkModePatterns: vi.fn(), +})); + +// --------------------------------------------------------------------------- +// Import mocked handlers for assertion +// --------------------------------------------------------------------------- + +import { parseCem } from '../../packages/core/src/handlers/cem.js'; +import { diagnoseStyling } from '../../packages/core/src/handlers/styling-diagnostics.js'; +import { checkShadowDomUsage } from '../../packages/core/src/handlers/shadow-dom-checker.js'; +import { checkHtmlUsage } from '../../packages/core/src/handlers/html-usage-checker.js'; +import { checkEventUsage } from '../../packages/core/src/handlers/event-usage-checker.js'; +import { getComponentQuickRef } from '../../packages/core/src/handlers/quick-ref.js'; +import { detectThemeSupport } from '../../packages/core/src/handlers/theme-detection.js'; +import { checkComponentImports } from '../../packages/core/src/handlers/import-checker.js'; +import { checkSlotChildren } from '../../packages/core/src/handlers/slot-children-checker.js'; +import { checkAttributeConflicts } from '../../packages/core/src/handlers/attribute-conflict-checker.js'; +import { checkA11yUsage } from '../../packages/core/src/handlers/a11y-usage-checker.js'; +import { checkCssVars } from '../../packages/core/src/handlers/css-var-checker.js'; +import { validateComponentCode } from '../../packages/core/src/handlers/code-validator.js'; +import { checkTokenFallbacks } from '../../packages/core/src/handlers/token-fallback-checker.js'; +import { checkComposition } from '../../packages/core/src/handlers/composition-checker.js'; +import { checkMethodCalls } from '../../packages/core/src/handlers/method-checker.js'; +import { checkThemeCompatibility } from '../../packages/core/src/handlers/theme-checker.js'; +import { recommendChecks } from '../../packages/core/src/handlers/recommend-checks.js'; +import { suggestFix } from '../../packages/core/src/handlers/suggest-fix.js'; +import { checkCssSpecificity } from '../../packages/core/src/handlers/specificity-checker.js'; +import { checkLayoutPatterns } from '../../packages/core/src/handlers/layout-checker.js'; +import { checkCssScope } from '../../packages/core/src/handlers/scope-checker.js'; +import { checkCssShorthand } from '../../packages/core/src/handlers/shorthand-checker.js'; +import { checkColorContrast } from '../../packages/core/src/handlers/color-contrast-checker.js'; +import { checkTransitionAnimation } from '../../packages/core/src/handlers/transition-checker.js'; +import { checkShadowDomJs } from '../../packages/core/src/handlers/shadow-dom-js-checker.js'; +import { resolveCssApi } from '../../packages/core/src/handlers/css-api-resolver.js'; +import { runStylingPreflight } from '../../packages/core/src/handlers/styling-preflight.js'; +import { validateCssFile } from '../../packages/core/src/handlers/css-file-validator.js'; +import { checkDarkModePatterns } from '../../packages/core/src/handlers/dark-mode-checker.js'; + +// --------------------------------------------------------------------------- +// Test helpers +// --------------------------------------------------------------------------- + +/** Minimal CEM stub — enough for parseCem's type expectations */ +const FAKE_CEM: Cem = { + schemaVersion: '1.0.0', + modules: [], +}; + +/** Minimal component metadata returned by parseCem mocks */ +const FAKE_META = { + tagName: 'my-button', + name: 'MyButton', + description: 'A button component.', + members: [], + events: [], + slots: [], + cssProperties: [], + cssParts: [], +}; + +afterEach(() => { + vi.restoreAllMocks(); + vi.clearAllMocks(); +}); + +// --------------------------------------------------------------------------- +// isStylingTool +// --------------------------------------------------------------------------- + +describe('isStylingTool', () => { + it('returns true for every defined styling tool name', () => { + const toolNames = [ + 'diagnose_styling', + 'check_shadow_dom_usage', + 'check_html_usage', + 'check_event_usage', + 'get_component_quick_ref', + 'detect_theme_support', + 'check_component_imports', + 'check_slot_children', + 'check_attribute_conflicts', + 'check_a11y_usage', + 'check_css_vars', + 'validate_component_code', + 'check_token_fallbacks', + 'check_composition', + 'check_method_calls', + 'check_theme_compatibility', + 'recommend_checks', + 'suggest_fix', + 'check_css_specificity', + 'check_layout_patterns', + 'check_css_scope', + 'check_css_shorthand', + 'check_color_contrast', + 'check_transition_animation', + 'check_shadow_dom_js', + 'resolve_css_api', + 'styling_preflight', + 'validate_css_file', + 'check_dark_mode_patterns', + ]; + for (const name of toolNames) { + expect(isStylingTool(name), `expected ${name} to be a styling tool`).toBe(true); + } + }); + + it('returns false for non-styling tool names', () => { + expect(isStylingTool('get_component')).toBe(false); + expect(isStylingTool('get_design_tokens')).toBe(false); + expect(isStylingTool('unknown_tool')).toBe(false); + expect(isStylingTool('')).toBe(false); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — unknown tool +// --------------------------------------------------------------------------- + +describe('handleStylingCall — unknown tool', () => { + it('returns an error for an unrecognised tool name', () => { + const result = handleStylingCall('nonexistent_tool', {}, FAKE_CEM); + expect(result.isError).toBe(true); + expect(result.content[0].text).toContain('Unknown styling tool'); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — diagnose_styling +// --------------------------------------------------------------------------- + +describe('handleStylingCall — diagnose_styling', () => { + it('calls parseCem and diagnoseStyling and returns their result', () => { + vi.mocked(parseCem).mockReturnValue(FAKE_META); + vi.mocked(diagnoseStyling).mockReturnValue({ tokenPrefix: '--my-', approach: 'tokens' }); + + const result = handleStylingCall('diagnose_styling', { tagName: 'my-button' }, FAKE_CEM); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(parseCem)).toHaveBeenCalledWith('my-button', FAKE_CEM); + expect(vi.mocked(diagnoseStyling)).toHaveBeenCalledWith(FAKE_META); + const parsed = JSON.parse(result.content[0].text); + expect(parsed.tokenPrefix).toBe('--my-'); + }); + + it('returns error when tagName is missing', () => { + const result = handleStylingCall('diagnose_styling', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); + + it('propagates errors from parseCem as error responses', () => { + vi.mocked(parseCem).mockImplementation(() => { + throw new Error('Component not found in CEM'); + }); + const result = handleStylingCall('diagnose_styling', { tagName: 'unknown-tag' }, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_shadow_dom_usage +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_shadow_dom_usage', () => { + it('calls checkShadowDomUsage and returns the result', () => { + vi.mocked(checkShadowDomUsage).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_shadow_dom_usage', + { cssText: 'my-button .inner { color: red; }' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkShadowDomUsage)).toHaveBeenCalledWith( + 'my-button .inner { color: red; }', + undefined, + undefined, + ); + const parsed = JSON.parse(result.content[0].text); + expect(parsed.issues).toEqual([]); + }); + + it('passes tagName to checkShadowDomUsage and attempts parseCem', () => { + vi.mocked(parseCem).mockReturnValue(FAKE_META); + vi.mocked(checkShadowDomUsage).mockReturnValue({ issues: [] }); + + handleStylingCall( + 'check_shadow_dom_usage', + { cssText: 'my-button::part(base) { color: red; }', tagName: 'my-button' }, + FAKE_CEM, + ); + + expect(vi.mocked(parseCem)).toHaveBeenCalledWith('my-button', FAKE_CEM); + expect(vi.mocked(checkShadowDomUsage)).toHaveBeenCalledWith( + 'my-button::part(base) { color: red; }', + 'my-button', + FAKE_META, + ); + }); + + it('still runs when tagName is provided but not in CEM (parseCem throws)', () => { + vi.mocked(parseCem).mockImplementation(() => { + throw new Error('not found'); + }); + vi.mocked(checkShadowDomUsage).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_shadow_dom_usage', + { cssText: 'x-button .foo {}', tagName: 'x-button' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + // meta should be undefined when parseCem throws + expect(vi.mocked(checkShadowDomUsage)).toHaveBeenCalledWith('x-button .foo {}', 'x-button', undefined); + }); + + it('returns error when cssText is missing', () => { + const result = handleStylingCall('check_shadow_dom_usage', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_html_usage +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_html_usage', () => { + it('calls checkHtmlUsage and returns the result', () => { + vi.mocked(parseCem).mockReturnValue(FAKE_META); + vi.mocked(checkHtmlUsage).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_html_usage', + { htmlText: '', tagName: 'my-button' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkHtmlUsage)).toHaveBeenCalledWith( + '', + FAKE_META, + ); + }); + + it('returns error when required args are missing', () => { + const result = handleStylingCall('check_html_usage', { htmlText: '
' }, FAKE_CEM); + expect(result.isError).toBe(true); + }); + + it('returns error when both args are missing', () => { + const result = handleStylingCall('check_html_usage', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_event_usage +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_event_usage', () => { + it('calls checkEventUsage with parsed args and returns result', () => { + vi.mocked(parseCem).mockReturnValue(FAKE_META); + vi.mocked(checkEventUsage).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_event_usage', + { codeText: 'el.addEventListener("my-click", fn)', tagName: 'my-button' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkEventUsage)).toHaveBeenCalledWith( + 'el.addEventListener("my-click", fn)', + FAKE_META, + undefined, + ); + }); + + it('passes the framework hint through to checkEventUsage', () => { + vi.mocked(parseCem).mockReturnValue(FAKE_META); + vi.mocked(checkEventUsage).mockReturnValue({ issues: [] }); + + handleStylingCall( + 'check_event_usage', + { codeText: '', tagName: 'my-button', framework: 'react' }, + FAKE_CEM, + ); + + expect(vi.mocked(checkEventUsage)).toHaveBeenCalledWith(expect.any(String), FAKE_META, 'react'); + }); + + it('returns error for invalid framework enum value', () => { + const result = handleStylingCall( + 'check_event_usage', + { codeText: 'code', tagName: 'my-button', framework: 'svelte' }, + FAKE_CEM, + ); + expect(result.isError).toBe(true); + }); + + it('returns error when required args are missing', () => { + const result = handleStylingCall('check_event_usage', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — get_component_quick_ref +// --------------------------------------------------------------------------- + +describe('handleStylingCall — get_component_quick_ref', () => { + it('calls getComponentQuickRef and returns the result', () => { + vi.mocked(parseCem).mockReturnValue(FAKE_META); + vi.mocked(getComponentQuickRef).mockReturnValue({ attributes: [], parts: [] }); + + const result = handleStylingCall( + 'get_component_quick_ref', + { tagName: 'my-button' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(getComponentQuickRef)).toHaveBeenCalledWith(FAKE_META); + const parsed = JSON.parse(result.content[0].text); + expect(parsed.attributes).toEqual([]); + }); + + it('returns error when tagName is missing', () => { + const result = handleStylingCall('get_component_quick_ref', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — detect_theme_support +// --------------------------------------------------------------------------- + +describe('handleStylingCall — detect_theme_support', () => { + it('calls detectThemeSupport with the CEM and returns result', () => { + vi.mocked(detectThemeSupport).mockReturnValue({ score: 80, categories: ['color', 'spacing'] }); + + const result = handleStylingCall('detect_theme_support', {}, FAKE_CEM); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(detectThemeSupport)).toHaveBeenCalledWith(FAKE_CEM); + const parsed = JSON.parse(result.content[0].text); + expect(parsed.score).toBe(80); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_component_imports +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_component_imports', () => { + it('calls checkComponentImports and returns the result', () => { + vi.mocked(checkComponentImports).mockReturnValue({ unknown: [], valid: ['my-button'] }); + + const result = handleStylingCall( + 'check_component_imports', + { codeText: '' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkComponentImports)).toHaveBeenCalledWith( + '', + FAKE_CEM, + ); + }); + + it('returns error when codeText is missing', () => { + const result = handleStylingCall('check_component_imports', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_slot_children +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_slot_children', () => { + it('calls checkSlotChildren and returns the result', () => { + vi.mocked(checkSlotChildren).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_slot_children', + { htmlText: 'label', tagName: 'my-button' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkSlotChildren)).toHaveBeenCalledWith( + 'label', + 'my-button', + FAKE_CEM, + ); + }); + + it('returns error when required args are missing', () => { + const result = handleStylingCall('check_slot_children', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_attribute_conflicts +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_attribute_conflicts', () => { + it('calls checkAttributeConflicts and returns the result', () => { + vi.mocked(checkAttributeConflicts).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_attribute_conflicts', + { htmlText: 'Go', tagName: 'my-button' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkAttributeConflicts)).toHaveBeenCalledWith( + 'Go', + 'my-button', + FAKE_CEM, + ); + }); + + it('returns error when required args are missing', () => { + const result = handleStylingCall('check_attribute_conflicts', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_a11y_usage +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_a11y_usage', () => { + it('calls checkA11yUsage and returns the result', () => { + vi.mocked(checkA11yUsage).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_a11y_usage', + { htmlText: '', tagName: 'my-button' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkA11yUsage)).toHaveBeenCalledWith( + '', + 'my-button', + FAKE_CEM, + ); + }); + + it('returns error when required args are missing', () => { + const result = handleStylingCall('check_a11y_usage', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_css_vars +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_css_vars', () => { + it('calls checkCssVars and returns the result', () => { + vi.mocked(checkCssVars).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_css_vars', + { cssText: 'my-button { --my-color: red; }', tagName: 'my-button' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkCssVars)).toHaveBeenCalledWith( + 'my-button { --my-color: red; }', + 'my-button', + FAKE_CEM, + ); + }); + + it('returns error when required args are missing', () => { + const result = handleStylingCall('check_css_vars', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_theme_compatibility +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_theme_compatibility', () => { + it('calls checkThemeCompatibility and returns the result', () => { + vi.mocked(checkThemeCompatibility).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_theme_compatibility', + { cssText: 'my-button { color: #000; }' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkThemeCompatibility)).toHaveBeenCalledWith('my-button { color: #000; }'); + }); + + it('returns error when cssText is missing', () => { + const result = handleStylingCall('check_theme_compatibility', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_method_calls +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_method_calls', () => { + it('calls checkMethodCalls and returns the result', () => { + vi.mocked(checkMethodCalls).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_method_calls', + { codeText: 'el.show()', tagName: 'my-dialog' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkMethodCalls)).toHaveBeenCalledWith('el.show()', 'my-dialog', FAKE_CEM); + }); + + it('returns error when required args are missing', () => { + const result = handleStylingCall('check_method_calls', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_composition +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_composition', () => { + it('calls checkComposition and returns the result', () => { + vi.mocked(checkComposition).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_composition', + { htmlText: 'Tab 1' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkComposition)).toHaveBeenCalledWith( + 'Tab 1', + FAKE_CEM, + ); + }); + + it('returns error when htmlText is missing', () => { + const result = handleStylingCall('check_composition', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — recommend_checks +// --------------------------------------------------------------------------- + +describe('handleStylingCall — recommend_checks', () => { + it('calls recommendChecks and returns the result', () => { + vi.mocked(recommendChecks).mockReturnValue({ + tools: ['check_shadow_dom_usage', 'check_html_usage'], + }); + + const result = handleStylingCall( + 'recommend_checks', + { codeText: '' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(recommendChecks)).toHaveBeenCalledWith(''); + const parsed = JSON.parse(result.content[0].text); + expect(parsed.tools).toContain('check_shadow_dom_usage'); + }); + + it('returns error when codeText is missing', () => { + const result = handleStylingCall('recommend_checks', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — suggest_fix +// --------------------------------------------------------------------------- + +describe('handleStylingCall — suggest_fix', () => { + it('calls suggestFix and returns the result', () => { + vi.mocked(suggestFix).mockReturnValue({ fix: 'Use ::part(base) instead.' }); + + const result = handleStylingCall( + 'suggest_fix', + { type: 'shadow-dom', issue: 'descendant-piercing', original: 'my-button .inner {}' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(suggestFix)).toHaveBeenCalledWith( + expect.objectContaining({ type: 'shadow-dom', issue: 'descendant-piercing' }), + ); + const parsed = JSON.parse(result.content[0].text); + expect(parsed.fix).toContain('::part(base)'); + }); + + it('passes all optional fields to suggestFix', () => { + vi.mocked(suggestFix).mockReturnValue({ fix: 'ok' }); + + handleStylingCall( + 'suggest_fix', + { + type: 'method-call', + issue: 'property-as-method', + original: 'el.open()', + tagName: 'my-dialog', + memberName: 'open', + suggestedName: 'show', + }, + FAKE_CEM, + ); + + expect(vi.mocked(suggestFix)).toHaveBeenCalledWith( + expect.objectContaining({ + type: 'method-call', + tagName: 'my-dialog', + memberName: 'open', + suggestedName: 'show', + }), + ); + }); + + it('returns error when required args are missing', () => { + const result = handleStylingCall('suggest_fix', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); + + it('returns error for invalid type enum value', () => { + const result = handleStylingCall( + 'suggest_fix', + { type: 'not-a-type', issue: 'foo', original: 'bar' }, + FAKE_CEM, + ); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_css_specificity +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_css_specificity', () => { + it('calls checkCssSpecificity without mode when mode is omitted', () => { + vi.mocked(checkCssSpecificity).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_css_specificity', + { code: '#app my-button { color: red !important; }' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkCssSpecificity)).toHaveBeenCalledWith( + '#app my-button { color: red !important; }', + undefined, + ); + }); + + it('passes mode option to checkCssSpecificity', () => { + vi.mocked(checkCssSpecificity).mockReturnValue({ issues: [] }); + + handleStylingCall( + 'check_css_specificity', + { code: '', mode: 'html' }, + FAKE_CEM, + ); + + expect(vi.mocked(checkCssSpecificity)).toHaveBeenCalledWith(expect.any(String), { mode: 'html' }); + }); + + it('returns error when code is missing', () => { + const result = handleStylingCall('check_css_specificity', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_layout_patterns +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_layout_patterns', () => { + it('calls checkLayoutPatterns and returns the result', () => { + vi.mocked(checkLayoutPatterns).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_layout_patterns', + { cssText: 'my-button { display: flex; }' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkLayoutPatterns)).toHaveBeenCalledWith('my-button { display: flex; }'); + }); + + it('returns error when cssText is missing', () => { + const result = handleStylingCall('check_layout_patterns', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_css_scope +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_css_scope', () => { + it('calls checkCssScope and returns the result', () => { + vi.mocked(checkCssScope).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_css_scope', + { cssText: ':root { --my-button-color: red; }', tagName: 'my-button', cem: FAKE_CEM }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkCssScope)).toHaveBeenCalledWith( + ':root { --my-button-color: red; }', + 'my-button', + FAKE_CEM, + ); + }); + + it('returns error when required args are missing', () => { + const result = handleStylingCall('check_css_scope', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_css_shorthand +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_css_shorthand', () => { + it('calls checkCssShorthand and returns the result', () => { + vi.mocked(checkCssShorthand).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_css_shorthand', + { cssText: 'my-button { border: 1px solid var(--my-color); }' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkCssShorthand)).toHaveBeenCalledWith( + 'my-button { border: 1px solid var(--my-color); }', + ); + }); + + it('returns error when cssText is missing', () => { + const result = handleStylingCall('check_css_shorthand', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_color_contrast +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_color_contrast', () => { + it('calls checkColorContrast and returns the result', () => { + vi.mocked(checkColorContrast).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_color_contrast', + { cssText: 'my-button { color: #fff; background: #f0f0f0; }' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkColorContrast)).toHaveBeenCalledWith( + 'my-button { color: #fff; background: #f0f0f0; }', + ); + }); + + it('returns error when cssText is missing', () => { + const result = handleStylingCall('check_color_contrast', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_transition_animation +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_transition_animation', () => { + it('calls checkTransitionAnimation and returns the result', () => { + vi.mocked(checkTransitionAnimation).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_transition_animation', + { cssText: 'my-button { transition: color 0.3s; }', tagName: 'my-button' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkTransitionAnimation)).toHaveBeenCalledWith( + 'my-button { transition: color 0.3s; }', + 'my-button', + ); + }); + + it('returns error when required args are missing', () => { + const result = handleStylingCall('check_transition_animation', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_shadow_dom_js +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_shadow_dom_js', () => { + it('calls checkShadowDomJs and returns the result', () => { + vi.mocked(checkShadowDomJs).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_shadow_dom_js', + { codeText: 'el.shadowRoot.querySelector(".foo")' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkShadowDomJs)).toHaveBeenCalledWith( + 'el.shadowRoot.querySelector(".foo")', + undefined, + ); + }); + + it('passes optional tagName to checkShadowDomJs', () => { + vi.mocked(checkShadowDomJs).mockReturnValue({ issues: [] }); + + handleStylingCall( + 'check_shadow_dom_js', + { codeText: 'el.shadowRoot.querySelector(".foo")', tagName: 'my-button' }, + FAKE_CEM, + ); + + expect(vi.mocked(checkShadowDomJs)).toHaveBeenCalledWith(expect.any(String), 'my-button'); + }); + + it('returns error when codeText is missing', () => { + const result = handleStylingCall('check_shadow_dom_js', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_token_fallbacks +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_token_fallbacks', () => { + it('calls checkTokenFallbacks and returns the result', () => { + vi.mocked(checkTokenFallbacks).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_token_fallbacks', + { cssText: 'my-button { color: var(--my-color); }', tagName: 'my-button' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkTokenFallbacks)).toHaveBeenCalledWith( + 'my-button { color: var(--my-color); }', + 'my-button', + FAKE_CEM, + ); + }); + + it('returns error when required args are missing', () => { + const result = handleStylingCall('check_token_fallbacks', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — validate_component_code +// --------------------------------------------------------------------------- + +describe('handleStylingCall — validate_component_code', () => { + it('calls validateComponentCode and returns the result', () => { + vi.mocked(validateComponentCode).mockReturnValue({ issues: [], passed: true }); + + const result = handleStylingCall( + 'validate_component_code', + { html: '', tagName: 'my-button' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(validateComponentCode)).toHaveBeenCalledWith( + expect.objectContaining({ html: '', tagName: 'my-button', cem: FAKE_CEM }), + ); + const parsed = JSON.parse(result.content[0].text); + expect(parsed.passed).toBe(true); + }); + + it('passes optional css, code, and framework args', () => { + vi.mocked(validateComponentCode).mockReturnValue({ issues: [] }); + + handleStylingCall( + 'validate_component_code', + { + html: '', + tagName: 'my-button', + css: 'my-button { --color: red; }', + code: 'el.addEventListener("my-click", fn)', + framework: 'vue', + }, + FAKE_CEM, + ); + + expect(vi.mocked(validateComponentCode)).toHaveBeenCalledWith( + expect.objectContaining({ css: 'my-button { --color: red; }', framework: 'vue' }), + ); + }); + + it('returns error when required args are missing', () => { + const result = handleStylingCall('validate_component_code', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — resolve_css_api +// --------------------------------------------------------------------------- + +describe('handleStylingCall — resolve_css_api', () => { + it('calls resolveCssApi and returns the result', () => { + vi.mocked(parseCem).mockReturnValue(FAKE_META); + vi.mocked(resolveCssApi).mockReturnValue({ valid: [], invalid: [] }); + + const result = handleStylingCall( + 'resolve_css_api', + { cssText: 'my-button::part(base) {}', tagName: 'my-button' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(resolveCssApi)).toHaveBeenCalledWith( + 'my-button::part(base) {}', + FAKE_META, + undefined, + ); + }); + + it('passes optional htmlText to resolveCssApi', () => { + vi.mocked(parseCem).mockReturnValue(FAKE_META); + vi.mocked(resolveCssApi).mockReturnValue({ valid: [], invalid: [] }); + + handleStylingCall( + 'resolve_css_api', + { + cssText: 'my-button::part(base) {}', + tagName: 'my-button', + htmlText: '', + }, + FAKE_CEM, + ); + + expect(vi.mocked(resolveCssApi)).toHaveBeenCalledWith( + expect.any(String), + FAKE_META, + '', + ); + }); + + it('returns error when required args are missing', () => { + const result = handleStylingCall('resolve_css_api', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — styling_preflight +// --------------------------------------------------------------------------- + +describe('handleStylingCall — styling_preflight', () => { + it('calls runStylingPreflight and returns the result', () => { + vi.mocked(parseCem).mockReturnValue(FAKE_META); + vi.mocked(runStylingPreflight).mockReturnValue({ passed: true, issues: [] }); + + const result = handleStylingCall( + 'styling_preflight', + { cssText: 'my-button::part(base) { color: red; }', tagName: 'my-button' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(runStylingPreflight)).toHaveBeenCalledWith({ + css: 'my-button::part(base) { color: red; }', + html: undefined, + meta: FAKE_META, + }); + const parsed = JSON.parse(result.content[0].text); + expect(parsed.passed).toBe(true); + }); + + it('passes optional htmlText to runStylingPreflight', () => { + vi.mocked(parseCem).mockReturnValue(FAKE_META); + vi.mocked(runStylingPreflight).mockReturnValue({ passed: true, issues: [] }); + + handleStylingCall( + 'styling_preflight', + { + cssText: 'my-button::part(base) {}', + tagName: 'my-button', + htmlText: '', + }, + FAKE_CEM, + ); + + expect(vi.mocked(runStylingPreflight)).toHaveBeenCalledWith( + expect.objectContaining({ html: '' }), + ); + }); + + it('returns error when required args are missing', () => { + const result = handleStylingCall('styling_preflight', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — validate_css_file +// --------------------------------------------------------------------------- + +describe('handleStylingCall — validate_css_file', () => { + it('calls validateCssFile and returns the result', () => { + vi.mocked(validateCssFile).mockReturnValue({ components: [], globalIssues: [] }); + + const result = handleStylingCall( + 'validate_css_file', + { cssText: 'my-button { --color: red; }\nmy-card::part(base) {}' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(validateCssFile)).toHaveBeenCalledWith( + 'my-button { --color: red; }\nmy-card::part(base) {}', + FAKE_CEM, + ); + const parsed = JSON.parse(result.content[0].text); + expect(parsed.globalIssues).toEqual([]); + }); + + it('returns error when cssText is missing', () => { + const result = handleStylingCall('validate_css_file', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — check_dark_mode_patterns +// --------------------------------------------------------------------------- + +describe('handleStylingCall — check_dark_mode_patterns', () => { + it('calls checkDarkModePatterns and returns the result', () => { + vi.mocked(checkDarkModePatterns).mockReturnValue({ issues: [] }); + + const result = handleStylingCall( + 'check_dark_mode_patterns', + { cssText: '.dark my-button { color: white; }' }, + FAKE_CEM, + ); + + expect(result.isError).toBeFalsy(); + expect(vi.mocked(checkDarkModePatterns)).toHaveBeenCalledWith('.dark my-button { color: white; }'); + const parsed = JSON.parse(result.content[0].text); + expect(parsed.issues).toEqual([]); + }); + + it('returns error when cssText is missing', () => { + const result = handleStylingCall('check_dark_mode_patterns', {}, FAKE_CEM); + expect(result.isError).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// handleStylingCall — error propagation via handleToolError +// --------------------------------------------------------------------------- + +describe('handleStylingCall — error propagation', () => { + it('wraps MCPError category into the error message', () => { + vi.mocked(parseCem).mockImplementation(() => { + throw new MCPError('Component "bad-tag" not found in CEM.', ErrorCategory.NOT_FOUND); + }); + + const result = handleStylingCall('diagnose_styling', { tagName: 'bad-tag' }, FAKE_CEM); + expect(result.isError).toBe(true); + expect(result.content[0].text).toContain('NOT_FOUND'); + expect(result.content[0].text).toContain('bad-tag'); + }); + + it('wraps generic Error thrown by a handler', () => { + vi.mocked(checkShadowDomUsage).mockImplementation(() => { + throw new Error('unexpected handler failure'); + }); + + const result = handleStylingCall( + 'check_shadow_dom_usage', + { cssText: 'some-css {}' }, + FAKE_CEM, + ); + expect(result.isError).toBe(true); + expect(result.content[0].text).toContain('unexpected handler failure'); + }); +}); From 8c7e8a90e92be231a8695db271f03984b90a19ef Mon Sep 17 00:00:00 2001 From: Jake Strawn Date: Thu, 26 Mar 2026 17:15:32 -0400 Subject: [PATCH 8/8] fix: replace readFileSync with async readFile in library tool handler Replaces the blocking readFileSync() call at packages/core/src/tools/library.ts:127 with the async readFile() equivalent from fs/promises. This was blocking the Node.js event loop during MCP request processing whenever a local CEM file was loaded via the load_library tool. Co-Authored-By: Claude Sonnet 4.6 --- packages/core/src/tools/library.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/tools/library.ts b/packages/core/src/tools/library.ts index 10eb77b..7e4274a 100644 --- a/packages/core/src/tools/library.ts +++ b/packages/core/src/tools/library.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { readFileSync } from 'fs'; +import { readFile } from 'fs/promises'; import { resolve, sep } from 'path'; import type { McpWcConfig } from '../config.js'; @@ -124,7 +124,7 @@ export async function handleLibraryCall( } let raw: string; try { - raw = readFileSync(absPath, 'utf-8'); + raw = await readFile(absPath, 'utf-8'); } catch { return createErrorResponse(`CEM file not found at ${absPath}`); }