From 7b80a328be9c9aae7478d1a408139bb6537be632 Mon Sep 17 00:00:00 2001 From: vitya Date: Wed, 12 Aug 2026 19:48:04 +0300 Subject: [PATCH] feat: session-handoff v0.4.0 closing ritual (idea 7); setup-context7 v2.0.0 CLI-first (idea 16); backfill vendored pins (idea 2) --- README.md | 4 +- dist/caveman-commit.skill | Bin 1532 -> 1531 bytes dist/caveman-compress.skill | Bin 15012 -> 15012 bytes dist/caveman-help.skill | Bin 1232 -> 1232 bytes dist/caveman-review.skill | Bin 1682 -> 1680 bytes dist/caveman.skill | Bin 2124 -> 2123 bytes dist/find-skills.skill | Bin 2565 -> 2562 bytes dist/session-handoff.skill | Bin 9941 -> 11287 bytes dist/setup-context7.skill | Bin 4211 -> 4533 bytes skills/caveman-commit/SKILL.md | 4 +- skills/caveman-compress/SKILL.md | 4 +- skills/caveman-help/SKILL.md | 4 +- skills/caveman-review/SKILL.md | 4 +- skills/caveman/SKILL.md | 4 +- skills/find-skills/SKILL.md | 4 +- skills/session-handoff/SKILL.md | 25 ++++- skills/setup-context7/SKILL.md | 172 ++++++++++++++++--------------- 17 files changed, 127 insertions(+), 98 deletions(-) diff --git a/README.md b/README.md index 19c2e18..6dcb49b 100644 --- a/README.md +++ b/README.md @@ -111,8 +111,8 @@ an explicit `adapted-from` marker in its frontmatter. | skill | provenance | |---|---| -| `caveman`, `caveman-commit`, `caveman-compress`, `caveman-help`, `caveman-review` | `adapted-from: JuliusBrussee/caveman` (MIT) — vendored copy, upstream pin TBD | -| `find-skills` | `adapted-from: vercel-labs/skills` (MIT) — vendored copy, upstream pin TBD | +| `caveman`, `caveman-commit`, `caveman-compress`, `caveman-help`, `caveman-review` | `adapted-from: JuliusBrussee/caveman @ 0993277` (MIT) — vendored copy | +| `find-skills` | `adapted-from: vercel-labs/skills @ c6f69c6` (MIT) — vendored copy | | `grilling` | `adapted-from: mattpocock/skills @ 84fdeffd` (MIT) — family collapsed to one skill (pi hides `disable-model-invocation` wrappers) | | `brainstorming` | `adapted-from: obra/superpowers @ 6.2.0` (MIT) — divergent phase, visual-companion dropped | | `diagnosing-bugs` | `adapted-from: mattpocock/skills @ 84fdeffd` (MIT) + superpowers 6.2.0 concepts (Iron Law, red flags) | diff --git a/dist/caveman-commit.skill b/dist/caveman-commit.skill index ca0e873621c8eb3c9f9e51f14149922f54c74450..4113447c459872b533724eeb61b1b87cbf18c886 100644 GIT binary patch delta 1471 zcmV;w1wi`z3;PQjP)h>@6aWAK2mr>N3|&7N&;Dx#002k|000-0%mo^Mg;v3C+eQ$* z8}L6&l|ya8q%1eB8zC?%JA&)BaRSGwd*q57N*j~AEO#lHJ@wKnb2`Oj>r3Z8N0OB zl@EJo`+G!h3tua_wyGK4#ZV%k62H`fX~BkT!mK3#1Gdi zZ5HBQ8_&j*G8xsZoHf{oCuM4<}&5I2r;TbIhm^ro4=jk>%(yR548(ZzEsp#RA3dZg*ZSkf;Q2P?>mtFA}Kt_wGV09~RET zkVB35L8bnG>T_*>DKDBlkLhlSngC*4iWlPl$rHM13U=~59BwLEXv34?5K&O_+_x2< z9Xxj+2%jBJ=(#Q{$z89QTvL{+ZqJgyrKCTUkgd8{#KSG@-Gq{yl~0ba>IYeB&Jnt; zkDSv|XOG+lz4@-T07k%b*C|DA6O?wlYSpU5?TSN}v+TANL1pt4M$!hN#T zTq5;B2-H{~UUN8r2iLE_U?9$RsMG;eS?Bb;;3L8wIIk)?J&}_rF7%)aK@S0Fo5}7= z<o0O*EuuGysAn~z@KI59;70y{1W z>%ineeU0=B9Q=Mci0sVEy4>p z5_&FweN*N@kG`mmQ~~^eaY#ugIa=ykXQ%*Tg&MO6P#P#1Ly+0HxVv`4)$z%f+qgH?-HK@X`l=Vw zf28=y1lI>3N2~G3)|pHM#3aAcC8zfYzPt1MW;Xry>iUu{zMfuR&L(}*P9oj0EgR>5 zd)e~Gj)>+AFqlq`Pritb@i&g?Re@29*NjknQyWK5$H&{Q1mU5Q9PcCwR)rA;o?|+- zvNbK%fpsP=g!+L$q0M~UQyfE!FawDnx%j1+bj@9!6j0UDIr|BEEpKS^ z4I=0|;TiJn8(|b0ok%xtkQ3Oz^QN1Bx5ARX+u~E>VLJxTZDTSd)Jf%)*l&is>(B2F z;h0`XyOI7@H-?gh_WcR;uWa*5=6WYrx3depO@_iZzUsNT`FK(;e0N9*3!C0kr)cC= zDfFb62F}~+gKxjkW6zwHO=r@VP7JZm!PZUmVRFWQ15ir=0u%rg0000F2mr>N Z3|&7N&;Dx#002mnx&=H2palQ`000!y$w2@B delta 1465 zcmV;q1xEV&3;YWgP)h>@6aWAK2mnQZ3|%fpjM8ic002;t7a)I4Z`(!?y&Ldo_Rc+rM;`m z+kN`*^Y64`TeyFQ3(8&H9a3BS(6Fkg)|PJ1UhVFzxbfQA2_2=!>Cx^^!9H(v9pc{U z?hesA6B;G%>xSV)Oi3hE;g?!4E!c9Sf@@MbZ-Xc6v}cm=K04`Xz0`(D>~OQvb|L1q z4QvA`TM#1i&SD>yoJHsog);adW;~UysZ>bmZ99L@d7ys}zy9^b5#>wO_(Phzq9bQb z2QO@Cv|e_jXy4n<1G)K1yVj@l4za}pEn*$pV`=Ay`RD!ptOuD<12;{pvcQKZa3m0&aV~zMh z<>7zobM1eqG;LX?bhkuJ05P26h1h@gjBZ-PUY-vQHkCBm^5ozEQBd|WbTyyuz4V|A zpYBiSrLJnpU9XsYTUDy*PP53aY&evWtNU2Q!Y%Im31ua#kR4*x53)2|B6QctGwhYJ z7B2U)2KMo2z64q2Vcu#}#2qdFedrALMvzU&#La)@KT%cA6%!h%q7bOyPnL!&q&|v) zS{LGLjtB7IhZPu%#MmP$^#Ik*dp$RNNZ14CRZTBW40}6_X95c@N2J z?_1$aLU#=+p#qB0S4;NJT4Nae%aSZsIy;B}-Eheb+nk5%<2N^6uA(J@9p}b*F#Fl_ z6TuZ{@qGLu>#K1Gy3+OR``HaG98PIFlwyB$yF|)^JPLXBgCKb+|JG5c)~%z0+XlXa z>3RZ4wF_OAz2Zd;(c09b>HLV;&{1jLrD@t9M{|Ix64eGFWRc9f9&~QvwTqz{6tvc1 zN#{njg zQ|7^dzNn6r0e-+ZrX-^ws(bdJs(KLkD`X7hc`Y@s9a?SVV{Cm0AX<$XM6N^*X}j?W zjzner`5Pn!DNhJ`L6>}DE;#i6@YJHVeIttWmoX5FuY#H@&%N6I_(j@hmSwVt@jXan zzxQx4yQQ%h^y7&x#)DN!hv>@9#Y2B?w9E`qiQl>v4>23phQ4T^wG<|b92dE z5yrdj#M6JiD1qzrDP^p!2V%*B7(NkhGUbAKk559|nKf@~4J~ z<_s{HPL58#Opfq(oYHH9QH$4%P(s^SPtT8!wp|IrLnS$VlqgsgM;LgH>D0;A)T|@x zY;J`5kw3A`eA-hyLyNcu5WEs#(zmDh5AGvxhn{_zk_>6Nq_ z>2FPIDO>0;oIw97Hm_u^_j2`*c7eAoQ1~{~12;DxPs+#d4k@8=`91ZDMqaf-PfBUz zgR4LK28=xheGVEk7=36ulc98S5$ham-9#TJXZkl#O928D02BZK00<5MMSu)lE=G*f TYy|)SP?Na@JO-f!00000^0(3| diff --git a/dist/caveman-compress.skill b/dist/caveman-compress.skill index 26639b1bad2d003df2ac3634efb8119347f1289e..f54e8300c45fe671450c02c346f242a7de0dded6 100644 GIT binary patch delta 2227 zcmV;k2u$~+b)^`WZa*ir}WY8?;Axa3DS zXz4?z5=+No#3DZTL&Dp&cCn%hDAeHwVwJU&e{|hCQ$uwe7BMLZoWT4Bzwa;4ph&rf zVhTeI19i1+H2f?clE=esFbP6atH}qmG7d7?{EA)=3~$hYbzwCvRDC`4Vp>Bg(yP<6 zlWIHyA4SO(-d8#t(Fpj_7#@1YQhSx!=TJm@oAoWo_I7us9N^uZM>H$A%r@c0>La=s ze?sr0=C|LE!v7EdH1=9uGxW%Vp?(PdA7i%x;m;tO3kICN&$p4ASH-!49>2~12*5cb zc-v}619AeAuOpkj*{QZc9fe;6Ul$x7S9H~yNI$Wt7XPb{7YwwaW&bZab1l=D;-OuTp zZ>V3V*1M-P?Wky`XKE3>9g_aIahrucWz#jy&Q9splUENQe;Z{@qY`p|NF4A7C(V*{ z2tGv6O^c`Xv^VuNG~GdaYDb~_Nre@RX!r{!gtO}jIZmcg8B#_h2AvQWBn1q4LdkSG z7DX|^A6hD7ff1=?LS&!Fexsp3=-!8v&Edlw`3YIgOz~Oa(tx}kU~a>B{T1=hC=Uk# zajy0W!`ZaskW6ja1jV#6;dJ2jS1^|={nHTB1kwRAoL;EN zw8W1J+>@W8>3aUl737l1i!1GP;71mA0Y{>8#n-(E(%PGVBy`}Uv1@+uON4F+QNFaQ z@7HjKpHIJSGSVH0oH>ME>jr?VAju@^%&JYa&~ys`e_KAV_5+Ku%=nHIKJY5G-pV4j zuDowpIt#l5Be({}QQro*m*s*10uJ&f`t9HUp}lNNr>;>fF#rAolBu}Eg#@4?z((~g zbgdAIvTJ-}jWh2YG8#omOFJx=(AWA~eUt564sb&U6u1agO=Gw>F_hwlqj70(jON%p z=;R;Af3vHz56E+tMxAfWa($3>B9Rx?*Wi-WSgAS%+`oK?9{vSmnR=j zf8PDV4n2tR&tuz{>ILu{$Xhffq%QH*2J*^|xaB3q(+( z0zA4VwFZ?N>ULcOISulH2#ch$vi+U7ra1v(8uev=u`vgs__WbjYZ+|V3faCHUviQF zj)Vyb5j*^F{Ps-j2726}HV#VT9|4(dfAReLh^lOvK;znZx9*r_7G|}F_$8F+9db9K z-lV?FU0G(@(h>tj(u_E27}R)|RIcp8vNiwAmHR5F6(5Ln{stP*3gHnWu+TWCOIDVH zA3#GeiYZ6gTeXf9zP_Kq74a{TbD6&Kxi1(8?*SGw&Y6HP-ZDW0Ozv__K!`cqAz*25 zHM*7zJel4W662WLdQ|KC#*dDT@PaF3dPX?v9iN}e>QJZ<1c=+^+8A>8Ha*Ns7dMW7h;o5Xn`R%FR)z-P>E#oF?XLj=Tno}&1|1DJr0Q#^d-yGhK$ zWmfpp->=3i)mQL-`@61JpE)LGi(4CS_{v-kVlPbH7%0~02ey3o&=REj3(kGT^CvH$ zir!&Ns{ibYDVNJCanC9}1l5QGxe1>9a&muJ%KwO}9w}0Nio8F{lgBVE^9=uy-{j?w zb~pItD#xEX^6oatmpl25zsheb<5(e%7Ie_z_R)-!n9L+7nD3;Z54KvnxW>`W8^-!C z(gqn0lQwJzx26gR!{A`*as! z>31@pZcP5-)PB4+JyZke{{c`-0|b*?I2yCi6-y!w%AE{dM&Mj^l?VU;6tgHed;$a# BR!{%{ delta 2227 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 BT<8D* diff --git a/dist/caveman-help.skill b/dist/caveman-help.skill index fd20bf191eb58970455178b4a9c440e30e456527..34e70d825dd6ab4063287bda1f2695e1bf10287d 100644 GIT binary patch delta 1143 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 M20R8e1^@s60As=Zw*UYD delta 1623 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 delta 2065 zcmV+s2=4dG5X=x4P)h>@6aWAK2mnQZ3|(3Fv^B~H008EZ7bAbWK@eHhlI}y%b{o5p ztPP+hwggGFYZw7`mK-j}B4_BCp`-(LLQ>&r{2 zbct1!4`(-*mxz8*cq{seDJv^sg;kYhtyLoU5|t*E5#6f2BX16*rrL>#q+k8$hi}t( zO0JUPKOjt;AUeubA?ZNMioa%cQIMBO&UyZ#EE=34v0w`VWmY7}C05)K9Dr6nh(j(S}( zIl$f;^}Hw!E=0kHxWD*XAVW=_kf^=sd#ffB zRHJdE$)$hHGLbMLP@%7{Wb1S--Wvb$3X^yTjf4v^(6}*}k(kjOdPm zN5GFKk-0F!#h^Ofl69NJ5L1Qo#704CZguCGoD6K z)LUMKSJvXIPWa=<-JqjyIkd82o4jF5YEJm`P5 zu-NM63csJw2RvNpgzmvbY7#{!_|R|ubpJOmEU>!DfLmRK%nbDLtjh0WzRjWb{bpJ@ zsY7p}Pj;-yFf))^lx$pk@@kTMYBe_?hh~QCObwv0fSomR7qEk37XliSu9Z4vp&Np> z_3;>utAv-dvbhm+4&%h=Oih6KNBDp1;!MX3GXNF~L!m8=ehA<&24G(RH%E>!7m6ba z9?L7gq;G!nd%6!9qcKj6O`B0Rdz0GKlf3h1VLS(~_GGF0N#naHq9*2x`3xE2l|d6L zO3XR-u0~f{^v6sTQ)$A}%U-fH%jRuytjfAvkO<>bqY%IbZcXXz`P0{beT;v9Bl_|6 z{!gyI%~-%jVy#%Gb;!gl)nZ;#s+!(GmM|K}j<7WoiS9GwhcfXv#t05iWH2?6ol-#{ zUG%@2&!$%|eiy%b@o{|q(bw_mldrB_3Ta-`;V~9_DM@s-<)LtK$IcDhLQ_k0MJ6Q@ zJxfQs;vw0t(RQtzaBB>Y1%cC|^xSB~DQVK&kHDVFnv!Wv9x%o#Bzb#8Mih@P1FD%}< zpyHzNmM#!^_qk$(-3T`M=8d^`otY~(LRw&CuBg$%$nW&<^Ma;J8Ww+G4?XAq`t_@q zU%mPK<(sF^&R_iffB*U9)yqGh{o_+SpFRKL{Ifrve(~(}mw!6_^yBjwZZlm9;c z2p6bTNvEGY0YY%NsJhL=`EUPr`t)mPX@sHr_0xYgW+2dMh&a%zI=VP#;t1-BEQ>aB zm*6oxt_tixN`)6#pOSyahnAsds4}MD(YOebTUS0Kfv|!esn8;GX{LebY>^T#R|XB= z4WI#_sS4d0ND_$8p;0N5ri!tZVi)Pu({&fQ{!{QDUo1lLf# zH_y4W?%TcluA+CUS?g8l&cUwqSfcApU@;7ByGO(9?)DGX!~pXVjGos7*0e^^FbI_m z^wFs?aMSP$3Tp_guU#}HTvC1J7*K#r^U~y{0 zn#cy2$NM?x%MmkPfCOscCzeVo3&~Rs$6LqI#jfUs^v=oL-`*nA>1lNAssV4$&o zlSZSFdsOh#=I-_m?XPcqFbr|JpSGX*zguk_HiQ+?T^VLVAB*ImuE2}17_n5X^BpbT zFt8z*!14hT#h8EKDevN)T`;X9R83Mt#iPq49T~mA(g*D?f~e(DRr5mvVSxU(bSh;j v*X$Wkf;9R+P)h*<6aW+e000O8MSu)lS@yIw$_D@d=93TzH3s+x00000mL2Wh diff --git a/dist/find-skills.skill b/dist/find-skills.skill index d662234b85b42214fbaeda720236468b75e20839..d4d4e52775a1e2a82dd833530912e5b31bdddcd4 100644 GIT binary patch delta 2508 zcmV;-2{ZPE6oM2NP)h>@6aWAK2mr>N3|(Li+N5|1001bF7ao6d+eQ+7SC#&uLq9~) z5|m{pu3c6tw&U1qmG71urz({y4uK&tCWyge2BP88L!R;hTl|Bkb}YqFVOE+(x!q7^>74)hbu^|C zn?fpVriHD;TjN+nt@|%NSDsQ;P9_t4$1?r7sT|rJ8G+3Ku?s1O6fy%)Noe$K! z(BX*5;X%TYIy|^T&)B$&7^lO7fgZW|w6)F69*w@_kcxV?f}T5W)~R)^^Ljmzqwdg0 zF~!mcr-OgNaxQ=5H-3Bcj?GhEkkDhda{IyIg^0kf(dan`Bem zQdqK9(B=qfWtJt&7LSc7(^X;HHRO#+`*d>L2NPfmj*9r9Coj(*1`rKj(b24|K1Wc@ zj=MdTN>{L$)~dvRb+GII;HZ)A;AjoF!R?DLLDKQQf|TaxcoFC*qxQAd87~w9QGp2+CnDRlg|oA34HjY4nv4@*(F%E- zF~8~_;(D^2jOo2bNOo`@fWO5%kbW=h?6X8zB?{QoMmU8f061x_mHe$rvsRLPW2%4k zmC+l1`}Vzqy!#U-K?$1BoiIjZEM3}WnTI0;%U#U5ECDz|V!QsjH;u97#CfR|TsOC> z&fsA9keB|X;UZ0SQ@Z~)b+T)7TLNDF^&0k#fv@Skhyg-XTCIj1}*v$B=sJtJhUyf1XZ z5dc7~Gy@@VpGo~y;76plw^g65Oq6<#C?gqd#bL&AY0+eQD)}&MPJ~5b6El;ZB!cEO zXlC*W`UO!896CC?d-uiPdff>t^J5VS0?%t(nY3$nf~;q?ErqOlT&HFR`lwJW~`B}yIdO6#|dN~G49@gXmT%p%=M>da=dxpFzW zx|F>64GN-n zO=!qD84}Ipt^-R3Bkit=REdW}Frtoe8(tTWPxRbe(lRC0H zIqAwqYMaty8RPA3trxm4O5&)q0kkI24;8aP4mGapoLZq%YM7J>P@I1VC7zsINX3C7 zRpW*0;u&uiU`Z6%t|X!M4-#rN9wr0-wKi#Oon3hJ1)-?pA73}lqdNLrTG|rF2a17m zxve?D@3RuI3_|_d#q+mp=z0yUGv3zigdPuTsFF{?&L3b|5Ho1Ly~IC@m1U(tE~#-{ zFB^mW{gmD6IBDNhvEhHRaz10KFIkMxi049IslK%tQx$h(%evbt<&BRW7O$W>&sM^G z8|l8h2wZiWC89k!^=G zAY8vTUj%!!Y_J82>o|`5B9Nn}+C7}WlO5X-C&Sasep(TyYRNC(m z1Ft(FEydq8bufO1LdFBat-ovDpX~nVt2ej)!v2rw6n=jmG#%HWwvAD5K6`E@d|SmE z4cO%Pg)+s4NkjHuhCX$x)V6c|gaI0IQvaCF!DM!y3%&6bUmh3 zGuL&gWt>b+l4iU6V{;P1CHrkE9j?mOdc3WI7@;bY@W-9~Pi&_9N+|n70Uk5sc$R}k z4?I1l-9&%b>Mvc^K>x;!srlSB?nxLCae6AfQy9Cq=fABnFY*l5pWh9AW3DSU;BZV! zkm}d*7f@a@YB_J7A`fMpi|tncrW9Vj$mpkqIOL%?O(W}dK^t-BKiA$1Zjqp$Q1WQh zeT`N25^z-o)|5(4!_!)XA?ZgUe51azV{-r+Y#D!TN0@M(A<-Pgsu@aT*G0!V%|c(H z-1nm+CaJ)s|Dz#>=ou1~3#@(q?o@3w4`4}JD0I`^s^QhoYugR*k5N{hajA$DR@(j2 z7$%6W0zOXrX+0DbY}mcj0r|O5eZ+Y^Rc@z4<~|v&GJ{UbgPj^_vB8lw!7$9|#op}; z9Cm-vESG#!)01o}4MOY=@z!7p@5diGXxJf|()ih+Xbx*-AThKUgS!HFLAnlTKKk5# z8PU8!kvADfINVktNWdzCZo)#C-Qk9KUnhhgt>t@`p}F7CM^T-Z$W13gysZ@v`(hHt z(teii?zzyU=`vQ7p$o))y$5!yC|i$qKY<}7NxXU!+y4ttO928D02BZK00;oaoeW)I W4cer52><{nlg0@-2C4}F0002|quFl& delta 2511 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 Z3|%7pF2{Qb001zP!wESCtqA}C005u(=br!o diff --git a/dist/session-handoff.skill b/dist/session-handoff.skill index 3428852033da27a8f2ac18398ca0b515e331d2e3..8f9549f81c7b1f9e0c9c97b7b3c9d5ce18a5f846 100644 GIT binary patch delta 5764 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

U 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 Ultra-compressed commit message generator. Cuts noise from commit messages while preserving intent and reasoning. Conventional Commits format. Subject ≤50 chars, body only when "why" diff --git a/skills/caveman-compress/SKILL.md b/skills/caveman-compress/SKILL.md index e73dfb6..7a73d51 100644 --- a/skills/caveman-compress/SKILL.md +++ b/skills/caveman-compress/SKILL.md @@ -1,7 +1,7 @@ --- name: caveman-compress -adapted-from: JuliusBrussee/caveman (MIT) — vendored copy, upstream pin TBD -version: 1.0.0 +adapted-from: JuliusBrussee/caveman @ 0993277 (MIT) — vendored copy +version: 1.0.1 description: > Compress natural language memory files (CLAUDE.md, todos, preferences) into caveman format to save input tokens. Preserves all technical substance, code, URLs, and structure. diff --git a/skills/caveman-help/SKILL.md b/skills/caveman-help/SKILL.md index f75a9a8..373064a 100644 --- a/skills/caveman-help/SKILL.md +++ b/skills/caveman-help/SKILL.md @@ -1,7 +1,7 @@ --- name: caveman-help -adapted-from: JuliusBrussee/caveman (MIT) — vendored copy, upstream pin TBD -version: 0.1.0 +adapted-from: JuliusBrussee/caveman @ 0993277 (MIT) — vendored copy +version: 0.1.1 description: > Quick-reference card for all caveman modes, skills, and commands. One-shot display, not a persistent mode. Trigger: /caveman-help, diff --git a/skills/caveman-review/SKILL.md b/skills/caveman-review/SKILL.md index 3c21f38..db06dc8 100644 --- a/skills/caveman-review/SKILL.md +++ b/skills/caveman-review/SKILL.md @@ -1,7 +1,7 @@ --- name: caveman-review -adapted-from: JuliusBrussee/caveman (MIT) — vendored copy, upstream pin TBD -version: 0.1.0 +adapted-from: JuliusBrussee/caveman @ 0993277 (MIT) — vendored copy +version: 0.1.1 description: > Ultra-compressed code review comments. Cuts noise from PR feedback while preserving the actionable signal. Each comment is one line: location, problem, fix. Use when user diff --git a/skills/caveman/SKILL.md b/skills/caveman/SKILL.md index 6be20c7..5b50616 100644 --- a/skills/caveman/SKILL.md +++ b/skills/caveman/SKILL.md @@ -1,7 +1,7 @@ --- name: caveman -adapted-from: JuliusBrussee/caveman (MIT) — vendored copy, upstream pin TBD -version: 0.1.0 +adapted-from: JuliusBrussee/caveman @ 0993277 (MIT) — vendored copy +version: 0.1.1 description: > Ultra-compressed communication mode. Cuts token usage ~75% by speaking like caveman while keeping full technical accuracy. Supports intensity levels: lite, full (default), ultra, diff --git a/skills/find-skills/SKILL.md b/skills/find-skills/SKILL.md index 48fedd0..41b3c13 100644 --- a/skills/find-skills/SKILL.md +++ b/skills/find-skills/SKILL.md @@ -1,7 +1,7 @@ --- name: find-skills -adapted-from: vercel-labs/skills (MIT) — vendored copy, upstream pin TBD -version: 0.1.0 +adapted-from: vercel-labs/skills @ c6f69c6 (MIT) — vendored copy +version: 0.1.1 description: Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill. --- diff --git a/skills/session-handoff/SKILL.md b/skills/session-handoff/SKILL.md index fa24d1b..8fe0f0a 100644 --- a/skills/session-handoff/SKILL.md +++ b/skills/session-handoff/SKILL.md @@ -1,8 +1,8 @@ --- name: session-handoff author: ours -version: 0.3.3 -description: "Sliding handoff between CC sessions via .tasks/NEXT_SESSION.md. Read on session start: orient agent, ask user before action. Write on session-end phrase or substantive commit. Session-end phrases: «завершаем сессию», «сворачиваемся», «закругляемся», «wrap up session», «end session», «we're done for now». Trigger-line in CLAUDE.md: `session handoff: read on start, write on end`. Skip task-zone phrases: «закрываем эту таску», «pause», «отбой», «разбегаемся»." +version: 0.4.0 +description: "Sliding handoff between CC sessions via .tasks/NEXT_SESSION.md. Read on session start: orient agent, ask user before action. Write on session-end phrase or substantive commit. On session-end the agent ALSO runs the closing ritual on its own (idea 7: no invitation needed): handoff write + PROPOSE wiki-ingest of session knowledge + PROPOSE task-board closes — mutations only after user confirmation. Session-end phrases: «завершаем сессию», «сворачиваемся», «закругляемся», «wrap up session», «end session», «we're done for now». Trigger-line in CLAUDE.md: `session handoff: read on start, write on end`. Skip task-zone phrases: «закрываем эту таску», «pause», «отбой», «разбегаемся»." --- # session-handoff @@ -105,6 +105,23 @@ Forward-looking, не timeline: handoff = связка новых вещей к Пустую секцию — оставить заголовок + пометка `(нет на этом раунде)`. Чтобы next агент видел: не забыто, а пусто. 4. **Sliding overwrite.** `Write` поверх `.tasks/NEXT_SESSION.md` (предыдущее содержимое НЕ архивируется в `.archive/handoff-*.md` — sliding contract). История восстанавливается через `git log -p .tasks/NEXT_SESSION.md`. 5. **Stage.** `git add .tasks/NEXT_SESSION.md` — попадает в следующий commit сессии (или в текущий, если запись была вызвана session-end фразой). +6. **Closing ritual (idea 7).** На session-end фразе (НЕ на substantive commit) после handoff-write агент сам, без приглашения, предлагает закрытие: + - **(2) Propose wiki-ingest.** Если за сессию появилось durable-знание (паттерн, решение, коррекция user'а, процедура) — ПРЕДЛОЖИТЬ ingest (using-wiki: `sources/`+концепты или global через `knowledge_ingest`), перечислив кандидатов. Ничего не писать без подтверждения. + - **(3) Propose task-board closes.** Прочитать `.tasks/STATUS.md`: если есть задачи, выглядящие закрытыми (outcome достигнут, все шаги сделаны) — ПРЕДЛОЖИТЬ закрытия. Уважать ralph-loop: verifier-задачи (с `**Verifier:**`) закрывать только через verifier, не по виду. + - Формат предложения — один блок: «Ритуал закрытия: (а) заингестить X в вики? (б) закрыть Y? (в) ничего.» Ждать ответа. Отказ = пропуск, не настаивать. + +## Ритуал закрытия (детали) + +**Граница мутаций:** ритуал берёт инициативу в *проверке и предложении* — но НИ ОДНА мутация (wiki-ingest, закрытие таски) не выполняется молча. Каждая — после явного «да». Причина: вики-шум без ревью и закрытие ralph-loop задач без verifier — дороже пропущенного предложения. + +**Skip (silent):** +- Нет `.wiki/` в проекте → шаг (2) пропускается молча. +- Нет `.tasks/STATUS.md` → шаг (3) пропускается молча. +- Не git-папка / нет `.tasks/` → весь ритуал silent exit (совпадает с базовым скилом). + +**Триггер:** ритуал на session-end фразе; на substantive commit'е — только handoff-write, ритуал НЕ гонять (mid-session коммит ≠ конец сессии, иначе спам предложений). + +**Headless (pi, дизайн):** для автоматического запуска без интерактива нужен pi-extension на `agent_settled` с дедуп-гардом (по образцу inbox-monitor). Не построен — зафиксировано как follow-up; скил покрывает интерактивные харнессы. ## Failure modes @@ -115,17 +132,21 @@ Forward-looking, не timeline: handoff = связка новых вещей к - **Secret detected.** Содержимое handoff'а матчит паттерны секретов (`AKIA...`, `sk-...`, `ghp_...`, `ssh-rsa`, `BEGIN PRIVATE KEY`, JWT в обычном виде, `password=`/`token=` без obfuscation) → **abort write**, не записывать. Файл идёт в git — не место для credentials. Сообщить user'у с указанием подозрительной строки, дать дочистить контекст руками. - **Stale handoff (> 7 дней)** в read mode → не silent, **спросить** user'а оверrайдить или продолжить (Q9 resolved 2026-05-24). - **Mid-task без STATUS.md entry** в write mode → записать handoff без mid-task секции, не блокировать. +- **Ритуал: user отказал во всех предложениях** → пропустить, не настаивать, не повторять в этой сессии. Отказ = решение, не приглашение к уговорам. ## Side effects - Записывает / перезаписывает `.tasks/NEXT_SESSION.md` (project-scope only). - Файл git-tracked, попадает в commit (либо вместе с session work, либо отдельным commit'ом). - Никаких других файлов: `.archive/` не плодим (sliding), `.wiki/log.md` не дёргаем (это не promoted event), `STATUS.md` не правим. +- Ритуал закрытия предлагает wiki-ingest и закрытия тасок — но НЕ пишет их. Файлы пишет user-подтверждённый следующий шаг (using-wiki / using-tasks), не этот скил. - Никаких global мутаций, никаких других проектов, никаких user-level config writes. ## What NOT to do - **Не auto-execute** действия из read handoff'а. Default = orient + ask. Прошлая сессия могла ошибиться; user agency сохраняем. +- **Не писать в вики / не закрывать таски по ритуалу молча.** Ритуал = предложения (idea 7, граница мутаций). Каждая мутация — после явного «да». +- **Не гонять ритуал на substantive commit.** Только session-end фраза. Mid-session коммит → handoff-write без ритуала (иначе спам предложений). - **Не append-with-archive.** Sliding only. `.archive/handoff-.md` создавать не нужно — это создавало бы N artefact'ов, которые user не хочет. История — через git log. - **Не триггерить на task-zone phrases** («закрываем эту таску», «pause»), broad farewells («отбой», «разбегаемся»), partial completions («сейчас завершу одну задачу и тогда поговорим»). - **Не писать секреты** в handoff. Если контент матчит secret-patterns — abort, попросить user'а вычистить контекст. diff --git a/skills/setup-context7/SKILL.md b/skills/setup-context7/SKILL.md index 61a31ee..63ac7b9 100644 --- a/skills/setup-context7/SKILL.md +++ b/skills/setup-context7/SKILL.md @@ -1,37 +1,41 @@ --- name: setup-context7 author: ours -version: 1.0.0 -description: Installs and configures the official context7 MCP plugin (`context7@claude-plugins-official`), reuses the user's existing Context7 API key, and cleans out any manual `mcpServers.context7` entries from `~/.claude.json` and `~/.claude/settings.json`. Use this skill when the user says "install context7", "set up context7", "configure context7", "настрой context7", "установи context7", "context7 не работает", "context7 isn't working", or whenever the `mcp__context7__resolve-library-id` / `mcp__context7__query-docs` tools are missing in a session that needs library docs. Cross-platform — Windows / Linux / macOS. Mutates user-level config; pauses for confirmation before writing. +version: 2.0.0 +description: "Installs and configures the agent-neutral `ctx7` CLI (npm) for Context7 docs — CLI-first, no MCP registration. Reuses an existing Context7 API key or offers the OAuth flow, and migrates off the legacy context7 MCP plugin (`context7@claude-plugins-official`): uninstalls the plugin, cleans `mcpServers.context7` entries from `~/.claude.json` / `~/.claude/settings.json`. Use when the user says «настрой context7», «установи context7», «context7 не работает», \"set up context7\", \"install context7\", \"context7 isn't working\", or when a session needs library docs and the `ctx7` CLI is missing. Cross-platform — Windows / Linux / macOS. Mutates user-level config; pauses for confirmation before writing." --- # setup-context7 -> One-time skill that gets the official context7 plugin running with the user's existing API key, with manual MCP entries cleaned up. Stops at confirmation gates because the procedure modifies user-level config files. +> One-time skill that gets the **`ctx7` CLI** running with the user's existing Context7 key, and migrates off the legacy MCP plugin. Agent-neutral: any harness (pi / claude / hermes / codex) calls `ctx7` in bash — no MCP registration, no harness-specific tools. Stops at confirmation gates because the procedure modifies user-level config files. ## When to use - User explicitly asks: install / set up / configure context7. -- A `using-context7`-driven task fails because `mcp__context7__*` tools aren't available. -- Migrating an existing manually-configured context7 to the official plugin. +- A `using-context7`-driven task fails because the `ctx7` CLI isn't on PATH. +- Migrating an existing plugin/MCP-based context7 install to the CLI (legacy cleanup). ## Out of scope -- Creating a *new* API key. This skill *reuses* a key the user already has; if there's no key, offer the OAuth flow (`npx ctx7 setup`) and stop. -- Rolling back from the official plugin to manual config. +- Creating a *new* API key. This skill *reuses* a key the user already has or offers the OAuth flow (`ctx7 login`); if the user has no key and no account, offer OAuth and stop. +- Rolling back from CLI to the plugin (not supported — CLI is the canonical path, idea 16 `claude-to-agents`). - Any non-context7 MCP server. ## Hard rule: don't auto-mutate config -The procedure modifies `~/.claude.json` and `~/.claude/settings.json`. **Always pause for explicit confirmation between Phase 1 (discovery, read-only) and Phase 2 (plan), and again before Phase 3 (backup + writes).** A trigger phrase is permission to run discovery, not permission to overwrite config. +The procedure modifies `~/.claude.json`, `~/.claude/settings.json` and the plugin install state. **Always pause for explicit confirmation between Phase 1 (discovery, read-only) and Phase 2 (plan), and again before Phase 3 (backup + writes).** A trigger phrase is permission to run discovery, not permission to overwrite config. + +## Prerequisites + +- Node.js / npm on PATH (the CLI is an npm package). Check with `node -v`; if missing, install Node first. +- Git Bash gotcha (Windows): library IDs start with `/` and Git Bash path-converts them — `using-context7` documents the `//owner/repo` double-slash workaround. ## Procedure ### Phase 0 — Environment sanity -- Confirm Claude Code is the current harness (need `/plugin install` capability). -- Confirm `npx` is on `PATH` (the plugin spawns `npx -y @upstash/context7-mcp`). If missing, install Node.js first. -- Pick paths: `~/.claude/` works on all three OSes. In git-bash on Windows, `~` resolves correctly. +- Check whether `ctx7` is already installed: `ctx7 --version`. Installed → skip Phase 4 (install), proceed to Phase 5 (auth) / cleanup as needed. +- Pick paths: `~/.claude/` and `~/.config/projects-secrets/` work on all three OSes. In git-bash on Windows, `~` resolves correctly. ### Phase 1 — Discovery (read-only) @@ -39,86 +43,91 @@ Search, in order. Stop reporting verbatim values for keys; report only "found at **Existing API key.** Look in priority order: -1. `~/.claude/settings.json` → `mcpServers.context7.headers.CONTEXT7_API_KEY` -2. `~/.claude.json` → top-level `mcpServers.context7.headers.CONTEXT7_API_KEY` -3. `~/.claude.json` → `projects..mcpServers.context7.headers.CONTEXT7_API_KEY` -4. `~/.claude/settings.local.json` if present -5. Env var `CONTEXT7_API_KEY` +1. `~/.config/projects-secrets/ctx7.env` → `CONTEXT7_API_KEY=` (our secrets convention, cf. `interns.env` / `auth.toml`) +2. Env var `CONTEXT7_API_KEY` +3. `~/.claude/settings.json` → `mcpServers.context7.headers.CONTEXT7_API_KEY` +4. `~/.claude.json` → top-level `mcpServers.context7.headers.CONTEXT7_API_KEY` +5. `~/.claude/settings.local.json` if present The first hit wins. Capture the key value internally for Phase 5; **never echo it in chat**. -**Manual context7 MCP entries.** Find every `mcpServers.context7` block in `~/.claude.json` and `~/.claude/settings.json` (top-level and project-scoped). Note all locations. +**Legacy MCP/plugin state** (migration targets — report locations, don't touch yet): -**Plugin install state.** Read `~/.claude/plugins/installed_plugins.json` and check for `context7@claude-plugins-official`. - -**Plugin's `.mcp.json` state** (only if plugin is installed). Path: -``` -~/.claude/plugins/cache/claude-plugins-official/context7//.mcp.json -``` -`` is often `unknown` for un-tagged marketplace plugins. List the cache dir to find it. Check whether `--api-key` is already in `args`. +- Manual `mcpServers.context7` blocks in `~/.claude.json` and `~/.claude/settings.json` (top-level and project-scoped). +- Plugin installed: `~/.claude/plugins/installed_plugins.json` contains `context7@claude-plugins-official`? +- Plugin cache/data dirs: `~/.claude/plugins/cache/claude-plugins-official/context7/`, `~/.claude/plugins/data/context7*`. ### Phase 2 — Plan + confirm Present a single-block plan to the user: ``` -API key: -Plugin: -Manual entries: +ctx7 CLI: +API key: +Legacy to clean: + plugin: + manual MCP: Backups: ~/.claude.json.bak-, ~/.claude/settings.json.bak- ``` Wait for explicit confirmation ("ok", "go", "поехали"). Anything else → stop. -If no API key was found in Phase 1 — first ask: "Paste a Context7 API key, or run `npx ctx7 setup` to get one (OAuth)?" Don't proceed past Phase 2 without a key. +If no API key was found in Phase 1 — first ask: "Paste a Context7 API key, or run `ctx7 login` (OAuth, interactive)?" Don't proceed past Phase 2 without a key. ### Phase 3 — Backup Copy each file we will modify to `.bak-YYYYMMDD-HHMMSS`: + ```bash TS=$(date +%Y%m%d-%H%M%S) cp ~/.claude.json ~/.claude.json.bak-$TS cp ~/.claude/settings.json ~/.claude/settings.json.bak-$TS -``` -Confirm both backups exist before any further edit. - -### Phase 4 — Plugin install (if needed) - -If the plugin is **not** in `installed_plugins.json`: -1. Ask the user to run `/plugin install context7@claude-plugins-official` in Claude Code (we can't run interactive slash commands). -2. Wait for "поставил" / "installed". -3. Verify by re-reading `installed_plugins.json`. - -If the plugin **is** already installed: skip this phase. - -### Phase 5 — Inject `--api-key` - -Find the live plugin file: -``` -~/.claude/plugins/cache/claude-plugins-official/context7//.mcp.json +cp ~/.config/projects-secrets/ctx7.env ~/.config/projects-secrets/ctx7.env.bak-$TS 2>/dev/null || true ``` -If the file's `args` already contains `--api-key`, skip. Otherwise edit `args` to append `"--api-key", ""`. Final shape: +Confirm backups exist before any further edit. -```json -{ - "context7": { - "command": "npx", - "args": ["-y", "@upstash/context7-mcp", "--api-key", ""] - } -} +### Phase 4 — Install the CLI + +```bash +npm install -g ctx7 +ctx7 --version # verify ``` -Per Upstash's client-config docs (), `--api-key` is the recommended form for stdio transport. Header form is for HTTP transport (which the plugin doesn't use). +If the user prefers no global install: `npx -y ctx7 ...` works per-call (no install) — but for a standing setup, the global install is one-time and cheaper per call. -### Phase 6 — Clean manual entries +### Phase 5 — Auth (key or OAuth) -For each manual entry found in Phase 1: +- **Key found** (Phase 1): write `~/.config/projects-secrets/ctx7.env`: -- **Top-level `mcpServers.context7`** in `settings.json` or `.claude.json` → remove the `context7` key. Preserve sibling MCP servers and JSON validity (watch for trailing commas). + ``` + CONTEXT7_API_KEY= + ``` + + (if the file exists, merge the key in; never clobber sibling entries). + +- **No key**: run `ctx7 login` (interactive OAuth, one-time, human runs it) or ask the user to paste a key. + +Verify: `CONTEXT7_API_KEY=$(grep ... ctx7.env) ctx7 whoami` (or `ctx7 whoami` after exporting) — should resolve to the user's account. On Windows git-bash, set the var inline per call; the skill's `using-context7` documents how to source the env file. + +### Phase 6 — Clean legacy MCP/plugin (migration) + +For each legacy item found in Phase 1: + +- **Plugin** installed → uninstall via CLI: + + ```bash + claude plugin uninstall context7@claude-plugins-official + ``` + + Then remove leftover cache/data dirs if any remain: + `~/.claude/plugins/cache/claude-plugins-official/context7/`, `~/.claude/plugins/data/context7*`. + +- **Manual `mcpServers.context7`** in `settings.json` / `.claude.json` (top-level) → remove the `context7` key. Preserve sibling MCP servers and JSON validity (watch for trailing commas). - **Project-scoped `projects..mcpServers.context7`** in `.claude.json` → remove. If the parent `mcpServers` becomes empty, leave it as `{}` (don't delete the key — Claude Code may rely on its presence). After each edit, validate JSON. On any platform: + ```bash # Windows (PowerShell) powershell.exe -NoProfile -c "Get-Content '' -Raw | ConvertFrom-Json | Out-Null" @@ -130,49 +139,44 @@ python -c "import json,sys; json.load(open(''))" If validation fails → restore the just-edited file from its `.bak-*` and abort with a clear report. Do not continue editing. -### Phase 7 — Smoke test (best-effort) +### Phase 7 — Smoke test -Call `mcp__context7__resolve-library-id` with a benign query (e.g. `libraryName: "Nuxt"`, `query: "smoke test"`). If it returns library IDs — context7 is reachable in *this* session. +Call the CLI with a benign query: -**Important caveat to relay to the user:** in the *same* session that just ran setup, the MCP server is still the legacy connection bound at session start. So a passing smoke test only proves "context7 still works" — not "the plugin is what's serving it". The real test is after Claude Code restart. +```bash +ctx7 library Nuxt "Nuxt 4 config and route rules" +``` + +If it returns library IDs / snippets — context7 works via CLI in *any* harness. Optionally `ctx7 whoami` to confirm the key. ### Phase 8 — Restart guidance + final report Tell the user: ``` -✅ Setup complete. Restart Claude Code to pick up the plugin's stdio transport. +✅ Setup complete. ctx7 CLI is agent-neutral — no MCP registration, no restart needed for other agents. -After restart: - • mcp__context7__* tools will be served by `npx @upstash/context7-mcp --api-key …` - • Manual entries are gone — single source of truth is the plugin's .mcp.json. + • Usage: ctx7 library / ctx7 docs "" (see using-context7) + • Key: ~/.config/projects-secrets/ctx7.env (CONTEXT7_API_KEY) + • Legacy: context7 plugin + mcpServers.context7 entries removed (single source = CLI) • Backups saved at ~/.claude.json.bak- and ~/.claude/settings.json.bak-. -If something breaks after restart: +If something breaks after cleanup: • Restore from .bak-* files and tell me — we'll roll back together. ``` ## Rollback procedure -If a problem surfaces (now or after restart): +If a problem surfaces (now or later): 1. Stop. Don't try to fix forward. -2. Find the most recent `.bak-YYYYMMDD-HHMMSS` next to `~/.claude.json` and `~/.claude/settings.json`. -3. `cp .bak- ` for both. -4. Optional: `/plugin uninstall context7@claude-plugins-official`. +2. Find the most recent `.bak-YYYYMMDD-HHMMSS` next to the modified files. +3. `cp .bak- ` for each. +4. Optional: reinstall the plugin via `/plugin install context7@claude-plugins-official` if the user wants the MCP path back. 5. Restart Claude Code. -6. Confirm `mcp__context7__*` is back via the legacy HTTP path. +6. Confirm `mcp__context7__*` is back via the legacy path. 7. Report what went wrong so we can fix the procedure. -## Plugin-update gotcha - -`/plugin update context7@claude-plugins-official` (or any reinstall) re-fetches the plugin's `.mcp.json` from the marketplace cache. That file is upstream-canonical and **does not** contain `--api-key` — the marketplace doesn't ship secrets. After any plugin update: - -- Run this skill again. Phase 1 will detect the missing flag, Phase 5 will re-inject. Phases 4 and 6 are no-ops. -- Or manually re-add `--api-key` to `args` in the live `.mcp.json`. - -The marketplace upstream is at `anthropics/claude-plugins-official/external_plugins/context7/.mcp.json`. It's two lines and rarely changes — the `--api-key` re-injection is the only ongoing maintenance cost. - ## Cross-platform notes The procedure is platform-agnostic. Only auxiliary tooling differs: @@ -183,12 +187,16 @@ The procedure is platform-agnostic. Only auxiliary tooling differs: | Linux | `jq empty ` (or `python -c "import json; json.load(open(''))"`) | `cp` | | macOS | same as Linux | `cp` | -Path forms (`~/.claude/...`) are identical on all three. +Path forms (`~/.claude/...`, `~/.config/projects-secrets/...`) are identical on all three. ## Common mistakes - **Skipping Phase 1.** "User just said 'install context7' — let's go." No — find the existing key first; making the user paste a key when they already have one is rude. - **Echoing the key.** It's a secret. The Edit / Write tool calls inevitably contain it (that's how it gets into the file), but no chat output should. - **Mutating `.claude.json` without backup.** That file holds *all* of the user's per-project Claude Code state. Losing it is bad. -- **Treating in-session smoke test as proof.** It isn't — the active MCP connection is bound at session start. -- **Auto-running on every "use context7".** This skill is intrusive. Trigger only when explicitly invoked or when MCP tools are missing and the user is blocked. +- **Leaving the legacy plugin installed.** The point of the CLI migration is one agent-neutral path; a stale plugin means two sources of truth. Clean it in Phase 6. +- **Auto-running on every "use context7".** This skill is intrusive. Trigger only when explicitly invoked or when the CLI is missing and the user is blocked. + +## Why CLI-first (design note) + +Context7 is an HTTP MCP server + npm CLI. The MCP path (`context7@claude-plugins-official`) is harness-specific glue (claude-plugins-official); pi doesn't see it (the claude-mcp-bridge only reads `~/.claude.json`, and even then it's fragile). Per the sovereign-catalog principle *"что можно сделать CLI — делаем CLI и оборачиваем в скил; MCP только там, где нужен структурированный/интерактивный протокол"* — the CLI is the canonical path (idea 16, `claude-to-agents` running record).