@metabase/cli 0.3.1-alpha.support-worktrees.b634907 → 0.3.1-alpha.versioning.9ac5f50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/dist/{add-collection-CxzzDG4z.mjs → add-collection-Dmd-uNeU.mjs} +6 -10
  2. package/dist/{alert-CQ7Az16h.mjs → alert-D1u2MVZj.mjs} +7 -7
  3. package/dist/{alerts-DmwyyBfW.mjs → alerts-DcBjcfEE.mjs} +7 -8
  4. package/dist/{append-B0avMkvW.mjs → append-B9Htvmab.mjs} +5 -6
  5. package/dist/{archive-CMTHh4-w.mjs → archive-B660RguB.mjs} +4 -5
  6. package/dist/{archive-THcEfy9B.mjs → archive-BNivAYGr.mjs} +5 -6
  7. package/dist/{archive-DCyeRNfV.mjs → archive-BUoYMkxO.mjs} +4 -5
  8. package/dist/{archive-BZEu6UfT.mjs → archive-BVmFGFwG.mjs} +6 -7
  9. package/dist/archive-Bf014rFm.mjs +32 -0
  10. package/dist/{archive-DFofUIEC.mjs → archive-BmsZFOZY.mjs} +4 -5
  11. package/dist/archive-CNif6BKy.mjs +32 -0
  12. package/dist/{archive-BPSNe0Ul.mjs → archive-CgmidYZV.mjs} +4 -5
  13. package/dist/{archive-Cvrkz8F8.mjs → archive-CvU2z5192.mjs} +5 -6
  14. package/dist/{archive-BQ50OZ7y.mjs → archive-DhDQIKR_.mjs} +4 -5
  15. package/dist/{archive-BVblae-p.mjs → archive-bPdDITuY.mjs} +4 -5
  16. package/dist/{auth-BEEkuu4J.mjs → auth-CefYEPP5.mjs} +5 -5
  17. package/dist/{body-DxRSAMNC.mjs → body-C7m9q4cm.mjs} +3 -3
  18. package/dist/{branches-CmWc8NyL.mjs → branches-pz04OjF2.mjs} +4 -8
  19. package/dist/{cancel-DrQqmxvn.mjs → cancel-CNLnv19e.mjs} +4 -5
  20. package/dist/cancel-task-DbnxSh7U.mjs +25 -0
  21. package/dist/card-BRarvKYX.mjs +24 -0
  22. package/dist/{card-CrBGUkGQ.mjs → card-DZxRmver.mjs} +0 -1
  23. package/dist/{card-BEeafd4Y.mjs → card-zyUkr2nS.mjs} +1 -1
  24. package/dist/{cards-M_6X8wCI.mjs → cards-DtYlVoGP.mjs} +5 -6
  25. package/dist/cli.mjs +566 -170
  26. package/dist/{client-DYD8WZYy.mjs → client-Bv7Iwdvh.mjs} +285 -269
  27. package/dist/collection-CKeO8X7U.mjs +20 -0
  28. package/dist/{collection-CJHqsFKP.mjs → collection-DALwHnbz.mjs} +1 -1
  29. package/dist/{collection-BxE7OzcQ.mjs → collection-WFdBeyqa.mjs} +4 -7
  30. package/dist/{collection-namespace-CEoQ7G08.mjs → collection-namespace-CvT0TIZA.mjs} +2 -2
  31. package/dist/{content-translation-C8MlXPOF.mjs → content-translation-D7POzJJ6.mjs} +3 -3
  32. package/dist/{create-CoubLR5o.mjs → create-BEE8uvz2.mjs} +9 -6
  33. package/dist/{create-D0anrINz.mjs → create-Bh2j733n.mjs} +11 -16
  34. package/dist/{create-BupBEwR2.mjs → create-Bwg-5p08.mjs} +8 -13
  35. package/dist/{create-ByuJ6T4k.mjs → create-CGPle4nE.mjs} +7 -8
  36. package/dist/{create-hTc131aX.mjs → create-CGgPnb7L.mjs} +4 -5
  37. package/dist/{create-CY-SzM66.mjs → create-CLgalJUe.mjs} +12 -17
  38. package/dist/{create-C2XFfbjx.mjs → create-CN24yp_W.mjs} +6 -7
  39. package/dist/{create-BLWwN0uw.mjs → create-CuYGZ4gu2.mjs} +5 -6
  40. package/dist/{create-CJ7Am4Gc.mjs → create-DGHILnnk.mjs} +5 -6
  41. package/dist/{create-z-oMrlfT.mjs → create-DYd_o9BD.mjs} +5 -9
  42. package/dist/{create-BqpkCjx4.mjs → create-DhDREiiy.mjs} +4 -5
  43. package/dist/{create-myI6doga.mjs → create-Di4YvIbK.mjs} +5 -6
  44. package/dist/{create-ldrghMd1.mjs → create-DnqnjGGf.mjs} +4 -5
  45. package/dist/{create-C7iooS6W.mjs → create-Ds-DnSBe.mjs} +9 -15
  46. package/dist/{create-BA_tTDEk.mjs → create-JOXq0ULN.mjs} +5 -6
  47. package/dist/create-branch-DWcxC30N.mjs +31 -0
  48. package/dist/{csv-DBNzJiWK.mjs → csv-CUQvcCEk.mjs} +5 -6
  49. package/dist/{current-task-YzemU0Ic.mjs → current-task-D6P0eL21.mjs} +8 -16
  50. package/dist/{dashboard-B1mpfCq_.mjs → dashboard-BudI952R.mjs} +10 -10
  51. package/dist/{db-1tLH3nYI.mjs → db-C7UTd-6P.mjs} +7 -7
  52. package/dist/{delete-CD_-B4Kq.mjs → delete-DSxqbcFE.mjs} +5 -6
  53. package/dist/{delete-QNgBV6eS.mjs → delete-DbZZKcYj.mjs} +6 -11
  54. package/dist/{delete-DjAUp9mk.mjs → delete-Ds-zGh9C.mjs} +5 -6
  55. package/dist/{delete-eAUB7p-f.mjs → delete-Ud6iliGM.mjs} +6 -11
  56. package/dist/{delete-CpKH5ia4.mjs → delete-_IHffP-A.mjs} +5 -6
  57. package/dist/{delete-runtime-b2_ZMSjj.mjs → delete-runtime-BjHL1ryM.mjs} +1 -2
  58. package/dist/{delete-table-DamlxnSO.mjs → delete-table-DtXH6IN5.mjs} +6 -11
  59. package/dist/dependencies-CR1dlq-A.mjs +36 -0
  60. package/dist/dirty-CYxnOnh0.mjs +28 -0
  61. package/dist/document-BoILnE_1.mjs +19 -0
  62. package/dist/{download-C4v7u-AV.mjs → download-DPpmmYQe.mjs} +3 -7
  63. package/dist/{eid-CP35PdEF.mjs → eid-D-BbtWjt.mjs} +4 -6
  64. package/dist/{events-DmbzKIh_.mjs → events-CJEnn8WE.mjs} +5 -6
  65. package/dist/{export-i8D6laBG.mjs → export-BOgyuIOQ.mjs} +13 -29
  66. package/dist/{field-BKn9bt7I.mjs → field-CzHBOPER.mjs} +5 -5
  67. package/dist/{fields-8_p81BqN.mjs → fields-Bwgkrvus.mjs} +5 -6
  68. package/dist/get-B89DUSvw.mjs +31 -0
  69. package/dist/get-BL90QC64.mjs +36 -0
  70. package/dist/get-BLJSCw53.mjs +31 -0
  71. package/dist/{get-BBOfshz1.mjs → get-BOLwso0V.mjs} +6 -7
  72. package/dist/{get-BvW21ujw.mjs → get-BaPadzdM.mjs} +4 -5
  73. package/dist/{get-vvs0qzzM.mjs → get-BfVCLBqc.mjs} +4 -5
  74. package/dist/{get-B0g6VMBC.mjs → get-C1ZdOvMm.mjs} +4 -5
  75. package/dist/{get-N4dOaTsp.mjs → get-CLu4yzMp2.mjs} +5 -6
  76. package/dist/get-COwdtskS.mjs +27 -0
  77. package/dist/{get-CPTbySa7.mjs → get-CWfIiXwL.mjs} +4 -5
  78. package/dist/get-CqQ-pf0q.mjs +89 -0
  79. package/dist/{get-DnCE7K0y.mjs → get-CvIgxPXV.mjs} +5 -6
  80. package/dist/{get-vrccOMBk.mjs → get-D4OTJblo.mjs} +4 -5
  81. package/dist/{get-BbHPFNqr.mjs → get-D8lHwu4-.mjs} +4 -5
  82. package/dist/{get-CWf46UFu.mjs → get-DVi3a2nm.mjs} +6 -7
  83. package/dist/{get-DFkbi5L3.mjs → get-DgnYF7LR.mjs} +4 -5
  84. package/dist/{get-BHGgXqUq.mjs → get-DsKmZfM2.mjs} +4 -5
  85. package/dist/{get-CAzSP-7o.mjs → get-DyyPiiaB.mjs} +4 -5
  86. package/dist/{get-Bds6Izxk.mjs → get-Eqq13YY-.mjs} +4 -5
  87. package/dist/{get-run-4Ng8_awa.mjs → get-run-Iya0Yw9s.mjs} +6 -7
  88. package/dist/{git-sync-DLzJrdMi.mjs → git-sync-BDnxPrqU.mjs} +3 -22
  89. package/dist/git-sync-CdN0Maun.mjs +28 -0
  90. package/dist/{git-sync-LQIVMNxO.mjs → git-sync-DxD_ng48.mjs} +2 -31
  91. package/dist/{group-YN6jj2AN.mjs → group-CmVCLBDz.mjs} +3 -3
  92. package/dist/{has-remote-changes-BXPGI9xG.mjs → has-remote-changes-DfJUMP8F.mjs} +7 -18
  93. package/dist/{import-BoxOkA-G.mjs → import-FEAx-Y5A.mjs} +12 -32
  94. package/dist/{input-DH9i67x_.mjs → input-DFZ_qGW_.mjs} +1 -1
  95. package/dist/is-dirty-BsYjBSXG.mjs +32 -0
  96. package/dist/{items-Cv6iAzrI.mjs → items-D4rstE12.mjs} +10 -18
  97. package/dist/{key-BEhqIzIQ.mjs → key-BmWundO3.mjs} +1 -1
  98. package/dist/{library-fhVn1KDC.mjs → library-CmctxHjv.mjs} +1 -1
  99. package/dist/library-DXB8sm4r.mjs +81 -0
  100. package/dist/{library-CRaOhJnj.mjs → library-uzyHWBap.mjs} +5 -5
  101. package/dist/{list-DOaWCx8S.mjs → list-1DkkU82x.mjs} +17 -25
  102. package/dist/{list-BLJkJp5a.mjs → list-B7tqNV8B.mjs} +4 -5
  103. package/dist/{list-WSJLnunb.mjs → list-BRpPbvyS.mjs} +4 -5
  104. package/dist/{list-BBp9XjYs.mjs → list-BXL8HFr_.mjs} +4 -5
  105. package/dist/{list-L2U1l6R4.mjs → list-Bjj0z5BS.mjs} +6 -7
  106. package/dist/{list-DhrapAcy.mjs → list-BmMi_wPD.mjs} +5 -6
  107. package/dist/list-CC1M_n6Z.mjs +28 -0
  108. package/dist/list-CQy0z7f9.mjs +28 -0
  109. package/dist/{list-BwkfWtP2.mjs → list-D_zvX0ms.mjs} +4 -5
  110. package/dist/{list--2T-GUEF.mjs → list-DeNGm9G4.mjs} +5 -6
  111. package/dist/list-Dgm6TkqR.mjs +38 -0
  112. package/dist/list-DoTiQc3D.mjs +36 -0
  113. package/dist/{list-C8J3n8B8.mjs → list-DrS3ePsv.mjs} +4 -5
  114. package/dist/list-bN0RC14-.mjs +59 -0
  115. package/dist/{list-oAAgU5uE.mjs → list-ndIl9XqV.mjs} +11 -18
  116. package/dist/{list-tutXEQRW.mjs → list-sQcA4g05.mjs} +5 -6
  117. package/dist/{list-9uvk9dIA.mjs → list-squb_ioH.mjs} +4 -5
  118. package/dist/{list-DOZNpX4b.mjs → list-xMfCeuZc.mjs} +5 -6
  119. package/dist/{login-DqWRF3Og.mjs → login-D_1-zE4A.mjs} +15 -13
  120. package/dist/{logout-ChCz1bkf.mjs → logout-DPi2q1Wu.mjs} +3 -5
  121. package/dist/{measure-C5dIdFj1.mjs → measure-CdA8Nl3Z.mjs} +6 -6
  122. package/dist/{notification-DVrLkjFT.mjs → notification-Fcq1fIPw.mjs} +1 -1
  123. package/dist/{parameter-values-Dy4cBs5y.mjs → parameter-values-C6dj6I4g.mjs} +4 -6
  124. package/dist/{parse-enum-D0Jfm_Bz.mjs → parse-enum-B1t8S194.mjs} +1 -1
  125. package/dist/{parse-id-DDCn3VXx.mjs → parse-id-DR8aUSdL.mjs} +1 -1
  126. package/dist/{parse-ref-Wv21Roup.mjs → parse-ref-BJ_Q0tNW.mjs} +3 -7
  127. package/dist/{path-IYhuzjQV.mjs → path-B96DI8u2.mjs} +5 -6
  128. package/dist/{poll-75SvT7Zv.mjs → poll-By46YQ5J.mjs} +2 -2
  129. package/dist/{preflight-HLUVr2Yf.mjs → preflight-Bl1oitm8.mjs} +3 -4
  130. package/dist/{process-DBOOrmET.mjs → process-CcQM4qPv.mjs} +1 -1
  131. package/dist/{publish-CMkCSt8i.mjs → publish-BKJYvxif.mjs} +9 -10
  132. package/dist/{pulse-a-83M4DV.mjs → pulse-DhG6I9mI.mjs} +1 -1
  133. package/dist/{query-tWQAV9pb.mjs → query-BKSM-pbi.mjs} +9 -11
  134. package/dist/{query-Bka77J62.mjs → query-qBHjZQc_.mjs} +7 -10
  135. package/dist/{query-result-E4Q-Gra6.mjs → query-result-DBDwk8TS.mjs} +1 -1
  136. package/dist/{remove-collection-BV9wRQZD.mjs → remove-collection-BWFW7Rn6.mjs} +6 -10
  137. package/dist/{render-DHjCcUXn.mjs → render-DmykmrFB.mjs} +11 -8
  138. package/dist/{replace-mt47dlRV.mjs → replace-BmAqD3zY.mjs} +5 -6
  139. package/dist/{rescan-values-6cRjcpTs.mjs → rescan-values-BrCLrihF.mjs} +4 -5
  140. package/dist/{run-DI_pDxji.mjs → run-CtbzjDKY.mjs} +6 -7
  141. package/dist/{run-BmGmC-GQ.mjs → run-q5Y44Fxj.mjs} +26 -15
  142. package/dist/{runs-9Fu0mug5.mjs → runs-JFlbezkQ.mjs} +7 -8
  143. package/dist/{runtime-CNAZ_FuR.mjs → runtime-BQiGgbgZ.mjs} +851 -361
  144. package/dist/{schema-tables-CLG0mtQb.mjs → schema-tables-Bzx2ShyE.mjs} +5 -6
  145. package/dist/{schemas-Cm5NWy59.mjs → schemas-ww5mU2AS.mjs} +5 -6
  146. package/dist/{search-CljYyf2F.mjs → search-J4RwCof-.mjs} +9 -15
  147. package/dist/{segment-IRzlQggt.mjs → segment-XXTjU0eG.mjs} +6 -6
  148. package/dist/{selectors-D4iOP5uB.mjs → selectors-BAAZMi43.mjs} +3 -3
  149. package/dist/{send-D7DBnQbu.mjs → send-BmpDlw9O.mjs} +4 -5
  150. package/dist/{set-DKN8fuC6.mjs → set-DUWrSza9.mjs} +5 -6
  151. package/dist/{set-active-CkE0Eiqh.mjs → set-active-BiUlbNI5.mjs} +5 -6
  152. package/dist/{setting-CN4l8N-b.mjs → setting-B1KBQN3M.mjs} +4 -4
  153. package/dist/{setup-BpTptmdO.mjs → setup-CVaNVwOd.mjs} +4 -5
  154. package/dist/{signal-CMd0EFUa.mjs → signal-GhGmuHfx.mjs} +11 -2
  155. package/dist/{list-CtZAu4im.mjs → skill-list-DTnDhnL5.mjs} +17 -47
  156. package/dist/{skills-BSAiLI3Z.mjs → skills-BWrAlj9l.mjs} +3 -3
  157. package/dist/{skills-hVKSOCUf.mjs → skills-DkDsSH5F.mjs} +102 -14
  158. package/dist/snippet-CG75L2DS.mjs +19 -0
  159. package/dist/{snippet-BxgvQ09J.mjs → snippet-CyKAgIZl.mjs} +2 -5
  160. package/dist/{snippet-DecHB4Dn.mjs → snippet-oJLaYW9V.mjs} +1 -1
  161. package/dist/{stash-DJs6A6BA.mjs → stash-DMm8YF8V.mjs} +7 -12
  162. package/dist/{status-N_2EaWb7.mjs → status-BzEQjQ_t.mjs} +15 -23
  163. package/dist/{status-DtwBDRtc.mjs → status-ClWsQD6v.mjs} +22 -48
  164. package/dist/{subscription-BnGDp1oy.mjs → subscription-CdFn2hre.mjs} +6 -6
  165. package/dist/{subscriptions-BfFwV__x.mjs → subscriptions-DBda1pE5.mjs} +7 -8
  166. package/dist/{summary-CHiq-4mz.mjs → summary-B4GPiuqD.mjs} +4 -5
  167. package/dist/{sync-schema-DhnM-rpm.mjs → sync-schema-DsIM5g2U.mjs} +5 -6
  168. package/dist/{sync-task-G1K47Nvn.mjs → sync-task-BACcrs0i.mjs} +1 -1
  169. package/dist/{table-BQaiCSNS.mjs → table-D4Alrrwh.mjs} +5 -5
  170. package/dist/timeline-DmM0BuX8.mjs +21 -0
  171. package/dist/{timeline-event-B7H1y8s8.mjs → timeline-event-DWIh3Tdt.mjs} +6 -6
  172. package/dist/transform-BcV_XlSX.mjs +28 -0
  173. package/dist/{transform-CiDOJGBW.mjs → transform-Bk0D0nIs.mjs} +2 -2
  174. package/dist/{transform-BvOEn41C.mjs → transform-DpuG-ON3.mjs} +25 -7
  175. package/dist/{transform-job-50GZHhKH.mjs → transform-job-AaMZRxAq.mjs} +1 -1
  176. package/dist/{transform-job-DRrK28IH.mjs → transform-job-CCguL6LP.mjs} +41 -4
  177. package/dist/transform-job-CjtwBGoM.mjs +22 -0
  178. package/dist/{transform-tag-jBVd6wXd.mjs → transform-tag-CcElGp3C.mjs} +4 -9
  179. package/dist/{transform-tag-Dip51YBa.mjs → transform-tag-DJ3_bksm.mjs} +5 -5
  180. package/dist/{transform-tag-DiXWRCQG.mjs → transform-tag-Dmb4u3-Q.mjs} +1 -1
  181. package/dist/{transforms-C-jYgS6z.mjs → transforms-Dg2MfB2a.mjs} +7 -8
  182. package/dist/tree-BQL0f7YX.mjs +26 -0
  183. package/dist/{unpublish-BokbnLng.mjs → unpublish-DfSvb_Rs.mjs} +4 -8
  184. package/dist/{update-D9OTkZhw.mjs → update-B-hRR8gW.mjs} +5 -6
  185. package/dist/{update-CpLEEbiJ.mjs → update-BCgAyfj_.mjs} +8 -9
  186. package/dist/{update-BCGE5UYC.mjs → update-Bhmli02m.mjs} +6 -7
  187. package/dist/{update-rkbpH0lF.mjs → update-BxIyFtrX.mjs} +5 -6
  188. package/dist/{update-AZSXMJqu.mjs → update-CDo0Orvu.mjs} +9 -15
  189. package/dist/{update-B9DcRSBQ.mjs → update-CKoBDTL7.mjs} +13 -19
  190. package/dist/{update-CfQoYVTc.mjs → update-CiYxcf8M.mjs} +7 -8
  191. package/dist/{update-e7lyQPxq.mjs → update-Cr5zHb0D.mjs} +9 -15
  192. package/dist/{update-CPEU8ZEu.mjs → update-CtDHMxW8.mjs} +6 -7
  193. package/dist/{update-BBQInyiJ.mjs → update-D1QdfpKR.mjs} +6 -7
  194. package/dist/{update-C4PbAYgW.mjs → update-D4qdTlLF.mjs} +5 -6
  195. package/dist/{update-BRXKLeJH.mjs → update-DBGaJDsj.mjs} +5 -6
  196. package/dist/{update-BErxnZrj.mjs → update-Izqip6jY.mjs} +6 -7
  197. package/dist/{update-Bc8s1TL1.mjs → update-NZhIjTCf.mjs} +5 -6
  198. package/dist/{update-dashcard-St-dGcE3.mjs → update-dashcard-D5b971AO.mjs} +5 -6
  199. package/dist/{update-CKL2FtoX.mjs → update-sYLQIUgh.mjs} +6 -7
  200. package/dist/{upgrade-CUoRHfVg.mjs → upgrade-CD1xtsIv.mjs} +6 -9
  201. package/dist/{upload-CD555ui1.mjs → upload-BUd3MG90.mjs} +2 -2
  202. package/dist/upload-DzGTlldn.mjs +13 -0
  203. package/dist/{upload-BPd1Uzxc.mjs → upload-akKFxpVA.mjs} +4 -8
  204. package/dist/{uuid-CFN8LIkP.mjs → uuid-oVdJ62eA.mjs} +3 -5
  205. package/dist/{validate-BWchyW0V.mjs → validate-CWd6l6KZ.mjs} +1 -1
  206. package/dist/{validate-query-Chc43ezW.mjs → validate-query-Boi8-cAP.mjs} +2 -3
  207. package/dist/{values-BL_U-Zdw.mjs → values-DLwZl-P8.mjs} +4 -5
  208. package/dist/{verify-DnBaRmkI.mjs → verify-CH9Tw8yv.mjs} +3 -18
  209. package/dist/{wait-flags-DzytMEG8.mjs → wait-flags-DiQ_kRjZ.mjs} +3 -3
  210. package/dist/{wait-mPoOZxrw.mjs → wait-rfTdQWdi.mjs} +9 -17
  211. package/dist/{window-DSb1tqSe.mjs → window-BkvrP0gB.mjs} +1 -1
  212. package/package.json +1 -1
  213. package/skill-data/core/SKILL.md +24 -16
  214. package/skill-data/data-workflow/references/building-clean-tables.md +6 -2
  215. package/skill-data/data-workflow/references/reusable-definitions.md +11 -3
  216. package/skill-data/document/SKILL.md +4 -1
  217. package/skill-data/git-sync/SKILL.md +6 -91
  218. package/skill-data/mbql/SKILL.md +1 -1
  219. package/skill-data/mbql/references/operators.md +20 -15
  220. package/skill-data/metadata/SKILL.md +1 -1
  221. package/skill-data/metadata/references/semantic-types.md +7 -1
  222. package/skill-data/native-sql/references/template-tags.md +6 -2
  223. package/skill-data/notification/SKILL.md +7 -1
  224. package/skill-data/transform/SKILL.md +13 -11
  225. package/skill-data/visualization/SKILL.md +11 -3
  226. package/skill-data/visualization/references/settings.md +6 -4
  227. package/skills/metabase-cli/SKILL.md +1 -1
  228. package/dist/archive-CqOKKrb2.mjs +0 -38
  229. package/dist/archive-DCjdICg7.mjs +0 -38
  230. package/dist/branch-BSeGrtP7.mjs +0 -28
  231. package/dist/cancel-task-BMQXtjW5.mjs +0 -34
  232. package/dist/card-RlzLDB2z.mjs +0 -24
  233. package/dist/collection-Bhe20ckt.mjs +0 -20
  234. package/dist/create-DwrhcI8r2.mjs +0 -144
  235. package/dist/create-branch-B3BMpF1g.mjs +0 -49
  236. package/dist/delete-D_OgiI4v.mjs +0 -86
  237. package/dist/dependencies-DEx0BsZ3.mjs +0 -41
  238. package/dist/dirty-dC1-Ud0G.mjs +0 -40
  239. package/dist/document-DOJbBWLF.mjs +0 -19
  240. package/dist/export-preflight-B5MvYhm3.mjs +0 -67
  241. package/dist/get-CNEQK0-9.mjs +0 -81
  242. package/dist/get-Cfagmy1i.mjs +0 -42
  243. package/dist/get-DvLuY5Xu.mjs +0 -38
  244. package/dist/get-DwdMvWXU.mjs +0 -44
  245. package/dist/get-jV8G90Zy.mjs +0 -42
  246. package/dist/get-mGEv-kag.mjs +0 -33
  247. package/dist/git-sync-DjoaNmRM.mjs +0 -29
  248. package/dist/is-dirty-Cwxq4_gd.mjs +0 -44
  249. package/dist/library-Cfw6eF35.mjs +0 -19
  250. package/dist/list-5Iojbr_p.mjs +0 -37
  251. package/dist/list-BD4onDqO.mjs +0 -37
  252. package/dist/list-C2yL7-CH.mjs +0 -45
  253. package/dist/list-CbbKip6U.mjs +0 -32
  254. package/dist/list-Dg2XeDON.mjs +0 -47
  255. package/dist/network-error-D6CiOEBw.mjs +0 -431
  256. package/dist/pin-BuZ_kg-u.mjs +0 -62
  257. package/dist/predicates-Bkm2IoeX.mjs +0 -170
  258. package/dist/scope-DsGuWG5w.mjs +0 -11
  259. package/dist/snippet-LlHz3FdJ.mjs +0 -19
  260. package/dist/timeline-C2VW0Ph6.mjs +0 -21
  261. package/dist/transform-DAf0Y02t.mjs +0 -28
  262. package/dist/transform-job-ntiT5Rrh.mjs +0 -22
  263. package/dist/tree-DtyJhD54.mjs +0 -36
  264. package/dist/unpin-DxbXmLtW.mjs +0 -45
  265. package/dist/upload-Dc3QLhZw.mjs +0 -13
  266. package/dist/worktree-ChdDlG3Q.mjs +0 -25
  267. package/dist/worktree-DC0kTxxQ.mjs +0 -20
  268. package/dist/worktree-xAro1xAB.mjs +0 -24
@@ -106,21 +106,26 @@ Units (truncation only): `millisecond`, `second`, `minute`, `hour`, `day`, `week
106
106
 
107
107
  A stage's `aggregation` is a list of aggregation clauses.
108
108
 
109
- | Op | Args | Notes |
110
- | ----------------------- | -------------------------- | -------------------------------- |
111
- | `count` | none, or 1 expression | with arg: count non-NULL |
112
- | `sum` `avg` `min` `max` | 1 numeric/orderable | |
113
- | `distinct` | 1 expression | count of distinct values |
114
- | `cum-count` | none or 1 expression | running count |
115
- | `cum-sum` | 1 numeric | running sum |
116
- | `stddev` `var` `median` | 1 numeric | |
117
- | `percentile` | numeric, p (0.0–1.0) | |
118
- | `count-where` | 1 boolean clause | |
119
- | `sum-where` | numeric, boolean clause | |
120
- | `distinct-where` | expression, boolean clause | |
121
- | `share` | 1 boolean clause | proportion 0–1 |
122
- | `metric` | metric id | reference a saved metric card |
123
- | `measure` | measure id | reference a saved measure (v59+) |
109
+ | Op | Args | Notes |
110
+ | ----------------------- | -------------------------- | ----------------------------- |
111
+ | `count` | none, or 1 expression | with arg: count non-NULL |
112
+ | `sum` `avg` `min` `max` | 1 numeric/orderable | |
113
+ | `distinct` | 1 expression | count of distinct values |
114
+ | `cum-count` | none or 1 expression | running count |
115
+ | `cum-sum` | 1 numeric | running sum |
116
+ | `stddev` `var` `median` | 1 numeric | |
117
+ | `percentile` | numeric, p (0.0–1.0) | |
118
+ | `count-where` | 1 boolean clause | |
119
+ | `sum-where` | numeric, boolean clause | |
120
+ | `distinct-where` | expression, boolean clause | |
121
+ | `share` | 1 boolean clause | proportion 0–1 |
122
+ | `metric` | metric id | reference a saved metric card |
123
+
124
+ <!-- requires: measures -->
125
+
126
+ `measure` takes a measure id and references a saved measure.
127
+
128
+ <!-- /requires -->
124
129
 
125
130
  ```json
126
131
  ["count", {…}]
@@ -43,7 +43,7 @@ mb field update 1711 --body '{"semantic_type":"type/FK","fk_target_field_id":168
43
43
  - Queries can pull columns from the related table with no explicit join — `["field", {"source-field": 1711}, 1682]` in MBQL (see `mbql`).
44
44
  - Dashboard **linked filters** become possible (a State filter narrowing a City filter). **Linked filters read only these table-metadata FKs** — never a join you wrote inside a saved question — which is why a linked filter that "shows values it shouldn't" almost always means the FK isn't set in metadata. (See `dashboard`.)
45
45
 
46
- Removing the `type/FK` semantic type auto-clears `fk_target_field_id`. Point a FK only at a field in the **same database** — v60+ rejects a cross-database target; v58–v59 accept it silently and leave a broken relationship.
46
+ Removing the `type/FK` semantic type auto-clears `fk_target_field_id`. Point a FK only at a field in the **same database** — a cross-database target is invalid and never resolves to a relationship.
47
47
 
48
48
  ## Semantic types are labels, not casts
49
49
 
@@ -71,7 +71,13 @@ Everything else on a field/table (physical `name`, `base_type`, `effective_type`
71
71
  `display_name` · `description` · `caveats` · `points_of_interest` · `semantic_type` · `coercion_strategy` · `fk_target_field_id` · `visibility_type` · `has_field_values` · `settings` · `nfc_path` · `json_unfolding`
72
72
 
73
73
  **`PUT /api/table/:id` (`mb table update`)**
74
- `display_name` · `description` · `visibility_type` · `field_order` (`database` / `alphabetical` / `custom` / `smart`) · `entity_type` · `caveats` · `points_of_interest` · `show_in_getting_started` · `owner_user_id` / `owner_email` (ownership) · `data_layer` / `data_authority` / `data_source` (data-governance tiers) · `collection_id` (v62+)
74
+ `display_name` · `description` · `visibility_type` · `field_order` (`database` / `alphabetical` / `custom` / `smart`) · `entity_type` · `caveats` · `points_of_interest` · `show_in_getting_started` · `owner_user_id` / `owner_email` (ownership) · `data_layer` / `data_authority` / `data_source` (data-governance tiers)
75
+
76
+ <!-- requires: library -->
77
+
78
+ · `collection_id` — the Library **Data** collection a published table sits in (`mb library publish` sets it; see `core`)
79
+
80
+ <!-- /requires -->
75
81
 
76
82
  ## Coercion strategies (common)
77
83
 
@@ -86,9 +86,13 @@ SQL: `{{snippet: Active Rows}}`. Create/manage the fragment with `mb snippet` (`
86
86
 
87
87
  SQL: `{{#42}}` or `{{#42-slug}}`, used where a table/subquery goes (`FROM {{#42}}`, `WITH x AS {{#42}}`). Runs with the referenced card's own defaults; no user value.
88
88
 
89
- ### Source table — `table` (v59+)
89
+ <!-- requires: nativeTableTemplateTag -->
90
90
 
91
- A niche v59+ type that references a warehouse table by id (`{type: "table", table-id: <id>}`, optional `source-filters`) where a table/subquery goes — analogous to a card reference but pointing at a raw table. Absent on v0.58. Reach for a card reference (`card`) unless you specifically need a bare-table source tag.
91
+ ### Source table — `table`
92
+
93
+ A niche type that references a warehouse table by id (`{type: "table", table-id: <id>}`, optional `source-filters`) where a table/subquery goes — analogous to a card reference but pointing at a raw table. Reach for a card reference (`card`) unless you specifically need a bare-table source tag.
94
+
95
+ <!-- /requires -->
92
96
 
93
97
  ### Temporal unit — `temporal-unit`
94
98
 
@@ -110,7 +110,13 @@ An alert body has exactly three parts:
110
110
 
111
111
  Recipients are `{"email": "a@b.com"}` for an external address or `{"id": <user-id>}` for a Metabase user. A Slack channel is **not** a recipient — it goes in `details`: `{"channel_type": "slack", "details": {"channel": "#general"}, …}`.
112
112
 
113
- **`skip_if_empty: true`** suppresses the send when the dashboard's questions return no rows — the way to build a "only tell me when something happened" dashboard report. **`parameters`** sets filter values for this subscription only, so one dashboard can feed several audiences a different slice (Pro/Enterprise). Its entries are dashboard parameter values — the parameter `id`s come from `mb dashboard get <id> --fields parameters --json` (see the `dashboard` skill).
113
+ **`skip_if_empty: true`** suppresses the send when the dashboard's questions return no rows — the way to build a "only tell me when something happened" dashboard report.
114
+
115
+ <!-- requires: dashboardSubscriptionFilters -->
116
+
117
+ **`parameters`** sets filter values for this subscription only, so one dashboard can feed several audiences a different slice. Its entries are dashboard parameter values — the parameter `id`s come from `mb dashboard get <id> --fields parameters --json` (see the `dashboard` skill).
118
+
119
+ <!-- /requires -->
114
120
 
115
121
  `mb subscription list --archived` is a **swap, not a union** — it returns archived subscriptions _instead of_ active ones, never both. `mb dashboard subscriptions <id>` is the list scoped to one dashboard. `mb subscription archive <id>` also disables every channel on it, so restoring takes two steps: `update --body '{"archived":false}'`, then re-send the `channels` array with `enabled: true`.
116
122
 
@@ -2,6 +2,7 @@
2
2
  name: transform
3
3
  description: Author and run Metabase transforms via `mb` — body shape (native SQL or structured MBQL), create + run-with-wait, run inspection, dependencies, cancel, the `update`-vs-recreate iteration rule, the writable-keys-only PATCH contract, plus transform tags and tag-driven transform-job schedules. Load when the user touches transforms — "create a transform", "run a transform", "fix a failing transform", "list transform runs", "cancel a running transform", "manage transform tags", "run a transform job", or anything `mb transform …` / `mb transform-job …` / `mb transform-tag …`.
4
4
  allowed-tools: Read, Write, Edit, Bash, AskUserQuestion
5
+ requires: [transforms]
5
6
  ---
6
7
 
7
8
  # Transforms
@@ -48,7 +49,7 @@ mb transform run "$TRANSFORM_ID" --wait --profile <name> --json
48
49
  - `--wait` polls until status is `succeeded` or `failed`. Without it you get only `{message: "Transform run started", run_id, final: null}` and must poll yourself — don't put bare `transform run` in a tight loop; let `--wait` do the polling.
49
50
  - `--sync` implies `--wait`, then waits until the run registers its output table (the run registers it itself — no `db sync-schema` needed), adding `target_table_id` to the envelope. Use it when you'll build MBQL on the output (see "Inspect").
50
51
  - The `--json` envelope is shape-stable: `{message, run_id, final}` (plus `target_table_id` under `--sync` — a number, or `null` if the table didn't register before the timeout). `final` is `null` when `--wait` is omitted or the run never started, otherwise a full `TransformRun` with `status` and `message`. On a failed run (`final.status` ∈ {`failed`, `timeout`, `canceled`}) the CLI exits 1 and writes a one-line `transform run <id> failed` to stderr; the failure detail lives only in `final.message` on stdout, so `jq -r '.final.message'` is where to look.
51
- - `transform create --json` returns the agent-facing compact projection: `{id, name, description, source_type, target: {type, database, schema, name}, target_db_id, worktree_id}`. Read `target.schema`/`target.name` directly off it — no follow-up `transform get`.
52
+ - `transform create --json` returns the agent-facing compact projection: `{id, name, description, source_type, target: {type, database, schema, name}, target_db_id}`. Read `target.schema`/`target.name` directly off it — no follow-up `transform get`.
52
53
  - If a transform with the same `name` already has a YAML representation on disk under the configured remote-sync repo, `create` mints a `_2` suffix on the exported filename (the new transform gets a fresh `entity_id`; the prior one isn't touched). For "iterate on the same concept", prefer `transform update <id>` — see "Iterating on a failing transform".
53
54
  - **`collection_id` only accepts a collection in the `:transforms` namespace.** Transforms aren't filed next to cards and dashboards — a normal analytics collection id fails create/update with `collection_id: A Transform can only go in Collections in the :transforms namespace.` Omit `collection_id` to leave the transform uncollected (the common case), or provision one with `mb collection create --body '{"name":"…"}' --namespace transforms --json` (see `core`) and pass the returned `id`. Cards and dashboards you build **on top of** the output table go in ordinary collections — so "put the transform and its dashboard in collection X" means _X holds the dashboard + cards; the transform stays in the transforms namespace._
54
55
 
@@ -67,18 +68,10 @@ TABLE_ID=$(mb transform run <id> --sync --profile <name> --json | jq -r '.target
67
68
  mb table get "$TABLE_ID" --include fields --profile <name> --json # field ids for MBQL
68
69
  ```
69
70
 
70
- On `target_table_id: null` (still syncing when the poll timed out; exit 0) re-poll `mb transform get <id> --full --json` until the `target_table_id` / `table` linkage lands.
71
+ On `target_table_id: null` (still syncing when the poll timed out; exit 0) re-poll `mb transform get <id> --json` until `target_table_id` is a number.
71
72
 
72
73
  Columns and types are inferred from the result set; change the SELECT shape and the next run fails on a column mismatch — drop the table first (`transform delete-table <id>`). A changed shape also needs a re-run with `--sync` before MBQL sees the new/renamed columns.
73
74
 
74
- ## Editing transforms safely in a worktree
75
-
76
- A **worktree** is an isolated checkout of one git branch's content inside the same instance — the way to build a chain of transforms for PR review without touching production transforms or their tables. The lifecycle (create → pin → export-preflight → export → PR → delete) lives in the `git-sync` skill, section "Worktrees": **`mb skills get git-sync`**. What matters while authoring:
77
-
78
- - **`worktree_id` says where a transform lives.** `transform get` and `transform list` carry it: an integer for a worktree's transform, `null` for a main-app one. Read it before editing anything you did not create in this session — under a scope, `update` / `delete` / `delete-table` of a main-app transform is refused with `transform <id> is not in worktree <n> (<branch>); refusing to touch main-app content`.
79
- - **The scope is implicit once the profile is pinned.** With `--worktree <id|branch>`, `MB_WORKTREE`, or a pin in force, `transform list` shows only that worktree's transforms and `transform create` files what it creates into it. Without a scope both address the main app, whose listing excludes every worktree's rows.
80
- - **`transform run` is refused under a scope**, and the server rejects worktree runs anyway: `transform run is not available inside a worktree (…); it changes main-app content.` The create → run → fix loop therefore does not close inside a worktree. Validate the query with `--dry-run` (see `mbql`) before creating, iterate the body with `transform update`, and run it in the main app once the branch is merged and imported. Don't unpin, don't switch to another profile, and don't stand in a run with `mb query` — tell the user the run waits for the merge.
81
-
82
75
  ## Inspect runs and cancel an in-flight run
83
76
 
84
77
  ```bash
@@ -206,7 +199,16 @@ Key verbs (`mb transform-job --help` for the full list):
206
199
  mb transform-job transforms <id> --profile <name> --json # preview which transforms this job resolves to (by tag)
207
200
  mb transform-job run <id> --profile <name> --json # trigger a job now; runs all its tagged transforms
208
201
  mb transform-job run <id> --force-refresh --profile <name> --json # also re-run dependencies that are already fresh
202
+ ```
203
+
204
+ <!-- requires: transformJobActivation -->
205
+
206
+ ```bash
209
207
  mb transform-job set-active false --profile <name> --json # disable every job at once (true re-enables); admin only
210
208
  ```
211
209
 
212
- `transform-job run` is fire-and-forget — the server returns `{message, job_run_id}` immediately, with no per-job-run polling (no `--wait`). Most ad-hoc agent work is one-off `transform run`, not job authoring.
210
+ <!-- /requires -->
211
+
212
+ Every job row carries `active`; it is `null` on a server that cannot switch jobs off, where every job runs on schedule.
213
+
214
+ `transform-job run` is fire-and-forget — it returns `{message, started, run_id}` immediately (both `null` when the server does not number job runs: the request was accepted and whether a run started is unsaid), with no per-job-run polling (no `--wait`). Most ad-hoc agent work is one-off `transform run`, not job authoring.
@@ -27,7 +27,10 @@ Decide which relationship in the data matters most, then pick the chart. The sha
27
27
  - **Compare a measure across categories** → `bar` (vertical). Use `row` (horizontal bar) when labels are long or there are many categories. Sort by value unless the dimension has a natural order.
28
28
  - **Change over time / trend** → `line` for a continuous series; `bar`/`area` for a few discrete periods. Two measures on unlike scales → `combo` (line + bar, dual-axis) — only when the metrics are genuinely related.
29
29
  - **Part-to-whole, one snapshot** → `pie`, but only for a meaningful whole with **≤5 slices**; beyond that use a sorted `bar`/`row`. Composition over time → stacked `area`/`bar`.
30
- - **Distribution / spread / outliers** → a `bar` histogram (bin the measure — see `mbql` binning); on **v59+** servers `boxplot` compares several groups' spread directly.
30
+ - **Distribution / spread / outliers** → a `bar` histogram (bin the measure — see `mbql` binning).
31
+ <!-- requires: boxplotDisplay -->
32
+ - **Spread across several groups** → `boxplot` compares the groups' distributions directly.
33
+ <!-- /requires -->
31
34
  - **Correlation between two measures** → `scatter` (a third measure → bubble size).
32
35
  - **Sequential additive contributions** (start → +/− steps → total) → `waterfall`.
33
36
  - **Stage drop-off in an ordered, cumulative funnel** → `funnel`.
@@ -35,7 +38,7 @@ Decide which relationship in the data matters most, then pick the chart. The sha
35
38
  - **Geographic** → `map`: region/choropleth (a region dimension + a measure), pin (lat + long), or grid/heat (coordinates + measure).
36
39
  - **Precise values, many columns, mixed types, or no chart fits** → `table`; `pivot` for a cross-tab of two dimensions; `object` for a single record's detail.
37
40
 
38
- Valid `display` values — the registered visualizations: `table`, `bar`, `line`, `area`, `row`, `pie`, `scalar`, `smartscalar`, `combo`, `pivot`, `funnel`, `map`, `scatter`, `waterfall`, `progress`, `gauge`, `object`, `sankey`. The API types `display` as a plain string and accepts any value — it renders an unknown one as nothing. (`boxplot` is registered only on **v59+** servers — older ones render it blank; use a `bar` histogram for distributions instead. `scalar` **is** the "Number" viz — `display: number` is a legacy serialization alias, not a registered visualization; use `scalar`. `list` exists but is hidden — don't pick it. `heading`/`text`/`link`/`iframe`/`action` are dashcard virtuals, not standalone cards — see references.) A typo like `bargraph`/`linechart` is accepted and renders blank — the most common "why is my chart blank" cause.
41
+ Valid `display` values — the registered visualizations: `table`, `bar`, `line`, `area`, `row`, `pie`, `scalar`, `smartscalar`, `combo`, `pivot`, `funnel`, `map`, `scatter`, `waterfall`, `progress`, `gauge`, `object`, `sankey`. The API types `display` as a plain string and accepts any value — it renders an unknown one as nothing. (`scalar` **is** the "Number" viz — `display: number` is a legacy serialization alias, not a registered visualization; use `scalar`. `list` exists but is hidden — don't pick it. `heading`/`text`/`link`/`iframe`/`action` are dashcard virtuals, not standalone cards — see references.) A typo like `bargraph`/`linechart` is accepted and renders blank — the most common "why is my chart blank" cause.
39
42
 
40
43
  ## Step 2 — bind data columns and set options
41
44
 
@@ -53,7 +56,6 @@ Valid `display` values — the registered visualizations: `table`, `bar`, `line`
53
56
  | `row` | as bar; prefer for long/many category labels | `graph.dimensions`, `graph.metrics` |
54
57
  | `scatter` | two numeric measures (correlation) | `graph.dimensions`, `graph.metrics` (`scatter.bubble` opt) |
55
58
  | `waterfall` | exactly 1 dimension + ≥1 measure; sequential | `graph.dimensions` (1), `graph.metrics` (1) |
56
- | `boxplot` _(v59+)_ | ≥3 cols, ≥2 dimensions, ≥1 measure | `graph.dimensions`, `graph.metrics` |
57
59
  | `pie` | ≥2 rows, ≥2 cols, ≥1 dimension + ≥1 measure; ≤~5 slices | `pie.dimension`, `pie.metric` |
58
60
  | `funnel` | 2 columns (stage + value); ordered stages | `funnel.dimension`, `funnel.metric` |
59
61
  | `map` (region) | a string/region dimension + a measure | `map.region`, `map.dimension`, `map.metric` |
@@ -62,6 +64,12 @@ Valid `display` values — the registered visualizations: `table`, `bar`, `line`
62
64
  | `pivot` | ≥2 cols, all aggregated/breakout | — (`pivot_table.column_split` auto) |
63
65
  | `table` `object` | anything (table is the universal fallback) | — (always renders) |
64
66
 
67
+ <!-- requires: boxplotDisplay -->
68
+
69
+ `boxplot` is registered too: ≥3 cols, ≥2 dimensions, ≥1 measure, on **unaggregated** rows; required keys `graph.dimensions`, `graph.metrics`.
70
+
71
+ <!-- /requires -->
72
+
65
73
  ### The rule that trips everyone: settings name **output columns**, by name
66
74
 
67
75
  `graph.dimensions`, `graph.metrics`, `pie.dimension`, `pie.metric`, `scalar.field`, `funnel.metric`, `map.latitude_column`, `sankey.source`, … all take **output column-name strings** — the names the query _produces_, not field ids. A `count` aggregation outputs the column `count`; a breakout on a field outputs that field's name; a named aggregation outputs its `name`. These strings are **identical in the API form and the portable (git-sync) form** — no numeric-vs-name footgun here.
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Contents
4
4
 
5
- - [Cartesian — `bar`, `line`, `area`, `combo`, `scatter`, `waterfall`, `row`, `boxplot`](#cartesian--bar-line-area-combo-scatter-waterfall-row-boxplot) — shared keys (binding, stacking, goal/trend, data labels, axes, tooltip) plus `scatter`, `waterfall`, `row`, `boxplot` extras
5
+ - [Cartesian — `bar`, `line`, `area`, `combo`, `scatter`, `waterfall`, `row`](#cartesian--bar-line-area-combo-scatter-waterfall-row) — shared keys (binding, stacking, goal/trend, data labels, axes, tooltip) plus `scatter`, `waterfall`, `row` extras
6
6
  - [Part-to-whole & single value — `pie`, `funnel`, `gauge`, `progress`, `scalar`, `smartscalar`](#part-to-whole--single-value--pie-funnel-gauge-progress-scalar-smartscalar)
7
7
  - [Tabular, geographic & flow — `table`, `pivot`, `object`, `map`, `sankey`](#tabular-geographic--flow--table-pivot-object-map-sankey) — includes `table.column_formatting` conditional formatting
8
8
  - [`column_settings` — per-column formatting](#column_settings--per-column-formatting) — number/date/currency, `view_as`, alignment, mini bars
@@ -18,7 +18,7 @@ All column-naming keys (`graph.dimensions`, `pie.dimension`, `table.columns[].na
18
18
 
19
19
  ---
20
20
 
21
- # Cartesian — `bar`, `line`, `area`, `combo`, `scatter`, `waterfall`, `row`, `boxplot`
21
+ # Cartesian — `bar`, `line`, `area`, `combo`, `scatter`, `waterfall`, `row`
22
22
 
23
23
  `bar`/`line`/`area`/`combo` share an identical key set (combo just defaults the first series to a line, the rest to bars). `scatter`/`waterfall`/`row`/`boxplot` use a subset plus their own extras. Most allow up to 2 dimensions and unlimited metrics; **waterfall is 1 dimension + 1 metric**, boxplot allows 2 dimensions.
24
24
 
@@ -102,9 +102,9 @@ Use for sequential additive contributions (start → +/− steps → total). **U
102
102
 
103
103
  Horizontal bars — use when category labels are long or numerous. Here `graph.dimensions` is the y-axis (categories) and `graph.metrics` the x-axis (values). X-scale is `"ordinal"` only; no trend line, tooltip columns, or split panels. **Required:** `graph.dimensions`, `graph.metrics`.
104
104
 
105
- ## boxplot
105
+ <!-- requires: boxplotDisplay -->
106
106
 
107
- _Registered only on **v59+** servers — older ones render `display: boxplot` blank; use a `bar` histogram there._
107
+ ## boxplot
108
108
 
109
109
  Use for distribution/spread/outliers, especially across several groups. Needs **unaggregated** rows. **Use for:** ≥3 columns, ≥2 dimensions, ≥1 measure. **Required:** `graph.dimensions`, `graph.metrics`. X-scale is `"ordinal"`.
110
110
 
@@ -115,6 +115,8 @@ Use for distribution/spread/outliers, especially across several groups. Needs **
115
115
  | `boxplot.show_mean` | boolean | | `true` |
116
116
  | `boxplot.show_values_mode` | string | `"median"`, `"all"` (when `graph.show_values`) | `"median"` |
117
117
 
118
+ <!-- /requires -->
119
+
118
120
  ---
119
121
 
120
122
  # Part-to-whole & single value — `pie`, `funnel`, `gauge`, `progress`, `scalar`, `smartscalar`
@@ -17,7 +17,7 @@ Before running any `mb` command, load the workflow content from the CLI:
17
17
 
18
18
  ```bash
19
19
  mb skills get core # auth, flag conventions, every command group
20
- mb skills list # everything available on the installed version
20
+ mb skills list # every bundled skill the profile's server can use (--all for all of them)
21
21
  ```
22
22
 
23
23
  **Doing a whole job, not one command?** If the user wants an outcome — "make sense of my data", "build a data model", "go from raw data to a dashboard", "answer questions about my data", "be my data analyst", "set up analytics for X" — load the guided end-to-end skill instead and let it drive:
@@ -1,38 +0,0 @@
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 Snippet } from "./snippet-BxgvQ09J.mjs";
5
- import { t as snippetView } from "./snippet-DecHB4Dn.mjs";
6
- //#region src/commands/snippet/archive.ts
7
- var archive_default = defineMetabaseCommand({
8
- meta: {
9
- name: "archive",
10
- description: "Archive (soft-delete) a native query snippet by id"
11
- },
12
- capabilities: { minVersion: 58 },
13
- worktree: "scoped",
14
- details: WORKTREE_SCOPE_DETAIL,
15
- args: {
16
- ...outputFlags,
17
- ...profileFlag,
18
- ...connectionFlags,
19
- ...worktreeFlag,
20
- id: {
21
- type: "positional",
22
- description: "Snippet id",
23
- required: true
24
- }
25
- },
26
- outputSchema: Snippet,
27
- examples: ["mb snippet archive 1", "mb snippet archive 1 --json"],
28
- async run({ args, ctx, getClient, getWorktree }) {
29
- const id = parseId(args.id);
30
- const client = await getClient();
31
- const scope = await getWorktree();
32
- if (scope !== null) assertInWorktree("snippet", id, (await client.snippet.get(id)).worktree_id, scope);
33
- const updated = await client.snippet.archive(id);
34
- renderSummary(updated, snippetView, `Archived snippet ${updated.id} "${updated.name}".`, ctx);
35
- }
36
- });
37
- //#endregion
38
- export { archive_default as default };
@@ -1,38 +0,0 @@
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 { r as Collection } from "./collection-BxE7OzcQ.mjs";
5
- import { n as collectionView } from "./collection-CJHqsFKP.mjs";
6
- //#region src/commands/collection/archive.ts
7
- var archive_default = defineMetabaseCommand({
8
- meta: {
9
- name: "archive",
10
- description: "Archive (soft-delete) a collection by id"
11
- },
12
- capabilities: { minVersion: 58 },
13
- worktree: "scoped",
14
- details: WORKTREE_SCOPE_DETAIL,
15
- args: {
16
- ...outputFlags,
17
- ...profileFlag,
18
- ...connectionFlags,
19
- ...worktreeFlag,
20
- id: {
21
- type: "positional",
22
- description: "Collection id",
23
- required: true
24
- }
25
- },
26
- outputSchema: Collection,
27
- examples: ["mb collection archive 4", "mb collection archive 4 --json"],
28
- async run({ args, ctx, getClient, getWorktree }) {
29
- const id = parseId(args.id);
30
- const client = await getClient();
31
- const scope = await getWorktree();
32
- if (scope !== null) assertInWorktree("collection", id, (await client.collection.get(id)).worktree_id, scope);
33
- const updated = await client.collection.archive(id);
34
- renderSummary(updated, collectionView, `Archived collection ${updated.id} "${updated.name}".`, ctx);
35
- }
36
- });
37
- //#endregion
38
- export { archive_default as default };
@@ -1,28 +0,0 @@
1
- import { i as ConfigError } from "./predicates-Bkm2IoeX.mjs";
2
- //#region src/commands/git-sync/branch.ts
3
- const BRANCH_PINNED_REFUSAL = "a worktree is pinned to its branch; drop --branch";
4
- const BRANCH_UNSET_REFUSAL = "remote-sync-branch is not set; configure git-sync first";
5
- function syncBranchTarget(input) {
6
- const stated = input.flag === void 0 || input.flag === "" ? null : input.flag;
7
- if (input.scope !== null) {
8
- if (stated !== null) throw new ConfigError(BRANCH_PINNED_REFUSAL);
9
- return {
10
- branch: input.scope.branch,
11
- expected: input.scope.branch
12
- };
13
- }
14
- if (input.tracked === null) throw new ConfigError(BRANCH_UNSET_REFUSAL);
15
- return {
16
- branch: stated ?? input.tracked,
17
- expected: input.tracked
18
- };
19
- }
20
- async function resolveSyncBranch(mb, scope, flag) {
21
- return syncBranchTarget({
22
- scope,
23
- flag,
24
- tracked: scope === null ? await mb.gitSync.branch() : null
25
- });
26
- }
27
- //#endregion
28
- export { resolveSyncBranch as t };
@@ -1,34 +0,0 @@
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, t as defineMetabaseCommand } from "./runtime-CNAZ_FuR.mjs";
3
- import { u as SyncTask } from "./git-sync-DLzJrdMi.mjs";
4
- import { l as syncTaskView } from "./git-sync-LQIVMNxO.mjs";
5
- //#region src/commands/git-sync/cancel-task.ts
6
- var cancel_task_default = defineMetabaseCommand({
7
- meta: {
8
- name: "cancel-task",
9
- description: "Cancel the running git-sync task"
10
- },
11
- capabilities: {
12
- minVersion: 60,
13
- tokenFeature: "remote_sync"
14
- },
15
- worktree: "scoped",
16
- details: WORKTREE_SCOPE_DETAIL,
17
- args: {
18
- ...outputFlags,
19
- ...profileFlag,
20
- ...connectionFlags,
21
- ...worktreeFlag
22
- },
23
- outputSchema: SyncTask,
24
- examples: ["mb git-sync cancel-task", "mb git-sync cancel-task --json"],
25
- async run({ ctx, getClient, getWorktree }) {
26
- const mb = await getClient();
27
- const scope = await getWorktree();
28
- const params = scope === null ? {} : { worktree_id: scope.id };
29
- const task = await mb.gitSync.cancelTask(params);
30
- renderSummary(task, syncTaskView, `Requested cancellation of ${task.sync_task_type} task #${task.id}.`, ctx);
31
- }
32
- });
33
- //#endregion
34
- export { cancel_task_default as default };
@@ -1,24 +0,0 @@
1
- import { t as defineCommandGroup } from "./group-YN6jj2AN.mjs";
2
- //#region src/commands/card/index.ts
3
- var card_default = defineCommandGroup({
4
- name: "card",
5
- description: "Manage Metabase cards (questions, models, metrics)",
6
- skills: [{
7
- skill: "mbql",
8
- purpose: "author the dataset_query"
9
- }, {
10
- skill: "visualization",
11
- purpose: "choose display and visualization_settings"
12
- }],
13
- subCommands: {
14
- list: () => import("./list-oAAgU5uE.mjs").then((mod) => mod.default),
15
- get: () => import("./get-CWf46UFu.mjs").then((mod) => mod.default),
16
- query: () => import("./query-Bka77J62.mjs").then((mod) => mod.default),
17
- alerts: () => import("./alerts-DmwyyBfW.mjs").then((mod) => mod.default),
18
- create: () => import("./create-ByuJ6T4k.mjs").then((mod) => mod.default),
19
- update: () => import("./update-CpLEEbiJ.mjs").then((mod) => mod.default),
20
- archive: () => import("./archive-BZEu6UfT.mjs").then((mod) => mod.default)
21
- }
22
- });
23
- //#endregion
24
- export { card_default as default };
@@ -1,20 +0,0 @@
1
- import { t as defineCommandGroup } from "./group-YN6jj2AN.mjs";
2
- //#region src/commands/collection/index.ts
3
- var collection_default = defineCommandGroup({
4
- name: "collection",
5
- description: "Manage Metabase collections",
6
- skills: [{
7
- skill: "core",
8
- purpose: "collection ref forms and the transforms namespace"
9
- }],
10
- subCommands: {
11
- list: () => import("./list-Dg2XeDON.mjs").then((mod) => mod.default),
12
- get: () => import("./get-DwdMvWXU.mjs").then((mod) => mod.default),
13
- items: () => import("./items-Cv6iAzrI.mjs").then((mod) => mod.default),
14
- tree: () => import("./tree-DtyJhD54.mjs").then((mod) => mod.default),
15
- create: () => import("./create-D0anrINz.mjs").then((mod) => mod.default),
16
- archive: () => import("./archive-DCjdICg7.mjs").then((mod) => mod.default)
17
- }
18
- });
19
- //#endregion
20
- export { collection_default as default };
@@ -1,144 +0,0 @@
1
- import { i as ConfigError } from "./predicates-Bkm2IoeX.mjs";
2
- import { H as profileFlag, R as connectionFlags, V as outputFlags, p as renderSummary } from "./cli.mjs";
3
- import { A as readProfileRecord, I as writeProfileWorktree, t as defineMetabaseCommand } from "./runtime-CNAZ_FuR.mjs";
4
- import { o as SyncImportResult } from "./git-sync-DLzJrdMi.mjs";
5
- import { n as WorktreeCompact, t as Worktree } from "./worktree-xAro1xAB.mjs";
6
- import { n as parseWaitFlags, t as gitSyncWaitFlags } from "./wait-flags-DzytMEG8.mjs";
7
- import { a as throwIfFailedTask, i as taskPollOptions, n as formatSyncTask } from "./sync-task-G1K47Nvn.mjs";
8
- import { z } from "zod";
9
- //#region src/commands/worktree/create.ts
10
- const WorktreeCreateResult = z.object({
11
- worktree: Worktree,
12
- branch_created: z.boolean(),
13
- pull: SyncImportResult.nullable()
14
- });
15
- const worktreeCreateView = {
16
- compactPick: WorktreeCreateResult.extend({ worktree: WorktreeCompact }),
17
- tableColumns: [
18
- {
19
- key: "worktree",
20
- label: "Worktree",
21
- format: (value) => renderWorktreeCell(value)
22
- },
23
- {
24
- key: "branch_created",
25
- label: "Branch created"
26
- },
27
- {
28
- key: "pull",
29
- label: "Pull",
30
- format: (value) => renderPullCell(value)
31
- }
32
- ]
33
- };
34
- function renderWorktreeCell(value) {
35
- const parsed = Worktree.safeParse(value);
36
- return parsed.success ? `${parsed.data.id} (${parsed.data.branch})` : "—";
37
- }
38
- function renderPullCell(value) {
39
- const parsed = SyncImportResult.safeParse(value);
40
- if (!parsed.success) return "—";
41
- return parsed.data.task_id === null ? "no task" : `task #${parsed.data.task_id}`;
42
- }
43
- var create_default = defineMetabaseCommand({
44
- meta: {
45
- name: "create",
46
- description: "Create a git-sync worktree for a branch and pull the branch into it"
47
- },
48
- capabilities: {
49
- minVersion: 64,
50
- tokenFeature: "remote_sync"
51
- },
52
- worktree: "any",
53
- details: "A worktree is bound to its branch for life. The branch is created on the remote first when it is missing, then the branch's content is pulled into the worktree so the checkout starts in sync.",
54
- args: {
55
- ...outputFlags,
56
- ...profileFlag,
57
- ...connectionFlags,
58
- branch: {
59
- type: "positional",
60
- description: "Branch to check out",
61
- required: true
62
- },
63
- pull: {
64
- type: "boolean",
65
- description: "Import the branch into the new worktree (default: true; --no-pull skips it)",
66
- default: true
67
- },
68
- createBranch: {
69
- type: "boolean",
70
- description: "Create the branch on the remote when it is missing (default: true; --no-create-branch assumes it exists)",
71
- default: true,
72
- alias: "create-branch"
73
- },
74
- pin: {
75
- type: "boolean",
76
- description: "Pin the profile to the new worktree so every later command runs inside it",
77
- default: false
78
- },
79
- ...gitSyncWaitFlags
80
- },
81
- outputSchema: WorktreeCreateResult,
82
- examples: [
83
- "mb worktree create feat/transforms",
84
- "mb worktree create feat/transforms --pin --json",
85
- "mb worktree create feat/transforms --no-create-branch --no-pull"
86
- ],
87
- async run({ args, ctx, getClient, getResolvedConfig }) {
88
- const branch = args.branch.trim();
89
- if (branch === "") throw new ConfigError("invalid branch: branch name must not be blank");
90
- const wait = parseWaitFlags(args);
91
- const profile = (await getResolvedConfig()).profile;
92
- await assertPinAllows(profile, branch);
93
- const mb = await getClient();
94
- const branchCreated = args.createBranch ? await ensureBranch(mb, branch) : false;
95
- const worktree = await mb.gitSync.createWorktree({ branch });
96
- const pull = args.pull ? await pullBranch(mb, worktree.id, branch, wait) : null;
97
- if (args.pin) await writeProfileWorktree(profile, {
98
- id: worktree.id,
99
- branch: worktree.branch
100
- });
101
- const result = {
102
- worktree,
103
- branch_created: branchCreated,
104
- pull
105
- };
106
- renderSummary(result, worktreeCreateView, () => summarize(result, profile, args.pin), ctx);
107
- throwIfFailedTask(pull?.final ?? null, "import");
108
- }
109
- });
110
- async function assertPinAllows(profile, branch) {
111
- const pin = (await readProfileRecord(profile))?.worktree ?? null;
112
- if (pin === null || pin.branch === branch) return;
113
- throw new ConfigError(`profile "${profile}" is pinned to worktree ${pin.id} (${pin.branch}); refusing to create a worktree for branch "${branch}"`);
114
- }
115
- async function ensureBranch(mb, branch) {
116
- const { data } = await mb.gitSync.branches();
117
- if (data.includes(branch)) return false;
118
- await mb.gitSync.createBranch({
119
- name: branch,
120
- checkout: false
121
- });
122
- return true;
123
- }
124
- async function pullBranch(mb, worktreeId, branch, wait) {
125
- const params = {
126
- branch,
127
- expected_branch: branch,
128
- worktree_id: worktreeId
129
- };
130
- if (wait.enabled) params.wait = taskPollOptions(wait.schedule);
131
- return mb.gitSync.import(params);
132
- }
133
- function summarize(result, profile, pinned) {
134
- const origin = result.branch_created ? " (branch created on the remote)" : "";
135
- const lines = [`Created worktree ${result.worktree.id} for branch "${result.worktree.branch}"${origin}.`];
136
- if (result.pull === null) lines.push("Skipped the initial pull; the worktree is empty until you import into it.");
137
- else if (result.pull.final !== null && result.pull.final !== void 0) lines.push(formatSyncTask(result.pull.final));
138
- else if (result.pull.task_id === null) lines.push(result.pull.message ?? "Nothing to import.");
139
- else lines.push(`Started import task #${result.pull.task_id}.`);
140
- if (pinned) lines.push(`Pinned profile "${profile}" to worktree ${result.worktree.id}.`);
141
- return lines.join("\n");
142
- }
143
- //#endregion
144
- export { create_default as default };