@metabase/cli 0.3.1-alpha.versioning.9ac5f50 → 0.3.2-alpha.fix-transform-test-ee-path.041c793
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-Dmd-uNeU.mjs → add-collection-73X1DmCM.mjs} +5 -5
- package/dist/{alert-D1u2MVZj.mjs → alert-BB38lWSL.mjs} +7 -7
- package/dist/{alerts-DcBjcfEE.mjs → alerts-DxyzqLSU.mjs} +6 -6
- package/dist/{append-B9Htvmab.mjs → append-CHme1Enm.mjs} +4 -4
- package/dist/{archive-BUoYMkxO.mjs → archive-BGiDxu8O.mjs} +3 -3
- package/dist/{archive-Bf014rFm.mjs → archive-BMyvyf62.mjs} +3 -3
- package/dist/{archive-BmsZFOZY.mjs → archive-C4Y2B58q.mjs} +3 -3
- package/dist/{archive-BNivAYGr.mjs → archive-CP5Hlqjw.mjs} +4 -4
- package/dist/{archive-CvU2z5192.mjs → archive-Cq3fnc0v2.mjs} +5 -5
- package/dist/{archive-B660RguB.mjs → archive-CqKqNdUh.mjs} +5 -5
- package/dist/{archive-CgmidYZV.mjs → archive-Czo5T0Lp.mjs} +3 -3
- package/dist/{archive-BVmFGFwG.mjs → archive-DBcxZwLd.mjs} +5 -5
- package/dist/{archive-DhDQIKR_.mjs → archive-DKFPJ9j3.mjs} +5 -5
- package/dist/{archive-CNif6BKy.mjs → archive-DPL1qOuL.mjs} +5 -5
- package/dist/{archive-bPdDITuY.mjs → archive-eS-XA74p.mjs} +3 -3
- package/dist/{auth-CefYEPP5.mjs → auth-6YyB0HNB.mjs} +5 -5
- package/dist/{body-C7m9q4cm.mjs → body-OjAWKVaU.mjs} +3 -3
- package/dist/{branches-pz04OjF2.mjs → branches-D5YLVFDK.mjs} +3 -3
- package/dist/{cancel-CNLnv19e.mjs → cancel-DeRIq1YJ.mjs} +3 -3
- package/dist/{cancel-task-DbnxSh7U.mjs → cancel-task-CqExODVm.mjs} +4 -4
- package/dist/card-BMSqofd7.mjs +24 -0
- package/dist/{card-zyUkr2nS.mjs → card-CEkp1mcI.mjs} +1 -1
- package/dist/{card-DZxRmver.mjs → card-voh1k4hl.mjs} +14 -11
- package/dist/{cards-DtYlVoGP.mjs → cards-B813G9I5.mjs} +6 -6
- package/dist/cli.mjs +223 -211
- package/dist/{client-Bv7Iwdvh.mjs → client-cJ7aw0Gt.mjs} +1788 -72
- package/dist/collection-BfNg7tEg.mjs +20 -0
- package/dist/{collection-WFdBeyqa.mjs → collection-BxdPxD38.mjs} +1 -1
- package/dist/{collection-DALwHnbz.mjs → collection-DYM0p3Xl.mjs} +1 -1
- package/dist/{collection-namespace-CvT0TIZA.mjs → collection-namespace-CVzDgJV0.mjs} +2 -2
- package/dist/{content-translation-D7POzJJ6.mjs → content-translation-QKWt9l76.mjs} +3 -3
- package/dist/{create-JOXq0ULN.mjs → create-4UnoQvsy.mjs} +4 -4
- package/dist/{create-CLgalJUe.mjs → create-BJad6MR82.mjs} +7 -7
- package/dist/{create-Bh2j733n.mjs → create-BLiB2xqo.mjs} +6 -6
- package/dist/{create-DGHILnnk.mjs → create-BWp6L_dW.mjs} +4 -4
- package/dist/{create-Di4YvIbK.mjs → create-Bef5eBCA.mjs} +4 -4
- package/dist/{create-CGgPnb7L.mjs → create-CMV3qlzJ.mjs} +3 -3
- package/dist/{create-Ds-DnSBe.mjs → create-CWGsiFvU.mjs} +3 -3
- package/dist/{create-DhDREiiy.mjs → create-CoFg1p6m.mjs} +3 -3
- package/dist/{create-CGPle4nE.mjs → create-CvIeb1NU.mjs} +6 -6
- package/dist/{create-Bwg-5p08.mjs → create-CvpeAcFc.mjs} +3 -3
- package/dist/{create-DYd_o9BD.mjs → create-D50TxVTk.mjs} +4 -4
- package/dist/{create-DnqnjGGf.mjs → create-DEBgYRlM.mjs} +5 -5
- package/dist/{create-CN24yp_W.mjs → create-DJm0YuLW.mjs} +3 -3
- package/dist/{create-CuYGZ4gu2.mjs → create-DmKwDQCY2.mjs} +5 -5
- package/dist/{create-branch-DWcxC30N.mjs → create-branch-BN5iH-GM.mjs} +4 -4
- package/dist/{create-BEE8uvz2.mjs → create-bvpl6Fn5.mjs} +6 -6
- package/dist/create-uanpKsPo.mjs +34 -0
- package/dist/{csv-CUQvcCEk.mjs → csv-BhuX9fwh.mjs} +4 -4
- package/dist/{current-task-D6P0eL21.mjs → current-task-BMt2NeqV.mjs} +4 -4
- package/dist/{dashboard-BudI952R.mjs → dashboard-Ct_ajSYI.mjs} +10 -10
- package/dist/{dashboard-CKUR8ZpQ.mjs → dashboard-D0hwTC-f.mjs} +11 -2
- package/dist/{dashboard-BlbNszi8.mjs → dashboard-DgK81azj.mjs} +1 -1
- package/dist/{database-B19qlLKZ.mjs → database-C3E9PZSx.mjs} +1 -1
- package/dist/{database-C8G6ZKG0.mjs → database-JtHTqSpq.mjs} +1 -1
- package/dist/{db-C7UTd-6P.mjs → db-B_LW2VE-.mjs} +7 -7
- package/dist/{delete-Ud6iliGM.mjs → delete-BOcPK_H9.mjs} +4 -4
- package/dist/{delete-_IHffP-A.mjs → delete-CowGO4rh.mjs} +4 -4
- package/dist/{delete-Ds-zGh9C.mjs → delete-D0f7VatX.mjs} +4 -4
- package/dist/{delete-DbZZKcYj.mjs → delete-D2bUV6uo.mjs} +4 -4
- package/dist/delete-DZ_ICQug.mjs +44 -0
- package/dist/{delete-DSxqbcFE.mjs → delete-Ur7b11no.mjs} +4 -4
- package/dist/{delete-runtime-BjHL1ryM.mjs → delete-runtime-BKEzJn22.mjs} +1 -1
- package/dist/{delete-table-DtXH6IN5.mjs → delete-table-Dd8X573t.mjs} +4 -4
- package/dist/{dependencies-CR1dlq-A.mjs → dependencies-XDVLBwko.mjs} +6 -6
- package/dist/{dirty-CYxnOnh0.mjs → dirty-k-JmGLsS.mjs} +5 -5
- package/dist/{document-Cd2mmqCp.mjs → document-BHpLJbKU.mjs} +5 -0
- package/dist/document-BW9iow8R.mjs +19 -0
- package/dist/{document-D6OybtP2.mjs → document-CA0Q6lqu.mjs} +1 -1
- package/dist/{download-DPpmmYQe.mjs → download-CQjPIYDO.mjs} +2 -2
- package/dist/{eid-D-BbtWjt.mjs → eid-CNTKDgwj.mjs} +3 -3
- package/dist/{events-CJEnn8WE.mjs → events-BshWlkDp.mjs} +4 -4
- package/dist/{export-BOgyuIOQ.mjs → export-Dq6ecU8h.mjs} +6 -6
- package/dist/{field-CzHBOPER.mjs → field-Bo2ISMO4.mjs} +5 -5
- package/dist/{field-Cr2DPUG9.mjs → field-CcN4oZy6.mjs} +16 -1
- package/dist/{field-BPsNa-TO.mjs → field-fDtIrY6D.mjs} +1 -1
- package/dist/{fields-Bwgkrvus.mjs → fields-CVctqn5G.mjs} +6 -6
- package/dist/{get-BLJSCw53.mjs → get-7xTeNGAo.mjs} +5 -5
- package/dist/{get-DyyPiiaB.mjs → get-8b5Sh50q.mjs} +5 -5
- package/dist/{get-DVi3a2nm.mjs → get-B4RgW-VT.mjs} +5 -5
- package/dist/{get-BaPadzdM.mjs → get-BD81MHl_.mjs} +3 -3
- package/dist/{get-CvIgxPXV.mjs → get-Bl3OmlBP.mjs} +4 -4
- package/dist/get-BtTetWzm.mjs +32 -0
- package/dist/{get-BfVCLBqc.mjs → get-BvSA_mmf.mjs} +5 -5
- package/dist/{get-DsKmZfM2.mjs → get-BvgEF--n.mjs} +3 -3
- package/dist/{get-D8lHwu4-.mjs → get-C5sWciaE.mjs} +5 -5
- package/dist/{get-CqQ-pf0q.mjs → get-CO6X4nZH.mjs} +16 -12
- package/dist/{get-CWfIiXwL.mjs → get-CTPvdcud.mjs} +5 -5
- package/dist/{get-C1ZdOvMm.mjs → get-CrpwxWOV.mjs} +3 -3
- package/dist/{get-BOLwso0V.mjs → get-D4oGhZWX.mjs} +3 -3
- package/dist/{get-B89DUSvw.mjs → get-Df6cGHCM.mjs} +3 -3
- package/dist/{get-BL90QC64.mjs → get-DfMVlz64.mjs} +5 -5
- package/dist/{get-CLu4yzMp2.mjs → get-Dr-U321T2.mjs} +5 -5
- package/dist/{get-D4OTJblo.mjs → get-Dw7jAno3.mjs} +5 -5
- package/dist/{get-DgnYF7LR.mjs → get-PWhOdz1z.mjs} +3 -3
- package/dist/{get-COwdtskS.mjs → get-RslzBaXx.mjs} +4 -4
- package/dist/{get-run-Iya0Yw9s.mjs → get-run-CZdDqfUj.mjs} +5 -5
- package/dist/{get-Eqq13YY-.mjs → get-wjIgUlNl.mjs} +3 -3
- package/dist/git-sync-BmoRk0UV.mjs +28 -0
- package/dist/{git-sync-BDnxPrqU.mjs → git-sync-BwBRmEhE.mjs} +18 -1
- package/dist/{git-sync-DxD_ng48.mjs → git-sync-TjX1r_wF.mjs} +1 -1
- package/dist/{group-CmVCLBDz.mjs → group-YQQ5GIcP.mjs} +2 -3
- package/dist/{has-remote-changes-DfJUMP8F.mjs → has-remote-changes-i-3MVxat.mjs} +4 -4
- package/dist/{import-FEAx-Y5A.mjs → import-DWEKejya.mjs} +6 -6
- package/dist/{input-DFZ_qGW_.mjs → input-DEvkIjGr.mjs} +1 -1
- package/dist/{is-dirty-BsYjBSXG.mjs → is-dirty-C5ipqd4v.mjs} +2 -2
- package/dist/{items-D4rstE12.mjs → items-hKJ2ZDwy.mjs} +6 -6
- package/dist/{key-BmWundO3.mjs → key-PYetuQ13.mjs} +1 -1
- package/dist/{library-uzyHWBap.mjs → library-B7_04UVK.mjs} +5 -5
- package/dist/{library-DXB8sm4r.mjs → library-BPIzb3K_.mjs} +1 -1
- package/dist/{library-CmctxHjv.mjs → library-PGCfm0UA.mjs} +1 -1
- package/dist/{list-DrS3ePsv.mjs → list-1vdClKSE.mjs} +3 -3
- package/dist/{list-xMfCeuZc.mjs → list-6myofqMv.mjs} +6 -6
- package/dist/{list-squb_ioH.mjs → list-B-9QOX9Y.mjs} +5 -5
- package/dist/{list-ndIl9XqV.mjs → list-Bs7_Rysg.mjs} +6 -6
- package/dist/list-CHuhMXet.mjs +35 -0
- package/dist/{list-CQy0z7f9.mjs → list-CLZU_EOf.mjs} +3 -3
- package/dist/{list-DeNGm9G4.mjs → list-Cen-7uTo.mjs} +4 -4
- package/dist/{list-Bjj0z5BS.mjs → list-CgH-H-O6.mjs} +3 -3
- package/dist/{list-BmMi_wPD.mjs → list-CjNXskB4.mjs} +6 -6
- package/dist/{list-DoTiQc3D.mjs → list-CmFh1GQ_.mjs} +3 -3
- package/dist/{list-D_zvX0ms.mjs → list-D6tTvYUP.mjs} +3 -3
- package/dist/{list-CC1M_n6Z.mjs → list-DI820W6w.mjs} +5 -5
- package/dist/{list-Dgm6TkqR.mjs → list-DKZnQ4Ts.mjs} +6 -6
- package/dist/{list-sQcA4g05.mjs → list-DKcC4cm0.mjs} +5 -5
- package/dist/{list-BRpPbvyS.mjs → list-DfRqNH1N.mjs} +3 -3
- package/dist/{list-bN0RC14-.mjs → list-DjwnsyXM.mjs} +11 -10
- package/dist/{list-BXL8HFr_.mjs → list-VNC-_E59.mjs} +5 -5
- package/dist/{list-1DkkU82x.mjs → list-eKDT1XXk.mjs} +5 -5
- package/dist/{list-B7tqNV8B.mjs → list-oX2SMzxZ.mjs} +3 -3
- package/dist/{login-D_1-zE4A.mjs → login-DumZaWXK.mjs} +9 -9
- package/dist/{logout-DPi2q1Wu.mjs → logout-BsXPRc-3.mjs} +2 -2
- package/dist/{measure-CdA8Nl3Z.mjs → measure-BFxkbAoa.mjs} +6 -6
- package/dist/{notification-Fcq1fIPw.mjs → notification-DVrLkjFT.mjs} +1 -1
- package/dist/{parameter-DUKR8NXo.mjs → parameter-Celg0wZa.mjs} +1 -1
- package/dist/{parameter-values-C6dj6I4g.mjs → parameter-values-CoF9Hx1p.mjs} +4 -4
- package/dist/{parse-enum-B1t8S194.mjs → parse-enum-Dc0dMZ3P.mjs} +1 -1
- package/dist/{parse-id-DR8aUSdL.mjs → parse-id-DmFJgpY6.mjs} +1 -1
- package/dist/{parse-ref-BJ_Q0tNW.mjs → parse-ref-DTDld_LJ.mjs} +1 -1
- package/dist/{path-B96DI8u2.mjs → path-BQ4lRDyN.mjs} +4 -4
- package/dist/{poll-By46YQ5J.mjs → poll-CZeXepUQ.mjs} +2 -2
- package/dist/{preflight-Bl1oitm8.mjs → preflight-BTQe4swo.mjs} +3 -3
- package/dist/{process-CcQM4qPv.mjs → process-CTrfxxaC.mjs} +1 -1
- package/dist/{publish-BKJYvxif.mjs → publish-CFB2Cc5A.mjs} +4 -4
- package/dist/{pulse-BmsDenXm.mjs → pulse-Dz0ocv0l.mjs} +1 -1
- package/dist/{pulse-DhG6I9mI.mjs → pulse-x0gFxWfG.mjs} +2 -2
- package/dist/{query-qBHjZQc_.mjs → query-BJbUnAHf.mjs} +9 -9
- package/dist/query-CV2KCS5O.mjs +114 -0
- package/dist/{query-result-DBDwk8TS.mjs → query-result-E4Q-Gra6.mjs} +1 -1
- package/dist/{remove-collection-BWFW7Rn6.mjs → remove-collection-D3yvKH3e.mjs} +5 -5
- package/dist/{render-DmykmrFB.mjs → render-BJRCs7rA.mjs} +4 -2
- package/dist/{replace-BmAqD3zY.mjs → replace-uj4WTqx_.mjs} +4 -4
- package/dist/{rescan-values-BrCLrihF.mjs → rescan-values-CzxQU318.mjs} +5 -5
- package/dist/{run-q5Y44Fxj.mjs → run-B2f_omHu.mjs} +3 -3
- package/dist/run-DlO1J1Sx.mjs +50 -0
- package/dist/{run-CtbzjDKY.mjs → run-yX2dtmE5.mjs} +5 -5
- package/dist/{runs-JFlbezkQ.mjs → runs-DzUO45wU.mjs} +6 -6
- package/dist/{runtime-BQiGgbgZ.mjs → runtime-arKqJqIT.mjs} +225 -68
- package/dist/{schema-tables-Bzx2ShyE.mjs → schema-tables-DZCNzuQ6.mjs} +6 -6
- package/dist/{schemas-ww5mU2AS.mjs → schemas-2ejqaVsG.mjs} +4 -4
- package/dist/{search-DFBwUc6d.mjs → search-BAXg-EJw.mjs} +2 -1
- package/dist/{search-J4RwCof-.mjs → search-DcihauDZ.mjs} +5 -5
- package/dist/{segment-XXTjU0eG.mjs → segment-BQT2poPG.mjs} +6 -6
- package/dist/{selectors-BAAZMi43.mjs → selectors-BzestDld.mjs} +3 -3
- package/dist/{send-BmpDlw9O.mjs → send-DMxoLFo7.mjs} +3 -3
- package/dist/{set-DUWrSza9.mjs → set-CDmiD0vv.mjs} +4 -4
- package/dist/{set-active-BiUlbNI5.mjs → set-active-RrvWR9NY.mjs} +3 -3
- package/dist/{setting-B1KBQN3M.mjs → setting-BiBLCcxz.mjs} +4 -4
- package/dist/{setup-CVaNVwOd.mjs → setup-DYsTzkWO.mjs} +3 -3
- package/dist/{signal-GhGmuHfx.mjs → signal-k7cm5N6h.mjs} +1 -1
- package/dist/{skill-list-DTnDhnL5.mjs → skill-list-D9_1Pmt7.mjs} +16 -9
- package/dist/{skills-DkDsSH5F.mjs → skills-BPHXUfeL.mjs} +75 -28
- package/dist/{skills-BWrAlj9l.mjs → skills-C3bxxC6a.mjs} +3 -3
- package/dist/snippet-BtfxE60H.mjs +19 -0
- package/dist/{stash-DMm8YF8V.mjs → stash-DdheS0Ad.mjs} +6 -6
- package/dist/{status-BzEQjQ_t.mjs → status-BuIzXRX1.mjs} +3 -3
- package/dist/{status-ClWsQD6v.mjs → status-CXouQJ31.mjs} +5 -5
- package/dist/{subscription-CdFn2hre.mjs → subscription-CJ8Igs1U.mjs} +6 -6
- package/dist/{subscriptions-DBda1pE5.mjs → subscriptions-D0NpGvCQ.mjs} +6 -6
- package/dist/{summary-B4GPiuqD.mjs → summary-D04S8gGj.mjs} +5 -5
- package/dist/{sync-schema-DsIM5g2U.mjs → sync-schema-DrA5zkdl.mjs} +6 -6
- package/dist/{sync-task-BACcrs0i.mjs → sync-task-BXeWuARG.mjs} +1 -1
- package/dist/{table-CsIJNPFf.mjs → table-C6h4tIRw.mjs} +1 -1
- package/dist/{table-CeeTJgQb.mjs → table-DfuY0N8e.mjs} +51 -4
- package/dist/{table-D4Alrrwh.mjs → table-Dntbz7Q2.mjs} +5 -5
- package/dist/timeline-8jwsldo3.mjs +21 -0
- package/dist/{timeline-event-DWIh3Tdt.mjs → timeline-event-BbB1xEdI.mjs} +6 -6
- package/dist/{transform-Bk0D0nIs.mjs → transform-CtqB1WYo.mjs} +2 -2
- package/dist/{transform-DpuG-ON3.mjs → transform-DiW7bREn.mjs} +43 -1
- package/dist/transform-job-B-1YAbvy.mjs +22 -0
- package/dist/transform-m6s4kkWU.mjs +28 -0
- package/dist/{transform-tag-DJ3_bksm.mjs → transform-tag-PjryheLF.mjs} +5 -5
- package/dist/transform-test-BjjCQ2xm.mjs +169 -0
- package/dist/transform-test-DSTkKKNC.mjs +16 -0
- package/dist/transform-test-gzDcbypy.mjs +25 -0
- package/dist/{transforms-Dg2MfB2a.mjs → transforms-CijX3VE7.mjs} +6 -6
- package/dist/{tree-BQL0f7YX.mjs → tree-Cmb3O6rH.mjs} +3 -3
- package/dist/{unpublish-DfSvb_Rs.mjs → unpublish-DkP_AcK5.mjs} +3 -3
- package/dist/{update-DBGaJDsj.mjs → update-8UmD1prT.mjs} +6 -6
- package/dist/{update-Izqip6jY.mjs → update-BFyRBc-H.mjs} +7 -7
- package/dist/{update-BCgAyfj_.mjs → update-BrXGg3QO.mjs} +7 -7
- package/dist/{update-sYLQIUgh.mjs → update-C91m9YAR.mjs} +5 -5
- package/dist/{update-D1QdfpKR.mjs → update-COcx61Ur.mjs} +5 -5
- package/dist/update-Ci8YL4_2.mjs +41 -0
- package/dist/{update-CDo0Orvu.mjs → update-CtLbFCd_.mjs} +4 -4
- package/dist/{update-Bhmli02m.mjs → update-D6Zzvc7F.mjs} +6 -6
- package/dist/{update-Cr5zHb0D.mjs → update-D8htjzNJ.mjs} +4 -4
- package/dist/{update-CtDHMxW8.mjs → update-D9kOTr0n.mjs} +5 -5
- package/dist/{update-BxIyFtrX.mjs → update-DPTio6i1.mjs} +6 -6
- package/dist/{update-NZhIjTCf.mjs → update-DlWB9s0v.mjs} +4 -4
- package/dist/{update-D4qdTlLF.mjs → update-DubrpPbz.mjs} +4 -4
- package/dist/{update-CiYxcf8M.mjs → update-Dz47cKBk.mjs} +4 -4
- package/dist/{update-B-hRR8gW.mjs → update-FCP5Lop2.mjs} +6 -6
- package/dist/{update-CKoBDTL7.mjs → update-KSHnb6vB.mjs} +8 -8
- package/dist/{update-dashcard-D5b971AO.mjs → update-dashcard-BlibHa5o.mjs} +6 -6
- package/dist/{upgrade-CD1xtsIv.mjs → upgrade-EwL6wPSY.mjs} +4 -4
- package/dist/upload-BZshRJIM.mjs +13 -0
- package/dist/{upload-akKFxpVA.mjs → upload-D0KaTqUE.mjs} +3 -3
- package/dist/{upload-BUd3MG90.mjs → upload-Do2PBSeH.mjs} +2 -2
- package/dist/{uuid-oVdJ62eA.mjs → uuid-DjKLDIVE.mjs} +9 -5
- package/dist/{validate-query-Boi8-cAP.mjs → validate-query-D6_ad-Gi.mjs} +3 -3
- package/dist/{validate-CWd6l6KZ.mjs → validate-xR_MHBNR.mjs} +69 -23
- package/dist/{values-DLwZl-P8.mjs → values-Dc9612_L.mjs} +5 -5
- package/dist/{verify-CH9Tw8yv.mjs → verify-DVN1eqXZ.mjs} +3 -3
- package/dist/{wait-rfTdQWdi.mjs → wait-C-ovOTAZ.mjs} +6 -6
- package/dist/{wait-flags-DiQ_kRjZ.mjs → wait-flags-BQNmuvIj.mjs} +2 -2
- package/dist/{window-BkvrP0gB.mjs → window-DSb1tqSe.mjs} +1 -1
- package/package.json +1 -1
- package/skill-data/core/SKILL.md +20 -14
- package/skill-data/dashboard/SKILL.md +1 -1
- package/skill-data/mbql/SKILL.md +84 -115
- package/skill-data/mbql/references/operators.md +81 -240
- package/skill-data/native-sql/SKILL.md +8 -9
- package/skill-data/native-sql/references/template-tags.md +21 -25
- package/skill-data/transform/SKILL.md +64 -2
- package/skill-data/transform-test-plan/SKILL.md +171 -0
- package/skill-data/transform-test-plan/references/checklist.md +81 -0
- package/skill-data/transform-test-plan/references/checks.md +260 -0
- package/skill-data/visualization/SKILL.md +2 -3
- package/skill-data/visualization/references/settings.md +7 -7
- package/skills/metabase-cli/SKILL.md +1 -1
- package/dist/card-BRarvKYX.mjs +0 -24
- package/dist/collection-CKeO8X7U.mjs +0 -20
- package/dist/document-BoILnE_1.mjs +0 -19
- package/dist/git-sync-CdN0Maun.mjs +0 -28
- package/dist/query-BKSM-pbi.mjs +0 -86
- package/dist/snippet-CG75L2DS.mjs +0 -19
- package/dist/timeline-DmM0BuX8.mjs +0 -21
- package/dist/transform-BcV_XlSX.mjs +0 -28
- package/dist/transform-job-CjtwBGoM.mjs +0 -22
- package/dist/upload-DzGTlldn.mjs +0 -13
package/skill-data/mbql/SKILL.md
CHANGED
|
@@ -1,21 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: mbql
|
|
3
|
-
description: Author and debug MBQL query bodies for the `mb` CLI — the
|
|
3
|
+
description: Author and debug MBQL query bodies for the `mb` CLI — the query shape, clauses, filters, aggregation and breakout, order and limit, expressions, joins and FK columns, multi-stage pipelines, saved questions and definitions as sources, output column names, and the print-schema → dry-run → run loop. Use when writing or fixing any query body — `mb query`, a card's `dataset_query`, a transform's `source.query`, or a segment/measure `definition` — or when `--dry-run` or a run reports errors. Triggers — "write an MBQL query", "the dataset_query is wrong", "aggregate and group by", "join two tables", "month-over-month".
|
|
4
4
|
allowed-tools: Read, Write, Edit, Bash, AskUserQuestion
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# MBQL
|
|
8
8
|
|
|
9
|
-
MBQL is the query format
|
|
9
|
+
MBQL is the structured query format: portable across warehouse engines, and a card built on it wires to dashboard filters as-is. Write a structured query first; write native SQL (a `mbql.stage/native` stage, see `native-sql`) for window functions beyond `offset`, CTEs, set operations, engine-specific functions, or when asked for SQL.
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
General flag conventions, body-input precedence, output flags, `./.scratch`, and `mb uuid` mechanics live in `core` (`mb skills get core`).
|
|
11
|
+
Flag conventions, body input, output flags and `./.scratch` live in `core` (`mb skills get core`).
|
|
14
12
|
|
|
15
13
|
## The shape
|
|
16
14
|
|
|
17
|
-
A flat object — `lib/type`, a numeric `database` id, and an ordered `stages` array. No recursive `source-query` nesting; multi-step queries are sibling stages.
|
|
18
|
-
|
|
19
15
|
```json
|
|
20
16
|
{
|
|
21
17
|
"lib/type": "mbql/query",
|
|
@@ -31,109 +27,67 @@ A flat object — `lib/type`, a numeric `database` id, and an ordered `stages` a
|
|
|
31
27
|
}
|
|
32
28
|
```
|
|
33
29
|
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
30
|
+
- `database`, `source-table`, `source-card` and field ids are numeric, copied from `mb database list`, `mb table get <id> --include fields`, `mb card list`. A wrong id that exists resolves to the wrong column without an error, so copy ids, never guess them.
|
|
31
|
+
- The first stage names exactly one source: `source-table` (a table id) or `source-card` (a saved question or model id). Later stages name none; they read the previous stage's output columns.
|
|
32
|
+
- Stage keys: `joins`, `expressions`, `filters`, `aggregation`, `breakout`, `fields`, `order-by`, `limit`. Each list holds at least one clause.
|
|
37
33
|
|
|
38
|
-
##
|
|
34
|
+
## Clauses
|
|
39
35
|
|
|
40
|
-
Every clause is `[op, {options}, ...args]
|
|
36
|
+
Every clause is `[op, {options}, ...args]` with the options object at position 1, `{}` when there are none:
|
|
41
37
|
|
|
42
38
|
```json
|
|
43
|
-
["
|
|
44
|
-
["
|
|
45
|
-
["
|
|
46
|
-
["
|
|
47
|
-
["asc", {}, ["field", {}, 42]]
|
|
39
|
+
["count", {}]
|
|
40
|
+
["sum", {}, ["field", {}, 42]]
|
|
41
|
+
["=", {}, ["field", {}, 61], "Gadget", "Widget"]
|
|
42
|
+
["field", { "temporal-unit": "month" }, 22]
|
|
48
43
|
```
|
|
49
44
|
|
|
50
|
-
|
|
45
|
+
An options key the server doesn't know is rejected or silently dropped, never applied, so spell keys exactly as written here. A field ref is `["field", {options}, <field id>]`. Its options: `temporal-unit` (bucket a date: `day`, `week`, `month`, `quarter`, `year`, …), `binning` (`{"strategy": "num-bins", "num-bins": 10}`), `join-alias` (a column of an explicit join), `source-field` (a column reached through an FK), `base-type` (on a column named by string, see Multi-stage).
|
|
51
46
|
|
|
52
|
-
|
|
47
|
+
## Filters, aggregation, breakout
|
|
53
48
|
|
|
54
|
-
|
|
49
|
+
- `filters` are ANDed; OR is `["or", {}, a, b, …]`. Multi-value is `["in", {}, <field>, "a", "b"]` / `["not-in", …]`.
|
|
50
|
+
- Relative dates: `["time-interval", {}, <field>, -30, "day"]`, `["time-interval", {}, <field>, "current", "month"]`. A stated year or date range is absolute: `["between", {}, <field>, "2024-01-01", "2024-12-31"]` (inclusive).
|
|
51
|
+
- `aggregation` is a list of aggregation clauses, `breakout` a list of refs. "only / where X" is a filter; "by / per / over time" is a breakout.
|
|
52
|
+
- Name every aggregation a later stage, a chart setting or a target table reads: `["sum", {"name": "revenue", "display-name": "Revenue"}, <field>]`. Unnamed, it is `count`, `sum`, `avg`, … and a second `sum` is `sum_2`.
|
|
53
|
+
- An aggregation can be arithmetic over aggregations: `["/", {"name": "aov"}, ["sum", {}, <field>], ["count", {}]]`.
|
|
54
|
+
- Date arithmetic is `["datetime-diff", {}, a, b, "day"]`.
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
## Order and limit
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
`order-by` holds `["asc", {}, <ref>]` / `["desc", {}, <ref>]`. To order by an aggregation of the same stage, set a `lib/uuid` from `mb uuid --format text` (the bare value) in that aggregation's options and point the ref at the same string:
|
|
59
59
|
|
|
60
60
|
```json
|
|
61
|
-
"aggregation": [["count", { "lib/uuid": "
|
|
62
|
-
"
|
|
61
|
+
"aggregation": [["count", {}], ["sum", {"name": "revenue", "lib/uuid": "<uuid>"}, ["field", {}, 40]]],
|
|
62
|
+
"breakout": [["field", {}, 43]],
|
|
63
|
+
"order-by": [["desc", {}, ["aggregation", {}, "<uuid>"]]],
|
|
64
|
+
"limit": 10
|
|
63
65
|
```
|
|
64
66
|
|
|
65
|
-
|
|
67
|
+
A query read back from Metabase carries a `lib/uuid` on every clause, and each must be unique within the query: drop it from a clause you duplicate.
|
|
66
68
|
|
|
67
|
-
|
|
69
|
+
"Top / first / latest N" is `order-by` plus `limit: N` in the stage.
|
|
68
70
|
|
|
69
|
-
##
|
|
71
|
+
## Expressions
|
|
70
72
|
|
|
71
|
-
`
|
|
73
|
+
`expressions` is a list of clauses, each named by `lib/expression-name` in its options; `["expression", {}, "<name>"]` uses one in the same stage:
|
|
72
74
|
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
mb query --file q.json --profile <n> --json # 3. validate + run
|
|
75
|
+
```json
|
|
76
|
+
"expressions": [["+", {"lib/expression-name": "Subtotal"}, ["field", {}, 40], ["field", {}, 44]]],
|
|
77
|
+
"aggregation": [["sum", {}, ["expression", {}, "Subtotal"]]]
|
|
77
78
|
```
|
|
78
79
|
|
|
79
|
-
|
|
80
|
-
- `--dry-run` validates and emits `{ ok, errors: [{ path, message }] }`. Exit `0` valid, `2` invalid. No request sent. Iterate until `ok: true`.
|
|
81
|
-
- run (no flag) validates, then on success sends to `/api/dataset`. On validation failure it writes the same envelope, exits `2`, and **never sends**.
|
|
82
|
-
|
|
83
|
-
`path` is a JSON Pointer into the body (`/stages/0/aggregation/0`); `message` is the validator error. Exit codes: `0` valid + ran, `2` validation failed / malformed body, `1` server-side error after a valid pre-flight.
|
|
84
|
-
|
|
85
|
-
**Pre-flight is a lightweight shape check, not the full backend validator.** It checks JSON shape, `lib/uuid` format, and enum values — not operator names, the first-stage source rule, or whether a reference resolves. A clean `--dry-run` is necessary but not sufficient: a body can pass pre-flight and still fail on the server (exit `1`). The server is the authority — when a run fails, read its error and fix the body. Common ones:
|
|
86
|
-
|
|
87
|
-
- `not a known MBQL clause` → a misspelled or unsupported **operator**. Check the vocabulary in `operators.md` (`mb skills get mbql --full`).
|
|
88
|
-
- `Initial MBQL stage must have either :source-table or :source-card` → the **first stage** is missing its source (a numeric table or card id); only the first stage takes one, later stages read the previous stage's columns.
|
|
89
|
-
- `Invalid :expression reference: no expression named "X"` (or an invalid `:aggregation` reference) → a **ref** points to an expression name / aggregation `lib/uuid` that isn't defined in the query; fix the target string.
|
|
90
|
-
- `Duplicate :lib/uuid` → you reused a `lib/uuid`. Omit them (the server mints unique ones) or give each clause a distinct value.
|
|
91
|
-
|
|
92
|
-
A successful run emits the compact envelope by default: `data.rows` + slim `data.cols` (`name`, `display_name`, `base_type`, `semantic_type`). Pass `--full` for the raw `/api/dataset` envelope (`results_metadata`, `native_form`, per-column fingerprints/`field_ref`) only when you need that metadata; `--fields data.rows` narrows to rows alone. `mb query` also runs a native query — author it as an `mbql.stage/native` stage (pre-flight-validated like any MBQL body; see `native-sql`).
|
|
93
|
-
|
|
94
|
-
`--skip-validate` bypasses pre-flight and sends as-is — use only when the bundled schema disagrees with what the server actually accepts (drift / false negative). Mutually exclusive with `--dry-run`. Same flag exists on `card create/update` and `transform create/update`.
|
|
80
|
+
## Joins
|
|
95
81
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
The same body and pre-flight apply everywhere a query is embedded. Each pre-flights only when the value is the `mbql/query` shape (`lib/type: "mbql/query"`); legacy shapes skip it; `--skip-validate` bypasses.
|
|
99
|
-
|
|
100
|
-
| Command | The query lives at | Notes |
|
|
101
|
-
| --------------------------------------- | ---------------------------------------------- | ------------------------------------------- |
|
|
102
|
-
| `mb query` | the whole body | ad-hoc run against `/api/dataset` |
|
|
103
|
-
| `card create` / `card update` | `dataset_query` | a **flat** `mbql/query` — see footgun below |
|
|
104
|
-
| `transform create` / `transform update` | `source.query` (when `source.type` is `query`) | materializes to a warehouse table |
|
|
105
|
-
| `measure create` / `measure update` | `definition` | exactly one `aggregation`, no `filters` |
|
|
106
|
-
| `segment create` / `segment update` | `definition` | filter macro tied to a table |
|
|
107
|
-
|
|
108
|
-
## Footgun: `dataset_query` is the flat mbql/query, not a legacy envelope
|
|
109
|
-
|
|
110
|
-
The most common mistake. The legacy shape `{ "type": "query", "database": N, "query": {…} }` looks similar but is wrong. `dataset_query` (and `source.query`, and `definition`) **is the `mbql/query` value itself**:
|
|
82
|
+
**A column of an FK-related table:** put the FK column's id in `source-field` and the related table's column id third. The join is added for you:
|
|
111
83
|
|
|
112
84
|
```json
|
|
113
|
-
"
|
|
114
|
-
"lib/type": "mbql/query",
|
|
115
|
-
"database": 2,
|
|
116
|
-
"stages": [{ "lib/type": "mbql.stage/mbql", "source-table": 190,
|
|
117
|
-
"aggregation": [["count", {}]] }]
|
|
118
|
-
}
|
|
85
|
+
["field", { "source-field": 1711 }, 1682]
|
|
119
86
|
```
|
|
120
87
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
## Legacy formats you may encounter
|
|
124
|
-
|
|
125
|
-
Queries created long ago may carry a different envelope (sometimes called MBQL 4 / "legacy MBQL"); the `mbql/query` shape above is what the server stores and returns. You won't author the legacy shapes, but you may see them in old content. Anything not `lib/type: "mbql/query"` is sent as-is and normalized server-side — you lose validation, so don't author these:
|
|
126
|
-
|
|
127
|
-
- **Legacy structured** — `{ "type": "query", "database": N, "query": { "source-table": T, … } }`
|
|
128
|
-
- **Flat native** — `{ "type": "native", "database": N, "native": { "query": "SELECT …" } }` — the server accepts it, but author the native stage instead (`native-sql`).
|
|
129
|
-
|
|
130
|
-
`mb query --file probe.json` runs these directly; `--dry-run` on them returns `{ ok: true, errors: [] }`. Don't author them by hand — build a legacy or complex query in the Metabase UI and pull the body with `mb card get <id> --full --json` / `mb transform get <id> --full --json` (which returns the `mbql/query` shape).
|
|
88
|
+
(`1711` = orders.customer_id, `1682` = customers.plan.)
|
|
131
89
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
Two ways to read columns from a related table.
|
|
135
|
-
|
|
136
|
-
**Explicit join.** A stage's `joins` array holds join objects, each with three required keys: `stages` (the joined source as its own one-stage array carrying `source-table`/`source-card`), `conditions` (the ON clause — `[op, {}, leftRef, rightRef]`, slot-1 rule and all), and `alias` (the string name you address joined columns by). Optional `strategy` (`left-join` default; also `right-join` / `inner-join` / `full-join`) and `fields` (`"all"` | `"none"` | an array of refs — which joined columns to select). Reference a joined column anywhere downstream by putting **`join-alias`** in the field options:
|
|
90
|
+
**An explicit join** for a non-FK condition, a chosen strategy, or a joined source question:
|
|
137
91
|
|
|
138
92
|
```json
|
|
139
93
|
"joins": [
|
|
@@ -141,28 +95,20 @@ Two ways to read columns from a related table.
|
|
|
141
95
|
"alias": "Customers",
|
|
142
96
|
"strategy": "left-join",
|
|
143
97
|
"stages": [{ "lib/type": "mbql.stage/mbql", "source-table": 170 }],
|
|
144
|
-
"conditions": [
|
|
145
|
-
|
|
146
|
-
],
|
|
147
|
-
"fields": "none"
|
|
98
|
+
"conditions": [["=", {}, ["field", {}, 1711], ["field", { "join-alias": "Customers" }, 1684]]],
|
|
99
|
+
"fields": "all"
|
|
148
100
|
}
|
|
149
101
|
],
|
|
150
102
|
"breakout": [["field", { "join-alias": "Customers" }, 1682]]
|
|
151
103
|
```
|
|
152
104
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
```json
|
|
158
|
-
["field", { "source-field": 1711 }, 1682] // orders.customer_id → customers.plan
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
`source-field` is the **FK field id** (orders.customer_id); the third element is the **target field id** in the related table (customers.plan). Use it for "show a column from the table this FK points at"; reach for an explicit join when you need a non-FK condition, a non-default strategy, or control over which joined columns return.
|
|
105
|
+
- `alias`, `stages` and `conditions` are required; `strategy` is `left-join` (default), `inner-join`, `right-join` or `full-join`.
|
|
106
|
+
- `fields` picks the joined columns a row listing returns: `"all"`, or a list of refs. Without it the join adds none.
|
|
107
|
+
- In the join's stage, every ref to a joined column carries `join-alias`, conditions included. A later stage reads it by name, like any earlier-stage column.
|
|
162
108
|
|
|
163
|
-
## Multi-stage
|
|
109
|
+
## Multi-stage
|
|
164
110
|
|
|
165
|
-
|
|
111
|
+
A later stage reads the previous stage's output by column name, with the column's `base-type`: `["field", {"base-type": "type/BigInteger"}, "count"]`. Filter on an aggregate (HAVING), or aggregate an aggregate, in the next stage:
|
|
166
112
|
|
|
167
113
|
```json
|
|
168
114
|
"stages": [
|
|
@@ -170,16 +116,15 @@ Stages run in order; each reads the **previous stage's output columns** — the
|
|
|
170
116
|
"aggregation": [["sum", { "name": "total" }, ["field", {}, 1715]]],
|
|
171
117
|
"breakout": [["field", {}, 1711]] },
|
|
172
118
|
{ "lib/type": "mbql.stage/mbql",
|
|
173
|
-
"filters": [[">", {}, ["field", { "base-type": "type/
|
|
174
|
-
|
|
175
|
-
"order-by": [["desc", {}, ["field", { "base-type": "type/BigInteger" }, "total"]]],
|
|
119
|
+
"filters": [[">", {}, ["field", { "base-type": "type/Float" }, "total"], 1000]],
|
|
120
|
+
"order-by": [["desc", {}, ["field", { "base-type": "type/Float" }, "total"]]],
|
|
176
121
|
"limit": 3 }
|
|
177
122
|
]
|
|
178
123
|
```
|
|
179
124
|
|
|
180
|
-
|
|
125
|
+
The names and base types are the `name` and `base_type` of the columns the earlier stages return: run them once (`mb query … --json`, `data.cols`) and copy both. A breakout keeps its field's name (`CREATED_AT`, even when bucketed); an aggregation has the `name` you gave it.
|
|
181
126
|
|
|
182
|
-
**Window
|
|
127
|
+
**Window:** `offset` sits in `aggregation` and reads another breakout row. Month-over-month against a monthly breakout:
|
|
183
128
|
|
|
184
129
|
```json
|
|
185
130
|
"aggregation": [
|
|
@@ -189,23 +134,47 @@ Later stages address the first stage's aggregation by the `name` you gave it (`"
|
|
|
189
134
|
"breakout": [["field", { "temporal-unit": "month" }, 1717]]
|
|
190
135
|
```
|
|
191
136
|
|
|
192
|
-
|
|
137
|
+
## Saved questions, models and definitions
|
|
193
138
|
|
|
194
|
-
|
|
139
|
+
- A saved question or model is a source: `"source-card": 137` on the first stage, same database as the rest of the query; its columns go by name with `base-type`, as in a later stage.
|
|
140
|
+
- A metric is an aggregation: `["metric", {}, <card id>]`, on a stage whose source is the metric's table.
|
|
141
|
+
- A segment is a filter: `["segment", {}, <segment id>]`, on its table.
|
|
142
|
+
- A metric's output column is named for its inner aggregation (`sum`, `count`); set `"name"` in its options for a later stage to read it by.
|
|
195
143
|
|
|
196
|
-
|
|
144
|
+
<!-- requires: measures -->
|
|
197
145
|
|
|
198
|
-
|
|
199
|
-
["count", { "name": "shipments_shipped", "display-name": "Shipments shipped" }]
|
|
200
|
-
```
|
|
146
|
+
A measure is an aggregation, `["measure", {}, <measure id>]`, on its table, and is named like a metric.
|
|
201
147
|
|
|
202
|
-
|
|
148
|
+
<!-- /requires -->
|
|
203
149
|
|
|
204
|
-
|
|
150
|
+
## Authoring loop: print-schema → dry-run → run
|
|
205
151
|
|
|
206
152
|
```bash
|
|
207
|
-
mb
|
|
208
|
-
mb
|
|
153
|
+
mb query --file q.json --dry-run --profile <n> # check + compile on the server, no run
|
|
154
|
+
mb query --file q.json --profile <n> --json # check + run
|
|
155
|
+
mb query --print-schema --profile <n> > ./.scratch/mbql-schema.json # the full JSON Schema
|
|
209
156
|
```
|
|
210
157
|
|
|
211
|
-
|
|
158
|
+
- `--dry-run` checks the shape locally, then has the server compile the query to SQL without running it. It answers `{ ok, errors: [{ path, message }], sql }`: exit `0` with the compiled `sql`, or exit `2` with `sql: null` when either check rejects the body. A local error's `path` is a JSON Pointer into the body; a server error's is `""`. Exit `1` means the compile could not run (the server refused permission, server unreachable).
|
|
159
|
+
- The server compile catches what the shape check cannot: a ref to a missing aggregation or expression, an unknown clause, a duplicate `lib/uuid`, a missing table, field, card or segment, a raw-variable template tag with no value or `default` outside an optional `[[ ]]` clause, a `required` tag with no value. A column's type not suiting its operator and a misspelled column name in a later stage are caught only by the warehouse, so a mistake there compiles and fails on the run. When a run fails, read the message and fix the body it names; an error naming nothing in the body (a `NullPointerException`) is a server fault, so stop editing a body that is otherwise correct.
|
|
160
|
+
- A run checks the shape first and never sends an invalid body; exit `1` is a server or warehouse error after that.
|
|
161
|
+
- A server error `lib/uuid: missing required key` at a clause means that clause's arguments are wrong: their count, a unit it doesn't take, a bad time zone.
|
|
162
|
+
- A run answers `data.rows` and slim `data.cols` (`name`, `display_name`, `base_type`, `semantic_type`); `--full` returns the raw `/api/dataset` envelope.
|
|
163
|
+
|
|
164
|
+
## Where the query goes
|
|
165
|
+
|
|
166
|
+
Every command below takes the query object itself at the path shown, checked by the same pre-flight (`--skip-validate` sends it unchecked).
|
|
167
|
+
|
|
168
|
+
| Command | The query lives at | Notes |
|
|
169
|
+
| --------------------------------------- | ---------------------------------------------- | --------------------------------- |
|
|
170
|
+
| `mb query` | the whole body | ad-hoc run |
|
|
171
|
+
| `card create` / `card update` | `dataset_query` | |
|
|
172
|
+
| `transform create` / `transform update` | `source.query` (when `source.type` is `query`) | materializes to a warehouse table |
|
|
173
|
+
| `measure create` / `measure update` | `definition` | see below |
|
|
174
|
+
| `segment create` / `segment update` | `definition` | see below |
|
|
175
|
+
|
|
176
|
+
A measure `definition` is one stage with `source-table` and exactly one `aggregation` that references no metric, and no `joins`, `expressions`, `breakout`, `filters`, `fields`, `order-by` or `limit`. A segment `definition` is one stage with `source-table` and at least one `filters` clause, and no `joins`, `expressions`, `breakout`, `aggregation`, `order-by` or `limit`.
|
|
177
|
+
|
|
178
|
+
## Operator reference
|
|
179
|
+
|
|
180
|
+
Every filter, aggregation, expression, temporal unit and binning strategy, with arguments: `references/operators.md` (`mb skills get mbql --full`, or `mb skills path mbql` and read the file).
|