From 4559e6bf6104cf37da2929ad416075c2cbc5ba3a Mon Sep 17 00:00:00 2001 From: Louis-Guillaume MORAND Date: Mon, 8 Jan 2024 09:57:23 +0100 Subject: [PATCH] docs: GH Copilot workshop - Update december 2023 (#96) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * mardown lint * - maj pour les évolutions - ajout Tips - ajout Git commit comment generator - ajout Agents --- workshops/github-copilot/assets/agents.png | Bin 0 -> 25756 bytes .../github-copilot/assets/git-commit.png | Bin 0 -> 21205 bytes .../github-copilot/assets/git-commit2.png | Bin 0 -> 23143 bytes workshops/github-copilot/assets/quickchat.png | Bin 0 -> 15720 bytes .../github-copilot/assets/quickchat2.png | Bin 0 -> 17049 bytes workshops/github-copilot/workshop.md | 213 ++++++++++++------ 6 files changed, 139 insertions(+), 74 deletions(-) create mode 100644 workshops/github-copilot/assets/agents.png create mode 100644 workshops/github-copilot/assets/git-commit.png create mode 100644 workshops/github-copilot/assets/git-commit2.png create mode 100644 workshops/github-copilot/assets/quickchat.png create mode 100644 workshops/github-copilot/assets/quickchat2.png diff --git a/workshops/github-copilot/assets/agents.png b/workshops/github-copilot/assets/agents.png new file mode 100644 index 0000000000000000000000000000000000000000..cd6c59c1febc83b1b50f1506b81cc7cface0b084 GIT binary patch literal 25756 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 literal 0 HcmV?d00001 diff --git a/workshops/github-copilot/assets/git-commit.png b/workshops/github-copilot/assets/git-commit.png new file mode 100644 index 0000000000000000000000000000000000000000..efb08471c7c7c02371b9d23186ed41f2e3150dac GIT binary patch literal 21205 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 literal 0 HcmV?d00001 diff --git a/workshops/github-copilot/assets/quickchat.png b/workshops/github-copilot/assets/quickchat.png new file mode 100644 index 0000000000000000000000000000000000000000..bbe86c0c3680c8244c62826a2b1c097b18a02d6c GIT binary patch literal 15720 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 WA=>RgpP7}jan9z_>0&F_sQ(35U)kgU literal 0 HcmV?d00001 diff --git a/workshops/github-copilot/assets/quickchat2.png b/workshops/github-copilot/assets/quickchat2.png new file mode 100644 index 0000000000000000000000000000000000000000..f2b15a096fa48078df1975629f99edd92d7682a3 GIT binary patch literal 17049 zcmY+s1ymeeuq})R3&9}-clRW?LvVLbaCdhnxI^$@!Chu>hakaya1HKmf0OUN|J^rh z0X;qR=~LCGPVK#`AY4&i0u}iKG87aPs+6RdG87aH7&vY~d;@&1?~0lSen2}ZONc;K zjuP$xZ{W;?<%FT2YGP3yzrh3Vk?bY4oS>lI^}K#T57-qOLqUl!ONj}qy6YchA$?Vy zX?yY08iXN3kqHz+gu%gp?t_n1rYq*7%d1x?Q?#5ZJ$h()=qXSHBt=fI9c#Dod@o59CAlMl1m)oqz4wIg(9=oyR*09Dwm!8?-AVK|| zQ4XJKD-^t!I2U?@My(42Ulw+cU#%YMHGF5?%nRidUj|w1c-0~dd~}G1@VHMNBe!R# zj~w^Xb+h)RbLeWGdJyqH*SV?F>C_vcOxDb$|@=z%IzCJ@hg%L9er4={iA6Hac;|( z^~FnGh;c<=>_EM2ERxRC!Wq0e%yC;bf&95OY8}JTx@jbQ-jPi!PjD^2Qxt3PI@iA< z`kwz%$<(&EaQ|@LsddtY#y>FYe{zx_J6Aj4etTPa<>tHr?dFvUX{Jpall9G_Za=W* z*MD;ZrsX?#k2ceBzJIWvY<{u5yso(UCik;8e&@`mxxFLtn)_PGuj3DMbXr;VRN`d> z?1N9kRSSa6p;d64uSCJ!;Q-}eoP((nhkU3z;^ZjD5lDJzNa8$abu zHgN-{?tNte<)DWtMkZc45j>4A70-1UO0bOIHnN|9`DCE*GqaZUkPAG^dYvc|zge?R zXVT#M2Bj1}k2G}=_HfP(eKZHR)R$je?FR+e_*S@|L{+pSGyTEAqt7F0wfB$e$P&+1 zaxxjQ@-6db#Ap%2&JZ$x=0ULqCdi4~_V}UT$}D`WlMYs9_bA&h1!J@nnQ8bHG&$uA zz-~mCEZPV2Z#qUMdy7A~Z~Qb)$ySia3bHPp0$OBUkFoGMZrl=V4JS#`X^f-=6Hv#} zzgH^%V5l^@Y+yg>ccRo{0mZqM%O)rYtm^qmaJwxq)SCWba6Dnenm~E9pOD4ZaTWS} zGd^g3i%#K4J(i?X)IjDQ*t^4zP{6*Y+5~4R`-iqk42ZAIuiNnGMjjl4;`h;SEb4MD{-55-zZ8f_&ZJE*Qa&G=8Z#kr=kZ$>MO(K|(fWR;@$8%A`w;++MU26T0y^a=U$0AIAkslV?DlfTGW9noG2| zAW9jJL!GPiGyZU?&D35WN#iO}FH-;9wL&E2l4GOKl}4k{NF|?IjIDVSf7{*DQLTYq z+>&Kuj+1UhOM-6wy?`3nHKAs_?CCHBv|X2!;zQVF!{1-wDe;)$gfMJYb#IUG_uZ0< zXf@;+!NI^jYN29En#dN;W}<-&^7sttFFp9Z`7E$F;8)?Wj8qK)Ssc*>2Y-6%MM#Ci z%6TphzNCfrR+QTHN4(lKl0hW%d3(QxDS}8A99JC(lZyU&6pZ7nL>l~h_zj*3{O^FW z95Dj^zfa>718{X;e+?Z|UGe{1nkS)$ou09WD*W$!jF_0%kHQt2zqq>JHT?qq8c{l_j2^ zJ97Izg2P=VmXF^GV}aS&*w_tw5iQKk;}Q}uOG-*|#s5vMAO{A601uC5aBvWlh=@rd zhA{sA-ZOErjhvH~S{+gAJ0v0kd2o0*aev=3Lg$~&zHjSEKa$mxeI&2XQz3CJQhyuK zDJLT{l>*t=FvJplwMOJSin*A%xOsmzdXq2)__QfR2j=xOB3Zk?daxebz|J6}?EWmq@O{Yfo_ZsJmGX{2a++{nib4w_jE@ zl1{U?x0mqa$8Wlxe>dzVltq2xr*mS_#ke^To67HX{nun9Z!J@b>_;8Fb4w@xSua*$ zdATevF4jLIPT{8lsHmt0+kGBnqiE26KA+wpNsz40eWpoc}@z=(7CtR=|UW{QUtfeDsz~5B`DTTIMk4b=19#%k<8W?UXphkOvyT;z_r? zPXRK+Oh_hRKVT9_ZW|jL#$AE%>^}F-SW_)sbDRf{Yy$Mjqh32}Nf%W2>3(=fEgSD@uQQ&_m3X0`bLDh+u ziT+S%Fw|iB=Yz+^AI`$&W^L2aOuCERvDB!jw}WG2sleJyZ1JI_q=cIefrp1*#2LqD z>~h37)I&M$*4f&lF%7qFRo=xPq zch4qHZzbyZ}O8t#woKgZ{lswSd$^)g)Hv`t8y2w7lmJtnj2!y*hWwiY^ICq$r2^E zmRUsk6)2Y0{u^7{QoeWW$%tP2i%*xEubQ8DI77ti15qJ0v}@j@=I1;rRV$OVMnP}H zGw`mF&E!%#KR-9_2}P|n8OBZA&lnvILJ2hKI^xF*@oSf5Ch?S=ts2E$b=#x)&B^kC zhGy1mSWeKd-$h0%Jk2CAW{|<{Nkrecr7sV}9`*y~X@qwgO(zo?-YfERd{Q5bK?ks5)H(eK+g!oYGfeuvb_Bg+q!LJaGE2i^KL>MNC%QX zRP^oqNgU@H8>#KNv&$0) zmQt3j7t*oTj?`_gP0|Z!Nak#jrizRsuuU@D?R1Y(TIP5bZ}NKXElwe;J=@AzT)#Cf znHCbNuDj~%UBSNIZG$#QE6qng^UJM0Y(sW`c${9*{NgvwY@I#2mG9V*#ov=x`FYeF zGrKxGi?^DzoNQXCHUF;GZ++R{LBi1-?|y8(w9uua9ic-KpRh+9fS&B z*X!=IZO0x+g$!_40*)NK9^uk#h9<5AougxIbynN`J*7PgJTMGihuh%o?B})@Xq6EMuWebz^;`nkygi+BU;cnHCO4vnq%N9iK3(IW>$ZA<>d(F^P$Zf=4(a)7WlQ?L(2e=ap=Sx1n4=|fwER*fL0>B|v zW%wvh_8K$}(Lr<)2nR+7OpIjLe+*lIiEEC+BJIZP&;Z`a1fOc#aVr!mQIMt6rtgWMX1s8rd$) zGMX26sO@hu?$H8y>TPRK_7o8A7~c%PNm+ocZYQ`b++MKC8FdqESUnGJ?QrB1 zCeSt|<|?nZ)jrFp)Ozc^4q_o1$oDa&hU;C>!hXD-%SUy^g{#7cdmQ<&-l*9!HU8pY zO2|LVRlZM1_cHF$2C}kho8jVK+&pwsG*vp~4GPNf>59*(qkWyZ+i~*&b4f+T3|f?2 z7LQsBS-sh>V4>h{M&vdYdn6=%`11c$z%FECH^Wh(`L(=$p_w&g!!`4knQbA$vqHMjv?%&KPy#v5Z%*?YaQK#bb zt$+Umw&+46|G{Aq9%y*x{{~?AXDSf%n!*79#(rIp$jJW(G&?^qB42IpO8>#1lXlWg z2;busn@*BiDq@iw(I5Z-94x}Sr0Ho@`G8q@Ru{xys3pb4tZdoNH|~vUuMsKIoLZem zUH&*USE%|%T2v*qY|nvw=6#Wv>d;RO7EZS8C}Mu?($dm`nwp8;I3Y1{aVZgzKtdkp z-@WdW%bWNF1Prim-k$3G-?84NK-y_-q0@B6gR3)rCfz48Hrn`JVkhD^K%Do+O!DPeq=- zx|617WSE?+wAFgwInuGPaMsvheFk9W>f@oA;8bo=+DD6o75uXWjd`#`{^J&nV7!Kb zk6LM2S;KgrH6m_rme2KqaE$fx<(~ELBzD!nHG948S4~elX~0~;_z^z zS=sb<4W73Rwgg`;1o;C&KYW07?m~LBSwAJ8=y9AmeI~g+9FIV0A8>* zb3#Mk*z}>Qd8)06OlN=ms6J##U@|)ohebfVrrzZ;r?>lVZLcWjSS3Zp&b|;A@o~Ia zRJZ#H0N%{w7jwt+H9fta%IfOWez!d&#^XPQ7YkpL_gEm_)sid3=9o80@cAqjU>@R? zt>@BNvl+bu1E7U>1)H<2obx-pt9LQ_p)OcYA|7phK&IOsv@*4)q;qSkOXA;rU0(fYjc4Yl#C z#g?dO6DsB9CX~^pL|pqwlx7&#DQxd(mKmRkhO+PXrzsU@9>(TnXvQc2Lpwg-?H;&1 z-hSJIM{h&#sJ?vO;p}ig`M6};$pmEu-*}gWYglC7@7nRW&2q(rQs8sqwK{cHJiL>` zW)vE8KwFgQ7_kJnsn&dg9BUIP_=pL#l;?Nro+ir54RElliuaH1>y`e`gxrq31&#jT zfAz+kX0*>; zAO0Rn1RD>7>x5aaSykU-8;9t)0B=L zljC}+=(&qlTPwIh^NT>U#tKBEWV0oRrTtdKz(g3VUEOLthURl{>MvA zD*9eWpPpb(ahuRV=A5<~YhkgVc=*JT5m~)P7NrAJ+le*OZ9*f!QOhXVLGCY4HzqI7 zPt^U13w35zn{d5pR|~-n*ba!**)UcXA+benz6{6cXhz8AS~8_|jG9^jQ+ZJcMfS&+ z@Iyim9gpWSSeqpE-)76TpdsNO>(S1NSGA*k8fy60j%lN0S08scT|C}zN)UVWJ}F-R zlFQga5WEeT#k_sIs`9HC3uxp&f_9Vs=HDYa4*}V6*0eWmL@;dOb=-#NdL1>~Z_B#F z`_fKY!QdI<=HYJO23}~I1Z5^JkhhZhzEtO{76qJixN5RIM1%>onRg4>AT`3^baNXi z*6Y9V<5i@(v9nKGGI(mO*H|K7qu4(ZM4nLB(xU4LL*ry)mKV4)&YByw^w)V)rd~05 zw{BgkNi7b@9tV(TCjI>VgTAe= zbp=uPV->8^d1<=5+|PAbvLUT_>=J<*@a)p-14lG`zkgXO?B&@Ie7aNt_02?x_f~1v zh)~OC7DJpT#PRl=Xg21m45}&;+dF0Xysi)TPJvyggSq|I(56^~k8u(G<}blpS#y$& zZ%DRirwu-bH3OGfT8PqML4m7j6=*YQuBXeXhTAK*nspRJb1<3hO6x*z{TuSzbgRmV zRaobKfRK~EJfFNUH#Id;OPB)*`_+-N$TOdKhbbATzO*2c_KHjVj<0=_WqO8Z7myL) zqSSf52A0fWMnLbfkN#_6PXH}wXeYB3$A; zn*3&jV=QTyr9(GTXFO{I7vay}zkgk|OdOyB;30EhAV=+a*vp2J!gFOq=n6A&)xRr) z^Pmmx9IOYpCqB5K$9h9SHZp@9kHMSo__3g1;EI_Lc7@-kwFao+sK_^J*z=st$X_DW z-RZi_s5SH7iV^OI!s8n@Q~X^0!TlHDE2(8w?bm=OJ|+*NZzH!S<5`!tKd*+i6~3=q z5H+#3EZ60pX$V476mb<(j)b4xU}{t))H~pfER(ZS3j3I3q=#)k^B(b$^%S;do{{Kbq5Xd71{WWy3$ zW8gOa4i*7Nvz?8F1ju&T&~ER@1QHV=f&`e1wJ5lZ_78`?=YurVg-+!dFP8!^qa&cSv*2Rio;w`)OYva%1I z+_)+>B1WA@Fk=_x#zo)+n-Zg}Xt%g8{U zBP%Ns(uXG;imRTl&l^q=2ip=;i9XuaU1=1X%aA3fXGNwY!TD96=SF!_<#h!V4Y=FB zdsvaVW`?zIbhks=FWQfY>jps|w`y>Q66JZM{O(~urqa^Ve8h}BjvDaH{=eG*-Q!Bl z#I1#D%@Rk17-n{LhDDd^t5QGCLCZBG?CushN_`7USdTDzV{^9~iut-849Qg6D#}QR z$`h1=jOzW438{PqxpkSU9xspzvb=}J z5|KoMRf6x3ZB;|Tm45GHPkg}{3DZku8%ZH}-VH;DxHVwo=5;^2w+tLO`;?8p{(Ux{M0PYjnv>RC=vNq6+!cY@Y;J2GR15Rr} zuSf3$&-7_rVTwrJ2I)MWw)GK!y73Q)p>D)SG|>_H$^z-yS$)hkIxh{2vB>e51JOZU znRuWg{TZ16$eSmrwT3!P+tDpC;Jcim{u-evh?e9eXJsIr* zCi>`_EtPZ11()4*t%nu z!;%95cU)KmXImwQHJd2wxj~YJ33|f#u1)Z`J~EZIhGyW=LJ@Zww8{eDewrtdwS>kq zs&|=rUHHv`Rp*(xEoW*pqN~U@6D!`Y6eHCZ4~+52#8bMmUDDY&*tSD(Ej5q^_km}{ zuv3S0{;KlLk}KjCW$eeTvj!Vh81INh$4Q#p*s2rUE&>AwV1#>w<>Me7LEp;hOoxh( z15{~0+F^Tb{x3865rpRS4DWd-M7xO%<+|XzVIg~2R&^bHNm4yFJ3G729mkd&2YOMj zery78s&iJg$M2}%&nxQ857N4=8+dm50rsb(qLQ=$L1fv?{glV<;Yj*{ljCc5DcxU* zSYIP8THq=U-*yI}Ot@h86t_|{4BV%x=S~K;2WO4=P-` z$Z28loKg*al_uTnvmcMxSM*^(a3c5Y^I07U*vlWH_0gI_;Rsvw_vkH>WZIe_58#`KK`kB5$bACHi4R$+K!f(w7!x=tC$>ik#H zCNLB}L`61)_}bV`aQ!ga#CwAm(&APXLsP&Kl&1G}u#XK9LD7q`7Gdg`uNV;39iVLj zjM$bik&%%vYvy>NPR70h(~hL`DDS+&RlH6N#vMKBV^+xc91W8i437?8SXl5}@aTNI z(*=;??|$Cl8fNzWTA9OoROT>vLbMBC9heixyB>H&es)r=2jYO2Jx&3_y+LwfRCVEg z*mn5%7WcK>@l=8%tIh~qN9k@404KRZ`Bc4@>f9Ah!518?@{CC5-nY>k@L=R6EagB>^6zSs8#d&H}T9uk7>6 zdiCx=gif%EJa^$7TqRBw5)u-1|EG@g{h2b8<`v!b+6IU#hk?OKH7Zy`r;?a zyp1?`7kFJ-lWobmC)nwT5|3g<$k>X=(sr3Jk|StPBzjw^Rre(fhe7=>SGDt=vfCpd zZZAO$7y5a{IU0So;w7B#oyPcS0P;HN(t5pU#ly03n!*VH@nGke?AdT(ztqYj|0*F# zi7r(I7Z(@L7=0S_8l(QGcpcj&aUHMqm9Lw-BWatBaDKPzVLZf;9ydG(mX60-+4PTt zOi9pUOu@&foJ*uYP0n$_B-O$p`VoB*i$?w+4kYkhJ=5MybpR!PAr?bA0NJcn2n5#ys9;stJFKT+4++} zGZ0JS_VB!c#ez!egJST&1q-}HZ$cFFBmi-O2tGv(Q43L<20bg|vrWRoNyq9@=o$-) z&<9=AHOJGfM1`U1Z#}XRcE~6we=uJKmHQ9C$}LFa_iDtgm~GyN!_@+#cN%(aMsrF7 z8uVyJN{Xo?*dN?>v*KkkoWjH-xbz{0h}Trvhr{?cdfisHSJtaCk}IS53n}B1UHs#b zogar4<+OtwR%l7r>AEM1Ufn$(os)Z&Jl31|SG3dI$M|Tm&iu6qSu`8SFIp?^o2Z}% zD1R0vZ_^yleYz}?=Z4cFaqc+-zcy@a?7w`jyo?6EciZRp2UQ0yTOob3^3Xe3F)kxJ zP@M4cShJj+LE#33eDoL?@s$wMdn~$KH-czjk)7tkrv|?T806x1=cqHQQUBYfi&0+w z-tsCi6 zh)*)g>0Eda31$RP{tZNWEeua~05|wgPs1T2x37vb+o?=)Q+204?KuMc3alzPN-?-& ztMe&TneFb_MydNGgslPUlz$(^#b9bPBPZ(^D{L#`XPM8wt`J}oAieCO`giUBQkq0$ z*KFfOagf*@Zr|3u>QR7g1Bl!x$95o=WVbgfq$eXj>cn|0|EX_#q-50gX1_&u%aiEt zfcv6y4*5JAd=~$A-FF3%aRiWbgbxzL$(R16;aux(v&xU2Lk|1j?a5Xyv%*FM?!~TC z%Ep9)Ov)KT|C_A(B~buF&d|Eym6AUFgC53z=GBwe!`W`UP5Yrq8rG_ZUD+z}3fRw%>Zd8*#G;;$cSm(k_EFqyN2u0qRFhJWPbb6&W>s9`1Cxb zoZO#;=_G2eo8wRTUbx@qc#pxNn3$NdQIbABZRPrH+OripW`>?<47RB(29<(YLL)f1 zxc9PFEVM6C9HXpOgmjHWPnTJ%``JG1ya9IK{n(pbL*CW+%p85;+S zeG!)y6AP9=zlsGO+pP!+GZH>M1H*Oz0&$#pB<>!RLyP;FAqf0d0w|GEjq%@PM&WaO zv2EJMbz3zuGHUqyDm+RKAeF*{Dl12O`+fp_*6=BJ^cPDK(`uIG~#rhzZ+^5@- zp&?706FHp}b+hKGnt32IWdge4v1{HDz;lm}{A~tw?AoXpG%BZuNfimQELOH-fJ!UM zX>YGs7TSD`ICqZEby^f5_oQ8pCyb_jo)r&y?ee`p2g;B=m3L(w7w$;Z2pbpB2hd6Cp5h&4PpW>j~AZ!DKb`Vy`BziD<39dj)mr5 zcmAS~jH{=2(^dsj&OW91yEoPY`P8?>aJ)S5$16>6@ZAjq<-oQ)M1$u z!y8)qtITa|C=wzlo>JT&%Z9T=IK)@-&4;x5{v*Ac6u!1eVXv8G@a4;b1x<~<+R4^?z*f#nay$@2 z#8J{-^IV2|awYT=wRmbn!Ce%)n+LhfiB*Uny`);;0mjFlg$;4~%RxtEjfnq)IO*E{ z8Y2S*MbAI6zD?8|acM`)CvwGO*w-e}M!SHoa@N3^54q^VV|CIlCbi+()lan5drk}# z?bIUH^rzR;|GMdd3o=Wb$&86eWRWq~SaDBStXJt!XW^&j(=tH9jRFAurXZ#%Wg`U%(p-F~G@jH!tNE`Y!s_kbvPH zCj9d1VD6y#utytL^Op_DBQ(jD0_425Z;PeEF_pbtKO7 z82l7)4%GNu)PyqDS6{X9OX^%8g7U6BOC~{wyI(X)uY`$C!=mF$qT_3|?7VcR=`?Ub zI>GA0A}U3t4WH2CqbJUrMmLdBC^BRXb-<57Q{=HNpezDCCO`HP8wVYg@P~xCjeiAb-R|5ntJe9jN-y$=HZ|G!A63I8C&1)$;B-#VDY=J zPyzWfphThlz4kv>WFC_6O^VdQ2D}otLizC*(iC~ERJL2BpeBh5)u&R$%5Zz;12LPf z8AHv7N)a*Y-wt730rGaGPDu#byBBaNy5F~??~=o7j^0)U~>WBK^*?(b5LRTGc*^aBv)XC?ZF`Ra}`h#brQ zHKFab1lRBHl~+I7Iyuh;7iN4pdjiWpa21G|?}n!~M4vg*miEDa^C`0%Zr1op9coTx z$}e7d(8V3BOs6dJgZv*pc?yVAO>RV9-4$*?k=T-e+2SDMA0&roDSk=b_hK7pTvPSD`FXN?^&y!`;b< zg+6`>b?-I63_P=$m^#{%P(|~UkMUB0IU*4jUkOTwLod)wP7k836&Iv zm%*28c0$8$BIe8;(8n&#s_{QrCNV>}XEh}riQJZQVgHSm+et+xYGP8zciIX2T0|mx zt=~uDvApvdwop?`9!dXHrqf$4xWB)@1+=TV#$LUWr&paEpooZj5McI19HhdfmT2jp zCRepUwpqAMKk7*~(AEo6^&NFw$h<4yCp{RJwZ$>M;xs~dn0n z0BAsc7)~pbVs-}#^6roN85&?!6>uUU1@KZ_dGI@R_nuQZZl1-;GLkWa;4}$}Ics{q}8wZqI)8z1h- z>S^RN%^e$|B5BTdx3+!*9YLk=^ou9~T=r{1ZV<&20NE8EoDQ7$-te|XgUSN?BIJ|8 z94FkimTQc{WV89SigK4p>FA{Vw4ozDyWk{k6DD3?zINU1F^Pz**>d}~F+N#_AL7?b zXUp*q^kQyc#^d1Nm{x@3<&lR+N4rGwp!5>=rsBAa3BI)Ihptv$E%$jkIMnDj9xgTv zxBY4LxYz;^j`lo^w=Ymp^lV}xh5P2v|M@!Q#p|T4NZgYYn7JW=K_znI2%5mHP!+`q zfUPJgC`4mn`=LBYHzsUbvQtv1freBEP!Cf7G0^nssuN6h47<)x?aJ3W@UQO!USvpo zUC1Vx^6l@BR>5G#GIS$!M|slv&o+ycH>-Xf53Wretxy(VA2ha`|Chun4+Q*hiI8Tb zco)cl{x?xjBjm@A_h`b%so%*&L(P?9P@pbP2v%=Hy)P#uw7(k?849wnj3upwgV1cf zh#7+zLMuo%vokZx4_@O*1Qm!zk@VL}+=OLCnf%vymlb9Opbf&KEre2R9w5OCI*ry2 zs~du@hd-pQP%GuZ$Of z_0G-87j=qhOG`)SU-yk>@tWM8uG^C6dB+fPE3<&$;iwsl=ldg;gvgf(F0r2Y9}eqY zRk#5yhKi1`@vntMoVJ<1=r_!P`o`Q&kE)?v>sctS({L)w+;e?nCQ$pg7^YalKVi5um(i9MD4#)5Fo}l2!BHp8>oA0eeqgu>-VyRZ^5a znWC2zww6gTzw>lH%yLE3550k#vh)>L5r{T-N3Tw46BjczHLcS+{)oqt#sJ86rWID+ zf=0=@9~GHYAJGivAVkG>E%<(a=s%X2TrEsb7o=oRG12Qi_+w7ab%}b2N8e#$;FHD2 z$75n(X%OG;C!Y=O9@Arq+BR}liWBoDw}BG^hPFA3l)B8 z*Y9e97Bzv3wMz_rlCw)->HQRA;;7tYM?Wx-4HNY3v#(>kXFVu1}~BG4fS7B6LU?aZ<>s_ zZEWA}c;frYm-c@CETtkI?|tT5GW|*X_s?SNl34SE(gU*?MdT$l$Ca`$iVgM|w^lD7-b-~tyzxBJ$(I87N z`v_An^lS9AaOvQ5_BQxNfuAzN;Zt4@{+a=n3ayo}-a|@Lf_ixJaMxn%LoD}{hskr< zg!I!=>nHmKKjCeg-`dj0KfP28*~TP%+sz^kI(ITTIrg;pz@_-*od(SwtR>{vdn0%X zN>z)L`(K_%hCwap@zqN)(us7^vf{*o)DXdn`0s2M>@L#5gtsS~$`Q*82cVL^<5TGy zJFEdrCaCDRbNQRtyJf=`3MB1u;rF77i$;meI^{waj}^^gpyJg_w)nk$P6la8%ZXjC zH{9@5b8NJV3-a;iA!TOI^28LMRt6Y$&m^h5NEm#G2pVobLEMV}d4knZ$^St(8hiJi zd(DJe(owB2$@#Ps^(Gh`NIxfh`}1Db+(E_u?t=KjiCqz4{fw(A4c5KL-@O6CDLFXt zA)MfS{v0C}JRIuH`HHJpUC8|!O;-f!Vs5) zIP9`M>&M>#n0Q*0;x6LKnmIHBma)>C(}>~n+>8=ds*=p9TO3w}WZFy`6kAd~C4VrJ z5ABvUXya&O*>!U*TW?&m?;;e6)m&0#l6mksF!W? zA?)ox3*T;?O*IO6xTI?=v_qymAt_gl{k)Q0`Ny-XbrOO^KK6wmvkq3_6C-^ii-UfF z;_jMsZ;NzXGT6{9DU1BYjtX#}08yccT#a{0Z$$(;w`xVf6jXR!haQ-n+c)DAZv?+D zgS=HfdOcLB6D$HXDF?fumqjY3RLT_Q8tC~WMOSUQ2_ z3c{m=1Zld;h{PnNeYe%@+5pS}_4g@+bU0E`E(MTUo}df&Z7yOuU0eMaqitaq@6r#9 zbi`<|yp5bs5p!==U9Th2MF@kVJEJo)$p>Swf@r>2-(UT?lBlOdi&de4_WIf<+`>TP zPrBy7PM>TzFj!|i{EQpEX6=`uEfkLJBouV{ zxTpf!@Q4^y7?F^_wBfep$))rSgdyXMeL5GEFF*8RlZxLbBi#LIu0pRk7xU=tD{juG zG?_F{`#2D~p0M$IE>4B=4kyT@UW$a1t-rTGW`2en&N3`PrrP+~AI8lOm_)Uq~PU>e})>mna?)hR5al0cFj{9x0FwqniU0J}*!s>dAIv)sAy&0mq+HNWBc zjn@c}8v@{Py2)^aQAqVH+;J3pBhvD`LOj>`BQ0rnqYb;xI z6Kh{Od>i7p#Po}z&@n8UCE*KIFHI&PT>Qab73|(*i`15ANjt_=SmGn)ZxU_!ZySit zAueW}*S}=vnkiT&6E^t7EW8~v$FA!aXG8N%jz4eD6b%Mnyg?A(qE;ZG!)J@}_0wmL zj%n8M85{LAT)6BCy#}286;hx%CQwiu`IaG@%n?H|TR+ykW+mO;cKh(FbapS$uSgRsvXezyg;6Lf`XCy|b=>s{W}L-qi$*x7e;zwU z2QRaIdhbu$dnB|gtQKDS!HJ>nS6)Av>!uEI%s7~lVUS`&uk4iWAYw+?CN@m^F~Xh3 zz7YKrbz()~f=O4ULsUQl)V-fvMA>0&{wMACNkj~(aD`h_D!SdmI^BfiFfgJz*hf5* z{340dbK+7F`z>az9K}au&U_o`1$kh7W$Gg7T8Y+9rP^QAvv1hD?`S-7k7dNs`c>Q8Qg+esp;H0?Kq0$)jtx%Vx_K2I(6v>VX)#V zxu7-^VZ^hsd#BggUP2pf|2{c1GpXCh^JS>4-{SZp)lWM1=nLDg6K&E@>2j7gOQCdg zYi#kmED5=-@?5Ossr<9DvV5ng@vLLnwdLckzU$G3<)6cg&h6twzQT;1o_E3RSCzhY z93u|7W$)c6ea?utYORJW|0vG|Fo@~SR*(KkBsgTF2);zgOGr$7`NQazj-(==^!Vsq zH_HZS`vs+?L**_pTZtT$?O?_8*gMZfL49`l$oO-j!n{lKuv0BtxqPu$>BOXB$HCQH z?8EuDgFIB??Cls7eHkbPY#d)K+skKDLehIaVfv*@zl2JUm8UNKNyZcuA*#BWD^;=9 z>6MIFv^A#&fQj@eSI$OEq>4qn^0)nSv8>LH@_1phSm&9i=q~nRN(EPMb+bvGA$f`W zzi=f>*%S!xny`h%EE)*Q2uL?aB~vev=*NPM@dcQrEpKKdnI;plC`I)+2nAJXqBUdolDef!N+aX?^XTbfWt3dd z*j&n3l?!C&3WM)K>?TW;Sc1Y=Wsg6+Yw}m>p3f1bZbRt>YrCv>B`@#@eIoFa$%8%& zt9j+ma8XH4&6(@uCmmHK7H~*_AA->hG^kBV1vI$nV==TX;i%o_084S-4EJ4Af^{zY$`u_Bl>QHa)FTJ2b zx(+dNWw{m#a+C4-E=-+8_BX^&s!ydcGRm9lmO9=Oa|v@FH8D#wjdp-;Q?IxWC$cJ> z?Fal2{tl}{v$H97<5NzC!WhW|nlm(w;zR6bO`QRI<+m(ou=;`wvf4?G;%DI)H$)i@xc?ZUxfO^F9Q&WHG zRZUHWF9uLezkg;#zPEsURY1i>cHR!(X*{LZIfDLkJC--ckIQF%je(~vHh6j=A?2yo zZv6n(Gu!nQKG!m$lYAVK$1o_CPwO)g!|@J^btb;JV)jS6J1}>&d7s~IAjnMU+&QXCxg{CUDZIEPswRUs zSd`A@79Zp3J22}|lH7%!NjUL_R@EL4nlovW1(kL?^!xlq-1~0~z001ajzRG;Pg=Vt z`zIl1xr9JzrTy=P063E3&7dKEajL`k!y;c^=k4f#fyo9LruCy*%wv?9w?X(x_$tb# z7pJd_Q7O8%<${l9;J@E=)yPj>zSP5$Q-Ub@z_D)8?lprpj* K#VSR<2L6AVY#Lku literal 0 HcmV?d00001 diff --git a/workshops/github-copilot/workshop.md b/workshops/github-copilot/workshop.md index 312810c7..125bef29 100644 --- a/workshops/github-copilot/workshop.md +++ b/workshops/github-copilot/workshop.md @@ -34,7 +34,7 @@ GitHub Copilot is an AI-powered code assistant that helps developers write bette
-> GitHub Copilot is a quickly evolving product and thus this workshop may not be 100% up to date with the differentes features of the different extensions you are going to use. Please be clever. +> GitHub Copilot is a quickly evolving product and thus this workshop may not be 100% up to date with the differentes features of the different extensions you are going to use. Please be clever if it's not exactly the same. For info, this page has been updated in December 2023.
@@ -46,14 +46,13 @@ GitHub Copilot is an AI-powered code assistant that helps developers write bette | .Net Core | [Download .Net Core](https://dotnet.microsoft.com/download) | | GitHub account | [Create free GitHub account](https://github.com/join) | | GitHub Copilot Access | A 60 day trial can be [requested here](https://github.com/github-copilot/signup) | -| GitHub Copilot Chat Public Beta Access | [requested here](https://github.com/github-copilot/chat_waitlist_signup/join) | A code editor | [Download VS Code](https://code.visualstudio.com/Download) | -| some VSCode extensions | The first one [GitHub Copilot](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot) and the second one ([GitHub Copilot Labs](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-labs)) will allow you to send custom commands (a.k.a. `brushes` which are in fact `prompts`).| -| A browser | [Download Microsoft Edge](https://www.microsoft.com/edge) | +| some VSCode extensions | The first one [GitHub Copilot](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot), the second one ([GitHub Copilot Labs](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-labs)) will allow you to send custom commands (a.k.a. `brushes` which are in fact `prompts` - this extension may soon be deprecated by GitHub) and the last one allows you to have [GitHub Copilot Chat](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-chat).| +| A browser | [Download Microsoft Edge](https://www.microsoft.com/edge) or any other one ;-)|
-> You also have to download some assets. These can be [downloaded here](assets/src/exercisefiles.zip). +> You also have to download some assets. They can be [downloaded here](assets/src/exercisefiles.zip).
@@ -69,17 +68,18 @@ You can also choose to work locally on your computer. 1. Install [Visual Studio Code](https://code.visualstudio.com/) 2. Install the [GitHub Copilot](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot) extension -3. Install the [GitHub Copilot Labs](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-labs) extension. it contains beta features -4. Install [Node and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) -5. Install mocha +3. Install the [GitHub Copilot Chat](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-chat) extension +4. Install the [GitHub Copilot Labs](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-labs) extension. it contains beta features +5. Install [Node and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +6. Install mocha -``` bash - npm install --global mocha - npm install axios -``` + ``` bash + npm install --global mocha + npm install axios + ``` -4. Install [Docker](https://docs.docker.com/engine/install/) -5. Install [.NET Core](https://dotnet.microsoft.com/download) +7. Install [Docker](https://docs.docker.com/engine/install/) +8. Install [.NET Core](https://dotnet.microsoft.com/download) --- @@ -116,13 +116,12 @@ Once you start typing a prompt and copilot generate proposals, you can use the f - - ## Natural Language Translations **Automate text translation** -- Open file `album-viewer/lang/translations.json` +Open file `album-viewer/lang/translations.json` + ```json [ { @@ -147,12 +146,14 @@ In the context of Copilot, a prompt is a piece of natural language description t **Generate code from prompt** -- Create a new `album-viewer/utils/validators.ts` file and start with the prompt: +Create a new `album-viewer/utils/validators.ts` file and start with the prompt: + ```ts // validate date from text input in french format and convert it to a date object ``` -- Copilot can help you also to write `RegExp patterns`. Try these: +Copilot can help you also to write `RegExp patterns`. Try these: + ```ts // function that validates the format of a GUID string @@ -163,20 +164,22 @@ In the context of Copilot, a prompt is a piece of natural language description t **Discover new tool and library on the job with Copilot** -- Still on the same `album-viewer/utils/validators.ts` file add the following prompt: +Still on the same `album-viewer/utils/validators.ts` file add the following prompt: + ```ts // validate phone number from text input and extract the country code ``` +
->For this one it will probably give you proposal that call some methods not defined here and needed to be defined. It's a good opportunity to explore the alternatives using the `ctrl+enter` shortcut to display the copilot pane. +> For this one it will probably give you proposal that call some methods not defined here and needed to be defined. It's a good opportunity to explore the alternatives using the `ctrl+enter` shortcut to display the copilot pane.
You can choose one that uses something that looks like coming for an external library and use copilot to import it showing that the tool helps you discover new things.
**Complex algoritms generation** -- In the `albums-api/Controllers/AlbumController.cs` file try to complete the `GetByID` method by replace the current return: +In the `albums-api/Controllers/AlbumController.cs` file try to complete the `GetByID` method by replace the current return: ```cs // GET api//5 @@ -187,7 +190,8 @@ public IActionResult Get(int id) } ``` -- In the same file you can show other prompts like: +In the same file you can show other prompts like: + ```cs // function that search album by name, artist or genre @@ -215,6 +219,7 @@ Copilot will probably will always more effective with prompt to generate small b // x-axis are the month series and y-axis show the numbers of album selled // data from the sales of album are loaded in from an external source and are in json format ``` +
>Copilot will probably try to complete the prompt by adding more details. You can try to add more details yourself or follow copilot's suggestions. When you want it to stop and start generating the code just jump on another line and let him work. @@ -228,33 +233,38 @@ Return on top of the file and start typing `import d3` to let copilot autocomple import d3 from "d3"; ``` -Look at what Copilot has been able to generate. It's possible that the code is working fine and does everything you asked for but also you probably hit the token limit and Copilot was not able to generate the whole code. +Look at what Copilot has been able to generate. It's possible that the code is working fine and does everything you asked for but also you probably hit the token limit and Copilot was not able to generate the whole code. -It's because Copilot for autocompletion is not made for creating big pieces of code at once, but is more specialized in generating small pieces step by step. +It's because Copilot for autocompletion is not made for creating big pieces of code at once, but is more specialized in generating small pieces step by step. **Try again by build it step by step** Try to generate the code for the plot by cutting it into small pieces following the steps below: -```ts + +```ts import * as d3 from 'd3'; // load the data from a json file and create the d3 svg in the then function ``` + Inside the then function, starts by setting up the basics of the plot -```ts + +```ts // create the svg ``` -```ts +```ts // create the scales for the x and y axis // x-axis are the month series and y-axis show the numbers of album selled ``` -```ts +```ts // create axes for the x and y axis ``` + From there you can just ask to copilot to complete the chart -```ts + +```ts // generate a line chart based on the albums sales data ``` @@ -264,7 +274,7 @@ You will **always** get better results by cutting big task into small chunks wit
-## Code Documentation +## Code Documentation Copilot can understand a natural language prompt and generate code and because it's just language to it, it can also `understand code and explain it in natural language` to help you document your code. @@ -287,7 +297,8 @@ Continue to play with it and see what happens on other pieces of code. ### Standardized documentation comment (JavaDoc, JsDoc, etc...) For this one, to trigger the documentation comment generation, you need to respect the specific comment format: -- `/**` (for JS/TS) in the `index.js` file for example + +- `/**` (for JS/TS) in the `index.js` file for example - `///` for C# in the `AlbumController.cs` of the AlbumApi file for example ```cs @@ -300,7 +311,6 @@ For this one, to trigger the documentation comment generation, you need to respe public IActionResult Get(int id) ``` - ## Tests Copilot can help generate all kind of tests that are written with code. It Includes `unit tests, integration tests, end to end tests, and load testing` tests with jmeters scripts for example. @@ -329,7 +339,7 @@ import {validateAlbumId} from '../src/validators'; It looks ok but because Copilot doesn't have access to all your code, only the open tab and limited informations, you can see that both the path and the function name are wrong.
-... At least he tried ... +... At least he tried ...
but it's a good way to show that Copilot is not magic and you have to use it with your other IDE feature and your brain :) @@ -337,7 +347,6 @@ but it's a good way to show that Copilot is not magic and you have to use it wit - Add a comment with the first function you want to test and let the magic happen: - ```ts import {describe, it} from 'mocha'; import {expect} from 'chai'; @@ -346,8 +355,10 @@ import {validateDate, validateIPV6} from '../utils/validators'; // test the validataDate function ``` + Boom! -```ts + +```ts describe('validateDate', () => { it('should return a date object when given a valid date string', () => { const date = '01/01/2019'; @@ -364,10 +375,10 @@ describe('validateDate', () => { *You can add other `it` block to add more test cases and also add the tests for the other functions. For example try add a new `it` block for the validateDate function to test that it throws and error when given en empty string.* - ## Writing CI pipelines *Copilot will help you in writing your pipeline definition files to generate the code for the different steps and tasks. Here are some examples of what it can do:* + - *generate a pipeline definition file `from scratch`* - *accelerate the writing of a pipeline definition file by `generating the code` for the different `steps, tasks and pieces of script`* - *help `discover marketplace tasks and extensions` that match your need* @@ -385,7 +396,6 @@ describe('validateDate', () => { *It will often generate a task with a few errores coming from bad indentation or missing quote around a task name. You can easily fix these with your IDE and your developer skills :)* - ### Step 2: add tasks from prompts - You probably have a github action workflow with at least a "login" task to your container registry and a "docker build and deploy" task. Add a new comment after those tasks to tag the docker image with the github run id and push it to the registry: @@ -394,7 +404,8 @@ describe('validateDate', () => { # tag the image with the github run id and push to docker hub ``` -- you can play with other prompts like: +you can play with other prompts like: + ```yml # run tests on the album-api image @@ -414,7 +425,8 @@ describe('validateDate', () => { Copilot can also help you write Infrastructure as code. It can generate code for `Terraform, ARM, Bicep, Pulumi, etc...` and also `Kubernetes manifest files`. ### Bicep -- open the `main.bicep`file in `iac/bicep` folder and start typing prompts at the end of the file to add new resources: + +Open the `main.bicep`file in `iac/bicep` folder and start typing prompts at the end of the file to add new resources: ```js // Container Registry @@ -423,7 +435,8 @@ Copilot can also help you write Infrastructure as code. It can generate code for ``` ### Terraform -- open the `app.tf`file in `iac/terraform` folder and start typing prompts at the end of the file to add new resources: + +Open the `app.tf`file in `iac/terraform` folder and start typing prompts at the end of the file to add new resources: ```yml # Container Registry @@ -431,6 +444,19 @@ Copilot can also help you write Infrastructure as code. It can generate code for # Azure Cognitive Services Custom Vision resource ``` +## Generate Git Commit comment + +Yes, writing a comment should be mandatory and developers tend to be lazy. GitHub Copilot can help with that. + +1. Just edit any file by adding some relevant content into it. + +2. On the Git commit panel, click the small magical button on the right + + ![GitHub Copilot Git comment generator](assets/git-commit.png) + +3. Admire Copilot having generated a comment for you + + ![Generated comment(assets/git-commit2.png) ## Writing documentation @@ -455,6 +481,7 @@ Continue to play with it and see what happens on other pieces of code. ### standardized documentation comment (JavaDoc, JsDoc, etc...) For this one, to trigger the documentation comment generation, you need to respect the specific comment format: + - `/**` (for JS/TS) in the `index.js` file for example - `///` for C# in the `AlbumController.cs` of the AlbumApi file for example @@ -483,21 +510,20 @@ This documentation is generated with Github Copilot to show what the tool can do From there by starting a new line with a secondary level title it will start generating the content of the documentation and it will showcase how it will accelerate the documentation writing process. - - --- # Use Copilot Chat to improve code quality -GitHub Copilot is a generative AI and thus, perfect to generate code, but it has powerfull analysis capabilities on your code that can be used in several case to improve code quality like: find security issues, bad practices in your code and générate a fix, refactor and add comment to legacy code, generate tests, etc... +GitHub Copilot is a generative AI and thus, perfect to generate code, but it has powerfull analysis capabilities on your code that can be used in several case to improve code quality like: find security issues, bad practices in your code and générate a fix, refactor and add comment to legacy code, generate tests, etc... If you already feel confortable with it you can jump to the next section. -## Get ready +## Let's Start -To start using Github Copilot Chat, you first need to -- be enrolled in the public preview: [Github Copilot Chat Preview](https://github.com/github-copilot/chat_waitlist_signup/join) -- install the extension in your IDE. For VS Code, you can find it directly by searching for `Github Copilot Chat` in the extensions tab. +To start using Github Copilot Chat, you first need to: + +- Have a valid GitHub Copilot license (personal, business or enterprise). +- Install the extension in your IDE. For VS Code, you can find it directly by searching for `Github Copilot Chat` in the extensions tab. ### Clone the repository @@ -516,15 +542,17 @@ code . ## Start playing with the Chat Once Copilot Chat is setup, you can start using it: + - by accessing the **chat view** from the left toolbar of your IDE (chat icon) - by pressing `Ctrl` + `Shift` + `i` shortcut for a quick **inline question** to the chat -The first one is a sticky version, very usefull to keep the chat open and ask questions to copilot. +The first one is a sticky version, very usefull to keep the chat open and ask questions to copilot. The second one is a quick way to ask a question and get an answer and launch commands. ### Chat View The chat view gives you a full chat experience, integrate as any other tool view in your IDE. Once the view is open you can start chatting with Copilot as your personnal code coach. It keeps the history of the conversation and you can ask question related to the previoius answers. It also provides suggestions for questions along the way. You can: + - ask general question about coding on any language or best practice - ask to generate or fix code related to the current file and inject the code directly in the file @@ -532,7 +560,7 @@ It's a more high level copilot than the vanilla copilot which is specialized on Try it with a few questions like: -``` +```text > How to generate a random number in C#? > What is the best way to secure a route is ASP.NET Core? > What is the easiest way to generate a static website with NodeJS? @@ -540,7 +568,7 @@ Try it with a few questions like: Try it then with some of your code files in the repository. Open a file a try asking: -``` +```text > Can you explain me what this code does? > (with only part of the code selected) Can you explain me what the selected code does? > Can you generate a function that returns a random number between 1 and 10? @@ -560,6 +588,7 @@ try it by pressing `Ctrl` + `Shift` + `i` and type the same type of commands you To further help Copilot give you more relevant answers, you can choose a topic for your questions through "slash commands." You can prepend your chat inputs with a specific topic name to help Copilot give you a more relevant response. When you start typing /, you’ll see the list of possible topics: + - **/explain**: Explain step-by-step how the selected code works. - **/fix**: Propose a fix for the bugs in the selected code. - **/help**: Prints general help about GitHub Copilot. @@ -567,44 +596,41 @@ You can prepend your chat inputs with a specific topic name to help Copilot give - **/vscode**: Questions about VS Code commands and settings. - **/clear**: Clear the session. - ## Secure your code Copilot can help you find security issues in your code and fix them. It can also help you find bad practices in your code and fix them. Let's see how it works. Open the `album-api/Controllers/UnsecuredController.cs` file and type questions like these to the chat: -``` +```text > Can you check this code for security issues? > Do you see any quality improvement to do on this code? ``` Once you have the answer, you can ask to fix the issues by typing: -``` +```text > Can you propose a fix? ``` When you have the fix in the code you choose to **copy it or inject it directy in the file** by hovering the code block in the chat and selecting the right option on the top left. - ## Code Explanation and documentation You can use Copilot Chat to explain code to you. It can `explain you the code in natural language or generate documentation comments for you`. Let's try that with the following commands: -``` +```test > /explain > Generate documentation comments for this code ``` - ## Code Refactoring -More impressive, Copilot chat can help you refactor your code. It can help you `rename variables, extract methods, extract classes, etc...`. +More impressive, Copilot chat can help you refactor your code. It can help you `rename variables, extract methods, extract classes, etc...`. You can try some of these commands on the `album-api/Controllers/UnsecuredController.cs` file: -``` +```test > extract methods > create Async version of each methods when it makes sense ``` @@ -619,37 +645,71 @@ In case of dealing with Legacy code like COBOL for example it can be very useful ## Tests generation -Copilot can also help you generate tests for your code. It can generate `unit tests, integration tests, end to end tests, and load testing` tests with jmeters scripts for example. +Copilot can also help you generate tests for your code. It can generate `unit tests, integration tests, end to end tests, and load testing` tests with jmeters scripts for example. Open the `album-api/Controllers/UnsecuredController.cs` file and type questions like these to the chat: -``` +```test > Generate a unit tests class for this code ``` You can also use copilot to help you generate Stubs and Mocks for your tests. -``` + +```text > Generate a mock for FileStream class > Use that mock in the unit tests ```
-> Remember that Copilot chat is keeping track of the previous Q & A in the conversation, that's why you can reference the previously generated mock and test easily. +> Remember that Copilot chat is keeping track of the previous Q & A in the conversation, that's why you can reference the previously generated mock and test easily.
+## Use Agents + +Agents are like specialized experts who can assist you with specific tasks. You can mention them in the chat using the @ symbol. Currently, there are two agents available: + +- **@workspace**: This agent has knowledge about the code in your workspace and can help you navigate it by finding relevant files or classes. The @workspace agent uses a meta prompt to determine what information to collect from the workspace to help answer your question. +- **@vscode**: This agent is knowledgeable about commands and features in the VS Code editor itself, and can assist you in using them. + +They may not be super rich for the moment but their features will continue to grow over the time. Here are some example + +Open the side Chat panel and type **@workspace /New* to specify that you want to create a new project. For instance, try to create an Asp.Net project + +```text +> @workspace /new create a new asp.net core 6.0 project, with three views Index, Users and products. +``` + +It should create a structured project and even a new button to create the file. Click on "Create workspace" to see files being created. + +![GitHub Copilot Agents](assets/agents.png) + +## Tips + +GitHub Copilot Chat is very handful but for a developer, leaving the keyboard and having to take the mouse to open the right Chat tab can be boring. You can directly call the Chat inside the code editor. + +1- Open any file containing code + +2- Use the shortcut **Ctrl + i**. It should open the Quick chat popup, a small chat windows where you put your cursor + +![GitHub Copilot Quick Chat](assets/quickchat.png) + +3- Type any command to generate some code (i.e. "Create a C# class named Toto). The generated code is injected inside the current file which may be what you want + +4- Instead of accepting the solution, click on the Discard button and select *Discard to new file*. It will move the generated content to a new empty file + +![Discard to new file](assets/quickchat2.png) + --- # Prompt engineering in Copilot Chat In the previous section you discovered how to use basic prompts to get code from Copilot Chat. In this section you will learn techniques to get more accurate results using prompt engineering techniques. - **What is prompt engineering?** Prompt engineering is the process of designing high quality prompts to generate high quality code suggestions. There are good practices and tips to write better prompts. Let's see some of them. - ## Provide examples: one-shot and few-shots programming Talking about prompt engineering, you can also use the chat to provide examples to Copilot. It's a good way to help Copilot understand what you want to do and generate better code. You can provide examples in the chat by typing with the validator.ts file open: @@ -680,7 +740,6 @@ You can use this technique to **generate code that keeps the styling code from a Write a MusicStyle record that conatins a List with 6 sample values like in the Album.cs file. ``` - ## Provide external references The chat copilot can use external references to build more accurate suggestions. For exemple if you want to generate a code that make a request to an API you can provide an example of the API response in the chat or the url to the API reference. Copilot will use it to generate better code. @@ -697,6 +756,7 @@ interface Breed { subBreeds: string[]; } ``` +
> You can also provide links to external documentations like SDK, libraries, etc... or event normative documents like RFCs, etc... @@ -707,17 +767,18 @@ interface Breed { Also called foundational prompt, it's a general prompt you're giving to Copilot Chat to personnalise his behavior and setup your flavour of Copilot. -This is probably the first thing to do when you start a new task with Copilot Chat: **provide a clear description of what you want to build and how do you want copilot to help you**. +This is probably the first thing to do when you start a new task with Copilot Chat: **provide a clear description of what you want to build and how do you want copilot to help you**.
-> **This is very powerfull when handled properly** so be sure to start every coding sessions with a role prompt and save your best prompt for future use. +> **This is very powerfull when handled properly** so be sure to start every coding sessions with a role prompt and save your best prompt for future use.
***Structure of a role prompt*** What can you include in a role prompt: + - Provide solid context and background information on what you want to build. - Define GitHub Copilot’s role and setting expectations about what feedback we are looking for. - Be specific in the quality of answers and ask for reference and additional resources to learn more and ensure the answers you receive are correct @@ -741,7 +802,7 @@ From there you can start asking questions and from time to time, ensure Copilot ```bash Are you still using the instructions I provided? -``` +``` ***Test your role prompt*** @@ -755,7 +816,6 @@ how can i make my app accessible with react native? what is the most secure way to upload a photo from my app? ``` - --- # Develop a NodeJS server @@ -831,6 +891,12 @@ You must now develop and add new features to your server. The requests that the These tasks can be performed with the [GitHub Copilot Labs](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-labs) add-in, currently PREVIEW functionality, expect some bugs or weird behavior (you've been warned <:o)). +
+ +> GitHub Copilot Labs extension may be deprecated any time soon. When GitHub removes it, you won't be able to do this part of the lab. + +
+ Open the GitHub Copilot Labs extension to see all the available functionality. ![GitHub Copilot Labs extension](assets/github-copilot-labs.png) @@ -969,7 +1035,7 @@ dotnet dev-certs https - Forward port if needed -- Navigate to your address /swagger. Example: https://leomicheloni-supreme-space-invention-q74pg569452ggq-5164.preview.app.github.dev/swagger/index.html +- Navigate to your address /swagger. Example: [https://leomicheloni-supreme-space-invention-q74pg569452ggq-5164.preview.app.github.dev/swagger/index.html](https://leomicheloni-supreme-space-invention-q74pg569452ggq-5164.preview.app.github.dev/swagger/index.html) ## Put the application into a Docker container @@ -1005,7 +1071,6 @@ For this exercise, you want to deploy your previously developed Web application
- --- # Solutions @@ -1016,7 +1081,7 @@ Here you can find the solution to the different exercises. The solution of the coding exercise can be [downloaded here](assets/src/completesolution.zip) -## Infra As Code +## Infrastructure As Code This part is the easiest one but GitHub Copilot can randomly generate bad or commented code. @@ -1146,7 +1211,7 @@ private string connectionString = ""; # Credits -This workshop's challenges are a fork from the original Hackaton [accessible here](https://github.com/microsoft/CopilotHackathon). We just wanted to integrate it into the [MOAW](https://github.com/microsoft/moaw) format and add some exercises. +This workshop's challenges are a fork from the original Hackaton [accessible here](https://github.com/microsoft/CopilotHackathon). We just wanted to integrate it into the [MOAW](https://github.com/microsoft/moaw) format and add some exercises. Role Prompts described in the Prompt engineering section are inspired by this [great blog post](https://github.blog/2023-10-09-prompting-github-copilot-chat-to-become-your-personal-ai-assistant-for-accessibility/) from Github's engineers [Ed Summers](https://github.com/edsummersnc) and [Jesse Dugas](https://github.com/jadugas).