databay-cli 0.1.0__py3-none-any.whl

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 (403) hide show
  1. databay/__init__.py +5 -0
  2. databay/__main__.py +7 -0
  3. databay/agent_skill.py +184 -0
  4. databay/api.py +626 -0
  5. databay/cli/__init__.py +0 -0
  6. databay/cli/auth.py +377 -0
  7. databay/cli/build.py +89 -0
  8. databay/cli/commands/__init__.py +0 -0
  9. databay/cli/commands/alerting_webhook.py +19 -0
  10. databay/cli/commands/alerting_webhook_tag.py +14 -0
  11. databay/cli/commands/alerting_webhook_type.py +14 -0
  12. databay/cli/commands/alerting_webhook_undelivered.py +15 -0
  13. databay/cli/commands/announcement.py +17 -0
  14. databay/cli/commands/api_key.py +18 -0
  15. databay/cli/commands/api_key_project.py +16 -0
  16. databay/cli/commands/backfill_reason_code.py +14 -0
  17. databay/cli/commands/backfill_run.py +17 -0
  18. databay/cli/commands/canvas.py +16 -0
  19. databay/cli/commands/canvas_graph.py +15 -0
  20. databay/cli/commands/canvas_table_check.py +15 -0
  21. databay/cli/commands/dashboards.py +21 -0
  22. databay/cli/commands/dashboards_card.py +20 -0
  23. databay/cli/commands/dashboards_dataset.py +14 -0
  24. databay/cli/commands/dashboards_folder.py +16 -0
  25. databay/cli/commands/dashboards_home.py +17 -0
  26. databay/cli/commands/dashboards_placement.py +16 -0
  27. databay/cli/commands/db.py +19 -0
  28. databay/cli/commands/db_column.py +14 -0
  29. databay/cli/commands/docs_article.py +16 -0
  30. databay/cli/commands/dq_result.py +14 -0
  31. databay/cli/commands/dq_rule.py +16 -0
  32. databay/cli/commands/feature.py +14 -0
  33. databay/cli/commands/google_ads_source.py +14 -0
  34. databay/cli/commands/google_analytics_source.py +14 -0
  35. databay/cli/commands/instagram_account.py +14 -0
  36. databay/cli/commands/instagram_source.py +14 -0
  37. databay/cli/commands/linkedin_account.py +14 -0
  38. databay/cli/commands/linkedin_source.py +14 -0
  39. databay/cli/commands/me.py +14 -0
  40. databay/cli/commands/meta_ads_source.py +14 -0
  41. databay/cli/commands/metric_models.py +26 -0
  42. databay/cli/commands/metrics.py +14 -0
  43. databay/cli/commands/models.py +16 -0
  44. databay/cli/commands/nlq.py +15 -0
  45. databay/cli/commands/notebook_credential.py +16 -0
  46. databay/cli/commands/org.py +14 -0
  47. databay/cli/commands/org_member.py +17 -0
  48. databay/cli/commands/org_offboarding.py +14 -0
  49. databay/cli/commands/pipe.py +26 -0
  50. databay/cli/commands/pipe_backfill_run.py +14 -0
  51. databay/cli/commands/pipe_config_option.py +14 -0
  52. databay/cli/commands/pipe_destination.py +16 -0
  53. databay/cli/commands/pipe_leftover.py +16 -0
  54. databay/cli/commands/pipe_sink_type.py +14 -0
  55. databay/cli/commands/pipe_source_type.py +14 -0
  56. databay/cli/commands/pipe_status_bucket.py +14 -0
  57. databay/cli/commands/pipe_stuck_delete.py +14 -0
  58. databay/cli/commands/plan.py +14 -0
  59. databay/cli/commands/project.py +21 -0
  60. databay/cli/commands/project_budget.py +15 -0
  61. databay/cli/commands/project_member.py +18 -0
  62. databay/cli/commands/project_privilege.py +16 -0
  63. databay/cli/commands/project_share.py +16 -0
  64. databay/cli/commands/provision.py +14 -0
  65. databay/cli/commands/provisioning.py +14 -0
  66. databay/cli/commands/registry.py +14 -0
  67. databay/cli/commands/resource_home.py +14 -0
  68. databay/cli/commands/schema_change.py +18 -0
  69. databay/cli/commands/schema_history.py +17 -0
  70. databay/cli/commands/schema_version.py +16 -0
  71. databay/cli/commands/shopify_store.py +14 -0
  72. databay/cli/commands/sink_data_type.py +14 -0
  73. databay/cli/commands/source.py +24 -0
  74. databay/cli/commands/source_catalog.py +15 -0
  75. databay/cli/commands/source_check_run.py +17 -0
  76. databay/cli/commands/source_hidden_type.py +14 -0
  77. databay/cli/commands/source_name.py +14 -0
  78. databay/cli/commands/source_pipe.py +14 -0
  79. databay/cli/commands/source_publication.py +16 -0
  80. databay/cli/commands/source_readiness_override.py +15 -0
  81. databay/cli/commands/source_setup_choice.py +16 -0
  82. databay/cli/commands/source_stream.py +15 -0
  83. databay/cli/commands/source_table.py +14 -0
  84. databay/cli/commands/ssbi_job.py +18 -0
  85. databay/cli/commands/transform_type.py +14 -0
  86. databay/cli/commands/usage.py +14 -0
  87. databay/cli/commands/warehouse.py +21 -0
  88. databay/cli/commands/warehouse_access_assignment.py +16 -0
  89. databay/cli/commands/warehouse_access_role.py +22 -0
  90. databay/cli/commands/warehouse_access_settings.py +17 -0
  91. databay/cli/commands/warehouse_login.py +20 -0
  92. databay/cli/commands/warehouse_principal.py +17 -0
  93. databay/cli/commands/warehouse_service_account.py +17 -0
  94. databay/cli/commands/warehouse_service_account_credential.py +18 -0
  95. databay/cli/common.py +93 -0
  96. databay/cli/console.py +121 -0
  97. databay/cli/flags.py +183 -0
  98. databay/cli/handwritten.py +22 -0
  99. databay/cli/main.py +198 -0
  100. databay/cli/metrics.py +171 -0
  101. databay/cli/org.py +193 -0
  102. databay/cli/output.py +134 -0
  103. databay/cli/pipe_wait.py +357 -0
  104. databay/cli/profile.py +230 -0
  105. databay/cli/runner.py +432 -0
  106. databay/cli/skill.py +64 -0
  107. databay/cli/sql.py +84 -0
  108. databay/compat.py +161 -0
  109. databay/credentials.py +217 -0
  110. databay/error_catalog.py +226 -0
  111. databay/error_codes.py +3265 -0
  112. databay/errors.py +222 -0
  113. databay/feature_header.py +40 -0
  114. databay/invoke.py +225 -0
  115. databay/locks.py +41 -0
  116. databay/login_flow.py +245 -0
  117. databay/model_base.py +40 -0
  118. databay/models/__init__.py +0 -0
  119. databay/models/alerting_webhook.py +46 -0
  120. databay/models/alerting_webhook_tag.py +11 -0
  121. databay/models/alerting_webhook_type.py +11 -0
  122. databay/models/alerting_webhook_undelivered.py +23 -0
  123. databay/models/announcement.py +37 -0
  124. databay/models/api_key.py +81 -0
  125. databay/models/api_key_project.py +29 -0
  126. databay/models/backfill_reason_code.py +11 -0
  127. databay/models/backfill_run.py +41 -0
  128. databay/models/canvas.py +68 -0
  129. databay/models/canvas_graph.py +86 -0
  130. databay/models/canvas_table_check.py +181 -0
  131. databay/models/dashboards.py +79 -0
  132. databay/models/dashboards_card.py +37 -0
  133. databay/models/dashboards_dataset.py +27 -0
  134. databay/models/dashboards_folder.py +18 -0
  135. databay/models/dashboards_home.py +28 -0
  136. databay/models/db.py +34 -0
  137. databay/models/db_column.py +11 -0
  138. databay/models/docs_article.py +59 -0
  139. databay/models/dq_result.py +27 -0
  140. databay/models/dq_rule.py +43 -0
  141. databay/models/feature.py +15 -0
  142. databay/models/google_ads_source.py +11 -0
  143. databay/models/google_analytics_source.py +11 -0
  144. databay/models/instagram_source.py +11 -0
  145. databay/models/linkedin_source.py +11 -0
  146. databay/models/me.py +71 -0
  147. databay/models/meta_ads_source.py +11 -0
  148. databay/models/metric_models.py +274 -0
  149. databay/models/metrics.py +158 -0
  150. databay/models/models.py +73 -0
  151. databay/models/nlq.py +92 -0
  152. databay/models/notebook_credential.py +51 -0
  153. databay/models/org.py +44 -0
  154. databay/models/org_member.py +123 -0
  155. databay/models/org_offboarding.py +36 -0
  156. databay/models/pipe.py +340 -0
  157. databay/models/pipe_config_option.py +25 -0
  158. databay/models/pipe_destination.py +128 -0
  159. databay/models/pipe_leftover.py +51 -0
  160. databay/models/pipe_sink_type.py +11 -0
  161. databay/models/pipe_source_type.py +11 -0
  162. databay/models/pipe_status_bucket.py +13 -0
  163. databay/models/pipe_stuck_delete.py +25 -0
  164. databay/models/plan.py +37 -0
  165. databay/models/project.py +154 -0
  166. databay/models/project_budget.py +22 -0
  167. databay/models/project_member.py +67 -0
  168. databay/models/project_privilege.py +21 -0
  169. databay/models/project_share.py +76 -0
  170. databay/models/provision.py +12 -0
  171. databay/models/provisioning.py +20 -0
  172. databay/models/registry.py +18 -0
  173. databay/models/resource_home.py +35 -0
  174. databay/models/schema_change.py +96 -0
  175. databay/models/schema_history.py +32 -0
  176. databay/models/schema_version.py +23 -0
  177. databay/models/shared.py +875 -0
  178. databay/models/shopify_store.py +19 -0
  179. databay/models/sink_data_type.py +11 -0
  180. databay/models/source.py +263 -0
  181. databay/models/source_catalog.py +82 -0
  182. databay/models/source_check_run.py +63 -0
  183. databay/models/source_hidden_type.py +13 -0
  184. databay/models/source_name.py +18 -0
  185. databay/models/source_pipe.py +16 -0
  186. databay/models/source_publication.py +30 -0
  187. databay/models/source_readiness_override.py +13 -0
  188. databay/models/source_setup_choice.py +33 -0
  189. databay/models/source_stream.py +65 -0
  190. databay/models/source_table.py +27 -0
  191. databay/models/sql.py +31 -0
  192. databay/models/ssbi_job.py +97 -0
  193. databay/models/transform_type.py +40 -0
  194. databay/models/usage.py +112 -0
  195. databay/models/warehouse.py +38 -0
  196. databay/models/warehouse_access_assignment.py +70 -0
  197. databay/models/warehouse_access_role.py +148 -0
  198. databay/models/warehouse_access_settings.py +35 -0
  199. databay/models/warehouse_login.py +20 -0
  200. databay/models/warehouse_principal.py +49 -0
  201. databay/models/warehouse_service_account.py +35 -0
  202. databay/models/warehouse_service_account_credential.py +11 -0
  203. databay/oidc.py +205 -0
  204. databay/operation.py +191 -0
  205. databay/operations/__init__.py +0 -0
  206. databay/operations/alerting_webhook.py +317 -0
  207. databay/operations/alerting_webhook_tag.py +35 -0
  208. databay/operations/alerting_webhook_type.py +35 -0
  209. databay/operations/alerting_webhook_undelivered.py +74 -0
  210. databay/operations/announcement.py +135 -0
  211. databay/operations/api_key.py +198 -0
  212. databay/operations/api_key_project.py +130 -0
  213. databay/operations/backfill_reason_code.py +35 -0
  214. databay/operations/backfill_run.py +245 -0
  215. databay/operations/canvas.py +136 -0
  216. databay/operations/canvas_graph.py +102 -0
  217. databay/operations/canvas_table_check.py +101 -0
  218. databay/operations/dashboards.py +441 -0
  219. databay/operations/dashboards_card.py +406 -0
  220. databay/operations/dashboards_dataset.py +50 -0
  221. databay/operations/dashboards_folder.py +146 -0
  222. databay/operations/dashboards_home.py +176 -0
  223. databay/operations/dashboards_placement.py +152 -0
  224. databay/operations/db.py +337 -0
  225. databay/operations/db_column.py +57 -0
  226. databay/operations/docs_article.py +101 -0
  227. databay/operations/dq_result.py +43 -0
  228. databay/operations/dq_rule.py +155 -0
  229. databay/operations/feature.py +35 -0
  230. databay/operations/google_ads_source.py +40 -0
  231. databay/operations/google_analytics_source.py +40 -0
  232. databay/operations/instagram_account.py +47 -0
  233. databay/operations/instagram_source.py +40 -0
  234. databay/operations/linkedin_account.py +47 -0
  235. databay/operations/linkedin_source.py +40 -0
  236. databay/operations/me.py +57 -0
  237. databay/operations/meta_ads_source.py +40 -0
  238. databay/operations/metric_models.py +612 -0
  239. databay/operations/metrics.py +218 -0
  240. databay/operations/models.py +123 -0
  241. databay/operations/nlq.py +100 -0
  242. databay/operations/notebook_credential.py +95 -0
  243. databay/operations/org.py +79 -0
  244. databay/operations/org_member.py +192 -0
  245. databay/operations/org_offboarding.py +43 -0
  246. databay/operations/pipe.py +882 -0
  247. databay/operations/pipe_backfill_run.py +72 -0
  248. databay/operations/pipe_config_option.py +50 -0
  249. databay/operations/pipe_destination.py +178 -0
  250. databay/operations/pipe_leftover.py +110 -0
  251. databay/operations/pipe_sink_type.py +35 -0
  252. databay/operations/pipe_source_type.py +35 -0
  253. databay/operations/pipe_status_bucket.py +35 -0
  254. databay/operations/pipe_stuck_delete.py +52 -0
  255. databay/operations/plan.py +35 -0
  256. databay/operations/project.py +346 -0
  257. databay/operations/project_budget.py +135 -0
  258. databay/operations/project_member.py +226 -0
  259. databay/operations/project_privilege.py +143 -0
  260. databay/operations/project_share.py +160 -0
  261. databay/operations/provision.py +35 -0
  262. databay/operations/provisioning.py +35 -0
  263. databay/operations/registry.py +35 -0
  264. databay/operations/resource_home.py +80 -0
  265. databay/operations/schema_change.py +222 -0
  266. databay/operations/schema_history.py +136 -0
  267. databay/operations/schema_version.py +115 -0
  268. databay/operations/shopify_store.py +40 -0
  269. databay/operations/sink_data_type.py +43 -0
  270. databay/operations/source.py +1207 -0
  271. databay/operations/source_catalog.py +135 -0
  272. databay/operations/source_check_run.py +242 -0
  273. databay/operations/source_hidden_type.py +59 -0
  274. databay/operations/source_name.py +69 -0
  275. databay/operations/source_pipe.py +57 -0
  276. databay/operations/source_publication.py +139 -0
  277. databay/operations/source_readiness_override.py +96 -0
  278. databay/operations/source_setup_choice.py +161 -0
  279. databay/operations/source_stream.py +99 -0
  280. databay/operations/source_table.py +59 -0
  281. databay/operations/sql.py +54 -0
  282. databay/operations/ssbi_job.py +242 -0
  283. databay/operations/transform_type.py +35 -0
  284. databay/operations/usage.py +35 -0
  285. databay/operations/warehouse.py +343 -0
  286. databay/operations/warehouse_access_assignment.py +179 -0
  287. databay/operations/warehouse_access_role.py +473 -0
  288. databay/operations/warehouse_access_settings.py +172 -0
  289. databay/operations/warehouse_login.py +308 -0
  290. databay/operations/warehouse_principal.py +174 -0
  291. databay/operations/warehouse_service_account.py +206 -0
  292. databay/operations/warehouse_service_account_credential.py +285 -0
  293. databay/paths.py +32 -0
  294. databay/platform_check.py +20 -0
  295. databay/profiles.py +181 -0
  296. databay/redact.py +22 -0
  297. databay/reference.py +218 -0
  298. databay/resource.py +167 -0
  299. databay/resources/__init__.py +0 -0
  300. databay/resources/alerting_webhook.py +84 -0
  301. databay/resources/alerting_webhook_tag.py +21 -0
  302. databay/resources/alerting_webhook_type.py +21 -0
  303. databay/resources/alerting_webhook_undelivered.py +35 -0
  304. databay/resources/announcement.py +45 -0
  305. databay/resources/api_key.py +56 -0
  306. databay/resources/api_key_project.py +47 -0
  307. databay/resources/backfill_reason_code.py +21 -0
  308. databay/resources/backfill_run.py +78 -0
  309. databay/resources/canvas.py +43 -0
  310. databay/resources/canvas_graph.py +38 -0
  311. databay/resources/canvas_table_check.py +38 -0
  312. databay/resources/dashboards.py +105 -0
  313. databay/resources/dashboards_card.py +97 -0
  314. databay/resources/dashboards_dataset.py +27 -0
  315. databay/resources/dashboards_folder.py +47 -0
  316. databay/resources/dashboards_home.py +59 -0
  317. databay/resources/dashboards_placement.py +47 -0
  318. databay/resources/db.py +87 -0
  319. databay/resources/db_column.py +28 -0
  320. databay/resources/docs_article.py +37 -0
  321. databay/resources/dq_result.py +25 -0
  322. databay/resources/dq_rule.py +48 -0
  323. databay/resources/feature.py +21 -0
  324. databay/resources/google_ads_source.py +25 -0
  325. databay/resources/google_analytics_source.py +25 -0
  326. databay/resources/instagram_account.py +27 -0
  327. databay/resources/instagram_source.py +25 -0
  328. databay/resources/linkedin_account.py +27 -0
  329. databay/resources/linkedin_source.py +25 -0
  330. databay/resources/me.py +27 -0
  331. databay/resources/meta_ads_source.py +25 -0
  332. databay/resources/metric_models.py +154 -0
  333. databay/resources/metrics.py +57 -0
  334. databay/resources/models.py +42 -0
  335. databay/resources/nlq.py +34 -0
  336. databay/resources/notebook_credential.py +41 -0
  337. databay/resources/org.py +29 -0
  338. databay/resources/org_member.py +53 -0
  339. databay/resources/org_offboarding.py +25 -0
  340. databay/resources/pipe.py +208 -0
  341. databay/resources/pipe_backfill_run.py +28 -0
  342. databay/resources/pipe_config_option.py +26 -0
  343. databay/resources/pipe_destination.py +49 -0
  344. databay/resources/pipe_leftover.py +42 -0
  345. databay/resources/pipe_sink_type.py +21 -0
  346. databay/resources/pipe_source_type.py +21 -0
  347. databay/resources/pipe_status_bucket.py +21 -0
  348. databay/resources/pipe_stuck_delete.py +27 -0
  349. databay/resources/plan.py +21 -0
  350. databay/resources/project.py +92 -0
  351. databay/resources/project_budget.py +38 -0
  352. databay/resources/project_member.py +68 -0
  353. databay/resources/project_privilege.py +48 -0
  354. databay/resources/project_share.py +47 -0
  355. databay/resources/provision.py +21 -0
  356. databay/resources/provisioning.py +21 -0
  357. databay/resources/registry.py +21 -0
  358. databay/resources/resource_home.py +29 -0
  359. databay/resources/schema_change.py +62 -0
  360. databay/resources/schema_history.py +52 -0
  361. databay/resources/schema_version.py +43 -0
  362. databay/resources/shopify_store.py +25 -0
  363. databay/resources/sink_data_type.py +25 -0
  364. databay/resources/source.py +132 -0
  365. databay/resources/source_catalog.py +34 -0
  366. databay/resources/source_check_run.py +67 -0
  367. databay/resources/source_hidden_type.py +25 -0
  368. databay/resources/source_name.py +27 -0
  369. databay/resources/source_pipe.py +28 -0
  370. databay/resources/source_publication.py +47 -0
  371. databay/resources/source_readiness_override.py +37 -0
  372. databay/resources/source_setup_choice.py +50 -0
  373. databay/resources/source_stream.py +38 -0
  374. databay/resources/source_table.py +27 -0
  375. databay/resources/sql.py +27 -0
  376. databay/resources/ssbi_job.py +69 -0
  377. databay/resources/transform_type.py +21 -0
  378. databay/resources/usage.py +21 -0
  379. databay/resources/warehouse.py +136 -0
  380. databay/resources/warehouse_access_assignment.py +51 -0
  381. databay/resources/warehouse_access_role.py +118 -0
  382. databay/resources/warehouse_access_settings.py +56 -0
  383. databay/resources/warehouse_login.py +81 -0
  384. databay/resources/warehouse_principal.py +51 -0
  385. databay/resources/warehouse_service_account.py +61 -0
  386. databay/resources/warehouse_service_account_credential.py +78 -0
  387. databay/sdk.py +77 -0
  388. databay/settings.py +90 -0
  389. databay/skill/SKILL.md +357 -0
  390. databay/skill/references/commands.md +7025 -0
  391. databay/skill/references/errors.md +727 -0
  392. databay/spec.py +362 -0
  393. databay/stored_token.py +134 -0
  394. databay/tokens.py +108 -0
  395. databay/transport.py +357 -0
  396. databay/update_check.py +151 -0
  397. databay/version.py +6 -0
  398. databay/waits.py +330 -0
  399. databay_cli-0.1.0.dist-info/METADATA +42 -0
  400. databay_cli-0.1.0.dist-info/RECORD +403 -0
  401. databay_cli-0.1.0.dist-info/WHEEL +4 -0
  402. databay_cli-0.1.0.dist-info/entry_points.txt +2 -0
  403. databay_cli-0.1.0.dist-info/licenses/LICENSE +202 -0
databay/skill/SKILL.md ADDED
@@ -0,0 +1,357 @@
1
+ ---
2
+ name: databay
3
+ description: >-
4
+ Drive a Databay server with the databay CLI: sign in, pick a project, add and check a
5
+ database source, create pipes that replicate its tables into a warehouse, wait for them,
6
+ query metrics such as net sales, define and publish metrics, query the warehouse with SQL,
7
+ build dashboards, and connect a BI tool. Use when the user asks to move or sync data with
8
+ Databay, create or fix a pipe, ask for or define a metric, query a Databay warehouse, build
9
+ a dashboard, connect a BI tool, or run any `databay` command.
10
+ ---
11
+
12
+ # databay
13
+
14
+ The `databay` CLI drives a Databay server: `databay <noun> <verb> [ARGS] [OPTIONS]`.
15
+ Flags, arguments and examples for every command are in `references/commands.md`; every exit
16
+ code and error code is in `references/errors.md`. Read them when a step below is not enough,
17
+ instead of guessing a flag.
18
+
19
+ ## Rules
20
+
21
+ - **Always pass `--output json`.** Read the result from stdout. Progress, hints and errors
22
+ go to stderr, one JSON object per line.
23
+ - **Never print a secret.** No password, token or API key goes on a command line, in a
24
+ message to the user, or in a file you show. Pass a secret field with `--<field>-env NAME`
25
+ (an environment variable the user set) or `--<field>-stdin`; for example `--password-env`.
26
+ - **Never pass `--yes` on your own.** A command that takes `--yes` deletes or overwrites
27
+ state. Say what it will remove, wait for the user's explicit agreement, then run it with
28
+ `--yes`.
29
+ - **Keep every wait under your shell's limit.** Pass `--timeout` on every wait, below the
30
+ command timeout of the tool that runs it: `--timeout 540` in Claude Code, whose cap is
31
+ 600 s. Under another agent, set the tool's timeout for the call above the `--timeout` you
32
+ pass, or pass a smaller `--timeout`. The examples below use 540.
33
+ - **Follow `next`.** A result or an error that carries `next` names the exact command to
34
+ run next. Prefer it to building one yourself.
35
+
36
+ ## Before any task
37
+
38
+ 1. Check who and where you are:
39
+
40
+ ```
41
+ databay status --output json
42
+ ```
43
+
44
+ Exit 3 means there is no profile or sign-in. Ask the user to sign in once, in their own
45
+ terminal, because it opens a browser (or prints a code with `--device`):
46
+
47
+ ```
48
+ databay login --server https://databay.example.com
49
+ ```
50
+
51
+ A machine without a browser signs in with an org API key whose secret is in a variable:
52
+ `databay login --server https://databay.example.com --api-key-id <client_id> --api-key-env DATABAY_API_KEY`.
53
+
54
+ `status` shows the `org` the token names. If `needs_org_choice` is true, or the user wants another
55
+ organization, list them, ask the user which one, and switch; switching clears the active project:
56
+
57
+ ```
58
+ databay org list --output json
59
+ databay org switch <organization> --output json
60
+ ```
61
+
62
+ 2. Set the project. Most commands act in the profile's active project. If `status` shows
63
+ none, list the projects, ask the user which one, and set it by id:
64
+
65
+ ```
66
+ databay project list --output json
67
+ databay project use <project_id> --output json
68
+ ```
69
+
70
+ `--project <project_id>` on a command that acts in a project overrides it for that command
71
+ only. A command that names a resource by its id (`pipe get`, `pipe status`, `pipe wait`) finds
72
+ the project from the resource and takes no `--project`.
73
+
74
+ 3. If `status` reports `skill_outdated`, an installed copy of this skill is from another CLI
75
+ version: tell the user, and offer the `next` command its `skill_outdated` event names.
76
+
77
+ ## Replicate a database table into the warehouse
78
+
79
+ Run the steps in this order. Each step's check must pass before the next.
80
+
81
+ 1. **Find the source.** Look for the database in `databay source list --output json`. A row has
82
+ no host or database and the list shows only sources this project can use, so compare a likely
83
+ row's `config` in `databay source get <source_uuid> --output json`, and ask the user when you
84
+ cannot tell: a wrong miss makes a second source for the same database. For a match, run
85
+ `databay source recheck <source_uuid> --output json`, then go to step 3 if it passes:
86
+ - Exit 9 (`not_ready`) means a requirement failed: show the user each failing item and its
87
+ fix, and stop until it is done.
88
+ - A `source_status` such as `needs_reauth` or `deleting` holds the source whatever its checks
89
+ say: tell the user and stop.
90
+ - A check with status `unknown` or `not_run` could not be verified. On a type with no guided
91
+ setup, if the user has verified it by hand, acknowledge it with
92
+ `databay source-readiness-override set <source_uuid> --reason "<what they checked>" --output json`.
93
+ PostgreSQL has guided setup and takes no override (`source_override_not_offered`): the
94
+ check has to pass.
95
+ 2. **Add the source.** Precheck the connection first (the password comes from a variable the
96
+ user set). Exit 9 with a `fail` item means the same as in step 1. With only `unknown` or
97
+ `not_run` items, ask the user whether to save it anyway. Then create it:
98
+
99
+ ```
100
+ databay source precheck postgres --host <host> --port 5432 --db-name <db> --username <user> --password-env PGPASSWORD --output json
101
+ databay source create postgres --name <name> --host <host> --port 5432 --db-name <db> --username <user> --password-env PGPASSWORD --output json
102
+ ```
103
+
104
+ It answers with the source's `uuid`. A create is safe to repeat only with the
105
+ `--idempotency-key` it printed. If its `status` is `setup_incomplete`, a setup check did not
106
+ pass: run `databay source recheck <source_uuid> --output json` and handle it as in step 1. Pass `--allow-incomplete` only when the user asks to save a source Databay
107
+ cannot reach yet. `references/commands.md` has `source create` for the other source types.
108
+
109
+ A PostgreSQL source made here has not run its connection checks, and a new pipe on it answers
110
+ `source_no_stored_pass` until they pass. Run them, then read the run until its `status` is no
111
+ longer `running` (it can take over a minute):
112
+
113
+ ```
114
+ databay source-check-run start --source-id <source_uuid> --active-probes --output json
115
+ databay source-check-run get <run_id> --output json
116
+ ```
117
+
118
+ Show the user each `fail` or `unknown` row and its `fixes`, and stop until it is done. Then run
119
+ the same check again. A change to the source's credentials clears the result.
120
+ 3. **Check the tables.** Each table says whether it can be replicated, and the fix if not:
121
+
122
+ ```
123
+ databay source-table check <source_uuid> public --output json
124
+ ```
125
+
126
+ Exit 9 again means fix first. Never create a pipe on a table that is not ready.
127
+ 4. **Create the pipe.** It answers at once with the pipe's `uuid`. A create is safe to repeat
128
+ only with the `--idempotency-key` it printed:
129
+
130
+ ```
131
+ databay pipe create --source-id <source_uuid> --schema-name public --table-name orders --dest-table-name orders --output json
132
+ ```
133
+
134
+ The `next` it prints waits only until the pipe is provisioned. Go on to step 5 instead.
135
+ 5. **Wait until the table is ready, then query it.**
136
+
137
+ ```
138
+ databay pipe wait <pipe_uuid> --until data --timeout 540 --output json
139
+ ```
140
+
141
+ Exit 4 means it is not ready yet: run the `next` command the output names (the same wait; it
142
+ creates nothing), at most 3 times at 540 s. After that, report the last state to the user.
143
+ `healthy but no rows have landed` means the pipe works and the source has sent nothing yet.
144
+ Exit 5 means it failed: report the reason.
145
+
146
+ Exit 0 means the table holds rows (`wait.reason` `rows_landed`), or this warehouse has no
147
+ way to report a row count and the pipe is healthy (`healthy_unmeasured`). Run the `next`
148
+ command it prints, which counts the rows:
149
+
150
+ ```
151
+ databay sql --db <sink_db_uuid> "select count(*) from <db_name>.<dest_table_name>" --output json
152
+ ```
153
+
154
+ After `healthy_unmeasured`, 0 rows or a table that does not exist yet means nothing has
155
+ landed yet. Always pass `--db`: without it the statement runs on the org's default warehouse,
156
+ which may not be the pipe's. `sql` runs one read-only statement; it can also read
157
+ `--file <path>`.
158
+
159
+ ## Answer with a metric
160
+
161
+ For a business number (net sales, orders, sessions, ad spend), query a metric before writing
162
+ SQL: a metric is defined once, so its answer matches the dashboards. Work in this order:
163
+
164
+ 1. **List** what this project can query: `databay metrics list --output json`. Each metric has
165
+ its `dimensions`, `grains`, `filter_ops`, `warehouses` and a `state`. An empty list with
166
+ `state` `compiling` means the model is being built: wait a minute and list again. With
167
+ `unavailable`, `reason` is the error code that says why (look it up in `references/errors.md`).
168
+ 2. **Describe** the one you will use, to see which dimensions and grains it takes:
169
+ `databay metrics describe <metric> --output json`.
170
+ 3. **Query** it, always with `--caller agent`: it tells the server an agent ran the query, so
171
+ it is counted apart from a person's. `--by` groups by a dimension (repeat it), `--grain` by
172
+ the time dimension, `--last 30d` or `--from`/`--to` sets the range, and `--where` filters (`channel=paid`; also
173
+ `!=`, `>`, `>=`, `<`, `<=`; repeat it and every filter must hold), and `--order <member>:desc` with
174
+ `--limit 10` answers a top 10. Pass `--warehouse` only
175
+ when the metric is in several warehouses (`ambiguous_warehouse` names them).
176
+ 4. **Explain** when the user asks how a number was made, or before you rely on a surprising
177
+ one: the same query, still with `--caller agent`, plus `--explain` adds the metric's
178
+ definition, the SQL it ran and the tables it read. `--dry-run` answers that without running the query.
179
+
180
+ `truncated: true` means only the first `row_count` rows came back: narrow the range or pass a
181
+ coarser `--grain`. `model_version_unavailable` is a retry: wait for its `Retry-After`, then run
182
+ the same command.
183
+
184
+ ### Worked example
185
+
186
+ How did net sales go over the last 30 days, and how is it computed?
187
+
188
+ ```
189
+ databay metrics list --output json
190
+ databay metrics describe net_sales --output json
191
+ databay metrics query net_sales --grain day --last 30d --caller agent --output json
192
+ databay metrics query net_sales --grain day --last 30d --explain --caller agent --output json
193
+ ```
194
+
195
+ Report the rows, and say the answer came from the `net_sales` metric (`answer_path: metric`,
196
+ with its `model_version`).
197
+
198
+ ### When there is no metric for it
199
+
200
+ `metric_not_found` means the metric is not in this project's model; its `did_you_mean` lists
201
+ close names you can query. If none of them fits, you may answer with `databay sql` against the
202
+ warehouse instead (step 5 of "Replicate a database table" shows `--db`). Label that answer `answer_path: raw_sql` when
203
+ you report it, and say it is your own query, not a defined metric, so the user knows it may
204
+ not match the dashboards. Never use SQL to get around `permission_denied` or a metric the user
205
+ cannot see: the SQL console applies the user's own grants and refuses the same columns.
206
+
207
+ ## Define metrics
208
+
209
+ A project's own metrics come from its metric model, a YAML file. Metrics query the published
210
+ version; a draft changes nothing until it is published.
211
+
212
+ 1. **Validate** the file: `databay metric-models validate --yaml "$(cat metrics.yml)" --output json`
213
+ names the cubes and metrics it defines. `model_rejected` lists each field to fix.
214
+ 2. **Push** it as the draft: `databay metric-models push --yaml "$(cat metrics.yml)" --output json`.
215
+ It replaces the draft there is.
216
+ 3. **Publish** the draft: `databay metric-models publish --output json`. Then `databay metrics list`
217
+ shows them with `source` `customer`.
218
+
219
+ Defining metrics needs the `model_write` privilege and publishing needs `model_publish`;
220
+ `databay project my-access --output json` shows what this user holds. Before publishing, show the user
221
+ what it would change: `databay metric-models changes --output json` lists each metric and table the
222
+ publish adds, changes or removes.
223
+
224
+ ### Edit one metric
225
+
226
+ To add, change or remove one metric without rewriting the YAML, use the form commands. Each takes the
227
+ `revision` the last answer gave; `draft_changed` means someone wrote the draft since, so read it again
228
+ and redo your change. `model_managed_in_git` means the project keeps its model in git: edit the
229
+ `semantic/` files there instead.
230
+
231
+ 1. **Read** the model: `databay metric-models metric-list --output json` gives the `revision`, the
232
+ `tables` (each with its `breakdowns`) and the `metrics`. A metric or table with `editable` false
233
+ can only change in the YAML (`reason` says why; a write to it is `metric_needs_yaml`).
234
+ 2. **Write** one metric. `aggregation` is `count` (no `column`), `count_distinct`, `sum`, `avg`, `min`
235
+ or `max`; `conditions` filter the rows it counts (`op` is `=`, `!=`, `>`, `>=`, `<`, `<=`, `in`,
236
+ `is_null` or `is_not_null`). A metric on a table no cube reads yet also needs `--breakdowns`, the
237
+ columns it breaks down by (`type` `string`, `number` or `time`):
238
+
239
+ ```
240
+ databay metric-models metric-add --revision <revision> --metric '{"name": "order_total", "description": "Sum of order totals.", "table": "orders", "aggregation": "sum", "column": "total", "conditions": []}' --breakdowns '[{"column": "created_at", "type": "time"}, {"column": "channel", "type": "string"}]' --output json
241
+ databay metric-models metric-update <project_id> order_total --revision <revision> --metric '{"name": "order_total", "description": "Sum of paid order totals.", "table": "orders", "aggregation": "sum", "column": "total", "conditions": [{"column": "status", "op": "=", "value": "paid"}]}' --output json
242
+ databay metric-models set-breakdowns <project_id> orders --revision <revision> --breakdowns '[{"column": "created_at", "type": "time"}]' --output json
243
+ ```
244
+
245
+ `metric-update`, `metric-remove` and `set-breakdowns` take the project id as their first argument.
246
+ Removing a metric (`metric-remove <project_id> <metric> --revision <revision>`) needs `--yes`, so ask
247
+ first. `affected_metrics` in the answer lists the table's other metrics a breakdown change reaches:
248
+ tell the user. `comments_dropped` true means the YAML's comments are gone.
249
+ 3. **Publish** with the last answer's revision, so you publish the draft you checked:
250
+ `databay metric-models publish --revision <revision> --output json`.
251
+
252
+ ### Start from dbt
253
+
254
+ To start from the project's built dbt models instead, `databay metric-models import-dbt --dry-run --output json`
255
+ shows the YAML it would write; without `--dry-run` it stores that as the draft, and `draft_exists`
256
+ means there is one already (pass `--replace-draft` only when the user agrees to lose it). Review it with
257
+ `databay metric-models show-draft --output json`, then publish.
258
+
259
+ ## Dashboards
260
+
261
+ Use the `dashboards`, `dashboards-card`, `dashboards-placement`, `dashboards-folder` and
262
+ `dashboards-dataset` nouns. A card belongs to the project and runs in a warehouse of it (for a pipe's
263
+ table, its `sink_db_uuid`); a dashboard shows the cards placed on it. Create a dashboard, create a card
264
+ placed on it, then run it:
265
+
266
+ ```
267
+ databay dashboards create --name <name> --output json
268
+ databay dashboards-card create --board-id <board_id> --warehouse-id <sink_db_uuid> --title <title> --spec '{"spec_version": 1, "query": {"sql": "select count(*) as n from <dest_table_name>"}, "chart": {"type": "kpi", "y": ["n"]}}' --output json
269
+ databay dashboards run <board_id> --output json
270
+ ```
271
+
272
+ A metric card shows metrics of the project's model instead of SQL, so its numbers match `metrics
273
+ query`. Its spec is `spec_version` 2, and its `warehouse-id` must be one of the metric's `warehouses`:
274
+
275
+ ```
276
+ databay dashboards-card create --board-id <board_id> --warehouse-id <warehouse_id> --title "Net sales by channel" --spec '{"spec_version": 2, "query": {"metrics": ["net_sales"], "dimensions": ["channel"], "time": {"grain": "week", "default": "last_90_days"}, "order": [{"member": "net_sales", "direction": "desc"}], "limit": 10}, "chart": {"type": "bar", "x": "channel", "y": ["net_sales"]}}' --output json
277
+ ```
278
+
279
+ `time.from_filter` and a filter's `from_filter` read a board filter by its key, like a SQL card's
280
+ variables. `metric_card_invalid` names the part of the spec to fix.
281
+
282
+ - **`run` exits 0 even when a card fails.** Check `error` on every entry of `cards`, and report
283
+ any that is set instead of saying the dashboard works.
284
+ - A card's SQL names a table of that warehouse without its database, or a dataset as `ds.<name>`
285
+ (`databay dashboards-dataset list --warehouse-id <sink_db_uuid> --output json` lists them).
286
+ - A create is safe to repeat only with the `--idempotency-key` it printed.
287
+ - Each change to a dashboard or a card takes the `--revision` its last answer gave. `revision_conflict`
288
+ means it changed since: run `databay dashboards get <board_id> --output json` (or
289
+ `databay dashboards-card get <card_id> --output json`), check whether your change is already
290
+ there, and if not, send it again on the new revision.
291
+ - `feature_disabled` means native dashboards are off for this organization, and
292
+ `warehouse_not_queryable` that this warehouse cannot run cards. Tell the user the `hint`.
293
+ - `console_not_scoped` means no card can run until support or whoever runs the server turns on
294
+ project scoping for this organization's SQL console; an organization admin cannot, whatever
295
+ `message` says. Creating a dashboard still works, and you only learn this when a card runs.
296
+ Tell the user before they ask for it: the console and AI agent then act only in the active
297
+ project, and it cannot simply be turned back off.
298
+
299
+ The built-in dashboards that come with the product are only in the web app: no command reads
300
+ them, so send the user there.
301
+
302
+ ## Connect a BI tool
303
+
304
+ A BI tool (Tableau, Power BI, Metabase, DBeaver) reads the project's metrics over the PostgreSQL
305
+ protocol, signing in with an org API key that lists the project. Show the user where to connect:
306
+
307
+ ```
308
+ databay api-key list --output json
309
+ databay api-key-project bi-connection <key_id> <project_id> --output json
310
+ ```
311
+
312
+ The answer gives `host`, `port`, `database`, `username` and `sslmode`. The password is the key's
313
+ secret, which only the user has: never ask for it or print it. The key sees only the metrics its
314
+ warehouse access roles grant, and a query past the row cap comes back cut short without an error,
315
+ so tell the user to aggregate in the tool rather than export raw rows.
316
+
317
+ ## Read a failure
318
+
319
+ A failed command exits non-zero and prints one object on stderr:
320
+
321
+ ```
322
+ {"error": {"code", "message", "hint", "next", "recovery", "context", ...}}
323
+ ```
324
+
325
+ Read `recovery.action` first, then the exit code for the class:
326
+
327
+ | `recovery.action` | Do |
328
+ |---|---|
329
+ | `retry` | Run the same command again, at most `recovery.max_retries` times. |
330
+ | `fix_and_retry` | Fix the input the `message` and `hint` name, then run it again. |
331
+ | `do_first` | Run `next` (sign in, set a project), then the original command. |
332
+ | `ask_human` | Stop and tell the user `message` and `hint`; do not retry. |
333
+
334
+ If `recovery.side_effects` is `partial`, `complete` or `unknown`, the server may already have
335
+ changed something: check before running a write again.
336
+
337
+ | Exit | Meaning |
338
+ |---|---|
339
+ | 0 | ok |
340
+ | 1 | the server refused; fix the input or ask the user |
341
+ | 2 | usage: a flag or argument is wrong or missing; read `hint` |
342
+ | 3 | sign-in or profile needed; ask the user to sign in (see "Before any task") |
343
+ | 4 | still pending; run `next`, the same wait |
344
+ | 5 | the wait ended in failure; report `last_error` |
345
+ | 6 | transient; retry later |
346
+ | 7 | the CLI and the server versions do not match; tell the user to upgrade |
347
+ | 8 | the CLI is outdated or hit a bug; tell the user, with `support_ref` or the crash log |
348
+ | 9 | not ready; fix what the answer names, then check again |
349
+
350
+ Look up a `code` you do not know in `references/errors.md`. Quote `context.request_id` when
351
+ the user reports a problem.
352
+
353
+ ## Finding a command
354
+
355
+ Every exposed API operation has a command. Search `references/commands.md` for the noun
356
+ (`## pipe`, `## warehouse`, `## source`) or run `databay <noun> <verb> --help`. Ids are
357
+ UUIDs from a `list` or `get` result; never invent one.