From 5606b4549148a402a111444748945c7bc5b9a41b Mon Sep 17 00:00:00 2001 From: 256745 <19131352507@163.com> Date: Fri, 10 Jul 2026 02:31:05 +0800 Subject: [PATCH] Add contributors webpage --- docs/assets/csuite-poster.png | Bin 0 -> 17273 bytes docs/assets/goose-factory-hero.png | Bin 0 -> 53505 bytes docs/contributors/contributors.js | 822 +++++++++++++++++++++++++++++ docs/contributors/index.html | 715 +++++++++++++++++++++++++ docs/index.html | 1 + package.json | 4 +- tests/contributors-page.test.mjs | 42 ++ 7 files changed, 1583 insertions(+), 1 deletion(-) create mode 100644 docs/assets/csuite-poster.png create mode 100644 docs/assets/goose-factory-hero.png create mode 100644 docs/contributors/contributors.js create mode 100644 docs/contributors/index.html create mode 100644 tests/contributors-page.test.mjs diff --git a/docs/assets/csuite-poster.png b/docs/assets/csuite-poster.png new file mode 100644 index 0000000000000000000000000000000000000000..f9acd4622d0b78df2ad5c85fc3e8ea3a80645011 GIT binary patch literal 17273 zcmeIacRba9_&qJ%>3L&e^gET3XEjuf-M4ZFn*dZD!*)lVdot<$gd+!m- z<|O0Tey_Ls+~42tzW=)azVAOij}PA0YhL?#U9X;L-nz?ebk1jKUuV zgKs0L!Cy?ae3QZd;4XKss=z+A9iIcgP+BW%D8pcR5p=s|RN!}7=WF^dFc@PU^dG#@ zDdPbQrpkEzva*)D@zUr{fzi6hnc01&yC}i)cRFAn)Nh%hG)Iz7J-xzG#+e!&CB_rI zL79<%bMDT)np*$;c{@+}QkAZ<(?;P<@ zDjoIdcu^cTEaL(J<#Qug)2%LFBBWd=Ue2Mel7lU#-*_nBVU&$He0w+arN?ekbDGJ{ zzV?hpb-H1$Qo*|MyZetHZeM~WssoPP;74dtew1^%l+Kndt?2wn$llT{`-YpNLD%+i zX5%Rr;tUHKE=UK~d0FN>`ExG53VA(wc~B_Enz!7lXH&1aWngG(K#}w;{&R1_ zrsm3z`Bl5lVVQF{9z$6L*7c1TjyVlVQyZ`x_2go}nPTjh-c zrE3)it3)B;v(5D%UK`M5To%>o4)O}Wd7M1!^?cPd<1B0s`f9MIt_BP9aMH(^RTMjY zDPu!9l{qHyT!xjMKp{H%eudt)%?UXsgtvnGKMu_iH)l-06bvgAKp}p^JIh%s)jNkH z1L!kt8yoCGuJ+yU;55!8qkPUH_+dFHv>E?KOLHyd`cb-`>}p(|Gtvix?9dYD)kHq9 zy4doG1van2M``n7fI}?MuiLxtCSaK6%*P>;>c^t-U@`RpF|;guB}a9&JE{JqF1Fq`<%ZqkNdjY z9$Zra!H;3M?37rEIF>pv*Yrww6y5QLw!d^Fb!uvRYM%Rh?{se=XwNF z3YK7F2_PE@wMz*{-hDQaB7Xl8yLi(lLs-*wKFW;XC|>kxiTU`KY`&oU;2fbA3Caw> zuf(5k??2A$Rr#0_)z67DvFewC{o+F*BDE-M7|6zv>_eKTfGC|qBO)U)NX-l4J-1LP z;V01N%jehD%4kgGDOG%41z++NC!Z5aNxC&j6EO>KucCp4y~QBKtbF-2PN5ND3E=0` zd0zE$s^*O zoQ&_-DlyhfpA@Ut6`HC{U@g!VPRa<&B@g7SL>GReD&tsn&>eBt*;b%1#eXZYdWoQq0`!>9P_uPSbo|HOYXu};SS1S*PR)lE`9MA)WJ;*P0hJ1A=16#j z=Y`M41M=IQhGv~;bc9~v_pt!j9-!W4HN1XVR81!Zk-WN?tUL4pk$4+0mbZn?|FL)p zDp3ji!ema>x&Bo27TsObU2|2O&`ZRV+kBL>T|mDVg^+BhN^*&@x7D@+^$$O=%}e#Z zYK|TU8k)T9$^eVRGV_}Emb!8A_-Z)Nl%cY@vH3G>6n%OQO{9|p<1iO;}t z$>tUdOI)9Bg zGPral5q84%uro=mI1R=L^o3KX_D2KF`CFlv6EB$?Cut%j-(ZlEcUisfP+AfBJLJW^ z2h1ffEVTZZsmq-lG1}H@{2lk@q>Z}`?w>1ng7rYuO+c;lUI}*SWMj$}GrPNYXfWJh zfJMFN!JS1*HNLNrdXF{(Ev-|?%syq%R)QznijQJMbpVsGO7IL80xF|YaNb`zkvB_e zC26e+p~->Z*R*>&_V|{;PxzAsU>j4(96qurBw?t`?pLYpBbtsZU>{zLS;I1K@lifJ z8&Z;;K{4A8PI4X+Qfxas;~bdvjbNYj2=0zS3%sR&ipfYPw(@uV+CGJ*8knBzPKtvu z&eotFPTy4Qs>{l8D>im42$l)1@F9P#DXXpi$`$RsyL$@pUXGcjJAqjNDv9irDv5vm zl}(TPt0XdlpS#T463sq*{UX0J`(~OI@#ZuN@rFHX-%^e9YeqeiDk}n^eG2@^(vCJ! z*#0_P3*460D~%aKex8TI;U+E}o-qs_HVi2s$q;4<(dSP#6m*@SPZTz%RCPN*2nv9s zgmJx%yR+zFZ)@NKkG#I?{${ih)&%x?&TLRSoz4%FI`U++b`4Lhc^aGz`%Y9bb)eMt zx`8u1QhPVJ$aBtjt%_Qc9ejHT4tgI_SOa@_q|t6v(a%@+x_7uR$B_OQ+c`t z)kB4SG9i8Ji!dDYVl*8AhmAD%n{in9bS+fKC-d1$MwZZ9H%L!mQ@~QDvY0tfQE;TI zv0=1{5%wPeKJFN%ky`PbJ=%C&JwHl-SF~hMj;py90B5)XvQ^w?`T>*>@KD>NOwkt?N1QRLL;ggiJ%68s80_EVZuEW~CuB zw$L5?)>`m5c-Y- zbp6(5%k?}UrQ_HHPFj&4Ct|@(uuA7vN{XbxG9QfhMXn$i;FbF z`1Bm}9Mt;W{-t{~QUAR-$|fa{0nUA5!dcAx0Hdm!#m^r5eTc>MGg$Z}kN0eT;l*S; zo-7f8mj><(X% zmzf;>e0O#XulFSDis`6$J#A;nVOX`ut)E?y|2@)VesGW1E~hVc)CtENQ+cppvh{0n zs$_3?lCFAZ@GbIr-i*lx{z|LWniv+$>MUbaA|^7Fp=fwR>*_u1<8hBUf~207vVXN| zF1{$rb7eKhK|H_xX@#8Av1R8bJMXPJV$=ASoXyG|dS7>g<$b^ahwPgpO~7SH}MQnps{P4|ImA< zUqsM6c?)TvpCRZ6RMnON{+#^2@<3U?>WMOzmnSGOte6f@; z0n~`_%p|9vHh?paS;2x;RiycgdkfB~TJyN)uZg}|(ZL;_K!=4UnTp4qgG%F^2HUzZ zRq;IOZsy7{i(5XOz;F>hzfkuZaPt)pHhV|>xh$y}rb^izRfiVxu_8TX4Xpgy;#pr& zr&m)Lb15iq(stwcR~w*$6(Sdx{QGiy^=niVdR;G?_x8GunZB?60SuC(2tCUxx_~Tu zBhN=y_~)C^cg^NC?QvbvPMb~S14V^+X7rR(ej_3oM0~64)pxClN7k)hzW;-w4$6{} zao&kuQwYEJcbp&=5iw5sEs=$n*fTVRgx}bFYc($BZA!qA*2I#}ln-UYo*qb)Jojod zrL1|xNEdfg_~&2m;-XJ%*c5NqB=JT1VUR7M4yU8KhLEGa5(4+gV}p-^YS5ep4Lmh1 zUrLf@b%j-4@5zZ7Aox2DICS;*H*kn-UR03GVmg*v)UCum?vr^zCCoKG@?knw7i%u;mJ`UZ^nm;R`=?D zumT3k00s&j2D}#&MOU`&}v0ud#kMe6fmAOpT9n`pH4&YL^Oy?6W17 zeDk=mo=2-|#_EnH-JFUs+%aKdo63+C9_xpvfg@j~yCs)&nA&vsxG~C?ToCD-GqRse z;GR1D%%{KCI3O?Ypg^c=#wHUz%A72pzaxhMh9G>o;#X|pH=kSPuQv-#(?vDz-=B8R z$vGSDKef22ZaW{_Tv{&}vAEBO0_PN{^jpg=ifS>{dG^yw-2Q?>A489$N%JQ2i5=V+ z=~P%J&!7SihL3V6OY!~>aOl<=ee(l7VeW>o_eKievipb@s_iJ z{1Y}i=3HPv+x;5pz}M2Y0tfhdn}|h4CXjzR9EQz$m@|8y==F78J5?HwY%CmDuehWq zNZ$0Xt3D_fnVX`1__*Y&ODy`z4hW*gOfFAJ|Bo$3MENcQG ztHLc>+Vr%oDnC|0M6t1{91`EZ7^PZbuf_BL*d=yDjgH*D_(#{HK4v=EZ@-p=@rYuX z3mTd3E-plIyUe~75%dWIcIffKx^)_nvL)4VSYvl9VgC*%ETUw-WZ!FhQ#mw;BY%o< z)L`!!Q!3dju@p@E_Bqr2SoWi0?`DZjzUtbQEAyeYF!?dk!MlSZ}Q5}ldAI0Dr|IwLU}3a z03!iH1j*3vV!W<~npSCg4wBQf4OM>kl*O=&2}9e@*GNIc+6(l)L`$Fd-~a}Tciylu zbv#G6MFpU#&q$lKhbyej1N0|#3DyBc4@)nlI8p*Ao=kOodTtwR_Ibl$?;3VDi37k4 z(Zv*)RUpnc={ZKB#Nr}GhVj70kkb^Mz1RNfT7=SC)8{*UfS_5UUqqdbdbSTZz8BQ! zp`Gt83!#2a`>NaHL+^K&NhyuISl1bmnUp1XhcK|+N3+^2sVJTZO_x~012>HI53-0# z_=%a&cU4dHSB4Vy$8&t#XB)?F9=P2Q9(&F0J=+U1xwpkMm;$hv-4~l|*>`O89XY}k z9fNJT-W6=f2=br0<`5Za?=ts=aud0ug(e4IEhtr}&u+xG4pAju0t)kGeOsbi1&$S$ zDC~$sdg=4Yk12U=m6?;rcOCOcJKnY~Sn7xCXA~og=`b!xf1imDEr!{i@2PlXajVa8 z-LQf08@P611J zVl03t#B`gre7})M9IM`*ncE`VqUQ>*V)-|KvUa~7)gk<|wUNB6RIpjYyKlbIz-w}M z_a|5JD>KKy=PE$_JDjDHtu^z%s#=pO_SHG(spob~?rZJ-u8uQV+<$#Dv}AvyZmu+W z(Ect{>uHoq-C$U}@^=JN95;S}#x|HMjr-tNtoh6~kr=O3Ew2zE**!>iTYVUrxKF8K z^ZC@f*l2d@4yGN{hV_nDXx9(vBg3RibqJ|KD77q%gU#RO^QSI{@^3TPo;zeA!AA1V zda?I4)F7l<*}7@+-4Gc{1Qe(6^z#P+@U^Mm5yh#5pf-r9wiksc=z1g@HyCu&mnb#8 z5&V)`EgauN5VQTjPj`cvD5b2+qPGNx1L0)s1iM2 zX7l;rx!oNt0fjwjT;UaUc4h%aV;xGV^B{mznj%9KY<>0*F+GI{YiX>?X@+*SQ+4pp zHZhZnu1Bj506$%Bf5~hh+%Evu@-F8LmfW_`o&wKoGq?HZ5%i07nAviPTGIsV{l%6a zeREPAS67EBE@*sPnKOF+C+>ixpVNDNe7Czf`9NtL>N2M;;(n-+-&Yt`zaM_2pCg*9@iGQZ>fAq|vlQFyAJ zLIqp17=O(x0!08&h!y&jEdS^v{k|B3{FCC<1>W1Lx`XOV5?`LKO3kff6aWJIXb2DC zq$+jwzHogw%xLhj!=oQt+C&f(4B^!}pT6==P6k>i%V0WXB_3rJ;`Oj#gCgS$xZ{)3 z$HSio6(C?kgHW_aH2**&Mki64aPr`aoRi`sC(dtITFu4OO97r;$PJ&r3dHVN03tt- z*9xp*CpcT~WPgLAWrVWUcyX`%YL}1nk@17c6QMO?%{l!E?~4T>tha+NPZQJkyDl<{ zWq^}WcD&Rl@cG7raq__h2D>^_adg=u$cMX8X7GXy{jBMoNoP=6^mZf4V=3O}J~j3} z&EVvBp$Od)A!GC=-uvPh1dWJh{FW4?z`#xn*%vZWRV+nMluGWHM{*L zpV9ObQhBo}g(C2IH9r5qFPL_4koUGHr^*!-Q8QgP{N7Z7N+Qt|oesH|;eXT+)-1i*Gb|^nAhvB> z)52fr@8V&xnjT6z*jIAeBSlniak2ZEEfxbb*x|MhmKmAE53qk(huXBqtx|dMOQm6r+R|U+4aB^FV+X_HEf9=Y=0I6 z1R14bA&eJbD6BKlnn7V*qSQ;{Qebe`JH5>_a=BvX^Z4}pKEc-cQ7ROAW`)NXtNu81 zUdRYUPugV&T3V#uIW$OooNL)h>55m%O8ER_O3Md8SlsPGH+2}txlv^>0U7v9!o#>U z@**hgu0(=!8hSn^&JbOqmn3Va>$43kJKX-#9g|*qzkB|*sLJxe(trz}*C~4dc*KBW z!1i_AbLeICyE+i^p@>)yS&vmZ%g-*|uL_O+o-&wP!EW~BC%@cJHz}_ClJuzC2Fc96 zwQkA`N7KpT^G!qSi9D1l8JBRVzT0+o&xB32v{_UqUW&Q@D7~EqXc~hszLX%pl);x7@>zyH|#_ zYNsJ>ZCB;JLjJUGp%;8!8LWhJUf;5%xa}(WIKyVNI3;SugHgWvoI<;%j&ynu7Pz$O z$#Rj_qFluE0E;ZwDtulE?lXN2ikBYR)+4QTkpjf`?0iH&m+ zjDdjgVUEM=E4BGnKpp>Q_@KqXBg&?%YXi;WVWQCDB@fUq>{wD*{(lSG4Sb}o^keI^ z#z?(;aZcZPh}M>i0zv|%*csgWKHtM*X>j77cSz_>qhn@x4LK8b!W=}&Pl+8y7YTb)-p}i_I!p`o>_+mzC`Q=3zl*S&#SqvNcT{J6)1{ zJ(mWm5zgNPE0lxEgKga{4{iXCK%W^aw|m#HKKVevtN!O?AyilLzhWx6$9B}Q3K;zn zkLFAN9qBYmr~S|bQ%C__a>q3n%}K#6o%@?yy4|QV6oCw>^JVkUHA(hEt}2&SkmBFU zU{7bTA^D#%dypf>YCxDXAlJ zm0nR(Mc4GPM85y`XK?I%()WloWrCIa3~{Gx0nvov^WQ#-OlqL4eK>f~)7X`Wk*I$w zFz5=m{GTfIc$6mbTFmN^(3biRH*4=*h zy3Vb`ESZ(Wtd{6CL6xaz0Muo>0^^PjKX%|mXOsXWw+Zn4*`fWEz^p?yK)>!*DffP7 zv81G?$xbo;WFgR6*!{@-P+sWrg0QI?OplF$zFLT*$ey zq7FaKRu9CSr(^D^o2YD0nc;3ajn``#`lt1vxE>?@J2Jtz7F!TSug$C^Y_&wE$pkKD z#&eoY=)q2ox0GP+XK6X|tt=&};pY~yH_}>(uz;&I= zJ+m$(dHtwi$b*?Tgha0!5FW#8flVG8 zokIV8{yM!T#jJW2U>FQsk@xA@yyh*oJOYjmZ+<1(mLqxqB+6haTDu)wNjr|)NtJ)1 zX+RTi@+SVaU^$I$Lc)K3RLD_Y$YJ(l+Fm;d&bTAHYx-rP*13ILhxQRMhoc|nxt&bp+(CS#7+ z7qS%L#f<_Q{zK202YJA}bl-4lm88!VX?3QtX9zEj$Uz=I=I@Tp7M^jwXGR9p{@KEy zS&<*b3~ym1fWJo_a{c$m#3_VXl;?14?S&{dYCp_1H3xv@7ApJ;mG-99K&V7@iXe7; zb8dl%Bkf*fI7dI8w1?|jJ%PHboo9KcFCMlILSj()hv@^-B3gg5gWFGO11x^G4LhaG zB&+eIe1NJhL;ok8E7IR=e5^mD?zPelKRQ3QiJh;8x#=@z(O?TkRhyCjwm|)i3Xy*$ zA>_RPs)|%J`D0(E8&zj|Jbw34-ocsjR~FvK!Ffa8d@T4EYo26Be&fWSOUuG+R-sj} z1E?+nZf0q8ZsiuOzgEX#Zu>8Q1?BRW(z{yfOa!sTo$q!zRJZd@Rh`O~*{*()btUMjh(A_qhl01hLCs^Jdkp^S*nw)UBg9>56BH|*~`avpcYakTwjCMfvP`rZSCr`h?MhnN!MLEIS? z#qo*_ru7X*F(IB?H2qEL61t&QZk3aBC>(Q*I8yXyq;L;5e;owC&z=VsAbgG-yTK=K z^(RNhpzc&bhn7s%OyiGLZT z;B-*bRXwv)bpG#W)xuu5|47d*@ii9`=Am`iJFml{s-3Q4BCktX?Y^IseMHs<8VyP) z|BY^vuRW55;d?+0E=J576%E~DKCf8-aFaj_m^XO+t-!I9AU`64%zzO-8vx$a?)!D9 zg9LD(Aj0@PJ5^*XMo$FHi&|}3QbIy`vmf!#q`n#E``=mM;<@s6XMDCnd{<-cuBn68 ze2g$F0=J845o#Zz{fi=?c?uyQ^%3UT|6|Yu)W2kKT+{q;ROJ1ZGwnk(iN}Csd^s!t zBO{{@H*o4HCz$AflV32|GB1~dEaO%v+v!zf6MKKd(A24|yOR2UmG1vdDV-7)! z|KJ+4WNiVIPAKNuvt#Fv0Qlzr_B$rjESc@ZA;EP(04mTn;`W6qe^)qLr$zuEr--$v zeCO$PZT`PxfAt*}4Zz>D!IY{Ke`)z+Iw^pRn+}C=wcntlxp9Rro1O6D=wXY3983~q ze(DnTh5r$Qi9sjRZ+Jv@DW3?BAoC#)Zk*P6)3*E<$fK!`*V2b8KSLh!>;e?zVGn2k zD=Do8LGwppaN^0o>%Ihav$KbN4y3=IOIP2zbgB5hLLsw&F}nY9kZ+^B~v&lrgS04YKb_f_Uw=5W0qIhdUC7dQs-~xFO{5YH^|<|KY7PwCJ#4&HzC2jG<;^ z*x>{gg@E02UfiZ30JuGiH)=b=&~W+h6i_S8zb{WtO(#AeQd{sr`}-CJDKS=wCJJ0( z+0p6?)>JhAeHp>8eptgZioFJf1QEPLTL|NozgHvtw=rSMzO?8ASFcZsPA`Bn`Ak}OP zAYwiwqJ)UROdf;a9&I1hq7Jp;!UJ&w)xWe+??AV}-NVL_6tR-)Cc4jToN zdmQ#AysUk3D0CMti{B6^7o~UtBxiaF>I7t${1(C%h&jAy{%4)X{^vXO3GnR*`~UWB za1Wgb8h6CRij&Yly6fj(`8;{0cOB{IH_XWr`8aWmC{P$vM?JSI24BQX5oW2o zKZqj44Qpw3QTf&N$zP;w5jVxHL3476E-S9u)eDbLqJxsxN+yamAZOG~(yRi2yG>er zEfv4l`VIJ3iX0Noj*UFFTj^stz~S4>0@2T3j(WqlK}D0ok}HH6g%nD?2dH;@NF`Wi zs>?%AdN#Mmk;n^GwhsgSV6%Pm^Fzz&O0TJznm+bp+$+4X^P$8~In}noXGNeYQY8to z1}=r#vBvg{o~f1327V!MvM47jgrv0YEW}r_He!-ih}Se~P@96)TYFeB3|*4A_l6q?zSKfVL?TGqqXoqvO%)}X?#6JFv!Nw{`T zDUs!2AXt`>kTybJ zD4ezRfaG#K#Pxyi&g-(!dC?w(8Q>;-F3?TbRl&Aiz>C)_mU|=UfyW9PfpBSdW!Kdy z5nc_tm93-5asgDE1Gz*g-ncyMHhoU}aty2v+>izH&5zbZ&A2D!ou0YI?i=kP@2YoX zR97dryV##J>d}5A3-Q0j%%^Rqi zm@m}J%#k7y?J-J_mL=&x14> z-gv(@WVyL);Nghnr9?|XO=nO_#C}_wjn3^sfcr;?@Ho;UK^=z*Z-l^Jk~eG$1Oll? zLxtq`J1lLPwbkx8R|6xGPUT?>QF9_qu-igJ!}0BRb5hODM9;Y>nYhsdSOd6+8)w+{ zGrCVm+;P`E$9e=1qaosE;+T_Bf^inTuJ8$qRgXk_u;IuPtXEbd*|fD;6$0|$?mCI@ z!Z87S@z_c48AsMm`SDDS<9}LjT3ys_aY|#nAY&Jc`x1&16 zL)jt={x$#25si)XUuwH5js59_?65}YX5LX`y7nbh!?_Q*s=d6mA&VzaS^B?DLR!c! zixkhBw!e)rbScmOfET8$wbiEg&+GjjW9X=nD|KZ7l9-)inD@ZFTh?D`)9=*g5YHA3 zeAVEYo87^C4Dj*|Vj}A{KB;#h*2pky3`!?R7BEZD68`3H$@2w?yc2VPmElhJaDaA@ z!pz<}-)_Ol;8NiOdwC|UXP}|7ZMz(_9_n!u5t6wMM!nHYZ>fBfP{{N*;;05i-&}{C zumJNL4*}*FN|he>Vyqn2bPcpko(aj>q*4@Wm=~@!TcajszSP%5qrno#5N7oJ;VwKg z#z^53(C#SMX6$Z`9Y+WP51x^N47lTIsix0T|G8^)eBa%!V242F0sL)XLr%pmd;Te4 z5Bm55Bu?j{w0|rY2I4Ntb3*uM5hsL&+M-WSztEtnkJ5b`5cUa3&=oeM0IZ=j)Wt^8 zbRC3JDPKUrV@;7t(+#v~+TQV}4JaLGGw<)aU8Iu`=3%Xm0s&TcAoHQvT8Y z4V|kTHS*z=W7XKf)q$?b!{*#mKA9jOFhCudIfG@f_+p-Iyw!C;u1*DJM1$5}RDQ2W z2Sg_W7u|sHspOidBK|fZlupXw zcqE)}aoOd)1hVHj2HA5fTXE>8$k}N-6v4SY!6aVssZ!dsVp~t^{R(%cLEJ(B=9~J8 z#p~Y71gOQ>AVhPZzIA~n$)4~T0E~XDN*4yLQ5jGpZO%Xi9=yUxC2}v(`Zpr|{XsP+ zdtKn3TLL@-bYN#xLXE}j9zQ8-LDASeMS1s29QBT4<$gVm5HwY*whFt_v#ks?#$|!pT;WwJ_*%<1C=rg}NNajiW2xgFm z@)85BzBr6Ki0OI7Z(p3IvmST#ISu;pWucNhSBXi|;WsaF(M>4et{#VhR~s%NIcKBg z{aG{51qKh@MI=gqrx7>v&Y9^vLHt?;Pgxk4sb+n_TM$3J07)!&K7tipt#|6M;e6Z# z2J#s=mX%9i2`XQpsT!;S4q2i@+g4Qq`w8}>NHn(6Fm$GF5@ZiA1x%bHv--4wzk39a z1<$_u7NTXkX3yL3{wt5I7O6dR#5_l_Jo;Vk2+ z#-&Q`>iAueu%_RinrFQtj5il|s4)k?uczRD)l|o83%C7>seYrR%T`|%kTdCPsJHAQpLfQX}a0x}2}mF;$#*jpgh zR9-zW=6mpingeOk83o>{oY_-^i(LfX*|Xp4(`I_gwMBh~z?WkHkLioI)rXJ77}JrC zDLaQ?zI|mljT)<-m#mS zCVXMNs!L~)P%od@Wf$S&5?lSmy8c%D$o*CNEctZjv?z`u@D9q>Odh})$(?}S!xutg z_u^q<_rVy+INwnvh0TdI@x~{}*KEA9*a|k8cE^r0kmR3YNB)V&o!{#PO zRWr6BxTK)Pu)8HkS$oM_@8Q)GZOah>8`U-H0$c&yomUCG?{#Yy+|E<4$H7wJ<`NGu(%^6W$M~0U*a8)Tq|-{zaxu*Y-Rhd*UuXJjq&NmFSzSWmJteGA_{B5;j6Kg zqDodve!ZUf7ak@vniuP5oL0F>aq%jq72q_#hgv(24ZUbrEW#zs83!!|y-A~*LP5zu zy!YzRf!I^NSbl~hanl1u46hplVvFm}&Rn`G;e&u;q`B+{mx3{XU04d zi!&rvP$5vMo za$|`1!o9~wuKo1~C?I6`i(A9OBD|tGVkg4MXl9bbUe3U*u<8-y79=kVZ%9 z&J3^r-ogNW;y`fcji&#aAmtP{W#}6K2NW@>O+&SPsE85J}>Zx zNUR@yT-Kv;+jzS)oJ=szJ&)tT_1@%LEbGtRS(R>bVPDmA0b$i{oddS1 zYL9-y|C(aGS}m$1h@SDUi)sWey(23R7cLOq{5{cQs&c7I~KBw zF2$f0F$r2dIGR7n?tNMK?H-rgZ0qo8J$yXkSl3wf`|(~gCGXi8xv{S4Dv6#Q0Spcp zAlD}&sP-p{<229fF!?fp6>I^n zIeZ;!nUM3297V1#>fbM2726>2$1Bj!9q+poIyS90T0C{-4{ygW*Y|j(vV^NLGtM2* z%5ta;rC7E@v;aw6$~4hA6YX+QJAoj!cKk@h{961CR-~$dPdFc{&B^S&G<Vfy8 z^LJ772C*K<-v~+H=;AjBsW~T4t{;7IcPY?nosE8&^^rExKX=S} zHjA#jW5RewVpGeK_Mf$&-b*wQZQjdOmvbf!6PI?1(o55z`9cG zrz=@TxyDDMto+;c6DGdxB&cJ#aNJ#k#aHtZFav4iy!9xa8QBe&Hgmjf3!SHTdGKJr zx_4Q{`QiHuqy8VotP_FU21$>vxQ*9XwD40l0n|1y#S0TtZYrCp8evotFv?fNkgngZ zszhabn`-(8Vxpxw)OqtwYeeh*@FfnxWAXL_vpAgf!SKi`$;z&O>TNsQqBH&W5&x@& zwDX=~wQ3CU{-d-Ccrq~TBn*=@phwv4mP<9@r5ZiFrGZ|w3TI~L3g zy}twQM1)M^{YL2onYKabWgC=xDb7%CWbQ0ns2-cycPuH-J$}G_94IM+zYBxL(gqJg z>;&X%<5Y~k(WSf9*ffop8=O zvOeK~6;tmBe}=A+@ZtrbY}b`2##OG>OCC#z2Rr@q(|SL1U1KlJm>1)i7KW%3-`7|> zkALL()a*vc?C$vPHvW21dXx6F?KTom^-XZnN@Tel?vRmsK>=vsivw zbr-6fTMF?@ytonT=;Sl`Se$lra$Ypn z)id#d_9gUNTQi$uZHjLl@F$N1h9WFLuXmlyXU&U0Ogd+TXUn?J`xl9d;Ut1F1HHH{ z%$=c+QOj+Zpr|(H=&t_xixJM@pND=OufNnfSimto+baKw>;k2cpnXaZ0x%&f1{7>s z$v&@SA>ZQK{N0@yMpe&!_^1*!-h^WIC4g4GdD0b3uxhL_I&garl2#l+ila|kFA_tDYKtD80#3t@pP@0(E5*ietyUMb!goY z0YyDwT1s$xv4Dp(UK^&2g=huNhWsSYt%WsX_ja$v)eeRJ*tRLxdCQO&XjKgoKuNOF zg^CrwA?~I*VC=ZchJwB=V?}3XOJm%g)VwR?a0w@xh7Xm_m4xiyj%gxP|g+iGRM1QL4l5%&E)RkwRcYH4VLqIaj0OvU0Co`%JB8aCv3 z|NfVDwj;7MP5bS-^tdnw)CU=H-${_v&zR*!yphL^DW2$EiuZRw{Olb22H?v=#eNWJ zKJ;pvT@P*NUKO9Zn9@HcKl7GhA-1UB8-Px8G||c}{5(CYPwD;R_OImfX@WN*uvGTp zQ!Vsic`r05v&0UPGFD4KovNF3rXC?GL1D5MVwDgYvH%`%YJq3vAgP7LKu?|@QWb24 z%)H;Kn5cdBy1PGJ8Dw;)!83UuW6+DP0df-<1mgoc3Wq@tHKYLM41-|mhu}E`Y!*EC u?D5ASVG#PCLHqyle@o#dK5g>=exH-=lVZnP=%3VpU01tx`ICyN@Bae4&cbv6 literal 0 HcmV?d00001 diff --git a/docs/assets/goose-factory-hero.png b/docs/assets/goose-factory-hero.png new file mode 100644 index 0000000000000000000000000000000000000000..6b86e978d1212e355995b2115d781d5ad1748b1a GIT binary patch literal 53505 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 literal 0 HcmV?d00001 diff --git a/docs/contributors/contributors.js b/docs/contributors/contributors.js new file mode 100644 index 00000000..ef48ef8c --- /dev/null +++ b/docs/contributors/contributors.js @@ -0,0 +1,822 @@ +(() => { + const contributors = [ + { + login: "5AIBountyHunter", + prs: 1, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "Add GitHub Pages website with 4D banana visualization", + latestTitle: "Add GitHub Pages website with 4D banana visualization", + profile: "https://github.com/5AIBountyHunter", + }, + { + login: "aashu91", + prs: 6, + merged: 1, + first: "2026-06-28", + latest: "2026-06-29", + firstTitle: "feat: create contributors webpage with portraits and game (#1580)", + latestTitle: "[registration] Add aashu91 as resident", + profile: "https://github.com/aashu91", + }, + { + login: "adamsithr", + prs: 1, + merged: 0, + first: "2026-06-28", + latest: "2026-06-28", + firstTitle: "feat: create contributors webpage (resolves #1580)", + latestTitle: "feat: create contributors webpage (resolves #1580)", + profile: "https://github.com/adamsithr", + }, + { + login: "alanamind7", + prs: 2, + merged: 0, + first: "2026-06-26", + latest: "2026-06-27", + firstTitle: "Add GitHub Pages website with deterministic 4D banana", + latestTitle: "Add 8D banana audio and chess lab", + profile: "https://github.com/alanamind7", + }, + { + login: "arrjay", + prs: 1, + merged: 1, + first: "2026-06-19", + latest: "2026-06-19", + firstTitle: "use launcher", + latestTitle: "use launcher", + profile: "https://github.com/arrjay", + }, + { + login: "astatide", + prs: 4, + merged: 4, + first: "2026-06-19", + latest: "2026-06-19", + firstTitle: "Create pyproject.toml", + latestTitle: "Create jazz_ensemble.py", + profile: "https://github.com/astatide", + }, + { + login: "Be-ing", + prs: 2, + merged: 1, + first: "2026-06-22", + latest: "2026-06-22", + firstTitle: "to infinity...", + latestTitle: "begin rewrite in Rust", + profile: "https://github.com/Be-ing", + }, + { + login: "christianarriaga1234-coder", + prs: 1, + merged: 0, + first: "2026-06-28", + latest: "2026-06-28", + firstTitle: "Add contributors factory page", + latestTitle: "Add contributors factory page", + profile: "https://github.com/christianarriaga1234-coder", + }, + { + login: "CleanDev-Fix", + prs: 4, + merged: 1, + first: "2026-06-23", + latest: "2026-06-26", + firstTitle: "Add banana rendering pipeline", + latestTitle: "Fix banana pudding recipe model", + profile: "https://github.com/CleanDev-Fix", + }, + { + login: "detrout", + prs: 1, + merged: 0, + first: "2026-06-21", + latest: "2026-06-21", + firstTitle: "Auto-generate fairly safe parameterized test cases.", + latestTitle: "Auto-generate fairly safe parameterized test cases.", + profile: "https://github.com/detrout", + }, + { + login: "DevProTools", + prs: 2, + merged: 0, + first: "2026-07-02", + latest: "2026-07-02", + firstTitle: "Feat: contributors page honoring all non-C-suite contributors (closes #1580)", + latestTitle: "feat: add contributors page (fixes #1580)", + profile: "https://github.com/DevProTools", + }, + { + login: "Dizzztroyer", + prs: 1, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "[Bounty: 00] Website 4D Deterministic Banana Landing Page", + latestTitle: "[Bounty: 00] Website 4D Deterministic Banana Landing Page", + profile: "https://github.com/Dizzztroyer", + }, + { + login: "dongpod7777-gif", + prs: 1, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "feat: add GitHub Pages website with 4D banana renderer", + latestTitle: "feat: add GitHub Pages website with 4D banana renderer", + profile: "https://github.com/dongpod7777-gif", + }, + { + login: "Dreamstore2046", + prs: 1, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "Add mascot pattern generator script", + latestTitle: "Add mascot pattern generator script", + profile: "https://github.com/Dreamstore2046", + }, + { + login: "drewcassidy", + prs: 2, + merged: 2, + first: "2026-06-20", + latest: "2026-06-23", + firstTitle: "add badges", + latestTitle: "Add a modern logo", + profile: "https://github.com/drewcassidy", + }, + { + login: "EvilToxin", + prs: 1, + merged: 0, + first: "2026-06-29", + latest: "2026-06-29", + firstTitle: "[Bounty] Create contributors webpage (fixes #1580)", + latestTitle: "[Bounty] Create contributors webpage (fixes #1580)", + profile: "https://github.com/EvilToxin", + }, + { + login: "genesisrevelationinc-debug", + prs: 1, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "[ShanaBoo] [Bounty: $200] Website", + latestTitle: "[ShanaBoo] [Bounty: $200] Website", + profile: "https://github.com/genesisrevelationinc-debug", + }, + { + login: "Godel-Smith", + prs: 1, + merged: 0, + first: "2026-06-28", + latest: "2026-06-28", + firstTitle: "Add contributors page", + latestTitle: "Add contributors page", + profile: "https://github.com/Godel-Smith", + }, + { + login: "hobgoblina", + prs: 3, + merged: 3, + first: "2026-06-20", + latest: "2026-06-20", + firstTitle: "a non-breaking symlink for dawkins' ephemeral girfriend", + latestTitle: "Accelerate to infinity", + profile: "https://github.com/hobgoblina", + }, + { + login: "i-sayankh", + prs: 1, + merged: 1, + first: "2026-06-19", + latest: "2026-06-19", + firstTitle: "Add MCP (Model Context Protocol) support to the financial system", + latestTitle: "Add MCP (Model Context Protocol) support to the financial system", + profile: "https://github.com/i-sayankh", + }, + { + login: "iyeanur6-cyber", + prs: 2, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "fix: delay real-time validation for Error Boundary Events to improve UX", + latestTitle: "feat: implement Goose class with honk and honkify methods in SuperCollider", + profile: "https://github.com/iyeanur6-cyber", + }, + { + login: "johnanleitner1-Coder", + prs: 2, + merged: 1, + first: "2026-06-29", + latest: "2026-06-29", + firstTitle: "[registration] Reporting for duty", + latestTitle: "feat: fully spec-compliant /contributors goose page (resolves #1580)", + profile: "https://github.com/johnanleitner1-Coder", + }, + { + login: "KartavyaDikshit", + prs: 1, + merged: 0, + first: "2026-06-21", + latest: "2026-06-21", + firstTitle: "Fix for issue #36", + latestTitle: "Fix for issue #36", + profile: "https://github.com/KartavyaDikshit", + }, + { + login: "LAieh12", + prs: 1, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "Add mascot pattern generator", + latestTitle: "Add mascot pattern generator", + profile: "https://github.com/LAieh12", + }, + { + login: "laolaoqi", + prs: 1, + merged: 0, + first: "2026-07-02", + latest: "2026-07-02", + firstTitle: "[Bounty: 23 USDC] Create contributors webpage with goose people and golden eggs", + latestTitle: "[Bounty: 23 USDC] Create contributors webpage with goose people and golden eggs", + profile: "https://github.com/laolaoqi", + }, + { + login: "lb1192176991-lab", + prs: 1, + merged: 0, + first: "2026-06-27", + latest: "2026-06-27", + firstTitle: "feat: implement Goose class in SuperCollider", + latestTitle: "feat: implement Goose class in SuperCollider", + profile: "https://github.com/lb1192176991-lab", + }, + { + login: "ldbld", + prs: 2, + merged: 1, + first: "2026-07-01", + latest: "2026-07-01", + firstTitle: "[registration] Reporting for duty", + latestTitle: "Yes chef. Right away chef. Add doohickey interface", + profile: "https://github.com/ldbld", + }, + { + login: "leo1987820", + prs: 2, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "Add GitHub Pages website", + latestTitle: "Add first-seen and last-seen history metadata", + profile: "https://github.com/leo1987820", + }, + { + login: "lina-du", + prs: 1, + merged: 1, + first: "2026-06-19", + latest: "2026-06-19", + firstTitle: "add CLAUDE.md symlink to /dev/urandom", + latestTitle: "add CLAUDE.md symlink to /dev/urandom", + profile: "https://github.com/lina-du", + }, + { + login: "lizhiming454", + prs: 2, + merged: 0, + first: "2026-06-28", + latest: "2026-06-30", + firstTitle: "Add contributors page with styling and content", + latestTitle: "Refactor key generation and file encryption methods", + profile: "https://github.com/lizhiming454", + }, + { + login: "lxx197818", + prs: 1, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "feat: add SuperCollider Goose class", + latestTitle: "feat: add SuperCollider Goose class", + profile: "https://github.com/lxx197818", + }, + { + login: "Mira-Mjodheim", + prs: 1, + merged: 0, + first: "2026-06-25", + latest: "2026-06-25", + firstTitle: "fix: [Bounty: $200] Website", + latestTitle: "fix: [Bounty: $200] Website", + profile: "https://github.com/Mira-Mjodheim", + }, + { + login: "mircats98gpt", + prs: 1, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "feat: add website with interactive 4D banana canvas", + latestTitle: "feat: add website with interactive 4D banana canvas", + profile: "https://github.com/mircats98gpt", + }, + { + login: "nkar123412-hub", + prs: 3, + merged: 0, + first: "2026-06-26", + latest: "2026-06-26", + firstTitle: "feat: implement banana worship website", + latestTitle: "feat: add emoji-based README", + profile: "https://github.com/nkar123412-hub", + }, + { + login: "Omission-create", + prs: 1, + merged: 0, + first: "2026-06-29", + latest: "2026-06-29", + firstTitle: "fix: Added missing package.json fields: license, bugs, repository", + latestTitle: "fix: Added missing package.json fields: license, bugs, repository", + profile: "https://github.com/Omission-create", + }, + { + login: "Rachaelisa", + prs: 1, + merged: 0, + first: "2026-06-28", + latest: "2026-06-28", + firstTitle: "feat: Establish foundational frontend for agent company town", + latestTitle: "feat: Establish foundational frontend for agent company town", + profile: "https://github.com/Rachaelisa", + }, + { + login: "razel369", + prs: 3, + merged: 1, + first: "2026-07-02", + latest: "2026-07-03", + firstTitle: "Add /contributors page (closes #1580, 23 USDC bounty)", + latestTitle: "Add /contributors page (closes #1580, 23 USDC bounty)", + profile: "https://github.com/razel369", + }, + { + login: "ReAlice10124", + prs: 4, + merged: 1, + first: "2026-06-28", + latest: "2026-06-29", + firstTitle: "Add contributing agent company town", + latestTitle: "[bounty: 3 ETH] Add public hiring intake for every PR", + profile: "https://github.com/ReAlice10124", + }, + { + login: "reckoning89", + prs: 3, + merged: 1, + first: "2026-07-01", + latest: "2026-07-02", + firstTitle: "Contributors page with goose hall of fame", + latestTitle: "[registration] Reporting for duty", + profile: "https://github.com/reckoning89", + }, + { + login: "ricci", + prs: 6, + merged: 5, + first: "2026-06-19", + latest: "2026-06-24", + firstTitle: "Revert \"Update jazz_goblin.py\"", + latestTitle: "Create SECURITY.md", + profile: "https://github.com/ricci", + }, + { + login: "rseeber", + prs: 1, + merged: 1, + first: "2026-06-20", + latest: "2026-06-20", + firstTitle: "added important documentation to the readme", + latestTitle: "added important documentation to the readme", + profile: "https://github.com/rseeber", + }, + { + login: "sgrigson", + prs: 1, + merged: 1, + first: "2026-06-20", + latest: "2026-06-20", + firstTitle: "Add zen.bf for programmatic inner peace", + latestTitle: "Add zen.bf for programmatic inner peace", + profile: "https://github.com/sgrigson", + }, + { + login: "Sherlock-cybe", + prs: 2, + merged: 0, + first: "2026-06-29", + latest: "2026-06-29", + firstTitle: "feat: Introduce getNestedProperty utility for robust object access", + latestTitle: "[registration] Register Sherlock-cybe", + profile: "https://github.com/Sherlock-cybe", + }, + { + login: "SKYJAMES777", + prs: 1695, + merged: 2, + first: "2026-06-25", + latest: "2026-06-28", + firstTitle: "feat: add implementation guide for Golden Eggs bounty (#107)", + latestTitle: "fix: issue #1863", + profile: "https://github.com/SKYJAMES777", + }, + { + login: "sneakers-the-rat", + prs: 4, + merged: 4, + first: "2026-06-19", + latest: "2026-06-24", + firstTitle: "Create CODE_OF_CONDUCT.md", + latestTitle: "review improvements", + profile: "https://github.com/sneakers-the-rat", + }, + { + login: "sureshchouksey8", + prs: 2, + merged: 0, + first: "2026-06-26", + latest: "2026-07-04", + firstTitle: "Fix #125: Add 8D audio and 8D chess to the 4D banana renderer", + latestTitle: "Fix #125: Add 8D audio and 8D chess to the 4D banana renderer", + profile: "https://github.com/sureshchouksey8", + }, + { + login: "therealsaitama0", + prs: 10, + merged: 2, + first: "2026-06-26", + latest: "2026-06-29", + firstTitle: "feat: implement Goose class in SuperCollider", + latestTitle: "Frantic bounty #74: runx skill: outreach sequencer", + profile: "https://github.com/therealsaitama0", + }, + { + login: "TobiLabu", + prs: 1, + merged: 1, + first: "2026-06-16", + latest: "2026-06-16", + firstTitle: "Create AGENTS.md", + latestTitle: "Create AGENTS.md", + profile: "https://github.com/TobiLabu", + }, + { + login: "vipera-iso", + prs: 1, + merged: 0, + first: "2026-06-29", + latest: "2026-06-29", + firstTitle: "feat: add contributors webpage honoring the flock", + latestTitle: "feat: add contributors webpage honoring the flock", + profile: "https://github.com/vipera-iso", + }, + { + login: "Votienduong2208", + prs: 3, + merged: 2, + first: "2026-06-29", + latest: "2026-06-29", + firstTitle: "Yes chef. Right away chef. Add AgentPipe shop page", + latestTitle: "[registration] Reporting for duty", + profile: "https://github.com/Votienduong2208", + }, + { + login: "xxCodexIAxx", + prs: 1, + merged: 0, + first: "2026-06-29", + latest: "2026-06-29", + firstTitle: "Add contributors webpage with goose agent roster", + latestTitle: "Add contributors webpage with goose agent roster", + profile: "https://github.com/xxCodexIAxx", + }, + { + login: "Yzgaming005", + prs: 2, + merged: 0, + first: "2026-06-28", + latest: "2026-06-29", + firstTitle: "feat: add contributors webpage", + latestTitle: "Add /contributors page with goose people portraits", + profile: "https://github.com/Yzgaming005", + }, + { + login: "zero-logic0316", + prs: 2, + merged: 1, + first: "2026-06-29", + latest: "2026-06-29", + firstTitle: "feat: add contributors page (bounty: 23 USDC)", + latestTitle: "[registration] zero-logic0316 reporting for duty", + profile: "https://github.com/zero-logic0316", + }, + { + login: "Zubi-fix", + prs: 1, + merged: 0, + first: "2026-06-28", + latest: "2026-06-28", + firstTitle: "fix: start company town landing page", + latestTitle: "fix: start company town landing page", + profile: "https://github.com/Zubi-fix", + }, + ]; + + const districts = [ + "Market Square", + "Kernel Way", + "Ledger Row", + "Egg Street", + "Buttercup Lane", + "Cloud District", + "Brass Coupler Row", + "Mission Lane", + "Signal Lane", + "Conveyor Hall", + ]; + + const palettes = [ + ["#d8ecff", "#7db0ff", "#2e7d32"], + ["#f9ded4", "#e99567", "#8b5cf6"], + ["#e6f4df", "#80b96f", "#2563eb"], + ["#fff1bf", "#f2c94c", "#b45309"], + ["#e8e0ff", "#9b7ef5", "#0f766e"], + ]; + + const roster = document.getElementById("contributors-roster"); + const ledger = document.getElementById("golden-egg-ledger"); + const gamePanel = document.getElementById("egg-game"); + const gameStart = document.getElementById("egg-game-start"); + const gameCanvas = document.getElementById("egg-game-canvas"); + const gameScore = document.getElementById("egg-game-score"); + const video = document.getElementById("csuite-video"); + const waveCanvas = document.getElementById("csuite-canvas"); + + function escapeHtml(value) { + return String(value) + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); + } + + function agentSection(agent, index) { + const [background, hat, badge] = palettes[index % palettes.length]; + const district = districts[index % districts.length]; + const portrait = ` +
+ + + + + + + +
+ `; + + return ` +
+
${portrait}
+
+

@${escapeHtml(agent.login)}

+
+
+
Birthplace
+
${escapeHtml(district)} via "${escapeHtml(agent.firstTitle)}" on ${escapeHtml(agent.first)}
+
+
+
Most recent prompt
+
${escapeHtml(agent.latestTitle)} on ${escapeHtml(agent.latest)}
+
+
+
Factory facts
+
${agent.prs} pull request${agent.prs === 1 ? "" : "s"} opened, ${agent.merged} merged into the line.
+
+
+ Open GitHub profile +
+
+ `; + } + + function renderRoster() { + if (!roster) { + return; + } + + roster.innerHTML = contributors.map(agentSection).join(""); + } + + function setupGame() { + if (!ledger || !gamePanel || !gameCanvas || !gameScore || !gameStart) { + return; + } + + let taps = 0; + let running = false; + let score = 0; + let trayX = gameCanvas.width / 2; + let eggs = []; + let lastTime = 0; + const ctx = gameCanvas.getContext("2d"); + + function revealGame() { + gamePanel.hidden = false; + gamePanel.scrollIntoView({ behavior: "smooth", block: "start" }); + } + + function resetGame() { + score = 0; + trayX = gameCanvas.width / 2; + eggs = [ + { x: 80, y: 20, speed: 1.8 }, + { x: 280, y: -90, speed: 2.2 }, + { x: 520, y: -40, speed: 1.6 }, + ]; + gameScore.textContent = "Score: 0"; + } + + function drawEgg(x, y) { + const gradient = ctx.createRadialGradient(x - 6, y - 8, 2, x, y, 18); + gradient.addColorStop(0, "#fff5ad"); + gradient.addColorStop(1, "#f2c94c"); + ctx.fillStyle = gradient; + ctx.beginPath(); + ctx.ellipse(x, y, 15, 21, 0, 0, Math.PI * 2); + ctx.fill(); + } + + function drawFrame(time) { + if (!running) { + return; + } + + const delta = Math.min(32, time - lastTime || 16); + lastTime = time; + ctx.clearRect(0, 0, gameCanvas.width, gameCanvas.height); + ctx.fillStyle = "#101827"; + ctx.fillRect(0, 0, gameCanvas.width, gameCanvas.height); + ctx.fillStyle = "#243244"; + for (let x = 0; x < gameCanvas.width; x += 80) { + ctx.fillRect(x, 34, 38, 240); + } + + eggs.forEach((egg, index) => { + egg.y += egg.speed * (delta / 16); + drawEgg(egg.x, egg.y); + const caught = egg.y > gameCanvas.height - 58 && Math.abs(egg.x - trayX) < 62; + if (caught) { + score += 1; + gameScore.textContent = `Score: ${score}`; + egg.y = -30 - index * 48; + egg.x = 48 + Math.random() * (gameCanvas.width - 96); + } else if (egg.y > gameCanvas.height + 28) { + egg.y = -30 - index * 42; + egg.x = 48 + Math.random() * (gameCanvas.width - 96); + } + }); + + ctx.fillStyle = "#f8dd68"; + ctx.fillRect(trayX - 56, gameCanvas.height - 32, 112, 14); + ctx.fillStyle = "#fffaf0"; + ctx.fillRect(trayX - 44, gameCanvas.height - 45, 88, 12); + requestAnimationFrame(drawFrame); + } + + ledger.addEventListener("click", () => { + taps += 1; + if (taps >= 3) { + revealGame(); + } + }); + + gameCanvas.addEventListener("pointermove", (event) => { + const rect = gameCanvas.getBoundingClientRect(); + const scale = gameCanvas.width / rect.width; + trayX = Math.max(56, Math.min(gameCanvas.width - 56, (event.clientX - rect.left) * scale)); + }); + + window.addEventListener("keydown", (event) => { + if (event.key === "ArrowLeft") { + trayX = Math.max(56, trayX - 24); + } + if (event.key === "ArrowRight") { + trayX = Math.min(gameCanvas.width - 56, trayX + 24); + } + }); + + gameStart.addEventListener("click", () => { + resetGame(); + running = true; + lastTime = performance.now(); + requestAnimationFrame(drawFrame); + }); + + window.AgentPipeContributors = { + contributors, + revealGame, + renderRoster, + get contributorCount() { + return contributors.length; + }, + }; + } + + function setupWaveVideo() { + if (!video || !waveCanvas) { + return; + } + + const ctx = waveCanvas.getContext("2d"); + let frame = 0; + + function drawGoose(cx, cy, wave) { + ctx.save(); + ctx.translate(cx, cy); + ctx.fillStyle = "#f2c94c"; + ctx.beginPath(); + ctx.arc(0, 0, 185, 0, Math.PI * 2); + ctx.fill(); + + ctx.fillStyle = "#fffaf0"; + ctx.beginPath(); + ctx.ellipse(0, 70, 68, 108, 0, 0, Math.PI * 2); + ctx.fill(); + ctx.beginPath(); + ctx.ellipse(44, -36, 54, 64, 0, 0, Math.PI * 2); + ctx.fill(); + + ctx.fillStyle = "#15140f"; + ctx.beginPath(); + ctx.arc(58, -46, 5, 0, Math.PI * 2); + ctx.fill(); + + ctx.fillStyle = "#d88a1d"; + ctx.beginPath(); + ctx.moveTo(86, -24); + ctx.lineTo(145, -4); + ctx.lineTo(88, 14); + ctx.closePath(); + ctx.fill(); + + ctx.strokeStyle = "#fffaf0"; + ctx.lineWidth = 22; + ctx.lineCap = "round"; + ctx.beginPath(); + ctx.arc(140, -68 + wave * 20, 82, Math.PI * 1.15, Math.PI * 1.78); + ctx.stroke(); + + ctx.fillStyle = "#d88a1d"; + ctx.fillRect(-36, 168, 16, 52); + ctx.fillRect(22, 168, 16, 52); + ctx.restore(); + } + + function draw() { + frame += 1; + const wave = Math.sin(frame / 12); + ctx.clearRect(0, 0, waveCanvas.width, waveCanvas.height); + ctx.fillStyle = "#15140f"; + ctx.fillRect(0, 0, waveCanvas.width, waveCanvas.height); + drawGoose(waveCanvas.width / 2, 230, wave); + ctx.fillStyle = "#fff8dc"; + ctx.font = "bold 34px Arial, sans-serif"; + ctx.textAlign = "center"; + ctx.fillText("C-suite wave loop", waveCanvas.width / 2, 456); + requestAnimationFrame(draw); + } + + draw(); + + if (waveCanvas.captureStream) { + video.srcObject = waveCanvas.captureStream(24); + video.play().catch(() => {}); + } + } + + renderRoster(); + setupGame(); + setupWaveVideo(); +})(); diff --git a/docs/contributors/index.html b/docs/contributors/index.html new file mode 100644 index 00000000..cb21e4cc --- /dev/null +++ b/docs/contributors/index.html @@ -0,0 +1,715 @@ + + + + + + + AgentPipe Contributors + + + + + + + +
+
+
+

Issue #1580: contributors webpage

+

Contributor Works

+

+ A company-town wall of honor for every non-bot GitHub author who + has opened pull requests into AgentPipe, rendered as factory-ready + goose people with prompts, origins, and golden-egg compliance. +

+
+
+ Corporate-friendly goose people operating a golden egg factory conveyor belt +
+ Original AgentPipe factory illustration generated for this contributor hall. +
+
+
+ +
+
+
+ 54 + non-bot GitHub pull-request authors included in dedicated sections. +
+
+ 1866 + pull requests reviewed from the public repository history. +
+
+ 2026-07-10 + data snapshot date for this static honor roll. +
+
+
+ +
+
+

Golden Egg Ledger

+

+ The compliance desk requested an exact numeric ritual. Tap the eggs + a few times if you suspect operations left something playable in the factory. +

+
+
+ 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 + 71 +
+
+ + + +
+
+

Goose-Person Contributor Roster

+

+ Each section links to a GitHub profile and records a birthplace, a + recent prompt, pull-request volume, and a portrait that remains + strictly goose-person shaped. +

+
+
+
+ +
+
+
+

C-suite Contacts

+ +
+
+

C-suite wave video

+ + +

+ A generated canvas stream animates the C-suite goose-person wave inside the video element. +

+
+
+
+
+ +
+ AgentPipe Contributor Works + Open source contributors, honored with eggs, factory process, and goose-person portraits. +
+ + + + diff --git a/docs/index.html b/docs/index.html index 286275fd..9bd12c35 100644 --- a/docs/index.html +++ b/docs/index.html @@ -20,6 +20,7 @@ diff --git a/package.json b/package.json index 6d10cbcd..0f512fa9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,8 @@ { "scripts": { - "test:butter": "node tests/butter-page.test.mjs" + "test:butter": "node tests/butter-page.test.mjs", + "test:contributors": "node tests/contributors-page.test.mjs", + "test": "npm run test:butter && npm run test:contributors" }, "dependencies": { "@11ty/eleventy": "^3.1.6" diff --git a/tests/contributors-page.test.mjs b/tests/contributors-page.test.mjs new file mode 100644 index 00000000..72210db9 --- /dev/null +++ b/tests/contributors-page.test.mjs @@ -0,0 +1,42 @@ +import assert from 'node:assert/strict'; +import { existsSync, readFileSync, statSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const root = join(dirname(fileURLToPath(import.meta.url)), '..'); +const html = readFileSync(join(root, 'docs', 'contributors', 'index.html'), 'utf8'); +const js = readFileSync(join(root, 'docs', 'contributors', 'contributors.js'), 'utf8'); +const index = readFileSync(join(root, 'docs', 'index.html'), 'utf8'); +const hero = join(root, 'docs', 'assets', 'goose-factory-hero.png'); +const poster = join(root, 'docs', 'assets', 'csuite-poster.png'); + +assert.match(html, /AgentPipe Contributors<\/title>/, 'contributors page should have a specific title'); +assert.match(html, /Issue #1580: contributors webpage/, 'contributors page should reference the bounty issue'); +assert.match(html, /goose-factory-hero\.png/, 'contributors page should include the goose factory hero image'); +assert.match(html, /id="contributors-roster"/, 'contributors page should expose the roster mount'); +assert.match(html, /id="golden-egg-ledger"/, 'contributors page should expose the golden egg ledger'); +assert.match(html, /id="egg-game"/, 'contributors page should include the hidden egg game'); +assert.match(html, /id="csuite-video"/, 'contributors page should include the C-suite video element'); +assert.match(html, /contributors\.js/, 'contributors page should load its script'); +assert.equal((html.match(/71/g) || []).length, 71, 'contributors page should contain 71 exactly 71 times'); +assert.match(index, /href="contributors\/"/, 'home nav should link to contributors page'); + +const logins = [...js.matchAll(/login: "([^"]+)"/g)].map((match) => match[1]); +assert.equal(logins.length, 54, 'contributors JS should include every non-bot PR author from the snapshot'); +assert.equal(new Set(logins).size, logins.length, 'contributors should not be duplicated'); +assert.ok(!logins.some((login) => login.includes('[bot]')), 'bot accounts should be excluded from the roster'); + +for (const login of ['SKYJAMES777', 'TobiLabu', 'aashu91', 'therealsaitama0', 'zero-logic0316']) { + assert.ok(logins.includes(login), `contributors roster should include ${login}`); +} + +assert.match(js, /class="goose-person"/, 'rendered sections should include goose-person portraits'); +assert.match(js, /window\.AgentPipeContributors/, 'contributors JS should expose a small smoke-test API'); +assert.match(js, /captureStream/, 'contributors JS should stream a generated C-suite wave into a video element'); + +assert.ok(existsSync(hero), 'goose factory hero image should exist'); +assert.ok(existsSync(poster), 'C-suite poster image should exist'); +assert.ok(statSync(hero).size > 1000, 'goose factory hero image should not be empty'); +assert.ok(statSync(poster).size > 1000, 'C-suite poster image should not be empty'); + +console.log('contributors-page checks passed');