@metabase/cli 0.3.0 → 0.3.1-alpha.support-worktrees.b634907
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-B3Ty8SzB.mjs → add-collection-CxzzDG4z.mjs} +6 -5
- package/dist/{alert-DT-ee7yf.mjs → alert-CQ7Az16h.mjs} +7 -7
- package/dist/{alerts-Bf2RH_p_.mjs → alerts-DmwyyBfW.mjs} +7 -6
- package/dist/{append-DFzQRPMd.mjs → append-B0avMkvW.mjs} +6 -4
- package/dist/{archive-Cd29QC0c.mjs → archive-BPSNe0Ul.mjs} +4 -3
- package/dist/{archive-Dr9Xnx_Z.mjs → archive-BQ50OZ7y.mjs} +6 -5
- package/dist/{archive-B6eXiyER.mjs → archive-BVblae-p.mjs} +4 -3
- package/dist/{archive-C7w49Grr.mjs → archive-BZEu6UfT.mjs} +6 -5
- package/dist/{archive-lQqs13Uz.mjs → archive-CMTHh4-w.mjs} +4 -3
- package/dist/archive-CqOKKrb2.mjs +38 -0
- package/dist/{archive-CwAdlv63.mjs → archive-Cvrkz8F8.mjs} +5 -4
- package/dist/archive-DCjdICg7.mjs +38 -0
- package/dist/{archive-4tmm946K.mjs → archive-DCyeRNfV.mjs} +4 -3
- package/dist/{archive-gid9Y09v.mjs → archive-DFofUIEC.mjs} +4 -3
- package/dist/{archive-ByvA49Kz.mjs → archive-THcEfy9B.mjs} +5 -4
- package/dist/{auth-Dltxua89.mjs → auth-BEEkuu4J.mjs} +5 -5
- package/dist/{body-Cur4NJt9.mjs → body-DxRSAMNC.mjs} +1 -1
- package/dist/branch-BSeGrtP7.mjs +28 -0
- package/dist/{branches-DchlyU0i.mjs → branches-CmWc8NyL.mjs} +4 -3
- package/dist/{cancel-BMQa5R1Z.mjs → cancel-DrQqmxvn.mjs} +4 -3
- package/dist/cancel-task-BMQXtjW5.mjs +34 -0
- package/dist/{card-zyUkr2nS.mjs → card-BEeafd4Y.mjs} +1 -1
- package/dist/{card-DZxRmver.mjs → card-CrBGUkGQ.mjs} +1 -0
- package/dist/card-RlzLDB2z.mjs +24 -0
- package/dist/{cards-SccWvRQD.mjs → cards-M_6X8wCI.mjs} +7 -6
- package/dist/cli.mjs +142 -46
- package/dist/{client-BqhzKdLM.mjs → client-DYD8WZYy.mjs} +241 -75
- package/dist/collection-Bhe20ckt.mjs +20 -0
- package/dist/{collection-CfulNRBG.mjs → collection-BxE7OzcQ.mjs} +6 -3
- package/dist/{collection-CGoVLvcD.mjs → collection-CJHqsFKP.mjs} +1 -1
- package/dist/{collection-namespace-GwydWBF3.mjs → collection-namespace-CEoQ7G08.mjs} +1 -1
- package/dist/content-translation-BrHOrmj9.mjs +5 -0
- package/dist/content-translation-C8MlXPOF.mjs +12 -0
- package/dist/{create-BOLwWt8Q.mjs → create-BA_tTDEk.mjs} +5 -4
- package/dist/{create-DF4QtgDL.mjs → create-BLWwN0uw.mjs} +5 -4
- package/dist/{create-DV-Ln5Mo.mjs → create-BqpkCjx4.mjs} +4 -3
- package/dist/{create-BNQ_DytP.mjs → create-BupBEwR2.mjs} +12 -7
- package/dist/{create-C79vErX0.mjs → create-ByuJ6T4k.mjs} +7 -6
- package/dist/{create-Beh-2uoN.mjs → create-C2XFfbjx.mjs} +4 -3
- package/dist/{create-CCh_LyW9.mjs → create-C7iooS6W.mjs} +14 -8
- package/dist/{create-CAWytBE5.mjs → create-CJ7Am4Gc.mjs} +5 -4
- package/dist/{create-DJmXXQoq.mjs → create-CY-SzM66.mjs} +16 -11
- package/dist/{create-CD008jdE.mjs → create-CoubLR5o.mjs} +8 -7
- package/dist/{create-CAQV2g6V.mjs → create-D0anrINz.mjs} +14 -9
- package/dist/create-DwrhcI8r2.mjs +144 -0
- package/dist/create-branch-B3BMpF1g.mjs +49 -0
- package/dist/{create-i14Wv3Tj.mjs → create-hTc131aX.mjs} +4 -3
- package/dist/{create-tQbnuz-I.mjs → create-ldrghMd1.mjs} +4 -3
- package/dist/{create-CHQx7jq4.mjs → create-myI6doga.mjs} +5 -4
- package/dist/{create-zeveFdnd.mjs → create-z-oMrlfT.mjs} +5 -4
- package/dist/{csv-B2Jgb1GM.mjs → csv-DBNzJiWK.mjs} +6 -4
- package/dist/{current-task-MpBFGttd.mjs → current-task-YzemU0Ic.mjs} +12 -7
- package/dist/{dashboard-BHJBoaG7.mjs → dashboard-B1mpfCq_.mjs} +10 -10
- package/dist/{dashboard-CsIFFpzK.mjs → dashboard-BlbNszi8.mjs} +1 -1
- package/dist/{dashboard-BCpSq_G-.mjs → dashboard-CKUR8ZpQ.mjs} +1 -0
- package/dist/{db-DsfojyeH.mjs → db-1tLH3nYI.mjs} +7 -7
- package/dist/{delete-DFmX7jTp.mjs → delete-CD_-B4Kq.mjs} +5 -4
- package/dist/{delete-BApOjQvl.mjs → delete-CpKH5ia4.mjs} +5 -4
- package/dist/delete-D_OgiI4v.mjs +86 -0
- package/dist/{delete-Ob06PPie.mjs → delete-DjAUp9mk.mjs} +5 -4
- package/dist/{delete-Ck0q4Dzp.mjs → delete-QNgBV6eS.mjs} +10 -5
- package/dist/{delete-B8e01xAG.mjs → delete-eAUB7p-f.mjs} +10 -5
- package/dist/{delete-runtime-D74s6vhu.mjs → delete-runtime-b2_ZMSjj.mjs} +1 -1
- package/dist/{delete-table-DuyhGrvA.mjs → delete-table-DamlxnSO.mjs} +10 -5
- package/dist/dependencies-DEx0BsZ3.mjs +41 -0
- package/dist/dirty-dC1-Ud0G.mjs +40 -0
- package/dist/document-DOJbBWLF.mjs +19 -0
- package/dist/download-C4v7u-AV.mjs +29 -0
- package/dist/{eid-WTZmDdsr.mjs → eid-CP35PdEF.mjs} +4 -3
- package/dist/{events-Bn7jh5lP.mjs → events-DmbzKIh_.mjs} +5 -4
- package/dist/{export-BjfoZRDJ.mjs → export-i8D6laBG.mjs} +25 -12
- package/dist/export-preflight-B5MvYhm3.mjs +67 -0
- package/dist/{field-Zau6Hc6X.mjs → field-BKn9bt7I.mjs} +5 -5
- package/dist/{fields-CBBa-Prp.mjs → fields-8_p81BqN.mjs} +5 -4
- package/dist/{get-DdsoHaKH.mjs → get-B0g6VMBC.mjs} +4 -3
- package/dist/{get-DRvsATp-.mjs → get-BBOfshz1.mjs} +4 -3
- package/dist/{get-CDMGbgrh.mjs → get-BHGgXqUq.mjs} +4 -3
- package/dist/{get-Dn9ZiSZr.mjs → get-BbHPFNqr.mjs} +4 -3
- package/dist/{get-CnbUCzDM.mjs → get-Bds6Izxk.mjs} +4 -3
- package/dist/{get-B7sMgsFs.mjs → get-BvW21ujw.mjs} +4 -3
- package/dist/{get-Dmj9Ygz1.mjs → get-CAzSP-7o.mjs} +4 -3
- package/dist/{get-CvI--9S_.mjs → get-CNEQK0-9.mjs} +5 -4
- package/dist/{get-D_h-G9bn.mjs → get-CPTbySa7.mjs} +4 -3
- package/dist/{get-B_xdF1kq.mjs → get-CWf46UFu.mjs} +6 -5
- package/dist/get-Cfagmy1i.mjs +42 -0
- package/dist/{get-CDJFVvhj.mjs → get-DFkbi5L3.mjs} +3 -2
- package/dist/{get-DYO1kywc.mjs → get-DnCE7K0y.mjs} +5 -4
- package/dist/{get-DY03Azx9.mjs → get-DvLuY5Xu.mjs} +17 -9
- package/dist/get-DwdMvWXU.mjs +44 -0
- package/dist/{get-DmpB6J9g.mjs → get-N4dOaTsp.mjs} +5 -4
- package/dist/get-jV8G90Zy.mjs +42 -0
- package/dist/get-mGEv-kag.mjs +33 -0
- package/dist/{get-run-Cnux9ln0.mjs → get-run-4Ng8_awa.mjs} +6 -5
- package/dist/{get-Bz99dAxK.mjs → get-vrccOMBk.mjs} +6 -5
- package/dist/{get-00lyLv6R.mjs → get-vvs0qzzM.mjs} +4 -3
- package/dist/{git-sync-BDnxPrqU.mjs → git-sync-DLzJrdMi.mjs} +22 -3
- package/dist/git-sync-DjoaNmRM.mjs +29 -0
- package/dist/{git-sync-DxD_ng48.mjs → git-sync-LQIVMNxO.mjs} +31 -2
- package/dist/{group-DBM87IgC.mjs → group-YN6jj2AN.mjs} +3 -2
- package/dist/{has-remote-changes-C684Redh.mjs → has-remote-changes-BXPGI9xG.mjs} +14 -6
- package/dist/{import-Rmmttboo.mjs → import-BoxOkA-G.mjs} +28 -11
- package/dist/{is-dirty-DYeJYhBz.mjs → is-dirty-Cwxq4_gd.mjs} +15 -6
- package/dist/{items-CQlPXBXE.mjs → items-Cv6iAzrI.mjs} +17 -9
- package/dist/{library-Bsm5KsFF.mjs → library-CRaOhJnj.mjs} +5 -5
- package/dist/{library-ClLgrAXy.mjs → library-Cfw6eF35.mjs} +1 -1
- package/dist/{library-DfYAT2Ep.mjs → library-fhVn1KDC.mjs} +1 -1
- package/dist/{list-CMpoc2TN.mjs → list--2T-GUEF.mjs} +5 -4
- package/dist/list-5Iojbr_p.mjs +37 -0
- package/dist/{list-CNUiF8Z7.mjs → list-9uvk9dIA.mjs} +4 -3
- package/dist/{list-CQwOgIlj.mjs → list-BBp9XjYs.mjs} +4 -3
- package/dist/list-BD4onDqO.mjs +37 -0
- package/dist/{list-BpFp9Wre.mjs → list-BLJkJp5a.mjs} +4 -3
- package/dist/{list-BtmsNOEn.mjs → list-BwkfWtP2.mjs} +4 -3
- package/dist/list-C2yL7-CH.mjs +45 -0
- package/dist/{list-BP3MPq-M.mjs → list-C8J3n8B8.mjs} +4 -3
- package/dist/list-CbbKip6U.mjs +32 -0
- package/dist/{list-UhpKG6_m.mjs → list-CtZAu4im.mjs} +5 -4
- package/dist/{list-BtkWNtvY.mjs → list-DOZNpX4b.mjs} +5 -4
- package/dist/{list-DF2rvoO1.mjs → list-DOaWCx8S.mjs} +18 -9
- package/dist/list-Dg2XeDON.mjs +47 -0
- package/dist/{list-CQDprvW0.mjs → list-DhrapAcy.mjs} +6 -5
- package/dist/{list-BzVTHOoH.mjs → list-L2U1l6R4.mjs} +4 -3
- package/dist/{list-DE9FM957.mjs → list-WSJLnunb.mjs} +4 -3
- package/dist/{list-B4hJuMhA.mjs → list-oAAgU5uE.mjs} +16 -9
- package/dist/{list-B8nAGwP4.mjs → list-tutXEQRW.mjs} +5 -4
- package/dist/{login-CGHeSjlP.mjs → login-DqWRF3Og.mjs} +6 -5
- package/dist/{logout-DAxOlbv4.mjs → logout-ChCz1bkf.mjs} +3 -2
- package/dist/{measure-BsYv0p26.mjs → measure-C5dIdFj1.mjs} +6 -6
- package/dist/{network-error-CEb9ymDW.mjs → network-error-D6CiOEBw.mjs} +10 -2
- package/dist/{notification-Fcq1fIPw.mjs → notification-DVrLkjFT.mjs} +1 -1
- package/dist/{parameter-values-CJTdqd8c.mjs → parameter-values-Dy4cBs5y.mjs} +4 -3
- package/dist/{parse-id-C_jmKFaa.mjs → parse-id-DDCn3VXx.mjs} +1 -1
- package/dist/{parse-ref-ibKVB0J4.mjs → parse-ref-Wv21Roup.mjs} +6 -2
- package/dist/{path-B5gHvrYL.mjs → path-IYhuzjQV.mjs} +5 -4
- package/dist/pin-BuZ_kg-u.mjs +62 -0
- package/dist/{preflight-YpPQo-sa.mjs → preflight-HLUVr2Yf.mjs} +2 -2
- package/dist/{publish-DijrxaCW.mjs → publish-CMkCSt8i.mjs} +5 -4
- package/dist/{pulse-DhG6I9mI.mjs → pulse-a-83M4DV.mjs} +1 -1
- package/dist/{query-BbqECzmF.mjs → query-Bka77J62.mjs} +9 -13
- package/dist/{query-result-DBDwk8TS.mjs → query-result-E4Q-Gra6.mjs} +1 -1
- package/dist/{query-Dc__-KJH.mjs → query-tWQAV9pb.mjs} +8 -7
- package/dist/{remove-collection-BOnxYvhj.mjs → remove-collection-BV9wRQZD.mjs} +6 -5
- package/dist/{render-CI93iP0I.mjs → render-DHjCcUXn.mjs} +7 -1
- package/dist/{replace-Cq4CxVa-.mjs → replace-mt47dlRV.mjs} +6 -4
- package/dist/{rescan-values-Dr_j416g.mjs → rescan-values-6cRjcpTs.mjs} +4 -3
- package/dist/{run-DdGJ544X.mjs → run-BmGmC-GQ.mjs} +4 -3
- package/dist/{run-C3DkS6NP.mjs → run-DI_pDxji.mjs} +6 -5
- package/dist/{runs-CUNWiidL.mjs → runs-9Fu0mug5.mjs} +7 -6
- package/dist/{runtime-DiKyBxOw.mjs → runtime-CNAZ_FuR.mjs} +104 -9
- package/dist/{schema-tables-CV386fnC.mjs → schema-tables-CLG0mtQb.mjs} +5 -4
- package/dist/{schemas-DM-UqZBQ.mjs → schemas-Cm5NWy59.mjs} +5 -4
- package/dist/scope-DsGuWG5w.mjs +11 -0
- package/dist/{search-DmGScXs8.mjs → search-CljYyf2F.mjs} +14 -8
- package/dist/{segment-BzUGM2Fr.mjs → segment-IRzlQggt.mjs} +6 -6
- package/dist/{selectors-DGDn0Hto.mjs → selectors-D4iOP5uB.mjs} +2 -2
- package/dist/{send-CVxxEpDB.mjs → send-D7DBnQbu.mjs} +4 -3
- package/dist/{set-DFolTjbd.mjs → set-DKN8fuC6.mjs} +4 -3
- package/dist/{set-active-BD8L1lPX.mjs → set-active-CkE0Eiqh.mjs} +3 -2
- package/dist/{setting-DyhaeICs.mjs → setting-CN4l8N-b.mjs} +4 -4
- package/dist/{setup-BbDQN8fe.mjs → setup-BpTptmdO.mjs} +4 -3
- package/dist/{skills--vK6J-e4.mjs → skills-BSAiLI3Z.mjs} +3 -3
- package/dist/{skills-DTCrMcix.mjs → skills-hVKSOCUf.mjs} +1 -1
- package/dist/{snippet-CyKAgIZl.mjs → snippet-BxgvQ09J.mjs} +5 -2
- package/dist/{snippet-oJLaYW9V.mjs → snippet-DecHB4Dn.mjs} +1 -1
- package/dist/snippet-LlHz3FdJ.mjs +19 -0
- package/dist/{stash-D0S4JmAz.mjs → stash-DJs6A6BA.mjs} +7 -6
- package/dist/{status-BhswxJL1.mjs → status-DtwBDRtc.mjs} +44 -16
- package/dist/{status-hL1am-HV.mjs → status-N_2EaWb7.mjs} +16 -7
- package/dist/stream-McixcoUl.mjs +7 -0
- package/dist/{subscription-_d5fB45F.mjs → subscription-BnGDp1oy.mjs} +6 -6
- package/dist/{subscriptions-s4TF6Ax3.mjs → subscriptions-BfFwV__x.mjs} +7 -6
- package/dist/{summary-CsPvcUwW.mjs → summary-CHiq-4mz.mjs} +4 -3
- package/dist/{sync-schema-DaZ_MV-u.mjs → sync-schema-DhnM-rpm.mjs} +5 -4
- package/dist/{sync-task-BACcrs0i.mjs → sync-task-G1K47Nvn.mjs} +1 -1
- package/dist/{table-DYoC1kPn.mjs → table-BQaiCSNS.mjs} +5 -5
- package/dist/timeline-C2VW0Ph6.mjs +21 -0
- package/dist/{timeline-event-CNQdCTDg.mjs → timeline-event-B7H1y8s8.mjs} +6 -6
- package/dist/{transform-D3QX0jxA.mjs → transform-BvOEn41C.mjs} +4 -1
- package/dist/{transform-DoTyyXAu.mjs → transform-CiDOJGBW.mjs} +2 -2
- package/dist/transform-DAf0Y02t.mjs +28 -0
- package/dist/transform-job-ntiT5Rrh.mjs +22 -0
- package/dist/{transform-tag-Dmb4u3-Q.mjs → transform-tag-DiXWRCQG.mjs} +1 -1
- package/dist/{transform-tag-_tgwlsdB.mjs → transform-tag-Dip51YBa.mjs} +5 -5
- package/dist/{transform-tag-CcElGp3C.mjs → transform-tag-jBVd6wXd.mjs} +9 -4
- package/dist/{transforms-oU4zizbO.mjs → transforms-C-jYgS6z.mjs} +7 -6
- package/dist/tree-DtyJhD54.mjs +36 -0
- package/dist/unpin-DxbXmLtW.mjs +45 -0
- package/dist/{unpublish-BUl9RU5C.mjs → unpublish-BokbnLng.mjs} +4 -3
- package/dist/{update-BiFDBcEH.mjs → update-AZSXMJqu.mjs} +14 -8
- package/dist/{update-BCS5FxKr.mjs → update-B9DcRSBQ.mjs} +18 -12
- package/dist/{update-bD_Jh5-s.mjs → update-BBQInyiJ.mjs} +6 -5
- package/dist/{update-BzMDeZiU.mjs → update-BCGE5UYC.mjs} +6 -5
- package/dist/{update-tX9mKBN_.mjs → update-BErxnZrj.mjs} +9 -8
- package/dist/{update-C4YJQFDS.mjs → update-BRXKLeJH.mjs} +5 -4
- package/dist/{update-cYkvbqK8.mjs → update-Bc8s1TL1.mjs} +5 -4
- package/dist/{update-BZPllQoR.mjs → update-C4PbAYgW.mjs} +5 -4
- package/dist/{update-CVPAwJaH.mjs → update-CKL2FtoX.mjs} +6 -5
- package/dist/{update-Nfi44RrE.mjs → update-CPEU8ZEu.mjs} +6 -5
- package/dist/{update-CmDTljK-.mjs → update-CfQoYVTc.mjs} +5 -4
- package/dist/{update-CO4m4wH3.mjs → update-CpLEEbiJ.mjs} +8 -7
- package/dist/{update-D-NE60AV.mjs → update-D9OTkZhw.mjs} +5 -4
- package/dist/{update-dashcard-C3TuYO_k.mjs → update-dashcard-St-dGcE3.mjs} +7 -6
- package/dist/{update-CHNSUHK4.mjs → update-e7lyQPxq.mjs} +14 -8
- package/dist/{update-CvOO8TED.mjs → update-rkbpH0lF.mjs} +5 -4
- package/dist/{upgrade-DXMV4AyP.mjs → upgrade-CUoRHfVg.mjs} +4 -3
- package/dist/upload-BPd1Uzxc.mjs +43 -0
- package/dist/upload-C3z5ZaXA.mjs +24 -0
- package/dist/{upload-CH632qW6.mjs → upload-CD555ui1.mjs} +1 -24
- package/dist/upload-Dc3QLhZw.mjs +13 -0
- package/dist/{uuid-BJkDWj9p.mjs → uuid-CFN8LIkP.mjs} +3 -2
- package/dist/{validate-query-DaGYSmpQ.mjs → validate-query-Chc43ezW.mjs} +1 -1
- package/dist/{values-Dxf1JEoA.mjs → values-BL_U-Zdw.mjs} +4 -3
- package/dist/{verify-K96rItG5.mjs → verify-DnBaRmkI.mjs} +3 -3
- package/dist/{wait-flags-DWEF9tX4.mjs → wait-flags-DzytMEG8.mjs} +2 -2
- package/dist/{wait-DoMDH226.mjs → wait-mPoOZxrw.mjs} +12 -7
- package/dist/{window-BkvrP0gB.mjs → window-DSb1tqSe.mjs} +1 -1
- package/dist/worktree-ChdDlG3Q.mjs +25 -0
- package/dist/worktree-DC0kTxxQ.mjs +20 -0
- package/dist/worktree-xAro1xAB.mjs +24 -0
- package/package.json +1 -1
- package/skill-data/core/SKILL.md +17 -14
- package/skill-data/dashboard/SKILL.md +2 -2
- package/skill-data/git-sync/SKILL.md +91 -1
- package/skill-data/transform/SKILL.md +9 -1
- package/dist/archive-BxNPHxOY.mjs +0 -32
- package/dist/archive-ChORH5JH.mjs +0 -32
- package/dist/cancel-task-C5CU1pxU.mjs +0 -28
- package/dist/card-CHI2bmds.mjs +0 -24
- package/dist/collection-CY0AB99E.mjs +0 -20
- package/dist/create-branch-CYo6jZth.mjs +0 -35
- package/dist/dependencies-Bj3QrGIm.mjs +0 -36
- package/dist/dirty-DNYoM6Bp.mjs +0 -31
- package/dist/document-BbskZPTT.mjs +0 -19
- package/dist/get-ByBOq30r.mjs +0 -31
- package/dist/get-C2-Q3iQ5.mjs +0 -31
- package/dist/get-DkWO0EI0.mjs +0 -36
- package/dist/git-sync-MQQYRYLg.mjs +0 -28
- package/dist/list-BOET6zhP.mjs +0 -36
- package/dist/list-C5Zs8nrb.mjs +0 -28
- package/dist/list-CKK-s3Ty.mjs +0 -28
- package/dist/list-DMKDsBRd.mjs +0 -38
- package/dist/snippet-DRwKb2x7.mjs +0 -19
- package/dist/timeline-xlDbEKWg.mjs +0 -21
- package/dist/transform-Bs0EWijQ.mjs +0 -28
- package/dist/transform-job-BcLChRup.mjs +0 -22
- package/dist/tree-CH-f3bjP.mjs +0 -27
- package/dist/upload-Dey_8rLf.mjs +0 -13
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
-
import { t as parseId } from "./parse-id-
|
|
4
|
-
import { t as readBody } from "./body-
|
|
1
|
+
import { H as profileFlag, R as connectionFlags, V as outputFlags, p as renderSummary } from "./cli.mjs";
|
|
2
|
+
import { t as defineMetabaseCommand } from "./runtime-CNAZ_FuR.mjs";
|
|
3
|
+
import { t as parseId } from "./parse-id-DDCn3VXx.mjs";
|
|
4
|
+
import { t as readBody } from "./body-DxRSAMNC.mjs";
|
|
5
5
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
6
6
|
import { i as DocumentUpdateInput, t as Document } from "./document-Cd2mmqCp.mjs";
|
|
7
7
|
import { t as documentView } from "./document-D6OybtP2.mjs";
|
|
@@ -12,6 +12,7 @@ var update_default = defineMetabaseCommand({
|
|
|
12
12
|
description: "Update a document by id"
|
|
13
13
|
},
|
|
14
14
|
capabilities: { minVersion: 58 },
|
|
15
|
+
worktree: "main-only",
|
|
15
16
|
args: {
|
|
16
17
|
...outputFlags,
|
|
17
18
|
...profileFlag,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
-
import { t as parseId } from "./parse-id-
|
|
4
|
-
import { t as readBody } from "./body-
|
|
1
|
+
import { H as profileFlag, R as connectionFlags, V as outputFlags, p as renderSummary } from "./cli.mjs";
|
|
2
|
+
import { t as defineMetabaseCommand } from "./runtime-CNAZ_FuR.mjs";
|
|
3
|
+
import { t as parseId } from "./parse-id-DDCn3VXx.mjs";
|
|
4
|
+
import { t as readBody } from "./body-DxRSAMNC.mjs";
|
|
5
5
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
6
|
-
import { l as DashcardPatchInput, s as Dashcard } from "./dashboard-
|
|
7
|
-
import { n as dashcardView } from "./dashboard-
|
|
6
|
+
import { l as DashcardPatchInput, s as Dashcard } from "./dashboard-CKUR8ZpQ.mjs";
|
|
7
|
+
import { n as dashcardView } from "./dashboard-BlbNszi8.mjs";
|
|
8
8
|
//#region src/commands/dashboard/update-dashcard.ts
|
|
9
9
|
var update_dashcard_default = defineMetabaseCommand({
|
|
10
10
|
meta: {
|
|
@@ -12,6 +12,7 @@ var update_dashcard_default = defineMetabaseCommand({
|
|
|
12
12
|
description: "Patch a single dashcard's layout or settings on a dashboard"
|
|
13
13
|
},
|
|
14
14
|
capabilities: { minVersion: 58 },
|
|
15
|
+
worktree: "main-only",
|
|
15
16
|
args: {
|
|
16
17
|
...outputFlags,
|
|
17
18
|
...profileFlag,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
-
import { t as parseId } from "./parse-id-
|
|
4
|
-
import { t as readBody } from "./body-
|
|
1
|
+
import { H as profileFlag, R as connectionFlags, U as worktreeFlag, V as outputFlags, p as renderSummary } from "./cli.mjs";
|
|
2
|
+
import { i as assertInWorktree, r as WORKTREE_SCOPE_DETAIL, t as defineMetabaseCommand } from "./runtime-CNAZ_FuR.mjs";
|
|
3
|
+
import { t as parseId } from "./parse-id-DDCn3VXx.mjs";
|
|
4
|
+
import { t as readBody } from "./body-DxRSAMNC.mjs";
|
|
5
5
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
6
|
-
import { i as SnippetUpdateInput, t as Snippet } from "./snippet-
|
|
7
|
-
import { t as snippetView } from "./snippet-
|
|
6
|
+
import { i as SnippetUpdateInput, t as Snippet } from "./snippet-BxgvQ09J.mjs";
|
|
7
|
+
import { t as snippetView } from "./snippet-DecHB4Dn.mjs";
|
|
8
8
|
//#region src/commands/snippet/update.ts
|
|
9
9
|
var update_default = defineMetabaseCommand({
|
|
10
10
|
meta: {
|
|
@@ -12,10 +12,13 @@ var update_default = defineMetabaseCommand({
|
|
|
12
12
|
description: "Update a native query snippet by id"
|
|
13
13
|
},
|
|
14
14
|
capabilities: { minVersion: 58 },
|
|
15
|
+
worktree: "scoped",
|
|
16
|
+
details: WORKTREE_SCOPE_DETAIL,
|
|
15
17
|
args: {
|
|
16
18
|
...outputFlags,
|
|
17
19
|
...profileFlag,
|
|
18
20
|
...connectionFlags,
|
|
21
|
+
...worktreeFlag,
|
|
19
22
|
...bodyInputFlags,
|
|
20
23
|
id: {
|
|
21
24
|
type: "positional",
|
|
@@ -31,13 +34,16 @@ var update_default = defineMetabaseCommand({
|
|
|
31
34
|
"mb snippet update 1 --body '{\"name\":\"renamed\"}'",
|
|
32
35
|
"mb snippet update 1 --body '{\"archived\":true}'"
|
|
33
36
|
],
|
|
34
|
-
async run({ args, ctx, getClient }) {
|
|
37
|
+
async run({ args, ctx, getClient, getWorktree }) {
|
|
35
38
|
const id = parseId(args.id);
|
|
36
39
|
const body = await readBody({
|
|
37
40
|
flag: args.body,
|
|
38
41
|
file: args.file
|
|
39
42
|
}, SnippetUpdateInput);
|
|
40
|
-
const
|
|
43
|
+
const client = await getClient();
|
|
44
|
+
const scope = await getWorktree();
|
|
45
|
+
if (scope !== null) assertInWorktree("snippet", id, (await client.snippet.get(id)).worktree_id, scope);
|
|
46
|
+
const updated = await client.snippet.update(id, body);
|
|
41
47
|
renderSummary(updated, snippetView, `Updated snippet ${updated.id} "${updated.name}".`, ctx);
|
|
42
48
|
}
|
|
43
49
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
-
import { t as parseId } from "./parse-id-
|
|
4
|
-
import { t as readBody } from "./body-
|
|
1
|
+
import { H as profileFlag, R as connectionFlags, V as outputFlags, p as renderSummary } from "./cli.mjs";
|
|
2
|
+
import { t as defineMetabaseCommand } from "./runtime-CNAZ_FuR.mjs";
|
|
3
|
+
import { t as parseId } from "./parse-id-DDCn3VXx.mjs";
|
|
4
|
+
import { t as readBody } from "./body-DxRSAMNC.mjs";
|
|
5
5
|
import { t as bodyInputFlags } from "./body-flags-AqKpN01Y.mjs";
|
|
6
6
|
import { a as TableUpdateInput, t as Table } from "./table-CeeTJgQb.mjs";
|
|
7
7
|
import { t as tableView } from "./table-CsIJNPFf.mjs";
|
|
@@ -12,6 +12,7 @@ var update_default = defineMetabaseCommand({
|
|
|
12
12
|
description: "Update a table (display name, description, visibility, etc.)"
|
|
13
13
|
},
|
|
14
14
|
capabilities: { minVersion: 58 },
|
|
15
|
+
worktree: "main-only",
|
|
15
16
|
args: {
|
|
16
17
|
...outputFlags,
|
|
17
18
|
...profileFlag,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { f as errorMessage, l as TimeoutError, n as AbortError, s as NetworkError, u as UnknownError } from "./predicates-Bkm2IoeX.mjs";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { h as parseJson, r as HttpError } from "./network-error-
|
|
2
|
+
import { I as name, L as version, V as outputFlags, b as promptConfirm, d as renderItem, h as writeText, n as interruptSignal } from "./cli.mjs";
|
|
3
|
+
import { g as USER_AGENT, t as defineMetabaseCommand } from "./runtime-CNAZ_FuR.mjs";
|
|
4
|
+
import { h as parseJson, r as HttpError } from "./network-error-D6CiOEBw.mjs";
|
|
5
5
|
import { n as throwIfAborted, t as combineAborts } from "./signal-CMd0EFUa.mjs";
|
|
6
6
|
import { n as streamProcess } from "./process-DBOOrmET.mjs";
|
|
7
7
|
import { z } from "zod";
|
|
@@ -292,6 +292,7 @@ var upgrade_default = defineMetabaseCommand({
|
|
|
292
292
|
description: "Upgrade the Metabase CLI itself to the latest published release"
|
|
293
293
|
},
|
|
294
294
|
capabilities: null,
|
|
295
|
+
worktree: "any",
|
|
295
296
|
args: {
|
|
296
297
|
...outputFlags,
|
|
297
298
|
check: {
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { H as profileFlag, R as connectionFlags, V as outputFlags, p as renderSummary } from "./cli.mjs";
|
|
2
|
+
import { t as defineMetabaseCommand } from "./runtime-CNAZ_FuR.mjs";
|
|
3
|
+
import { t as ContentTranslationUploadResult } from "./content-translation-BrHOrmj9.mjs";
|
|
4
|
+
import { n as requireUploadFilePath, t as readCsvFile } from "./upload-CD555ui1.mjs";
|
|
5
|
+
//#region src/output/views/content-translation.ts
|
|
6
|
+
const contentTranslationUploadView = {
|
|
7
|
+
compactPick: ContentTranslationUploadResult,
|
|
8
|
+
tableColumns: [{
|
|
9
|
+
key: "success",
|
|
10
|
+
label: "Success"
|
|
11
|
+
}]
|
|
12
|
+
};
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region src/commands/content-translation/upload.ts
|
|
15
|
+
var upload_default = defineMetabaseCommand({
|
|
16
|
+
meta: {
|
|
17
|
+
name: "upload",
|
|
18
|
+
description: "Replace the complete content translation dictionary from CSV"
|
|
19
|
+
},
|
|
20
|
+
details: "Uploads one complete dictionary and replaces every active content translation on the server. Keep the canonical full CSV in version control and download the current dictionary before replacing it. Metabase accepts dictionaries up to 1.5 MiB.",
|
|
21
|
+
capabilities: {
|
|
22
|
+
minVersion: 58,
|
|
23
|
+
tokenFeature: "content_translation"
|
|
24
|
+
},
|
|
25
|
+
worktree: "main-only",
|
|
26
|
+
args: {
|
|
27
|
+
...outputFlags,
|
|
28
|
+
...profileFlag,
|
|
29
|
+
...connectionFlags,
|
|
30
|
+
file: {
|
|
31
|
+
type: "string",
|
|
32
|
+
description: "Path to the complete translation dictionary CSV"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
outputSchema: ContentTranslationUploadResult,
|
|
36
|
+
examples: ["mb content-translation upload --file translations.csv", "mb content-translation upload --file translations.csv --profile prod --json"],
|
|
37
|
+
async run({ args, ctx, getClient }) {
|
|
38
|
+
const file = await readCsvFile(requireUploadFilePath(args.file));
|
|
39
|
+
renderSummary(await (await getClient()).contentTranslation.upload(file), contentTranslationUploadView, `Replaced the content translation dictionary with "${file.filename}".`, ctx);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
//#endregion
|
|
43
|
+
export { upload_default as default };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { n as UploadUpdateResult, t as UploadResult } from "./upload-DAtxBBms.mjs";
|
|
2
|
+
//#region src/output/views/upload.ts
|
|
3
|
+
const uploadResultView = {
|
|
4
|
+
compactPick: UploadResult,
|
|
5
|
+
tableColumns: [{
|
|
6
|
+
key: "model_id",
|
|
7
|
+
label: "Model ID"
|
|
8
|
+
}, {
|
|
9
|
+
key: "table_id",
|
|
10
|
+
label: "Table ID"
|
|
11
|
+
}]
|
|
12
|
+
};
|
|
13
|
+
const uploadUpdateResultView = {
|
|
14
|
+
compactPick: UploadUpdateResult,
|
|
15
|
+
tableColumns: [{
|
|
16
|
+
key: "table_id",
|
|
17
|
+
label: "Table ID"
|
|
18
|
+
}, {
|
|
19
|
+
key: "action",
|
|
20
|
+
label: "Action"
|
|
21
|
+
}]
|
|
22
|
+
};
|
|
23
|
+
//#endregion
|
|
24
|
+
export { uploadUpdateResultView as n, uploadResultView as t };
|
|
@@ -1,30 +1,7 @@
|
|
|
1
1
|
import { i as ConfigError, p as isFileNotFoundError } from "./predicates-Bkm2IoeX.mjs";
|
|
2
2
|
import { n as fileNotFoundError } from "./input-DH9i67x_.mjs";
|
|
3
|
-
import { n as UploadUpdateResult, t as UploadResult } from "./upload-DAtxBBms.mjs";
|
|
4
3
|
import { basename } from "node:path";
|
|
5
4
|
import { readFile } from "node:fs/promises";
|
|
6
|
-
//#region src/output/views/upload.ts
|
|
7
|
-
const uploadResultView = {
|
|
8
|
-
compactPick: UploadResult,
|
|
9
|
-
tableColumns: [{
|
|
10
|
-
key: "model_id",
|
|
11
|
-
label: "Model ID"
|
|
12
|
-
}, {
|
|
13
|
-
key: "table_id",
|
|
14
|
-
label: "Table ID"
|
|
15
|
-
}]
|
|
16
|
-
};
|
|
17
|
-
const uploadUpdateResultView = {
|
|
18
|
-
compactPick: UploadUpdateResult,
|
|
19
|
-
tableColumns: [{
|
|
20
|
-
key: "table_id",
|
|
21
|
-
label: "Table ID"
|
|
22
|
-
}, {
|
|
23
|
-
key: "action",
|
|
24
|
-
label: "Action"
|
|
25
|
-
}]
|
|
26
|
-
};
|
|
27
|
-
//#endregion
|
|
28
5
|
//#region src/runtime/upload.ts
|
|
29
6
|
function requireUploadFilePath(file) {
|
|
30
7
|
if (typeof file !== "string" || file.trim() === "") throw new ConfigError("provide the CSV file to upload with --file <path>");
|
|
@@ -43,4 +20,4 @@ async function readCsvFile(path) {
|
|
|
43
20
|
}
|
|
44
21
|
}
|
|
45
22
|
//#endregion
|
|
46
|
-
export {
|
|
23
|
+
export { requireUploadFilePath as n, readCsvFile as t };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { t as defineCommandGroup } from "./group-YN6jj2AN.mjs";
|
|
2
|
+
//#region src/commands/upload/index.ts
|
|
3
|
+
var upload_default = defineCommandGroup({
|
|
4
|
+
name: "upload",
|
|
5
|
+
description: "Upload CSV files into Metabase",
|
|
6
|
+
subCommands: {
|
|
7
|
+
csv: () => import("./csv-DBNzJiWK.mjs").then((m) => m.default),
|
|
8
|
+
append: () => import("./append-B0avMkvW.mjs").then((m) => m.default),
|
|
9
|
+
replace: () => import("./replace-mt47dlRV.mjs").then((m) => m.default)
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
//#endregion
|
|
13
|
+
export { upload_default as default };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { i as ConfigError } from "./predicates-Bkm2IoeX.mjs";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { V as outputFlags, h as writeText, m as writeJson } from "./cli.mjs";
|
|
3
|
+
import { K as parseInteger, t as defineMetabaseCommand } from "./runtime-CNAZ_FuR.mjs";
|
|
4
4
|
import { z } from "zod";
|
|
5
5
|
import { randomUUID } from "node:crypto";
|
|
6
6
|
//#region src/commands/uuid.ts
|
|
@@ -17,6 +17,7 @@ var uuid_default = defineMetabaseCommand({
|
|
|
17
17
|
purpose: "where lib/uuid values are used"
|
|
18
18
|
}],
|
|
19
19
|
capabilities: null,
|
|
20
|
+
worktree: "any",
|
|
20
21
|
args: {
|
|
21
22
|
...outputFlags,
|
|
22
23
|
count: {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { i as ConfigError } from "./predicates-Bkm2IoeX.mjs";
|
|
2
|
-
import {
|
|
2
|
+
import { m as writeJson } from "./cli.mjs";
|
|
3
3
|
import { i as validateQuery, r as isMbql5Query, t as assertNotLegacyEnvelopeWrappingMbql5 } from "./validate-BWchyW0V.mjs";
|
|
4
4
|
//#region src/commands/validate-query.ts
|
|
5
5
|
const skipValidateFlag = { "skip-validate": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
3
|
-
import { t as parseId } from "./parse-id-
|
|
1
|
+
import { H as profileFlag, R as connectionFlags, V as outputFlags, _ as formatScalar, p as renderSummary } from "./cli.mjs";
|
|
2
|
+
import { t as defineMetabaseCommand } from "./runtime-CNAZ_FuR.mjs";
|
|
3
|
+
import { t as parseId } from "./parse-id-DDCn3VXx.mjs";
|
|
4
4
|
import { s as FieldValues } from "./field-Cr2DPUG9.mjs";
|
|
5
5
|
import { n as fieldValuesView } from "./field-BPsNa-TO.mjs";
|
|
6
6
|
//#region src/commands/field/values.ts
|
|
@@ -10,6 +10,7 @@ var values_default = defineMetabaseCommand({
|
|
|
10
10
|
description: "Fetch the cached distinct values for a field (FieldValues list)"
|
|
11
11
|
},
|
|
12
12
|
capabilities: { minVersion: 58 },
|
|
13
|
+
worktree: "any",
|
|
13
14
|
args: {
|
|
14
15
|
...outputFlags,
|
|
15
16
|
...profileFlag,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { n as createClient } from "./client-
|
|
1
|
+
import { n as createClient } from "./client-DYD8WZYy.mjs";
|
|
2
2
|
import { f as errorMessage, l as TimeoutError, o as MetabaseError, s as NetworkError } from "./predicates-Bkm2IoeX.mjs";
|
|
3
|
-
import {
|
|
4
|
-
import { r as HttpError } from "./network-error-
|
|
3
|
+
import { U as tryParseTag, W as SessionProperties, g as USER_AGENT } from "./runtime-CNAZ_FuR.mjs";
|
|
4
|
+
import { r as HttpError } from "./network-error-D6CiOEBw.mjs";
|
|
5
5
|
//#region ../client/src/version/probe.ts
|
|
6
6
|
const PROBE_PATH = "/api/session/properties";
|
|
7
7
|
const PROBE_TIMEOUT_MS = 1e4;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as parseId } from "./parse-id-
|
|
1
|
+
import { n as interruptSignal } from "./cli.mjs";
|
|
2
|
+
import { t as parseId } from "./parse-id-DDCn3VXx.mjs";
|
|
3
3
|
import { n as DEFAULT_TIMEOUT_MS, t as DEFAULT_INTERVAL_MS } from "./poll-75SvT7Zv.mjs";
|
|
4
4
|
//#region src/commands/wait-flags.ts
|
|
5
5
|
const waitScheduleFlags = {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as defineMetabaseCommand } from "./runtime-
|
|
1
|
+
import { H as profileFlag, R as connectionFlags, U as worktreeFlag, V as outputFlags, p as renderSummary } from "./cli.mjs";
|
|
2
|
+
import { r as WORKTREE_SCOPE_DETAIL, s as scopeQuery, t as defineMetabaseCommand } from "./runtime-CNAZ_FuR.mjs";
|
|
3
3
|
import { n as DEFAULT_TIMEOUT_MS, t as DEFAULT_INTERVAL_MS } from "./poll-75SvT7Zv.mjs";
|
|
4
|
-
import { r as parseWaitSchedule } from "./wait-flags-
|
|
5
|
-
import {
|
|
6
|
-
import { a as throwIfFailedTask, i as taskPollOptions, n as formatSyncTask, r as syncTaskIdleView, t as SyncTaskOrIdle } from "./sync-task-
|
|
4
|
+
import { r as parseWaitSchedule } from "./wait-flags-DzytMEG8.mjs";
|
|
5
|
+
import { l as syncTaskView } from "./git-sync-LQIVMNxO.mjs";
|
|
6
|
+
import { a as throwIfFailedTask, i as taskPollOptions, n as formatSyncTask, r as syncTaskIdleView, t as SyncTaskOrIdle } from "./sync-task-G1K47Nvn.mjs";
|
|
7
7
|
//#region src/commands/git-sync/wait.ts
|
|
8
8
|
const WaitResult = SyncTaskOrIdle;
|
|
9
9
|
var wait_default = defineMetabaseCommand({
|
|
@@ -15,10 +15,13 @@ var wait_default = defineMetabaseCommand({
|
|
|
15
15
|
minVersion: 60,
|
|
16
16
|
tokenFeature: "remote_sync"
|
|
17
17
|
},
|
|
18
|
+
worktree: "scoped",
|
|
19
|
+
details: WORKTREE_SCOPE_DETAIL,
|
|
18
20
|
args: {
|
|
19
21
|
...outputFlags,
|
|
20
22
|
...profileFlag,
|
|
21
23
|
...connectionFlags,
|
|
24
|
+
...worktreeFlag,
|
|
22
25
|
timeout: {
|
|
23
26
|
type: "string",
|
|
24
27
|
description: "Polling timeout in ms",
|
|
@@ -32,9 +35,11 @@ var wait_default = defineMetabaseCommand({
|
|
|
32
35
|
},
|
|
33
36
|
outputSchema: WaitResult,
|
|
34
37
|
examples: ["mb git-sync wait", "mb git-sync wait --timeout 300000 --json"],
|
|
35
|
-
async run({ args, ctx, getClient }) {
|
|
38
|
+
async run({ args, ctx, getClient, getWorktree }) {
|
|
36
39
|
const schedule = parseWaitSchedule(args);
|
|
37
|
-
const
|
|
40
|
+
const mb = await getClient();
|
|
41
|
+
const scope = await getWorktree();
|
|
42
|
+
const final = await mb.gitSync.waitForTask(taskPollOptions(schedule), scopeQuery(scope));
|
|
38
43
|
if (final === null) {
|
|
39
44
|
renderSummary({ status: "idle" }, syncTaskIdleView, "No git-sync task is running.", ctx);
|
|
40
45
|
return;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { n as WorktreeCompact } from "./worktree-xAro1xAB.mjs";
|
|
2
|
+
//#region src/output/views/worktree.ts
|
|
3
|
+
const worktreeView = {
|
|
4
|
+
compactPick: WorktreeCompact,
|
|
5
|
+
tableColumns: [
|
|
6
|
+
{
|
|
7
|
+
key: "id",
|
|
8
|
+
label: "ID"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
key: "branch",
|
|
12
|
+
label: "Branch"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
key: "creator_id",
|
|
16
|
+
label: "Creator"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
key: "created_at",
|
|
20
|
+
label: "Created"
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
};
|
|
24
|
+
//#endregion
|
|
25
|
+
export { worktreeView as t };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { t as defineCommandGroup } from "./group-YN6jj2AN.mjs";
|
|
2
|
+
//#region src/commands/worktree/index.ts
|
|
3
|
+
var worktree_default = defineCommandGroup({
|
|
4
|
+
name: "worktree",
|
|
5
|
+
description: "Manage git-sync worktrees: isolated checkouts of a branch's content",
|
|
6
|
+
skills: [{
|
|
7
|
+
skill: "git-sync",
|
|
8
|
+
purpose: "worktree lifecycle and pull/push"
|
|
9
|
+
}],
|
|
10
|
+
subCommands: {
|
|
11
|
+
list: () => import("./list-CbbKip6U.mjs").then((mod) => mod.default),
|
|
12
|
+
get: () => import("./get-mGEv-kag.mjs").then((mod) => mod.default),
|
|
13
|
+
create: () => import("./create-DwrhcI8r2.mjs").then((mod) => mod.default),
|
|
14
|
+
delete: () => import("./delete-D_OgiI4v.mjs").then((mod) => mod.default),
|
|
15
|
+
pin: () => import("./pin-BuZ_kg-u.mjs").then((mod) => mod.default),
|
|
16
|
+
unpin: () => import("./unpin-DxbXmLtW.mjs").then((mod) => mod.default)
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
//#endregion
|
|
20
|
+
export { worktree_default as default };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
//#region ../client/src/domain/worktree.ts
|
|
3
|
+
const WorktreeCreator = z.object({
|
|
4
|
+
id: z.number().int().positive(),
|
|
5
|
+
email: z.email().optional(),
|
|
6
|
+
common_name: z.string().optional()
|
|
7
|
+
}).loose();
|
|
8
|
+
const Worktree = z.object({
|
|
9
|
+
id: z.number().int().positive(),
|
|
10
|
+
branch: z.string(),
|
|
11
|
+
creator_id: z.number().int().positive().nullable().optional(),
|
|
12
|
+
created_at: z.string().optional(),
|
|
13
|
+
updated_at: z.string().optional(),
|
|
14
|
+
creator: WorktreeCreator.nullable().optional()
|
|
15
|
+
}).loose();
|
|
16
|
+
const WorktreeCompact = Worktree.pick({
|
|
17
|
+
id: true,
|
|
18
|
+
branch: true,
|
|
19
|
+
creator_id: true,
|
|
20
|
+
created_at: true
|
|
21
|
+
}).strip();
|
|
22
|
+
z.object({ branch: z.string().min(1) });
|
|
23
|
+
//#endregion
|
|
24
|
+
export { WorktreeCompact as n, Worktree as t };
|
package/package.json
CHANGED
package/skill-data/core/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: core
|
|
3
|
-
description: Foundations for driving Metabase from the terminal with the `mb` CLI — authentication and named profiles, the flag/output/`--json` conventions every command shares, JSON body input, command discovery via `--help` (add `--json` for machine-readable schemas), and the per-resource footguns (db, table, field, upload, card, dashboard, collection, segment, measure, timeline, alert, subscription, library, setting, search, eid). Load first for any `mb` task; it routes to the specialized skills for deeper work.
|
|
3
|
+
description: Foundations for driving Metabase from the terminal with the `mb` CLI — authentication and named profiles, the flag/output/`--json` conventions every command shares, JSON body input, command discovery via `--help` (add `--json` for machine-readable schemas), and the per-resource footguns (db, table, field, upload, content translation, card, dashboard, collection, segment, measure, timeline, alert, subscription, library, setting, search, eid). Load first for any `mb` task; it routes to the specialized skills for deeper work.
|
|
4
4
|
allowed-tools: Read, Write, Edit, Bash, AskUserQuestion
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -11,9 +11,9 @@ The official Metabase CLI (`mb`) drives a Metabase instance over its REST API: a
|
|
|
11
11
|
Top-level command groups (run `mb <group> --help` to discover verbs):
|
|
12
12
|
|
|
13
13
|
```
|
|
14
|
-
auth | db | table | field | upload | query | card | dashboard | snippet | segment | measure | collection | library
|
|
14
|
+
auth | db | table | field | upload | content-translation | query | card | dashboard | snippet | segment | measure | collection | library
|
|
15
15
|
document | timeline | timeline-event | transform | transform-job | transform-tag | alert | subscription | setting
|
|
16
|
-
search | git-sync | setup | eid | uuid | upgrade | skills
|
|
16
|
+
search | git-sync | worktree | setup | eid | uuid | upgrade | skills
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
The conventions below — auth, flags, output, body input — hold across **every** group. Per-command flags and examples live in each command's `--help`; add `--json` for the machine-readable form with the output JSON Schema. A few flows have their own skills (see "Specialized skills"). When a card needs a query, prefer MBQL over native SQL (portable, pre-flight-validated — load `mbql`); fall back to native SQL when MBQL can't express it.
|
|
@@ -47,6 +47,8 @@ Once a name is established, pass `--profile <name>` to **every** subsequent comm
|
|
|
47
47
|
|
|
48
48
|
**`--wait` for async operations.** `transform run`, `git-sync import`, and similar verbs return immediately by default. Pass `--wait` whenever the next step depends on completion — without it you race the operation and see "not ready" / transient connection refusals.
|
|
49
49
|
|
|
50
|
+
**`--worktree <id|branch>` scopes a command to a git-sync worktree** — an isolated checkout of one branch's content in the same instance (admin-only, v64+). Precedence: flag, then `MB_WORKTREE`, then the profile's pin (`mb worktree pin <ref>` / `unpin`). **The pin is a lock, not a default:** flag and env may only re-state it, a different worktree exits 2 — that is how a harness confines an agent to one worktree. Each command's `worktree` policy shows in `--help --json`: `scoped` honors the scope, `any` ignores it and takes no `--worktree`, `main-only` (`transform run`, main-app writes) refuses under one — report that refusal rather than unpinning. Workflow: the `git-sync` skill.
|
|
51
|
+
|
|
50
52
|
**Some "lookup" verbs return JSON envelopes, not bare values.** `mb setting get <key>` returns `{"key": "...", "value": ...}`. Extract before reusing:
|
|
51
53
|
|
|
52
54
|
```bash
|
|
@@ -69,7 +71,7 @@ Every list verb takes `--limit <n>` (items this call returns) and `--offset <n>`
|
|
|
69
71
|
|
|
70
72
|
- **`has_more` decides whether to keep going — never compare counts.** `total` is the server's count on endpoints that report one and `null` on those that don't, so arithmetic over it is not a termination condition.
|
|
71
73
|
- **To continue, pass `next_offset` back as `--offset`.** When `has_more` is true `next_offset` is past the offset you sent, so the loop advances; when false the walk is over and `next_offset` is `null`.
|
|
72
|
-
- **`truncated` means the byte cap cut the output, not that the data ran out.** `has_more`/`next_offset` are recomputed to the cut point, so a capped list resumes like any window. Its `bytes` is what the untruncated answer would have measured, so it sizes the work left rather than the reply you hold. Narrow rows with `--fields` rather than raising `--max-bytes` —
|
|
74
|
+
- **`truncated` means the byte cap cut the output, not that the data ran out.** `has_more`/`next_offset` are recomputed to the cut point, so a capped list resumes like any window. Its `bytes` is what the untruncated answer would have measured, so it sizes the work left rather than the reply you hold. Narrow rows with `--fields` rather than raising `--max-bytes` — the cap counts only what you asked for, so `--fields` buys rows directly. A capped list always returns at least one row; when not even one fits it exits 2 with "the smallest response this list can produce is N bytes, over the M-byte --max-bytes cap; …".
|
|
73
75
|
- `limit` is echoed only when you passed `--limit` — except `mb search`, which defaults to `--limit 20` (an unbounded search is expensive server-side) and so always reports one. On nouns the server doesn't page, one large `--limit` with narrow `--fields` is a single request; many small `--offset` hops are one request each.
|
|
74
76
|
|
|
75
77
|
The whole walk, literally:
|
|
@@ -104,7 +106,7 @@ mb <noun> create --file ./.scratch/body.json --profile <n> --json
|
|
|
104
106
|
|
|
105
107
|
Single-quoted `'EOF'` stops the shell interpolating `$vars` inside the JSON.
|
|
106
108
|
|
|
107
|
-
Write working files to **`./.scratch`** in the current directory (`mkdir -p ./.scratch` first), never `/tmp` —
|
|
109
|
+
Write working files to **`./.scratch`** in the current directory (`mkdir -p ./.scratch` first), never `/tmp` — they persist across the session and the user can review them.
|
|
108
110
|
|
|
109
111
|
## Discovering commands and schemas
|
|
110
112
|
|
|
@@ -123,26 +125,27 @@ mb transform --help --json | jq -r '.commands[].command' # verbs under "transfo
|
|
|
123
125
|
|
|
124
126
|
## Resource quirks worth memorizing
|
|
125
127
|
|
|
126
|
-
Routine verb shapes (list / get / create / update), every flag, and output schemas live in each command's `--help` (add `--json`
|
|
128
|
+
Routine verb shapes (list / get / create / update), every flag, and output schemas live in each command's `--help` (add `--json`). Below is only what help does _not_ tell you: footguns and non-obvious behaviors.
|
|
127
129
|
|
|
128
|
-
- **db traversal: the hydration ladder.** Start with `database get <db-id> --include tables` — the compact table map (id, name, schema, description per table), one call that fits most databases.
|
|
129
|
-
- **table fields.** `table get` never returns fields on its own — pass `--include fields` (compact;
|
|
130
|
+
- **db traversal: the hydration ladder.** Start with `database get <db-id> --include tables` — the compact table map (id, name, schema, description per table), one call that fits most databases. Then `table fields <table-id>` per relevant table (bounded: fields are per-table). `--include tables.fields` is the full rollup — small databases only. Hundreds of tables? Traverse by schema (`database schemas <db-id>` → `database schema-tables <db-id> <schema>`) or look tables up by name (`search <term> --models table --db-id <db-id> --limit 10`). `sync-schema` / `rescan-values` queue async work and return `{status:"ok"}` immediately; `sync-schema --wait` blocks until `initial_sync_status: complete`.
|
|
131
|
+
- **table fields.** `table get` never returns fields on its own — pass `--include fields` (compact; `--full` also carries FK targets and dimensions) or use `table fields <id>` (list envelope). `table update` patches table-level metadata only; physical columns aren't editable.
|
|
130
132
|
- **field has no `list`.** Fields are per-table — get them via `table get <id> --include fields`. Never enumerate fields across a whole db (context blow-up). `field summary` is live cardinality `{field_id, count, distincts}`; `field values` is the cached distinct set (`has_more_values: true` ⇒ truncated cache). `field update` patches metadata only (`base_type` isn't editable) — this is where you set a column's `semantic_type` or foreign-key target.
|
|
131
133
|
- **upload (CSV → tables).** `upload csv --file <path>` creates a new table + model (prints `{model_id, table_id}`); `upload append <table-id>` / `upload replace <table-id> --file <path>` add to / overwrite a table **previously created by upload** (columns must match). The destination db+schema is admin-configured, not per-call — check with `mb setting get uploads-settings --json` (`db_id: null` ⇒ uploads off/unconfigured; needs admin to read). `--collection <id|root>` only sets the model's collection. Max 50 MB. Errors: **"The uploads database is not configured."** = no db has uploads enabled; **"Uploads are not enabled."** = the append/replace target isn't an uploaded table.
|
|
134
|
+
- **content-translation.** EE-only (`content_translation` premium feature), admin-only, separate from Remote Sync. `content-translation download > translations.csv` streams the complete active dictionary; `content-translation upload --file translations.csv` replaces every active translation with the file. Always upload the canonical complete CSV, never a partial patch. An empty dictionary downloads as Metabase's four-row sample — don't re-upload it as real translations. Dictionaries are limited to 1.5 MiB.
|
|
132
135
|
- **card.** `dataset_query` is the **flat** `mbql/query` value, not a legacy `{type:"query",query:…}` envelope (→ `mbql`). `--export-format csv|xlsx` streams the raw export (pipe to a file), bypassing the JSON envelope. `archive` is the only delete; unarchive with `update --body '{"archived":false}'`. `visualization_settings` keys are scoped by `display` and aren't pre-flighted — see `visualization`.
|
|
133
|
-
- **dashboard.** Dashcards round-trip through `PUT /api/dashboard/:id` (no per-dashcard endpoint): `update-dashcard <dash-id> <dashcard-id>` patches one safely; `update --body '{"dashcards":[…]}'` replaces the whole set (omitted ids are deleted server-side; negative ids for new cards).
|
|
134
|
-
- **dashboard parameters (filters).** A dashboard's `parameters` array holds its filter widgets; they're part of the dashboard record, so read them with `dashboard get <id> --fields parameters --json` (no separate verb). **Editing replaces the _whole_ array** (like dashcards), so it's a read-modify-write loop and omitting a parameter deletes it. A parameter only filters a card once it is **mapped** onto that dashcard's `parameter_mappings` — an unmapped parameter is an inert widget. `type` is a **closed enum**; an unlisted value is a hard parse error that echoes the
|
|
136
|
+
- **dashboard.** Dashcards round-trip through `PUT /api/dashboard/:id` (no per-dashcard endpoint): `update-dashcard <dash-id> <dashcard-id>` patches one safely; `update --body '{"dashcards":[…]}'` replaces the whole set (omitted ids are deleted server-side; negative ids for new cards). Every dashcard must include `card_id`, including existing rows; use `card_id:null` plus a `visualization_settings.virtual_card` block (`{display:"text"|"heading"|"link"|…}`) for non-question cards. `create` accepts the **same** `dashcards` array in its initial body, so lay out the whole dashboard in one call. `create`/`update` pre-flight every positive `card_id` and exit **2** with `{ok:false,errors:[…]}` on a bad ref (non-bypassable). `dashboard get <id>` (or `--full`) hydrates dashcards/tabs; `list` omits them. **The grid is 24 columns wide:** each dashcard's `{col, row, size_x, size_y}` is in grid units — **full-width is `size_x: 24`** (`size_x: 12` is half a row, the usual cause of a half-width card). Keep `col + size_x ≤ 24`, start a full-width stack's `col` at 0, and don't overlap (the server stores collisions as sent — no auto-fix). Layout patterns and per-chart default sizes → the `dashboard` skill; load it before composing any `dashcards` array.
|
|
137
|
+
- **dashboard parameters (filters).** A dashboard's `parameters` array holds its filter widgets; they're part of the dashboard record, so read them with `dashboard get <id> --fields parameters --json` (no separate verb). **Editing replaces the _whole_ array** (like dashcards), so it's a read-modify-write loop and omitting a parameter deletes it. A parameter only filters a card once it is **mapped** onto that dashcard's `parameter_mappings` — an unmapped parameter is an inert widget. `type` is a **closed enum**; an unlisted value is a hard parse error that echoes the allowed set back. `dashboard parameter-values <id> <parameter-id> [--query <substr>]` fetches a widget's selectable values (`{values, has_more_values}`; `--query` is a case-insensitive substring match). Parameter types, ids, mapping targets, and value sources → the `dashboard` skill; load it before authoring a `parameters` array.
|
|
135
138
|
- **alert / subscription are two unrelated systems.** `alert` watches one **card** and fires on a send condition (`/api/notification`: a cron string, `channel/email`-prefixed handlers, typed recipients); `subscription` delivers one **dashboard** on a schedule (`/api/pulse`: structured `schedule_type` + hour/day/frame, bare `email` channels, `{id}|{email}` recipients). The bodies are not interchangeable. Both silently deliver nowhere if the server has no SMTP / Slack app — check `mb setting get 'email-configured?'` (quote it; the `?` is a shell glob) before creating either. Their list-valued fields (`handlers`/`subscriptions`, `channels`/`cards`) **replace wholesale** on update, so adding one recipient is a read-modify-write. `mb card alerts <id>` and `mb dashboard subscriptions <id>` list what's already attached to a card/dashboard; `archive` deactivates rather than deletes. Load the `notification` skill before authoring either body.
|
|
136
139
|
- **snippet `--archived` is a swap, not a union** — list returns _either_ active _or_ archived rows, never both. (Same for `--filter archived` on dashboard/collection.)
|
|
137
140
|
- **segment / measure.** `update` and `archive` require a non-blank `revision_message` (audit-logged); the CLI does not synthesize it on `update`. `archive` defaults to `"Archived via mb CLI"` — override with `--revision-message`. `definition` is a flat MBQL clause (→ `mbql`): segment = a filter, measure = exactly one aggregation.
|
|
138
|
-
- **timeline / timeline-event.** Timelines are collection-scoped event annotations for time-series charts: a timeline's events render only on time-series questions saved in the **same collection** (`collection_id`; null = root) — sub-collections do **not** inherit, and events never draw on dashboard cards, only in the question (and collection) view.
|
|
141
|
+
- **timeline / timeline-event.** Timelines are collection-scoped event annotations for time-series charts: a timeline's events render only on time-series questions saved in the **same collection** (`collection_id`; null = root) — sub-collections do **not** inherit, and events never draw on dashboard cards, only in the question (and collection) view. An event draws only when its `timestamp` falls inside the chart's displayed time range. Event `create` requires `timestamp` (ISO 8601), `timezone` (IANA name), `time_matters` (true = the time of day is significant, false = date-only), and `timeline_id` — the API never auto-creates a default timeline (that's UI-only). There is no `timeline-event list`; enumerate with `timeline events <id>` (`--archived` to include archived). Archiving a timeline cascades `archived` to its events; `delete` is a **hard** delete of the timeline and all its events — prefer `archive`.
|
|
139
142
|
- **collection `<ref>`** accepts four forms only — positive int, `root`, `trash`, or a 21-char entity_id; anything else is a client-side `ConfigError`. `collection items` pages the server endpoint, pulling only as far as the output cap can show — read `has_more`/`next_offset` to continue. `collection tree` is **JSON-only** (`--format text` is rejected). A transform collection needs `collection create --namespace transforms`.
|
|
140
143
|
- **setting set** parses the value as **strict JSON**: a string is `'"value"'` (inner quotes), booleans `true`/`false`, numbers bare. Wrong quoting silently errors — confirm with `setting get <key>` after. `setting get --json` works on every value type (wrapping bare-text responses into `{key, value}`).
|
|
141
144
|
- **search vs. list.** For plain enumeration of cards/dashboards/collections use the dedicated `… list` verbs; reach for `search --models <kind>` only for ranking against a query string or a cross-resource lookup.
|
|
142
145
|
- **transform.** Iterate with `transform update <id>`, never `delete` + `create` (keeps the row, `entity_id`, materialized table, and YAML filename — avoids `_2` suffixes and noisy git history). `transform run` needs `--wait` (or `--sync`, which also waits for the output table to register and returns `target_table_id`) or you get only `{run_id, final:null}`. (→ `transform`.)
|
|
143
146
|
- **setup is one-shot.** `mb setup` walks `/api/setup` for a **fresh** instance only — errors against an already-configured one. Mostly for bootstrapping local / e2e instances.
|
|
144
147
|
- **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).
|
|
145
|
-
- **library.** EE-only (`library` premium feature, v59+). The Library is a curated subtree (`library-data` "Data" + `library-metrics` "Metrics" under a `library` root): tables published to **Data** appear first in data pickers and rank up in search; metrics saved to **Metrics** are prioritized in nav, search, and the query builder — it's how you tell people (and agents)
|
|
148
|
+
- **library.** EE-only (`library` premium feature, v59+). The Library is a curated subtree (`library-data` "Data" + `library-metrics` "Metrics" under a `library` root): tables published to **Data** appear first in data pickers and rank up in search; metrics saved to **Metrics** are prioritized in nav, search, and the query builder — it's how you tell people (and agents) which to start from. `library get` shows the Library and its Data/Metrics collection ids; `library create` provisions it (idempotent). `library publish --table-ids/--db-ids/--schemas` publishes tables into Data — it **resolves the Data collection itself and creates the Library if absent**; each `--schemas` entry is `<db-id>:<schema>` (e.g. `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`). Good candidates are finished, analysis-ready tables — clean up via transforms first. Publishing does not put the Data collection in the git-sync scope: `mb git-sync add-collection <data-collection-id>` is what makes exports carry the published tables' metadata (see the `git-sync` skill).
|
|
146
149
|
- **query / uuid.** `mb query` is the ad-hoc MBQL surface (`--print-schema` → `--dry-run` → run); `mb uuid --count <n>` mints the `lib/uuid` values MBQL clauses need. Both live in `mbql`.
|
|
147
150
|
|
|
148
151
|
## Specialized skills (load on demand)
|
|
@@ -157,8 +160,8 @@ This file is enough for any single-command task. For anything deeper, load the r
|
|
|
157
160
|
- **`notification`** — scheduled delivery: question alerts (`mb alert`) and dashboard subscriptions (`mb subscription`). Choosing between them, the two schedule/recipient contracts, channel prerequisites, testing a send.
|
|
158
161
|
- **`transform`** — transform body JSON, create + run-with-wait, run inspection, tags, jobs.
|
|
159
162
|
- **`document`** — Metabase documents (TipTap body, embedding cards).
|
|
160
|
-
- **`git-sync`** — round-tripping content to/from a git remote.
|
|
161
|
-
- **`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", "go from raw data to a dashboard", "
|
|
163
|
+
- **`git-sync`** — round-tripping content to/from a git remote, and worktrees.
|
|
164
|
+
- **`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", "go from raw data to a dashboard", "set up analytics for X". It detects where the data is and routes to the right stage.
|
|
162
165
|
|
|
163
166
|
If a task spans more than one, load each. `mb skills list` enumerates everything on the installed version.
|
|
164
167
|
|
|
@@ -8,7 +8,7 @@ allowed-tools: Read, Write, Edit, Bash, AskUserQuestion
|
|
|
8
8
|
|
|
9
9
|
A dashboard starts as cards on a grid; it becomes an **app** when filters drive the cards, charts cross-filter each other, and clicks navigate. This skill owns both: the grid layout and the interactive layer.
|
|
10
10
|
|
|
11
|
-
**`core` owns the transport mechanics** — the whole-array replace semantics (editing `dashcards` or `parameters` replaces the entire set; omitted entries are deleted; new cards use negative ids), `update-dashcard` for a single safe patch vs. `update --body` for a full replace, and the `parameter-values` verb. Read it first (`mb skills get core`). **`visualization`** owns each card's chart and the full `click_behavior` key catalog.
|
|
11
|
+
**`core` owns the transport mechanics** — the whole-array replace semantics (editing `dashcards` or `parameters` replaces the entire set; omitted entries are deleted; every dashcard carries `card_id`, with `null` for virtual cards; new cards use negative ids), `update-dashcard` for a single safe patch vs. `update --body` for a full replace, and the `parameter-values` verb. Read it first (`mb skills get core`). **`visualization`** owns each card's chart and the full `click_behavior` key catalog.
|
|
12
12
|
|
|
13
13
|
Inspect before you wire: `mb dashboard get <id> --json` hydrates `parameters`, `dashcards`, and `tabs`; `mb dashboard cards <id>` lists just the dashcards.
|
|
14
14
|
|
|
@@ -123,7 +123,7 @@ Set the **driver** chart's whole-card click behavior to `crossfilter`, mapping t
|
|
|
123
123
|
- **Auto-connect / the missing map:** a filter that "does nothing" or "won't show" is almost always unmapped, or mapped only to cards on another tab.
|
|
124
124
|
- **Time-grouping parameters** (`temporal-unit`) bind only to a datetime column in the query's **last** stage — add one after a time-bucketed summary and it can't attach.
|
|
125
125
|
- **Required + default:** a `required: true` parameter with no `default` blocks its cards until a value is chosen; give it a `default` for expensive queries you don't want running unfiltered.
|
|
126
|
-
- **Whole-array replace:** never send a partial `parameters`/`dashcards` array to `update` — you'll delete what you omit. Use `update-dashcard` for a single-card change.
|
|
126
|
+
- **Whole-array replace:** never send a partial `parameters`/`dashcards` array to `update` — you'll delete what you omit. Include `card_id` on every dashcard (`null` for virtual cards). Use `update-dashcard` for a single-card change.
|
|
127
127
|
|
|
128
128
|
## Don't
|
|
129
129
|
|