mammoth-cli 2.2.91__tar.gz → 2.2.93__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.91 → mammoth_cli-2.2.93}/PKG-INFO +2 -2
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/__init__.py +1 -1
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/app.py +26 -1
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +1 -1
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +1 -1
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +2 -2
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +30 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +4 -2
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +8 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/browse.py +40 -3
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/dashboard.py +31 -1
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/dataset.py +87 -4
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/help_summaries.json +4 -1
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/registry.py +5 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/schema.py +59 -5
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/view.py +115 -18
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_ops.py +148 -23
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/errors/envelope.py +7 -1
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/dataset_health.py +4 -3
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/executor.py +29 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/input_loader.py +42 -4
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/shared.py +1 -3
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/state.py +11 -7
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/strict.py +62 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/validate.py +11 -2
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/coerce.py +48 -4
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/command_contract.py +2 -1
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/conditions.py +17 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/delete_check.py +4 -2
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/field_enums.py +9 -1
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/input_fields.py +10 -1
- mammoth_cli-2.2.93/mammoth_cli/services/poll.py +22 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/positionals.py +3 -1
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/sdk_service.py +32 -2
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/pyproject.toml +2 -2
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/dataset.yaml +1 -1
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/view.yaml +168 -7
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/edits-target.source.yaml +2 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/sdk-catalog.source.yaml +24 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/sdk-methods.yaml +53 -1
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/.gitignore +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/LICENSE +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/README.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/__main__.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capabilities.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/collection.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-embed.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-published.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-template.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/how.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/link.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/resolve.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/token.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/build-an-agent.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/database-import.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/file-import.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/rest-api-import.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/__init__.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/_lazy.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/activity.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/addon.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/agent.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/ai.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/annotation.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/auth.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/automation.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/batch.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/billing.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/calc.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/capabilities.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/capability.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/client_app.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/completion.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/config.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/connector.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/context.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/data_app.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/doctor.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/external_key.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/file.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/folder.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/how.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/job.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/link.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/notification.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/parameter.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/project.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/report.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/resolve.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/schedule.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/skill.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/snippet.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/support.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/template.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/trash.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/upgrade.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/user.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_drivers.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_explore.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_forecast.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_profile.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/webhook.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/workflow.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/workspace.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/context/__init__.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/context/credentials.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/context/endpoint.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/context/keyring_backend.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/context/oauth.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/context/profiles.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/context/resolver.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/contracts/__init__.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/contracts/auth.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/discovery/__init__.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/discovery/limitations.json +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/discovery/next_commands.json +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/discovery/recipes.json +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/embed.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/errors/__init__.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/manifest/__init__.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/manifest/loader.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/messages/__init__.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/output/__init__.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/output/envelope.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/output/normalize.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/output/policy.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/output/progress.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/output/render.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/py.typed +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/__init__.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/compact.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/confirm.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/dryrun.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/dryrun_targets.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/embedded.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/intent_only.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/invocation.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/labels.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/locked_files.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/new_data.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/next_commands.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/opens.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/options.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/parents.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/runlog.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/session.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/token_scope.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/updates.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/verify.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/__init__.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/append_blank_columns.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/argspec.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/board_values.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/column_type_guard.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/conditional_format.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/dashboard_figures.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/dashboard_filters.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/dashboard_pages.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/dashboard_review.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/data_profile.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/data_quality.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/dispatch.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/explore_card_edit.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/explore_cards.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/explore_to_figure.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/explore_to_image.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/factory.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/folder_ids.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/job_outcome.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/listing.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/local_files.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/local_time.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/mapping.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/openapi_types.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/paging.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/period_analysis.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/protocol.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/read_memo.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/read_queries.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/schema_diff.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/sql_check.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/stored_stats.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/suggest.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/testing.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/text_dates.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/type_system.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/view_analysis.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/view_variants.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/write_impact.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/skills/__init__.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/skills/installer.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/skills/steering.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/testing.py +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/activity.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/addon.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/agent.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/ai.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/annotation.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/auth.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/automation.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/batch.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/billing.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/browse.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/calc.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/capabilities.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/capability.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/client-app.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/collection.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/completion.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/config.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/connector.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/context.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/dashboard.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/data-app.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/doctor.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/external-key.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/file.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/folder.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/how.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/job.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/link.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/log.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/notification.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/parameter.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/project.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/report.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/resolve.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/schedule.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/schema.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/skill.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/snippet.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/support.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/template.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/token.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/trash.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/upgrade.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/user.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/version.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/webhook.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/workflow.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/workspace.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/openapi-operations.yaml +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/schema-v1.json +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/openapi/metadata.json +0 -0
- {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/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.93
|
|
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
|
|
@@ -18,7 +18,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
18
18
|
Requires-Python: <3.15,>=3.12
|
|
19
19
|
Requires-Dist: jsonschema>=4.20
|
|
20
20
|
Requires-Dist: keyring<26,>=25.7
|
|
21
|
-
Requires-Dist: mammoth-io<0.9,>=0.8.
|
|
21
|
+
Requires-Dist: mammoth-io<0.9,>=0.8.46
|
|
22
22
|
Requires-Dist: platformdirs<5,>=4.10
|
|
23
23
|
Requires-Dist: pydantic<3,>=2.12.5
|
|
24
24
|
Requires-Dist: pyyaml<7,>=6
|
|
@@ -428,6 +428,29 @@ def _global_option_flags() -> tuple[frozenset[str], frozenset[str]]:
|
|
|
428
428
|
return frozenset(every), frozenset(valued)
|
|
429
429
|
|
|
430
430
|
|
|
431
|
+
def missing_argument_hint(tokens: Sequence[str]) -> str:
|
|
432
|
+
"""The command's usage line and runnable example, for a ``missing_argument`` error.
|
|
433
|
+
|
|
434
|
+
The command is the longest run of leading words that names one; with none, the
|
|
435
|
+
generic pointer to the schema.
|
|
436
|
+
"""
|
|
437
|
+
generic = "Check the command schema with 'mammoth schema get'."
|
|
438
|
+
path_to_command, _ = _command_tree()
|
|
439
|
+
words = [token for token in tokens if not token.startswith("-")]
|
|
440
|
+
for length in range(len(words), 0, -1):
|
|
441
|
+
command_id = path_to_command.get(tuple(words[:length]))
|
|
442
|
+
if command_id is None:
|
|
443
|
+
continue
|
|
444
|
+
slots = " ".join(
|
|
445
|
+
spec.metavar if spec.required else f"[{spec.metavar}]"
|
|
446
|
+
for spec in resolve_positionals(command_id)
|
|
447
|
+
)
|
|
448
|
+
usage = " ".join(part for part in ("mammoth", *words[:length], slots) if part)
|
|
449
|
+
example = (command_by_id(command_id) or {}).get("agent_example")
|
|
450
|
+
return f"Usage: {usage}." + (f" Example: {example}" if example else "")
|
|
451
|
+
return generic
|
|
452
|
+
|
|
453
|
+
|
|
431
454
|
def _corrected_command(tokens: Sequence[str]) -> str | None:
|
|
432
455
|
"""Rebuild an invocation with leading global options moved after the command.
|
|
433
456
|
|
|
@@ -747,7 +770,7 @@ class _EnvelopeGroup(TyperGroup):
|
|
|
747
770
|
code="missing_argument",
|
|
748
771
|
message=error_message,
|
|
749
772
|
exit_status=EXIT_USAGE,
|
|
750
|
-
hint=
|
|
773
|
+
hint=missing_argument_hint(tokens),
|
|
751
774
|
)
|
|
752
775
|
elif isinstance(error, _typer_click_exceptions.NoSuchOption):
|
|
753
776
|
option = getattr(error, "option_name", None) or "unknown"
|
|
@@ -779,6 +802,8 @@ class _EnvelopeGroup(TyperGroup):
|
|
|
779
802
|
executor.emit_error(report, machine=True)
|
|
780
803
|
elif report is None:
|
|
781
804
|
error.show()
|
|
805
|
+
if is_missing_parameter:
|
|
806
|
+
typer.echo(missing_argument_hint(tokens), err=True)
|
|
782
807
|
else:
|
|
783
808
|
# A no-subcommand error arrives with the help text already on
|
|
784
809
|
# screen, so repeating "run --help" below it would be noise.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: mammoth-cli
|
|
3
|
-
version: 2.2.
|
|
3
|
+
version: 2.2.93
|
|
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
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# What is proven on release
|
|
2
2
|
|
|
3
3
|
Generated from `docs/release-capability-matrix.json`; do not edit by hand.
|
|
4
|
-
The CLI publishes
|
|
4
|
+
The CLI publishes 785 commands. 516 of them bind one of the 545 API operations in the matrix; the remainder are local commands (`schema`, `auth`, `doctor`, `log`, ...) or typed variants that share an operation (`view transform *` commands submit through `view.task.add`, except `rename-columns` and `sort`, which set view display properties through `view.update`). 262 bound commands ran once successfully on release, 1 are not supported there, and the rest are untried. Untried is not broken: discover the contract with `mammoth schema get COMMAND_ID`, run it, and treat the structured error envelope as the answer. Use an untried command normally: confirm a write with the user first, check its result with a read afterwards, and never refuse a command only because it is untried.
|
|
5
5
|
|
|
6
6
|
Status meanings:
|
|
7
7
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Published CLI command catalog
|
|
2
2
|
|
|
3
|
-
This generated catalog is a lookup table for every command in the published CLI manifest, currently
|
|
3
|
+
This generated catalog is a lookup table for every command in the published CLI manifest, currently 785; each entry carries its release status line. It is a command-contract index, not an assertion that every backend/OpenAPI operation has a CLI binding. For an exact local CLI contract, run `mammoth schema get COMMAND_ID`; `mammoth capability list` is an API-binding inventory and can omit typed/local CLI routes. For focused workflows, read the [recipes index](recipes/index.md). Sensitive structured input must come from a private file or pipe; never put secrets in literal argv.
|
|
4
4
|
|
|
5
5
|
Load only the applicable domain file:
|
|
6
6
|
|
|
@@ -56,7 +56,7 @@ Load only the applicable domain file:
|
|
|
56
56
|
- [user](commands/user.md) — 8 published commands
|
|
57
57
|
- [version](commands/version.md) — 1 published commands
|
|
58
58
|
- [view-transform](commands/view-transform.md) — 35 published commands
|
|
59
|
-
- [view](commands/view.md) —
|
|
59
|
+
- [view](commands/view.md) — 109 published commands
|
|
60
60
|
- [webhook](commands/webhook.md) — 7 published commands
|
|
61
61
|
- [workflow](commands/workflow.md) — 23 published commands
|
|
62
62
|
- [workspace](commands/workspace.md) — 33 published commands
|
|
@@ -122,6 +122,16 @@ Result: `ViewCheckpointUpdateResult`; mutation `benign_mutation`, confirmation `
|
|
|
122
122
|
|
|
123
123
|
Status on release: ran once on CLI 2.0.18 — fixture-lifecycle sweep 2026-09-19: exit 0 on release with CLI 2.0.18. First attempt sending a full AddCheckpointSpec body (matching create's shape) failed with invalid_input_field_type; update actually needs body.patches[] (CheckpointPatches/CheckPointPatch…
|
|
124
124
|
|
|
125
|
+
### `view.column.format.set`
|
|
126
|
+
|
|
127
|
+
Run: `mammoth view column format set`. Exact input fields: `mammoth schema get view.column.format.set`.
|
|
128
|
+
|
|
129
|
+
Example: `mammoth view column format set 123 --input '{"formats": {"Admitted": {"date_format": "%d-%b-%Y"}, "Revenue": {"decimal_spec": 2}}, "dataset_id": 456}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
130
|
+
|
|
131
|
+
Result: `ViewColumnFormatSetResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
|
|
132
|
+
|
|
133
|
+
Status on release: untried; no live run recorded.
|
|
134
|
+
|
|
125
135
|
### `view.compare`
|
|
126
136
|
|
|
127
137
|
Run: `mammoth view compare`. Exact input fields: `mammoth schema get view.compare`.
|
|
@@ -162,6 +172,16 @@ Result: `ViewConditionalFormatListResult`; mutation `read`, confirmation `none`,
|
|
|
162
172
|
|
|
163
173
|
Status on release: ran once on CLI 2.0.17 — re-verification 2026-09-18 (2.0.16 fixes): exit 0 on release with CLI 2.0.17. With SDK 0.7.9 the one existing rule is returned as [{rule_id, cf_type, FORMAT, CONDITION, ...}]; with SDK 0.7.8 the same call returned [] (mapping keyed by rule id was discarded).…
|
|
164
174
|
|
|
175
|
+
### `view.conditional-format.replace`
|
|
176
|
+
|
|
177
|
+
Run: `mammoth view conditional-format replace`. Exact input fields: `mammoth schema get view.conditional-format.replace`.
|
|
178
|
+
|
|
179
|
+
Example: `mammoth view conditional-format replace 123 456 --input '{"columns": ["Q1", "Q2", "Q3"], "operator": "<", "value": 55, "color": "red"}' --yes`. Illustrative only: append `--yes` after observing an owned target.
|
|
180
|
+
|
|
181
|
+
Result: `ViewConditionalFormatReplaceResult`; mutation `destructive`, confirmation `prompt_or_yes`, wait policy `not_async`.
|
|
182
|
+
|
|
183
|
+
Status on release: untried; no live run recorded.
|
|
184
|
+
|
|
165
185
|
### `view.conditional-format.update`
|
|
166
186
|
|
|
167
187
|
Run: `mammoth view conditional-format update`. Exact input fields: `mammoth schema get view.conditional-format.update`.
|
|
@@ -546,6 +566,16 @@ Result: `ViewExportDeleteResult`; mutation `external_effect`, confirmation `yes_
|
|
|
546
566
|
|
|
547
567
|
Status on release: ran once on CLI 2.0.14 — write sweep 2026-09-18: exit 0 on release with CLI 2.0.14. Deleted export 2 -> {future_id:null,status:deleted,trigger_id:2}. Single invocation only.
|
|
548
568
|
|
|
569
|
+
### `view.export.download`
|
|
570
|
+
|
|
571
|
+
Run: `mammoth view export download`. Exact input fields: `mammoth schema get view.export.download`.
|
|
572
|
+
|
|
573
|
+
Example: `mammoth view export download 123`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
574
|
+
|
|
575
|
+
Result: `ViewExportDownloadResult`; mutation `benign_mutation`, confirmation `none`, wait policy `always_wait`.
|
|
576
|
+
|
|
577
|
+
Status on release: untried; no live run recorded.
|
|
578
|
+
|
|
549
579
|
### `view.export.elasticsearch`
|
|
550
580
|
|
|
551
581
|
Run: `mammoth view export elasticsearch`. Exact input fields: `mammoth schema get view.export.elasticsearch`.
|
|
@@ -98,8 +98,10 @@ When several transforms go on the same view in a row (for example filter, sort,
|
|
|
98
98
|
limit-rows), send them in one `view transform batch VIEW_ID --input '{"steps": [{"op":
|
|
99
99
|
"filter", "input": {...}}, ...]}'` instead of one command each: the pipeline runs once and
|
|
100
100
|
one verified outcome comes back (`row_check`, and `tasks` with each new task's status).
|
|
101
|
-
Each `input` is what that `view transform` command takes. A step
|
|
102
|
-
earlier step
|
|
101
|
+
Each `input` is what that `view transform` command takes. A step can use the columns an
|
|
102
|
+
earlier step adds (`split`, `copy-columns`, or the `new_column` of `substring`, `extract-date`,
|
|
103
|
+
`increment-date`). `split`, `unnest` and `pivot` can be
|
|
104
|
+
batch steps too; `unnest` and `pivot` replace the view's columns, so they go last (and no `sort` step before them). If a task fails, the batch's tasks
|
|
103
105
|
are removed and the error names `steps[i]`.
|
|
104
106
|
|
|
105
107
|
Prefer a typed `view transform <operation>` command. Its schema is the
|
|
@@ -86,6 +86,14 @@ A TEXT column that writes numbers with a decimal comma (`1.234,5`) converts with
|
|
|
86
86
|
defaults to the other mark). `view data profile` lists such a column under
|
|
87
87
|
`summary.mixed_number_format` when its values mix notations.
|
|
88
88
|
|
|
89
|
+
A TEXT column of dates converts with `"to":"DATE"` and, on the same `conversions` entry,
|
|
90
|
+
`"input_formats":["DD/MM/YYYY","YYYY-MM-DD"]` (every layout the column mixes),
|
|
91
|
+
`"output_format":"DD-Mon-YYYY"` (how it displays) and
|
|
92
|
+
`"input_format_preference":"uk"` or `"us"` (which way `03/04/2024` reads). Formats are
|
|
93
|
+
Postgres date patterns.
|
|
94
|
+
`view column format set` changes only how a DATE or number column
|
|
95
|
+
shows, never its values.
|
|
96
|
+
|
|
89
97
|
In a math `expression`, write a multi-word display name bare (`Quantity * Unit
|
|
90
98
|
Price`) or quoted (`Quantity * \"Unit Price\"` inside the JSON string).
|
|
91
99
|
|
|
@@ -17,6 +17,7 @@ from mammoth_cli.errors.envelope import (
|
|
|
17
17
|
CODE_INVALID_ARGUMENT,
|
|
18
18
|
CODE_MISSING_ARGUMENT,
|
|
19
19
|
CODE_MISSING_FIELD,
|
|
20
|
+
CODE_RESOURCE_NOT_FOUND,
|
|
20
21
|
CODE_SDK_SYMBOL_UNRESOLVED,
|
|
21
22
|
EXIT_USAGE,
|
|
22
23
|
CliError,
|
|
@@ -28,6 +29,31 @@ from mammoth_cli.services.folder_ids import FolderIds
|
|
|
28
29
|
|
|
29
30
|
HandlerResult = tuple[Any, dict[str, Any]]
|
|
30
31
|
|
|
32
|
+
#: The route's resource types are datasource, dataview, label, file_object, report and webhook;
|
|
33
|
+
#: these are the names a caller reaches for instead.
|
|
34
|
+
_RESOURCE_TYPE_ALIASES = {"dataset": "datasource", "folder": "label"}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def canonical_resource_type(value: str) -> str:
|
|
38
|
+
"""``value`` (one type, or several joined by commas) with each alias as the route's name."""
|
|
39
|
+
return ",".join(
|
|
40
|
+
_RESOURCE_TYPE_ALIASES.get(part.strip(), part.strip()) for part in value.split(",")
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def ancestors_needs_a_folder(error: CliError) -> CliError:
|
|
45
|
+
"""``error`` (the 404 for an id that is no folder) as a message saying what to pass."""
|
|
46
|
+
return CliError(
|
|
47
|
+
code=error.code,
|
|
48
|
+
message="browse ancestors needs a FOLDER id; this id is not a folder.",
|
|
49
|
+
exit_status=error.exit_status,
|
|
50
|
+
hint=(
|
|
51
|
+
"A dataset or view has no ancestors of its own: run `mammoth browse resource "
|
|
52
|
+
"dataset ID` (or `dataview ID`) and pass the parent_resource_id it returns."
|
|
53
|
+
),
|
|
54
|
+
details=error.details,
|
|
55
|
+
)
|
|
56
|
+
|
|
31
57
|
|
|
32
58
|
def _symbol(invocation: Invocation) -> str:
|
|
33
59
|
"""Return the reviewed backing SDK symbol for this command."""
|
|
@@ -213,7 +239,8 @@ def browse_resource(invocation: Invocation) -> HandlerResult:
|
|
|
213
239
|
)
|
|
214
240
|
with open_service(invocation) as (service, auth):
|
|
215
241
|
folders = FolderIds(service)
|
|
216
|
-
|
|
242
|
+
resource_type = canonical_resource_type(str(resource_type))
|
|
243
|
+
if resource_type == "label":
|
|
217
244
|
object_id = folders.label(project_id, int(object_id))
|
|
218
245
|
data = service.call(
|
|
219
246
|
_symbol(invocation),
|
|
@@ -230,7 +257,14 @@ def browse_ancestors(invocation: Invocation) -> HandlerResult:
|
|
|
230
257
|
project_id = require_project(invocation)
|
|
231
258
|
resource_id = _require_int_positional(invocation, "resource id")
|
|
232
259
|
with open_service(invocation) as (service, auth):
|
|
233
|
-
|
|
260
|
+
try:
|
|
261
|
+
found = service.call(
|
|
262
|
+
_symbol(invocation), resource_id=resource_id, project_id=project_id
|
|
263
|
+
)
|
|
264
|
+
except CliError as exc:
|
|
265
|
+
if exc.code != CODE_RESOURCE_NOT_FOUND:
|
|
266
|
+
raise
|
|
267
|
+
raise ancestors_needs_a_folder(exc) from exc
|
|
234
268
|
data = FolderIds(service).open_data(found, project_id)
|
|
235
269
|
return data, _meta(invocation, auth.workspace_id, project_id)
|
|
236
270
|
|
|
@@ -238,7 +272,8 @@ def browse_ancestors(invocation: Invocation) -> HandlerResult:
|
|
|
238
272
|
def browse_search(invocation: Invocation) -> HandlerResult:
|
|
239
273
|
"""Search resources across every project of the workspace (resources v2).
|
|
240
274
|
|
|
241
|
-
``resource_type`` ``dataset`` means the route's ``datasource
|
|
275
|
+
``resource_type`` ``dataset`` means the route's ``datasource``, ``folder`` its ``label``.
|
|
276
|
+
Each dataset hit
|
|
242
277
|
carries ``dataset_id`` and each view hit ``view_id``: pass those, never the tree ``id``.
|
|
243
278
|
"""
|
|
244
279
|
document = invocation.load_input() or {}
|
|
@@ -246,6 +281,8 @@ def browse_search(invocation: Invocation) -> HandlerResult:
|
|
|
246
281
|
_forward_optional(
|
|
247
282
|
document, kwargs, ("search", "resource_type", "cursor", "limit", "sort", "fields")
|
|
248
283
|
)
|
|
284
|
+
if isinstance(kwargs.get("resource_type"), str):
|
|
285
|
+
kwargs["resource_type"] = canonical_resource_type(kwargs["resource_type"])
|
|
249
286
|
with open_service(invocation) as (service, auth):
|
|
250
287
|
data = FolderIds(service).open_data(service.call(_symbol(invocation), **kwargs), None)
|
|
251
288
|
return _with_object_ids(data), _meta(invocation, auth.workspace_id, None)
|
|
@@ -618,10 +618,13 @@ def dashboard_share(invocation: Invocation) -> HandlerResult:
|
|
|
618
618
|
assert document is not None
|
|
619
619
|
_forward_optional(document, kwargs, ("users",))
|
|
620
620
|
with open_service(invocation) as (service, auth):
|
|
621
|
+
was_published = _was_published(service, dashboard_id)
|
|
622
|
+
if not was_published:
|
|
623
|
+
refuse_viewer_share_before_publish(dashboard_id, type_of_auth, kwargs.get("users"))
|
|
621
624
|
unpublished = (
|
|
622
625
|
" (not published yet: sharing alone does not publish it; run dashboard action "
|
|
623
626
|
'with {"action":"publish-presentation"} to publish)'
|
|
624
|
-
if not
|
|
627
|
+
if not was_published
|
|
625
628
|
else ""
|
|
626
629
|
)
|
|
627
630
|
enforce_confirmation(
|
|
@@ -638,6 +641,33 @@ def dashboard_share(invocation: Invocation) -> HandlerResult:
|
|
|
638
641
|
return data, _meta(invocation, auth.workspace_id)
|
|
639
642
|
|
|
640
643
|
|
|
644
|
+
def refuse_viewer_share_before_publish(
|
|
645
|
+
dashboard_id: int, type_of_auth: str, users: list[dict[str, Any]] | None
|
|
646
|
+
) -> None:
|
|
647
|
+
"""Refuse, as the server does, a ``mammoth`` share that gives viewer access before a publish.
|
|
648
|
+
|
|
649
|
+
The server (``_apply_mammoth_recipients``) refuses the whole request when any user is
|
|
650
|
+
shared as a viewer (the default role) and the board has no published version.
|
|
651
|
+
"""
|
|
652
|
+
if type_of_auth != "mammoth":
|
|
653
|
+
return
|
|
654
|
+
for user in users or []:
|
|
655
|
+
shared = user.get("shared", True)
|
|
656
|
+
shared = shared.lower() in ("true", "1", "yes", "on") if isinstance(shared, str) else shared
|
|
657
|
+
if shared and user.get("role") != "dashboard_editor":
|
|
658
|
+
raise CliError(
|
|
659
|
+
code="dashboard_not_published",
|
|
660
|
+
message=f"Dashboard {dashboard_id} is not published; viewers cannot be invited.",
|
|
661
|
+
exit_status=EXIT_USAGE,
|
|
662
|
+
hint=(
|
|
663
|
+
"Publish it first: mammoth dashboard action "
|
|
664
|
+
f'{dashboard_id} --input \'{{"action": "publish-presentation"}}\' --yes, '
|
|
665
|
+
"then share. Or share only users with role dashboard_editor."
|
|
666
|
+
),
|
|
667
|
+
details={"dashboard_id": dashboard_id},
|
|
668
|
+
)
|
|
669
|
+
|
|
670
|
+
|
|
641
671
|
def _share_readback(service: Any, dashboard_id: int) -> dict[str, Any]:
|
|
642
672
|
"""The board's share state as ``dashboard get`` reports it after a share."""
|
|
643
673
|
board = _dump_model(service.call(_DASHBOARD_GET, dashboard_id=dashboard_id))
|
|
@@ -35,7 +35,7 @@ from mammoth_cli.runtime.confirm import (
|
|
|
35
35
|
)
|
|
36
36
|
from mammoth_cli.runtime.invocation import Invocation
|
|
37
37
|
from mammoth_cli.runtime.new_data import with_file_upload_path
|
|
38
|
-
from mammoth_cli.runtime.session import open_service, require_project
|
|
38
|
+
from mammoth_cli.runtime.session import open_service, require_project, resolved_project
|
|
39
39
|
from mammoth_cli.services.delete_check import ensure_deleted, find_dependents
|
|
40
40
|
from mammoth_cli.services.field_enums import DATA_PULL_FILE_VALUES, allowed_values_text
|
|
41
41
|
from mammoth_cli.services.listing import (
|
|
@@ -761,17 +761,22 @@ def dataset_list(invocation: Invocation) -> HandlerResult:
|
|
|
761
761
|
datasets" never needs paging: read ``total`` with the first page's newest names.
|
|
762
762
|
For a list of names (e.g. "which files can I see?") pass ``names: true``: ONE call
|
|
763
763
|
returns up to 500 bare ``{id, name}`` rows, newest first, with ``total`` and ``more``.
|
|
764
|
+
With no project set it returns ``{project_id, project_name, id, name}`` rows from every
|
|
765
|
+
project the caller can open, from one workspace search (the newest 500 at most).
|
|
764
766
|
``full: true`` returns the raw ``{id, name}`` list instead. ``name`` keeps only datasets
|
|
765
767
|
whose name contains it (case-insensitive) across every page, as short rows without
|
|
766
768
|
column lists; ``limit``/``offset`` then page over the matches.
|
|
767
769
|
"""
|
|
768
|
-
project_id = require_project(invocation)
|
|
769
770
|
document = invocation.load_input() or {}
|
|
771
|
+
name = document.get("name")
|
|
772
|
+
wants_names = document.get("names") and not (isinstance(name, str) and name.strip())
|
|
773
|
+
if wants_names and resolved_project(invocation) is None:
|
|
774
|
+
return _dataset_names_everywhere(invocation)
|
|
775
|
+
project_id = require_project(invocation)
|
|
770
776
|
_validate_paging(document)
|
|
771
777
|
kwargs: dict[str, Any] = {"project_id": project_id}
|
|
772
778
|
_forward_optional(document, kwargs, ("limit", "offset", "sort"))
|
|
773
|
-
|
|
774
|
-
if document.get("names") and not (isinstance(name, str) and name.strip()):
|
|
779
|
+
if wants_names:
|
|
775
780
|
return _dataset_names(invocation, project_id, document)
|
|
776
781
|
if isinstance(name, str) and name.strip():
|
|
777
782
|
return _dataset_name_search(invocation, project_id, name.strip(), document)
|
|
@@ -817,6 +822,42 @@ def _dataset_names(
|
|
|
817
822
|
return result, _meta(invocation, auth.workspace_id, project_id)
|
|
818
823
|
|
|
819
824
|
|
|
825
|
+
def _dataset_names_everywhere(invocation: Invocation) -> HandlerResult:
|
|
826
|
+
"""``dataset list`` with ``names`` and no project: the names of every reachable project.
|
|
827
|
+
|
|
828
|
+
One workspace search (100 hits a page, the route's cap) lists the datasets of the
|
|
829
|
+
projects the caller can open, under the same access rules as ``project list``; one
|
|
830
|
+
``project list`` read supplies the project names. Capped at ``_SEARCH_PAGES`` pages.
|
|
831
|
+
"""
|
|
832
|
+
with open_service(invocation) as (service, auth):
|
|
833
|
+
hits, cut = search_hits(service, "datasource", "", fields="minimal")
|
|
834
|
+
names = {p.get("id"): p.get("name") for p in _visible_projects(service)}
|
|
835
|
+
rows = [
|
|
836
|
+
{
|
|
837
|
+
"project_id": hit["project_id"],
|
|
838
|
+
"project_name": names[hit["project_id"]],
|
|
839
|
+
"id": hit["object_id"],
|
|
840
|
+
"name": hit.get("name"),
|
|
841
|
+
}
|
|
842
|
+
for hit in hits
|
|
843
|
+
if hit.get("project_id") in names
|
|
844
|
+
]
|
|
845
|
+
kept, _cut = fit_budget(rows[:NAMES_MAX_ROWS], budget=NAMES_DATA_BUDGET)
|
|
846
|
+
result: dict[str, Any] = {
|
|
847
|
+
"datasets": kept,
|
|
848
|
+
"shown": len(kept),
|
|
849
|
+
"total": len(rows),
|
|
850
|
+
"projects": len({row["project_id"] for row in rows}),
|
|
851
|
+
}
|
|
852
|
+
if cut or len(kept) < len(rows):
|
|
853
|
+
result["more"] = True
|
|
854
|
+
result["note"] = (
|
|
855
|
+
f"Only the newest {len(kept)} names were read; pass --project to list one "
|
|
856
|
+
"project's names, or name to find one."
|
|
857
|
+
)
|
|
858
|
+
return result, _meta(invocation, auth.workspace_id, None)
|
|
859
|
+
|
|
860
|
+
|
|
820
861
|
def _dataset_total(service: Any, project_id: int, page: dict[str, Any], offset: int) -> int:
|
|
821
862
|
"""The project's whole dataset count. The list route sends none, so a page that
|
|
822
863
|
is the last one counts itself; otherwise the ids are read once, here, in one call."""
|
|
@@ -1036,6 +1077,45 @@ def _validate_paging(document: dict[str, Any]) -> None:
|
|
|
1036
1077
|
)
|
|
1037
1078
|
|
|
1038
1079
|
|
|
1080
|
+
def _batch_column_ids(
|
|
1081
|
+
service: Any, dataset_id: int, project_id: int, columns: str | list[str]
|
|
1082
|
+
) -> str:
|
|
1083
|
+
"""The comma-separated column ids the batch-data route wants, from names or ids."""
|
|
1084
|
+
response = service.call(_DATASET_GET_SYMBOL, dataset_id=dataset_id, project_id=project_id)
|
|
1085
|
+
dataset = response.get("dataset", response) if isinstance(response, dict) else {}
|
|
1086
|
+
schema = dataset.get("data_schema") if isinstance(dataset, dict) else None
|
|
1087
|
+
return resolve_batch_columns(schema, dataset_id, columns)
|
|
1088
|
+
|
|
1089
|
+
|
|
1090
|
+
def resolve_batch_columns(schema: Any, dataset_id: int, columns: str | list[str]) -> str:
|
|
1091
|
+
"""Column ids, comma-separated, for names or ids in ``columns`` (a list or one string).
|
|
1092
|
+
|
|
1093
|
+
The batch-data route refuses display names with a bare "invalid columns"; the dataset
|
|
1094
|
+
schema maps each ``c_name`` to its ``c_id``. An id passes through; a name the schema
|
|
1095
|
+
lacks is refused with the names it has.
|
|
1096
|
+
"""
|
|
1097
|
+
if not isinstance(schema, list):
|
|
1098
|
+
raise CliError(
|
|
1099
|
+
code=CODE_API_ERROR,
|
|
1100
|
+
message=f"Could not read dataset {dataset_id}'s columns to resolve 'columns'.",
|
|
1101
|
+
exit_status=EXIT_API,
|
|
1102
|
+
)
|
|
1103
|
+
wanted = [n.strip() for n in columns.split(",")] if isinstance(columns, str) else columns
|
|
1104
|
+
ids = {c["c_id"] for c in schema if isinstance(c, dict) and "c_id" in c}
|
|
1105
|
+
by_name = {c["c_name"]: c["c_id"] for c in schema if isinstance(c, dict) and "c_name" in c}
|
|
1106
|
+
resolved = [name if name in ids else by_name.get(name) for name in wanted]
|
|
1107
|
+
missing = [name for name, found in zip(wanted, resolved, strict=True) if found is None]
|
|
1108
|
+
if missing:
|
|
1109
|
+
raise CliError(
|
|
1110
|
+
code="unknown_column",
|
|
1111
|
+
message=f"Column(s) not in dataset {dataset_id}: {', '.join(missing)}.",
|
|
1112
|
+
exit_status=EXIT_USAGE,
|
|
1113
|
+
hint="Use column names or ids from `mammoth dataset get`.",
|
|
1114
|
+
details={"columns": missing, "available": sorted(by_name)},
|
|
1115
|
+
)
|
|
1116
|
+
return ",".join(str(found) for found in resolved)
|
|
1117
|
+
|
|
1118
|
+
|
|
1039
1119
|
def dataset_batch_data(invocation: Invocation) -> HandlerResult:
|
|
1040
1120
|
"""Fetch data for a specific dataset batch."""
|
|
1041
1121
|
project_id = require_project(invocation)
|
|
@@ -1050,6 +1130,9 @@ def dataset_batch_data(invocation: Invocation) -> HandlerResult:
|
|
|
1050
1130
|
}
|
|
1051
1131
|
_forward_optional(document, kwargs, ("columns", "limit", "offset", "timeout", "poll_interval"))
|
|
1052
1132
|
with open_service(invocation) as (service, auth):
|
|
1133
|
+
if kwargs.get("columns"):
|
|
1134
|
+
columns = kwargs["columns"]
|
|
1135
|
+
kwargs["columns"] = _batch_column_ids(service, dataset_id, project_id, columns)
|
|
1053
1136
|
data = service.call(_symbol(invocation), **kwargs)
|
|
1054
1137
|
return data, _meta(invocation, auth.workspace_id, project_id)
|
|
1055
1138
|
|
|
@@ -583,10 +583,12 @@
|
|
|
583
583
|
"view.checkpoint.get": "Get one checkpoint by id.",
|
|
584
584
|
"view.checkpoint.list": "List checkpoints on a dataview, with optional filters from '--input'.",
|
|
585
585
|
"view.checkpoint.update": "Update one checkpoint by id. 'body' is required.",
|
|
586
|
+
"view.column.format.set": "Set how columns display (date or number format; a view display setting, not a task).",
|
|
586
587
|
"view.compare": "Compare dataviews pairwise: rows, column differences and checksums (read-only).",
|
|
587
588
|
"view.conditional-format.create": "Colour cells in many columns by one threshold in a single command (columns + operator + value + color): each cell is judged by its own value. applies_to=row colours whole rows when any/all of the columns match.",
|
|
588
589
|
"view.conditional-format.delete-all": "Delete a conditional-format rule on a dataview. Prompt or '--yes'.",
|
|
589
590
|
"view.conditional-format.list": "List conditional-format rules on a dataview.",
|
|
591
|
+
"view.conditional-format.replace": "Replace every conditional-format rule on a view with new ones in one call.",
|
|
590
592
|
"view.conditional-format.update": "Update a conditional-format rule on a dataview. 'rule' is required.",
|
|
591
593
|
"view.create": "Create a view from a dataset. Dataset id is positional; name/clone_from optional.",
|
|
592
594
|
"view.data-check.create": "Create a data check on a dataview. 'body' is required.",
|
|
@@ -625,6 +627,7 @@
|
|
|
625
627
|
"view.export.csv": "Export a dataview to a local CSV file.",
|
|
626
628
|
"view.export.dataset": "Run one of the SDK's typed 'View.export' destination helpers.",
|
|
627
629
|
"view.export.delete": "Delete one export by id. Always requires '--yes'.",
|
|
630
|
+
"view.export.download": "Download a dataview to a local file as csv, xlsx, json, ndjson, xml, yaml or parquet.",
|
|
628
631
|
"view.export.elasticsearch": "Run one of the SDK's typed 'View.export' destination helpers.",
|
|
629
632
|
"view.export.email": "Run one of the SDK's typed 'View.export' destination helpers.",
|
|
630
633
|
"view.export.ftp": "Run one of the SDK's typed 'View.export' destination helpers.",
|
|
@@ -689,7 +692,7 @@
|
|
|
689
692
|
"view.transform.increment-date": "Increment a date column. 'column'/'delta' required.",
|
|
690
693
|
"view.transform.join": "Join another view. 'foreign_view'/'join_type'/'on'/'select' required.",
|
|
691
694
|
"view.transform.json-extract": "Extract fields from a JSON column. 'column' is required.",
|
|
692
|
-
"view.transform.limit-rows": "Limit the row count. 'n' is required.",
|
|
695
|
+
"view.transform.limit-rows": "Limit the row count. 'n' (or its alias 'limit') is required.",
|
|
693
696
|
"view.transform.lookup": "Look up values from another view. 'source'/'lookup_view_id'/'key'/",
|
|
694
697
|
"view.transform.math": "Evaluate a math expression into a column. 'expression' is required.",
|
|
695
698
|
"view.transform.pivot": "Pivot with aggregations. 'group_by'/'aggregations' required.",
|
|
@@ -885,6 +885,9 @@ _TARGETS: dict[str, str] = {
|
|
|
885
885
|
"mammoth_cli.commands.view:view_conditional_format_delete_all"
|
|
886
886
|
),
|
|
887
887
|
"view.conditional-format.list": "mammoth_cli.commands.view:view_conditional_format_list",
|
|
888
|
+
"view.conditional-format.replace": (
|
|
889
|
+
"mammoth_cli.commands.view:view_conditional_format_replace"
|
|
890
|
+
),
|
|
888
891
|
"view.conditional-format.update": "mammoth_cli.commands.view:view_conditional_format_update",
|
|
889
892
|
"view.checkpoint.create": "mammoth_cli.commands.view:view_checkpoint_create",
|
|
890
893
|
"view.checkpoint.delete": "mammoth_cli.commands.view:view_checkpoint_delete",
|
|
@@ -924,6 +927,7 @@ _TARGETS: dict[str, str] = {
|
|
|
924
927
|
"view.task.update": "mammoth_cli.commands.view:view_task_update",
|
|
925
928
|
"view.export.create": "mammoth_cli.commands.view:view_export_create",
|
|
926
929
|
"view.export.csv": "mammoth_cli.commands.view:view_export_csv",
|
|
930
|
+
"view.export.download": "mammoth_cli.commands.view:view_export_download",
|
|
927
931
|
"view.export.delete": "mammoth_cli.commands.view:view_export_delete",
|
|
928
932
|
"view.export.get": "mammoth_cli.commands.view:view_export_get",
|
|
929
933
|
"view.export.list": "mammoth_cli.commands.view:view_export_list",
|
|
@@ -1005,6 +1009,7 @@ _TARGETS: dict[str, str] = {
|
|
|
1005
1009
|
"view.transform.generate-sql": "mammoth_cli.commands.view_ops:view_transform_generate_sql",
|
|
1006
1010
|
"view.transform.increment-date": "mammoth_cli.commands.view_ops:view_transform_increment_date",
|
|
1007
1011
|
"view.transform.join": "mammoth_cli.commands.view_ops:view_transform_join",
|
|
1012
|
+
"view.column.format.set": "mammoth_cli.commands.view_ops:view_column_format_set",
|
|
1008
1013
|
"view.transform.json-extract": "mammoth_cli.commands.view_ops:view_transform_json_extract",
|
|
1009
1014
|
"view.transform.limit-rows": "mammoth_cli.commands.view_ops:view_transform_limit_rows",
|
|
1010
1015
|
"view.transform.lookup": "mammoth_cli.commands.view_ops:view_transform_lookup",
|
|
@@ -224,6 +224,10 @@ _COMMAND_DISCOVERY_PURPOSES = {
|
|
|
224
224
|
"file.delete": "delete remove uploaded source file csv",
|
|
225
225
|
"file.list": "list show uploaded source files csv",
|
|
226
226
|
"view.export.csv": "export download local CSV file artifact",
|
|
227
|
+
"view.export.download": (
|
|
228
|
+
"export download local file artifact xlsx excel json ndjson xml yaml parquet "
|
|
229
|
+
"file type format"
|
|
230
|
+
),
|
|
227
231
|
"view.export.dataset": (
|
|
228
232
|
"send copy branch out create save the result rows into a new project from an "
|
|
229
233
|
"existing append appending union stack monthly rows across datasets views "
|
|
@@ -431,6 +435,15 @@ _COMMAND_DISCOVERY_PURPOSES = {
|
|
|
431
435
|
"view.transform.rename-columns": (
|
|
432
436
|
"rename column columns header headers relabel change column name names title"
|
|
433
437
|
),
|
|
438
|
+
"view.column.format.set": (
|
|
439
|
+
"format display column date format number format decimals decimal places currency "
|
|
440
|
+
"symbol percent percentage thousands separator show dates as how values look grid "
|
|
441
|
+
"date display"
|
|
442
|
+
),
|
|
443
|
+
"view.conditional-format.replace": (
|
|
444
|
+
"replace redo reset change all conditional formatting rules highlight colour color "
|
|
445
|
+
"existing rules in one call"
|
|
446
|
+
),
|
|
434
447
|
"view.transform.replace": "find replace substitute text value in columns",
|
|
435
448
|
"view.transform.set-values": (
|
|
436
449
|
"set values assign overwrite blank empty default where condition label "
|
|
@@ -952,7 +965,8 @@ IN_PLACE_RECIPE = (
|
|
|
952
965
|
"EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view "
|
|
953
966
|
"and its dataset's output. To make a NEW dataset and leave the source untouched: "
|
|
954
967
|
"`mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working "
|
|
955
|
-
"view, then `mammoth view export dataset WORKING_VIEW_ID`
|
|
968
|
+
"view, then `mammoth view export dataset WORKING_VIEW_ID` "
|
|
969
|
+
"(add dataset_name only if the user named it)."
|
|
956
970
|
)
|
|
957
971
|
_IN_PLACE_KEYWORDS = (
|
|
958
972
|
"new dataset create make in place edits given view working view source untouched"
|
|
@@ -1183,17 +1197,53 @@ def _accepted_fields(record: dict[str, Any]) -> list[dict[str, Any]] | None:
|
|
|
1183
1197
|
]
|
|
1184
1198
|
|
|
1185
1199
|
|
|
1200
|
+
_INLINE_SCHEMA_MAX_CHARS = 3000
|
|
1201
|
+
#: A restrictions note (where a nested input shape often lives) is inlined up to this long.
|
|
1202
|
+
_INLINE_NOTES_MAX_CHARS = 700
|
|
1203
|
+
|
|
1204
|
+
|
|
1186
1205
|
def _compact_accepted_fields(record: dict[str, Any]) -> list[dict[str, Any]] | None:
|
|
1187
|
-
"""``_accepted_fields``
|
|
1206
|
+
"""``_accepted_fields`` with a nested JSON Schema only where the type name is not enough.
|
|
1188
1207
|
|
|
1189
1208
|
A find result inlines this for its top matches: enough to compose a call
|
|
1190
|
-
(name, type, required, enum) without
|
|
1191
|
-
|
|
1209
|
+
(name, type, required, enum) without a follow-up ``schema get``. A
|
|
1210
|
+
non-scalar field (e.g. convert-type's ``conversions``) also carries its
|
|
1211
|
+
JSON Schema, unless that would be larger than ``_INLINE_SCHEMA_MAX_CHARS``.
|
|
1192
1212
|
"""
|
|
1193
1213
|
fields = _accepted_fields(record)
|
|
1194
1214
|
if fields is None:
|
|
1195
1215
|
return None
|
|
1196
|
-
|
|
1216
|
+
compact: list[dict[str, Any]] = []
|
|
1217
|
+
for field in fields:
|
|
1218
|
+
item = {key: field[key] for key in ("name", "type", "required", "enum")}
|
|
1219
|
+
schema = field.get("schema")
|
|
1220
|
+
if (
|
|
1221
|
+
schema is not None
|
|
1222
|
+
and not _is_scalar_field_schema(schema)
|
|
1223
|
+
and len(json.dumps(schema, default=str)) <= _INLINE_SCHEMA_MAX_CHARS
|
|
1224
|
+
):
|
|
1225
|
+
item["schema"] = schema
|
|
1226
|
+
compact.append(item)
|
|
1227
|
+
return compact
|
|
1228
|
+
|
|
1229
|
+
|
|
1230
|
+
def input_contract(command_id: str) -> dict[str, Any] | None:
|
|
1231
|
+
"""The input shape a rejected call should have used: fields (with nested shapes) and an example.
|
|
1232
|
+
|
|
1233
|
+
Attached to input-validation errors so the caller can correct the call
|
|
1234
|
+
without a ``schema get`` round trip. ``None`` for a command with no
|
|
1235
|
+
manifest record or no accepted fields.
|
|
1236
|
+
"""
|
|
1237
|
+
record = command_by_id(command_id)
|
|
1238
|
+
if record is None:
|
|
1239
|
+
return None
|
|
1240
|
+
fields = _compact_accepted_fields(record)
|
|
1241
|
+
if fields is None:
|
|
1242
|
+
return None
|
|
1243
|
+
contract: dict[str, Any] = {"command_id": command_id, "accepted_fields": fields}
|
|
1244
|
+
if record.get("agent_example"):
|
|
1245
|
+
contract["agent_example"] = record["agent_example"]
|
|
1246
|
+
return contract
|
|
1197
1247
|
|
|
1198
1248
|
|
|
1199
1249
|
def _externally_supplied_fields(command_id: str) -> frozenset[str]:
|
|
@@ -2215,6 +2265,10 @@ def _inline_call_detail(entries: list[dict[str, Any]]) -> None:
|
|
|
2215
2265
|
entry["accepted_fields"] = fields
|
|
2216
2266
|
if record.get("agent_example"):
|
|
2217
2267
|
entry["agent_example"] = record["agent_example"]
|
|
2268
|
+
notes = record.get("known_restrictions")
|
|
2269
|
+
if isinstance(notes, str) and notes:
|
|
2270
|
+
cut = notes[:_INLINE_NOTES_MAX_CHARS]
|
|
2271
|
+
entry["known_restrictions"] = cut + ("..." if len(notes) > len(cut) else "")
|
|
2218
2272
|
|
|
2219
2273
|
|
|
2220
2274
|
def _inline_picks(page: list[dict[str, Any]], offset: int) -> list[dict[str, Any]]:
|