@metabase/cli 0.5.4 → 0.5.5

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 (248) hide show
  1. package/dist/{add-collection-D2x34KVO.mjs → add-collection-lgBkahhW.mjs} +1 -1
  2. package/dist/{alert-B-w0c61D.mjs → alert-32mfYFy1.mjs} +6 -6
  3. package/dist/{alerts-nnrpqD-U.mjs → alerts-DWVmtHEJ.mjs} +2 -2
  4. package/dist/{api-key-CTyXuYui.mjs → api-key-DJfhPe4x.mjs} +3 -3
  5. package/dist/{append-BPrVW4RB.mjs → append-CdzKyHhn.mjs} +2 -2
  6. package/dist/{archive-p7gGwh0n.mjs → archive-24zg3Ckb.mjs} +1 -1
  7. package/dist/{archive-Bw_cvk_4.mjs → archive-B3_fjvid.mjs} +1 -1
  8. package/dist/{archive-OZQaaQkK.mjs → archive-B4G4EE9n.mjs} +1 -1
  9. package/dist/{archive-Cwetg5kK.mjs → archive-BTxrM_x2.mjs} +1 -1
  10. package/dist/{archive-CTZs6Hl6.mjs → archive-BZxa5zJk.mjs} +1 -1
  11. package/dist/{archive-BYo35OGC.mjs → archive-BmutUzPS.mjs} +1 -1
  12. package/dist/{archive-tmrsG41w.mjs → archive-CHQOH-nm.mjs} +1 -1
  13. package/dist/{archive-F5hoWW7f.mjs → archive-DEOq8OqU.mjs} +1 -1
  14. package/dist/{archive-CJFUFozc.mjs → archive-DOXrtANg.mjs} +1 -1
  15. package/dist/{archive-Ccf6Qqrf.mjs → archive-DbaGJh7E.mjs} +1 -1
  16. package/dist/{archive-BZVRJYTT.mjs → archive-NhewLr23.mjs} +1 -1
  17. package/dist/{archive-DBQnauVo.mjs → archive-Uws1E_p8.mjs} +1 -1
  18. package/dist/{auth-eogOlU4X.mjs → auth-bVvBp9Tl.mjs} +4 -4
  19. package/dist/{branches-CERgKqFq.mjs → branches-CkOAJk1H.mjs} +1 -1
  20. package/dist/{breaking-B8f_vl0i.mjs → breaking-CMpEeieT.mjs} +1 -1
  21. package/dist/{broken-mrkOdV4j.mjs → broken-DFFLXiYc.mjs} +1 -1
  22. package/dist/{bulk-discard-values-BQ3z6nJb.mjs → bulk-discard-values-D4eFBtKc.mjs} +1 -1
  23. package/dist/{bulk-edit-CJxoxDGQ.mjs → bulk-edit-CLJeGY2E.mjs} +1 -1
  24. package/dist/{bulk-rescan-values-DflzyxEj.mjs → bulk-rescan-values-DsaGKIo_.mjs} +1 -1
  25. package/dist/{bulk-sync-schema-CBIs4yHs.mjs → bulk-sync-schema-CN797vy9.mjs} +1 -1
  26. package/dist/{cancel-CyTRWSOr.mjs → cancel-CRpzqIUu.mjs} +1 -1
  27. package/dist/{cancel-task-BuZsQuLp.mjs → cancel-task-CpZcj7HB.mjs} +1 -1
  28. package/dist/{card-DA1W3Axw.mjs → card-nOX_QJ9u.mjs} +8 -8
  29. package/dist/{cards-BEeFNiCt.mjs → cards-DJMTrFQg.mjs} +1 -1
  30. package/dist/cli.mjs +38 -38
  31. package/dist/{client-DvWllzKd.mjs → client-D2ycdMRO.mjs} +9 -4
  32. package/dist/{collection-C98jgufi.mjs → collection-Cs84x7WB.mjs} +7 -7
  33. package/dist/{content-translation-1coWME1P.mjs → content-translation-7qPz-dIU.mjs} +2 -2
  34. package/dist/{copy-hE6SaHfb.mjs → copy-BeFjqXXc.mjs} +1 -1
  35. package/dist/{copy-DVe4rcLK.mjs → copy-D9-xBYYq.mjs} +1 -1
  36. package/dist/{create-B3P62NaN.mjs → create--eZb0G2P.mjs} +1 -1
  37. package/dist/{create-Btwnm6D2.mjs → create-B57Sj0om.mjs} +1 -1
  38. package/dist/{create-D271V9Cf.mjs → create-Ba8nYAWL.mjs} +1 -1
  39. package/dist/{create-Dz4c8E33.mjs → create-BfgTvPvI.mjs} +1 -1
  40. package/dist/{create-DXivfl69.mjs → create-BlYxQv6U.mjs} +1 -1
  41. package/dist/{create-DR5tpMUA.mjs → create-CLQVeQ0w.mjs} +1 -1
  42. package/dist/{create-XVjr8IDS.mjs → create-Cc07ouKB.mjs} +1 -1
  43. package/dist/{create-DJg0Ohj5.mjs → create-CplN1ey8.mjs} +1 -1
  44. package/dist/{create-DkFCjBp3.mjs → create-D4FT8Xj8.mjs} +1 -1
  45. package/dist/{create-DCoo3sI2.mjs → create-DBCOYtqn.mjs} +1 -1
  46. package/dist/{create-CCb2_Kcc.mjs → create-DBSpDnaA.mjs} +1 -1
  47. package/dist/{create-XCzUuT42.mjs → create-DHTl3wVv.mjs} +1 -1
  48. package/dist/{create-BPRuU7Mv.mjs → create-DIZGUCFE.mjs} +1 -1
  49. package/dist/{create-DR8g_rEL.mjs → create-DJ0Xrpod.mjs} +1 -1
  50. package/dist/{create-B3kz_fHg.mjs → create-Dj5y7xbA.mjs} +1 -1
  51. package/dist/{create-DEIIUohY2.mjs → create-Dr-q5oWx2.mjs} +1 -1
  52. package/dist/{create-LpdQKxUt.mjs → create-Dt6gdbAH.mjs} +2 -2
  53. package/dist/{create-branch-D_nbKxDS.mjs → create-branch-CKQkpU-_.mjs} +1 -1
  54. package/dist/{create-DdfFgF-w.mjs → create-cpxnjNMC.mjs} +1 -1
  55. package/dist/{create-D6Xm2b2D.mjs → create-n5cH8Tq-.mjs} +2 -2
  56. package/dist/{create-BjH0i2BC.mjs → create-ypwRxrcj.mjs} +1 -1
  57. package/dist/{csv-LP7sE-CS.mjs → csv-CxWsxJIB.mjs} +2 -2
  58. package/dist/{current-task-DhgwtGN3.mjs → current-task-DB7UTh6J.mjs} +1 -1
  59. package/dist/{dashboard-CR97_zXn.mjs → dashboard-DeSaOt2Z.mjs} +11 -11
  60. package/dist/{data-action-C4jE-RLb.mjs → data-action-Dpt7pfzd.mjs} +7 -7
  61. package/dist/{data-app-BlBvvRzC.mjs → data-app--T695WPM.mjs} +9 -9
  62. package/dist/{db-D8mPRqZc.mjs → db-CpK3QluZ.mjs} +7 -7
  63. package/dist/{delete-CaaPrNOf.mjs → delete-9YIc_L2E.mjs} +1 -1
  64. package/dist/{delete-DWTqIlbr.mjs → delete-AwOJ1x-D.mjs} +1 -1
  65. package/dist/{delete-CuyGTe0i.mjs → delete-B9GABYEJ.mjs} +1 -1
  66. package/dist/{delete-DC-DEYSq.mjs → delete-Bw8CMa_A.mjs} +1 -1
  67. package/dist/{delete-DaqzPLcG.mjs → delete-CE19WUPi.mjs} +1 -1
  68. package/dist/{delete-B1SbEVIc.mjs → delete-CUzOTiI8.mjs} +1 -1
  69. package/dist/{delete-8k7oYDFr.mjs → delete-D784J3ur.mjs} +1 -1
  70. package/dist/{delete-DuaJ8PUI.mjs → delete-DbAOgu73.mjs} +1 -1
  71. package/dist/{delete-ZjLpkwgx.mjs → delete-TcDfZNz2.mjs} +1 -1
  72. package/dist/{delete-table-CnGv1gx9.mjs → delete-table-a8acciQe.mjs} +1 -1
  73. package/dist/{delete-CqyBkMCd.mjs → delete-trx8NIoh.mjs} +1 -1
  74. package/dist/{dependencies-D6SNdLW8.mjs → dependencies-BcPdAMYB.mjs} +1 -1
  75. package/dist/{dependency-Bbg9x1V9.mjs → dependency-_SgcW_fL.mjs} +5 -5
  76. package/dist/{dependents-BizQb14Q.mjs → dependents-CRZaiOzg.mjs} +1 -1
  77. package/dist/{dirty-BHwdHOEj.mjs → dirty-1taTj3G6.mjs} +1 -1
  78. package/dist/{discard-values-BWlh2ce8.mjs → discard-values-DmiWAx4J.mjs} +1 -1
  79. package/dist/{document-B6254tue.mjs → document-DB6YGtqX.mjs} +6 -6
  80. package/dist/{download-D2wEAgi_.mjs → download-CEvVDGeC.mjs} +1 -1
  81. package/dist/{eid-KtWIPUCC.mjs → eid-pO_lMTI9.mjs} +1 -1
  82. package/dist/{entry-flags-DLS6r8Vf.mjs → entry-flags-CswcY8bG.mjs} +1 -1
  83. package/dist/{events-B8yMqrrD.mjs → events-cGDPEL5_.mjs} +1 -1
  84. package/dist/{execute-Bebvab7D.mjs → execute-DHGbJpPr.mjs} +1 -1
  85. package/dist/{export-BNj3RvAl.mjs → export-B0NUSP6q.mjs} +1 -1
  86. package/dist/{export-preflight-F3OapAD5.mjs → export-preflight-Bbl1bHpI.mjs} +1 -1
  87. package/dist/{field-DQAcCjXr.mjs → field-AkNMIQnx.mjs} +7 -7
  88. package/dist/{fields-BkAS_wIA.mjs → fields-M66PaKdV.mjs} +1 -1
  89. package/dist/{fks--SaqvPw1.mjs → fks-BvOGzID5.mjs} +1 -1
  90. package/dist/{get-BSKpQJVB.mjs → get-0T9zeyCh.mjs} +1 -1
  91. package/dist/{get-CU1zKfBS.mjs → get-B3Ceh_7N.mjs} +1 -1
  92. package/dist/{get-f2km9wsq.mjs → get-BL_9fN-q.mjs} +1 -1
  93. package/dist/{get-BjgB5l7X.mjs → get-Bt2Q516N.mjs} +1 -1
  94. package/dist/{get-VpGfaL7c.mjs → get-BzIQK_mt.mjs} +1 -1
  95. package/dist/{get-CGPxAoow.mjs → get-C3j93ivl.mjs} +1 -1
  96. package/dist/{get-CWDz6eV2.mjs → get-CCLnfOOE.mjs} +1 -1
  97. package/dist/{get-B1uiZyyi.mjs → get-CEreA2oN.mjs} +1 -1
  98. package/dist/{get-CM9IOr82.mjs → get-CJFg7YM5.mjs} +1 -1
  99. package/dist/{get-B2nBYYCw.mjs → get-Cfg52y7X.mjs} +1 -1
  100. package/dist/{get-CTTKQDr7.mjs → get-D-8G7EoL.mjs} +1 -1
  101. package/dist/{get-B1S1kW2N.mjs → get-D-ElxFlQ.mjs} +1 -1
  102. package/dist/{get-Cdcj1c9U.mjs → get-D7y_z5K7.mjs} +1 -1
  103. package/dist/{get-uHs9Ve-4.mjs → get-DGlZtzfB.mjs} +1 -1
  104. package/dist/{get-C9VumVZ3.mjs → get-DKZLwN3K.mjs} +2 -2
  105. package/dist/{get-De6qpuzO.mjs → get-HtzPLpy2.mjs} +1 -1
  106. package/dist/{get-gGSl7Se4.mjs → get-SOCVdBIU.mjs} +1 -1
  107. package/dist/{get-C_hatP_z.mjs → get-ZSLfDowg.mjs} +1 -1
  108. package/dist/{get-BseHija1.mjs → get-jzChrvn2.mjs} +1 -1
  109. package/dist/{get-run-CHup8cMl.mjs → get-run-BZP_z57v.mjs} +1 -1
  110. package/dist/{get-CiLYhFjU.mjs → get-uB7jROcz.mjs} +1 -1
  111. package/dist/{get-iOs1ci6x.mjs → get-wPkejadn.mjs} +1 -1
  112. package/dist/{get-Boql3_0n.mjs → get-zGreQNnG.mjs} +1 -1
  113. package/dist/git-sync-DaHnqpYi.mjs +29 -0
  114. package/dist/{glossary-BVxRpD7o.mjs → glossary-Br_mSh3i.mjs} +4 -4
  115. package/dist/{graph-B7SlzpkC.mjs → graph-CdKi07zZ.mjs} +1 -1
  116. package/dist/{has-remote-changes-DZq7q2Wk.mjs → has-remote-changes-d_JyzdPX.mjs} +1 -1
  117. package/dist/{import-DKZF0kMU.mjs → import-1bK-qrjV.mjs} +1 -1
  118. package/dist/{is-dirty-haRLODo1.mjs → is-dirty-BXwvuTeD.mjs} +1 -1
  119. package/dist/{items-BGWE5hLl.mjs → items-Dzh_xylQ.mjs} +1 -1
  120. package/dist/{library-e3aiJ1Yb.mjs → library-BA1QssFE.mjs} +4 -4
  121. package/dist/{list-D_8GeDG-.mjs → list-0TtkxraU.mjs} +1 -1
  122. package/dist/{list-C-AnwSRP.mjs → list-2doqGDIF.mjs} +1 -1
  123. package/dist/{list-COPGHkWL.mjs → list-7qcWFDXR.mjs} +1 -1
  124. package/dist/{list-D0ASRA_6.mjs → list-B5D3leO9.mjs} +1 -1
  125. package/dist/{list-Bbc8VYDi.mjs → list-B70w2ibG.mjs} +1 -1
  126. package/dist/{list-HI7Mpoy-.mjs → list-B75rzgSi.mjs} +1 -1
  127. package/dist/{list-P7FnSsbZ.mjs → list-BWNw-ppI.mjs} +1 -1
  128. package/dist/{list-Dvf1iB8r.mjs → list-BjpGurur.mjs} +1 -1
  129. package/dist/{list-CsXdnNyp.mjs → list-CdpEUPL-.mjs} +2 -2
  130. package/dist/{list-DDt1iLXj.mjs → list-CvQlMhrb.mjs} +1 -1
  131. package/dist/{list-DFuydMdV.mjs → list-DDV5PylU.mjs} +1 -1
  132. package/dist/{list-B9yhUzCc.mjs → list-DHX7-8Ae.mjs} +1 -1
  133. package/dist/{list-DcXqKZyg.mjs → list-DQNbHPNQ.mjs} +1 -1
  134. package/dist/{list-BNel4hYs.mjs → list-DR9dswtK.mjs} +1 -1
  135. package/dist/{list-BiIZdUoN.mjs → list-DSi8mf_F.mjs} +1 -1
  136. package/dist/{list-gcDxZ7Th.mjs → list-D_SfsO_-.mjs} +1 -1
  137. package/dist/{list-DFxfpa4W.mjs → list-Dn5_L-85.mjs} +1 -1
  138. package/dist/{list-DUCxqhtn.mjs → list-DuaFmOCz.mjs} +1 -1
  139. package/dist/{list-DAa4EWlv.mjs → list-Dv3s_PIu.mjs} +1 -1
  140. package/dist/{list-CNiCM1NL.mjs → list-Dz2YVD7m.mjs} +1 -1
  141. package/dist/{list-OUSeeuXb.mjs → list-TzuL_7GA.mjs} +1 -1
  142. package/dist/{list-DJyIkrY1.mjs → list-_jHBfq0E.mjs} +3 -3
  143. package/dist/{list-DednUvr3.mjs → list-iFtmAfVv.mjs} +1 -1
  144. package/dist/{login-APHXId1p.mjs → login-LAFw5Xxu.mjs} +3 -3
  145. package/dist/{logout-V0pxj6AM.mjs → logout-CjYzDvLH.mjs} +1 -1
  146. package/dist/{measure-DnGWkKyx.mjs → measure-DgtOyIoD.mjs} +5 -5
  147. package/dist/{parameter-values-DfZSEK3O.mjs → parameter-values-CRwVLpRD.mjs} +1 -1
  148. package/dist/{path-Bni-pnKS.mjs → path-BA_GGcGN.mjs} +2 -2
  149. package/dist/{publish-DkYn86ak.mjs → publish--I94MMjp.mjs} +9 -3
  150. package/dist/{query-gHeYfWj_.mjs → query-C8w04b4F.mjs} +1 -1
  151. package/dist/{query-CZbI4Rlv.mjs → query-O1b4qIr4.mjs} +1 -1
  152. package/dist/{remapping-hcWkFQsx.mjs → remapping-BdX4nj-U.mjs} +1 -1
  153. package/dist/{remove-collection-Qne5ww6M.mjs → remove-collection-dltKu8LO.mjs} +1 -1
  154. package/dist/{render-d1-sCPn_.mjs → render-DK2j4BwQ.mjs} +1 -1
  155. package/dist/{replace-DoU0IFGd.mjs → replace-BfO6UFZN.mjs} +2 -2
  156. package/dist/{requirement-check-BoVSK1uK.mjs → requirement-check-1fcffJj6.mjs} +1 -1
  157. package/dist/{rescan-values-COzM86P5.mjs → rescan-values-0-c5Gqtx.mjs} +1 -1
  158. package/dist/{rescan-values-s82n_You.mjs → rescan-values-7bbNa7WZ.mjs} +1 -1
  159. package/dist/{run-Q7fHux1F.mjs → run-5b123gPi.mjs} +2 -2
  160. package/dist/{run-JYNbEO_V.mjs → run-BS_wUAsi.mjs} +1 -1
  161. package/dist/{run-Bwj4Uuxk.mjs → run-Cf1nJahe.mjs} +1 -1
  162. package/dist/{runs-GQD6FO2k.mjs → runs-BJ4uy05c.mjs} +1 -1
  163. package/dist/{runtime-iIsqiOwO.mjs → runtime-D5yfliIq.mjs} +1 -1
  164. package/dist/{scaffold-CJo9l-2p.mjs → scaffold-aUy3Ik4q.mjs} +2 -2
  165. package/dist/{schema-2JhmK8FM.mjs → schema-Ds_j3N1I.mjs} +1 -1
  166. package/dist/{schema-tables-CarGLayY.mjs → schema-tables-BuFF9Psy.mjs} +1 -1
  167. package/dist/{schemas-oSjtuQ4G.mjs → schemas-DaDsur6B.mjs} +1 -1
  168. package/dist/{search-CvGEL2h-.mjs → search-BcJgmPU3.mjs} +1 -1
  169. package/dist/{search-Ca0sIr28.mjs → search-CTZzUd_j.mjs} +1 -1
  170. package/dist/{segment-BJCEJwNY.mjs → segment-zy4VVraQ.mjs} +5 -5
  171. package/dist/{send-B4nZI6CU.mjs → send-D0ikejQU.mjs} +1 -1
  172. package/dist/{set-BjMZCdN8.mjs → set-CjAaw2ZL.mjs} +1 -1
  173. package/dist/{set-active-CWDdv3kN.mjs → set-active-BQjKw1wk.mjs} +1 -1
  174. package/dist/{set-bundle-C2uk4jdt.mjs → set-bundle-6Qknum1I.mjs} +3 -3
  175. package/dist/{set-data-actions-lWl05ekf.mjs → set-data-actions-LcWEP4RO.mjs} +1 -1
  176. package/dist/{set-enabled-CPhw1AX4.mjs → set-enabled-C8Yww7Yv.mjs} +4 -4
  177. package/dist/{set-sensitivity-B7WI5BJC.mjs → set-sensitivity-OVcL2PbY.mjs} +1 -1
  178. package/dist/{setting-BvPpFjJT.mjs → setting-BsIBFvRP.mjs} +3 -3
  179. package/dist/{setup-DPRa8Uxm.mjs → setup-BxUd_KYl.mjs} +1 -1
  180. package/dist/{skills-BY3MCR8i.mjs → skills-BQBerRAk.mjs} +1 -1
  181. package/dist/{skills-BCivFuuZ.mjs → skills-CQRgUHI3.mjs} +3 -3
  182. package/dist/{snippet-BcN1UwoS.mjs → snippet-CRLI3fYI.mjs} +5 -5
  183. package/dist/{stash-leoW1fby.mjs → stash-BGqpcbSW.mjs} +1 -1
  184. package/dist/{status-BezD_K-g.mjs → status-CcOJIgfB.mjs} +1 -1
  185. package/dist/{status-AA4APlwZ.mjs → status-_wPMW1wq.mjs} +2 -2
  186. package/dist/{subscription-BDukZFlC.mjs → subscription-CqUIrnUJ.mjs} +5 -5
  187. package/dist/{subscriptions-CU4E_p7B.mjs → subscriptions-BP83ctRX.mjs} +2 -2
  188. package/dist/{summary-BFspP71W.mjs → summary-Byz6Y1v-.mjs} +1 -1
  189. package/dist/{sync-schema-BtjC-PNY.mjs → sync-schema-BJ-AtcCq.mjs} +1 -1
  190. package/dist/{sync-schema-BhRhsm8Y.mjs → sync-schema-DQBHc3bt.mjs} +1 -1
  191. package/dist/table-nIdBLcz7.mjs +26 -0
  192. package/dist/{timeline-Cr5d4Oer.mjs → timeline-Cw581KRT.mjs} +7 -7
  193. package/dist/{timeline-event-BiYDbW3r.mjs → timeline-event-BHfAXJrB.mjs} +5 -5
  194. package/dist/transform-job-sCgr8r-t.mjs +22 -0
  195. package/dist/transform-l1oC8oUS.mjs +28 -0
  196. package/dist/{transform-tag-DQXOPhmt.mjs → transform-tag-DZEvmwxY.mjs} +4 -4
  197. package/dist/{transform-test-wmAjyaka.mjs → transform-test-hxkx6M8c.mjs} +6 -6
  198. package/dist/{transforms-DcXL4Dox.mjs → transforms-D1wwWdCY.mjs} +1 -1
  199. package/dist/{transport-DZSxmmtY.mjs → transport-BWixD5Ww.mjs} +2 -2
  200. package/dist/{tree-DrYYCdXP.mjs → tree-IymKTTCK.mjs} +1 -1
  201. package/dist/{typed-schema-DEzmTY3J.mjs → typed-schema-gaIKntyu.mjs} +1 -1
  202. package/dist/{unpublish-D8hmulCx.mjs → unpublish-BnP0O_S2.mjs} +1 -1
  203. package/dist/{unreferenced-C3CqO3tu.mjs → unreferenced-DDkcn8EQ.mjs} +1 -1
  204. package/dist/{update-552UGPAG.mjs → update-BAocDvnS.mjs} +1 -1
  205. package/dist/{update-LlJM4tUd.mjs → update-BemK_tZ_.mjs} +1 -1
  206. package/dist/{update-l4WRN6Jh.mjs → update-Bfws2FN2.mjs} +1 -1
  207. package/dist/{update-DmMHHn75.mjs → update-BiBazvzY.mjs} +1 -1
  208. package/dist/{update-Zv7PP8nl.mjs → update-BsEG1dRm.mjs} +1 -1
  209. package/dist/{update-CctMr2T1.mjs → update-C0p1E-hs.mjs} +2 -2
  210. package/dist/{update-CcNYCalv.mjs → update-CFkOEnUu.mjs} +1 -1
  211. package/dist/{update-4TDRNrV-.mjs → update-CKrLtJWZ.mjs} +1 -1
  212. package/dist/{update-BVz0oIwS.mjs → update-C_VV1SP8.mjs} +1 -1
  213. package/dist/{update-B21GAnzT.mjs → update-CgJwzutJ.mjs} +1 -1
  214. package/dist/{update-CEDMvgJI.mjs → update-Cga4lrX5.mjs} +1 -1
  215. package/dist/{update-7iXRB23T2.mjs → update-CsH0lSpQ2.mjs} +1 -1
  216. package/dist/{update-DVD77mVR.mjs → update-CyfLXFKR.mjs} +1 -1
  217. package/dist/{update-DvGIaZdl.mjs → update-D9eA9UOf.mjs} +1 -1
  218. package/dist/{update-BxRFktpB.mjs → update-D9fs-PSK.mjs} +1 -1
  219. package/dist/{update-sma1ZRm2.mjs → update-DL1Iex_M.mjs} +3 -3
  220. package/dist/{update-3lRE8G9k.mjs → update-DntKWUl2.mjs} +1 -1
  221. package/dist/{update-CtuLA42g.mjs → update-K8FwdJEV.mjs} +1 -1
  222. package/dist/{update-4sOfpwpv.mjs → update-ReSzm23m.mjs} +1 -1
  223. package/dist/{update-dashcard-BijqiYQd.mjs → update-dashcard-Bpv45o1_.mjs} +1 -1
  224. package/dist/{update-Ch6AAOeh.mjs → update-gAPjldWw.mjs} +1 -1
  225. package/dist/{upgrade-TzILOkiM.mjs → upgrade-D3aDQZwd.mjs} +1 -1
  226. package/dist/{upload-Do-kOGtc.mjs → upload-B8HbBXb8.mjs} +2 -2
  227. package/dist/{upload-CdiDKe69.mjs → upload-BAD_9okY.mjs} +1 -1
  228. package/dist/{upload-B37bUVl_.mjs → upload-BqJLNCb1.mjs} +3 -3
  229. package/dist/{uuid-Dqq2WfAT.mjs → uuid-BIDBDPLI.mjs} +1 -1
  230. package/dist/{values-CtY5zv0m.mjs → values-BDekphEw.mjs} +1 -1
  231. package/dist/{verify-DBTlWx-S.mjs → verify-BnZqq9Aw.mjs} +1 -1
  232. package/dist/{verify-BiB8jzXB.mjs → verify-CMTrDvAW.mjs} +1 -1
  233. package/dist/{verify-DJ7fGyLL.mjs → verify-k0WHgc16.mjs} +2 -2
  234. package/dist/{wait-DEYagfq4.mjs → wait-C69z8PSw.mjs} +1 -1
  235. package/package.json +1 -1
  236. package/skill-data/core/SKILL.md +5 -2
  237. package/skill-data/data-app/SKILL.md +16 -17
  238. package/skill-data/data-app/template/README.md +1 -1
  239. package/skill-data/data-app-actions/SKILL.md +3 -0
  240. package/skill-data/data-app-data/SKILL.md +6 -6
  241. package/skill-data/data-app-filters/SKILL.md +12 -4
  242. package/skill-data/data-app-ui/SKILL.md +11 -11
  243. package/skill-data/data-workflow/references/reusable-definitions.md +2 -2
  244. package/skill-data/git-sync/SKILL.md +13 -11
  245. package/dist/git-sync-Czena0TW.mjs +0 -29
  246. package/dist/table-Dzp1uANs.mjs +0 -26
  247. package/dist/transform-C-0nV5Et.mjs +0 -28
  248. package/dist/transform-job-B9MPk7S5.mjs +0 -22
@@ -19,12 +19,13 @@ Before any control, write one row per filter: the question that gives its option
19
19
  | Plan | orders broken out by plan | plan text | orders | revenue, stock |
20
20
 
21
21
  - A filter in the page's global bar changes every panel that can take it. One that can't reach a panel is scoped to its section, visibly, or left out. A KPI and its detail table about the same thing take the same filters, unless the UI says why not.
22
+ - A KPI on an aggregated question shows one complete bucket (`data-app-data`, _Runtime clauses_): it gets its own control of one-bucket presets starting at the last complete bucket, never All time, rather than a shared bar's ranges.
22
23
  - One date control per scope. Never a global date range beside a page-specific date where one of the two does nothing; a page whose cards use another date column gets one control for that column.
23
24
  - Build each panel's clauses from its own question's columns, inline at its hook call. Never reuse an array built for another question.
24
25
 
25
26
  ## Values and options
26
27
 
27
- - Every filter starts at **All**. Keep it as `"all"` in state and send it as no clause (`[]`); treat `""`, `null` and `undefined` the same way. In a Yes/No/All filter, Yes and No each filter (`true`, `false`), and only All sends nothing.
28
+ - Every filter starts at **All**, except a KPI's own date control (above). Keep it as `"all"` in state and send it as no clause (`[]`), except on an aggregated question whose panel doesn't show the filtered column, where All is its own question (`data-app-data`, _Runtime clauses_); treat `""`, `null` and `undefined` the same way. In a Yes/No/All filter, Yes and No each filter (`true`, `false`), and only All sends nothing.
28
29
  - Options come at runtime from their own question in the app's collection, broken out on the filtered column — never hardcoded unless the user gave a closed list. Dedupe them from its rows, and keep the label apart from the value.
29
30
  - Filter by a stable raw value (an id) and show its label; never filter by a display label when an id exists, and never feed free text into an exact-id filter.
30
31
  - All stays selectable while options load, come back empty or fail; don't disable the control. When fresh options no longer hold the selected value, reset to All:
@@ -48,7 +49,7 @@ Any list whose options come from a question — an id shown as a name, a categor
48
49
 
49
50
  ## Date ranges
50
51
 
51
- A preset bar lists the durations, then All time, then Custom last — leave Custom out only if the user asked for fixed presets. Every option ends in the same `[start, end]` range (All time is `[null, null]`), so one `between` filter serves them all. Custom is `DateRangePopover` around your own trigger, or `DateRangeCalendar` inline, both from `@metabase/embedding-sdk-react/data-app`. No date-picker library and no `<input type="date">` for a range.
52
+ A preset bar lists the durations, then All time, then Custom last — leave Custom out only if the user asked for fixed presets, or the bar filters an aggregated question, which offers only whole, complete buckets and no All time on a KPI (`data-app-data`, _Runtime clauses_). Every option ends in the same `[start, end]` range (All time is `[null, null]`), so one `between` filter serves them all. Custom is `DateRangePopover` around your own trigger, or `DateRangeCalendar` inline, both from `@metabase/embedding-sdk-react/data-app`. No date-picker library and no `<input type="date">` for a range.
52
53
 
53
54
  ```tsx
54
55
  import { DateRangePopover, filter, useDateFormatter } from "@metabase/embedding-sdk-react/data-app";
@@ -68,7 +69,7 @@ const [start, end] = range;
68
69
  - Label it with `formatDateRange(range)` (or `formatDate` for one end), which formats in the instance's locale; both take a dayjs `format`, and `formatDateRange` a `separator`. It returns `""` until the SDK loads. Never `new Date("YYYY-MM-DD")`: a date-only string parses as UTC and shows the previous day west of Greenwich.
69
70
  - The popover closes once both ends are picked (`closeOnSelect`); `opened` and `onOpenedChange` control it yourself. Also `defaultValue`, `minDate` and `maxDate` (`YYYY-MM-DD`), `numberOfColumns` (default 2) and `position` (default `bottom-start`). `DateRangeCalendar` takes the same value props plus `className` and `style`.
70
71
 
71
- A preset's range, from local dates — never `toISOString()`, which shifts the day:
72
+ A preset's range, from local dates — never `toISOString()`, which shifts the day. `lastMonths` is a rolling window, for a rows question; on a month question, `lastCompleteMonths` gives bucket starts:
72
73
 
73
74
  ```ts
74
75
  const ymd = (d: Date) =>
@@ -78,10 +79,17 @@ const lastMonths = (n: number): [string, string] => {
78
79
  const start = new Date(end.getFullYear(), end.getMonth() - n, end.getDate());
79
80
  return [ymd(start), ymd(end)];
80
81
  };
82
+ const lastCompleteMonths = (n: number): [string, string] => {
83
+ const now = new Date();
84
+ return [
85
+ ymd(new Date(now.getFullYear(), now.getMonth() - n, 1)),
86
+ ymd(new Date(now.getFullYear(), now.getMonth() - 1, 1)),
87
+ ];
88
+ };
81
89
  ```
82
90
 
83
91
  **A single date or a date-time** is the one case for a library: `npm install react-datepicker`, import `react-datepicker/dist/react-datepicker.css`, type the callback (`(date: Date | null) => …`), and convert with `ymd` above. Pass `null`, never `new Date("")`, for an empty value.
84
92
 
85
93
  ## Check
86
94
 
87
- For every visible filter: All runs the unfiltered question; its options come from a question; each option changes every panel the contract says it reaches, and no other; a preset bar ends with Custom; and no scope has two date controls. Search the filter controls for `<select` and `type="date"` — an action form keeps its date inputs. Then build and publish (`data-app`, _Build and publish_).
95
+ For every visible filter except a KPI's own date control: All runs the unfiltered question, or its All question; its options come from a question; each option changes every panel the contract says it reaches, and no other; a preset bar ends with Custom unless it filters an aggregated question; and no scope has two date controls. Search the filter controls for `<select` and `type="date"` — an action form keeps its date inputs. Then build and publish (`data-app`, _Build and publish_).
@@ -35,7 +35,7 @@ Everything here runs inside the sandbox, the same in the dev preview as in Metab
35
35
  | `navigator.geolocation` and other device APIs | Nothing. |
36
36
  | Key, input, composition and clipboard listeners (`keydown`, `paste`, `input`, …) on `window` or `document` | A React handler (`onKeyDown`, `onPaste`, …) on your own element. |
37
37
 
38
- **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"]}'`, plus an `allowed_hosts:` list in `data_app.yaml` beside `package.json` for the preview, 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.
38
+ **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.
39
39
 
40
40
  ## Layout
41
41
 
@@ -69,12 +69,12 @@ export function AppError({ message }: SdkErrorComponentProps) {
69
69
 
70
70
  ## SDK components
71
71
 
72
- | Import | For |
73
- | -------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
74
- | `StaticQuestion` | A chart, KPI or table without drill-through — the default. |
75
- | `InteractiveQuestion` | One meant to be explored: drill-through, chart switching, the editor. |
76
- | `StaticDashboard`, `InteractiveDashboard`, `EditableDashboard` | A dashboard. |
77
- | `CreateQuestion`, `MetabotQuestion`, `CollectionBrowser`, `CreateDashboardModal` | Authoring flows, rarely in an app. |
72
+ | Import | For |
73
+ | --------------------- | --------------------------------------------------------------------------------------- |
74
+ | `StaticQuestion` | A chart, KPI or table without drill-through — the default. |
75
+ | `InteractiveQuestion` | One meant to be explored: drill-through, chart switching; pass `isSaveEnabled={false}`. |
76
+
77
+ Both take a question in the app's collection. Dashboards and the authoring components (`CreateQuestion`, `CreateDashboardModal`, saving from the editor) don't work in an app: its collection can't hold a dashboard, and an app can't save content.
78
78
 
79
79
  ## A Metabase chart or your own
80
80
 
@@ -82,13 +82,13 @@ Ask "can Metabase draw this at all?", never "which looks closer to the design?"
82
82
 
83
83
  - **Yes** — bar, line, area, combo, row, pie, scalar, smartscalar, gauge, progress, funnel, scatter, waterfall, boxplot, sankey, pivot, map, tables: render it with `useMetabaseQueryObject` and `StaticQuestion` (`data-app-data`). It keeps the instance's formatting, tooltips, theming and drill-through. Styling is never a reason to draw it yourself.
84
84
  - **No**, or the user asked for a custom one — scorecards, timelines, calendar grids, one visual from several queries: draw it from `useMetabaseQuery` rows, with SVG or a chart library the app already has.
85
- - A KPI is `scalar`, `smartscalar`, `gauge` or `progress`; put what Metabase doesn't draw (a caption, stars) beside it.
85
+ - A KPI is `scalar`, `smartscalar`, `gauge` or `progress` — on a question filtered at runtime to one bucket, `scalar` (a `smartscalar` loses its comparison); put what Metabase doesn't draw (a caption, stars) beside it.
86
86
  - `InteractiveQuestion`: pass `isSaveEnabled={false}`, and `title={false}` in a panel with its own heading. Children replace its layout: `<InteractiveQuestion card={card}><InteractiveQuestion.QuestionVisualization height={360} /></InteractiveQuestion>` is the chart alone.
87
87
 
88
- **Visualization settings.** Add `visualizationSettings` only for a change the user asked for. Their keys are a question's `visualization_settings` keys — the `visualization` skill lists them — and the installed types decide what's legal: `rg -n "<key>|declare type .*VisualizationSettings" node_modules/@metabase/embedding-sdk-react/dist/index.d.ts`, never the whole file, never from memory. Keep them few: keys such as `graph.dimensions`, `pie.metric` and `column_settings` name result columns and break when the question changes.
88
+ **Visualization settings.** Add `visualizationSettings` only for a change the user asked for, or `scalar.field` on a KPI whose first column isn't the number. Their keys are a question's `visualization_settings` keys — the `visualization` skill lists them — and the installed types decide what's legal: `rg -n "<key>|declare type .*VisualizationSettings" node_modules/@metabase/embedding-sdk-react/dist/index.d.ts`, never the whole file, never from memory. Keep them few: keys such as `graph.dimensions`, `pie.metric` and `column_settings` name result columns and break when the question changes.
89
89
 
90
90
  - A `table` with two breakouts and one aggregation renders as a pivot when a breakout has at most 16 values; `{ "table.pivot": false }` keeps one row per group.
91
- - A scalar shows the first column: with a key column first, point it at the number with `{ "scalar.field": "avg_rating" }`.
91
+ - A scalar shows the first column: with a key or breakout column first (a date on a month question), point it at the number with `{ "scalar.field": "avg_rating" }`.
92
92
  - A header: `column_settings: { '["name","approvers"]': { column_title: "Approvers" } }`.
93
93
 
94
94
  ## Pages
@@ -117,4 +117,4 @@ Metabase mirrors each route to `/apps/<slug>/<path>`, and a reload there opens t
117
117
 
118
118
  ## Before handoff
119
119
 
120
- `npm run dev` only transpiles: run `npm run typecheck` after every round of edits and fix what it reports, and report the result, errors grouped by cause. Search the changed files and fix what turns up: `card={{` (every `card` comes from `useMemo`), `row[0]` and `as unknown as` (rows are keyed by column name), `<select` for a list from a question (`data-app-filters`), `type="date"` and `new Date(` in a date filter, `* 100` and `%`. Read the diagnostics feed with every panel mounted, then build and publish (`data-app`, _Build and publish_).
120
+ `npm run dev` only transpiles: run `npm run typecheck` after every round of edits and fix what it reports, and report the result, errors grouped by cause. Search the changed files and fix what turns up: `card={{` (every `card` comes from `useMemo`), `row[0]` and `as unknown as` (rows are keyed by column name), `<select` for a list from a question (`data-app-filters`), `type="date"` and `new Date("` (a date string parsed as UTC) in a date filter, `* 100` and `%`. Read the diagnostics feed with every panel mounted, then build and publish (`data-app`, _Build and publish_).
@@ -49,7 +49,7 @@ Two things never bend in any mode: when genuinely unsure, **ask** (the Shared Co
49
49
  - "Let me filter to just the active ones" → a **segment** (saved filter).
50
50
  - "Let me add up revenue the same way everywhere, on this table" → a **measure** on the table.
51
51
  - "Revenue is an _official company number_ people pull onto dashboards" → a **metric** in a collection, with a default month-by-month view so it charts cleanly. Lean: make it a metric when it's a headline figure the org reuses across many questions/dashboards; keep it a measure when it's a table-local convenience.
52
- - **Where the metric lives.** Metrics sit in a collection (folder). Lean: put the org's blessed ones in the shared **Library** so they surface prominently; keep experimental ones in a working collection until trusted.
52
+ - **Where the metric lives.** Metrics sit in a collection (folder). Lean: put the org's blessed ones in the Library's **Metrics** collection so they surface prominently; keep experimental ones in a working collection until trusted.
53
53
  <!-- requires: library -->
54
54
  - **Publish the official tables to the Library.** The clean, analysis-ready tables your definitions sit on are the org's official starting points — the **Library** is how you mark them as such. Tables published to the Library's **Data** section appear _first_ when anyone picks a data source, nudging people toward your curated tables instead of raw warehouse ones. Lean: publish the wide clean tables you built the semantic layer on; hold back raw or half-built ones. Surface which tables you'd publish and confirm. (Only admins and data analysts can publish — mechanics in `core`.)
55
55
  <!-- /requires -->
@@ -102,7 +102,7 @@ Build each agreed definition. The verb mechanics (create/update flags, the `revi
102
102
 
103
103
  - **Segment** → `mb segment create`. A flat MBQL filter clause on a table.
104
104
  - **Measure** → `mb measure create`. **Exactly one** aggregation on a table.
105
- - **Metric** → `mb card create` with the metric shape (`type: "metric"`) — it lives in a **collection**, carries the aggregation plus an optional default time dimension. Put org-blessed ones in the Library collection.
105
+ - **Metric** → `mb card create` with the metric shape (`type: "metric"`) — it lives in a **collection**, carries the aggregation plus an optional default time dimension. Put org-blessed ones in the Library's **Metrics** collection (id from `mb library get`).
106
106
  <!-- requires: library -->
107
107
  - **Publish the official tables** → `mb library create` then `mb library publish` (mechanics in `core`) to move the clean tables your definitions sit on into the Library's **Data** section, so people start from your curated set, not raw warehouse tables.
108
108
  <!-- /requires -->
@@ -7,7 +7,7 @@ requires: [remoteSync]
7
7
 
8
8
  # git-sync (representations ↔ instance)
9
9
 
10
- Metabase content (cards, dashboards, transforms, snippets, collections, …) can live in a git repo as YAML and round-trip in and out of a Metabase instance via the `git-sync` verbs. The instance is configured with a `remote-sync-*` settings block (URL, branch, token, type read-only/read-write); the CLI drives the sync tasks against `/api/ee/remote-sync/*`. Only collections flagged for sync serialize; everything else is local-only. Table and field metadata round-trips too, for Library-published tables in a flagged collection — see "Published table metadata" below.
10
+ Metabase content (cards, dashboards, transforms, snippets, collections, …) can live in a git repo as YAML and round-trip in and out of a Metabase instance via the `git-sync` verbs. The instance is configured with a `remote-sync-*` settings block (URL, branch, token, type read-only/read-write); the CLI drives the sync tasks against `/api/ee/remote-sync/*`. Only flagged collections serialize, plus, unflagged: each data app's collection (with its app, `data_apps/<slug>/`), transforms (`remote-sync-transforms`), and snippets, data actions and glossary once the Library is synced. Everything else is local-only. Table and field metadata round-trips too, for Library-published tables in a flagged collection — see "Published table metadata" below.
11
11
 
12
12
  The repo and the instance are two ends of the same state; what "push my changes" means depends on where the changes were made. If they were made **in the instance** (CLI verbs against a read-write instance — cards edited, transforms created, tables published, metadata written), "push my changes" / "save this to the repo" / "open a PR with these changes" means driving the instance's export to a branch (`stash` or `create-branch` + `export`) and opening the PR from that branch — not reconstructing the changes as files. If the workflow is **repo-first** (content YAML edited in the repo, the instance imports it), plain `git` against the repo is the way — but only in the serialized layout already there: files in paths or formats the serializer doesn't own are invisible to Metabase and never apply on import.
13
13
 
@@ -64,7 +64,7 @@ Workflow:
64
64
 
65
65
  <!-- requires: remoteSyncRemoteChanges -->
66
66
 
67
- Between the two, confirm `has-remote-changes` reports `has_changes: true` — there's actually something to import.
67
+ Between the two, confirm `has-remote-changes` reports `has_changes: true` (`--force-refresh` after your own push: the answer is cached).
68
68
 
69
69
  <!-- /requires -->
70
70
 
@@ -168,7 +168,7 @@ Skip the prompt only if the user's instructions already specified the branch (e.
168
168
  ```bash
169
169
  mb git-sync branches --profile <n> --json # list remote branches
170
170
  mb git-sync create-branch <name> --profile <n> # create + switch sync to it
171
- mb git-sync stash --profile <n> # export current state to a NEW branch
171
+ mb git-sync stash --new-branch <name> --profile <n> # export current state to a NEW branch
172
172
  ```
173
173
 
174
174
  `stash` is the safe move when the instance has team work you don't want to lose, but you need to pivot to a different branch (`import` would discard, `export --force` would overwrite). It exports current state to a fresh branch first.
@@ -184,19 +184,21 @@ Use `wait` after `import --no-wait` / `export --no-wait`. Use `cancel-task` if a
184
184
 
185
185
  ## Adding / removing a directory (collection) to sync
186
186
 
187
- The set of directories under sync is governed by which **collections** carry `is_remote_synced: true`. Every collection so flagged serializes to its own folder under `collections/` in the repo; everything outside that set is local-only. The CLI exposes per-collection toggles that route to the underlying bulk endpoint (`PUT /api/ee/remote-sync/settings`):
187
+ The set of directories under sync is governed by which **collections** carry `is_remote_synced: true`. Every collection so flagged serializes to its own folder under `collections/` in the repo; so do the unflagged ones above (a data app's collection can't be flagged). Everything else is local-only. Toggle one collection at a time:
188
188
 
189
189
  ```bash
190
190
  mb git-sync add-collection <collection-id> --profile <n> --json
191
191
  mb git-sync remove-collection <collection-id> --profile <n> --json
192
192
  ```
193
193
 
194
- `<collection-id>` is a **positive integer** (the bulk endpoint's schema is `pos-int? → boolean`; nano-id / `root` / `trash` refs are not supported). Get the id from `collection list` (see `core`).
194
+ `<collection-id>` is a **positive integer** (no nano-id, `root` or `trash`). Get the id from `collection list` (see `core`).
195
195
 
196
- Both verbs return `{ success: true }`, plus a `task_id` only when the toggle started a follow-up task (e.g. a finalization import after switching to read-only).
196
+ Both return `{ success: true }`, plus a `task_id` when the toggle started a follow-up task.
197
197
 
198
198
  **Cascade.** A toggle on a parent cascades to every descendant by `location` prefix — `add-collection 4` flips `4` plus every collection nested under it. `remove-collection 4` is the symmetric inverse. There is no per-leaf-only mode.
199
199
 
200
+ **Custom collections.** Outside the Library, transforms, snippets and data actions, a flag answers 400 unless the admin setting `remote-sync-custom-collections-enabled` is on (a data app's collection can't be flagged at all).
201
+
200
202
  **Mode prerequisite.** The server rejects toggles while `remote-sync-type` is `:read-only` (the install default; `mb git-sync status --json` reports it as `sync_type`). If `mb git-sync add-collection 12` returns `Metabase returned 400 … Cannot change synced collections when remote-sync-type is read-only.`, switch first with:
201
203
 
202
204
  ```bash
@@ -237,13 +239,13 @@ To plan the order before the first move, `mb dependency graph dashboard <id> --j
237
239
 
238
240
  ## Published table metadata (Library) and sync scope
239
241
 
240
- Table and field metadata — table/field descriptions, semantic types (`type/PK`, `type/FK`), FK targets, plus segments and measures on the table — serializes for **Library-published tables only**, under `databases/<db>/schemas/<schema>/tables/<table>/…` in the repo. Eligibility is two-gated: the table must be published (`mb library publish`), **and** the Library collection holding it must itself carry `is_remote_synced: true`. An ordinary warehouse table, or a transform's target table that isn't published, never serializes — a transform's YAML carries only the transform definition (query, target, description), not the output table's field metadata.
242
+ Table and field metadata — table/field descriptions, semantic types (`type/PK`, `type/FK`), FK targets, plus segments and measures on the table — serializes for **Library-published tables only**, under `databases/<db>/schemas/<schema>/tables/<table>/…` in the repo. Eligibility is two-gated: the table must be published (`mb library publish`), **and** Library Data must be synced; flag the Library root, as Data alone leaves out Metrics, Dashboards, snippets, data actions and glossary. An ordinary warehouse table, or a transform's target table that isn't published, never serializes — a transform's YAML carries only the transform definition (query, target, description), not the output table's field metadata.
241
243
 
242
- The classic trap: publish tables, write field metadata, then `git-sync dirty` comes back empty and nothing lands in the repo. That does not mean git-sync can't carry table metadata — it means the Library collection isn't in the sync scope, so nothing was eligible for dirty-tracking when the writes happened. Check the scope (`synced_collections` in `status`), then:
244
+ The classic trap: publish tables, write field metadata, then `git-sync dirty` comes back empty and nothing lands in the repo. It means the Library collection isn't in the sync scope, so nothing was eligible for dirty-tracking when the writes happened. Check the scope (`synced_collections` in `status`), then:
243
245
 
244
246
  ```bash
245
- mb library get --profile <n> --json # Library Data collection id
246
- mb git-sync add-collection <library-data-id> --profile <n>
247
+ mb collection list --profile <n> --json # the "type": "library" entry's id
248
+ mb git-sync add-collection <library-id> --profile <n>
247
249
  mb git-sync stash --new-branch <branch> -m "..." --profile <n> # or create-branch + export
248
250
  ```
249
251
 
@@ -256,7 +258,7 @@ Flagging the collection records it for the next export, which serializes its cur
256
258
  - Don't turn instance-side changes into hand-written repo files: export them and PR the exported branch (see the top of this skill). Files pushed behind Metabase's back race its own sync tasks.
257
259
  - Don't conclude from an empty `dirty` list that a change type isn't tracked. Dirty-tracking only records changes to _eligible_ objects; the usual cause is scope (the collection isn't flagged — see "Published table metadata"), not capability. Check `synced_collections` in `status` before concluding.
258
260
  - Don't run `git-sync import --force` or `git-sync export --force` without explicit user confirmation. Both are lossy — `--force` import discards instance-side work, `--force` export overwrites the remote branch.
259
- - Don't drive `git-sync` against a Metabase instance that doesn't have remote-sync configured — every verb returns an error pointing at the missing `remote-sync-*` settings. To check: `mb git-sync status --profile <n> --json` reports `remote_configured: false` when no remote is configured.
261
+ - Don't drive `git-sync` against a Metabase instance that doesn't have remote-sync configured — import, export, has-remote-changes and export-preflight answer `Remote sync is not configured.` To check: `mb git-sync status --profile <n> --json` succeeds and reports `remote_configured: false`.
260
262
  - Don't author content directly via `card create` / `transform create` and then assume `git-sync export` will commit it cleanly — the instance and repo can drift if you mix direct API writes with sync-tracked changes. If you do, follow direct writes immediately with `git-sync export -m "..."` to keep them in step.
261
263
  - Don't move a dashboard or question into a synced collection before what it depends on, and don't retry a `Uses content that is not remote synced.` refusal unchanged. Move the listed dependencies first, move the whole containing collection, or build the content in the synced collection to begin with (see "Moving content into or out of a synced collection").
262
264
  - Don't omit `-m` on `export` if the user wants a meaningful commit message — the default server-generated message is generic.
@@ -1,29 +0,0 @@
1
- import { t as defineCommandGroup } from "./group--6adAsqG.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-BezD_K-g.mjs").then((mod) => mod.default),
12
- "is-dirty": () => import("./is-dirty-haRLODo1.mjs").then((mod) => mod.default),
13
- "has-remote-changes": () => import("./has-remote-changes-DZq7q2Wk.mjs").then((mod) => mod.default),
14
- dirty: () => import("./dirty-BHwdHOEj.mjs").then((mod) => mod.default),
15
- "current-task": () => import("./current-task-DhgwtGN3.mjs").then((mod) => mod.default),
16
- "cancel-task": () => import("./cancel-task-BuZsQuLp.mjs").then((mod) => mod.default),
17
- wait: () => import("./wait-DEYagfq4.mjs").then((mod) => mod.default),
18
- import: () => import("./import-DKZF0kMU.mjs").then((mod) => mod.default),
19
- export: () => import("./export-BNj3RvAl.mjs").then((mod) => mod.default),
20
- "export-preflight": () => import("./export-preflight-F3OapAD5.mjs").then((mod) => mod.default),
21
- stash: () => import("./stash-leoW1fby.mjs").then((mod) => mod.default),
22
- branches: () => import("./branches-CERgKqFq.mjs").then((mod) => mod.default),
23
- "create-branch": () => import("./create-branch-D_nbKxDS.mjs").then((mod) => mod.default),
24
- "add-collection": () => import("./add-collection-D2x34KVO.mjs").then((mod) => mod.default),
25
- "remove-collection": () => import("./remove-collection-Qne5ww6M.mjs").then((mod) => mod.default)
26
- }
27
- });
28
- //#endregion
29
- export { git_sync_default as default };
@@ -1,26 +0,0 @@
1
- import { t as defineCommandGroup } from "./group--6adAsqG.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-P7FnSsbZ.mjs").then((m) => m.default),
12
- get: () => import("./get-uHs9Ve-4.mjs").then((m) => m.default),
13
- fields: () => import("./fields-BkAS_wIA.mjs").then((m) => m.default),
14
- fks: () => import("./fks--SaqvPw1.mjs").then((m) => m.default),
15
- update: () => import("./update-Zv7PP8nl.mjs").then((m) => m.default),
16
- "sync-schema": () => import("./sync-schema-BtjC-PNY.mjs").then((m) => m.default),
17
- "rescan-values": () => import("./rescan-values-COzM86P5.mjs").then((m) => m.default),
18
- "discard-values": () => import("./discard-values-BWlh2ce8.mjs").then((m) => m.default),
19
- "bulk-edit": () => import("./bulk-edit-CJxoxDGQ.mjs").then((m) => m.default),
20
- "bulk-sync-schema": () => import("./bulk-sync-schema-CBIs4yHs.mjs").then((m) => m.default),
21
- "bulk-rescan-values": () => import("./bulk-rescan-values-DflzyxEj.mjs").then((m) => m.default),
22
- "bulk-discard-values": () => import("./bulk-discard-values-BQ3z6nJb.mjs").then((m) => m.default)
23
- }
24
- });
25
- //#endregion
26
- export { table_default as default };
@@ -1,28 +0,0 @@
1
- import { t as defineCommandGroup } from "./group--6adAsqG.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-BiIZdUoN.mjs").then((mod) => mod.default),
15
- get: () => import("./get-BjgB5l7X.mjs").then((mod) => mod.default),
16
- dependencies: () => import("./dependencies-D6SNdLW8.mjs").then((mod) => mod.default),
17
- create: () => import("./create-DEIIUohY2.mjs").then((mod) => mod.default),
18
- update: () => import("./update-CEDMvgJI.mjs").then((mod) => mod.default),
19
- delete: () => import("./delete-ZjLpkwgx.mjs").then((mod) => mod.default),
20
- "delete-table": () => import("./delete-table-CnGv1gx9.mjs").then((mod) => mod.default),
21
- run: () => import("./run-JYNbEO_V.mjs").then((mod) => mod.default),
22
- cancel: () => import("./cancel-CyTRWSOr.mjs").then((mod) => mod.default),
23
- "get-run": () => import("./get-run-CHup8cMl.mjs").then((mod) => mod.default),
24
- runs: () => import("./runs-GQD6FO2k.mjs").then((mod) => mod.default)
25
- }
26
- });
27
- //#endregion
28
- export { transform_default as default };
@@ -1,22 +0,0 @@
1
- import { t as defineCommandGroup } from "./group--6adAsqG.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-OUSeeuXb.mjs").then((mod) => mod.default),
12
- get: () => import("./get-gGSl7Se4.mjs").then((mod) => mod.default),
13
- create: () => import("./create-XVjr8IDS.mjs").then((mod) => mod.default),
14
- update: () => import("./update-7iXRB23T2.mjs").then((mod) => mod.default),
15
- delete: () => import("./delete-CuyGTe0i.mjs").then((mod) => mod.default),
16
- run: () => import("./run-Bwj4Uuxk.mjs").then((mod) => mod.default),
17
- transforms: () => import("./transforms-DcXL4Dox.mjs").then((mod) => mod.default),
18
- "set-active": () => import("./set-active-CWDdv3kN.mjs").then((mod) => mod.default)
19
- }
20
- });
21
- //#endregion
22
- export { transform_job_default as default };