ryugi-artifacts 1.7.4 → 1.9.0

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 (150) hide show
  1. package/bin/ryugi-artifacts.cjs +1 -52
  2. package/dist/cli.cjs +594 -0
  3. package/dist/server.cjs +862 -548
  4. package/dist/viewer/{CloudDocument-Ba6KrnqA.js → CloudDocument-Dguokp_6.js} +1 -1
  5. package/dist/viewer/{DocumentEditor-BS16Wb_Z.js → DocumentEditor-rRoUyzj5.js} +81 -81
  6. package/dist/viewer/DocumentPage-C0_SVGNv.js +1 -0
  7. package/dist/viewer/{abnfDiagram-VCTEODGH-DuJfhZTl.js → abnfDiagram-VCTEODGH-Cd62lXYi.js} +1 -1
  8. package/dist/viewer/{ar-SA-G6X2FPQ2-CVlRFGvR.js → ar-SA-G6X2FPQ2-k4wcXC0w.js} +1 -1
  9. package/dist/viewer/{architectureDiagram-5GKGNRK7-Ca-sK1k9.js → architectureDiagram-5GKGNRK7-BqGRfF7K.js} +1 -1
  10. package/dist/viewer/{az-AZ-76LH7QW2-CzO5U4tE.js → az-AZ-76LH7QW2-DjkRWALq.js} +1 -1
  11. package/dist/viewer/{bg-BG-XCXSNQG7-DLheLFGn.js → bg-BG-XCXSNQG7-CUOyMSFg.js} +1 -1
  12. package/dist/viewer/{blockDiagram-I7D4REHJ-CVWXNFVb.js → blockDiagram-I7D4REHJ-DLj9e678.js} +1 -1
  13. package/dist/viewer/{bn-BD-2XOGV67Q-DvnFf2ym.js → bn-BD-2XOGV67Q-CPw_5I7i.js} +1 -1
  14. package/dist/viewer/{c4Diagram-7LVT6UL2-CddHgiim.js → c4Diagram-7LVT6UL2-D9FPioA_.js} +1 -1
  15. package/dist/viewer/{ca-ES-6MX7JW3Y-1SQM_Wxy.js → ca-ES-6MX7JW3Y-Bl_ggxy-.js} +1 -1
  16. package/dist/viewer/{chunk-4HAMMTFA-B7k7y3et.js → chunk-4HAMMTFA-B8CHZ2iu.js} +1 -1
  17. package/dist/viewer/{chunk-75Z2AOVW-Dmt3SQH3.js → chunk-75Z2AOVW-BLvzzoaA.js} +1 -1
  18. package/dist/viewer/{chunk-EIO257PC-CNxgWaGL.js → chunk-EIO257PC-BkhwQy9u.js} +1 -1
  19. package/dist/viewer/{chunk-GMAD6QVW-Do0Tih79.js → chunk-GMAD6QVW-BIxPNzf_.js} +1 -1
  20. package/dist/viewer/{chunk-GVQU2GXP-C9mWLYpa.js → chunk-GVQU2GXP-BcbkZdgL.js} +1 -1
  21. package/dist/viewer/{chunk-IMKFNOWR-BqsuylOZ.js → chunk-IMKFNOWR-BlVm2eW6.js} +1 -1
  22. package/dist/viewer/{chunk-L3NEJ4N5-D_AVAMEp.js → chunk-L3NEJ4N5-DPP-Uqzz.js} +1 -1
  23. package/dist/viewer/{chunk-OSK3NFVY-BKczRUt9.js → chunk-OSK3NFVY-DvWBYW0M.js} +1 -1
  24. package/dist/viewer/{chunk-PWAF6VOD-CcIRMiiP.js → chunk-PWAF6VOD-Df9WdVJL.js} +1 -1
  25. package/dist/viewer/{chunk-SHT3W25Y-D8R29R_u.js → chunk-SHT3W25Y-BSCi7YG7.js} +1 -1
  26. package/dist/viewer/{chunk-SVP7TREG-DvPbOdMe.js → chunk-SVP7TREG-Bxv2fp8X.js} +1 -1
  27. package/dist/viewer/{chunk-TICWLB2K-v1pSr6BB.js → chunk-TICWLB2K-MSpOEdcV.js} +1 -1
  28. package/dist/viewer/classDiagram-ZZMXUADV-YWXPsH1o.js +1 -0
  29. package/dist/viewer/classDiagram-v2-VYDZK3BY-YWXPsH1o.js +1 -0
  30. package/dist/viewer/{cs-CZ-2BRQDIVT-CuIWOyM9.js → cs-CZ-2BRQDIVT-VpdA_B_0.js} +1 -1
  31. package/dist/viewer/{cynefinDiagram-5FMLGOSQ-CarHaJWA.js → cynefinDiagram-5FMLGOSQ-CCIqA18s.js} +1 -1
  32. package/dist/viewer/{da-DK-5WZEPLOC-BNpk9O4Z.js → da-DK-5WZEPLOC-Bikfnz1b.js} +1 -1
  33. package/dist/viewer/{dagre-GXQ25YYZ-jKxlutMc.js → dagre-GXQ25YYZ-DeVnyw6S.js} +1 -1
  34. package/dist/viewer/{de-DE-XR44H4JA-DeRYYEYN.js → de-DE-XR44H4JA-5nJunltn.js} +1 -1
  35. package/dist/viewer/{diagram-S7CK7UJ4-BzGz76pK.js → diagram-S7CK7UJ4-rcnT6Csv.js} +1 -1
  36. package/dist/viewer/{diagram-UQ7AKVKN-DDsoAc73.js → diagram-UQ7AKVKN-D6yGL_te.js} +1 -1
  37. package/dist/viewer/{diagram-VSXAHHWV-HxtxJg2X.js → diagram-VSXAHHWV-C8eVmzD7.js} +1 -1
  38. package/dist/viewer/{diagram-VX7I27RA-BIeolo3r.js → diagram-VX7I27RA-BVBGylbn.js} +1 -1
  39. package/dist/viewer/{diagram-Z3DM3KII-CU7mw2ow.js → diagram-Z3DM3KII-DnsHEfda.js} +1 -1
  40. package/dist/viewer/{dist-DqbHnPRI.js → dist-BGR5ezDy.js} +1 -1
  41. package/dist/viewer/{dist-DC1HltnF.js → dist-BPa5yz1M.js} +1 -1
  42. package/dist/viewer/{dist-BgSBKOA3.js → dist-BSqmGdSf.js} +1 -1
  43. package/dist/viewer/{dist-Bu_voPaa.js → dist-Bn3GpIIQ.js} +1 -1
  44. package/dist/viewer/{dist-BSeJYKLj.js → dist-C2UdEldV.js} +1 -1
  45. package/dist/viewer/{dist-DX3SNcdm.js → dist-C46f_skK.js} +1 -1
  46. package/dist/viewer/{dist-AH0bdIVa.js → dist-CNSswqVs.js} +1 -1
  47. package/dist/viewer/{dist-CgYgXYmt.js → dist-CPg9Exib.js} +1 -1
  48. package/dist/viewer/{dist-CddCPamz.js → dist-CWy1mEqq.js} +1 -1
  49. package/dist/viewer/{dist-CHLFapPp.js → dist-C_2nvGGH.js} +1 -1
  50. package/dist/viewer/{dist-CZsxPTNE.js → dist-CjSSDaiM.js} +1 -1
  51. package/dist/viewer/{dist-C-ieEyE1.js → dist-CyR9uUsj.js} +1 -1
  52. package/dist/viewer/{dist-CvB831yK.js → dist-DOLGlCIF.js} +1 -1
  53. package/dist/viewer/{dist-Cu6PLla0.js → dist-DOpcb4fi.js} +1 -1
  54. package/dist/viewer/{dist-CbHHxvP1.js → dist-DRJfWmsE.js} +1 -1
  55. package/dist/viewer/{dist-BeULvDu_.js → dist-DU3q2qgP.js} +1 -1
  56. package/dist/viewer/{dist-BlXyXxst.js → dist-DeqL7hkG.js} +1 -1
  57. package/dist/viewer/{dist-BppD0RS2.js → dist-DlPVPwB6.js} +1 -1
  58. package/dist/viewer/{dist-BbW5iWCe.js → dist-JNndX187.js} +1 -1
  59. package/dist/viewer/{dist-C21gJBBO.js → dist-bznEISxg.js} +1 -1
  60. package/dist/viewer/{dist-DA8TW41P.js → dist-gtpBaWjz.js} +1 -1
  61. package/dist/viewer/{dist-Cackv1h9.js → dist-oPn-5997.js} +1 -1
  62. package/dist/viewer/{dist-CitzQ6z1.js → dist-rkIdnkmY.js} +4 -4
  63. package/dist/viewer/{dist-D_Vtqh_s.js → dist-s3i70bod.js} +1 -1
  64. package/dist/viewer/{ebnfDiagram-PWID7BFC-BUmzlASS.js → ebnfDiagram-PWID7BFC-c_bXfo9C.js} +1 -1
  65. package/dist/viewer/{el-GR-BZB4AONW-CU9I6jx_.js → el-GR-BZB4AONW-DuM6nGWb.js} +1 -1
  66. package/dist/viewer/{en-B4ZKOASM-DGboqHSv.js → en-B4ZKOASM-Cr7s3JvY.js} +1 -1
  67. package/dist/viewer/{erDiagram-RLTQ6QDP-DRUmIoEG.js → erDiagram-RLTQ6QDP-B-DgtUd4.js} +1 -1
  68. package/dist/viewer/{es-ES-U4NZUMDT-j5HevUjd.js → es-ES-U4NZUMDT-DNvSsfqo.js} +1 -1
  69. package/dist/viewer/{eu-ES-A7QVB2H4-FpISoaoc.js → eu-ES-A7QVB2H4-NECtmtc_.js} +1 -1
  70. package/dist/viewer/{fa-IR-HGAKTJCU-COJsQztN.js → fa-IR-HGAKTJCU-fp_dFFfn.js} +1 -1
  71. package/dist/viewer/{fi-FI-Z5N7JZ37-BNHsLnGq.js → fi-FI-Z5N7JZ37-uZ8T0uZ2.js} +1 -1
  72. package/dist/viewer/flowDiagram-HODETNUW-QbMFIBc7.js +1 -0
  73. package/dist/viewer/{fr-FR-RHASNOE6-CM9a28Dh.js → fr-FR-RHASNOE6-DYF69T_L.js} +1 -1
  74. package/dist/viewer/{ganttDiagram-EL5Y4UJY-BVcwKFHE.js → ganttDiagram-EL5Y4UJY-C7nYK4VV.js} +1 -1
  75. package/dist/viewer/{gitGraphDiagram-WWUBYQGX-CZxp-Wm4.js → gitGraphDiagram-WWUBYQGX-BYs6a9XC.js} +1 -1
  76. package/dist/viewer/{gl-ES-HMX3MZ6V-C5aDlPBE.js → gl-ES-HMX3MZ6V-Cjlf8qDo.js} +1 -1
  77. package/dist/viewer/{he-IL-6SHJWFNN-eFs-GSWn.js → he-IL-6SHJWFNN-B44gxQ_q.js} +1 -1
  78. package/dist/viewer/{hi-IN-IWLTKZ5I-O1MAguUp.js → hi-IN-IWLTKZ5I-DHRyKjrX.js} +1 -1
  79. package/dist/viewer/{hu-HU-A5ZG7DT2-B3meydQb.js → hu-HU-A5ZG7DT2-B0x2fwF-.js} +1 -1
  80. package/dist/viewer/{id-ID-SAP4L64H-PHNH2hzW.js → id-ID-SAP4L64H-Xxsnu-eK.js} +1 -1
  81. package/dist/viewer/{image-GAAHSSAO-BJifdIGE.js → image-GAAHSSAO-DmsBDNOK.js} +1 -1
  82. package/dist/viewer/index.js +3 -3
  83. package/dist/viewer/index2.css +21 -1
  84. package/dist/viewer/{infoDiagram-27XIBGKW-D5Ag03ug.js → infoDiagram-27XIBGKW-OPdlHu-j.js} +1 -1
  85. package/dist/viewer/{ishikawaDiagram-5VMMS53U-B9SCwzFe.js → ishikawaDiagram-5VMMS53U-3fyfjNAh.js} +1 -1
  86. package/dist/viewer/{it-IT-JPQ66NNP-DHOLiY7r.js → it-IT-JPQ66NNP-B0X8yQyS.js} +1 -1
  87. package/dist/viewer/{ja-JP-DBVTYXUO-DTOuZQy0.js → ja-JP-DBVTYXUO-CnhqD0fK.js} +1 -1
  88. package/dist/viewer/{journeyDiagram-3NMN7TZE-CQvvWgCk.js → journeyDiagram-3NMN7TZE-BD_Ll3Bo.js} +1 -1
  89. package/dist/viewer/{kaa-6HZHGXH3-1d0tKthK.js → kaa-6HZHGXH3-BzhTyhLc.js} +1 -1
  90. package/dist/viewer/{kab-KAB-ZGHBKWFO-BaPyqYzR.js → kab-KAB-ZGHBKWFO-DGiUv22x.js} +1 -1
  91. package/dist/viewer/{kanban-definition-UXKFOSKX-Bg-Q4j28.js → kanban-definition-UXKFOSKX-BspaC3q1.js} +1 -1
  92. package/dist/viewer/{kk-KZ-P5N5QNE5-BqF9n_h-.js → kk-KZ-P5N5QNE5-DH8jyrO_.js} +1 -1
  93. package/dist/viewer/{km-KH-HSX4SM5Z-DPTb_KDC.js → km-KH-HSX4SM5Z-CTtH-yq7.js} +1 -1
  94. package/dist/viewer/{ko-KR-MTYHY66A-DxGidADD.js → ko-KR-MTYHY66A-kp3bbs3q.js} +1 -1
  95. package/dist/viewer/{ku-TR-6OUDTVRD-BECmOCof.js → ku-TR-6OUDTVRD-CniHyrQH.js} +1 -1
  96. package/dist/viewer/{lt-LT-XHIRWOB4-DKQm4SS0.js → lt-LT-XHIRWOB4-C5_ErQjQ.js} +1 -1
  97. package/dist/viewer/{lv-LV-5QDEKY6T-C4kUM3XE.js → lv-LV-5QDEKY6T-DH2pmwSL.js} +1 -1
  98. package/dist/viewer/{mindmap-definition-YA3MSWOX-DRQfDlAQ.js → mindmap-definition-YA3MSWOX-gbG6Nf0i.js} +1 -1
  99. package/dist/viewer/{mr-IN-CRQNXWMA-CutHorlk.js → mr-IN-CRQNXWMA-4I7m5ob-.js} +1 -1
  100. package/dist/viewer/{my-MM-5M5IBNSE-BqscH03z.js → my-MM-5M5IBNSE-0nHUTGbL.js} +1 -1
  101. package/dist/viewer/{nb-NO-T6EIAALU-Dqflwtt9.js → nb-NO-T6EIAALU-DfqC7CQ7.js} +1 -1
  102. package/dist/viewer/{nl-NL-IS3SIHDZ-BFq09PQX.js → nl-NL-IS3SIHDZ-Bjzz0r--.js} +1 -1
  103. package/dist/viewer/{nn-NO-6E72VCQL-BNIuUKOs.js → nn-NO-6E72VCQL-m2jjAc9n.js} +1 -1
  104. package/dist/viewer/{oc-FR-POXYY2M6-Bz0jVYcW.js → oc-FR-POXYY2M6-CAVYt9Ft.js} +1 -1
  105. package/dist/viewer/{pa-IN-N4M65BXN-Diu6ZQtk.js → pa-IN-N4M65BXN-CrcUCfFF.js} +1 -1
  106. package/dist/viewer/{pegDiagram-XKGWAZYB-COMSnXOr.js → pegDiagram-XKGWAZYB-MIcAh6C6.js} +1 -1
  107. package/dist/viewer/percentages-BXMCSKIN-I1K7WJgu.js +1 -0
  108. package/dist/viewer/{pieDiagram-E7YTZNPT-gHe-bm7N.js → pieDiagram-E7YTZNPT-mI3-_ikZ.js} +1 -1
  109. package/dist/viewer/{pl-PL-T2D74RX3-CCwgP0Tt.js → pl-PL-T2D74RX3-CGPvBMhq.js} +1 -1
  110. package/dist/viewer/{prod-iZwju1YX.js → prod-DdQVR1xL.js} +8 -8
  111. package/dist/viewer/{pt-BR-5N22H2LF-CNn18ypM.js → pt-BR-5N22H2LF-jUQJyEPF.js} +1 -1
  112. package/dist/viewer/{pt-PT-UZXXM6DQ-BMoRZ8jH.js → pt-PT-UZXXM6DQ-4quEbcoT.js} +1 -1
  113. package/dist/viewer/{quadrantDiagram-AXDQQJYC-YkFWTX48.js → quadrantDiagram-AXDQQJYC-qOr_Ag5n.js} +1 -1
  114. package/dist/viewer/{railroadDiagram-O6MQD6OU-BP58ggYs.js → railroadDiagram-O6MQD6OU-C8uzuX6Z.js} +1 -1
  115. package/dist/viewer/{requirementDiagram-BXWQKSXE-B4RcZ6Uz.js → requirementDiagram-BXWQKSXE-Dz0j-_Ul.js} +1 -1
  116. package/dist/viewer/{ro-RO-JPDTUUEW-SoalcNvO.js → ro-RO-JPDTUUEW-Fux6vqWg.js} +1 -1
  117. package/dist/viewer/{ru-RU-B4JR7IUQ-DkWHaRhg.js → ru-RU-B4JR7IUQ-Dfr69XLN.js} +1 -1
  118. package/dist/viewer/{sequenceDiagram-WJ2MYXX4-C5uL0tpK.js → sequenceDiagram-WJ2MYXX4-DJU5fD19.js} +1 -1
  119. package/dist/viewer/{si-LK-N5RQ5JYF-eD68JhLY.js → si-LK-N5RQ5JYF-Cb-bjtRn.js} +1 -1
  120. package/dist/viewer/{sk-SK-C5VTKIMK-EXqkY3Ta.js → sk-SK-C5VTKIMK-CohdnzY8.js} +1 -1
  121. package/dist/viewer/{sl-SI-NN7IZMDC-D2V_J_sw.js → sl-SI-NN7IZMDC-DHVdRHE2.js} +1 -1
  122. package/dist/viewer/{stateDiagram-D77RDMKH-DkyLdU7q.js → stateDiagram-D77RDMKH-Rooio_TB.js} +1 -1
  123. package/dist/viewer/stateDiagram-v2-MP3YSRHH-DU1T3Lmf.js +1 -0
  124. package/dist/viewer/subset-shared.chunk-CrkhCoQF.js +1 -0
  125. package/dist/viewer/{subset-worker.chunk-B92dIZyQ.js → subset-worker.chunk-Zq5HEGfq.js} +1 -1
  126. package/dist/viewer/{sv-SE-XGPEYMSR-Bzbzaslo.js → sv-SE-XGPEYMSR-BU075tJ9.js} +1 -1
  127. package/dist/viewer/{swimlanes-42K2YHIH-BWEGkPBm.js → swimlanes-42K2YHIH-BBJBvoSV.js} +1 -1
  128. package/dist/viewer/swimlanesDiagram-VR7AAH4N-NfEcSN_S.js +8 -0
  129. package/dist/viewer/{ta-IN-2NMHFXQM-BkRw8Ab-.js → ta-IN-2NMHFXQM-D5U6fuX5.js} +1 -1
  130. package/dist/viewer/{th-TH-HPSO5L25-DpxjfRSg.js → th-TH-HPSO5L25-5svbXPdz.js} +1 -1
  131. package/dist/viewer/{timeline-definition-24CTP7MA-BEYELt88.js → timeline-definition-24CTP7MA-B0TrCHZJ.js} +1 -1
  132. package/dist/viewer/{tr-TR-DEFEU3FU-CDIHZRzE.js → tr-TR-DEFEU3FU-CtJIUVOL.js} +1 -1
  133. package/dist/viewer/{uk-UA-QMV73CPH-BX8bS5mk.js → uk-UA-QMV73CPH-BUwW5t5R.js} +1 -1
  134. package/dist/viewer/{vennDiagram-4TSXK5OY-CWnDIkB0.js → vennDiagram-4TSXK5OY-I1KbtT6m.js} +1 -1
  135. package/dist/viewer/{vi-VN-M7AON7JQ-uPTH0PFh.js → vi-VN-M7AON7JQ-CEi077aa.js} +1 -1
  136. package/dist/viewer/{wardleyDiagram-VM6X3IG4-DazKGA6Y.js → wardleyDiagram-VM6X3IG4-BBsUCECp.js} +1 -1
  137. package/dist/viewer/{xychartDiagram-S5SC5T6Z-sQuCm3yV.js → xychartDiagram-S5SC5T6Z-CVMwOWKp.js} +1 -1
  138. package/dist/viewer/{zh-CN-LNUGB5OW-CSw936pf.js → zh-CN-LNUGB5OW-BSFQBwv1.js} +1 -1
  139. package/dist/viewer/{zh-HK-E62DVLB3-D5pp2ILq.js → zh-HK-E62DVLB3-C_UX1aQ7.js} +1 -1
  140. package/dist/viewer/{zh-TW-RAJ6MFWO-DUVdEREg.js → zh-TW-RAJ6MFWO-BvBIQhnc.js} +1 -1
  141. package/package.json +7 -5
  142. package/dist/start-server.sh +0 -359
  143. package/dist/viewer/DocumentPage-DQmrD0th.js +0 -1
  144. package/dist/viewer/classDiagram-ZZMXUADV-BJqflR68.js +0 -1
  145. package/dist/viewer/classDiagram-v2-VYDZK3BY-BJqflR68.js +0 -1
  146. package/dist/viewer/flowDiagram-HODETNUW-BIce5Xbz.js +0 -1
  147. package/dist/viewer/percentages-BXMCSKIN-C4UC-sd0.js +0 -1
  148. package/dist/viewer/stateDiagram-v2-MP3YSRHH-BMCqlN4T.js +0 -1
  149. package/dist/viewer/subset-shared.chunk-pCVh-jxe.js +0 -1
  150. package/dist/viewer/swimlanesDiagram-VR7AAH4N-a8X5vJTG.js +0 -8
@@ -1,53 +1,2 @@
1
1
  #!/usr/bin/env node
2
- const { execFile, spawn } = require('node:child_process');
3
- const fs = require('node:fs');
4
- const path = require('node:path');
5
- const readline = require('node:readline');
6
- const { parseArgs } = require('node:util');
7
-
8
- try {
9
- const { values, positionals } = parseArgs({
10
- options: {
11
- help: { type: 'boolean', short: 'h' },
12
- 'no-open': { type: 'boolean' },
13
- 'project-dir': { type: 'string' },
14
- },
15
- allowPositionals: true,
16
- });
17
- if (values.help) {
18
- console.log('Usage: ryugi-artifacts [project-directory] [--no-open]\n\nOpen the current project’s artifacts in your browser.\n\n --project-dir <path> Project directory (default: current directory)\n --no-open Print the URL without opening a browser\n -h, --help Show this help\n\nRequires Node.js and Bash (Git Bash on Windows).');
19
- } else {
20
- if (positionals.length > 1 || (positionals.length && values['project-dir'])) throw new Error('Specify one project directory.');
21
- const project = fs.realpathSync(path.resolve(values['project-dir'] || positionals[0] || process.cwd()));
22
- if (!fs.statSync(project).isDirectory()) throw new Error('Project path must be a directory.');
23
- const child = spawn('bash', [path.join(__dirname, '../dist/start-server.sh'), '--project-dir', project, '--foreground', '--no-open'], {
24
- stdio: ['inherit', 'pipe', 'inherit'],
25
- });
26
- let interrupted = false;
27
- for (const signal of ['SIGINT', 'SIGTERM']) process.on(signal, () => {
28
- interrupted = true;
29
- child.kill('SIGTERM');
30
- });
31
- child.on('error', (error) => {
32
- console.error(`Could not start artifacts: ${error.message}. Bash is required (Git Bash on Windows).`);
33
- process.exitCode = 1;
34
- });
35
- readline.createInterface({ input: child.stdout }).on('line', (line) => {
36
- let info;
37
- try { info = JSON.parse(line); } catch { console.error(line); return; }
38
- if (info.error) console.error(info.error);
39
- if (info.type !== 'server-started') return;
40
- console.log(info.url);
41
- if (!info.reused) console.log('Press Ctrl+C to stop the server.');
42
- if (values['no-open']) return;
43
- const platform = process.platform;
44
- const command = platform === 'darwin' ? 'open' : platform === 'win32' ? 'cmd' : 'xdg-open';
45
- const args = platform === 'win32' ? ['/c', 'start', '""', info.url] : [info.url];
46
- execFile(command, args, () => {});
47
- });
48
- child.on('close', (code) => { process.exitCode = interrupted ? 0 : code ?? 1; });
49
- }
50
- } catch (error) {
51
- console.error(error.message);
52
- process.exitCode = 1;
53
- }
2
+ require('../dist/cli.cjs');
package/dist/cli.cjs ADDED
@@ -0,0 +1,594 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
18
+ // If the importer is in node compatibility mode or this is not an ESM
19
+ // file that has been converted to a CommonJS file using a Babel-
20
+ // compatible transform (i.e. "__esModule" has not been set), then set
21
+ // "default" to the CommonJS "module.exports" for node compatibility.
22
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
23
+ mod
24
+ ));
25
+
26
+ // src/cli/main.ts
27
+ var import_node_child_process3 = require("node:child_process");
28
+ var import_node_util = require("node:util");
29
+
30
+ // src/cli/paths.ts
31
+ var import_node_fs = __toESM(require("node:fs"), 1);
32
+ var import_node_path = __toESM(require("node:path"), 1);
33
+ var CliError = class extends Error {
34
+ constructor(message, fields = {}, code = 1) {
35
+ super(message);
36
+ this.fields = fields;
37
+ this.code = code;
38
+ }
39
+ fields;
40
+ code;
41
+ };
42
+ function projectPaths(dir) {
43
+ let project;
44
+ try {
45
+ project = import_node_fs.default.realpathSync(import_node_path.default.resolve(dir));
46
+ if (!import_node_fs.default.statSync(project).isDirectory()) throw new Error();
47
+ } catch {
48
+ throw new CliError(`Project directory not found: ${dir}`);
49
+ }
50
+ const root = import_node_path.default.join(project, ".ryugi", "artifacts");
51
+ const state = import_node_path.default.join(root, ".state");
52
+ return {
53
+ project,
54
+ root,
55
+ state,
56
+ pid: import_node_path.default.join(state, "server.pid"),
57
+ log: import_node_path.default.join(state, "server.log"),
58
+ serverId: import_node_path.default.join(state, "server-instance-id"),
59
+ info: import_node_path.default.join(state, "server-info"),
60
+ version: import_node_path.default.join(state, "server-version"),
61
+ owners: import_node_path.default.join(state, "owners"),
62
+ agent: import_node_path.default.join(state, "agent"),
63
+ stopped: import_node_path.default.join(state, "server-stopped"),
64
+ lock: import_node_path.default.join(state, "start.lock")
65
+ };
66
+ }
67
+ var ARTIFACT_PATTERN = /^(artboard|document|html)\/[a-z0-9][a-z0-9-]*$/;
68
+ var ARTIFACT_ERROR = "--artifact must be <type>/<id>: type artboard, document or html, id of lowercase letters, digits and hyphens";
69
+
70
+ // src/cli/start.ts
71
+ var import_node_child_process2 = require("node:child_process");
72
+ var import_node_crypto = __toESM(require("node:crypto"), 1);
73
+ var import_node_fs3 = __toESM(require("node:fs"), 1);
74
+ var import_node_path2 = __toESM(require("node:path"), 1);
75
+ var import_node_readline = __toESM(require("node:readline"), 1);
76
+
77
+ // src/server/agent.ts
78
+ var NAMES = {
79
+ claude: "Claude Code",
80
+ "claude-code": "Claude Code",
81
+ cowork: "Claude Cowork",
82
+ codex: "Codex",
83
+ cursor: "Cursor",
84
+ "cursor-cli": "Cursor",
85
+ gemini: "Gemini CLI",
86
+ "gemini-cli": "Gemini CLI",
87
+ "github-copilot": "GitHub Copilot",
88
+ "github-copilot-cli": "GitHub Copilot",
89
+ kilo: "Kilo Code",
90
+ opencode: "OpenCode",
91
+ "qwen-code": "Qwen Code",
92
+ antigravity: "Antigravity",
93
+ augment: "Augment",
94
+ "augment-cli": "Augment",
95
+ goose: "Goose",
96
+ amp: "Amp",
97
+ cline: "Cline",
98
+ roo: "Roo Code",
99
+ devin: "Devin",
100
+ replit: "Replit",
101
+ v0: "v0"
102
+ };
103
+ var AGENT_DISPLAY_NAMES = [...new Set(Object.values(NAMES))];
104
+ var AGENT_MARKERS = [
105
+ "AI_AGENT",
106
+ "AGENT",
107
+ "CLAUDE_CODE_IS_COWORK",
108
+ "KILO",
109
+ "CODEX_THREAD_ID",
110
+ "CODEX_SANDBOX",
111
+ "CODEX_CI",
112
+ "CURSOR_AGENT",
113
+ "CURSOR_TRACE_ID",
114
+ "GEMINI_CLI",
115
+ "COPILOT_CLI",
116
+ "OPENCODE",
117
+ "OPENCODE_CLIENT",
118
+ "QWEN_CODE",
119
+ "ANTIGRAVITY_AGENT",
120
+ "AUGMENT_AGENT",
121
+ "CLINE_ACTIVE",
122
+ "ROO_ACTIVE",
123
+ "CLAUDECODE",
124
+ "CLAUDE_CODE"
125
+ ];
126
+
127
+ // src/cli/process.ts
128
+ var import_node_child_process = require("node:child_process");
129
+ var import_node_fs2 = __toESM(require("node:fs"), 1);
130
+ var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
131
+ function alive(pid) {
132
+ try {
133
+ process.kill(pid, 0);
134
+ return true;
135
+ } catch (err) {
136
+ return err.code === "EPERM";
137
+ }
138
+ }
139
+ function commandLine(pid) {
140
+ try {
141
+ return import_node_fs2.default.readFileSync(`/proc/${pid}/cmdline`, "utf8").split("\0");
142
+ } catch {
143
+ }
144
+ const direct = (0, import_node_child_process.spawnSync)("ps", ["-ww", "-p", String(pid), "-o", "command="], { encoding: "utf8" });
145
+ if (direct.status === 0 && direct.stdout.trim()) return direct.stdout.trim().split(/\s+/);
146
+ const full = (0, import_node_child_process.spawnSync)("ps", ["-f", "-p", String(pid)], { encoding: "utf8" });
147
+ if (full.status !== 0) return null;
148
+ const line = full.stdout.split("\n").slice(1).join(" ").trim();
149
+ return line ? line.split(/\s+/) : null;
150
+ }
151
+ function hasServerId(pid, id) {
152
+ if (!alive(pid)) return false;
153
+ if (process.platform === "win32") return true;
154
+ return commandLine(pid)?.includes(`--artifacts-server-id=${id}`) ?? false;
155
+ }
156
+ function parentOf(pid) {
157
+ if (process.platform === "win32") return null;
158
+ const result = (0, import_node_child_process.spawnSync)("ps", ["-o", "ppid=", "-p", String(pid)], { encoding: "utf8" });
159
+ const parent = Number(result.stdout.trim());
160
+ return Number.isInteger(parent) && parent > 1 ? parent : null;
161
+ }
162
+ async function waitForExit(pid, ms) {
163
+ for (let waited = 0; waited < ms && alive(pid); waited += 100) await sleep(100);
164
+ return !alive(pid);
165
+ }
166
+ var readText = (file) => {
167
+ try {
168
+ return import_node_fs2.default.readFileSync(file, "utf8").replace(/[\r\n]+$/, "");
169
+ } catch {
170
+ return null;
171
+ }
172
+ };
173
+
174
+ // src/cli/start.ts
175
+ var windowsLike = () => process.platform === "win32";
176
+ function withLink(info, artifact, reused) {
177
+ const out = { ...info };
178
+ if (reused) out.reused = true;
179
+ if (artifact && typeof out.url === "string") {
180
+ const url = new URL(out.url);
181
+ out.link = `${url.origin}/${artifact}?key=${url.searchParams.get("key")}`;
182
+ }
183
+ return out;
184
+ }
185
+ async function acquireLock(lock) {
186
+ for (let attempt = 0; attempt < 150; attempt++) {
187
+ try {
188
+ import_node_fs3.default.mkdirSync(lock);
189
+ return true;
190
+ } catch {
191
+ }
192
+ try {
193
+ if (Date.now() - import_node_fs3.default.statSync(lock).mtimeMs > 6e4) {
194
+ import_node_fs3.default.rmdirSync(lock);
195
+ continue;
196
+ }
197
+ } catch {
198
+ }
199
+ await sleep(100);
200
+ }
201
+ return false;
202
+ }
203
+ function runningPid(paths) {
204
+ const pid = Number(readText(paths.pid));
205
+ const id = readText(paths.serverId);
206
+ if (!Number.isInteger(pid) || pid <= 0 || !id) return null;
207
+ return hasServerId(pid, id) ? pid : null;
208
+ }
209
+ function ownerPid() {
210
+ if (windowsLike()) return null;
211
+ const given = Number(process.env.RYUGI_ARTIFACTS_OWNER);
212
+ if (Number.isInteger(given) && given > 1) return given;
213
+ return parentOf(process.ppid) ?? process.ppid;
214
+ }
215
+ function registerOwner(paths) {
216
+ const owners = /* @__PURE__ */ new Set();
217
+ for (const line of (readText(paths.owners) ?? "").split("\n")) {
218
+ const pid = Number(line.trim());
219
+ if (Number.isInteger(pid) && pid > 1 && alive(pid)) owners.add(pid);
220
+ }
221
+ const owner = ownerPid();
222
+ if (owner) owners.add(owner);
223
+ const tmp = `${paths.owners}.${process.pid}`;
224
+ import_node_fs3.default.writeFileSync(tmp, [...owners].sort((a, b) => a - b).map((pid) => `${pid}
225
+ `).join(""));
226
+ import_node_fs3.default.renameSync(tmp, paths.owners);
227
+ }
228
+ function recordAgent(paths) {
229
+ const markers = Object.fromEntries(AGENT_MARKERS.flatMap((key) => process.env[key] ? [[key, process.env[key]]] : []));
230
+ if (Object.keys(markers).length) import_node_fs3.default.writeFileSync(paths.agent, `${JSON.stringify(markers)}
231
+ `);
232
+ }
233
+ async function replace(pid) {
234
+ try {
235
+ process.kill(pid, "SIGTERM");
236
+ } catch {
237
+ }
238
+ if (await waitForExit(pid, 5e3)) return;
239
+ try {
240
+ process.kill(pid, "SIGKILL");
241
+ } catch {
242
+ }
243
+ if (await waitForExit(pid, 2e3)) return;
244
+ throw new CliError(`The running server (pid ${pid}) is on another release and did not stop; stop it with \`ryugi-artifacts stop\` and retry`);
245
+ }
246
+ function serverEnv(paths, options) {
247
+ const env = { ...process.env, ARTIFACTS_ROOT: paths.root, ARTIFACTS_HOST: options.host, ARTIFACTS_URL_HOST: options.urlHost, ARTIFACTS_OPEN: options.open ? "1" : "0" };
248
+ if (options.artifact) env.ARTIFACTS_OPEN_ARTIFACT = options.artifact;
249
+ if (options.idleTimeoutMinutes) env.ARTIFACTS_IDLE_TIMEOUT_MS = String(Number(options.idleTimeoutMinutes) * 6e4);
250
+ delete env.RYUGI_ARTIFACTS_OWNER;
251
+ delete env.RYUGI_ARTIFACTS_VERSION;
252
+ return env;
253
+ }
254
+ async function start(options, emit) {
255
+ if (options.artifact !== void 0 && !ARTIFACT_PATTERN.test(options.artifact)) throw new CliError(ARTIFACT_ERROR);
256
+ if (options.idleTimeoutMinutes !== void 0 && (!/^\d+$/.test(options.idleTimeoutMinutes) || Number(options.idleTimeoutMinutes) < 1)) throw new CliError("--idle-timeout-minutes must be a positive integer");
257
+ options.urlHost ||= options.host === "127.0.0.1" || options.host === "localhost" ? "localhost" : options.host;
258
+ const foreground = options.foreground || !options.background && (!!process.env.CODEX_CI || windowsLike());
259
+ process.umask(63);
260
+ const paths = projectPaths(options.projectDir);
261
+ import_node_fs3.default.mkdirSync(paths.state, { recursive: true });
262
+ if (!import_node_fs3.default.existsSync(import_node_path2.default.join(paths.state, ".gitignore"))) import_node_fs3.default.writeFileSync(import_node_path2.default.join(paths.state, ".gitignore"), "*\n");
263
+ const server = import_node_path2.default.join(__dirname, "server.cjs");
264
+ const version = process.env.RYUGI_ARTIFACTS_VERSION ?? "";
265
+ if (!await acquireLock(paths.lock)) throw new CliError("Another start for this project is still starting; retry in a moment");
266
+ let locked = true;
267
+ const unlock = () => {
268
+ if (!locked) return;
269
+ locked = false;
270
+ try {
271
+ import_node_fs3.default.rmdirSync(paths.lock);
272
+ } catch {
273
+ }
274
+ };
275
+ try {
276
+ const running = runningPid(paths);
277
+ const info = readText(paths.info);
278
+ if (running && info) {
279
+ if (!version || readText(paths.version) === version) {
280
+ registerOwner(paths);
281
+ recordAgent(paths);
282
+ emit(withLink(JSON.parse(info), options.artifact, true));
283
+ return 0;
284
+ }
285
+ await replace(running);
286
+ }
287
+ registerOwner(paths);
288
+ recordAgent(paths);
289
+ import_node_fs3.default.rmSync(paths.info, { force: true });
290
+ const id = import_node_crypto.default.randomBytes(24).toString("hex");
291
+ import_node_fs3.default.writeFileSync(paths.serverId, `${id}
292
+ `);
293
+ import_node_fs3.default.writeFileSync(paths.version, `${version}
294
+ `);
295
+ const env = serverEnv(paths, options);
296
+ const args = [server, `--artifacts-server-id=${id}`];
297
+ if (foreground) {
298
+ const child2 = (0, import_node_child_process2.spawn)(process.execPath, args, { env, stdio: ["ignore", "pipe", "inherit"] });
299
+ import_node_fs3.default.writeFileSync(paths.pid, `${child2.pid}
300
+ `);
301
+ for (const signal of ["SIGINT", "SIGTERM"]) process.on(signal, () => child2.kill("SIGTERM"));
302
+ import_node_readline.default.createInterface({ input: child2.stdout }).on("line", (line) => {
303
+ let value;
304
+ try {
305
+ value = JSON.parse(line);
306
+ } catch {
307
+ process.stdout.write(`${line}
308
+ `);
309
+ return;
310
+ }
311
+ emit(value.type === "server-started" ? withLink(value, options.artifact, false) : value);
312
+ });
313
+ const exited = new Promise((resolve) => child2.on("close", (code) => resolve(code ?? 1)));
314
+ for (let waited = 0; waited < 5e3 && !import_node_fs3.default.existsSync(paths.info); waited += 100) await sleep(100);
315
+ unlock();
316
+ return await exited;
317
+ }
318
+ const log = import_node_fs3.default.openSync(paths.log, "w");
319
+ const child = (0, import_node_child_process2.spawn)(process.execPath, args, { env, detached: true, stdio: ["ignore", log, log] });
320
+ import_node_fs3.default.closeSync(log);
321
+ child.unref();
322
+ import_node_fs3.default.writeFileSync(paths.pid, `${child.pid}
323
+ `);
324
+ for (let waited = 0; waited < 5e3; waited += 100) {
325
+ const lines = (readText(paths.log) ?? "").split("\n");
326
+ const started = lines.find((line) => line.includes('"server-started"'));
327
+ if (started) {
328
+ for (let check = 0; check < 20; check++) {
329
+ if (!alive(child.pid)) throw new CliError(`Server started but was killed. Retry in a persistent terminal with: ryugi-artifacts start --project-dir ${paths.project} --host ${options.host} --url-host ${options.urlHost} --foreground`);
330
+ await sleep(100);
331
+ }
332
+ emit(withLink(JSON.parse(started), options.artifact, false));
333
+ return 0;
334
+ }
335
+ const failed = lines.find((line) => line.includes('"server-error"'));
336
+ if (failed) {
337
+ emit(JSON.parse(failed));
338
+ return 1;
339
+ }
340
+ await sleep(100);
341
+ }
342
+ throw new CliError("Server failed to start within 5 seconds");
343
+ } finally {
344
+ unlock();
345
+ }
346
+ }
347
+
348
+ // src/cli/publish.ts
349
+ var NOT_RUNNING = "No artifacts server is running for this project. Start it with `ryugi-artifacts start`, then run this again.";
350
+ async function publish(options, emit) {
351
+ if (options.action === "publish" || options.action === "unpublish") {
352
+ if (!options.artifact) throw new CliError("--artifact <type>/<id> is required");
353
+ if (!ARTIFACT_PATTERN.test(options.artifact)) throw new CliError(ARTIFACT_ERROR);
354
+ }
355
+ if (options.action === "delete" && !/^[A-Za-z0-9_-]{1,64}$/.test(options.cloudId ?? "")) throw new CliError("--delete needs a cloud artifact id from --list");
356
+ const paths = projectPaths(options.projectDir);
357
+ let info;
358
+ try {
359
+ info = JSON.parse(readText(paths.info) ?? "");
360
+ } catch {
361
+ throw new CliError(NOT_RUNNING);
362
+ }
363
+ const base = new URL(info.url);
364
+ const key = base.searchParams.get("key") ?? "";
365
+ if (base.hostname === "localhost") base.hostname = "127.0.0.1";
366
+ const call = async (method, route, body) => {
367
+ let res;
368
+ try {
369
+ res = await fetch(`${base.origin}${route}?key=${encodeURIComponent(key)}`, {
370
+ method,
371
+ headers: body ? { "Content-Type": "application/json" } : {},
372
+ body: body ? JSON.stringify(body) : void 0
373
+ });
374
+ } catch {
375
+ throw new CliError(NOT_RUNNING);
376
+ }
377
+ const json = await res.json().catch(() => ({}));
378
+ if (res.status === 401) throw new CliError("", { type: "login-required", url: json.loginUrl, message: "Open url to sign in to the Ryugi cloud, then run the same command again." }, 2);
379
+ if (!res.ok) throw new CliError(json.error || `HTTP ${res.status}`, json.reasons ? { reasons: json.reasons } : {});
380
+ return json;
381
+ };
382
+ const { action, artifact, cloudId } = options;
383
+ if (action === "list") emit({ type: "cloud-artifacts", artifacts: (await call("GET", "/api/cloud/artifacts")).artifacts });
384
+ else if (action === "delete") {
385
+ await call("DELETE", `/api/cloud/artifacts/${cloudId}`);
386
+ emit({ type: "deleted", id: cloudId });
387
+ } else if (action === "login") emit({ type: "login", url: (await call("POST", "/api/cloud/login")).url, message: "Open url to sign in to the Ryugi cloud." });
388
+ else if (action === "logout") {
389
+ await call("POST", "/api/cloud/logout");
390
+ emit({ type: "logged-out" });
391
+ } else if (action === "unpublish") {
392
+ await call("DELETE", `/api/cloud/publish/${artifact}`);
393
+ emit({ type: "unpublished", artifact });
394
+ } else {
395
+ const published = await call("POST", `/api/cloud/publish/${artifact}`, options.visibility ? { visibility: options.visibility } : void 0);
396
+ emit({ type: "published", artifact, url: published.url, visibility: published.visibility });
397
+ }
398
+ return 0;
399
+ }
400
+
401
+ // src/cli/stop.ts
402
+ var import_node_fs4 = __toESM(require("node:fs"), 1);
403
+ async function stop(projectDir, emit) {
404
+ const paths = projectPaths(projectDir);
405
+ const markStopped = (reason) => {
406
+ import_node_fs4.default.rmSync(paths.info, { force: true });
407
+ import_node_fs4.default.mkdirSync(paths.state, { recursive: true });
408
+ import_node_fs4.default.writeFileSync(paths.stopped, `${JSON.stringify({ reason, timestamp: Math.floor(Date.now() / 1e3) })}
409
+ `);
410
+ };
411
+ const pid = Number(readText(paths.pid));
412
+ if (readText(paths.pid) === null) {
413
+ emit({ status: "not_running" });
414
+ return 0;
415
+ }
416
+ const id = readText(paths.serverId) ?? "";
417
+ if (!Number.isInteger(pid) || pid <= 0 || !/^[A-Za-z0-9_-]{32,64}$/.test(id) || !hasServerId(pid, id)) {
418
+ import_node_fs4.default.rmSync(paths.pid, { force: true });
419
+ import_node_fs4.default.rmSync(paths.serverId, { force: true });
420
+ markStopped("stale_pid");
421
+ emit({ status: "stale_pid" });
422
+ return 0;
423
+ }
424
+ try {
425
+ process.kill(pid, "SIGTERM");
426
+ } catch {
427
+ }
428
+ if (!await waitForExit(pid, 2e3)) {
429
+ try {
430
+ process.kill(pid, "SIGKILL");
431
+ } catch {
432
+ }
433
+ await waitForExit(pid, 1e3);
434
+ }
435
+ if (alive(pid)) {
436
+ emit({ status: "failed", error: "process still running" });
437
+ return 1;
438
+ }
439
+ for (const file of [paths.pid, paths.serverId, paths.log, paths.owners]) import_node_fs4.default.rmSync(file, { force: true });
440
+ markStopped("stop");
441
+ emit({ status: "stopped" });
442
+ return 0;
443
+ }
444
+
445
+ // src/cli/main.ts
446
+ var HELP = `Usage: ryugi-artifacts [project-directory] [--no-open]
447
+ ryugi-artifacts <command> [options]
448
+
449
+ Without a command, opens the project's artifacts in your browser and keeps the server
450
+ running until Ctrl+C.
451
+
452
+ Commands:
453
+ start Start the project's artifacts server, or reuse the running one
454
+ stop Stop the project's artifacts server; the artifacts are kept
455
+ publish Publish an artifact to the Ryugi cloud (needs a running server):
456
+ --artifact <type>/<id> [--public | --private] [--unpublish]
457
+ --list | --delete <cloud-id> | --login | --logout
458
+
459
+ Options:
460
+ --project-dir <path> Project directory (default: current directory)
461
+ --json Print one JSON line (default when not in a terminal)
462
+ -v, --version Print the version
463
+ --no-open Print the URL without opening a browser
464
+ -h, --help Show this help`;
465
+ var common = { "project-dir": { type: "string" }, json: { type: "boolean" } };
466
+ function parse(args, options, positionals = 0) {
467
+ try {
468
+ const parsed = (0, import_node_util.parseArgs)({ args, options: { ...common, ...options }, allowPositionals: positionals > 0, strict: true });
469
+ if (parsed.positionals.length > positionals) throw new CliError(`Unknown argument: ${parsed.positionals[positionals]}`);
470
+ return parsed;
471
+ } catch (err) {
472
+ if (err instanceof CliError) throw err;
473
+ const flag = /'([^']+)'/.exec(err.message)?.[1];
474
+ throw new CliError(flag ? `Unknown argument: ${flag.split(" ")[0]}` : err.message);
475
+ }
476
+ }
477
+ function text(value) {
478
+ if (typeof value.error === "string") return `Error: ${value.error}`;
479
+ if (value.type === "server-started") return `${value.link ?? value.url}${value.reused ? " (already running)" : ""}`;
480
+ if (value.type === "login-required" || value.type === "login") return `${value.message}
481
+ ${value.url}`;
482
+ if (value.type === "published") return `${value.url} (${value.visibility})`;
483
+ if (typeof value.status === "string") return value.status === "stopped" ? "Stopped." : value.status.replace(/_/g, " ");
484
+ return JSON.stringify(value);
485
+ }
486
+ function openBrowser(url) {
487
+ const command = process.platform === "darwin" ? "open" : process.platform === "win32" ? "cmd" : "xdg-open";
488
+ const args = process.platform === "win32" ? ["/c", "start", '""', url] : [url];
489
+ (0, import_node_child_process3.execFile)(command, args, () => {
490
+ });
491
+ }
492
+ async function browse(argv) {
493
+ const { values, positionals } = parse(argv, { "no-open": { type: "boolean" } }, 1);
494
+ if (positionals.length && values["project-dir"]) throw new CliError("Specify one project directory.");
495
+ return start({
496
+ projectDir: values["project-dir"] ?? positionals[0] ?? process.cwd(),
497
+ host: "127.0.0.1",
498
+ open: false,
499
+ foreground: true,
500
+ background: false
501
+ }, (value) => {
502
+ if (typeof value.error === "string") {
503
+ console.error(value.error);
504
+ return;
505
+ }
506
+ if (value.type !== "server-started") return;
507
+ console.log(value.url);
508
+ if (!value.reused) console.log("Press Ctrl+C to stop the server.");
509
+ if (!values["no-open"]) openBrowser(value.url);
510
+ });
511
+ }
512
+ async function main(argv) {
513
+ const [command, ...rest] = argv;
514
+ const json = argv.includes("--json") || !process.stdout.isTTY;
515
+ const emit = (value) => {
516
+ const line = json ? JSON.stringify(value) : text(value);
517
+ if (!json && typeof value.error === "string") console.error(line);
518
+ else console.log(line);
519
+ };
520
+ try {
521
+ if (command === "start") {
522
+ const { values } = parse(rest, {
523
+ artifact: { type: "string" },
524
+ host: { type: "string" },
525
+ "url-host": { type: "string" },
526
+ "idle-timeout-minutes": { type: "string" },
527
+ open: { type: "boolean" },
528
+ "no-open": { type: "boolean" },
529
+ foreground: { type: "boolean" },
530
+ "no-daemon": { type: "boolean" },
531
+ background: { type: "boolean" },
532
+ daemon: { type: "boolean" }
533
+ });
534
+ return await start({
535
+ projectDir: values["project-dir"] ?? process.cwd(),
536
+ artifact: values.artifact,
537
+ host: values.host ?? "127.0.0.1",
538
+ urlHost: values["url-host"],
539
+ idleTimeoutMinutes: values["idle-timeout-minutes"],
540
+ open: values["no-open"] ? false : values.open ? true : process.env.ARTIFACTS_OPEN !== "0",
541
+ foreground: !!(values.foreground || values["no-daemon"]),
542
+ background: !!(values.background || values.daemon)
543
+ }, emit);
544
+ }
545
+ if (command === "stop") {
546
+ const { values, positionals } = parse(rest, {}, 1);
547
+ return await stop(values["project-dir"] ?? positionals[0] ?? process.cwd(), emit);
548
+ }
549
+ if (command === "publish") {
550
+ const { values } = parse(rest, {
551
+ artifact: { type: "string" },
552
+ public: { type: "boolean" },
553
+ private: { type: "boolean" },
554
+ unpublish: { type: "boolean" },
555
+ list: { type: "boolean" },
556
+ delete: { type: "string" },
557
+ login: { type: "boolean" },
558
+ logout: { type: "boolean" }
559
+ });
560
+ const actions = ["unpublish", "list", "delete", "login", "logout"].filter((name) => values[name] !== void 0 && values[name] !== false);
561
+ if (actions.length > 1) throw new CliError(`Choose one of --${actions.join(", --")}`);
562
+ const action = actions[0] ?? "publish";
563
+ return await publish({
564
+ projectDir: values["project-dir"] ?? process.cwd(),
565
+ action,
566
+ artifact: values.artifact,
567
+ visibility: values.public ? "public" : values.private ? "private" : void 0,
568
+ cloudId: values.delete
569
+ }, emit);
570
+ }
571
+ if (command === "--version" || command === "-v") {
572
+ console.log("1.9.0");
573
+ return 0;
574
+ }
575
+ if (command === "--help" || command === "-h") {
576
+ console.log(HELP);
577
+ return 0;
578
+ }
579
+ return await browse(argv);
580
+ } catch (err) {
581
+ if (!(err instanceof CliError)) throw err;
582
+ emit(err.message ? { error: err.message, ...err.fields } : err.fields);
583
+ return err.code;
584
+ }
585
+ }
586
+ main(process.argv.slice(2)).then(
587
+ (code) => {
588
+ process.exitCode = code;
589
+ },
590
+ (err) => {
591
+ console.log(JSON.stringify({ error: err.message }));
592
+ process.exitCode = 1;
593
+ }
594
+ );