datex-studio-cli 0.4.10__tar.gz → 0.4.12__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.10 → datex_studio_cli-0.4.12}/PKG-INFO +1 -1
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/pyproject.toml +2 -1
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/__init__.py +1 -1
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/cli.py +78 -8
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/auth.py +365 -202
- datex_studio_cli-0.4.12/src/dxs/commands/init.py +310 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/context.py +1 -0
- datex_studio_cli-0.4.12/src/dxs/core/auth/datex_tenant.py +265 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/auth/decorators.py +11 -5
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/auth/msal_client.py +13 -3
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/auth/token_cache.py +162 -6
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/devops/client.py +40 -63
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/dynamics/client.py +40 -65
- datex_studio_cli-0.4.12/src/dxs/core/onboarding.py +151 -0
- datex_studio_cli-0.4.12/src/dxs/report/templates/__init__.py +0 -0
- datex_studio_cli-0.4.12/src/dxs/utils/clipboard.py +50 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/utils/config.py +33 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/.gitignore +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/README.md +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/report-creator.skill +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/scripts/analyze_corpus.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/scripts/generate_rdlx_schema.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/__main__.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/__init__.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/api.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/branch.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/config.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/configuration.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/crm.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/datasource.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/devops.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/document.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/endpoint.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/env.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/explore.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/function.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/marketplace.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/odata.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/organization.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/proxy.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/release_notes.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/repo.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/report/__init__.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/report/add_cmds.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/report/api.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/report/batch.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/report/create.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/report/data.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/report/dataset.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/report/edit.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/report/folder.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/report/preview.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/report/schema_cmds.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/schema.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/servicepack.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/source.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/studio.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/telemetry.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/commands/user.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/__init__.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/api/__init__.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/api/app_config.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/api/client.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/api/endpoints.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/api/metadata_models.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/api/models.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/auth/__init__.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/cache.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/datasource/__init__.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/datasource/flow_generator.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/datasource/flow_models.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/datasource/generator.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/datasource/models.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/datasource/parsers.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/datasource/resolver.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/datasource/type_def_parser.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/datasource/validator.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/designer/__init__.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/designer/flow_models.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/designer/models.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/designer/parsers.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/devops/__init__.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/devops/helpers.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/devops/models.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/dynamics/__init__.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/dynamics/metadata_cache.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/footprint/__init__.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/footprint/client.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/footprint/edmx_parser.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/footprint/metadata.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/function/__init__.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/function/generator.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/function/models.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/function/validator.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/graph.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/output/__init__.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/output/csv_fmt.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/output/formatter.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/output/json_fmt.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/output/redaction.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/output/yaml_fmt.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/release_notes.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/responses.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/telemetry/__init__.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/telemetry/config.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/telemetry/identity.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/telemetry/recorder.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/telemetry/scrubber.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/core/telemetry/sender.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/models/__init__.py +0 -0
- /datex_studio_cli-0.4.10/src/dxs/report/templates/__init__.py → /datex_studio_cli-0.4.12/src/dxs/py.typed +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/report/__init__.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/report/datasource_binding.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/report/engine.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/report/field_parser.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/report/folder.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/report/manifest.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/report/models.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/report/preview.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/report/preview_arjs.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/report/schema.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/report/svg_renderer.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/report/templates/bill_of_lading.rdlx-json +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/report/templates/shipping_label.rdlx-json +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/report/validate_arjs.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/report/validator.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/report/wrapper.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/utils/__init__.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/utils/click_options.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/utils/errors.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/utils/filtering.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/utils/image.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/utils/paths.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/utils/resolvers.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/utils/responses.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/utils/restricted.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/utils/sorting.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/utils/update_check.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/__init__.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/app.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/design.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/proxy_app.py +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/404/index.html +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/404.html +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/UgyAMtPjH-Pt0RYWOHzIT/_buildManifest.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/UgyAMtPjH-Pt0RYWOHzIT/_ssgManifest.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/0b24cca5-c1e1c8810348f107.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/255-102f2e5b2e3dc2ef.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/4bd1b696-c023c6e3521b1417.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/538-84e2e111415f1fda.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/697-0e000ab410d9f470.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/871-1acacdb7b4022abf.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/8b8f67fc-6295949a4b5485a4.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/909-c88abba3cf0caec3.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/app/_not-found/page-ea1be7001c230704.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/app/design/capture/page-a5e129c2d223432c.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/app/design/page-21ba66a3dd3b03f0.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/app/layout-2cc6eac09e476c91.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/app/page-20c358395882cdac.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/framework-de98b93a850cfc71.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/main-0f18f91200dac003.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/main-app-b69998d8941231d8.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/pages/_app-7d307437aca18ad4.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/chunks/webpack-2b297ada5306c17f.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/_next/static/css/360c657de5e04df8.css +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/design/capture/index.html +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/design/capture/index.txt +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/design/index.html +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/design/index.txt +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/index.html +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/index.txt +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/render-cli.js +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/report-preview.html +0 -0
- {datex_studio_cli-0.4.10 → datex_studio_cli-0.4.12}/src/dxs/web/static/report-validate.html +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: datex-studio-cli
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.12
|
|
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
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "datex-studio-cli"
|
|
7
|
-
version = "0.4.
|
|
7
|
+
version = "0.4.12"
|
|
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"
|
|
@@ -152,6 +152,7 @@ python_functions = ["test_*"]
|
|
|
152
152
|
addopts = "-v --tb=short"
|
|
153
153
|
markers = [
|
|
154
154
|
"fidelity: cross-engine SSIM fidelity tests (require agent-browser + ARJS)",
|
|
155
|
+
"internal_commands_gated: exercise the devops/crm visibility gate (no DXS_INTERNAL_COMMANDS override)",
|
|
155
156
|
]
|
|
156
157
|
|
|
157
158
|
[tool.coverage.run]
|
|
@@ -8,6 +8,7 @@ import click
|
|
|
8
8
|
|
|
9
9
|
from dxs import __app_name__, __version__
|
|
10
10
|
from dxs.context import DxsContext, pass_context # re-exported for backward compat
|
|
11
|
+
from dxs.core.auth.datex_tenant import DATEX_INTERNAL_COMMANDS, internal_commands_available
|
|
11
12
|
from dxs.core.output import OutputFormat, format_error
|
|
12
13
|
from dxs.core.output.redaction import (
|
|
13
14
|
AUTHOR_VERBOSE_FIELDS as _AUTHOR_VERBOSE_FIELDS, # noqa: F401 — re-exported
|
|
@@ -16,7 +17,7 @@ from dxs.core.output.redaction import (
|
|
|
16
17
|
_redact_secrets, # noqa: F401 — re-exported
|
|
17
18
|
_strip_concise, # noqa: F401 — re-exported
|
|
18
19
|
)
|
|
19
|
-
from dxs.utils.config import get_settings
|
|
20
|
+
from dxs.utils.config import get_settings, resolve_target_url
|
|
20
21
|
from dxs.utils.errors import DxsError
|
|
21
22
|
|
|
22
23
|
# Re-export so that existing `from dxs.cli import DxsContext, pass_context` still works
|
|
@@ -77,7 +78,29 @@ CONTEXT_SETTINGS = {
|
|
|
77
78
|
|
|
78
79
|
|
|
79
80
|
class DxsGroup(click.Group):
|
|
80
|
-
"""Custom Group that shows global options in subcommand help.
|
|
81
|
+
"""Custom Group that shows global options in subcommand help.
|
|
82
|
+
|
|
83
|
+
Also gates the Datex-internal command groups (``devops``, ``crm``). The gate
|
|
84
|
+
is applied at lookup time rather than at registration so it reflects the
|
|
85
|
+
identity cache as of *this* invocation — registration happens once at import.
|
|
86
|
+
"""
|
|
87
|
+
|
|
88
|
+
def _is_gated(self, cmd_name: str) -> bool:
|
|
89
|
+
"""Whether ``cmd_name`` is Datex-internal and unavailable to this user."""
|
|
90
|
+
return cmd_name in DATEX_INTERNAL_COMMANDS and not internal_commands_available()
|
|
91
|
+
|
|
92
|
+
def list_commands(self, ctx: click.Context) -> list[str]:
|
|
93
|
+
"""List visible subcommands, omitting unavailable Datex-internal groups."""
|
|
94
|
+
return [name for name in super().list_commands(ctx) if not self._is_gated(name)]
|
|
95
|
+
|
|
96
|
+
def get_command(self, ctx: click.Context, cmd_name: str) -> click.Command | None:
|
|
97
|
+
"""Resolve a subcommand, refusing unavailable Datex-internal groups."""
|
|
98
|
+
if self._is_gated(cmd_name):
|
|
99
|
+
ctx.fail(
|
|
100
|
+
f"'{cmd_name}' is a Datex-internal command group and requires a "
|
|
101
|
+
"Datex tenant identity. Run 'dxs auth login' with your Datex account."
|
|
102
|
+
)
|
|
103
|
+
return super().get_command(ctx, cmd_name)
|
|
81
104
|
|
|
82
105
|
def format_options(self, ctx: click.Context, formatter: click.HelpFormatter) -> None:
|
|
83
106
|
"""Write options to the formatter, including global options."""
|
|
@@ -104,6 +127,33 @@ class DxsGroup(click.Group):
|
|
|
104
127
|
formatter.write_dl(global_opts)
|
|
105
128
|
|
|
106
129
|
|
|
130
|
+
def _apply_tenant_override(tenant: str) -> None:
|
|
131
|
+
"""Resolve a --tenant selector and pin identity resolution to it.
|
|
132
|
+
|
|
133
|
+
Raises:
|
|
134
|
+
AuthenticationError: If DXS_ACCESS_TOKEN is set (that token bypasses
|
|
135
|
+
identity resolution, so --tenant could not take effect), or if the
|
|
136
|
+
selector does not resolve to exactly one stored identity.
|
|
137
|
+
"""
|
|
138
|
+
import os
|
|
139
|
+
|
|
140
|
+
from dxs.core.auth.token_cache import MultiIdentityTokenCache, set_identity_override
|
|
141
|
+
from dxs.utils.errors import AuthenticationError
|
|
142
|
+
|
|
143
|
+
if os.environ.get("DXS_ACCESS_TOKEN"):
|
|
144
|
+
raise AuthenticationError(
|
|
145
|
+
message="--tenant cannot be used while DXS_ACCESS_TOKEN is set.",
|
|
146
|
+
code="DXS-AUTH-012",
|
|
147
|
+
suggestions=[
|
|
148
|
+
"DXS_ACCESS_TOKEN is used verbatim and already fixes the identity",
|
|
149
|
+
"Unset DXS_ACCESS_TOKEN to select a stored identity with --tenant",
|
|
150
|
+
],
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
cache = MultiIdentityTokenCache()
|
|
154
|
+
set_identity_override(cache.resolve_selector(tenant))
|
|
155
|
+
|
|
156
|
+
|
|
107
157
|
@click.group(cls=DxsGroup, context_settings=CONTEXT_SETTINGS)
|
|
108
158
|
@click.version_option(version=__version__, prog_name=__app_name__)
|
|
109
159
|
@click.option(
|
|
@@ -142,6 +192,14 @@ class DxsGroup(click.Group):
|
|
|
142
192
|
default=None,
|
|
143
193
|
help="API target environment (dev, qa, or prod; default: prod)",
|
|
144
194
|
)
|
|
195
|
+
@click.option(
|
|
196
|
+
"--tenant",
|
|
197
|
+
type=str,
|
|
198
|
+
envvar="DXS_TENANT",
|
|
199
|
+
default=None,
|
|
200
|
+
help="Run as a specific logged-in identity for this command only "
|
|
201
|
+
"(org name, Entra domain, tenant ID, or username). See 'dxs auth list'.",
|
|
202
|
+
)
|
|
145
203
|
@click.option(
|
|
146
204
|
"-O",
|
|
147
205
|
"--output",
|
|
@@ -215,6 +273,7 @@ def cli(
|
|
|
215
273
|
branch: int | None,
|
|
216
274
|
repo: int | None,
|
|
217
275
|
target: str | None,
|
|
276
|
+
tenant: str | None,
|
|
218
277
|
output_format: str | None,
|
|
219
278
|
verbose: bool,
|
|
220
279
|
quiet: bool,
|
|
@@ -232,10 +291,12 @@ def cli(
|
|
|
232
291
|
|
|
233
292
|
\b
|
|
234
293
|
Examples:
|
|
294
|
+
dxs init
|
|
235
295
|
dxs auth login
|
|
236
296
|
dxs source log --repo 10
|
|
237
297
|
dxs source history userGrid --branch 100
|
|
238
298
|
dxs config list
|
|
299
|
+
dxs --tenant MGD schema entities # run one command as another identity
|
|
239
300
|
|
|
240
301
|
\b
|
|
241
302
|
Environment Variables:
|
|
@@ -244,6 +305,7 @@ def cli(
|
|
|
244
305
|
DXS_BRANCH Default branch ID
|
|
245
306
|
DXS_REPO Default repository ID
|
|
246
307
|
DXS_TARGET API target environment (dev, qa, prod)
|
|
308
|
+
DXS_TENANT Identity to run as (see --tenant)
|
|
247
309
|
|
|
248
310
|
\b
|
|
249
311
|
Configuration:
|
|
@@ -258,12 +320,7 @@ def cli(
|
|
|
258
320
|
|
|
259
321
|
# Set API base URL based on target environment
|
|
260
322
|
if target:
|
|
261
|
-
|
|
262
|
-
"dev": "https://dev.wavelength.host/api",
|
|
263
|
-
"qa": "https://qa.wavelength.host/api",
|
|
264
|
-
"prod": "https://wavelength.host/api",
|
|
265
|
-
}
|
|
266
|
-
os.environ["DXS_API_BASE_URL"] = target_urls[target.lower()]
|
|
323
|
+
os.environ["DXS_API_BASE_URL"] = resolve_target_url(target)
|
|
267
324
|
|
|
268
325
|
# Load settings
|
|
269
326
|
settings = get_settings()
|
|
@@ -288,6 +345,17 @@ def cli(
|
|
|
288
345
|
dxs_ctx.output_format = OutputFormat(settings.default_output_format.lower())
|
|
289
346
|
set_last_output_format(dxs_ctx.output_format)
|
|
290
347
|
|
|
348
|
+
# Pin identity resolution for this invocation only (never persisted).
|
|
349
|
+
# Deliberately after output-format resolution so a bad selector renders as
|
|
350
|
+
# a normal error envelope rather than a bare traceback.
|
|
351
|
+
if tenant:
|
|
352
|
+
try:
|
|
353
|
+
_apply_tenant_override(tenant)
|
|
354
|
+
except DxsError as e:
|
|
355
|
+
dxs_ctx.output_error(e)
|
|
356
|
+
ctx.exit(1)
|
|
357
|
+
dxs_ctx.tenant = tenant
|
|
358
|
+
|
|
291
359
|
# Set verbosity (--verbose enables debug output, --quiet suppresses progress)
|
|
292
360
|
dxs_ctx.verbose = verbose
|
|
293
361
|
if quiet_src == click.core.ParameterSource.COMMANDLINE:
|
|
@@ -428,6 +496,7 @@ def register_commands() -> None:
|
|
|
428
496
|
endpoint,
|
|
429
497
|
env,
|
|
430
498
|
function,
|
|
499
|
+
init,
|
|
431
500
|
marketplace,
|
|
432
501
|
odata,
|
|
433
502
|
organization,
|
|
@@ -440,6 +509,7 @@ def register_commands() -> None:
|
|
|
440
509
|
|
|
441
510
|
cli.add_command(api.api)
|
|
442
511
|
cli.add_command(auth.auth)
|
|
512
|
+
cli.add_command(init.init)
|
|
443
513
|
cli.add_command(config.config)
|
|
444
514
|
cli.add_command(config.config, name="settings")
|
|
445
515
|
cli.add_command(configuration.configuration)
|