@shaykec/bridge 0.4.20 → 0.4.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. package/README.md +2 -2
  2. package/canvas-dist/assets/{_basePickBy-CWoeT3J7.js → _basePickBy-BovdgFIW.js} +1 -1
  3. package/canvas-dist/assets/_basePickBy-BtkHe2u_.js +1 -0
  4. package/canvas-dist/assets/_basePickBy-C0936578.js +1 -0
  5. package/canvas-dist/assets/_basePickBy-CE2Qvuh7.js +1 -0
  6. package/canvas-dist/assets/_basePickBy-DV6sX4CG.js +1 -0
  7. package/canvas-dist/assets/_basePickBy-DZX6ZNMT.js +1 -0
  8. package/canvas-dist/assets/{_baseUniq-Dtuvtwtn.js → _baseUniq-B7dN28TM.js} +1 -1
  9. package/canvas-dist/assets/_baseUniq-Cl23fCdR.js +1 -0
  10. package/canvas-dist/assets/_baseUniq-CojWFw7B.js +1 -0
  11. package/canvas-dist/assets/_baseUniq-DA640BJl.js +1 -0
  12. package/canvas-dist/assets/_baseUniq-Ds-62CCj.js +1 -0
  13. package/canvas-dist/assets/_baseUniq-KG7SRw9H.js +1 -0
  14. package/canvas-dist/assets/{arc-YYWnrNJU.js → arc-7E9FFKlC.js} +1 -1
  15. package/canvas-dist/assets/arc-BSMfRZtt.js +1 -0
  16. package/canvas-dist/assets/arc-C6nT-koR.js +1 -0
  17. package/canvas-dist/assets/arc-D_fOnjmo.js +1 -0
  18. package/canvas-dist/assets/arc-Khfvgkr3.js +1 -0
  19. package/canvas-dist/assets/arc-ieS-i42x.js +1 -0
  20. package/canvas-dist/assets/{architectureDiagram-VXUJARFQ-CegbV-RR.js → architectureDiagram-VXUJARFQ-DF4t6GQD.js} +1 -1
  21. package/canvas-dist/assets/architectureDiagram-VXUJARFQ-DXgSlsio.js +36 -0
  22. package/canvas-dist/assets/architectureDiagram-VXUJARFQ-DiomxPB4.js +36 -0
  23. package/canvas-dist/assets/architectureDiagram-VXUJARFQ-DnFaxvXD.js +36 -0
  24. package/canvas-dist/assets/architectureDiagram-VXUJARFQ-Dt38C0LJ.js +36 -0
  25. package/canvas-dist/assets/architectureDiagram-VXUJARFQ-egbtMwua.js +36 -0
  26. package/canvas-dist/assets/{blockDiagram-VD42YOAC-C2e_j6ry.js → blockDiagram-VD42YOAC-CUNKQd-b.js} +1 -1
  27. package/canvas-dist/assets/blockDiagram-VD42YOAC-D-NiLXxd.js +122 -0
  28. package/canvas-dist/assets/blockDiagram-VD42YOAC-Dx6Dh9gg.js +122 -0
  29. package/canvas-dist/assets/blockDiagram-VD42YOAC-_r-PmlQy.js +122 -0
  30. package/canvas-dist/assets/blockDiagram-VD42YOAC-bvYKZLMc.js +122 -0
  31. package/canvas-dist/assets/blockDiagram-VD42YOAC-l85QT9Ig.js +122 -0
  32. package/canvas-dist/assets/{c4Diagram-YG6GDRKO-rIpnAud9.js → c4Diagram-YG6GDRKO-BWKCTyQi.js} +1 -1
  33. package/canvas-dist/assets/c4Diagram-YG6GDRKO-CbXs2xzC.js +10 -0
  34. package/canvas-dist/assets/c4Diagram-YG6GDRKO-CjiS-GNK.js +10 -0
  35. package/canvas-dist/assets/c4Diagram-YG6GDRKO-D7SnLlHp.js +10 -0
  36. package/canvas-dist/assets/c4Diagram-YG6GDRKO-RTTCSVf2.js +10 -0
  37. package/canvas-dist/assets/c4Diagram-YG6GDRKO-yvqJ_AqX.js +10 -0
  38. package/canvas-dist/assets/channel-CSXq7GP6.js +1 -0
  39. package/canvas-dist/assets/channel-CvujjGiJ.js +1 -0
  40. package/canvas-dist/assets/channel-D959Iony.js +1 -0
  41. package/canvas-dist/assets/channel-DOSwCnrB.js +1 -0
  42. package/canvas-dist/assets/channel-sw61LzxF.js +1 -0
  43. package/canvas-dist/assets/channel-vZVnNhOK.js +1 -0
  44. package/canvas-dist/assets/{chunk-4BX2VUAB-CpZGetnU.js → chunk-4BX2VUAB-BBjuAwXr.js} +1 -1
  45. package/canvas-dist/assets/chunk-4BX2VUAB-BXRNyucU.js +1 -0
  46. package/canvas-dist/assets/chunk-4BX2VUAB-Bgq5Z77T.js +1 -0
  47. package/canvas-dist/assets/chunk-4BX2VUAB-BuoMCMCr.js +1 -0
  48. package/canvas-dist/assets/chunk-4BX2VUAB-COD5n7vg.js +1 -0
  49. package/canvas-dist/assets/chunk-4BX2VUAB-K8DepKJO.js +1 -0
  50. package/canvas-dist/assets/{chunk-55IACEB6-L0OhcFdd.js → chunk-55IACEB6-Bic_bMrQ.js} +1 -1
  51. package/canvas-dist/assets/chunk-55IACEB6-DEy2QUDq.js +1 -0
  52. package/canvas-dist/assets/chunk-55IACEB6-Dcgbmfzg.js +1 -0
  53. package/canvas-dist/assets/chunk-55IACEB6-DfmuNm_E.js +1 -0
  54. package/canvas-dist/assets/chunk-55IACEB6-DlQRcczm.js +1 -0
  55. package/canvas-dist/assets/chunk-55IACEB6-p2qMY-fm.js +1 -0
  56. package/canvas-dist/assets/{chunk-B4BG7PRW-Cv9vsAzg.js → chunk-B4BG7PRW-BpbyxBP2.js} +1 -1
  57. package/canvas-dist/assets/chunk-B4BG7PRW-CCPqvPrP.js +165 -0
  58. package/canvas-dist/assets/chunk-B4BG7PRW-CEeDPAki.js +165 -0
  59. package/canvas-dist/assets/chunk-B4BG7PRW-D2UFN_2M.js +165 -0
  60. package/canvas-dist/assets/chunk-B4BG7PRW-DFI5h6HC.js +165 -0
  61. package/canvas-dist/assets/chunk-B4BG7PRW-DKOiFGMU.js +165 -0
  62. package/canvas-dist/assets/{chunk-DI55MBZ5-B3p1mU43.js → chunk-DI55MBZ5-BV6nHjNQ.js} +1 -1
  63. package/canvas-dist/assets/chunk-DI55MBZ5-CEZJmC0E.js +220 -0
  64. package/canvas-dist/assets/chunk-DI55MBZ5-DOZT99Ek.js +220 -0
  65. package/canvas-dist/assets/chunk-DI55MBZ5-DmC2LoG2.js +220 -0
  66. package/canvas-dist/assets/chunk-DI55MBZ5-DpkcJdZP.js +220 -0
  67. package/canvas-dist/assets/chunk-DI55MBZ5-fVTGx0zh.js +220 -0
  68. package/canvas-dist/assets/{chunk-FMBD7UC4-JCLAHw5x.js → chunk-FMBD7UC4-BOCyQpI7.js} +1 -1
  69. package/canvas-dist/assets/chunk-FMBD7UC4-C76FrRL8.js +15 -0
  70. package/canvas-dist/assets/chunk-FMBD7UC4-CAq-btWc.js +15 -0
  71. package/canvas-dist/assets/chunk-FMBD7UC4-CidVsej6.js +15 -0
  72. package/canvas-dist/assets/chunk-FMBD7UC4-DPpfskdX.js +15 -0
  73. package/canvas-dist/assets/chunk-FMBD7UC4-DnLtclge.js +15 -0
  74. package/canvas-dist/assets/{chunk-QN33PNHL-C9arKEVq.js → chunk-QN33PNHL-BclpCUi8.js} +1 -1
  75. package/canvas-dist/assets/chunk-QN33PNHL-DDUw8IU1.js +1 -0
  76. package/canvas-dist/assets/chunk-QN33PNHL-DdJFAUXw.js +1 -0
  77. package/canvas-dist/assets/chunk-QN33PNHL-DjV4jUn9.js +1 -0
  78. package/canvas-dist/assets/chunk-QN33PNHL-N-HTycqU.js +1 -0
  79. package/canvas-dist/assets/chunk-QN33PNHL-sd8p21DW.js +1 -0
  80. package/canvas-dist/assets/{chunk-QZHKN3VN-Bs1r3d9U.js → chunk-QZHKN3VN-B6mT-JkP.js} +1 -1
  81. package/canvas-dist/assets/chunk-QZHKN3VN-BCo8pc7x.js +1 -0
  82. package/canvas-dist/assets/chunk-QZHKN3VN-C8IIu6es.js +1 -0
  83. package/canvas-dist/assets/chunk-QZHKN3VN-D9FF492U.js +1 -0
  84. package/canvas-dist/assets/chunk-QZHKN3VN-DWMbUjXT.js +1 -0
  85. package/canvas-dist/assets/chunk-QZHKN3VN-l5FBJ77g.js +1 -0
  86. package/canvas-dist/assets/{chunk-TZMSLE5B-_Ye6r84Y.js → chunk-TZMSLE5B-BASt-UWt.js} +1 -1
  87. package/canvas-dist/assets/chunk-TZMSLE5B-BCfaZWLT.js +1 -0
  88. package/canvas-dist/assets/chunk-TZMSLE5B-BKIk_hBR.js +1 -0
  89. package/canvas-dist/assets/chunk-TZMSLE5B-C4pt-Ir8.js +1 -0
  90. package/canvas-dist/assets/chunk-TZMSLE5B-DwGlELvo.js +1 -0
  91. package/canvas-dist/assets/chunk-TZMSLE5B-jJKG-WvJ.js +1 -0
  92. package/canvas-dist/assets/classDiagram-2ON5EDUG-B7YQfPU4.js +1 -0
  93. package/canvas-dist/assets/classDiagram-2ON5EDUG-BZ61MaHY.js +1 -0
  94. package/canvas-dist/assets/classDiagram-2ON5EDUG-CGseYor2.js +1 -0
  95. package/canvas-dist/assets/classDiagram-2ON5EDUG-CKzOc99J.js +1 -0
  96. package/canvas-dist/assets/classDiagram-2ON5EDUG-Ce_LPjwW.js +1 -0
  97. package/canvas-dist/assets/classDiagram-2ON5EDUG-DorPdibv.js +1 -0
  98. package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-B7YQfPU4.js +1 -0
  99. package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-BZ61MaHY.js +1 -0
  100. package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-CGseYor2.js +1 -0
  101. package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-CKzOc99J.js +1 -0
  102. package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-Ce_LPjwW.js +1 -0
  103. package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-DorPdibv.js +1 -0
  104. package/canvas-dist/assets/clone-74KSto7H.js +1 -0
  105. package/canvas-dist/assets/clone-CJQgAYVe.js +1 -0
  106. package/canvas-dist/assets/clone-DLeTuhHE.js +1 -0
  107. package/canvas-dist/assets/clone-D_IHK_lQ.js +1 -0
  108. package/canvas-dist/assets/clone-DxMUv1L9.js +1 -0
  109. package/canvas-dist/assets/clone-UNKf_nED.js +1 -0
  110. package/canvas-dist/assets/{cose-bilkent-S5V4N54A-2O2oovOj.js → cose-bilkent-S5V4N54A-BTyQiCkr.js} +1 -1
  111. package/canvas-dist/assets/cose-bilkent-S5V4N54A-BtPAe24N.js +1 -0
  112. package/canvas-dist/assets/cose-bilkent-S5V4N54A-DIjE7V3m.js +1 -0
  113. package/canvas-dist/assets/cose-bilkent-S5V4N54A-DKL_BGvE.js +1 -0
  114. package/canvas-dist/assets/cose-bilkent-S5V4N54A-LZ4OsCLU.js +1 -0
  115. package/canvas-dist/assets/cose-bilkent-S5V4N54A-XWeJtgga.js +1 -0
  116. package/canvas-dist/assets/{dagre-6UL2VRFP-gRmGLrEW.js → dagre-6UL2VRFP-BJ2vcFwR.js} +1 -1
  117. package/canvas-dist/assets/dagre-6UL2VRFP-C1FlE5s8.js +4 -0
  118. package/canvas-dist/assets/dagre-6UL2VRFP-C3BWFgl6.js +4 -0
  119. package/canvas-dist/assets/dagre-6UL2VRFP-CUnx73Rf.js +4 -0
  120. package/canvas-dist/assets/dagre-6UL2VRFP-Do10BY1y.js +4 -0
  121. package/canvas-dist/assets/dagre-6UL2VRFP-rOZEkrsg.js +4 -0
  122. package/canvas-dist/assets/{diagram-PSM6KHXK-B7Li-xxw.js → diagram-PSM6KHXK-BGi_qzbq.js} +1 -1
  123. package/canvas-dist/assets/diagram-PSM6KHXK-C3Nv7h_j.js +24 -0
  124. package/canvas-dist/assets/diagram-PSM6KHXK-CsMy-r0n.js +24 -0
  125. package/canvas-dist/assets/diagram-PSM6KHXK-Dj8g7kGt.js +24 -0
  126. package/canvas-dist/assets/diagram-PSM6KHXK-Dxb1w_7r.js +24 -0
  127. package/canvas-dist/assets/diagram-PSM6KHXK-kVMBkEyV.js +24 -0
  128. package/canvas-dist/assets/{diagram-QEK2KX5R-B_NNUAm3.js → diagram-QEK2KX5R-4bsrr1WZ.js} +1 -1
  129. package/canvas-dist/assets/diagram-QEK2KX5R-Bv7BmKfI.js +43 -0
  130. package/canvas-dist/assets/diagram-QEK2KX5R-C_FLN6hv.js +43 -0
  131. package/canvas-dist/assets/diagram-QEK2KX5R-Csuk5L3z.js +43 -0
  132. package/canvas-dist/assets/diagram-QEK2KX5R-D5Aszgz4.js +43 -0
  133. package/canvas-dist/assets/diagram-QEK2KX5R-DX58f87l.js +43 -0
  134. package/canvas-dist/assets/{diagram-S2PKOQOG-NcK-KHaA.js → diagram-S2PKOQOG-1Q7hwiSd.js} +1 -1
  135. package/canvas-dist/assets/diagram-S2PKOQOG-Bz9Vxi5V.js +24 -0
  136. package/canvas-dist/assets/diagram-S2PKOQOG-CdWgZIIc.js +24 -0
  137. package/canvas-dist/assets/diagram-S2PKOQOG-DBicbKFU.js +24 -0
  138. package/canvas-dist/assets/diagram-S2PKOQOG-DsXKwPtU.js +24 -0
  139. package/canvas-dist/assets/diagram-S2PKOQOG-L_SMHLXs.js +24 -0
  140. package/canvas-dist/assets/{erDiagram-Q2GNP2WA-CG7dqzk3.js → erDiagram-Q2GNP2WA-BYu7fh6H.js} +1 -1
  141. package/canvas-dist/assets/erDiagram-Q2GNP2WA-CvnQ69BF.js +60 -0
  142. package/canvas-dist/assets/erDiagram-Q2GNP2WA-D3xm-Tdm.js +60 -0
  143. package/canvas-dist/assets/erDiagram-Q2GNP2WA-DIPpD8sj.js +60 -0
  144. package/canvas-dist/assets/erDiagram-Q2GNP2WA-DNgu6dMd.js +60 -0
  145. package/canvas-dist/assets/erDiagram-Q2GNP2WA-Decm8aB4.js +60 -0
  146. package/canvas-dist/assets/{flowDiagram-NV44I4VS-CBzCj5D6.js → flowDiagram-NV44I4VS-2ymk2kw2.js} +1 -1
  147. package/canvas-dist/assets/flowDiagram-NV44I4VS-BEPFOt6U.js +162 -0
  148. package/canvas-dist/assets/flowDiagram-NV44I4VS-BwqXYGfK.js +162 -0
  149. package/canvas-dist/assets/flowDiagram-NV44I4VS-CS1jax_z.js +162 -0
  150. package/canvas-dist/assets/flowDiagram-NV44I4VS-DQz5bf7r.js +162 -0
  151. package/canvas-dist/assets/flowDiagram-NV44I4VS-KW4T1sqF.js +162 -0
  152. package/canvas-dist/assets/{ganttDiagram-JELNMOA3-CHw-4qJC.js → ganttDiagram-JELNMOA3-B811prZt.js} +1 -1
  153. package/canvas-dist/assets/ganttDiagram-JELNMOA3-C75pWm7X.js +267 -0
  154. package/canvas-dist/assets/ganttDiagram-JELNMOA3-CWsbo0fn.js +267 -0
  155. package/canvas-dist/assets/ganttDiagram-JELNMOA3-CbJozPBN.js +267 -0
  156. package/canvas-dist/assets/ganttDiagram-JELNMOA3-Co0cFt4c.js +267 -0
  157. package/canvas-dist/assets/ganttDiagram-JELNMOA3-I4PDqrRh.js +267 -0
  158. package/canvas-dist/assets/{gitGraphDiagram-V2S2FVAM-Dqrc4wUs.js → gitGraphDiagram-V2S2FVAM-B-z0cLPt.js} +1 -1
  159. package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-Be40z-LF.js +65 -0
  160. package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-BejNaAVm.js +65 -0
  161. package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-BqWDYr0X.js +65 -0
  162. package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-DSvWGY-e.js +65 -0
  163. package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-HLYbyNJ5.js +65 -0
  164. package/canvas-dist/assets/{graph-X9Kzu-pf.js → graph-BE8KKsdf.js} +1 -1
  165. package/canvas-dist/assets/graph-D6DzzszU.js +1 -0
  166. package/canvas-dist/assets/graph-DFR8Y_8s.js +1 -0
  167. package/canvas-dist/assets/graph-Da385cDY.js +1 -0
  168. package/canvas-dist/assets/graph-MU7gZz2B.js +1 -0
  169. package/canvas-dist/assets/graph-wjSBJwnf.js +1 -0
  170. package/canvas-dist/assets/index--ztw-8Rw.js +647 -0
  171. package/canvas-dist/assets/{index-BQFKo-II.js → index-5TpIM6B1.js} +1 -1
  172. package/canvas-dist/assets/index-6GBZ9nXN.css +32 -0
  173. package/canvas-dist/assets/index-BSswTuBk.js +11 -0
  174. package/canvas-dist/assets/index-BVvhMmjs.js +11 -0
  175. package/canvas-dist/assets/index-BY92Mj5g.js +572 -0
  176. package/canvas-dist/assets/index-CV7palC3.js +572 -0
  177. package/canvas-dist/assets/index-D9bmQGsB.js +11 -0
  178. package/canvas-dist/assets/index-DDIKkGv8.js +592 -0
  179. package/canvas-dist/assets/index-Dyo0NkPb.js +574 -0
  180. package/canvas-dist/assets/index-iQWajCow.js +572 -0
  181. package/canvas-dist/assets/index-m68YlAMU.js +11 -0
  182. package/canvas-dist/assets/index-mEoP57az.js +11 -0
  183. package/canvas-dist/assets/{infoDiagram-HS3SLOUP-CflnZPsm.js → infoDiagram-HS3SLOUP--9BirqgJ.js} +1 -1
  184. package/canvas-dist/assets/infoDiagram-HS3SLOUP-CSJVED2y.js +2 -0
  185. package/canvas-dist/assets/infoDiagram-HS3SLOUP-D68HIb2t.js +2 -0
  186. package/canvas-dist/assets/infoDiagram-HS3SLOUP-DK2VLGGz.js +2 -0
  187. package/canvas-dist/assets/infoDiagram-HS3SLOUP-PaFhn4yD.js +2 -0
  188. package/canvas-dist/assets/infoDiagram-HS3SLOUP-zLNG47sU.js +2 -0
  189. package/canvas-dist/assets/{journeyDiagram-XKPGCS4Q-D2gkCipQ.js → journeyDiagram-XKPGCS4Q-Bue2dR2X.js} +1 -1
  190. package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-CrgZfpdU.js +139 -0
  191. package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-DUxWmkkC.js +139 -0
  192. package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-OTFkv4pd.js +139 -0
  193. package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-eK2_Zuu3.js +139 -0
  194. package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-uds5Tz8D.js +139 -0
  195. package/canvas-dist/assets/{kanban-definition-3W4ZIXB7-CtLLz4o8.js → kanban-definition-3W4ZIXB7-BETdiI7I.js} +1 -1
  196. package/canvas-dist/assets/kanban-definition-3W4ZIXB7-BdVh7KdN.js +89 -0
  197. package/canvas-dist/assets/kanban-definition-3W4ZIXB7-Cxl8UM9S.js +89 -0
  198. package/canvas-dist/assets/kanban-definition-3W4ZIXB7-DVPlx3I2.js +89 -0
  199. package/canvas-dist/assets/kanban-definition-3W4ZIXB7-LtNWeoYB.js +89 -0
  200. package/canvas-dist/assets/kanban-definition-3W4ZIXB7-uvhEMvyE.js +89 -0
  201. package/canvas-dist/assets/{layout-CjvV_Dms.js → layout-1OzszN14.js} +1 -1
  202. package/canvas-dist/assets/layout-CJSupFcF.js +1 -0
  203. package/canvas-dist/assets/layout-DFRmxN_c.js +1 -0
  204. package/canvas-dist/assets/layout-DSu-zk7y.js +1 -0
  205. package/canvas-dist/assets/layout-TGcrvApd.js +1 -0
  206. package/canvas-dist/assets/layout-eStc8SYK.js +1 -0
  207. package/canvas-dist/assets/{linear-D3cIYHoS.js → linear-9qlE6xa7.js} +1 -1
  208. package/canvas-dist/assets/linear-CBfFWnLD.js +1 -0
  209. package/canvas-dist/assets/linear-Cv4ai8Hq.js +1 -0
  210. package/canvas-dist/assets/linear-DDzz65E6.js +1 -0
  211. package/canvas-dist/assets/linear-wbIqhwDf.js +1 -0
  212. package/canvas-dist/assets/linear-wyNKl76F.js +1 -0
  213. package/canvas-dist/assets/{mindmap-definition-VGOIOE7T-DSgjVg-P.js → mindmap-definition-VGOIOE7T-3l4YzhEM.js} +1 -1
  214. package/canvas-dist/assets/mindmap-definition-VGOIOE7T-B-KkpNlw.js +68 -0
  215. package/canvas-dist/assets/mindmap-definition-VGOIOE7T-DHMHWgmT.js +68 -0
  216. package/canvas-dist/assets/mindmap-definition-VGOIOE7T-Dqfyg4Z2.js +68 -0
  217. package/canvas-dist/assets/mindmap-definition-VGOIOE7T-NeRYOzsq.js +68 -0
  218. package/canvas-dist/assets/mindmap-definition-VGOIOE7T-xyu628P9.js +68 -0
  219. package/canvas-dist/assets/{pieDiagram-ADFJNKIX-B_lYaGFj.js → pieDiagram-ADFJNKIX-BWNzVAGj.js} +1 -1
  220. package/canvas-dist/assets/pieDiagram-ADFJNKIX-Bm3PXYs-.js +30 -0
  221. package/canvas-dist/assets/pieDiagram-ADFJNKIX-BvvN7VvQ.js +30 -0
  222. package/canvas-dist/assets/pieDiagram-ADFJNKIX-BwU7AN7W.js +30 -0
  223. package/canvas-dist/assets/pieDiagram-ADFJNKIX-CHgwWCaM.js +30 -0
  224. package/canvas-dist/assets/pieDiagram-ADFJNKIX-DlZc8YOh.js +30 -0
  225. package/canvas-dist/assets/{quadrantDiagram-AYHSOK5B-DLZLTJe3.js → quadrantDiagram-AYHSOK5B-B-Zd8OFp.js} +1 -1
  226. package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-B1CnJyxI.js +7 -0
  227. package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-C0Qo00b9.js +7 -0
  228. package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-C9bx3nEJ.js +7 -0
  229. package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-UHENkiRO.js +7 -0
  230. package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-jKfurTPU.js +7 -0
  231. package/canvas-dist/assets/{requirementDiagram-UZGBJVZJ-CZE26rhL.js → requirementDiagram-UZGBJVZJ-BPpNNusD.js} +1 -1
  232. package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-BwZF1NIK.js +64 -0
  233. package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-CaT3Frtk.js +64 -0
  234. package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-Dfoz7R_7.js +64 -0
  235. package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-DsrX4TT-.js +64 -0
  236. package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-dmouSXOl.js +64 -0
  237. package/canvas-dist/assets/{sankeyDiagram-TZEHDZUN-DQMRJAPV.js → sankeyDiagram-TZEHDZUN-BEy-A1Fu.js} +1 -1
  238. package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-BViMBiAQ.js +10 -0
  239. package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-BqrM-qWN.js +10 -0
  240. package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-DRkRC9qB.js +10 -0
  241. package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-DbuzKCtn.js +10 -0
  242. package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-_aHMKbpw.js +10 -0
  243. package/canvas-dist/assets/{sequenceDiagram-WL72ISMW-BY723FEn.js → sequenceDiagram-WL72ISMW-B8FOaL2Q.js} +1 -1
  244. package/canvas-dist/assets/sequenceDiagram-WL72ISMW-C02NQwOB.js +145 -0
  245. package/canvas-dist/assets/sequenceDiagram-WL72ISMW-CgyHivPj.js +145 -0
  246. package/canvas-dist/assets/sequenceDiagram-WL72ISMW-CzW1WaEm.js +145 -0
  247. package/canvas-dist/assets/sequenceDiagram-WL72ISMW-DJhHI1pe.js +145 -0
  248. package/canvas-dist/assets/sequenceDiagram-WL72ISMW-VFkpAeoG.js +145 -0
  249. package/canvas-dist/assets/{stateDiagram-FKZM4ZOC-C_UdOFhy.js → stateDiagram-FKZM4ZOC-BSqFX4PJ.js} +1 -1
  250. package/canvas-dist/assets/stateDiagram-FKZM4ZOC-BnXhhxkN.js +1 -0
  251. package/canvas-dist/assets/stateDiagram-FKZM4ZOC-ClARVrvt.js +1 -0
  252. package/canvas-dist/assets/stateDiagram-FKZM4ZOC-CuC6xesY.js +1 -0
  253. package/canvas-dist/assets/stateDiagram-FKZM4ZOC-DcAiGjph.js +1 -0
  254. package/canvas-dist/assets/stateDiagram-FKZM4ZOC-aBg0hjTp.js +1 -0
  255. package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-8fib9ftc.js +1 -0
  256. package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-B-DO0ZqO.js +1 -0
  257. package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-BksbsE4k.js +1 -0
  258. package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-C2DJCNPK.js +1 -0
  259. package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-CeA5jba6.js +1 -0
  260. package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-zsAyq0tK.js +1 -0
  261. package/canvas-dist/assets/{timeline-definition-IT6M3QCI-DkrJqww0.js → timeline-definition-IT6M3QCI-BaHdYD2h.js} +1 -1
  262. package/canvas-dist/assets/timeline-definition-IT6M3QCI-Bl2hg8IM.js +61 -0
  263. package/canvas-dist/assets/timeline-definition-IT6M3QCI-CrVwLiGm.js +61 -0
  264. package/canvas-dist/assets/timeline-definition-IT6M3QCI-DrXGRjnB.js +61 -0
  265. package/canvas-dist/assets/timeline-definition-IT6M3QCI-cYAwshf6.js +61 -0
  266. package/canvas-dist/assets/timeline-definition-IT6M3QCI-flyL0y-3.js +61 -0
  267. package/canvas-dist/assets/{treemap-GDKQZRPO-B-6bMZqD.js → treemap-GDKQZRPO-C4Hg8kJ_.js} +1 -1
  268. package/canvas-dist/assets/treemap-GDKQZRPO-DVY2G9qY.js +162 -0
  269. package/canvas-dist/assets/treemap-GDKQZRPO-DpLWPA1z.js +162 -0
  270. package/canvas-dist/assets/treemap-GDKQZRPO-Ds86cUVw.js +162 -0
  271. package/canvas-dist/assets/treemap-GDKQZRPO-DwmoI6tH.js +162 -0
  272. package/canvas-dist/assets/treemap-GDKQZRPO-SsGFkgVd.js +162 -0
  273. package/canvas-dist/assets/{xychartDiagram-PRI3JC2R-DkBhUy_D.js → xychartDiagram-PRI3JC2R-B9c1iLBf.js} +1 -1
  274. package/canvas-dist/assets/xychartDiagram-PRI3JC2R-BpX6MPWa.js +7 -0
  275. package/canvas-dist/assets/xychartDiagram-PRI3JC2R-CEgW_j0p.js +7 -0
  276. package/canvas-dist/assets/xychartDiagram-PRI3JC2R-CSEFGEQX.js +7 -0
  277. package/canvas-dist/assets/xychartDiagram-PRI3JC2R-CnG4XoMc.js +7 -0
  278. package/canvas-dist/assets/xychartDiagram-PRI3JC2R-Dftj3Bt3.js +7 -0
  279. package/canvas-dist/index.html +3 -2
  280. package/package.json +2 -1
  281. package/src/protocol.js +1 -1
  282. package/src/protocol.test.js +1 -1
  283. package/src/pty-manager.js +281 -0
  284. package/src/pty-manager.test.js +212 -0
  285. package/src/router.js +31 -1
  286. package/src/router.test.js +1 -1
  287. package/src/sdk-e2e.test.js +101 -0
  288. package/src/server.e2e.test.js +804 -138
  289. package/src/server.js +1273 -137
  290. package/src/session-store.js +260 -0
  291. package/src/session-store.test.js +235 -0
  292. package/src/templates.js +1 -1
  293. package/src/templates.test.js +1 -1
  294. package/src/terminal.js +3 -3
  295. package/src/terminal.test.js +12 -12
  296. package/src/visual-interceptor.js +450 -0
  297. package/src/visual-interceptor.test.js +943 -0
  298. package/src/workshop-parser.js +251 -0
  299. package/src/workshop-parser.test.js +179 -0
  300. package/templates/celebrate.html +1 -1
  301. package/templates/code-playground.html +1 -1
  302. package/templates/dashboard.html +7 -8
  303. package/templates/diagram-architecture.html +1 -1
  304. package/templates/diagram-flow.html +1 -1
  305. package/templates/diagram-mermaid.html +1 -1
  306. package/templates/game-speed-round.html +1 -1
  307. package/templates/quiz-drag-order.html +1 -1
  308. package/templates/quiz-fill-blank.html +1 -1
  309. package/templates/quiz-matching.html +1 -1
  310. package/templates/quiz-timed-choice.html +1 -1
  311. package/templates/welcome.html +7 -7
  312. package/canvas-dist/assets/channel-BzJVlie3.js +0 -1
  313. package/canvas-dist/assets/classDiagram-2ON5EDUG-BTs-zEmB.js +0 -1
  314. package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-BTs-zEmB.js +0 -1
  315. package/canvas-dist/assets/clone-CXEfuXmc.js +0 -1
  316. package/canvas-dist/assets/index-DJ49c6u-.js +0 -426
  317. package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-DXIiFh0L.js +0 -1
@@ -0,0 +1,251 @@
1
+ /**
2
+ * Workshop YAML parser for Socrates.
3
+ * Parses workshop.yaml files that define interactive terminal+code scenarios.
4
+ *
5
+ * Format:
6
+ * scenarios:
7
+ * - id: merge-conflict
8
+ * title: "Resolve a Merge Conflict"
9
+ * difficulty: beginner
10
+ * xp: 30
11
+ * setup:
12
+ * - "git init"
13
+ * - "echo 'hello' > file.txt"
14
+ * files:
15
+ * - name: file.txt
16
+ * content: "hello world"
17
+ * language: text
18
+ * readonly: false
19
+ * task: "Merge the feature branch"
20
+ * validations:
21
+ * - label: "Run git merge"
22
+ * check: command-match
23
+ * pattern: "git merge"
24
+ * hints:
25
+ * - "Try git merge feature"
26
+ * agent_prompts:
27
+ * on_start: "Let's resolve a merge conflict!"
28
+ */
29
+
30
+ /**
31
+ * Parse a workshop.yaml string into a structured object.
32
+ * This is a lightweight YAML subset parser — handles the workshop format
33
+ * without requiring a full YAML library.
34
+ * @param {string} raw - Raw YAML content
35
+ * @returns {{ scenarios: Array<object> }}
36
+ */
37
+ export function parseWorkshopYaml(raw) {
38
+ if (!raw || typeof raw !== 'string') return { scenarios: [] };
39
+
40
+ const lines = raw.split('\n');
41
+ const scenarios = [];
42
+ let current = null;
43
+ let currentList = null;
44
+ let currentFile = null;
45
+ let currentValidation = null;
46
+ let currentPrompts = null;
47
+ let inMultiline = false;
48
+ let multilineKey = null;
49
+ let multilineIndent = 0;
50
+ const multilineAccum = [];
51
+
52
+ for (let i = 0; i < lines.length; i++) {
53
+ const line = lines[i];
54
+ const trimmed = line.trimEnd();
55
+
56
+ const indent = line.length - line.trimStart().length;
57
+
58
+ // Multiline block scalar (content: |)
59
+ if (inMultiline) {
60
+ if (indent < multilineIndent && trimmed) {
61
+ if (currentFile && multilineKey) {
62
+ currentFile[multilineKey] = multilineAccum.join('\n').replace(/\n+$/, '');
63
+ }
64
+ multilineAccum.length = 0;
65
+ inMultiline = false;
66
+ multilineKey = null;
67
+ multilineIndent = 0;
68
+ i--; // Reprocess this line (next key)
69
+ continue;
70
+ }
71
+ if (trimmed === '') {
72
+ multilineAccum.push('');
73
+ } else {
74
+ if (multilineIndent === 0) multilineIndent = indent;
75
+ multilineAccum.push(indent >= multilineIndent ? line.slice(multilineIndent) : trimmed);
76
+ }
77
+ continue;
78
+ }
79
+
80
+ // Skip empty lines and comments (when not in multiline)
81
+ if (!trimmed || trimmed.startsWith('#')) continue;
82
+
83
+ // Top-level "scenarios:" key
84
+ if (indent === 0 && trimmed === 'scenarios:') continue;
85
+
86
+ // New scenario item (indent 2, starts with "- ")
87
+ if (indent === 2 && line.slice(indent).startsWith('- ')) {
88
+ if (current) scenarios.push(finishScenario(current));
89
+ current = { files: [], setup: [], validations: [], hints: [], agent_prompts: {} };
90
+ currentList = null;
91
+ currentFile = null;
92
+ currentValidation = null;
93
+ currentPrompts = null;
94
+
95
+ const content = line.slice(indent);
96
+ const firstLine = content.startsWith('- ') ? content.slice(2).trim() : content.trim();
97
+ if (firstLine) parseKeyVal(firstLine, current);
98
+ continue;
99
+ }
100
+
101
+ if (!current) continue;
102
+
103
+ // Scenario-level key-value (indent 4+)
104
+ if (indent >= 4 && !line.slice(indent).startsWith('- ')) {
105
+ const kv = trimmed.trim();
106
+
107
+ // List context keys
108
+ if (kv === 'setup:') { currentList = 'setup'; currentFile = null; currentValidation = null; currentPrompts = null; continue; }
109
+ if (kv === 'files:') { currentList = 'files'; currentFile = null; currentValidation = null; currentPrompts = null; continue; }
110
+ if (kv === 'validations:') { currentList = 'validations'; currentFile = null; currentValidation = null; currentPrompts = null; continue; }
111
+ if (kv === 'hints:') { currentList = 'hints'; currentFile = null; currentValidation = null; currentPrompts = null; continue; }
112
+ if (kv === 'agent_prompts:') { currentPrompts = {}; current.agent_prompts = currentPrompts; currentList = null; currentFile = null; currentValidation = null; continue; }
113
+
114
+ // Inside agent_prompts
115
+ if (currentPrompts && indent >= 6) {
116
+ parseKeyVal(kv, currentPrompts);
117
+ continue;
118
+ }
119
+
120
+ // Inside a file item
121
+ if (currentFile && indent >= 8) {
122
+ const contentMatch = kv.match(/^content:\s*\|$/);
123
+ if (contentMatch) {
124
+ inMultiline = true;
125
+ multilineKey = 'content';
126
+ multilineIndent = 0;
127
+ multilineAccum.length = 0;
128
+ continue;
129
+ }
130
+ parseKeyVal(kv, currentFile);
131
+ continue;
132
+ }
133
+
134
+ // Inside a validation item
135
+ if (currentValidation && indent >= 8) {
136
+ parseKeyVal(kv, currentValidation);
137
+ continue;
138
+ }
139
+
140
+ // Scenario direct property
141
+ if (indent === 4 || indent === 6) {
142
+ parseKeyVal(kv, current);
143
+ continue;
144
+ }
145
+ }
146
+
147
+ // List items
148
+ const contentStart = line.slice(indent);
149
+ if (contentStart.startsWith('- ')) {
150
+ const val = contentStart.slice(2).trim();
151
+
152
+ if (currentList === 'setup') {
153
+ current.setup.push(unquote(val));
154
+ continue;
155
+ }
156
+
157
+ if (currentList === 'hints') {
158
+ current.hints.push(unquote(val));
159
+ continue;
160
+ }
161
+
162
+ if (currentList === 'files') {
163
+ currentFile = {};
164
+ current.files.push(currentFile);
165
+ currentValidation = null;
166
+ if (val) parseKeyVal(val, currentFile);
167
+ continue;
168
+ }
169
+
170
+ if (currentList === 'validations') {
171
+ currentValidation = {};
172
+ current.validations.push(currentValidation);
173
+ currentFile = null;
174
+ if (val) parseKeyVal(val, currentValidation);
175
+ continue;
176
+ }
177
+ }
178
+ }
179
+
180
+ if (inMultiline && currentFile && multilineKey) {
181
+ currentFile[multilineKey] = multilineAccum.join('\n').replace(/\n+$/, '');
182
+ }
183
+
184
+ if (current) scenarios.push(finishScenario(current));
185
+
186
+ return { scenarios };
187
+ }
188
+
189
+ function finishScenario(s) {
190
+ return {
191
+ id: s.id || `scenario-${Date.now()}`,
192
+ title: s.title || 'Untitled Scenario',
193
+ difficulty: s.difficulty || 'beginner',
194
+ xp: typeof s.xp === 'number' ? s.xp : 30,
195
+ setup: s.setup || [],
196
+ files: s.files || [],
197
+ task: s.task || '',
198
+ validations: (s.validations || []).map(v => ({
199
+ label: v.label || '',
200
+ check: v.check || 'output-contains',
201
+ pattern: v.pattern || '',
202
+ file: v.file || null,
203
+ })),
204
+ hints: s.hints || [],
205
+ agent_prompts: s.agent_prompts || {},
206
+ };
207
+ }
208
+
209
+ function parseKeyVal(str, target) {
210
+ const match = str.match(/^(\w[\w_-]*):\s*(.*)?$/);
211
+ if (!match) return;
212
+ const key = match[1];
213
+ let val = (match[2] || '').trim();
214
+ val = unquote(val);
215
+
216
+ if (val === 'true') target[key] = true;
217
+ else if (val === 'false') target[key] = false;
218
+ else if (/^-?\d+$/.test(val)) target[key] = parseInt(val, 10);
219
+ else if (/^-?\d+\.\d+$/.test(val)) target[key] = parseFloat(val);
220
+ else target[key] = val;
221
+ }
222
+
223
+ function unquote(s) {
224
+ if (!s) return s;
225
+ if ((s.startsWith('"') && s.endsWith('"')) || (s.startsWith("'") && s.endsWith("'"))) {
226
+ return s.slice(1, -1);
227
+ }
228
+ return s;
229
+ }
230
+
231
+ /**
232
+ * Validate a parsed workshop structure.
233
+ * @param {{ scenarios: Array }} workshop
234
+ * @returns {{ valid: boolean, errors: string[] }}
235
+ */
236
+ export function validateWorkshop(workshop) {
237
+ const errors = [];
238
+ if (!workshop || !Array.isArray(workshop.scenarios)) {
239
+ return { valid: false, errors: ['Missing scenarios array'] };
240
+ }
241
+ for (const [i, s] of workshop.scenarios.entries()) {
242
+ if (!s.id) errors.push(`Scenario ${i}: missing id`);
243
+ if (!s.task) errors.push(`Scenario ${i} (${s.id}): missing task`);
244
+ if (!s.title) errors.push(`Scenario ${i} (${s.id}): missing title`);
245
+ for (const [j, v] of (s.validations || []).entries()) {
246
+ if (!v.label) errors.push(`Scenario ${s.id}, validation ${j}: missing label`);
247
+ if (!v.check) errors.push(`Scenario ${s.id}, validation ${j}: missing check type`);
248
+ }
249
+ }
250
+ return { valid: errors.length === 0, errors };
251
+ }
@@ -0,0 +1,179 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { readFileSync, existsSync } from 'fs';
3
+ import { join, resolve } from 'path';
4
+ import { parseWorkshopYaml, validateWorkshop } from './workshop-parser.js';
5
+
6
+ const MODULES_ROOT = resolve(process.cwd(), 'packages/modules');
7
+
8
+ describe('parseWorkshopYaml', () => {
9
+ it('returns empty scenarios for null or empty input', () => {
10
+ expect(parseWorkshopYaml(null).scenarios).toEqual([]);
11
+ expect(parseWorkshopYaml('').scenarios).toEqual([]);
12
+ expect(parseWorkshopYaml(undefined).scenarios).toEqual([]);
13
+ });
14
+
15
+ it('parses a scenario with single-line content', () => {
16
+ const raw = `
17
+ scenarios:
18
+ - id: simple
19
+ title: "Simple"
20
+ difficulty: beginner
21
+ xp: 20
22
+ setup:
23
+ - "echo hi"
24
+ files:
25
+ - name: foo.js
26
+ content: "const x = 1;"
27
+ language: javascript
28
+ readonly: false
29
+ task: "Do something"
30
+ validations:
31
+ - label: "Done"
32
+ check: file-changed
33
+ pattern: "foo.js"
34
+ `;
35
+ const { scenarios } = parseWorkshopYaml(raw);
36
+ expect(scenarios).toHaveLength(1);
37
+ expect(scenarios[0].id).toBe('simple');
38
+ expect(scenarios[0].files[0].content).toBe('const x = 1;');
39
+ });
40
+
41
+ it('parses multiline content with YAML block scalar (content: |)', () => {
42
+ const raw = `
43
+ scenarios:
44
+ - id: multiline
45
+ title: "Multiline"
46
+ difficulty: beginner
47
+ xp: 25
48
+ setup: []
49
+ files:
50
+ - name: app.js
51
+ content: |
52
+ function hello() {
53
+ return "world";
54
+ }
55
+ module.exports = { hello };
56
+ language: javascript
57
+ readonly: false
58
+ task: "Fix it"
59
+ validations:
60
+ - label: "Fixed"
61
+ check: output-contains
62
+ pattern: "world"
63
+ `;
64
+ const { scenarios } = parseWorkshopYaml(raw);
65
+ expect(scenarios).toHaveLength(1);
66
+ const content = scenarios[0].files[0].content;
67
+ expect(content).toContain('function hello()');
68
+ expect(content).toContain('return "world"');
69
+ expect(content).toContain('module.exports = { hello }');
70
+ });
71
+
72
+ it('parses multiple scenarios with hints and agent_prompts', () => {
73
+ const raw = `
74
+ scenarios:
75
+ - id: first
76
+ title: "First"
77
+ difficulty: beginner
78
+ xp: 25
79
+ setup: []
80
+ files:
81
+ - name: f.js
82
+ content: "x"
83
+ language: javascript
84
+ readonly: false
85
+ task: "Task one"
86
+ validations:
87
+ - label: "V1"
88
+ check: file-changed
89
+ pattern: "f.js"
90
+ hints:
91
+ - "Hint 1"
92
+ - "Hint 2"
93
+ agent_prompts:
94
+ on_start: "What do you notice?"
95
+ - id: second
96
+ title: "Second"
97
+ difficulty: intermediate
98
+ xp: 30
99
+ setup: []
100
+ files: []
101
+ task: "Task two"
102
+ validations:
103
+ - label: "V2"
104
+ check: output-contains
105
+ pattern: "ok"
106
+ `;
107
+ const { scenarios } = parseWorkshopYaml(raw);
108
+ expect(scenarios).toHaveLength(2);
109
+ expect(scenarios[0].hints).toEqual(['Hint 1', 'Hint 2']);
110
+ expect(scenarios[0].agent_prompts.on_start).toBe('What do you notice?');
111
+ expect(scenarios[1].difficulty).toBe('intermediate');
112
+ });
113
+ });
114
+
115
+ describe('validateWorkshop', () => {
116
+ it('returns valid for well-formed workshop', () => {
117
+ const workshop = {
118
+ scenarios: [
119
+ { id: 's1', title: 'T', task: 'T', validations: [{ label: 'L', check: 'output-contains' }] },
120
+ ],
121
+ };
122
+ expect(validateWorkshop(workshop).valid).toBe(true);
123
+ });
124
+
125
+ it('returns errors for missing fields', () => {
126
+ const workshop = { scenarios: [{ id: 's1' }] };
127
+ const { valid, errors } = validateWorkshop(workshop);
128
+ expect(valid).toBe(false);
129
+ expect(errors.some(e => e.includes('task'))).toBe(true);
130
+ expect(errors.some(e => e.includes('title'))).toBe(true);
131
+ });
132
+ });
133
+
134
+ describe('module workshop files', () => {
135
+ it('validates typescript-fundamentals workshop', () => {
136
+ const p = join(MODULES_ROOT, 'typescript-fundamentals', 'workshop.yaml');
137
+ if (!existsSync(p)) return;
138
+ const raw = readFileSync(p, 'utf-8');
139
+ const parsed = parseWorkshopYaml(raw);
140
+ const { valid, errors } = validateWorkshop(parsed);
141
+ expect(valid, errors?.join(', ')).toBe(true);
142
+ expect(parsed.scenarios).toHaveLength(4);
143
+ expect(parsed.scenarios.map((s) => s.id)).toContain('type-annotations');
144
+ expect(parsed.scenarios.map((s) => s.id)).toContain('generics');
145
+ });
146
+
147
+ it('validates react-fundamentals workshop', () => {
148
+ const p = join(MODULES_ROOT, 'react-fundamentals', 'workshop.yaml');
149
+ if (!existsSync(p)) return;
150
+ const raw = readFileSync(p, 'utf-8');
151
+ const parsed = parseWorkshopYaml(raw);
152
+ const { valid, errors } = validateWorkshop(parsed);
153
+ expect(valid, errors?.join(', ')).toBe(true);
154
+ expect(parsed.scenarios).toHaveLength(3);
155
+ });
156
+
157
+ it('validates sql-fundamentals workshop', () => {
158
+ const p = join(MODULES_ROOT, 'sql-fundamentals', 'workshop.yaml');
159
+ if (!existsSync(p)) return;
160
+ const raw = readFileSync(p, 'utf-8');
161
+ const parsed = parseWorkshopYaml(raw);
162
+ const { valid, errors } = validateWorkshop(parsed);
163
+ expect(valid, errors?.join(', ')).toBe(true);
164
+ expect(parsed.scenarios).toHaveLength(4);
165
+ });
166
+
167
+ it('validates git workshop', () => {
168
+ const p = join(MODULES_ROOT, 'git', 'workshop.yaml');
169
+ if (!existsSync(p)) return;
170
+ const raw = readFileSync(p, 'utf-8');
171
+ const parsed = parseWorkshopYaml(raw);
172
+ const { valid, errors } = validateWorkshop(parsed);
173
+ expect(valid, errors?.join(', ')).toBe(true);
174
+ expect(parsed.scenarios).toHaveLength(5);
175
+ expect(parsed.scenarios.map((s) => s.id)).toEqual([
176
+ 'git-init', 'branching', 'merge-conflict', 'interactive-rebase', 'cherry-pick',
177
+ ]);
178
+ });
179
+ });
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>ClaudeTeach — Celebration!</title>
6
+ <title>Socrates — Celebration!</title>
7
7
  <style>
8
8
  * { margin: 0; padding: 0; box-sizing: border-box; }
9
9
  body {
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>ClaudeTeach — Code Playground</title>
6
+ <title>Socrates — Code Playground</title>
7
7
  <style>
8
8
  * { margin: 0; padding: 0; box-sizing: border-box; }
9
9
  body {
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>ClaudeTeach — Dashboard</title>
6
+ <title>Socrates — Dashboard</title>
7
7
  <style>
8
8
  * { margin: 0; padding: 0; box-sizing: border-box; }
9
9
  body {
@@ -158,7 +158,7 @@
158
158
  <body>
159
159
  <div class="dashboard">
160
160
  <div class="dashboard-header">
161
- <h1>ClaudeTeach</h1>
161
+ <h1>Socrates</h1>
162
162
  </div>
163
163
 
164
164
  <div class="belt-display">
@@ -242,15 +242,14 @@
242
242
  }).catch(function(){});
243
243
  })();
244
244
 
245
- const BELTS = [
245
+ // Fetched from /api/constants; fallback used until loaded
246
+ var BELTS = [
246
247
  { name: 'White', minXP: 0, badge: '\u2B1C' },
247
- { name: 'Yellow', minXP: 50, badge: '\uD83D\uDFE8' },
248
- { name: 'Green', minXP: 150, badge: '\uD83D\uDFE9' },
249
- { name: 'Blue', minXP: 400, badge: '\uD83D\uDFE6' },
250
- { name: 'Purple', minXP: 800, badge: '\uD83D\uDFEA' },
251
- { name: 'Brown', minXP: 1500, badge: '\uD83D\uDFEB' },
252
248
  { name: 'Black', minXP: 3000, badge: '\u2B1B' },
253
249
  ];
250
+ fetch('/api/constants').then(function(r) { return r.json(); }).then(function(data) {
251
+ if (data && data.belts) BELTS = data.belts;
252
+ }).catch(function(){});
254
253
 
255
254
  function getBelt(xp) {
256
255
  let belt = BELTS[0];
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>ClaudeTeach — Architecture Diagram</title>
6
+ <title>Socrates — Architecture Diagram</title>
7
7
  <style>
8
8
  * { margin: 0; padding: 0; box-sizing: border-box; }
9
9
  body {
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>ClaudeTeach — Flowchart</title>
6
+ <title>Socrates — Flowchart</title>
7
7
  <style>
8
8
  * { margin: 0; padding: 0; box-sizing: border-box; }
9
9
  body {
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>ClaudeTeach — Diagram</title>
6
+ <title>Socrates — Diagram</title>
7
7
  <style>
8
8
  * { margin: 0; padding: 0; box-sizing: border-box; }
9
9
  body {
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>ClaudeTeach — Speed Round</title>
6
+ <title>Socrates — Speed Round</title>
7
7
  <style>
8
8
  * { margin: 0; padding: 0; box-sizing: border-box; }
9
9
  body {
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>ClaudeTeach — Drag to Order</title>
6
+ <title>Socrates — Drag to Order</title>
7
7
  <style>
8
8
  * { margin: 0; padding: 0; box-sizing: border-box; }
9
9
  body {
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>ClaudeTeach — Fill in the Blank</title>
6
+ <title>Socrates — Fill in the Blank</title>
7
7
  <style>
8
8
  * { margin: 0; padding: 0; box-sizing: border-box; }
9
9
  body {
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>ClaudeTeach — Matching Quiz</title>
6
+ <title>Socrates — Matching Quiz</title>
7
7
  <style>
8
8
  * { margin: 0; padding: 0; box-sizing: border-box; }
9
9
  body {
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>ClaudeTeach — Timed Choice</title>
6
+ <title>Socrates — Timed Choice</title>
7
7
  <style>
8
8
  * { margin: 0; padding: 0; box-sizing: border-box; }
9
9
  body {
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>ClaudeTeach — Welcome</title>
6
+ <title>Socrates — Welcome</title>
7
7
  <style>
8
8
  * { margin: 0; padding: 0; box-sizing: border-box; }
9
9
  body {
@@ -79,7 +79,7 @@
79
79
  <div class="container">
80
80
  <!-- Hero -->
81
81
  <div class="hero">
82
- <h1>Welcome to ClaudeTeach</h1>
82
+ <h1>Welcome to Socrates</h1>
83
83
  <p>A Socratic AI teaching platform with gamification and visual learning.<br>
84
84
  Learn through guided dialogue — the AI asks YOU questions.</p>
85
85
  </div>
@@ -92,10 +92,10 @@
92
92
  </div>
93
93
  <div class="section-body">
94
94
  <p class="text">Launch Claude Code with teaching skills in one command:</p>
95
- <pre><code>claude-teach start</code></pre>
95
+ <pre><code>socrates start</code></pre>
96
96
  <p class="text-small">This starts the bridge server (for visuals) and launches Claude Code with all
97
97
  teaching skills loaded. You can also pass flags through:</p>
98
- <pre><code>claude-teach start -p "teach me git"</code></pre>
98
+ <pre><code>socrates start -p "teach me git"</code></pre>
99
99
  </div>
100
100
  </div>
101
101
 
@@ -106,7 +106,7 @@
106
106
  <h2 class="section-title">Teaching Skills</h2>
107
107
  </div>
108
108
  <div class="section-body">
109
- <p class="text">Once Claude Code is running with ClaudeTeach, these skills are available:</p>
109
+ <p class="text">Once Claude Code is running with Socrates, these skills are available:</p>
110
110
  <div class="skill-grid">
111
111
  <div class="skill-card"><span class="skill-name">/teach</span><span class="skill-desc">Socratic teaching — learn any topic through guided dialogue</span></div>
112
112
  <div class="skill-card"><span class="skill-name">/teach:ask</span><span class="skill-desc">Ask questions about any topic covered by learning modules</span></div>
@@ -127,7 +127,7 @@
127
127
  <h2 class="section-title">Chrome Extension</h2>
128
128
  </div>
129
129
  <div class="section-body">
130
- <p class="text">The ClaudeTeach extension adds context-aware learning suggestions, "Teach me this"
130
+ <p class="text">The Socrates extension adds context-aware learning suggestions, "Teach me this"
131
131
  right-click menus, and real-time connection to the visual canvas.</p>
132
132
  <button class="install-btn" id="installBtn" onclick="installExtension()">Install Extension</button>
133
133
  <div id="installResult"></div>
@@ -162,7 +162,7 @@
162
162
  <div class="quick-steps">
163
163
  <div class="step">
164
164
  <span class="step-num">1</span>
165
- <div><span class="text">Run:</span><pre><code>claude-teach start</code></pre></div>
165
+ <div><span class="text">Run:</span><pre><code>socrates start</code></pre></div>
166
166
  </div>
167
167
  <div class="step">
168
168
  <span class="step-num">2</span>
@@ -1 +0,0 @@
1
- import{ap as o,aq as n}from"./index-DJ49c6u-.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-B4BG7PRW-Cv9vsAzg.js";import{_ as i}from"./index-DJ49c6u-.js";import"./chunk-FMBD7UC4-JCLAHw5x.js";import"./chunk-55IACEB6-L0OhcFdd.js";import"./chunk-QN33PNHL-C9arKEVq.js";var p={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{p as diagram};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-B4BG7PRW-Cv9vsAzg.js";import{_ as i}from"./index-DJ49c6u-.js";import"./chunk-FMBD7UC4-JCLAHw5x.js";import"./chunk-55IACEB6-L0OhcFdd.js";import"./chunk-QN33PNHL-C9arKEVq.js";var p={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{p as diagram};
@@ -1 +0,0 @@
1
- import{b as r}from"./_baseUniq-Dtuvtwtn.js";var e=4;function a(o){return r(o,e)}export{a as c};