@metabase/cli 0.2.2 → 0.3.0-alpha.extract-api-client.e9b2dd5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -1902
- package/dist/add-collection-B3Ty8SzB.mjs +36 -0
- package/dist/alert-DT-ee7yf.mjs +23 -0
- package/dist/{alerts-CRGMX4eB.mjs → alerts-Bf2RH_p_.mjs} +11 -17
- package/dist/{append-lL0IaI6U.mjs → append-DFzQRPMd.mjs} +7 -12
- package/dist/{archive-DihHU042.mjs → archive-4tmm946K.mjs} +8 -17
- package/dist/{archive-C9mJGN6J.mjs → archive-B6eXiyER.mjs} +7 -13
- package/dist/{archive-D3DErepm.mjs → archive-BxNPHxOY.mjs} +7 -13
- package/dist/{archive-DyPsHSFb.mjs → archive-ByvA49Kz.mjs} +8 -13
- package/dist/{archive-ExcEma7q.mjs → archive-C7w49Grr.mjs} +7 -16
- package/dist/{archive-Baz4OVDd.mjs → archive-Cd29QC0c.mjs} +7 -13
- package/dist/{archive-CUGRnyRV.mjs → archive-ChORH5JH.mjs} +7 -13
- package/dist/{archive-hKPQXgXa.mjs → archive-CwAdlv63.mjs} +7 -12
- package/dist/{archive-D8YrImIU.mjs → archive-Dr9Xnx_Z.mjs} +7 -15
- package/dist/{archive-BUFc1me2.mjs → archive-gid9Y09v.mjs} +8 -17
- package/dist/{archive-3rLXY0nS.mjs → archive-lQqs13Uz.mjs} +7 -13
- package/dist/auth-Dltxua89.mjs +19 -0
- package/dist/{body-DXJ2v3GY.mjs → body-Cur4NJt9.mjs} +5 -8
- package/dist/{body-flags-Cbv-Ba6W.mjs → body-flags-AqKpN01Y.mjs} +1 -2
- package/dist/{branches-ByCzTuiv.mjs → branches-DchlyU0i.mjs} +7 -13
- package/dist/{cancel-DvehNbDD.mjs → cancel-BMQa5R1Z.mjs} +5 -12
- package/dist/{cancel-task-BM8ADd3Y.mjs → cancel-task-C5CU1pxU.mjs} +6 -10
- package/dist/card-CHI2bmds.mjs +24 -0
- package/dist/{card-BFRRyTGs.mjs → card-DZxRmver.mjs} +21 -48
- package/dist/card-zyUkr2nS.mjs +44 -0
- package/dist/cards-SccWvRQD.mjs +34 -0
- package/dist/cli.mjs +664 -85
- package/dist/client-BqhzKdLM.mjs +2194 -0
- package/dist/collection-CGoVLvcD.mjs +58 -0
- package/dist/collection-CY0AB99E.mjs +20 -0
- package/dist/{collection-BrrjbPLN.mjs → collection-CfulNRBG.mjs} +16 -61
- package/dist/{collection-namespace-8i_CvWsg.mjs → collection-namespace-GwydWBF3.mjs} +3 -5
- package/dist/{create-D6bXJlBS.mjs → create-BNQ_DytP.mjs} +8 -15
- package/dist/{create-CtIOvInN.mjs → create-BOLwWt8Q.mjs} +9 -17
- package/dist/{create--_4GZUNY.mjs → create-Beh-2uoN.mjs} +8 -16
- package/dist/{create-BnNRvoyz.mjs → create-C79vErX0.mjs} +9 -20
- package/dist/{create-D57tRDrg.mjs → create-CAQV2g6V.mjs} +9 -17
- package/dist/{create-CHK9cJcK.mjs → create-CAWytBE5.mjs} +9 -17
- package/dist/{create-BynNiG1N.mjs → create-CCh_LyW9.mjs} +8 -15
- package/dist/{create-Cy57naL0.mjs → create-CD008jdE.mjs} +13 -28
- package/dist/{create-DOpa2TmH.mjs → create-CHQx7jq4.mjs} +9 -17
- package/dist/{create-COI80Veo.mjs → create-DF4QtgDL.mjs} +8 -16
- package/dist/{create-yK1-fuX5.mjs → create-DJmXXQoq.mjs} +10 -18
- package/dist/{create-1O1UiTVt.mjs → create-DV-Ln5Mo.mjs} +8 -15
- package/dist/create-branch-CYo6jZth.mjs +35 -0
- package/dist/{create-t7z8Eb4T.mjs → create-i14Wv3Tj.mjs} +8 -15
- package/dist/{create-qzjhJFP8.mjs → create-tQbnuz-I.mjs} +8 -15
- package/dist/{create-DAj8pyfQ.mjs → create-zeveFdnd.mjs} +6 -11
- package/dist/{cron-93wjhtrP.mjs → cron-LKRffEC-.mjs} +2 -4
- package/dist/{csv-yoFA1hhv.mjs → csv-B2Jgb1GM.mjs} +7 -19
- package/dist/{current-task-D8Q1uFmk.mjs → current-task-MpBFGttd.mjs} +7 -12
- package/dist/{dashboard-BSCXTX4H.mjs → dashboard-BCpSq_G-.mjs} +9 -60
- package/dist/dashboard-BHJBoaG7.mjs +33 -0
- package/dist/dashboard-CsIFFpzK.mjs +58 -0
- package/dist/database-B19qlLKZ.mjs +38 -0
- package/dist/database-C8G6ZKG0.mjs +26 -0
- package/dist/db-DsfojyeH.mjs +24 -0
- package/dist/{delete-B8dui6O6.mjs → delete-B8e01xAG.mjs} +6 -11
- package/dist/{delete-CA7IjA5J.mjs → delete-BApOjQvl.mjs} +6 -11
- package/dist/{delete-Dcu3iDkg.mjs → delete-Ck0q4Dzp.mjs} +6 -11
- package/dist/{delete-BwPgIWV8.mjs → delete-DFmX7jTp.mjs} +6 -11
- package/dist/{delete-CawUDFud.mjs → delete-Ob06PPie.mjs} +6 -11
- package/dist/{delete-runtime-00-R9iJm.mjs → delete-runtime-D74s6vhu.mjs} +6 -13
- package/dist/{delete-table-DS0b3i0k.mjs → delete-table-DuyhGrvA.mjs} +6 -11
- package/dist/{dependencies-BQVZylqV.mjs → dependencies-Bj3QrGIm.mjs} +10 -13
- package/dist/dirty-DNYoM6Bp.mjs +31 -0
- package/dist/document-BbskZPTT.mjs +19 -0
- package/dist/{document-C7IR6T8c.mjs → document-Cd2mmqCp.mjs} +5 -33
- package/dist/document-D6OybtP2.mjs +29 -0
- package/dist/{eid-DcCAs-RP.mjs → eid-WTZmDdsr.mjs} +12 -54
- package/dist/eid-translation-zEHtr5Oc.mjs +35 -0
- package/dist/{embedding-B0x9CPkU.mjs → embedding-i-KqpefC.mjs} +2 -4
- package/dist/events-Bn7jh5lP.mjs +39 -0
- package/dist/export-BjfoZRDJ.mjs +66 -0
- package/dist/field-BPsNa-TO.mjs +80 -0
- package/dist/{field-RYBTW2KS.mjs → field-Cr2DPUG9.mjs} +2 -81
- package/dist/field-Zau6Hc6X.mjs +18 -0
- package/dist/fields-CBBa-Prp.mjs +34 -0
- package/dist/{get-vGqyjGSW.mjs → get-00lyLv6R.mjs} +7 -11
- package/dist/{get-Cvkt6GcQ.mjs → get-B7sMgsFs.mjs} +7 -11
- package/dist/get-B_xdF1kq.mjs +31 -0
- package/dist/{get-DhS4y0K9.mjs → get-ByBOq30r.mjs} +7 -11
- package/dist/get-Bz99dAxK.mjs +35 -0
- package/dist/get-C2-Q3iQ5.mjs +31 -0
- package/dist/get-CDJFVvhj.mjs +35 -0
- package/dist/get-CDMGbgrh.mjs +31 -0
- package/dist/get-CnbUCzDM.mjs +31 -0
- package/dist/{get-CJYv3CfV.mjs → get-CvI--9S_.mjs} +16 -12
- package/dist/get-DRvsATp-.mjs +31 -0
- package/dist/{get-Db8YNxId.mjs → get-DY03Azx9.mjs} +6 -11
- package/dist/{get-4rA8pbRu.mjs → get-DYO1kywc.mjs} +7 -13
- package/dist/{get-DZRB5S37.mjs → get-D_h-G9bn.mjs} +7 -11
- package/dist/get-DdsoHaKH.mjs +31 -0
- package/dist/{get-DQ0pb4tT.mjs → get-DkWO0EI0.mjs} +7 -11
- package/dist/{get-DXiL39gi.mjs → get-Dmj9Ygz1.mjs} +7 -17
- package/dist/{get-CvXOGyFj.mjs → get-DmpB6J9g.mjs} +7 -12
- package/dist/{get-B2vvnMpl.mjs → get-Dn9ZiSZr.mjs} +8 -16
- package/dist/{get-run-BF5ZBE8o.mjs → get-run-Cnux9ln0.mjs} +7 -11
- package/dist/git-sync-BDnxPrqU.mjs +104 -0
- package/dist/git-sync-DxD_ng48.mjs +136 -0
- package/dist/git-sync-MQQYRYLg.mjs +28 -0
- package/dist/{group-DfTvzGz-.mjs → group-DBM87IgC.mjs} +2 -4
- package/dist/has-remote-changes-C684Redh.mjs +35 -0
- package/dist/import-Rmmttboo.mjs +56 -0
- package/dist/{input-BpXlmJ5J.mjs → input-DH9i67x_.mjs} +6 -11
- package/dist/{is-dirty-4kIyD4oP.mjs → is-dirty-DYeJYhBz.mjs} +4 -8
- package/dist/{items-BXH0f1r6.mjs → items-CQlPXBXE.mjs} +13 -29
- package/dist/key-BEhqIzIQ.mjs +10 -0
- package/dist/{library-BFZYsBcz.mjs → library-Bsm5KsFF.mjs} +6 -9
- package/dist/library-ClLgrAXy.mjs +19 -0
- package/dist/library-DfYAT2Ep.mjs +21 -0
- package/dist/{list-By1yYVGq.mjs → list-B4hJuMhA.mjs} +11 -27
- package/dist/{list-oRyXsJXs.mjs → list-B8nAGwP4.mjs} +10 -12
- package/dist/list-BOET6zhP.mjs +36 -0
- package/dist/list-BP3MPq-M.mjs +36 -0
- package/dist/list-BpFp9Wre.mjs +28 -0
- package/dist/list-BtkWNtvY.mjs +34 -0
- package/dist/list-BtmsNOEn.mjs +28 -0
- package/dist/list-BzVTHOoH.mjs +28 -0
- package/dist/list-C5Zs8nrb.mjs +28 -0
- package/dist/list-CKK-s3Ty.mjs +28 -0
- package/dist/{list-SiSfX4wl.mjs → list-CMpoc2TN.mjs} +10 -13
- package/dist/list-CNUiF8Z7.mjs +28 -0
- package/dist/list-CQDprvW0.mjs +39 -0
- package/dist/{list-w61Uovt2.mjs → list-CQwOgIlj.mjs} +10 -24
- package/dist/list-DE9FM957.mjs +28 -0
- package/dist/{list-CG3ec9BZ.mjs → list-DF2rvoO1.mjs} +22 -14
- package/dist/list-DMKDsBRd.mjs +38 -0
- package/dist/{list-Bar8uQRC.mjs → list-UhpKG6_m.mjs} +15 -15
- package/dist/{login-zUCMDLC8.mjs → login-CGHeSjlP.mjs} +47 -52
- package/dist/{logout-BFh7QHx6.mjs → logout-DAxOlbv4.mjs} +7 -12
- package/dist/measure-4P0bOlZ3.mjs +29 -0
- package/dist/measure-BsYv0p26.mjs +22 -0
- package/dist/{measure-DH3ow2ko.mjs → measure-CtfjqJFP.mjs} +3 -30
- package/dist/network-error-CEb9ymDW.mjs +423 -0
- package/dist/{notification-BR5wehqg.mjs → notification-DaA4bBHW.mjs} +3 -66
- package/dist/notification-Fcq1fIPw.mjs +67 -0
- package/dist/{parameter-hCQ80jnc.mjs → parameter-DUKR8NXo.mjs} +2 -11
- package/dist/{parameter-values-BYDFzxNY.mjs → parameter-values-CJTdqd8c.mjs} +17 -11
- package/dist/{parse-enum-D1zTYr_i.mjs → parse-enum-D0Jfm_Bz.mjs} +2 -4
- package/dist/{parse-id-waEVK-uR.mjs → parse-id-C_jmKFaa.mjs} +2 -4
- package/dist/{parse-ref-C3DUXwci.mjs → parse-ref-ibKVB0J4.mjs} +3 -5
- package/dist/{path-Bvs9IR4k.mjs → path-B5gHvrYL.mjs} +8 -9
- package/dist/{poll-rqLkEJVP.mjs → poll-75SvT7Zv.mjs} +11 -15
- package/dist/predicates-Bkm2IoeX.mjs +170 -0
- package/dist/preflight-YpPQo-sa.mjs +29 -0
- package/dist/{process-BxAUv3Wx.mjs → process-DBOOrmET.mjs} +4 -6
- package/dist/{publish-C1y_vGGw.mjs → publish-DijrxaCW.mjs} +29 -24
- package/dist/{pulse-C8q469KD.mjs → pulse-BmsDenXm.mjs} +3 -56
- package/dist/pulse-DhG6I9mI.mjs +57 -0
- package/dist/{query-B9LlGOZI.mjs → query-BbqECzmF.mjs} +20 -44
- package/dist/{query-DpVWKW-y.mjs → query-Dc__-KJH.mjs} +13 -24
- package/dist/{query-result-Bvh89K4f.mjs → query-result-DBDwk8TS.mjs} +4 -8
- package/dist/remove-collection-BOnxYvhj.mjs +36 -0
- package/dist/{render-rgZBe3rO.mjs → render-CI93iP0I.mjs} +9 -11
- package/dist/{replace-sHtPBNnA.mjs → replace-Cq4CxVa-.mjs} +7 -12
- package/dist/rescan-values-Dr_j416g.mjs +31 -0
- package/dist/revision-message-flag-8TCHYJV6.mjs +8 -0
- package/dist/run-C3DkS6NP.mjs +82 -0
- package/dist/{run-Ce_gPVcg.mjs → run-DdGJ544X.mjs} +8 -18
- package/dist/runs-CUNWiidL.mjs +38 -0
- package/dist/runtime-DiKyBxOw.mjs +1007 -0
- package/dist/{schema-tables-D91DWM5l.mjs → schema-tables-CV386fnC.mjs} +10 -14
- package/dist/{schemas-OVYRgvz9.mjs → schemas-DM-UqZBQ.mjs} +8 -12
- package/dist/search-DFBwUc6d.mjs +44 -0
- package/dist/{search-msFNbxU6.mjs → search-DmGScXs8.mjs} +14 -73
- package/dist/segment-BzUGM2Fr.mjs +22 -0
- package/dist/segment-C_gl5ag6.mjs +29 -0
- package/dist/{segment-cwIOOF0v.mjs → segment-OsrbUDzw.mjs} +3 -30
- package/dist/{selectors-Bsyhe1zP.mjs → selectors-DGDn0Hto.mjs} +4 -6
- package/dist/{send-BeFpVrwD.mjs → send-CVxxEpDB.mjs} +5 -16
- package/dist/{set-jRnCLhvc.mjs → set-DFolTjbd.mjs} +10 -20
- package/dist/{set-active-CFWtIWzX.mjs → set-active-BD8L1lPX.mjs} +7 -18
- package/dist/setting-CwRYgHYN.mjs +35 -0
- package/dist/setting-DTiLCW8g.mjs +22 -0
- package/dist/setting-DyhaeICs.mjs +17 -0
- package/dist/setup-BbDQN8fe.mjs +44 -0
- package/dist/setup-CO7QV-ao.mjs +21 -0
- package/dist/signal-CMd0EFUa.mjs +16 -0
- package/dist/{skills-CxqkjkdQ.mjs → skills--vK6J-e4.mjs} +4 -6
- package/dist/{skills-DlFbbaoS.mjs → skills-DTCrMcix.mjs} +13 -19
- package/dist/{snippet-1xYckIwc.mjs → snippet-CyKAgIZl.mjs} +3 -32
- package/dist/snippet-DRwKb2x7.mjs +19 -0
- package/dist/snippet-oJLaYW9V.mjs +29 -0
- package/dist/stash-D0S4JmAz.mjs +61 -0
- package/dist/{status-DCIOvsc6.mjs → status-BhswxJL1.mjs} +23 -23
- package/dist/{status-BMEdl-_G.mjs → status-hL1am-HV.mjs} +6 -8
- package/dist/{subscription-BOOBR5Ir.mjs → subscription-_d5fB45F.mjs} +7 -10
- package/dist/{subscriptions-C_1AQpZF.mjs → subscriptions-s4TF6Ax3.mjs} +11 -16
- package/dist/{summary-D1fKnwE3.mjs → summary-BytbDz6e.mjs} +1 -2
- package/dist/summary-CsPvcUwW.mjs +31 -0
- package/dist/sync-schema-DaZ_MV-u.mjs +35 -0
- package/dist/sync-task-BACcrs0i.mjs +37 -0
- package/dist/{table-fDvuvqoU.mjs → table-CeeTJgQb.mjs} +4 -38
- package/dist/table-CsIJNPFf.mjs +37 -0
- package/dist/table-DYoC1kPn.mjs +18 -0
- package/dist/{timeline-BNwnJ3g9.mjs → timeline-CCSU2qOS.mjs} +2 -66
- package/dist/timeline-event-CNQdCTDg.mjs +19 -0
- package/dist/timeline-uDCmwGFT.mjs +66 -0
- package/dist/timeline-xlDbEKWg.mjs +21 -0
- package/dist/transform-Bs0EWijQ.mjs +28 -0
- package/dist/{transform-BkSkCvpx.mjs → transform-D3QX0jxA.mjs} +28 -74
- package/dist/transform-DoTyyXAu.mjs +74 -0
- package/dist/transform-job-50GZHhKH.mjs +37 -0
- package/dist/transform-job-BcLChRup.mjs +22 -0
- package/dist/{transform-job-sJmW_En3.mjs → transform-job-DRrK28IH.mjs} +11 -38
- package/dist/{transform-tag-qTjNVfTW.mjs → transform-tag-CcElGp3C.mjs} +2 -21
- package/dist/transform-tag-Dmb4u3-Q.mjs +21 -0
- package/dist/transform-tag-_tgwlsdB.mjs +18 -0
- package/dist/{transforms-Cosz-Vq3.mjs → transforms-oU4zizbO.mjs} +10 -13
- package/dist/{tree-BkXtw0c4.mjs → tree-CH-f3bjP.mjs} +6 -10
- package/dist/{unpublish-BlGj7omM.mjs → unpublish-BUl9RU5C.mjs} +7 -18
- package/dist/{update-DpIzJ8Ts.mjs → update-BCS5FxKr.mjs} +11 -19
- package/dist/{update-hoCyoR-u.mjs → update-BZPllQoR.mjs} +9 -16
- package/dist/{update-CXlhrcy8.mjs → update-BiFDBcEH.mjs} +9 -16
- package/dist/{update-Cbsgvopz.mjs → update-BzMDeZiU.mjs} +9 -15
- package/dist/{update-CTWsiwme.mjs → update-C4YJQFDS.mjs} +9 -16
- package/dist/{update-CzrbMLZq.mjs → update-CHNSUHK4.mjs} +9 -16
- package/dist/{update-CsYFWkVd.mjs → update-CO4m4wH3.mjs} +10 -21
- package/dist/{update-DDVuyquf.mjs → update-CVPAwJaH.mjs} +10 -18
- package/dist/{update-C9K1QnOo.mjs → update-CmDTljK-.mjs} +9 -17
- package/dist/{update-DrvAdi-O.mjs → update-CvOO8TED.mjs} +9 -17
- package/dist/{update-Tw0kARao.mjs → update-D-NE60AV.mjs} +9 -16
- package/dist/{update-ZJ5T-SBW.mjs → update-Nfi44RrE.mjs} +10 -18
- package/dist/{update-C-ChEcI9.mjs → update-bD_Jh5-s.mjs} +10 -16
- package/dist/{update-CuKHukZ6.mjs → update-cYkvbqK8.mjs} +9 -16
- package/dist/update-dashcard-C3TuYO_k.mjs +50 -0
- package/dist/{update-BHhEtxwC.mjs → update-tX9mKBN_.mjs} +10 -21
- package/dist/{upgrade-D0HiyTxw.mjs → upgrade-DXMV4AyP.mjs} +37 -44
- package/dist/upload-CH632qW6.mjs +46 -0
- package/dist/upload-DAtxBBms.mjs +13 -0
- package/dist/upload-Dey_8rLf.mjs +13 -0
- package/dist/{uuid-D7NcSTj8.mjs → uuid-BJkDWj9p.mjs} +5 -7
- package/dist/validate-BWchyW0V.mjs +1469 -0
- package/dist/{validate-query-Di0VKMF-.mjs → validate-query-DaGYSmpQ.mjs} +4 -5
- package/dist/{values-OBiEVCVH.mjs → values-Dxf1JEoA.mjs} +8 -13
- package/dist/verify-K96rItG5.mjs +89 -0
- package/dist/{wait-B9qNlcTe.mjs → wait-DoMDH226.mjs} +10 -18
- package/dist/{wait-flags-D0FEgH6k.mjs → wait-flags-DWEF9tX4.mjs} +14 -11
- package/dist/window-BkvrP0gB.mjs +64 -0
- package/package.json +5 -35
- package/skill-data/core/SKILL.md +25 -22
- package/skill-data/dashboard/SKILL.md +6 -2
- package/skill-data/document/SKILL.md +2 -2
- package/skill-data/transform/SKILL.md +1 -1
- package/.claude-plugin/marketplace.json +0 -19
- package/dist/add-collection-B-Pf12HY.mjs +0 -60
- package/dist/add-collection-B2PdVMRy.mjs +0 -9
- package/dist/alert-DGcECcDb.mjs +0 -26
- package/dist/auth-B8Yb4ZaN.mjs +0 -22
- package/dist/capabilities-1HTHeDa4.mjs +0 -684
- package/dist/card-BT7ce7uO.mjs +0 -27
- package/dist/cards-Bz6anDNX.mjs +0 -38
- package/dist/cli.d.mts +0 -1
- package/dist/collection-ahFSJT-e.mjs +0 -23
- package/dist/command-augment-D9pI9Vbh.mjs +0 -11
- package/dist/create-branch-BwqFHYcZ.mjs +0 -57
- package/dist/dashboard-C__PiWrv.mjs +0 -36
- package/dist/database-B-xwx5LA.mjs +0 -61
- package/dist/db-BiLWl1J9.mjs +0 -27
- package/dist/dirty-BqdcrfUz.mjs +0 -35
- package/dist/document-C9ykHYOG.mjs +0 -22
- package/dist/events-C9PqRUCO.mjs +0 -44
- package/dist/export-CdKR5nPT.mjs +0 -103
- package/dist/field-P7aJaet9.mjs +0 -21
- package/dist/fields-D2czTLKq.mjs +0 -37
- package/dist/get-75Vdyusm.mjs +0 -49
- package/dist/get-B6fSPCfp.mjs +0 -35
- package/dist/get-BbKC0fTx.mjs +0 -35
- package/dist/get-BfFKIfpX.mjs +0 -36
- package/dist/get-Bpw05IUm.mjs +0 -38
- package/dist/get-CaIYg15K.mjs +0 -41
- package/dist/get-DXydDRVU.mjs +0 -35
- package/dist/get-Dy5f54pV.mjs +0 -35
- package/dist/git-sync-BzievbUz.mjs +0 -31
- package/dist/has-remote-changes-CjDHphUH.mjs +0 -67
- package/dist/import-DzA5Ty9_.mjs +0 -94
- package/dist/is-dirty-Cv0bdKkX.mjs +0 -8
- package/dist/key-B9AAqwjq.mjs +0 -17
- package/dist/list-AyGEaws8.mjs +0 -8
- package/dist/list-BiAVv9jX.mjs +0 -31
- package/dist/list-Bm1PlZEV.mjs +0 -31
- package/dist/list-BtgjcC2w.mjs +0 -31
- package/dist/list-CLgkOcmY.mjs +0 -39
- package/dist/list-CSnpbFML.mjs +0 -31
- package/dist/list-Cn-VruXD.mjs +0 -8
- package/dist/list-D7mMcRG5.mjs +0 -49
- package/dist/list-DOhVPh95.mjs +0 -39
- package/dist/list-DSHteJOl.mjs +0 -32
- package/dist/list-Dl81pkVs.mjs +0 -53
- package/dist/list-DwMcwucR.mjs +0 -31
- package/dist/list-IxaPXKXu.mjs +0 -31
- package/dist/list-hKRQUcGB.mjs +0 -39
- package/dist/listing-1G8iFfZe.mjs +0 -10
- package/dist/measure-DNldT89z.mjs +0 -25
- package/dist/paginate-DuDXvUPr.mjs +0 -49
- package/dist/patch-BpjI9BOz.mjs +0 -20
- package/dist/patch-DrMVqf34.mjs +0 -36
- package/dist/poll-task-CiB1o1wG.mjs +0 -194
- package/dist/preflight-DJOBTWVq.mjs +0 -90
- package/dist/prompt-DmxSLNrO.mjs +0 -52
- package/dist/remove-collection-DYQibG6d.mjs +0 -42
- package/dist/requests-Pc0u7PQS.mjs +0 -96
- package/dist/rescan-values-CuPGOzKI.mjs +0 -40
- package/dist/resolve-BiL5scF0.mjs +0 -91
- package/dist/revision-message-flag-B4BxzDXJ.mjs +0 -11
- package/dist/run-D6jyZ0nv.mjs +0 -135
- package/dist/runs-DRxrpAkU.mjs +0 -53
- package/dist/runtime-CPIHg_Zg.mjs +0 -1699
- package/dist/segment-BIKVTq_n.mjs +0 -25
- package/dist/setting-CApPg0Xr.mjs +0 -20
- package/dist/setting-CDEoJYO0.mjs +0 -55
- package/dist/setup-CruHFQJz.mjs +0 -71
- package/dist/snippet-DdoeL-7N.mjs +0 -22
- package/dist/stash-CR-ESWiX.mjs +0 -108
- package/dist/summary-WUjzNITU.mjs +0 -40
- package/dist/sync-schema-Cq5LzHHc.mjs +0 -54
- package/dist/sync-scope-Dh1wBlrg.mjs +0 -55
- package/dist/table-BK56VDw8.mjs +0 -21
- package/dist/timeline-Dl5pm5tN.mjs +0 -24
- package/dist/timeline-event-5JAeGVSI.mjs +0 -22
- package/dist/transform-ATK6rJBl.mjs +0 -31
- package/dist/transform-job-BezBE6Y8.mjs +0 -25
- package/dist/transform-tag-GqbcG_6_.mjs +0 -21
- package/dist/update-dashcard-Dnfa8_aJ.mjs +0 -73
- package/dist/upload-WT6SywFa.mjs +0 -16
- package/dist/validate-BoY75_M3.mjs +0 -1496
- package/dist/verify-VEB7TBQ_.mjs +0 -79
package/dist/cli.mjs
CHANGED
|
@@ -1,21 +1,133 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
import { getMetabaseAugment, setMetabaseAugment } from "./command-augment-D9pI9Vbh.mjs";
|
|
2
|
+
import { i as ConfigError, m as toMetabaseError, n as AbortError, t as isPlainObject } from "./predicates-Bkm2IoeX.mjs";
|
|
4
3
|
import { defineCommand, renderUsage, runMain } from "citty";
|
|
5
4
|
import { z } from "zod";
|
|
6
5
|
import tls from "node:tls";
|
|
7
|
-
|
|
6
|
+
import { confirm, isCancel, password, select, text } from "@clack/prompts";
|
|
7
|
+
import Table from "cli-table3";
|
|
8
|
+
//#region src/runtime/citty.ts
|
|
9
|
+
async function resolveCitty(value) {
|
|
10
|
+
if (value === void 0) return;
|
|
11
|
+
if (typeof value === "function") return value();
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
function toAliasArray(alias) {
|
|
15
|
+
if (alias === void 0) return [];
|
|
16
|
+
return Array.isArray(alias) ? alias : [alias];
|
|
17
|
+
}
|
|
18
|
+
function normalizeFlag(value) {
|
|
19
|
+
return value.replace(/^-+/, "").replace(/-/g, "").toLowerCase();
|
|
20
|
+
}
|
|
21
|
+
function flagConsumesValue(token, argsDef) {
|
|
22
|
+
if (token.includes("=")) return false;
|
|
23
|
+
const name = normalizeFlag(token);
|
|
24
|
+
for (const [key, def] of Object.entries(argsDef)) {
|
|
25
|
+
if (def.type !== "string" && def.type !== "enum") continue;
|
|
26
|
+
if (normalizeFlag(key) === name) return true;
|
|
27
|
+
if (toAliasArray(def.alias).some((alias) => normalizeFlag(alias) === name)) return true;
|
|
28
|
+
}
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
//#region src/output/types.ts
|
|
33
|
+
const DEFAULT_MAX_BYTES = 24576;
|
|
34
|
+
function listEnvelopeSchema(item) {
|
|
35
|
+
return z.object({
|
|
36
|
+
data: z.array(item).describe("The items in this window."),
|
|
37
|
+
returned: z.number().int().nonnegative().describe("Number of items in `data`; a short window is not proof the walk is over."),
|
|
38
|
+
offset: z.number().int().nonnegative().describe("Index of the first item in `data` within the full result set."),
|
|
39
|
+
limit: z.number().int().nonnegative().optional().describe("Echoes `--limit` when you passed one, and is absent otherwise."),
|
|
40
|
+
total: z.number().int().nonnegative().nullable().optional().describe("The server's count on endpoints that report one and `null` on those that don't, so it is a display value rather than a loop bound."),
|
|
41
|
+
has_more: z.boolean().describe("True when more items exist beyond this window; this alone decides whether to keep going, never a comparison of counts. True with a `null` next_offset means the remaining items are reached by widening `--max-bytes` or narrowing the selection, not by paging."),
|
|
42
|
+
next_offset: z.number().int().nonnegative().nullable().optional().describe("Pass back as `--offset` to fetch the next window; it is past the offset you sent, and `null` when there is nowhere to resume from — either the walk is over or `--max-bytes` left no room for a single row, which `truncated` tells apart."),
|
|
43
|
+
truncated: z.object({
|
|
44
|
+
reason: z.literal("max_bytes"),
|
|
45
|
+
bytes: z.number().int().nonnegative()
|
|
46
|
+
}).optional().describe("Present when the `--max-bytes` cap cut the output, not when the data ran out; its `bytes` is what the untruncated answer would have measured, so narrow rows with `--fields` rather than raising the cap.")
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
//#endregion
|
|
50
|
+
//#region src/commands/flags.ts
|
|
51
|
+
const outputFlags = {
|
|
52
|
+
format: {
|
|
53
|
+
type: "string",
|
|
54
|
+
description: "auto | json | text",
|
|
55
|
+
default: "auto"
|
|
56
|
+
},
|
|
57
|
+
json: {
|
|
58
|
+
type: "boolean",
|
|
59
|
+
description: "Shorthand for --format json"
|
|
60
|
+
},
|
|
61
|
+
full: {
|
|
62
|
+
type: "boolean",
|
|
63
|
+
description: "Return the full object (default: compact)"
|
|
64
|
+
},
|
|
65
|
+
fields: {
|
|
66
|
+
type: "string",
|
|
67
|
+
description: "Dot-paths, comma separated (mutually exclusive with --full)"
|
|
68
|
+
},
|
|
69
|
+
maxBytes: {
|
|
70
|
+
type: "string",
|
|
71
|
+
description: "Output size cap; 0 disables",
|
|
72
|
+
default: String(DEFAULT_MAX_BYTES),
|
|
73
|
+
alias: "max-bytes"
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
const listFlags = {
|
|
77
|
+
limit: {
|
|
78
|
+
type: "string",
|
|
79
|
+
description: "Max items to return (default: as many as fit the output cap)"
|
|
80
|
+
},
|
|
81
|
+
offset: {
|
|
82
|
+
type: "string",
|
|
83
|
+
description: "Start at this item index; pass the previous run's next_offset to continue",
|
|
84
|
+
default: "0"
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
function listFlagsWithDefaultLimit(defaultLimit) {
|
|
88
|
+
return {
|
|
89
|
+
...listFlags,
|
|
90
|
+
limit: {
|
|
91
|
+
type: "string",
|
|
92
|
+
description: "Max items to return",
|
|
93
|
+
default: String(defaultLimit)
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
const profileFlag = { profile: {
|
|
98
|
+
type: "string",
|
|
99
|
+
description: "Named profile (default: 'default')",
|
|
100
|
+
alias: "p"
|
|
101
|
+
} };
|
|
102
|
+
const connectionFlags = {
|
|
103
|
+
url: {
|
|
104
|
+
type: "string",
|
|
105
|
+
description: "Metabase URL"
|
|
106
|
+
},
|
|
107
|
+
apiKey: {
|
|
108
|
+
type: "string",
|
|
109
|
+
description: "API key",
|
|
110
|
+
alias: "api-key"
|
|
111
|
+
},
|
|
112
|
+
skipPreflight: {
|
|
113
|
+
type: "boolean",
|
|
114
|
+
description: "Skip the server version capability check for this command",
|
|
115
|
+
alias: "skip-preflight"
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
//#endregion
|
|
8
119
|
//#region src/commands/global-flags.ts
|
|
9
120
|
const ARGUMENT_SEPARATOR = "--";
|
|
10
121
|
const NEGATION_PREFIX = "no-";
|
|
11
122
|
const GLOBAL_FLAG_ARGS = {
|
|
12
123
|
...outputFlags,
|
|
124
|
+
...listFlags,
|
|
13
125
|
...profileFlag,
|
|
14
126
|
...connectionFlags
|
|
15
127
|
};
|
|
16
128
|
const GLOBAL_FLAG_NAMES = buildGlobalFlagNames();
|
|
17
129
|
function buildGlobalFlagNames() {
|
|
18
|
-
const names = new Set();
|
|
130
|
+
const names = /* @__PURE__ */ new Set();
|
|
19
131
|
for (const [key, def] of Object.entries(GLOBAL_FLAG_ARGS)) {
|
|
20
132
|
names.add(normalizeFlag(key));
|
|
21
133
|
if ("alias" in def) for (const alias of toAliasArray(def.alias)) names.add(normalizeFlag(alias));
|
|
@@ -28,7 +140,7 @@ function isGlobalFlag(token) {
|
|
|
28
140
|
const name = normalizeFlag(raw);
|
|
29
141
|
if (GLOBAL_FLAG_NAMES.has(name)) return true;
|
|
30
142
|
const bare = raw.replace(/^-+/, "");
|
|
31
|
-
if (bare.startsWith(NEGATION_PREFIX)) return GLOBAL_FLAG_NAMES.has(normalizeFlag(bare.slice(
|
|
143
|
+
if (bare.startsWith(NEGATION_PREFIX)) return GLOBAL_FLAG_NAMES.has(normalizeFlag(bare.slice(3)));
|
|
32
144
|
return false;
|
|
33
145
|
}
|
|
34
146
|
function hoistGlobalFlags(rawArgs) {
|
|
@@ -50,9 +162,8 @@ function hoistGlobalFlags(rawArgs) {
|
|
|
50
162
|
if (leading.length === 0) return [...rawArgs];
|
|
51
163
|
return [...rawArgs.slice(index), ...leading];
|
|
52
164
|
}
|
|
53
|
-
|
|
54
165
|
//#endregion
|
|
55
|
-
//#region src/core/
|
|
166
|
+
//#region src/core/system-ca.ts
|
|
56
167
|
function trustSystemCa() {
|
|
57
168
|
const canReadSystemStore = typeof tls.getCACertificates === "function";
|
|
58
169
|
const canReplaceDefaults = typeof tls.setDefaultCACertificates === "function";
|
|
@@ -61,45 +172,58 @@ function trustSystemCa() {
|
|
|
61
172
|
if (systemCerts.length === 0) return;
|
|
62
173
|
tls.setDefaultCACertificates([...tls.getCACertificates("default"), ...systemCerts]);
|
|
63
174
|
}
|
|
64
|
-
|
|
175
|
+
//#endregion
|
|
176
|
+
//#region package.json
|
|
177
|
+
var name = "@metabase/cli";
|
|
178
|
+
var version = "0.3.0-alpha.extract-api-client.e9b2dd5";
|
|
179
|
+
var description = "Metabase CLI";
|
|
180
|
+
//#endregion
|
|
181
|
+
//#region src/runtime/command-augment.ts
|
|
182
|
+
const augments = /* @__PURE__ */ new WeakMap();
|
|
183
|
+
function setMetabaseAugment(cmd, augment) {
|
|
184
|
+
augments.set(cmd, augment);
|
|
185
|
+
}
|
|
186
|
+
function getMetabaseAugment(cmd) {
|
|
187
|
+
return augments.get(cmd) ?? null;
|
|
188
|
+
}
|
|
65
189
|
//#endregion
|
|
66
190
|
//#region src/main.ts
|
|
67
191
|
const main = defineCommand({
|
|
68
192
|
meta: {
|
|
69
193
|
name: "mb",
|
|
70
|
-
version
|
|
71
|
-
description
|
|
194
|
+
version,
|
|
195
|
+
description
|
|
72
196
|
},
|
|
73
197
|
subCommands: {
|
|
74
|
-
auth: () => import("./auth-
|
|
75
|
-
db: () => import("./db-
|
|
76
|
-
table: () => import("./table-
|
|
77
|
-
field: () => import("./field-
|
|
78
|
-
upload: () => import("./upload-
|
|
79
|
-
card: () => import("./card-
|
|
80
|
-
dashboard: () => import("./dashboard-
|
|
81
|
-
subscription: () => import("./subscription-
|
|
82
|
-
alert: () => import("./alert-
|
|
83
|
-
collection: () => import("./collection-
|
|
84
|
-
library: () => import("./library-
|
|
85
|
-
document: () => import("./document-
|
|
86
|
-
transform: () => import("./transform-
|
|
87
|
-
"transform-job": () => import("./transform-job-
|
|
88
|
-
"transform-tag": () => import("./transform-tag-
|
|
89
|
-
setting: () => import("./setting-
|
|
90
|
-
search: () => import("./search-
|
|
91
|
-
"git-sync": () => import("./git-sync-
|
|
92
|
-
setup: () => import("./setup-
|
|
93
|
-
snippet: () => import("./snippet-
|
|
94
|
-
segment: () => import("./segment-
|
|
95
|
-
measure: () => import("./measure-
|
|
96
|
-
timeline: () => import("./timeline-
|
|
97
|
-
"timeline-event": () => import("./timeline-event-
|
|
98
|
-
eid: () => import("./eid-
|
|
99
|
-
query: () => import("./query-
|
|
100
|
-
uuid: () => import("./uuid-
|
|
101
|
-
upgrade: () => import("./upgrade-
|
|
102
|
-
skills: () => import("./skills-
|
|
198
|
+
auth: () => import("./auth-Dltxua89.mjs").then((mod) => mod.default),
|
|
199
|
+
db: () => import("./db-DsfojyeH.mjs").then((mod) => mod.default),
|
|
200
|
+
table: () => import("./table-DYoC1kPn.mjs").then((mod) => mod.default),
|
|
201
|
+
field: () => import("./field-Zau6Hc6X.mjs").then((mod) => mod.default),
|
|
202
|
+
upload: () => import("./upload-Dey_8rLf.mjs").then((mod) => mod.default),
|
|
203
|
+
card: () => import("./card-CHI2bmds.mjs").then((mod) => mod.default),
|
|
204
|
+
dashboard: () => import("./dashboard-BHJBoaG7.mjs").then((mod) => mod.default),
|
|
205
|
+
subscription: () => import("./subscription-_d5fB45F.mjs").then((mod) => mod.default),
|
|
206
|
+
alert: () => import("./alert-DT-ee7yf.mjs").then((mod) => mod.default),
|
|
207
|
+
collection: () => import("./collection-CY0AB99E.mjs").then((mod) => mod.default),
|
|
208
|
+
library: () => import("./library-Bsm5KsFF.mjs").then((mod) => mod.default),
|
|
209
|
+
document: () => import("./document-BbskZPTT.mjs").then((mod) => mod.default),
|
|
210
|
+
transform: () => import("./transform-Bs0EWijQ.mjs").then((mod) => mod.default),
|
|
211
|
+
"transform-job": () => import("./transform-job-BcLChRup.mjs").then((mod) => mod.default),
|
|
212
|
+
"transform-tag": () => import("./transform-tag-_tgwlsdB.mjs").then((mod) => mod.default),
|
|
213
|
+
setting: () => import("./setting-DyhaeICs.mjs").then((mod) => mod.default),
|
|
214
|
+
search: () => import("./search-DmGScXs8.mjs").then((mod) => mod.default),
|
|
215
|
+
"git-sync": () => import("./git-sync-MQQYRYLg.mjs").then((mod) => mod.default),
|
|
216
|
+
setup: () => import("./setup-BbDQN8fe.mjs").then((mod) => mod.default),
|
|
217
|
+
snippet: () => import("./snippet-DRwKb2x7.mjs").then((mod) => mod.default),
|
|
218
|
+
segment: () => import("./segment-BzUGM2Fr.mjs").then((mod) => mod.default),
|
|
219
|
+
measure: () => import("./measure-BsYv0p26.mjs").then((mod) => mod.default),
|
|
220
|
+
timeline: () => import("./timeline-xlDbEKWg.mjs").then((mod) => mod.default),
|
|
221
|
+
"timeline-event": () => import("./timeline-event-CNQdCTDg.mjs").then((mod) => mod.default),
|
|
222
|
+
eid: () => import("./eid-WTZmDdsr.mjs").then((mod) => mod.default),
|
|
223
|
+
query: () => import("./query-Dc__-KJH.mjs").then((mod) => mod.default),
|
|
224
|
+
uuid: () => import("./uuid-BJkDWj9p.mjs").then((mod) => mod.default),
|
|
225
|
+
upgrade: () => import("./upgrade-DXMV4AyP.mjs").then((mod) => mod.default),
|
|
226
|
+
skills: () => import("./skills--vK6J-e4.mjs").then((mod) => mod.default)
|
|
103
227
|
}
|
|
104
228
|
});
|
|
105
229
|
setMetabaseAugment(main, {
|
|
@@ -116,8 +240,449 @@ setMetabaseAugment(main, {
|
|
|
116
240
|
outputSchema: null,
|
|
117
241
|
capabilities: null
|
|
118
242
|
});
|
|
119
|
-
|
|
120
|
-
|
|
243
|
+
//#endregion
|
|
244
|
+
//#region src/core/env.ts
|
|
245
|
+
const LEGACY_PREFIX = "METABASE_";
|
|
246
|
+
const ENV_URL = "MB_URL";
|
|
247
|
+
const ENV_API_KEY = "MB_API_KEY";
|
|
248
|
+
const ENV_PROFILE = "MB_PROFILE";
|
|
249
|
+
const ENV_VERBOSE = "MB_VERBOSE";
|
|
250
|
+
const ENV_SKIP_PREFLIGHT = "MB_CLI_SKIP_PREFLIGHT";
|
|
251
|
+
const ENV_DISABLE_KEYRING = "MB_CLI_DISABLE_KEYRING";
|
|
252
|
+
const ENV_SKILLS_DIR = "MB_SKILLS_DIR";
|
|
253
|
+
function legacyNameFor(canonical) {
|
|
254
|
+
return LEGACY_PREFIX + canonical.slice(3);
|
|
255
|
+
}
|
|
256
|
+
const legacyVarsUsed = /* @__PURE__ */ new Set();
|
|
257
|
+
function readEnv(canonical) {
|
|
258
|
+
const direct = process.env[canonical];
|
|
259
|
+
if (direct !== void 0) return direct;
|
|
260
|
+
const legacyValue = process.env[legacyNameFor(canonical)];
|
|
261
|
+
if (legacyValue !== void 0) {
|
|
262
|
+
legacyVarsUsed.add(canonical);
|
|
263
|
+
return legacyValue;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
function consumeLegacyEnvWarnings() {
|
|
267
|
+
if (legacyVarsUsed.size === 0) return [];
|
|
268
|
+
const messages = [...legacyVarsUsed].map(legacyEnvWarning);
|
|
269
|
+
legacyVarsUsed.clear();
|
|
270
|
+
return messages;
|
|
271
|
+
}
|
|
272
|
+
function legacyEnvWarning(canonical) {
|
|
273
|
+
return `warning: ${legacyNameFor(canonical)} is deprecated; set ${canonical} instead`;
|
|
274
|
+
}
|
|
275
|
+
//#endregion
|
|
276
|
+
//#region src/output/notice.ts
|
|
277
|
+
function warn(message) {
|
|
278
|
+
process.stderr.write(message + "\n");
|
|
279
|
+
}
|
|
280
|
+
const LIST_TRUNCATION_REMEDY = "narrow the selection or raise --max-bytes";
|
|
281
|
+
function listTruncationNotice(bytes, nextOffset, hint) {
|
|
282
|
+
return `… cut at ${bytes} bytes; ${typeof nextOffset === "number" ? `continue with --offset ${nextOffset}, ` : ""}${hint ?? LIST_TRUNCATION_REMEDY}`;
|
|
283
|
+
}
|
|
284
|
+
const ITEM_OVERSIZE_REMEDY = "narrow with --fields or raise the cap with --max-bytes <n>";
|
|
285
|
+
function itemOversizeMessage(bytes, maxBytes, hint) {
|
|
286
|
+
return `output is ${bytes} bytes, over the ${maxBytes}-byte --max-bytes cap; ${hint ?? ITEM_OVERSIZE_REMEDY}`;
|
|
287
|
+
}
|
|
288
|
+
//#endregion
|
|
289
|
+
//#region src/output/prompt.ts
|
|
290
|
+
function isPromptCancel(value) {
|
|
291
|
+
return isCancel(value);
|
|
292
|
+
}
|
|
293
|
+
async function promptText(opts) {
|
|
294
|
+
requireTty(opts.message);
|
|
295
|
+
const value = await text({
|
|
296
|
+
message: opts.message,
|
|
297
|
+
defaultValue: "",
|
|
298
|
+
...opts.placeholder !== void 0 && { placeholder: opts.placeholder },
|
|
299
|
+
...opts.initialValue !== void 0 && { initialValue: opts.initialValue },
|
|
300
|
+
...opts.defaultValue !== void 0 && { defaultValue: opts.defaultValue },
|
|
301
|
+
...opts.validate !== void 0 && { validate: opts.validate }
|
|
302
|
+
});
|
|
303
|
+
if (isCancel(value)) throw new AbortError();
|
|
304
|
+
return value;
|
|
305
|
+
}
|
|
306
|
+
async function promptPassword(opts) {
|
|
307
|
+
requireTty(opts.message);
|
|
308
|
+
const value = await password({
|
|
309
|
+
message: opts.message,
|
|
310
|
+
...opts.mask !== void 0 && { mask: opts.mask },
|
|
311
|
+
...opts.validate !== void 0 && { validate: opts.validate }
|
|
312
|
+
});
|
|
313
|
+
if (isCancel(value)) throw new AbortError();
|
|
314
|
+
return value;
|
|
315
|
+
}
|
|
316
|
+
async function promptConfirm(opts) {
|
|
317
|
+
requireTty(opts.message);
|
|
318
|
+
const value = await confirm({
|
|
319
|
+
message: opts.message,
|
|
320
|
+
...opts.initialValue !== void 0 && { initialValue: opts.initialValue }
|
|
321
|
+
});
|
|
322
|
+
if (isCancel(value)) throw new AbortError();
|
|
323
|
+
return value;
|
|
324
|
+
}
|
|
325
|
+
async function promptSelect(opts) {
|
|
326
|
+
requireTty(opts.message);
|
|
327
|
+
const value = await select({
|
|
328
|
+
message: opts.message,
|
|
329
|
+
options: opts.choices,
|
|
330
|
+
...opts.initialValue !== void 0 && { initialValue: opts.initialValue }
|
|
331
|
+
});
|
|
332
|
+
if (isCancel(value)) throw new AbortError();
|
|
333
|
+
return value;
|
|
334
|
+
}
|
|
335
|
+
function requireTty(prompt) {
|
|
336
|
+
if (!process.stdin.isTTY) throw new ConfigError(`cannot prompt "${prompt}" — stdin is not a TTY`);
|
|
337
|
+
}
|
|
338
|
+
//#endregion
|
|
339
|
+
//#region src/output/cap.ts
|
|
340
|
+
function fitWithinCap(envelope, maxBytes) {
|
|
341
|
+
const fullBytes = jsonByteLength(envelope);
|
|
342
|
+
if (maxBytes <= 0 || fullBytes <= maxBytes) return {
|
|
343
|
+
count: envelope.data.length,
|
|
344
|
+
fullBytes,
|
|
345
|
+
cut: false
|
|
346
|
+
};
|
|
347
|
+
let lo = 0;
|
|
348
|
+
let hi = envelope.data.length;
|
|
349
|
+
while (lo < hi) {
|
|
350
|
+
const mid = Math.ceil((lo + hi) / 2);
|
|
351
|
+
if (jsonByteLength(truncate(envelope, mid, fullBytes)) <= maxBytes) lo = mid;
|
|
352
|
+
else hi = mid - 1;
|
|
353
|
+
}
|
|
354
|
+
return {
|
|
355
|
+
count: lo,
|
|
356
|
+
fullBytes,
|
|
357
|
+
cut: true
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
function capListEnvelope(envelope, maxBytes) {
|
|
361
|
+
const fit = fitWithinCap(envelope, maxBytes);
|
|
362
|
+
if (!fit.cut || envelope.data.length === 0) return envelope;
|
|
363
|
+
return truncate(envelope, fit.count, fit.fullBytes);
|
|
364
|
+
}
|
|
365
|
+
function truncate(envelope, count, originalBytes) {
|
|
366
|
+
return {
|
|
367
|
+
...envelope,
|
|
368
|
+
data: envelope.data.slice(0, count),
|
|
369
|
+
returned: count,
|
|
370
|
+
has_more: true,
|
|
371
|
+
next_offset: count === 0 ? null : envelope.offset + count,
|
|
372
|
+
truncated: {
|
|
373
|
+
reason: "max_bytes",
|
|
374
|
+
bytes: originalBytes
|
|
375
|
+
}
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
function jsonByteLength(value) {
|
|
379
|
+
return Buffer.byteLength(JSON.stringify(value), "utf8");
|
|
380
|
+
}
|
|
381
|
+
//#endregion
|
|
382
|
+
//#region src/output/projection.ts
|
|
383
|
+
function projectForList(item, view, opts) {
|
|
384
|
+
const full = opts.format === "text" && opts.fields === void 0 ? false : opts.full;
|
|
385
|
+
try {
|
|
386
|
+
return applyProjection(item, view, full, opts.fields);
|
|
387
|
+
} catch (error) {
|
|
388
|
+
throw enrichListFieldPathError(error, opts.fields);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
function enrichListFieldPathError(error, fields) {
|
|
392
|
+
if (fields === void 0 || !(error instanceof ConfigError) || !error.message.startsWith("unknown field path")) return error;
|
|
393
|
+
const prefix = "data.";
|
|
394
|
+
const culprit = fields.find((field) => field === "data" || field.startsWith(prefix));
|
|
395
|
+
if (culprit === void 0) return error;
|
|
396
|
+
const suggestion = culprit.startsWith(prefix) ? culprit.slice(5) : "<field>";
|
|
397
|
+
return new ConfigError(`${error.message} — on list commands --fields paths are relative to each item in \`data\`, not the envelope. Drop the \`data.\` prefix (e.g. use \`${suggestion}\` instead of \`${culprit}\`).`);
|
|
398
|
+
}
|
|
399
|
+
function applyProjection(value, view, full, fields) {
|
|
400
|
+
if (fields !== void 0) {
|
|
401
|
+
if (fields.length === 0) throw new ConfigError("--fields requires at least one path");
|
|
402
|
+
return projectFields(value, fields);
|
|
403
|
+
}
|
|
404
|
+
if (full) return value;
|
|
405
|
+
const parsed = view.compactPick.safeParse(value);
|
|
406
|
+
if (parsed.success) return parsed.data;
|
|
407
|
+
throw new ConfigError(`compact projection failed: ${parsed.error.message}`);
|
|
408
|
+
}
|
|
409
|
+
function projectFields(value, fields) {
|
|
410
|
+
const out = {};
|
|
411
|
+
for (const path of fields) {
|
|
412
|
+
if (path.length === 0) throw new ConfigError(`empty field path`);
|
|
413
|
+
const parts = path.split(".");
|
|
414
|
+
if (parts.some((part) => part.length === 0)) throw new ConfigError(`invalid field path: "${path}"`);
|
|
415
|
+
setPath(out, parts, pickPath(value, parts));
|
|
416
|
+
}
|
|
417
|
+
return out;
|
|
418
|
+
}
|
|
419
|
+
function pickPath(value, parts) {
|
|
420
|
+
let cursor = value;
|
|
421
|
+
for (const part of parts) {
|
|
422
|
+
if (!isPlainObject(cursor) || !Object.hasOwn(cursor, part)) throw new ConfigError(`unknown field path: "${parts.join(".")}"`);
|
|
423
|
+
cursor = Reflect.get(cursor, part);
|
|
424
|
+
}
|
|
425
|
+
return cursor;
|
|
426
|
+
}
|
|
427
|
+
function setPath(target, parts, value) {
|
|
428
|
+
let cursor = target;
|
|
429
|
+
const lastIndex = parts.length - 1;
|
|
430
|
+
for (const [index, part] of parts.entries()) {
|
|
431
|
+
if (index === lastIndex) {
|
|
432
|
+
cursor[part] = value;
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
const existing = cursor[part];
|
|
436
|
+
if (isPlainObject(existing)) cursor = existing;
|
|
437
|
+
else {
|
|
438
|
+
const next = {};
|
|
439
|
+
cursor[part] = next;
|
|
440
|
+
cursor = next;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
//#endregion
|
|
445
|
+
//#region src/output/table.ts
|
|
446
|
+
const PLAIN_TABLE_STYLE = {
|
|
447
|
+
head: [],
|
|
448
|
+
border: []
|
|
449
|
+
};
|
|
450
|
+
function renderTable(rows, columns) {
|
|
451
|
+
const head = columns.map((column) => column.label ?? column.key);
|
|
452
|
+
const widths = columns.map((column) => column.width ?? null);
|
|
453
|
+
const table = new Table(widths.some((width) => width !== null) ? {
|
|
454
|
+
head,
|
|
455
|
+
colWidths: widths,
|
|
456
|
+
style: PLAIN_TABLE_STYLE
|
|
457
|
+
} : {
|
|
458
|
+
head,
|
|
459
|
+
style: PLAIN_TABLE_STYLE
|
|
460
|
+
});
|
|
461
|
+
for (const row of rows) table.push(columns.map((column) => formatCell(row, column)));
|
|
462
|
+
return table.toString();
|
|
463
|
+
}
|
|
464
|
+
function renderRows(head, rows) {
|
|
465
|
+
const table = new Table({
|
|
466
|
+
head: [...head],
|
|
467
|
+
style: PLAIN_TABLE_STYLE
|
|
468
|
+
});
|
|
469
|
+
for (const row of rows) table.push([...row]);
|
|
470
|
+
return table.toString();
|
|
471
|
+
}
|
|
472
|
+
function formatCell(row, column) {
|
|
473
|
+
const value = row[column.key];
|
|
474
|
+
if (column.format !== void 0) return column.format(value);
|
|
475
|
+
return formatScalar(value);
|
|
476
|
+
}
|
|
477
|
+
const MALFORMED_CELL = "<malformed>";
|
|
478
|
+
function formatScalar(value) {
|
|
479
|
+
if (value === null || value === void 0) return "";
|
|
480
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") return String(value);
|
|
481
|
+
return JSON.stringify(value);
|
|
482
|
+
}
|
|
483
|
+
//#endregion
|
|
484
|
+
//#region src/output/render.ts
|
|
485
|
+
function serializeJson(value, pretty) {
|
|
486
|
+
return JSON.stringify(value, null, pretty ? 2 : void 0);
|
|
487
|
+
}
|
|
488
|
+
function stdoutPretty() {
|
|
489
|
+
return process.stdout.isTTY === true;
|
|
490
|
+
}
|
|
491
|
+
function jsonLine(value) {
|
|
492
|
+
return serializeJson(value, stdoutPretty()) + "\n";
|
|
493
|
+
}
|
|
494
|
+
function writeJson(value) {
|
|
495
|
+
process.stdout.write(jsonLine(value));
|
|
496
|
+
}
|
|
497
|
+
function writeText(text) {
|
|
498
|
+
process.stdout.write(text + "\n");
|
|
499
|
+
}
|
|
500
|
+
function renderItem(item, view, opts) {
|
|
501
|
+
const body = renderItemBody(item, view, applyProjection(item, view, opts.full, opts.fields), opts) + "\n";
|
|
502
|
+
assertItemWithinMaxBytes(body, opts);
|
|
503
|
+
process.stdout.write(body);
|
|
504
|
+
}
|
|
505
|
+
function renderSummary(item, view, summaryText, opts) {
|
|
506
|
+
if (opts.format === "json" || opts.fields !== void 0 || opts.full) {
|
|
507
|
+
renderItem(item, view, opts);
|
|
508
|
+
return;
|
|
509
|
+
}
|
|
510
|
+
const body = (typeof summaryText === "function" ? summaryText() : summaryText) + "\n";
|
|
511
|
+
assertItemWithinMaxBytes(body, opts);
|
|
512
|
+
process.stdout.write(body);
|
|
513
|
+
}
|
|
514
|
+
function renderList(envelope, view, opts) {
|
|
515
|
+
if (opts.format === "json") {
|
|
516
|
+
renderJsonEnvelope(envelope, view, opts);
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
if (envelope.data.length === 0) {
|
|
520
|
+
process.stdout.write("(no results)\n");
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
523
|
+
if (opts.fields !== void 0) {
|
|
524
|
+
renderProjectedTable(envelope, view, opts.fields, opts);
|
|
525
|
+
return;
|
|
526
|
+
}
|
|
527
|
+
const fit = fitWithinCap(projectedEnvelope(envelope, view, opts), opts.maxBytes);
|
|
528
|
+
const kept = envelope.data.slice(0, fit.count);
|
|
529
|
+
process.stdout.write(renderTable(kept, view.tableColumns) + "\n");
|
|
530
|
+
warnIfCut(fit, envelope.offset, opts.oversizeHint);
|
|
531
|
+
}
|
|
532
|
+
function warnIfCut(fit, offset, hint) {
|
|
533
|
+
if (!fit.cut) return;
|
|
534
|
+
warn(listTruncationNotice(fit.fullBytes, fit.count === 0 ? null : offset + fit.count, hint));
|
|
535
|
+
}
|
|
536
|
+
function renderProjectedTable(envelope, view, fields, opts) {
|
|
537
|
+
const projected = projectedEnvelope(envelope, view, opts);
|
|
538
|
+
const fit = fitWithinCap(projected, opts.maxBytes);
|
|
539
|
+
const rows = projected.data.slice(0, fit.count).map((item) => fields.map((path) => formatScalar(pickPath(item, path.split(".")))));
|
|
540
|
+
process.stdout.write(renderRows(fields, rows) + "\n");
|
|
541
|
+
warnIfCut(fit, envelope.offset, opts.oversizeHint);
|
|
542
|
+
}
|
|
543
|
+
function projectedEnvelope(envelope, view, opts) {
|
|
544
|
+
return {
|
|
545
|
+
...envelope,
|
|
546
|
+
data: envelope.data.map((item) => projectForList(item, view, opts))
|
|
547
|
+
};
|
|
548
|
+
}
|
|
549
|
+
function renderJsonEnvelope(envelope, view, opts) {
|
|
550
|
+
const capped = capListEnvelope(projectedEnvelope(envelope, view, opts), opts.maxBytes);
|
|
551
|
+
const ordered = {
|
|
552
|
+
returned: capped.returned,
|
|
553
|
+
offset: capped.offset,
|
|
554
|
+
limit: capped.limit,
|
|
555
|
+
total: capped.total,
|
|
556
|
+
has_more: capped.has_more,
|
|
557
|
+
next_offset: capped.next_offset,
|
|
558
|
+
truncated: capped.truncated,
|
|
559
|
+
data: capped.data
|
|
560
|
+
};
|
|
561
|
+
process.stdout.write(serializeJson(ordered, stdoutPretty()) + "\n");
|
|
562
|
+
if (capped.truncated !== void 0) warn(listTruncationNotice(capped.truncated.bytes, capped.next_offset, opts.oversizeHint));
|
|
563
|
+
}
|
|
564
|
+
function renderItemBody(item, view, projected, opts) {
|
|
565
|
+
if (opts.format === "json") return serializeJson(projected, stdoutPretty());
|
|
566
|
+
if (opts.fields !== void 0 || opts.full) return renderKeyValueLines(objectPairs(projected));
|
|
567
|
+
return renderKeyValueLines(columnPairs(item, view.tableColumns));
|
|
568
|
+
}
|
|
569
|
+
function columnPairs(item, columns) {
|
|
570
|
+
return columns.map((column) => [column.label ?? column.key, formatCell(item, column)]);
|
|
571
|
+
}
|
|
572
|
+
function objectPairs(value) {
|
|
573
|
+
if (!isPlainObject(value)) {
|
|
574
|
+
const scalar = formatScalar(value);
|
|
575
|
+
return scalar === "" ? [] : [["", scalar]];
|
|
576
|
+
}
|
|
577
|
+
return Object.entries(value).map(([key, raw]) => [key, formatScalar(raw)]);
|
|
578
|
+
}
|
|
579
|
+
function renderKeyValueLines(pairs) {
|
|
580
|
+
if (pairs.length === 0) return "";
|
|
581
|
+
const padding = Math.max(...pairs.map(([label]) => label.length));
|
|
582
|
+
return pairs.map(([label, value]) => `${label.padEnd(padding)} ${value}`).join("\n");
|
|
583
|
+
}
|
|
584
|
+
function assertItemWithinMaxBytes(body, opts) {
|
|
585
|
+
if (opts.maxBytes <= 0) return;
|
|
586
|
+
const bytes = Buffer.byteLength(body, "utf8");
|
|
587
|
+
if (bytes <= opts.maxBytes) return;
|
|
588
|
+
throw new ConfigError(itemOversizeMessage(bytes, opts.maxBytes, opts.oversizeHint));
|
|
589
|
+
}
|
|
590
|
+
//#endregion
|
|
591
|
+
//#region src/output/error.ts
|
|
592
|
+
const DOWNGRADE_REMEDY = "Or install an `@metabase/cli` release that targets this server.";
|
|
593
|
+
const ROUTE_MISSING_REMEDY = "Run `mb auth list` to see this server's version.";
|
|
594
|
+
const ROUTE_MISSING_KIND = "route-missing";
|
|
595
|
+
const FAILURE_EXIT_CODE = 1;
|
|
596
|
+
const USAGE_EXIT_CODE = 2;
|
|
597
|
+
const INTERRUPTED_EXIT_CODE = 130;
|
|
598
|
+
function exitCodeFor(category) {
|
|
599
|
+
switch (category) {
|
|
600
|
+
case "config":
|
|
601
|
+
case "capability": return USAGE_EXIT_CODE;
|
|
602
|
+
case "abort": return INTERRUPTED_EXIT_CODE;
|
|
603
|
+
case "network":
|
|
604
|
+
case "http":
|
|
605
|
+
case "validation":
|
|
606
|
+
case "response-shape":
|
|
607
|
+
case "timeout":
|
|
608
|
+
case "internal":
|
|
609
|
+
case "unknown": return FAILURE_EXIT_CODE;
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
function reportError(error, format) {
|
|
613
|
+
const handled = isPromptCancel(error) ? new AbortError() : toMetabaseError(error);
|
|
614
|
+
const verbose = readEnv(ENV_VERBOSE) === "1";
|
|
615
|
+
const exitCode = exitCodeFor(handled.category);
|
|
616
|
+
if (format === "json") writeJsonError(handled, exitCode, verbose);
|
|
617
|
+
else writeTextError(handled, verbose);
|
|
618
|
+
for (const message of consumeLegacyEnvWarnings()) warn(message);
|
|
619
|
+
process.exitCode = exitCode;
|
|
620
|
+
}
|
|
621
|
+
function isVersionTooOld(detail) {
|
|
622
|
+
return typeof detail === "object" && detail !== null && "reason" in detail && detail.reason === "version-too-old";
|
|
623
|
+
}
|
|
624
|
+
function isRouteMissing(handled) {
|
|
625
|
+
return "kind" in handled && handled.kind === ROUTE_MISSING_KIND;
|
|
626
|
+
}
|
|
627
|
+
function remediesFor(handled) {
|
|
628
|
+
if (isVersionTooOld(handled.developerDetail)) return [DOWNGRADE_REMEDY];
|
|
629
|
+
if (isRouteMissing(handled)) return [ROUTE_MISSING_REMEDY];
|
|
630
|
+
return [];
|
|
631
|
+
}
|
|
632
|
+
function writeTextError(handled, verbose) {
|
|
633
|
+
process.stderr.write(handled.userMessage + "\n");
|
|
634
|
+
for (const remedy of remediesFor(handled)) process.stderr.write(remedy + "\n");
|
|
635
|
+
if (handled.developerDetail === null) return;
|
|
636
|
+
if (verbose) process.stderr.write(serializeJson(handled.developerDetail, stderrPretty()) + "\n");
|
|
637
|
+
else process.stderr.write("(rerun with MB_VERBOSE=1 for details)\n");
|
|
638
|
+
}
|
|
639
|
+
function stderrPretty() {
|
|
640
|
+
return process.stderr.isTTY === true;
|
|
641
|
+
}
|
|
642
|
+
function writeJsonError(handled, exitCode, verbose) {
|
|
643
|
+
const payload = {
|
|
644
|
+
category: handled.category,
|
|
645
|
+
message: [handled.userMessage, ...remediesFor(handled)].join("\n"),
|
|
646
|
+
exitCode
|
|
647
|
+
};
|
|
648
|
+
if (verbose && handled.developerDetail !== null) payload.detail = handled.developerDetail;
|
|
649
|
+
const envelope = {
|
|
650
|
+
ok: false,
|
|
651
|
+
error: payload
|
|
652
|
+
};
|
|
653
|
+
process.stderr.write(serializeJson(envelope, stderrPretty()) + "\n");
|
|
654
|
+
}
|
|
655
|
+
//#endregion
|
|
656
|
+
//#region ../client/src/version/capabilities.ts
|
|
657
|
+
const Capabilities = z.object({
|
|
658
|
+
minVersion: z.number(),
|
|
659
|
+
tokenFeature: z.string().optional()
|
|
660
|
+
});
|
|
661
|
+
const BASELINE_CAPABILITIES = Object.freeze({ minVersion: 58 });
|
|
662
|
+
function mergeCapabilities(overrides) {
|
|
663
|
+
if (overrides === void 0) return BASELINE_CAPABILITIES;
|
|
664
|
+
return {
|
|
665
|
+
minVersion: overrides.minVersion ?? BASELINE_CAPABILITIES.minVersion,
|
|
666
|
+
...overrides.tokenFeature === void 0 ? {} : { tokenFeature: overrides.tokenFeature }
|
|
667
|
+
};
|
|
668
|
+
}
|
|
669
|
+
function checkCapabilities(info, required) {
|
|
670
|
+
if (info.version === null) return {
|
|
671
|
+
reason: "unknown-version",
|
|
672
|
+
detail: "Could not detect Metabase server version. Proceeding without preflight check; failures may produce confusing errors."
|
|
673
|
+
};
|
|
674
|
+
if (info.version.major < required.minVersion) return {
|
|
675
|
+
reason: "version-too-old",
|
|
676
|
+
detail: `This operation requires Metabase v${required.minVersion}+ (this server is ${info.version.tag}). Upgrade Metabase to use it.`
|
|
677
|
+
};
|
|
678
|
+
if (required.tokenFeature !== void 0) {
|
|
679
|
+
if (!(info.tokenFeatures?.[required.tokenFeature] === true)) return {
|
|
680
|
+
reason: "missing-token-feature",
|
|
681
|
+
detail: `This operation requires the '${required.tokenFeature}' premium feature (not enabled on this server).`
|
|
682
|
+
};
|
|
683
|
+
}
|
|
684
|
+
return null;
|
|
685
|
+
}
|
|
121
686
|
//#endregion
|
|
122
687
|
//#region src/runtime/command-help.ts
|
|
123
688
|
const CommandHelpArg = z.object({
|
|
@@ -142,9 +707,9 @@ const CommandHelpSkill = z.object({
|
|
|
142
707
|
skill: z.string(),
|
|
143
708
|
purpose: z.string()
|
|
144
709
|
});
|
|
145
|
-
|
|
710
|
+
z.object({
|
|
146
711
|
command: z.string(),
|
|
147
|
-
description: z.string(),
|
|
712
|
+
description: z.string().nullable(),
|
|
148
713
|
details: z.string().optional(),
|
|
149
714
|
skills: z.array(CommandHelpSkill),
|
|
150
715
|
examples: z.array(z.string()),
|
|
@@ -155,9 +720,13 @@ const CommandHelpEntry = z.object({
|
|
|
155
720
|
});
|
|
156
721
|
const CommandIndexEntry = z.object({
|
|
157
722
|
command: z.string(),
|
|
158
|
-
description: z.string()
|
|
723
|
+
description: z.string().nullable()
|
|
724
|
+
});
|
|
725
|
+
z.object({
|
|
726
|
+
description: z.string().nullable(),
|
|
727
|
+
skills: z.array(CommandHelpSkill),
|
|
728
|
+
commands: z.array(CommandIndexEntry)
|
|
159
729
|
});
|
|
160
|
-
const CommandHelpIndex = z.object({ commands: z.array(CommandIndexEntry) });
|
|
161
730
|
const EMPTY_AUGMENT = {
|
|
162
731
|
examples: [],
|
|
163
732
|
details: null,
|
|
@@ -184,27 +753,29 @@ async function buildHelpEntry(cmd, path) {
|
|
|
184
753
|
return entry;
|
|
185
754
|
}
|
|
186
755
|
async function buildHelpIndex(cmd, path) {
|
|
187
|
-
|
|
756
|
+
const meta = await resolveCitty(cmd.meta);
|
|
757
|
+
const augment = getMetabaseAugment(cmd) ?? EMPTY_AUGMENT;
|
|
758
|
+
return {
|
|
759
|
+
description: readDescription(meta),
|
|
760
|
+
skills: Array.from(augment.skills),
|
|
761
|
+
commands: await walk(cmd, path)
|
|
762
|
+
};
|
|
188
763
|
}
|
|
189
764
|
async function walk(cmd, path) {
|
|
190
765
|
const meta = await resolveCitty(cmd.meta);
|
|
191
766
|
if (meta?.hidden === true) return [];
|
|
192
767
|
const subCommands = await resolveCitty(cmd.subCommands);
|
|
193
|
-
if (subCommands && Object.keys(subCommands).length > 0) {
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
}));
|
|
198
|
-
return groups.flat();
|
|
199
|
-
}
|
|
768
|
+
if (subCommands && Object.keys(subCommands).length > 0) return (await Promise.all(Object.entries(subCommands).map(async ([name, lazy]) => {
|
|
769
|
+
const sub = await resolveCitty(lazy);
|
|
770
|
+
return sub ? walk(sub, [...path, name]) : [];
|
|
771
|
+
}))).flat();
|
|
200
772
|
return [{
|
|
201
773
|
command: path.join(" "),
|
|
202
774
|
description: readDescription(meta)
|
|
203
775
|
}];
|
|
204
776
|
}
|
|
205
777
|
function readDescription(meta) {
|
|
206
|
-
|
|
207
|
-
return typeof meta.description === "string" ? meta.description : "";
|
|
778
|
+
return typeof meta?.description === "string" ? meta.description : null;
|
|
208
779
|
}
|
|
209
780
|
function convertArgs(args) {
|
|
210
781
|
return Object.entries(args).map(([name, def]) => convertArg(name, def));
|
|
@@ -233,11 +804,7 @@ function readAlias(def) {
|
|
|
233
804
|
function isPrimitiveDefault(value) {
|
|
234
805
|
return typeof value === "string" || typeof value === "boolean" || typeof value === "number";
|
|
235
806
|
}
|
|
236
|
-
|
|
237
|
-
//#endregion
|
|
238
|
-
//#region src/output/help.ts
|
|
239
|
-
const ANSI_ESC = String.fromCharCode(27);
|
|
240
|
-
const ANSI_PATTERN = new RegExp(`${ANSI_ESC}\\[[0-9;]*m`, "g");
|
|
807
|
+
const ANSI_PATTERN = new RegExp(`\\[[0-9;]*m`, "g");
|
|
241
808
|
const BREADCRUMB_SUFFIX = / \([^()]*\)\s*$/;
|
|
242
809
|
const TRAILING_WHITESPACE = /[ \t]+$/;
|
|
243
810
|
const ALIAS_PAIR = /-([a-z0-9]+(?:-[a-z0-9]+)+), --[A-Za-z0-9]+/g;
|
|
@@ -253,8 +820,7 @@ const GETTING_STARTED_HINT = `First time? Run \`${CLI_NAME} auth login\` to conn
|
|
|
253
820
|
const SKILLS_HEADER = "AGENT SKILLS";
|
|
254
821
|
const SKILLS_LIST_ITEM = `${CLI_NAME} skills list — every bundled skill`;
|
|
255
822
|
async function showUsage(cmd, parent, breadcrumb) {
|
|
256
|
-
const
|
|
257
|
-
const lines = raw.split("\n").map((line) => line.replace(TRAILING_WHITESPACE, ""));
|
|
823
|
+
const lines = (await renderUsage(cmd, parent)).replace(ANSI_PATTERN, "").split("\n").map((line) => line.replace(TRAILING_WHITESPACE, ""));
|
|
258
824
|
const cmdMeta = await resolveCitty(cmd.meta);
|
|
259
825
|
const parentMeta = parent === void 0 ? void 0 : await resolveCitty(parent.meta);
|
|
260
826
|
const cmdName = cmdMeta?.name ?? "";
|
|
@@ -265,13 +831,11 @@ async function showUsage(cmd, parent, breadcrumb) {
|
|
|
265
831
|
const details = augment?.details ?? null;
|
|
266
832
|
const examples = augment?.examples ?? [];
|
|
267
833
|
const skills = augment?.skills ?? [];
|
|
268
|
-
const
|
|
834
|
+
const sections = [withDetails(transformBody(lines, {
|
|
269
835
|
cittyName,
|
|
270
836
|
breadcrumb: breadcrumb ?? cittyName,
|
|
271
837
|
hasSubCommands
|
|
272
|
-
});
|
|
273
|
-
const body = withDetails(transformed, details).join("\n").trimEnd();
|
|
274
|
-
const sections = [body];
|
|
838
|
+
}), details).join("\n").trimEnd()];
|
|
275
839
|
if (examples.length > 0) sections.push(renderExamples(examples));
|
|
276
840
|
if (skills.length > 0) sections.push(renderSkillsSection(skills, isRoot));
|
|
277
841
|
if (isRoot) sections.push(GETTING_STARTED_HINT);
|
|
@@ -281,9 +845,7 @@ async function showUsage(cmd, parent, breadcrumb) {
|
|
|
281
845
|
async function showUsageJson(cmd, breadcrumb) {
|
|
282
846
|
const path = breadcrumbPath(breadcrumb);
|
|
283
847
|
const subCommands = await resolveCitty(cmd.subCommands);
|
|
284
|
-
|
|
285
|
-
const payload = hasSubCommands ? await buildHelpIndex(cmd, path) : await buildHelpEntry(cmd, path);
|
|
286
|
-
await writeUsage(jsonLine(payload));
|
|
848
|
+
await writeUsage(jsonLine(subCommands !== void 0 && Object.keys(subCommands).length > 0 ? await buildHelpIndex(cmd, path) : await buildHelpEntry(cmd, path)));
|
|
287
849
|
}
|
|
288
850
|
function writeUsage(text) {
|
|
289
851
|
return new Promise((resolve, reject) => {
|
|
@@ -297,20 +859,18 @@ function breadcrumbPath(breadcrumb) {
|
|
|
297
859
|
const MACHINE_HELP_LEAF_LABEL = "Machine-readable help (flags, output schema):";
|
|
298
860
|
const MACHINE_HELP_INDEX_LABEL = "Machine-readable command index:";
|
|
299
861
|
function machineHelpHint(breadcrumb, hasSubCommands) {
|
|
300
|
-
|
|
301
|
-
return `${label} ${breadcrumb} --help --json`;
|
|
862
|
+
return `${hasSubCommands ? MACHINE_HELP_INDEX_LABEL : MACHINE_HELP_LEAF_LABEL} ${breadcrumb} --help --json`;
|
|
302
863
|
}
|
|
303
864
|
function transformBody(lines, rewrite) {
|
|
304
|
-
|
|
865
|
+
return injectHelpOption(lines.map((line, index) => {
|
|
305
866
|
if (index === 0) return line.replace(BREADCRUMB_SUFFIX, "");
|
|
306
867
|
if (line.startsWith(USAGE_PREFIX)) return rewriteUsageLine(line, rewrite);
|
|
307
868
|
return fixAliasRow(line);
|
|
308
|
-
});
|
|
309
|
-
return injectHelpOption(mapped);
|
|
869
|
+
}));
|
|
310
870
|
}
|
|
311
871
|
function rewriteUsageLine(line, rewrite) {
|
|
312
872
|
if (rewrite.hasSubCommands) return `${USAGE_PREFIX}${rewrite.breadcrumb} ${COMMAND_PLACEHOLDER}`;
|
|
313
|
-
const content = line.slice(
|
|
873
|
+
const content = line.slice(6);
|
|
314
874
|
if (!content.startsWith(rewrite.cittyName)) return line;
|
|
315
875
|
const rest = content.slice(rewrite.cittyName.length);
|
|
316
876
|
return `${USAGE_PREFIX}${rewrite.breadcrumb}${rest}`;
|
|
@@ -425,9 +985,8 @@ async function findSubCommand(subCommands, token) {
|
|
|
425
985
|
if (direct !== void 0) {
|
|
426
986
|
const command = await resolveCitty(direct);
|
|
427
987
|
if (command === void 0) return null;
|
|
428
|
-
const meta = await resolveCitty(command.meta);
|
|
429
988
|
return {
|
|
430
|
-
name: meta?.name ?? token,
|
|
989
|
+
name: (await resolveCitty(command.meta))?.name ?? token,
|
|
431
990
|
command
|
|
432
991
|
};
|
|
433
992
|
}
|
|
@@ -442,17 +1001,37 @@ async function findSubCommand(subCommands, token) {
|
|
|
442
1001
|
}
|
|
443
1002
|
return null;
|
|
444
1003
|
}
|
|
445
|
-
|
|
1004
|
+
//#endregion
|
|
1005
|
+
//#region src/runtime/interrupt.ts
|
|
1006
|
+
const INTERRUPT_REASON = new AbortError("interrupted");
|
|
1007
|
+
const INTERRUPT_EXIT_CODE = exitCodeFor(INTERRUPT_REASON.category);
|
|
1008
|
+
const controller = new AbortController();
|
|
1009
|
+
const interruptSignal = controller.signal;
|
|
1010
|
+
function abortOnInterrupt() {
|
|
1011
|
+
if (!controller.signal.aborted) controller.abort(INTERRUPT_REASON);
|
|
1012
|
+
}
|
|
1013
|
+
const FORCED_EXIT_GRACE_MS = 2e3;
|
|
1014
|
+
function installInterruptHandler(exit) {
|
|
1015
|
+
process.on("SIGINT", () => {
|
|
1016
|
+
if (interruptSignal.aborted) {
|
|
1017
|
+
exit(INTERRUPT_EXIT_CODE);
|
|
1018
|
+
return;
|
|
1019
|
+
}
|
|
1020
|
+
abortOnInterrupt();
|
|
1021
|
+
setTimeout(() => exit(INTERRUPT_EXIT_CODE), FORCED_EXIT_GRACE_MS).unref();
|
|
1022
|
+
});
|
|
1023
|
+
}
|
|
446
1024
|
//#endregion
|
|
447
1025
|
//#region src/cli.ts
|
|
448
|
-
const HELP_FLAGS = new Set(["--help", "-h"]);
|
|
1026
|
+
const HELP_FLAGS = /* @__PURE__ */ new Set(["--help", "-h"]);
|
|
449
1027
|
const JSON_HELP_FLAG = "--json";
|
|
450
1028
|
async function run() {
|
|
1029
|
+
installInterruptHandler((code) => process.exit(code));
|
|
451
1030
|
trustSystemCa();
|
|
452
1031
|
const rawArgs = hoistGlobalFlags(process.argv.slice(2));
|
|
453
1032
|
const wantsJsonHelp = rawArgs.includes(JSON_HELP_FLAG);
|
|
454
1033
|
const showUsageWithBreadcrumb = async (cmd, parent) => {
|
|
455
|
-
const breadcrumb = await resolveBreadcrumb(
|
|
1034
|
+
const breadcrumb = await resolveBreadcrumb(main, rawArgs);
|
|
456
1035
|
if (wantsJsonHelp) {
|
|
457
1036
|
await showUsageJson(cmd, breadcrumb);
|
|
458
1037
|
return;
|
|
@@ -460,17 +1039,17 @@ async function run() {
|
|
|
460
1039
|
await showUsage(cmd, parent, breadcrumb);
|
|
461
1040
|
};
|
|
462
1041
|
if (rawArgs.length === 0) {
|
|
463
|
-
await showUsageWithBreadcrumb(
|
|
1042
|
+
await showUsageWithBreadcrumb(main);
|
|
464
1043
|
return;
|
|
465
1044
|
}
|
|
466
1045
|
if (!rawArgs.some((arg) => HELP_FLAGS.has(arg))) {
|
|
467
|
-
const unknown = await findUnknownCommand(
|
|
1046
|
+
const unknown = await findUnknownCommand(main, rawArgs);
|
|
468
1047
|
if (unknown !== null) {
|
|
469
1048
|
reportError(new ConfigError(`unknown command: ${unknown}`));
|
|
470
1049
|
return;
|
|
471
1050
|
}
|
|
472
1051
|
}
|
|
473
|
-
await runMain(
|
|
1052
|
+
await runMain(main, {
|
|
474
1053
|
showUsage: showUsageWithBreadcrumb,
|
|
475
1054
|
rawArgs
|
|
476
1055
|
});
|
|
@@ -478,5 +1057,5 @@ async function run() {
|
|
|
478
1057
|
run().catch((error) => {
|
|
479
1058
|
reportError(error);
|
|
480
1059
|
});
|
|
481
|
-
|
|
482
|
-
|
|
1060
|
+
//#endregion
|
|
1061
|
+
export { name as A, normalizeFlag as B, ENV_PROFILE as C, consumeLegacyEnvWarnings as D, ENV_URL as E, outputFlags as F, profileFlag as I, DEFAULT_MAX_BYTES as L, connectionFlags as M, listFlags as N, readEnv as O, listFlagsWithDefaultLimit as P, listEnvelopeSchema as R, ENV_DISABLE_KEYRING as S, ENV_SKIP_PREFLIGHT as T, toAliasArray as V, promptSelect as _, reportError as a, warn as b, renderSummary as c, MALFORMED_CELL as d, formatScalar as f, promptPassword as g, promptConfirm as h, mergeCapabilities as i, version as j, setMetabaseAugment as k, writeJson as l, projectForList as m, BASELINE_CAPABILITIES as n, renderItem as o, renderRows as p, checkCapabilities as r, renderList as s, interruptSignal as t, writeText as u, promptText as v, ENV_SKILLS_DIR as w, ENV_API_KEY as x, listTruncationNotice as y, flagConsumesValue as z };
|