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.
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/.github/workflows/build-image.yml +4 -4
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/.github/workflows/ci.yml +14 -8
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/.github/workflows/promote-prod.yml +1 -1
- datex_studio_cli-0.5.0/.github/workflows/release.yml +108 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/.gitignore +3 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/PKG-INFO +20 -8
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/README.md +19 -7
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/pyproject.toml +2 -1
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/__init__.py +1 -1
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/cli.py +12 -6
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/auth.py +685 -252
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/datasource.py +3 -1
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/init.py +89 -60
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/odata.py +1 -1
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/__init__.py +2 -2
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/auth/datex_tenant.py +2 -2
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/auth/msal_client.py +119 -10
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/auth/tenants.py +120 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/auth/token_cache.py +37 -8
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/generator.py +2 -1
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/footprint/client.py +10 -3
- datex_studio_cli-0.5.0/src/dxs/core/onboarding.py +518 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/telemetry/recorder.py +8 -1
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/engine.py +13 -13
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/preview.py +2 -2
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/preview_arjs.py +2 -2
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/svg_renderer.py +1 -1
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/design.py +4 -6
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/404/index.html +1 -1
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/404.html +1 -1
- 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
- datex_studio_cli-0.5.0/src/dxs/web/static/_next/static/chunks/app/design/capture/page-c083dc9f01f32a04.js +1 -0
- datex_studio_cli-0.5.0/src/dxs/web/static/_next/static/chunks/app/design/page-689cd5b9e1d9a74e.js +1 -0
- 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
- 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
- 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
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/design/capture/index.html +1 -1
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/design/capture/index.txt +4 -4
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/design/index.html +1 -1
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/design/index.txt +4 -4
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/index.html +1 -1
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/index.txt +4 -4
- datex_studio_cli-0.4.24/.github/workflows/release.yml +0 -54
- datex_studio_cli-0.4.24/inspections.md +0 -147
- datex_studio_cli-0.4.24/outbound.md +0 -928
- datex_studio_cli-0.4.24/src/dxs/core/onboarding.py +0 -151
- datex_studio_cli-0.4.24/src/dxs/web/static/_next/static/chunks/app/design/capture/page-a5e129c2d223432c.js +0 -1
- datex_studio_cli-0.4.24/src/dxs/web/static/_next/static/chunks/app/design/page-21ba66a3dd3b03f0.js +0 -1
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/.dockerignore +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/.github/actionlint.yaml +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/CONTEXT.md +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/otel/.env.example +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/otel/Dockerfile +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/otel/README.md +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/otel/apply-local-cache.js +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/otel/collector-config.yaml +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/otel/docker-compose.yml +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/otel/local-test-settings.json +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/otel/remote-settings.json +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/report-creator.skill +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/scripts/analyze_corpus.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/scripts/generate_rdlx_schema.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/__main__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/__init__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/api.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/branch.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/branch_commit_guard.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/cascade.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/config.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/configuration.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/crm.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/crm_delivery.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/crm_time.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/devops.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/document.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/endpoint.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/env.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/explore.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/function.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/marketplace.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/ng/__init__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/ng/_common.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/ng/api.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/ng/create.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/ng/data.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/ng/pack.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/ng/preview.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/organization.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/proxy.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/reference.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/release_notes.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/repo.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/add_cmds.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/api.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/batch.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/create.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/data.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/dataset.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/edit.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/folder.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/preview.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/report/schema_cmds.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/reset.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/schema.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/servicepack.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/source.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/studio.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/telemetry.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/user.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/commands/validation_report.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/context.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/__init__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/agent_browser.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/api/__init__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/api/app_config.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/api/client.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/api/endpoints.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/api/metadata_models.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/api/models.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/api/reference_graph.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/api/replacements.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/auth/__init__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/auth/decorators.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/cache.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/__init__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/flow_generator.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/flow_models.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/flow_shape.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/models.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/parsers.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/resolver.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/type_def_parser.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/datasource/validator.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/designer/__init__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/designer/flow_models.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/designer/models.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/designer/parsers.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/devops/__init__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/devops/client.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/devops/helpers.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/devops/models.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/dynamics/__init__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/dynamics/client.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/dynamics/html.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/dynamics/metadata_cache.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/dynamics/pagination.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/dynamics/resolvers.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/dynamics/time_entry.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/footprint/__init__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/footprint/edmx_parser.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/footprint/metadata.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/function/__init__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/function/generator.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/function/models.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/function/validator.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/graph.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/output/__init__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/output/csv_fmt.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/output/formatter.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/output/json_fmt.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/output/redaction.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/output/yaml_fmt.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/release_notes.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/responses.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/telemetry/__init__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/telemetry/config.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/telemetry/identity.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/telemetry/scrubber.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/core/telemetry/sender.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/models/__init__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/ng/__init__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/ng/folder.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/ng/manifest.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/ng/mocks.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/ng/preview.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/ng/scaffold.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/ng/serve_lock.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/py.typed +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/__init__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/datasource_binding.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/field_parser.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/folder.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/manifest.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/models.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/schema.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/templates/__init__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/templates/bill_of_lading.rdlx-json +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/templates/shipping_label.rdlx-json +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/validate_arjs.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/validator.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/report/wrapper.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/__init__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/click_options.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/clipboard.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/config.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/errors.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/filtering.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/image.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/paths.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/resolvers.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/responses.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/restricted.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/sorting.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/update_check.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/utils/versioning.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/__init__.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/app.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/proxy_app.py +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/0b24cca5-c1e1c8810348f107.js +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/255-102f2e5b2e3dc2ef.js +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/4bd1b696-c023c6e3521b1417.js +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/538-b06224e65f71c9a1.js +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/697-0e000ab410d9f470.js +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/871-1acacdb7b4022abf.js +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/8b8f67fc-6295949a4b5485a4.js +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/909-c88abba3cf0caec3.js +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/framework-de98b93a850cfc71.js +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/main-0f18f91200dac003.js +0 -0
- {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
- {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
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/chunks/webpack-2b297ada5306c17f.js +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/_next/static/css/360c657de5e04df8.css +0 -0
- {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
- {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
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/render-cli.js +0 -0
- {datex_studio_cli-0.4.24 → datex_studio_cli-0.5.0}/src/dxs/web/static/report-preview.html +0 -0
- {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@
|
|
33
|
-
- uses: docker/setup-buildx-action@
|
|
34
|
-
- uses: docker/login-action@
|
|
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@
|
|
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@
|
|
24
|
-
- uses: astral-sh/setup-uv@
|
|
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@
|
|
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
|
-
-
|
|
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@
|
|
48
|
-
- uses: astral-sh/setup-uv@
|
|
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
|
|
@@ -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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: datex-studio-cli
|
|
3
|
-
Version: 0.
|
|
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` |
|
|
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 <
|
|
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
|
-
#
|
|
219
|
-
dxs auth login
|
|
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
|
|
225
|
-
dxs auth switch
|
|
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` |
|
|
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 <
|
|
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
|
-
#
|
|
166
|
-
dxs auth login
|
|
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
|
|
172
|
-
dxs auth switch
|
|
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.
|
|
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]
|
|
@@ -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
|
-
|
|
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:
|