@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.
- package/dist/{add-collection-D2x34KVO.mjs → add-collection-lgBkahhW.mjs} +1 -1
- package/dist/{alert-B-w0c61D.mjs → alert-32mfYFy1.mjs} +6 -6
- package/dist/{alerts-nnrpqD-U.mjs → alerts-DWVmtHEJ.mjs} +2 -2
- package/dist/{api-key-CTyXuYui.mjs → api-key-DJfhPe4x.mjs} +3 -3
- package/dist/{append-BPrVW4RB.mjs → append-CdzKyHhn.mjs} +2 -2
- package/dist/{archive-p7gGwh0n.mjs → archive-24zg3Ckb.mjs} +1 -1
- package/dist/{archive-Bw_cvk_4.mjs → archive-B3_fjvid.mjs} +1 -1
- package/dist/{archive-OZQaaQkK.mjs → archive-B4G4EE9n.mjs} +1 -1
- package/dist/{archive-Cwetg5kK.mjs → archive-BTxrM_x2.mjs} +1 -1
- package/dist/{archive-CTZs6Hl6.mjs → archive-BZxa5zJk.mjs} +1 -1
- package/dist/{archive-BYo35OGC.mjs → archive-BmutUzPS.mjs} +1 -1
- package/dist/{archive-tmrsG41w.mjs → archive-CHQOH-nm.mjs} +1 -1
- package/dist/{archive-F5hoWW7f.mjs → archive-DEOq8OqU.mjs} +1 -1
- package/dist/{archive-CJFUFozc.mjs → archive-DOXrtANg.mjs} +1 -1
- package/dist/{archive-Ccf6Qqrf.mjs → archive-DbaGJh7E.mjs} +1 -1
- package/dist/{archive-BZVRJYTT.mjs → archive-NhewLr23.mjs} +1 -1
- package/dist/{archive-DBQnauVo.mjs → archive-Uws1E_p8.mjs} +1 -1
- package/dist/{auth-eogOlU4X.mjs → auth-bVvBp9Tl.mjs} +4 -4
- package/dist/{branches-CERgKqFq.mjs → branches-CkOAJk1H.mjs} +1 -1
- package/dist/{breaking-B8f_vl0i.mjs → breaking-CMpEeieT.mjs} +1 -1
- package/dist/{broken-mrkOdV4j.mjs → broken-DFFLXiYc.mjs} +1 -1
- package/dist/{bulk-discard-values-BQ3z6nJb.mjs → bulk-discard-values-D4eFBtKc.mjs} +1 -1
- package/dist/{bulk-edit-CJxoxDGQ.mjs → bulk-edit-CLJeGY2E.mjs} +1 -1
- package/dist/{bulk-rescan-values-DflzyxEj.mjs → bulk-rescan-values-DsaGKIo_.mjs} +1 -1
- package/dist/{bulk-sync-schema-CBIs4yHs.mjs → bulk-sync-schema-CN797vy9.mjs} +1 -1
- package/dist/{cancel-CyTRWSOr.mjs → cancel-CRpzqIUu.mjs} +1 -1
- package/dist/{cancel-task-BuZsQuLp.mjs → cancel-task-CpZcj7HB.mjs} +1 -1
- package/dist/{card-DA1W3Axw.mjs → card-nOX_QJ9u.mjs} +8 -8
- package/dist/{cards-BEeFNiCt.mjs → cards-DJMTrFQg.mjs} +1 -1
- package/dist/cli.mjs +38 -38
- package/dist/{client-DvWllzKd.mjs → client-D2ycdMRO.mjs} +9 -4
- package/dist/{collection-C98jgufi.mjs → collection-Cs84x7WB.mjs} +7 -7
- package/dist/{content-translation-1coWME1P.mjs → content-translation-7qPz-dIU.mjs} +2 -2
- package/dist/{copy-hE6SaHfb.mjs → copy-BeFjqXXc.mjs} +1 -1
- package/dist/{copy-DVe4rcLK.mjs → copy-D9-xBYYq.mjs} +1 -1
- package/dist/{create-B3P62NaN.mjs → create--eZb0G2P.mjs} +1 -1
- package/dist/{create-Btwnm6D2.mjs → create-B57Sj0om.mjs} +1 -1
- package/dist/{create-D271V9Cf.mjs → create-Ba8nYAWL.mjs} +1 -1
- package/dist/{create-Dz4c8E33.mjs → create-BfgTvPvI.mjs} +1 -1
- package/dist/{create-DXivfl69.mjs → create-BlYxQv6U.mjs} +1 -1
- package/dist/{create-DR5tpMUA.mjs → create-CLQVeQ0w.mjs} +1 -1
- package/dist/{create-XVjr8IDS.mjs → create-Cc07ouKB.mjs} +1 -1
- package/dist/{create-DJg0Ohj5.mjs → create-CplN1ey8.mjs} +1 -1
- package/dist/{create-DkFCjBp3.mjs → create-D4FT8Xj8.mjs} +1 -1
- package/dist/{create-DCoo3sI2.mjs → create-DBCOYtqn.mjs} +1 -1
- package/dist/{create-CCb2_Kcc.mjs → create-DBSpDnaA.mjs} +1 -1
- package/dist/{create-XCzUuT42.mjs → create-DHTl3wVv.mjs} +1 -1
- package/dist/{create-BPRuU7Mv.mjs → create-DIZGUCFE.mjs} +1 -1
- package/dist/{create-DR8g_rEL.mjs → create-DJ0Xrpod.mjs} +1 -1
- package/dist/{create-B3kz_fHg.mjs → create-Dj5y7xbA.mjs} +1 -1
- package/dist/{create-DEIIUohY2.mjs → create-Dr-q5oWx2.mjs} +1 -1
- package/dist/{create-LpdQKxUt.mjs → create-Dt6gdbAH.mjs} +2 -2
- package/dist/{create-branch-D_nbKxDS.mjs → create-branch-CKQkpU-_.mjs} +1 -1
- package/dist/{create-DdfFgF-w.mjs → create-cpxnjNMC.mjs} +1 -1
- package/dist/{create-D6Xm2b2D.mjs → create-n5cH8Tq-.mjs} +2 -2
- package/dist/{create-BjH0i2BC.mjs → create-ypwRxrcj.mjs} +1 -1
- package/dist/{csv-LP7sE-CS.mjs → csv-CxWsxJIB.mjs} +2 -2
- package/dist/{current-task-DhgwtGN3.mjs → current-task-DB7UTh6J.mjs} +1 -1
- package/dist/{dashboard-CR97_zXn.mjs → dashboard-DeSaOt2Z.mjs} +11 -11
- package/dist/{data-action-C4jE-RLb.mjs → data-action-Dpt7pfzd.mjs} +7 -7
- package/dist/{data-app-BlBvvRzC.mjs → data-app--T695WPM.mjs} +9 -9
- package/dist/{db-D8mPRqZc.mjs → db-CpK3QluZ.mjs} +7 -7
- package/dist/{delete-CaaPrNOf.mjs → delete-9YIc_L2E.mjs} +1 -1
- package/dist/{delete-DWTqIlbr.mjs → delete-AwOJ1x-D.mjs} +1 -1
- package/dist/{delete-CuyGTe0i.mjs → delete-B9GABYEJ.mjs} +1 -1
- package/dist/{delete-DC-DEYSq.mjs → delete-Bw8CMa_A.mjs} +1 -1
- package/dist/{delete-DaqzPLcG.mjs → delete-CE19WUPi.mjs} +1 -1
- package/dist/{delete-B1SbEVIc.mjs → delete-CUzOTiI8.mjs} +1 -1
- package/dist/{delete-8k7oYDFr.mjs → delete-D784J3ur.mjs} +1 -1
- package/dist/{delete-DuaJ8PUI.mjs → delete-DbAOgu73.mjs} +1 -1
- package/dist/{delete-ZjLpkwgx.mjs → delete-TcDfZNz2.mjs} +1 -1
- package/dist/{delete-table-CnGv1gx9.mjs → delete-table-a8acciQe.mjs} +1 -1
- package/dist/{delete-CqyBkMCd.mjs → delete-trx8NIoh.mjs} +1 -1
- package/dist/{dependencies-D6SNdLW8.mjs → dependencies-BcPdAMYB.mjs} +1 -1
- package/dist/{dependency-Bbg9x1V9.mjs → dependency-_SgcW_fL.mjs} +5 -5
- package/dist/{dependents-BizQb14Q.mjs → dependents-CRZaiOzg.mjs} +1 -1
- package/dist/{dirty-BHwdHOEj.mjs → dirty-1taTj3G6.mjs} +1 -1
- package/dist/{discard-values-BWlh2ce8.mjs → discard-values-DmiWAx4J.mjs} +1 -1
- package/dist/{document-B6254tue.mjs → document-DB6YGtqX.mjs} +6 -6
- package/dist/{download-D2wEAgi_.mjs → download-CEvVDGeC.mjs} +1 -1
- package/dist/{eid-KtWIPUCC.mjs → eid-pO_lMTI9.mjs} +1 -1
- package/dist/{entry-flags-DLS6r8Vf.mjs → entry-flags-CswcY8bG.mjs} +1 -1
- package/dist/{events-B8yMqrrD.mjs → events-cGDPEL5_.mjs} +1 -1
- package/dist/{execute-Bebvab7D.mjs → execute-DHGbJpPr.mjs} +1 -1
- package/dist/{export-BNj3RvAl.mjs → export-B0NUSP6q.mjs} +1 -1
- package/dist/{export-preflight-F3OapAD5.mjs → export-preflight-Bbl1bHpI.mjs} +1 -1
- package/dist/{field-DQAcCjXr.mjs → field-AkNMIQnx.mjs} +7 -7
- package/dist/{fields-BkAS_wIA.mjs → fields-M66PaKdV.mjs} +1 -1
- package/dist/{fks--SaqvPw1.mjs → fks-BvOGzID5.mjs} +1 -1
- package/dist/{get-BSKpQJVB.mjs → get-0T9zeyCh.mjs} +1 -1
- package/dist/{get-CU1zKfBS.mjs → get-B3Ceh_7N.mjs} +1 -1
- package/dist/{get-f2km9wsq.mjs → get-BL_9fN-q.mjs} +1 -1
- package/dist/{get-BjgB5l7X.mjs → get-Bt2Q516N.mjs} +1 -1
- package/dist/{get-VpGfaL7c.mjs → get-BzIQK_mt.mjs} +1 -1
- package/dist/{get-CGPxAoow.mjs → get-C3j93ivl.mjs} +1 -1
- package/dist/{get-CWDz6eV2.mjs → get-CCLnfOOE.mjs} +1 -1
- package/dist/{get-B1uiZyyi.mjs → get-CEreA2oN.mjs} +1 -1
- package/dist/{get-CM9IOr82.mjs → get-CJFg7YM5.mjs} +1 -1
- package/dist/{get-B2nBYYCw.mjs → get-Cfg52y7X.mjs} +1 -1
- package/dist/{get-CTTKQDr7.mjs → get-D-8G7EoL.mjs} +1 -1
- package/dist/{get-B1S1kW2N.mjs → get-D-ElxFlQ.mjs} +1 -1
- package/dist/{get-Cdcj1c9U.mjs → get-D7y_z5K7.mjs} +1 -1
- package/dist/{get-uHs9Ve-4.mjs → get-DGlZtzfB.mjs} +1 -1
- package/dist/{get-C9VumVZ3.mjs → get-DKZLwN3K.mjs} +2 -2
- package/dist/{get-De6qpuzO.mjs → get-HtzPLpy2.mjs} +1 -1
- package/dist/{get-gGSl7Se4.mjs → get-SOCVdBIU.mjs} +1 -1
- package/dist/{get-C_hatP_z.mjs → get-ZSLfDowg.mjs} +1 -1
- package/dist/{get-BseHija1.mjs → get-jzChrvn2.mjs} +1 -1
- package/dist/{get-run-CHup8cMl.mjs → get-run-BZP_z57v.mjs} +1 -1
- package/dist/{get-CiLYhFjU.mjs → get-uB7jROcz.mjs} +1 -1
- package/dist/{get-iOs1ci6x.mjs → get-wPkejadn.mjs} +1 -1
- package/dist/{get-Boql3_0n.mjs → get-zGreQNnG.mjs} +1 -1
- package/dist/git-sync-DaHnqpYi.mjs +29 -0
- package/dist/{glossary-BVxRpD7o.mjs → glossary-Br_mSh3i.mjs} +4 -4
- package/dist/{graph-B7SlzpkC.mjs → graph-CdKi07zZ.mjs} +1 -1
- package/dist/{has-remote-changes-DZq7q2Wk.mjs → has-remote-changes-d_JyzdPX.mjs} +1 -1
- package/dist/{import-DKZF0kMU.mjs → import-1bK-qrjV.mjs} +1 -1
- package/dist/{is-dirty-haRLODo1.mjs → is-dirty-BXwvuTeD.mjs} +1 -1
- package/dist/{items-BGWE5hLl.mjs → items-Dzh_xylQ.mjs} +1 -1
- package/dist/{library-e3aiJ1Yb.mjs → library-BA1QssFE.mjs} +4 -4
- package/dist/{list-D_8GeDG-.mjs → list-0TtkxraU.mjs} +1 -1
- package/dist/{list-C-AnwSRP.mjs → list-2doqGDIF.mjs} +1 -1
- package/dist/{list-COPGHkWL.mjs → list-7qcWFDXR.mjs} +1 -1
- package/dist/{list-D0ASRA_6.mjs → list-B5D3leO9.mjs} +1 -1
- package/dist/{list-Bbc8VYDi.mjs → list-B70w2ibG.mjs} +1 -1
- package/dist/{list-HI7Mpoy-.mjs → list-B75rzgSi.mjs} +1 -1
- package/dist/{list-P7FnSsbZ.mjs → list-BWNw-ppI.mjs} +1 -1
- package/dist/{list-Dvf1iB8r.mjs → list-BjpGurur.mjs} +1 -1
- package/dist/{list-CsXdnNyp.mjs → list-CdpEUPL-.mjs} +2 -2
- package/dist/{list-DDt1iLXj.mjs → list-CvQlMhrb.mjs} +1 -1
- package/dist/{list-DFuydMdV.mjs → list-DDV5PylU.mjs} +1 -1
- package/dist/{list-B9yhUzCc.mjs → list-DHX7-8Ae.mjs} +1 -1
- package/dist/{list-DcXqKZyg.mjs → list-DQNbHPNQ.mjs} +1 -1
- package/dist/{list-BNel4hYs.mjs → list-DR9dswtK.mjs} +1 -1
- package/dist/{list-BiIZdUoN.mjs → list-DSi8mf_F.mjs} +1 -1
- package/dist/{list-gcDxZ7Th.mjs → list-D_SfsO_-.mjs} +1 -1
- package/dist/{list-DFxfpa4W.mjs → list-Dn5_L-85.mjs} +1 -1
- package/dist/{list-DUCxqhtn.mjs → list-DuaFmOCz.mjs} +1 -1
- package/dist/{list-DAa4EWlv.mjs → list-Dv3s_PIu.mjs} +1 -1
- package/dist/{list-CNiCM1NL.mjs → list-Dz2YVD7m.mjs} +1 -1
- package/dist/{list-OUSeeuXb.mjs → list-TzuL_7GA.mjs} +1 -1
- package/dist/{list-DJyIkrY1.mjs → list-_jHBfq0E.mjs} +3 -3
- package/dist/{list-DednUvr3.mjs → list-iFtmAfVv.mjs} +1 -1
- package/dist/{login-APHXId1p.mjs → login-LAFw5Xxu.mjs} +3 -3
- package/dist/{logout-V0pxj6AM.mjs → logout-CjYzDvLH.mjs} +1 -1
- package/dist/{measure-DnGWkKyx.mjs → measure-DgtOyIoD.mjs} +5 -5
- package/dist/{parameter-values-DfZSEK3O.mjs → parameter-values-CRwVLpRD.mjs} +1 -1
- package/dist/{path-Bni-pnKS.mjs → path-BA_GGcGN.mjs} +2 -2
- package/dist/{publish-DkYn86ak.mjs → publish--I94MMjp.mjs} +9 -3
- package/dist/{query-gHeYfWj_.mjs → query-C8w04b4F.mjs} +1 -1
- package/dist/{query-CZbI4Rlv.mjs → query-O1b4qIr4.mjs} +1 -1
- package/dist/{remapping-hcWkFQsx.mjs → remapping-BdX4nj-U.mjs} +1 -1
- package/dist/{remove-collection-Qne5ww6M.mjs → remove-collection-dltKu8LO.mjs} +1 -1
- package/dist/{render-d1-sCPn_.mjs → render-DK2j4BwQ.mjs} +1 -1
- package/dist/{replace-DoU0IFGd.mjs → replace-BfO6UFZN.mjs} +2 -2
- package/dist/{requirement-check-BoVSK1uK.mjs → requirement-check-1fcffJj6.mjs} +1 -1
- package/dist/{rescan-values-COzM86P5.mjs → rescan-values-0-c5Gqtx.mjs} +1 -1
- package/dist/{rescan-values-s82n_You.mjs → rescan-values-7bbNa7WZ.mjs} +1 -1
- package/dist/{run-Q7fHux1F.mjs → run-5b123gPi.mjs} +2 -2
- package/dist/{run-JYNbEO_V.mjs → run-BS_wUAsi.mjs} +1 -1
- package/dist/{run-Bwj4Uuxk.mjs → run-Cf1nJahe.mjs} +1 -1
- package/dist/{runs-GQD6FO2k.mjs → runs-BJ4uy05c.mjs} +1 -1
- package/dist/{runtime-iIsqiOwO.mjs → runtime-D5yfliIq.mjs} +1 -1
- package/dist/{scaffold-CJo9l-2p.mjs → scaffold-aUy3Ik4q.mjs} +2 -2
- package/dist/{schema-2JhmK8FM.mjs → schema-Ds_j3N1I.mjs} +1 -1
- package/dist/{schema-tables-CarGLayY.mjs → schema-tables-BuFF9Psy.mjs} +1 -1
- package/dist/{schemas-oSjtuQ4G.mjs → schemas-DaDsur6B.mjs} +1 -1
- package/dist/{search-CvGEL2h-.mjs → search-BcJgmPU3.mjs} +1 -1
- package/dist/{search-Ca0sIr28.mjs → search-CTZzUd_j.mjs} +1 -1
- package/dist/{segment-BJCEJwNY.mjs → segment-zy4VVraQ.mjs} +5 -5
- package/dist/{send-B4nZI6CU.mjs → send-D0ikejQU.mjs} +1 -1
- package/dist/{set-BjMZCdN8.mjs → set-CjAaw2ZL.mjs} +1 -1
- package/dist/{set-active-CWDdv3kN.mjs → set-active-BQjKw1wk.mjs} +1 -1
- package/dist/{set-bundle-C2uk4jdt.mjs → set-bundle-6Qknum1I.mjs} +3 -3
- package/dist/{set-data-actions-lWl05ekf.mjs → set-data-actions-LcWEP4RO.mjs} +1 -1
- package/dist/{set-enabled-CPhw1AX4.mjs → set-enabled-C8Yww7Yv.mjs} +4 -4
- package/dist/{set-sensitivity-B7WI5BJC.mjs → set-sensitivity-OVcL2PbY.mjs} +1 -1
- package/dist/{setting-BvPpFjJT.mjs → setting-BsIBFvRP.mjs} +3 -3
- package/dist/{setup-DPRa8Uxm.mjs → setup-BxUd_KYl.mjs} +1 -1
- package/dist/{skills-BY3MCR8i.mjs → skills-BQBerRAk.mjs} +1 -1
- package/dist/{skills-BCivFuuZ.mjs → skills-CQRgUHI3.mjs} +3 -3
- package/dist/{snippet-BcN1UwoS.mjs → snippet-CRLI3fYI.mjs} +5 -5
- package/dist/{stash-leoW1fby.mjs → stash-BGqpcbSW.mjs} +1 -1
- package/dist/{status-BezD_K-g.mjs → status-CcOJIgfB.mjs} +1 -1
- package/dist/{status-AA4APlwZ.mjs → status-_wPMW1wq.mjs} +2 -2
- package/dist/{subscription-BDukZFlC.mjs → subscription-CqUIrnUJ.mjs} +5 -5
- package/dist/{subscriptions-CU4E_p7B.mjs → subscriptions-BP83ctRX.mjs} +2 -2
- package/dist/{summary-BFspP71W.mjs → summary-Byz6Y1v-.mjs} +1 -1
- package/dist/{sync-schema-BtjC-PNY.mjs → sync-schema-BJ-AtcCq.mjs} +1 -1
- package/dist/{sync-schema-BhRhsm8Y.mjs → sync-schema-DQBHc3bt.mjs} +1 -1
- package/dist/table-nIdBLcz7.mjs +26 -0
- package/dist/{timeline-Cr5d4Oer.mjs → timeline-Cw581KRT.mjs} +7 -7
- package/dist/{timeline-event-BiYDbW3r.mjs → timeline-event-BHfAXJrB.mjs} +5 -5
- package/dist/transform-job-sCgr8r-t.mjs +22 -0
- package/dist/transform-l1oC8oUS.mjs +28 -0
- package/dist/{transform-tag-DQXOPhmt.mjs → transform-tag-DZEvmwxY.mjs} +4 -4
- package/dist/{transform-test-wmAjyaka.mjs → transform-test-hxkx6M8c.mjs} +6 -6
- package/dist/{transforms-DcXL4Dox.mjs → transforms-D1wwWdCY.mjs} +1 -1
- package/dist/{transport-DZSxmmtY.mjs → transport-BWixD5Ww.mjs} +2 -2
- package/dist/{tree-DrYYCdXP.mjs → tree-IymKTTCK.mjs} +1 -1
- package/dist/{typed-schema-DEzmTY3J.mjs → typed-schema-gaIKntyu.mjs} +1 -1
- package/dist/{unpublish-D8hmulCx.mjs → unpublish-BnP0O_S2.mjs} +1 -1
- package/dist/{unreferenced-C3CqO3tu.mjs → unreferenced-DDkcn8EQ.mjs} +1 -1
- package/dist/{update-552UGPAG.mjs → update-BAocDvnS.mjs} +1 -1
- package/dist/{update-LlJM4tUd.mjs → update-BemK_tZ_.mjs} +1 -1
- package/dist/{update-l4WRN6Jh.mjs → update-Bfws2FN2.mjs} +1 -1
- package/dist/{update-DmMHHn75.mjs → update-BiBazvzY.mjs} +1 -1
- package/dist/{update-Zv7PP8nl.mjs → update-BsEG1dRm.mjs} +1 -1
- package/dist/{update-CctMr2T1.mjs → update-C0p1E-hs.mjs} +2 -2
- package/dist/{update-CcNYCalv.mjs → update-CFkOEnUu.mjs} +1 -1
- package/dist/{update-4TDRNrV-.mjs → update-CKrLtJWZ.mjs} +1 -1
- package/dist/{update-BVz0oIwS.mjs → update-C_VV1SP8.mjs} +1 -1
- package/dist/{update-B21GAnzT.mjs → update-CgJwzutJ.mjs} +1 -1
- package/dist/{update-CEDMvgJI.mjs → update-Cga4lrX5.mjs} +1 -1
- package/dist/{update-7iXRB23T2.mjs → update-CsH0lSpQ2.mjs} +1 -1
- package/dist/{update-DVD77mVR.mjs → update-CyfLXFKR.mjs} +1 -1
- package/dist/{update-DvGIaZdl.mjs → update-D9eA9UOf.mjs} +1 -1
- package/dist/{update-BxRFktpB.mjs → update-D9fs-PSK.mjs} +1 -1
- package/dist/{update-sma1ZRm2.mjs → update-DL1Iex_M.mjs} +3 -3
- package/dist/{update-3lRE8G9k.mjs → update-DntKWUl2.mjs} +1 -1
- package/dist/{update-CtuLA42g.mjs → update-K8FwdJEV.mjs} +1 -1
- package/dist/{update-4sOfpwpv.mjs → update-ReSzm23m.mjs} +1 -1
- package/dist/{update-dashcard-BijqiYQd.mjs → update-dashcard-Bpv45o1_.mjs} +1 -1
- package/dist/{update-Ch6AAOeh.mjs → update-gAPjldWw.mjs} +1 -1
- package/dist/{upgrade-TzILOkiM.mjs → upgrade-D3aDQZwd.mjs} +1 -1
- package/dist/{upload-Do-kOGtc.mjs → upload-B8HbBXb8.mjs} +2 -2
- package/dist/{upload-CdiDKe69.mjs → upload-BAD_9okY.mjs} +1 -1
- package/dist/{upload-B37bUVl_.mjs → upload-BqJLNCb1.mjs} +3 -3
- package/dist/{uuid-Dqq2WfAT.mjs → uuid-BIDBDPLI.mjs} +1 -1
- package/dist/{values-CtY5zv0m.mjs → values-BDekphEw.mjs} +1 -1
- package/dist/{verify-DBTlWx-S.mjs → verify-BnZqq9Aw.mjs} +1 -1
- package/dist/{verify-BiB8jzXB.mjs → verify-CMTrDvAW.mjs} +1 -1
- package/dist/{verify-DJ7fGyLL.mjs → verify-k0WHgc16.mjs} +2 -2
- package/dist/{wait-DEYagfq4.mjs → wait-C69z8PSw.mjs} +1 -1
- package/package.json +1 -1
- package/skill-data/core/SKILL.md +5 -2
- package/skill-data/data-app/SKILL.md +16 -17
- package/skill-data/data-app/template/README.md +1 -1
- package/skill-data/data-app-actions/SKILL.md +3 -0
- package/skill-data/data-app-data/SKILL.md +6 -6
- package/skill-data/data-app-filters/SKILL.md +12 -4
- package/skill-data/data-app-ui/SKILL.md +11 -11
- package/skill-data/data-workflow/references/reusable-definitions.md +2 -2
- package/skill-data/git-sync/SKILL.md +13 -11
- package/dist/git-sync-Czena0TW.mjs +0 -29
- package/dist/table-Dzp1uANs.mjs +0 -26
- package/dist/transform-C-0nV5Et.mjs +0 -28
- package/dist/transform-job-B9MPk7S5.mjs +0 -22
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { f as ResponseShapeError, g as errorMessage, h as ValidationError, p as TimeoutError, u as NetworkError, y as isNonInterruptFailure } from "./predicates-0C0TsWcJ.mjs";
|
|
2
2
|
import { F as CapabilityError, J as isRetryableStatus, K as HttpError, X as parseJson, Y as JSON_CONTENT_TYPE } from "./cli.mjs";
|
|
3
|
-
import { G as credentialSecrets, H as serverInfoFromProperties, I as buildNetworkError, J as normalizeUrl, L as isConnectionClosed, Q as createServerProfile, R as PROBE_PATH, U as assertCredentialHeaderSafe, W as credentialAuthHeader, tt as SessionProperties, z as probeBudget } from "./runtime-
|
|
3
|
+
import { G as credentialSecrets, H as serverInfoFromProperties, I as buildNetworkError, J as normalizeUrl, L as isConnectionClosed, Q as createServerProfile, R as PROBE_PATH, U as assertCredentialHeaderSafe, W as credentialAuthHeader, tt as SessionProperties, z as probeBudget } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { n as throwIfAborted, r as untilAborted, t as combineAborts } from "./signal-BNUlQjpc.mjs";
|
|
5
|
-
import { n as featureFailures } from "./requirement-check-
|
|
5
|
+
import { n as featureFailures } from "./requirement-check-1fcffJj6.mjs";
|
|
6
6
|
import { setTimeout } from "node:timers/promises";
|
|
7
7
|
//#region ../client/src/http/response-shape.ts
|
|
8
8
|
async function parseJsonResponse(text, schema, context) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { o as ConfigError } from "./predicates-0C0TsWcJ.mjs";
|
|
2
2
|
import { at as formatFlags, f as writeJson, it as connectionFlags, ut as profileFlag } from "./cli.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { m as CollectionTreeNode } from "./collection-Cz2qLX2m.mjs";
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
//#region src/commands/collection/tree.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { it as connectionFlags, p as writeText, ut as profileFlag } from "./cli.mjs";
|
|
2
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
2
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
3
3
|
import { n as slugArg, t as parseSlug } from "./slug-COdwq63O.mjs";
|
|
4
4
|
import { i as writeProjectFile } from "./data-app-project-DjDDWgUF.mjs";
|
|
5
5
|
import { z } from "zod";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
2
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
3
3
|
import { i as tableSelectorFlags, n as parseTableSelectors } from "./table-selector-flags-BpFFoSaT.mjs";
|
|
4
4
|
import { z } from "zod";
|
|
5
5
|
//#region src/commands/library/unpublish.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { gt as listEnvelopeSchema, it as connectionFlags, lt as outputFlags, s as renderList, st as listFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
2
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
3
3
|
import { t as collectForOutput } from "./window-D1w7B0vh.mjs";
|
|
4
4
|
import { d as DependencyNodeCompact } from "./dependency-C1DExO6k.mjs";
|
|
5
5
|
import { i as dependencyNodeView } from "./dependency-DcM96XJ-.mjs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
5
5
|
import { a as PulseUpdateInput, t as Pulse } from "./pulse-B2AmIWsO.mjs";
|
|
6
6
|
import { t as pulseView } from "./pulse-CPSpum5U.mjs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
5
5
|
import { i as CardDetail, l as CardUpdateInput } from "./card-BJRZ5D5Q.mjs";
|
|
6
6
|
import { n as cardView } from "./card-VipF12MJ.mjs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
5
5
|
import { o as FieldDetail, u as FieldUpdateInput, v as hasDataSensitivity } from "./field-C2qOViFZ.mjs";
|
|
6
6
|
import { c as fieldView, l as fieldWithDataSensitivityView } from "./field-CT4r6b92.mjs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
5
5
|
import { n as DataAction, s as DataActionUpdateInput } from "./data-action-CuvI17XF.mjs";
|
|
6
6
|
import { DATA_ACTION_DATASET_QUERY, skipValidateFlag } from "./validate-query-Bf5FhhMI.mjs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
5
5
|
import { C as TableUpdateInput, a as Table } from "./table-hgrX1i-R.mjs";
|
|
6
6
|
import { u as tableView } from "./table-BNA9Or05.mjs";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { i as GlossaryUpdateInput, t as Glossary } from "./glossary-iPIWrEbP.mjs";
|
|
5
5
|
import { t as glossaryView } from "./glossary-CQRW3Z4d.mjs";
|
|
6
|
-
import { n as readEntryInput, t as entryFlags } from "./entry-flags-
|
|
6
|
+
import { n as readEntryInput, t as entryFlags } from "./entry-flags-CswcY8bG.mjs";
|
|
7
7
|
//#region src/commands/glossary/update.ts
|
|
8
8
|
var update_default = defineMetabaseCommand({
|
|
9
9
|
meta: {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
5
5
|
import { i as TransformTagUpdateInput, t as TransformTag } from "./transform-tag-CcElGp3C.mjs";
|
|
6
6
|
import { t as transformTagView } from "./transform-tag-Dmb4u3-Q.mjs";
|
|
@@ -2,7 +2,7 @@ import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as pro
|
|
|
2
2
|
import { l as NotificationUpdateInput, r as Notification } from "./notification-B5yMuPmo.mjs";
|
|
3
3
|
import { t as notificationView } from "./notification-BEJaEZS2.mjs";
|
|
4
4
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
5
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
5
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
6
6
|
import { t as describeAlert } from "./summary-BytbDz6e.mjs";
|
|
7
7
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
8
8
|
//#region src/commands/alert/update.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
5
5
|
import { i as SegmentUpdateInput, t as Segment } from "./segment-Cf-DrdjE.mjs";
|
|
6
6
|
import { SEGMENT_DEFINITION, skipValidateFlag } from "./validate-query-Bf5FhhMI.mjs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
5
5
|
import { i as DocumentUpdateInput, t as Document } from "./document-BHOQq2T_.mjs";
|
|
6
6
|
import { t as documentView } from "./document-lS1XZEF3.mjs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
5
5
|
import { f as TransformUpdateInput, t as Transform } from "./transform-B62craFM.mjs";
|
|
6
6
|
import { TRANSFORM_SOURCE_QUERY, skipValidateFlag } from "./validate-query-Bf5FhhMI.mjs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
5
5
|
import { o as TransformJobUpdateInput, t as TransformJob } from "./transform-job-CDIb3B9o.mjs";
|
|
6
6
|
import { t as transformJobView } from "./transform-job-D18XRLBK.mjs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
5
5
|
import { c as TimelineUpdateInput, t as Timeline } from "./timeline-DcsCXNUt.mjs";
|
|
6
6
|
import { n as timelineView } from "./timeline-BgWz8DYK.mjs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
5
5
|
import { a as TransformTestUpdateInput, t as TransformTest } from "./transform-test-Bexa_K89.mjs";
|
|
6
6
|
import { n as transformTestView } from "./transform-test-C49ZTK7M.mjs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
5
5
|
import { d as DashboardUpdateInput, o as DashboardDetail } from "./dashboard-Cwsf-e9T.mjs";
|
|
6
6
|
import { n as dashboardView } from "./dashboard-Bx2sYijR.mjs";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
2
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
3
3
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
4
4
|
import { o as DataAppUpdateInput, t as DataApp } from "./data-app-BUW-HlUo.mjs";
|
|
5
5
|
import { t as dataAppView } from "./data-app-Blz61mG5.mjs";
|
|
@@ -10,7 +10,7 @@ var update_default = defineMetabaseCommand({
|
|
|
10
10
|
name: "update",
|
|
11
11
|
description: "Update a data app's fields, or enable or disable it"
|
|
12
12
|
},
|
|
13
|
-
details: "The JSON body carries only the fields to change: `display_name`, `description`, `allowed_hosts`, `enabled`, `bundle_path`, `version`. A disabled app
|
|
13
|
+
details: "The JSON body carries only the fields to change: `display_name`, `description`, `allowed_hosts`, `enabled`, `bundle_path`, `version`. A disabled app opens only in Data Studio (Data apps → the app → Overview). `mb data-app set-bundle` replaces the bundle from a built file.",
|
|
14
14
|
requires: ["dataApp.update"],
|
|
15
15
|
args: {
|
|
16
16
|
...outputFlags,
|
|
@@ -21,7 +21,7 @@ var update_default = defineMetabaseCommand({
|
|
|
21
21
|
},
|
|
22
22
|
inputSchema: DataAppUpdateInput,
|
|
23
23
|
outputSchema: DataApp,
|
|
24
|
-
examples: ["mb data-app update sales-overview --body '{\"
|
|
24
|
+
examples: ["mb data-app update sales-overview --body '{\"display_name\":\"Sales overview\"}'", "mb data-app update sales-overview --body '{\"allowed_hosts\":[\"https://api.example.com\"]}'"],
|
|
25
25
|
async run({ args, ctx, getClient, readBody }) {
|
|
26
26
|
const slug = parseSlug(args.slug);
|
|
27
27
|
const body = await readBody({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
5
5
|
import { i as MeasureUpdateInput, t as Measure } from "./measure-BMWrX1ca.mjs";
|
|
6
6
|
import { MEASURE_DEFINITION, skipValidateFlag } from "./validate-query-Bf5FhhMI.mjs";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { f as ResponseShapeError, l as MetabaseError, n as isBlank, o as ConfigError } from "./predicates-0C0TsWcJ.mjs";
|
|
2
2
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, mt as parseInteger, q as chainRequestFailure, ut as profileFlag } from "./cli.mjs";
|
|
3
3
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
4
|
-
import { O as givenValue, t as defineMetabaseCommand } from "./runtime-
|
|
4
|
+
import { O as givenValue, t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
5
5
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
6
6
|
import { g as CollectionUpdateInput, r as Collection } from "./collection-Cz2qLX2m.mjs";
|
|
7
7
|
import { t as parseEnumFlag } from "./parse-enum-CEXPuN9H.mjs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
5
5
|
import { i as SnippetUpdateInput, t as Snippet } from "./snippet-CyKAgIZl.mjs";
|
|
6
6
|
import { t as snippetView } from "./snippet-oJLaYW9V.mjs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
5
5
|
import { h as DashcardPatchInput, m as DashcardDetail } from "./dashboard-Cwsf-e9T.mjs";
|
|
6
6
|
import { r as dashcardView } from "./dashboard-Bx2sYijR.mjs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
5
5
|
import { i as TimelineEvent, s as TimelineEventUpdateInput } from "./timeline-DcsCXNUt.mjs";
|
|
6
6
|
import { t as timelineEventView } from "./timeline-BgWz8DYK.mjs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { g as errorMessage, i as AbortError, m as UnknownError, p as TimeoutError, u as NetworkError } from "./predicates-0C0TsWcJ.mjs";
|
|
2
2
|
import { K as HttpError, X as parseJson, lt as outputFlags, nt as name, o as renderItem, p as writeText, rt as version, t as interruptSignal, v as promptConfirm } from "./cli.mjs";
|
|
3
|
-
import { E as USER_AGENT, t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { E as USER_AGENT, t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { n as throwIfAborted, t as combineAborts } from "./signal-BNUlQjpc.mjs";
|
|
5
5
|
import { n as streamProcess } from "./process-BQC3mK2k.mjs";
|
|
6
6
|
import { z } from "zod";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
2
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
3
3
|
import { t as ContentTranslationUploadResult } from "./content-translation-BrHOrmj9.mjs";
|
|
4
|
-
import { n as requireUploadFilePath, t as readCsvFile } from "./upload-
|
|
4
|
+
import { n as requireUploadFilePath, t as readCsvFile } from "./upload-BAD_9okY.mjs";
|
|
5
5
|
//#region src/output/views/content-translation.ts
|
|
6
6
|
const contentTranslationUploadView = {
|
|
7
7
|
compactPick: ContentTranslationUploadResult,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { o as ConfigError, v as isFileNotFoundError } from "./predicates-0C0TsWcJ.mjs";
|
|
2
|
-
import { D as fileNotFoundError } from "./runtime-
|
|
2
|
+
import { D as fileNotFoundError } from "./runtime-D5yfliIq.mjs";
|
|
3
3
|
import { readFile } from "node:fs/promises";
|
|
4
4
|
import { basename } from "node:path";
|
|
5
5
|
//#region src/runtime/upload.ts
|
|
@@ -4,9 +4,9 @@ var upload_default = defineCommandGroup({
|
|
|
4
4
|
name: "upload",
|
|
5
5
|
description: "Upload CSV files into Metabase",
|
|
6
6
|
subCommands: {
|
|
7
|
-
csv: () => import("./csv-
|
|
8
|
-
append: () => import("./append-
|
|
9
|
-
replace: () => import("./replace-
|
|
7
|
+
csv: () => import("./csv-CxWsxJIB.mjs").then((m) => m.default),
|
|
8
|
+
append: () => import("./append-CdzKyHhn.mjs").then((m) => m.default),
|
|
9
|
+
replace: () => import("./replace-BfO6UFZN.mjs").then((m) => m.default)
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
12
|
//#endregion
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { o as ConfigError } from "./predicates-0C0TsWcJ.mjs";
|
|
2
2
|
import { f as writeJson, lt as outputFlags, mt as parseInteger, p as writeText } from "./cli.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { z } from "zod";
|
|
5
5
|
import { randomUUID } from "node:crypto";
|
|
6
6
|
//#region src/commands/uuid.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { h as formatScalar, it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { d as FieldValues } from "./field-C2qOViFZ.mjs";
|
|
5
5
|
import { s as fieldValuesView } from "./field-CT4r6b92.mjs";
|
|
6
6
|
//#region src/commands/field/values.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { t as ModerationReview } from "./moderation-review-Bf9bPNQI.mjs";
|
|
5
5
|
import { i as moderationReviewView, n as verifyFlags, r as describeReview, t as reviewInput } from "./verify-flags-DEVMB9w0.mjs";
|
|
6
6
|
//#region src/commands/dashboard/verify.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
2
|
import { t as parseId } from "./parse-id-EXZan40V.mjs";
|
|
3
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
4
4
|
import { t as ModerationReview } from "./moderation-review-Bf9bPNQI.mjs";
|
|
5
5
|
import { i as moderationReviewView, n as verifyFlags, r as describeReview, t as reviewInput } from "./verify-flags-DEVMB9w0.mjs";
|
|
6
6
|
//#region src/commands/card/verify.ts
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { n as createClient } from "./client-
|
|
1
|
+
import { n as createClient } from "./client-D2ycdMRO.mjs";
|
|
2
2
|
import { g as errorMessage, l as MetabaseError, p as TimeoutError, u as NetworkError } from "./predicates-0C0TsWcJ.mjs";
|
|
3
3
|
import { K as HttpError } from "./cli.mjs";
|
|
4
|
-
import { B as probeServer, E as USER_AGENT } from "./runtime-
|
|
4
|
+
import { B as probeServer, E as USER_AGENT } from "./runtime-D5yfliIq.mjs";
|
|
5
5
|
//#region src/core/auth/verify.ts
|
|
6
6
|
const VERIFY_TIMEOUT_MS = 15e3;
|
|
7
7
|
async function verifyAndProbe(url, credential, options = {}) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { it as connectionFlags, l as renderSummary, lt as outputFlags, ut as profileFlag } from "./cli.mjs";
|
|
2
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
2
|
+
import { t as defineMetabaseCommand } from "./runtime-D5yfliIq.mjs";
|
|
3
3
|
import { n as DEFAULT_TIMEOUT_MS, t as DEFAULT_INTERVAL_MS } from "./poll-vxN__4cz.mjs";
|
|
4
4
|
import { r as parseWaitSchedule } from "./wait-flags-C3cu_O0w.mjs";
|
|
5
5
|
import { u as syncTaskView } from "./git-sync-D1aKczo6.mjs";
|
package/package.json
CHANGED
package/skill-data/core/SKILL.md
CHANGED
|
@@ -156,7 +156,7 @@ What `--help` doesn't say: footguns and non-obvious behaviors.
|
|
|
156
156
|
- **setup is one-shot.** `mb setup` walks `/api/setup` for a **fresh** instance only and errors on a configured one; mostly for bootstrapping local / e2e instances.
|
|
157
157
|
- **eid** translates a string entity id → numeric id: `mb eid --model <model> <eid1,eid2> --json`. Entity ids are NanoIDs that can start with `-`, which the positional form misreads as a flag (shell quotes don't help) — for those, use `--body '{"entity_ids":{"card":["-…"]}}'` (the id is a JSON string value, immune to flag parsing).
|
|
158
158
|
<!-- requires: library -->
|
|
159
|
-
- **library.** The Library is a curated subtree (`library-data` "Data" + `library-metrics` "Metrics" under a `library` root): tables in **Data** lead data pickers and rank up in search; metrics in **Metrics** lead nav, search, and the query builder. `library get` shows its Data/Metrics collection ids; `library create` provisions it (idempotent). `library publish --table-ids/--db-ids/--schemas` publishes tables into Data, **resolving the Data collection and creating the Library if absent**; each `--schemas` entry is `<db-id>:<schema>` (`1:public`), not a bare name. `publish` cascades to upstream FK dependencies, `unpublish` to downstream dependents; both need **admin or data-analyst** (Curate alone won't publish) and exit **403** without write **and** query permission on every affected table. `table get`/`table list` carry `is_published` (`collection_id` under `--full`).
|
|
159
|
+
- **library.** The Library is a curated subtree (`library-data` "Data" + `library-metrics` "Metrics" under a `library` root): tables in **Data** lead data pickers and rank up in search; metrics in **Metrics** lead nav, search, and the query builder. `library get` shows its Data/Metrics collection ids; `library create` provisions it (idempotent). `library publish --table-ids/--db-ids/--schemas` publishes tables into Data, **resolving the Data collection and creating the Library if absent**; each `--schemas` entry is `<db-id>:<schema>` (`1:public`), not a bare name. `publish` cascades to upstream FK dependencies, `unpublish` to downstream dependents; both need **admin or data-analyst** (Curate alone won't publish) and exit **403** without write **and** query permission on every affected table. `table get`/`table list` carry `is_published` (`collection_id` under `--full`). On a remote-sync instance, `mb git-sync add-collection <library-id>` (the root) makes exports carry published tables' metadata (see `git-sync`).
|
|
160
160
|
<!-- /requires -->
|
|
161
161
|
- **query / uuid.** `mb query` runs MBQL (`--dry-run` → run; `mbql`). `mb uuid --count <n>` mints an aggregation's `lib/uuid` (`mbql`) and document node `_id`s (`document`).
|
|
162
162
|
<!-- requires: library, tableListPublishedFilter -->
|
|
@@ -165,7 +165,7 @@ What `--help` doesn't say: footguns and non-obvious behaviors.
|
|
|
165
165
|
|
|
166
166
|
## Specialized skills (load on demand)
|
|
167
167
|
|
|
168
|
-
This file is enough for any single-command task. For anything deeper, load the relevant skill
|
|
168
|
+
This file is enough for any single-command task. For anything deeper, load the relevant skill (`mb skills get <name>`) **proactively** — don't wing it from this overview.
|
|
169
169
|
|
|
170
170
|
- **`mbql`** — authoring/fixing any MBQL query body (`mb query`, card `dataset_query`, transform `source.query`, measure/segment `definition`); reading `--dry-run` errors. The query-body reference.
|
|
171
171
|
- **`native-sql`** — authoring a native SQL `dataset_query` with parameters: template tags, field filters vs. raw variables, snippets, card references, and wiring a tag to a dashboard filter. The SQL fallback when MBQL can't express it (`mbql` first).
|
|
@@ -185,6 +185,9 @@ This file is enough for any single-command task. For anything deeper, load the r
|
|
|
185
185
|
<!-- /requires -->
|
|
186
186
|
<!-- requires: remoteSync -->
|
|
187
187
|
- **`git-sync`** — round-tripping content to/from a git remote.
|
|
188
|
+
<!-- /requires -->
|
|
189
|
+
<!-- requires: dataApps -->
|
|
190
|
+
- **`data-app`** — data apps: create, preview, publish (start here).
|
|
188
191
|
<!-- /requires -->
|
|
189
192
|
- **`data-workflow`** — the guided, end-to-end data workflow: investigate raw data, build clean analysis-ready tables, define reusable segments/measures/metrics, answer questions, build dashboards. **Start here when the user states a goal rather than a single verb** — "make sense of my data", "build a data model", "be my data analyst". It detects where the data is and routes to the right stage.
|
|
190
193
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: data-app
|
|
3
|
-
description: Create, preview, publish and manage a Metabase data app — a React app Metabase serves at /apps/<slug> — create it, scaffold its project, run the dev preview and read its diagnostics feed, build and publish the bundle, turn it
|
|
3
|
+
description: Create, preview, publish and manage a Metabase data app — a React app Metabase serves at /apps/<slug> — create it, scaffold its project, run the dev preview and read its diagnostics feed, build and publish the bundle, turn it off, move it to another instance, delete it. Triggers — "build a data app", "make an internal tool in Metabase", "scaffold a data app", "publish my data app", "update the app", "the app is blank". Start here; the UI is in `data-app-ui`, questions and charts in `data-app-data`, filter controls in `data-app-filters`, writes in `data-app-actions`.
|
|
4
4
|
allowed-tools: Read, Write, Edit, Bash, AskUserQuestion
|
|
5
5
|
requires: [dataApps]
|
|
6
6
|
---
|
|
@@ -17,11 +17,11 @@ The work, in order:
|
|
|
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
18
|
5. Build and publish (_Build and publish_).
|
|
19
19
|
|
|
20
|
-
For every later change: regenerate `src/metabase.ts` if the app's collection changed, then build and set the bundle. Metabase receives only the built bundle; the source stays in the project directory,
|
|
20
|
+
For every later change: 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_).
|
|
21
21
|
|
|
22
22
|
## Before you start
|
|
23
23
|
|
|
24
|
-
- Use an **admin** profile — only admins create apps and write the app's collection. `mb auth status --json | jq .user.isAdmin` prints `true` for one
|
|
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
26
|
- 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
27
|
|
|
@@ -31,18 +31,18 @@ For every later change: regenerate `src/metabase.ts` if the app's collection cha
|
|
|
31
31
|
mb data-app create --body '{"name":"sales-overview","display_name":"Sales overview"}' --json
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
`name` is the slug; `display_name` and `description` are optional. The app starts
|
|
34
|
+
`name` is the slug; `display_name` and `description` are optional. The app starts enabled, with an empty bundle, open to admins until a group is assigned. The answer's `resource_collection_id` is the id of the app's collection — note it. A `409` means the slug is taken: `mb data-app list` shows that app; reuse it or pick another slug.
|
|
35
35
|
|
|
36
36
|
## Scaffold and install
|
|
37
37
|
|
|
38
38
|
```bash
|
|
39
|
-
mb data-app scaffold sales-overview && cd sales-overview
|
|
39
|
+
mb data-app scaffold <repo>/data_apps/sales-overview && cd <repo>/data_apps/sales-overview
|
|
40
40
|
```
|
|
41
41
|
|
|
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. Then install the SDK, then the rest:
|
|
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/`, `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:
|
|
43
43
|
|
|
44
44
|
```bash
|
|
45
|
-
npm install @metabase/embedding-sdk-react@<major>-beta # <major>: 66 for a version tag v1.66.x (`mb auth status --json | jq -r .version.tag`)
|
|
45
|
+
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
46
|
npm install && npm run typecheck && npm run build
|
|
47
47
|
```
|
|
48
48
|
|
|
@@ -58,12 +58,12 @@ The template is the bundle contract. Don't edit `package.json` by hand, and neve
|
|
|
58
58
|
|
|
59
59
|
```bash
|
|
60
60
|
( umask 077
|
|
61
|
-
URL=$(mb auth status --json | jq -r .url)
|
|
62
|
-
KEY=$(mb api-key create --body '{"name":"data-app <slug> dev","group_id":2}' --json | jq -r .unmasked_key)
|
|
61
|
+
URL=$(mb auth status --profile <name> --json | jq -r .url)
|
|
62
|
+
KEY=$(mb api-key create --profile <name> --body '{"name":"data-app <slug> dev","group_id":2}' --json | jq -r .unmasked_key)
|
|
63
63
|
[ -n "$KEY" ] && [ "$KEY" != null ] && printf 'DATA_APP_MB_URL=%s\nDATA_APP_MB_API_KEY=%s\n' "$URL" "$KEY" > .env.local && echo written )
|
|
64
64
|
```
|
|
65
65
|
|
|
66
|
-
Group `2` is Administrators. Never print `.env.local`. Delete the key at handoff (`mb api-key list
|
|
66
|
+
Group `2` is Administrators. Never print `.env.local`. Delete the key at handoff (`mb api-key list --profile <name>`, then `mb api-key delete <id> --yes --profile <name>`); the next session writes a new one. Metabase allows any localhost origin unless `MB_DISABLE_CORS_ON_LOCALHOST` is set, so a CORS error from the preview means it is: ask the user to unset it on this instance. Otherwise check `DATA_APP_MB_URL`.
|
|
67
67
|
|
|
68
68
|
### The diagnostics feed
|
|
69
69
|
|
|
@@ -96,7 +96,7 @@ curl -s "http://localhost:5174/__data-app/diagnostics?startEventId=0"
|
|
|
96
96
|
- `clients: 0` means no tab is open, so empty `entries` prove nothing.
|
|
97
97
|
- Before an edit, note `nextEventId`; after it, read again with that value as `startEventId`.
|
|
98
98
|
- 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.
|
|
99
|
-
- 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`. The feed keeps the last 200 entries; `curl -X DELETE …/__data-app/diagnostics` clears it.
|
|
99
|
+
- 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.
|
|
100
100
|
|
|
101
101
|
| `kind` | Fix |
|
|
102
102
|
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
|
|
@@ -110,12 +110,11 @@ curl -s "http://localhost:5174/__data-app/diagnostics?startEventId=0"
|
|
|
110
110
|
```bash
|
|
111
111
|
npm run typecheck && npm run build
|
|
112
112
|
mb data-app set-bundle sales-overview
|
|
113
|
-
mb data-app set-enabled sales-overview true # the first time
|
|
114
113
|
```
|
|
115
114
|
|
|
116
|
-
`set-bundle` uploads `dist/index.js` (`--bundle` for another path) and replaces the app's bundle, live at once. A new app is
|
|
115
|
+
`set-bundle` uploads `dist/index.js` (`--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>`.
|
|
117
116
|
|
|
118
|
-
|
|
117
|
+
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.
|
|
119
118
|
|
|
120
119
|
## Pitfalls
|
|
121
120
|
|
|
@@ -133,6 +132,6 @@ Admins open every app, enabled or not. Anyone else needs the app enabled (otherw
|
|
|
133
132
|
## Change, move, delete
|
|
134
133
|
|
|
135
134
|
- **Turn off:** `mb data-app set-enabled <slug> false`. **Rename:** `mb data-app update <slug> --body '{"display_name":"…"}'` (also `description`, `allowed_hosts`).
|
|
136
|
-
- **Outdated:** an app
|
|
137
|
-
- **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` and
|
|
138
|
-
- **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.
|
|
135
|
+
- **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.
|
|
136
|
+
- **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 restore` a modified `dist/index.js`, then `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 or commit those two yourself, and when a fresh build changes `dist/index.js`, set the bundle and export again instead. The template's `.gitignore` keeps `node_modules/` and `.env.local` out. 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.
|
|
137
|
+
- **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.
|
|
@@ -7,7 +7,7 @@ and the `mb` data-app skills.
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
9
9
|
Install the SDK tag matching the Metabase instance first, then the rest.
|
|
10
|
-
`<major>` is 66 for a version tag v1.66.x (`mb auth status --json | jq -r .version.tag`);
|
|
10
|
+
`<major>` is 66 for a version tag v1.66.x (`mb auth status --profile <name> --json | jq -r .version.tag`);
|
|
11
11
|
`package.json` asks for any version, which would install `latest`.
|
|
12
12
|
|
|
13
13
|
```bash
|
|
@@ -13,6 +13,8 @@ An **action** is a saved, parameterized SQL write — `INSERT`, `UPDATE` or `DEL
|
|
|
13
13
|
2. Regenerate `src/metabase.ts` (`data-app-data`).
|
|
14
14
|
3. Pass `actions.<name>` from it to `useAction`.
|
|
15
15
|
|
|
16
|
+
An action in the app's collection can't be archived: to drop one, move it to a data actions collection (`mb data-action update <id> --body '{"collection_id":<id>}'`), then archive it.
|
|
17
|
+
|
|
16
18
|
Each action there lists its parameters: the parameter slug (the key `execute` takes), `displayName` (a label, never a key), `jsType` (`string`, `number`, `Date`, `boolean` or `unknown`) and `required`. Never fake a call to an action `src/metabase.ts` doesn't list.
|
|
17
19
|
|
|
18
20
|
## The hook
|
|
@@ -83,6 +85,7 @@ export function NoteForm({ orderId, onSaved }: { orderId: number; onSaved: () =>
|
|
|
83
85
|
After a write succeeds, refetch every query on screen it could have changed: `await Promise.all([orders.refetch(), totals.refetch()])`, the `refetch` that `useMetabaseQuery` returns.
|
|
84
86
|
|
|
85
87
|
- Those queries live in a component above the trigger, which passes the refresh down; a query in the trigger's own component or below it can't be wired to it.
|
|
88
|
+
- A `StaticQuestion` panel has no `refetch`: give it a `key` the parent bumps after the write, which remounts it and runs the question again.
|
|
86
89
|
- Await the refresh before clearing the form or closing the modal, so stale rows never flash.
|
|
87
90
|
- Never prepend `result` to a local list instead: ids, timestamps and computed columns come from the server.
|
|
88
91
|
|
|
@@ -15,11 +15,11 @@ A data app runs only the questions and actions in **the app's collection** (`dat
|
|
|
15
15
|
|
|
16
16
|
## Sources: the semantic layer only
|
|
17
17
|
|
|
18
|
-
An app reads only what the user curated in the Library.
|
|
18
|
+
An app reads only what the user curated in the Library. Metabase refuses a question in the app's collection that breaks these rules:
|
|
19
19
|
|
|
20
|
-
- **Tables published to the Library**, and nothing else: `mb table list --published-only --json`. That covers the question's source table, every join,
|
|
21
|
-
- **Metrics in the Library's Metrics collection
|
|
22
|
-
- **
|
|
20
|
+
- **Tables published to the Library**, and nothing else: `mb table list --published-only --json`. That covers the question's source table, every join, every table reached through a foreign key column, the tables behind its segments and measures, and the tables whose columns Metabase shows in place of a foreign key.
|
|
21
|
+
- **Metrics in the Library's Metrics collection**, as aggregations (its id is in `mb library get`; list it with `mb collection items <id> --json`), and the segments and measures of published tables (`mb segment list`, `mb measure list`). Prefer one that matches the concept over rebuilding it with filters and thresholds of your own.
|
|
22
|
+
- **No other question as a source** — not a question in the app's collection, a model or a metric. Every question starts from a published table.
|
|
23
23
|
- **MBQL only**, never native SQL.
|
|
24
24
|
|
|
25
25
|
When the app needs a table or metric the Library lacks, stop: name what's missing and ask the user to publish the table or move the metric into the Library. Don't publish it yourself unless the user says to, and never work around the gap with an unpublished table, a copy of the data, or SQL.
|
|
@@ -44,7 +44,7 @@ mb card query <id> --json --max-bytes 0 | jq '{row_count, first: .data.rows[0]}'
|
|
|
44
44
|
Plan the questions from what the app shows and picks from — each chart, KPI, table and filter option list needs one, and several panels may share one. Each takes one of two shapes:
|
|
45
45
|
|
|
46
46
|
- **Aggregated**, when the breakdown is fixed: revenue by month, top products. Runtime clauses can then name only the columns it returns, its breakouts and aggregations.
|
|
47
|
-
- **Rows**, when a runtime filter targets a column an aggregation would drop — revenue by month, filtered by product category. The question returns the raw columns (`CREATED_AT`, `TOTAL`, `CATEGORY`), and the hook filters and aggregates them at runtime (_Runtime clauses_).
|
|
47
|
+
- **Rows**, when a runtime filter targets a column an aggregation would drop — revenue by month, filtered by product category. The question returns the raw columns (`CREATED_AT`, `TOTAL`, `CATEGORY`), and the hook filters and aggregates them at runtime (_Runtime clauses_). When a Library metric or measure defines the number, never rebuild it from rows: filter an aggregated question instead (_Runtime clauses_).
|
|
48
48
|
|
|
49
49
|
Also:
|
|
50
50
|
|
|
@@ -150,7 +150,7 @@ const { query } = useMetabaseQueryObject(queries.orderRows, {
|
|
|
150
150
|
- `filter(...)` takes one value: `filter(col, "=", [a, b])` compiles but is not an IN filter, and several filters AND together. So a filter picks one value or All; for a multi-select, ask the user whether a single choice will do.
|
|
151
151
|
- Text operators are case-sensitive, with no option to change it: say so in the search box's placeholder.
|
|
152
152
|
- `time-interval` (`[-30, "day"]`, `[0, "year"]` for this year) is relative to when the query runs: a fixed window belongs in the question, not the hook.
|
|
153
|
-
- On a rows question, aggregate with any of `aggregations.count`, `sum`, `avg`, `median`, `min`, `max`, `distinct`, naming each result (`{ name: "revenue" }`) to order or read it by — two unnamed results of one operator collide, and generated names such as `sum_2` aren't stable.
|
|
153
|
+
- On a rows question, aggregate with any of `aggregations.count`, `sum`, `avg`, `median`, `min`, `max`, `distinct`, naming each result (`{ name: "revenue" }`) to order or read it by — two unnamed results of one operator collide, and generated names such as `sum_2` aren't stable. Never aggregate an aggregated question at runtime: a sum over its rows is wrong for distinct counts, averages, ratios and levels such as MRR. A runtime filter only picks its rows. So a date filter on it offers presets of whole, complete buckets at the question's own grain (Last month, Last 12 months on a month question), each range from the first bucket's start to the last bucket's start, and no Custom range; a KPI shows one bucket, as `scalar` (a `smartscalar` filtered to one bucket loses its comparison), with no All time. A filter on a column needs a question broken out by that column too; its All is no clause when the panel shows that column (a series per value), and otherwise a second question without that breakout, both hooks called and switched with `enabled`. When a request needs more, say so.
|
|
154
154
|
- A sort the user picks: map each choice to a column explicitly (`{ revenue: "revenue", orders: "order_count" }`) rather than passing the user's value through.
|
|
155
155
|
- `enabled: false` holds the query back, for example until the user picks an item.
|
|
156
156
|
- Write the arrays inline (spreads are fine): the hooks compare by content, so a new array per render doesn't refetch. A clauses object built outside the call needs `as const`, or `aggregations` loses the tuple type `breakouts` need; a shared `ReturnType<typeof filter>[]` built with `push` breaks the operator types the same way.
|