@metabase/cli 0.1.9 → 0.1.11

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 (169) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/README.md +71 -5
  3. package/dist/{add-collection-CoP-6FZR.mjs → add-collection-DKULSPwT.mjs} +4 -4
  4. package/dist/add-collection-DyEe_xRO.mjs +10 -0
  5. package/dist/{archive-BxwGVDpd.mjs → archive-BJ6uL3hh.mjs} +3 -3
  6. package/dist/{archive-CPLXsrzD.mjs → archive-BL_0fXhf.mjs} +4 -4
  7. package/dist/{archive-C17qIvFW.mjs → archive-BLbaqc-5.mjs} +5 -5
  8. package/dist/archive-BLxX3J6I.mjs +39 -0
  9. package/dist/{archive-Blt0TxxA.mjs → archive-DQsV2uwy.mjs} +5 -5
  10. package/dist/{archive-BY8nrgnq.mjs → archive-ibJVYsBC.mjs} +3 -3
  11. package/dist/{archive-BeslLaal.mjs → archive-y-_m3XID.mjs} +3 -3
  12. package/dist/auth-BKaQjcmP.mjs +19 -0
  13. package/dist/{body-2jl-YSxT.mjs → body-DCQg78AF.mjs} +1 -1
  14. package/dist/{branches-Vlu44J51.mjs → branches-CJVscsZe.mjs} +4 -4
  15. package/dist/{cancel-D0aBPUhs.mjs → cancel-C8W0sPix.mjs} +3 -3
  16. package/dist/{cancel-task-DoL2bqs1.mjs → cancel-task-dDgQDswT.mjs} +4 -4
  17. package/dist/card-CGBvUmCW.mjs +20 -0
  18. package/dist/{cards-6MTreYAo.mjs → cards-B7HE8BT6.mjs} +3 -3
  19. package/dist/cli.mjs +24 -23
  20. package/dist/collection-Ch7pPKHD.mjs +20 -0
  21. package/dist/{collection-namespace-BdqQJb7j.mjs → collection-namespace-CBCApZJf.mjs} +1 -1
  22. package/dist/{create-dVmIemXi.mjs → create-84jcfY4N.mjs} +3 -3
  23. package/dist/{create-BZRA7nPu.mjs → create-B6mzc8UK.mjs} +4 -4
  24. package/dist/{create-DcoF52Kx.mjs → create-BQA6nM5n.mjs} +4 -4
  25. package/dist/{create-C_Z3IDrW.mjs → create-BWaBYzhC.mjs} +4 -4
  26. package/dist/{create-BsOdn1Q1.mjs → create-DN8us8si.mjs} +3 -3
  27. package/dist/{create-BWD8H6yw.mjs → create-DPASPFGi.mjs} +5 -5
  28. package/dist/create-Di9NY7kK.mjs +44 -0
  29. package/dist/{create-DNYFXAsy.mjs → create-VjvMdgM5.mjs} +4 -4
  30. package/dist/{create-branch-40Xm4DN7.mjs → create-branch-CCoDX2Qf.mjs} +4 -4
  31. package/dist/{create-k59K2qf1.mjs → create-vNcD4jfq.mjs} +4 -4
  32. package/dist/{current-task-BN_XEFSX.mjs → current-task-QdxA3mSX.mjs} +4 -4
  33. package/dist/dashboard-BDb2krMr.mjs +21 -0
  34. package/dist/db-CoVdkdVm.mjs +22 -0
  35. package/dist/{delete-DEFgs5LE.mjs → delete-ByJ6guaH.mjs} +4 -4
  36. package/dist/{delete-tPjicYO4.mjs → delete-CE_Jfjni.mjs} +4 -4
  37. package/dist/{delete-table-CDj19Qn6.mjs → delete-table-D5LDUkOk.mjs} +4 -4
  38. package/dist/{dirty-DGCa6W1F.mjs → dirty-C6yzkIPn.mjs} +4 -4
  39. package/dist/document-BA2S1ev3.mjs +19 -0
  40. package/dist/document-CcfiiV3b.mjs +100 -0
  41. package/dist/{eid-3v5MAKNA.mjs → eid-ZOyix96k.mjs} +3 -3
  42. package/dist/{error-BndUmcwS.mjs → error-C1bUYXn7.mjs} +2 -1
  43. package/dist/{export-BIZ-UR_M.mjs → export-BhbBX-pl.mjs} +6 -6
  44. package/dist/field-B5bptFqL.mjs +18 -0
  45. package/dist/{fields-9lOrO8UH.mjs → fields-CZ6IK8Qf.mjs} +3 -3
  46. package/dist/{get-LI2xsRoT.mjs → get-157SWRte.mjs} +3 -3
  47. package/dist/{get-CHaIVT6Y.mjs → get-9b0ZEWh1.mjs} +4 -4
  48. package/dist/{get-6Cj360cH.mjs → get-B03gdAun.mjs} +3 -3
  49. package/dist/{get-BYSj7tMP.mjs → get-BKWZA_22.mjs} +4 -4
  50. package/dist/{get-BSJN5TwW.mjs → get-Bbo2Y-aL.mjs} +3 -3
  51. package/dist/{get-BpWjLkKT.mjs → get-BtqQ98nb.mjs} +3 -3
  52. package/dist/{get-Bk81meka.mjs → get-C0emTO1r.mjs} +2 -2
  53. package/dist/{get-BuM6QPjZ.mjs → get-CqKttHWW.mjs} +4 -4
  54. package/dist/{get-BIH72g0v.mjs → get-D49EdHgH.mjs} +3 -3
  55. package/dist/{get-DFe2WoJ2.mjs → get-DIyv2a7h.mjs} +4 -4
  56. package/dist/get-DclzgC5G.mjs +36 -0
  57. package/dist/{get-w-WqpjKy.mjs → get-DlzC0xCg.mjs} +3 -3
  58. package/dist/{get-CRa-h69C.mjs → get-mR01pCNG.mjs} +4 -4
  59. package/dist/{get-DlGlnciR.mjs → get-nl41R-2q.mjs} +4 -4
  60. package/dist/{get-run-hCZaw8-h.mjs → get-run-_dlMCGp5.mjs} +4 -4
  61. package/dist/git-sync-DqJmONiB.mjs +28 -0
  62. package/dist/{has-remote-changes-DcpW1_KX.mjs → has-remote-changes-CToITRyl.mjs} +4 -4
  63. package/dist/{import-CTQT1atq.mjs → import-xnYHb4QX.mjs} +6 -6
  64. package/dist/{is-dirty-DGrmt1ss.mjs → is-dirty-BHyMmUVV.mjs} +3 -3
  65. package/dist/is-dirty-BvA3yzRc.mjs +9 -0
  66. package/dist/{items-Kr0oN2V7.mjs → items-D3AmbIOO.mjs} +3 -3
  67. package/dist/{list-Cl_O4_U4.mjs → list-5ZZfaOzm.mjs} +3 -3
  68. package/dist/{list-Ccj8-vb5.mjs → list-BHCVZh7Q.mjs} +2 -2
  69. package/dist/{list-DzKKdfCI.mjs → list-BdStkg8G.mjs} +3 -3
  70. package/dist/{list-Cj3v4Lgv.mjs → list-BhZYkbc9.mjs} +2 -2
  71. package/dist/{list-DNmekF2B.mjs → list-BkzrFyJO.mjs} +3 -3
  72. package/dist/{list-tklIxo38.mjs → list-BtTRJyrR.mjs} +2 -2
  73. package/dist/{list-CLvlEVQo.mjs → list-Byn-dRW4.mjs} +3 -3
  74. package/dist/{list-CCtYVgPN.mjs → list-C5NywUBH.mjs} +3 -3
  75. package/dist/list-CA6MlByL.mjs +32 -0
  76. package/dist/{list-Bz2ej0Cl.mjs → list-CIu1zfpU.mjs} +3 -3
  77. package/dist/{list-D2D5Mw1E.mjs → list-C_d7ppOJ.mjs} +3 -3
  78. package/dist/{list-zRQsvrH6.mjs → list-D7Np4fwk.mjs} +3 -3
  79. package/dist/{list-DaESiI72.mjs → list-DKPhFATP.mjs} +3 -3
  80. package/dist/{list-jcgK0thu.mjs → list-DSJwMHXB.mjs} +2 -2
  81. package/dist/{login-BMKBmgeQ.mjs → login-jWvDDvEm.mjs} +3 -3
  82. package/dist/{logout-C5pod937.mjs → logout-Bltlsm6u.mjs} +2 -2
  83. package/dist/measure-DBX4k13t.mjs +19 -0
  84. package/dist/{metadata-DIEbyQeS.mjs → metadata-BKcyjsoA.mjs} +3 -3
  85. package/dist/{metadata-CG4VZ5NW.mjs → metadata-Bf2TfG8F.mjs} +3 -3
  86. package/dist/{parse-id-Boqc4wn4.mjs → parse-id-CWRJlQVK.mjs} +1 -1
  87. package/dist/{path-ur3NsMFr.mjs → path-Djw9IARu.mjs} +3 -3
  88. package/dist/{poll-BMjCkDaj.mjs → poll-hJrV0cPm.mjs} +1 -1
  89. package/dist/{poll-task-CiRA0ER9.mjs → poll-task-DK6X9Juu.mjs} +2 -2
  90. package/dist/{preflight-CSqcIlbX.mjs → preflight-DjSPp3Ct.mjs} +1 -1
  91. package/dist/{query-B8JzsQ_I.mjs → query-Cc-9oPsW.mjs} +3 -3
  92. package/dist/{query-CG0rEMS-.mjs → query-Do5n5SZc.mjs} +3 -3
  93. package/dist/{remove-collection-Clwz3EHQ.mjs → remove-collection-DVvnmU06.mjs} +6 -6
  94. package/dist/{rescan-values-DuHBnFjK.mjs → rescan-values-CHluR3JC.mjs} +3 -3
  95. package/dist/{run-JXRivkfH.mjs → run-CcJbcaw8.mjs} +6 -6
  96. package/dist/{runs-FxgbXvax.mjs → runs-Dc8qZBhl.mjs} +4 -4
  97. package/dist/{runtime-Ck8KKQe-.mjs → runtime-jWkzCPlL.mjs} +1 -1
  98. package/dist/{schema-tables-izDPI4f5.mjs → schema-tables-CZ6EMHUZ.mjs} +3 -3
  99. package/dist/{schemas-CyzplnXl.mjs → schemas-Br1cpOZc.mjs} +3 -3
  100. package/dist/{search-BeuoOEQV.mjs → search-DB2joPgt.mjs} +3 -3
  101. package/dist/segment-BWcyA1P-.mjs +19 -0
  102. package/dist/{set-ClzB_5Jk.mjs → set-BRhVzEWd.mjs} +5 -5
  103. package/dist/{setting-CBJVEx7_.mjs → setting-CuxO4T1n.mjs} +3 -3
  104. package/dist/{setup-vKXEUMM7.mjs → setup-Bn4jwxdl.mjs} +3 -3
  105. package/dist/{skills-1Z5Wj7Kp.mjs → skills-Db1r65S5.mjs} +3 -3
  106. package/dist/snippet-C9UM6NwC.mjs +19 -0
  107. package/dist/{stash-DLtVf4_D.mjs → stash-Dp2JFgmp.mjs} +6 -6
  108. package/dist/{status-AnPzI1f7.mjs → status-BxGBwALE.mjs} +2 -2
  109. package/dist/{status-DHFYn9kO.mjs → status-j09luNai.mjs} +5 -5
  110. package/dist/{summary-DDed1LOz.mjs → summary-DVrj7DSa.mjs} +3 -3
  111. package/dist/{sync-schema-BGQVq2JA.mjs → sync-schema-BVHvjzGX.mjs} +5 -5
  112. package/dist/table-DYI8K12W.mjs +19 -0
  113. package/dist/transform-CvbMbJtI.mjs +24 -0
  114. package/dist/transform-job-CtzgvccZ.mjs +19 -0
  115. package/dist/{tree-BlYgJOn9.mjs → tree-BEPw6xbY.mjs} +2 -2
  116. package/dist/{update-CgOPxKXK.mjs → update-B5VBJFU9.mjs} +6 -6
  117. package/dist/{update-CoVvsU-I.mjs → update-BXaT0Faw.mjs} +5 -5
  118. package/dist/{update-B0z-2zqC.mjs → update-Bd0ASKUG.mjs} +5 -5
  119. package/dist/{update-DBN7yfAk.mjs → update-Bn5wUyTQ.mjs} +4 -4
  120. package/dist/{update-BHtliIr_.mjs → update-C5vlBTII.mjs} +5 -5
  121. package/dist/{update-CilTW98H.mjs → update-C875_WGf.mjs} +5 -5
  122. package/dist/{update-DqSG5_Ie.mjs → update-CAoOJRwz.mjs} +5 -5
  123. package/dist/update-DiG6SSGm.mjs +52 -0
  124. package/dist/{update-DykqQLfo.mjs → update-DzKPxRBE.mjs} +4 -4
  125. package/dist/{update-dashcard-DZ8oV8up.mjs → update-dashcard-7bZtw04E.mjs} +4 -4
  126. package/dist/{update-CdfAogO2.mjs → update-fVqLtZ_t.mjs} +4 -4
  127. package/dist/{upgrade-B8sEEQdQ.mjs → upgrade-DdCxE9Ml.mjs} +2 -2
  128. package/dist/{uuid-lLVnEoBN.mjs → uuid-DywghRXO.mjs} +2 -2
  129. package/dist/{values-oD72EtRq.mjs → values-DSul3siC.mjs} +3 -3
  130. package/dist/{verify-Bg6F0oFN.mjs → verify-DzDyKXOa.mjs} +1 -1
  131. package/dist/{wait-BtzuqQC3.mjs → wait-CacFZI5Y.mjs} +5 -5
  132. package/dist/{wait-flags-DyFfZeav.mjs → wait-flags-DV419apK.mjs} +2 -2
  133. package/package.json +2 -1
  134. package/skill-data/core/SKILL.md +24 -25
  135. package/skill-data/data-analysis/SKILL.md +65 -0
  136. package/skill-data/data-transformation/SKILL.md +200 -0
  137. package/skill-data/document/SKILL.md +162 -0
  138. package/skill-data/mbql/SKILL.md +20 -20
  139. package/skill-data/robot-data-engineer/SKILL.md +142 -0
  140. package/skill-data/semantic-layer/SKILL.md +166 -0
  141. package/skill-data/transform/SKILL.md +46 -48
  142. package/skill-data/visualization/SKILL.md +5 -3
  143. package/skills/metabase-cli/SKILL.md +6 -0
  144. package/dist/add-collection-EPp89tcs.mjs +0 -10
  145. package/dist/auth-CCUDM9Sv.mjs +0 -19
  146. package/dist/card-UwczcLjq.mjs +0 -20
  147. package/dist/collection-Cexywhlj.mjs +0 -20
  148. package/dist/dashboard-B_CuVbMX.mjs +0 -21
  149. package/dist/db-DULi5MOr.mjs +0 -22
  150. package/dist/field-CfrrLetM.mjs +0 -18
  151. package/dist/git-sync-BpRstrZo.mjs +0 -28
  152. package/dist/is-dirty-DuWCgrz2.mjs +0 -9
  153. package/dist/measure-BkwFsP44.mjs +0 -19
  154. package/dist/segment-ChYmSM0p.mjs +0 -19
  155. package/dist/snippet-De70ayL1.mjs +0 -19
  156. package/dist/table-C_bP2ao-.mjs +0 -19
  157. package/dist/transform-B4RZfm6A.mjs +0 -24
  158. package/dist/transform-job-C4pZcrIF.mjs +0 -19
  159. /package/dist/{delete-runtime-DVb-Pkzp.mjs → delete-runtime-CjFc69tS.mjs} +0 -0
  160. /package/dist/{key-C2XG394c.mjs → key-y4TtxKwU.mjs} +0 -0
  161. /package/dist/{manifest-Cmu--CG5.mjs → manifest-BPHqF5LY.mjs} +0 -0
  162. /package/dist/{measure-ClESGxIb.mjs → measure-COGAoZpo.mjs} +0 -0
  163. /package/dist/{revision-message-flag-WmsIzUOM.mjs → revision-message-flag-Bo-Kvv6F.mjs} +0 -0
  164. /package/dist/{segment-Be2v4ilr.mjs → segment-d-708KKO.mjs} +0 -0
  165. /package/dist/{setting-oL97SNeO.mjs → setting-CSJvi1-6.mjs} +0 -0
  166. /package/dist/{skills-BDPVoBWU.mjs → skills-CY_FmaPo.mjs} +0 -0
  167. /package/dist/{snippet-xh42tYly.mjs → snippet-BZvo05ua.mjs} +0 -0
  168. /package/dist/{transform-DyWCoiO-.mjs → transform--dviwMA1.mjs} +0 -0
  169. /package/dist/{transform-job-DpDGoqQt.mjs → transform-job-n8W6tLqF.mjs} +0 -0
@@ -8,7 +8,7 @@ allowed-tools: Read, Write, Edit, Bash, AskUserQuestion
8
8
 
9
9
  A **transform** persists the result of a query (native SQL or MBQL) to a warehouse table the user can read from cards, dashboards, and other transforms. It runs on a schedule (via `transform-job`) or on-demand (`transform run`).
10
10
 
11
- This skill covers the create-and-run flow. The general flag conventions, body-input precedence, and output flags live in the `core` skill (`mb skills get core`).
11
+ Flag conventions, body-input precedence, and output flags live in the `core` skill (`mb skills get core`). Deciding _which_ transforms to build — modeling a whole raw database into a set of clean, analysis-ready tables — is the `data-transformation` skill (`mb skills get data-transformation`).
12
12
 
13
13
  ## Body shape
14
14
 
@@ -17,37 +17,32 @@ A transform has two halves:
17
17
  - `source` — the query to run (`type: "query"`, with `query.type` of `native` or `mbql`).
18
18
  - `target` — the warehouse destination (`type: "table"`, with `database`, `schema`, `name`).
19
19
 
20
- Native SQL is the simplest source and the easiest to author by hand (see "Create + run" below). MBQL is what the Metabase UI emits and is more verbose; pull a sample with `mb transform get <id> --full --json` if you need its shape.
20
+ Native SQL is the simplest source and the easiest to author by hand. MBQL is what the Metabase UI emits and is more verbose; pull a sample with `mb transform get <id> --full --json` if you need its shape.
21
21
 
22
22
  For an **MBQL 5** `source.query` (`lib/type: "mbql/query"`), the body shape, the "options object is always second" clause rule, UUID minting, aggregation/order-by refs, naming aggregation output columns, and the `--print-schema` → `--dry-run` validation loop are all in the `mbql` skill — **`mb skills get mbql`**. The MBQL-5 pre-flight on `transform create`/`update` is documented there too (legacy MBQL 4 and native sources skip it). For a transform target, naming your aggregation output columns matters more than usual — a bare `count` / `avg_2` becomes the warehouse column name; see the `mbql` skill's "Naming aggregation output columns".
23
23
 
24
24
  ## Create + run (native SQL)
25
25
 
26
26
  ```bash
27
- cat > /tmp/transform.json <<'EOF'
28
- {
29
- "name": "user_counts_by_signup_year",
30
- "description": "Sample transform: counts users by year of signup",
31
- "source": {
32
- "type": "query",
33
- "query": {
34
- "type": "native",
35
- "database": <db-id>,
36
- "native": {
37
- "query": "SELECT date_trunc('year', created_at)::date AS signup_year, COUNT(*)::int AS user_count FROM public.users GROUP BY 1 ORDER BY 1"
38
- }
39
- }
40
- },
41
- "target": {
42
- "type": "table",
43
- "database": <db-id>,
44
- "schema": "public",
45
- "name": "user_counts_by_signup_year"
46
- }
47
- }
48
- EOF
49
-
50
- TRANSFORM_ID=$(mb transform create --file /tmp/transform.json --profile <name> --json | jq -r '.id')
27
+ # Author the SQL formatted — it's what `mb transform get` and the Metabase editor show.
28
+ cat > ./.scratch/user_counts_by_signup_year.sql <<'SQL'
29
+ SELECT
30
+ date_trunc('year', created_at)::date AS signup_year,
31
+ COUNT(*)::int AS user_count
32
+ FROM public.users
33
+ GROUP BY 1
34
+ ORDER BY 1
35
+ SQL
36
+
37
+ # Embed it with jq --rawfile so the newlines survive as \n in valid JSON (don't hand-write the SQL as one line).
38
+ jq -n --rawfile q ./.scratch/user_counts_by_signup_year.sql \
39
+ '{ name: "user_counts_by_signup_year",
40
+ description: "Sample transform: counts users by year of signup",
41
+ source: { type: "query", query: { type: "native", database: <db-id>, native: { query: $q } } },
42
+ target: { type: "table", database: <db-id>, schema: "public", name: "user_counts_by_signup_year" } }' \
43
+ > ./.scratch/transform.json
44
+
45
+ TRANSFORM_ID=$(mb transform create --file ./.scratch/transform.json --profile <name> --json | jq -r '.id')
51
46
  mb transform run "$TRANSFORM_ID" --wait --profile <name> --json
52
47
  ```
53
48
 
@@ -57,8 +52,8 @@ Notes:
57
52
  - Target `schema` is the schema the result table is written into (e.g. `public`).
58
53
  - `--wait` on `transform run` polls until status is `succeeded` or `failed`. Without it you only get `{message: "Transform run started", run_id, final: null}` and have to poll yourself.
59
54
  - `--sync` implies `--wait`, then waits until the run's output table is registered — the run registers it itself, no `db sync-schema` needed — adding `target_table_id` to the envelope. Use it when you'll build MBQL on the output (see "Inspect").
60
- - The `--json` envelope is shape-stable: `{message, run_id, final}` (plus `target_table_id` under `--sync` — a number, or `null` if the table didn't register before the timeout). `final` is always present — `null` when `--wait` is omitted or the run never started, otherwise a full `TransformRun` object with `status` and `message`. On a failed run (`final.status` ∈ {`failed`, `timeout`, `canceled`}) the CLI exits 1 and writes a one-line summary `transform run <id> failed` to stderr; the failure detail lives only in `final.message` on stdout, so `jq -r '.final.message'` is where to look.
61
- - The heredoc with single-quoted `'EOF'` prevents shell from interpolating any `$vars` inside the SQL.
55
+ - The `--json` envelope is shape-stable: `{message, run_id, final}` (plus `target_table_id` under `--sync` — a number, or `null` if the table didn't register before the timeout). `final` is `null` when `--wait` is omitted or the run never started, otherwise a full `TransformRun` object with `status` and `message`. On a failed run (`final.status` ∈ {`failed`, `timeout`, `canceled`}) the CLI exits 1 and writes a one-line summary `transform run <id> failed` to stderr; the failure detail lives only in `final.message` on stdout, so `jq -r '.final.message'` is where to look.
56
+ - **Keep the SQL formatted.** Author it multi-line in `./.scratch/<name>.sql` and embed with `jq --rawfile` (jq ≥1.6, which JSON-encodes the file so newlines become `\n`). The stored `native.query` is what `mb transform get` and the Metabase editor render — a single-line blob is valid JSON but unreadable when anyone opens the transform. Single-quote the heredoc delimiter (`<<'SQL'`) so the shell leaves `$vars` in the query alone (e.g. Postgres `$1`, `$$`).
62
57
  - `transform create --json` returns the agent-facing compact projection: `{id, name, description, source_type, target: {type, database, schema, name}, target_db_id}`. Read `target.schema`/`target.name` directly off the create output — no follow-up `transform get` needed to verify where the transform will write.
63
58
  - If a transform with the same `name` already has a YAML representation on disk under the configured remote-sync repo, `create` mints a `_2` suffix on the exported filename (the new transform gets a fresh `entity_id`; the prior one isn't touched). For "iterate on the same concept" workflows, prefer `transform update <id>` — see "Iterating on a failing transform" below.
64
59
  - **`collection_id` only accepts a collection in the `:transforms` namespace.** Transforms aren't filed next to cards and dashboards — passing a normal analytics collection id (the kind a dashboard lives in) fails create/update with `collection_id: A Transform can only go in Collections in the :transforms namespace.` Omit `collection_id` to leave the transform uncollected (the common case), or create one with `mb collection create --body '{"name":"…"}' --namespace transforms --json` and pass the returned `id`. Cards and dashboards you build **on top of** the transform's output table go in ordinary collections as usual — so "put the transform and its dashboard in collection X" generally means _X holds the dashboard + cards; the transform stays in the transforms namespace._
@@ -70,14 +65,14 @@ mb transform list --profile <name> --json
70
65
  mb transform get <id> --profile <name> --full --json # full transform incl. last run summary
71
66
  ```
72
67
 
73
- After a run the table physically exists in the warehouse, but Metabase addresses tables/columns by numeric id, so **MBQL and the UI can't reference a brand-new table until the instance syncs** (native SQL — a native `card` or `mb query` against `<schema>.<name>` — reads it immediately). Run and register in one step with `--sync`:
68
+ After a run the table physically exists in the warehouse, but Metabase addresses tables/columns by numeric id, so **MBQL and the UI can't reference a brand-new table until the instance syncs** (native SQL — a native `card` or `mb query` against `<schema>.<name>` — reads it immediately). Run and register in one step with `--sync`.
74
69
 
75
70
  ```bash
76
71
  TABLE_ID=$(mb transform run <id> --sync --profile <name> --json | jq -r '.target_table_id')
77
72
  mb table get "$TABLE_ID" --include fields --profile <name> --json # field ids for MBQL
78
73
  ```
79
74
 
80
- `--sync` runs the transform and polls until its output table is registered, returning the id as `target_table_id` — the run registers the table itself, so no `db sync-schema` is needed. On `target_table_id: null` (still syncing when the poll timed out; exit 0) re-poll `mb transform get <id> --full --json` until the `target_table_id` / `table` linkage lands.
75
+ On `target_table_id: null` (still syncing when the poll timed out; exit 0) re-poll `mb transform get <id> --full --json` until the `target_table_id` / `table` linkage lands.
81
76
 
82
77
  Columns and types are inferred from the result set; change the SELECT shape and the next run fails on a column mismatch — drop the table first (`transform delete-table <id>`). A changed shape also needs a re-run with `--sync` before MBQL sees the new/renamed columns.
83
78
 
@@ -104,14 +99,14 @@ Notes:
104
99
 
105
100
  ## Update body: send only writable keys, never round-trip the GET body
106
101
 
107
- `transform update <id>` is **PATCH semantics** — only send the fields you actually want to change. The endpoint accepts exactly these writable keys:
102
+ `transform update <id>` is **PATCH semantics** — only send the fields you want to change. The endpoint accepts exactly these writable keys:
108
103
 
109
104
  ```
110
105
  name, description, source, target, run_trigger,
111
106
  tag_ids, collection_id, owner_user_id, owner_email
112
107
  ```
113
108
 
114
- **Don't paste the output of `transform get` into a `transform update` body.** The GET response carries server-side fields (`id`, `entity_id`, `created_at`, `updated_at`, `creator_id`, `last_run`, `target_db_id`, `target_table_id`, `source_type`, `source_database_id`, `source_readable`, `creator`, `owner`, `table`, …) that the PUT endpoint isn't built to handle. Currently, unknown top-level keys flow into `t2/update!` and produce a leaked H2 SQL error like:
109
+ **Don't paste the output of `transform get` into a `transform update` body.** The GET response carries server-side fields (`id`, `entity_id`, `created_at`, `updated_at`, `creator_id`, `last_run`, `target_db_id`, `target_table_id`, `source_type`, `source_database_id`, `source_readable`, `creator`, `owner`, `table`, …) that the PUT endpoint isn't built to handle. Unknown top-level keys flow into `t2/update!` and produce a leaked H2 SQL error like:
115
110
 
116
111
  ```
117
112
  Column "TAGS" not found; SQL statement:
@@ -130,13 +125,15 @@ Right shape — patch only what changes:
130
125
  # Rename only:
131
126
  mb transform update <id> --body '{"name":"renamed"}' --profile <name> --json
132
127
 
133
- # Rewrite the SQL only:
134
- cat > /tmp/patch.json <<'EOF'
135
- { "source": { "type": "query", "query": { "type": "native",
136
- "database": <db-id>,
137
- "native": { "query": "SELECT … FROM public.orders" } } } }
138
- EOF
139
- mb transform update <id> --file /tmp/patch.json --profile <name> --json
128
+ # Rewrite the SQL only — author it formatted, embed with jq:
129
+ cat > ./.scratch/orders.sql <<'SQL'
130
+ SELECT …
131
+ FROM public.orders
132
+ SQL
133
+ jq -n --rawfile q ./.scratch/orders.sql \
134
+ '{ source: { type: "query", query: { type: "native", database: <db-id>, native: { query: $q } } } }' \
135
+ > ./.scratch/patch.json
136
+ mb transform update <id> --file ./.scratch/patch.json --profile <name> --json
140
137
 
141
138
  # Change tag membership (note: tag_ids, not tags):
142
139
  mb transform update <id> --body '{"tag_ids":[1,3]}' --profile <name> --json
@@ -148,12 +145,12 @@ If you really must round-trip, project to the writable subset:
148
145
  mb transform get <id> --full --profile <name> --json \
149
146
  | jq '{name, description, source, target, run_trigger, tag_ids, collection_id, owner_user_id, owner_email}
150
147
  | with_entries(select(.value != null))' \
151
- > /tmp/patch.json
148
+ > ./.scratch/patch.json
152
149
  ```
153
150
 
154
151
  ## Iterating on a failing transform
155
152
 
156
- When `transform run` fails and you want to retry with a fixed body, **prefer `transform update <id> --file body.json` over `transform delete <id>` + `transform create`.** Update keeps the same row, the same `entity_id`, the same materialized table, and the same on-disk YAML filename. Concretely this means:
153
+ When `transform run` fails and you want to retry with a fixed body, **prefer `transform update <id> --file body.json` over `transform delete <id>` + `transform create`.** Update keeps the same row, the same `entity_id`, the same materialized table, and the same on-disk YAML filename:
157
154
 
158
155
  - `git-sync export` produces **one** clean commit containing only the fix, instead of "broken transform" + "remove broken transform" landing as two commits in `git log`.
159
156
  - You don't have to chase `_2` suffixes minted when two YAMLs share a `name` on disk (see the `transform create` notes above).
@@ -163,17 +160,18 @@ Recipe:
163
160
 
164
161
  ```bash
165
162
  # 1. Try once
166
- ID=$(mb transform create --file /tmp/t.json --profile <n> --json | jq -r '.id')
163
+ ID=$(mb transform create --file ./.scratch/t.json --profile <n> --json | jq -r '.id')
167
164
  mb transform run "$ID" --wait --profile <n> --json # → failed
168
165
 
169
166
  # 2. Fix the body in place; PATCH only what changed.
170
167
  # Source-only patch — keeps name, target, tags untouched on the server.
171
- cat > /tmp/source-patch.json <<'EOF'
172
- { "source": { "type": "query", "query": { "type": "native",
173
- "database": <db-id>,
174
- "native": { "query": "<fixed SQL here>" } } } }
175
- EOF
176
- mb transform update "$ID" --file /tmp/source-patch.json --profile <n> --json
168
+ cat > ./.scratch/source.sql <<'SQL'
169
+ <fixed SQL, formatted>
170
+ SQL
171
+ jq -n --rawfile q ./.scratch/source.sql \
172
+ '{ source: { type: "query", query: { type: "native", database: <db-id>, native: { query: $q } } } }' \
173
+ > ./.scratch/source-patch.json
174
+ mb transform update "$ID" --file ./.scratch/source-patch.json --profile <n> --json
177
175
 
178
176
  # 3. Re-run
179
177
  mb transform run "$ID" --wait --profile <n> --json # → succeeded
@@ -6,6 +6,8 @@ allowed-tools: Read, Write, Edit, Bash, AskUserQuestion
6
6
 
7
7
  # Visualization: pick the chart, then set it
8
8
 
9
+ > **Shared contract (read first).** This skill is part of the `robot-data-engineer` family and follows its shared rules: audience is a non-technical user, so no database jargon (skip "normalize"/"grain"; ERD/foreign key are fine; explain "wide"/"long" the first time you use them). Ask before showing PII row-by-row (names, emails, phones) — default to aggregates. When asked for something the CLI can't do (alerts, dashboard filters), name the limit instead of erroring into raw SQL. Honor the autonomy mode the user picked. Full text and the autonomy slider live in the router — run `mb skills get robot-data-engineer` and read its **Shared Contract** if you haven't.
10
+
9
11
  A card has two presentation fields alongside its `dataset_query`:
10
12
 
11
13
  - **`display`** — the chart type (`bar`, `line`, `pie`, `scalar`, `map`, `table`, …). One closed set; pick from the enum below.
@@ -13,7 +15,7 @@ A card has two presentation fields alongside its `dataset_query`:
13
15
 
14
16
  Nothing validates `visualization_settings` — there is no pre-flight to fail past. A `display` typo or a misnamed key is accepted by the API; the card just renders as a default table or drops the setting. So **the feedback loop is read-back, not pre-flight**: after `card create`/`update`, confirm with `mb card get <id> --full --json` (or open the card) that it rendered as intended.
15
17
 
16
- General flag conventions and body-input precedence live in the `core` skill (`mb skills get core`); the `dataset_query` itself is the `mbql` skill's job (`mb skills get mbql`). This skill is only about how the result is displayed.
18
+ Flag conventions and body-input precedence live in the `core` skill (`mb skills get core`); the `dataset_query` itself is the `mbql` skill's job (`mb skills get mbql`). This skill is only about how the result is displayed.
17
19
 
18
20
  Two steps: **(1) pick the `display` that fits the data**, then **(2) bind the data columns and set options**.
19
21
 
@@ -64,7 +66,7 @@ Closed `display` enum (card-level, non-hidden): `table`, `bar`, `line`, `area`,
64
66
 
65
67
  `graph.dimensions`, `graph.metrics`, `pie.dimension`, `pie.metric`, `scalar.field`, `funnel.metric`, `map.latitude_column`, `sankey.source`, … all take **output column-name strings** — the names the query _produces_, not field ids. A `count` aggregation outputs the column `count`; a breakout on a field outputs that field's name; a named aggregation outputs its `name`. These strings are **identical in the API form and the portable (git-sync) form** — no numeric-vs-name footgun here.
66
68
 
67
- So the names you put in `visualization_settings` come from the query's output, not from `mb field`/`mb table`. If you set `name` on an aggregation (see the `mbql` skill), use that same string here.
69
+ The names come from the query's output, not from `mb field`/`mb table`. If you set `name` on an aggregation (see the `mbql` skill), use that same string here.
68
70
 
69
71
  ## Minimum-viable settings per chart family (API form)
70
72
 
@@ -136,7 +138,7 @@ For anything beyond a single dimension + metric — combo charts, conditional fo
136
138
  mb card get <id> --full --json | jq '.visualization_settings'
137
139
  ```
138
140
 
139
- Paste that block into your `card create`/`update` body. The server produced it, so it's valid for that `display`. This beats guessing keys from memory, and it's token-cheap.
141
+ Paste that block into your `card create`/`update` body. The server produced it, so it's valid for that `display`.
140
142
 
141
143
  ## Full per-visualization key catalog
142
144
 
@@ -19,3 +19,9 @@ Before running any `mb` command, load the workflow content from the CLI:
19
19
  mb skills get core # auth, flag conventions, every command group
20
20
  mb skills list # everything available on the installed version
21
21
  ```
22
+
23
+ **Doing a whole job, not one command?** If the user wants an outcome — "make sense of my data", "build a data model", "go from raw data to a dashboard", "answer questions about my data", "be my data analyst", "set up analytics for X" — load the front-door router instead and let it drive:
24
+
25
+ ```bash
26
+ mb skills get robot-data-engineer
27
+ ```
@@ -1,10 +0,0 @@
1
- import "./command-augment-BH9qgQ5u.mjs";
2
- import "./error-BndUmcwS.mjs";
3
- import "./runtime-Ck8KKQe-.mjs";
4
- import "./capabilities-7L9GVMd_.mjs";
5
- import "./parse-id-Boqc4wn4.mjs";
6
- import "./poll-BMjCkDaj.mjs";
7
- import "./poll-task-CiRA0ER9.mjs";
8
- import { SyncSettingsUpdateResult, add_collection_default, setCollectionRemoteSynced, syncSettingsUpdateView } from "./add-collection-CoP-6FZR.mjs";
9
-
10
- export { add_collection_default as default };
@@ -1,19 +0,0 @@
1
- import { defineCommand } from "citty";
2
-
3
- //#region src/commands/auth/index.ts
4
- var auth_default = defineCommand({
5
- meta: {
6
- name: "auth",
7
- description: "Authenticate against a Metabase instance"
8
- },
9
- default: "login",
10
- subCommands: {
11
- login: () => import("./login-BMKBmgeQ.mjs").then((m) => m.default),
12
- status: () => import("./status-AnPzI1f7.mjs").then((m) => m.default),
13
- list: () => import("./list-D2D5Mw1E.mjs").then((m) => m.default),
14
- logout: () => import("./logout-C5pod937.mjs").then((m) => m.default)
15
- }
16
- });
17
-
18
- //#endregion
19
- export { auth_default as default };
@@ -1,20 +0,0 @@
1
- import { defineCommand } from "citty";
2
-
3
- //#region src/commands/card/index.ts
4
- var card_default = defineCommand({
5
- meta: {
6
- name: "card",
7
- description: "Manage Metabase cards (questions, models, metrics)"
8
- },
9
- subCommands: {
10
- list: () => import("./list-Cj3v4Lgv.mjs").then((mod) => mod.default),
11
- get: () => import("./get-BIH72g0v.mjs").then((mod) => mod.default),
12
- query: () => import("./query-B8JzsQ_I.mjs").then((mod) => mod.default),
13
- create: () => import("./create-BsOdn1Q1.mjs").then((mod) => mod.default),
14
- update: () => import("./update-DykqQLfo.mjs").then((mod) => mod.default),
15
- archive: () => import("./archive-BxwGVDpd.mjs").then((mod) => mod.default)
16
- }
17
- });
18
-
19
- //#endregion
20
- export { card_default as default };
@@ -1,20 +0,0 @@
1
- import { defineCommand } from "citty";
2
-
3
- //#region src/commands/collection/index.ts
4
- var collection_default = defineCommand({
5
- meta: {
6
- name: "collection",
7
- description: "Manage Metabase collections"
8
- },
9
- subCommands: {
10
- list: () => import("./list-jcgK0thu.mjs").then((mod) => mod.default),
11
- get: () => import("./get-Bk81meka.mjs").then((mod) => mod.default),
12
- items: () => import("./items-Kr0oN2V7.mjs").then((mod) => mod.default),
13
- tree: () => import("./tree-BlYgJOn9.mjs").then((mod) => mod.default),
14
- create: () => import("./create-dVmIemXi.mjs").then((mod) => mod.default),
15
- archive: () => import("./archive-BeslLaal.mjs").then((mod) => mod.default)
16
- }
17
- });
18
-
19
- //#endregion
20
- export { collection_default as default };
@@ -1,21 +0,0 @@
1
- import { defineCommand } from "citty";
2
-
3
- //#region src/commands/dashboard/index.ts
4
- var dashboard_default = defineCommand({
5
- meta: {
6
- name: "dashboard",
7
- description: "Manage Metabase dashboards"
8
- },
9
- subCommands: {
10
- list: () => import("./list-Ccj8-vb5.mjs").then((mod) => mod.default),
11
- get: () => import("./get-LI2xsRoT.mjs").then((mod) => mod.default),
12
- cards: () => import("./cards-6MTreYAo.mjs").then((mod) => mod.default),
13
- create: () => import("./create-DcoF52Kx.mjs").then((mod) => mod.default),
14
- update: () => import("./update-B0z-2zqC.mjs").then((mod) => mod.default),
15
- "update-dashcard": () => import("./update-dashcard-DZ8oV8up.mjs").then((mod) => mod.default),
16
- archive: () => import("./archive-BY8nrgnq.mjs").then((mod) => mod.default)
17
- }
18
- });
19
-
20
- //#endregion
21
- export { dashboard_default as default };
@@ -1,22 +0,0 @@
1
- import { defineCommand } from "citty";
2
-
3
- //#region src/commands/db/index.ts
4
- var db_default = defineCommand({
5
- meta: {
6
- name: "db",
7
- description: "Inspect and sync Metabase databases",
8
- alias: "database"
9
- },
10
- subCommands: {
11
- list: () => import("./list-tklIxo38.mjs").then((m) => m.default),
12
- get: () => import("./get-w-WqpjKy.mjs").then((m) => m.default),
13
- metadata: () => import("./metadata-DIEbyQeS.mjs").then((m) => m.default),
14
- schemas: () => import("./schemas-CyzplnXl.mjs").then((m) => m.default),
15
- "schema-tables": () => import("./schema-tables-izDPI4f5.mjs").then((m) => m.default),
16
- "sync-schema": () => import("./sync-schema-BGQVq2JA.mjs").then((m) => m.default),
17
- "rescan-values": () => import("./rescan-values-DuHBnFjK.mjs").then((m) => m.default)
18
- }
19
- });
20
-
21
- //#endregion
22
- export { db_default as default };
@@ -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-6Cj360cH.mjs").then((m) => m.default),
11
- values: () => import("./values-oD72EtRq.mjs").then((m) => m.default),
12
- summary: () => import("./summary-DDed1LOz.mjs").then((m) => m.default),
13
- update: () => import("./update-CdfAogO2.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-DHFYn9kO.mjs").then((mod) => mod.default),
11
- "is-dirty": () => import("./is-dirty-DuWCgrz2.mjs").then((mod) => mod.default),
12
- "has-remote-changes": () => import("./has-remote-changes-DcpW1_KX.mjs").then((mod) => mod.default),
13
- dirty: () => import("./dirty-DGCa6W1F.mjs").then((mod) => mod.default),
14
- "current-task": () => import("./current-task-BN_XEFSX.mjs").then((mod) => mod.default),
15
- "cancel-task": () => import("./cancel-task-DoL2bqs1.mjs").then((mod) => mod.default),
16
- wait: () => import("./wait-BtzuqQC3.mjs").then((mod) => mod.default),
17
- import: () => import("./import-CTQT1atq.mjs").then((mod) => mod.default),
18
- export: () => import("./export-BIZ-UR_M.mjs").then((mod) => mod.default),
19
- stash: () => import("./stash-DLtVf4_D.mjs").then((mod) => mod.default),
20
- branches: () => import("./branches-Vlu44J51.mjs").then((mod) => mod.default),
21
- "create-branch": () => import("./create-branch-40Xm4DN7.mjs").then((mod) => mod.default),
22
- "add-collection": () => import("./add-collection-EPp89tcs.mjs").then((mod) => mod.default),
23
- "remove-collection": () => import("./remove-collection-Clwz3EHQ.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-BH9qgQ5u.mjs";
2
- import "./error-BndUmcwS.mjs";
3
- import "./runtime-Ck8KKQe-.mjs";
4
- import "./capabilities-7L9GVMd_.mjs";
5
- import "./poll-BMjCkDaj.mjs";
6
- import "./poll-task-CiRA0ER9.mjs";
7
- import { IsDirtyResult, is_dirty_default } from "./is-dirty-DGrmt1ss.mjs";
8
-
9
- export { is_dirty_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-zRQsvrH6.mjs").then((mod) => mod.default),
11
- get: () => import("./get-DlGlnciR.mjs").then((mod) => mod.default),
12
- create: () => import("./create-k59K2qf1.mjs").then((mod) => mod.default),
13
- update: () => import("./update-CilTW98H.mjs").then((mod) => mod.default),
14
- archive: () => import("./archive-Blt0TxxA.mjs").then((mod) => mod.default)
15
- }
16
- });
17
-
18
- //#endregion
19
- export { measure_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-DNmekF2B.mjs").then((mod) => mod.default),
11
- get: () => import("./get-CHaIVT6Y.mjs").then((mod) => mod.default),
12
- create: () => import("./create-C_Z3IDrW.mjs").then((mod) => mod.default),
13
- update: () => import("./update-DqSG5_Ie.mjs").then((mod) => mod.default),
14
- archive: () => import("./archive-C17qIvFW.mjs").then((mod) => mod.default)
15
- }
16
- });
17
-
18
- //#endregion
19
- export { segment_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-Bz2ej0Cl.mjs").then((mod) => mod.default),
11
- get: () => import("./get-BuM6QPjZ.mjs").then((mod) => mod.default),
12
- create: () => import("./create-BZRA7nPu.mjs").then((mod) => mod.default),
13
- update: () => import("./update-BHtliIr_.mjs").then((mod) => mod.default),
14
- archive: () => import("./archive-CPLXsrzD.mjs").then((mod) => mod.default)
15
- }
16
- });
17
-
18
- //#endregion
19
- export { snippet_default as default };
@@ -1,19 +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-CLvlEVQo.mjs").then((m) => m.default),
11
- get: () => import("./get-BSJN5TwW.mjs").then((m) => m.default),
12
- metadata: () => import("./metadata-CG4VZ5NW.mjs").then((m) => m.default),
13
- fields: () => import("./fields-9lOrO8UH.mjs").then((m) => m.default),
14
- update: () => import("./update-DBN7yfAk.mjs").then((m) => m.default)
15
- }
16
- });
17
-
18
- //#endregion
19
- export { table_default as default };
@@ -1,24 +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-Cl_O4_U4.mjs").then((mod) => mod.default),
11
- get: () => import("./get-DFe2WoJ2.mjs").then((mod) => mod.default),
12
- create: () => import("./create-BWD8H6yw.mjs").then((mod) => mod.default),
13
- update: () => import("./update-CgOPxKXK.mjs").then((mod) => mod.default),
14
- delete: () => import("./delete-tPjicYO4.mjs").then((mod) => mod.default),
15
- "delete-table": () => import("./delete-table-CDj19Qn6.mjs").then((mod) => mod.default),
16
- run: () => import("./run-JXRivkfH.mjs").then((mod) => mod.default),
17
- cancel: () => import("./cancel-D0aBPUhs.mjs").then((mod) => mod.default),
18
- "get-run": () => import("./get-run-hCZaw8-h.mjs").then((mod) => mod.default),
19
- runs: () => import("./runs-FxgbXvax.mjs").then((mod) => mod.default)
20
- }
21
- });
22
-
23
- //#endregion
24
- export { transform_default as default };
@@ -1,19 +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-DaESiI72.mjs").then((mod) => mod.default),
11
- get: () => import("./get-CRa-h69C.mjs").then((mod) => mod.default),
12
- create: () => import("./create-DNYFXAsy.mjs").then((mod) => mod.default),
13
- update: () => import("./update-CoVvsU-I.mjs").then((mod) => mod.default),
14
- delete: () => import("./delete-DEFgs5LE.mjs").then((mod) => mod.default)
15
- }
16
- });
17
-
18
- //#endregion
19
- export { transform_job_default as default };
File without changes