mammoth-cli 2.2.96__tar.gz → 2.2.98__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.
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/PKG-INFO +2 -2
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/__init__.py +1 -1
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/app.py +22 -1
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +1 -1
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-embed.md +1 -1
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +1 -1
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +1 -1
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/dashboard.py +21 -3
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/file.py +15 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/schema.py +16 -2
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view/export.py +2 -1
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view_ops.py +7 -27
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/workspace.py +9 -4
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/errors/envelope.py +2 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/output/normalize.py +3 -1
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/invocation.py +3 -0
- mammoth_cli-2.2.98/mammoth_cli/runtime/reveal.py +21 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/strict.py +3 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/verify.py +8 -2
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/argspec.py +5 -1
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/input_fields.py +7 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/mapping.py +44 -1
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/pyproject.toml +2 -2
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/dashboard.yaml +3 -3
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/view.yaml +2 -2
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/compiled/commands.json +3 -3
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/compiled/sdk-methods.json +1 -1
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/sdk-methods.yaml +1 -1
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/.gitignore +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/LICENSE +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/README.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/__main__.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capabilities.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/collection.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-published.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-template.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/how.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/link.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/resolve.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/run.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/token.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/database-import.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/file-import.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/rest-api-import.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/__init__.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/_lazy.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/activity.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/addon.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/agent.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/ai.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/annotation.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/auth.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/automation.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/batch.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/billing.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/browse.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/calc.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/capabilities.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/capability.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/client_app.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/completion.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/config.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/connector.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/context.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/dataset.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/doctor.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/external_key.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/folder.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/help_summaries.json +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/how.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/job.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/link.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/notification.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/parameter.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/project.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/registry.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/report.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/resolve.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/run.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/schedule.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/skill.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/snippet.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/support.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/template.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/trash.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/upgrade.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/user.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view/__init__.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view/_common.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view/aggregate.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view/checks.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view/column_checks.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view/columns.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view/data_read.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view/derivatives.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view/explore.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view/export_dataset.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view/export_specialized.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view/formatting.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view/join_check.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view/lifecycle.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view/listing.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view/pipeline.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view/settle.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view/upload.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view_drivers.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view_explore.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view_forecast.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/view_profile.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/webhook.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/commands/workflow.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/context/__init__.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/context/credentials.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/context/endpoint.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/context/keyring_backend.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/context/oauth.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/context/oauth_loopback.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/context/profiles.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/context/resolver.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/contracts/__init__.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/contracts/auth.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/discovery/__init__.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/discovery/limitations.json +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/discovery/next_commands.json +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/discovery/recipes.json +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/embed.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/errors/__init__.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/manifest/__init__.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/manifest/loader.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/messages/__init__.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/output/__init__.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/output/envelope.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/output/policy.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/output/progress.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/output/render.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/py.typed +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/__init__.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/compact.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/confirm.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/dataset_health.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/dryrun.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/dryrun_targets.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/embed_pool.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/embedded.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/executor.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/input_loader.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/intent_only.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/labels.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/linecapture.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/local_paths.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/locked_files.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/new_data.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/next_commands.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/opens.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/options.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/parents.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/runlog.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/session.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/shared.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/state.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/token_scope.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/updates.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/validate.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/runtime/view_dataset_cache.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/__init__.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/append_blank_columns.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/board_values.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/coerce.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/column_type_guard.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/command_contract.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/conditional_format.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/conditions.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/dashboard_figures.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/dashboard_filters.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/dashboard_pages.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/dashboard_review.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/data_profile.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/data_quality.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/delete_check.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/dispatch.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/explore_card_edit.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/explore_cards.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/explore_to_figure.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/explore_to_image.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/factory.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/field_enums.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/folder_ids.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/held_change.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/job_outcome.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/listing.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/local_files.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/local_time.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/openapi_types.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/paging.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/period_analysis.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/poll.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/positionals.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/protocol.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/read_memo.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/read_queries.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/schema_diff.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/sdk_service.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/sql_check.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/stored_stats.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/suggest.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/testing.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/text_dates.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/type_system.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/view_analysis.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/view_variants.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/services/write_impact.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/skills/__init__.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/skills/installer.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/skills/steering.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/mammoth_cli/testing.py +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/activity.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/addon.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/agent.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/ai.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/annotation.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/auth.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/automation.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/batch.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/billing.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/browse.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/calc.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/capabilities.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/capability.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/client-app.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/collection.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/completion.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/config.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/connector.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/context.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/dataset.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/doctor.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/external-key.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/file.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/folder.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/how.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/job.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/link.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/log.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/notification.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/parameter.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/project.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/report.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/resolve.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/run.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/schedule.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/schema.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/skill.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/snippet.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/support.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/template.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/token.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/trash.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/upgrade.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/user.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/version.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/webhook.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/workflow.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/commands/workspace.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/compiled/openapi-operations.json +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/edits-target.source.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/openapi-operations.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/schema-v1.json +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/sdk-catalog.source.yaml +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/manifests/server-status.json +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/openapi/metadata.json +0 -0
- {mammoth_cli-2.2.96 → mammoth_cli-2.2.98}/spec/openapi/openapi.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mammoth-cli
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.98
|
|
4
4
|
Summary: Command-line interface for the Mammoth Analytics platform
|
|
5
5
|
Project-URL: homepage, https://mammoth.io
|
|
6
6
|
Project-URL: repository, https://github.com/EdgeMetric/mammothsdk
|
|
@@ -19,7 +19,7 @@ Requires-Python: <3.15,>=3.12
|
|
|
19
19
|
Requires-Dist: certifi>=2026.10.19
|
|
20
20
|
Requires-Dist: jsonschema>=4.20
|
|
21
21
|
Requires-Dist: keyring<26,>=25.7
|
|
22
|
-
Requires-Dist: mammoth-io<0.9,>=0.8.
|
|
22
|
+
Requires-Dist: mammoth-io<0.9,>=0.8.50
|
|
23
23
|
Requires-Dist: platformdirs<5,>=4.10
|
|
24
24
|
Requires-Dist: pydantic<3,>=2.12.5
|
|
25
25
|
Requires-Dist: pyyaml<7,>=6
|
|
@@ -1209,6 +1209,7 @@ def _execute(invocation: Invocation) -> None:
|
|
|
1209
1209
|
from mammoth_cli.runtime.new_data import with_new_data_path
|
|
1210
1210
|
from mammoth_cli.runtime.next_commands import with_next_commands
|
|
1211
1211
|
from mammoth_cli.runtime.opens import with_opens
|
|
1212
|
+
from mammoth_cli.runtime.reveal import REVEAL_COMMANDS, REVEAL_FLAG
|
|
1212
1213
|
from mammoth_cli.runtime.strict import validate_extra_args
|
|
1213
1214
|
|
|
1214
1215
|
if invocation.profile is None:
|
|
@@ -1219,6 +1220,12 @@ def _execute(invocation: Invocation) -> None:
|
|
|
1219
1220
|
extra_args=[arg for arg in invocation.extra_args if arg != FULL_FLAG],
|
|
1220
1221
|
full_output=True,
|
|
1221
1222
|
)
|
|
1223
|
+
if invocation.command_id in REVEAL_COMMANDS and REVEAL_FLAG in invocation.extra_args:
|
|
1224
|
+
invocation = replace(
|
|
1225
|
+
invocation,
|
|
1226
|
+
extra_args=[arg for arg in invocation.extra_args if arg != REVEAL_FLAG],
|
|
1227
|
+
reveal_secrets=True,
|
|
1228
|
+
)
|
|
1222
1229
|
|
|
1223
1230
|
def producer() -> tuple[Any, dict[str, Any]]:
|
|
1224
1231
|
refuse_hand_crafted_write(invocation.command_id)
|
|
@@ -1508,6 +1515,13 @@ def _command_help(command_id: str, record: dict[str, Any] | None) -> str | None:
|
|
|
1508
1515
|
"The result is compact: ids, checks, verify and a canvas summary. "
|
|
1509
1516
|
f"Pass {FULL_FLAG} for the complete response."
|
|
1510
1517
|
)
|
|
1518
|
+
from mammoth_cli.runtime.reveal import REVEAL_COMMANDS, REVEAL_FLAG
|
|
1519
|
+
|
|
1520
|
+
if command_id in REVEAL_COMMANDS:
|
|
1521
|
+
parts.append(
|
|
1522
|
+
"The credential in the result is masked. Pass "
|
|
1523
|
+
f"{REVEAL_FLAG} to print it; it is shown only once."
|
|
1524
|
+
)
|
|
1511
1525
|
return "\n\n".join(parts) or None
|
|
1512
1526
|
|
|
1513
1527
|
|
|
@@ -1546,7 +1560,14 @@ def _short_type(type_name: str) -> str:
|
|
|
1546
1560
|
if "condition." in text:
|
|
1547
1561
|
return "condition"
|
|
1548
1562
|
# Drop each dotted module path but keep the brackets around it (``list[a.b.C]``).
|
|
1549
|
-
|
|
1563
|
+
text = re.sub(r"(?:\w+\.)+(\w+)", r"\1", " | ".join(p.strip() for p in text.split("|")))
|
|
1564
|
+
if len(text) <= _SHORT_TYPE_MAX:
|
|
1565
|
+
return text
|
|
1566
|
+
# Cut at a word, never inside one: a clipped value ('par) reads as a real one.
|
|
1567
|
+
return text[: _SHORT_TYPE_MAX - 4].rsplit(" ", 1)[0] + " ..."
|
|
1568
|
+
|
|
1569
|
+
|
|
1570
|
+
_SHORT_TYPE_MAX = 60
|
|
1550
1571
|
|
|
1551
1572
|
|
|
1552
1573
|
def _command_records() -> list[dict[str, Any]]:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: mammoth-cli
|
|
3
|
-
version: 2.2.
|
|
3
|
+
version: 2.2.98
|
|
4
4
|
description: "Use Mammoth Analytics from a terminal: install or authenticate the CLI, discover its live command contract, and safely manage projects, data, views, pipelines (join, merge, pivot, filter, clean), dashboards, exports, and handoffs."
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -36,7 +36,7 @@ Status on release: untried; no live run recorded.
|
|
|
36
36
|
|
|
37
37
|
Run: `mammoth dashboard embed lifetime set`. Exact input fields: `mammoth schema get dashboard.embed.lifetime.set`.
|
|
38
38
|
|
|
39
|
-
Example: `mammoth dashboard embed lifetime set 123 --input '{"token_ttl":
|
|
39
|
+
Example: `mammoth dashboard embed lifetime set 123 --input '{"token_ttl": 900}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
40
40
|
|
|
41
41
|
Result: `DashboardEmbedLifetimeSetResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
|
|
42
42
|
|
|
@@ -638,7 +638,7 @@ Run: `mammoth dashboard live-chart create`. Exact input fields: `mammoth schema
|
|
|
638
638
|
|
|
639
639
|
Example: `mammoth dashboard live-chart create --input '{"body": {"params": {"view_id": 1, "figure": {}, "title": "Revenue report"}}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
640
640
|
|
|
641
|
-
Result: `DashboardLiveChartCreateResult`; mutation `benign_mutation`, confirmation `none`, wait policy `
|
|
641
|
+
Result: `DashboardLiveChartCreateResult`; mutation `benign_mutation`, confirmation `none`, wait policy `start_or_wait`.
|
|
642
642
|
|
|
643
643
|
Status on release: untried; no live run recorded.
|
|
644
644
|
|
|
@@ -570,7 +570,7 @@ Status on release: ran once on CLI 2.0.14 — write sweep 2026-09-18: exit 0 on
|
|
|
570
570
|
|
|
571
571
|
Run: `mammoth view export download`. Exact input fields: `mammoth schema get view.export.download`.
|
|
572
572
|
|
|
573
|
-
Example: `mammoth view export download 123`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
573
|
+
Example: `mammoth view export download 123 --input '{"file_type": "xml"}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
574
574
|
|
|
575
575
|
Result: `ViewExportDownloadResult`; mutation `benign_mutation`, confirmation `none`, wait policy `always_wait`.
|
|
576
576
|
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"""Handlers for the ``dashboard`` command family (workspace-scoped, no project).
|
|
2
2
|
|
|
3
3
|
Dashboards are identified either by an integer ``dashboard_id`` (most commands)
|
|
4
|
-
or by a share ``url`` slug (the ``*-by-url`` commands).
|
|
5
|
-
|
|
4
|
+
or by a share ``url`` slug (the ``*-by-url`` commands). The few backing SDK
|
|
5
|
+
methods that take a ``project_id`` (a new board's project) get an explicit
|
|
6
|
+
``--project``; no other handler resolves or forwards one.
|
|
6
7
|
Every handler dispatches through the generic
|
|
7
8
|
:meth:`~mammoth_cli.services.protocol.MammothService.call` seam to the public
|
|
8
9
|
SDK method named by the command's reviewed manifest ``sdk_symbol``.
|
|
@@ -15,6 +16,7 @@ from pathlib import Path
|
|
|
15
16
|
from typing import Any, Literal, cast
|
|
16
17
|
|
|
17
18
|
from mammoth.api import agents as agents_api
|
|
19
|
+
from mammoth.api import dashboards as dashboards_api
|
|
18
20
|
from mammoth.exceptions import MammothValidationError
|
|
19
21
|
from pydantic import ValidationError
|
|
20
22
|
|
|
@@ -31,6 +33,7 @@ from mammoth_cli.errors.envelope import (
|
|
|
31
33
|
CliError,
|
|
32
34
|
)
|
|
33
35
|
from mammoth_cli.manifest.loader import command_by_id
|
|
36
|
+
from mammoth_cli.output.normalize import Revealed, normalize
|
|
34
37
|
from mammoth_cli.runtime import embedded, parents
|
|
35
38
|
from mammoth_cli.runtime.confirm import (
|
|
36
39
|
POLICY_CONFIRM_TARGET,
|
|
@@ -40,6 +43,7 @@ from mammoth_cli.runtime.confirm import (
|
|
|
40
43
|
enforce_confirmation,
|
|
41
44
|
)
|
|
42
45
|
from mammoth_cli.runtime.invocation import Invocation
|
|
46
|
+
from mammoth_cli.runtime.reveal import REVEAL_COMMANDS
|
|
43
47
|
from mammoth_cli.runtime.session import open_service, require_project, resolved_project
|
|
44
48
|
from mammoth_cli.services.argspec import arg_spec
|
|
45
49
|
from mammoth_cli.services.board_values import board_values, dashboard_link
|
|
@@ -896,6 +900,7 @@ _SDK_RULES: dict[str, Callable[[dict[str, Any]], None]] = {
|
|
|
896
900
|
"agent.turn.rate": lambda k: agents_api.check_rating(
|
|
897
901
|
str(k.get("rating") or ""), k.get("comment")
|
|
898
902
|
),
|
|
903
|
+
"dashboard.embed.lifetime.set": lambda k: dashboards_api.check_token_ttl(k.get("token_ttl")),
|
|
899
904
|
}
|
|
900
905
|
|
|
901
906
|
#: What the confirmation (and its refusal) names, where the command id alone would hide
|
|
@@ -924,6 +929,8 @@ _HANDLE_KEPT = frozenset(
|
|
|
924
929
|
"dashboard.figure.rows",
|
|
925
930
|
"dashboard.published.drill",
|
|
926
931
|
"dashboard.published.rows",
|
|
932
|
+
# The bake job's result does not name the chart; the handle's dashboard_id does.
|
|
933
|
+
"dashboard.live-chart.create",
|
|
927
934
|
}
|
|
928
935
|
)
|
|
929
936
|
|
|
@@ -990,6 +997,15 @@ def generated_dashboard(invocation: Invocation) -> HandlerResult:
|
|
|
990
997
|
)
|
|
991
998
|
|
|
992
999
|
_check_sdk_rules(invocation.command_id, kwargs)
|
|
1000
|
+
if (
|
|
1001
|
+
invocation.project is not None
|
|
1002
|
+
and spec is not None
|
|
1003
|
+
and "project_id" not in kwargs
|
|
1004
|
+
and any(field.name == "project_id" for field in spec.fields)
|
|
1005
|
+
):
|
|
1006
|
+
# ``--project`` names the project a new board belongs to (live-chart create,
|
|
1007
|
+
# template apply, v3 generate); without it the server picks the source's.
|
|
1008
|
+
kwargs["project_id"] = invocation.project
|
|
993
1009
|
|
|
994
1010
|
policy = str(record.get("confirmation") or POLICY_NONE)
|
|
995
1011
|
target = next((str(value) for value in positionals.values()), None)
|
|
@@ -1005,7 +1021,7 @@ def generated_dashboard(invocation: Invocation) -> HandlerResult:
|
|
|
1005
1021
|
invocation, policy=policy, action=action, target=str(auth.workspace_id)
|
|
1006
1022
|
)
|
|
1007
1023
|
data = service.call(_symbol(invocation), **kwargs)
|
|
1008
|
-
handle = data
|
|
1024
|
+
handle = data.model_dump(mode="json") if hasattr(data, "model_dump") else data
|
|
1009
1025
|
data = _resolve_job(service, invocation, data)
|
|
1010
1026
|
if invocation.command_id in _HANDLE_KEPT and isinstance(handle, dict):
|
|
1011
1027
|
# The job's results are keyed by descriptor id; the handle says which
|
|
@@ -1019,6 +1035,8 @@ def generated_dashboard(invocation: Invocation) -> HandlerResult:
|
|
|
1019
1035
|
if invocation.command_id in _VALUED_COMMANDS:
|
|
1020
1036
|
data = _with_board_values(service, auth, positionals, data)
|
|
1021
1037
|
forget(service)
|
|
1038
|
+
if invocation.reveal_secrets and invocation.command_id in REVEAL_COMMANDS:
|
|
1039
|
+
data = Revealed(normalize(data, redact_secrets=False))
|
|
1022
1040
|
return data, _meta(invocation, auth.workspace_id)
|
|
1023
1041
|
|
|
1024
1042
|
|
|
@@ -464,6 +464,15 @@ def _dataset_status(service: Any, dataset_id: int) -> tuple[str, dict[str, Any]
|
|
|
464
464
|
)
|
|
465
465
|
|
|
466
466
|
|
|
467
|
+
#: An upload whose job finished without making any dataset.
|
|
468
|
+
NO_DATASET_STATUS = "no_dataset"
|
|
469
|
+
_NO_DATASET_MESSAGE = (
|
|
470
|
+
"The file was uploaded but no dataset was made from it. A PDF waits in the file list "
|
|
471
|
+
"as action_needed until its tables are extracted, which the CLI cannot do yet; do that "
|
|
472
|
+
"in the Mammoth app. Do not upload the file again."
|
|
473
|
+
)
|
|
474
|
+
|
|
475
|
+
|
|
467
476
|
def _upload_result(
|
|
468
477
|
value: Any, read_status: Callable[[int], tuple[str, dict[str, Any] | None, str | None]]
|
|
469
478
|
) -> dict[str, Any]:
|
|
@@ -505,6 +514,12 @@ def _upload_result(
|
|
|
505
514
|
result: dict[str, Any] = {"status": overall, "dataset_ids": ids, "datasets": datasets}
|
|
506
515
|
if len(ids) == 1:
|
|
507
516
|
result["dataset_id"] = ids[0]
|
|
517
|
+
if not ids:
|
|
518
|
+
# A PDF ends the upload job in ``action_needed`` with no dataset: its
|
|
519
|
+
# tables must be picked first (#255), so nothing here is ready.
|
|
520
|
+
result["status"] = NO_DATASET_STATUS
|
|
521
|
+
result["message"] = _NO_DATASET_MESSAGE
|
|
522
|
+
result["next_command"] = "mammoth file list"
|
|
508
523
|
return result
|
|
509
524
|
|
|
510
525
|
|
|
@@ -723,7 +723,16 @@ _COMMAND_DISCOVERY_PURPOSES = {
|
|
|
723
723
|
"workflow.save-cancel-step": "cancel one step of a running workflow save stop a save step",
|
|
724
724
|
"view.export.runs": "export run history past runs of an export rows sent errors when it ran",
|
|
725
725
|
"view.export.rest-fill": "propose REST API export settings from an API docs page url",
|
|
726
|
-
"
|
|
726
|
+
"workspace.user.list": (
|
|
727
|
+
"list users members of the workspace or of one project with --project, their roles "
|
|
728
|
+
"and status, who has access, my role in a project"
|
|
729
|
+
),
|
|
730
|
+
# What was done to the view and what depends on it; column statistics are
|
|
731
|
+
# ``view data profile``.
|
|
732
|
+
"view.summary": (
|
|
733
|
+
"summary of what a dataview has had done to it and where it goes: pipeline steps "
|
|
734
|
+
"actions exports dashboards dependencies downstream, row and column counts"
|
|
735
|
+
),
|
|
727
736
|
"workspace.export-hosts.get": "hosts exports may send data to allowed export hosts policy",
|
|
728
737
|
"workspace.export-hosts.set": "restrict or allow the hosts exports may send data to",
|
|
729
738
|
"dashboard.email-updates.list": "email updates on dashboards I subscribe to in the workspace",
|
|
@@ -1228,11 +1237,16 @@ def _accepted_fields(record: dict[str, Any]) -> list[dict[str, Any]] | None:
|
|
|
1228
1237
|
tuple(str(item) for item in record.get("operation_ids", []))
|
|
1229
1238
|
)
|
|
1230
1239
|
path_fields = local_path_fields(record["command_id"], record.get("positionals", []))
|
|
1240
|
+
# A field an optional positional fills (``view summary VIEW_ID [DATASET_ID]``) is
|
|
1241
|
+
# resolved by the command when both are omitted, as the input schema says.
|
|
1242
|
+
fallbacks = {
|
|
1243
|
+
item.falls_back_to_field for item in contract.positionals if item.falls_back_to_field
|
|
1244
|
+
}
|
|
1231
1245
|
return [
|
|
1232
1246
|
{
|
|
1233
1247
|
"name": field.name,
|
|
1234
1248
|
"type": field.type_name,
|
|
1235
|
-
"required": field.required,
|
|
1249
|
+
"required": field.required and field.name not in fallbacks,
|
|
1236
1250
|
"enum": field.enum_values,
|
|
1237
1251
|
"default": field.default_value if field.has_default else None,
|
|
1238
1252
|
"schema": (
|
|
@@ -87,7 +87,7 @@ def view_export_csv(invocation: Invocation) -> HandlerResult:
|
|
|
87
87
|
def view_export_download(invocation: Invocation) -> HandlerResult:
|
|
88
88
|
"""Download a dataview to a local file as csv, xlsx, json, ndjson, xml, yaml or parquet.
|
|
89
89
|
|
|
90
|
-
Same as ``view export csv`` otherwise: ``--input '{"
|
|
90
|
+
Same as ``view export csv`` otherwise: ``--input '{"file_type": "xlsx", "output_path":
|
|
91
91
|
"out.xlsx"}'``; the default name carries the format's extension; an existing file is not
|
|
92
92
|
replaced unless ``--overwrite``; embedded, the signed download URL is returned instead.
|
|
93
93
|
"""
|
|
@@ -251,6 +251,7 @@ def view_export_rest_fill(invocation: Invocation) -> HandlerResult:
|
|
|
251
251
|
|
|
252
252
|
Mammoth's server fetches ``docs_url`` and reads it to propose the form values (never
|
|
253
253
|
credentials). Nothing is configured or sent: the result is a suggestion to review.
|
|
254
|
+
It always waits for the job, for at most ``--job-timeout`` seconds.
|
|
254
255
|
"""
|
|
255
256
|
project_id = require_project(invocation)
|
|
256
257
|
dataview_id = _require_int_positional_at(invocation, 0, "dataview id")
|
|
@@ -369,7 +369,6 @@ def _dispatch_view(
|
|
|
369
369
|
prepare: Callable[[Any, int, dict[str, Any]], Any] | None = None,
|
|
370
370
|
reduces_rows: bool = False,
|
|
371
371
|
waits_for_run: bool = False,
|
|
372
|
-
apply_draft: bool = False,
|
|
373
372
|
**kwargs: Any,
|
|
374
373
|
) -> HandlerResult:
|
|
375
374
|
"""Open the service, dispatch a View method call, and build the envelope.
|
|
@@ -378,10 +377,8 @@ def _dispatch_view(
|
|
|
378
377
|
then waits for that task's own run to finish (see
|
|
379
378
|
:func:`wait_for_added_task_run`) before ``after`` and the read-back, and
|
|
380
379
|
carries that run as ``run``; a pipeline definition reading ``ready`` is not
|
|
381
|
-
proof the task ran.
|
|
382
|
-
|
|
383
|
-
wait is on the added task's own run. A draft that already held other staged
|
|
384
|
-
steps is left staged, because submitting would run steps the caller never named.
|
|
380
|
+
proof the task ran. A step staged in draft mode is never submitted here and has
|
|
381
|
+
no run to wait on: the draft stays the user's to submit.
|
|
385
382
|
|
|
386
383
|
``before(service, dataset_id)`` runs ahead of the call and its value is
|
|
387
384
|
handed to ``after(service, dataset_id, state, data)``, which returns the
|
|
@@ -438,11 +435,6 @@ def _dispatch_view(
|
|
|
438
435
|
if waits_for_run and dataset_id is not None
|
|
439
436
|
else None
|
|
440
437
|
)
|
|
441
|
-
held_steps = (
|
|
442
|
-
_draft_has_pending_changes(service, view_id)
|
|
443
|
-
if apply_draft and dataset_id is not None
|
|
444
|
-
else True
|
|
445
|
-
)
|
|
446
438
|
rows_before = (
|
|
447
439
|
_view_row_count(service, int(dataset_id), view_id, invocation.project)
|
|
448
440
|
if auto_row_check and dataset_id is not None
|
|
@@ -482,11 +474,6 @@ def _dispatch_view(
|
|
|
482
474
|
parents.remember(
|
|
483
475
|
_profile_name(invocation), auth.workspace_id, {view_id: int(dataset_id)}
|
|
484
476
|
)
|
|
485
|
-
if apply_draft and not held_steps and dataset_id is not None and _is_staged(data):
|
|
486
|
-
service.call_view(view_id, "submit_draft", dataset_id=int(dataset_id))
|
|
487
|
-
data = {key: value for key, value in data.items() if key != "message"}
|
|
488
|
-
data["status"] = "done"
|
|
489
|
-
data["draft_applied"] = True
|
|
490
477
|
settled = _settled_write(service, data) if dataset_id is not None else None
|
|
491
478
|
if settled is not None:
|
|
492
479
|
_forget_reads(service) # the state read-back must see the view as the write left it
|
|
@@ -695,12 +682,6 @@ def _is_staged(data: Any) -> bool:
|
|
|
695
682
|
return isinstance(data, dict) and data.get("status") == "staged"
|
|
696
683
|
|
|
697
684
|
|
|
698
|
-
def _draft_has_pending_changes(service: Any, view_id: int) -> bool:
|
|
699
|
-
"""Whether the view's draft already holds staged steps (``False`` outside draft mode)."""
|
|
700
|
-
status = service.call(_DRAFT_STATUS_SYMBOL, dataview_id=view_id)
|
|
701
|
-
return bool(status.get("has_pending_changes")) if isinstance(status, dict) else False
|
|
702
|
-
|
|
703
|
-
|
|
704
685
|
def _mark_staged_in_draft(service: Any, dataset_id: int, view_id: int, data: Any) -> Any:
|
|
705
686
|
"""Answer ``status: staged`` for a write the SDK did not already stage.
|
|
706
687
|
|
|
@@ -2215,8 +2196,8 @@ def _keep_data(service: Any, dataset_id: int, state: Any, data: Any) -> Any:
|
|
|
2215
2196
|
def view_transform_update_column(invocation: Invocation) -> HandlerResult:
|
|
2216
2197
|
"""Overwrite a column with a math expression in one call; ``column``, ``expression`` required.
|
|
2217
2198
|
|
|
2218
|
-
``view transform math`` with ``existing_column``,
|
|
2219
|
-
|
|
2199
|
+
``view transform math`` with ``existing_column``, with the result waiting on
|
|
2200
|
+
its own task's run (a step staged in draft mode stays staged).
|
|
2220
2201
|
"""
|
|
2221
2202
|
view_id = _view_id(invocation)
|
|
2222
2203
|
document = invocation.load_input()
|
|
@@ -2228,7 +2209,7 @@ def view_transform_update_column(invocation: Invocation) -> HandlerResult:
|
|
|
2228
2209
|
"existing_column": column,
|
|
2229
2210
|
}
|
|
2230
2211
|
return _math_into_column(
|
|
2231
|
-
invocation, view_id, math_document, after=_keep_data, waits_for_run=True
|
|
2212
|
+
invocation, view_id, math_document, after=_keep_data, waits_for_run=True
|
|
2232
2213
|
)
|
|
2233
2214
|
|
|
2234
2215
|
|
|
@@ -2239,8 +2220,8 @@ _FIRST_WORD_PATTERN = r"^\S+"
|
|
|
2239
2220
|
def view_transform_first_name(invocation: Invocation) -> HandlerResult:
|
|
2240
2221
|
"""Extract the first word of a text column, in one call. ``column`` is required.
|
|
2241
2222
|
|
|
2242
|
-
``view transform substring`` with the first-word regex, with the same
|
|
2243
|
-
|
|
2223
|
+
``view transform substring`` with the first-word regex, with the same own-task
|
|
2224
|
+
wait as ``view transform update-column``.
|
|
2244
2225
|
"""
|
|
2245
2226
|
view_id = _view_id(invocation)
|
|
2246
2227
|
document = invocation.load_input()
|
|
@@ -2256,7 +2237,6 @@ def view_transform_first_name(invocation: Invocation) -> HandlerResult:
|
|
|
2256
2237
|
"substring",
|
|
2257
2238
|
after=_keep_data,
|
|
2258
2239
|
waits_for_run=True,
|
|
2259
|
-
apply_draft=True,
|
|
2260
2240
|
**kwargs,
|
|
2261
2241
|
)
|
|
2262
2242
|
|
|
@@ -202,9 +202,11 @@ def workspace_get(invocation: Invocation) -> HandlerResult:
|
|
|
202
202
|
def workspace_list(invocation: Invocation) -> HandlerResult:
|
|
203
203
|
"""List accessible workspaces."""
|
|
204
204
|
document = invocation.load_input() or {}
|
|
205
|
-
|
|
205
|
+
kwargs: dict[str, Any] = {"limit": int(document.get("limit", 100))}
|
|
206
|
+
if document.get("fields") is not None:
|
|
207
|
+
kwargs["fields"] = str(document["fields"])
|
|
206
208
|
with open_service(invocation) as (service, auth):
|
|
207
|
-
data = service.call(_symbol(invocation),
|
|
209
|
+
data = service.call(_symbol(invocation), **kwargs)
|
|
208
210
|
return data, _meta(invocation, auth.workspace_id)
|
|
209
211
|
|
|
210
212
|
|
|
@@ -353,11 +355,14 @@ def workspace_user_list(invocation: Invocation) -> HandlerResult:
|
|
|
353
355
|
"""List users in the client's own workspace, with their roles and status.
|
|
354
356
|
|
|
355
357
|
Asks for the backend's ``__full`` field set unless ``--input`` names another,
|
|
356
|
-
so each user carries ``user_roles`` and ``status``.
|
|
358
|
+
so each user carries ``user_roles`` and ``status``. An explicit ``--project``
|
|
359
|
+
keeps only that project's members (a saved default project does not).
|
|
357
360
|
"""
|
|
358
361
|
document = invocation.load_input() or {}
|
|
359
362
|
kwargs: dict[str, Any] = {"fields": _USER_LIST_FIELDS}
|
|
360
|
-
_forward_optional(document, kwargs, ("fields",
|
|
363
|
+
_forward_optional(document, kwargs, ("fields",))
|
|
364
|
+
if invocation.project is not None:
|
|
365
|
+
kwargs["project_id"] = invocation.project
|
|
361
366
|
with open_service(invocation) as (service, auth):
|
|
362
367
|
data = service.call(_symbol(invocation), **kwargs)
|
|
363
368
|
return data, _meta(invocation, auth.workspace_id)
|
|
@@ -59,6 +59,7 @@ CODE_CONFIRMATION_REQUIRED = "confirmation_required"
|
|
|
59
59
|
CODE_CONFIRMATION_DECLINED = "confirmation_declined"
|
|
60
60
|
CODE_AUTHENTICATION_FAILED = "authentication_failed"
|
|
61
61
|
CODE_AUTHORIZATION_REQUIRED = "authorization_required"
|
|
62
|
+
CODE_PLAN_LIMIT = "plan_limit"
|
|
62
63
|
CODE_CONFLICT = "conflict"
|
|
63
64
|
CODE_RETRYABLE = "retryable_error"
|
|
64
65
|
CODE_OUTCOME_UNKNOWN = "outcome_unknown"
|
|
@@ -111,6 +112,7 @@ ERROR_SUMMARIES: dict[str, str] = {
|
|
|
111
112
|
"feature_unavailable": "Mammoth no longer offers this feature.",
|
|
112
113
|
"export_failed": "The export ran but ended in an error.",
|
|
113
114
|
"export_not_found": "No export run was found for that request.",
|
|
115
|
+
"plan_limit": "The workspace's plan or usage limit doesn't allow this.",
|
|
114
116
|
"pin_not_recorded": "The version pin could not be saved, so nothing was changed.",
|
|
115
117
|
"has_dependents": "Other items still depend on this, so it was not deleted.",
|
|
116
118
|
"delete_not_applied": "The delete was accepted but the item is still there.",
|
|
@@ -223,7 +223,9 @@ def normalize(value: Any, *, redact_secrets: bool = True) -> Any:
|
|
|
223
223
|
result: dict[str, Any] = {}
|
|
224
224
|
for key in sorted(value, key=str):
|
|
225
225
|
str_key = str(key)
|
|
226
|
-
|
|
226
|
+
# A boolean (``has_signing_secret``) only says whether a credential
|
|
227
|
+
# exists; it never is one.
|
|
228
|
+
if redact_secrets and _is_secret_key(str_key) and not isinstance(value[key], bool):
|
|
227
229
|
result[str_key] = REDACTED
|
|
228
230
|
else:
|
|
229
231
|
result[str_key] = normalize(value[key], redact_secrets=redact_secrets)
|
|
@@ -91,6 +91,9 @@ class Invocation:
|
|
|
91
91
|
#: ``--full`` on a compacted dashboard write: return the whole response
|
|
92
92
|
#: (:mod:`mammoth_cli.runtime.compact`).
|
|
93
93
|
full_output: bool = False
|
|
94
|
+
#: ``--reveal`` on a command that returns a once-shown credential: print it
|
|
95
|
+
#: unmasked (:mod:`mammoth_cli.runtime.reveal`).
|
|
96
|
+
reveal_secrets: bool = False
|
|
94
97
|
#: ``last_modified_time`` of each export on the view, read before a pipeline write;
|
|
95
98
|
#: verify waits for one to move (the backend re-validates exports after the run).
|
|
96
99
|
exports_before: dict[int, str] | None = field(default=None, repr=False, compare=False)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""``--reveal`` on the commands whose result is a credential the API shows once.
|
|
2
|
+
|
|
3
|
+
``dashboard embed secret rotate`` returns the new workspace signing secret and
|
|
4
|
+
``dashboard embed preview-token create`` a token for the embed simulator. Key
|
|
5
|
+
redaction masks both (``secret``, ``token``), which leaves a rotation with no
|
|
6
|
+
usable secret. They stay masked by default, so a log or a shared transcript
|
|
7
|
+
never holds them; ``--reveal`` prints them, the way ``client-app create`` shows
|
|
8
|
+
its token.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
REVEAL_FLAG = "--reveal"
|
|
14
|
+
|
|
15
|
+
#: The commands that print their credential when given ``--reveal``.
|
|
16
|
+
REVEAL_COMMANDS = frozenset(
|
|
17
|
+
{
|
|
18
|
+
"dashboard.embed.secret.rotate",
|
|
19
|
+
"dashboard.embed.preview-token.create",
|
|
20
|
+
}
|
|
21
|
+
)
|
|
@@ -39,6 +39,7 @@ from typing import Any
|
|
|
39
39
|
|
|
40
40
|
from mammoth_cli.errors.envelope import EXIT_USAGE, CliError
|
|
41
41
|
from mammoth_cli.runtime.compact import COMPACT_COMMANDS, FULL_FLAG
|
|
42
|
+
from mammoth_cli.runtime.reveal import REVEAL_COMMANDS, REVEAL_FLAG
|
|
42
43
|
from mammoth_cli.services.argspec import FieldSpec
|
|
43
44
|
from mammoth_cli.services.command_contract import (
|
|
44
45
|
resolve_command_contract,
|
|
@@ -61,6 +62,8 @@ COMMAND_FLAGS: dict[str, frozenset[str]] = {
|
|
|
61
62
|
"run": frozenset({"--continue"}),
|
|
62
63
|
# The compacted dashboard writes: --full returns the whole response.
|
|
63
64
|
**{command_id: frozenset({FULL_FLAG}) for command_id in COMPACT_COMMANDS},
|
|
65
|
+
# A once-shown credential is masked unless --reveal asks for it.
|
|
66
|
+
**{command_id: frozenset({REVEAL_FLAG}) for command_id in REVEAL_COMMANDS},
|
|
64
67
|
}
|
|
65
68
|
|
|
66
69
|
CODE_UNKNOWN_OPTION = "unknown_option"
|
|
@@ -93,6 +93,8 @@ _UNSETTLED_REASON = (
|
|
|
93
93
|
|
|
94
94
|
#: A write the CLI skipped because it would change nothing (see ``view transform``).
|
|
95
95
|
_NO_CHANGE_STATUS = "no_change"
|
|
96
|
+
#: ``file upload``'s status when its job made no dataset (``commands.file.NO_DATASET_STATUS``).
|
|
97
|
+
_NO_DATASET_STATUS = "no_dataset"
|
|
96
98
|
|
|
97
99
|
|
|
98
100
|
def with_verify(data: Any, invocation: Invocation | None = None) -> Any:
|
|
@@ -351,7 +353,7 @@ def _verify_and_reason(
|
|
|
351
353
|
``reason`` is set whenever ``verified`` is ``False`` (a failure or a
|
|
352
354
|
no-op) and for a staged draft; it is ``None`` for an ordinary success.
|
|
353
355
|
A failure never sets ``needs_user`` -- see :func:`_needs_user`, which
|
|
354
|
-
covers only the
|
|
356
|
+
covers only the outcomes serious enough to interrupt the caller.
|
|
355
357
|
"""
|
|
356
358
|
if data.get("changed") is False:
|
|
357
359
|
message = data.get("message")
|
|
@@ -431,7 +433,7 @@ def _needs_user(
|
|
|
431
433
|
rows_before: int | None,
|
|
432
434
|
rows_after: int | None,
|
|
433
435
|
) -> str | None:
|
|
434
|
-
"""The
|
|
436
|
+
"""The few outcomes worth interrupting the caller for.
|
|
435
437
|
|
|
436
438
|
``needs_user`` means "a serious outcome the user must hear about before
|
|
437
439
|
anything is built on it" -- never "something went wrong that you can
|
|
@@ -443,6 +445,10 @@ def _needs_user(
|
|
|
443
445
|
"""
|
|
444
446
|
if not verified:
|
|
445
447
|
return None
|
|
448
|
+
if data.get("status") == _NO_DATASET_STATUS:
|
|
449
|
+
# An upload that made no dataset (a PDF awaiting table extraction).
|
|
450
|
+
message = data.get("message")
|
|
451
|
+
return message if isinstance(message, str) else "The upload made no dataset."
|
|
446
452
|
if rows_after == 0 and isinstance(rows_before, int) and rows_before > 0:
|
|
447
453
|
return f"The change left the view with no rows (was {rows_before})."
|
|
448
454
|
join_check = data.get("join_check")
|
|
@@ -70,10 +70,14 @@ class FieldSpec:
|
|
|
70
70
|
|
|
71
71
|
@property
|
|
72
72
|
def enum_values(self) -> list[str] | None:
|
|
73
|
-
"""The member values, if this field's type is a string enum."""
|
|
73
|
+
"""The member values, if this field's type is a string enum or a ``Literal`` of them."""
|
|
74
74
|
target = self.resolved_type
|
|
75
75
|
if isinstance(target, type) and issubclass(target, enum.Enum):
|
|
76
76
|
return [member.value for member in target]
|
|
77
|
+
if get_origin(target) is typing.Literal:
|
|
78
|
+
values = get_args(target)
|
|
79
|
+
if values and all(isinstance(value, str) for value in values):
|
|
80
|
+
return list(values)
|
|
77
81
|
return None
|
|
78
82
|
|
|
79
83
|
@property
|
|
@@ -62,6 +62,9 @@ _HANDLER_OWNED_FIELDS: dict[str, frozenset[str]] = {
|
|
|
62
62
|
# ``job get`` is an immediate status read; only wait commands implement
|
|
63
63
|
# the CLI's timeout/polling behavior.
|
|
64
64
|
"job.get": frozenset({"timeout"}),
|
|
65
|
+
# ``view export rest-fill`` always waits for its job, bounded by ``--job-timeout``
|
|
66
|
+
# (``--return-running`` hands back the running job); the SDK's own switches are not inputs.
|
|
67
|
+
"view.export.rest-fill": frozenset({"wait", "timeout"}),
|
|
65
68
|
# ``PipelineAPI.get_draft_status`` carries a legacy ``dataset_id`` alongside
|
|
66
69
|
# the ``dataview_id`` the handler forwards from the view positional; the
|
|
67
70
|
# handler never reads it, so it must not be advertised as an --input field.
|
|
@@ -105,6 +108,10 @@ _EXAMPLE_INPUT_HINTS: dict[str, dict[str, Any]] = {
|
|
|
105
108
|
# bare ``<field>``: the values are the ones the API documents (OpenAPI enums, or
|
|
106
109
|
# the SDK method's own docstring/validator), so each example is a call that works.
|
|
107
110
|
"agent.message.set-request-kind": {"request_kind": "ask"},
|
|
111
|
+
# The sampled 1 is outside the server's 60..3600 seconds (#283).
|
|
112
|
+
"dashboard.embed.lifetime.set": {"token_ttl": 900},
|
|
113
|
+
# The format is the point of this command; csv has its own (#282).
|
|
114
|
+
"view.export.download": {"file_type": "xml"},
|
|
108
115
|
"support.plan.update-entitlements": {"values": {"dashboardBranding": "no_branding"}},
|
|
109
116
|
# Server-master routes: drill, rows behind a mark, describe-a-chart, chart types,
|
|
110
117
|
# file routing and connector drafts.
|
|
@@ -30,6 +30,7 @@ from mammoth_cli.errors.envelope import (
|
|
|
30
30
|
CODE_INVALID_ARGUMENTS,
|
|
31
31
|
CODE_JOB_FAILED,
|
|
32
32
|
CODE_OUTCOME_UNKNOWN,
|
|
33
|
+
CODE_PLAN_LIMIT,
|
|
33
34
|
CODE_RESOURCE_NOT_FOUND,
|
|
34
35
|
CODE_RETRYABLE,
|
|
35
36
|
EMBEDDED_AUTH_HINT,
|
|
@@ -263,6 +264,21 @@ def _retry_hint(retry_after: str | None) -> str:
|
|
|
263
264
|
#: A backend error ``name`` that refuses an action for lack of permission
|
|
264
265
|
#: (``DASHBOARD_CREATE_NOT_ALLOWED``) arrives as a 400, not a 403.
|
|
265
266
|
_NOT_ALLOWED_SUFFIX = "_NOT_ALLOWED"
|
|
267
|
+
#: The generic permission refusal (4PERM002), which some routes send as a 400.
|
|
268
|
+
_PERMISSION_ERROR_NAME = "PERMISSION_ERROR"
|
|
269
|
+
|
|
270
|
+
#: Backend codes that refuse an action because of the workspace's plan or AI
|
|
271
|
+
#: quota, not the user's permissions: no id or role change fixes them.
|
|
272
|
+
_PLAN_LIMIT_CODES = frozenset(
|
|
273
|
+
{
|
|
274
|
+
"4SUBS101", # FEATURE_NOT_AVAILABLE_ON_PLAN
|
|
275
|
+
"4SUBS102", # CONNECTOR_NOT_AVAILABLE_ON_PLAN
|
|
276
|
+
"4SUBS103", # PLAN_PAYMENT_REQUIRED
|
|
277
|
+
"4SUBS104", # AI_QUOTA_EXHAUSTED
|
|
278
|
+
"4SUBS105", # WORKSPACE_OVER_PLAN_LIMITS
|
|
279
|
+
"4SUBS106", # PLAN_LIMIT_REACHED
|
|
280
|
+
}
|
|
281
|
+
)
|
|
266
282
|
|
|
267
283
|
|
|
268
284
|
def _not_allowed_reason(body: Any, status: int | None) -> str | None:
|
|
@@ -271,11 +287,24 @@ def _not_allowed_reason(body: Any, status: int | None) -> str | None:
|
|
|
271
287
|
return None
|
|
272
288
|
name = body.get("name")
|
|
273
289
|
message = body.get("message")
|
|
274
|
-
if not isinstance(name, str) or not
|
|
290
|
+
if not isinstance(name, str) or not (
|
|
291
|
+
name.endswith(_NOT_ALLOWED_SUFFIX) or name == _PERMISSION_ERROR_NAME
|
|
292
|
+
):
|
|
275
293
|
return None
|
|
276
294
|
return message if isinstance(message, str) and message else name
|
|
277
295
|
|
|
278
296
|
|
|
297
|
+
def _plan_limit_reason(body: Any, status: int | None) -> str | None:
|
|
298
|
+
"""The backend's own words when a 4xx refuses for the plan or AI quota."""
|
|
299
|
+
if status is None or not 400 <= status < 500 or not isinstance(body, dict):
|
|
300
|
+
return None
|
|
301
|
+
backend_code = body.get("error_code") or body.get("code")
|
|
302
|
+
if backend_code not in _PLAN_LIMIT_CODES:
|
|
303
|
+
return None
|
|
304
|
+
message = body.get("message")
|
|
305
|
+
return message if isinstance(message, str) and message else str(backend_code)
|
|
306
|
+
|
|
307
|
+
|
|
279
308
|
def _backend_message(body: Any, status: int | None) -> str | None:
|
|
280
309
|
"""The backend's own words for a 4xx: message, reason under it, field errors, then code."""
|
|
281
310
|
if status is None or not 400 <= status < 500 or not isinstance(body, dict):
|
|
@@ -632,6 +661,20 @@ def map_sdk_exception(
|
|
|
632
661
|
request_id=request_id,
|
|
633
662
|
recovery_commands=[token_login],
|
|
634
663
|
)
|
|
664
|
+
plan_limit = _plan_limit_reason(exc.response_body, status)
|
|
665
|
+
if plan_limit is not None:
|
|
666
|
+
return CliError(
|
|
667
|
+
code=CODE_PLAN_LIMIT,
|
|
668
|
+
message=plan_limit,
|
|
669
|
+
exit_status=EXIT_AUTH,
|
|
670
|
+
hint=(
|
|
671
|
+
"The workspace's plan or monthly AI quota does not cover this; the ids "
|
|
672
|
+
"and permissions are not the problem. Do not retry: tell the user, who "
|
|
673
|
+
"can upgrade the plan or ask Mammoth support to extend the quota."
|
|
674
|
+
),
|
|
675
|
+
details=details,
|
|
676
|
+
request_id=request_id,
|
|
677
|
+
)
|
|
635
678
|
if status == 403:
|
|
636
679
|
return CliError(
|
|
637
680
|
code=CODE_AUTHORIZATION_REQUIRED,
|