mammoth-cli 2.0.28__tar.gz → 2.0.30__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.28 → mammoth_cli-2.0.30}/PKG-INFO +1 -1
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/__init__.py +1 -1
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/app.py +34 -1
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +3 -1
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +1 -1
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +1 -1
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +8 -8
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +1 -1
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +1 -1
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +7 -7
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +4 -2
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +8 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +48 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +12 -0
- mammoth_cli-2.0.30/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +66 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/view.py +7 -3
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/view_ops.py +61 -1
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/runtime/confirm.py +4 -0
- mammoth_cli-2.0.30/mammoth_cli/runtime/dryrun.py +133 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/runtime/input_loader.py +13 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/runtime/invocation.py +32 -1
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/runtime/session.py +7 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/services/command_contract.py +10 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/services/input_fields.py +49 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/services/sdk_service.py +12 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/services/testing.py +11 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/pyproject.toml +1 -1
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/dashboard.yaml +6 -7
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/view.yaml +1 -1
- mammoth_cli-2.0.28/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -33
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/.gitignore +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/LICENSE +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/README.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/__main__.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/__init__.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/activity.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/addon.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/agent.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/ai.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/annotation.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/auth.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/automation.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/batch.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/billing.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/browse.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/capability.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/client_app.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/completion.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/config.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/connector.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/context.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/dashboard.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/data_app.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/dataset.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/doctor.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/external_key.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/file.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/folder.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/job.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/notification.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/parameter.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/project.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/registry.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/report.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/schedule.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/schema.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/skill.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/snippet.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/support.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/template.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/trash.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/upgrade.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/user.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/webhook.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/workflow.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/commands/workspace.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/context/__init__.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/context/credentials.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/context/endpoint.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/context/profiles.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/context/resolver.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/contracts/__init__.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/contracts/auth.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/errors/__init__.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/errors/envelope.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/manifest/__init__.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/manifest/loader.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/messages/__init__.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/output/__init__.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/output/envelope.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/output/normalize.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/output/policy.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/output/progress.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/output/render.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/py.typed +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/runtime/__init__.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/runtime/executor.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/runtime/options.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/runtime/parents.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/runtime/runlog.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/runtime/strict.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/runtime/updates.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/runtime/validate.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/services/__init__.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/services/argspec.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/services/coerce.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/services/conditions.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/services/dispatch.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/services/factory.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/services/mapping.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/services/openapi_types.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/services/positionals.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/services/protocol.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/services/type_system.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/skills/__init__.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/skills/installer.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/skills/steering.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/testing.py +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/activity.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/addon.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/agent.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/ai.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/annotation.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/auth.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/automation.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/batch.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/billing.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/browse.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/capability.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/client-app.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/completion.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/config.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/connector.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/context.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/data-app.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/dataset.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/doctor.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/external-key.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/file.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/folder.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/job.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/log.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/notification.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/parameter.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/project.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/report.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/schedule.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/schema.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/skill.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/snippet.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/support.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/template.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/trash.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/upgrade.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/user.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/version.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/webhook.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/workflow.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/commands/workspace.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/openapi-operations.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/schema-v1.json +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/sdk-catalog.source.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/manifests/sdk-methods.yaml +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/openapi/metadata.json +0 -0
- {mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/spec/openapi/openapi.json +0 -0
|
@@ -29,7 +29,7 @@ from typer.core import TyperGroup
|
|
|
29
29
|
|
|
30
30
|
from mammoth_cli import __version__
|
|
31
31
|
from mammoth_cli.commands import BESPOKE
|
|
32
|
-
from mammoth_cli.commands.registry import HANDLERS
|
|
32
|
+
from mammoth_cli.commands.registry import HANDLERS, Handler
|
|
33
33
|
from mammoth_cli.context import profiles
|
|
34
34
|
from mammoth_cli.errors.envelope import EXIT_USAGE, CliError, not_implemented_error
|
|
35
35
|
from mammoth_cli.manifest.loader import command_by_id, load_commands
|
|
@@ -629,6 +629,18 @@ def _shared_option_params() -> list[inspect.Parameter]:
|
|
|
629
629
|
),
|
|
630
630
|
],
|
|
631
631
|
),
|
|
632
|
+
opt(
|
|
633
|
+
"dry_run",
|
|
634
|
+
False,
|
|
635
|
+
Annotated[
|
|
636
|
+
bool,
|
|
637
|
+
typer.Option(
|
|
638
|
+
"--dry-run",
|
|
639
|
+
help="Resolve and validate, then report the request instead of sending it.",
|
|
640
|
+
rich_help_panel="Safety",
|
|
641
|
+
),
|
|
642
|
+
],
|
|
643
|
+
),
|
|
632
644
|
opt(
|
|
633
645
|
"input_file",
|
|
634
646
|
None,
|
|
@@ -777,6 +789,8 @@ def _execute(invocation: Invocation) -> None:
|
|
|
777
789
|
record = command_by_id(invocation.command_id)
|
|
778
790
|
sdk_symbol = record.get("sdk_symbol", "") if record else ""
|
|
779
791
|
raise not_implemented_error(invocation.command_id, sdk_symbol)
|
|
792
|
+
if invocation.dry_run:
|
|
793
|
+
return _dry_run(handler, invocation)
|
|
780
794
|
return handler(invocation)
|
|
781
795
|
|
|
782
796
|
executor.run(
|
|
@@ -789,6 +803,25 @@ def _execute(invocation: Invocation) -> None:
|
|
|
789
803
|
)
|
|
790
804
|
|
|
791
805
|
|
|
806
|
+
def _dry_run(handler: Handler, invocation: Invocation) -> tuple[Any, dict[str, Any]]:
|
|
807
|
+
"""Run ``handler`` until its request would leave; report that request.
|
|
808
|
+
|
|
809
|
+
Local commands never open a service, so a dry run of one is the real run.
|
|
810
|
+
An API-backed handler that returns normally under ``--dry-run`` made no
|
|
811
|
+
gated SDK call at all (a pure read path); its result is returned as is.
|
|
812
|
+
"""
|
|
813
|
+
from mammoth_cli.runtime.dryrun import DryRunStop
|
|
814
|
+
from mammoth_cli.runtime.session import resolved_project
|
|
815
|
+
|
|
816
|
+
try:
|
|
817
|
+
return handler(invocation)
|
|
818
|
+
except DryRunStop as stop:
|
|
819
|
+
return stop.record, {
|
|
820
|
+
"profile": invocation.profile,
|
|
821
|
+
"project_id": resolved_project(invocation),
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
|
|
792
825
|
def _command_help(command_id: str, record: dict[str, Any] | None) -> str | None:
|
|
793
826
|
"""Build a command's user-facing ``--help`` summary.
|
|
794
827
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: mammoth-cli
|
|
3
|
-
version: 2.0.
|
|
3
|
+
version: 2.0.30
|
|
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, dashboards, exports, and handoffs."
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -60,6 +60,8 @@ before the next step.
|
|
|
60
60
|
'{"full": true}'` returns the dependency and display trees too.
|
|
61
61
|
- Column inputs and expressions use the exact **display names** the view
|
|
62
62
|
returns, never backend aliases.
|
|
63
|
+
- `--dry-run` on any API-backed command resolves everything and reports the
|
|
64
|
+
request instead of sending it; use it before a write you are not sure of.
|
|
63
65
|
- Destructive commands need `--yes --confirm ID`. Preserve requested
|
|
64
66
|
deliverables; cleanup is exact-ID authorized and
|
|
65
67
|
never means delete-all-owned-resources: delete only ids this run created,
|
|
@@ -140,4 +140,4 @@ Ran once: `workflow.create`, `workflow.delete`, `workflow.get`, `workflow.graph`
|
|
|
140
140
|
|
|
141
141
|
Ran once: `workspace.app-usage`, `workspace.get`, `workspace.list`, `workspace.segment.list`, `workspace.segment.update`, `workspace.storage-breakdown`, `workspace.user.list`
|
|
142
142
|
|
|
143
|
-
Evidence collected on CLI releases 1.1.5 through 2.0.
|
|
143
|
+
Evidence collected on CLI releases 1.1.5 through 2.0.28; each row's release is recorded in `docs/release-capability-matrix.json` (`evidence_version`). A row that ran on an older release has not been re-run since unless its note says so. Details: `docs/capability-evidence/` in the repository.
|
|
@@ -118,4 +118,4 @@ Ran once: `view.active-user.list`, `view.active-user.mark`, `view.ai.generate-da
|
|
|
118
118
|
| `view.data-check.update` | observed blocker | backend_error: PATCH with the schema's documented {op: command, path: enable/disable, value: null} shape returns HTTP 500 empty body (CLI outcome_unknown, exit 7) while the mutatio |
|
|
119
119
|
| `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)) |
|
|
120
120
|
|
|
121
|
-
Evidence collected on CLI releases 1.1.5 through 2.0.
|
|
121
|
+
Evidence collected on CLI releases 1.1.5 through 2.0.28; each row's release is recorded in `docs/release-capability-matrix.json` (`evidence_version`). A row that ran on an older release has not been re-run since unless its note says so. Details: `docs/capability-evidence/` in the repository.
|
|
@@ -70,7 +70,7 @@ Example: `mammoth dashboard canvas get 123`. Placeholders are illustrative; reso
|
|
|
70
70
|
|
|
71
71
|
Result: `DashboardCanvasGetResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
|
|
72
72
|
|
|
73
|
-
Status on release: ran once on CLI 2.0.
|
|
73
|
+
Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Read back the authored canvas, plan.hints.kpis and meta.figures (figure key -> descriptor id) after each bake; used as the binding check the ILG brief requires. Single invocation only.
|
|
74
74
|
|
|
75
75
|
### `dashboard.canvas.restore`
|
|
76
76
|
|
|
@@ -90,7 +90,7 @@ Example: `mammoth dashboard canvas save 123 --input '{"body": {"params": {"canva
|
|
|
90
90
|
|
|
91
91
|
Result: `DashboardCanvasSaveResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
|
|
92
92
|
|
|
93
|
-
Status on release: ran once on CLI 2.0.
|
|
93
|
+
Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Authored a canvas from a blank one: page-level focus.kpis (sum with unit.prefix GBP, and a countDistinct card), added bar (measure+measure2), hbar, line on a derived ratio measure (canvas.derived),…
|
|
94
94
|
|
|
95
95
|
### `dashboard.chat.edit`
|
|
96
96
|
|
|
@@ -178,7 +178,7 @@ Example: `mammoth dashboard create-blank --input '{"params": {"dataview_id": 1}}
|
|
|
178
178
|
|
|
179
179
|
Result: `DashboardCreateBlankResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
|
|
180
180
|
|
|
181
|
-
Status on release: ran once on CLI 2.0.
|
|
181
|
+
Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Two blank v3 dashboards bound to owned views (ids 63, 64). Single invocation only.
|
|
182
182
|
|
|
183
183
|
### `dashboard.data.draft`
|
|
184
184
|
|
|
@@ -214,11 +214,11 @@ Status on release: ran once on CLI 2.0.21 — ergonomics sweep 2026-09-19: exit
|
|
|
214
214
|
|
|
215
215
|
Run: `mammoth dashboard descriptor-data`. Exact input fields: `mammoth schema get dashboard.descriptor-data`.
|
|
216
216
|
|
|
217
|
-
Example: `mammoth dashboard descriptor-data 123 --input '{"body": {"params": {"descriptor_ids": ["
|
|
217
|
+
Example: `mammoth dashboard descriptor-data 123 --input '{"body": {"params": {"descriptor_ids": ["ef28f9bcc263c0f7"], "filter_state": {"Month": ["2025-01-01", "2025-03-31"]}}}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
218
218
|
|
|
219
219
|
Result: `DashboardDescriptorDataResult`; mutation `benign_mutation`, confirmation `none`, wait policy `always_wait`.
|
|
220
220
|
|
|
221
|
-
Status on release: ran once on CLI 2.0.
|
|
221
|
+
Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Evaluated baked descriptors by id with filter_state {Month: [start, end]}: countDistinct card = 111 unfiltered and 64 under a Q1 range (the fixture key; a summed per-cell count would read 83), sums…
|
|
222
222
|
|
|
223
223
|
### `dashboard.duplicate`
|
|
224
224
|
|
|
@@ -258,7 +258,7 @@ Example: `mammoth dashboard get 123`. Placeholders are illustrative; resolve IDs
|
|
|
258
258
|
|
|
259
259
|
Result: `DashboardGetResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
|
|
260
260
|
|
|
261
|
-
Status on release: ran once on CLI 2.0.
|
|
261
|
+
Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. auto_sync for the bound view showed last_synced_at after the upstream data change. Single invocation only.
|
|
262
262
|
|
|
263
263
|
### `dashboard.get-by-url`
|
|
264
264
|
|
|
@@ -324,11 +324,11 @@ Status on release: ran once on CLI 2.0.12 — Dashboard sweep 2026-09-18: exit 0
|
|
|
324
324
|
|
|
325
325
|
Run: `mammoth dashboard pages add`. Exact input fields: `mammoth schema get dashboard.pages.add`.
|
|
326
326
|
|
|
327
|
-
Example: `mammoth dashboard pages add 123 --input '{"body": {"params": {"pages": [{}]}}}'`. Illustrative only: append `--yes --confirm <EXACT_TARGET>` after observing the target.
|
|
327
|
+
Example: `mammoth dashboard pages add 123 --input '{"body": {"params": {"pages": [{"title": "By region", "focus": {"measure": "Revenue", "dim": "Region", "kpis": [{"field": "Revenue", "agg": "sum", "label": "Revenue"}]}, "charts": [{"kind": "hbar", "title": "Revenue by region", "dim": "Region", "measure": "Revenue", "agg": "sum"}]}]}}}'`. Illustrative only: append `--yes --confirm <EXACT_TARGET>` after observing the target.
|
|
328
328
|
|
|
329
329
|
Result: `DashboardPagesAddResult`; mutation `high_impact`, confirmation `confirm_target`, wait policy `returns_job`.
|
|
330
330
|
|
|
331
|
-
Status on release: ran once on CLI 2.0.
|
|
331
|
+
Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Needs --yes --confirm DASHBOARD_ID. body.params.pages[] takes PageAdd objects (title, focus{kpis}, charts[]); the route runs through the LLM guard and dropped unit.prefix on a money card ('nothing…
|
|
332
332
|
|
|
333
333
|
### `dashboard.pdf-artifact`
|
|
334
334
|
|
|
@@ -130,7 +130,7 @@ Example: `mammoth dataset list`. Placeholders are illustrative; resolve IDs and
|
|
|
130
130
|
|
|
131
131
|
Result: `DatasetListResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
|
|
132
132
|
|
|
133
|
-
Status on release: ran once on CLI 2.0.
|
|
133
|
+
Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Listed the datasets the sends created in the target project. Single invocation only.
|
|
134
134
|
|
|
135
135
|
### `dataset.rename`
|
|
136
136
|
|
|
@@ -82,7 +82,7 @@ Example: `mammoth file upload ./sales.csv`. Placeholders are illustrative; resol
|
|
|
82
82
|
|
|
83
83
|
Result: `FileUploadResult`; mutation `benign_mutation`, confirmation `none`, wait policy `start_or_wait`.
|
|
84
84
|
|
|
85
|
-
Status on release: ran once on CLI 2.0.
|
|
85
|
+
Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Three CSV uploads into a new source project; dates typed DATE without file-settings changes. Single invocation only.
|
|
86
86
|
|
|
87
87
|
### `file.upload-folder`
|
|
88
88
|
|
|
@@ -220,7 +220,7 @@ Example: `mammoth view data get 123 123`. Placeholders are illustrative; resolve
|
|
|
220
220
|
|
|
221
221
|
Result: `ViewDataGetResult`; mutation `read`, confirmation `none`, wait policy `always_wait`.
|
|
222
222
|
|
|
223
|
-
Status on release: ran once on CLI 2.0.
|
|
223
|
+
Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Paged reads (limit up to 500) used for every value check; envelope data.data rows keyed by display name. Single invocation only.
|
|
224
224
|
|
|
225
225
|
### `view.data.query`
|
|
226
226
|
|
|
@@ -466,7 +466,7 @@ Example: `mammoth view export list 123 123`. Placeholders are illustrative; reso
|
|
|
466
466
|
|
|
467
467
|
Result: `ViewExportListResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
|
|
468
468
|
|
|
469
|
-
Status on release: ran once on CLI
|
|
469
|
+
Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Listed both internal_dataset exports with target_properties (DS_NAME, COLUMN_MAPPING, project fields). Single invocation only.
|
|
470
470
|
|
|
471
471
|
### `view.export.managed-s3`
|
|
472
472
|
|
|
@@ -702,7 +702,7 @@ Example: `mammoth view pipeline items 123`. Placeholders are illustrative; resol
|
|
|
702
702
|
|
|
703
703
|
Result: `ViewPipelineItemsResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
|
|
704
704
|
|
|
705
|
-
Status on release: ran once on CLI
|
|
705
|
+
Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. fields=__full listed both export steps with sequence/status/execution times; the pre-existing step's timestamps did not move when a second send was appended. Single invocation only.
|
|
706
706
|
|
|
707
707
|
### `view.pipeline.items-all`
|
|
708
708
|
|
|
@@ -772,7 +772,7 @@ Example: `mammoth view task delete 123 123`. Illustrative only: append `--yes` a
|
|
|
772
772
|
|
|
773
773
|
Result: `ViewTaskDeleteResult`; mutation `destructive`, confirmation `prompt_or_yes`, wait policy `always_wait`.
|
|
774
774
|
|
|
775
|
-
Status on release: ran once on CLI 2.0.
|
|
775
|
+
Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Removed a SQL task that had run on the wrong intermediate shape; view returned to the previous columns and row count. Single invocation only.
|
|
776
776
|
|
|
777
777
|
### `view.task.get`
|
|
778
778
|
|
|
@@ -832,7 +832,7 @@ Example: `mammoth view transform add-sql 123 --input '{"query": "SELECT region,
|
|
|
832
832
|
|
|
833
833
|
Result: `ViewTransformAddSqlResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
|
|
834
834
|
|
|
835
|
-
Status on release:
|
|
835
|
+
Status on release: ran once on CLI 2.0.18 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
|
|
836
836
|
|
|
837
837
|
### `view.transform.ai`
|
|
838
838
|
|
|
@@ -932,7 +932,7 @@ Example: `mammoth view transform extract-date 123 --input '{"column": "Status",
|
|
|
932
932
|
|
|
933
933
|
Result: `ViewTransformExtractDateResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
|
|
934
934
|
|
|
935
|
-
Status on release:
|
|
935
|
+
Status on release: ran once on CLI 2.0.18 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
|
|
936
936
|
|
|
937
937
|
### `view.transform.fill-missing`
|
|
938
938
|
|
|
@@ -1112,7 +1112,7 @@ Example: `mammoth view transform window 123 --input '{"function": "ROW_NUMBER",
|
|
|
1112
1112
|
|
|
1113
1113
|
Result: `ViewTransformWindowResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
|
|
1114
1114
|
|
|
1115
|
-
Status on release:
|
|
1115
|
+
Status on release: ran once on CLI 2.0.18 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
|
|
1116
1116
|
|
|
1117
1117
|
### `view.trash`
|
|
1118
1118
|
|
{mammoth_cli-2.0.28 → mammoth_cli-2.0.30}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md
RENAMED
|
@@ -10,9 +10,11 @@ mammoth view transform filter 1039 --project 180 \
|
|
|
10
10
|
--input '{"condition": {"and": [{"column": "Order Status", "operator": "EQ", "value": "Open"}, {"column": "Customer Age", "operator": "GT", "value": 30}]}}'
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
- `--input FILE` reads a JSON or YAML file; the format
|
|
14
|
-
extension.
|
|
13
|
+
- `--input FILE` (or `--input @FILE`) reads a JSON or YAML file; the format
|
|
14
|
+
is inferred from the extension.
|
|
15
15
|
- `--input -` reads stdin; then `--input-format json|yaml` is required.
|
|
16
|
+
- `--dry-run` admits and resolves the document, then reports the SDK call
|
|
17
|
+
instead of making it ([safety](safety.md)).
|
|
16
18
|
- The top level must be a mapping. A bad path, format, or shape fails with exit
|
|
17
19
|
code 2 and a stable error code.
|
|
18
20
|
- Column references use display names returned by the exact view schema. Do not
|
|
@@ -90,6 +90,14 @@ task/list or pipeline/items result back after a successful write. Without that
|
|
|
90
90
|
independent specification, report the route as unsupported/ambiguous and stop
|
|
91
91
|
safely.
|
|
92
92
|
|
|
93
|
+
Typed transforms and `view task add` append at the end of the pipeline and
|
|
94
|
+
never reorder or delete an existing step. On a pipeline other people or
|
|
95
|
+
agents also edit, make that checkable: read `view task list VIEW_ID`, plan,
|
|
96
|
+
then write with `"expected_task_count": N` in the input; the CLI re-reads
|
|
97
|
+
the list just before the write and refuses with `pipeline_changed` when the
|
|
98
|
+
count moved ([safety](safety.md)). `--dry-run` on the same command shows the
|
|
99
|
+
resolved call first.
|
|
100
|
+
|
|
93
101
|
For a new workflow (a container for automation), discover and then read it
|
|
94
102
|
back; workflow creation is not the same as adding a view pipeline task:
|
|
95
103
|
|
|
@@ -34,6 +34,54 @@ Page/widget schemas vary by release. Read each schema, use returned IDs, and
|
|
|
34
34
|
verify the binding plus draft/published data after every mutation. A
|
|
35
35
|
creation response alone is not proof of a usable published view.
|
|
36
36
|
|
|
37
|
+
## Authoring a board from a blank canvas
|
|
38
|
+
|
|
39
|
+
`create-blank` gives one empty page. Author it by reading the canvas,
|
|
40
|
+
editing the **active page** (`pages[0]`; a root-level `focus` is stored but
|
|
41
|
+
never baked when pages exist) and writing the whole object back:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
mammoth dashboard create-blank --yes --input '{"params": {"dataview_id": VIEW_ID, "title": "Overview"}}'
|
|
45
|
+
mammoth dashboard canvas get DASHBOARD_ID > canvas.json # data.canvas is the object to edit
|
|
46
|
+
# pages[0].focus = {"measure": "Sales Actual", "dim": "Location",
|
|
47
|
+
# "kpis": [{"field": "Sales Actual", "agg": "sum", "label": "Sales", "unit": {"prefix": "£"}, "decimals": 0},
|
|
48
|
+
# {"field": "Employee Ref", "agg": "countDistinct", "label": "Distinct staff"}]}
|
|
49
|
+
# pages[0].added = [{"kind": "bar", "title": "Actual vs Budget by Month", "measure": "Sales Actual", "measure2": "Sales Budget",
|
|
50
|
+
# "agg": "sum", "date_bucket": {"field": "Month", "unit": "month"}},
|
|
51
|
+
# {"kind": "hbar", "title": "Sales by Location", "dim": "Location", "measure": "Sales Actual", "agg": "sum", "sort": "desc"},
|
|
52
|
+
# {"kind": "line", "title": "Occupancy rate", "measure": "occupancy_rate", "date_bucket": {"field": "Month", "unit": "month"}},
|
|
53
|
+
# {"kind": "table", "title": "Detail", "columns": ["Location", "Month", "Places"], "sort_by": "Month", "limit": 100}]
|
|
54
|
+
# derived = [{"id": "occupancy_rate", "label": "Occupancy rate", "numerator": "Occupied", "denominator": "Places"}]
|
|
55
|
+
# filters = [{"field": "Month", "control": "range", "label": "Month"}, {"field": "Location", "control": "multi"}]
|
|
56
|
+
mammoth dashboard canvas save DASHBOARD_ID --input '{"body": {"params": {"canvas": <edited data.canvas>}}}'
|
|
57
|
+
mammoth job wait BAKE_JOB_ID # data.bake_job_id from the save
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Rules the backend enforces (each returns the pydantic path on failure):
|
|
61
|
+
`added[].measure` is a column name — a ratio lives in `canvas.derived[]` and
|
|
62
|
+
is referenced by id; `focus.kpis[].agg` accepts `countDistinct` (the only
|
|
63
|
+
correct aggregation for a "distinct people" card under a date filter);
|
|
64
|
+
`unit.prefix` goes on money cards only. `dashboard pages add --yes --confirm
|
|
65
|
+
ID --input '{"body": {"params": {"pages": [{"title": ..., "focus": {...},
|
|
66
|
+
"charts": [...]}]}}}'` adds a page, but that route runs through the LLM
|
|
67
|
+
guard and may drop a unit it cannot evidence (it says so in `data.message`);
|
|
68
|
+
`canvas save` keeps what you wrote.
|
|
69
|
+
|
|
70
|
+
**Read the bindings back, then the numbers.** `dashboard canvas get` returns
|
|
71
|
+
`data.meta.figures` — `"p1:kpi:2": {"descriptors": {"value": "<id>"}}` per
|
|
72
|
+
card and tile — and `data.plan.hints.kpis` with the agg per card. Evaluate
|
|
73
|
+
ids with a filter:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
mammoth dashboard descriptor-data DASHBOARD_ID --input '{"body": {"params": {
|
|
77
|
+
"descriptor_ids": ["<id>", "<id>"],
|
|
78
|
+
"filter_state": {"Month": ["2025-01-01", "2025-03-31"]}}}}'
|
|
79
|
+
# -> data.results.<id>.value (scalar) or .data (rows); filter fields must be declared canvas filters
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
A card that reads the same with and without the filter, or a distinct count
|
|
83
|
+
that equals a row count, is a wrong binding, not a data fact.
|
|
84
|
+
|
|
37
85
|
## Canvas, widget data and PDF
|
|
38
86
|
|
|
39
87
|
Never save an invented canvas. Read it, change it, write it back:
|
|
@@ -142,6 +142,18 @@ Prefer `pivot` over `add-sql` for a grouped summary when `capabilities.md`
|
|
|
142
142
|
lists it as run on release; `add-sql` replaces every column of the view, so
|
|
143
143
|
never run it on a deliverable view.
|
|
144
144
|
|
|
145
|
+
`add-sql` facts from release: the only table is `"view:VIEW_ID"` (the view
|
|
146
|
+
itself; a second view in FROM/JOIN is `5GENR010 only one table allowed` —
|
|
147
|
+
join with `view transform join` afterwards); `CASE`, `DATE_TRUNC('month',
|
|
148
|
+
col)`, `GROUP BY`, `COUNT(DISTINCT col)` and `UNION ALL` over the same view
|
|
149
|
+
work; result columns must be NUMERIC, TEXT or TIMESTAMPTZ (`CAST(x AS DATE)`
|
|
150
|
+
is rejected; `CAST(x || '-01' AS TIMESTAMPTZ)` turns a `YYYY-MM` text month
|
|
151
|
+
into a date column). A location canonicaliser plus month bucketing plus
|
|
152
|
+
per-cell aggregation is one `add-sql` per fact; a mixed-grain table (summary
|
|
153
|
+
rows plus one row per entity with NULL measures, for a `countDistinct` card)
|
|
154
|
+
is one `UNION ALL`. The worked run is
|
|
155
|
+
`docs/capability-evidence/ilg-sim-20260919/SUMMARY.md`.
|
|
156
|
+
|
|
145
157
|
Reject malformed fields with the structured error envelope and stop rather than
|
|
146
158
|
guessing names. Verify exact display names, join multiplicity, math values and
|
|
147
159
|
remote task/pipeline readback. Draft submit is not proof all tasks persisted:
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Safe mutation
|
|
2
|
+
|
|
3
|
+
Each command carries a reviewed confirmation policy:
|
|
4
|
+
|
|
5
|
+
| policy | how to satisfy it noninteractively |
|
|
6
|
+
|---|---|
|
|
7
|
+
| none | nothing required |
|
|
8
|
+
| prompt_or_yes | pass `--yes` |
|
|
9
|
+
| yes_always | pass `--yes` (always, even at a terminal) |
|
|
10
|
+
| confirm_target | pass `--yes` and `--confirm TARGET` (exact match) |
|
|
11
|
+
|
|
12
|
+
Under `--no-input` (and in `json`/`ndjson` modes) there is no prompt: a missing
|
|
13
|
+
`--yes`/`--confirm` fails with exit code 2 and error code
|
|
14
|
+
`confirmation_required` or `confirmation_target_mismatch`.
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
# normal delete
|
|
18
|
+
mammoth folder delete 7 --project 180 --yes
|
|
19
|
+
|
|
20
|
+
# high-impact: target must equal the resource
|
|
21
|
+
mammoth project user remove --project 180 \
|
|
22
|
+
--yes --confirm 180 --input '{"user_ids": ["u_123"]}'
|
|
23
|
+
|
|
24
|
+
# project delete cascades to every dataset, view, export and dashboard in it
|
|
25
|
+
mammoth project delete 180 --yes --confirm 180
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Discover a command's policy with `mammoth schema get <command.id>`.
|
|
29
|
+
|
|
30
|
+
## Rehearse before you write
|
|
31
|
+
|
|
32
|
+
`--dry-run` on any API-backed command does everything but send the request:
|
|
33
|
+
input admission, parent resolution, display-name and condition checks, then
|
|
34
|
+
it stops at the SDK call and reports it as `data.would_call` (`sdk_symbol`,
|
|
35
|
+
resolved `arguments`, `view_id`/`dataset_id`) with `data.dry_run: true`. No
|
|
36
|
+
confirmation flag is needed for a dry run; the real run still needs its
|
|
37
|
+
`--yes`/`--confirm`. Use it before a mutation on a shared or production
|
|
38
|
+
resource, and whenever you are unsure which view or column an input resolves
|
|
39
|
+
to.
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
mammoth view transform filter 144 --dry-run \
|
|
43
|
+
--input '{"filter_type": "REMOVE", "condition": {"column": "Location", "operator": "EQ", "value": "Total"}}'
|
|
44
|
+
# data.would_call.sdk_symbol = ...FilterOpsMixin.filter_rows, view_id 144, dataset_id 122
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Add-only edits to a pipeline someone else may touch
|
|
48
|
+
|
|
49
|
+
Every `view transform *` and `view task add` accepts `expected_task_count`:
|
|
50
|
+
the number of tasks your last `view task list VIEW_ID` returned. The CLI
|
|
51
|
+
re-reads the task list right before the write and refuses with
|
|
52
|
+
`pipeline_changed` (exit 2, `details.actual_task_count`, `task_ids`) when the
|
|
53
|
+
count differs, so a plan made against a stale read cannot land on a pipeline
|
|
54
|
+
that changed under you. Read → decide → write with the count, one edit at a
|
|
55
|
+
time; on `pipeline_changed`, re-read and re-decide rather than retrying with
|
|
56
|
+
the new number blindly.
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
mammoth view task list 144 # data.tasks has 3 entries
|
|
60
|
+
mammoth view transform filter 144 --input '{"expected_task_count": 3, "filter_type": "REMOVE", "condition": {...}}'
|
|
61
|
+
```
|
|
62
|
+
Use exact observed resource scope and display names before mutation. A known job
|
|
63
|
+
handle should be inspected or waited, not submitted again. `outcome_unknown`
|
|
64
|
+
means a mutation may have committed without a terminal response: reconcile the
|
|
65
|
+
target before any replay. A retryable read can honor `Retry-After`; exit 7 is
|
|
66
|
+
not blanket permission to retry a mutation.
|
|
@@ -1445,11 +1445,15 @@ def view_task_add(invocation: Invocation) -> HandlerResult:
|
|
|
1445
1445
|
kwargs: dict[str, Any] = {"dataview_id": dataview_id, "task_spec": task_spec}
|
|
1446
1446
|
assert document is not None
|
|
1447
1447
|
_forward_optional(document, kwargs, ("dataset_id",))
|
|
1448
|
+
# Imported here: view_ops imports this module for the brief record helpers.
|
|
1449
|
+
from mammoth_cli.commands.view_ops import (
|
|
1450
|
+
reject_pipeline_reference_errors,
|
|
1451
|
+
require_expected_task_count,
|
|
1452
|
+
)
|
|
1453
|
+
|
|
1448
1454
|
with open_service(invocation) as (service, auth):
|
|
1455
|
+
require_expected_task_count(service, dataview_id, kwargs.get("dataset_id"), document)
|
|
1449
1456
|
data = service.call(_symbol(invocation), **kwargs)
|
|
1450
|
-
# Imported here: view_ops imports this module for the brief record helpers.
|
|
1451
|
-
from mammoth_cli.commands.view_ops import reject_pipeline_reference_errors
|
|
1452
|
-
|
|
1453
1457
|
reject_pipeline_reference_errors(service, dataview_id, kwargs.get("dataset_id"), data)
|
|
1454
1458
|
return data, _meta(invocation, auth.workspace_id, None)
|
|
1455
1459
|
|
|
@@ -43,6 +43,7 @@ from mammoth_cli.runtime.invocation import Invocation
|
|
|
43
43
|
from mammoth_cli.runtime.session import open_service, resolved_project
|
|
44
44
|
from mammoth_cli.services.command_contract import bind_command_inputs
|
|
45
45
|
from mammoth_cli.services.conditions import CONDITION_KWARG
|
|
46
|
+
from mammoth_cli.services.input_fields import TASK_COUNT_FIELD
|
|
46
47
|
|
|
47
48
|
HandlerResult = tuple[Any, dict[str, Any]]
|
|
48
49
|
|
|
@@ -251,6 +252,7 @@ def _dispatch_view(
|
|
|
251
252
|
with open_service(invocation) as (service, auth):
|
|
252
253
|
if dataset_id is None:
|
|
253
254
|
dataset_id = parents.lookup(_profile_name(invocation), auth.workspace_id, view_id)
|
|
255
|
+
require_expected_task_count(service, view_id, dataset_id, document)
|
|
254
256
|
try:
|
|
255
257
|
if dataset_id is None:
|
|
256
258
|
_require_discovery_allowed(invocation, view_id)
|
|
@@ -266,6 +268,60 @@ def _dispatch_view(
|
|
|
266
268
|
return data, _meta(invocation, auth.workspace_id)
|
|
267
269
|
|
|
268
270
|
|
|
271
|
+
CODE_PIPELINE_CHANGED = "pipeline_changed"
|
|
272
|
+
_TASK_LIST_SYMBOL = "mammoth.api.pipeline.PipelineAPI.list_tasks"
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
def require_expected_task_count(
|
|
276
|
+
service: Any, view_id: int, dataset_id: Any, document: dict[str, Any] | None
|
|
277
|
+
) -> None:
|
|
278
|
+
"""Refuse a pipeline write when the view's task count is not the one read.
|
|
279
|
+
|
|
280
|
+
``expected_task_count`` is the count from the caller's last ``view task
|
|
281
|
+
list``. A different live count means the pipeline changed since that read
|
|
282
|
+
(another agent, a person in the web app), and an append planned against
|
|
283
|
+
the old shape must not land. Without the field nothing is checked.
|
|
284
|
+
"""
|
|
285
|
+
if not document or TASK_COUNT_FIELD not in document:
|
|
286
|
+
return
|
|
287
|
+
expected = int(document[TASK_COUNT_FIELD])
|
|
288
|
+
kwargs: dict[str, Any] = {"dataview_id": view_id}
|
|
289
|
+
if dataset_id is not None:
|
|
290
|
+
kwargs["dataset_id"] = int(dataset_id)
|
|
291
|
+
listing = service.call(_TASK_LIST_SYMBOL, **kwargs)
|
|
292
|
+
tasks = listing.get("tasks") if isinstance(listing, dict) else None
|
|
293
|
+
if not isinstance(tasks, list):
|
|
294
|
+
raise CliError(
|
|
295
|
+
code=CODE_PIPELINE_CHANGED,
|
|
296
|
+
message=f"Could not read the task list of view {view_id} to check the precondition.",
|
|
297
|
+
exit_status=EXIT_USAGE,
|
|
298
|
+
details={"view_id": view_id, "expected_task_count": expected, "response": listing},
|
|
299
|
+
)
|
|
300
|
+
actual = len(tasks)
|
|
301
|
+
if actual == expected:
|
|
302
|
+
return
|
|
303
|
+
raise CliError(
|
|
304
|
+
code=CODE_PIPELINE_CHANGED,
|
|
305
|
+
message=(
|
|
306
|
+
f"View {view_id} has {actual} pipeline task(s), not the {expected} expected; "
|
|
307
|
+
"the pipeline changed since it was read, so nothing was written."
|
|
308
|
+
),
|
|
309
|
+
exit_status=EXIT_USAGE,
|
|
310
|
+
hint=(
|
|
311
|
+
"Re-read the pipeline, decide whether the plan still holds, and retry "
|
|
312
|
+
f"with expected_task_count {actual}."
|
|
313
|
+
),
|
|
314
|
+
details={
|
|
315
|
+
"view_id": view_id,
|
|
316
|
+
"dataset_id": int(dataset_id) if dataset_id is not None else None,
|
|
317
|
+
"expected_task_count": expected,
|
|
318
|
+
"actual_task_count": actual,
|
|
319
|
+
"task_ids": [t.get("id") for t in tasks if isinstance(t, dict)],
|
|
320
|
+
},
|
|
321
|
+
recovery_commands=[f"mammoth view task list {view_id}"],
|
|
322
|
+
)
|
|
323
|
+
|
|
324
|
+
|
|
269
325
|
def _compact_reference_error(entry: Any) -> dict[str, Any]:
|
|
270
326
|
if not isinstance(entry, dict):
|
|
271
327
|
return {"reason": str(entry)}
|
|
@@ -362,7 +418,11 @@ def _without_resource_context(document: dict[str, Any]) -> dict[str, Any]:
|
|
|
362
418
|
# mapping. These identifiers select the View receiver and are not method
|
|
363
419
|
# kwargs; strip both parent and receiver identities before the transform
|
|
364
420
|
# adapter forwards the document.
|
|
365
|
-
return {
|
|
421
|
+
return {
|
|
422
|
+
key: value
|
|
423
|
+
for key, value in document.items()
|
|
424
|
+
if key not in {"dataset_id", "view_id", TASK_COUNT_FIELD}
|
|
425
|
+
}
|
|
366
426
|
|
|
367
427
|
|
|
368
428
|
def _bind_transform_inputs(invocation: Invocation, document: dict[str, Any]) -> dict[str, Any]:
|
|
@@ -84,6 +84,10 @@ def enforce_confirmation(
|
|
|
84
84
|
"""
|
|
85
85
|
if policy == POLICY_NONE:
|
|
86
86
|
return
|
|
87
|
+
if invocation.dry_run:
|
|
88
|
+
# Nothing is sent under --dry-run, so there is nothing to confirm; the
|
|
89
|
+
# report names the confirmation the real run will need.
|
|
90
|
+
return
|
|
87
91
|
|
|
88
92
|
tty = sys.stdin.isatty() if is_tty is None else is_tty
|
|
89
93
|
machine = invocation.output in MACHINE_OUTPUTS
|