@metabase/cli 0.1.0-alpha.workspaces-commands.645461e → 0.1.0-alpha.workspaces-commands.68d980f

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 (170) hide show
  1. package/README.md +379 -0
  2. package/dist/{add-collection-D2VyeBlW.mjs → add-collection-Cu4B6KXG.mjs} +3 -3
  3. package/dist/{add-collection-D36mvhlp.mjs → add-collection-DGV1rqqR.mjs} +6 -6
  4. package/dist/{api-key-D7FJ0diY.mjs → api-key-6_Q5e_K0.mjs} +1 -1
  5. package/dist/archive-Bpf0QvqP.mjs +39 -0
  6. package/dist/archive-C2ziJ31w.mjs +44 -0
  7. package/dist/{archive-BhrD3g9q.mjs → archive-CYgtaA_I.mjs} +3 -3
  8. package/dist/archive-DHjG2vSi.mjs +44 -0
  9. package/dist/auth-BaMPV-un.mjs +19 -0
  10. package/dist/{body-po-d1TER.mjs → body-BAdJj5HJ.mjs} +1 -1
  11. package/dist/{branches-C_QIaXq_.mjs → branches-DkwkHvgF.mjs} +4 -4
  12. package/dist/cancel-UgDP_AM-.mjs +56 -0
  13. package/dist/{cancel-task-BUBIAgGA.mjs → cancel-task-DCV5l_rj.mjs} +4 -4
  14. package/dist/card-DI78jgjG.mjs +20 -0
  15. package/dist/{cards-CURArHer.mjs → cards-BXYJMHYy.mjs} +4 -4
  16. package/dist/cli.mjs +23 -20
  17. package/dist/collection-BcMoZLX0.mjs +19 -0
  18. package/dist/{create-ZbmxIy-0.mjs → create-BLwyolnm.mjs} +4 -4
  19. package/dist/{create-DTTeHc01.mjs → create-BUcIJ1nk.mjs} +4 -4
  20. package/dist/{create-CCji2u2l.mjs → create-D4_iBwTY.mjs} +3 -3
  21. package/dist/create-D9CEUvL3.mjs +40 -0
  22. package/dist/create-D9zWWm9b.mjs +44 -0
  23. package/dist/{create-CSb4rEYN.mjs → create-DCAvWcNL.mjs} +4 -4
  24. package/dist/{create-Pz8emM9b.mjs → create-DCEuLMff.mjs} +4 -4
  25. package/dist/create-RneHGLFF.mjs +40 -0
  26. package/dist/{create-branch-DY_Xk7xJ.mjs → create-branch-BfSrjGld.mjs} +4 -4
  27. package/dist/{create-D3PbG6zp.mjs → create-n7yxR6s2.mjs} +3 -3
  28. package/dist/{create-SD_4KNY7.mjs → create-yiHTy9qd.mjs} +4 -4
  29. package/dist/{credentials-Cx9Y_e-i.mjs → credentials-BnX6KoeQ.mjs} +6 -6
  30. package/dist/{current-task-DVhQW4jT.mjs → current-task-C60CWYop.mjs} +4 -4
  31. package/dist/dashboard-B8zj0bZS.mjs +20 -0
  32. package/dist/{database-BAvx1gH2.mjs → database-BkSdTiyB.mjs} +3 -3
  33. package/dist/database-GbK7OAPX.mjs +51 -0
  34. package/dist/db-DG-1rI_O.mjs +22 -0
  35. package/dist/{delete-Vl85AALS.mjs → delete-D39mHiYu.mjs} +4 -4
  36. package/dist/{delete-BGxR7gVt.mjs → delete-nxO9ND-q.mjs} +4 -4
  37. package/dist/{delete-table-ClBj6G7Q.mjs → delete-table-Dk1C3x9k.mjs} +4 -4
  38. package/dist/{deprovision-CwrA3yQY.mjs → deprovision-CCokm00M.mjs} +8 -8
  39. package/dist/{dirty-CNPWGSpA.mjs → dirty-Da9uKlQp.mjs} +4 -4
  40. package/dist/{docker-Cvj7_PZp.mjs → docker-En_jqSVW.mjs} +2 -2
  41. package/dist/{eid-DFaDBRra.mjs → eid-BQx_tnuC.mjs} +1 -1
  42. package/dist/{export-DuMGd6lo.mjs → export-PQ84ihYr.mjs} +5 -5
  43. package/dist/field-BakUM_Le.mjs +142 -0
  44. package/dist/field-CE-2zFaL.mjs +18 -0
  45. package/dist/fields-BhN1M2TD.mjs +38 -0
  46. package/dist/{get-vajO-hi6.mjs → get-BifK1SP6.mjs} +3 -3
  47. package/dist/{get--PcCqyKa.mjs → get-CAYdsSX4.mjs} +4 -4
  48. package/dist/{get-swr2-leH.mjs → get-CScnOuJ-.mjs} +4 -4
  49. package/dist/{get-Dyf1VRQF.mjs → get-CaRX225l.mjs} +2 -2
  50. package/dist/get-CbwJfVx1.mjs +36 -0
  51. package/dist/get-CtsZA_BB.mjs +36 -0
  52. package/dist/{get-DfO9yXXn.mjs → get-D64v79fP.mjs} +4 -4
  53. package/dist/get-D6dlsNBD.mjs +49 -0
  54. package/dist/{get-B2r9MJly.mjs → get-DM2UkeKJ.mjs} +4 -4
  55. package/dist/{get-CoDOJTMY.mjs → get-DQ0lm-Dx.mjs} +4 -4
  56. package/dist/{get-BjLQvtIP.mjs → get-Dopinaxx.mjs} +7 -7
  57. package/dist/get-DpFyct1X.mjs +36 -0
  58. package/dist/get-run-DpjKXCww.mjs +36 -0
  59. package/dist/{has-remote-changes-BqwcNcE7.mjs → has-remote-changes-BgbCIv30.mjs} +4 -4
  60. package/dist/{import-D--2vqZQ.mjs → import-BRC4SYRj.mjs} +5 -5
  61. package/dist/{is-dirty-DQ9zG6uN.mjs → is-dirty-BduCa9nf.mjs} +2 -2
  62. package/dist/is-dirty-hMK61S1s.mjs +10 -0
  63. package/dist/{items-DwQQ0GAg.mjs → items-NE7Z-vuw.mjs} +4 -50
  64. package/dist/{license-CzMfg5XI.mjs → license-MWU4vLvD.mjs} +3 -3
  65. package/dist/{list-0NpAfgQ4.mjs → list--EFsidRC.mjs} +5 -5
  66. package/dist/{list-BIK_58XI.mjs → list-BB9IsaT4.mjs} +2 -2
  67. package/dist/{list-DMwbB4b4.mjs → list-BMFbKnG1.mjs} +3 -3
  68. package/dist/list-BPC7KqBQ.mjs +32 -0
  69. package/dist/list-B_XtS5VX.mjs +40 -0
  70. package/dist/{list-C79o1l5H.mjs → list-Bgt_qxRd.mjs} +28 -7
  71. package/dist/list-C-ucaNmG.mjs +32 -0
  72. package/dist/{list-BtC8ka3k.mjs → list-C1wNHDPl.mjs} +2 -2
  73. package/dist/{list-D-L9cq2y.mjs → list-CR1Dkcbk.mjs} +3 -3
  74. package/dist/{list-FCYnuxeR.mjs → list-D6KnlTOp.mjs} +3 -3
  75. package/dist/{list-zFg_sbzo.mjs → list-DeNHJECx.mjs} +3 -3
  76. package/dist/{list-BEjK80yL.mjs → list-_4_qW2nQ.mjs} +2 -2
  77. package/dist/{list-DQeGs5DL.mjs → list-jHGjjZdC.mjs} +3 -3
  78. package/dist/{login-CzssJlL2.mjs → login-B30jvHfe.mjs} +2 -2
  79. package/dist/{logout-Bcwc7QN0.mjs → logout-bWublBcN.mjs} +2 -2
  80. package/dist/{logs-DIEyUxpM.mjs → logs-DsiDIT90.mjs} +5 -5
  81. package/dist/measure-B1GKcZxO.mjs +67 -0
  82. package/dist/measure-Bc9tjbVl.mjs +19 -0
  83. package/dist/metadata-DCFEJsKY.mjs +37 -0
  84. package/dist/{get-CLCdkBcw.mjs → metadata-DCVxSKX7.mjs} +13 -11
  85. package/dist/{package-DW4n6lFo.mjs → package-Be4_p9f8.mjs} +1 -1
  86. package/dist/paginate-CnTxzOh2.mjs +49 -0
  87. package/dist/{parse-id-DCdBU-nG.mjs → parse-id-DKRTKFB2.mjs} +1 -1
  88. package/dist/{parse-schemas-dp6MXbcF.mjs → parse-schemas-CtMwPgZe.mjs} +1 -1
  89. package/dist/{poll-DaJLfYpK.mjs → poll-BXEPgd4X.mjs} +1 -1
  90. package/dist/{poll-task-BiYw9iLs.mjs → poll-task-UMS6aAza.mjs} +2 -2
  91. package/dist/{provision-DqfOs_BL.mjs → provision-BDtZZK84.mjs} +9 -9
  92. package/dist/{ps-C-oTI3y_.mjs → ps-DcKt1oHS.mjs} +2 -2
  93. package/dist/{ps-zD4MZ7s2.mjs → ps-iON5iNUT.mjs} +5 -5
  94. package/dist/{query-eDZSuQaQ.mjs → query-7qZ7dWnE.mjs} +3 -3
  95. package/dist/{query-CiX4UQt3.mjs → query-DtD0dc_V.mjs} +3 -3
  96. package/dist/{remove-Bx1w-uWB.mjs → remove-D194SUD-.mjs} +5 -5
  97. package/dist/{remove-BsNj8FcZ.mjs → remove-UWzVKtfF.mjs} +2 -2
  98. package/dist/{remove-collection-CYRloViE.mjs → remove-collection-BUwKxMsH.mjs} +6 -6
  99. package/dist/rescan-values-zYxt5WcO.mjs +43 -0
  100. package/dist/revision-message-flag-BJiGjb5m.mjs +11 -0
  101. package/dist/{run-o1HdcHcT.mjs → run-DwYkAZHU.mjs} +10 -10
  102. package/dist/runs-CeHd9FOO.mjs +54 -0
  103. package/dist/{runtime-BlGbSVbh.mjs → runtime-Dlk-yyFO.mjs} +1 -1
  104. package/dist/schema-tables-LZG9R38V.mjs +45 -0
  105. package/dist/schemas-ZC7JrOKM.mjs +47 -0
  106. package/dist/{search-CshaaZOi.mjs → search-StdHjR5q.mjs} +3 -3
  107. package/dist/segment-BVM0WSM7.mjs +19 -0
  108. package/dist/segment-CQ5w3M_W.mjs +70 -0
  109. package/dist/{set-CS0Bay1g.mjs → set-CgDS1Feo.mjs} +5 -5
  110. package/dist/{set-Dj-zpi9u.mjs → set-Ey8zuk9j.mjs} +2 -2
  111. package/dist/{setting-CPrSDcuC.mjs → setting-D4mR5WMp.mjs} +3 -3
  112. package/dist/{setup-BjsZgvZs.mjs → setup-DKRzEM6a.mjs} +3 -3
  113. package/dist/snippet-BO-gCn0H.mjs +19 -0
  114. package/dist/snippet-DRTklDg3.mjs +64 -0
  115. package/dist/{start-DK1KR98G.mjs → start-15kcQYwC.mjs} +7 -7
  116. package/dist/{stash-CDSI72Pi.mjs → stash-CQkpgkAr.mjs} +5 -5
  117. package/dist/{status-DygsyoJt.mjs → status-BmYxYGZE.mjs} +5 -5
  118. package/dist/{status-B6X-VTeS.mjs → status-D0LTLSrI.mjs} +2 -2
  119. package/dist/{status-C32y4hQx.mjs → status-Dg0qSJtP.mjs} +2 -2
  120. package/dist/{stop-D8DPsVEP.mjs → stop-B9M_LliY.mjs} +6 -6
  121. package/dist/summary-CSGteNEX.mjs +41 -0
  122. package/dist/sync-_BtDG63a.mjs +28 -0
  123. package/dist/sync-schema-BjGQtnol.mjs +43 -0
  124. package/dist/table-C0N9hfqm.mjs +19 -0
  125. package/dist/{table-DimNUJtH.mjs → table-DhB2_Dxd.mjs} +21 -4
  126. package/dist/{transform-DRDHuulD.mjs → transform-92odFxg-.mjs} +45 -3
  127. package/dist/transform-BycLORsG.mjs +24 -0
  128. package/dist/transform-job-B_SvpPfl.mjs +19 -0
  129. package/dist/{translate-bzGSUcP5.mjs → translate-DRajJsf0.mjs} +3 -3
  130. package/dist/{tree-BXf2Avg_.mjs → tree-eunCOx9U.mjs} +2 -2
  131. package/dist/update-6BC1K7uY.mjs +51 -0
  132. package/dist/{update-qBaNdoVm.mjs → update-B0bpqs4y.mjs} +4 -4
  133. package/dist/update-BJk9pfiv.mjs +52 -0
  134. package/dist/{update-C8ZrbNAQ.mjs → update-Bhfzszoc.mjs} +5 -5
  135. package/dist/update-BprFaiqH.mjs +51 -0
  136. package/dist/{update-DFGi07_J.mjs → update-C-i8drfb.mjs} +5 -5
  137. package/dist/{update-2rOSt-uC.mjs → update-CSsRBrV5.mjs} +9 -9
  138. package/dist/{update-C_kb0VT2.mjs → update-CkrxPRXK.mjs} +5 -5
  139. package/dist/update-D14Sl_IP.mjs +51 -0
  140. package/dist/update-D1mHRo8M.mjs +52 -0
  141. package/dist/{update-dashcard-Dz8n_Eb3.mjs → update-dashcard-I13krLAG.mjs} +5 -5
  142. package/dist/{url-DntR9Vt0.mjs → url-CRyx47hL.mjs} +5 -5
  143. package/dist/values-BhYRwEvd.mjs +36 -0
  144. package/dist/{wait-w-EDNseb.mjs → wait-Dx7gfA8G.mjs} +2 -2
  145. package/dist/{wait-CCC_NXX_.mjs → wait-dqZ8MsDQ.mjs} +5 -5
  146. package/dist/{wait-flags-UxcaSinn.mjs → wait-flags-Czo_9Q__.mjs} +2 -2
  147. package/dist/workspace-eQ2gxKYO.mjs +24 -0
  148. package/package.json +1 -1
  149. package/dist/auth-BaXOzAzt.mjs +0 -19
  150. package/dist/card-dTdbUqvv.mjs +0 -20
  151. package/dist/collection-DZm1oB_J.mjs +0 -19
  152. package/dist/dashboard-D3ujvyqS.mjs +0 -20
  153. package/dist/database-C5LkxQ5G.mjs +0 -33
  154. package/dist/db-TY_YuEzV.mjs +0 -17
  155. package/dist/field-C1ai7Y05.mjs +0 -76
  156. package/dist/field-DgYYRJPe.mjs +0 -13
  157. package/dist/is-dirty-DChKYsYS.mjs +0 -10
  158. package/dist/sync-BrLw4QgM.mjs +0 -28
  159. package/dist/table-Dv2QUqKb.mjs +0 -16
  160. package/dist/transform-C_I-Hc1p.mjs +0 -21
  161. package/dist/transform-job-4CwmLSTV.mjs +0 -19
  162. package/dist/workspace-DmQKLMZY.mjs +0 -24
  163. /package/dist/{dashboard-BJXi1tGr.mjs → dashboard-C7MhcBfX.mjs} +0 -0
  164. /package/dist/{delete-runtime-Dx4ONQaO.mjs → delete-runtime-DCc3Hie4.mjs} +0 -0
  165. /package/dist/{key-CS6durfH.mjs → key-CjpAYsPz.mjs} +0 -0
  166. /package/dist/{manifest-C7lnUosz.mjs → manifest-CdAV6-YB.mjs} +0 -0
  167. /package/dist/{setting-DEHSnsEV.mjs → setting-DIXJ2haa.mjs} +0 -0
  168. /package/dist/{transform-job-BqYZMjf5.mjs → transform-job-DgApCViL.mjs} +0 -0
  169. /package/dist/{workspace-CTwXenWM.mjs → workspace-D93cDL8-.mjs} +0 -0
  170. /package/dist/{workspace-credentials-CC_99x9r.mjs → workspace-credentials-D_ivv5vy.mjs} +0 -0
package/README.md CHANGED
@@ -194,6 +194,38 @@ metabase transform run 1 --wait --json
194
194
  | `--timeout <ms>` | Polling timeout in ms (default 600000). Used with `--wait`. |
195
195
  | `--interval <ms>` | Polling interval in ms (default 2000). Used with `--wait`. |
196
196
 
197
+ ### `metabase transform cancel <id>`
198
+
199
+ Cancel the currently-running run for a transform. Exits 0 with `{canceled: true, id}` on success; exits 1 with a 404 if the transform has no active run.
200
+
201
+ ```sh
202
+ metabase transform cancel 1
203
+ metabase transform cancel 1 --json
204
+ ```
205
+
206
+ ### `metabase transform get-run <run-id>`
207
+
208
+ Fetch a single run by run id (not transform id). Same compact / `--full` projection convention as `transform get`.
209
+
210
+ ```sh
211
+ metabase transform get-run 1 --json
212
+ ```
213
+
214
+ ### `metabase transform runs`
215
+
216
+ List recent transform runs across all transforms, or filter to one. Drains all pages by default; pass `--limit` to cap.
217
+
218
+ ```sh
219
+ metabase transform runs
220
+ metabase transform runs --transform-id 1 --json
221
+ metabase transform runs --limit 10 --json
222
+ ```
223
+
224
+ | Flag | Description |
225
+ | --------------------- | --------------------------------------------------- |
226
+ | `--transform-id <id>` | Filter to runs of a single transform id. |
227
+ | `--limit <n>` | Cap total runs returned (default: drain all pages). |
228
+
197
229
  ## Transform jobs
198
230
 
199
231
  CRUD on `/api/transform-job`. Bodies for `create` / `update` follow the same `--body` / `--file` / stdin pattern as transforms.
@@ -237,6 +269,170 @@ metabase transform-job delete 1 --yes
237
269
  | ------- | --------------------------------------------------------------------------------------------------------------------------------- |
238
270
  | `--yes` | Skip the interactive confirmation prompt. In non-TTY contexts the prompt is skipped automatically (kubectl/gh/docker convention). |
239
271
 
272
+ ## Databases
273
+
274
+ Read warehouse metadata from `/api/database`. The `db` group exposes the full database list, the per-database record, hydrated metadata (tables + fields rolled up in one response), schema and table inspection, and the two manual-sync triggers.
275
+
276
+ `db` is aliased to `database`.
277
+
278
+ ### `metabase db list`
279
+
280
+ ```sh
281
+ metabase db list
282
+ metabase db list --json
283
+ metabase db list --include tables --full --json
284
+ metabase db list --saved --json
285
+ ```
286
+
287
+ | Flag | Description |
288
+ | ------------------- | ------------------------------------------------------------------------------------------------------------- |
289
+ | `--include <which>` | Hydrate related entities. Currently only `tables` is supported (each database is returned with its `tables`). |
290
+ | `--saved` | Include the Saved Questions virtual database in the list. The virtual db has id `-1337` and no `engine`. |
291
+
292
+ ### `metabase db get <id>`
293
+
294
+ ```sh
295
+ metabase db get 1
296
+ metabase db get 1 --json
297
+ metabase db get 1 --include tables.fields --full --json
298
+ ```
299
+
300
+ | Flag | Description |
301
+ | ------------------- | ------------------------------------------------------------- |
302
+ | `--include <which>` | Hydrate related entities. One of `tables` or `tables.fields`. |
303
+
304
+ ### `metabase db metadata <id>`
305
+
306
+ Equivalent to `GET /api/database/:id/metadata`: a single database with all its tables and fields rolled up in one response. Use this when an agent needs a one-shot warehouse introspection rather than the per-table `metabase table get --full`.
307
+
308
+ ```sh
309
+ metabase db metadata 1 --json --full --max-bytes 0
310
+ ```
311
+
312
+ ### `metabase db schemas <id>`
313
+
314
+ List the schemas in a database. Schemas with no tables are excluded.
315
+
316
+ ```sh
317
+ metabase db schemas 1
318
+ metabase db schemas 1 --json
319
+ ```
320
+
321
+ ### `metabase db schema-tables <id> <schema>`
322
+
323
+ List the tables in a given schema, sorted by display name.
324
+
325
+ ```sh
326
+ metabase db schema-tables 1 public
327
+ metabase db schema-tables 1 analytics --json
328
+ ```
329
+
330
+ ### `metabase db sync-schema <id>`
331
+
332
+ Trigger a manual schema sync (`POST /api/database/:id/sync_schema`). Returns `{ id, status: "ok" }` once the sync has been queued; the actual work happens asynchronously on the server.
333
+
334
+ ```sh
335
+ metabase db sync-schema 1
336
+ metabase db sync-schema 1 --json
337
+ ```
338
+
339
+ ### `metabase db rescan-values <id>`
340
+
341
+ Trigger a rescan of cached field values (`POST /api/database/:id/rescan_values`). Returns `{ id, status: "ok" }` once the rescan has been queued.
342
+
343
+ ```sh
344
+ metabase db rescan-values 1
345
+ metabase db rescan-values 1 --json
346
+ ```
347
+
348
+ ## Tables
349
+
350
+ Inspect and edit warehouse tables via `/api/table`.
351
+
352
+ ### `metabase table list`
353
+
354
+ ```sh
355
+ metabase table list
356
+ metabase table list --db-id 1 --json
357
+ ```
358
+
359
+ | Flag | Description |
360
+ | -------------- | ----------------------------------- |
361
+ | `--db-id <id>` | Filter tables by their database id. |
362
+
363
+ ### `metabase table get <id>`
364
+
365
+ Returns the basic table record (no fields). Use `metabase table metadata <id>` when you want the rollup with fields/FKs/dimensions hydrated.
366
+
367
+ ```sh
368
+ metabase table get 42
369
+ metabase table get 42 --json
370
+ ```
371
+
372
+ ### `metabase table metadata <id>`
373
+
374
+ `GET /api/table/:id/query_metadata`: the table with its fields, FKs, and dimensions hydrated. The agent-facing one-shot introspection for a single table.
375
+
376
+ ```sh
377
+ metabase table metadata 42 --json --full --max-bytes 0
378
+ ```
379
+
380
+ ### `metabase table fields <id>`
381
+
382
+ List the fields on a table (a thin projection over `query_metadata.fields`).
383
+
384
+ ```sh
385
+ metabase table fields 42
386
+ metabase table fields 42 --json
387
+ ```
388
+
389
+ ### `metabase table update <id>`
390
+
391
+ Patch a table (`PUT /api/table/:id`). Body fields: `display_name`, `description`, `caveats`, `points_of_interest`, `entity_type`, `visibility_type`, `field_order`, `show_in_getting_started`. Pass the body via `--body`, `--file`, or stdin (exactly one).
392
+
393
+ ```sh
394
+ metabase table update 42 --body '{"display_name":"Customers"}'
395
+ metabase table update 42 --file patch.json
396
+ echo '{"description":"Customer dimension"}' | metabase table update 42
397
+ ```
398
+
399
+ ## Fields
400
+
401
+ Inspect and edit individual columns via `/api/field`.
402
+
403
+ ### `metabase field get <id>`
404
+
405
+ ```sh
406
+ metabase field get 100
407
+ metabase field get 100 --json
408
+ ```
409
+
410
+ ### `metabase field values <id>`
411
+
412
+ Fetch the cached distinct values list (`GET /api/field/:id/values`). Returns the FieldValues envelope (`{ values, field_id, has_more_values }`); empty `values` on fields whose `has_field_values` is `none` or `search`.
413
+
414
+ ```sh
415
+ metabase field values 100 --json
416
+ ```
417
+
418
+ ### `metabase field summary <id>`
419
+
420
+ Row count and distinct count for the field (`GET /api/field/:id/summary`). Metabase returns this as an array-of-pairs; the CLI normalizes it to `{ field_id, count, distincts }`.
421
+
422
+ ```sh
423
+ metabase field summary 100
424
+ metabase field summary 100 --json
425
+ ```
426
+
427
+ ### `metabase field update <id>`
428
+
429
+ Patch a field (`PUT /api/field/:id`). Body fields: `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`. Pass the body via `--body`, `--file`, or stdin.
430
+
431
+ ```sh
432
+ metabase field update 100 --body '{"description":"customer email","semantic_type":"type/Email"}'
433
+ metabase field update 100 --file patch.json
434
+ ```
435
+
240
436
  ## Cards
241
437
 
242
438
  CRUD plus query execution on `/api/card`. A "card" is a Metabase question, model, or metric. The `query` subcommand runs the card and either returns Metabase's JSON envelope or streams a raw CSV / XLSX export.
@@ -403,6 +599,189 @@ cat patch.json | metabase dashboard update-dashcard 1 5
403
599
 
404
600
  The patch must contain at least one field; an empty object is rejected before the network round-trip.
405
601
 
602
+ ## Snippets
603
+
604
+ CRUD on `/api/native-query-snippet`. A snippet is a named, reusable piece of native (SQL) query text — referenced from cards via `{{snippet: Name}}`. The list endpoint returns either active or archived rows (mutually exclusive — pass `--archived` to swap).
605
+
606
+ ### `metabase snippet list`
607
+
608
+ ```sh
609
+ metabase snippet list
610
+ metabase snippet list --json
611
+ metabase snippet list --archived --json
612
+ ```
613
+
614
+ | Flag | Description |
615
+ | ------------ | ---------------------------------------------- |
616
+ | `--archived` | Show archived snippets instead of active ones. |
617
+
618
+ ### `metabase snippet get <id>`
619
+
620
+ ```sh
621
+ metabase snippet get 1
622
+ metabase snippet get 1 --json --full
623
+ ```
624
+
625
+ ### `metabase snippet create`
626
+
627
+ ```sh
628
+ cat snippet.json | metabase snippet create
629
+ metabase snippet create --file snippet.json
630
+ metabase snippet create --body '{"name":"active","content":"WHERE active = true"}'
631
+ ```
632
+
633
+ | Flag | Description |
634
+ | --------------- | ----------------------- |
635
+ | `--body <json>` | Inline JSON body. |
636
+ | `--file <path>` | Path to JSON body file. |
637
+
638
+ Body fields: `name` (required), `content` (required), `description` (optional), `collection_id` (optional positive integer).
639
+
640
+ ### `metabase snippet update <id>`
641
+
642
+ Patch a snippet. Body is a partial subset of the create shape plus `archived`. Only the keys you send are touched.
643
+
644
+ ```sh
645
+ cat patch.json | metabase snippet update 1
646
+ metabase snippet update 1 --file patch.json
647
+ metabase snippet update 1 --body '{"name":"renamed"}'
648
+ metabase snippet update 1 --body '{"archived":true}'
649
+ ```
650
+
651
+ | Flag | Description |
652
+ | --------------- | ----------------------- |
653
+ | `--body <json>` | Inline JSON body. |
654
+ | `--file <path>` | Path to JSON body file. |
655
+
656
+ ### `metabase snippet archive <id>`
657
+
658
+ Soft-delete a snippet by setting `archived: true`. To unarchive use `metabase snippet update <id> --body '{"archived":false}'`.
659
+
660
+ ```sh
661
+ metabase snippet archive 1
662
+ metabase snippet archive 1 --json
663
+ ```
664
+
665
+ ## Segments
666
+
667
+ CRUD on `/api/segment`. A segment is a saved MBQL filter macro tied to a table — used in card filters to share a reusable predicate. Mutating endpoints require a `revision_message` for the audit log.
668
+
669
+ ### `metabase segment list`
670
+
671
+ ```sh
672
+ metabase segment list
673
+ metabase segment list --json
674
+ ```
675
+
676
+ ### `metabase segment get <id>`
677
+
678
+ ```sh
679
+ metabase segment get 1
680
+ metabase segment get 1 --json --full
681
+ ```
682
+
683
+ ### `metabase segment create`
684
+
685
+ ```sh
686
+ cat segment.json | metabase segment create
687
+ metabase segment create --file segment.json
688
+ ```
689
+
690
+ | Flag | Description |
691
+ | --------------- | ----------------------- |
692
+ | `--body <json>` | Inline JSON body. |
693
+ | `--file <path>` | Path to JSON body file. |
694
+
695
+ Body fields: `name` (required), `table_id` (required positive integer), `definition` (required MBQL filter object), `description` (optional).
696
+
697
+ ### `metabase segment update <id>`
698
+
699
+ Patch a segment. The body MUST include `revision_message`. Other keys are partial: `name`, `definition`, `archived`, `description`, `caveats`, `points_of_interest`, `show_in_getting_started`.
700
+
701
+ ```sh
702
+ cat patch.json | metabase segment update 1
703
+ metabase segment update 1 --file patch.json
704
+ metabase segment update 1 --body '{"name":"renamed","revision_message":"rename"}'
705
+ ```
706
+
707
+ | Flag | Description |
708
+ | --------------- | ----------------------- |
709
+ | `--body <json>` | Inline JSON body. |
710
+ | `--file <path>` | Path to JSON body file. |
711
+
712
+ ### `metabase segment archive <id>`
713
+
714
+ Soft-delete a segment by setting `archived: true`. The default revision message is `"Archived via metabase CLI"`; override with `--revision-message`.
715
+
716
+ ```sh
717
+ metabase segment archive 1
718
+ metabase segment archive 1 --revision-message "deprecated"
719
+ ```
720
+
721
+ | Flag | Description |
722
+ | --------------------------- | ------------------------------------------- |
723
+ | `--revision-message <text>` | Audit-log message recorded with the change. |
724
+
725
+ ## Measures
726
+
727
+ CRUD on `/api/measure`. A measure is a saved MBQL aggregation (a single `:aggregation` clause) tied to a table — referenced from cards and metrics to share a reusable computation. Mutating endpoints require a `revision_message` for the audit log.
728
+
729
+ ### `metabase measure list`
730
+
731
+ ```sh
732
+ metabase measure list
733
+ metabase measure list --json
734
+ ```
735
+
736
+ ### `metabase measure get <id>`
737
+
738
+ ```sh
739
+ metabase measure get 1
740
+ metabase measure get 1 --json --full
741
+ ```
742
+
743
+ ### `metabase measure create`
744
+
745
+ ```sh
746
+ cat measure.json | metabase measure create
747
+ metabase measure create --file measure.json
748
+ ```
749
+
750
+ | Flag | Description |
751
+ | --------------- | ----------------------- |
752
+ | `--body <json>` | Inline JSON body. |
753
+ | `--file <path>` | Path to JSON body file. |
754
+
755
+ Body fields: `name` (required), `table_id` (required positive integer), `definition` (required MBQL aggregation object), `description` (optional).
756
+
757
+ ### `metabase measure update <id>`
758
+
759
+ Patch a measure. The body MUST include `revision_message`. Other keys are partial: `name`, `definition`, `archived`, `description`.
760
+
761
+ ```sh
762
+ cat patch.json | metabase measure update 1
763
+ metabase measure update 1 --file patch.json
764
+ metabase measure update 1 --body '{"name":"renamed","revision_message":"rename"}'
765
+ ```
766
+
767
+ | Flag | Description |
768
+ | --------------- | ----------------------- |
769
+ | `--body <json>` | Inline JSON body. |
770
+ | `--file <path>` | Path to JSON body file. |
771
+
772
+ ### `metabase measure archive <id>`
773
+
774
+ Soft-delete a measure by setting `archived: true`. The default revision message is `"Archived via metabase CLI"`; override with `--revision-message`.
775
+
776
+ ```sh
777
+ metabase measure archive 1
778
+ metabase measure archive 1 --revision-message "deprecated"
779
+ ```
780
+
781
+ | Flag | Description |
782
+ | --------------------------- | ------------------------------------------- |
783
+ | `--revision-message <text>` | Audit-log message recorded with the change. |
784
+
406
785
  ## Collections
407
786
 
408
787
  Read collections on `/api/collection`. Collections are the folders that contain cards, dashboards, and other collections. The list endpoint surfaces a virtual root collection (id `"root"`) alongside regular numeric ids; the get endpoint accepts only the numeric id.
@@ -1,7 +1,7 @@
1
1
  import { renderItem } from "./render-BYWlZPEH.mjs";
2
- import { connectionFlags, defineMetabaseCommand, outputFlags, profileFlag } from "./runtime-BlGbSVbh.mjs";
3
- import { parseId } from "./parse-id-DCdBU-nG.mjs";
4
- import { REMOTE_SYNC_PATHS } from "./poll-task-BiYw9iLs.mjs";
2
+ import { connectionFlags, defineMetabaseCommand, outputFlags, profileFlag } from "./runtime-Dlk-yyFO.mjs";
3
+ import { parseId } from "./parse-id-DKRTKFB2.mjs";
4
+ import { REMOTE_SYNC_PATHS } from "./poll-task-UMS6aAza.mjs";
5
5
  import { z } from "zod";
6
6
 
7
7
  //#region src/commands/sync/add-collection.ts
@@ -1,11 +1,11 @@
1
- import "./package-DW4n6lFo.mjs";
1
+ import "./package-Be4_p9f8.mjs";
2
2
  import "./command-augment-D9pI9Vbh.mjs";
3
3
  import "./render-BYWlZPEH.mjs";
4
4
  import "./errors-C6w1eZ1F.mjs";
5
- import "./runtime-BlGbSVbh.mjs";
6
- import "./parse-id-DCdBU-nG.mjs";
7
- import "./poll-task-BiYw9iLs.mjs";
8
- import "./poll-DaJLfYpK.mjs";
9
- import { SyncSettingsUpdateResult, add_collection_default, setCollectionRemoteSynced, syncSettingsUpdateView } from "./add-collection-D2VyeBlW.mjs";
5
+ import "./runtime-Dlk-yyFO.mjs";
6
+ import "./parse-id-DKRTKFB2.mjs";
7
+ import "./poll-task-UMS6aAza.mjs";
8
+ import "./poll-BXEPgd4X.mjs";
9
+ import { SyncSettingsUpdateResult, add_collection_default, setCollectionRemoteSynced, syncSettingsUpdateView } from "./add-collection-Cu4B6KXG.mjs";
10
10
 
11
11
  export { add_collection_default as default };
@@ -6,7 +6,7 @@ var api_key_default = defineCommand({
6
6
  name: "api-key",
7
7
  description: "Manage Metabase API keys"
8
8
  },
9
- subCommands: { create: () => import("./create-CSb4rEYN.mjs").then((mod) => mod.default) }
9
+ subCommands: { create: () => import("./create-DCAvWcNL.mjs").then((mod) => mod.default) }
10
10
  });
11
11
 
12
12
  //#endregion
@@ -0,0 +1,39 @@
1
+ import "./package-Be4_p9f8.mjs";
2
+ import "./command-augment-D9pI9Vbh.mjs";
3
+ import { renderItem } from "./render-BYWlZPEH.mjs";
4
+ import "./errors-C6w1eZ1F.mjs";
5
+ import { connectionFlags, defineMetabaseCommand, outputFlags, profileFlag } from "./runtime-Dlk-yyFO.mjs";
6
+ import { parseId } from "./parse-id-DKRTKFB2.mjs";
7
+ import { Snippet, snippetView } from "./snippet-DRTklDg3.mjs";
8
+
9
+ //#region src/commands/snippet/archive.ts
10
+ var archive_default = defineMetabaseCommand({
11
+ meta: {
12
+ name: "archive",
13
+ description: "Archive (soft-delete) a native query snippet by id"
14
+ },
15
+ args: {
16
+ ...outputFlags,
17
+ ...profileFlag,
18
+ ...connectionFlags,
19
+ id: {
20
+ type: "positional",
21
+ description: "Snippet id",
22
+ required: true
23
+ }
24
+ },
25
+ outputSchema: Snippet,
26
+ examples: ["metabase snippet archive 1", "metabase snippet archive 1 --json"],
27
+ async run({ args, ctx, getClient }) {
28
+ const id = parseId(args.id);
29
+ const client = await getClient();
30
+ const updated = await client.requestParsed(Snippet, `/api/native-query-snippet/${id}`, {
31
+ method: "PUT",
32
+ body: { archived: true }
33
+ });
34
+ renderItem(updated, snippetView, ctx);
35
+ }
36
+ });
37
+
38
+ //#endregion
39
+ export { archive_default as default };
@@ -0,0 +1,44 @@
1
+ import "./package-Be4_p9f8.mjs";
2
+ import "./command-augment-D9pI9Vbh.mjs";
3
+ import { renderItem } from "./render-BYWlZPEH.mjs";
4
+ import "./errors-C6w1eZ1F.mjs";
5
+ import { connectionFlags, defineMetabaseCommand, outputFlags, profileFlag } from "./runtime-Dlk-yyFO.mjs";
6
+ import { parseId } from "./parse-id-DKRTKFB2.mjs";
7
+ import { revisionMessageFlag } from "./revision-message-flag-BJiGjb5m.mjs";
8
+ import { Segment, segmentView } from "./segment-CQ5w3M_W.mjs";
9
+
10
+ //#region src/commands/segment/archive.ts
11
+ var archive_default = defineMetabaseCommand({
12
+ meta: {
13
+ name: "archive",
14
+ description: "Archive (soft-delete) a segment by id"
15
+ },
16
+ args: {
17
+ ...outputFlags,
18
+ ...profileFlag,
19
+ ...connectionFlags,
20
+ ...revisionMessageFlag,
21
+ id: {
22
+ type: "positional",
23
+ description: "Segment id",
24
+ required: true
25
+ }
26
+ },
27
+ outputSchema: Segment,
28
+ examples: ["metabase segment archive 1", "metabase segment archive 1 --revision-message \"deprecated\""],
29
+ async run({ args, ctx, getClient }) {
30
+ const id = parseId(args.id);
31
+ const client = await getClient();
32
+ const updated = await client.requestParsed(Segment, `/api/segment/${id}`, {
33
+ method: "PUT",
34
+ body: {
35
+ archived: true,
36
+ revision_message: args.revisionMessage
37
+ }
38
+ });
39
+ renderItem(updated, segmentView, ctx);
40
+ }
41
+ });
42
+
43
+ //#endregion
44
+ export { archive_default as default };
@@ -1,9 +1,9 @@
1
- import "./package-DW4n6lFo.mjs";
1
+ import "./package-Be4_p9f8.mjs";
2
2
  import "./command-augment-D9pI9Vbh.mjs";
3
3
  import { renderItem } from "./render-BYWlZPEH.mjs";
4
4
  import "./errors-C6w1eZ1F.mjs";
5
- import { connectionFlags, defineMetabaseCommand, outputFlags, profileFlag } from "./runtime-BlGbSVbh.mjs";
6
- import { parseId } from "./parse-id-DCdBU-nG.mjs";
5
+ import { connectionFlags, defineMetabaseCommand, outputFlags, profileFlag } from "./runtime-Dlk-yyFO.mjs";
6
+ import { parseId } from "./parse-id-DKRTKFB2.mjs";
7
7
  import { Card, cardView } from "./card-BOGKT258.mjs";
8
8
 
9
9
  //#region src/commands/card/archive.ts
@@ -0,0 +1,44 @@
1
+ import "./package-Be4_p9f8.mjs";
2
+ import "./command-augment-D9pI9Vbh.mjs";
3
+ import { renderItem } from "./render-BYWlZPEH.mjs";
4
+ import "./errors-C6w1eZ1F.mjs";
5
+ import { connectionFlags, defineMetabaseCommand, outputFlags, profileFlag } from "./runtime-Dlk-yyFO.mjs";
6
+ import { parseId } from "./parse-id-DKRTKFB2.mjs";
7
+ import { Measure, measureView } from "./measure-B1GKcZxO.mjs";
8
+ import { revisionMessageFlag } from "./revision-message-flag-BJiGjb5m.mjs";
9
+
10
+ //#region src/commands/measure/archive.ts
11
+ var archive_default = defineMetabaseCommand({
12
+ meta: {
13
+ name: "archive",
14
+ description: "Archive (soft-delete) a measure by id"
15
+ },
16
+ args: {
17
+ ...outputFlags,
18
+ ...profileFlag,
19
+ ...connectionFlags,
20
+ ...revisionMessageFlag,
21
+ id: {
22
+ type: "positional",
23
+ description: "Measure id",
24
+ required: true
25
+ }
26
+ },
27
+ outputSchema: Measure,
28
+ examples: ["metabase measure archive 1", "metabase measure archive 1 --revision-message \"deprecated\""],
29
+ async run({ args, ctx, getClient }) {
30
+ const id = parseId(args.id);
31
+ const client = await getClient();
32
+ const updated = await client.requestParsed(Measure, `/api/measure/${id}`, {
33
+ method: "PUT",
34
+ body: {
35
+ archived: true,
36
+ revision_message: args.revisionMessage
37
+ }
38
+ });
39
+ renderItem(updated, measureView, ctx);
40
+ }
41
+ });
42
+
43
+ //#endregion
44
+ export { archive_default as default };
@@ -0,0 +1,19 @@
1
+ import { defineCommand } from "citty";
2
+
3
+ //#region src/commands/auth/index.ts
4
+ var auth_default = defineCommand({
5
+ meta: {
6
+ name: "auth",
7
+ description: "Authenticate against a Metabase instance"
8
+ },
9
+ default: "login",
10
+ subCommands: {
11
+ login: () => import("./login-B30jvHfe.mjs").then((m) => m.default),
12
+ status: () => import("./status-Dg0qSJtP.mjs").then((m) => m.default),
13
+ list: () => import("./list-BB9IsaT4.mjs").then((m) => m.default),
14
+ logout: () => import("./logout-bWublBcN.mjs").then((m) => m.default)
15
+ }
16
+ });
17
+
18
+ //#endregion
19
+ export { auth_default as default };
@@ -1,6 +1,6 @@
1
1
  import { ConfigError } from "./errors-C6w1eZ1F.mjs";
2
2
  import { readInput } from "./input-DMcm_A5s.mjs";
3
- import { parseJson } from "./runtime-BlGbSVbh.mjs";
3
+ import { parseJson } from "./runtime-Dlk-yyFO.mjs";
4
4
 
5
5
  //#region src/runtime/body.ts
6
6
  async function readBody(sources, schema) {
@@ -1,10 +1,10 @@
1
- import "./package-DW4n6lFo.mjs";
1
+ import "./package-Be4_p9f8.mjs";
2
2
  import "./command-augment-D9pI9Vbh.mjs";
3
3
  import { renderList } from "./render-BYWlZPEH.mjs";
4
4
  import "./errors-C6w1eZ1F.mjs";
5
- import { connectionFlags, defineMetabaseCommand, listEnvelopeSchema, outputFlags, profileFlag, wrapList } from "./runtime-BlGbSVbh.mjs";
6
- import { REMOTE_SYNC_PATHS } from "./poll-task-BiYw9iLs.mjs";
7
- import "./poll-DaJLfYpK.mjs";
5
+ import { connectionFlags, defineMetabaseCommand, listEnvelopeSchema, outputFlags, profileFlag, wrapList } from "./runtime-Dlk-yyFO.mjs";
6
+ import { REMOTE_SYNC_PATHS } from "./poll-task-UMS6aAza.mjs";
7
+ import "./poll-BXEPgd4X.mjs";
8
8
  import { z } from "zod";
9
9
 
10
10
  //#region src/commands/sync/branches.ts
@@ -0,0 +1,56 @@
1
+ import "./package-Be4_p9f8.mjs";
2
+ import "./command-augment-D9pI9Vbh.mjs";
3
+ import { renderItem } from "./render-BYWlZPEH.mjs";
4
+ import "./errors-C6w1eZ1F.mjs";
5
+ import { connectionFlags, defineMetabaseCommand, outputFlags, profileFlag } from "./runtime-Dlk-yyFO.mjs";
6
+ import { parseId } from "./parse-id-DKRTKFB2.mjs";
7
+ import { z } from "zod";
8
+
9
+ //#region src/commands/transform/cancel.ts
10
+ const TransformCancelResult = z.object({
11
+ canceled: z.boolean(),
12
+ id: z.number().int()
13
+ });
14
+ const transformCancelView = {
15
+ compactPick: TransformCancelResult,
16
+ tableColumns: [{
17
+ key: "id",
18
+ label: "Transform"
19
+ }, {
20
+ key: "canceled",
21
+ label: "Canceled"
22
+ }]
23
+ };
24
+ var cancel_default = defineMetabaseCommand({
25
+ meta: {
26
+ name: "cancel",
27
+ description: "Cancel the current run for a transform"
28
+ },
29
+ args: {
30
+ ...outputFlags,
31
+ ...profileFlag,
32
+ ...connectionFlags,
33
+ id: {
34
+ type: "positional",
35
+ description: "Transform id",
36
+ required: true
37
+ }
38
+ },
39
+ outputSchema: TransformCancelResult,
40
+ examples: ["metabase transform cancel 1", "metabase transform cancel 1 --json"],
41
+ async run({ args, ctx, getClient }) {
42
+ const id = parseId(args.id);
43
+ const client = await getClient();
44
+ await client.requestRaw(`/api/transform/${id}/cancel`, {
45
+ method: "POST",
46
+ expectContentType: "binary"
47
+ });
48
+ renderItem({
49
+ canceled: true,
50
+ id
51
+ }, transformCancelView, ctx);
52
+ }
53
+ });
54
+
55
+ //#endregion
56
+ export { cancel_default as default };