datex-studio-cli 0.4.24__tar.gz → 0.5.0__tar.gz

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 (228) hide show
  1. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/.github/workflows/build-image.yml +4 -4
  2. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/.github/workflows/ci.yml +14 -8
  3. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/.github/workflows/promote-prod.yml +1 -1
  4. datex_studio_cli-0.5.0/.github/workflows/release.yml +108 -0
  5. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/.gitignore +3 -0
  6. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/PKG-INFO +20 -8
  7. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/README.md +19 -7
  8. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/pyproject.toml +2 -1
  9. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/__init__.py +1 -1
  10. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/cli.py +12 -6
  11. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/auth.py +685 -252
  12. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/datasource.py +3 -1
  13. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/init.py +89 -60
  14. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/odata.py +1 -1
  15. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/__init__.py +2 -2
  16. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/auth/datex_tenant.py +2 -2
  17. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/auth/msal_client.py +119 -10
  18. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/auth/tenants.py +120 -0
  19. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/auth/token_cache.py +37 -8
  20. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/generator.py +2 -1
  21. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/footprint/client.py +10 -3
  22. datex_studio_cli-0.5.0/src/dxs/core/onboarding.py +518 -0
  23. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/telemetry/recorder.py +8 -1
  24. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/engine.py +13 -13
  25. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/preview.py +2 -2
  26. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/preview_arjs.py +2 -2
  27. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/svg_renderer.py +1 -1
  28. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/design.py +4 -6
  29. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/404/index.html +1 -1
  30. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/404.html +1 -1
  31. datex_studio_cli-0.4.24/src/dxs/web/static/_next/static/chunks/app/_not-found/page-ea1be7001c230704.js → datex_studio_cli-0.5.0/src/dxs/web/static/_next/static/chunks/app/_not-found/page-e3c660196c244183.js +1 -1
  32. datex_studio_cli-0.5.0/src/dxs/web/static/_next/static/chunks/app/design/capture/page-c083dc9f01f32a04.js +1 -0
  33. datex_studio_cli-0.5.0/src/dxs/web/static/_next/static/chunks/app/design/page-689cd5b9e1d9a74e.js +1 -0
  34. datex_studio_cli-0.4.24/src/dxs/web/static/_next/static/chunks/app/layout-2cc6eac09e476c91.js → datex_studio_cli-0.5.0/src/dxs/web/static/_next/static/chunks/app/layout-cec86f90e385371d.js +1 -1
  35. datex_studio_cli-0.4.24/src/dxs/web/static/_next/static/chunks/app/page-20c358395882cdac.js → datex_studio_cli-0.5.0/src/dxs/web/static/_next/static/chunks/app/page-f0380b0f29983264.js +1 -1
  36. datex_studio_cli-0.4.24/src/dxs/web/static/_next/static/chunks/main-app-b69998d8941231d8.js → datex_studio_cli-0.5.0/src/dxs/web/static/_next/static/chunks/main-app-694cf3568b6c9fa9.js +1 -1
  37. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/design/capture/index.html +1 -1
  38. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/design/capture/index.txt +4 -4
  39. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/design/index.html +1 -1
  40. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/design/index.txt +4 -4
  41. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/index.html +1 -1
  42. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/index.txt +4 -4
  43. datex_studio_cli-0.4.24/.github/workflows/release.yml +0 -54
  44. datex_studio_cli-0.4.24/inspections.md +0 -147
  45. datex_studio_cli-0.4.24/outbound.md +0 -928
  46. datex_studio_cli-0.4.24/src/dxs/core/onboarding.py +0 -151
  47. datex_studio_cli-0.4.24/src/dxs/web/static/_next/static/chunks/app/design/capture/page-a5e129c2d223432c.js +0 -1
  48. datex_studio_cli-0.4.24/src/dxs/web/static/_next/static/chunks/app/design/page-21ba66a3dd3b03f0.js +0 -1
  49. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/.dockerignore +0 -0
  50. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/.github/actionlint.yaml +0 -0
  51. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/CONTEXT.md +0 -0
  52. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/otel/.env.example +0 -0
  53. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/otel/Dockerfile +0 -0
  54. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/otel/README.md +0 -0
  55. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/otel/apply-local-cache.js +0 -0
  56. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/otel/collector-config.yaml +0 -0
  57. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/otel/docker-compose.yml +0 -0
  58. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/otel/local-test-settings.json +0 -0
  59. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/otel/remote-settings.json +0 -0
  60. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/report-creator.skill +0 -0
  61. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/scripts/analyze_corpus.py +0 -0
  62. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/scripts/generate_rdlx_schema.py +0 -0
  63. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/__main__.py +0 -0
  64. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/__init__.py +0 -0
  65. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/api.py +0 -0
  66. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/branch.py +0 -0
  67. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/branch_commit_guard.py +0 -0
  68. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/cascade.py +0 -0
  69. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/config.py +0 -0
  70. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/configuration.py +0 -0
  71. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/crm.py +0 -0
  72. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/crm_delivery.py +0 -0
  73. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/crm_time.py +0 -0
  74. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/devops.py +0 -0
  75. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/document.py +0 -0
  76. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/endpoint.py +0 -0
  77. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/env.py +0 -0
  78. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/explore.py +0 -0
  79. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/function.py +0 -0
  80. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/marketplace.py +0 -0
  81. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/ng/__init__.py +0 -0
  82. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/ng/_common.py +0 -0
  83. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/ng/api.py +0 -0
  84. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/ng/create.py +0 -0
  85. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/ng/data.py +0 -0
  86. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/ng/pack.py +0 -0
  87. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/ng/preview.py +0 -0
  88. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/organization.py +0 -0
  89. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/proxy.py +0 -0
  90. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/reference.py +0 -0
  91. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/release_notes.py +0 -0
  92. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/repo.py +0 -0
  93. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/add_cmds.py +0 -0
  94. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/api.py +0 -0
  95. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/batch.py +0 -0
  96. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/create.py +0 -0
  97. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/data.py +0 -0
  98. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/dataset.py +0 -0
  99. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/edit.py +0 -0
  100. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/folder.py +0 -0
  101. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/preview.py +0 -0
  102. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/schema_cmds.py +0 -0
  103. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/reset.py +0 -0
  104. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/schema.py +0 -0
  105. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/servicepack.py +0 -0
  106. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/source.py +0 -0
  107. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/studio.py +0 -0
  108. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/telemetry.py +0 -0
  109. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/user.py +0 -0
  110. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/validation_report.py +0 -0
  111. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/context.py +0 -0
  112. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/__init__.py +0 -0
  113. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/agent_browser.py +0 -0
  114. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/api/__init__.py +0 -0
  115. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/api/app_config.py +0 -0
  116. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/api/client.py +0 -0
  117. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/api/endpoints.py +0 -0
  118. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/api/metadata_models.py +0 -0
  119. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/api/models.py +0 -0
  120. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/api/reference_graph.py +0 -0
  121. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/api/replacements.py +0 -0
  122. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/auth/__init__.py +0 -0
  123. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/auth/decorators.py +0 -0
  124. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/cache.py +0 -0
  125. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/__init__.py +0 -0
  126. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/flow_generator.py +0 -0
  127. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/flow_models.py +0 -0
  128. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/flow_shape.py +0 -0
  129. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/models.py +0 -0
  130. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/parsers.py +0 -0
  131. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/resolver.py +0 -0
  132. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/type_def_parser.py +0 -0
  133. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/validator.py +0 -0
  134. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/designer/__init__.py +0 -0
  135. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/designer/flow_models.py +0 -0
  136. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/designer/models.py +0 -0
  137. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/designer/parsers.py +0 -0
  138. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/devops/__init__.py +0 -0
  139. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/devops/client.py +0 -0
  140. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/devops/helpers.py +0 -0
  141. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/devops/models.py +0 -0
  142. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/dynamics/__init__.py +0 -0
  143. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/dynamics/client.py +0 -0
  144. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/dynamics/html.py +0 -0
  145. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/dynamics/metadata_cache.py +0 -0
  146. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/dynamics/pagination.py +0 -0
  147. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/dynamics/resolvers.py +0 -0
  148. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/dynamics/time_entry.py +0 -0
  149. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/footprint/__init__.py +0 -0
  150. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/footprint/edmx_parser.py +0 -0
  151. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/footprint/metadata.py +0 -0
  152. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/function/__init__.py +0 -0
  153. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/function/generator.py +0 -0
  154. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/function/models.py +0 -0
  155. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/function/validator.py +0 -0
  156. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/graph.py +0 -0
  157. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/output/__init__.py +0 -0
  158. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/output/csv_fmt.py +0 -0
  159. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/output/formatter.py +0 -0
  160. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/output/json_fmt.py +0 -0
  161. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/output/redaction.py +0 -0
  162. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/output/yaml_fmt.py +0 -0
  163. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/release_notes.py +0 -0
  164. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/responses.py +0 -0
  165. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/telemetry/__init__.py +0 -0
  166. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/telemetry/config.py +0 -0
  167. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/telemetry/identity.py +0 -0
  168. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/telemetry/scrubber.py +0 -0
  169. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/telemetry/sender.py +0 -0
  170. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/models/__init__.py +0 -0
  171. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/ng/__init__.py +0 -0
  172. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/ng/folder.py +0 -0
  173. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/ng/manifest.py +0 -0
  174. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/ng/mocks.py +0 -0
  175. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/ng/preview.py +0 -0
  176. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/ng/scaffold.py +0 -0
  177. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/ng/serve_lock.py +0 -0
  178. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/py.typed +0 -0
  179. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/__init__.py +0 -0
  180. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/datasource_binding.py +0 -0
  181. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/field_parser.py +0 -0
  182. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/folder.py +0 -0
  183. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/manifest.py +0 -0
  184. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/models.py +0 -0
  185. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/schema.py +0 -0
  186. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/templates/__init__.py +0 -0
  187. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/templates/bill_of_lading.rdlx-json +0 -0
  188. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/templates/shipping_label.rdlx-json +0 -0
  189. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/validate_arjs.py +0 -0
  190. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/validator.py +0 -0
  191. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/wrapper.py +0 -0
  192. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/__init__.py +0 -0
  193. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/click_options.py +0 -0
  194. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/clipboard.py +0 -0
  195. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/config.py +0 -0
  196. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/errors.py +0 -0
  197. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/filtering.py +0 -0
  198. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/image.py +0 -0
  199. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/paths.py +0 -0
  200. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/resolvers.py +0 -0
  201. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/responses.py +0 -0
  202. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/restricted.py +0 -0
  203. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/sorting.py +0 -0
  204. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/update_check.py +0 -0
  205. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/versioning.py +0 -0
  206. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/__init__.py +0 -0
  207. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/app.py +0 -0
  208. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/proxy_app.py +0 -0
  209. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/0b24cca5-c1e1c8810348f107.js +0 -0
  210. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/255-102f2e5b2e3dc2ef.js +0 -0
  211. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/4bd1b696-c023c6e3521b1417.js +0 -0
  212. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/538-b06224e65f71c9a1.js +0 -0
  213. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/697-0e000ab410d9f470.js +0 -0
  214. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/871-1acacdb7b4022abf.js +0 -0
  215. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/8b8f67fc-6295949a4b5485a4.js +0 -0
  216. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/909-c88abba3cf0caec3.js +0 -0
  217. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/framework-de98b93a850cfc71.js +0 -0
  218. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/main-0f18f91200dac003.js +0 -0
  219. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/pages/_app-7d307437aca18ad4.js +0 -0
  220. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js +0 -0
  221. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -0
  222. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/webpack-2b297ada5306c17f.js +0 -0
  223. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/css/360c657de5e04df8.css +0 -0
  224. {datex_studio_cli-0.4.24/src/dxs/web/static/_next/static/66KX2RhbxI0ARIXVny2EP → datex_studio_cli-0.5.0/src/dxs/web/static/_next/static/hfb4z29yVHQge-muP6roV}/_buildManifest.js +0 -0
  225. {datex_studio_cli-0.4.24/src/dxs/web/static/_next/static/66KX2RhbxI0ARIXVny2EP → datex_studio_cli-0.5.0/src/dxs/web/static/_next/static/hfb4z29yVHQge-muP6roV}/_ssgManifest.js +0 -0
  226. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/render-cli.js +0 -0
  227. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/report-preview.html +0 -0
  228. {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/report-validate.html +0 -0
@@ -29,9 +29,9 @@ jobs:
29
29
  runs-on: arc-dxs
30
30
  timeout-minutes: 30
31
31
  steps:
32
- - uses: actions/checkout@v4
33
- - uses: docker/setup-buildx-action@v3
34
- - uses: docker/login-action@v3
32
+ - uses: actions/checkout@v7
33
+ - uses: docker/setup-buildx-action@v4
34
+ - uses: docker/login-action@v4
35
35
  with:
36
36
  registry: ghcr.io
37
37
  username: ${{ github.actor }}
@@ -39,7 +39,7 @@ jobs:
39
39
  - id: meta
40
40
  run: echo "datetag=$(date -u +%Y%m%d).${{ github.run_number }}" >> "$GITHUB_OUTPUT"
41
41
  - id: build
42
- uses: docker/build-push-action@v6
42
+ uses: docker/build-push-action@v7
43
43
  with:
44
44
  context: .
45
45
  file: quartermaster/Dockerfile
@@ -20,12 +20,18 @@ jobs:
20
20
  runs-on: arc-dxs
21
21
  timeout-minutes: 30
22
22
  steps:
23
- - uses: actions/checkout@v4
24
- - uses: astral-sh/setup-uv@v5
23
+ - uses: actions/checkout@v7
24
+ - uses: astral-sh/setup-uv@v10.0.1
25
25
  with:
26
26
  enable-cache: true
27
+ # Distinct per-job key: cli and service run in parallel and would
28
+ # otherwise race to save the same cache entry (noisy warning).
29
+ cache-suffix: cli
30
+ # The releases.astral.sh mirror 404s from the arc-dxs runners and
31
+ # every download falls back to GitHub Releases anyway — skip it.
32
+ download-from-astral-mirror: false
27
33
  - run: uv python install 3.13
28
- - uses: actions/setup-node@v4
34
+ - uses: actions/setup-node@v7
29
35
  with:
30
36
  node-version: 22
31
37
  - name: Build the report renderer bundle (snapshot tests shell out to it)
@@ -35,19 +41,19 @@ jobs:
35
41
  npm run build:render-cli
36
42
  - run: uv sync --all-packages --extra dev
37
43
  - run: uv run ruff check .
38
- - name: mypy (non-blocking — 21 pre-existing errors, see #171)
39
- run: uv run mypy src/dxs
40
- continue-on-error: true
44
+ - run: uv run mypy src/dxs
41
45
  - run: uv run pytest -q
42
46
 
43
47
  service:
44
48
  runs-on: arc-dxs
45
49
  timeout-minutes: 20
46
50
  steps:
47
- - uses: actions/checkout@v4
48
- - uses: astral-sh/setup-uv@v5
51
+ - uses: actions/checkout@v7
52
+ - uses: astral-sh/setup-uv@v10.0.1
49
53
  with:
50
54
  enable-cache: true
55
+ cache-suffix: service
56
+ download-from-astral-mirror: false
51
57
  - run: uv python install 3.13
52
58
  - run: uv sync --all-packages --extra dev
53
59
  - run: uv run ruff check quartermaster
@@ -39,7 +39,7 @@ jobs:
39
39
  echo "confirmation mismatch: expected the literal string promote-to-prod" >&2
40
40
  exit 1
41
41
  fi
42
- - uses: actions/checkout@v4
42
+ - uses: actions/checkout@v7
43
43
  with:
44
44
  fetch-depth: 0
45
45
  - id: resolve
@@ -0,0 +1,108 @@
1
+ # The CLI's PyPI release lane (spec §5), retiring publish.sh and ~/.pypirc.
2
+ # Two ways in, one publish path:
3
+ # - tag push vX.Y.Z — versions must already be aligned across pyproject,
4
+ # __init__, and uv.lock (the uv.lock entry is the one nothing else updates)
5
+ # - manual dispatch with an optional `version` input — the workflow bumps
6
+ # pyproject/__init__/uv.lock, commits to main, tags vX.Y.Z, then publishes.
7
+ # A blank input publishes the version already in the files (the retry lane
8
+ # for a release that failed after its bump commit landed).
9
+ # Both lanes: full CI → version-agreement assert → frontend build with a hard
10
+ # existence check (the gitignored web/static/ ships via hatch `artifacts`,
11
+ # which silently includes nothing when absent) → uv build + publish via PyPI
12
+ # trusted publishing.
13
+ # Prerequisite: a trusted publisher for this repo/workflow configured on PyPI.
14
+ name: Release to PyPI
15
+
16
+ on:
17
+ push:
18
+ tags: ["v*"]
19
+ workflow_dispatch:
20
+ inputs:
21
+ version:
22
+ description: "New version (X.Y.Z) — bumps files, commits to main, tags, publishes. Blank — publish the version already in the files."
23
+ required: false
24
+ type: string
25
+
26
+ permissions:
27
+ contents: read
28
+
29
+ concurrency:
30
+ group: release-pypi
31
+
32
+ jobs:
33
+ ci:
34
+ uses: ./.github/workflows/ci.yml
35
+
36
+ publish:
37
+ needs: ci
38
+ runs-on: arc-dxs
39
+ timeout-minutes: 30
40
+ permissions:
41
+ contents: write # the dispatch lane pushes the bump commit + tag
42
+ id-token: write # PyPI trusted publishing
43
+ steps:
44
+ - uses: actions/checkout@v7
45
+ - uses: astral-sh/setup-uv@v10.0.1
46
+ with:
47
+ enable-cache: true
48
+ cache-suffix: release
49
+ download-from-astral-mirror: false
50
+ - run: uv python install 3.13
51
+ - name: Bump version, commit, and tag (dispatch with a version input)
52
+ if: github.event_name == 'workflow_dispatch' && inputs.version != ''
53
+ env:
54
+ VERSION: ${{ inputs.version }}
55
+ run: |
56
+ set -euo pipefail
57
+ if [ "${GITHUB_REF}" != "refs/heads/main" ]; then
58
+ echo "version bumps may only be dispatched from main (got ${GITHUB_REF})" >&2
59
+ exit 1
60
+ fi
61
+ if ! echo "$VERSION" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'; then
62
+ echo "version must be X.Y.Z (got '$VERSION')" >&2
63
+ exit 1
64
+ fi
65
+ current=$(grep -m1 '^version = ' pyproject.toml | cut -d'"' -f2)
66
+ if [ "$VERSION" != "$current" ]; then
67
+ sed -i "s/^version = \".*\"/version = \"$VERSION\"/" pyproject.toml
68
+ sed -i "s/^__version__ = \".*\"/__version__ = \"$VERSION\"/" src/dxs/__init__.py
69
+ uv lock
70
+ git config user.name "github-actions[bot]"
71
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
72
+ git add pyproject.toml src/dxs/__init__.py uv.lock
73
+ git commit -m "Bump version to $VERSION"
74
+ git push origin HEAD:main
75
+ fi
76
+ # The tag push is the reuse guard: it fails if v$VERSION already exists.
77
+ git tag "v$VERSION"
78
+ git push origin "v$VERSION"
79
+ - name: Assert expected version == pyproject == __init__ == uv.lock
80
+ env:
81
+ VERSION: ${{ inputs.version }}
82
+ run: |
83
+ pyproject=$(grep -m1 '^version = ' pyproject.toml | cut -d'"' -f2)
84
+ init=$(grep -m1 '__version__' src/dxs/__init__.py | cut -d'"' -f2)
85
+ lock=$(awk '/^name = "datex-studio-cli"$/ {found=1} found && /^version = / {print; exit}' uv.lock | cut -d'"' -f2)
86
+ if [ "${GITHUB_EVENT_NAME}" = "push" ]; then
87
+ expected="${GITHUB_REF#refs/tags/v}"
88
+ else
89
+ expected="${VERSION:-$pyproject}"
90
+ fi
91
+ echo "expected=${expected} pyproject=${pyproject} __init__=${init} uv.lock=${lock}"
92
+ if [ "$expected" != "$pyproject" ] || [ "$pyproject" != "$init" ] || [ "$pyproject" != "$lock" ]; then
93
+ echo "version sources disagree — run 'uv lock' and align all three before releasing" >&2
94
+ exit 1
95
+ fi
96
+ - uses: actions/setup-node@v7
97
+ with:
98
+ node-version: 22
99
+ - name: Build the web UI (shipped via hatch artifacts)
100
+ working-directory: src/dxs/web/frontend
101
+ run: |
102
+ npm ci
103
+ npm run build
104
+ - name: Assert the frontend build actually produced the static export
105
+ run: test -f src/dxs/web/static/index.html
106
+ - run: uv build
107
+ - name: Publish via trusted publishing
108
+ run: uv publish
@@ -102,3 +102,6 @@ test-preview.svg
102
102
 
103
103
  # CAC working copies (dxs ng harnesses) — never committed
104
104
  /components/
105
+
106
+ # Live auth matrix config (real accounts)
107
+ tests/live/accounts.local.json
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: datex-studio-cli
3
- Version: 0.4.24
3
+ Version: 0.5.0
4
4
  Summary: CLI for Datex Studio low-code platform, designed for LLM-based AI agents
5
5
  Project-URL: Homepage, https://github.com/datex/datex-studio-cli
6
6
  Project-URL: Documentation, https://github.com/datex/datex-studio-cli
@@ -77,7 +77,7 @@ pip install datex-studio-cli
77
77
  ## Quick Start
78
78
 
79
79
  ```bash
80
- # Authenticate with Azure Entra
80
+ # Authenticate with Azure Entra (opens your browser; device code when headless)
81
81
  dxs auth login
82
82
 
83
83
  # Check authentication status
@@ -203,11 +203,19 @@ Set `DXS_RESTRICTED_MODE=1` to block potentially dangerous operations:
203
203
 
204
204
  | Command | Description |
205
205
  |---------|-------------|
206
- | `login` | Authenticate with Azure Entra (device code flow) |
206
+ | `login [selector]` | Sign in — browser + PKCE by default, device code when headless or with `--use-device-code`/`--no-browser` |
207
207
  | `logout` | Clear credentials (`--all` for all identities) |
208
208
  | `status` | Show current authentication status and token expiration |
209
209
  | `list` | List all cached identities |
210
- | `switch <identity>` | Switch to a different cached identity |
210
+ | `switch <selector>` | Switch identity (username, org, Entra domain, or tenant ID) |
211
+
212
+ One selector grammar is shared by `login`, `switch`, and `init`: an email
213
+ address derives the tenant from its domain (works on a fresh machine), a
214
+ domain or tenant GUID names the tenant directly, anything else is an
215
+ organization name. `--domain`/`--tenant-id` name the tenant to authenticate
216
+ against and always win; combined with an email selector they express a guest
217
+ signing in to another organization's tenant. A usable cached identity for the
218
+ target skips the browser entirely (`--force` re-authenticates).
211
219
 
212
220
  **Multi-Identity Workflow:**
213
221
 
@@ -215,14 +223,18 @@ Set `DXS_RESTRICTED_MODE=1` to block potentially dangerous operations:
215
223
  # Login to primary organization
216
224
  dxs auth login
217
225
 
218
- # Login to additional organization (prompts for new auth)
219
- dxs auth login --org other-org
226
+ # Customer self-service: the tenant is derived from your address
227
+ dxs auth login you@csw-wi.com
228
+
229
+ # Login to an additional organization (fresh auth against its tenant)
230
+ dxs auth login OtherOrg
220
231
 
221
232
  # List all identities
222
233
  dxs auth list
223
234
 
224
- # Switch between organizations
225
- dxs auth switch other-org
235
+ # Switch between identities — org name, domain, tenant ID, or username
236
+ dxs auth switch OtherOrg
237
+ dxs auth switch csw-wi.com
226
238
  ```
227
239
 
228
240
  ### CLI Settings (`dxs settings`)
@@ -24,7 +24,7 @@ pip install datex-studio-cli
24
24
  ## Quick Start
25
25
 
26
26
  ```bash
27
- # Authenticate with Azure Entra
27
+ # Authenticate with Azure Entra (opens your browser; device code when headless)
28
28
  dxs auth login
29
29
 
30
30
  # Check authentication status
@@ -150,11 +150,19 @@ Set `DXS_RESTRICTED_MODE=1` to block potentially dangerous operations:
150
150
 
151
151
  | Command | Description |
152
152
  |---------|-------------|
153
- | `login` | Authenticate with Azure Entra (device code flow) |
153
+ | `login [selector]` | Sign in — browser + PKCE by default, device code when headless or with `--use-device-code`/`--no-browser` |
154
154
  | `logout` | Clear credentials (`--all` for all identities) |
155
155
  | `status` | Show current authentication status and token expiration |
156
156
  | `list` | List all cached identities |
157
- | `switch <identity>` | Switch to a different cached identity |
157
+ | `switch <selector>` | Switch identity (username, org, Entra domain, or tenant ID) |
158
+
159
+ One selector grammar is shared by `login`, `switch`, and `init`: an email
160
+ address derives the tenant from its domain (works on a fresh machine), a
161
+ domain or tenant GUID names the tenant directly, anything else is an
162
+ organization name. `--domain`/`--tenant-id` name the tenant to authenticate
163
+ against and always win; combined with an email selector they express a guest
164
+ signing in to another organization's tenant. A usable cached identity for the
165
+ target skips the browser entirely (`--force` re-authenticates).
158
166
 
159
167
  **Multi-Identity Workflow:**
160
168
 
@@ -162,14 +170,18 @@ Set `DXS_RESTRICTED_MODE=1` to block potentially dangerous operations:
162
170
  # Login to primary organization
163
171
  dxs auth login
164
172
 
165
- # Login to additional organization (prompts for new auth)
166
- dxs auth login --org other-org
173
+ # Customer self-service: the tenant is derived from your address
174
+ dxs auth login you@csw-wi.com
175
+
176
+ # Login to an additional organization (fresh auth against its tenant)
177
+ dxs auth login OtherOrg
167
178
 
168
179
  # List all identities
169
180
  dxs auth list
170
181
 
171
- # Switch between organizations
172
- dxs auth switch other-org
182
+ # Switch between identities — org name, domain, tenant ID, or username
183
+ dxs auth switch OtherOrg
184
+ dxs auth switch csw-wi.com
173
185
  ```
174
186
 
175
187
  ### CLI Settings (`dxs settings`)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "datex-studio-cli"
7
- version = "0.4.24"
7
+ version = "0.5.0"
8
8
  description = "CLI for Datex Studio low-code platform, designed for LLM-based AI agents"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -159,6 +159,7 @@ markers = [
159
159
  "internal_commands_gated: exercise the devops/crm visibility gate (no DXS_INTERNAL_COMMANDS override)",
160
160
  "real_auth_state: exercise real auth state (no injected DXS_ACCESS_TOKEN; the variable is scrubbed)",
161
161
  "telemetry_live: run without the suite-wide DXS_TELEMETRY=0 kill-switch",
162
+ "live_auth: sign in against real Entra tenants (opt-in; needs DXS_LIVE_AUTH=1 + a human)",
162
163
  ]
163
164
 
164
165
  [tool.coverage.run]
@@ -1,4 +1,4 @@
1
1
  """Datex Studio CLI - Command-line interface for Datex Studio platform."""
2
2
 
3
- __version__ = "0.4.24"
3
+ __version__ = "0.5.0"
4
4
  __app_name__ = "dxs"
@@ -500,7 +500,7 @@ def handle_errors(f: F) -> F:
500
500
  try:
501
501
  return ctx.invoke(f, *args, **kwargs)
502
502
  except DxsError as e:
503
- _record_error_silently(e)
503
+ _record_error_silently(e, dxs_ctx)
504
504
  dxs_ctx.output_error(e)
505
505
  sys.exit(1)
506
506
  except (click.ClickException, click.Abort, click.exceptions.Exit):
@@ -509,19 +509,24 @@ def handle_errors(f: F) -> F:
509
509
  # not errors and must not be rendered as error envelopes.
510
510
  raise
511
511
  except Exception as e:
512
- _record_error_silently(e)
512
+ _record_error_silently(e, dxs_ctx)
513
513
  dxs_ctx.output_error(e)
514
514
  sys.exit(1)
515
515
 
516
516
  return cast(F, wrapper)
517
517
 
518
518
 
519
- def _record_error_silently(exc: BaseException) -> None:
520
- """Emit a telemetry error event; never raises."""
519
+ def _record_error_silently(exc: BaseException, dxs_ctx: "DxsContext | None" = None) -> None:
520
+ """Emit a telemetry error event; never raises.
521
+
522
+ ``dxs_ctx`` is available on the handle_errors path and supplies the same
523
+ ``ctx_*`` slices success events carry; errors escaping to main() arrive
524
+ after Click tears the context down and go out without them.
525
+ """
521
526
  try:
522
527
  from dxs.core.telemetry import record_error
523
528
 
524
- record_error(exc)
529
+ record_error(exc, ctx_extras=_ctx_extras(dxs_ctx))
525
530
  except Exception: # noqa: BLE001
526
531
  pass
527
532
 
@@ -756,7 +761,8 @@ def update_cmd(yes: bool, check_only: bool) -> None:
756
761
  try:
757
762
  from dxs.core.telemetry import record_end
758
763
 
759
- record_end(exit_code=0, ctx_extras={})
764
+ dxs_ctx = click.get_current_context().find_object(DxsContext)
765
+ record_end(exit_code=0, ctx_extras=_ctx_extras(dxs_ctx))
760
766
  except Exception: # noqa: BLE001
761
767
  pass
762
768
  try: