@metabase/cli 0.1.15 → 0.1.17

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 (217) hide show
  1. package/README.md +69 -32
  2. package/dist/{add-collection-CXhrMjXU.mjs → add-collection-C-t9SQBk.mjs} +5 -5
  3. package/dist/add-collection-Dek6kiRI.mjs +11 -0
  4. package/dist/{archive-BUwiCFnd.mjs → archive-C7dnyzVY.mjs} +9 -7
  5. package/dist/{archive-Blc1dz8Z.mjs → archive-CaoUUTIb.mjs} +8 -7
  6. package/dist/{archive-D-Ovk0-E.mjs → archive-D1FX-sbU.mjs} +7 -6
  7. package/dist/{archive-CQiaCBSj.mjs → archive-DS-KEB4a.mjs} +7 -6
  8. package/dist/{archive-yTvDRQUZ.mjs → archive-LG8u7ec5.mjs} +7 -6
  9. package/dist/{archive-BxGSR7El.mjs → archive-qSOcACQo.mjs} +8 -6
  10. package/dist/{archive-Drt-rWvU.mjs → archive-wNXwIiF0.mjs} +8 -7
  11. package/dist/auth-Kv2MRkRk.mjs +22 -0
  12. package/dist/{body-B9XTTDEu.mjs → body-IcJ5kFtk.mjs} +3 -3
  13. package/dist/{branches-Ct3PK5U3.mjs → branches-BlNCTmFB.mjs} +7 -6
  14. package/dist/{cancel-tST8Bh0w.mjs → cancel-BnveTPNw.mjs} +6 -5
  15. package/dist/{cancel-task-BHnzRQKL.mjs → cancel-task-CSVI8Zgl.mjs} +7 -6
  16. package/dist/{capabilities-BX1rnVuH.mjs → capabilities-N0jo5U7S.mjs} +1 -1
  17. package/dist/card-Bp58WEUF.mjs +26 -0
  18. package/dist/{card-wCPcuKSi.mjs → card-DEmcRlNO.mjs} +6 -5
  19. package/dist/{cards-BySIFsLG.mjs → cards-CMgGA8OZ.mjs} +8 -6
  20. package/dist/cli.mjs +54 -26
  21. package/dist/collection-D8TI20Ir.mjs +23 -0
  22. package/dist/{collection-namespace-D8ohM5gD.mjs → collection-namespace-CsaxEqOb.mjs} +2 -2
  23. package/dist/command-augment-DdZIfx1V.mjs +11 -0
  24. package/dist/{create-HZ-9GMLx.mjs → create-AeWNv0v-.mjs} +9 -8
  25. package/dist/create-B1xfaZJB.mjs +35 -0
  26. package/dist/{create-DxDD6n1d.mjs → create-B6LQutd0.mjs} +17 -12
  27. package/dist/{create-C7FPeJqF.mjs → create-B79M8YpX.mjs} +10 -9
  28. package/dist/{create-DGxZmbxh.mjs → create-Bg_uMu0p.mjs} +9 -8
  29. package/dist/{create-C43RQYgj.mjs → create-BpkWlgoR.mjs} +18 -12
  30. package/dist/{create-DnT1Sayk.mjs → create-C7u3umLj.mjs} +9 -8
  31. package/dist/{create-4mAGsBd0.mjs → create-FZOrCw5k.mjs} +21 -12
  32. package/dist/{create-fIDFkdox.mjs → create-I5Cv-MBa.mjs} +16 -11
  33. package/dist/{create-D3cVDtxM.mjs → create-LHqwcVbS.mjs} +16 -11
  34. package/dist/{create-BDWthCYq.mjs → create-SHKlj0z3.mjs} +9 -8
  35. package/dist/{create-branch-jPE7nW-E.mjs → create-branch-CGyT99Ny.mjs} +7 -6
  36. package/dist/{current-task-rW54KJax.mjs → current-task-C-0hw2Ae.mjs} +7 -6
  37. package/dist/dashboard-C9pQCnX6.mjs +28 -0
  38. package/dist/{dashboard-B4bn3z6t.mjs → dashboard-DOplbKyQ.mjs} +7 -5
  39. package/dist/{database-BmsxuRmO.mjs → database-D9fftP-i.mjs} +1 -1
  40. package/dist/db-DWykmBOh.mjs +28 -0
  41. package/dist/{delete-BWO6uB4P.mjs → delete--NYYN6wv.mjs} +8 -7
  42. package/dist/{delete-CeigtfRI.mjs → delete-Do3nn9sl.mjs} +8 -7
  43. package/dist/{delete-runtime-PzLFavb0.mjs → delete-runtime-B0ha5QR4.mjs} +3 -3
  44. package/dist/{delete-CBwztF6P.mjs → delete-tCVrYjKD.mjs} +8 -7
  45. package/dist/{delete-table-BXzvDEPG.mjs → delete-table-CWSGPw0i.mjs} +8 -7
  46. package/dist/{dependencies-D2N9eqm1.mjs → dependencies-CyFocD8I.mjs} +7 -6
  47. package/dist/{dirty-DoEZRSGB.mjs → dirty-BXM0YJ_a.mjs} +7 -6
  48. package/dist/document-DNDm8_Py.mjs +22 -0
  49. package/dist/{eid-1mROiwJr.mjs → eid-p-zn_1RJ.mjs} +13 -7
  50. package/dist/{error-D5bZ5BUX.mjs → error-5H_tcfL8.mjs} +2 -2
  51. package/dist/{export-Bgv5B4_F.mjs → export-B_8wghyo.mjs} +9 -8
  52. package/dist/field-CFt1-KDR.mjs +21 -0
  53. package/dist/{fields-VA7tXHJz.mjs → fields-BsufL9kv.mjs} +8 -7
  54. package/dist/{get-DAsaor0n.mjs → get-4lufgahL.mjs} +7 -6
  55. package/dist/{get-B8etVxWD.mjs → get-68P-L4ja.mjs} +7 -6
  56. package/dist/{get-qnGGGRTa.mjs → get-B45uYMAs.mjs} +8 -6
  57. package/dist/get-B67pe00Z.mjs +36 -0
  58. package/dist/{get-DvQoDU2m.mjs → get-BJoZkATD.mjs} +7 -6
  59. package/dist/{get-BgIE_YEg.mjs → get-BTKeO4vE.mjs} +7 -6
  60. package/dist/{get-RQFSmnpY.mjs → get-C7mq17-2.mjs} +7 -6
  61. package/dist/{get-CGkhSY5L.mjs → get-CDLa6LiC.mjs} +9 -8
  62. package/dist/{get-D9o38nK5.mjs → get-CPw0ROO4.mjs} +7 -6
  63. package/dist/{get-Wj88mnhn.mjs → get-Cl5Ak73C.mjs} +9 -7
  64. package/dist/{get-CqnCaosn.mjs → get-D3k2JUsa.mjs} +7 -6
  65. package/dist/{get-C-UeGtgW.mjs → get-DTqBuIf3.mjs} +6 -5
  66. package/dist/{get-eUYDNALt.mjs → get-DeLnNVQE.mjs} +8 -7
  67. package/dist/{get-DLRBq8kR.mjs → get-Df_3LCVC.mjs} +7 -6
  68. package/dist/{get-BtAD26gc.mjs → get-DurjkUKJ.mjs} +7 -6
  69. package/dist/{get-run-CATz-XMS.mjs → get-run-Dq4qfGfD.mjs} +7 -6
  70. package/dist/git-sync-ByvjqSiy.mjs +31 -0
  71. package/dist/group-BNE_RiH5.mjs +28 -0
  72. package/dist/{has-remote-changes-B6YEMC90.mjs → has-remote-changes-E-4N_O_t.mjs} +7 -6
  73. package/dist/{import-Bl2Wj9Xf.mjs → import-Dg0j3HCP.mjs} +9 -8
  74. package/dist/{input-BXWgdKiS.mjs → input-7Sj85_K7.mjs} +1 -1
  75. package/dist/is-dirty-D7UMN0mt.mjs +10 -0
  76. package/dist/{is-dirty-D9MoFj0T.mjs → is-dirty-DWw1yBeR.mjs} +4 -4
  77. package/dist/{items-LjtICjvX.mjs → items-CQtt9X4M.mjs} +9 -8
  78. package/dist/{key-C8q5oIr5.mjs → key-bltP32Pm.mjs} +1 -1
  79. package/dist/library-B5AvpACG.mjs +24 -0
  80. package/dist/{list-ChK06rJh.mjs → list-B1uVWy6A.mjs} +8 -6
  81. package/dist/{list-DaJk60dd.mjs → list-BAOTQHst.mjs} +6 -5
  82. package/dist/{list-C410Ptw_.mjs → list-BF-W4jOZ.mjs} +9 -7
  83. package/dist/{list-DMik04Dh.mjs → list-BFVuPodI.mjs} +6 -5
  84. package/dist/{list-DfoNv0gb.mjs → list-BHAWYZ1z.mjs} +6 -5
  85. package/dist/{list-DcjenlTM.mjs → list-BKUvhAs4.mjs} +6 -5
  86. package/dist/{list-Dq86BAMG.mjs → list-BgUWqZa2.mjs} +8 -7
  87. package/dist/{list-CfWblVHJ.mjs → list-C4bALfCs.mjs} +7 -6
  88. package/dist/{list-CoRX8Ruc.mjs → list-C9O2RY5u.mjs} +6 -5
  89. package/dist/{list-cnqPlJgC.mjs → list-CfqpDTna.mjs} +6 -5
  90. package/dist/{list-C6U3Ftg8.mjs → list-CvhVYOVl.mjs} +7 -6
  91. package/dist/{list-B5Q7E2Km.mjs → list-D3TSAqwl.mjs} +6 -5
  92. package/dist/list-D5Gdz8hi.mjs +100 -0
  93. package/dist/{list-Bjp9nd0o.mjs → list-DG0FIhTK.mjs} +6 -5
  94. package/dist/{list-DtrfE0sF.mjs → list-KxQNqp4T.mjs} +8 -7
  95. package/dist/{login-Cn2UtFUt.mjs → login-Bt6j6yBM.mjs} +10 -9
  96. package/dist/{logout-_HXgEmqA.mjs → logout-ANkL02p0.mjs} +6 -5
  97. package/dist/{manifest-DYeLri80.mjs → manifest-BVf8P4bl.mjs} +9 -2
  98. package/dist/measure-CgFwtL1r.mjs +25 -0
  99. package/dist/{metadata-8yqT8OZI.mjs → metadata-ClehtgZj.mjs} +9 -8
  100. package/dist/{metadata-DHODjg1d.mjs → metadata-DplshwI3.mjs} +8 -7
  101. package/dist/{command-augment-CAur0XOQ.mjs → notice-DyVl5aYB.mjs} +1 -11
  102. package/dist/parameter-CiJ4CwWE.mjs +118 -0
  103. package/dist/parameter-values-D4J8Ctu0.mjs +56 -0
  104. package/dist/{parse-enum-BatHQ-Gs.mjs → parse-enum-BL9i_brN.mjs} +1 -1
  105. package/dist/{parse-id-DNPeV0Iu.mjs → parse-id-D4LeTUsP.mjs} +1 -1
  106. package/dist/{parse-ref-CZr1bYIl.mjs → parse-ref-CB_KvF9h.mjs} +1 -1
  107. package/dist/{path-BflajM08.mjs → path-5nQgdvrs.mjs} +6 -5
  108. package/dist/{poll-CYkX02Bm.mjs → poll-BpAJpvb-.mjs} +2 -2
  109. package/dist/{poll-task-oXpl3wzp.mjs → poll-task-TilgciQn.mjs} +2 -2
  110. package/dist/{preflight-BdJr2amA.mjs → preflight-OfHU3Toi.mjs} +4 -4
  111. package/dist/{process-DsGf7Mg5.mjs → process-j8UHMHc2.mjs} +1 -1
  112. package/dist/{prompt-Bc_bHSD0.mjs → prompt-C85xd9HR.mjs} +1 -1
  113. package/dist/publish-DKiqyDwo.mjs +67 -0
  114. package/dist/{query-CxTjguwp.mjs → query-BWJ5h1g3.mjs} +19 -13
  115. package/dist/{query-DWQaN7hO.mjs → query-CQ3xXa9P.mjs} +10 -8
  116. package/dist/{query-result-L5_NrwQR.mjs → query-result-D6mfoVfQ.mjs} +1 -1
  117. package/dist/{remove-collection-BwcFi8Fs.mjs → remove-collection-CO-aMzTO.mjs} +9 -8
  118. package/dist/{rescan-values-B9Qtsd32.mjs → rescan-values-DpL6LGAK.mjs} +9 -8
  119. package/dist/resolve-Dj2MTBkn.mjs +84 -0
  120. package/dist/{run-C-vftXCu.mjs → run-DUcdaZs3.mjs} +6 -5
  121. package/dist/{run-3eFtdI2Z.mjs → run-QYJ-mAaG.mjs} +9 -8
  122. package/dist/{runs-CpRTkn1W.mjs → runs-DgasTnGd.mjs} +8 -7
  123. package/dist/{runtime-C1QgWHM7.mjs → runtime-BJtuxWM8.mjs} +5 -3
  124. package/dist/{schema-tables-rdeupgsu.mjs → schema-tables-ooYjimrV.mjs} +8 -7
  125. package/dist/{schemas-Cr7RjYqV.mjs → schemas-HjFPzsd-.mjs} +6 -5
  126. package/dist/{search-D7Yq2MDu.mjs → search-vaT5EwhG.mjs} +11 -5
  127. package/dist/segment-BPC725mo.mjs +25 -0
  128. package/dist/{selectors-DPc2ZDdd.mjs → selectors-DlmZpo2L.mjs} +4 -4
  129. package/dist/{set-X2N6x7pe.mjs → set-CLHJauzG.mjs} +9 -8
  130. package/dist/{set-active-BoBa3pOw.mjs → set-active-oZOUe9V7.mjs} +6 -5
  131. package/dist/setting-DHYO-W5g.mjs +20 -0
  132. package/dist/{setup-C47WUieB.mjs → setup-D1de5Sbc.mjs} +8 -7
  133. package/dist/{skills-CJ8g8fhQ.mjs → skills-B6gfH0iR.mjs} +1 -1
  134. package/dist/{skills-Po0YPVU5.mjs → skills-NhgVypJ7.mjs} +3 -3
  135. package/dist/snippet-DtLmHr2J.mjs +22 -0
  136. package/dist/{stash-BV4sEp73.mjs → stash-DoRwelwY.mjs} +9 -8
  137. package/dist/{status-BKF9rRnk.mjs → status-BpMOlfsA.mjs} +8 -7
  138. package/dist/{status-Cf8c0NON.mjs → status-CmRgHTrV.mjs} +6 -5
  139. package/dist/{summary-RgLcBcEh.mjs → summary-BEu7pmpq.mjs} +7 -6
  140. package/dist/{sync-schema-DKEel2Sv.mjs → sync-schema-DTUXubMg.mjs} +11 -10
  141. package/dist/table-B1iBqmNu.mjs +22 -0
  142. package/dist/{table-qDD2kApF.mjs → table-DE3i82T_.mjs} +9 -2
  143. package/dist/transform-BuIooRQh.mjs +31 -0
  144. package/dist/transform-job-C3yz0krA.mjs +25 -0
  145. package/dist/transform-tag-CJD6mJUe.mjs +21 -0
  146. package/dist/{transforms-BOQ9CG0l.mjs → transforms-CWvMpLc9.mjs} +7 -6
  147. package/dist/{tree-CF8mscd9.mjs → tree-D18vYSe4.mjs} +6 -5
  148. package/dist/{unpublish-CmaRNjK3.mjs → unpublish-CJbL4ZsC.mjs} +20 -18
  149. package/dist/{update-Kz4kyqY_.mjs → update-7DacwIvi.mjs} +10 -9
  150. package/dist/{update-CgQOSuZt.mjs → update-BjjZIe2W.mjs} +10 -9
  151. package/dist/{update-nwXgVNQa.mjs → update-Bos8nnv0.mjs} +18 -13
  152. package/dist/{update-BXZBEeUp.mjs → update-BvsvyBw9.mjs} +17 -12
  153. package/dist/{update-DQPg0_-d.mjs → update-CSxwZ2us.mjs} +11 -10
  154. package/dist/{update-BuypOaXq.mjs → update-Ck0Kxv8u.mjs} +10 -9
  155. package/dist/{update-B59h7KmS.mjs → update-DV7IY7IQ.mjs} +10 -9
  156. package/dist/{update-DERsb0eO.mjs → update-DhOfrW1j.mjs} +19 -13
  157. package/dist/{update-DR4WkAET.mjs → update-Doia9MP_.mjs} +17 -12
  158. package/dist/{update-rhfPHALN.mjs → update-Dxa_6H2A.mjs} +22 -13
  159. package/dist/{update-dashcard-BJVeSGvO.mjs → update-dashcard-CZUWZhal.mjs} +11 -9
  160. package/dist/{update-DoQpy9SA.mjs → update-mr9todHq.mjs} +10 -9
  161. package/dist/{upgrade-CNrkJF6s.mjs → upgrade-CBW8V9qZ.mjs} +7 -6
  162. package/dist/{uuid-Dpl3ALKq.mjs → uuid-D6JVJ-R1.mjs} +10 -5
  163. package/dist/{validate-VawhJ5Sc.mjs → validate-BqNW4Sk1.mjs} +2 -2
  164. package/dist/{validate-query-CSV-TTnd.mjs → validate-query-CcZVKYPV.mjs} +3 -3
  165. package/dist/{values-DMYpkoEH.mjs → values-DBvuGnnA.mjs} +7 -6
  166. package/dist/{verify-By9ZYzx4.mjs → verify-LIShMNZ2.mjs} +2 -2
  167. package/dist/{wait-BzIAj8lJ.mjs → wait-DUHze3_B.mjs} +8 -7
  168. package/dist/{wait-flags-DQrxnlwv.mjs → wait-flags-Ybpt98PK.mjs} +2 -2
  169. package/package.json +1 -1
  170. package/skill-data/core/SKILL.md +45 -57
  171. package/skill-data/data-workflow/SKILL.md +116 -0
  172. package/skill-data/{data-analysis/SKILL.md → data-workflow/references/answering-questions.md} +7 -13
  173. package/skill-data/{data-transformation/SKILL.md → data-workflow/references/building-clean-tables.md} +46 -48
  174. package/skill-data/{semantic-layer/SKILL.md → data-workflow/references/reusable-definitions.md} +29 -54
  175. package/skill-data/document/SKILL.md +10 -20
  176. package/skill-data/git-sync/SKILL.md +36 -36
  177. package/skill-data/mbql/SKILL.md +3 -15
  178. package/skill-data/mbql/references/operators.md +9 -0
  179. package/skill-data/transform/SKILL.md +26 -42
  180. package/skill-data/visualization/SKILL.md +6 -6
  181. package/skill-data/visualization/references/settings.md +12 -0
  182. package/skills/metabase-cli/SKILL.md +2 -2
  183. package/dist/add-collection-Bnuh0d4j.mjs +0 -10
  184. package/dist/auth-Bkue4Psy.mjs +0 -19
  185. package/dist/card-faWo9ZWU.mjs +0 -20
  186. package/dist/collection-DcRz7fmf.mjs +0 -20
  187. package/dist/dashboard-pXAxJTTx.mjs +0 -21
  188. package/dist/db-CmHHj5eI.mjs +0 -22
  189. package/dist/document-DQIhL75C.mjs +0 -19
  190. package/dist/field-B-UcqFzm.mjs +0 -18
  191. package/dist/git-sync-CwOvcUI2.mjs +0 -28
  192. package/dist/is-dirty-MT0BT4CS.mjs +0 -9
  193. package/dist/list-Cx8JxS2C.mjs +0 -42
  194. package/dist/measure-BIAoqgcS.mjs +0 -19
  195. package/dist/publish-CGUkIqSm.mjs +0 -70
  196. package/dist/segment-BN8sFunv.mjs +0 -19
  197. package/dist/setting-zZjcOPyE.mjs +0 -17
  198. package/dist/snippet-DK0ZA8m5.mjs +0 -19
  199. package/dist/table-COAKXNuj.mjs +0 -21
  200. package/dist/transform-Bto4U82j.mjs +0 -25
  201. package/dist/transform-job-_fW1y2tg.mjs +0 -22
  202. package/dist/transform-tag-C8n1oTr1.mjs +0 -18
  203. package/skill-data/robot-data-engineer/SKILL.md +0 -142
  204. /package/dist/{body-flags-D7q87Btw.mjs → body-flags-DWTTxJpP.mjs} +0 -0
  205. /package/dist/{collection-Deiziuu2.mjs → collection-DrLpA1SO.mjs} +0 -0
  206. /package/dist/{document-qfwR0r63.mjs → document-1W7NRaO_.mjs} +0 -0
  207. /package/dist/{field-E0IBy4Uw.mjs → field-CMY_LWUe.mjs} +0 -0
  208. /package/dist/{measure-JJAdFoqK.mjs → measure-DoJvtCaA.mjs} +0 -0
  209. /package/dist/{paginate-BexjkjbY.mjs → paginate-FVZUxL4J.mjs} +0 -0
  210. /package/dist/{render-CkuFkWlQ.mjs → render-BTKnWL0d.mjs} +0 -0
  211. /package/dist/{revision-message-flag-C7zBeWEt.mjs → revision-message-flag-CHrJgFFx.mjs} +0 -0
  212. /package/dist/{segment-B9SEv9V_.mjs → segment-TXktTCfU.mjs} +0 -0
  213. /package/dist/{setting-i0pugNHl.mjs → setting-m46MUtW5.mjs} +0 -0
  214. /package/dist/{snippet-NNzqlksR.mjs → snippet-CtA2Pkoa.mjs} +0 -0
  215. /package/dist/{transform-n376akp8.mjs → transform-DEF38FWe.mjs} +0 -0
  216. /package/dist/{transform-job-C8lIS-7Q.mjs → transform-job-CtixL4An.mjs} +0 -0
  217. /package/dist/{transform-tag-DB46AhAj.mjs → transform-tag-rsIrckCM.mjs} +0 -0
@@ -1,18 +0,0 @@
1
- import { defineCommand } from "citty";
2
-
3
- //#region src/commands/field/index.ts
4
- var field_default = defineCommand({
5
- meta: {
6
- name: "field",
7
- description: "Manage Metabase fields"
8
- },
9
- subCommands: {
10
- get: () => import("./get-RQFSmnpY.mjs").then((m) => m.default),
11
- values: () => import("./values-DMYpkoEH.mjs").then((m) => m.default),
12
- summary: () => import("./summary-RgLcBcEh.mjs").then((m) => m.default),
13
- update: () => import("./update-DoQpy9SA.mjs").then((m) => m.default)
14
- }
15
- });
16
-
17
- //#endregion
18
- export { field_default as default };
@@ -1,28 +0,0 @@
1
- import { defineCommand } from "citty";
2
-
3
- //#region src/commands/git-sync/index.ts
4
- var git_sync_default = defineCommand({
5
- meta: {
6
- name: "git-sync",
7
- description: "Sync Metabase content with a git remote"
8
- },
9
- subCommands: {
10
- status: () => import("./status-BKF9rRnk.mjs").then((mod) => mod.default),
11
- "is-dirty": () => import("./is-dirty-MT0BT4CS.mjs").then((mod) => mod.default),
12
- "has-remote-changes": () => import("./has-remote-changes-B6YEMC90.mjs").then((mod) => mod.default),
13
- dirty: () => import("./dirty-DoEZRSGB.mjs").then((mod) => mod.default),
14
- "current-task": () => import("./current-task-rW54KJax.mjs").then((mod) => mod.default),
15
- "cancel-task": () => import("./cancel-task-BHnzRQKL.mjs").then((mod) => mod.default),
16
- wait: () => import("./wait-BzIAj8lJ.mjs").then((mod) => mod.default),
17
- import: () => import("./import-Bl2Wj9Xf.mjs").then((mod) => mod.default),
18
- export: () => import("./export-Bgv5B4_F.mjs").then((mod) => mod.default),
19
- stash: () => import("./stash-BV4sEp73.mjs").then((mod) => mod.default),
20
- branches: () => import("./branches-Ct3PK5U3.mjs").then((mod) => mod.default),
21
- "create-branch": () => import("./create-branch-jPE7nW-E.mjs").then((mod) => mod.default),
22
- "add-collection": () => import("./add-collection-Bnuh0d4j.mjs").then((mod) => mod.default),
23
- "remove-collection": () => import("./remove-collection-BwcFi8Fs.mjs").then((mod) => mod.default)
24
- }
25
- });
26
-
27
- //#endregion
28
- export { git_sync_default as default };
@@ -1,9 +0,0 @@
1
- import "./command-augment-CAur0XOQ.mjs";
2
- import "./error-D5bZ5BUX.mjs";
3
- import "./runtime-C1QgWHM7.mjs";
4
- import "./capabilities-BX1rnVuH.mjs";
5
- import "./poll-CYkX02Bm.mjs";
6
- import "./poll-task-oXpl3wzp.mjs";
7
- import { IsDirtyResult, is_dirty_default } from "./is-dirty-D9MoFj0T.mjs";
8
-
9
- export { is_dirty_default as default };
@@ -1,42 +0,0 @@
1
- import "./command-augment-CAur0XOQ.mjs";
2
- import { listEnvelopeSchema, outputFlags, wrapList } from "./error-D5bZ5BUX.mjs";
3
- import { defineMetabaseCommand } from "./runtime-C1QgWHM7.mjs";
4
- import { renderList } from "./capabilities-BX1rnVuH.mjs";
5
- import { loadVisibleSkills } from "./skills-CJ8g8fhQ.mjs";
6
- import { z } from "zod";
7
-
8
- //#region src/commands/skills/list.ts
9
- const SkillSummary = z.object({
10
- name: z.string(),
11
- description: z.string()
12
- });
13
- const SkillListEnvelope = listEnvelopeSchema(SkillSummary);
14
- const skillSummaryView = {
15
- compactPick: SkillSummary,
16
- tableColumns: [{
17
- key: "name",
18
- label: "Name"
19
- }, {
20
- key: "description",
21
- label: "Description"
22
- }]
23
- };
24
- var list_default = defineMetabaseCommand({
25
- meta: {
26
- name: "list",
27
- description: "List CLI-bundled skills — always consult the matching skill before acting on a task; they are the source of truth for every workflow."
28
- },
29
- args: { ...outputFlags },
30
- outputSchema: SkillListEnvelope,
31
- examples: ["mb skills list", "mb skills list --json"],
32
- run({ ctx }) {
33
- const items = loadVisibleSkills().map((s) => ({
34
- name: s.name,
35
- description: s.description
36
- }));
37
- renderList(wrapList(items), skillSummaryView, ctx);
38
- }
39
- });
40
-
41
- //#endregion
42
- export { list_default as default };
@@ -1,19 +0,0 @@
1
- import { defineCommand } from "citty";
2
-
3
- //#region src/commands/measure/index.ts
4
- var measure_default = defineCommand({
5
- meta: {
6
- name: "measure",
7
- description: "Manage Metabase measures"
8
- },
9
- subCommands: {
10
- list: () => import("./list-DfoNv0gb.mjs").then((mod) => mod.default),
11
- get: () => import("./get-DLRBq8kR.mjs").then((mod) => mod.default),
12
- create: () => import("./create-D3cVDtxM.mjs").then((mod) => mod.default),
13
- update: () => import("./update-BXZBEeUp.mjs").then((mod) => mod.default),
14
- archive: () => import("./archive-Drt-rWvU.mjs").then((mod) => mod.default)
15
- }
16
- });
17
-
18
- //#endregion
19
- export { measure_default as default };
@@ -1,70 +0,0 @@
1
- import { ConfigError } from "./command-augment-CAur0XOQ.mjs";
2
- import { connectionFlags, outputFlags, profileFlag } from "./error-D5bZ5BUX.mjs";
3
- import { defineMetabaseCommand } from "./runtime-C1QgWHM7.mjs";
4
- import { renderSummary } from "./capabilities-BX1rnVuH.mjs";
5
- import { parseId } from "./parse-id-DNPeV0Iu.mjs";
6
- import { Collection, CollectionCompact } from "./collection-Deiziuu2.mjs";
7
- import { parseTableSelectors, tableSelectorFlags } from "./selectors-DPc2ZDdd.mjs";
8
- import { z } from "zod";
9
-
10
- //#region src/commands/table/publish.ts
11
- const TablePublishResult = z.object({ target_collection: Collection.nullable() });
12
- const TablePublishResultCompact = z.object({ target_collection: CollectionCompact.nullable() });
13
- const tablePublishResultView = {
14
- compactPick: TablePublishResultCompact,
15
- tableColumns: [{
16
- key: "target_collection",
17
- label: "Target collection"
18
- }]
19
- };
20
- var publish_default = defineMetabaseCommand({
21
- meta: {
22
- name: "publish",
23
- description: "Publish tables (and their upstream dependencies) to a library collection"
24
- },
25
- details: "Sets the collection for each selected table and recursively for every upstream table it depends on, surfacing them as trusted data sources in the library. Select tables with --table-ids, whole databases with --db-ids, or schemas with --schemas (each schema id is \"<db-id>:<schema>\", e.g. 1:public); the filters are combined. The target must be a `library-data` collection.",
26
- capabilities: {
27
- minVersion: 59,
28
- tokenFeature: "library"
29
- },
30
- args: {
31
- ...outputFlags,
32
- ...profileFlag,
33
- ...connectionFlags,
34
- "collection-id": {
35
- type: "string",
36
- description: "Target library collection id"
37
- },
38
- ...tableSelectorFlags
39
- },
40
- outputSchema: TablePublishResult,
41
- examples: [
42
- "mb table publish --collection-id 12 --table-ids 1,2,3",
43
- "mb table publish --collection-id 12 --db-ids 1 --json",
44
- "mb table publish --collection-id 12 --schemas 1:public,1:analytics"
45
- ],
46
- async run({ args, ctx, getClient }) {
47
- const collectionRaw = args["collection-id"];
48
- if (collectionRaw === void 0 || collectionRaw === "") throw new ConfigError("provide a target library collection with --collection-id <id>");
49
- const collectionId = parseId(collectionRaw, "collection id");
50
- const selectors = parseTableSelectors(args);
51
- const body = {
52
- collection_id: collectionId,
53
- ...selectors
54
- };
55
- const client = await getClient();
56
- const result = await client.requestParsed(TablePublishResult, "/api/ee/data-studio/table/publish-tables", {
57
- method: "POST",
58
- body
59
- });
60
- renderSummary(result, tablePublishResultView, summaryLine(result), ctx);
61
- }
62
- });
63
- function summaryLine(result) {
64
- const collection = result.target_collection;
65
- if (collection === null) return "Published tables to the library.";
66
- return `Published tables to collection ${collection.id} "${collection.name}".`;
67
- }
68
-
69
- //#endregion
70
- export { publish_default as default };
@@ -1,19 +0,0 @@
1
- import { defineCommand } from "citty";
2
-
3
- //#region src/commands/segment/index.ts
4
- var segment_default = defineCommand({
5
- meta: {
6
- name: "segment",
7
- description: "Manage Metabase segments"
8
- },
9
- subCommands: {
10
- list: () => import("./list-DcjenlTM.mjs").then((mod) => mod.default),
11
- get: () => import("./get-CqnCaosn.mjs").then((mod) => mod.default),
12
- create: () => import("./create-fIDFkdox.mjs").then((mod) => mod.default),
13
- update: () => import("./update-DR4WkAET.mjs").then((mod) => mod.default),
14
- archive: () => import("./archive-Blc1dz8Z.mjs").then((mod) => mod.default)
15
- }
16
- });
17
-
18
- //#endregion
19
- export { segment_default as default };
@@ -1,17 +0,0 @@
1
- import { defineCommand } from "citty";
2
-
3
- //#region src/commands/setting/index.ts
4
- var setting_default = defineCommand({
5
- meta: {
6
- name: "setting",
7
- description: "Inspect and update Metabase settings"
8
- },
9
- subCommands: {
10
- list: () => import("./list-CoRX8Ruc.mjs").then((m) => m.default),
11
- get: () => import("./get-D9o38nK5.mjs").then((m) => m.default),
12
- set: () => import("./set-X2N6x7pe.mjs").then((m) => m.default)
13
- }
14
- });
15
-
16
- //#endregion
17
- export { setting_default as default };
@@ -1,19 +0,0 @@
1
- import { defineCommand } from "citty";
2
-
3
- //#region src/commands/snippet/index.ts
4
- var snippet_default = defineCommand({
5
- meta: {
6
- name: "snippet",
7
- description: "Manage Metabase native query snippets"
8
- },
9
- subCommands: {
10
- list: () => import("./list-cnqPlJgC.mjs").then((mod) => mod.default),
11
- get: () => import("./get-B8etVxWD.mjs").then((mod) => mod.default),
12
- create: () => import("./create-BDWthCYq.mjs").then((mod) => mod.default),
13
- update: () => import("./update-BuypOaXq.mjs").then((mod) => mod.default),
14
- archive: () => import("./archive-D-Ovk0-E.mjs").then((mod) => mod.default)
15
- }
16
- });
17
-
18
- //#endregion
19
- export { snippet_default as default };
@@ -1,21 +0,0 @@
1
- import { defineCommand } from "citty";
2
-
3
- //#region src/commands/table/index.ts
4
- var table_default = defineCommand({
5
- meta: {
6
- name: "table",
7
- description: "Manage Metabase tables"
8
- },
9
- subCommands: {
10
- list: () => import("./list-DtrfE0sF.mjs").then((m) => m.default),
11
- get: () => import("./get-eUYDNALt.mjs").then((m) => m.default),
12
- metadata: () => import("./metadata-DHODjg1d.mjs").then((m) => m.default),
13
- fields: () => import("./fields-VA7tXHJz.mjs").then((m) => m.default),
14
- update: () => import("./update-DQPg0_-d.mjs").then((m) => m.default),
15
- publish: () => import("./publish-CGUkIqSm.mjs").then((m) => m.default),
16
- unpublish: () => import("./unpublish-CmaRNjK3.mjs").then((m) => m.default)
17
- }
18
- });
19
-
20
- //#endregion
21
- export { table_default as default };
@@ -1,25 +0,0 @@
1
- import { defineCommand } from "citty";
2
-
3
- //#region src/commands/transform/index.ts
4
- var transform_default = defineCommand({
5
- meta: {
6
- name: "transform",
7
- description: "Manage Metabase transforms"
8
- },
9
- subCommands: {
10
- list: () => import("./list-DMik04Dh.mjs").then((mod) => mod.default),
11
- get: () => import("./get-BgIE_YEg.mjs").then((mod) => mod.default),
12
- dependencies: () => import("./dependencies-D2N9eqm1.mjs").then((mod) => mod.default),
13
- create: () => import("./create-DxDD6n1d.mjs").then((mod) => mod.default),
14
- update: () => import("./update-nwXgVNQa.mjs").then((mod) => mod.default),
15
- delete: () => import("./delete-BWO6uB4P.mjs").then((mod) => mod.default),
16
- "delete-table": () => import("./delete-table-BXzvDEPG.mjs").then((mod) => mod.default),
17
- run: () => import("./run-3eFtdI2Z.mjs").then((mod) => mod.default),
18
- cancel: () => import("./cancel-tST8Bh0w.mjs").then((mod) => mod.default),
19
- "get-run": () => import("./get-run-CATz-XMS.mjs").then((mod) => mod.default),
20
- runs: () => import("./runs-CpRTkn1W.mjs").then((mod) => mod.default)
21
- }
22
- });
23
-
24
- //#endregion
25
- export { transform_default as default };
@@ -1,22 +0,0 @@
1
- import { defineCommand } from "citty";
2
-
3
- //#region src/commands/transform-job/index.ts
4
- var transform_job_default = defineCommand({
5
- meta: {
6
- name: "transform-job",
7
- description: "Manage Metabase transform jobs"
8
- },
9
- subCommands: {
10
- list: () => import("./list-B5Q7E2Km.mjs").then((mod) => mod.default),
11
- get: () => import("./get-DvQoDU2m.mjs").then((mod) => mod.default),
12
- create: () => import("./create-DGxZmbxh.mjs").then((mod) => mod.default),
13
- update: () => import("./update-B59h7KmS.mjs").then((mod) => mod.default),
14
- delete: () => import("./delete-CeigtfRI.mjs").then((mod) => mod.default),
15
- run: () => import("./run-C-vftXCu.mjs").then((mod) => mod.default),
16
- transforms: () => import("./transforms-BOQ9CG0l.mjs").then((mod) => mod.default),
17
- "set-active": () => import("./set-active-BoBa3pOw.mjs").then((mod) => mod.default)
18
- }
19
- });
20
-
21
- //#endregion
22
- export { transform_job_default as default };
@@ -1,18 +0,0 @@
1
- import { defineCommand } from "citty";
2
-
3
- //#region src/commands/transform-tag/index.ts
4
- var transform_tag_default = defineCommand({
5
- meta: {
6
- name: "transform-tag",
7
- description: "Manage Metabase transform tags"
8
- },
9
- subCommands: {
10
- list: () => import("./list-DaJk60dd.mjs").then((mod) => mod.default),
11
- create: () => import("./create-HZ-9GMLx.mjs").then((mod) => mod.default),
12
- update: () => import("./update-Kz4kyqY_.mjs").then((mod) => mod.default),
13
- delete: () => import("./delete-CBwztF6P.mjs").then((mod) => mod.default)
14
- }
15
- });
16
-
17
- //#endregion
18
- export { transform_tag_default as default };
@@ -1,142 +0,0 @@
1
- ---
2
- name: robot-data-engineer
3
- description: The front door for turning a database into something a non-technical person can use - clean tables, reusable definitions, dashboards, and answers - all through the `mb` CLI. A light router - it works out where the user is (raw data? clean tables? ready to chart? just need a question answered?), sets up auth and how hands-on they want to be, then loads the right specialized skill. Load when someone wants to "make sense of my data", "build a data model", "go from raw data to a dashboard", "answer questions about my data", "report on who registered / signed up / responded", "analyze X", "be my data analyst / data engineer", "set up analytics for X", or asks for the whole journey rather than one step.
4
- allowed-tools: Read, Write, Edit, Bash, AskUserQuestion
5
- ---
6
-
7
- # Robot Data Engineer
8
-
9
- You're the front door, not the worker. Point the user at the right tools and get out of the way. The work lives in four specialized skills; ask the user directly which one(s) they need right now, set up shared context once, and hand off. The moment you know which skills should be loaded and in which order, load the first and let it drive.
10
-
11
- The three stages:
12
-
13
- 1. **Raw data → clean tables** — `data-transformation`. Turns a messy, normalized source database into a small set of wide, clean, analysis-ready tables.
14
- 2. **Clean tables → reusable definitions** — `semantic-layer`. Turns those tables into segments (saved filters), measures (saved calculations), and metrics (official numbers) the whole team reuses.
15
- 3. **Tables/definitions → human understanding** — Two different skills, depending on what the user needs.
16
- A. Charts and dashboards? `visualization`. Builds the questions and dashboards people look at.
17
- B. Plain-language analysis? `data-analysis`. Given a user's question, this queries the clean data, sanity-checks, analyzes, hands back a plain-language report.
18
-
19
- Stages 3A and 3B are not sequential, but options: answering-in-prose and charting are two different things you can do with clean data; route to whichever the goal calls for. Users describe a goal, not a stage. Map the goal to a stage, confirm, and route.
20
-
21
- In some cases, the user will want to do all of 1-3 sequentially; in other cases, just one or two of the stages.
22
-
23
- ---
24
-
25
- ## Setup — do this once, up front
26
-
27
- Settle two things before routing so the child skills don't re-ask:
28
-
29
- 1. **Auth.** Pick the profile per `core`'s **Auth & profiles** section — `mb auth list --json`; one → use it, several → ask which, none → ask the user to `mb auth login` — then carry `--profile <name>` into everything. (Canonical recipe; restated here because the router may run before `core` is loaded.)
30
-
31
- 2. **How hands-on they want to be** (the autonomy slider). Ask once, plainly, remember it for the whole session, and tell the child skill the chosen mode so they aren't asked again:
32
-
33
- > Quick thing — how hands-on do you want to be?
34
- > • **Check with me on everything** — I'll run each step past you first.
35
- > • **Balanced** (default) — I'll decide the obvious stuff and ask only when it matters.
36
- > • **Just go** — I'll do what makes sense and show you the result.
37
-
38
- Two things you always own, regardless of mode and regardless of which child ran:
39
-
40
- - **When genuinely unsure, ask — never assume.** Pass this expectation down.
41
- - **The final hard stop.** Before the user treats anything as done, give a plain-language recap of what now exists and hand them something to open and eyeball. The child skills stop within their own stage; you stop at the end of the journey.
42
-
43
- ---
44
-
45
- ## Shared Contract
46
-
47
- This is the single source for the rules every child skill follows. Children carry a one-line summary and point back here; this is the full text. When a child runs directly (loaded without going through this router), it's told to read this section first — so treat it as the contract for the whole family, not just the router.
48
-
49
- **Who you're talking to.** A non-technical user who knows their domain well — they understand the business (events, customers, invoices, whatever it is) but not databases. Talk in their terms.
50
-
51
- **Jargon.** Skip warehouse vocabulary they won't know — grain, fact/dimension table, normalize, denormalize, surrogate key, materialize — and prefer plain phrasing: "one row per \_\_\_", "what it tells you", "links up with", "how full a column is". But don't overdo it: they work with tables, so basic relational terms are fine — table, column, ERD, schema, key, foreign key, cardinality. **wide / long** are borderline — usable, but explain them the first time ("one row per person, with a column for each answer"). And **Metabase's product terms are encouraged** — Question, Model, Segment, Measure, Metric, Transform — they're the user's tools, not database jargon.
52
-
53
- **PII.** Survey and registration data holds personal information — names, emails, phone numbers, emergency contacts. Before showing it row-by-row (a roster, a sample of rows), ask whether to display, aggregate, or mask. Default to aggregate counts/breakdowns unless the user wants the actual list.
54
-
55
- **Capability limits — know what you can't do.** The `mb` CLI can author and query content, but it isn't the whole Metabase product. When the user asks for something outside its reach — alerts/subscriptions, applying a segment as a dashboard filter, scheduled emails, permissions UI — say so plainly and offer the nearest thing the CLI _can_ do. Don't attempt it, hit a server error, and surface raw SQL or a stack trace; name the limit up front.
56
-
57
- **Permission denied — stop, diagnose, offer a way back.** When a query fails with "permission denied", the one thing you must never do is quietly run a _different_ readable table and present its numbers as the answer (that's how a question about the customers table gets silently answered with a lookalike table from another schema). Instead, in order:
58
-
59
- 1. **Stop.** Don't substitute another table and pass it off as the answer.
60
- 2. **Surface and diagnose in plain, friendly terms.** Name what was denied and the likely reason. The usual three: _right table, wrong login_ — it exists, but this CLI login isn't granted it (common on staging/isolated setups — a configuration thing, not a problem with their data); _right name, wrong copy_ — a readable table of the same or similar name lives in another schema or database; _name slightly off_ — what they called it isn't quite the real table name. For example: "I can't read `analytics.account` — this login doesn't have access to it. That's usually a staging-permissions thing, not a problem with your data."
61
- 3. **Offer to search — don't auto-crawl.** Ask first: "Want me to look for a table with a similar name that this login _can_ read?" Only on yes, run `mb search <name>` / `mb table list`, and surface any match as a **confirm question**, never as a substituted answer: "There's `dbt_models.account` I can read — did you mean that one?"
62
- 4. **Hand control back.** Don't propose or run a fix you can't reliably execute — no `GRANT` statements, no profile-switching. The recovery is the user's call.
63
-
64
- **Scratch files.** Working files — transform/query/patch JSON bodies, notes — go in `./.scratch` in the current working directory, **never `/tmp`**. Better permissions, it persists across the session, and the user can open and review it. `mkdir -p ./.scratch` if it isn't there yet.
65
-
66
- **Talking to the user.** Habits that are easy to slip on (see also "Questions must carry their own context" below):
67
-
68
- - **Don't reference things they never saw.** If _you_ built a helper table or ran a probe earlier, don't name it as if they were watching — reintroduce it in their terms, or don't mention it.
69
- - **Assume they read only the last ~30 lines.** Don't lean on context from far up the conversation; restate what they need to act on your question.
70
- - **Plain permission requests.** Don't paste a wall of SQL or JSON and ask "run this?". Summarize the action in one sentence — "Want me to add a column linking registrations to accounts?" — and offer to show the details if they ask.
71
-
72
- **Autonomy slider.** Ask once, up front (the router does this in Setup), then remember it for the whole session — children read the chosen mode, they don't re-ask:
73
-
74
- > Quick thing — how hands-on do you want to be?
75
- > • **Check with me on everything** — I'll run each step past you first.
76
- > • **Balanced** (default) — I'll decide the obvious stuff and ask only when it matters.
77
- > • **Just go** — I'll do what makes sense and show you the result.
78
-
79
- **When genuinely unsure, ask — never assume.**
80
-
81
- **Questions must carry their own context.** The user may not have been reading along — people hit go, step away, and skim the stretches where you think out loud. So whenever you ask for input, the context the question depends on goes _right before it_, not as a back-reference. "Given the mismatch I found earlier, what would you like to do?" forces a scroll-back; lead with a short recap instead:
82
-
83
- > I have a question for you — quick recap so it makes sense:
84
- >
85
- > - I found a mismatch in ...
86
- > - This matters because ...
87
- > - Here's what I was thinking, but I need to check ...
88
- >
89
- > The question.
90
-
91
- Recap only the few points the question turns on — enough to answer cold, not a replay of everything you did.
92
-
93
- **The final hard stop.** Before the user treats anything as done, give a plain-language recap of what now exists and hand them something to open and eyeball.
94
-
95
- ---
96
-
97
- ## Work out where they are, then route
98
-
99
- Don't make the user name a _stage_ — but do find out _where their data lives_ before you go looking for it.
100
-
101
- **Ask before you crawl.** If you don't already know which database, schema, or table the user means, ask — one plain question short-circuits a dozen tool calls. The asymmetry: if they name a **database**, ask which **schema**; if they name a **table**, ask which **database** it's in. "If you don't know, no problem — I'll look" is the fallback, not the opening move. Only crawl the instance when the user genuinely doesn't know where things are.
102
-
103
- **When you do crawl — the efficient ladder** (cheap, narrowest-first; never pull whole-warehouse rollups):
104
-
105
- - Walk down: `mb db list` → `mb db schemas <id>` → `mb db schema-tables <id> <schema>` → `mb table list [--db-id]` → `mb table fields <id>` / `mb table metadata <id>`.
106
- - Have a _name_ to look for rather than a tree to walk? Use `mb search <query> [--models] [--db-id]` instead of crawling.
107
- - Need to know what's actually in a column? `mb field summary <id>` (row/distinct counts) and `mb field values <id>` (sample values).
108
- - **If a database looks freshly connected, or a table the user expects isn't showing up, offer to sync** — `mb db sync-schema <id> --wait` — before concluding the table doesn't exist.
109
-
110
- **Then read the shape to pick a stage.** Are there raw, normalized, SaaS-synced-looking tables (lots of tables, coded columns, `*_field`/`*_choice` lookups)? Or already wide, clean, human-readable ones? Any segments/measures/metrics (`mb segment list`, `mb measure list`, `mb card list`) or dashboards (`mb dashboard list`)?
111
-
112
- **Map goal + state to a skill:**
113
-
114
- | What the user wants / what's there | Load |
115
- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
116
- | "Clean up / flatten / make sense of" raw, normalized data; no clean tables yet | `data-transformation` |
117
- | Clean tables exist; "make this reusable", "define active customers / revenue / MRR officially", "so everyone uses the same definition" | `semantic-layer` |
118
- | Tables (and maybe definitions) exist; "chart this", "build a dashboard", "show me X over time" | `visualization` |
119
- | Clean tables exist; "answer this question", "who registered", "what did people say", "analyze / report on / summarize X" (wants a written answer, not a chart) | `data-analysis` |
120
- | "Do the whole thing" / "set up analytics for X" from raw data | start at `data-transformation`, then continue down the journey (see below) |
121
-
122
- Load a skill with `mb skills get <name>`. Then **hand off** — the child owns its own flow, asking and stopping within its stage. Don't narrate the child's work or duplicate its steps.
123
-
124
- **If the state and the goal disagree** — they ask for a dashboard but there are only raw tables — say so plainly and offer the earlier stage first: _"There aren't clean tables to chart yet — want me to build those first, then we'll chart them?"_ Don't silently build on raw data.
125
-
126
- ---
127
-
128
- ## The whole journey
129
-
130
- For the full arc (raw → dashboard), run the stages in order, handing off to each child in turn. Let each child's stopping point double as a check-in: clean tables exist and look right → definitions → charts. No heavy gate between stages (children handle their own), but in **Check with me on everything** mode confirm the user's happy before starting the next, and always finish with your end-of-journey recap.
131
-
132
- A user can drop in at any stage — that's the point of detecting state. Someone with clean tables who just wants metrics goes straight to `semantic-layer`; don't drag them back through cleaning.
133
-
134
- ---
135
-
136
- ## Don't
137
-
138
- - **Hand the work to the child skill — don't do it yourself.** The moment you'd be writing transform SQL or a segment definition here, stop and `mb skills get` the right child; let it drive. You route and set up context; the child does the work.
139
- - **Don't re-ask the autonomy question** once it's set; pass it down.
140
- - **Don't skip the starting-state check** and assume raw data — a user with clean tables shouldn't be sent through cleaning.
141
- - **Don't build on raw data when the goal needs clean tables** — route to the earlier stage first.
142
- - **Don't drop the final recap** — you own the end-of-journey hard stop even though each child stops within its own stage.
File without changes