@metabase/cli 0.5.8 → 0.5.9

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 (281) hide show
  1. package/dist/{add-collection-DIrpeq9O.mjs → add-collection-CmMm_mrd.mjs} +3 -3
  2. package/dist/{alert-DuUreVMq.mjs → alert-DzgnuHeD.mjs} +7 -7
  3. package/dist/{alerts-C7vJ-NAI.mjs → alerts-XVPPjYuA.mjs} +6 -6
  4. package/dist/api-key-fIfek7nB.mjs +13 -0
  5. package/dist/{append-v3fakJOd.mjs → append-CroWojmD.mjs} +4 -4
  6. package/dist/{archive-DwVbn3FG.mjs → archive-3auH9Cqu.mjs} +3 -3
  7. package/dist/{archive-CuygjxgQ.mjs → archive-B5vB7VmB.mjs} +3 -3
  8. package/dist/{archive-BEhhmkTO.mjs → archive-BNSqVL0X.mjs} +3 -3
  9. package/dist/{archive-D299FxXt.mjs → archive-Bct5mmyU.mjs} +3 -3
  10. package/dist/{archive-BrGj2yoP.mjs → archive-C2IztpGM.mjs} +3 -3
  11. package/dist/{archive-TBPRGm7s.mjs → archive-CcY1DPPD.mjs} +3 -3
  12. package/dist/{archive-Cy6RUJaD.mjs → archive-CqO4ewSD.mjs} +3 -3
  13. package/dist/{archive-5pjvTser.mjs → archive-D2X9wa0V.mjs} +3 -3
  14. package/dist/{archive-CmhV_hlP.mjs → archive-DR7_wlfU.mjs} +3 -3
  15. package/dist/{archive-Bt8fwInI.mjs → archive-Df5QrYTT.mjs} +4 -4
  16. package/dist/{archive-CyhH-395.mjs → archive-Dvv8fBSZ.mjs} +3 -3
  17. package/dist/{archive-DdPaXaJo.mjs → archive-wE0j9Gh2.mjs} +4 -4
  18. package/dist/{auth-B63Hfuwg.mjs → auth-DZuXbdpQ.mjs} +5 -5
  19. package/dist/{branches-BM0L124r.mjs → branches-BezC3sHZ.mjs} +3 -3
  20. package/dist/{breaking-VMUrgVVE.mjs → breaking-CqjNq8CR.mjs} +5 -5
  21. package/dist/{broken-BbpNq5WG.mjs → broken-lZ8qMOln.mjs} +6 -6
  22. package/dist/{bulk-discard-values-Cohox-Zb.mjs → bulk-discard-values-BPXPfKJy.mjs} +5 -5
  23. package/dist/{bulk-edit-B9-XH592.mjs → bulk-edit-Bajdousu.mjs} +3 -3
  24. package/dist/{bulk-rescan-values-CsWKirZw.mjs → bulk-rescan-values-BtjDygX8.mjs} +4 -4
  25. package/dist/{bulk-sync-schema-CorpcAjz.mjs → bulk-sync-schema-B14uspcP.mjs} +4 -4
  26. package/dist/{cancel-iGUVm1h2.mjs → cancel-DEVOa-MW.mjs} +3 -3
  27. package/dist/{cancel-task-DWiicb_t.mjs → cancel-task-CTwY4JBD.mjs} +2 -2
  28. package/dist/card-6k-rr68M.mjs +25 -0
  29. package/dist/{cards-D6jWz0N9.mjs → cards-Crcdtq-N.mjs} +4 -4
  30. package/dist/{ci-BQKTyiRi.mjs → ci-jYpJfw-b.mjs} +2 -2
  31. package/dist/cli.mjs +48 -43
  32. package/dist/{client-Ba61gEcn.mjs → client-KtK81Nqf.mjs} +5 -5
  33. package/dist/collection-D_GyzwaY.mjs +21 -0
  34. package/dist/{collection-namespace-D0_-6eWp.mjs → collection-namespace-lQLOPUbc.mjs} +1 -1
  35. package/dist/{content-translation-B57aHSuc.mjs → content-translation-DxQ9Ofz9.mjs} +3 -3
  36. package/dist/{copy-BeD_fk5J.mjs → copy-CoxRAUMr.mjs} +4 -4
  37. package/dist/{copy-D-VIVVB1.mjs → copy-DFitNtKJ.mjs} +4 -4
  38. package/dist/{copy-flags-BcW9weVX.mjs → copy-flags-Bgy3sSFg.mjs} +1 -1
  39. package/dist/{create-_wex54m1.mjs → create-BC9wRB9s.mjs} +2 -2
  40. package/dist/{create-BURh8kHp.mjs → create-BGbRafMp.mjs} +3 -3
  41. package/dist/{create-CGiSOtIR.mjs → create-Bb88WIvb.mjs} +3 -3
  42. package/dist/{create-B--aPIbp.mjs → create-C-YkTe7c.mjs} +2 -2
  43. package/dist/{create-Bw9DAq_x2.mjs → create-C0AulMAA2.mjs} +5 -5
  44. package/dist/{create-lHqpAdxg.mjs → create-CbC0hOjy.mjs} +3 -3
  45. package/dist/{create-Dm8BvbsU.mjs → create-Cry2OdY-.mjs} +2 -2
  46. package/dist/{create-DQOapeeI.mjs → create-Cw69tpmd.mjs} +3 -3
  47. package/dist/{create-zALsdMhF.mjs → create-D7g0hJOc.mjs} +2 -2
  48. package/dist/{create-MmZVmRsH.mjs → create-D9NWzXsE.mjs} +2 -2
  49. package/dist/{create-DF7nC9qW.mjs → create-DOe4dci_.mjs} +2 -2
  50. package/dist/{create-D44fg_iT.mjs → create-DR24U6M5.mjs} +2 -2
  51. package/dist/{create-DcDyXL4g.mjs → create-DZ7qd9Ml.mjs} +2 -2
  52. package/dist/{create-BlmRvuQg.mjs → create-Dgle-z_r.mjs} +3 -3
  53. package/dist/{create-DybrZHV-.mjs → create-Dja5oR7y.mjs} +2 -2
  54. package/dist/{create-D-Eu1nBe.mjs → create-W6plJIxv.mjs} +3 -3
  55. package/dist/{create-CP9lrYE4.mjs → create-Y4dYSqkx.mjs} +2 -2
  56. package/dist/{create-branch-C8arQT4M.mjs → create-branch-3zuqlQtJ.mjs} +2 -2
  57. package/dist/{create-HNchuWpj.mjs → create-fES0KGq_.mjs} +3 -3
  58. package/dist/{create-C6c-clLK.mjs → create-ktw5Ac64.mjs} +3 -3
  59. package/dist/{create-DMtlDzrE.mjs → create-tNnX8P12.mjs} +3 -3
  60. package/dist/{csv-CFabsH6l.mjs → csv-BAHZWlX7.mjs} +4 -4
  61. package/dist/{current-task-GG6JqfGp.mjs → current-task-iCOdB8fq.mjs} +2 -2
  62. package/dist/dashboard-CZTlBLWV.mjs +35 -0
  63. package/dist/data-action-C4wpuM5b.mjs +24 -0
  64. package/dist/{data-app-DtW2i2SD.mjs → data-app-DLKxuzzt.mjs} +9 -10
  65. package/dist/{data-app-project-CHYcJRrU.mjs → data-app-project-tbEA14ZN.mjs} +2 -11
  66. package/dist/{db-DSj2I1X9.mjs → db-p_oz1oom.mjs} +8 -8
  67. package/dist/{delete-Dkwk2mZH.mjs → delete-1gN-o-5K.mjs} +4 -4
  68. package/dist/{delete-CsgkbmBy.mjs → delete-CG2tAvao.mjs} +4 -4
  69. package/dist/{delete-Cx75BsN6.mjs → delete-CioggolY.mjs} +4 -4
  70. package/dist/{delete-CxL5okLN.mjs → delete-D4lz39ia.mjs} +4 -4
  71. package/dist/{delete-CnGb4QIm.mjs → delete-DLdB_wgT.mjs} +4 -4
  72. package/dist/{delete-AF64p0xG.mjs → delete-Dk_HWWGD.mjs} +4 -4
  73. package/dist/{delete-D_l7FRE6.mjs → delete-PGOszHpK.mjs} +4 -4
  74. package/dist/{delete-runtime-BUbOQx5I.mjs → delete-runtime-CdyjCkIN.mjs} +1 -1
  75. package/dist/{delete-table-CubRk-5H.mjs → delete-table-Cac6Ca0V.mjs} +4 -4
  76. package/dist/{delete-YKX2HilI.mjs → delete-udML_JUv.mjs} +4 -4
  77. package/dist/{delete-C6N_Aj78.mjs → delete-yifA3qMj.mjs} +4 -4
  78. package/dist/{delete-ClT1ROrM.mjs → delete-z-gK8iJm.mjs} +3 -3
  79. package/dist/{dependencies-W2dxsCpF.mjs → dependencies-BHAXa11a.mjs} +5 -5
  80. package/dist/dependency-DAZ7izEx.mjs +15 -0
  81. package/dist/{dependency-BPCRTBKd.mjs → dependency-DdeyH8m5.mjs} +1 -1
  82. package/dist/{dependents-B4V8pDYq.mjs → dependents-CQW2r57U.mjs} +6 -6
  83. package/dist/{dirty-DKj4ScBN.mjs → dirty-5J3cFbn0.mjs} +3 -3
  84. package/dist/{discard-values-5l91z3Dy.mjs → discard-values-DoMNb8_8.mjs} +5 -5
  85. package/dist/document-BfUBDUop.mjs +20 -0
  86. package/dist/{download-DRxR3yGi.mjs → download-DKC9Fc5U.mjs} +2 -2
  87. package/dist/{eid-B6JYogNC.mjs → eid-CaOQrj7K.mjs} +2 -2
  88. package/dist/{entry-flags-6Y0fdYbG.mjs → entry-flags-D9XxKqja.mjs} +1 -1
  89. package/dist/{events-CE80dTib.mjs → events-xcwriG3s.mjs} +4 -4
  90. package/dist/{execute-C9foK2IU.mjs → execute-Bl0aIiVm.mjs} +3 -3
  91. package/dist/{export-B8QyoPWP.mjs → export-CAAsW3Ic.mjs} +3 -3
  92. package/dist/{export-flags-DvdxpRMt.mjs → export-flags-DkbYlWlE.mjs} +1 -1
  93. package/dist/{export-preflight-BQbwxyoJ.mjs → export-preflight-z3se4KNH.mjs} +2 -2
  94. package/dist/field-BaP1WuNk.mjs +21 -0
  95. package/dist/{fields-TE3PnmwW.mjs → fields-D6ahsDuL.mjs} +4 -4
  96. package/dist/{filter-flags-DAUmdUwa.mjs → filter-flags-B5jGUuHb.mjs} +1 -1
  97. package/dist/{fks-B41Re5dt.mjs → fks-YDJYEf6A.mjs} +5 -5
  98. package/dist/{get-uWk0JKvF.mjs → get-B--gct26.mjs} +4 -4
  99. package/dist/{get-BAGQ-bvt.mjs → get-B2EZrxOx.mjs} +3 -3
  100. package/dist/{get-CefCrGWy.mjs → get-B37iHLDH.mjs} +3 -3
  101. package/dist/{get-Ck0cRNyr.mjs → get-B6_odQZ5.mjs} +4 -4
  102. package/dist/{get-m-vpr7GN.mjs → get-BP1LF94h.mjs} +3 -3
  103. package/dist/{get-DG5fPl-S.mjs → get-BTGk87ul.mjs} +4 -4
  104. package/dist/{get-sjhoDJyB.mjs → get-B_umve7N.mjs} +5 -5
  105. package/dist/{get-DeiC05Lm.mjs → get-BqRBiE5p.mjs} +3 -3
  106. package/dist/{get-BcWr6U0n.mjs → get-Buo9ZBkR.mjs} +2 -2
  107. package/dist/{get-CU6AWbqL.mjs → get-Bvm3hqLA.mjs} +3 -3
  108. package/dist/{get-PLIbg3Vy.mjs → get-C3nYPTjw.mjs} +3 -3
  109. package/dist/{get-DbZDp2ve.mjs → get-CIF7wpWz.mjs} +3 -3
  110. package/dist/{get-BscyItLF.mjs → get-CLS88UQZ.mjs} +3 -3
  111. package/dist/{get-3XwqrjxC.mjs → get-CshKB-TI.mjs} +3 -3
  112. package/dist/{get-DJeeXbwj.mjs → get-D-GWrJbm.mjs} +3 -3
  113. package/dist/{get-BJgBsiEK.mjs → get-DDco3nzW.mjs} +2 -2
  114. package/dist/{get-CtRJUybv.mjs → get-DRyMrvcE.mjs} +3 -3
  115. package/dist/{get-DvPgnqAA.mjs → get-DVjckQ-H.mjs} +2 -2
  116. package/dist/{get-CCTRO18v.mjs → get-DYVS_TQr.mjs} +4 -4
  117. package/dist/{get-Cjk-A9dQ.mjs → get-DbMcR5BK.mjs} +3 -3
  118. package/dist/{get-BrhIHZYg.mjs → get-DlmfJ-Oz.mjs} +3 -3
  119. package/dist/{get-DguRhloC.mjs → get-_U_p81sV.mjs} +2 -2
  120. package/dist/{get-run-DnKCnvUa.mjs → get-run-TKAGC3P7.mjs} +4 -4
  121. package/dist/git-sync-OiTQkETw.mjs +29 -0
  122. package/dist/glossary-Lh3tF1Qq.mjs +14 -0
  123. package/dist/{graph-B2YkV2oX.mjs → graph-PlB4hnwq.mjs} +4 -4
  124. package/dist/{group-D1nGaEXW.mjs → group-DxaqX3Gg.mjs} +1 -1
  125. package/dist/{has-remote-changes-ChMSjhmC.mjs → has-remote-changes-DEWZ6Ou9.mjs} +2 -2
  126. package/dist/{import-CNpN9iS0.mjs → import-B2ypv7h6.mjs} +3 -3
  127. package/dist/{is-dirty-Bud2wuxQ.mjs → is-dirty-DOT8Vudt.mjs} +2 -2
  128. package/dist/{items-B1DXzdwg.mjs → items-B3_o0a77.mjs} +3 -3
  129. package/dist/{library-8G0s5VLO.mjs → library-Cb2Fftvz.mjs} +5 -5
  130. package/dist/{list-Ckqu41Zx.mjs → list--edVvzMi.mjs} +3 -3
  131. package/dist/{list-BeaA7gQ7.mjs → list-BDtjlkFq.mjs} +3 -3
  132. package/dist/{list-CcfGHN19.mjs → list-BG3Wnz6W.mjs} +3 -3
  133. package/dist/{list-Dk3upD11.mjs → list-BR7IFq0C.mjs} +5 -5
  134. package/dist/{list-CO62N1eD.mjs → list-BY60e8C8.mjs} +3 -3
  135. package/dist/{list-D1WO7lxP.mjs → list-CHIem8-N.mjs} +4 -4
  136. package/dist/{list-CPwy-AEn.mjs → list-CSFgvwH_.mjs} +3 -3
  137. package/dist/{list-0aX638ov.mjs → list-CXSp-j5P.mjs} +5 -5
  138. package/dist/{list-B2PbnXp4.mjs → list-C_B1kTwx.mjs} +4 -4
  139. package/dist/{list-BSvQ0AT_.mjs → list-CkX5ENLW.mjs} +3 -3
  140. package/dist/{list-BVz0N0g_.mjs → list-CmWo_ZjN.mjs} +3 -3
  141. package/dist/{list-DX5SmBCQ.mjs → list-DWPpi4dL.mjs} +3 -3
  142. package/dist/{list-CAZHyhd5.mjs → list-DX2i7VnN.mjs} +3 -3
  143. package/dist/{list-tHzgEkzv.mjs → list-DcqNpXXs.mjs} +5 -5
  144. package/dist/{list-z4iqffgl.mjs → list-Ddt1V45U.mjs} +4 -4
  145. package/dist/{list-DpyIV41y.mjs → list-DfB0bJFW.mjs} +4 -4
  146. package/dist/{list-JqIFAXpw.mjs → list-DfW_DTZJ.mjs} +3 -3
  147. package/dist/{list-CAAvhl9h.mjs → list-Dq770-CV.mjs} +3 -3
  148. package/dist/{list-mRSKPKoO.mjs → list-HJD-0aTX.mjs} +3 -3
  149. package/dist/{list-DZLGnsAK.mjs → list-l4RHGqYc.mjs} +3 -3
  150. package/dist/{list-DAdWd8gn.mjs → list-pEV6jJNj.mjs} +3 -3
  151. package/dist/{list-DjfY80vj.mjs → list-shpxsUkv.mjs} +3 -3
  152. package/dist/{list-BJasizCe.mjs → list-vjCcTMd9.mjs} +3 -3
  153. package/dist/{login-muOdP15h.mjs → login-BQWBAyTZ.mjs} +4 -4
  154. package/dist/{logout-Z0_gSSM4.mjs → logout-BWUdSl4Y.mjs} +2 -2
  155. package/dist/{measure-CTF4qqiE.mjs → measure-BvVdTVUb.mjs} +6 -6
  156. package/dist/{notification-Bj45MgWm.mjs → notification-Ec1Jo0Oc.mjs} +1 -1
  157. package/dist/{parameter-values-to5u_-2n.mjs → parameter-values-BdJU4BZt.mjs} +3 -3
  158. package/dist/{parse-id-CbF7zxGv.mjs → parse-id-DKKwr4c8.mjs} +1 -1
  159. package/dist/{path-B-0S-9i2.mjs → path-BvKEH753.mjs} +4 -4
  160. package/dist/{poll-zB3cX0Kq.mjs → poll-CAd7bLO6.mjs} +1 -1
  161. package/dist/{preflight-Dgj2yyY_.mjs → preflight-Beuxqhhf.mjs} +1 -1
  162. package/dist/{publish-tKh9tJeh.mjs → publish-C3cI9Qtw.mjs} +3 -3
  163. package/dist/{pulse-DhddeMMG.mjs → pulse-BWs9tqVG.mjs} +1 -1
  164. package/dist/{query-o1Z2dgtw.mjs → query-Cl56xhGd.mjs} +4 -4
  165. package/dist/{query-B4xK9j0u.mjs → query-DF5jl95P.mjs} +4 -4
  166. package/dist/{remapping-DT305P-k.mjs → remapping-D0Qs4ZA0.mjs} +3 -3
  167. package/dist/{remove-collection-Bsme1OBA.mjs → remove-collection-DsZSjVj0.mjs} +3 -3
  168. package/dist/{render-Df56xOPJ.mjs → render-D3jLDfVB.mjs} +1 -1
  169. package/dist/{replace-C3PQwvfl.mjs → replace-dk5xzOnf.mjs} +4 -4
  170. package/dist/{requirement-check-qqRkRGcN.mjs → requirement-check-CPY23KwS.mjs} +2 -2
  171. package/dist/{rescan-values-C0P0upEB.mjs → rescan-values-C_iCyt-D.mjs} +4 -4
  172. package/dist/{rescan-values-CGN4bjyB.mjs → rescan-values-W5Flh4Sz.mjs} +3 -3
  173. package/dist/{run-ZRY5wy4x.mjs → run-B99b6wgr.mjs} +4 -4
  174. package/dist/{run-bVD66LrU.mjs → run-BT7raH2f.mjs} +3 -3
  175. package/dist/{run-BaEBHum8.mjs → run-C0s2hLrU.mjs} +4 -4
  176. package/dist/{run-C_IZfmQ7.mjs → run-Ch9KAm3W.mjs} +404 -85
  177. package/dist/{runs-DWm1pIdP.mjs → runs-ClQVvDP2.mjs} +5 -5
  178. package/dist/{runtime-Dd2uBKqN.mjs → runtime-fJ-A3m-R.mjs} +6 -5
  179. package/dist/{scaffold-BnT99dhY.mjs → scaffold-Pr1BC2uw.mjs} +4 -4
  180. package/dist/{schema-DoELV3FT.mjs → schema-BeSsPxHM.mjs} +2 -2
  181. package/dist/{schema-tables-DGyHJnJX.mjs → schema-tables-D1meU1m8.mjs} +5 -5
  182. package/dist/{schemas-7w9MPZcZ.mjs → schemas-Db3hQ0pY.mjs} +4 -4
  183. package/dist/{search-CyyySVTz.mjs → search-D5y8utnT.mjs} +4 -4
  184. package/dist/{search-BZh0BwZ9.mjs → search-oxkqbIhJ.mjs} +4 -4
  185. package/dist/{segment--JCnZCgL.mjs → segment-D41roFlj.mjs} +6 -6
  186. package/dist/{send-c4FpapMf.mjs → send-CuHw5ZWw.mjs} +3 -3
  187. package/dist/{set-_puxfyaP.mjs → set-CdyFUlSB.mjs} +2 -2
  188. package/dist/{set-active-BexM75_s.mjs → set-active-BsQ0NqQ5.mjs} +2 -2
  189. package/dist/{set-data-actions-BnrX6ARh.mjs → set-data-actions-BvNTY-Z1.mjs} +3 -3
  190. package/dist/{set-enabled-Np4xqFA_.mjs → set-enabled-Q7t_Jjev.mjs} +2 -2
  191. package/dist/{set-sensitivity-DDzrkjdv.mjs → set-sensitivity-swrcaUgD.mjs} +3 -3
  192. package/dist/{setting-BGK1uRxm.mjs → setting-h61KIVKH.mjs} +4 -4
  193. package/dist/{setup-BCliYRAt.mjs → setup-okGErkpB.mjs} +2 -2
  194. package/dist/{skill-list-4LagdTq5.mjs → skill-list-Duqt2jXs.mjs} +1 -1
  195. package/dist/{skills-CoXIflBw.mjs → skills-DdWfwXGa.mjs} +3 -3
  196. package/dist/{skills-PULUh2VV.mjs → skills-Dt95bt39.mjs} +3 -3
  197. package/dist/snippet-BBGYQKde.mjs +19 -0
  198. package/dist/{stash-d3FtnE2F.mjs → stash-BSO_xPcW.mjs} +3 -3
  199. package/dist/{status-CJLd6Uk6.mjs → status-BLgQLUHs.mjs} +2 -2
  200. package/dist/{status-BJTdBEN4.mjs → status-BxjdPnb1.mjs} +3 -3
  201. package/dist/{subscription-Dpq45fMP.mjs → subscription-DfvU-S6P.mjs} +6 -6
  202. package/dist/{subscriptions-Cu4km2CN.mjs → subscriptions-Zqtq7ela.mjs} +6 -6
  203. package/dist/{summary-3Av5251t.mjs → summary-Bsxzo3_S.mjs} +3 -3
  204. package/dist/{sync-schema-BNHt8S3P.mjs → sync-schema-BBOF-1tN.mjs} +4 -4
  205. package/dist/{sync-schema-BYJuUBsG.mjs → sync-schema-BgxhQ9xQ.mjs} +4 -4
  206. package/dist/table-Bye5_War.mjs +26 -0
  207. package/dist/{table-DFbkLSgK.mjs → table-CcUdjp8F.mjs} +1 -1
  208. package/dist/{table-selector-flags-BiA8p56s.mjs → table-selector-flags-FNPxRc9B.mjs} +2 -2
  209. package/dist/timeline-CKCQZSb9.mjs +21 -0
  210. package/dist/{timeline-event-BLBqSAjH.mjs → timeline-event-BMWbJ0Jh.mjs} +6 -6
  211. package/dist/transform-CBxCkbqF.mjs +28 -0
  212. package/dist/{transform-CKeLIqoc.mjs → transform-drjCAqQs.mjs} +1 -1
  213. package/dist/transform-job-BTM0t8YZ.mjs +22 -0
  214. package/dist/{transform-tag-CETHXuAi.mjs → transform-tag-DcJRURqM.mjs} +5 -5
  215. package/dist/transform-test-CSRDJsx3.mjs +16 -0
  216. package/dist/{transforms-CstSQgQ-.mjs → transforms-DFDPNGru.mjs} +5 -5
  217. package/dist/{transport-D74axlBJ.mjs → transport-Bu0oqcBN.mjs} +3 -3
  218. package/dist/{tree-BDhm4E_W.mjs → tree-vMNC9YkV.mjs} +2 -2
  219. package/dist/{typed-schema-BZkv_z2f.mjs → typed-schema-DTL_8ggU.mjs} +3 -3
  220. package/dist/{unpublish-BNBSxZFl.mjs → unpublish-D8ZsafOS.mjs} +3 -3
  221. package/dist/{unreferenced-B2nDcQ7m.mjs → unreferenced-DgzxPYG_.mjs} +5 -5
  222. package/dist/{update-BenGrugz.mjs → update-BDpitlSQ.mjs} +4 -4
  223. package/dist/{update-B6xWuJqk.mjs → update-BGKttGAR.mjs} +3 -3
  224. package/dist/{update-DRw_610p.mjs → update-BNreBhC8.mjs} +4 -4
  225. package/dist/{update-BkFy2BV_.mjs → update-BU0PtxW0.mjs} +4 -4
  226. package/dist/{update-BA0NxInb.mjs → update-BWV2CQgP.mjs} +4 -4
  227. package/dist/{update-Cpd1tKqr.mjs → update-BuFR6rqD.mjs} +3 -3
  228. package/dist/{update-pzu78yZB.mjs → update-C26H37WA.mjs} +3 -3
  229. package/dist/{update-DT8KwBxO.mjs → update-CFLc58dG.mjs} +4 -4
  230. package/dist/{update-DU3jpGps.mjs → update-CjlKU5fK.mjs} +3 -3
  231. package/dist/{update-ByBqo1if.mjs → update-Cn49siEu.mjs} +4 -4
  232. package/dist/{update-CWzmrGS_.mjs → update-D0vrQg4H.mjs} +3 -3
  233. package/dist/{update-DrfAOlkf.mjs → update-D32XqpkV.mjs} +3 -3
  234. package/dist/{update-BGFGng3a.mjs → update-DLvN8aDj.mjs} +4 -4
  235. package/dist/{update-B9iHHoJB.mjs → update-Dnm1GajC.mjs} +4 -4
  236. package/dist/{update-DxLypq9G.mjs → update-HsVZcqV2.mjs} +6 -6
  237. package/dist/{update-BMHPp3nt.mjs → update-OknB30b_.mjs} +3 -3
  238. package/dist/{update-CFLJWHOT.mjs → update-Xu0_gOUu.mjs} +3 -3
  239. package/dist/{update-DKcPzoG9.mjs → update-Z4wNTkeQ.mjs} +3 -3
  240. package/dist/{update-dashcard-BU3Wqcnf.mjs → update-dashcard-De_j3nl_.mjs} +3 -3
  241. package/dist/{update-BS-E7QLh.mjs → update-rq_xiQwh.mjs} +4 -4
  242. package/dist/{update-DrvDC_0m2.mjs → update-vXsXeXxz2.mjs} +3 -3
  243. package/dist/{upgrade-Cq89D4Oe.mjs → upgrade-BrABBJSO.mjs} +2 -2
  244. package/dist/{upload-CmwO6anj.mjs → upload-B2OzfuaC.mjs} +1 -1
  245. package/dist/{upload-INQHve86.mjs → upload-B5FlC_HI.mjs} +3 -3
  246. package/dist/upload-DLOZtgEQ.mjs +13 -0
  247. package/dist/{uuid-BNJKaQGB.mjs → uuid-DIJU2aoo.mjs} +2 -2
  248. package/dist/{validate-query-CQ4UPpZX.mjs → validate-query-37KgmRbb.mjs} +1 -1
  249. package/dist/{values-BVtqwRlR.mjs → values-CQVSrZwT.mjs} +3 -3
  250. package/dist/{verify-Bp9ZyPgX.mjs → verify-1POh5DMA.mjs} +3 -3
  251. package/dist/{verify-BwodYH0C.mjs → verify-BwUP351R.mjs} +3 -3
  252. package/dist/{verify-BSlj7S_E.mjs → verify-DaDS87sR.mjs} +3 -3
  253. package/dist/{wait-DZclBI3D.mjs → wait-DF5Cxdc8.mjs} +4 -4
  254. package/dist/{wait-flags-CmIfm6_U.mjs → wait-flags-WpNrwgA3.mjs} +2 -2
  255. package/dist/{window-BoW2xWwm.mjs → window-CI_QD04s.mjs} +1 -1
  256. package/dist/{yaml-BthVUNj3.mjs → yaml-Ctv1l2-P.mjs} +15 -6
  257. package/package.json +1 -1
  258. package/skill-data/data-app/SKILL.md +23 -17
  259. package/skill-data/data-app/template/README.md +4 -5
  260. package/skill-data/data-app/template/gitignore +0 -1
  261. package/skill-data/data-app/template/package.json +1 -2
  262. package/skill-data/data-app-ui/SKILL.md +1 -1
  263. package/skill-data/transform/SKILL.md +1 -1
  264. package/dist/api-key-Cia6SHQ9.mjs +0 -13
  265. package/dist/card-C-KsmoJW.mjs +0 -25
  266. package/dist/collection-DsNRlVcN.mjs +0 -21
  267. package/dist/dashboard-BRQtw_1e.mjs +0 -35
  268. package/dist/data-action-Bm6QMyV0.mjs +0 -24
  269. package/dist/dependency-B0KmVz2u.mjs +0 -15
  270. package/dist/document--zYZP-u3.mjs +0 -20
  271. package/dist/field-Bk09crKC.mjs +0 -21
  272. package/dist/git-sync-DMyH3Y85.mjs +0 -29
  273. package/dist/glossary-CcRGJaVi.mjs +0 -14
  274. package/dist/set-bundle-B-qAvkDo.mjs +0 -40
  275. package/dist/snippet-Czzma-M2.mjs +0 -19
  276. package/dist/table-CwfF6ZTZ.mjs +0 -26
  277. package/dist/timeline-C4WCMzDX.mjs +0 -21
  278. package/dist/transform-job-SQ57QOlQ.mjs +0 -22
  279. package/dist/transform-jxF8cjNA.mjs +0 -28
  280. package/dist/transform-test-MlVjTlKo.mjs +0 -16
  281. package/dist/upload-DbDFl9qT.mjs +0 -13
@@ -35,13 +35,12 @@ function parseYamlResult(input, schema, opts = {}) {
35
35
  };
36
36
  }
37
37
  const YAML_1_1_LINE_BREAKS = /[\u0085\u2028\u2029]/;
38
- function parseMetabaseYaml(input, source) {
39
- if (YAML_1_1_LINE_BREAKS.test(input)) throw new ValidationError(`${source}: holds U+0085, U+2028 or U+2029, which Metabase reads as a line break and this check does not; remove the character`, {
40
- source,
41
- zodIssues: []
42
- });
38
+ function parseAs(input, source, version) {
43
39
  try {
44
- return parse(input, { merge: true });
40
+ return parse(input, {
41
+ merge: true,
42
+ version
43
+ });
45
44
  } catch (error) {
46
45
  throw new ValidationError(`${source}: invalid YAML: ${errorMessage(error)}`, {
47
46
  source,
@@ -49,5 +48,15 @@ function parseMetabaseYaml(input, source) {
49
48
  });
50
49
  }
51
50
  }
51
+ function parseMetabaseYaml(input, source) {
52
+ if (YAML_1_1_LINE_BREAKS.test(input)) throw new ValidationError(`${source}: holds U+0085, U+2028 or U+2029, which Metabase reads as a line break and this check does not; remove the character`, {
53
+ source,
54
+ zodIssues: []
55
+ });
56
+ return {
57
+ yaml12: parseAs(input, source, "1.2"),
58
+ yaml11: parseAs(input, source, "1.1")
59
+ };
60
+ }
52
61
  //#endregion
53
62
  export { parseYaml as n, parseMetabaseYaml as t };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metabase/cli",
3
- "version": "0.5.8",
3
+ "version": "0.5.9",
4
4
  "description": "Metabase CLI",
5
5
  "license": "AGPL-3.0",
6
6
  "repository": {
@@ -12,17 +12,20 @@ A **data app** is a React app built into one JavaScript bundle, which Metabase r
12
12
  The work, in order:
13
13
 
14
14
  1. Create the app on the instance.
15
- 2. Scaffold the project and install the SDK.
15
+ 2. Scaffold the project in the synced git repository and install the SDK.
16
16
  3. Give it data: questions over the Library's published tables and metrics in the app's collection, then `src/metabase.ts` (`data-app-data`); writes are `data-app-actions`.
17
17
  4. Start the dev preview (_Dev preview_), then write the UI under `src/` (`data-app-ui`; filter controls in `data-app-filters`).
18
- 5. Build and publish (_Build and publish_).
18
+ 5. Build, test, and push the source and the bundle together (_Build and publish_).
19
19
 
20
- For every later change: first pass the checks in _An existing project_ (_Scaffold and install_), then regenerate `src/metabase.ts` if the app's collection changed, then build and set the bundle; in a synced repository, then export and commit the source as in _Move to another instance_. Metabase receives only the built bundle; the source stays in the project directory, which is the app's folder in the synced git repository when there is one (_Scaffold and install_).
20
+ For every later change: first pass the checks in _An existing project_ (_Scaffold and install_), then regenerate `src/metabase.ts` if the app's collection changed, then build and publish (_Build and publish_). The bundle reaches Metabase only through git: a git-sync import loads the `dist/index.js` committed in the app's folder.
21
21
 
22
22
  ## Before you start
23
23
 
24
24
  - Use an **admin** profile — only admins create apps and write the app's collection. `mb auth status --profile <name> --json | jq .user.isAdmin` prints `true` for one, and every command below takes that `--profile`; otherwise ask the user for an admin profile (`mb auth list`).
25
25
  - Run `mb data-app list`. A failure means the instance has no data apps: stop and tell the user.
26
+ - The app ships through the instance's synced git repository. Check both ends first; if either fails, stop and tell the user which, changing nothing:
27
+ - `mb git-sync status --profile <name> --json` reports `remote_configured: true` and `sync_type: "read-write"`.
28
+ - The working folder is a clone of it: `git rev-parse --show-toplevel` succeeds, and `git remote -v` lists the repository `mb setting get remote-sync-url --profile <name>` names, in HTTPS or SSH form. That top level is `<repo>` below.
26
29
  - Settle the **slug**, the `/apps/<slug>` URL: lowercase letters, digits and single dashes (`sales-overview`), at most 100 characters. If the app's purpose is unclear, ask "what's this app for?" and propose one.
27
30
 
28
31
  ## Create the app
@@ -39,14 +42,14 @@ mb data-app create --body '{"name":"sales-overview","display_name":"Sales overvi
39
42
  mb data-app scaffold <repo>/data_apps/sales-overview && cd <repo>/data_apps/sales-overview
40
43
  ```
41
44
 
42
- `scaffold [dir]` takes a **directory**, not the slug: it copies the Vite + React + TypeScript template into a new or empty directory (the current one when omitted) and needs no server. When the instance syncs with a git repository (`mb git-sync status`), the directory is `data_apps/<slug>/` in a local clone of that repository (ask the user for its path, or clone the remote), where an export writes the app's `data_app.yaml` and bundle: an export leaves the source alone and an import ignores it, so the repository keeps the source with the app. `scaffold` needs an empty directory, so scaffold before the app's first export; for an app already in the repository, scaffold into a new directory and copy its files, dotfiles included (`cp -R <dir>/. data_apps/<slug>/`), in beside `data_app.yaml` and `dist/`; check `.gitignore` is there before `npm install`. Without a repository, use any new directory, and once remote sync is set up, move the project (without `node_modules/`, `build/`, `dist/`, `.env.local` and a hand-written `data_app.yaml`) into `data_apps/<slug>/` before committing its source. Then install the SDK, then the rest:
45
+ `scaffold [dir]` takes a **directory**, not the slug: it copies the Vite + React + TypeScript template into a new or empty directory (the current one when omitted) and needs no server. The directory is `data_apps/<slug>/` in `<repo>`, where an export writes the app's `data_app.yaml` and bundle: an export leaves the source alone and an import ignores it, so the repository keeps the source with the app. `scaffold` needs an empty directory, so scaffold before the app's first export; for an app already in the repository, scaffold into a new directory and copy its files, dotfiles included (`cp -R <dir>/. data_apps/<slug>/`), in beside `data_app.yaml` and `dist/`; check `.gitignore` is there before `npm install`. Then install the SDK, then the rest:
43
46
 
44
47
  ```bash
45
48
  npm install @metabase/embedding-sdk-react@<major>-beta # <major>: 66 for a version tag v1.66.x (`mb auth status --profile <name> --json | jq -r .version.tag`)
46
- npm install && npm run typecheck && npm run build
49
+ npm install && npm run typecheck
47
50
  ```
48
51
 
49
- Skip the SDK line when `package.json` already points it at a local build (`file:` or `link:`), and never install `latest`. A tag without a version number, such as `vLOCAL_DEV`, is a development build: ask the user which SDK build to install. The starter renders "Hello, data app".
52
+ Skip the SDK line when `package.json` already points it at a local build (`file:` or `link:`), and never install `latest`. A tag without a version number, such as `vLOCAL_DEV`, is a development build: ask the user which SDK build to install. The starter renders "Hello, data app". Build only in _Build and publish_, after the export: both write `dist/index.js`.
50
53
 
51
54
  The template is the bundle contract. Don't edit `package.json` by hand, and never rewrite `vite.config.ts`, `tsconfig.json` or `src/index.tsx`: `vite.config.ts` stays `export default dataAppConfig()` (its only option is `port`), and `src/index.tsx` default-exports the `DataAppFactory` — change it only to add a `providerProps` key. Metabase and the dev preview each wrap the app in a `<MetabaseProvider>`, so the app never renders one.
52
55
 
@@ -56,11 +59,11 @@ The template is the bundle contract. Don't edit `package.json` by hand, and neve
56
59
  - `src/index.tsx` default-exports a `DataAppFactory` that takes no arguments and returns `{ component, providerProps? }`.
57
60
  - `npm ls react react-dom` exits 0 and reports 19.x. A 19.x it marks `invalid` fails. This check applies whatever the instance or SDK version; to skip it, ask the user first.
58
61
 
59
- Fix a failed React check yourself, before any other change: upgrade `react`, `react-dom`, `@types/react` and `@types/react-dom` to 19 until `npm run typecheck && npm run build` passes and the diagnostics feed is clean (_Dev preview_); then publish (_Build and publish_). If either other check fails, stop: tell the user the project differs from the template, and ask whether to scaffold a fresh project and port the code over, or go on at their own risk.
62
+ Fix a failed React check yourself, before any other change: upgrade `react`, `react-dom`, `@types/react` and `@types/react-dom` to 19 until `npm run typecheck` passes and the diagnostics feed is clean (_Dev preview_); then publish (_Build and publish_). If either other check fails, stop: tell the user the project differs from the template, and ask whether to scaffold a fresh project and port the code over, or go on at their own risk.
60
63
 
61
64
  ## Dev preview
62
65
 
63
- `npm run dev` serves the app at `http://localhost:5174` — or the next free port, in Vite's `Local:` line — through the same sandbox Metabase uses. An edit under `src/` rebuilds the bundle and remounts the app, resetting component state. The preview reads `DATA_APP_MB_URL` and an admin `DATA_APP_MB_API_KEY` from `.env.local` beside `package.json`. Write a new key straight into that file, never into the chat or the terminal:
66
+ `npm run dev` serves the app at `http://localhost:5174` — or the next free port, in Vite's `Local:` line — through the same sandbox Metabase uses. An edit under `src/` rebuilds the bundle and remounts the app, resetting component state. The preview reads `DATA_APP_MB_URL` and an admin `DATA_APP_MB_API_KEY` from `.env.local` beside `package.json`. Create that key only on the user's yes: ask with `AskUserQuestion` ("Create an admin API key `data-app <slug> dev` for the preview? It goes in `.env.local` and is deleted at handoff."). On a no, the user fills in `.env.local` from `.env.local.example`. Write a new key straight into that file, never into the chat or the terminal:
64
67
 
65
68
  ```bash
66
69
  ( umask 077
@@ -102,7 +105,7 @@ curl -s "http://localhost:5174/__data-app/diagnostics?startEventId=0"
102
105
  - `clients: 0` means no tab is open, so empty `entries` prove nothing.
103
106
  - Before an edit, note `nextEventId`; after it, read again with that value as `startEventId`.
104
107
  - The feed answers for the running bundle: entries from replaced builds are counted in `staleEntries`, and anything still broken reports again under the new `buildId` (`?includeStale=true` shows the withheld ones). A failed build doesn't advance `buildId` and doesn't reach the feed — read the `npm run dev` terminal.
105
- - Quote `summary` as it is when you report it, and follow `hint` when there is one — except that you never add the Metabase URL to `allowed_hosts`, and in a synced repository you set `allowed_hosts` with `mb data-app update`, export, and pull the export branch (_Move to another instance_) instead of editing `data_app.yaml`. A `frame-src` or `form-action` block can't be lifted in the preview (`data-app-ui`). The feed keeps the last 200 entries; `curl -X DELETE …/__data-app/diagnostics` clears it.
108
+ - Quote `summary` as it is when you report it, and follow `hint` when there is one — except that you never add the Metabase URL to `allowed_hosts`, and you set `allowed_hosts` with `mb data-app update`, then export and pull (_Build and publish_, step 1), instead of editing `data_app.yaml`. A `frame-src` or `form-action` block can't be lifted in the preview (`data-app-ui`). The feed keeps the last 200 entries; `curl -X DELETE …/__data-app/diagnostics` clears it.
106
109
 
107
110
  | `kind` | Fix |
108
111
  | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
@@ -113,12 +116,15 @@ curl -s "http://localhost:5174/__data-app/diagnostics?startEventId=0"
113
116
 
114
117
  ## Build and publish
115
118
 
116
- ```bash
117
- npm run typecheck && npm run build
118
- mb data-app set-bundle sales-overview
119
- ```
119
+ Build the bundle last, test it in the dev preview, then push it with the source in one commit:
120
+
121
+ 1. Export the app's `data_app.yaml` and the questions and actions in its collection: `mb git-sync export` (`git-sync`), then in `<repo>` `git fetch`, `git switch <branch>`, `git pull --ff-only`.
122
+ 2. `npm run typecheck && npm run build`, which overwrites the exported `dist/index.js`.
123
+ 3. With `npm run dev` running and a preview tab open, read the diagnostics feed (_Dev preview_) with every page mounted; fix what it reports and build again.
124
+ 4. Commit `data_apps/<slug>/` — the source and `dist/index.js` together — and push.
125
+ 5. `mb git-sync import --profile <name>`, whatever a cached `has-remote-changes` says. The new bundle is live at once.
120
126
 
121
- `set-bundle` uploads `build/index.js`, the file `npm run build` writes (`--bundle` for another path), and replaces the app's bundle, live at once. A new app is on from the start; `mb data-app set-enabled <slug> false` turns it off, which only the user decides. An app turned off opens only in Data Studio → Data apps → the app → Overview; `/apps/<slug>` says "not found", for admins too. Give the user `<metabase-url>/apps/<slug>`.
127
+ A new app is on from the start; `mb data-app set-enabled <slug> false` turns it off, which only the user decides. An app turned off opens only in Data Studio → Data apps → the app → Overview; `/apps/<slug>` says "not found", for admins too. Give the user `<metabase-url>/apps/<slug>`.
122
128
 
123
129
  A viewer needs one of their groups assigned to the app (otherwise "You don't have access"), which only the user can do (Data Studio → Data apps → the app → Permissions). A group reaches the app's collection and nothing more, so a viewer also needs data access to the tables its questions read.
124
130
 
@@ -126,7 +132,7 @@ A viewer needs one of their groups assigned to the app (otherwise "You don't hav
126
132
 
127
133
  | Symptom | Fix |
128
134
  | ------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
129
- | `set-bundle`: bundle not found | Run `npm run build` in the project directory first. |
135
+ | The app still runs the old bundle | `dist/index.js` was built before the export's pull, or isn't in the pushed commit: build, commit, push, import. |
130
136
  | Blank app, `Bundle did not assign a function to __dataAppFactory__` | `src/index.tsx` must `export default` the factory and nothing else; otherwise the diagnostics feed has the real error. |
131
137
  | "Failed to fetch the user, the session might be invalid." | A bad key in `.env.local`, or CORS (_Dev preview_). |
132
138
  | A bundle of several MB | `vite.config.ts` no longer uses `dataAppConfig()`, or the SDK isn't the `<major>-beta` tag. |
@@ -139,5 +145,5 @@ A viewer needs one of their groups assigned to the app (otherwise "You don't hav
139
145
 
140
146
  - **Turn off:** `mb data-app set-enabled <slug> false`. **Rename:** `mb data-app update <slug> --body '{"display_name":"…"}'` (also `description`, `allowed_hosts`).
141
147
  - **Outdated:** an app Data Studio lists as _Outdated_ targets an older data-app contract: it won't open for anyone, and only admins see it, until it's migrated. Tell the user; don't change its code ad hoc.
142
- - **Move to another instance:** the app, its collection and what the collection holds are git-synced content. `mb git-sync export` (`git-sync`) writes `data_apps/<slug>/` with the bundle, and the collection under `collections/data_apps/`; importing the repository on the other instance recreates them with the same entity IDs, so the same `src/metabase.ts` works there. The first import there creates the app on, like `create`, open to admins until the user assigns groups; later imports keep its on/off state. The import doesn't check that the questions' tables are published on that instance, so the Library content they read goes in the same export: flag the Library root once (`mb git-sync add-collection <library-id>`, `git-sync`), or its metrics, measures and segments stay out of the repository; a data action needs its database's toggle on there too. Once the app is done, commit its source in `data_apps/<slug>/` on the branch you exported to, after the export. Pull the export branch: `git fetch`, `git switch <branch>`, `git pull --ff-only`. Then `git add data_apps/<slug>`, commit and push, and `mb git-sync import` whatever a cached `has-remote-changes` says, or the next export ends in `conflict`. The export writes `data_app.yaml` and `dist/index.js`, the bundle you uploaded; never edit those two, and leave them out of your commits unless the bundle ships through git (below). The template's `.gitignore` keeps `node_modules/`, `build/` and `.env.local` out. A bundle can instead ship through git, from CI say: `npm run build:ci` writes `dist/index.js`, and once that is committed and pushed, the next import loads it. On a read-only synced instance only `set-enabled` works: creating, bundling, updating and deleting an app answer 403, and so does editing its collection; change it where it was built and export again.
143
- - **Delete:** confirm with the user, then `mb data-app delete <slug> --yes` — it removes the app, its bundle, its collection and the questions and actions in it. The project directory stays: in a synced repository, the next export removes the app's `data_app.yaml`, bundle and collection files; after that export, switch and pull the same way, delete the source in `data_apps/<slug>/` in a commit of your own, push, and import.
148
+ - **Move to another instance:** the app, its collection and what the collection holds are git-synced content. `mb git-sync export` (`git-sync`) writes `data_apps/<slug>/` with the bundle, and the collection under `collections/data_apps/`; importing the repository on the other instance recreates them with the same entity IDs, so the same `src/metabase.ts` works there. The first import there creates the app on, like `create`, open to admins until the user assigns groups; later imports keep its on/off state. The import doesn't check that the questions' tables are published on that instance, so the Library content they read goes in the same export: flag the Library root once (`mb git-sync add-collection <library-id>`, `git-sync`), or its metrics, measures and segments stay out of the repository; a data action needs its database's toggle on there too. Never edit `data_app.yaml`; `dist/index.js` changes only through `npm run build` (_Build and publish_). The template's `.gitignore` keeps `node_modules/` and `.env.local` out. On a read-only synced instance only `set-enabled` works: creating, updating and deleting an app answer 403, and so does editing its collection; change it where it was built, push, and import there.
149
+ - **Delete:** confirm with the user, then `mb data-app delete <slug> --yes` — it removes the app, its bundle, its collection and the questions and actions in it. The project directory stays: the next export removes the app's `data_app.yaml`, bundle and collection files; after that export, switch and pull the same way, delete the source in `data_apps/<slug>/` in a commit of your own, push, and import.
@@ -20,14 +20,13 @@ npm install
20
20
  ```bash
21
21
  npm run dev # preview at http://localhost:5174, in the sandbox Metabase runs apps in
22
22
  npm run typecheck # type-checks src/ and vite.config.ts
23
- npm run build # builds build/index.js
23
+ npm run build # builds dist/index.js, the app's bundle
24
24
  mb data-app typed-schema <slug> --out src/metabase.ts # the app's queries and actions
25
- mb data-app set-bundle <slug> # makes build/index.js the app's bundle
26
25
  ```
27
26
 
28
- To ship the bundle through git instead, for example from CI, run
29
- `npm run build:ci` and commit `dist/index.js`, the file the app's
30
- `data_app.yaml` names; the next git-sync import loads it.
27
+ The bundle ships through git: commit `dist/index.js` (the file
28
+ `data_app.yaml` names) with the source and push; the next git-sync import
29
+ loads it.
31
30
 
32
31
  `npm run dev` reads `DATA_APP_MB_URL` and `DATA_APP_MB_API_KEY` from
33
32
  `.env.local`; `.env.local.example` lists them.
@@ -1,5 +1,4 @@
1
1
  node_modules
2
- build
3
2
  .env.local
4
3
  .vite
5
4
  .idea
@@ -5,8 +5,7 @@
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "vite",
8
- "build": "vite build",
9
- "build:ci": "vite build --outDir dist",
8
+ "build": "vite build --outDir dist",
10
9
  "typecheck": "tsc --noEmit"
11
10
  },
12
11
  "dependencies": {
@@ -38,7 +38,7 @@ Everything here runs inside the sandbox, the same in the dev preview as in Metab
38
38
  | `navigator.geolocation` and other device APIs | Nothing. |
39
39
  | Key, input, composition and clipboard listeners (`keydown`, `paste`, `input`, …) on `window` or `document` | A React handler (`onKeyDown`, `onPaste`, …) on your own element. |
40
40
 
41
- **External APIs.** A raw `fetch` reaches only the origins in the app's `allowed_hosts`, exact or with a `*.` subdomain wildcard: `mb data-app update <slug> --body '{"allowed_hosts":["https://api.example.com"]}'`. The preview reads the `allowed_hosts:` list in `data_app.yaml` beside `package.json`: in a synced repository that file is the app's exported manifest, so export again and pull the export branch (`data-app`, _Move to another instance_) to refresh it rather than writing it; without one, write the list there yourself. Then restart `npm run dev`. Never list the Metabase URL. In Metabase the same list governs `<iframe src>` and native `<form action>` submits, and the target must allow framing; the preview blocks both. Use `<form onSubmit>` with `preventDefault`: a native submit navigates the app away.
41
+ **External APIs.** A raw `fetch` reaches only the origins in the app's `allowed_hosts`, exact or with a `*.` subdomain wildcard: `mb data-app update <slug> --body '{"allowed_hosts":["https://api.example.com"]}'`. The preview reads the `allowed_hosts:` list in `data_app.yaml` beside `package.json`, the app's exported manifest: refresh it by exporting and pulling the export branch (`data-app`, _Build and publish_, step 1), never by writing it. Then restart `npm run dev`. Never list the Metabase URL. In Metabase the same list governs `<iframe src>` and native `<form action>` submits, and the target must allow framing; the preview blocks both. Use `<form onSubmit>` with `preventDefault`: a native submit navigates the app away.
42
42
 
43
43
  ## Layout
44
44
 
@@ -271,6 +271,6 @@ mb transform-job set-active false --profile <name> --json # disable every job a
271
271
 
272
272
  <!-- /requires -->
273
273
 
274
- Every job row carries `active`; it is `null` on a server that cannot switch jobs off, where every job runs on schedule.
274
+ Every job row carries `active`; it is `null` on a server that cannot switch jobs off, where every job runs on schedule. A job with `active: false` never runs on schedule, and a fresh install of a newer server starts the built-in jobs that no transform uses that way: before relying on one, check `active`, and turn it on only with the user's yes (`transform-job update <id> --body '{"active":true}'`, admin only).
275
275
 
276
276
  `transform-job run` is fire-and-forget — it returns `{message, started, run_id}` immediately (both `null` when the server does not number job runs: the request was accepted and whether a run started is unsaid), with no per-job-run polling (no `--wait`). Most ad-hoc agent work is one-off `transform run`, not job authoring.
@@ -1,13 +0,0 @@
1
- import { t as defineCommandGroup } from "./group-D1nGaEXW.mjs";
2
- //#region src/commands/api-key/index.ts
3
- var api_key_default = defineCommandGroup({
4
- name: "api-key",
5
- description: "Manage Metabase API keys",
6
- subCommands: {
7
- list: () => import("./list-mRSKPKoO.mjs").then((mod) => mod.default),
8
- create: () => import("./create-Dm8BvbsU.mjs").then((mod) => mod.default),
9
- delete: () => import("./delete-D_l7FRE6.mjs").then((mod) => mod.default)
10
- }
11
- });
12
- //#endregion
13
- export { api_key_default as default };
@@ -1,25 +0,0 @@
1
- import { t as defineCommandGroup } from "./group-D1nGaEXW.mjs";
2
- //#region src/commands/card/index.ts
3
- var card_default = defineCommandGroup({
4
- name: "card",
5
- description: "Manage Metabase cards (questions, models, metrics)",
6
- skills: [{
7
- skill: "mbql",
8
- purpose: "author the dataset_query"
9
- }, {
10
- skill: "visualization",
11
- purpose: "choose display and visualization_settings"
12
- }],
13
- subCommands: {
14
- list: () => import("./list-DAdWd8gn.mjs").then((mod) => mod.default),
15
- get: () => import("./get-3XwqrjxC.mjs").then((mod) => mod.default),
16
- query: () => import("./query-B4xK9j0u.mjs").then((mod) => mod.default),
17
- alerts: () => import("./alerts-C7vJ-NAI.mjs").then((mod) => mod.default),
18
- create: () => import("./create-C6c-clLK.mjs").then((mod) => mod.default),
19
- update: () => import("./update-BGFGng3a.mjs").then((mod) => mod.default),
20
- verify: () => import("./verify-BSlj7S_E.mjs").then((mod) => mod.default),
21
- archive: () => import("./archive-CuygjxgQ.mjs").then((mod) => mod.default)
22
- }
23
- });
24
- //#endregion
25
- export { card_default as default };
@@ -1,21 +0,0 @@
1
- import { t as defineCommandGroup } from "./group-D1nGaEXW.mjs";
2
- //#region src/commands/collection/index.ts
3
- var collection_default = defineCommandGroup({
4
- name: "collection",
5
- description: "Manage Metabase collections",
6
- skills: [{
7
- skill: "core",
8
- purpose: "collection ref forms and the transforms namespace"
9
- }],
10
- subCommands: {
11
- list: () => import("./list-CcfGHN19.mjs").then((mod) => mod.default),
12
- get: () => import("./get-DvPgnqAA.mjs").then((mod) => mod.default),
13
- items: () => import("./items-B1DXzdwg.mjs").then((mod) => mod.default),
14
- tree: () => import("./tree-BDhm4E_W.mjs").then((mod) => mod.default),
15
- create: () => import("./create-zALsdMhF.mjs").then((mod) => mod.default),
16
- update: () => import("./update-DU3jpGps.mjs").then((mod) => mod.default),
17
- archive: () => import("./archive-TBPRGm7s.mjs").then((mod) => mod.default)
18
- }
19
- });
20
- //#endregion
21
- export { collection_default as default };
@@ -1,35 +0,0 @@
1
- import { t as defineCommandGroup } from "./group-D1nGaEXW.mjs";
2
- //#region src/commands/dashboard/index.ts
3
- var dashboard_default = defineCommandGroup({
4
- name: "dashboard",
5
- description: "Manage Metabase dashboards",
6
- skills: [
7
- {
8
- skill: "dashboard",
9
- purpose: "wiring filters, linked filters, cross-filtering, click behavior, tabs"
10
- },
11
- {
12
- skill: "visualization",
13
- purpose: "dashcard display and visualization_settings"
14
- },
15
- {
16
- skill: "core",
17
- purpose: "the 24-column dashcard grid layout"
18
- }
19
- ],
20
- subCommands: {
21
- list: () => import("./list-DZLGnsAK.mjs").then((mod) => mod.default),
22
- get: () => import("./get-CU6AWbqL.mjs").then((mod) => mod.default),
23
- cards: () => import("./cards-D6jWz0N9.mjs").then((mod) => mod.default),
24
- "parameter-values": () => import("./parameter-values-to5u_-2n.mjs").then((mod) => mod.default),
25
- subscriptions: () => import("./subscriptions-Cu4km2CN.mjs").then((mod) => mod.default),
26
- create: () => import("./create-lHqpAdxg.mjs").then((mod) => mod.default),
27
- update: () => import("./update-BenGrugz.mjs").then((mod) => mod.default),
28
- "update-dashcard": () => import("./update-dashcard-BU3Wqcnf.mjs").then((mod) => mod.default),
29
- copy: () => import("./copy-D-VIVVB1.mjs").then((mod) => mod.default),
30
- verify: () => import("./verify-BwodYH0C.mjs").then((mod) => mod.default),
31
- archive: () => import("./archive-CyhH-395.mjs").then((mod) => mod.default)
32
- }
33
- });
34
- //#endregion
35
- export { dashboard_default as default };
@@ -1,24 +0,0 @@
1
- import { t as defineCommandGroup } from "./group-D1nGaEXW.mjs";
2
- //#region src/commands/data-action/index.ts
3
- var data_action_default = defineCommandGroup({
4
- name: "data-action",
5
- description: "Manage Metabase data actions",
6
- skills: [{
7
- skill: "data-action",
8
- purpose: "author and run data actions"
9
- }, {
10
- skill: "native-sql",
11
- purpose: "the data action's native query and its template tags"
12
- }],
13
- subCommands: {
14
- list: () => import("./list-BSvQ0AT_.mjs").then((mod) => mod.default),
15
- get: () => import("./get-DJeeXbwj.mjs").then((mod) => mod.default),
16
- create: () => import("./create-HNchuWpj.mjs").then((mod) => mod.default),
17
- update: () => import("./update-DT8KwBxO.mjs").then((mod) => mod.default),
18
- archive: () => import("./archive-CmhV_hlP.mjs").then((mod) => mod.default),
19
- delete: () => import("./delete-CxL5okLN.mjs").then((mod) => mod.default),
20
- execute: () => import("./execute-C9foK2IU.mjs").then((mod) => mod.default)
21
- }
22
- });
23
- //#endregion
24
- export { data_action_default as default };
@@ -1,15 +0,0 @@
1
- import { t as defineCommandGroup } from "./group-D1nGaEXW.mjs";
2
- //#region src/commands/dependency/index.ts
3
- var dependency_default = defineCommandGroup({
4
- name: "dependency",
5
- description: "Trace what Metabase content depends on and what depends on it",
6
- subCommands: {
7
- graph: () => import("./graph-B2YkV2oX.mjs").then((m) => m.default),
8
- dependents: () => import("./dependents-B4V8pDYq.mjs").then((m) => m.default),
9
- broken: () => import("./broken-BbpNq5WG.mjs").then((m) => m.default),
10
- unreferenced: () => import("./unreferenced-B2nDcQ7m.mjs").then((m) => m.default),
11
- breaking: () => import("./breaking-VMUrgVVE.mjs").then((m) => m.default)
12
- }
13
- });
14
- //#endregion
15
- export { dependency_default as default };
@@ -1,20 +0,0 @@
1
- import { t as defineCommandGroup } from "./group-D1nGaEXW.mjs";
2
- //#region src/commands/document/index.ts
3
- var document_default = defineCommandGroup({
4
- name: "document",
5
- description: "Manage Metabase documents",
6
- skills: [{
7
- skill: "document",
8
- purpose: "author the ProseMirror document body"
9
- }],
10
- subCommands: {
11
- list: () => import("./list-DX5SmBCQ.mjs").then((mod) => mod.default),
12
- get: () => import("./get-m-vpr7GN.mjs").then((mod) => mod.default),
13
- create: () => import("./create-DcDyXL4g.mjs").then((mod) => mod.default),
14
- update: () => import("./update-CWzmrGS_.mjs").then((mod) => mod.default),
15
- copy: () => import("./copy-BeD_fk5J.mjs").then((mod) => mod.default),
16
- archive: () => import("./archive-5pjvTser.mjs").then((mod) => mod.default)
17
- }
18
- });
19
- //#endregion
20
- export { document_default as default };
@@ -1,21 +0,0 @@
1
- import { t as defineCommandGroup } from "./group-D1nGaEXW.mjs";
2
- //#region src/commands/field/index.ts
3
- var field_default = defineCommandGroup({
4
- name: "field",
5
- description: "Manage Metabase fields",
6
- skills: [{
7
- skill: "metadata",
8
- purpose: "semantic types, FK targets, visibility, dropdown behavior"
9
- }],
10
- subCommands: {
11
- get: () => import("./get-BAGQ-bvt.mjs").then((m) => m.default),
12
- values: () => import("./values-BVtqwRlR.mjs").then((m) => m.default),
13
- summary: () => import("./summary-3Av5251t.mjs").then((m) => m.default),
14
- update: () => import("./update-BMHPp3nt.mjs").then((m) => m.default),
15
- search: () => import("./search-CyyySVTz.mjs").then((m) => m.default),
16
- remapping: () => import("./remapping-DT305P-k.mjs").then((m) => m.default),
17
- "set-sensitivity": () => import("./set-sensitivity-DDzrkjdv.mjs").then((m) => m.default)
18
- }
19
- });
20
- //#endregion
21
- export { field_default as default };
@@ -1,29 +0,0 @@
1
- import { t as defineCommandGroup } from "./group-D1nGaEXW.mjs";
2
- //#region src/commands/git-sync/index.ts
3
- var git_sync_default = defineCommandGroup({
4
- name: "git-sync",
5
- description: "Sync Metabase content with a git remote",
6
- skills: [{
7
- skill: "git-sync",
8
- purpose: "import/export round-trip and dirty checks"
9
- }],
10
- subCommands: {
11
- status: () => import("./status-CJLd6Uk6.mjs").then((mod) => mod.default),
12
- "is-dirty": () => import("./is-dirty-Bud2wuxQ.mjs").then((mod) => mod.default),
13
- "has-remote-changes": () => import("./has-remote-changes-ChMSjhmC.mjs").then((mod) => mod.default),
14
- dirty: () => import("./dirty-DKj4ScBN.mjs").then((mod) => mod.default),
15
- "current-task": () => import("./current-task-GG6JqfGp.mjs").then((mod) => mod.default),
16
- "cancel-task": () => import("./cancel-task-DWiicb_t.mjs").then((mod) => mod.default),
17
- wait: () => import("./wait-DZclBI3D.mjs").then((mod) => mod.default),
18
- import: () => import("./import-CNpN9iS0.mjs").then((mod) => mod.default),
19
- export: () => import("./export-B8QyoPWP.mjs").then((mod) => mod.default),
20
- "export-preflight": () => import("./export-preflight-BQbwxyoJ.mjs").then((mod) => mod.default),
21
- stash: () => import("./stash-d3FtnE2F.mjs").then((mod) => mod.default),
22
- branches: () => import("./branches-BM0L124r.mjs").then((mod) => mod.default),
23
- "create-branch": () => import("./create-branch-C8arQT4M.mjs").then((mod) => mod.default),
24
- "add-collection": () => import("./add-collection-DIrpeq9O.mjs").then((mod) => mod.default),
25
- "remove-collection": () => import("./remove-collection-Bsme1OBA.mjs").then((mod) => mod.default)
26
- }
27
- });
28
- //#endregion
29
- export { git_sync_default as default };
@@ -1,14 +0,0 @@
1
- import { t as defineCommandGroup } from "./group-D1nGaEXW.mjs";
2
- //#region src/commands/glossary/index.ts
3
- var glossary_default = defineCommandGroup({
4
- name: "glossary",
5
- description: "Manage the Metabase glossary of business terms",
6
- subCommands: {
7
- list: () => import("./list-CAAvhl9h.mjs").then((mod) => mod.default),
8
- create: () => import("./create-BlmRvuQg.mjs").then((mod) => mod.default),
9
- update: () => import("./update-B9iHHoJB.mjs").then((mod) => mod.default),
10
- delete: () => import("./delete-Dkwk2mZH.mjs").then((mod) => mod.default)
11
- }
12
- });
13
- //#endregion
14
- export { glossary_default as default };
@@ -1,40 +0,0 @@
1
- import { dt as outputFlags, ft as profileFlag, ot as connectionFlags, u as renderSummary } from "./cli.mjs";
2
- import { t as defineMetabaseCommand } from "./runtime-Dd2uBKqN.mjs";
3
- import { t as DataApp } from "./data-app-BUW-HlUo.mjs";
4
- import { t as dataAppView } from "./data-app-Blz61mG5.mjs";
5
- import { n as slugArg, t as parseSlug } from "./slug-COdwq63O.mjs";
6
- import { n as readBundle, t as DEFAULT_BUNDLE_PATH } from "./data-app-project-CHYcJRrU.mjs";
7
- //#region src/commands/data-app/set-bundle.ts
8
- var set_bundle_default = defineMetabaseCommand({
9
- meta: {
10
- name: "set-bundle",
11
- description: "Replace a data app's bundle with a built one"
12
- },
13
- details: "Reads the built bundle (`npm run build` writes `build/index.js`) and makes it the bundle Metabase serves at /apps/<slug>, at once. A new app is enabled; viewers reach it once a group is assigned. A disabled app opens only in Data Studio (Data apps → the app → Overview).",
14
- skills: [{
15
- skill: "data-app",
16
- purpose: "build and publish an app"
17
- }],
18
- requires: ["dataApp.replaceBundle"],
19
- args: {
20
- ...outputFlags,
21
- ...profileFlag,
22
- ...connectionFlags,
23
- ...slugArg,
24
- bundle: {
25
- type: "string",
26
- description: "Built bundle file",
27
- default: DEFAULT_BUNDLE_PATH
28
- }
29
- },
30
- outputSchema: DataApp,
31
- examples: ["mb data-app set-bundle sales-overview", "mb data-app set-bundle sales-overview --bundle out/index.js"],
32
- async run({ args, ctx, getClient }) {
33
- const slug = parseSlug(args.slug);
34
- const bundle = await readBundle(args.bundle);
35
- const app = await (await getClient()).dataApp.replaceBundle(slug, bundle);
36
- renderSummary(app, dataAppView, `Set the bundle of data app ${slug}; it is ${app.enabled ? `served at /apps/${slug}` : "disabled, so it opens only in Data Studio"}.`, ctx);
37
- }
38
- });
39
- //#endregion
40
- export { set_bundle_default as default };
@@ -1,19 +0,0 @@
1
- import { t as defineCommandGroup } from "./group-D1nGaEXW.mjs";
2
- //#region src/commands/snippet/index.ts
3
- var snippet_default = defineCommandGroup({
4
- name: "snippet",
5
- description: "Manage Metabase native query snippets",
6
- skills: [{
7
- skill: "core",
8
- purpose: "native-SQL snippets and body input"
9
- }],
10
- subCommands: {
11
- list: () => import("./list-BVz0N0g_.mjs").then((mod) => mod.default),
12
- get: () => import("./get-CtRJUybv.mjs").then((mod) => mod.default),
13
- create: () => import("./create-DF7nC9qW.mjs").then((mod) => mod.default),
14
- update: () => import("./update-CFLJWHOT.mjs").then((mod) => mod.default),
15
- archive: () => import("./archive-Cy6RUJaD.mjs").then((mod) => mod.default)
16
- }
17
- });
18
- //#endregion
19
- export { snippet_default as default };
@@ -1,26 +0,0 @@
1
- import { t as defineCommandGroup } from "./group-D1nGaEXW.mjs";
2
- //#region src/commands/table/index.ts
3
- var table_default = defineCommandGroup({
4
- name: "table",
5
- description: "Manage Metabase tables",
6
- skills: [{
7
- skill: "metadata",
8
- purpose: "table and column metadata, semantic types, visibility"
9
- }],
10
- subCommands: {
11
- list: () => import("./list-Dk3upD11.mjs").then((m) => m.default),
12
- get: () => import("./get-DG5fPl-S.mjs").then((m) => m.default),
13
- fields: () => import("./fields-TE3PnmwW.mjs").then((m) => m.default),
14
- fks: () => import("./fks-B41Re5dt.mjs").then((m) => m.default),
15
- update: () => import("./update-BS-E7QLh.mjs").then((m) => m.default),
16
- "sync-schema": () => import("./sync-schema-BYJuUBsG.mjs").then((m) => m.default),
17
- "rescan-values": () => import("./rescan-values-C0P0upEB.mjs").then((m) => m.default),
18
- "discard-values": () => import("./discard-values-5l91z3Dy.mjs").then((m) => m.default),
19
- "bulk-edit": () => import("./bulk-edit-B9-XH592.mjs").then((m) => m.default),
20
- "bulk-sync-schema": () => import("./bulk-sync-schema-CorpcAjz.mjs").then((m) => m.default),
21
- "bulk-rescan-values": () => import("./bulk-rescan-values-CsWKirZw.mjs").then((m) => m.default),
22
- "bulk-discard-values": () => import("./bulk-discard-values-Cohox-Zb.mjs").then((m) => m.default)
23
- }
24
- });
25
- //#endregion
26
- export { table_default as default };
@@ -1,21 +0,0 @@
1
- import { t as defineCommandGroup } from "./group-D1nGaEXW.mjs";
2
- //#region src/commands/timeline/index.ts
3
- var timeline_default = defineCommandGroup({
4
- name: "timeline",
5
- description: "Manage Metabase timelines (event annotations for time-series charts)",
6
- skills: [{
7
- skill: "core",
8
- purpose: "collection scoping — events render only on questions in the timeline's collection"
9
- }],
10
- subCommands: {
11
- list: () => import("./list-BeaA7gQ7.mjs").then((mod) => mod.default),
12
- get: () => import("./get-BrhIHZYg.mjs").then((mod) => mod.default),
13
- events: () => import("./events-CE80dTib.mjs").then((mod) => mod.default),
14
- create: () => import("./create-MmZVmRsH.mjs").then((mod) => mod.default),
15
- update: () => import("./update-pzu78yZB.mjs").then((mod) => mod.default),
16
- archive: () => import("./archive-BrGj2yoP.mjs").then((mod) => mod.default),
17
- delete: () => import("./delete-YKX2HilI.mjs").then((mod) => mod.default)
18
- }
19
- });
20
- //#endregion
21
- export { timeline_default as default };
@@ -1,22 +0,0 @@
1
- import { t as defineCommandGroup } from "./group-D1nGaEXW.mjs";
2
- //#region src/commands/transform-job/index.ts
3
- var transform_job_default = defineCommandGroup({
4
- name: "transform-job",
5
- description: "Manage Metabase transform jobs",
6
- skills: [{
7
- skill: "transform",
8
- purpose: "tag-driven job schedules"
9
- }],
10
- subCommands: {
11
- list: () => import("./list-JqIFAXpw.mjs").then((mod) => mod.default),
12
- get: () => import("./get-DeiC05Lm.mjs").then((mod) => mod.default),
13
- create: () => import("./create-D44fg_iT.mjs").then((mod) => mod.default),
14
- update: () => import("./update-DrvDC_0m2.mjs").then((mod) => mod.default),
15
- delete: () => import("./delete-Cx75BsN6.mjs").then((mod) => mod.default),
16
- run: () => import("./run-bVD66LrU.mjs").then((mod) => mod.default),
17
- transforms: () => import("./transforms-CstSQgQ-.mjs").then((mod) => mod.default),
18
- "set-active": () => import("./set-active-BexM75_s.mjs").then((mod) => mod.default)
19
- }
20
- });
21
- //#endregion
22
- export { transform_job_default as default };
@@ -1,28 +0,0 @@
1
- import { t as defineCommandGroup } from "./group-D1nGaEXW.mjs";
2
- //#region src/commands/transform/index.ts
3
- var transform_default = defineCommandGroup({
4
- name: "transform",
5
- description: "Manage Metabase transforms",
6
- skills: [{
7
- skill: "transform",
8
- purpose: "body shape, run-with-wait, iterate"
9
- }, {
10
- skill: "mbql",
11
- purpose: "MBQL source.query bodies"
12
- }],
13
- subCommands: {
14
- list: () => import("./list-B2PbnXp4.mjs").then((mod) => mod.default),
15
- get: () => import("./get-CCTRO18v.mjs").then((mod) => mod.default),
16
- dependencies: () => import("./dependencies-W2dxsCpF.mjs").then((mod) => mod.default),
17
- create: () => import("./create-Bw9DAq_x2.mjs").then((mod) => mod.default),
18
- update: () => import("./update-DxLypq9G.mjs").then((mod) => mod.default),
19
- delete: () => import("./delete-AF64p0xG.mjs").then((mod) => mod.default),
20
- "delete-table": () => import("./delete-table-CubRk-5H.mjs").then((mod) => mod.default),
21
- run: () => import("./run-BaEBHum8.mjs").then((mod) => mod.default),
22
- cancel: () => import("./cancel-iGUVm1h2.mjs").then((mod) => mod.default),
23
- "get-run": () => import("./get-run-DnKCnvUa.mjs").then((mod) => mod.default),
24
- runs: () => import("./runs-DWm1pIdP.mjs").then((mod) => mod.default)
25
- }
26
- });
27
- //#endregion
28
- export { transform_default as default };