@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.
- package/README.md +2 -2
- package/canvas-dist/assets/{_basePickBy-CWoeT3J7.js → _basePickBy-BovdgFIW.js} +1 -1
- package/canvas-dist/assets/_basePickBy-BtkHe2u_.js +1 -0
- package/canvas-dist/assets/_basePickBy-C0936578.js +1 -0
- package/canvas-dist/assets/_basePickBy-CE2Qvuh7.js +1 -0
- package/canvas-dist/assets/_basePickBy-DV6sX4CG.js +1 -0
- package/canvas-dist/assets/_basePickBy-DZX6ZNMT.js +1 -0
- package/canvas-dist/assets/{_baseUniq-Dtuvtwtn.js → _baseUniq-B7dN28TM.js} +1 -1
- package/canvas-dist/assets/_baseUniq-Cl23fCdR.js +1 -0
- package/canvas-dist/assets/_baseUniq-CojWFw7B.js +1 -0
- package/canvas-dist/assets/_baseUniq-DA640BJl.js +1 -0
- package/canvas-dist/assets/_baseUniq-Ds-62CCj.js +1 -0
- package/canvas-dist/assets/_baseUniq-KG7SRw9H.js +1 -0
- package/canvas-dist/assets/{arc-YYWnrNJU.js → arc-7E9FFKlC.js} +1 -1
- package/canvas-dist/assets/arc-BSMfRZtt.js +1 -0
- package/canvas-dist/assets/arc-C6nT-koR.js +1 -0
- package/canvas-dist/assets/arc-D_fOnjmo.js +1 -0
- package/canvas-dist/assets/arc-Khfvgkr3.js +1 -0
- package/canvas-dist/assets/arc-ieS-i42x.js +1 -0
- package/canvas-dist/assets/{architectureDiagram-VXUJARFQ-CegbV-RR.js → architectureDiagram-VXUJARFQ-DF4t6GQD.js} +1 -1
- package/canvas-dist/assets/architectureDiagram-VXUJARFQ-DXgSlsio.js +36 -0
- package/canvas-dist/assets/architectureDiagram-VXUJARFQ-DiomxPB4.js +36 -0
- package/canvas-dist/assets/architectureDiagram-VXUJARFQ-DnFaxvXD.js +36 -0
- package/canvas-dist/assets/architectureDiagram-VXUJARFQ-Dt38C0LJ.js +36 -0
- package/canvas-dist/assets/architectureDiagram-VXUJARFQ-egbtMwua.js +36 -0
- package/canvas-dist/assets/{blockDiagram-VD42YOAC-C2e_j6ry.js → blockDiagram-VD42YOAC-CUNKQd-b.js} +1 -1
- package/canvas-dist/assets/blockDiagram-VD42YOAC-D-NiLXxd.js +122 -0
- package/canvas-dist/assets/blockDiagram-VD42YOAC-Dx6Dh9gg.js +122 -0
- package/canvas-dist/assets/blockDiagram-VD42YOAC-_r-PmlQy.js +122 -0
- package/canvas-dist/assets/blockDiagram-VD42YOAC-bvYKZLMc.js +122 -0
- package/canvas-dist/assets/blockDiagram-VD42YOAC-l85QT9Ig.js +122 -0
- package/canvas-dist/assets/{c4Diagram-YG6GDRKO-rIpnAud9.js → c4Diagram-YG6GDRKO-BWKCTyQi.js} +1 -1
- package/canvas-dist/assets/c4Diagram-YG6GDRKO-CbXs2xzC.js +10 -0
- package/canvas-dist/assets/c4Diagram-YG6GDRKO-CjiS-GNK.js +10 -0
- package/canvas-dist/assets/c4Diagram-YG6GDRKO-D7SnLlHp.js +10 -0
- package/canvas-dist/assets/c4Diagram-YG6GDRKO-RTTCSVf2.js +10 -0
- package/canvas-dist/assets/c4Diagram-YG6GDRKO-yvqJ_AqX.js +10 -0
- package/canvas-dist/assets/channel-CSXq7GP6.js +1 -0
- package/canvas-dist/assets/channel-CvujjGiJ.js +1 -0
- package/canvas-dist/assets/channel-D959Iony.js +1 -0
- package/canvas-dist/assets/channel-DOSwCnrB.js +1 -0
- package/canvas-dist/assets/channel-sw61LzxF.js +1 -0
- package/canvas-dist/assets/channel-vZVnNhOK.js +1 -0
- package/canvas-dist/assets/{chunk-4BX2VUAB-CpZGetnU.js → chunk-4BX2VUAB-BBjuAwXr.js} +1 -1
- package/canvas-dist/assets/chunk-4BX2VUAB-BXRNyucU.js +1 -0
- package/canvas-dist/assets/chunk-4BX2VUAB-Bgq5Z77T.js +1 -0
- package/canvas-dist/assets/chunk-4BX2VUAB-BuoMCMCr.js +1 -0
- package/canvas-dist/assets/chunk-4BX2VUAB-COD5n7vg.js +1 -0
- package/canvas-dist/assets/chunk-4BX2VUAB-K8DepKJO.js +1 -0
- package/canvas-dist/assets/{chunk-55IACEB6-L0OhcFdd.js → chunk-55IACEB6-Bic_bMrQ.js} +1 -1
- package/canvas-dist/assets/chunk-55IACEB6-DEy2QUDq.js +1 -0
- package/canvas-dist/assets/chunk-55IACEB6-Dcgbmfzg.js +1 -0
- package/canvas-dist/assets/chunk-55IACEB6-DfmuNm_E.js +1 -0
- package/canvas-dist/assets/chunk-55IACEB6-DlQRcczm.js +1 -0
- package/canvas-dist/assets/chunk-55IACEB6-p2qMY-fm.js +1 -0
- package/canvas-dist/assets/{chunk-B4BG7PRW-Cv9vsAzg.js → chunk-B4BG7PRW-BpbyxBP2.js} +1 -1
- package/canvas-dist/assets/chunk-B4BG7PRW-CCPqvPrP.js +165 -0
- package/canvas-dist/assets/chunk-B4BG7PRW-CEeDPAki.js +165 -0
- package/canvas-dist/assets/chunk-B4BG7PRW-D2UFN_2M.js +165 -0
- package/canvas-dist/assets/chunk-B4BG7PRW-DFI5h6HC.js +165 -0
- package/canvas-dist/assets/chunk-B4BG7PRW-DKOiFGMU.js +165 -0
- package/canvas-dist/assets/{chunk-DI55MBZ5-B3p1mU43.js → chunk-DI55MBZ5-BV6nHjNQ.js} +1 -1
- package/canvas-dist/assets/chunk-DI55MBZ5-CEZJmC0E.js +220 -0
- package/canvas-dist/assets/chunk-DI55MBZ5-DOZT99Ek.js +220 -0
- package/canvas-dist/assets/chunk-DI55MBZ5-DmC2LoG2.js +220 -0
- package/canvas-dist/assets/chunk-DI55MBZ5-DpkcJdZP.js +220 -0
- package/canvas-dist/assets/chunk-DI55MBZ5-fVTGx0zh.js +220 -0
- package/canvas-dist/assets/{chunk-FMBD7UC4-JCLAHw5x.js → chunk-FMBD7UC4-BOCyQpI7.js} +1 -1
- package/canvas-dist/assets/chunk-FMBD7UC4-C76FrRL8.js +15 -0
- package/canvas-dist/assets/chunk-FMBD7UC4-CAq-btWc.js +15 -0
- package/canvas-dist/assets/chunk-FMBD7UC4-CidVsej6.js +15 -0
- package/canvas-dist/assets/chunk-FMBD7UC4-DPpfskdX.js +15 -0
- package/canvas-dist/assets/chunk-FMBD7UC4-DnLtclge.js +15 -0
- package/canvas-dist/assets/{chunk-QN33PNHL-C9arKEVq.js → chunk-QN33PNHL-BclpCUi8.js} +1 -1
- package/canvas-dist/assets/chunk-QN33PNHL-DDUw8IU1.js +1 -0
- package/canvas-dist/assets/chunk-QN33PNHL-DdJFAUXw.js +1 -0
- package/canvas-dist/assets/chunk-QN33PNHL-DjV4jUn9.js +1 -0
- package/canvas-dist/assets/chunk-QN33PNHL-N-HTycqU.js +1 -0
- package/canvas-dist/assets/chunk-QN33PNHL-sd8p21DW.js +1 -0
- package/canvas-dist/assets/{chunk-QZHKN3VN-Bs1r3d9U.js → chunk-QZHKN3VN-B6mT-JkP.js} +1 -1
- package/canvas-dist/assets/chunk-QZHKN3VN-BCo8pc7x.js +1 -0
- package/canvas-dist/assets/chunk-QZHKN3VN-C8IIu6es.js +1 -0
- package/canvas-dist/assets/chunk-QZHKN3VN-D9FF492U.js +1 -0
- package/canvas-dist/assets/chunk-QZHKN3VN-DWMbUjXT.js +1 -0
- package/canvas-dist/assets/chunk-QZHKN3VN-l5FBJ77g.js +1 -0
- package/canvas-dist/assets/{chunk-TZMSLE5B-_Ye6r84Y.js → chunk-TZMSLE5B-BASt-UWt.js} +1 -1
- package/canvas-dist/assets/chunk-TZMSLE5B-BCfaZWLT.js +1 -0
- package/canvas-dist/assets/chunk-TZMSLE5B-BKIk_hBR.js +1 -0
- package/canvas-dist/assets/chunk-TZMSLE5B-C4pt-Ir8.js +1 -0
- package/canvas-dist/assets/chunk-TZMSLE5B-DwGlELvo.js +1 -0
- package/canvas-dist/assets/chunk-TZMSLE5B-jJKG-WvJ.js +1 -0
- package/canvas-dist/assets/classDiagram-2ON5EDUG-B7YQfPU4.js +1 -0
- package/canvas-dist/assets/classDiagram-2ON5EDUG-BZ61MaHY.js +1 -0
- package/canvas-dist/assets/classDiagram-2ON5EDUG-CGseYor2.js +1 -0
- package/canvas-dist/assets/classDiagram-2ON5EDUG-CKzOc99J.js +1 -0
- package/canvas-dist/assets/classDiagram-2ON5EDUG-Ce_LPjwW.js +1 -0
- package/canvas-dist/assets/classDiagram-2ON5EDUG-DorPdibv.js +1 -0
- package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-B7YQfPU4.js +1 -0
- package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-BZ61MaHY.js +1 -0
- package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-CGseYor2.js +1 -0
- package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-CKzOc99J.js +1 -0
- package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-Ce_LPjwW.js +1 -0
- package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-DorPdibv.js +1 -0
- package/canvas-dist/assets/clone-74KSto7H.js +1 -0
- package/canvas-dist/assets/clone-CJQgAYVe.js +1 -0
- package/canvas-dist/assets/clone-DLeTuhHE.js +1 -0
- package/canvas-dist/assets/clone-D_IHK_lQ.js +1 -0
- package/canvas-dist/assets/clone-DxMUv1L9.js +1 -0
- package/canvas-dist/assets/clone-UNKf_nED.js +1 -0
- package/canvas-dist/assets/{cose-bilkent-S5V4N54A-2O2oovOj.js → cose-bilkent-S5V4N54A-BTyQiCkr.js} +1 -1
- package/canvas-dist/assets/cose-bilkent-S5V4N54A-BtPAe24N.js +1 -0
- package/canvas-dist/assets/cose-bilkent-S5V4N54A-DIjE7V3m.js +1 -0
- package/canvas-dist/assets/cose-bilkent-S5V4N54A-DKL_BGvE.js +1 -0
- package/canvas-dist/assets/cose-bilkent-S5V4N54A-LZ4OsCLU.js +1 -0
- package/canvas-dist/assets/cose-bilkent-S5V4N54A-XWeJtgga.js +1 -0
- package/canvas-dist/assets/{dagre-6UL2VRFP-gRmGLrEW.js → dagre-6UL2VRFP-BJ2vcFwR.js} +1 -1
- package/canvas-dist/assets/dagre-6UL2VRFP-C1FlE5s8.js +4 -0
- package/canvas-dist/assets/dagre-6UL2VRFP-C3BWFgl6.js +4 -0
- package/canvas-dist/assets/dagre-6UL2VRFP-CUnx73Rf.js +4 -0
- package/canvas-dist/assets/dagre-6UL2VRFP-Do10BY1y.js +4 -0
- package/canvas-dist/assets/dagre-6UL2VRFP-rOZEkrsg.js +4 -0
- package/canvas-dist/assets/{diagram-PSM6KHXK-B7Li-xxw.js → diagram-PSM6KHXK-BGi_qzbq.js} +1 -1
- package/canvas-dist/assets/diagram-PSM6KHXK-C3Nv7h_j.js +24 -0
- package/canvas-dist/assets/diagram-PSM6KHXK-CsMy-r0n.js +24 -0
- package/canvas-dist/assets/diagram-PSM6KHXK-Dj8g7kGt.js +24 -0
- package/canvas-dist/assets/diagram-PSM6KHXK-Dxb1w_7r.js +24 -0
- package/canvas-dist/assets/diagram-PSM6KHXK-kVMBkEyV.js +24 -0
- package/canvas-dist/assets/{diagram-QEK2KX5R-B_NNUAm3.js → diagram-QEK2KX5R-4bsrr1WZ.js} +1 -1
- package/canvas-dist/assets/diagram-QEK2KX5R-Bv7BmKfI.js +43 -0
- package/canvas-dist/assets/diagram-QEK2KX5R-C_FLN6hv.js +43 -0
- package/canvas-dist/assets/diagram-QEK2KX5R-Csuk5L3z.js +43 -0
- package/canvas-dist/assets/diagram-QEK2KX5R-D5Aszgz4.js +43 -0
- package/canvas-dist/assets/diagram-QEK2KX5R-DX58f87l.js +43 -0
- package/canvas-dist/assets/{diagram-S2PKOQOG-NcK-KHaA.js → diagram-S2PKOQOG-1Q7hwiSd.js} +1 -1
- package/canvas-dist/assets/diagram-S2PKOQOG-Bz9Vxi5V.js +24 -0
- package/canvas-dist/assets/diagram-S2PKOQOG-CdWgZIIc.js +24 -0
- package/canvas-dist/assets/diagram-S2PKOQOG-DBicbKFU.js +24 -0
- package/canvas-dist/assets/diagram-S2PKOQOG-DsXKwPtU.js +24 -0
- package/canvas-dist/assets/diagram-S2PKOQOG-L_SMHLXs.js +24 -0
- package/canvas-dist/assets/{erDiagram-Q2GNP2WA-CG7dqzk3.js → erDiagram-Q2GNP2WA-BYu7fh6H.js} +1 -1
- package/canvas-dist/assets/erDiagram-Q2GNP2WA-CvnQ69BF.js +60 -0
- package/canvas-dist/assets/erDiagram-Q2GNP2WA-D3xm-Tdm.js +60 -0
- package/canvas-dist/assets/erDiagram-Q2GNP2WA-DIPpD8sj.js +60 -0
- package/canvas-dist/assets/erDiagram-Q2GNP2WA-DNgu6dMd.js +60 -0
- package/canvas-dist/assets/erDiagram-Q2GNP2WA-Decm8aB4.js +60 -0
- package/canvas-dist/assets/{flowDiagram-NV44I4VS-CBzCj5D6.js → flowDiagram-NV44I4VS-2ymk2kw2.js} +1 -1
- package/canvas-dist/assets/flowDiagram-NV44I4VS-BEPFOt6U.js +162 -0
- package/canvas-dist/assets/flowDiagram-NV44I4VS-BwqXYGfK.js +162 -0
- package/canvas-dist/assets/flowDiagram-NV44I4VS-CS1jax_z.js +162 -0
- package/canvas-dist/assets/flowDiagram-NV44I4VS-DQz5bf7r.js +162 -0
- package/canvas-dist/assets/flowDiagram-NV44I4VS-KW4T1sqF.js +162 -0
- package/canvas-dist/assets/{ganttDiagram-JELNMOA3-CHw-4qJC.js → ganttDiagram-JELNMOA3-B811prZt.js} +1 -1
- package/canvas-dist/assets/ganttDiagram-JELNMOA3-C75pWm7X.js +267 -0
- package/canvas-dist/assets/ganttDiagram-JELNMOA3-CWsbo0fn.js +267 -0
- package/canvas-dist/assets/ganttDiagram-JELNMOA3-CbJozPBN.js +267 -0
- package/canvas-dist/assets/ganttDiagram-JELNMOA3-Co0cFt4c.js +267 -0
- package/canvas-dist/assets/ganttDiagram-JELNMOA3-I4PDqrRh.js +267 -0
- package/canvas-dist/assets/{gitGraphDiagram-V2S2FVAM-Dqrc4wUs.js → gitGraphDiagram-V2S2FVAM-B-z0cLPt.js} +1 -1
- package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-Be40z-LF.js +65 -0
- package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-BejNaAVm.js +65 -0
- package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-BqWDYr0X.js +65 -0
- package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-DSvWGY-e.js +65 -0
- package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-HLYbyNJ5.js +65 -0
- package/canvas-dist/assets/{graph-X9Kzu-pf.js → graph-BE8KKsdf.js} +1 -1
- package/canvas-dist/assets/graph-D6DzzszU.js +1 -0
- package/canvas-dist/assets/graph-DFR8Y_8s.js +1 -0
- package/canvas-dist/assets/graph-Da385cDY.js +1 -0
- package/canvas-dist/assets/graph-MU7gZz2B.js +1 -0
- package/canvas-dist/assets/graph-wjSBJwnf.js +1 -0
- package/canvas-dist/assets/index--ztw-8Rw.js +647 -0
- package/canvas-dist/assets/{index-BQFKo-II.js → index-5TpIM6B1.js} +1 -1
- package/canvas-dist/assets/index-6GBZ9nXN.css +32 -0
- package/canvas-dist/assets/index-BSswTuBk.js +11 -0
- package/canvas-dist/assets/index-BVvhMmjs.js +11 -0
- package/canvas-dist/assets/index-BY92Mj5g.js +572 -0
- package/canvas-dist/assets/index-CV7palC3.js +572 -0
- package/canvas-dist/assets/index-D9bmQGsB.js +11 -0
- package/canvas-dist/assets/index-DDIKkGv8.js +592 -0
- package/canvas-dist/assets/index-Dyo0NkPb.js +574 -0
- package/canvas-dist/assets/index-iQWajCow.js +572 -0
- package/canvas-dist/assets/index-m68YlAMU.js +11 -0
- package/canvas-dist/assets/index-mEoP57az.js +11 -0
- package/canvas-dist/assets/{infoDiagram-HS3SLOUP-CflnZPsm.js → infoDiagram-HS3SLOUP--9BirqgJ.js} +1 -1
- package/canvas-dist/assets/infoDiagram-HS3SLOUP-CSJVED2y.js +2 -0
- package/canvas-dist/assets/infoDiagram-HS3SLOUP-D68HIb2t.js +2 -0
- package/canvas-dist/assets/infoDiagram-HS3SLOUP-DK2VLGGz.js +2 -0
- package/canvas-dist/assets/infoDiagram-HS3SLOUP-PaFhn4yD.js +2 -0
- package/canvas-dist/assets/infoDiagram-HS3SLOUP-zLNG47sU.js +2 -0
- package/canvas-dist/assets/{journeyDiagram-XKPGCS4Q-D2gkCipQ.js → journeyDiagram-XKPGCS4Q-Bue2dR2X.js} +1 -1
- package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-CrgZfpdU.js +139 -0
- package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-DUxWmkkC.js +139 -0
- package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-OTFkv4pd.js +139 -0
- package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-eK2_Zuu3.js +139 -0
- package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-uds5Tz8D.js +139 -0
- package/canvas-dist/assets/{kanban-definition-3W4ZIXB7-CtLLz4o8.js → kanban-definition-3W4ZIXB7-BETdiI7I.js} +1 -1
- package/canvas-dist/assets/kanban-definition-3W4ZIXB7-BdVh7KdN.js +89 -0
- package/canvas-dist/assets/kanban-definition-3W4ZIXB7-Cxl8UM9S.js +89 -0
- package/canvas-dist/assets/kanban-definition-3W4ZIXB7-DVPlx3I2.js +89 -0
- package/canvas-dist/assets/kanban-definition-3W4ZIXB7-LtNWeoYB.js +89 -0
- package/canvas-dist/assets/kanban-definition-3W4ZIXB7-uvhEMvyE.js +89 -0
- package/canvas-dist/assets/{layout-CjvV_Dms.js → layout-1OzszN14.js} +1 -1
- package/canvas-dist/assets/layout-CJSupFcF.js +1 -0
- package/canvas-dist/assets/layout-DFRmxN_c.js +1 -0
- package/canvas-dist/assets/layout-DSu-zk7y.js +1 -0
- package/canvas-dist/assets/layout-TGcrvApd.js +1 -0
- package/canvas-dist/assets/layout-eStc8SYK.js +1 -0
- package/canvas-dist/assets/{linear-D3cIYHoS.js → linear-9qlE6xa7.js} +1 -1
- package/canvas-dist/assets/linear-CBfFWnLD.js +1 -0
- package/canvas-dist/assets/linear-Cv4ai8Hq.js +1 -0
- package/canvas-dist/assets/linear-DDzz65E6.js +1 -0
- package/canvas-dist/assets/linear-wbIqhwDf.js +1 -0
- package/canvas-dist/assets/linear-wyNKl76F.js +1 -0
- package/canvas-dist/assets/{mindmap-definition-VGOIOE7T-DSgjVg-P.js → mindmap-definition-VGOIOE7T-3l4YzhEM.js} +1 -1
- package/canvas-dist/assets/mindmap-definition-VGOIOE7T-B-KkpNlw.js +68 -0
- package/canvas-dist/assets/mindmap-definition-VGOIOE7T-DHMHWgmT.js +68 -0
- package/canvas-dist/assets/mindmap-definition-VGOIOE7T-Dqfyg4Z2.js +68 -0
- package/canvas-dist/assets/mindmap-definition-VGOIOE7T-NeRYOzsq.js +68 -0
- package/canvas-dist/assets/mindmap-definition-VGOIOE7T-xyu628P9.js +68 -0
- package/canvas-dist/assets/{pieDiagram-ADFJNKIX-B_lYaGFj.js → pieDiagram-ADFJNKIX-BWNzVAGj.js} +1 -1
- package/canvas-dist/assets/pieDiagram-ADFJNKIX-Bm3PXYs-.js +30 -0
- package/canvas-dist/assets/pieDiagram-ADFJNKIX-BvvN7VvQ.js +30 -0
- package/canvas-dist/assets/pieDiagram-ADFJNKIX-BwU7AN7W.js +30 -0
- package/canvas-dist/assets/pieDiagram-ADFJNKIX-CHgwWCaM.js +30 -0
- package/canvas-dist/assets/pieDiagram-ADFJNKIX-DlZc8YOh.js +30 -0
- package/canvas-dist/assets/{quadrantDiagram-AYHSOK5B-DLZLTJe3.js → quadrantDiagram-AYHSOK5B-B-Zd8OFp.js} +1 -1
- package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-B1CnJyxI.js +7 -0
- package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-C0Qo00b9.js +7 -0
- package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-C9bx3nEJ.js +7 -0
- package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-UHENkiRO.js +7 -0
- package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-jKfurTPU.js +7 -0
- package/canvas-dist/assets/{requirementDiagram-UZGBJVZJ-CZE26rhL.js → requirementDiagram-UZGBJVZJ-BPpNNusD.js} +1 -1
- package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-BwZF1NIK.js +64 -0
- package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-CaT3Frtk.js +64 -0
- package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-Dfoz7R_7.js +64 -0
- package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-DsrX4TT-.js +64 -0
- package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-dmouSXOl.js +64 -0
- package/canvas-dist/assets/{sankeyDiagram-TZEHDZUN-DQMRJAPV.js → sankeyDiagram-TZEHDZUN-BEy-A1Fu.js} +1 -1
- package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-BViMBiAQ.js +10 -0
- package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-BqrM-qWN.js +10 -0
- package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-DRkRC9qB.js +10 -0
- package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-DbuzKCtn.js +10 -0
- package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-_aHMKbpw.js +10 -0
- package/canvas-dist/assets/{sequenceDiagram-WL72ISMW-BY723FEn.js → sequenceDiagram-WL72ISMW-B8FOaL2Q.js} +1 -1
- package/canvas-dist/assets/sequenceDiagram-WL72ISMW-C02NQwOB.js +145 -0
- package/canvas-dist/assets/sequenceDiagram-WL72ISMW-CgyHivPj.js +145 -0
- package/canvas-dist/assets/sequenceDiagram-WL72ISMW-CzW1WaEm.js +145 -0
- package/canvas-dist/assets/sequenceDiagram-WL72ISMW-DJhHI1pe.js +145 -0
- package/canvas-dist/assets/sequenceDiagram-WL72ISMW-VFkpAeoG.js +145 -0
- package/canvas-dist/assets/{stateDiagram-FKZM4ZOC-C_UdOFhy.js → stateDiagram-FKZM4ZOC-BSqFX4PJ.js} +1 -1
- package/canvas-dist/assets/stateDiagram-FKZM4ZOC-BnXhhxkN.js +1 -0
- package/canvas-dist/assets/stateDiagram-FKZM4ZOC-ClARVrvt.js +1 -0
- package/canvas-dist/assets/stateDiagram-FKZM4ZOC-CuC6xesY.js +1 -0
- package/canvas-dist/assets/stateDiagram-FKZM4ZOC-DcAiGjph.js +1 -0
- package/canvas-dist/assets/stateDiagram-FKZM4ZOC-aBg0hjTp.js +1 -0
- package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-8fib9ftc.js +1 -0
- package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-B-DO0ZqO.js +1 -0
- package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-BksbsE4k.js +1 -0
- package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-C2DJCNPK.js +1 -0
- package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-CeA5jba6.js +1 -0
- package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-zsAyq0tK.js +1 -0
- package/canvas-dist/assets/{timeline-definition-IT6M3QCI-DkrJqww0.js → timeline-definition-IT6M3QCI-BaHdYD2h.js} +1 -1
- package/canvas-dist/assets/timeline-definition-IT6M3QCI-Bl2hg8IM.js +61 -0
- package/canvas-dist/assets/timeline-definition-IT6M3QCI-CrVwLiGm.js +61 -0
- package/canvas-dist/assets/timeline-definition-IT6M3QCI-DrXGRjnB.js +61 -0
- package/canvas-dist/assets/timeline-definition-IT6M3QCI-cYAwshf6.js +61 -0
- package/canvas-dist/assets/timeline-definition-IT6M3QCI-flyL0y-3.js +61 -0
- package/canvas-dist/assets/{treemap-GDKQZRPO-B-6bMZqD.js → treemap-GDKQZRPO-C4Hg8kJ_.js} +1 -1
- package/canvas-dist/assets/treemap-GDKQZRPO-DVY2G9qY.js +162 -0
- package/canvas-dist/assets/treemap-GDKQZRPO-DpLWPA1z.js +162 -0
- package/canvas-dist/assets/treemap-GDKQZRPO-Ds86cUVw.js +162 -0
- package/canvas-dist/assets/treemap-GDKQZRPO-DwmoI6tH.js +162 -0
- package/canvas-dist/assets/treemap-GDKQZRPO-SsGFkgVd.js +162 -0
- package/canvas-dist/assets/{xychartDiagram-PRI3JC2R-DkBhUy_D.js → xychartDiagram-PRI3JC2R-B9c1iLBf.js} +1 -1
- package/canvas-dist/assets/xychartDiagram-PRI3JC2R-BpX6MPWa.js +7 -0
- package/canvas-dist/assets/xychartDiagram-PRI3JC2R-CEgW_j0p.js +7 -0
- package/canvas-dist/assets/xychartDiagram-PRI3JC2R-CSEFGEQX.js +7 -0
- package/canvas-dist/assets/xychartDiagram-PRI3JC2R-CnG4XoMc.js +7 -0
- package/canvas-dist/assets/xychartDiagram-PRI3JC2R-Dftj3Bt3.js +7 -0
- package/canvas-dist/index.html +3 -2
- package/package.json +2 -1
- package/src/protocol.js +1 -1
- package/src/protocol.test.js +1 -1
- package/src/pty-manager.js +281 -0
- package/src/pty-manager.test.js +212 -0
- package/src/router.js +31 -1
- package/src/router.test.js +1 -1
- package/src/sdk-e2e.test.js +101 -0
- package/src/server.e2e.test.js +804 -138
- package/src/server.js +1273 -137
- package/src/session-store.js +260 -0
- package/src/session-store.test.js +235 -0
- package/src/templates.js +1 -1
- package/src/templates.test.js +1 -1
- package/src/terminal.js +3 -3
- package/src/terminal.test.js +12 -12
- package/src/visual-interceptor.js +450 -0
- package/src/visual-interceptor.test.js +943 -0
- package/src/workshop-parser.js +251 -0
- package/src/workshop-parser.test.js +179 -0
- package/templates/celebrate.html +1 -1
- package/templates/code-playground.html +1 -1
- package/templates/dashboard.html +7 -8
- package/templates/diagram-architecture.html +1 -1
- package/templates/diagram-flow.html +1 -1
- package/templates/diagram-mermaid.html +1 -1
- package/templates/game-speed-round.html +1 -1
- package/templates/quiz-drag-order.html +1 -1
- package/templates/quiz-fill-blank.html +1 -1
- package/templates/quiz-matching.html +1 -1
- package/templates/quiz-timed-choice.html +1 -1
- package/templates/welcome.html +7 -7
- package/canvas-dist/assets/channel-BzJVlie3.js +0 -1
- package/canvas-dist/assets/classDiagram-2ON5EDUG-BTs-zEmB.js +0 -1
- package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-BTs-zEmB.js +0 -1
- package/canvas-dist/assets/clone-CXEfuXmc.js +0 -1
- package/canvas-dist/assets/index-DJ49c6u-.js +0 -426
- 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
|
+
});
|
package/templates/celebrate.html
CHANGED
|
@@ -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>
|
|
6
|
+
<title>Socrates — Code Playground</title>
|
|
7
7
|
<style>
|
|
8
8
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
9
9
|
body {
|
package/templates/dashboard.html
CHANGED
|
@@ -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>
|
|
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>
|
|
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
|
-
|
|
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>
|
|
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>
|
|
6
|
+
<title>Socrates — Fill in the Blank</title>
|
|
7
7
|
<style>
|
|
8
8
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
9
9
|
body {
|
package/templates/welcome.html
CHANGED
|
@@ -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>
|
|
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
|
|
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>
|
|
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>
|
|
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
|
|
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
|
|
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>
|
|
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};
|