mammoth-cli 2.0.12__tar.gz → 2.0.14__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.12 → mammoth_cli-2.0.14}/PKG-INFO +2 -2
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/__init__.py +1 -1
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/app.py +34 -6
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +3 -0
- mammoth_cli-2.0.14/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +220 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +4 -4
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +1 -1
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +25 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +4 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +15 -1
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +3 -1
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/dashboard.py +40 -8
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/view.py +15 -3
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/output/normalize.py +25 -4
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/input_fields.py +17 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/mapping.py +31 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/positionals.py +8 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/pyproject.toml +2 -2
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/dashboard.yaml +11 -9
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/project.yaml +1 -2
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/sdk-methods.yaml +2 -2
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/.gitignore +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/LICENSE +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/README.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/__main__.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/__init__.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/activity.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/addon.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/agent.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/ai.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/annotation.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/auth.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/automation.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/batch.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/billing.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/browse.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/capability.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/client_app.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/completion.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/config.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/connector.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/context.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/data_app.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/dataset.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/doctor.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/external_key.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/file.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/folder.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/job.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/notification.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/parameter.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/project.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/registry.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/report.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/schedule.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/schema.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/skill.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/snippet.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/support.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/template.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/trash.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/upgrade.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/user.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/view_ops.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/webhook.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/workflow.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/workspace.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/context/__init__.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/context/credentials.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/context/endpoint.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/context/profiles.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/context/resolver.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/contracts/__init__.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/contracts/auth.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/errors/__init__.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/errors/envelope.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/manifest/__init__.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/manifest/loader.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/messages/__init__.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/output/__init__.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/output/envelope.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/output/policy.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/output/progress.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/output/render.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/py.typed +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/runtime/__init__.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/runtime/confirm.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/runtime/executor.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/runtime/input_loader.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/runtime/invocation.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/runtime/options.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/runtime/session.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/runtime/strict.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/runtime/validate.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/__init__.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/argspec.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/coerce.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/command_contract.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/conditions.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/dispatch.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/factory.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/openapi_types.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/protocol.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/sdk_service.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/testing.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/type_system.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/skills/__init__.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/skills/installer.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/testing.py +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/activity.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/addon.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/agent.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/ai.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/annotation.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/auth.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/automation.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/batch.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/billing.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/browse.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/capability.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/client-app.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/completion.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/config.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/connector.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/context.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/data-app.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/dataset.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/doctor.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/external-key.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/file.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/folder.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/job.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/notification.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/parameter.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/report.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/schedule.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/schema.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/skill.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/snippet.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/support.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/template.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/trash.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/upgrade.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/user.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/version.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/view.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/webhook.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/workflow.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/workspace.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/openapi-operations.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/schema-v1.json +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/sdk-catalog.source.yaml +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/openapi/metadata.json +0 -0
- {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/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.14
|
|
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.6
|
|
21
21
|
Requires-Dist: platformdirs<5,>=4.10
|
|
22
22
|
Requires-Dist: pydantic<3,>=2.13
|
|
23
23
|
Requires-Dist: pyyaml<7,>=6
|
|
@@ -24,6 +24,7 @@ from typing import Annotated, Any
|
|
|
24
24
|
|
|
25
25
|
import typer
|
|
26
26
|
from typer._click import exceptions as _typer_click_exceptions
|
|
27
|
+
from typer._click.core import Command as _ClickCommand
|
|
27
28
|
from typer.core import TyperGroup
|
|
28
29
|
|
|
29
30
|
from mammoth_cli import __version__
|
|
@@ -297,6 +298,33 @@ def _usage_error_report(error: Any, tokens: Sequence[str]) -> CliError | None:
|
|
|
297
298
|
)
|
|
298
299
|
|
|
299
300
|
|
|
301
|
+
class _LeafGroup(TyperGroup):
|
|
302
|
+
"""Group for a node that is also an invocable command with positionals.
|
|
303
|
+
|
|
304
|
+
Click resolves the first bare token after a group as a subcommand name, so
|
|
305
|
+
``mammoth project resource-dependencies 3`` failed with ``No such command
|
|
306
|
+
'3'`` even though the manifest (and every printed example) takes the
|
|
307
|
+
project id positionally. When the leading token is not a registered
|
|
308
|
+
subcommand, keep every token as an argument for the group callback instead;
|
|
309
|
+
genuine subcommands (``... resource-dependencies update 3``) are unaffected.
|
|
310
|
+
"""
|
|
311
|
+
|
|
312
|
+
def parse_args(self, ctx: Any, args: list[str]) -> list[str]:
|
|
313
|
+
super().parse_args(ctx, args)
|
|
314
|
+
protected = list(getattr(ctx, "_protected_args", ()) or ())
|
|
315
|
+
if protected and protected[0] not in self.commands:
|
|
316
|
+
# Leaf invocation. A group parser stops at the first bare token, so
|
|
317
|
+
# options after the positional were left unparsed; parse again as a
|
|
318
|
+
# plain command with interspersed options, keeping the bare tokens
|
|
319
|
+
# as the callback's positional arguments.
|
|
320
|
+
ctx.allow_interspersed_args = True
|
|
321
|
+
ctx.args = _ClickCommand.parse_args(self, ctx, list(args))
|
|
322
|
+
# Click's own attribute for the pending subcommand token (Click
|
|
323
|
+
# >= 8.2 made it private); not an SDK member.
|
|
324
|
+
setattr(ctx, "_protected_args", []) # noqa: B010
|
|
325
|
+
return list(ctx.args)
|
|
326
|
+
|
|
327
|
+
|
|
300
328
|
class _EnvelopeGroup(TyperGroup):
|
|
301
329
|
"""Root group that renders Click usage errors as the machine error envelope.
|
|
302
330
|
|
|
@@ -358,10 +386,10 @@ class _EnvelopeGroup(TyperGroup):
|
|
|
358
386
|
# group-level classifier (schema get and nested commands rely on the
|
|
359
387
|
# stable missing_argument envelope).
|
|
360
388
|
error_message = error.format_message()
|
|
361
|
-
is_missing_parameter =
|
|
362
|
-
error, _typer_click_exceptions.MissingParameter
|
|
363
|
-
|
|
364
|
-
re.match(r"^Missing argument '[^']+'\.", error_message)
|
|
389
|
+
is_missing_parameter = (
|
|
390
|
+
isinstance(error, _typer_click_exceptions.MissingParameter)
|
|
391
|
+
or error.__class__.__name__ == "MissingParameter"
|
|
392
|
+
or bool(re.match(r"^Missing argument '[^']+'\.", error_message))
|
|
365
393
|
)
|
|
366
394
|
report = None if is_missing_parameter else _usage_error_report(error, tokens)
|
|
367
395
|
if _output_mode_from_argv(argv) in MACHINE_OUTPUTS:
|
|
@@ -393,8 +421,7 @@ class _EnvelopeGroup(TyperGroup):
|
|
|
393
421
|
(
|
|
394
422
|
token.split("=", 1)[0]
|
|
395
423
|
for token in tokens
|
|
396
|
-
if token.startswith("--")
|
|
397
|
-
and token.split("=", 1)[0] not in known
|
|
424
|
+
if token.startswith("--") and token.split("=", 1)[0] not in known
|
|
398
425
|
),
|
|
399
426
|
None,
|
|
400
427
|
)
|
|
@@ -829,6 +856,7 @@ def build_app() -> typer.Typer:
|
|
|
829
856
|
if command_id is not None:
|
|
830
857
|
# This node is both a group and an invocable command.
|
|
831
858
|
sub = typer.Typer(
|
|
859
|
+
cls=_LeafGroup,
|
|
832
860
|
no_args_is_help=False,
|
|
833
861
|
invoke_without_command=True,
|
|
834
862
|
context_settings={"allow_extra_args": True, "ignore_unknown_options": True},
|
|
@@ -65,6 +65,9 @@ the result.
|
|
|
65
65
|
- **Import, resources, transforms, pipelines, dashboards, exports, or cleanup:**
|
|
66
66
|
[recipes](references/recipes/index.md) and [operations](references/operations.md)
|
|
67
67
|
- **A known command family or exact command:** [command catalog](references/command-index.md)
|
|
68
|
+
- **Whether a route is proven, known-blocked, or untried on release:**
|
|
69
|
+
[capabilities](references/capabilities.md) — read it before promising a
|
|
70
|
+
deliverable or reporting a failure as a backend fault
|
|
68
71
|
- **Pause or transfer to another agent:** [handoff](references/handoff.md)
|
|
69
72
|
|
|
70
73
|
## Handoff checklist
|
|
@@ -0,0 +1,220 @@
|
|
|
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. 142 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 | 66 | 2 | 36 |
|
|
21
|
+
| `view` | 62 | 22 | 0 | 40 |
|
|
22
|
+
| `support` | 45 | 0 | 0 | 45 |
|
|
23
|
+
| `billing` | 23 | 0 | 0 | 23 |
|
|
24
|
+
| `connector` | 22 | 2 | 0 | 20 |
|
|
25
|
+
| `workspace` | 19 | 6 | 0 | 13 |
|
|
26
|
+
| `project` | 17 | 5 | 0 | 12 |
|
|
27
|
+
| `workflow` | 16 | 5 | 0 | 11 |
|
|
28
|
+
| `dataset` | 15 | 9 | 0 | 6 |
|
|
29
|
+
| `parameter` | 14 | 2 | 0 | 12 |
|
|
30
|
+
| `data-app` | 12 | 1 | 0 | 11 |
|
|
31
|
+
| `folder` | 8 | 5 | 0 | 3 |
|
|
32
|
+
| `snippet` | 8 | 1 | 0 | 7 |
|
|
33
|
+
| `automation` | 7 | 1 | 0 | 6 |
|
|
34
|
+
| `user` | 7 | 2 | 0 | 5 |
|
|
35
|
+
| `webhook` | 7 | 0 | 0 | 7 |
|
|
36
|
+
| `addon` | 6 | 0 | 0 | 6 |
|
|
37
|
+
| `batch` | 6 | 2 | 0 | 4 |
|
|
38
|
+
| `file` | 6 | 3 | 0 | 3 |
|
|
39
|
+
| `agent` | 5 | 1 | 0 | 4 |
|
|
40
|
+
| `ai` | 5 | 0 | 0 | 5 |
|
|
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 | 1 | 0 | 2 |
|
|
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
|
+
| Command | State | Note |
|
|
68
|
+
|---|---|---|
|
|
69
|
+
| `ai.sql.generate` | observed blocker | validation_error: HTTP 400 Validation error |
|
|
70
|
+
| `ai.suggestion.list` | observed blocker | validation_error: HTTP 400 Validation error |
|
|
71
|
+
|
|
72
|
+
## `annotation`
|
|
73
|
+
|
|
74
|
+
Verified: `annotation.list`
|
|
75
|
+
|
|
76
|
+
## `automation`
|
|
77
|
+
|
|
78
|
+
Verified: `automation.list`
|
|
79
|
+
|
|
80
|
+
## `batch`
|
|
81
|
+
|
|
82
|
+
Verified: `batch.get`, `batch.list`
|
|
83
|
+
|
|
84
|
+
## `browse`
|
|
85
|
+
|
|
86
|
+
Verified: `browse.project`, `browse.workspace`
|
|
87
|
+
|
|
88
|
+
| Command | State | Note |
|
|
89
|
+
|---|---|---|
|
|
90
|
+
| `browse.folder` | observed blocker | cli_error: rejects folder id 0 although folder.root reports id 0 as the root |
|
|
91
|
+
| `browse.root` | observed blocker | server_error: see sweep report |
|
|
92
|
+
|
|
93
|
+
## `connector`
|
|
94
|
+
|
|
95
|
+
Verified: `connector.active`, `connector.list`
|
|
96
|
+
|
|
97
|
+
| Command | State | Note |
|
|
98
|
+
|---|---|---|
|
|
99
|
+
| `connector.ai.session.list` | observed blocker | cli_error: backend returned HTTP 200 but the CLI raised api_error (envelope mismatch) |
|
|
100
|
+
| `connector.connection.list` | observed blocker | server_error: see sweep report |
|
|
101
|
+
| `connector.get` | observed blocker | validation_error: HTTP 400 'Invalid connector key' for a key returned by connector.list |
|
|
102
|
+
|
|
103
|
+
## `dashboard`
|
|
104
|
+
|
|
105
|
+
Verified: `dashboard.analytics`, `dashboard.cancel-generation`, `dashboard.canvas.get`, `dashboard.canvas.restore`, `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.get`, `dashboard.get-by-url`, `dashboard.list`, `dashboard.page.plan`, `dashboard.pages.add`, `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.restore`, `dashboard.rls.assignment.list`, `dashboard.rls.assignment.set`, `dashboard.rls.column.list`, `dashboard.rls.value.list`, `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.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.fit`, `dashboard.template.list`, `dashboard.template.preview`, `dashboard.template.resolve-mapping`, `dashboard.templates.pending`, `dashboard.trash`, `dashboard.update`, `dashboard.v3.generate`, `dashboard.video-state`
|
|
106
|
+
|
|
107
|
+
| Command | State | Note |
|
|
108
|
+
|---|---|---|
|
|
109
|
+
| `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. |
|
|
110
|
+
| `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. |
|
|
111
|
+
| `dashboard.pdf-artifact` | observed blocker | blocked_missing_fixture: No real pdf export job_id obtainable (dashboard.pdf.export is itself blocked_missing_fixture) |
|
|
112
|
+
| `dashboard.published.canvas` | observed blocker | blocked_missing_fixture: HTTP 404 4DASH001 DASHBOARD_NOT_FOUND via url endpoint: D=52 was never actually published (was_published=false); the only publish mechanism is 'dashboard s |
|
|
113
|
+
| `dashboard.source.list` | observed blocker | server_error: HTTP 500 on GET /dashboards/sources; matches documented B04 SERVER_VARIANCE precondition |
|
|
114
|
+
| `dashboard.video.export` | observed blocker | validation_error: HTTP 400 4GENR001: 'publish the dashboard before exporting a video' -- clear, actionable message |
|
|
115
|
+
| `dashboard.widget-data` | observed blocker | blocked_missing_fixture: HTTP 409 4DASH004 DASHBOARD_WRONG_ENGINE: widget-data is a legacy-engine-only endpoint |
|
|
116
|
+
| `dashboard.archive` | CLI defect fixed, untried since | 2.0.14 accepts the non-object 200 body and reports the committed state |
|
|
117
|
+
| `dashboard.canvas.save` | CLI defect fixed, untried since | 2.0.14 no longer redacts style_tokens, so the canvas get -> save round-trip is intact |
|
|
118
|
+
| `dashboard.data.draft` | CLI defect fixed, untried since | 2.0.14 / SDK 0.7.6 send the WidgetDataSpec params envelope (widget_id) |
|
|
119
|
+
| `dashboard.data.published` | CLI defect fixed, untried since | 2.0.14 / SDK 0.7.6 send the WidgetDataSpec params envelope (widget_id) |
|
|
120
|
+
| `dashboard.figure-intent` | CLI defect fixed, untried since | SDK 0.7.6 returns an unmatched 2xx body instead of raising ValidationError |
|
|
121
|
+
| `dashboard.og-card` | CLI defect fixed, untried since | SDK 0.7.5 returns a described binary body |
|
|
122
|
+
| `dashboard.query` | CLI defect fixed, untried since | 2.0.14 example carries a descriptor with kind=scalar |
|
|
123
|
+
| `dashboard.style.default.get` | CLI defect fixed, untried since | SDK 0.7.6 returns an unmatched 2xx body instead of raising ValidationError |
|
|
124
|
+
| `dashboard.style.derive` | CLI defect fixed, untried since | 2.0.14 no longer redacts styleTokens |
|
|
125
|
+
| `dashboard.template.get` | CLI defect fixed, untried since | SDK 0.7.6 returns an unmatched 2xx body instead of raising ValidationError |
|
|
126
|
+
|
|
127
|
+
## `data-app`
|
|
128
|
+
|
|
129
|
+
Verified: `data-app.list`
|
|
130
|
+
|
|
131
|
+
## `dataset`
|
|
132
|
+
|
|
133
|
+
Verified: `dataset.batch-data`, `dataset.create`, `dataset.data`, `dataset.delete`, `dataset.file-settings.get`, `dataset.file-settings.update`, `dataset.get`, `dataset.list`, `dataset.trash`
|
|
134
|
+
|
|
135
|
+
## `external-key`
|
|
136
|
+
|
|
137
|
+
| Command | State | Note |
|
|
138
|
+
|---|---|---|
|
|
139
|
+
| `external-key.list` | observed blocker | cli_error: not_authenticated although the same session authenticated elsewhere |
|
|
140
|
+
|
|
141
|
+
## `file`
|
|
142
|
+
|
|
143
|
+
Verified: `file.get`, `file.list`, `file.upload`
|
|
144
|
+
|
|
145
|
+
## `folder`
|
|
146
|
+
|
|
147
|
+
Verified: `folder.create`, `folder.delete`, `folder.get`, `folder.list`, `folder.update`
|
|
148
|
+
|
|
149
|
+
## `job`
|
|
150
|
+
|
|
151
|
+
Verified: `job.get`, `job.get-many`
|
|
152
|
+
|
|
153
|
+
## `notification`
|
|
154
|
+
|
|
155
|
+
Verified: `notification.list`
|
|
156
|
+
|
|
157
|
+
## `parameter`
|
|
158
|
+
|
|
159
|
+
Verified: `parameter.group.list`, `parameter.list`
|
|
160
|
+
|
|
161
|
+
## `project`
|
|
162
|
+
|
|
163
|
+
Verified: `project.checkpoint.list`, `project.data-check.list`, `project.list`, `project.pending-changes`, `project.resource-status`
|
|
164
|
+
|
|
165
|
+
| Command | State | Note |
|
|
166
|
+
|---|---|---|
|
|
167
|
+
| `project.publish-credentials` | observed blocker | cli_error: requires odbc_type, not discoverable read-only |
|
|
168
|
+
| `project.resource-dependencies` | observed blocker | cli_error: required resource_ids has no CLI flag |
|
|
169
|
+
|
|
170
|
+
## `report`
|
|
171
|
+
|
|
172
|
+
Verified: `report.list`
|
|
173
|
+
|
|
174
|
+
## `schedule`
|
|
175
|
+
|
|
176
|
+
| Command | State | Note |
|
|
177
|
+
|---|---|---|
|
|
178
|
+
| `schedule.list` | observed blocker | validation_error: HTTP 400 with message 'Not implemented' |
|
|
179
|
+
|
|
180
|
+
## `snippet`
|
|
181
|
+
|
|
182
|
+
Verified: `snippet.list`
|
|
183
|
+
|
|
184
|
+
## `template`
|
|
185
|
+
|
|
186
|
+
| Command | State | Note |
|
|
187
|
+
|---|---|---|
|
|
188
|
+
| `template.list` | observed blocker | cli_error: backend returned HTTP 200 but the CLI raised api_error (envelope mismatch) |
|
|
189
|
+
|
|
190
|
+
## `trash`
|
|
191
|
+
|
|
192
|
+
Verified: `trash.list`
|
|
193
|
+
|
|
194
|
+
## `user`
|
|
195
|
+
|
|
196
|
+
Verified: `user.get`, `user.preference.get`
|
|
197
|
+
|
|
198
|
+
## `view`
|
|
199
|
+
|
|
200
|
+
Verified: `view.active-user.list`, `view.checkpoint.list`, `view.conditional-format.list`, `view.create`, `view.data-check.list`, `view.data.get`, `view.data.query`, `view.derivative.list`, `view.export.list`, `view.exportable-config.get`, `view.get`, `view.list`, `view.parameter-context`, `view.pipeline.get`, `view.pipeline.items`, `view.preview`, `view.task.add`, `view.task.get`, `view.task.list`, `view.version.get`, `view.version.list`
|
|
201
|
+
|
|
202
|
+
| Command | State | Note |
|
|
203
|
+
|---|---|---|
|
|
204
|
+
| `view.ai.generation-info` | observed blocker | validation_error: HTTP 400 with message 'Not implemented' |
|
|
205
|
+
|
|
206
|
+
## `webhook`
|
|
207
|
+
|
|
208
|
+
| Command | State | Note |
|
|
209
|
+
|---|---|---|
|
|
210
|
+
| `webhook.list` | observed blocker | cli_error: api_error with no HTTP status recorded |
|
|
211
|
+
|
|
212
|
+
## `workflow`
|
|
213
|
+
|
|
214
|
+
Verified: `workflow.graph`, `workflow.list`, `workflow.workspace-datasets`, `workflow.workspace-exports`, `workflow.workspace-sources`
|
|
215
|
+
|
|
216
|
+
## `workspace`
|
|
217
|
+
|
|
218
|
+
Verified: `workspace.app-usage`, `workspace.get`, `workspace.list`, `workspace.segment.list`, `workspace.storage-breakdown`, `workspace.user.list`
|
|
219
|
+
|
|
220
|
+
Evidence version: CLI mammoth-cli 1.1.11; mammoth-io 0.7.1. Details: `docs/capability-evidence/` in the repository.
|
|
@@ -148,7 +148,7 @@ Expected success: `DashboardCreateBlankResult` in the standard JSON envelope; mu
|
|
|
148
148
|
|
|
149
149
|
Run: `mammoth dashboard data draft`. Exact input fields: `mammoth schema get dashboard.data.draft --output json --no-input`.
|
|
150
150
|
|
|
151
|
-
Example: `mammoth dashboard data draft 123 --input '{"
|
|
151
|
+
Example: `mammoth dashboard data draft 123 --input '{"widget_id": "550e8400-e29b-41d4-a716-446655440000"}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
|
|
152
152
|
|
|
153
153
|
Expected success: `DashboardDataDraftResult` 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.
|
|
154
154
|
|
|
@@ -156,7 +156,7 @@ Expected success: `DashboardDataDraftResult` in the standard JSON envelope; muta
|
|
|
156
156
|
|
|
157
157
|
Run: `mammoth dashboard data published`. Exact input fields: `mammoth schema get dashboard.data.published --output json --no-input`.
|
|
158
158
|
|
|
159
|
-
Example: `mammoth dashboard data published 123 --input '{"
|
|
159
|
+
Example: `mammoth dashboard data published 123 --input '{"widget_id": "550e8400-e29b-41d4-a716-446655440000"}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
|
|
160
160
|
|
|
161
161
|
Expected success: `DashboardDataPublishedResult` 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.
|
|
162
162
|
|
|
@@ -460,7 +460,7 @@ Expected success: `DashboardQaSettingsSetResult` in the standard JSON envelope;
|
|
|
460
460
|
|
|
461
461
|
Run: `mammoth dashboard query`. Exact input fields: `mammoth schema get dashboard.query --output json --no-input`.
|
|
462
462
|
|
|
463
|
-
Example: `mammoth dashboard query 123 --input '{"body": {"params": {"descriptor": {}}}}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
|
|
463
|
+
Example: `mammoth dashboard query 123 --input '{"body": {"params": {"descriptor": {"kind": "scalar", "agg": "count"}}}}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
|
|
464
464
|
|
|
465
465
|
Expected success: `DashboardQueryResult` 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.
|
|
466
466
|
|
|
@@ -788,7 +788,7 @@ Expected success: `DashboardTrashResult` in the standard JSON envelope; mutation
|
|
|
788
788
|
|
|
789
789
|
Run: `mammoth dashboard update`. Exact input fields: `mammoth schema get dashboard.update --output json --no-input`.
|
|
790
790
|
|
|
791
|
-
Example: `mammoth dashboard update 123 --input '{"patch": [{"op": "
|
|
791
|
+
Example: `mammoth dashboard update 123 --input '{"patch": [{"op": "replace", "path": "title", "value": "Renamed dashboard"}]}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
|
|
792
792
|
|
|
793
793
|
Expected success: `DashboardUpdateResult` 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.
|
|
794
794
|
|
|
@@ -84,7 +84,7 @@ Expected success: `ProjectPublishCredentialsResult` in the standard JSON envelop
|
|
|
84
84
|
|
|
85
85
|
Run: `mammoth project resource-dependencies`. Exact input fields: `mammoth schema get project.resource-dependencies --output json --no-input`.
|
|
86
86
|
|
|
87
|
-
Example: `mammoth project resource-dependencies 123 --input '{"resource_ids": [
|
|
87
|
+
Example: `mammoth project resource-dependencies 123 --input '{"resource_ids": [456]}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
|
|
88
88
|
|
|
89
89
|
Expected success: `ProjectResourceDependenciesResult` in the standard JSON envelope; mutation `read`, 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.
|
|
90
90
|
|
|
@@ -32,3 +32,28 @@ mammoth schema find "dashboard" --output json --no-input
|
|
|
32
32
|
Page/widget schemas vary by release. Read each schema, use returned IDs, and
|
|
33
33
|
verify dashboard source plus draft/published data after every mutation. A
|
|
34
34
|
creation response alone is not proof of a usable published view.
|
|
35
|
+
|
|
36
|
+
## Canvas, widget data and PDF
|
|
37
|
+
|
|
38
|
+
Never save an invented canvas. Read it, change it, write it back:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
mammoth dashboard canvas get DASHBOARD_ID --output json --no-input # data.canvas incl. style_tokens
|
|
42
|
+
mammoth dashboard canvas save DASHBOARD_ID --input '{"body":{"params":{"canvas":CANVAS_FROM_GET}}}' --output json --no-input
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`canvas save` with `{"canvas": {}}` fails (`dataset` and other fields are
|
|
46
|
+
required); the object returned by `canvas get` is the only known-good shape.
|
|
47
|
+
Widget ids for `dashboard data draft` / `dashboard data published` come from
|
|
48
|
+
that canvas: `--input '{"widget_id": "WIDGET_UUID"}'` (optional
|
|
49
|
+
`global_filters` / `drilldown_filters` objects). `dashboard query` needs a
|
|
50
|
+
descriptor with a `kind` (`scalar`, `group`, `rate`, `detail`, `options`,
|
|
51
|
+
`range`); `{"kind":"scalar","agg":"count"}` is the smallest that runs.
|
|
52
|
+
|
|
53
|
+
`dashboard pdf export` and `dashboard video export` cannot be completed from
|
|
54
|
+
the CLI: the backend requires the browser-hydrated `DashboardData` map
|
|
55
|
+
(pre-rendered widget results) in `params.data` and refuses to rebuild it. Report
|
|
56
|
+
this as a known limitation instead of retrying with `{}`. `dashboard create`
|
|
57
|
+
(legacy engine) is retired on release (HTTP 409 `4DASH012`); use
|
|
58
|
+
`create-blank` or `v3 generate`.
|
|
59
|
+
|
|
@@ -16,6 +16,10 @@ mammoth view list DATASET_ID --project PROJECT_ID --output json --no-input
|
|
|
16
16
|
mammoth view get VIEW_ID --project PROJECT_ID --output json --no-input
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
+
`file upload` takes the local path as its positional argument; there is no
|
|
20
|
+
`--source`/`--file` option. `dataset delete` is asynchronous: re-read
|
|
21
|
+
`dataset list` (the id disappears once the job completes) before reporting.
|
|
22
|
+
|
|
19
23
|
Use display names from the exact view schema. For settings, folders and other
|
|
20
24
|
families, use `schema find`/`schema get` first, then read back the exact parent
|
|
21
25
|
and resource IDs. For example:
|
|
@@ -19,7 +19,21 @@ parent from `view list DATASET_ID` (you already know it after upload) or
|
|
|
19
19
|
|
|
20
20
|
Prefer typed operations such as convert-type, fill-missing, replace, join,
|
|
21
21
|
lookup, filter and math only when the live schema
|
|
22
|
-
lists them.
|
|
22
|
+
lists them. Pick the operation by what it does, not by its name:
|
|
23
|
+
|
|
24
|
+
- `fill-missing` copies the previous/next row's value into blanks
|
|
25
|
+
(`direction` = `LAST_VALUE` forward-fill or `FIRST_VALUE`). It cannot write a
|
|
26
|
+
literal. To fill blanks with a constant (for example `0`), use `set-values`
|
|
27
|
+
on the existing column with an `IS_EMPTY` condition:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
mammoth view transform set-values VIEW_ID --project PROJECT_ID \
|
|
31
|
+
--input '{"dataset_id":DATASET_ID,"existing_column":"revenue","values":[{"value":0}],"condition":{"column":"revenue","operator":"IS_EMPTY"}}' \
|
|
32
|
+
--output json --no-input
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
- `filter` keeps matching rows by default (`filter_type: "SHOW"`); to drop
|
|
36
|
+
rows, say so: `{"condition":{"column":"units","operator":"LT","value":0},"filter_type":"REMOVE"}`. For each operation, a successful result should contain a returned
|
|
23
37
|
task/job reference or updated view envelope; then verify with `view task list`,
|
|
24
38
|
`view task get`, `view pipeline items`, or preview according to its schema.
|
|
25
39
|
|
|
@@ -50,7 +50,9 @@ or secrets in an argument, prompt, transcript, or checkpoint.
|
|
|
50
50
|
4. Discover instead of guessing. Run `mammoth schema list/find/get --output
|
|
51
51
|
json --no-input` for local CLI routes; `mammoth capability list --output
|
|
52
52
|
json --no-input` is an API-binding inventory and can omit typed/local
|
|
53
|
-
routes.
|
|
53
|
+
routes. Check [capabilities](capabilities.md) for whether a route is
|
|
54
|
+
proven, not supported, or untried on release before building a plan on
|
|
55
|
+
it. Then resolve workspace/project/dataset/view
|
|
54
56
|
parents with reads. Use display names returned by the exact view schema.
|
|
55
57
|
5. Translate the business intent into a plan the agent chooses. Submit only
|
|
56
58
|
supported operations with explicit `--project` (and other returned parents),
|
|
@@ -365,24 +365,52 @@ def dashboard_analytics(invocation: Invocation) -> HandlerResult:
|
|
|
365
365
|
return data, _meta(invocation, auth.workspace_id)
|
|
366
366
|
|
|
367
367
|
|
|
368
|
+
def _widget_data_kwargs(invocation: Invocation) -> dict[str, Any]:
|
|
369
|
+
"""Bind the ``WidgetDataSpec`` fields the draft/published data routes take.
|
|
370
|
+
|
|
371
|
+
``widget_id`` (the widget UUID) is required; ``global_filters`` and
|
|
372
|
+
``drilldown_filters`` are optional ``{column: value}`` objects.
|
|
373
|
+
"""
|
|
374
|
+
document = _bound_document(invocation)
|
|
375
|
+
widget_id = _require_field(document, "widget_id")
|
|
376
|
+
if not isinstance(widget_id, str) or not widget_id.strip():
|
|
377
|
+
raise CliError(
|
|
378
|
+
code=CODE_INVALID_ARGUMENT,
|
|
379
|
+
message="The 'widget_id' input field must be a non-empty widget UUID string.",
|
|
380
|
+
exit_status=EXIT_USAGE,
|
|
381
|
+
hint="Read widget ids from 'mammoth dashboard canvas get DASHBOARD_ID'.",
|
|
382
|
+
)
|
|
383
|
+
kwargs: dict[str, Any] = {"widget_id": widget_id}
|
|
384
|
+
for name in ("global_filters", "drilldown_filters"):
|
|
385
|
+
if name not in document:
|
|
386
|
+
continue
|
|
387
|
+
value = document[name]
|
|
388
|
+
if not isinstance(value, dict):
|
|
389
|
+
raise CliError(
|
|
390
|
+
code=CODE_INVALID_ARGUMENT,
|
|
391
|
+
message=f"The '{name}' input field must be an object of column -> value.",
|
|
392
|
+
exit_status=EXIT_USAGE,
|
|
393
|
+
)
|
|
394
|
+
kwargs[name] = value
|
|
395
|
+
return kwargs
|
|
396
|
+
|
|
397
|
+
|
|
368
398
|
def dashboard_data_draft(invocation: Invocation) -> HandlerResult:
|
|
369
|
-
"""
|
|
399
|
+
"""Read one widget's rows from a dashboard's draft state. Fields come from ``--input``."""
|
|
370
400
|
dashboard_id = _require_int_positional(invocation, "dashboard id")
|
|
371
|
-
|
|
372
|
-
sql = _require_field(document, "sql")
|
|
401
|
+
kwargs = _widget_data_kwargs(invocation)
|
|
373
402
|
with open_service(invocation) as (service, auth):
|
|
374
|
-
data = service.call(_symbol(invocation), dashboard_id=dashboard_id,
|
|
403
|
+
data = service.call(_symbol(invocation), dashboard_id=dashboard_id, **kwargs)
|
|
375
404
|
data = _resolve_job(service, invocation, data)
|
|
376
405
|
return data, _meta(invocation, auth.workspace_id)
|
|
377
406
|
|
|
378
407
|
|
|
379
408
|
def dashboard_data_published(invocation: Invocation) -> HandlerResult:
|
|
380
|
-
"""
|
|
409
|
+
"""Read one widget's rows from a dashboard's published state. Fields from ``--input``."""
|
|
381
410
|
dashboard_id = _require_int_positional(invocation, "dashboard id")
|
|
382
|
-
|
|
383
|
-
sql = _require_field(document, "sql")
|
|
411
|
+
kwargs = _widget_data_kwargs(invocation)
|
|
384
412
|
with open_service(invocation) as (service, auth):
|
|
385
|
-
data = service.call(_symbol(invocation), dashboard_id=dashboard_id,
|
|
413
|
+
data = service.call(_symbol(invocation), dashboard_id=dashboard_id, **kwargs)
|
|
386
414
|
data = _resolve_job(service, invocation, data)
|
|
387
415
|
return data, _meta(invocation, auth.workspace_id)
|
|
388
416
|
|
|
@@ -561,6 +589,10 @@ def dashboard_archive(invocation: Invocation) -> HandlerResult:
|
|
|
561
589
|
data = service.call(
|
|
562
590
|
_symbol(invocation), dashboard_id=dashboard_id, archived=document["archived"]
|
|
563
591
|
)
|
|
592
|
+
if not isinstance(data, dict):
|
|
593
|
+
# The route declares no response body; give the committed state a
|
|
594
|
+
# stable object shape instead of a bare scalar.
|
|
595
|
+
data = {"dashboard_id": dashboard_id, "archived": document["archived"], "response": data}
|
|
564
596
|
return data, _meta(invocation, auth.workspace_id)
|
|
565
597
|
|
|
566
598
|
|
|
@@ -1214,13 +1214,25 @@ def view_pipeline_items(invocation: Invocation) -> HandlerResult:
|
|
|
1214
1214
|
def view_pipeline_items_all(invocation: Invocation) -> HandlerResult:
|
|
1215
1215
|
"""Read all pipeline items through bounded, exact-parent pagination."""
|
|
1216
1216
|
dataview_id = _require_int_positional_at(invocation, 0, "dataview id")
|
|
1217
|
-
document = invocation.load_input() or {}
|
|
1217
|
+
document = dict(invocation.load_input() or {})
|
|
1218
|
+
# The schema advertises an optional trailing DATASET_ID positional that
|
|
1219
|
+
# falls back to the input field; honour both, and reject a disagreement.
|
|
1220
|
+
positional_parent = _int_positional_at(invocation, 1, "dataset id")
|
|
1221
|
+
if positional_parent is not None:
|
|
1222
|
+
if document.get("dataset_id") not in (None, positional_parent):
|
|
1223
|
+
raise CliError(
|
|
1224
|
+
code="ambiguous_resource_identity",
|
|
1225
|
+
message="Conflicting dataset ids identify different parent resources.",
|
|
1226
|
+
exit_status=EXIT_USAGE,
|
|
1227
|
+
hint="Pass one exact dataset id matching the target view.",
|
|
1228
|
+
)
|
|
1229
|
+
document["dataset_id"] = positional_parent
|
|
1218
1230
|
if "dataset_id" not in document:
|
|
1219
1231
|
raise CliError(
|
|
1220
1232
|
code=CODE_MISSING_FIELD,
|
|
1221
|
-
message="This command requires the
|
|
1233
|
+
message="This command requires the exact parent dataset id.",
|
|
1222
1234
|
exit_status=EXIT_USAGE,
|
|
1223
|
-
hint="Pass the
|
|
1235
|
+
hint="Pass it as the trailing DATASET_ID positional or the 'dataset_id' input field.",
|
|
1224
1236
|
)
|
|
1225
1237
|
dataset_id = document["dataset_id"]
|
|
1226
1238
|
if isinstance(dataset_id, bool) or not isinstance(dataset_id, int) or dataset_id <= 0:
|
|
@@ -14,6 +14,7 @@ import decimal
|
|
|
14
14
|
import enum
|
|
15
15
|
import ipaddress
|
|
16
16
|
import math
|
|
17
|
+
import re
|
|
17
18
|
import uuid
|
|
18
19
|
from collections.abc import Mapping
|
|
19
20
|
from pathlib import Path
|
|
@@ -50,12 +51,33 @@ class _NormalizedJsonSchema(dict[str, Any]):
|
|
|
50
51
|
"""
|
|
51
52
|
|
|
52
53
|
|
|
54
|
+
_CAMEL_BOUNDARY = re.compile(r"(?<=[a-z0-9])(?=[A-Z])")
|
|
55
|
+
# Plural ``*_tokens`` keys that still name credentials rather than design data.
|
|
56
|
+
_CREDENTIAL_TOKEN_PREFIXES = ("access", "refresh", "auth", "api", "bearer", "session", "oauth")
|
|
57
|
+
|
|
58
|
+
|
|
53
59
|
def _is_secret_key(key: str) -> bool:
|
|
54
|
-
|
|
60
|
+
# ``styleTokens`` and ``style_tokens`` must be judged the same way.
|
|
61
|
+
lowered = _CAMEL_BOUNDARY.sub("_", key).lower()
|
|
55
62
|
# ``token_count`` is ordinary result metadata (for example an LLM usage
|
|
56
63
|
# counter), not a credential. Do not let the broad token guard erase it.
|
|
57
|
-
if lowered in {
|
|
64
|
+
if lowered in {
|
|
65
|
+
"token_count",
|
|
66
|
+
"next_token",
|
|
67
|
+
"continuation_token",
|
|
68
|
+
"page_token",
|
|
69
|
+
"design_tokens",
|
|
70
|
+
}:
|
|
58
71
|
return False
|
|
72
|
+
if "token" in lowered and not any(
|
|
73
|
+
hint in lowered for hint in _SECRET_KEY_HINTS if hint != "token"
|
|
74
|
+
):
|
|
75
|
+
# Credential tokens are singular (``token``, ``access_token``). Plural
|
|
76
|
+
# ``tokens`` / ``style_tokens`` are dashboard design-system data, and
|
|
77
|
+
# erasing them breaks the canvas get -> save round-trip.
|
|
78
|
+
if lowered == "tokens" or lowered.endswith("_tokens"):
|
|
79
|
+
return lowered.startswith(_CREDENTIAL_TOKEN_PREFIXES)
|
|
80
|
+
return True
|
|
59
81
|
return any(hint in lowered for hint in _SECRET_KEY_HINTS)
|
|
60
82
|
|
|
61
83
|
|
|
@@ -69,8 +91,7 @@ def _is_secret_value(value: Any) -> bool:
|
|
|
69
91
|
"""
|
|
70
92
|
value_type = type(value)
|
|
71
93
|
return value_type.__name__ in {"SecretStr", "SecretBytes"} or (
|
|
72
|
-
"secret" in value_type.__name__.lower()
|
|
73
|
-
and hasattr(value, "get_secret_value")
|
|
94
|
+
"secret" in value_type.__name__.lower() and hasattr(value, "get_secret_value")
|
|
74
95
|
)
|
|
75
96
|
|
|
76
97
|
|
|
@@ -39,6 +39,9 @@ _CLOSED_ZERO_INPUT_COMMANDS = frozenset({"config.get"})
|
|
|
39
39
|
#: value here is a genuine, accepted --input field so the documented example both
|
|
40
40
|
#: validates against the input schema and works when run.
|
|
41
41
|
_EXAMPLE_INPUT_HINTS: dict[str, dict[str, Any]] = {
|
|
42
|
+
# The backend requires integer resource ids ("resource_ids must be
|
|
43
|
+
# comma-separated integers"); the SDK annotation is a plain list[str].
|
|
44
|
+
"project.resource-dependencies": {"resource_ids": [456]},
|
|
42
45
|
"view.export.azure-blob": {
|
|
43
46
|
"storage_account_name": "storage-account",
|
|
44
47
|
"tenant_id": "tenant-id",
|
|
@@ -142,6 +145,20 @@ _EXAMPLE_INPUT_HINTS: dict[str, dict[str, Any]] = {
|
|
|
142
145
|
# Blank dashboard creation requires a typed params envelope. Keep the
|
|
143
146
|
# generated destructive example runnable with the explicit approval flag.
|
|
144
147
|
"dashboard.create-blank": {"params": {"dataview_id": 1}},
|
|
148
|
+
# The draft/published data routes take a WidgetDataSpec keyed by the
|
|
149
|
+
# widget UUID (read it from ``dashboard canvas get``), not a SQL string.
|
|
150
|
+
"dashboard.data.draft": {"widget_id": "550e8400-e29b-41d4-a716-446655440000"},
|
|
151
|
+
"dashboard.data.published": {"widget_id": "550e8400-e29b-41d4-a716-446655440000"},
|
|
152
|
+
# ``descriptor`` is a baked/1 QueryDescriptor discriminated by ``kind``
|
|
153
|
+
# (group | scalar | rate | detail | options | range); an empty object is
|
|
154
|
+
# rejected. A scalar row count runs against any dashboard.
|
|
155
|
+
"dashboard.query": {"body": {"params": {"descriptor": {"kind": "scalar", "agg": "count"}}}},
|
|
156
|
+
# ``path`` is a bare field name (title | intent | theme | pages | filters),
|
|
157
|
+
# not a JSON pointer, and an ``intent`` value must be at least 10 chars; a
|
|
158
|
+
# title rename is the smallest patch that runs.
|
|
159
|
+
"dashboard.update": {
|
|
160
|
+
"patch": [{"op": "replace", "path": "title", "value": "Renamed dashboard"}]
|
|
161
|
+
},
|
|
145
162
|
}
|
|
146
163
|
|
|
147
164
|
|