excalidrop 0.1.4 → 0.2.2

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 (223) hide show
  1. package/README.md +70 -125
  2. package/dist/cli.d.ts +7 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +936 -389
  5. package/dist/cli.js.map +1 -1
  6. package/dist/frontend/assets/{advancedFormat-tiBAHNGo.js → advancedFormat-Be4KR5mp.js} +1 -1
  7. package/dist/frontend/assets/{ar-SA-G6X2FPQ2-DVxiWV5Z.js → ar-SA-G6X2FPQ2-B6ekz3Ba.js} +1 -1
  8. package/dist/frontend/assets/arc-DlgXyGPj.js +1 -0
  9. package/dist/frontend/assets/{az-AZ-76LH7QW2-Z_2BqDo-.js → az-AZ-76LH7QW2-01MDUsF0.js} +1 -1
  10. package/dist/frontend/assets/{bg-BG-XCXSNQG7-DrxGJZOG.js → bg-BG-XCXSNQG7--fArB8Ao.js} +1 -1
  11. package/dist/frontend/assets/{blockDiagram-38ab4fdb-CDnkTFfP.js → blockDiagram-38ab4fdb-CmsVhOwi.js} +1 -1
  12. package/dist/frontend/assets/{blockDiagram-68f4deed-Bb0W6mxN.js → blockDiagram-68f4deed-DU_wNYlO.js} +6 -6
  13. package/dist/frontend/assets/{bn-BD-2XOGV67Q-BkGJ-w8k.js → bn-BD-2XOGV67Q-h8juqzfQ.js} +1 -1
  14. package/dist/frontend/assets/{c4Diagram-15b5d702-ByRV0tka.js → c4Diagram-15b5d702-ClZalz0L.js} +1 -1
  15. package/dist/frontend/assets/{c4Diagram-3d4e48cf-QSVnzYYK.js → c4Diagram-3d4e48cf-BkFVM0tP.js} +1 -1
  16. package/dist/frontend/assets/{ca-ES-6MX7JW3Y-BBJvOPE1.js → ca-ES-6MX7JW3Y-DMBR3qVX.js} +1 -1
  17. package/dist/frontend/assets/channel-BxFR7168.js +1 -0
  18. package/dist/frontend/assets/{classDiagram-70f12bd4-DDFBNGUt.js → classDiagram-70f12bd4-BXAJnakg.js} +1 -1
  19. package/dist/frontend/assets/{classDiagram-d40c83e7-cgC3s7Nz.js → classDiagram-d40c83e7-DVhipa45.js} +1 -1
  20. package/dist/frontend/assets/classDiagram-v2-d5a6b087-CiHMsbhj.js +2 -0
  21. package/dist/frontend/assets/{classDiagram-v2-f2320105-Dtywkpeg.js → classDiagram-v2-f2320105-1CqIxWOB.js} +2 -2
  22. package/dist/frontend/assets/clone-CMl85WSi.js +1 -0
  23. package/dist/frontend/assets/{createText-2e5e7dd3-CqY00v-4.js → createText-2e5e7dd3-D3kSz3YE.js} +1 -1
  24. package/dist/frontend/assets/{createText-d213de94-D59sBfqq.js → createText-d213de94-DvJeLlQX.js} +4 -4
  25. package/dist/frontend/assets/{cs-CZ-2BRQDIVT-CK09MAsg.js → cs-CZ-2BRQDIVT-BUcdPrAr.js} +1 -1
  26. package/dist/frontend/assets/{cytoscape-cose-bilkent-CKy_tuGZ.js → cytoscape-cose-bilkent-CKoSm_2z.js} +1 -1
  27. package/dist/frontend/assets/{da-DK-5WZEPLOC-V4hdLKuT.js → da-DK-5WZEPLOC-C1nkchuC.js} +1 -1
  28. package/dist/frontend/assets/{de-DE-XR44H4JA-Dw8qkP9g.js → de-DE-XR44H4JA-DO2_bO1X.js} +1 -1
  29. package/dist/frontend/assets/{edges-332bd1c7-D-u0KMZB.js → edges-332bd1c7-C5qM1sDU.js} +1 -1
  30. package/dist/frontend/assets/{edges-e0da2a9e-B3UFqLqY.js → edges-e0da2a9e-BRt7qomS.js} +1 -1
  31. package/dist/frontend/assets/{el-GR-BZB4AONW-BUdBQbYg.js → el-GR-BZB4AONW-CrjSdaU2.js} +1 -1
  32. package/dist/frontend/assets/{elk.bundled-BZA3Xcoo.js → elk.bundled-Dmec6Rq6.js} +1 -1
  33. package/dist/frontend/assets/{erDiagram-880f2ed8-CNxm7e1x.js → erDiagram-880f2ed8-BI7kP523.js} +4 -4
  34. package/dist/frontend/assets/{erDiagram-9861fffd-C2u_ziAM.js → erDiagram-9861fffd-DMyCDrgI.js} +1 -1
  35. package/dist/frontend/assets/{es-ES-U4NZUMDT-DS0FAZqX.js → es-ES-U4NZUMDT-rrdjPi-M.js} +1 -1
  36. package/dist/frontend/assets/{eu-ES-A7QVB2H4-D-D5uidc.js → eu-ES-A7QVB2H4-uYn3S3D5.js} +1 -1
  37. package/dist/frontend/assets/{fa-IR-HGAKTJCU-mAW_2-jg.js → fa-IR-HGAKTJCU-DWW_BVFR.js} +1 -1
  38. package/dist/frontend/assets/{fi-FI-Z5N7JZ37-B9mW6nxS.js → fi-FI-Z5N7JZ37-CMXxeZ4W.js} +1 -1
  39. package/dist/frontend/assets/{flowDb-7c981674-6JB2gd0I.js → flowDb-7c981674-Dsj6xMzr.js} +1 -1
  40. package/dist/frontend/assets/{flowDb-956e92f1-BbpkWRi7.js → flowDb-956e92f1-26g7kJju.js} +1 -1
  41. package/dist/frontend/assets/{flowDiagram-66a62f08-DrhrQuXc.js → flowDiagram-66a62f08-C9eQZtdf.js} +1 -1
  42. package/dist/frontend/assets/{flowDiagram-cbd28bf7-BmNY7bvJ.js → flowDiagram-cbd28bf7-D051xFrI.js} +3 -3
  43. package/dist/frontend/assets/flowDiagram-v2-96b9c2cf-DIa4RdMh.js +1 -0
  44. package/dist/frontend/assets/flowDiagram-v2-ffc7f31a-CnvFT8HV.js +1 -0
  45. package/dist/frontend/assets/{flowchart-elk-definition-36e2d292-4G1YiIlk.js → flowchart-elk-definition-36e2d292-C9fsvhV-.js} +2 -2
  46. package/dist/frontend/assets/{flowchart-elk-definition-4a651766-Cm94SrrQ.js → flowchart-elk-definition-4a651766-BkVNuJOw.js} +1 -1
  47. package/dist/frontend/assets/{fr-FR-RHASNOE6-BXnmUxTA.js → fr-FR-RHASNOE6-DIfK_rjW.js} +1 -1
  48. package/dist/frontend/assets/{ganttDiagram-04f9e578-X0BweAnG.js → ganttDiagram-04f9e578-CZeF2a4Y.js} +1 -1
  49. package/dist/frontend/assets/{ganttDiagram-c361ad54-D3vxZ5MQ.js → ganttDiagram-c361ad54-DbkIZ-wU.js} +1 -1
  50. package/dist/frontend/assets/{gitGraphDiagram-21fc4d3e-wznrpRWn.js → gitGraphDiagram-21fc4d3e-CLqlSEuE.js} +6 -6
  51. package/dist/frontend/assets/{gitGraphDiagram-72cf32ee-B9zCS3Pw.js → gitGraphDiagram-72cf32ee-Cvf9uYWB.js} +1 -1
  52. package/dist/frontend/assets/{gl-ES-HMX3MZ6V-CrUx-ab6.js → gl-ES-HMX3MZ6V-CCxCH2oK.js} +1 -1
  53. package/dist/frontend/assets/{graph-BQZ6SIVr.js → graph-MptL1QoF.js} +1 -1
  54. package/dist/frontend/assets/{graph-Cda8xSTx.js → graph-Mzuu2QFH.js} +1 -1
  55. package/dist/frontend/assets/{he-IL-6SHJWFNN-D33eaw6-.js → he-IL-6SHJWFNN-CJuJutJZ.js} +1 -1
  56. package/dist/frontend/assets/{hi-IN-IWLTKZ5I-DEnStF-g.js → hi-IN-IWLTKZ5I-BORPH6vU.js} +1 -1
  57. package/dist/frontend/assets/{hu-HU-A5ZG7DT2-BjH2w8Sn.js → hu-HU-A5ZG7DT2-Dr7UDbjo.js} +1 -1
  58. package/dist/frontend/assets/{id-ID-SAP4L64H-Bc6R-JEz.js → id-ID-SAP4L64H-D0Widkq7.js} +1 -1
  59. package/dist/frontend/assets/{index-3862675e-CpYfS3Db.js → index-3862675e-DVT5-vN2.js} +1 -1
  60. package/dist/frontend/assets/{index-6079d271-Y2bgyRpa.js → index-6079d271-R4KRnW5Z.js} +1 -1
  61. package/dist/frontend/assets/{index-D7eYnAQp.js → index-B45XzZiR.js} +4 -4
  62. package/dist/frontend/assets/index-Bd-8869C.js +349 -0
  63. package/dist/frontend/assets/{infoDiagram-4a4f5b27-Bm3Oq-Rq.js → infoDiagram-4a4f5b27-BvY1qS17.js} +3 -3
  64. package/dist/frontend/assets/{infoDiagram-f8f76790-oNVitBKM.js → infoDiagram-f8f76790-D60YvG33.js} +1 -1
  65. package/dist/frontend/assets/{it-IT-JPQ66NNP-BcxQABF2.js → it-IT-JPQ66NNP-C08Vu0BG.js} +1 -1
  66. package/dist/frontend/assets/{ja-JP-DBVTYXUO-D1zIM-nt.js → ja-JP-DBVTYXUO-Ciu7LaRi.js} +1 -1
  67. package/dist/frontend/assets/{journeyDiagram-29694f62-CamPk_3P.js → journeyDiagram-29694f62-DvrnJXsd.js} +5 -5
  68. package/dist/frontend/assets/{journeyDiagram-49397b02-D6w3tLtf.js → journeyDiagram-49397b02-Dy9LU86E.js} +1 -1
  69. package/dist/frontend/assets/{kaa-6HZHGXH3-CoILysVg.js → kaa-6HZHGXH3-GhGTIjpu.js} +1 -1
  70. package/dist/frontend/assets/{kab-KAB-ZGHBKWFO-B9ZbybBt.js → kab-KAB-ZGHBKWFO-B3q4BqYw.js} +1 -1
  71. package/dist/frontend/assets/{kk-KZ-P5N5QNE5-Dxi4GIQ7.js → kk-KZ-P5N5QNE5-GWoLZvco.js} +1 -1
  72. package/dist/frontend/assets/{km-KH-HSX4SM5Z-DaJ7EtO2.js → km-KH-HSX4SM5Z-CnAQJCYr.js} +1 -1
  73. package/dist/frontend/assets/{ko-KR-MTYHY66A-DG57Ah12.js → ko-KR-MTYHY66A-B2Rh9krp.js} +1 -1
  74. package/dist/frontend/assets/{ku-TR-6OUDTVRD-DnDf9E8a.js → ku-TR-6OUDTVRD-C27elmON.js} +1 -1
  75. package/dist/frontend/assets/{layout-Drr-66M9.js → layout-D1hl6oKi.js} +1 -1
  76. package/dist/frontend/assets/{layout-BsWfhUAF.js → layout-c-hOA8zE.js} +1 -1
  77. package/dist/frontend/assets/{line-DwQObOhP.js → line-DtMz1ssZ.js} +1 -1
  78. package/dist/frontend/assets/{linear-C36MjJps.js → linear-D-Y4WtO_.js} +1 -1
  79. package/dist/frontend/assets/{lt-LT-XHIRWOB4-D_zqS0yg.js → lt-LT-XHIRWOB4-B6jd693w.js} +1 -1
  80. package/dist/frontend/assets/{lv-LV-5QDEKY6T-owIsIh1b.js → lv-LV-5QDEKY6T-sXB-8i6R.js} +1 -1
  81. package/dist/frontend/assets/{mindmap-definition-ac74a2e8-Cf9JbrBJ.js → mindmap-definition-ac74a2e8-CawO9I_f.js} +6 -6
  82. package/dist/frontend/assets/{mindmap-definition-fc14e90a-BpsNCNCp.js → mindmap-definition-fc14e90a-CXMNA68v.js} +4 -4
  83. package/dist/frontend/assets/{mr-IN-CRQNXWMA-CS9XUj74.js → mr-IN-CRQNXWMA-BJ6QSiPi.js} +1 -1
  84. package/dist/frontend/assets/{my-MM-5M5IBNSE-BKB060k9.js → my-MM-5M5IBNSE-BMdOIRP5.js} +1 -1
  85. package/dist/frontend/assets/{nb-NO-T6EIAALU-CkmLUrvm.js → nb-NO-T6EIAALU-BVG6JUMN.js} +1 -1
  86. package/dist/frontend/assets/{nl-NL-IS3SIHDZ-DdiLyJoz.js → nl-NL-IS3SIHDZ-ZprCvTYR.js} +1 -1
  87. package/dist/frontend/assets/{nn-NO-6E72VCQL-Yevp6f_Y.js → nn-NO-6E72VCQL-CcljFAGy.js} +1 -1
  88. package/dist/frontend/assets/{oc-FR-POXYY2M6-D_M6GHup.js → oc-FR-POXYY2M6-zCuu6Ns2.js} +1 -1
  89. package/dist/frontend/assets/{pa-IN-N4M65BXN-1vuACN9n.js → pa-IN-N4M65BXN-D_iftL9v.js} +1 -1
  90. package/dist/frontend/assets/{pica-DDDx0iqx.js → pica-DsW4eP6T.js} +1 -1
  91. package/dist/frontend/assets/{pie-CFIpuQMO.js → pie-U_uHwWsL.js} +1 -1
  92. package/dist/frontend/assets/{pieDiagram-421022e6-DO7e_Qgw.js → pieDiagram-421022e6-naaI7HiE.js} +5 -5
  93. package/dist/frontend/assets/{pieDiagram-8a3498a8-BEoqChXo.js → pieDiagram-8a3498a8-m6nTf1O_.js} +1 -1
  94. package/dist/frontend/assets/{pl-PL-T2D74RX3-Cc6Q5nSh.js → pl-PL-T2D74RX3-CRQQfZUe.js} +1 -1
  95. package/dist/frontend/assets/{pt-BR-5N22H2LF-3eEiAax3.js → pt-BR-5N22H2LF-DLvfG7RR.js} +1 -1
  96. package/dist/frontend/assets/{pt-PT-UZXXM6DQ-CgnF0Le7.js → pt-PT-UZXXM6DQ-Chkg6-JC.js} +1 -1
  97. package/dist/frontend/assets/{quadrantDiagram-0957ecba-C1Eo-ZUY.js → quadrantDiagram-0957ecba-BJR82kAx.js} +3 -3
  98. package/dist/frontend/assets/{quadrantDiagram-120e2f19-Bdfsl_O7.js → quadrantDiagram-120e2f19-CsWgLp5e.js} +1 -1
  99. package/dist/frontend/assets/relay-BSVGqyIy.js +2 -0
  100. package/dist/frontend/assets/{requirementDiagram-23d650b8-DiOK6QW3.js → requirementDiagram-23d650b8-CHmg-ycX.js} +1 -1
  101. package/dist/frontend/assets/{requirementDiagram-deff3bca-BDJ-7T4h.js → requirementDiagram-deff3bca-LIsyxsZZ.js} +1 -1
  102. package/dist/frontend/assets/{ro-RO-JPDTUUEW-CbJ3IB7a.js → ro-RO-JPDTUUEW-B_a5A5-x.js} +1 -1
  103. package/dist/frontend/assets/{ru-RU-B4JR7IUQ-PQGmeGG4.js → ru-RU-B4JR7IUQ-CY5sI1Ru.js} +1 -1
  104. package/dist/frontend/assets/{sankeyDiagram-04a897e0-DV25bgN2.js → sankeyDiagram-04a897e0-DN5e16d0.js} +1 -1
  105. package/dist/frontend/assets/{sankeyDiagram-23345273-szSb_Sei.js → sankeyDiagram-23345273-BBjQCtHz.js} +1 -1
  106. package/dist/frontend/assets/{selectAll-DsrPvhqV.js → selectAll-Dcq-dC_E.js} +1 -1
  107. package/dist/frontend/assets/{sequenceDiagram-17ac3bff-Dg88bSlc.js → sequenceDiagram-17ac3bff-CIXyQiN6.js} +1 -1
  108. package/dist/frontend/assets/{sequenceDiagram-704730f1-DRIjLCxx.js → sequenceDiagram-704730f1-BmDwBhsF.js} +1 -1
  109. package/dist/frontend/assets/{si-LK-N5RQ5JYF-BtIIudm3.js → si-LK-N5RQ5JYF-DEPKL_1i.js} +1 -1
  110. package/dist/frontend/assets/{sk-SK-C5VTKIMK-CIwXticU.js → sk-SK-C5VTKIMK-XqrGDM2K.js} +1 -1
  111. package/dist/frontend/assets/{sl-SI-NN7IZMDC-CXEdg57y.js → sl-SI-NN7IZMDC-Dia3d1Yy.js} +1 -1
  112. package/dist/frontend/assets/{stateDiagram-587899a1-BwRwgRo6.js → stateDiagram-587899a1-CY1BCaUa.js} +1 -1
  113. package/dist/frontend/assets/{stateDiagram-9c5f0230-C8n96rER.js → stateDiagram-9c5f0230-gyjWQtSe.js} +1 -1
  114. package/dist/frontend/assets/{stateDiagram-v2-51a3dcff-B7e5E4J7.js → stateDiagram-v2-51a3dcff-CAIiXqRE.js} +1 -1
  115. package/dist/frontend/assets/{stateDiagram-v2-d93cdb3a-B18iZQLw.js → stateDiagram-v2-d93cdb3a-DvUpzRiQ.js} +1 -1
  116. package/dist/frontend/assets/{styles-2ab5d517-CfWubwio.js → styles-2ab5d517-BE3yBf4Z.js} +3 -3
  117. package/dist/frontend/assets/{styles-5f03d8d2-C-_n19AB.js → styles-5f03d8d2-CGBEZiW_.js} +3 -3
  118. package/dist/frontend/assets/{styles-6aaf32cf-Dh-DHkVP.js → styles-6aaf32cf-JdIhb4_Y.js} +1 -1
  119. package/dist/frontend/assets/{styles-9a916d00-Boy0hUEG.js → styles-9a916d00-DRmxoyEF.js} +1 -1
  120. package/dist/frontend/assets/{styles-c10674c1-BfxiK3Ns.js → styles-c10674c1-C3TEvIjw.js} +1 -1
  121. package/dist/frontend/assets/{styles-edf9a4b0-T7mKViRF.js → styles-edf9a4b0-B_FeyXdP.js} +1 -1
  122. package/dist/frontend/assets/subset-shared.chunk.js +9 -9
  123. package/dist/frontend/assets/subset-worker.chunk.js +1 -1
  124. package/dist/frontend/assets/{sv-SE-XGPEYMSR-dVrUAqld.js → sv-SE-XGPEYMSR-CBrvnOWh.js} +1 -1
  125. package/dist/frontend/assets/{svgDrawCommon-08f97a94-fsWk6SQc.js → svgDrawCommon-08f97a94-DI4ZG6xI.js} +1 -1
  126. package/dist/frontend/assets/{svgDrawCommon-3ba9043b-BJ8X3qS-.js → svgDrawCommon-3ba9043b-Dl5HsA0X.js} +1 -1
  127. package/dist/frontend/assets/{ta-IN-2NMHFXQM-CtVVZfIT.js → ta-IN-2NMHFXQM-DGYl9sGK.js} +1 -1
  128. package/dist/frontend/assets/{th-TH-HPSO5L25-Do90CyDN.js → th-TH-HPSO5L25-Bq3K3L0F.js} +1 -1
  129. package/dist/frontend/assets/{timeline-definition-7e6b55e7-D_iHA485.js → timeline-definition-7e6b55e7-DWL-fZtL.js} +3 -3
  130. package/dist/frontend/assets/{timeline-definition-85554ec2-nhT8QMsO.js → timeline-definition-85554ec2-C14kwDFd.js} +1 -1
  131. package/dist/frontend/assets/{tr-TR-DEFEU3FU-MfR-IQke.js → tr-TR-DEFEU3FU-CSwI35xw.js} +1 -1
  132. package/dist/frontend/assets/{uk-UA-QMV73CPH-CPet8B1O.js → uk-UA-QMV73CPH-Dxy7prmb.js} +1 -1
  133. package/dist/frontend/assets/{union-BgYwhB7T.js → union-DQ7m6Pel.js} +1 -1
  134. package/dist/frontend/assets/{vi-VN-M7AON7JQ-3HD06T_8.js → vi-VN-M7AON7JQ-BNyYTgjT.js} +1 -1
  135. package/dist/frontend/assets/{xychartDiagram-b6496bcd-D5vSaFT2.js → xychartDiagram-b6496bcd-DWKYL0ZD.js} +4 -4
  136. package/dist/frontend/assets/{xychartDiagram-e933f94c-DLIHXsUi.js → xychartDiagram-e933f94c-Bw4brW9l.js} +1 -1
  137. package/dist/frontend/assets/youtubeResume-DPG81gOQ.js +1 -0
  138. package/dist/frontend/assets/{zh-CN-LNUGB5OW-t2RyWPw2.js → zh-CN-LNUGB5OW-BNhZCPEt.js} +1 -1
  139. package/dist/frontend/assets/{zh-HK-E62DVLB3-Bj22hc7e.js → zh-HK-E62DVLB3-D_rDALSq.js} +1 -1
  140. package/dist/frontend/assets/{zh-TW-RAJ6MFWO-CBRhqhU1.js → zh-TW-RAJ6MFWO-rUlbmCTA.js} +1 -1
  141. package/dist/frontend/assets/zipObject-Db5-6vIz.js +1 -0
  142. package/dist/frontend/index.html +172 -236
  143. package/dist/{index.d.ts → mcp.d.ts} +1 -1
  144. package/dist/mcp.d.ts.map +1 -0
  145. package/dist/mcp.js +1183 -0
  146. package/dist/mcp.js.map +1 -0
  147. package/package.json +19 -34
  148. package/skills/excalidraw-skill/SKILL.md +42 -55
  149. package/skills/excalidraw-skill/references/cheatsheet.md +23 -56
  150. package/skills/excalidraw-skill/scripts/clear-canvas.cjs +9 -32
  151. package/skills/excalidraw-skill/scripts/create-element.cjs +18 -61
  152. package/skills/excalidraw-skill/scripts/delete-element.cjs +12 -42
  153. package/skills/excalidraw-skill/scripts/export-elements.cjs +17 -44
  154. package/skills/excalidraw-skill/scripts/gh-helper.cjs +58 -0
  155. package/skills/excalidraw-skill/scripts/healthcheck.cjs +8 -29
  156. package/skills/excalidraw-skill/scripts/import-elements.cjs +20 -70
  157. package/skills/excalidraw-skill/scripts/update-element.cjs +19 -63
  158. package/tsconfig.json +3 -2
  159. package/vite.config.js +3 -10
  160. package/dist/frontend/assets/arc-Cc3ncJ1n.js +0 -1
  161. package/dist/frontend/assets/channel-BQSIb3i3.js +0 -1
  162. package/dist/frontend/assets/classDiagram-v2-d5a6b087-BgB8AG2e.js +0 -2
  163. package/dist/frontend/assets/clone-BoZziNL9.js +0 -1
  164. package/dist/frontend/assets/flowDiagram-v2-96b9c2cf-Z3H2d3Wj.js +0 -1
  165. package/dist/frontend/assets/flowDiagram-v2-ffc7f31a-CIQOMghC.js +0 -1
  166. package/dist/frontend/assets/index-DIz4WrSB.js +0 -349
  167. package/dist/frontend/assets/zipObject-DMfHW2o8.js +0 -1
  168. package/dist/index.d.ts.map +0 -1
  169. package/dist/index.js +0 -2279
  170. package/dist/index.js.map +0 -1
  171. package/dist/remote.d.ts +0 -5
  172. package/dist/remote.d.ts.map +0 -1
  173. package/dist/remote.js +0 -129
  174. package/dist/remote.js.map +0 -1
  175. package/dist/server.d.ts +0 -4
  176. package/dist/server.d.ts.map +0 -1
  177. package/dist/server.js +0 -1208
  178. package/dist/server.js.map +0 -1
  179. package/dist/target.d.ts +0 -38
  180. package/dist/target.d.ts.map +0 -1
  181. package/dist/target.js +0 -225
  182. package/dist/target.js.map +0 -1
  183. package/dist/types.d.ts +0 -228
  184. package/dist/types.d.ts.map +0 -1
  185. package/dist/types.js +0 -45
  186. package/dist/types.js.map +0 -1
  187. package/dist/utils/auth.d.ts +0 -14
  188. package/dist/utils/auth.d.ts.map +0 -1
  189. package/dist/utils/auth.js +0 -67
  190. package/dist/utils/auth.js.map +0 -1
  191. package/dist/utils/github.d.ts +0 -24
  192. package/dist/utils/github.d.ts.map +0 -1
  193. package/dist/utils/github.js +0 -132
  194. package/dist/utils/github.js.map +0 -1
  195. package/dist/utils/logger.d.ts +0 -4
  196. package/dist/utils/logger.d.ts.map +0 -1
  197. package/dist/utils/logger.js +0 -25
  198. package/dist/utils/logger.js.map +0 -1
  199. package/dist/utils/r2store.d.ts +0 -12
  200. package/dist/utils/r2store.d.ts.map +0 -1
  201. package/dist/utils/r2store.js +0 -75
  202. package/dist/utils/r2store.js.map +0 -1
  203. package/frontend/drop.png +0 -0
  204. package/frontend/index.html +0 -339
  205. package/frontend/src/App.tsx +0 -1091
  206. package/frontend/src/main.tsx +0 -15
  207. package/frontend/src/utils/ghSync.ts +0 -234
  208. package/frontend/src/utils/mermaidConverter.ts +0 -43
  209. package/frontend/src/utils/webmcp.ts +0 -265
  210. package/scripts/check-local-bind.mjs +0 -164
  211. package/scripts/postinstall.mjs +0 -23
  212. package/scripts/publish-pages.sh +0 -39
  213. package/scripts/seed-r2.mjs +0 -9
  214. package/src/cli.ts +0 -528
  215. package/src/index.ts +0 -2538
  216. package/src/remote.ts +0 -92
  217. package/src/server.ts +0 -1349
  218. package/src/target.ts +0 -198
  219. package/src/types.ts +0 -336
  220. package/src/utils/auth.ts +0 -61
  221. package/src/utils/github.ts +0 -121
  222. package/src/utils/logger.ts +0 -35
  223. package/src/utils/r2store.ts +0 -70
@@ -1,68 +1,25 @@
1
1
  #!/usr/bin/env node
2
2
  /* eslint-disable no-console */
3
-
4
- const fs = require("node:fs");
5
-
6
- const DEFAULT_URL = process.env.EXPRESS_SERVER_URL || "http://127.0.0.1:3000";
7
-
8
- function usage() {
9
- console.error(
10
- [
11
- "Usage:",
12
- " node scripts/create-element.cjs (--data <json> | --file <path>) [--url <canvasUrl>]",
13
- "",
14
- "Examples:",
15
- ' node scripts/create-element.cjs --data \'{"type":"rectangle","x":100,"y":100,"width":300,"height":200}\'',
16
- " node scripts/create-element.cjs --file element.json",
17
- ].join("\n"),
18
- );
19
- process.exit(2);
20
- }
21
-
22
- function parseArgs(argv) {
23
- const out = { url: DEFAULT_URL, data: null, file: null };
24
- for (let i = 0; i < argv.length; i++) {
25
- const a = argv[i];
26
- if (a === "--url") out.url = argv[++i];
27
- else if (a === "--data") out.data = argv[++i];
28
- else if (a === "--file") out.file = argv[++i];
29
- }
30
- return out;
31
- }
32
-
33
- function readJson({ data, file }) {
34
- if (data) return JSON.parse(data);
35
- if (file) return JSON.parse(fs.readFileSync(file, "utf8"));
36
- usage();
37
- }
3
+ // Remote-only create. Usage: --repo owner/repo (--data <json> | --file <path>)
4
+ const fs = require('node:fs');
5
+ const crypto = require('node:crypto');
6
+ const { repoFromArgs, token, getScene, putScene } = require('./gh-helper.cjs');
38
7
 
39
8
  async function main() {
40
- if (typeof fetch !== "function") {
41
- throw new Error("This script requires Node 18+ (global fetch).");
42
- }
43
-
44
- const args = parseArgs(process.argv.slice(2));
45
- const payload = readJson(args);
46
-
47
- const baseUrl = args.url.replace(/\/$/, "");
48
- const res = await fetch(`${baseUrl}/api/elements`, {
49
- method: "POST",
50
- headers: { "Content-Type": "application/json" },
51
- body: JSON.stringify(payload),
52
- });
53
-
54
- const json = await res.json().catch(() => null);
55
- if (!res.ok || !json || json.success !== true) {
56
- throw new Error(
57
- `Failed to create element: ${res.status} ${res.statusText} ${json?.error ? `- ${json.error}` : ""}`,
58
- );
9
+ const argv = process.argv.slice(2);
10
+ const repo = repoFromArgs(argv);
11
+ let data = null; let file = null;
12
+ for (let i = 0; i < argv.length; i++) {
13
+ if (argv[i] === '--data') data = argv[++i];
14
+ else if (argv[i] === '--file') file = argv[++i];
59
15
  }
60
-
61
- process.stdout.write(JSON.stringify(json.element, null, 2) + "\n");
16
+ if (!repo || (!data && !file)) throw new Error("Usage: --repo owner/repo (--data '<json>' | --file <path>)");
17
+ if (!token()) throw new Error('No GitHub token.');
18
+ const payload = data ? JSON.parse(data) : JSON.parse(fs.readFileSync(file, 'utf8'));
19
+ const el = { id: payload.id || crypto.randomUUID().slice(0, 12), ...payload };
20
+ const scene = await getScene(repo);
21
+ await putScene(repo, [...scene.elements, el], scene.files, scene.sha, 'excalidrop: create element via skill');
22
+ process.stdout.write(JSON.stringify(el, null, 2) + '\n');
62
23
  }
63
24
 
64
- main().catch((err) => {
65
- console.error(err?.stack || String(err));
66
- process.exit(1);
67
- });
68
-
25
+ main().catch((err) => { console.error(err?.stack || String(err)); process.exit(1); });
@@ -1,48 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
  /* eslint-disable no-console */
3
-
4
- const DEFAULT_URL = process.env.EXPRESS_SERVER_URL || "http://127.0.0.1:3000";
5
-
6
- function usage() {
7
- console.error("Usage: node scripts/delete-element.cjs --id <id> [--url <canvasUrl>]");
8
- process.exit(2);
9
- }
10
-
11
- function parseArgs(argv) {
12
- const out = { url: DEFAULT_URL, id: null };
13
- for (let i = 0; i < argv.length; i++) {
14
- const a = argv[i];
15
- if (a === "--url") out.url = argv[++i];
16
- else if (a === "--id") out.id = argv[++i];
17
- }
18
- return out;
19
- }
3
+ // Remote-only delete. Usage: --repo owner/repo --id <id>
4
+ const { repoFromArgs, token, getScene, putScene } = require('./gh-helper.cjs');
20
5
 
21
6
  async function main() {
22
- if (typeof fetch !== "function") {
23
- throw new Error("This script requires Node 18+ (global fetch).");
24
- }
25
-
26
- const args = parseArgs(process.argv.slice(2));
27
- if (!args.id) usage();
28
-
29
- const baseUrl = args.url.replace(/\/$/, "");
30
- const res = await fetch(`${baseUrl}/api/elements/${encodeURIComponent(args.id)}`, {
31
- method: "DELETE",
32
- });
33
-
34
- const json = await res.json().catch(() => null);
35
- if (!res.ok || !json || json.success !== true) {
36
- throw new Error(
37
- `Failed to delete element: ${res.status} ${res.statusText} ${json?.error ? `- ${json.error}` : ""}`,
38
- );
39
- }
40
-
41
- console.log(`Deleted ${args.id}`);
7
+ const argv = process.argv.slice(2);
8
+ const repo = repoFromArgs(argv);
9
+ let id = null;
10
+ for (let i = 0; i < argv.length; i++) if (argv[i] === '--id') id = argv[++i];
11
+ if (!repo || !id) throw new Error('Usage: --repo owner/repo --id <id>');
12
+ if (!token()) throw new Error('No GitHub token.');
13
+ const scene = await getScene(repo);
14
+ await putScene(repo, scene.elements.filter((e) => e.id !== id), scene.files, scene.sha, `excalidrop: delete ${id} via skill`);
15
+ console.log(`Deleted ${id}`);
42
16
  }
43
17
 
44
- main().catch((err) => {
45
- console.error(err?.stack || String(err));
46
- process.exit(1);
47
- });
48
-
18
+ main().catch((err) => { console.error(err?.stack || String(err)); process.exit(1); });
@@ -1,53 +1,26 @@
1
1
  #!/usr/bin/env node
2
2
  /* eslint-disable no-console */
3
-
4
- const fs = require("node:fs");
5
- const path = require("node:path");
6
-
7
- const DEFAULT_URL = process.env.EXPRESS_SERVER_URL || "http://127.0.0.1:3000";
8
-
9
- function parseArgs(argv) {
10
- const out = { url: DEFAULT_URL, outFile: null };
11
- for (let i = 0; i < argv.length; i++) {
12
- const a = argv[i];
13
- if (a === "--url") out.url = argv[++i];
14
- else if (a === "--out") out.outFile = argv[++i];
15
- else if (a === "-o") out.outFile = argv[++i];
16
- }
17
- return out;
18
- }
3
+ // Remote-only export. Usage: --repo owner/repo [--out file]
4
+ const fs = require('node:fs');
5
+ const path = require('node:path');
6
+ const { repoFromArgs, token, getScene } = require('./gh-helper.cjs');
19
7
 
20
8
  async function main() {
21
- if (typeof fetch !== "function") {
22
- throw new Error("This script requires Node 18+ (global fetch).");
23
- }
24
-
25
- const { url, outFile } = parseArgs(process.argv.slice(2));
26
- const res = await fetch(`${url.replace(/\/$/, "")}/api/elements`);
27
- const json = await res.json();
28
-
29
- if (!res.ok || !json || json.success !== true) {
30
- throw new Error(`Failed to export elements: ${res.status} ${res.statusText}`);
9
+ const argv = process.argv.slice(2);
10
+ const repo = repoFromArgs(argv);
11
+ if (!repo) throw new Error('Pass --repo owner/repo.');
12
+ if (!token()) throw new Error('No GitHub token. Run `gh auth login` or `npx excalidrop login`.');
13
+ let outFile = null;
14
+ for (let i = 0; i < argv.length; i++) {
15
+ if ((argv[i] === '--out' || argv[i] === '-o') && argv[i + 1]) outFile = argv[++i];
31
16
  }
32
-
33
- const payload = {
34
- exportedAt: new Date().toISOString(),
35
- expressServerUrl: url,
36
- elements: json.elements || [],
37
- };
38
-
17
+ const scene = await getScene(repo);
18
+ const payload = { exportedAt: new Date().toISOString(), repo, elements: scene.elements };
39
19
  const text = JSON.stringify(payload, null, 2);
40
- if (!outFile) {
41
- process.stdout.write(text + "\n");
42
- return;
43
- }
44
-
45
- fs.mkdirSync(path.dirname(outFile), { recursive: true });
46
- fs.writeFileSync(outFile, text + "\n");
20
+ if (!outFile) { process.stdout.write(text + '\n'); return; }
21
+ fs.mkdirSync(path.dirname(path.resolve(outFile)), { recursive: true });
22
+ fs.writeFileSync(outFile, text + '\n');
47
23
  console.log(`Wrote ${payload.elements.length} elements to ${outFile}`);
48
24
  }
49
25
 
50
- main().catch((err) => {
51
- console.error(err?.stack || String(err));
52
- process.exit(1);
53
- });
26
+ main().catch((err) => { console.error(err?.stack || String(err)); process.exit(1); });
@@ -0,0 +1,58 @@
1
+ /* Shared helper for remote-only skill scripts: GitHub is the canvas. */
2
+ const { execSync } = require('node:child_process');
3
+
4
+ const BRANCH = process.env.CANVAS_BRANCH || 'excalidrop';
5
+ const SCENE_PATH = process.env.SCENE_PATH || 'canvas.excalidraw';
6
+
7
+ function repoFromArgs(args, envDefault) {
8
+ const i = args.findIndex((a) => a === '--repo');
9
+ if (i !== -1 && args[i + 1]) return args[i + 1];
10
+ const flag = args.find((a) => a.startsWith('--repo='));
11
+ if (flag) return flag.split('=').slice(1).join('=');
12
+ if (process.env.EXCALIDROP_REPO) return process.env.EXCALIDROP_REPO;
13
+ if (envDefault) return envDefault;
14
+ try {
15
+ const url = execSync('git config --get remote.origin.url', { encoding: 'utf8' }).trim().replace(/\.git$/, '');
16
+ const m = url.match(/github\.com[:/](.+)/);
17
+ if (m) return m[1].toLowerCase();
18
+ } catch { /* ignore */ }
19
+ return null;
20
+ }
21
+
22
+ function token() {
23
+ if (process.env.GITHUB_TOKEN) return process.env.GITHUB_TOKEN;
24
+ try {
25
+ return execSync('gh auth token', { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
26
+ } catch { return ''; }
27
+ }
28
+
29
+ function headers() {
30
+ return { Authorization: `Bearer ${token()}`, Accept: 'application/vnd.github+json', 'User-Agent': 'excalidrop-skill', 'Content-Type': 'application/json' };
31
+ }
32
+
33
+ async function getScene(repo) {
34
+ const r = await fetch(`https://api.github.com/repos/${repo}/contents/${SCENE_PATH}?ref=${BRANCH}`, { headers: headers() });
35
+ if (r.status === 404) return { elements: [], files: [], sha: null };
36
+ if (!r.ok) throw new Error(`GitHub get ${r.status}: ${await r.text()}`);
37
+ const j = await r.json();
38
+ // Contents API omits `content` for files >1MB — fall back to the blob API.
39
+ let b64 = typeof j.content === 'string' && j.content.length ? j.content : null;
40
+ if (!b64) {
41
+ const blob = await fetch(`https://api.github.com/repos/${repo}/git/blobs/${j.sha}`, { headers: headers() });
42
+ if (!blob.ok) throw new Error(`GitHub blob ${blob.status}`);
43
+ b64 = (await blob.json()).content || null;
44
+ }
45
+ if (!b64) return { elements: [], files: [], sha: j.sha || null };
46
+ const doc = JSON.parse(Buffer.from(b64, 'base64').toString('utf8'));
47
+ return { elements: doc.elements || [], files: doc.files || [], sha: j.sha };
48
+ }
49
+
50
+ async function putScene(repo, elements, files, sha, message) {
51
+ const body = { message, content: Buffer.from(JSON.stringify({ type: 'excalidraw', version: 2, source: 'excalidrop', elements, files: files || {} }, null, 2)).toString('base64'), branch: BRANCH };
52
+ if (sha) body.sha = sha;
53
+ const r = await fetch(`https://api.github.com/repos/${repo}/contents/${SCENE_PATH}`, { method: 'PUT', headers: headers(), body: JSON.stringify(body) });
54
+ if (!r.ok) throw new Error(`GitHub put ${r.status}: ${(await r.text()).slice(0, 200)}`);
55
+ return (await r.json()).content.sha;
56
+ }
57
+
58
+ module.exports = { BRANCH, SCENE_PATH, repoFromArgs, token, getScene, putScene };
@@ -1,35 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  /* eslint-disable no-console */
3
-
4
- const DEFAULT_URL = process.env.EXPRESS_SERVER_URL || "http://127.0.0.1:3000";
5
-
6
- function parseArgs(argv) {
7
- const out = { url: DEFAULT_URL };
8
- for (let i = 0; i < argv.length; i++) {
9
- const a = argv[i];
10
- if (a === "--url") out.url = argv[++i];
11
- }
12
- return out;
13
- }
3
+ // Remote-only: checks gh auth + scene readability. Usage: --repo owner/repo
4
+ const { repoFromArgs, token, getScene } = require('./gh-helper.cjs');
14
5
 
15
6
  async function main() {
16
- if (typeof fetch !== "function") {
17
- throw new Error("This script requires Node 18+ (global fetch).");
18
- }
19
-
20
- const { url } = parseArgs(process.argv.slice(2));
21
- const res = await fetch(`${url.replace(/\/$/, "")}/health`);
22
- const text = await res.text();
23
-
24
- if (!res.ok) {
25
- console.error(text);
26
- process.exit(1);
27
- }
28
-
29
- console.log(text);
7
+ const repo = repoFromArgs(process.argv.slice(2));
8
+ if (!repo) throw new Error('Pass --repo owner/repo (or run inside a cloned repo).');
9
+ if (!token()) throw new Error('No GitHub token. Run `gh auth login` or `npx excalidrop login`.');
10
+ const scene = await getScene(repo);
11
+ console.log(JSON.stringify({ ok: true, repo, elements: scene.elements.length, sha: scene.sha?.slice(0, 7) || null }, null, 2));
30
12
  }
31
13
 
32
- main().catch((err) => {
33
- console.error(err?.stack || String(err));
34
- process.exit(1);
35
- });
14
+ main().catch((err) => { console.error(err?.stack || String(err)); process.exit(1); });
@@ -1,81 +1,31 @@
1
1
  #!/usr/bin/env node
2
2
  /* eslint-disable no-console */
3
-
4
- const fs = require("node:fs");
5
-
6
- const DEFAULT_URL = process.env.EXPRESS_SERVER_URL || "http://127.0.0.1:3000";
3
+ // Remote-only import. Usage: --repo owner/repo --in <file> [--mode merge|replace]
4
+ const fs = require('node:fs');
5
+ const { repoFromArgs, token, getScene, putScene } = require('./gh-helper.cjs');
7
6
 
8
7
  function usage() {
9
- console.error(
10
- [
11
- "Usage:",
12
- " node scripts/import-elements.cjs --in <file> [--mode batch|sync] [--url <canvasUrl>]",
13
- "",
14
- "Modes:",
15
- " batch POST /api/elements/batch (append; creates elements)",
16
- " sync POST /api/elements/sync (overwrite; clears then writes)",
17
- ].join("\n"),
18
- );
8
+ console.error(['Usage:', ' node scripts/import-elements.cjs --repo owner/repo --in <file> [--mode merge|replace]'].join('\n'));
19
9
  process.exit(2);
20
10
  }
21
11
 
22
- function parseArgs(argv) {
23
- const out = { url: DEFAULT_URL, inFile: null, mode: "batch" };
24
- for (let i = 0; i < argv.length; i++) {
25
- const a = argv[i];
26
- if (a === "--url") out.url = argv[++i];
27
- else if (a === "--in") out.inFile = argv[++i];
28
- else if (a === "--mode") out.mode = argv[++i];
29
- }
30
- return out;
31
- }
32
-
33
- function readElementsFromFile(inFile) {
34
- const raw = fs.readFileSync(inFile, "utf8");
35
- const data = JSON.parse(raw);
36
- if (Array.isArray(data)) return data;
37
- if (data && Array.isArray(data.elements)) return data.elements;
38
- throw new Error('Input file must be an array, or an object with an "elements" array');
39
- }
40
-
41
12
  async function main() {
42
- if (typeof fetch !== "function") {
43
- throw new Error("This script requires Node 18+ (global fetch).");
44
- }
45
-
46
- const { url, inFile, mode } = parseArgs(process.argv.slice(2));
47
- if (!inFile) usage();
48
- if (mode !== "batch" && mode !== "sync") usage();
49
-
50
- const elements = readElementsFromFile(inFile);
51
- const baseUrl = url.replace(/\/$/, "");
52
-
53
- let endpoint;
54
- let body;
55
- if (mode === "batch") {
56
- endpoint = `${baseUrl}/api/elements/batch`;
57
- body = { elements };
58
- } else {
59
- endpoint = `${baseUrl}/api/elements/sync`;
60
- body = { elements, timestamp: new Date().toISOString() };
61
- }
62
-
63
- const res = await fetch(endpoint, {
64
- method: "POST",
65
- headers: { "Content-Type": "application/json" },
66
- body: JSON.stringify(body),
67
- });
68
-
69
- const json = await res.json().catch(() => null);
70
- if (!res.ok || !json || json.success !== true) {
71
- throw new Error(`Failed to import elements: ${res.status} ${res.statusText} ${json?.error ? `- ${json.error}` : ""}`);
13
+ const argv = process.argv.slice(2);
14
+ const repo = repoFromArgs(argv);
15
+ let inFile = null; let mode = 'merge';
16
+ for (let i = 0; i < argv.length; i++) {
17
+ if (argv[i] === '--in' && argv[i + 1]) inFile = argv[++i];
18
+ else if (argv[i] === '--mode' && argv[i + 1]) mode = argv[++i];
72
19
  }
73
-
74
- const count = json.count ?? json.elements?.length ?? elements.length;
75
- console.log(`Imported ${count} elements (${mode})`);
20
+ if (!repo || !inFile) usage();
21
+ if (!token()) throw new Error('No GitHub token. Run `gh auth login` or `npx excalidrop login`.');
22
+ const raw = JSON.parse(fs.readFileSync(inFile, 'utf8'));
23
+ const incoming = Array.isArray(raw) ? raw : raw.elements || [];
24
+ if (!incoming.length) throw new Error('No elements in input file');
25
+ const scene = await getScene(repo);
26
+ const elements = mode === 'replace' ? incoming : [...scene.elements, ...incoming];
27
+ await putScene(repo, elements, scene.files, scene.sha, `excalidrop: import ${incoming.length} elements (${mode})`);
28
+ console.log(`Imported ${incoming.length} elements (${mode}) to ${repo}`);
76
29
  }
77
30
 
78
- main().catch((err) => {
79
- console.error(err?.stack || String(err));
80
- process.exit(1);
81
- });
31
+ main().catch((err) => { console.error(err?.stack || String(err)); process.exit(1); });
@@ -1,70 +1,26 @@
1
1
  #!/usr/bin/env node
2
2
  /* eslint-disable no-console */
3
-
4
- const fs = require("node:fs");
5
-
6
- const DEFAULT_URL = process.env.EXPRESS_SERVER_URL || "http://127.0.0.1:3000";
7
-
8
- function usage() {
9
- console.error(
10
- [
11
- "Usage:",
12
- " node scripts/update-element.cjs --id <id> (--data <json> | --file <path>) [--url <canvasUrl>]",
13
- "",
14
- "Examples:",
15
- ' node scripts/update-element.cjs --id abc --data \'{"x":200,"y":250,"backgroundColor":"#ffeeee"}\'',
16
- " node scripts/update-element.cjs --id abc --file updates.json",
17
- ].join("\n"),
18
- );
19
- process.exit(2);
20
- }
21
-
22
- function parseArgs(argv) {
23
- const out = { url: DEFAULT_URL, id: null, data: null, file: null };
24
- for (let i = 0; i < argv.length; i++) {
25
- const a = argv[i];
26
- if (a === "--url") out.url = argv[++i];
27
- else if (a === "--id") out.id = argv[++i];
28
- else if (a === "--data") out.data = argv[++i];
29
- else if (a === "--file") out.file = argv[++i];
30
- }
31
- return out;
32
- }
33
-
34
- function readJson({ data, file }) {
35
- if (data) return JSON.parse(data);
36
- if (file) return JSON.parse(fs.readFileSync(file, "utf8"));
37
- usage();
38
- }
3
+ // Remote-only update. Usage: --repo owner/repo --id <id> (--data <json> | --file <path>)
4
+ const fs = require('node:fs');
5
+ const { repoFromArgs, token, getScene, putScene } = require('./gh-helper.cjs');
39
6
 
40
7
  async function main() {
41
- if (typeof fetch !== "function") {
42
- throw new Error("This script requires Node 18+ (global fetch).");
43
- }
44
-
45
- const args = parseArgs(process.argv.slice(2));
46
- if (!args.id) usage();
47
- const payload = readJson(args);
48
-
49
- const baseUrl = args.url.replace(/\/$/, "");
50
- const res = await fetch(`${baseUrl}/api/elements/${encodeURIComponent(args.id)}`, {
51
- method: "PUT",
52
- headers: { "Content-Type": "application/json" },
53
- body: JSON.stringify(payload),
54
- });
55
-
56
- const json = await res.json().catch(() => null);
57
- if (!res.ok || !json || json.success !== true) {
58
- throw new Error(
59
- `Failed to update element: ${res.status} ${res.statusText} ${json?.error ? `- ${json.error}` : ""}`,
60
- );
8
+ const argv = process.argv.slice(2);
9
+ const repo = repoFromArgs(argv);
10
+ let id = null; let data = null; let file = null;
11
+ for (let i = 0; i < argv.length; i++) {
12
+ if (argv[i] === '--id') id = argv[++i];
13
+ else if (argv[i] === '--data') data = argv[++i];
14
+ else if (argv[i] === '--file') file = argv[++i];
61
15
  }
62
-
63
- process.stdout.write(JSON.stringify(json.element, null, 2) + "\n");
16
+ if (!repo || !id || (!data && !file)) throw new Error('Usage: --repo owner/repo --id <id> (--data \'<json>\' | --file <path>)');
17
+ if (!token()) throw new Error('No GitHub token.');
18
+ const patch = data ? JSON.parse(data) : JSON.parse(fs.readFileSync(file, 'utf8'));
19
+ const scene = await getScene(repo);
20
+ const els = scene.elements.map((e) => (e.id === id ? { ...e, ...patch, id } : e));
21
+ if (!els.some((e) => e.id === id)) throw new Error(`Element ${id} not found`);
22
+ await putScene(repo, els, scene.files, scene.sha, `excalidrop: update ${id} via skill`);
23
+ process.stdout.write(JSON.stringify(els.find((e) => e.id === id), null, 2) + '\n');
64
24
  }
65
25
 
66
- main().catch((err) => {
67
- console.error(err?.stack || String(err));
68
- process.exit(1);
69
- });
70
-
26
+ main().catch((err) => { console.error(err?.stack || String(err)); process.exit(1); });
package/tsconfig.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "declarationMap": true,
10
10
  "sourceMap": true,
11
11
  "outDir": "./dist",
12
- "rootDir": "./src",
12
+ "rootDir": ".",
13
13
  "strict": true,
14
14
  "noImplicitAny": true,
15
15
  "strictNullChecks": true,
@@ -33,7 +33,8 @@
33
33
  "types": ["node"]
34
34
  },
35
35
  "include": [
36
- "src/**/*.ts"
36
+ "mcp.ts",
37
+ "cli.ts"
37
38
  ],
38
39
  "exclude": [
39
40
  "node_modules",
package/vite.config.js CHANGED
@@ -21,15 +21,8 @@ export default defineConfig({
21
21
  },
22
22
  server: {
23
23
  port: 5173,
24
- proxy: {
25
- '/api': {
26
- target: 'http://127.0.0.1:3000',
27
- changeOrigin: true,
28
- },
29
- '/health': {
30
- target: 'http://127.0.0.1:3000',
31
- changeOrigin: true,
32
- },
33
- },
24
+ // Remote-only: no local canvas server. The viewer talks to GitHub
25
+ // (scene) + the shared relay (rpc) directly. ?repo=owner/name override
26
+ // in dev comes from ghSync.detectRepo().
34
27
  },
35
28
  })
@@ -1 +0,0 @@
1
- import{w as ln,c as W}from"./path-CbwjOpE9.js";import{O as an,P as $,Q as O,R as rn,T as y,V as on,W as B,X as _,Y as un,Z as t,_ as sn,$ as tn,a0 as fn}from"./index-DIz4WrSB.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function mn(l){return l.endAngle}function pn(l){return l&&l.padAngle}function dn(l,h,E,q,v,R,X,a){var I=E-l,i=q-h,n=X-v,m=a-R,r=m*I-n*i;if(!(r*r<y))return r=(n*(h-R)-m*(l-v))/r,[l+r*I,h+r*i]}function K(l,h,E,q,v,R,X){var a=l-E,I=h-q,i=(X?R:-R)/B(a*a+I*I),n=i*I,m=-i*a,r=l+n,s=h+m,f=E+n,c=q+m,Y=(r+f)/2,o=(s+c)/2,p=f-r,g=c-s,A=p*p+g*g,T=v-R,P=r*c-f*s,Q=(g<0?-1:1)*B(tn(0,T*T*A-P*P)),S=(P*g-p*Q)/A,V=(-P*p-g*Q)/A,w=(P*g+p*Q)/A,d=(-P*p+g*Q)/A,x=S-Y,e=V-o,u=w-Y,Z=d-o;return x*x+e*e>u*u+Z*Z&&(S=w,V=d),{cx:S,cy:V,x01:-n,y01:-m,x11:S*(v/T-1),y11:V*(v/T-1)}}function vn(){var l=cn,h=yn,E=W(0),q=null,v=gn,R=mn,X=pn,a=null,I=ln(i);function i(){var n,m,r=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-rn,c=R.apply(this,arguments)-rn,Y=un(c-f),o=c>f;if(a||(a=n=I()),s<r&&(m=s,s=r,r=m),!(s>y))a.moveTo(0,0);else if(Y>on-y)a.moveTo(s*$(f),s*O(f)),a.arc(0,0,s,f,c,!o),r>y&&(a.moveTo(r*$(c),r*O(c)),a.arc(0,0,r,c,f,o));else{var p=f,g=c,A=f,T=c,P=Y,Q=Y,S=X.apply(this,arguments)/2,V=S>y&&(q?+q.apply(this,arguments):B(r*r+s*s)),w=_(un(s-r)/2,+E.apply(this,arguments)),d=w,x=w,e,u;if(V>y){var Z=sn(V/r*O(S)),C=sn(V/s*O(S));(P-=Z*2)>y?(Z*=o?1:-1,A+=Z,T-=Z):(P=0,A=T=(f+c)/2),(Q-=C*2)>y?(C*=o?1:-1,p+=C,g-=C):(Q=0,p=g=(f+c)/2)}var j=s*$(p),z=s*O(p),F=r*$(T),G=r*O(T);if(w>y){var H=s*$(g),J=s*O(g),L=r*$(A),M=r*O(A),D;if(Y<an)if(D=dn(j,z,L,M,H,J,F,G)){var N=j-D[0],U=z-D[1],k=H-D[0],b=J-D[1],nn=1/O(fn((N*k+U*b)/(B(N*N+U*U)*B(k*k+b*b)))/2),en=B(D[0]*D[0]+D[1]*D[1]);d=_(w,(r-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else d=x=0}Q>y?x>y?(e=K(L,M,j,z,s,x,o),u=K(H,J,F,G,s,x,o),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,t(e.y01,e.x01),t(u.y01,u.x01),!o):(a.arc(e.cx,e.cy,x,t(e.y01,e.x01),t(e.y11,e.x11),!o),a.arc(0,0,s,t(e.cy+e.y11,e.cx+e.x11),t(u.cy+u.y11,u.cx+u.x11),!o),a.arc(u.cx,u.cy,x,t(u.y11,u.x11),t(u.y01,u.x01),!o))):(a.moveTo(j,z),a.arc(0,0,s,p,g,!o)):a.moveTo(j,z),!(r>y)||!(P>y)?a.lineTo(F,G):d>y?(e=K(F,G,H,J,r,-d,o),u=K(j,z,L,M,r,-d,o),a.lineTo(e.cx+e.x01,e.cy+e.y01),d<w?a.arc(e.cx,e.cy,d,t(e.y01,e.x01),t(u.y01,u.x01),!o):(a.arc(e.cx,e.cy,d,t(e.y01,e.x01),t(e.y11,e.x11),!o),a.arc(0,0,r,t(e.cy+e.y11,e.cx+e.x11),t(u.cy+u.y11,u.cx+u.x11),o),a.arc(u.cx,u.cy,d,t(u.y11,u.x11),t(u.y01,u.x01),!o))):a.arc(0,0,r,T,A,o)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,m=(+v.apply(this,arguments)+ +R.apply(this,arguments))/2-an/2;return[$(m)*n,O(m)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:W(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:W(+n),i):h},i.cornerRadius=function(n){return arguments.length?(E=typeof n=="function"?n:W(+n),i):E},i.padRadius=function(n){return arguments.length?(q=n==null?null:typeof n=="function"?n:W(+n),i):q},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:W(+n),i):v},i.endAngle=function(n){return arguments.length?(R=typeof n=="function"?n:W(+n),i):R},i.padAngle=function(n){return arguments.length?(X=typeof n=="function"?n:W(+n),i):X},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{vn as a};
@@ -1 +0,0 @@
1
- import{U as a,C as n}from"./index-DIz4WrSB.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
@@ -1,2 +0,0 @@
1
- import{s as M,d as _,p as R}from"./styles-5f03d8d2-C-_n19AB.js";import{l as d,g as c,d as w,u as B,a7 as G,k as D,a8 as E,a9 as C,aa as A}from"./index-DIz4WrSB.js";import{G as z}from"./graph-BQZ6SIVr.js";import{r as P}from"./index-6079d271-Y2bgyRpa.js";import"./layout-BsWfhUAF.js";import"./union-BgYwhB7T.js";import"./clone-BoZziNL9.js";import"./zipObject-DMfHW2o8.js";import"./edges-332bd1c7-D-u0KMZB.js";import"./createText-d213de94-D59sBfqq.js";import"./index-DGmpr33w.js";import"./line-DwQObOhP.js";import"./array-BKyUJesY.js";import"./path-CbwjOpE9.js";const S=s=>D.sanitizeText(s,c());let k={dividerMargin:10,padding:5,textHeight:10,curve:void 0};const q=function(s,e,y,a){const t=Object.keys(s);d.info("keys:",t),d.info(s),t.forEach(function(i){var o,r;const l=s[i],p={shape:"rect",id:l.id,domId:l.domId,labelText:S(l.id),labelStyle:"",style:"fill: none; stroke: black",padding:((o=c().flowchart)==null?void 0:o.padding)??((r=c().class)==null?void 0:r.padding)};e.setNode(l.id,p),$(l.classes,e,y,a,l.id),d.info("setNode",p)})},$=function(s,e,y,a,t){const i=Object.keys(s);d.info("keys:",i),d.info(s),i.filter(o=>s[o].parent==t).forEach(function(o){var r,l;const n=s[o],p=n.cssClasses.join(" "),f=E(n.styles),m=n.label??n.id,u=0,b={labelStyle:f.labelStyle,shape:"class_box",labelText:S(m),classData:n,rx:u,ry:u,class:p,style:f.style,id:n.id,domId:n.domId,tooltip:a.db.getTooltip(n.id,t)||"",haveCallback:n.haveCallback,link:n.link,width:n.type==="group"?500:void 0,type:n.type,padding:((r=c().flowchart)==null?void 0:r.padding)??((l=c().class)==null?void 0:l.padding)};e.setNode(n.id,b),t&&e.setParent(n.id,t),d.info("setNode",b)})},F=function(s,e,y,a){d.info(s),s.forEach(function(t,i){var o,r;const l=t,n="",p={labelStyle:"",style:""},f=l.text,m=0,h={labelStyle:p.labelStyle,shape:"note",labelText:S(f),noteData:l,rx:m,ry:m,class:n,style:p.style,id:l.id,domId:l.id,tooltip:"",type:"note",padding:((o=c().flowchart)==null?void 0:o.padding)??((r=c().class)==null?void 0:r.padding)};if(e.setNode(l.id,h),d.info("setNode",h),!l.class||!(l.class in a))return;const b=y+i,x={id:`edgeNote${b}`,classes:"relation",pattern:"dotted",arrowhead:"none",startLabelRight:"",endLabelLeft:"",arrowTypeStart:"none",arrowTypeEnd:"none",style:"fill:none",labelStyle:"",curve:C(k.curve,A)};e.setEdge(l.id,l.class,x,b)})},H=function(s,e){const y=c().flowchart;let a=0;s.forEach(function(t){var i;a++;const o={classes:"relation",pattern:t.relation.lineType==1?"dashed":"solid",id:`id_${t.id1}_${t.id2}_${a}`,arrowhead:t.type==="arrow_open"?"none":"normal",startLabelRight:t.relationTitle1==="none"?"":t.relationTitle1,endLabelLeft:t.relationTitle2==="none"?"":t.relationTitle2,arrowTypeStart:N(t.relation.type1),arrowTypeEnd:N(t.relation.type2),style:"fill:none",labelStyle:"",curve:C(y==null?void 0:y.curve,A)};if(d.info(o,t),t.style!==void 0){const r=E(t.style);o.style=r.style,o.labelStyle=r.labelStyle}t.text=t.title,t.text===void 0?t.style!==void 0&&(o.arrowheadStyle="fill: #333"):(o.arrowheadStyle="fill: #333",o.labelpos="c",((i=c().flowchart)==null?void 0:i.htmlLabels)??c().htmlLabels?(o.labelType="html",o.label='<span class="edgeLabel">'+t.text+"</span>"):(o.labelType="text",o.label=t.text.replace(D.lineBreakRegex,`
2
- `),t.style===void 0&&(o.style=o.style||"stroke: #333; stroke-width: 1.5px;fill:none"),o.labelStyle=o.labelStyle.replace("color:","fill:"))),e.setEdge(t.id1,t.id2,o,a)})},V=function(s){k={...k,...s}},W=async function(s,e,y,a){d.info("Drawing class - ",e);const t=c().flowchart??c().class,i=c().securityLevel;d.info("config:",t);const o=(t==null?void 0:t.nodeSpacing)??50,r=(t==null?void 0:t.rankSpacing)??50,l=new z({multigraph:!0,compound:!0}).setGraph({rankdir:a.db.getDirection(),nodesep:o,ranksep:r,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}}),n=a.db.getNamespaces(),p=a.db.getClasses(),f=a.db.getRelations(),m=a.db.getNotes();d.info(f),q(n,l,e,a),$(p,l,e,a),H(f,l),F(m,l,f.length+1,p);let u;i==="sandbox"&&(u=w("#i"+e));const h=i==="sandbox"?w(u.nodes()[0].contentDocument.body):w("body"),b=h.select(`[id="${e}"]`),x=h.select("#"+e+" g");if(await P(x,l,["aggregation","extension","composition","dependency","lollipop"],"classDiagram",e),B.insertTitle(b,"classTitleText",(t==null?void 0:t.titleTopMargin)??5,a.db.getDiagramTitle()),G(l,b,t==null?void 0:t.diagramPadding,t==null?void 0:t.useMaxWidth),!(t!=null&&t.htmlLabels)){const T=i==="sandbox"?u.nodes()[0].contentDocument:document,I=T.querySelectorAll('[id="'+e+'"] .edgeLabel .label');for(const g of I){const L=g.getBBox(),v=T.createElementNS("http://www.w3.org/2000/svg","rect");v.setAttribute("rx",0),v.setAttribute("ry",0),v.setAttribute("width",L.width),v.setAttribute("height",L.height),g.insertBefore(v,g.firstChild)}}};function N(s){let e;switch(s){case 0:e="aggregation";break;case 1:e="extension";break;case 2:e="composition";break;case 3:e="dependency";break;case 4:e="lollipop";break;default:e="none"}return e}const J={setConf:V,draw:W},at={parser:R,db:_,renderer:J,styles:M,init:s=>{s.class||(s.class={}),s.class.arrowMarkerAbsolute=s.arrowMarkerAbsolute,_.clear()}};export{at as diagram};
@@ -1 +0,0 @@
1
- import{b as r}from"./union-BgYwhB7T.js";var e=4;function a(o){return r(o,e)}export{a as c};
@@ -1 +0,0 @@
1
- import{f as o,p as e}from"./flowDb-956e92f1-BbpkWRi7.js";import{f as a,a as t}from"./styles-c10674c1-BfxiK3Ns.js";import{t as i}from"./index-D7eYnAQp.js";import"./index-DIz4WrSB.js";import"./graph-Cda8xSTx.js";import"./layout-Drr-66M9.js";import"./index-3862675e-CpYfS3Db.js";import"./union-BgYwhB7T.js";import"./clone-BoZziNL9.js";import"./zipObject-DMfHW2o8.js";import"./edges-e0da2a9e-B3UFqLqY.js";import"./createText-2e5e7dd3-CqY00v-4.js";import"./index-DGmpr33w.js";import"./line-DwQObOhP.js";import"./array-BKyUJesY.js";import"./path-CbwjOpE9.js";import"./channel-BQSIb3i3.js";import"./selectAll-DsrPvhqV.js";const x={parser:e,db:o,renderer:t,styles:a,init:r=>{r.flowchart||(r.flowchart={}),r.flowchart.arrowMarkerAbsolute=r.arrowMarkerAbsolute,i({flowchart:{arrowMarkerAbsolute:r.arrowMarkerAbsolute}}),t.setConf(r.flowchart),o.clear(),o.setGen("gen-2")}};export{x as diagram};
@@ -1 +0,0 @@
1
- import{f as o,p as e}from"./flowDb-7c981674-6JB2gd0I.js";import{f as a,a as t}from"./styles-2ab5d517-CfWubwio.js";import{G as i}from"./index-DIz4WrSB.js";import"./graph-BQZ6SIVr.js";import"./layout-BsWfhUAF.js";import"./index-6079d271-Y2bgyRpa.js";import"./union-BgYwhB7T.js";import"./clone-BoZziNL9.js";import"./zipObject-DMfHW2o8.js";import"./edges-332bd1c7-D-u0KMZB.js";import"./createText-d213de94-D59sBfqq.js";import"./index-DGmpr33w.js";import"./line-DwQObOhP.js";import"./array-BKyUJesY.js";import"./path-CbwjOpE9.js";import"./channel-BQSIb3i3.js";import"./selectAll-DsrPvhqV.js";const C={parser:e,db:o,renderer:t,styles:a,init:r=>{r.flowchart||(r.flowchart={}),r.flowchart.arrowMarkerAbsolute=r.arrowMarkerAbsolute,i({flowchart:{arrowMarkerAbsolute:r.arrowMarkerAbsolute}}),t.setConf(r.flowchart),o.clear(),o.setGen("gen-2")}};export{C as diagram};