mammoth-cli 2.0.23__tar.gz → 2.0.25__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.23 → mammoth_cli-2.0.25}/PKG-INFO +1 -1
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/__init__.py +1 -1
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +5 -1
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +1 -1
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +4 -5
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +4 -4
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +2 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +6 -4
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +9 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +1 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/schema.py +23 -2
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/view.py +40 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/view_ops.py +117 -4
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/services/command_contract.py +5 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/services/input_fields.py +19 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/pyproject.toml +1 -1
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/dashboard.yaml +3 -1
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/view.yaml +14 -10
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/.gitignore +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/LICENSE +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/README.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/__main__.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/app.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/__init__.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/activity.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/addon.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/agent.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/ai.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/annotation.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/auth.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/automation.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/batch.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/billing.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/browse.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/capability.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/client_app.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/completion.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/config.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/connector.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/context.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/dashboard.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/data_app.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/dataset.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/doctor.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/external_key.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/file.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/folder.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/job.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/notification.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/parameter.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/project.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/registry.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/report.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/schedule.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/skill.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/snippet.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/support.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/template.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/trash.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/upgrade.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/user.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/webhook.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/workflow.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/commands/workspace.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/context/__init__.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/context/credentials.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/context/endpoint.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/context/profiles.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/context/resolver.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/contracts/__init__.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/contracts/auth.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/errors/__init__.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/errors/envelope.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/manifest/__init__.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/manifest/loader.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/messages/__init__.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/output/__init__.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/output/envelope.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/output/normalize.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/output/policy.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/output/progress.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/output/render.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/py.typed +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/runtime/__init__.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/runtime/confirm.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/runtime/executor.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/runtime/input_loader.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/runtime/invocation.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/runtime/options.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/runtime/parents.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/runtime/runlog.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/runtime/session.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/runtime/strict.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/runtime/updates.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/runtime/validate.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/services/__init__.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/services/argspec.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/services/coerce.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/services/conditions.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/services/dispatch.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/services/factory.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/services/mapping.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/services/openapi_types.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/services/positionals.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/services/protocol.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/services/sdk_service.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/services/testing.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/services/type_system.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/skills/__init__.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/skills/installer.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/testing.py +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/activity.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/addon.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/agent.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/ai.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/annotation.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/auth.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/automation.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/batch.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/billing.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/browse.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/capability.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/client-app.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/completion.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/config.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/connector.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/context.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/data-app.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/dataset.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/doctor.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/external-key.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/file.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/folder.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/job.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/log.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/notification.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/parameter.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/project.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/report.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/schedule.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/schema.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/skill.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/snippet.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/support.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/template.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/trash.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/upgrade.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/user.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/version.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/webhook.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/workflow.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/commands/workspace.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/openapi-operations.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/schema-v1.json +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/sdk-catalog.source.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/manifests/sdk-methods.yaml +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/openapi/metadata.json +0 -0
- {mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/spec/openapi/openapi.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: mammoth-cli
|
|
3
|
-
version: 2.0.
|
|
3
|
+
version: 2.0.25
|
|
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
|
|
|
@@ -51,6 +51,10 @@ before the next step.
|
|
|
51
51
|
family, `schema find WORDS` a search.
|
|
52
52
|
- Uploads return a **dataset** id; transforms, joins, exports and previews
|
|
53
53
|
take the **view** id from `view list DATASET_ID`.
|
|
54
|
+
- `view list` and `view get` return the brief record (id, ds_id, name,
|
|
55
|
+
status, row_count, `metadata` columns and types, pipeline state);
|
|
56
|
+
`view get ... --input '{"fields": "__full"}'` or `view list ... --input
|
|
57
|
+
'{"full": true}'` returns the dependency and display trees too.
|
|
54
58
|
- Column inputs and expressions use the exact **display names** the view
|
|
55
59
|
returns, never backend aliases.
|
|
56
60
|
- Destructive commands need `--yes --confirm ID`. Preserve requested
|
|
@@ -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.24; 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.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# What is proven on release
|
|
2
2
|
|
|
3
3
|
Generated from `docs/release-capability-matrix.json`; do not edit by hand.
|
|
4
|
-
The CLI publishes 552 commands. 455 of them bind one of the 528 API operations in the matrix; the remainder are local commands (`schema`, `auth`, `doctor`, `log`, ...) or typed variants that share an operation (every `view transform *` command submits through `view.task.add`).
|
|
4
|
+
The CLI publishes 552 commands. 455 of them bind one of the 528 API operations in the matrix; the remainder are local commands (`schema`, `auth`, `doctor`, `log`, ...) or typed variants that share an operation (every `view transform *` command submits through `view.task.add`). 261 bound commands ran once 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`, run it, and treat the structured error envelope as the answer.
|
|
5
5
|
|
|
6
6
|
Status meanings:
|
|
7
7
|
|
|
@@ -18,7 +18,7 @@ The typed `view transform *` commands all submit through `view.task.add`; its ma
|
|
|
18
18
|
| Family | Commands | Ran once | Not supported | Untried |
|
|
19
19
|
|---|---|---|---|---|
|
|
20
20
|
| `dashboard` | 104 | 81 | 2 | 21 |
|
|
21
|
-
| `view` | 62 |
|
|
21
|
+
| `view` | 62 | 57 | 0 | 5 |
|
|
22
22
|
| `support` | 45 | 9 | 0 | 36 |
|
|
23
23
|
| `billing` | 23 | 4 | 0 | 19 |
|
|
24
24
|
| `connector` | 22 | 3 | 0 | 19 |
|
|
@@ -110,14 +110,13 @@ Ran once: `project.bulk-delete`, `project.bulk-update`, `project.checkpoint.list
|
|
|
110
110
|
|
|
111
111
|
## `view`
|
|
112
112
|
|
|
113
|
-
Ran once: `view.active-user.list`, `view.active-user.mark`, `view.ai.generate-data`, `view.ai.profile`, `view.bulk-delete`, `view.checkpoint.create`, `view.checkpoint.delete`, `view.checkpoint.get`, `view.checkpoint.list`, `view.checkpoint.update`, `view.conditional-format.create`, `view.conditional-format.delete-all`, `view.conditional-format.list`, `view.conditional-format.update`, `view.create`, `view.data-check.create`, `view.data-check.delete`, `view.data-check.get`, `view.data-check.list`, `view.data.get`, `view.data.query`, `view.delete`, `view.derivative.create`, `view.derivative.delete`, `view.derivative.list`, `view.derivative.update`, `view.draft.command`, `view.export.delete`, `view.export.get`, `view.export.list`, `view.export.publish-db`, `view.export.update`, `view.exportable-config.apply`, `view.exportable-config.get`, `view.get`, `view.list`, `view.parameter-context`, `view.pipeline.edit`, `view.pipeline.get`, `view.pipeline.items`, `view.pipeline.rerun`, `view.preview`, `view.restore`, `view.task.add`, `view.task.delete`, `view.task.get`, `view.task.list`, `view.task.preview`, `view.task.update`, `view.trash`, `view.version.apply`, `view.version.delete`, `view.version.get`, `view.version.list`, `view.version.update`
|
|
113
|
+
Ran once: `view.active-user.list`, `view.active-user.mark`, `view.ai.generate-data`, `view.ai.profile`, `view.bulk-delete`, `view.checkpoint.create`, `view.checkpoint.delete`, `view.checkpoint.get`, `view.checkpoint.list`, `view.checkpoint.update`, `view.conditional-format.create`, `view.conditional-format.delete-all`, `view.conditional-format.list`, `view.conditional-format.update`, `view.create`, `view.data-check.create`, `view.data-check.delete`, `view.data-check.get`, `view.data-check.list`, `view.data.get`, `view.data.query`, `view.delete`, `view.derivative.create`, `view.derivative.data`, `view.derivative.delete`, `view.derivative.list`, `view.derivative.update`, `view.draft.command`, `view.export.delete`, `view.export.get`, `view.export.list`, `view.export.publish-db`, `view.export.update`, `view.exportable-config.apply`, `view.exportable-config.get`, `view.get`, `view.list`, `view.parameter-context`, `view.pipeline.edit`, `view.pipeline.get`, `view.pipeline.items`, `view.pipeline.rerun`, `view.preview`, `view.restore`, `view.task.add`, `view.task.delete`, `view.task.get`, `view.task.list`, `view.task.preview`, `view.task.update`, `view.trash`, `view.version.apply`, `view.version.delete`, `view.version.get`, `view.version.list`, `view.version.update`
|
|
114
114
|
|
|
115
115
|
| Command | State | Note |
|
|
116
116
|
|---|---|---|
|
|
117
117
|
| `view.ai.generation-info` | observed blocker | backend: GET /workspaces/4/projects/24/datasets/54/dataviews/76/data/generate -> HTTP 400 5GENR011 NOT_IMPLEMENTED 'Not implemented', request_id:null |
|
|
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
|
-
| `view.derivative.data` | observed blocker | backend_error: SUSPECTED DEFECT: using the CLI's own documented agent_example body verbatim, derivative data fetch returns HTTP 500 empty body / outcome_unknown, reproduced twice ( |
|
|
120
119
|
| `view.export.create` | observed blocker | backend: CLI accepts the request (exit 0, job 358 accepted on POST /dataviews/76/actions), but job get 358 -> status:error, response:{"error":{"message":"'destination'"}} (a raw Py |
|
|
121
120
|
| `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)) |
|
|
122
121
|
|
|
123
|
-
Evidence collected on CLI releases 1.1.5 through 2.0.
|
|
122
|
+
Evidence collected on CLI releases 1.1.5 through 2.0.24; 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.
|
|
@@ -246,21 +246,21 @@ Status on release: ran once on CLI 2.0.18 — golden-data check 2026-09-19: exit
|
|
|
246
246
|
|
|
247
247
|
Run: `mammoth view derivative create`. Exact input fields: `mammoth schema get view.derivative.create`.
|
|
248
248
|
|
|
249
|
-
Example: `mammoth view derivative create 123 123 --input '{"body": {"param": {"METRIC": {"AS": "
|
|
249
|
+
Example: `mammoth view derivative create 123 123 --input '{"body": {"param": {"METRIC": {"AS": "total", "EXPRESSION": [{"TYPE": "FUNCTION", "VALUE": {"ARGUMENT": "column_1", "FUNCTION": "SUM"}}]}}}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
250
250
|
|
|
251
251
|
Result: `ViewDerivativeCreateResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
|
|
252
252
|
|
|
253
|
-
Status on release: ran once on CLI 2.0.
|
|
253
|
+
Status on release: ran once on CLI 2.0.24 — payload probe 2026-09-19: exit 0 on release with CLI 2.0.24. Created derivative id=6 on view 123 (project 52, dataset 104) with the column INTERNAL name as ARGUMENT; metric_status DONE on read-back. The same call with the display name reproduces the HTTP 500…
|
|
254
254
|
|
|
255
255
|
### `view.derivative.data`
|
|
256
256
|
|
|
257
257
|
Run: `mammoth view derivative data`. Exact input fields: `mammoth schema get view.derivative.data`.
|
|
258
258
|
|
|
259
|
-
Example: `mammoth view derivative data 123 123 123 --input '{"body": {"
|
|
259
|
+
Example: `mammoth view derivative data 123 123 123 --input '{"body": {"limit": null}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
260
260
|
|
|
261
261
|
Result: `ViewDerivativeDataResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
|
|
262
262
|
|
|
263
|
-
Status on release:
|
|
263
|
+
Status on release: ran once on CLI 2.0.24 — payload probe 2026-09-19: exit 0 on release with CLI 2.0.24. STATUS READY, data [{RESULT: 60.0}], metadata total/RESULT/NUMERIC, row_count 1. {"condition": null, "limit": null} (the web app's body) also works; {} is 4GENR007. Example corrected in 2.0.25. Sing…
|
|
264
264
|
|
|
265
265
|
### `view.derivative.delete`
|
|
266
266
|
|
|
@@ -68,6 +68,8 @@ mammoth dataset list --project PROJECT_ID # the id is gone
|
|
|
68
68
|
mammoth project list # matches the baseline plus your deliverables
|
|
69
69
|
# only if the task said the whole project was temporary:
|
|
70
70
|
# mammoth project delete PROJECT_ID --yes --confirm PROJECT_ID
|
|
71
|
+
# 202 means queued: project list can still show it for a while; project get
|
|
72
|
+
# returning resource_not_found is the proof, re-check rather than re-delete
|
|
71
73
|
```
|
|
72
74
|
|
|
73
75
|
Then walk the [report checklist](../report-checklist.md). If any step
|
|
@@ -56,10 +56,12 @@ through your context, so size costs nothing but time. Two boundaries hold:
|
|
|
56
56
|
upload the parts, or compress it (a `.zip`/`.gz` of a CSV is accepted and
|
|
57
57
|
expanded server-side).
|
|
58
58
|
|
|
59
|
-
Scanning and parsing time grows with size;
|
|
60
|
-
|
|
61
|
-
poll with the `job get` recovery command it
|
|
62
|
-
|
|
59
|
+
Scanning and parsing time grows with size; the upload waits up to 300 s by
|
|
60
|
+
default (`--job-timeout N` to change it) and, when the command returns
|
|
61
|
+
`timeout` with a `job_handle`, poll with the `job get` recovery command it
|
|
62
|
+
prints instead of uploading again: a second upload of the same file queues a
|
|
63
|
+
second job behind the first, and one stuck scan job holds every later upload
|
|
64
|
+
in the workspace (seen on release with jobs 667 and 708). A bare HTTP 500 from this route (`outcome_unknown`, empty body) means
|
|
63
65
|
the upload service is degraded; check `job get` for a job first, do not
|
|
64
66
|
retry in a loop.
|
|
65
67
|
|
|
@@ -89,6 +89,15 @@ but the copy answers every read with `4DTVW019` and its copied tasks never
|
|
|
89
89
|
execute. A plain `view create DATASET_ID` (no `clone_from`) gives a fresh view
|
|
90
90
|
of the raw upload, without the pipeline:
|
|
91
91
|
|
|
92
|
+
A task must fit the column's type: `replace-values`, `bulk-replace` and the
|
|
93
|
+
text operations take TEXT columns, `math` takes NUMERIC. Check `type` in the
|
|
94
|
+
`metadata` from `view get` first; the uploader already types `$1,234.56` as
|
|
95
|
+
NUMERIC, so strip nothing. When a task does not fit, the CLI answers
|
|
96
|
+
`pipeline_reference_error` with the column, the reason and the exact
|
|
97
|
+
`view task delete VIEW_ID TASK_ID --yes` that removes it; until then the view
|
|
98
|
+
is in `ref_error` and every read of it fails with `4DTVW019`. `convert-type`
|
|
99
|
+
changes the column's type when the task really needs the other one.
|
|
100
|
+
|
|
92
101
|
Every pivot `as_name` must be a display name that does not already exist on
|
|
93
102
|
the view (`4DTVW018 Same display name cannot be reused`): to carry a joined
|
|
94
103
|
column such as `monthly_target` into the summary, aggregate it under a new
|
|
@@ -27,6 +27,7 @@ these commands are not blanket permission to replay a mutation.
|
|
|
27
27
|
| `invalid_condition` (exit 2, `details.accepted` lists operators) | operator not in the accepted set (symbols `=`, `>` are accepted as aliases of EQ/GT; words like `GREATER` are not) | use an operator from references/input.md |
|
|
28
28
|
| `resource_not_found` (exit 5) after `view get VIEW_ID` / `view data get VIEW_ID` without a parent | discovery could not find the view in the selected project | pass `--project PROJECT_ID` and the `DATASET_ID` positional from `view list` |
|
|
29
29
|
| `{"data": "<unserializable View>"}` from `view get VIEW_ID` | CLI ≤ 2.0.17 only; fixed in 2.0.18 | upgrade, or rerun as `view get VIEW_ID DATASET_ID` |
|
|
30
|
+
| `pipeline_reference_error` (exit 1) from a transform or `view task add`, `details.reference_errors[].reason` `type mismatch` / `not available` | the backend stored the task but cannot bind it to that column (find/replace and text operations take TEXT columns, math takes NUMERIC); the view is in `ref_error` and every read of it fails with `4DTVW019` until the task goes | run the printed `view task delete VIEW_ID TASK_ID --yes`, then convert-type the column or pick a transform for its type; CLI ≤ 2.0.24 reported this as success with `has_error: true` |
|
|
30
31
|
| `4DTVW019 INVALID_RESPONSE_GENERATED` on every read of a view made with `view create ... "clone_from"` | backend: the clone is never processed (tasks stay `added`) | delete the copy; export the source view's rows, then run the summary in place as the last step; see recipes/end-to-end.md |
|
|
31
32
|
| `status: ready` with `status_info.ready` "more than one plausible way to be read" and `view list` empty | all-text CSV; the platform did not process it | `file upload` (2.0.18) reports this as `need_action`; see recipes/need-action.md |
|
|
32
33
|
| `need_action` in `file upload` result | the platform needs a parsing decision (e.g. ambiguous dates) | run the `next_command` it returns (`dataset file-settings get ID`), then `dataset file-settings update ID`; see recipes/need-action.md |
|
|
@@ -70,6 +70,17 @@ _COMMAND_DISCOVERY_PURPOSES = {
|
|
|
70
70
|
"view.transform.convert-type": "convert type cast numeric text date column",
|
|
71
71
|
"view.transform.fill-missing": "fill missing null empty impute carry forward values",
|
|
72
72
|
"view.transform.join": "join blend lookup merge matching keys rows",
|
|
73
|
+
"view.transform.extract-date": (
|
|
74
|
+
"extract date part year month day hour minute second week quarter weekday "
|
|
75
|
+
"month_text into a new column"
|
|
76
|
+
),
|
|
77
|
+
"view.transform.date-diff": "date difference days between two date columns age duration",
|
|
78
|
+
"view.transform.increment-date": "add subtract days months years to a date column shift",
|
|
79
|
+
"view.transform.math": "math arithmetic multiply divide add subtract formula expression amount",
|
|
80
|
+
"view.transform.pivot": "pivot group by aggregate sum count summary per region total",
|
|
81
|
+
"view.transform.set-values": "set values assign overwrite blank empty default where condition",
|
|
82
|
+
"view.transform.text": "text case upper lower title trim whitespace normalise",
|
|
83
|
+
"view.transform.bulk-replace": "find replace strip characters text values mapping",
|
|
73
84
|
}
|
|
74
85
|
|
|
75
86
|
# A compact string scope is retained for existing discovery consumers. These
|
|
@@ -268,8 +279,18 @@ def _humanize_sample(value: Any, field_name: str) -> Any:
|
|
|
268
279
|
|
|
269
280
|
|
|
270
281
|
def _tokens(value: str) -> frozenset[str]:
|
|
271
|
-
"""Tokenize search text consistently across platforms and Python runs.
|
|
272
|
-
|
|
282
|
+
"""Tokenize search text consistently across platforms and Python runs.
|
|
283
|
+
|
|
284
|
+
A hyphenated word is kept whole and also split into its parts, so that
|
|
285
|
+
``date`` finds ``extract-date`` and ``date-diff`` as well as ``convert-type``'s
|
|
286
|
+
example text.
|
|
287
|
+
"""
|
|
288
|
+
tokens: set[str] = set()
|
|
289
|
+
for token in _TOKEN_RE.findall(value.casefold()):
|
|
290
|
+
tokens.add(token)
|
|
291
|
+
if "-" in token:
|
|
292
|
+
tokens.update(token.split("-"))
|
|
293
|
+
return frozenset(tokens)
|
|
273
294
|
|
|
274
295
|
|
|
275
296
|
def _query_tokens(query: str) -> tuple[str, ...]:
|
|
@@ -231,6 +231,34 @@ def _meta(invocation: Invocation, workspace_id: int, project_id: int | None) ->
|
|
|
231
231
|
# ---------------------------------------------------------------------------
|
|
232
232
|
|
|
233
233
|
|
|
234
|
+
#: What an agent reads a view for: identity, parent, columns and types, row
|
|
235
|
+
#: count, and pipeline state. The record's ``dependencies_info`` and display
|
|
236
|
+
#: trees are several times that size and rarely wanted; ``fields`` (``"__full"``,
|
|
237
|
+
#: ``"__standard"`` or a list) returns them.
|
|
238
|
+
BRIEF_VIEW_FIELDS: tuple[str, ...] = (
|
|
239
|
+
"id",
|
|
240
|
+
"ds_id",
|
|
241
|
+
"dataset_id",
|
|
242
|
+
"name",
|
|
243
|
+
"status",
|
|
244
|
+
"row_count",
|
|
245
|
+
"column_count",
|
|
246
|
+
"metadata",
|
|
247
|
+
"pipeline_status",
|
|
248
|
+
"is_pipeline_running",
|
|
249
|
+
"is_dataview_data_in_sync",
|
|
250
|
+
"data_updated_at",
|
|
251
|
+
"updated_at",
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
def brief_view_record(record: Any) -> Any:
|
|
256
|
+
"""Keep only :data:`BRIEF_VIEW_FIELDS` of a dataview record."""
|
|
257
|
+
if not isinstance(record, dict):
|
|
258
|
+
return record
|
|
259
|
+
return {key: record[key] for key in BRIEF_VIEW_FIELDS if key in record}
|
|
260
|
+
|
|
261
|
+
|
|
234
262
|
def view_list(invocation: Invocation) -> HandlerResult:
|
|
235
263
|
"""List dataviews for a dataset in the active project."""
|
|
236
264
|
project_id = require_project(invocation)
|
|
@@ -243,6 +271,14 @@ def view_list(invocation: Invocation) -> HandlerResult:
|
|
|
243
271
|
parents.remember_records(
|
|
244
272
|
_profile_name(invocation), auth.workspace_id, data, project_id=project_id
|
|
245
273
|
)
|
|
274
|
+
if (
|
|
275
|
+
isinstance(data, dict)
|
|
276
|
+
and isinstance(data.get("dataviews"), list)
|
|
277
|
+
and not document.get("full")
|
|
278
|
+
):
|
|
279
|
+
# The list route has no field projection in the SDK; trim each record
|
|
280
|
+
# to the brief shape ``view get`` returns (``full: true`` keeps all).
|
|
281
|
+
data = {**data, "dataviews": [brief_view_record(item) for item in data["dataviews"]]}
|
|
246
282
|
return data, _meta(invocation, auth.workspace_id, project_id)
|
|
247
283
|
|
|
248
284
|
|
|
@@ -1411,6 +1447,10 @@ def view_task_add(invocation: Invocation) -> HandlerResult:
|
|
|
1411
1447
|
_forward_optional(document, kwargs, ("dataset_id",))
|
|
1412
1448
|
with open_service(invocation) as (service, auth):
|
|
1413
1449
|
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
|
+
reject_pipeline_reference_errors(service, dataview_id, kwargs.get("dataset_id"), data)
|
|
1414
1454
|
return data, _meta(invocation, auth.workspace_id, None)
|
|
1415
1455
|
|
|
1416
1456
|
|
|
@@ -21,13 +21,18 @@ from __future__ import annotations
|
|
|
21
21
|
|
|
22
22
|
from typing import Any
|
|
23
23
|
|
|
24
|
-
from mammoth_cli.commands.view import
|
|
24
|
+
from mammoth_cli.commands.view import (
|
|
25
|
+
BRIEF_VIEW_FIELDS,
|
|
26
|
+
_require_discovery_allowed,
|
|
27
|
+
brief_view_record,
|
|
28
|
+
)
|
|
25
29
|
from mammoth_cli.context import profiles
|
|
26
30
|
from mammoth_cli.errors.envelope import (
|
|
27
31
|
CODE_INVALID_ARGUMENT,
|
|
28
32
|
CODE_MISSING_ARGUMENT,
|
|
29
33
|
CODE_MISSING_FIELD,
|
|
30
34
|
CODE_SDK_SYMBOL_UNRESOLVED,
|
|
35
|
+
EXIT_API,
|
|
31
36
|
EXIT_USAGE,
|
|
32
37
|
CliError,
|
|
33
38
|
)
|
|
@@ -41,6 +46,20 @@ from mammoth_cli.services.conditions import CONDITION_KWARG
|
|
|
41
46
|
|
|
42
47
|
HandlerResult = tuple[Any, dict[str, Any]]
|
|
43
48
|
|
|
49
|
+
#: Error code for a task the backend accepted but could not bind to the view.
|
|
50
|
+
CODE_PIPELINE_REFERENCE_ERROR = "pipeline_reference_error"
|
|
51
|
+
_PIPELINE_SYMBOL = "mammoth.api.pipeline.PipelineAPI.get_pipeline"
|
|
52
|
+
_PIPELINE_ITEMS_SYMBOL = "mammoth.api.pipeline.PipelineAPI.items"
|
|
53
|
+
_PIPELINE_ITEMS_FULL = "__full"
|
|
54
|
+
_REFERROR_REASON_HINTS = {
|
|
55
|
+
"type mismatch": (
|
|
56
|
+
"the task needs a different column type (find/replace and text operations "
|
|
57
|
+
"take TEXT columns, math takes NUMERIC); convert-type the column first or "
|
|
58
|
+
"use a transform for that type"
|
|
59
|
+
),
|
|
60
|
+
"not available": "the column does not exist in the view at that point in the pipeline",
|
|
61
|
+
}
|
|
62
|
+
|
|
44
63
|
|
|
45
64
|
def _symbol(invocation: Invocation) -> str:
|
|
46
65
|
"""Return the reviewed backing SDK symbol for this command."""
|
|
@@ -237,9 +256,95 @@ def _dispatch_view(
|
|
|
237
256
|
data = service.call_view(view_id, method, **kwargs)
|
|
238
257
|
else:
|
|
239
258
|
data = service.call_view(view_id, method, dataset_id=int(dataset_id), **kwargs)
|
|
259
|
+
reject_pipeline_reference_errors(service, view_id, dataset_id, data)
|
|
240
260
|
return data, _meta(invocation, auth.workspace_id)
|
|
241
261
|
|
|
242
262
|
|
|
263
|
+
def _compact_reference_error(entry: Any) -> dict[str, Any]:
|
|
264
|
+
if not isinstance(entry, dict):
|
|
265
|
+
return {"reason": str(entry)}
|
|
266
|
+
raw_column = entry.get("column")
|
|
267
|
+
column: dict[str, Any] = raw_column if isinstance(raw_column, dict) else {}
|
|
268
|
+
return {
|
|
269
|
+
"column": column.get("display_name"),
|
|
270
|
+
"internal_name": column.get("internal_name"),
|
|
271
|
+
"type": column.get("type"),
|
|
272
|
+
"reason": entry.get("reason"),
|
|
273
|
+
"error_code": entry.get("error_code"),
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def reject_pipeline_reference_errors(
|
|
278
|
+
service: Any, view_id: int, dataset_id: Any, data: Any
|
|
279
|
+
) -> None:
|
|
280
|
+
"""Fail a pipeline mutation whose task the backend accepted but could not bind.
|
|
281
|
+
|
|
282
|
+
A task that references a missing column or the wrong column type is stored
|
|
283
|
+
with ``reference_errors`` and answered with ``has_error: true``; the
|
|
284
|
+
pipeline then sits in ``ref_error`` and every read of the view fails with
|
|
285
|
+
4DTVW019 until the task is removed. The SDK reads the view's draft flag
|
|
286
|
+
after the submit, and the backend flips that flag on a reference error, so
|
|
287
|
+
the SDK returns the job result instead of raising. Turn that into one
|
|
288
|
+
envelope that names the column, the reason and the exact repair command.
|
|
289
|
+
"""
|
|
290
|
+
if not (isinstance(data, dict) and data.get("has_error") is True):
|
|
291
|
+
return
|
|
292
|
+
kwargs: dict[str, Any] = {"dataview_id": view_id}
|
|
293
|
+
if dataset_id is not None:
|
|
294
|
+
kwargs["dataset_id"] = int(dataset_id)
|
|
295
|
+
pipeline: dict[str, Any] = {}
|
|
296
|
+
broken: list[dict[str, Any]] = []
|
|
297
|
+
try:
|
|
298
|
+
read = service.call(_PIPELINE_SYMBOL, **kwargs)
|
|
299
|
+
if isinstance(read, dict):
|
|
300
|
+
pipeline = read
|
|
301
|
+
items = service.call(_PIPELINE_ITEMS_SYMBOL, fields=_PIPELINE_ITEMS_FULL, **kwargs)
|
|
302
|
+
if isinstance(items, dict):
|
|
303
|
+
broken = [
|
|
304
|
+
item
|
|
305
|
+
for item in items.get("items") or []
|
|
306
|
+
if isinstance(item, dict) and item.get("reference_errors")
|
|
307
|
+
]
|
|
308
|
+
except CliError:
|
|
309
|
+
# The mutation already failed; a failed follow-up read must not hide that.
|
|
310
|
+
pass
|
|
311
|
+
reference_errors = [
|
|
312
|
+
_compact_reference_error(entry)
|
|
313
|
+
for item in broken
|
|
314
|
+
for entry in (item.get("reference_errors") or {}).get("reference_errors") or []
|
|
315
|
+
]
|
|
316
|
+
task_ids = [item.get("id") for item in broken if item.get("id") is not None]
|
|
317
|
+
first = reference_errors[0] if reference_errors else {}
|
|
318
|
+
reason = str(first.get("reason") or "").lower()
|
|
319
|
+
column = first.get("column")
|
|
320
|
+
what = f"column '{column}' ({first.get('type')})" if column else "a column it references"
|
|
321
|
+
why = _REFERROR_REASON_HINTS.get(reason, f"reason: {reason or 'unknown'}")
|
|
322
|
+
raise CliError(
|
|
323
|
+
code=CODE_PIPELINE_REFERENCE_ERROR,
|
|
324
|
+
message=(
|
|
325
|
+
f"The task was added to view {view_id} but cannot bind to {what}; "
|
|
326
|
+
"the pipeline is in ref_error and the data did not change."
|
|
327
|
+
),
|
|
328
|
+
exit_status=EXIT_API,
|
|
329
|
+
hint=(
|
|
330
|
+
f"Reads of view {view_id} fail (4DTVW019) until the task is removed: "
|
|
331
|
+
f"run the recovery command, then fix the input ({why})."
|
|
332
|
+
),
|
|
333
|
+
details={
|
|
334
|
+
"view_id": view_id,
|
|
335
|
+
"dataset_id": kwargs.get("dataset_id"),
|
|
336
|
+
"pipeline_state": pipeline.get("state"),
|
|
337
|
+
"task_ids": task_ids,
|
|
338
|
+
"reference_errors": reference_errors,
|
|
339
|
+
"response": data,
|
|
340
|
+
},
|
|
341
|
+
recovery_commands=[
|
|
342
|
+
f"mammoth view task delete {view_id} {task_id} --yes" for task_id in task_ids
|
|
343
|
+
]
|
|
344
|
+
or [f'mammoth view pipeline items {view_id} --input \'{{"fields": "__full"}}\''],
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
|
|
243
348
|
def _profile_name(invocation: Invocation) -> str:
|
|
244
349
|
return invocation.profile or profiles.get_selected()
|
|
245
350
|
|
|
@@ -304,9 +409,13 @@ def view_get(invocation: Invocation) -> HandlerResult:
|
|
|
304
409
|
# The release operation is dataset-scoped. Bypass the rich-object
|
|
305
410
|
# resolver when the caller supplied the exact parent so no discovery
|
|
306
411
|
# probe can escape the requested project/dataset.
|
|
307
|
-
kwargs: dict[str, Any] = {
|
|
308
|
-
|
|
309
|
-
|
|
412
|
+
kwargs: dict[str, Any] = {
|
|
413
|
+
"dataset_id": dataset_id,
|
|
414
|
+
"dataview_id": view_id,
|
|
415
|
+
# Server-side projection; the brief set unless the caller asks.
|
|
416
|
+
"fields": document.get("fields")
|
|
417
|
+
or ",".join(key for key in BRIEF_VIEW_FIELDS if key != "dataset_id"),
|
|
418
|
+
}
|
|
310
419
|
with open_service(invocation) as (service, auth):
|
|
311
420
|
data = service.call("mammoth.api.dataviews.DataviewsAPI.get", **kwargs)
|
|
312
421
|
parents.remember(_profile_name(invocation), auth.workspace_id, {view_id: dataset_id})
|
|
@@ -324,6 +433,10 @@ def view_get(invocation: Invocation) -> HandlerResult:
|
|
|
324
433
|
data = service.call(_symbol(invocation), **kwargs)
|
|
325
434
|
payload = _view_payload(data)
|
|
326
435
|
parents.remember_records(_profile_name(invocation), auth.workspace_id, payload)
|
|
436
|
+
if not document.get("fields"):
|
|
437
|
+
# The discovery path returns the standard record; trim it to the same
|
|
438
|
+
# brief shape the exact path asks the server for.
|
|
439
|
+
payload = brief_view_record(payload)
|
|
327
440
|
return payload, _meta(invocation, auth.workspace_id)
|
|
328
441
|
|
|
329
442
|
|
|
@@ -578,6 +578,11 @@ _S7_ADDITIONAL_INPUT_FIELDS: dict[str, tuple[FieldSpec, ...]] = {
|
|
|
578
578
|
# The GET data route has no server-side page size; the CLI trims the row
|
|
579
579
|
# list so a read-back costs a screen of tokens, not the whole view.
|
|
580
580
|
"view.data.get": (FieldSpec("limit", required=False, annotation=int, default=50),),
|
|
581
|
+
# The dataview GET takes a server-side projection: "__min", "__standard",
|
|
582
|
+
# "__full" or a comma-separated field list.
|
|
583
|
+
"view.get": (FieldSpec("fields", required=False, annotation=str | None, default=None),),
|
|
584
|
+
# ``view list`` records are trimmed to the brief shape; ``full`` keeps them.
|
|
585
|
+
"view.list": (FieldSpec("full", required=False, annotation=bool, default=False),),
|
|
581
586
|
"activity.list": (
|
|
582
587
|
FieldSpec("project_id", required=False, annotation=int | None, default=None),
|
|
583
588
|
FieldSpec("workspace_id", required=False, annotation=int | None, default=None),
|
|
@@ -269,6 +269,25 @@ _EXAMPLE_INPUT_HINTS: dict[str, dict[str, Any]] = {
|
|
|
269
269
|
"view.data-check.update": {
|
|
270
270
|
"body": {"patches": [{"op": "command", "path": "disable", "value": None}]},
|
|
271
271
|
},
|
|
272
|
+
# ARGUMENT is the column's *internal* name (metadata[].internal_name from
|
|
273
|
+
# view get); a display name makes the backend fail with HTTP 500.
|
|
274
|
+
"view.derivative.create": {
|
|
275
|
+
"body": {
|
|
276
|
+
"param": {
|
|
277
|
+
"METRIC": {
|
|
278
|
+
"AS": "total",
|
|
279
|
+
"EXPRESSION": [
|
|
280
|
+
{
|
|
281
|
+
"TYPE": "FUNCTION",
|
|
282
|
+
"VALUE": {"ARGUMENT": "column_1", "FUNCTION": "SUM"},
|
|
283
|
+
}
|
|
284
|
+
],
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
},
|
|
288
|
+
},
|
|
289
|
+
# The web app posts {condition, limit: null}; an empty body is 4GENR007.
|
|
290
|
+
"view.derivative.data": {"body": {"limit": None}},
|
|
272
291
|
# The backend accepts NUMERIC, TEXT or DATE (4PARM008 otherwise).
|
|
273
292
|
"parameter.create": {"param_type": "TEXT", "value": "Q3"},
|
|
274
293
|
# The backend requires a placement ("Data check position must be given");
|
|
@@ -3560,7 +3560,9 @@ commands:
|
|
|
3560
3560
|
- CT-DASHBOARD-TEMPLATE-CREATE-ERROR
|
|
3561
3561
|
draft_test: null
|
|
3562
3562
|
undo_test: null
|
|
3563
|
-
known_restrictions:
|
|
3563
|
+
known_restrictions: 'dashboard_id must name a dashboard whose widgets bind dataset columns; a blank dashboard
|
|
3564
|
+
fails with "None of the columns this template binds are in the dataset". Build the dashboard first (dashboard
|
|
3565
|
+
create, then widgets), then save it as a template.'
|
|
3564
3566
|
reviewed_by: primary
|
|
3565
3567
|
- command_id: dashboard.template.delete
|
|
3566
3568
|
command_path: dashboard template delete
|
|
@@ -993,7 +993,7 @@ commands:
|
|
|
993
993
|
- CT-VIEW-DATA-CHECK-UPDATE-ERROR
|
|
994
994
|
draft_test: null
|
|
995
995
|
undo_test: null
|
|
996
|
-
known_restrictions: 'patches are {op: command, path: enable|disable, value: null} or {op: replace, path: spec, value: AddDataCheckSpec}. On release the PATCH returns HTTP 500 (outcome_unknown) after
|
|
996
|
+
known_restrictions: 'patches are {op: command, path: enable|disable, value: null} or {op: replace, path: spec, value: AddDataCheckSpec}, the same body the web app sends. On release the PATCH returns HTTP 500 (outcome_unknown) from backend validation that runs after the change is committed; read the check back with view data-check get before retrying.'
|
|
997
997
|
reviewed_by: primary
|
|
998
998
|
- command_id: view.data.get
|
|
999
999
|
command_path: view data get
|
|
@@ -1173,7 +1173,7 @@ commands:
|
|
|
1173
1173
|
secret_fields: []
|
|
1174
1174
|
human_example: mammoth view derivative create VIEW_ID --help
|
|
1175
1175
|
agent_example: 'mammoth view derivative create 123 123 --input ''{"body": {"param": {"METRIC": {"AS":
|
|
1176
|
-
"
|
|
1176
|
+
"total", "EXPRESSION": [{"TYPE": "FUNCTION", "VALUE": {"ARGUMENT": "column_1", "FUNCTION": "SUM"}}]}}}}'''
|
|
1177
1177
|
unit_tests:
|
|
1178
1178
|
- UT-VIEW-DERIVATIVE-CREATE
|
|
1179
1179
|
contract_tests:
|
|
@@ -1182,7 +1182,9 @@ commands:
|
|
|
1182
1182
|
- CT-VIEW-DERIVATIVE-CREATE-ERROR
|
|
1183
1183
|
draft_test: null
|
|
1184
1184
|
undo_test: null
|
|
1185
|
-
known_restrictions:
|
|
1185
|
+
known_restrictions: 'ARGUMENT and any column reference in the METRIC expression are internal names (metadata[].internal_name
|
|
1186
|
+
from view get, e.g. column_1), not display names; a display name makes the backend fail with HTTP 500. The
|
|
1187
|
+
result is {"id": N}; read the value with view derivative data.'
|
|
1186
1188
|
reviewed_by: primary
|
|
1187
1189
|
- command_id: view.derivative.data
|
|
1188
1190
|
command_path: view derivative data
|
|
@@ -1226,8 +1228,7 @@ commands:
|
|
|
1226
1228
|
required_fixture_guard: null
|
|
1227
1229
|
secret_fields: []
|
|
1228
1230
|
human_example: mammoth view derivative data VIEW_ID DERIVATIVE_ID --help
|
|
1229
|
-
agent_example: 'mammoth view derivative data 123 123 123 --input ''{"body": {"
|
|
1230
|
-
"SHOW"}}}'''
|
|
1231
|
+
agent_example: 'mammoth view derivative data 123 123 123 --input ''{"body": {"limit": null}}'''
|
|
1231
1232
|
unit_tests:
|
|
1232
1233
|
- UT-VIEW-DERIVATIVE-DATA
|
|
1233
1234
|
contract_tests:
|
|
@@ -1236,7 +1237,9 @@ commands:
|
|
|
1236
1237
|
- CT-VIEW-DERIVATIVE-DATA-ERROR
|
|
1237
1238
|
draft_test: null
|
|
1238
1239
|
undo_test: null
|
|
1239
|
-
known_restrictions: null
|
|
1240
|
+
known_restrictions: 'body is {"condition": CONDITION_OR_NULL, "limit": null}, the same document the web app posts;
|
|
1241
|
+
{"limit": null} is the minimal accepted body and an empty body is rejected (4GENR007). Returns STATUS, the
|
|
1242
|
+
metric row(s) under data and their metadata.'
|
|
1240
1243
|
reviewed_by: primary
|
|
1241
1244
|
- command_id: view.derivative.delete
|
|
1242
1245
|
command_path: view derivative delete
|
|
@@ -3786,8 +3789,7 @@ commands:
|
|
|
3786
3789
|
- CT-VIEW-TRANSFORM-BULK-REPLACE-ERROR
|
|
3787
3790
|
draft_test: LT-VIEW-TRANSFORM-BULK-REPLACE-DRAFT
|
|
3788
3791
|
undo_test: LT-VIEW-TRANSFORM-BULK-REPLACE-UNDO
|
|
3789
|
-
known_restrictions: Complete flags/defaults/result/draft/undo/live contract is specified in plan 02's
|
|
3790
|
-
'Complete bulk-replace command contract'; this appendix does not narrow or replace it.
|
|
3792
|
+
known_restrictions: 'Complete flags/defaults/result/draft/undo/live contract is specified in plan 02''s ''Complete bulk-replace command contract''; this appendix does not narrow or replace it. columns must be TEXT (metadata[].type from view get): a NUMERIC or DATE column is stored with a type-mismatch reference error, the view enters ref_error and the CLI answers pipeline_reference_error with the view task delete that removes the task.'
|
|
3791
3793
|
reviewed_by: primary
|
|
3792
3794
|
- command_id: view.transform.combine-columns
|
|
3793
3795
|
command_path: view transform combine-columns
|
|
@@ -4535,7 +4537,9 @@ commands:
|
|
|
4535
4537
|
- CT-VIEW-TRANSFORM-PIVOT-ERROR
|
|
4536
4538
|
draft_test: LT-VIEW-TRANSFORM-PIVOT-DRAFT
|
|
4537
4539
|
undo_test: LT-VIEW-TRANSFORM-PIVOT-UNDO
|
|
4538
|
-
known_restrictions:
|
|
4540
|
+
known_restrictions: 'Replaces the view''s columns with the summary, so run it last (export rows first). Every as_name
|
|
4541
|
+
must be a display name that does not already exist on the view (4DTVW018 SAME_DISPLAY_NAME_CANNOT_BE_REUSED):
|
|
4542
|
+
aggregate a joined column under a new name.'
|
|
4539
4543
|
reviewed_by: primary
|
|
4540
4544
|
- command_id: view.transform.replace
|
|
4541
4545
|
command_path: view transform replace
|
|
@@ -4576,7 +4580,7 @@ commands:
|
|
|
4576
4580
|
- CT-VIEW-TRANSFORM-REPLACE-ERROR
|
|
4577
4581
|
draft_test: LT-VIEW-TRANSFORM-REPLACE-DRAFT
|
|
4578
4582
|
undo_test: LT-VIEW-TRANSFORM-REPLACE-UNDO
|
|
4579
|
-
known_restrictions:
|
|
4583
|
+
known_restrictions: 'columns must be TEXT (metadata[].type from view get): a NUMERIC or DATE column is stored with a type-mismatch reference error, the view enters ref_error and the CLI answers pipeline_reference_error with the view task delete that removes the task.'
|
|
4580
4584
|
reviewed_by: primary
|
|
4581
4585
|
- command_id: view.transform.set-values
|
|
4582
4586
|
command_path: view transform set-values
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mammoth_cli-2.0.23 → mammoth_cli-2.0.25}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|