From d5f3e25bea17d809067d52e8173a2ddbf8855ee2 Mon Sep 17 00:00:00 2001 From: Lucien Greathouse Date: Fri, 8 Feb 2019 18:03:46 -0800 Subject: [PATCH] New docs --- docs/images/plugins-folder-in-studio.png | Bin 0 -> 19363 bytes docs/installation.md | 46 ++++++++--- docs/project-format.md | 101 ++++++++++++++++++++++- docs/sync-details.md | 21 ++--- 4 files changed, 139 insertions(+), 29 deletions(-) create mode 100644 docs/images/plugins-folder-in-studio.png diff --git a/docs/images/plugins-folder-in-studio.png b/docs/images/plugins-folder-in-studio.png new file mode 100644 index 0000000000000000000000000000000000000000..742e5a6aaf5ec0200f94f99fa26a09bfb04cb77f GIT binary patch literal 19363 zcmcHgWmH^omp%#-Ja`~La1AcO-GT>qDBRsGI0S;byE_zKxFitVt#AlVaCey^dAtAJ zcV@oayY5+wqD~$8$=>_f9;PTSiHd}e1O)|!DlH|Z3sx}7s(GU)D{?^XcO}~Aq3FJpi7jaD&6?-!m zcS9#rC`l(%Q#)r1dlx-5M93pD_|jq`s$cbvvfieu_O{#%`r4l_dpYMExTmCUS=r@N z;fMGn5ShUnYIaBG($vw?WFQXYqkKZ_Db6K@KCb+t>VS&>?gQyN6N6ZBH<9-!&HhMi z(@#&gS=^4_X3`^H4~8t@q9lorn3bHw>ybRBel%Ze%+t~$GIQUg0)9LwkYvu#_U>(% ztLpG8V@&z`P$Yx6`qAEG0py*}!^1+i$_vMC$J+aL@0Fn5 z#%_~;2N?iFAsKD5yY)-;K!0o=D(=~IJvc}3It;_cbj@#Ls*8d9S*X78+3ppx>KN zrq4W8J&U$9W~qwk<4l{N(1kmLDf7DxE9ybAS2CJLvw-ZdWq`~%ElMd{ejb8E=&1YQA@Z^^ocPvY^o#v5} z>DAP9dysej0YHZE5O(KmjHbTFVyMB<>nrj61&%`PRlaP?&sixPG{u$Um=^)oY1gu|}0Y9LeTDZ+J8 z>$Ev$ihCZ97~A_Juv>`UkA06Xv+tBH^DwtYB%#ax$1lVlUhiN zL5-1-pSfMBPMgP7exy6KBVCb(tGi!2LWOM6p4J#xtTpEB7`E7$LCK3HkN3O_sY>k= z_6GGht6ZlQOQITR6Ijz> zr**|})KLw*6_>_CH8B`#VLkq2I9jJsZb{xIy7(&|)*hDf7BZYRc2DXQvW}Nh@$4*I zPgmtSlO5rg>cLrk9Zu}WI1(Y#b|`DMvc`CH8ko`qrP<_a zcFdZ)J#@Y|2f{V=)a@Beoy~e~Zrt4HvQnf!nF7eNRrJu`v34&;X8<0!`xr_A5oI-9 z5{}3PKFZdRFr#djv!-ZC9Er63(*-f*roxP`y$x%DE zX`-fpNH_KB?DO3tOk;TPAA$xmo4}nzp30-%-PMJju>xVcq2#P|1Xc02Sj`?AE-sAm z@ThRR99H9@pWHsTM2^Xzn|u^q8dZunMK9@3tK&Gnj~&!QK?W~YeflpRlYc5M zQkIYs?(oYvUO`PuF+u_8+IIb1q#^5d^)kx%JSQ3R>~@Z?&7{RZ@ejF?t->n)-VC|D z_rt&E@U&V9{-1o)I8X=Xg1g8NzmX!6GqTLKqKROL6@6nY8>62rx1Q7Y6Ci*VDTGqC z{zf_lCq)EX{YBJDt`PCxIpp&cqBTfET>>DV?WN^b0$#^5RaEtx2niFpA~1N;(aX!r z_g4qQQVj5;D|`m(j&@CXtnwIZhEl+{-4S$^;1lBL{YHa@jOvbhYL=g4gM)vjiexmc zR;qN{qKWw6ZH}@{x4YrTRvFnJ@`@^&js$AA17mg=v>1nA$(Wg|eV`O&)k#Ay17F9N z(gcPucqkYTVq|wePeUWgtZNjz#ScnDsWI{5%%WO7-OZ(JU>~-+9yD4`7qd|_fP%^0 z4#23Ws}4P=tb+taVCDMVLtp!sL50rducsqi88?}+-=U#CKCAq%VI+WA@rMQA#zd0< z%9p2tQoGMUL%vlZLd6;aF1zJCQH0ELugkrF9L2iB!$XNE{J}%+GW{;!2pqw=%h zD{U11ExpLlTHUA_fSy7?PB6fa5*d!vcBWO~XZbflR+|VAkyecZwz;85P9y8PkC#ZE znQ++1lK33)-6ed#|Kyn%2CRRd<|^Dn4e>8RhhKER)-JIniI}zn#TOn8e80bph$}x^ z)K$i7&quNzT!mFUc*mTnYU5>SM@@0|{T=_WS_#Hlc?!LGGhk(%*07lfFj>z$Xm5f* z*_vEj)ez+SvROJxg~O!2!#vL|fvnX__F;(5zcZYTMHOf|ocv5z0Ta;gfsajg=NSk^ zOT_19v)E9^urEw=xwpM0@AEtp$efva|43cIb?D`OBYEIXtljCmd(=a<%3`Iw*4D>v z2mY*nN_sS#Zo7;uiS*WlpfwJy>`gGvCtXd%$@Mtl2d~Uqm))a0e3)r*rG-D*bnV-k z_--c}ktMb{aTGpCRBtk#!$REo^z<*!_z&y;fEAPTP|(d*&qC zhox1lBGc`GZwA9i#D#5uB`#}|P;Po9#oR`hAT<~_JVcn2V{ZXfyAMT~okiW+(M5)m z%(CxR?osE6Y@H&5)e!8M@OY3VqZ1Q|MsjXv79%w=kCdoTBp021 zhy`HL<|E|*Z*syG4~tOSlI|)vew?-1E;V8R5XHAFi-^{^ipsh&R5lsQ$%hxbJO-B&a)Ur;d94Q1Lj{le!Qr z7GBzI<+DekL=sU3{#GoP@mcZvr_CQ(2?^6xx_qUTiaLc9a|dzF+_@1(rD%*cE3K}> z$&7q%hcwxxyE{95-kDW1_ZQVN3Vt4Cdx2QDWhfg_E+3F`HM{=!CCm~A<%6AuIbzGs z4AtKH$TS^;CBEJ2+Z`$@01FG`5x=_c?u|;-m<^;BG{}6B(!{^sFR~@cTR4Xz?BuHx zP;pg57|T{1sG9cfGi^lwIRnVcwpwzT$5&%v)8gzdT8(48Tx4L_WB+W?c;R68eI{M% zoth>vCMV)nQy2t)bufpU!=aM%RuU;uld$b<`asv5?4lI$?MzPE?)ElWtyaAm>v4qg z0h_)qukZCz)JKx_k~*N57Vn7Sfo)xSpbM|IwO3Pk7;0vTV=UQ59c+TU;|2#o4JS6* z>PqjqqCp`5lV>b3w&vz!B|4k}==B8$?WcN$w3a2sbq22}gl?YOCfQ-|%xw^t2@@0(8n6AiMO$QJ>_nS@4 zC>5S+8MM?C_W=2d`^Cfs}6T(bcy8S|Y z`r(xi#7i@+4-Q)WQ7#(R#gr2~C*uyZM4u`&GmsE+j*UEMRE}m*GHJ;SE$1gAFqDW* zj*H}h9ufPDen6O}?B7ZEpGbDps&{3itVTD^m!l|Z?;6>>kO5i!3m3NTAe?d=@86Lm zAX98GQyGU64`n4d3FX)A$X#emZxL8ec(v8-X#eUB%N{%I(r(ldDI!Qc=dC`-@MY~f zOS5b96H0&@0a~P&%hQo)KUZ1oc+fEQZ+KP?!Ah^Dk5sD$rZfSL3kRdHLF|O#u^56Y zZ^NeP?BD_Ub!mB^-= z&L}TG+A@eXt;_%#XpGPCn$>&J|AVg2j~SscAFII_mZ7y5dzJq3qQmv|^``t}K>+%P zht33Creq(d>&LWlX3`p0`w3>Lw+A+iH_Na^>7?=G{(us`|B{<$)23ReC0- zs(dS-GWHGQ!BP&iQ6gTKA9*}G)U6_$eNkiqJUl!iNPM+rSB)Lig3pf|lhgX^U!#5m z>-L+rXa<#nVU@HXXcUAy>vp^>Z3Xn-;N1Of!i1dZtSJlI?sl zx;)|YVMbt%x5xgW2kh#ihiq~L+>;tQISeU?3X!?|X?(k@Jl~3F+GO(5Y(n$_eq^<% z^RDppOwGR2uhQYn3LE1O?3u3re~b({46&VmYY+fMt5>Lhlx>y45Hol+DUelwwFBj_ zoJz9V3CEbQ@6eSm%Nd+Lz`o*oNve4ll!=w(g@vc(g=@f$`w#X$0wW=OvM8;IAoM;RO3YV87LV;+@TDk zlop3k2*wi)PhKW@xs{~3JPtXDtRhsqo)NI_zZQNU#>!`dN&H>K)VQ33d&RsGh$6dV zNvhkB&tE@~15zN>xHhQ#m z%Gn+2mKav-a~upnA_3}G_#ms9N|g>X+aMF8&j#D7L4ffbA$=qcg#Vh+o(x(%ibH%= zlB=!D=={LW$H^NU-&PkW`FSbXI0I^aq>>?cC2IqEm;^k0sl*jnDpx+JQl$cT*lO#! z<19XR+m(BXJU`pTEixq04{#=vL&cIY89H)i)RJGQTe>YK+B@zy1D-j3UGHkB1?}fI z6za@M=kL$!-j1iBYv0GfkDi-=6bFW^7I%_G&^uLbzuXnri|;&rWW5^Kzxi+`)*;bC z-X!0X997rWxW`>OI(p+y_^HjO3lHcOZMj&CUR7O?(PaIu_eP(nt= z!?N?ZblwhWxLDe#2)1fsoMtS*9A*7jXJXU3ss+B=dsa=N61lQ3-~?Gw*G|` zM8NymD4aO#-=b9yri@AY8G^+Y;uf7zBR{NWv-xY|fr-4JPFEiw2{V>9)D; zj%6VuA*oktl8FHj!UjISc`s^MxV5{B;O$7Hf^5w`Ht2JxxTLnm3mhG)&WO^d7%qaB zr6_Y1?p|pjoy}qBIQbRtHQvQiZnJrMt|mJCQkUEQbv4cWJ~MmeVB}YJNWZI0FU47q z*6reIJu|rcy|8!2Os-%bjgoz1I6hfX--dR=`B+xflP&B)Soz}8&kxIsuIDiP zYYwBsbmM?4%A->}4-YoYLW84AH(jphe6|m=^5;GiCZRGw5>GZ( zH?^R!?Qb#r97Az(K_U(yCQW1n@*4(b6800}I_ks9%0ni1fqS>DUmBBH)CCc%VarYB z-c#x4b6?02Uf!*E@$%ZKS&s6e5;WdojZM4S4@jU&ffNraEBBv>m(@e~CR%s*RyV;r zE4<%9cuIa{6}&$tQ~G2 z<`$8bWFh$Fz>I)FLeo>$styFO(&EspwK!|wl~LM|17#r?ah|Z;l#6%{)8_mfr=E3^ zT!t;9WA*gtHQ7ZHBY)3^b@)yp%RbpX!{(#q#8+XEubuT)^+SQNx`YHHJxS-KO#)}r z02L-_g=frq#N45QRfn&=$uH+a0E%Cu_qBE0N=ZJ64_;Oyr_({J1b9fqpX)_2KH~99p*D-s<)?5yDs;R;W0S;a3LIDCV`yyW3tX!DtpRmii@Z(;4;_iO`5 zBIJ9K7UJcj!v54<9AG*QieR#Qy834GK6y5tYF$ZKaof!ZBLx7Xc1TiSzJL-|m+>R$ zD^EJRU_QKvkbWaVLGO-)y|Re~xE8 zEKyApD8KytdyQcCI@SYQyd7fC+qjIEOlnovHpQN3sV`QYurDY&<$``&p^`KbhRJ`; z?yzV!*V0=05dz@Tn)Qm-yx(|G21*L{XV=DjZS+1Sh>KT91t@sLy**ut$+DSm7u^JR z;BUKhS&pRZ8PBng9ffJoN#V8Lx;*%P2lAp?&fZmVa;>eIPu(~AoSSa0LImxaQm6eX zlhQ(rb2q9BXXqe-)#Sf+EuSBXFvYRGb0eI-b5*G3aB6uEp()As#MxK;WSr#4!&kaV zCgVOOMLta8q5zkK`$^L|G4b!NarbiTftdKt!ZcVYhwPxSz}pzgKtB@{b8CxFzqI>& zermNl#msTWssG!gU_gw%?(;xK(Zw1Ke}ssHrkI&AmTPU)-yP> zO$}s_**Sbj#T?@OuU=$!Y(=1XJ7$1E53x_g-4D37$Ku+zKEbr~^i2-~-~AY0ZoS{1 zx8JS|Oq2|tXsbonKdjeJZp0My5DSH|T}E~E4W2(9?MDZWAhaIY`C%Yf<7{-5qP~^% z2<08Wgr%ou2SMDz#zY+ih$}_Uz(C03WYXpPZ+a+P; z>pzP`^PIH#deQnjAZN+f>rYdCe!m^<+T6iLD=}`08>8-Ii}&u)_S#lTibA9qRkmlo zv{@;~DcxTk_PK=+!%PZv(P2(lnFoF&Bo>VGO^6>It~n$HxBFEbv8DQ&wy3qrKs6rK zDLd7)ZM!XXapT@gcgMXP2keR4%F@E1PECAWz4uzRy+%@LwN>65$lIs@m)OydUmQSg zAjgVfQ&C6d3g796?7N0NhpoNcNpzuzn6^d z`RI}R4_fybA1n8X;79g(JVBA3{z+Kr0Qci%tuIwcy%D%KM@vl^*lD}DGAT@TJoZvR zwqV6A5yw%EIqw$pAA?-?zHTmJ3%%WYciC~yD?`_Aw0>gMk1-#a~~^^t9oN;+TP02q!f5u;MguU`-QXd@gcBAiZ*^qY!Dy_K?;wFrohb) zg;EvzeQ`l~_Rg~8V11}W@j`cvB2(=l@ zP@K6}VD{#-Un&~y9~Qc2J)iBB@}RV$|7}`FVE@+`ek)G={!qmX;a=~y@^tCq`?jgO zSiv-T9Btfy$@S&K$mq7d>|=4RmfB0=LW^aDiPYvPdQ}1$>P!;E%1az3>%10|Kq2kn z)`ZXkTbVk#gxf?kJ}y6}ySIf5 zyU@sHh~X0r*xlON>(UT#+LEFje&e4xZ1s3kGnr^J6Sy^dUp2?C$R_ z9}Nj_5nYHe2oWTCP~ZB8a+L3)P|DOQJR3xIy89Rscv5^LS7DwsKSV!v{x$hJ`_bQ{d!_iJbi_x;KuFh)KnzB;qAlt%kI$&=u#V8}H{{^4+E3MQ1 zg~ez(hv{^{q>um45L|aLo0XPy`Z%eE;fbO^;zefdm;`(f!6k9q{oM_De^=!3Ee)^b zb_*}p)@R4I<)>zbpM&LkFkcQI4RqJa2((>Ug-Vj9ZN+Zl#>4fGo#5!HwLrvdW+Of5 zLN*VLb;JUmQnYCPRbVK&JP~$!K8M(L0140TxzmVx-|&A!bvQqbLu0gr*SZu@l>9pQ z7)k!}YlOvRr-h5l);OwS@fSZnq?yIEJ*4nK2pkV>{~(*C(w(q8v(d>c5zmM24inQ& z>W$-dRYqmi1{$8jSPZ9{-DIDB>F5KRZd2}Y*f9cRek5aSU2B(eVD?u?k?p#6cG@YikUTD>Uaf?DfArX~ z|Ehsx9#WT38ToELfZ81o^jMFfURRxrZ!NxG!&R5bTnB>?R^~cc>*SFH4aL)>ra{$q z20txjMHKrVWYOWCe0nUC-xd0EdX-{3o;CQLGm!a){n^N?N5v1=_7Ik?_S7~K1R!Z^ zPmA;lGe8`*n6KxO2yT*YnQ%P%%k+Gq2!P__rR_%g| z*za7|jqM4j`y4GwFP{JqE73C&FnO-vKGY0TnRyZpNa-U37lN_HXwGw+WE^W9MlPxK-o^^6GXuXG;FisRfQsv>}ljP@@6sO@G z5?vIpeSb!zWNnDvp~oBN2L;?sE$no`GrxxzAZvhNY`+m-56|WDfdjAngB$UZ_V;O> z(L^jIorDX1RGzfd8b_Wu(%1) zwHzupf3zGuU^jO8c(!%I***j^U#Y(teP>iDYxaQ# zB>31NG(d^2C;_p5F_;m=@LQ1sr9?+aM?S~EDOymLJ9E~lGP&Sm66-u-!W@UmC*`Sp z>|jAXUMN2pM|qU?jo(x|=yo+VzFV5lf@hAEqYSD_gxLN3wJdcv><{^)E%suoi?}OS zEHXJaxYtRBCxoGb_sI;jiB7YeZn0Sn#j^7=DMLZ_aLg?I$KG2OJvco=!lOz4*yCh~ zk7RYt@i(DaATg#scR1@4@>(0mi|uvtwQdCIsctaSA6^$r2)?Xd95x|ROl)TFI@A#J zpY*8f1`mOW47OtdGB(>CvTmEG#c?ydq+~;)ALAh&lMzbc2WP%#nFp*B72tjOvI0a) zl-cF_LmbFFeY8?m`FRW*JTCw6h=e9##Oz3ipN#@+)lj)>oYL1UD@$J?+Z0&AF&4e4 z!NNmWcWPo6<7N6JHkpLEI~RqZ1$BM>y!Q*2Jc3IM%^OFziT>V2X)BE}ZtjaomGS`# z{jyJXOSI3=;m{JM0XuK$z7RHjar4gZLeKLE(-?=cMy>WPU)=&Xm{Qi6rlru5-nHEy z*3kj=5!N&1+687rkCj?&f|Yg!%f}SiKgkHzAs+aw11?ZCM8vM_eG2NAPeUvrN~6he$5_Ueo$-HS~y#L zvF4+>jbCRv$xmE9eMV5153l?ztJBlf75?tV*P{#iIZd9ya?p=!0v#-B`9x(x|L{9h zrk0TZB{tIE`BnMf#z24bJbUVJdV&-E)4&Qbd9_}bxCcR-KGtr9sfC3d0kpKB%;8XY zF_zgAy@SFQ0P?KTn-Ve^spvX4e*vje|M@{rIz=2Q~t0 zHL#tFl~;1cm*cL1g6NOER3qF9qLa?8QHhR$BF;hLMdXpR0upUH_6L`|In51_4!)PpqfCm zWJ3P1p;t<)Tn2xU+rT%~B{VR!1^;_h31tPd(yNA)ZF}1lr3GD~WeRaKyZSDT> zc)Io^?>OfsXTh)O)o4j@L-^Alup}r5-s;OZ$-K#nbXZ(@HfUN`P`~j-f_S^>056}5 zJxKER;pT){ZBclKM{0#Drs|Fqt%V9y^+A~u9b2}$;1f0%6t149c2ZLsgCX3XSF#;D z377XGj9Sf>f6w`pnQ?{{rgx&?-sn53RX*rXy>6WAJv@Xkvi$aK90w}I{_%ZSTGNAg z|3}vuXT*ynpmy2$4*H=J-2g0Sls0p%t;wsn%^Y!e!X(ZEwd=IgZjJe+*`Az7q;o1h zME?x*?MC7(D(_gX;7zu5(UeTnoW~6+h*1x0jcSeYZaiX4Fv(=QJX64Dx2C30Jb;KG z(Y09P)uwTi+`>fboDXYv*J5RV={DCjG4rO~-+++o{!Co_fkAILw)4&i9*5P8{~H*) z&bu9mg*1SIfPJAMfcDh0&22=#`QP9#oyD(8`8I~Uc!O>xW1;H0H?zcq2eoh*Lfxrh zGT$~pDUleykmJBLuYl;VlCT6_5W9x8qnz50w{^h`+;P)S#9IABB+sWI`p@SnUC&q5 zkmLiv<-@$~R(-b}{tc$5_u zOLfXpt20LidfsCv=y#vqre~C{N=d+7*He+D+({2gx7zu0QT}}uj@3mCn)EZN%RU&eg z4sygf5!yWAu$mn$*SolXjr>Eh`gIs3&Nx>P)1DACHZ(LeKAz&40c!y(Hz*;1C=SHp zT!`ZO8`CTNOiY(O@&Qh&R~RCurU|W(0Fy}f8CLoczo96H&+3Rg(FUq(d(DLI_YkQW zm0!C{2_7Hgen9-WtJ|~9mwwblNVP$C!}R1^}%Zj1Wb+Fy#@lk!|}a|?pl z4?hRJCNkp%(c8lqN^d8`OYY@Y=523PLfu-d-^tH5$$GE6;59>R_y+3r<})gVYz8$h zGR2jbyHx)fUSp|$s$>H}==P`IW4|A%VpQM{NO1onw9xZej5xW0cy-rv-7r&vW46=X zcFM36$Z9@C91pKr{U}7}F;6NiLRAONwLF-R(`p9MaF2aPKC^{vgvOr+1t|)~y+{hw zT|D|Z=_=7ge)bzI)q)z(XAI0OESmA|he9cb|JRr7iwONk^2CsJ2%Uw+RjZe~Qp;v| z8A#{dneRWadW%*tMLBylLe$JeZ%M}XO0aN_^Z_4QX5i^>50dM4cT@SMIAAM^?V5ex zKne3DL3u5+Km;zQnJ)II>jH z?&qwAKBH4$LijM*YEbalItr?Q1Qf#FP?8DBlsYgll|h#b5hOqLS?PdMj`KY+#%8-V zHG1mZ^U-wUC1HoBFxdmvW>yG4eA%(jn#_bf&CTz-5Ig+(V(AR+a)LE~9N5at*xALT zyNg{JNG6Jo4RfQd0<70+N!T>UsNNz4$h4;ukDHt4GR7gO(?I z_MVjNBkh`&%^y6d8SbT8ZJi86A1X7$6%Sa9`=s)AZoLt{Vsy4yp>Df;p`z6J!t5u- zg#0NEJH#RRB%!neS~#{S4OK5ECFG?6(=Y*&X6-Jx{iEQANKH6v<<$6uLzUB%*$?Ib;I!{4Bj{;2~*r3zLBTk=v%wdS=>9rNUuo$8Sk0@2rTJ z3cxI!aWiEJcWGX`-+lap**26HD_-#KA^L<8h*tfswZ2ynu9p7rJN}fU1 z$@V_TPh_1El}hugx4XttZbf)l@A|^kV3*%$=F~EYcI%~Se45FFgHkE~#2Nek7UOG% ztK>~QmX{y$NgE<#RtPt9fB<{4k5#C3K4vop{M%?~dTKI|9zvw`cQ{mK?hv>3*+qwM zN7LP1GkUrj|KgD~Ta_B0`mRi@CpA+lOA&WbyLAVql|@IC_UyhlP^#3`1RgOg?R9y>?AB zNWRRl-u(&Y3;!F(l#_9%_r@x{Sls!!1(BqUfQ)xZrQ22_k|h8S+@`1vhk=KDqt~hc zOoKs74dgu*XODq{K-srLHP%IHTP^3G>zr7TZA01TTqDGprXt~f%O5IPJovLfb6_sz zEB{H(jqqYsuvReK;+9ApPife7fIfmc#YIi;tPOKorcL*vOF>nJoEi+upr1+`fcqBB2plGf33tw6;YY@!#-CZI0=%_>UmhnKn0sCv*k%S#r? zbyuwr8G0JSFP#gz;_!Np-S4VM=;d$U)Xw5Z4MY@Tf^@K5+^lG0FveBwGO(X^aQ?=; zpk$(T5s~*72W3W1RO3pS@p0a{uaiD|S?+9aRx{fU!vMMGj(E>>Ms(zeVF|vUYr{sq zXOra4-AK;O@B+J0rlRNxXS^+tNxUSHBqd|P2NMa0azrrn;HKzI3Lsl;6K*QMF<|c= z8rC@iv|VSQ44HRGjv`EdFXTmTAHC1doTWk$*`_z^v;C3~G};od&;iCp;y%VV@zfFQ z0sbZ~H>}@ZJqW+a`pm^X;h+B2{2@E*JXR~^0UxRzL&f0jc-8tu5<&>=GV9w`_hb4_^NNk%$sqM1x=R=Zb@7 zV!BFj`sPkgr`Qp!k5@&A;YV`VF8WQJB!sXnjwV=UG39bg`BV2(ZC5S|%)b^f-*JA# zce({gYe1ujjea`#xgSRC;;1m&pjsOvLvQ+CMSx`_6dZ~p3*C^fc+hPDxHCP*ev1iV zW$_D{){!{pew8Q>)hg$h7?RcmPV$Y>Jo*DY%{NV%ts2;qcJ(7yV2wJ$5a5#?0cYyg=5P=`PZ#kjsU2cF zR}34iiRAs4(Ebr$Ki2u~q8W9*+o@&Er0&)p!^_~EbdJ+}FO*T#Ll9nmAIHe6Yy<~FFduDCMs3E#n1 zNVudHPCOtfp&5`-pwdwfrC>-L%09}LV^mHHN01Rm*=amXsszFT*1DOd*Q-=S)N!!M z`I=xbtEd)Z{e?kj2A-qOP}poKAuTfu8t=;#C5cT47!@QM&!AOcN4xC~)OXT#JunXY z41H1s%H!s7llD_w>HD{jv(u(N41wjGCSulL6y6o%Ueu6CvFk2d z9RRJ`2w{XTa5VYK05cUxYT~YTL(c}D7@B&0l9OShtOw|E8>b=Ked;W-N)>ph&hJf;=!6IQDG23+acARDkopM~N(MH3OH z;5+QV_+JI!MVm6F(K1K3a(qYU425QzeP<<>*P5oc5ZFvni)qnCt@KJBU~2J(XZrG? z6_^}IoXDc2tljjrcUWcH>5}qyR3HwBI4X`CCu!|7XqCC0WdY4vhs?8fO;93c^%p)O zF9!mtca672FG_iATA`YH*q9@kw62KEuoZ*EOR^5OEOZBUP?WT)?^|^4TJ<23fF>>d z%CUXi#Y}UGLOIL$Tn*HRY1*Lq_LgOi=M-i%bT!8M)<1zCxr*#8_E4J}PSO!mJg9%d zzLL}*5E8?=`5~Lwk&J;cvSRx8-$c1`m<$t6^3r?`JF&R8$%yc0>R%n?1=KvzZB$8x zVFYA>NeMVsqdOYyLs0vaTOwZpA0$hD{$t=McP3@)&(saC_ovP9emB@I3#^kmmua9SSc&T}mb+ zR%CP#!|B%yKC*hAuNK3Yn$06vtNqq0?>O~r84~y=9R;hi0H)?rv)YR14+u$YC z-nIJyYlUkK-7VwzdzTVyhRIb$^N3O!P9##MLjLEUuhJhS{tKLRGbI0}c7`_;eSIwm z>8})Y$A%11vq`+^{t$YiyA^MFC%5yyz%>W=@Ss4sMhP~}d3wzFbSZ zkd%0{8uj1w--;5`W*&j`M4D4(3$3`w?n4`H!T24d- zieZj6?`x?SL>)l(oytCpjZeB#&Gd$*{K3Uu7WN5J`ZZ47+}gvSe9RT~Fu*sP$%Sw- ze~fXLRk7$UDjXRgcDtbU#C=}v%QhLM$TIMoQM-_~A3!1BQU;&q{GGk#0Y+XQ$*2;l35~?K2Y!{?Oi+T*|&?5Q2&LNtw z_XubDvz30RYelgCYT~|zjEmzq;+|TRgAsxFq4c#C#RQ2f$L_T950rE=u9vV&h{qm8 zy$(+|>6-K@38$j_tc-o`9Ayr&@_c}{Q&f4fSlIuMaXPtj)5<;%RKEwQ6Iq8b9S`~+ z&@hBy0y)r)6zbN~;F3RV#kB4xfuPMMP+IO33Yj%|XqByNjpjXLEtzB#ne7|Qiank= zYMW=$+eov{zG5=v{DjoR&Q*SMnCRjx{qb6UNr~c7>it@N85z*L>L0B=!ccsK{M=-P zXd#!@38_mAe=k`g@x%3faSvk1wYjuu+j-bWKE-+_&7Q^JSOC)${J;g~W-l*{8T4+bi)W0V*P$G~!CeXVM!g*1xCXkIM(PN#+&RKy;7A zjzrab|LTy)(32F*BB6s=FqUcYAs5u)7Rgj~4@4^Yzt)Rl zty1>;nhKj>YVu$gf_Eyo4cc{NQC@@cY+Gay>0*V{hsu6UkhOYRfu=9%p5bMGtwb1! z4S`6)!2iWaxr#43+p7La z3BKkBn)G={<)C!}cFKkAUTsn2O4_AZAF7`v$@I^?(40oGY_j3((BSaeODtTga#6GBMT_DzDR2Eq!sN9o8B@N zTvMJ#ZE_HTvohrmD2KZ_Z$?UY(q(l%nFesWX!mLsdL#UB4WJf5sM^j?cZ^fzSyB__ zcpK3=mYvQt=Sy#KAeCavN!##8t$CzAdm#Mbh>hGpPuwFT*e9vtlO~U4CHV0AUHu4i zTAYPNUUKPvsw=%r;MhD($rggf9P&MTPSKzNE9Ey^ZRHmddZwZ5d zucxpYg(~e7wMBW~oW>_Z;pq`BA5!0052jJXhjwaO=Og?0GCXa3h#_9+qgRf6Lq^0p z5`iaOiM@N8^>qveZCof+Ofdb;J8nj<-^wuVHmJ(i z2tOID#IjtWlLS$a`k+SH+IK%+igD6EHdJ&P1hhzMz^6)t0O+@h|M0SNAjRmw8(Ed@ z8wNCgoDVl0PNa6s1Zh?fYB7}H&d5=oy|)z{OaqgR7NqWn8A>!rj2OV#68)(grTWepKse{oNQne}#CG^4H7>T= z2^*fCx@RUmu1C+na<0wjCp+&<`UA9ml<5vHyV?{*N&)H&s~P<@!wX=9#mymUVJlGzNEvm<+;uHm>*pGE~1v!jm& zgO~`zPUTP5FgeJR#R}lGdr1r35Dd^PKdn8&S5fDcvp6oE9%{(Zn-*$O{ftayJP=WQ zqb=ELQ!j0p#SsIUGxRS3d-h@MNj-^@EjkS)2!b3+H$S%LZeGY@BNR{S0zIUd*yr-f z;*VRP_29JzYH|8vd*?lHs_hy#ON)A@Y&yz}Bvd?&&8k4Tz;~l8t4({loMfS(t%hj- z@Ro6O<*2?mx;FL)vFrB+@DNkJC#A(qV->c`QM0X^CG*1was_-bLR9R|8!tKw2~cgl zm}Fb)!FibsigGIqA_?%_T7b1Qja}p~DU+9_ViEeH@U(&TPK{o$HD zDppvBPJDaJCL!!syQTcG8xAla@QJ7 zSg(#$J7y?ppmD|-trvNgDDq|_YJED6fL3g%|L(gGo&JzHl3EejveDo| z|KG2F``Q%y+As*|jtzDB*D69fMWg~Wg%*J{kYHE_Z`;Vdei6g}tkA83C`SwV`5jUr zm^P?5@wKf4&J!~mu*Ht`dJCrJ%)Pr1? znvJeNAy5_#K?r2W=WI660r%Px3z@?A!WmvZ>W8y_k{5#$gqnB(uf~&QL63ctwB2u1 zrMBk5KJTxU4jS2-?6UA;075_F-bJ&0MEtK2OTiktu4)yB>c}M8xAzCtS&z3{WeSjv z$fv;&gqyDWdu#U<*Axbm{(P`@l*1BPMH7C%ZJa+p9xkRev;Xb>tVB9lkJ)A;d>q-k zyKC_BNV$us>5~t@qV;A>5Q+gURnAitFZh$?I@Fu16C6 z}Gbhan;6hV17v z%!9sOo7>P#S=~1{6-8hjkIBwHaHE~R_v?W=qNTQ|lSg#W+~ksyA>-s~?m~*TwJ#;b z>}y-n>qg(swAy$1DhNHvPVS7796tR1{ZljqooLbBV6AFHm(Tt1@f1qspdbXDK_ z`yVHMCKCj88V~$-Wv*V))p6Q7jWh0#AqpVkbK3f(N-*RT*rSr!{4%s=yF+^pvwR+CA!`uD=AiAkDnTUYV>)56ypUTAwga{lL^Kdb zBmajDH&p&V0Y(P7`Rk!0hQGY_eZ`;-hH>MCV`MDwhBoV`Y94t3%%7oBqob!30%jST5lC;=3CE7haC;FBwkv` zw7oSKobv2U2?D7#K@bEH3h}9RuU@?tKDKb}x^-JN7QMf7=eBKIi;9XiYA0t2GfEQfq=B z2qF|nty2i8H9-&r5elT%DTLITAP9m81ybu2LTXJA1VMxXsdWk=wI&FHAVR^S)&xNi z1VN-Brdm(fSUlcp6E_t5FB#n756 z$qiwoD6?d3VlBWBK(qL11a^(zTs*#r8w>B2wu#xqO}i#<_OwZxc0aJGL>Z!!Ht&95 z^DbrgGusWD$ZY})W8ov>y_9I(A?z^b1262f%@)($Ku3BOe9-(cx|1e)QO#O&;gT?f zi(q@k7VQ~RwCBE}J>!c?c#1M!#%u@u$|2lWR5H3~x3V!sC1^w#8btJ7i^(jb0DAE< zR$UYuXYt3(^)U>AkAl^OA

QW@$>4R0TxXC@HH8V=2a{rD-KmYwYF{(^$)_0DdB@ zhAfPC!Fo4LHgbQ_o(I@ZTw-B-MJe0F4HshLF5M<*#!~dlButiM3;uykyC-kjosYog z64(Sb5PenXUNM^he|Sk40?JjSPvnL~W<~6$D5h+pwW)D(D%hN3K3RA(Ce56141ZG5 zp2?c!TceY=ln9%$rDWRH-P7^2sHC81H|)VJB{Q~^%-p(r*47dj0)<<4BL#+HFc#j* zY&y4TTlY-eQZluOH6pBVOUaxqyXR^)Q`F-2V9}mwnjy*(x9&kZ_z9b_b=xHLe+yRE9{gmpp$fD4XFoB($(uDZ+=IbebToq(Mim648RNntf#IUh+p7`W7jm7zp zKsTEtB%BL2v{p$q3m`?;X~UrF!jwGYr`dw&aTBWx6M8QMTSQs2n~U$?Ts*O;cmizm zF1G8b9fWUu`3{lRY&RAnjEOW?N~EYY>S|oSnHl=cHbl0=VyD~W*zWl&26I=1@hz1F zG(CnXsfOLp^wrG5pmYa#U)ts?dlBvHSxD5>8YU#ilq(@=hOn{nnxCu+Z+vqJBw1H$ zvGWQ;Q#Q38t%(-4Z+Riyja4^ZJ-~KxGyKuIkW%Vqq9daPVW^81L{nxv!3{zsOv)96 z3i`@^vZZCLE)}# zvluhsn=}l;rokAsa1{ZkJPYHmXjuRS^wwbFMU1#!xG2JKf%M@k!G=`x4N)^gt%Y&< zfljbn6@lqYp0WR87cQB}!)jla#?{);Y^IcKpVj1i&Xy8gt!HhqN`4VHtvnQ3S)r!Z zv$=_|6lrCeT0_X$5HvINl^J9}hyfIWn-B(z$RR4yl}+I?kLo-Zde0;uDOxQyX}aNs zjvAEHkc(z*Vhm%uB2F*-0OM3^RB>ptJw=Epe|=z>q1LbmnP6KkH(sKNaS20pq1G6q zrq(b|wVqkDrx3W5W)frtQq6x(FDjk}6KY+w`~L%p_xHOS_?R{T0000< KMNUMnLSTZPWX3rF literal 0 HcmV?d00001 diff --git a/docs/installation.md b/docs/installation.md index 77a5728c..22b9ccc3 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -1,25 +1,45 @@ +[TOC] + +## Overview + Rojo has two components: -* The server, a binary written in Rust -* The plugin, a Roblox Studio plugin written in Lua +* The command line interface (CLI) +* The Roblox Studio plugin -It's important that the plugin and server are compatible. The plugin will show errors in the Roblox Studio Output window if there is a version mismatch. +!!! info + It's important that your installed version of the plugin and CLI are compatible. -## Installing the Server -To install the server, either: + The plugin will show errors in the Roblox Studio output window if there is a version mismatch. -* If you have Rust installed, use `cargo install rojo` -* Or, download a pre-built Windows binary from [the GitHub releases page](https://github.com/LPGhatguy/rojo/releases) +## Installing the CLI -**The Rojo binary must be run from the command line, like Terminal on MacOS or `cmd.exe` on Windows. It's recommended that you put the Rojo binary on your `PATH` to make this easier.** +### Installing from GitHub +If you're on Windows, there are pre-built binaries available from Rojo's [GitHub Releases page](https://github.com/LPGhatguy/rojo/releases). + +The Rojo CLI must be run from the command line, like Terminal.app on MacOS or `cmd.exe` on Windows. It's recommended that you put the Rojo CLI executable on your `PATH` to make this easier. + +### Installing from Cargo +If you have Rust installed, the easiest way to get Rojo is with Cargo! + +To install the latest 0.5.0 alpha, use: + +```sh +cargo install rojo --version 0.5.0-alpha.3 +``` ## Installing the Plugin -To install the plugin, either: -* Install the plugin from the [Roblox plugin page](https://www.roblox.com/library/1211549683/Rojo). - * This gives you less control over what version you install -- you will always have the latest version. -* Or, download the latest release from [the GitHub releases section](https://github.com/LPGhatguy/rojo/releases) and install it into your Roblox plugins folder - * You can open this folder by clicking the "Plugins Folder" button from the Plugins toolbar in Roblox Studio +### Installing from GitHub +The Rojo Roblox Studio plugin is available available from Rojo's [GitHub Releases page](https://github.com/LPGhatguy/rojo/releases). + +Download the attached `rbxm` file and put it into your Roblox Studio plugins folder. You can find that folder by pressing **Plugins Folder** from your Plugins toolbar in Roblox Studio: + +!['Plugins Folder' button in Roblox Studio](images/plugins-folder-in-studio.png) +{: align="center" } + +### Installing from Roblox.com +Visit [Rojo's Roblox.com Plugin page](https://www.roblox.com/library/1997686364/Rojo-0-5-0-alpha-3) in Roblox Studio and press **Install**. ## Visual Studio Code Extension If you use Visual Studio Code on Windows, you can install [Evaera's unofficial Rojo extension](https://marketplace.visualstudio.com/items?itemName=evaera.vscode-rojo), which will install both halves of Rojo for you. It even has a nifty UI to add partitions and start/stop the Rojo server! \ No newline at end of file diff --git a/docs/project-format.md b/docs/project-format.md index 6d3f6659..c21e32ff 100644 --- a/docs/project-format.md +++ b/docs/project-format.md @@ -1 +1,100 @@ -WIP \ No newline at end of file +[TOC] + +## Project File + +Rojo projects are JSON files that have the `.project.json` extension. They have these fields: + +* `name`: A string indicating the name of the project. + * This is only used for diagnostics. +* `tree`: An [Instance Description](#instance-description) describing the root instance of the project. + +## Instance Description +Instance Descriptions correspond one-to-one with the actual Roblox Instances in the project. They can be specified directly in the project file or be pulled from the filesystem. + +* `$className`: The ClassName of the Instance being described. + * Optional if `$path` is specified. +* `$path`: The path on the filesystem to pull files from into the project. + * Optional if `$className` is specified. + * Paths are relative to the folder containing the project file. +* `$properties`: Properties to apply to the instance. Values should be [Instance Property Values](#instance-property-value). + * Optional +* `$ignoreUnknownInstances`: Whether instances that Rojo doesn't know about should be deleted. + * Optional + * Default is `false` if `$path` is specified, otherwise `true`. + +All other fields in an Instance Description are turned into instances whose name is the key. These values should also be Instance Descriptions! + +Instance Descriptions are fairly verbose and strict. In the future, it'll be possible for Rojo to infer class names for known services like `Workspace`. + +## Instance Property Value +The shape of Instance Property Values is defined by the [rbx_tree](https://github.com/LPGhatguy/rbx-tree) library, so it uses slightly different conventions than the rest of Rojo. + +Each value should be an object with the following required fields: + +* `Type`: The type of property to represent. + * [Supported types can be found here](https://github.com/LPGhatguy/rbx-tree#property-type-coverage). +* `Value`: The value of the property. + * The shape of this field depends on which property type is being used. `Vector3` and `Color3` values are both represented as a list of numbers, for example. + +Instance Property Values are intentionally very strict. Rojo will eventually be able to infer types for you! + +## Example Projects +This project bundles up everything in the `src` directory. It'd be suitable for making a plugin or model: + +```json +{ + "name": "AwesomeLibrary", + "tree": { + "$path": "src" + } +} +``` + +This project describes the layout you might use if you were making the next hit simulator game, *Sisyphus Simulator*: + +```json +{ + "name": "Sisyphus Simulator", + "tree": { + "$className": "DataModel", + + "HttpService": { + "$className": "HttpService", + "$properties": { + "HttpEnabled": { + "Type": "Bool", + "Value": true + } + } + }, + + "ReplicatedStorage": { + "$className": "ReplicatedStorage", + "$path": "src/ReplicatedStorage" + }, + + "StarterPlayer": { + "$className": "StarterPlayer", + + "StarterPlayerScripts": { + "$className": "StarterPlayerScripts", + "$path": "src/StarterPlayerScripts" + } + }, + + "Workspace": { + "$className": "Workspace", + "$properties": { + "Gravity": { + "Type": "Float32", + "Value": 67.3 + } + }, + + "Terrain": { + "$path": "Terrain.rbxm" + } + } + } +} +``` \ No newline at end of file diff --git a/docs/sync-details.md b/docs/sync-details.md index d260feb8..a016e019 100644 --- a/docs/sync-details.md +++ b/docs/sync-details.md @@ -36,19 +36,13 @@ If a directory contains a file named `init.server.lua`, `init.client.lua`, or `i For example, these files: -

+![Tree of files on disk](images/sync-example-files.svg) +{: align="center" } Will turn into these instances in Roblox: - +![Tree of instances in Roblox](images/sync-example-instances.svg) +{: align="center" } ## Localization Tables Any CSV files are transformed into `LocalizationTable` instances. Rojo expects these files to follow the same format that Roblox does when importing and exporting localization information. @@ -86,11 +80,8 @@ A JSON model describing a folder containing a `Part` and a `RemoteEvent` could b It would turn into instances in this shape: - +![Tree of instances in Roblox](images/sync-example-json-model.svg) +{: align="center" } ## Binary and XML Models Rojo supports both binary (`.rbxm`) and XML (`.rbxmx`) models generated by Roblox Studio or another tool.