mammoth-cli 2.0.15__tar.gz → 2.0.17__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.0.15 → mammoth_cli-2.0.17}/PKG-INFO +2 -2
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/__init__.py +1 -1
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +20 -3
- mammoth_cli-2.0.17/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +268 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +1 -1
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +7 -7
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +6 -2
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +50 -2
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/file.py +53 -13
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/schema.py +18 -1
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/view.py +16 -2
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/runtime/strict.py +33 -2
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/services/input_fields.py +35 -2
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/services/sdk_service.py +44 -20
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/pyproject.toml +2 -2
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/batch.yaml +2 -2
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/view.yaml +14 -9
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/sdk-methods.yaml +1 -1
- mammoth_cli-2.0.15/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -274
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/.gitignore +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/LICENSE +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/README.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/__main__.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/app.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/__init__.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/activity.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/addon.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/agent.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/ai.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/annotation.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/auth.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/automation.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/batch.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/billing.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/browse.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/capability.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/client_app.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/completion.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/config.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/connector.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/context.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/dashboard.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/data_app.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/dataset.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/doctor.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/external_key.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/folder.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/job.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/notification.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/parameter.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/project.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/registry.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/report.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/schedule.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/skill.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/snippet.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/support.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/template.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/trash.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/upgrade.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/user.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/view_ops.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/webhook.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/workflow.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/commands/workspace.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/context/__init__.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/context/credentials.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/context/endpoint.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/context/profiles.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/context/resolver.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/contracts/__init__.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/contracts/auth.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/errors/__init__.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/errors/envelope.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/manifest/__init__.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/manifest/loader.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/messages/__init__.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/output/__init__.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/output/envelope.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/output/normalize.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/output/policy.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/output/progress.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/output/render.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/py.typed +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/runtime/__init__.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/runtime/confirm.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/runtime/executor.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/runtime/input_loader.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/runtime/invocation.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/runtime/options.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/runtime/session.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/runtime/validate.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/services/__init__.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/services/argspec.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/services/coerce.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/services/command_contract.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/services/conditions.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/services/dispatch.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/services/factory.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/services/mapping.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/services/openapi_types.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/services/positionals.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/services/protocol.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/services/testing.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/services/type_system.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/skills/__init__.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/skills/installer.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/mammoth_cli/testing.py +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/activity.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/addon.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/agent.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/ai.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/annotation.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/auth.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/automation.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/billing.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/browse.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/capability.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/client-app.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/completion.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/config.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/connector.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/context.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/dashboard.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/data-app.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/dataset.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/doctor.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/external-key.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/file.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/folder.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/job.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/notification.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/parameter.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/project.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/report.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/schedule.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/schema.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/skill.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/snippet.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/support.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/template.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/trash.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/upgrade.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/user.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/version.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/webhook.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/workflow.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/commands/workspace.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/openapi-operations.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/schema-v1.json +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/manifests/sdk-catalog.source.yaml +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/openapi/metadata.json +0 -0
- {mammoth_cli-2.0.15 → mammoth_cli-2.0.17}/spec/openapi/openapi.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mammoth-cli
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.17
|
|
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
|
|
@@ -17,7 +17,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
17
17
|
Requires-Python: <3.15,>=3.12
|
|
18
18
|
Requires-Dist: jsonschema>=4.20
|
|
19
19
|
Requires-Dist: keyring<26,>=25.7
|
|
20
|
-
Requires-Dist: mammoth-io<0.8,>=0.7.
|
|
20
|
+
Requires-Dist: mammoth-io<0.8,>=0.7.9
|
|
21
21
|
Requires-Dist: platformdirs<5,>=4.10
|
|
22
22
|
Requires-Dist: pydantic<3,>=2.13
|
|
23
23
|
Requires-Dist: pyyaml<7,>=6
|
|
@@ -38,11 +38,18 @@ the result.
|
|
|
38
38
|
|
|
39
39
|
## Working rules
|
|
40
40
|
|
|
41
|
+
- Every command takes its resource ids as positionals, its request fields as
|
|
42
|
+
one `--input` JSON document, plus the shared global options (`--project`,
|
|
43
|
+
`--profile`, `--output`, `--no-input`, `--yes`, `--confirm`, timeouts).
|
|
44
|
+
There are no per-field flags: `project create NAME`, not `project create
|
|
45
|
+
--name NAME`. `schema get COMMAND_ID` lists the positionals and input fields.
|
|
41
46
|
- Resolve workspace/project/dataset/view parents from reads; pass observed IDs
|
|
42
47
|
and `--project`. A dataset does not select a default view. Every `view`
|
|
43
48
|
command that changes, exports, or deletes data requires the exact parent
|
|
44
|
-
`DATASET_ID`
|
|
45
|
-
|
|
49
|
+
`DATASET_ID`: `view transform *` and `view draft *` take it as the
|
|
50
|
+
`dataset_id` input field, every other `view` command as the trailing
|
|
51
|
+
positional after `VIEW_ID`; only reads may omit it and discover the parent.
|
|
52
|
+
Get it from `mammoth view get VIEW_ID`.
|
|
46
53
|
- Uploads and dataset creation return a **dataset** id. Transforms, joins,
|
|
47
54
|
exports, and previews need a **view** id: run `view list DATASET_ID
|
|
48
55
|
--project PROJECT_ID` to get it. See
|
|
@@ -51,6 +58,13 @@ the result.
|
|
|
51
58
|
never backend aliases.
|
|
52
59
|
- Inspect the result after a mutation. A timeout, exit 7, or interruption does
|
|
53
60
|
not prove it failed. Reconcile an `outcome_unknown` before replaying it.
|
|
61
|
+
- A success envelope is not proof the mutation did what you meant. After a
|
|
62
|
+
row-scoped change (set-values, filter, replace, join, fill) read rows back
|
|
63
|
+
with `view data get VIEW_ID DATASET_ID` and check both rows the condition
|
|
64
|
+
should have touched and rows it should not have. A uniform result (every
|
|
65
|
+
amount 0, every region "Unknown", most join rows unmatched) is a signal
|
|
66
|
+
that the previous step went wrong, not a fact about the source data: stop
|
|
67
|
+
and re-inspect that step before building anything on it.
|
|
54
68
|
- Keep secrets out of argv, task notes, checkpoints, logs, and responses.
|
|
55
69
|
- Preserve requested deliverables. Cleanup is exact-ID authorized and never means delete-all-owned-resources.
|
|
56
70
|
|
|
@@ -64,7 +78,10 @@ the result.
|
|
|
64
78
|
or [recovery](references/recovery.md)
|
|
65
79
|
- **Import, resources, transforms, pipelines, dashboards, exports, or cleanup:**
|
|
66
80
|
[recipes](references/recipes/index.md) and [operations](references/operations.md)
|
|
67
|
-
- **A known command family or exact command:** [command catalog](references/command-index.md)
|
|
81
|
+
- **A known command family or exact command:** [command catalog](references/command-index.md),
|
|
82
|
+
then check the same command in [capabilities](references/capabilities.md)
|
|
83
|
+
before composing input from its example (the catalog lists retired and
|
|
84
|
+
blocked routes with the same wording as working ones)
|
|
68
85
|
- **Whether a route is proven, known-blocked, or untried on release:**
|
|
69
86
|
[capabilities](references/capabilities.md) — read it before promising a
|
|
70
87
|
deliverable or reporting a failure as a backend fault
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
# What is proven on release
|
|
2
|
+
|
|
3
|
+
Generated from `docs/release-capability-matrix.json`; do not edit by hand.
|
|
4
|
+
455 API operations have a CLI command. 227 were exercised successfully on release, 2 are not supported there, and the rest are untried. Untried is not broken: discover the contract with `mammoth schema get COMMAND_ID --output json --no-input`, run it, and treat the structured error envelope as the answer.
|
|
5
|
+
|
|
6
|
+
Status meanings:
|
|
7
|
+
|
|
8
|
+
- **verified**: one bounded live run on release returned a success envelope (single path; variants and error paths are usually untested).
|
|
9
|
+
- **not supported**: the backend refuses the route on release; the note says why and what to use instead.
|
|
10
|
+
- **observed blocker**: the last run hit an error; the note quotes it. Re-check before relying on the route, and do not retry the same input.
|
|
11
|
+
- **CLI defect fixed, untried since**: the failure was on the CLI side and this release repairs it; nobody has re-run the route yet.
|
|
12
|
+
- Commands not listed under a family are untried.
|
|
13
|
+
|
|
14
|
+
The typed `view transform *` commands all submit through `view.task.add`; its row below carries the transformations proven end to end (filter, fill-missing, join, pivot with an exported summary). A transformation not named there has the same untried status as any other command.
|
|
15
|
+
|
|
16
|
+
## Coverage by family
|
|
17
|
+
|
|
18
|
+
| Family | Commands | Verified | Not supported | Untried |
|
|
19
|
+
|---|---|---|---|---|
|
|
20
|
+
| `dashboard` | 104 | 81 | 2 | 21 |
|
|
21
|
+
| `view` | 62 | 52 | 0 | 10 |
|
|
22
|
+
| `support` | 45 | 9 | 0 | 36 |
|
|
23
|
+
| `billing` | 23 | 4 | 0 | 19 |
|
|
24
|
+
| `connector` | 22 | 2 | 0 | 20 |
|
|
25
|
+
| `workspace` | 19 | 7 | 0 | 12 |
|
|
26
|
+
| `project` | 17 | 15 | 0 | 2 |
|
|
27
|
+
| `workflow` | 16 | 5 | 0 | 11 |
|
|
28
|
+
| `dataset` | 15 | 12 | 0 | 3 |
|
|
29
|
+
| `parameter` | 14 | 2 | 0 | 12 |
|
|
30
|
+
| `data-app` | 12 | 1 | 0 | 11 |
|
|
31
|
+
| `folder` | 8 | 8 | 0 | 0 |
|
|
32
|
+
| `snippet` | 8 | 1 | 0 | 7 |
|
|
33
|
+
| `automation` | 7 | 1 | 0 | 6 |
|
|
34
|
+
| `user` | 7 | 3 | 0 | 4 |
|
|
35
|
+
| `webhook` | 7 | 0 | 0 | 7 |
|
|
36
|
+
| `addon` | 6 | 0 | 0 | 6 |
|
|
37
|
+
| `batch` | 6 | 5 | 0 | 1 |
|
|
38
|
+
| `file` | 6 | 5 | 0 | 1 |
|
|
39
|
+
| `agent` | 5 | 1 | 0 | 4 |
|
|
40
|
+
| `ai` | 5 | 2 | 0 | 3 |
|
|
41
|
+
| `annotation` | 5 | 1 | 0 | 4 |
|
|
42
|
+
| `client-app` | 5 | 0 | 0 | 5 |
|
|
43
|
+
| `notification` | 5 | 1 | 0 | 4 |
|
|
44
|
+
| `schedule` | 5 | 0 | 0 | 5 |
|
|
45
|
+
| `template` | 5 | 0 | 0 | 5 |
|
|
46
|
+
| `browse` | 4 | 2 | 0 | 2 |
|
|
47
|
+
| `external-key` | 4 | 0 | 0 | 4 |
|
|
48
|
+
| `trash` | 3 | 3 | 0 | 0 |
|
|
49
|
+
| `activity` | 2 | 1 | 0 | 1 |
|
|
50
|
+
| `job` | 2 | 2 | 0 | 0 |
|
|
51
|
+
| `report` | 1 | 1 | 0 | 0 |
|
|
52
|
+
|
|
53
|
+
## `activity`
|
|
54
|
+
|
|
55
|
+
Verified: `activity.list`
|
|
56
|
+
|
|
57
|
+
| Command | State | Note |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| `activity.export` | observed blocker | server_error: see sweep report |
|
|
60
|
+
|
|
61
|
+
## `agent`
|
|
62
|
+
|
|
63
|
+
Verified: `agent.session.list`
|
|
64
|
+
|
|
65
|
+
## `ai`
|
|
66
|
+
|
|
67
|
+
Verified: `ai.condition.generate`, `ai.expression.generate`
|
|
68
|
+
|
|
69
|
+
| Command | State | Note |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| `ai.retention.condition` | observed blocker | permission: POST /workspaces/4/projects/24/sql_generation/retention_policy -> HTTP 403 4PERM001 PERMISSION_UNDEFINED, error_object {code:76,message:'Permissions have not been set c |
|
|
72
|
+
| `ai.sql.generate` | observed blocker | backend_error: Fix held (dataset_id required and sent as query param -- request reached backend and got a domain-specific conflict, not an empty api_error) |
|
|
73
|
+
| `ai.suggestion.list` | observed blocker | backend_error: Fix held: release UnifiedPromptSpec (suggestion_type + params, optional dataset_id/dataview_id) shape accepted and dispatched to a real job (id 381), which failed fo |
|
|
74
|
+
|
|
75
|
+
## `annotation`
|
|
76
|
+
|
|
77
|
+
Verified: `annotation.list`
|
|
78
|
+
|
|
79
|
+
## `automation`
|
|
80
|
+
|
|
81
|
+
Verified: `automation.list`
|
|
82
|
+
|
|
83
|
+
## `batch`
|
|
84
|
+
|
|
85
|
+
Verified: `batch.bulk-delete`, `batch.delete`, `batch.get`, `batch.list`, `batch.update`
|
|
86
|
+
|
|
87
|
+
| Command | State | Note |
|
|
88
|
+
|---|---|---|
|
|
89
|
+
| `batch.create` | CLI defect fixed, untried since | 2.0.16 (mapping items carry expected_destination_c_type (TEXT/NUMERIC/DATE) |
|
|
90
|
+
|
|
91
|
+
## `billing`
|
|
92
|
+
|
|
93
|
+
Verified: `billing.stripe.history`, `billing.stripe.payment-method.list`, `billing.stripe.status`, `billing.subscription.get`
|
|
94
|
+
|
|
95
|
+
| Command | State | Note |
|
|
96
|
+
|---|---|---|
|
|
97
|
+
| `billing.chargebee-plan` | observed blocker | backend_error: The CLI gates this GET behind --yes --confirm WORKSPACE_ID; with confirmation: HTTP 400 4SUBS014 'Chargebee plan not found for the given workspace' (workspace 4 is n |
|
|
98
|
+
| `billing.invoice.get` | observed blocker | blocked_missing_fixture: The CLI gates this GET behind --yes --confirm WORKSPACE_ID; with confirmation: billing invoice list answered HTTP 500, so no invoice id was observed |
|
|
99
|
+
| `billing.invoice.list` | observed blocker | backend_error: The CLI gates this GET behind --yes --confirm WORKSPACE_ID; with confirmation: HTTP 500 with empty body on GET /workspaces/4/subscription_v1/invoices |
|
|
100
|
+
| `billing.stripe.preview-invoice` | observed blocker | backend_error: The CLI gates this GET behind --yes --confirm WORKSPACE_ID; with confirmation: HTTP 400 4SUBS037 'Failed to perform subscription operation' |
|
|
101
|
+
| `billing.stripe.upcoming-invoice` | observed blocker | backend_error: The CLI gates this GET behind --yes --confirm WORKSPACE_ID; with confirmation: HTTP 400 4SUBS074 'Upcoming invoice not found' (no active Stripe subscription on works |
|
|
102
|
+
| `billing.stripe.usage` | observed blocker | backend_error: The CLI gates this GET behind --yes --confirm WORKSPACE_ID; with confirmation: HTTP 400 5GENR010 UNKNOWN_ERROR 'Unknown error occurred |
|
|
103
|
+
|
|
104
|
+
## `browse`
|
|
105
|
+
|
|
106
|
+
Verified: `browse.project`, `browse.workspace`
|
|
107
|
+
|
|
108
|
+
| Command | State | Note |
|
|
109
|
+
|---|---|---|
|
|
110
|
+
| `browse.folder` | observed blocker | cli_error: rejects folder id 0 although folder.root reports id 0 as the root |
|
|
111
|
+
| `browse.root` | observed blocker | server_error: see sweep report |
|
|
112
|
+
|
|
113
|
+
## `client-app`
|
|
114
|
+
|
|
115
|
+
| Command | State | Note |
|
|
116
|
+
|---|---|---|
|
|
117
|
+
| `client-app.list` | observed blocker | forbidden: backend_code=4GENR012 INVALID_TOKEN_FOR_CLIENT_APPS: 'Cannot access this API with API-tokens' on GET /workspaces/4/clientapps |
|
|
118
|
+
|
|
119
|
+
## `connector`
|
|
120
|
+
|
|
121
|
+
Verified: `connector.active`, `connector.list`
|
|
122
|
+
|
|
123
|
+
| Command | State | Note |
|
|
124
|
+
|---|---|---|
|
|
125
|
+
| `connector.ai.session.list` | observed blocker | cli_error: backend returned HTTP 200 but the CLI raised api_error (envelope mismatch) |
|
|
126
|
+
| `connector.connection.list` | observed blocker | server_error: see sweep report |
|
|
127
|
+
| `connector.get` | observed blocker | validation_error: HTTP 400 'Invalid connector key' for a key returned by connector.list |
|
|
128
|
+
| `connector.query.generate` | observed blocker | blocked_missing_fixture: No real connector connection exists in workspace 4 (connector.list shows all is_added:false; connector.active returns []), matching the documented capabili |
|
|
129
|
+
| `connector.query.status` | observed blocker | blocked_missing_fixture: No real connector connection exists in workspace 4 (connector list shows all is_added:false; connector active returns []) and creating one requires externa |
|
|
130
|
+
|
|
131
|
+
## `dashboard`
|
|
132
|
+
|
|
133
|
+
Verified: `dashboard.action`, `dashboard.analytics`, `dashboard.archive`, `dashboard.cancel-generation`, `dashboard.canvas.get`, `dashboard.canvas.restore`, `dashboard.canvas.save`, `dashboard.chat.edit`, `dashboard.chat.history`, `dashboard.context.create`, `dashboard.context.delete`, `dashboard.context.extract`, `dashboard.context.list`, `dashboard.context.update`, `dashboard.create-blank`, `dashboard.delete`, `dashboard.descriptor-data`, `dashboard.duplicate`, `dashboard.exemplar.extract`, `dashboard.figure-intent`, `dashboard.get`, `dashboard.get-by-url`, `dashboard.job-by-url`, `dashboard.list`, `dashboard.og-card`, `dashboard.page.plan`, `dashboard.pages.add`, `dashboard.published.canvas`, `dashboard.published.share-page`, `dashboard.qa.ask`, `dashboard.qa.comment.create`, `dashboard.qa.comment.delete`, `dashboard.qa.feedback`, `dashboard.qa.session.create`, `dashboard.qa.session.delete`, `dashboard.qa.session.fork`, `dashboard.qa.session.get`, `dashboard.qa.session.list`, `dashboard.qa.session.rename`, `dashboard.qa.session.set-visibility`, `dashboard.qa.settings.get`, `dashboard.qa.settings.set`, `dashboard.query`, `dashboard.restore`, `dashboard.rls.assignment.list`, `dashboard.rls.assignment.set`, `dashboard.rls.column.list`, `dashboard.rls.value.list`, `dashboard.share`, `dashboard.signature.create`, `dashboard.signature.delete`, `dashboard.signature.list`, `dashboard.signature.update`, `dashboard.style.custom.create`, `dashboard.style.custom.delete`, `dashboard.style.custom.list`, `dashboard.style.custom.update`, `dashboard.style.default.get`, `dashboard.style.default.set`, `dashboard.style.derive`, `dashboard.style.extract-brand`, `dashboard.style.preset.list`, `dashboard.style.token.list`, `dashboard.suggestion.list`, `dashboard.swap-data`, `dashboard.tags.delete`, `dashboard.tags.list`, `dashboard.tags.merge`, `dashboard.tags.rename`, `dashboard.tags.set`, `dashboard.template.apply`, `dashboard.template.fit`, `dashboard.template.get`, `dashboard.template.list`, `dashboard.template.preview`, `dashboard.template.resolve-mapping`, `dashboard.templates.pending`, `dashboard.trash`, `dashboard.update`, `dashboard.v3.generate`, `dashboard.video-state`
|
|
134
|
+
|
|
135
|
+
| Command | State | Note |
|
|
136
|
+
|---|---|---|
|
|
137
|
+
| `dashboard.create` | not supported | Not supported on release: backend returns HTTP 409 4DASH012 DASHBOARD_LEGACY_CREATION_RETIRED (legacy dashboard creation retired). Use dashboard.create-blank or dashboard.v3.generate. Dashboard sweep 2026-09-18, CLI 2.0.12. |
|
|
138
|
+
| `dashboard.pdf.export` | not supported | Not supported from the CLI on release: backend HTTP 400 4GENR001 requires params.data to be the browser-hydrated DashboardData map and states it cannot rebuild it from stored descriptors (dashboard sweep and Haiku e2e, 2026-09-18). The route works only with a client render pass. |
|
|
139
|
+
| `dashboard.data.draft` | observed blocker | blocked_missing_fixture: Dashboard 56 (create-blank/v3 engine) has no widgets in its canvas and getDraftData rejects with backend_code 4DASH004 DASHBOARD_WRONG_ENGINE: "This dashbo |
|
|
140
|
+
| `dashboard.data.published` | observed blocker | blocked_missing_fixture: Same as dashboard.data.draft: backend_code 4DASH004 DASHBOARD_WRONG_ENGINE on /dashboards/56/getPublishData |
|
|
141
|
+
| `dashboard.published-data-by-url` | observed blocker | blocked_missing_fixture: backend_code 4DASH004 DASHBOARD_WRONG_ENGINE on /dashboards/url/IuZl5tk5KcEHJWTy4tnhrA/getPublishData, same class of blocker as widget-data: this v3 dashbo |
|
|
142
|
+
| `dashboard.published.data` | observed blocker | blocked_missing_fixture: Could not publish dashboard 59 to reach a live published state: `dashboard action 59 {action:publish-presentation}` failed twice with HTTP 500 outcome_unkn |
|
|
143
|
+
| `dashboard.published.pdf-artifact` | observed blocker | blocked_missing_fixture: Same as dashboard.pdf-artifact: no real pdf job available; used job 313 (descriptor-data job) as the only real job id in hand and got backend_code 4DASH001 |
|
|
144
|
+
| `dashboard.published.pdf.export` | observed blocker | backend_error: Got backend_code 4PERM002 PERMISSION_ERROR, "User lacks permission to perform given action" on POST /dashboards/url/IuZl5tk5KcEHJWTy4tnhrA/pdf (403), envelope: {"err |
|
|
145
|
+
| `dashboard.published.video.export` | observed blocker | backend_error: backend_code 4PERM002 PERMISSION_ERROR, "User lacks permission to perform given action" on POST /dashboards/url/IuZl5tk5KcEHJWTy4tnhrA/video (403) |
|
|
146
|
+
| `dashboard.source.list` | observed blocker | blocker; still broken, not one of the 11 CLI-fixed commands |
|
|
147
|
+
| `dashboard.template.create` | observed blocker | backend: POST /dashboards/v3/templates -> HTTP 500, empty response_body, request_id:null, code:outcome_unknown |
|
|
148
|
+
| `dashboard.template.delete` | observed blocker | blocked_missing_fixture: dashboard.template.create never produced an owned template (HTTP 500 both attempts, reconciled as not-committed via template list) |
|
|
149
|
+
| `dashboard.templates.use` | observed blocker | skipped_out_of_scope: BRIEF instructs running templates.use "on that template" (i.e |
|
|
150
|
+
| `dashboard.video.export` | observed blocker | backend_error: After publishing dashboard 56 (dashboard.share public + dashboard.action publish-presentation), the previously-documented "publish the dashboard before exporting a v |
|
|
151
|
+
| `dashboard.widget-data` | observed blocker | blocked_missing_fixture: backend_code 4DASH004 DASHBOARD_WRONG_ENGINE, "This dashboard uses a different rendering engine -- use the matching endpoints", on POST /dashboards/56/widg |
|
|
152
|
+
| `dashboard.widget-data-by-url` | observed blocker | blocked_missing_fixture: Same backend_code 4DASH004 DASHBOARD_WRONG_ENGINE, on POST /dashboards/url/IuZl5tk5KcEHJWTy4tnhrA/widgets/data |
|
|
153
|
+
|
|
154
|
+
## `data-app`
|
|
155
|
+
|
|
156
|
+
Verified: `data-app.list`
|
|
157
|
+
|
|
158
|
+
## `dataset`
|
|
159
|
+
|
|
160
|
+
Verified: `dataset.batch-data`, `dataset.bulk-delete`, `dataset.create`, `dataset.data`, `dataset.delete`, `dataset.file-settings.get`, `dataset.file-settings.undo`, `dataset.file-settings.update`, `dataset.get`, `dataset.list`, `dataset.restore`, `dataset.trash`
|
|
161
|
+
|
|
162
|
+
| Command | State | Note |
|
|
163
|
+
|---|---|---|
|
|
164
|
+
| `dataset.bulk-update` | observed blocker | cli_error: Schema preconditions already flag this as BLOCKED[B07 DATASET_PATCH_UNTYPED]; reserved, not registered -- confirmed live |
|
|
165
|
+
| `dataset.create-from-pdf` | observed blocker | backend: POST /workspaces/4/projects/24/datasets-from-pdf |
|
|
166
|
+
|
|
167
|
+
## `external-key`
|
|
168
|
+
|
|
169
|
+
| Command | State | Note |
|
|
170
|
+
|---|---|---|
|
|
171
|
+
| `external-key.list` | observed blocker | cli_error: not_authenticated although the same session authenticated elsewhere |
|
|
172
|
+
|
|
173
|
+
## `file`
|
|
174
|
+
|
|
175
|
+
Verified: `file.bulk-delete`, `file.delete`, `file.get`, `file.list`, `file.upload`
|
|
176
|
+
|
|
177
|
+
| Command | State | Note |
|
|
178
|
+
|---|---|---|
|
|
179
|
+
| `file.update` | observed blocker | backend_error: CLI accepted the typed patch and submitted job 314 (handle_file on /workspaces/4/projects/21/files/50), then correctly reported timeout after 60s with recovery_comma |
|
|
180
|
+
|
|
181
|
+
## `folder`
|
|
182
|
+
|
|
183
|
+
Verified: `folder.bulk-delete`, `folder.create`, `folder.delete`, `folder.get`, `folder.list`, `folder.move`, `folder.trash`, `folder.update`
|
|
184
|
+
|
|
185
|
+
## `job`
|
|
186
|
+
|
|
187
|
+
Verified: `job.get`, `job.get-many`
|
|
188
|
+
|
|
189
|
+
## `notification`
|
|
190
|
+
|
|
191
|
+
Verified: `notification.list`
|
|
192
|
+
|
|
193
|
+
## `parameter`
|
|
194
|
+
|
|
195
|
+
Verified: `parameter.group.list`, `parameter.list`
|
|
196
|
+
|
|
197
|
+
## `project`
|
|
198
|
+
|
|
199
|
+
Verified: `project.bulk-delete`, `project.bulk-update`, `project.checkpoint.list`, `project.create`, `project.data-check.list`, `project.delete`, `project.list`, `project.pending-changes`, `project.publish-credentials`, `project.resource-dependencies`, `project.resource-dependencies.update`, `project.resource-status`, `project.sample-flow`, `project.update`, `project.user.add`
|
|
200
|
+
|
|
201
|
+
| Command | State | Note |
|
|
202
|
+
|---|---|---|
|
|
203
|
+
| `project.user.update` | observed blocker | backend_error: HTTP 400 4PROJ010 ROLE_ALREADY_ASSIGNED: "Role already assigned to the user" -- targeted our own user (id 5, already project_admin as project owner) |
|
|
204
|
+
|
|
205
|
+
## `report`
|
|
206
|
+
|
|
207
|
+
Verified: `report.list`
|
|
208
|
+
|
|
209
|
+
## `schedule`
|
|
210
|
+
|
|
211
|
+
| Command | State | Note |
|
|
212
|
+
|---|---|---|
|
|
213
|
+
| `schedule.get` | observed blocker | blocked_missing_fixture: Not run: id source schedule.list failed with backend_error (5GENR011 NOT_IMPLEMENTED, HTTP 400), so no schedule_id was observed to use |
|
|
214
|
+
| `schedule.list` | observed blocker | backend_error: backend_code=5GENR011 NOT_IMPLEMENTED: 'Not implemented' on GET /workspaces/4/projects/3/schedules |
|
|
215
|
+
|
|
216
|
+
## `snippet`
|
|
217
|
+
|
|
218
|
+
Verified: `snippet.list`
|
|
219
|
+
|
|
220
|
+
## `support`
|
|
221
|
+
|
|
222
|
+
Verified: `support.connector-profile.list`, `support.connector.list`, `support.feature-profile.list`, `support.feature.list`, `support.plan.chargebee-list`, `support.plan.list`, `support.plan.self-serve-list`, `support.user.list-all`, `support.workspace.list`
|
|
223
|
+
|
|
224
|
+
## `template`
|
|
225
|
+
|
|
226
|
+
| Command | State | Note |
|
|
227
|
+
|---|---|---|
|
|
228
|
+
| `template.list` | observed blocker | cli_error: backend returned HTTP 200 but the CLI raised api_error (envelope mismatch) |
|
|
229
|
+
|
|
230
|
+
## `trash`
|
|
231
|
+
|
|
232
|
+
Verified: `trash.add`, `trash.list`, `trash.restore`
|
|
233
|
+
|
|
234
|
+
## `user`
|
|
235
|
+
|
|
236
|
+
Verified: `user.get`, `user.preference.get`, `user.preference.update`
|
|
237
|
+
|
|
238
|
+
## `view`
|
|
239
|
+
|
|
240
|
+
Verified: `view.active-user.list`, `view.active-user.mark`, `view.ai.generate-data`, `view.ai.profile`, `view.bulk-delete`, `view.checkpoint.create`, `view.checkpoint.delete`, `view.checkpoint.list`, `view.conditional-format.create`, `view.conditional-format.delete-all`, `view.conditional-format.list`, `view.conditional-format.update`, `view.create`, `view.data-check.create`, `view.data-check.delete`, `view.data-check.get`, `view.data-check.list`, `view.data.get`, `view.data.query`, `view.delete`, `view.derivative.create`, `view.derivative.delete`, `view.derivative.list`, `view.derivative.update`, `view.draft.command`, `view.export.delete`, `view.export.get`, `view.export.list`, `view.export.publish-db`, `view.export.update`, `view.exportable-config.get`, `view.get`, `view.list`, `view.parameter-context`, `view.pipeline.edit`, `view.pipeline.get`, `view.pipeline.items`, `view.pipeline.rerun`, `view.preview`, `view.restore`, `view.task.add`, `view.task.delete`, `view.task.get`, `view.task.list`, `view.task.update`, `view.trash`, `view.version.apply`, `view.version.delete`, `view.version.get`, `view.version.list`, `view.version.update`
|
|
241
|
+
|
|
242
|
+
| Command | State | Note |
|
|
243
|
+
|---|---|---|
|
|
244
|
+
| `view.ai.generation-info` | observed blocker | backend: GET /workspaces/4/projects/24/datasets/54/dataviews/76/data/generate -> HTTP 400 5GENR011 NOT_IMPLEMENTED 'Not implemented', request_id:null |
|
|
245
|
+
| `view.checkpoint.get` | observed blocker | backend: GET /workspaces/4/projects/24/datasets/54/dataviews/76/pipeline/checkpoints/2 -> HTTP 500, empty response_body:{}, request_id:null, backend code: none surfaced (generic ap |
|
|
246
|
+
| `view.checkpoint.update` | observed blocker | backend_error: CLI-side fix (payload now carries value:null as required) held: the correctly-shaped request was dispatched and the backend returned HTTP 500 (not a CLI-side crash): |
|
|
247
|
+
| `view.data-check.update` | observed blocker | backend: PATCH .../pipeline/data-checks/3 -> HTTP 500, empty response_body, request_id:null, code:outcome_unknown |
|
|
248
|
+
| `view.derivative.data` | observed blocker | backend: POST .../derivatives/4/data -> HTTP 500, empty response_body, request_id:null, code:outcome_unknown |
|
|
249
|
+
| `view.export.create` | observed blocker | backend: CLI accepts the request (exit 0, job 358 accepted on POST /dataviews/76/actions), but job get 358 -> status:error, response:{"error":{"message":"'destination'"}} (a raw Py |
|
|
250
|
+
| `view.exportable-config.apply` | observed blocker | cli_error: Schema's own runnable_example (config:{tasks:[]}) fails: job_failed, response:{reason:(quote)dependencies(quote)} -- a raw Python KeyError, not a structured validation m |
|
|
251
|
+
| `view.task.preview` | observed blocker | backend_error: Fix held: the COPY task_spec is accepted and a task_preview job (406) is created; the job then fails backend-side with 'Object of type datetime is not JSON serializa |
|
|
252
|
+
| `view.export.publish-db-update` | CLI defect fixed, untried since | 2.0.16 (example value is the documented {"odbc_type": "postgres"} object (a bare string is rejected)) |
|
|
253
|
+
|
|
254
|
+
## `webhook`
|
|
255
|
+
|
|
256
|
+
| Command | State | Note |
|
|
257
|
+
|---|---|---|
|
|
258
|
+
| `webhook.list` | observed blocker | cli_error: api_error with no HTTP status recorded |
|
|
259
|
+
|
|
260
|
+
## `workflow`
|
|
261
|
+
|
|
262
|
+
Verified: `workflow.graph`, `workflow.list`, `workflow.workspace-datasets`, `workflow.workspace-exports`, `workflow.workspace-sources`
|
|
263
|
+
|
|
264
|
+
## `workspace`
|
|
265
|
+
|
|
266
|
+
Verified: `workspace.app-usage`, `workspace.get`, `workspace.list`, `workspace.segment.list`, `workspace.segment.update`, `workspace.storage-breakdown`, `workspace.user.list`
|
|
267
|
+
|
|
268
|
+
Evidence collected on CLI releases 1.1.5 through 2.0.17; each row's release is recorded in `docs/release-capability-matrix.json` (`evidence_version`). A row verified on an older release has not been re-run since unless its note says so. Details: `docs/capability-evidence/` in the repository.
|
|
@@ -12,7 +12,7 @@ Expected success: `BatchBulkDeleteResult` in the standard JSON envelope; mutatio
|
|
|
12
12
|
|
|
13
13
|
Run: `mammoth batch create`. Exact input fields: `mammoth schema get batch.create --output json --no-input`.
|
|
14
14
|
|
|
15
|
-
Example: `mammoth batch create 123 123 --input '{"mapping": {"
|
|
15
|
+
Example: `mammoth batch create 123 123 --input '{"mapping": [{"source_c_name": "column_1", "destination_c_name": "column_1", "expected_destination_c_type": "TEXT"}]}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
|
|
16
16
|
|
|
17
17
|
Expected success: `BatchCreateResult` in the standard JSON envelope; mutation `benign_mutation`, confirmation `none`, wait policy `returns_job`. On nonzero exit, inspect the JSON error envelope and its `recovery_commands`; do not guess request fields. See [representative envelopes](../machine-output.md) for concrete success/error shapes.
|
|
18
18
|
|
|
@@ -92,7 +92,7 @@ Expected success: `ViewCheckpointUpdateResult` in the standard JSON envelope; mu
|
|
|
92
92
|
|
|
93
93
|
Run: `mammoth view conditional-format create`. Exact input fields: `mammoth schema get view.conditional-format.create --output json --no-input`.
|
|
94
94
|
|
|
95
|
-
Example: `mammoth view conditional-format create 123 123 --input '{"rule": {"
|
|
95
|
+
Example: `mammoth view conditional-format create 123 123 --input '{"rule": {"cf_type": "RULE", "payload": {"FORMAT": {"name": "Flag open orders", "color": "red", "applies_to": "row", "column_ids": "[]"}, "CONDITION": {"OR": [{"column_1": {"CONTAINS": {"VALUE": ["Open"]}}}]}}}}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
|
|
96
96
|
|
|
97
97
|
Expected success: `ViewConditionalFormatCreateResult` in the standard JSON envelope; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`. On nonzero exit, inspect the JSON error envelope and its `recovery_commands`; do not guess request fields. See [representative envelopes](../machine-output.md) for concrete success/error shapes.
|
|
98
98
|
|
|
@@ -100,7 +100,7 @@ Expected success: `ViewConditionalFormatCreateResult` in the standard JSON envel
|
|
|
100
100
|
|
|
101
101
|
Run: `mammoth view conditional-format delete-all`. Exact input fields: `mammoth schema get view.conditional-format.delete-all --output json --no-input`.
|
|
102
102
|
|
|
103
|
-
Example: `mammoth view conditional-format delete-all 123 123 --input '{"rule_id": "
|
|
103
|
+
Example: `mammoth view conditional-format delete-all 123 123 --input '{"rule_id": "bca0ff33bd6f8ed1"}' --output json --no-input`. Illustrative only: append `--yes` after observing an owned target.
|
|
104
104
|
|
|
105
105
|
Expected success: `ViewConditionalFormatDeleteAllResult` in the standard JSON envelope; mutation `destructive`, confirmation `prompt_or_yes`, wait policy `not_async`. On nonzero exit, inspect the JSON error envelope and its `recovery_commands`; do not guess request fields. See [representative envelopes](../machine-output.md) for concrete success/error shapes.
|
|
106
106
|
|
|
@@ -446,7 +446,7 @@ Expected success: `ViewExportPublishDbResult` in the standard JSON envelope; mut
|
|
|
446
446
|
|
|
447
447
|
Run: `mammoth view export publish-db-update`. Exact input fields: `mammoth schema get view.export.publish-db-update --output json --no-input`.
|
|
448
448
|
|
|
449
|
-
Example: `mammoth view export publish-db-update 123 --input '{"patch": [{"op": "replace", "path": "credentials", "value": "postgres"}]}' --output json --no-input`. Illustrative only: append `--yes` after observing an owned target.
|
|
449
|
+
Example: `mammoth view export publish-db-update 123 --input '{"patch": [{"op": "replace", "path": "credentials", "value": {"odbc_type": "postgres"}}]}' --output json --no-input`. Illustrative only: append `--yes` after observing an owned target.
|
|
450
450
|
|
|
451
451
|
Expected success: `ViewExportPublishDbUpdateResult` in the standard JSON envelope; mutation `external_effect`, confirmation `yes_always`, wait policy `not_async`. On nonzero exit, inspect the JSON error envelope and its `recovery_commands`; do not guess request fields. See [representative envelopes](../machine-output.md) for concrete success/error shapes.
|
|
452
452
|
|
|
@@ -612,7 +612,7 @@ Expected success: `ViewRestoreResult` in the standard JSON envelope; mutation `b
|
|
|
612
612
|
|
|
613
613
|
Run: `mammoth view task add`. Exact input fields: `mammoth schema get view.task.add --output json --no-input`.
|
|
614
614
|
|
|
615
|
-
Example: `mammoth view task add 123 --input '{"task_spec": {"DATAVIEW_ID": 123, "SEQUENCE_NUMBER": 1, "COPY": {}}}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
|
|
615
|
+
Example: `mammoth view task add 123 --input '{"task_spec": {"DATAVIEW_ID": 123, "SEQUENCE_NUMBER": 1, "COPY": [{"SOURCE": "column_1", "AS": {"COLUMN": "Copy of column 1", "TYPE": "TEXT", "INTERNAL_NAME": "column_9"}}], "VERSION": 2}}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
|
|
616
616
|
|
|
617
617
|
Expected success: `ViewTaskAddResult` in the standard JSON envelope; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`. On nonzero exit, inspect the JSON error envelope and its `recovery_commands`; do not guess request fields. See [representative envelopes](../machine-output.md) for concrete success/error shapes.
|
|
618
618
|
|
|
@@ -644,7 +644,7 @@ Expected success: `ViewTaskListResult` in the standard JSON envelope; mutation `
|
|
|
644
644
|
|
|
645
645
|
Run: `mammoth view task preview`. Exact input fields: `mammoth schema get view.task.preview --output json --no-input`.
|
|
646
646
|
|
|
647
|
-
Example: `mammoth view task preview 123 --input '{"task_spec": {"DATAVIEW_ID": 123, "SEQUENCE_NUMBER": 1, "COPY": {}}}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
|
|
647
|
+
Example: `mammoth view task preview 123 --input '{"task_spec": {"DATAVIEW_ID": 123, "SEQUENCE_NUMBER": 1, "COPY": [{"SOURCE": "column_1", "AS": {"COLUMN": "Copy of column 1", "TYPE": "TEXT", "INTERNAL_NAME": "column_9"}}], "VERSION": 2}}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
|
|
648
648
|
|
|
649
649
|
Expected success: `ViewTaskPreviewResult` in the standard JSON envelope; mutation `read`, confirmation `none`, wait policy `always_wait`. On nonzero exit, inspect the JSON error envelope and its `recovery_commands`; do not guess request fields. See [representative envelopes](../machine-output.md) for concrete success/error shapes.
|
|
650
650
|
|
|
@@ -652,7 +652,7 @@ Expected success: `ViewTaskPreviewResult` in the standard JSON envelope; mutatio
|
|
|
652
652
|
|
|
653
653
|
Run: `mammoth view task update`. Exact input fields: `mammoth schema get view.task.update --output json --no-input`.
|
|
654
654
|
|
|
655
|
-
Example: `mammoth view task update 123 123 --input '{"task_spec": {"DATAVIEW_ID": 123, "SEQUENCE_NUMBER": 1, "COPY": {}}, "dataset_id": 456}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
|
|
655
|
+
Example: `mammoth view task update 123 123 --input '{"task_spec": {"DATAVIEW_ID": 123, "SEQUENCE_NUMBER": 1, "COPY": [{"SOURCE": "column_1", "AS": {"COLUMN": "Copy of column 1", "TYPE": "TEXT", "INTERNAL_NAME": "column_9"}}], "VERSION": 2}, "dataset_id": 456}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
|
|
656
656
|
|
|
657
657
|
Expected success: `ViewTaskUpdateResult` in the standard JSON envelope; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`. On nonzero exit, inspect the JSON error envelope and its `recovery_commands`; do not guess request fields. See [representative envelopes](../machine-output.md) for concrete success/error shapes.
|
|
658
658
|
|
|
@@ -668,7 +668,7 @@ Expected success: `ViewTransformAddColumnResult` in the standard JSON envelope;
|
|
|
668
668
|
|
|
669
669
|
Run: `mammoth view transform add-sql`. Exact input fields: `mammoth schema get view.transform.add-sql --output json --no-input`.
|
|
670
670
|
|
|
671
|
-
Example: `mammoth view transform add-sql 123 --input '{"query": "SELECT region, SUM(revenue) FROM
|
|
671
|
+
Example: `mammoth view transform add-sql 123 --input '{"query": "SELECT region, SUM(revenue) AS revenue FROM \"view:123\" GROUP BY region", "dataset_id": 456}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
|
|
672
672
|
|
|
673
673
|
Expected success: `ViewTransformAddSqlResult` in the standard JSON envelope; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`. On nonzero exit, inspect the JSON error envelope and its `recovery_commands`; do not guess request fields. See [representative envelopes](../machine-output.md) for concrete success/error shapes.
|
|
674
674
|
|
|
@@ -6,9 +6,11 @@ id instead. Run `view list DATASET_ID --project PROJECT_ID` to get it. Do not
|
|
|
6
6
|
dig through `dataset get` and its `dependencies` field for a view id; `view
|
|
7
7
|
list` is the supported route.
|
|
8
8
|
|
|
9
|
-
Discover exact contracts, then upload and read back explicit parents
|
|
9
|
+
Discover exact contracts, then upload and read back explicit parents. A new
|
|
10
|
+
project takes its name as the positional argument:
|
|
10
11
|
|
|
11
12
|
```bash
|
|
13
|
+
mammoth project create 'PROJECT NAME' --output json --no-input
|
|
12
14
|
mammoth schema get file.upload --output json --no-input
|
|
13
15
|
mammoth file upload ./SOURCE.csv --project PROJECT_ID --output json --no-input
|
|
14
16
|
mammoth dataset list --project PROJECT_ID --output json --no-input
|
|
@@ -17,7 +19,9 @@ mammoth view get VIEW_ID --project PROJECT_ID --output json --no-input
|
|
|
17
19
|
```
|
|
18
20
|
|
|
19
21
|
`file upload` takes the local path as its positional argument; there is no
|
|
20
|
-
`--source`/`--file` option.
|
|
22
|
+
`--source`/`--file` option. Its result carries the status the platform holds
|
|
23
|
+
for each created dataset: `ready`, or `need_action` with a `next_command`, in
|
|
24
|
+
which case follow [need-action](need-action.md) before looking for a view. `dataset delete` is asynchronous: re-read
|
|
21
25
|
`dataset list` (the id disappears once the job completes) before reporting.
|
|
22
26
|
|
|
23
27
|
Use display names from the exact view schema. For settings, folders and other
|
|
@@ -30,8 +30,14 @@ lists them. Pick the operation by what it does, not by its name:
|
|
|
30
30
|
mammoth view transform set-values VIEW_ID --project PROJECT_ID \
|
|
31
31
|
--input '{"dataset_id":DATASET_ID,"existing_column":"revenue","values":[{"value":0}],"condition":{"column":"revenue","operator":"IS_EMPTY"}}' \
|
|
32
32
|
--output json --no-input
|
|
33
|
+
mammoth view data get VIEW_ID DATASET_ID --project PROJECT_ID --output json --no-input
|
|
33
34
|
```
|
|
34
35
|
|
|
36
|
+
Then confirm from the read-back that blank rows are now `0` and non-blank
|
|
37
|
+
rows kept their values. If non-matching rows changed too, the condition was
|
|
38
|
+
not applied: stop, do not build joins or summaries on this view, and report
|
|
39
|
+
it.
|
|
40
|
+
|
|
35
41
|
- `filter` keeps matching rows by default (`filter_type: "SHOW"`); to drop
|
|
36
42
|
rows, say so: `{"condition":{"column":"units","operator":"LT","value":0},"filter_type":"REMOVE"}`. For each operation, a successful result should contain a returned
|
|
37
43
|
task/job reference or updated view envelope; then verify with `view task list`,
|
|
@@ -64,6 +70,44 @@ mammoth schema get view.transform.join --output json --no-input
|
|
|
64
70
|
mammoth view transform join VIEW_ID --project PROJECT_ID --input INPUT_JSON --output json --no-input
|
|
65
71
|
```
|
|
66
72
|
|
|
73
|
+
## Aggregate or summarise
|
|
74
|
+
|
|
75
|
+
For a grouped summary (totals per region, counts per status) use the typed
|
|
76
|
+
`pivot` when the live schema lists it, or a SQL task. A SQL task must be one
|
|
77
|
+
SELECT that names the view as the quoted table `"view:VIEW_ID"` (or its quoted
|
|
78
|
+
display name) with display-name columns; unquoted or placeholder table names
|
|
79
|
+
(`data`, `__TABLE__`) are rejected with "table name ... not found" or "only
|
|
80
|
+
select queries allowed". The result replaces the view's columns, so run it on
|
|
81
|
+
a copy (`view create` with `clone_from`) or as the last step:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
mammoth schema get view.transform.pivot --output json --no-input
|
|
85
|
+
mammoth view transform add-sql VIEW_ID --project PROJECT_ID \
|
|
86
|
+
--input '{"dataset_id":DATASET_ID,"query":"SELECT region, SUM(amount) AS total_amount, COUNT(*) AS order_count FROM \"view:VIEW_ID\" GROUP BY region"}' \
|
|
87
|
+
--output json --no-input
|
|
88
|
+
mammoth view data get VIEW_ID DATASET_ID --project PROJECT_ID --output json --no-input
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Read the data back after every value-changing step (`view data get`, or
|
|
92
|
+
`view preview`); a task that executed is not proof it changed the rows you
|
|
93
|
+
meant, and a join that matched nothing shows nulls, not a filled default. A
|
|
94
|
+
join that leaves most rows unmatched is not evidence about the source data
|
|
95
|
+
until you have sampled the key column on both sides (`view data get` on
|
|
96
|
+
each view) and confirmed an earlier step did not rewrite the key or the
|
|
97
|
+
values you are summing.
|
|
98
|
+
|
|
99
|
+
## How to look at your data
|
|
100
|
+
|
|
101
|
+
- Schema and types: `view get VIEW_ID` (falls back to discovery) or
|
|
102
|
+
`dataset get DATASET_ID`; the column list with display names is what every
|
|
103
|
+
transform input must use.
|
|
104
|
+
- Rows and values: `view data get VIEW_ID DATASET_ID` (paged) or
|
|
105
|
+
`view preview VIEW_ID` for a sample; use these after every value-changing
|
|
106
|
+
step and before reporting any number.
|
|
107
|
+
- What actually ran: `view task list VIEW_ID`, `view task get VIEW_ID TASK_ID`,
|
|
108
|
+
`view pipeline get VIEW_ID` (state, auto_run, executing task).
|
|
109
|
+
- Async completion: `job get JOB_ID` / `job wait JOB_ID`.
|
|
110
|
+
|
|
67
111
|
Reject malformed fields with the structured error envelope and stop rather than
|
|
68
112
|
guessing names. Verify exact display names, join multiplicity, math values and
|
|
69
113
|
remote task/pipeline readback. Draft submit is not proof all tasks persisted:
|
|
@@ -81,8 +125,12 @@ free-form lists. Observed shapes:
|
|
|
81
125
|
`reorder`, `null` for commands). Prefer `view draft *` for submit/discard.
|
|
82
126
|
- `view task update VIEW_ID TASK_ID --input '{"dataset_id":DATASET_ID,"task_spec":{...}}'`
|
|
83
127
|
sends `{"patches":[{"op":"replace","path":"params","value":task_spec}]}`;
|
|
84
|
-
pass `patches` directly for other paths. `
|
|
85
|
-
|
|
128
|
+
pass `patches` directly for other paths. Raw `task_spec` bodies use the
|
|
129
|
+
backend param-template shape with internal column names, e.g. COPY is
|
|
130
|
+
`{"COPY":[{"SOURCE":"column_1","AS":{"COLUMN":"Copy","TYPE":"TEXT","INTERNAL_NAME":"column_9"}}],"VERSION":2,...}`;
|
|
131
|
+
prefer the typed `view transform *` commands, which build these for you.
|
|
132
|
+
`view task preview` currently fails on the backend for views with a DATE
|
|
133
|
+
column (`datetime is not JSON serializable`), so do not rely on it.
|
|
86
134
|
- `view checkpoint update` sends `{"patches":[{"op":"command","path":"approve","value":null}]}`;
|
|
87
135
|
the release backend answered HTTP 500 to that shape, so treat checkpoint
|
|
88
136
|
approval as unavailable until `checkpoint get` succeeds again.
|
|
@@ -11,6 +11,7 @@ SDK method named by the command's reviewed manifest ``sdk_symbol``.
|
|
|
11
11
|
|
|
12
12
|
from __future__ import annotations
|
|
13
13
|
|
|
14
|
+
from collections.abc import Callable
|
|
14
15
|
from typing import Any
|
|
15
16
|
|
|
16
17
|
from mammoth_cli.errors.envelope import (
|
|
@@ -214,25 +215,64 @@ def file_upload(invocation: Invocation) -> HandlerResult:
|
|
|
214
215
|
)
|
|
215
216
|
with open_service(invocation) as (service, auth):
|
|
216
217
|
data = service.call(_symbol(invocation), **kwargs)
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
218
|
+
# The SDK waits for the upload job and returns the created dataset
|
|
219
|
+
# id(s) as a bare int/list. When the caller opts out of waiting
|
|
220
|
+
# (``wait_for_completion: false``) the bare job id is returned unchanged.
|
|
221
|
+
if not document.get("wait_for_completion", True):
|
|
222
|
+
return data, _meta(invocation, auth.workspace_id, resolved_project(invocation))
|
|
223
|
+
# A finished upload job does not mean a usable dataset: a CSV with an
|
|
224
|
+
# ambiguous date column lands in ``need_action`` with no view. Report
|
|
225
|
+
# the status the platform holds for each dataset, not an assumed one.
|
|
226
|
+
result = _upload_result(data, lambda dataset_id: _dataset_status(service, dataset_id))
|
|
227
|
+
return result, _meta(invocation, auth.workspace_id, resolved_project(invocation))
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
_DATASET_GET_SYMBOL = "mammoth.api.datasets.DatasetsAPI.get"
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def _dataset_status(service: Any, dataset_id: int) -> tuple[str, dict[str, Any] | None]:
|
|
234
|
+
"""Read ``(status, status_info)`` for one dataset; ``unknown`` if the read fails."""
|
|
235
|
+
try:
|
|
236
|
+
response = service.call(_DATASET_GET_SYMBOL, dataset_id=dataset_id)
|
|
237
|
+
except CliError:
|
|
238
|
+
return "unknown", None
|
|
239
|
+
dataset = response.get("dataset", response) if isinstance(response, dict) else {}
|
|
240
|
+
status = dataset.get("status") if isinstance(dataset, dict) else None
|
|
241
|
+
status_info = dataset.get("status_info") if isinstance(dataset, dict) else None
|
|
242
|
+
return (
|
|
243
|
+
status if isinstance(status, str) else "unknown",
|
|
244
|
+
status_info if isinstance(status_info, dict) else None,
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def _upload_result(
|
|
249
|
+
value: Any, read_status: Callable[[int], tuple[str, dict[str, Any] | None]]
|
|
250
|
+
) -> dict[str, Any]:
|
|
251
|
+
"""Shape the SDK upload return (int | list[int] | None) into a labeled result.
|
|
252
|
+
|
|
253
|
+
``status`` is ``ready`` only when every created dataset reads back as
|
|
254
|
+
``ready``; otherwise it is the first non-ready status so a caller that
|
|
255
|
+
checks one field sees the dataset that still needs work. ``datasets``
|
|
256
|
+
carries the per-dataset status, and a ``need_action`` dataset also gets
|
|
257
|
+
the recovery route so the caller does not have to know the recipe.
|
|
258
|
+
"""
|
|
229
259
|
if isinstance(value, list):
|
|
230
260
|
ids = [int(v) for v in value]
|
|
231
261
|
elif isinstance(value, int):
|
|
232
262
|
ids = [value]
|
|
233
263
|
else:
|
|
234
264
|
ids = []
|
|
235
|
-
|
|
265
|
+
datasets: list[dict[str, Any]] = []
|
|
266
|
+
for dataset_id in ids:
|
|
267
|
+
status, status_info = read_status(dataset_id)
|
|
268
|
+
entry: dict[str, Any] = {"id": dataset_id, "status": status}
|
|
269
|
+
if status_info:
|
|
270
|
+
entry["status_info"] = status_info
|
|
271
|
+
if status == "need_action":
|
|
272
|
+
entry["next_command"] = f"mammoth dataset file-settings get {dataset_id}"
|
|
273
|
+
datasets.append(entry)
|
|
274
|
+
overall = next((d["status"] for d in datasets if d["status"] != "ready"), "ready")
|
|
275
|
+
result: dict[str, Any] = {"status": overall, "dataset_ids": ids, "datasets": datasets}
|
|
236
276
|
if len(ids) == 1:
|
|
237
277
|
result["dataset_id"] = ids[0]
|
|
238
278
|
return result
|