From c5a86b4316b6dacdcdce60985ce3e23ec6600b3c Mon Sep 17 00:00:00 2001 From: shmck Date: Tue, 4 Aug 2020 21:29:16 -0700 Subject: [PATCH 1/5] add notes on how test runner works Signed-off-by: shmck --- docs/docs/how-it-works.md | 19 +++++++++++++++++++ docs/images/test-flow-diagram.png | Bin 0 -> 16772 bytes 2 files changed, 19 insertions(+) create mode 100644 docs/docs/how-it-works.md create mode 100644 docs/images/test-flow-diagram.png diff --git a/docs/docs/how-it-works.md b/docs/docs/how-it-works.md new file mode 100644 index 00000000..f3bbdcd8 --- /dev/null +++ b/docs/docs/how-it-works.md @@ -0,0 +1,19 @@ +--- +id: how-coderoad-works +title: How CodeRoad Works +sidebar_label: How CodeRoad Works +--- + +### Running Tests + +In CodeRoad, the user is given a set of directions for a **task**. + +Each task is judged to pass (✔) or fail (✘) by the result of code tests that runs in the background. Tests can be triggered by saving a file, or by a trigger that listens to specific files for changes. + +![Test Flow Diagram](../images/test-flow-diagram.png) + +If a test fails, the first failing test name is returned to the user as a hint to identify the problem. + +Tests might be in another directory. Those folders or files might even be hidden from you by the tutorial creator. + +But where does the code for these tests come from? diff --git a/docs/images/test-flow-diagram.png b/docs/images/test-flow-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..656480904c21f4897e63eecfcc710a4545bd43e3 GIT binary patch literal 16772 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

0w-ETfZp-97PcxOGRnojO%ud~niB5v}iM zGUZ?mE%gg|n7z3)-Y0DnY+WJ35D;c(?70yA)<_p&d8Z~<66gu?F&+;isD~i#5XaU# zfzN6`?Xxl;Y}*>(yV#Xeb((7qj%Dop5KpghiSQ(GP{udc=1_h@`cx>AdfoACN`t-T#6r_2_n zSy$Qx8K~P%@dsEc)1T;V7V96zo#F7KXJM+w1={k6HHRWEMr$r2wfxE8Q~6sp(#SOv zrtQS`(i1s1o!g&|1dZAIOXe8+D?Y4^S7B=I!|N=MmFY&HoOo}!&w&VAY#-B3kp*uLllGC%Ae^baAsZ>U@Nq8J zwf2MsS?{sl5fyf4rIy>*E&KE&%t@uNIJ|J|Ubm*7Ws;*jCSG|Et$*J6egfFfC=K7! zT`4j9dd-C|Yu>)O8vQYvN9s&EH_Q_kAZ)s`#{6n(VeG}Wp0LWBh@6sz=jE>?v&0Qd z>U1`R46+PgFGD@a4Uik#L)%})jvGz@pW4?+eTxN>Dfh3N4HRR+-Kuo&44mUD{(K+8 zybgnxx4RfKu1?XT$7O+zmDnJB&{x?>c3hFoXzksr0bK6eyL|*t*Y~k@l*iwNxvsww zERuy(!k-yq@X$XViF1fZ-OsjbHlNDcrpf1`rTbt3 z?~XoTK(rZ+_`5KD+8%ln?Zlj~vl$ED(oO9uX|uuUb@jddL4vFe# z$2<<96+m95>GnCNfpssww^!syf4@)Q#ep+@QNO!?e>duNc@V~o-g?aUK$X4wd8y0Q z5X8gKD|dyZ?gd%{T{RQm!|~MY?pL|lzb31f9MV@bFm_QY43<9&7?!MmB;G?r>WdBr z&uRG{oh-?~oq$ZLFv?vZXVShz71)LocE4G6-FBnbS+RMHbAh$Q%LsE-%x1LnA2Ca0 zNxI2zH}m6aHH;TyAqMVZk9??sah5BJ;dRp|4>x>2MC#bFjjJ+61id``}Rk0|agjLypx!#_xUe{OA*Vf_H zkzrALaDd%FZl<%Xz&xl&>TU*mK~%bZQ50Typ)A=qhWFm7JP7ZFjc(miI{(_rrnR}+lF|C_+-z?dB`R|m|%_g zQ{A^DEG5q!^26(obIJoNYaBal-y_;4{Ew*&XtZv`X-yJhR2yjBrV(QEi1^>cuAe`6WVjZUkC4W z%fLN=HnEuGm<`CBpsxVOylFd4a^DfB<=*%Aq`wP(&-$&bq^wxj1n1sx+0_pFT;D-) z%!LF3LdlpuIco=ELa!Z~o9hj~VaZ9D9Q?U%PI^njvmMY{RhPl75I%b-bwAVD43n-u zGWe@M^lUpePde|3gFDJ%_mGLv{Ht?(lHik-!J1woY3W*l0--{A-;+?$ml-hD>~Yt< zyk<)tLirH1+qZCE-%oS)yE9?k!x@PAvSjNam9?cK+QTsTv#CDI%1umxNeV^)Zw25^=P0eU_>p(pnPYup=zzL zHg_y5JYgSxehf#B3FyD_i813c;-_-(9vjPDnmcP2CAIkRdfaT}50k4sRq8bgTu?ud zSgAUQ3<<5#fGwsvR#`as-hId}=}Uv+q2CIo zNwlCZ2vHRSPtEC`ZR?)&GM#D)G3y#L%S{Wa3wDdI<+ChC^Oos`+RGR(%?_3de78zs zkdI(xG>_=_kjWaBS6$$LQ4ep_aOGQ_{$c)p9?BLWoo?L&_i8K&cGnoOD%QBEm^2?} ztT9x!hOGR&wnI4(#H?`CA;eFw=I%qihF4!C#BsXim%ykoDb071YRkg2w!^a1?lU#(*4OE@?_Q-mG@Ny4yFG+1y8A zK`?W3RH=`C?W(^>w)xoIv0@%r1GYI=M)(_-TYfWi>`pVss6ca213<(W&ZT5>?i6Tl zrhyut7PvNkqMB9N!RGF+0YPt#LLQ$yklA^VSFu0<3ngBktgo$vADlHqPvl&WOG-4H z9e27!!e6L9YA2GM#%;bPGOiywdYfGkQ+o$EFKyncwg<>DOue_b8RuLR7y;_iGmW|9 zCRx*4u&Qe&K7Q$JA=Xfs66m8^c-t@Uc(?kQ4UY*Km{K^q5{Kbg3sh{&6?tnVE73j| zwH&>OFpsq8+g=cThNW^On-qG5#IQS7Hau)DaOmI@Sy>oH4BOY(v^<2pEtara0ev1i zun&^~%pww?OR6rGM`ZTnawpu(#!*-owGS+tESqfN@Vo7C*a0<}_`uDwRJ>u85@+vS zJ?VBVS+xFWD0n@4@n_@<;niox44KfGz8bV2L!5Kngi-sijBtPv<>YEqT6N8#Ebfyo zm7~ml+!=7_Di^N~Hd<@u?fk}u1ehW_YdTW*(L?^HLvN?$T%PA>IOdJGH|!)g3k?}- zNBMrwGwRMdEUq86?+nIKk+RadKA;>T^(Dha$9<5Qi(Jnp?NFyzG~SG>OX(;BVnUa2w+e>0@4NTF zJR5S?Lu;}=j{{-NHLF`d{z6gPB|QX3ZoEXY#-usic8xc3klruE$nI=n>U3gj47oPE ziCyKY@Dh1`(1wO!b3vl{G5R#B#z(#6tRyCMTK0%B`R+BeSWwQ{ghZFyy^(AS5*PI} zyI*Nhjd_HN)<#D!lT#i}>q};FPVlV(NvoY#-YvzgnH&Bd7Llm32zwC&IK(!eta9X& zghWP;*gdkv*q@!gOUFARvwQm@Ay5jx$!ilw6qs&v(* zFayyZ3@Po$)kRUhm3d7Q?Zx7{EVmbY=kg@-GRFF^7xgy}tsJ`y7Y2K(c`AFVr}knP z=N=fy3})Dcc;)-Ezq9Pe$lGye?|)f(?Kig<7s%+fJdGmb)Ns^`+Wu*iX{!zwY!eV` z=TuW0Qt5DC5D4i!z86YLT1R;BsT_H1yby(WDYd7hCm*2gWOu! zj92O8HY9=OZFMuhI(p5^H=-={q%AdHx*t;q(1oIrMKNfTPWXCBM=n}u)|sYTdq1X3 zovtn<@7p7r@LfO281`JbGM0~pJe5;^-j0p9M9h~cwZEcU8tjB8K-JDX7<=~2Z|VOC%}l2^D2ws} zsucRS^ANWq)8Fg(D708gWzoKUo?z~2{{gc*XygzD3lk!0Dk$pDUUDp?;sqtDtA(@A zFhZhbfD(%iB8Qe)qUEh;%YzhwVVy_|LeilW+29sZzN)kXfcGTa@BC}n%P+?(*~d!v4gQI!)Owf90BM$6jsQ!z+Z~gzXcpACej?t>X_WkKH}-( z-~Kjo6bYPPSrTfqa-_xGz4#OEGP(|E${muvcGaZp!U@dQcNnPo)!{iI1yjPKpP-17 zRuDLFz`vWInx2pOp5FH^ILcXxe1k+u+Tt5OWpRs?6w_^vkyuEvc& zj2NDeV{nf;_{wzj^;7MMT)mfV$>i(9`J)=3f#*DJTfc3y?JHB~*FUG^VjTk4M8ubM z-2+m#e)AAInx!-WQ8!zOP>aY#jU8Hd_TY_Xx4A+=NF2U!&C^fY5pNs)dQ-C0ND3+` zgIvmaJng=Hi4h~-EkA2kvP{Slt5#lXF~7yi%vZ6R{(C4Eozy6aueDYxT`m~hZB$l4 zD+Xy(vCtRx*pCQ?DFNG;e%St6(Gfp_{#s z-HK6oV+%pq{BYG*UYCom9sOZsdW^muPckY?soqF+WRPF~^cI|UCu#p%1Hdur&y+IU z$lwGON2=39{QFK9e)xztWR{7;|JAafnAex>`Vnr6ZDm%Hi-?I6R~Ea}#Ak_es#j|1 zY%W4uFr<1DdW)OMbBrz;ZN&o_)dirHI)kQx58b2h`eD8vxfLcr&C*B-yFmdX3#uV=Wm%OU`23wa0hLFO?I!); z0C+EQN@F)*j3gOG9$7|SdmL*e$^c!m_o@^jjru7n{YE`l!QqpCSID5zq3lGExS(3> zdm(pI!VA^_Eh|v#By6?CcCxJC;49xVag2_&$CD{r_;)ctsck`?yAT!S(4Qn5uP~Bb z`--+GGbd@`qE$BtctwH}*6-$c9RioY0p@)9e&64AgCjF}&yy2dk5YKL-;XM*c zIq?=Y(j{G`pK~nuz!ApKiRatPVImmgm5jwTN02SceGS-v5DTFw<#b%OOR3#jLtiK7 zekP#o3*I*_XadVfvL9)ugXt1yoQ)JHhRC{TVf$V>4FDx|vh8Fcj&nlKiKl$gdQb{W zjKC5dOo8?1@l1|08u4ITT-46j6ZCEc6n14sxsT2c%~$DIl+6a!ipGtyr%60HZhyhb zsg*+CTgnGp!B0w6UwT-(dQyUq(f(v5B*NTlMF9lj`_dte@o$nkA>3e-G3hPM6 zs!*Jy=@qP4?G2{^L>hYhGOtQ}r;ukA_4r?M9+ixmXdPzq1MRS=Jm>~LoTG?Xc>|!W zE9X<2Z19&x{q$N3wGyI&{0i}pbdkIn2M3GCDtkM1s{C(SYKuXU7cDhxjyGy->=Hl9 zPe#++o5|tJ{@X*Ufo2qHkHJxhf<%4AQ8?~Uy8`H;#}cqB>DY!k3jMSITt%9oiAYGM zxJ6@c-4)~gXvub!{V2(HC9VsNL4jL+)#{!EG+rf`eRJ=$52ZIo_jAuj+Yy&qdw>_t zwWLP}Fmfg=sHczuX$~&DpSp(&A+?`49sn5}Ab#s3fXg1J^+g^OPii|^C$__&=r@Lc zRdlrCX1t_SO_8d7MUaq-hQYfMUu@?OU`tpCh@r zrlCSY)<*t_oc)$L%^y(6KK4DINl4&Qg$3_w!Om@-lEe=X}4tQYx zE!+F9LXD42wP4>Rta-v71}tQZ{qQ-)cYzw%#{+FtV}EaUELmXW3P1%k(lF{U#&-VI z=U0YC4>E=2mqp0qo|ytc87Ycuh_A*K+r7Qw&7zf`v;?)UTXL|yfiKJj&>+&^3{C}M z;Vr_PmCb$v2=)he{uGcIXDsTPZ74b9O1yco!5Qh9nc+86aNO<_<*E@Mo>y=)E)d`z zd43;#sSN|D4=64*l_4kKO9NTv^64NxBF8)CEIqQ!tIFdmckWe&*s;Xy1AME_%9Gih zc@*c4P=)J-gQfso>h1N7c(4OOpZ*o{<@?eK4tbB}LWU4CK}H5O7PjU!`7|#3(T9}K z`e;=j8inZ*%U9Ba70TGgaRjU^1RG)b+Gm1< zKPi@%jmb5VzE*M2Gg9`(;Zi(sb9+x4RVG~+jR-0J{5C*9?C5Fx_OL!P zLfSI)L2T0-45_jC{TEM7AE=wvdw+r^TZW9ybRpp)1Bu_R+_b6how>qqQ%?!7GCIs0 z)Up7ck)cyr){!DHE@)+FBm$5Ootb;AyuT)AoFQ+Z5RagQ#GR~;pE{-LTu(1tZqRx* z6-~|ofS^uS$?XftbpXkSzC_xCZc_nIJF1LWwUKMPKtGb2o}y~?ra7xL;T*vwB4_gZ z?Ou~&%D8<;2hy7GBSATnKtwS)$GXZ&2Rqg?uaYho3i8al77;kvh9MU~!MY3*ZtJus zKbbs3gX60DKakEysz^gTvKr;N`nwWEZ0bK-ey-p{Y9h2wSD)-hH!M`TQmMZo<^eYz zu7Dyo%+#<3%#28Aww7li00QU!*QCKKZW(n5f^C3&OxB-(E#;BFUJ}1xpFVk5%d+_X#IroiV zsV3IU=)0Wl*KVW^FU9z+xN@twnhJn^O;JIvfOhW$mBtyG@#Alkz4l8`5OWoZ2I!@a z!U_lF4-=G`5jW7!=r$Ua9dRSGtOUq-3Cxt=>ScK{#=gbn=%&l&&MH|Z>cn6uwfMdnN5;;zx`<9zAEqb{r3I`*ezxLkphH>wUxLb z2^a%wbUpW7I)KvKNQl2$Anvq``fTJS^7NrDu#Rikbu@Z--?^j=QfmpVzr&g_5Z&K` z%T|M?8i8%pRMmXf_eY&d=-spm|+~#_C_JKN5n`Nng4B zC=$|vS?ofN-b1K?4}YwE_wdCGp|Urt6k#)O6|XbR${h{UV4aok=?zhySrm8h zBy^}lRs^82Y<}6U zx8r~VHlyfy{d2qK;T9uy>9(q-DHD1CE7e6~L|@Dx5zK`Dpc2R%N9_0WP~0`y zyG5v00qj&f3cyDq0OQ9-1z3!gb(11BFdD=2<1>mIGe}>P%~Q?1k%HY(aee@p4q0NF zlz@*z@Aa1O0Aok&PjBcyTxk$o**>L+Houtgz7dubzGiK6DK$8dAi)j02fw1hgBN>% z#O^_j$6fng;DX0+{0tb4$ZqudOW?LrpUed8gxgeBz7ecYL(a`N0kwH9Unv)`6qOx{ z??ey39V@F!xTEqJ6J0EGsCUCJEe_z!G9x-U?7jyBnIeQo#}nXeHrf)b!otcdaKrA- zTym9pbOGLK@#J0%aJRxsf_v4#I`zMRR~v5DPBr*?V+rhRnZNBX%n=L+K6W~SoH@zJ z0}ow|7`c?`ayqNejc2^dD$$fQ(RSSAEB`@Y#|3#3SG~7oT(}$k?~h=!30lD31;8)= zqRsyOt0$Jvrm3!_bji)W@Jv7n#3AHl^R##`gt6Cu4+07c1Xlmw*Z)^JSWEk_<^11s ctHyJ@fklY1WU1s3_Je*UId$2>$EI)o7pRD|@&Et; literal 0 HcmV?d00001 From ea9d4d495ed01b6e8085e283325b8a7ea498a11e Mon Sep 17 00:00:00 2001 From: shmck Date: Tue, 4 Aug 2020 21:43:40 -0700 Subject: [PATCH 2/5] how it works docs section Signed-off-by: shmck --- docs/docs/how-it-works.md | 38 ++++++++++++++++++ docs/images/coderoad-commit-example.png | Bin 0 -> 12732 bytes docs/images/git-commit-example.png | Bin 0 -> 12151 bytes docs/images/loading-tutorial-commits.png | Bin 0 -> 26499 bytes docs/images/tutorial-commits-reset.png | Bin 0 -> 17883 bytes .../images/tutorial-commits-user-solution.png | Bin 0 -> 18764 bytes 6 files changed, 38 insertions(+) create mode 100644 docs/images/coderoad-commit-example.png create mode 100644 docs/images/git-commit-example.png create mode 100644 docs/images/loading-tutorial-commits.png create mode 100644 docs/images/tutorial-commits-reset.png create mode 100644 docs/images/tutorial-commits-user-solution.png diff --git a/docs/docs/how-it-works.md b/docs/docs/how-it-works.md index f3bbdcd8..45eb853f 100644 --- a/docs/docs/how-it-works.md +++ b/docs/docs/how-it-works.md @@ -17,3 +17,41 @@ If a test fails, the first failing test name is returned to the user as a hint t Tests might be in another directory. Those folders or files might even be hidden from you by the tutorial creator. But where does the code for these tests come from? + +### Built on Git + +CodeRoad tutorials are stored and loaded using Git, a popular version control system. If you're unfamiliar with Git, think of it as a way to save or load progress from checkpoints called "commits". + +![Git Commit Example](../images/git-commit-example.png) + +In a tutorial, these commits have a standardized order. First you setup the test runner, then the task tests, then the solution. This pattern is similar to a kind of development called “TDD” or “test driven development”. Write tests for the problem you want to solve, then save the results when all the tests pass. This pattern can also be used to play out a tutorial like a game: users get a task, then must solve it to continue. + +![CodeRoad Commit Example](../images/coderoad-commit-example.png) + +When a tutorial starts, CodeRoad loads git commits from a tutorial up until the first task commit. These commits contain all of the code setup, test runner configuration and tests for the given task. + +![Loading Tutorial Commits](../images/loading-tutorial-commits.png) + +When a user passes a task, their progress is saved as a commit. Then the next task commit is loaded. + +![Tutorial commits with user solution](../images/tutorial-commits-user-solution.png) + +Again notice that the user provides the solution and it is not loaded from the tutorial. This allows users to go a little off-road in a tutorial and provide their own solutions. + +#### Why Git + +Git provides a number of benefits: + +- users can save their progress to a service like GitHub to build a public portfolio +- users can continue working on their project after a tutorial is completed +- software developers are largely familiar with Git, and often TDD, making it easy to create tutorials +- Git provides a mechanism for resolving merge conflicts if they happen to occur +- Git provides a mechanism for "resetting" a tutorial, see more below! + +#### Reset + +If at some point the user is a bit too “off-road” of the solution, they call always return to the “golden path” by pressing the "reset" button. The reset button reloads the commits up to that point entirely from the tutorial. + +![Tutorial commits reset example](../images/tutorial-commits-reset.png) + +In the example above you can see the user is “reset” back to the original tutorial answers, and back to the second task. diff --git a/docs/images/coderoad-commit-example.png b/docs/images/coderoad-commit-example.png new file mode 100644 index 0000000000000000000000000000000000000000..b47457379b0d14e411c4abb78da7f7833b5f66cd GIT binary patch literal 12732 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 BD^LIc literal 0 HcmV?d00001 diff --git a/docs/images/git-commit-example.png b/docs/images/git-commit-example.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad8db0613a7818bd9a6ad156506b7efed9979af GIT binary patch literal 12151 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 LO}6ZzdD#B~eJhTu literal 0 HcmV?d00001 diff --git a/docs/images/loading-tutorial-commits.png b/docs/images/loading-tutorial-commits.png new file mode 100644 index 0000000000000000000000000000000000000000..e15e96ee56dd8c7acccfd4d64a6ed737afd7ca89 GIT binary patch literal 26499 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 WYh9UP4|DYYTr{rest_(;`{iG#SQg~~ literal 0 HcmV?d00001 diff --git a/docs/images/tutorial-commits-reset.png b/docs/images/tutorial-commits-reset.png new file mode 100644 index 0000000000000000000000000000000000000000..20914d02b1f6e422b5fea19f8412022e649bc7c0 GIT binary patch literal 17883 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 C18jl- literal 0 HcmV?d00001 diff --git a/docs/images/tutorial-commits-user-solution.png b/docs/images/tutorial-commits-user-solution.png new file mode 100644 index 0000000000000000000000000000000000000000..38af15f361f481bd4a07e7e6ca8d314bb157808b GIT binary patch literal 18764 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 Date: Tue, 4 Aug 2020 22:03:37 -0700 Subject: [PATCH 3/5] add docs on hooks/actions Signed-off-by: shmck --- docs/docs/how-it-works.md | 37 +++++++++++++++++++++++++++++--- docs/images/level-task-flow.png | Bin 0 -> 21524 bytes 2 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 docs/images/level-task-flow.png diff --git a/docs/docs/how-it-works.md b/docs/docs/how-it-works.md index 45eb853f..79583eea 100644 --- a/docs/docs/how-it-works.md +++ b/docs/docs/how-it-works.md @@ -4,9 +4,19 @@ title: How CodeRoad Works sidebar_label: How CodeRoad Works --- -### Running Tests +There are really a few major pieces to understand how CodeRoad works. -In CodeRoad, the user is given a set of directions for a **task**. +1. [How Tests Work](#how-tests-work) + +2. [How CodeRoad is Built on Git](#built-on-git) + +3. [How CodeRoad Hooks & Actions work](#how-hooks-and-actions-work) + +### How Tests Work + +In CodeRoad, the user is given a set of **levels** composed of one more **tasks**. + +![Level / Task Flow](../images/level-task-flow.png) Each task is judged to pass (✔) or fail (✘) by the result of code tests that runs in the background. Tests can be triggered by saving a file, or by a trigger that listens to specific files for changes. @@ -50,8 +60,29 @@ Git provides a number of benefits: #### Reset -If at some point the user is a bit too “off-road” of the solution, they call always return to the “golden path” by pressing the "reset" button. The reset button reloads the commits up to that point entirely from the tutorial. +If at some point the user is a bit too “off-road” from the solution, the user can always return to the “golden path” by pressing the **reset** button. The reset button reloads the commits up to that point entirely from the tutorial. ![Tutorial commits reset example](../images/tutorial-commits-reset.png) In the example above you can see the user is “reset” back to the original tutorial answers, and back to the second task. + +### How Hooks and Actions Work + +To make a functional tutorial, tutorial creators need a bit more control over what can be run and when. For example, a test runner wouldn't really work if the package dependencies for that test runner weren't installed. + +An **action** is a piece of functionality that can be run. These include: + +- `commands` - a list of cli commands to run. For example, "npm install" +- `vscodeCommands` - a list of vscode API commands to run. For example, "setLayout" to change the layout of windows +- `watchers` - a list of files to listen to. If a file changes, the test runner will run automatically +- `files` - a list of files to open in the users workspace to drive the users attention. +- `subtasks` - a task made up of multiple other tests where all must pass to continue +- `filter` - a regex passed into the test runner to limit the tests returned + +A **hook** in CodeRoad is a place where a tutorial creator can tap in to run an action. Hooks include: + +- `config.setup` - when the tutorial setup. This is a great place to setup your test runner. +- `task.setup` - when a task is started +- `task.solution` - when a solution is loaded from a [reset](#reset) + +Hooks and actions combined provide a flexible environment for tutorial development. diff --git a/docs/images/level-task-flow.png b/docs/images/level-task-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..c6473e88b90892d72a2b0a42c2a2a2eabbbdf70c GIT binary patch literal 21524 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 Date: Tue, 4 Aug 2020 22:07:32 -0700 Subject: [PATCH 4/5] link to how coderoad works Signed-off-by: shmck --- README.md | 4 ++++ docs/docs/{how-it-works.md => how-coderoad-works.md} | 0 docs/sidebars.js | 4 ++-- 3 files changed, 6 insertions(+), 2 deletions(-) rename docs/docs/{how-it-works.md => how-coderoad-works.md} (100%) diff --git a/README.md b/README.md index c0ae8eb9..7b00fd8f 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,10 @@ Install CodeRoad from [this link in the VSCode Marketplace](https://marketplace. - Node.js 10+ - Git +## How CodeRoad Works + +Read more in the docs about [how CodeRoad works](https://coderoad.github.io/docs/how-coderoad-works). + ## Creating Tutorials Build and share your own interactive tutorials. diff --git a/docs/docs/how-it-works.md b/docs/docs/how-coderoad-works.md similarity index 100% rename from docs/docs/how-it-works.md rename to docs/docs/how-coderoad-works.md diff --git a/docs/sidebars.js b/docs/sidebars.js index b4b83f63..b60aeeb6 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -1,6 +1,6 @@ module.exports = { someSidebar: { - Intro: ['overview', 'setup'], + Intro: ['overview', 'setup', 'how-coderoad-works'], Build: [ 'build-tutorial', 'markdown', @@ -12,7 +12,7 @@ module.exports = { 'edit-tutorial', 'create-a-practice-tutorial', 'examples', - 'errors' + 'errors', ], }, } From 6152c3d75a887cfec0288db3a1bdc947e5ca7f83 Mon Sep 17 00:00:00 2001 From: shmck Date: Tue, 4 Aug 2020 22:11:34 -0700 Subject: [PATCH 5/5] add inspiration section Signed-off-by: shmck --- docs/docs/inspiration.md | 6 +++++- docs/sidebars.js | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/docs/inspiration.md b/docs/docs/inspiration.md index c58ea34d..de77f814 100644 --- a/docs/docs/inspiration.md +++ b/docs/docs/inspiration.md @@ -12,4 +12,8 @@ In 2016, I developed an earlier version of [CodeRoad using the Atom editor](http Years later it hit me that using Git as a tutorial format in CodeRoad would have been a simpler solution for both tutorial creation and consumption. Back in 2015, I had worked on a tutorial series for [Angular-Meteor](https://angular-meteor.com/tutorials/socially/angular2/bootstrap) using [Meteor Tutorial Tools](https://github.com/meteor/tutorial-tools). Meteor tutorial tools showed me that a tutorial can be versioned in Git, and that it can help ensure each step in the tutorial in cohesive and consistent. -The idea of CodeRoad sat with me for years to the point where the product started to feel obvious in my mind. It wasn’t so much that I wanted to build a platform, but it was a tool I wanted to use, and nobody else seemed to be working on it. In mid-2019, I had spent enough time thinking about how it would work that I decided to use my spare time to design and build it out. +The idea of CodeRoad sat with me for years to the point where the product started to feel obvious in my mind. It wasn’t so much that I wanted to build a platform, but it was a tool I wanted to use, and nobody else seemed to be working on it. In mid-2019, I had spent enough time thinking about how it would work that I decided to use my spare time to design and build it. + +Shawn McKay + +CodeRoad creator diff --git a/docs/sidebars.js b/docs/sidebars.js index b60aeeb6..bee50bc1 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -14,5 +14,6 @@ module.exports = { 'examples', 'errors', ], + More: ['inspiration'], }, }