mammoth-cli 2.2.4__tar.gz → 2.2.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/PKG-INFO +3 -4
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/README.md +1 -2
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/__init__.py +1 -1
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +5 -6
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +1 -1
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +6 -5
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +20 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +20 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +10 -0
- mammoth_cli-2.2.6/mammoth_cli/bundled_skill/mammoth-cli/references/commands/link.md +13 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +10 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +36 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/auth.py +65 -60
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/browse.py +46 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/dataset.py +36 -11
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/folder.py +1 -11
- mammoth_cli-2.2.6/mammoth_cli/commands/link.py +89 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/registry.py +8 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/schema.py +30 -1
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/workspace.py +7 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/context/endpoint.py +2 -2
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/context/profiles.py +1 -1
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/context/resolver.py +39 -3
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/contracts/auth.py +1 -11
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/embed.py +1 -1
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/command_contract.py +4 -1
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/mapping.py +17 -2
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/positionals.py +23 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/sdk_service.py +25 -3
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/pyproject.toml +2 -2
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/browse.yaml +86 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/dashboard.yaml +80 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/dataset.yaml +45 -0
- mammoth_cli-2.2.6/spec/manifests/commands/link.yaml +40 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/project.yaml +1 -1
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/workspace.yaml +37 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/edits-target.source.yaml +1 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/sdk-catalog.source.yaml +50 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/sdk-methods.yaml +77 -5
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/.gitignore +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/LICENSE +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/__main__.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/app.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/database-import.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/__init__.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/activity.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/addon.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/agent.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/ai.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/annotation.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/automation.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/batch.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/billing.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/calc.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/capability.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/client_app.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/completion.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/config.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/connector.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/context.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/dashboard.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/data_app.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/doctor.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/external_key.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/file.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/job.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/notification.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/parameter.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/project.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/report.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/schedule.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/skill.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/snippet.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/support.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/template.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/trash.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/upgrade.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/user.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/view.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/view_ops.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/view_profile.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/webhook.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/commands/workflow.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/context/__init__.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/context/credentials.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/contracts/__init__.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/errors/__init__.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/errors/envelope.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/manifest/__init__.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/manifest/loader.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/messages/__init__.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/output/__init__.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/output/envelope.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/output/normalize.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/output/policy.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/output/progress.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/output/render.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/py.typed +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/__init__.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/confirm.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/dataset_health.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/dryrun.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/dryrun_targets.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/embedded.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/executor.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/input_loader.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/intent_only.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/invocation.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/new_data.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/options.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/parents.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/runlog.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/session.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/state.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/strict.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/updates.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/validate.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/runtime/verify.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/__init__.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/argspec.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/board_values.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/coerce.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/conditions.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/dashboard_filters.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/dashboard_pages.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/dashboard_review.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/data_profile.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/data_quality.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/dispatch.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/factory.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/input_fields.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/listing.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/openapi_types.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/protocol.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/read_queries.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/stored_stats.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/testing.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/text_dates.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/type_system.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/services/write_impact.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/skills/__init__.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/skills/installer.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/skills/steering.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/testing.py +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/activity.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/addon.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/agent.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/ai.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/annotation.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/auth.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/automation.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/batch.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/billing.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/calc.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/capability.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/client-app.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/completion.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/config.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/connector.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/context.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/data-app.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/doctor.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/external-key.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/file.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/folder.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/job.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/log.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/notification.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/parameter.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/report.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/schedule.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/schema.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/skill.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/snippet.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/support.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/template.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/trash.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/upgrade.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/user.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/version.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/view.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/webhook.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/commands/workflow.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/openapi-operations.yaml +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/manifests/schema-v1.json +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/openapi/metadata.json +0 -0
- {mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/spec/openapi/openapi.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mammoth-cli
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.6
|
|
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.9,>=0.8.
|
|
20
|
+
Requires-Dist: mammoth-io<0.9,>=0.8.7
|
|
21
21
|
Requires-Dist: platformdirs<5,>=4.10
|
|
22
22
|
Requires-Dist: pydantic<3,>=2.12.5
|
|
23
23
|
Requires-Dist: pyyaml<7,>=6
|
|
@@ -212,8 +212,7 @@ Onboard me first:
|
|
|
212
212
|
`recommendation`, print exactly this and wait until I say done: "In the
|
|
213
213
|
Mammoth web app open Workspace settings → API Tokens → Create token (no
|
|
214
214
|
project, so I can create projects), copy the token (it starts with mm_ and
|
|
215
|
-
is shown once),
|
|
216
|
-
in the address bar), then run in your own terminal: mammoth auth login" —
|
|
215
|
+
is shown once), then run in your own terminal: mammoth auth login" —
|
|
217
216
|
never ask for, read, or pass the token yourself, and never run auth login.
|
|
218
217
|
3. Require `mammoth doctor` to pass, then run `mammoth skill show` and
|
|
219
218
|
follow the guide it prints.
|
|
@@ -184,8 +184,7 @@ Onboard me first:
|
|
|
184
184
|
`recommendation`, print exactly this and wait until I say done: "In the
|
|
185
185
|
Mammoth web app open Workspace settings → API Tokens → Create token (no
|
|
186
186
|
project, so I can create projects), copy the token (it starts with mm_ and
|
|
187
|
-
is shown once),
|
|
188
|
-
in the address bar), then run in your own terminal: mammoth auth login" —
|
|
187
|
+
is shown once), then run in your own terminal: mammoth auth login" —
|
|
189
188
|
never ask for, read, or pass the token yourself, and never run auth login.
|
|
190
189
|
3. Require `mammoth doctor` to pass, then run `mammoth skill show` and
|
|
191
190
|
follow the guide it prints.
|
{mammoth_cli-2.2.4 → mammoth_cli-2.2.6}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Authentication and profiles
|
|
2
2
|
|
|
3
|
-
Required: an API token (`mm_...`)
|
|
3
|
+
Required: an API token (`mm_...`); it names its own workspace. Optional: a one-label
|
|
4
4
|
server prefix (default `app`, resolving to `https://app.mammoth.io/api/v2`).
|
|
5
5
|
Login accepts nothing else. If `auth status` reports `credential: key_secret`
|
|
6
6
|
(a profile saved by an older CLI), it still works, but ask the operator to run
|
|
@@ -29,8 +29,7 @@ human operator:
|
|
|
29
29
|
1. Tell the operator where the credentials come from: in the Mammoth web app,
|
|
30
30
|
**Workspace settings → API Tokens → Create token** gives a token that
|
|
31
31
|
starts with `mm_`; the web app shows it only once (if it is lost, create a
|
|
32
|
-
new one).
|
|
33
|
-
in the web app's address bar. Then give the exact command to run in
|
|
32
|
+
new one). Then give the exact command to run in
|
|
34
33
|
**their own** terminal. For production it is:
|
|
35
34
|
|
|
36
35
|
```bash
|
|
@@ -40,7 +39,7 @@ human operator:
|
|
|
40
39
|
Add `--server-prefix release` only when the task names the release
|
|
41
40
|
environment, and `--profile NAME` only when the operator wants a profile
|
|
42
41
|
other than `default`. The command prompts for the token with hidden
|
|
43
|
-
input,
|
|
42
|
+
input, so no secret enters chat, argv, or history.
|
|
44
43
|
Tokens are per environment and per workspace: a release token never
|
|
45
44
|
authenticates on `app`.
|
|
46
45
|
On macOS the Keychain may show a dialog about `mammoth-cli`; tell the
|
|
@@ -54,7 +53,7 @@ human operator:
|
|
|
54
53
|
`auth login` yourself, with or without `--input`, unless the operator has
|
|
55
54
|
explicitly given you a protected `0600` credential file path to use.
|
|
56
55
|
|
|
57
|
-
The only supported configuration is the API token
|
|
56
|
+
The only supported configuration is the API token and an optional one-label server prefix (default `app`). There is no base-url
|
|
58
57
|
override.
|
|
59
58
|
|
|
60
59
|
## Cold-start sequence
|
|
@@ -123,7 +122,7 @@ file backend as a secret store; use the OS keyring or stop and obtain a
|
|
|
123
122
|
supported secure store. Remove any input file after the
|
|
124
123
|
profile is stored.
|
|
125
124
|
|
|
126
|
-
`creds.json` is a `0600` JSON file: `{"api_token": "mm_...",
|
|
125
|
+
`creds.json` is a `0600` JSON file: `{"api_token": "mm_...",
|
|
127
126
|
"server_prefix": "app"}` (`server_prefix` optional). You can
|
|
128
127
|
also pipe it with `--input - --input-format json`.
|
|
129
128
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# What is proven on release
|
|
2
2
|
|
|
3
3
|
Generated from `docs/release-capability-matrix.json`; do not edit by hand.
|
|
4
|
-
The CLI publishes
|
|
4
|
+
The CLI publishes 602 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 (`view transform *` commands submit through `view.task.add`, except `rename-columns` and `sort`, which set view display properties through `view.update`). 262 bound commands ran once successfully on release, 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. Use an untried command normally: confirm a write with the user first, check its result with a read afterwards, and never refuse a command only because it is untried.
|
|
5
5
|
|
|
6
6
|
Status meanings:
|
|
7
7
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Published CLI command catalog
|
|
2
2
|
|
|
3
|
-
This generated catalog is a lookup table for every command in the published CLI manifest, currently
|
|
3
|
+
This generated catalog is a lookup table for every command in the published CLI manifest, currently 602; each entry carries its release status line. It is a command-contract index, not an assertion that every backend/OpenAPI operation has a CLI binding. For an exact local CLI contract, run `mammoth schema get COMMAND_ID`; `mammoth capability list` is an API-binding inventory and can omit typed/local CLI routes. For focused workflows, read the [recipes index](recipes/index.md). Sensitive structured input must come from a private file or pipe; never put secrets in literal argv.
|
|
4
4
|
|
|
5
5
|
Load only the applicable domain file:
|
|
6
6
|
|
|
@@ -13,7 +13,7 @@ Load only the applicable domain file:
|
|
|
13
13
|
- [automation](commands/automation.md) — 8 published commands
|
|
14
14
|
- [batch](commands/batch.md) — 7 published commands
|
|
15
15
|
- [billing](commands/billing.md) — 22 published commands
|
|
16
|
-
- [browse](commands/browse.md) —
|
|
16
|
+
- [browse](commands/browse.md) — 6 published commands
|
|
17
17
|
- [calc](commands/calc.md) — 1 published commands
|
|
18
18
|
- [capability](commands/capability.md) — 3 published commands
|
|
19
19
|
- [client-app](commands/client-app.md) — 5 published commands
|
|
@@ -23,14 +23,15 @@ Load only the applicable domain file:
|
|
|
23
23
|
- [context](commands/context.md) — 3 published commands
|
|
24
24
|
- [dashboard-qa](commands/dashboard-qa.md) — 13 published commands
|
|
25
25
|
- [dashboard-style](commands/dashboard-style.md) — 10 published commands
|
|
26
|
-
- [dashboard](commands/dashboard.md) —
|
|
26
|
+
- [dashboard](commands/dashboard.md) — 95 published commands
|
|
27
27
|
- [data-app](commands/data-app.md) — 12 published commands
|
|
28
|
-
- [dataset](commands/dataset.md) —
|
|
28
|
+
- [dataset](commands/dataset.md) — 21 published commands
|
|
29
29
|
- [doctor](commands/doctor.md) — 1 published commands
|
|
30
30
|
- [external-key](commands/external-key.md) — 4 published commands
|
|
31
31
|
- [file](commands/file.md) — 9 published commands
|
|
32
32
|
- [folder](commands/folder.md) — 10 published commands
|
|
33
33
|
- [job](commands/job.md) — 4 published commands
|
|
34
|
+
- [link](commands/link.md) — 1 published commands
|
|
34
35
|
- [log](commands/log.md) — 2 published commands
|
|
35
36
|
- [notification](commands/notification.md) — 5 published commands
|
|
36
37
|
- [parameter](commands/parameter.md) — 14 published commands
|
|
@@ -50,4 +51,4 @@ Load only the applicable domain file:
|
|
|
50
51
|
- [view](commands/view.md) — 90 published commands
|
|
51
52
|
- [webhook](commands/webhook.md) — 7 published commands
|
|
52
53
|
- [workflow](commands/workflow.md) — 16 published commands
|
|
53
|
-
- [workspace](commands/workspace.md) —
|
|
54
|
+
- [workspace](commands/workspace.md) — 26 published commands
|
|
@@ -22,6 +22,26 @@ Result: `BrowseProjectResult`; mutation `read`, confirmation `none`, wait policy
|
|
|
22
22
|
|
|
23
23
|
Status on release: observed blocker — backend_error: GET /workspaces/4/projects/47/browse HTTP 500 empty body. Re-check before relying on it.
|
|
24
24
|
|
|
25
|
+
### `browse.resource`
|
|
26
|
+
|
|
27
|
+
Run: `mammoth browse resource`. Exact input fields: `mammoth schema get browse.resource`.
|
|
28
|
+
|
|
29
|
+
Example: `mammoth browse resource dataset 123`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
30
|
+
|
|
31
|
+
Result: `BrowseResourceResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
|
|
32
|
+
|
|
33
|
+
Status on release: untried; no live run recorded.
|
|
34
|
+
|
|
35
|
+
### `browse.resources`
|
|
36
|
+
|
|
37
|
+
Run: `mammoth browse resources`. Exact input fields: `mammoth schema get browse.resources`.
|
|
38
|
+
|
|
39
|
+
Example: `mammoth browse resources`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
40
|
+
|
|
41
|
+
Result: `BrowseResourcesResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
|
|
42
|
+
|
|
43
|
+
Status on release: untried; no live run recorded.
|
|
44
|
+
|
|
25
45
|
### `browse.root`
|
|
26
46
|
|
|
27
47
|
Run: `mammoth browse root`. Exact input fields: `mammoth schema get browse.root`.
|
|
@@ -322,6 +322,16 @@ Result: `DashboardEmbedUsageGetResult`; mutation `read`, confirmation `none`, wa
|
|
|
322
322
|
|
|
323
323
|
Status on release: untried; no live run recorded.
|
|
324
324
|
|
|
325
|
+
### `dashboard.embed.usage.summary`
|
|
326
|
+
|
|
327
|
+
Run: `mammoth dashboard embed usage summary`. Exact input fields: `mammoth schema get dashboard.embed.usage.summary`.
|
|
328
|
+
|
|
329
|
+
Example: `mammoth dashboard embed usage summary --input '{"dashboard_ids": [1]}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
330
|
+
|
|
331
|
+
Result: `DashboardEmbedUsageSummaryResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
|
|
332
|
+
|
|
333
|
+
Status on release: untried; no live run recorded.
|
|
334
|
+
|
|
325
335
|
### `dashboard.exemplar.extract`
|
|
326
336
|
|
|
327
337
|
Run: `mammoth dashboard exemplar extract`. Exact input fields: `mammoth schema get dashboard.exemplar.extract`.
|
|
@@ -372,6 +382,16 @@ Result: `DashboardFilterResult`; mutation `benign_mutation`, confirmation `none`
|
|
|
372
382
|
|
|
373
383
|
Status on release: untried; no live run recorded.
|
|
374
384
|
|
|
385
|
+
### `dashboard.format-preview`
|
|
386
|
+
|
|
387
|
+
Run: `mammoth dashboard format-preview`. Exact input fields: `mammoth schema get dashboard.format-preview`.
|
|
388
|
+
|
|
389
|
+
Example: `mammoth dashboard format-preview 123 --input '{"style": "sample"}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
390
|
+
|
|
391
|
+
Result: `DashboardFormatPreviewResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
|
|
392
|
+
|
|
393
|
+
Status on release: untried; no live run recorded.
|
|
394
|
+
|
|
375
395
|
### `dashboard.get`
|
|
376
396
|
|
|
377
397
|
Run: `mammoth dashboard get`. Exact input fields: `mammoth schema get dashboard.get`.
|
|
@@ -22,6 +22,16 @@ Result: `DatasetBrokenRowsListResult`; mutation `read`, confirmation `none`, wai
|
|
|
22
22
|
|
|
23
23
|
Status on release: untried; no live run recorded.
|
|
24
24
|
|
|
25
|
+
### `dataset.broken-rows.resolve`
|
|
26
|
+
|
|
27
|
+
Run: `mammoth dataset broken-rows resolve`. Exact input fields: `mammoth schema get dataset.broken-rows.resolve`.
|
|
28
|
+
|
|
29
|
+
Example: `mammoth dataset broken-rows resolve 123 --input '{"op": "add", "batch_id": 1, "rows": [{"sample_key": "Status"}]}'`. Illustrative only: append `--yes` after observing an owned target.
|
|
30
|
+
|
|
31
|
+
Result: `DatasetBrokenRowsResolveResult`; mutation `destructive`, confirmation `prompt_or_yes`, wait policy `not_async`.
|
|
32
|
+
|
|
33
|
+
Status on release: untried; no live run recorded.
|
|
34
|
+
|
|
25
35
|
### `dataset.bulk-delete`
|
|
26
36
|
|
|
27
37
|
Run: `mammoth dataset bulk-delete`. Exact input fields: `mammoth schema get dataset.bulk-delete`.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# `link` commands
|
|
2
|
+
|
|
3
|
+
Every command returns the standard JSON envelope. On nonzero exit, read the error envelope and its `recovery_commands`; do not guess request fields. "Status on release" is joined from `docs/release-capability-matrix.json`: *ran once* means one bounded live run succeeded on the named CLI release, *untried* means nobody has run it (use it normally: confirm writes with the user, check the result afterwards), *not supported* means the backend refuses it. When this file disagrees with [capabilities](../capabilities.md) or a recipe, they win. Envelope shapes: [machine output](../machine-output.md).
|
|
4
|
+
|
|
5
|
+
### `link`
|
|
6
|
+
|
|
7
|
+
Run: `mammoth link`. Exact input fields: `mammoth schema get link`.
|
|
8
|
+
|
|
9
|
+
Example: `mammoth link https://app.mammoth.io/workspaces/1/projects/2/data/datasets`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
10
|
+
|
|
11
|
+
Result: `LinkResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
|
|
12
|
+
|
|
13
|
+
Status on release: untried; no live run recorded.
|
|
@@ -64,6 +64,16 @@ Result: `WorkspaceGetResult`; mutation `read`, confirmation `none`, wait policy
|
|
|
64
64
|
|
|
65
65
|
Status on release: ran once on CLI 2.0.18 — fixture-lifecycle sweep 2026-09-19: exit 0 on release with CLI 2.0.18. Returned workspace 4 (API Tests) profile. Single invocation only.
|
|
66
66
|
|
|
67
|
+
### `workspace.home`
|
|
68
|
+
|
|
69
|
+
Run: `mammoth workspace home`. Exact input fields: `mammoth schema get workspace.home`.
|
|
70
|
+
|
|
71
|
+
Example: `mammoth workspace home`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
72
|
+
|
|
73
|
+
Result: `WorkspaceHomeResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
|
|
74
|
+
|
|
75
|
+
Status on release: untried; no live run recorded.
|
|
76
|
+
|
|
67
77
|
### `workspace.invite.delete`
|
|
68
78
|
|
|
69
79
|
Run: `mammoth workspace invite delete`. Exact input fields: `mammoth schema get workspace.invite.delete`.
|
|
@@ -58,3 +58,39 @@ mammoth view list DATASET_ID --project PROJECT_ID # the new view, row_count s
|
|
|
58
58
|
The new view is ready at once and takes transforms like any other (verified
|
|
59
59
|
on release, 2026-09-24). Run `view create` only when `view list DATASET_ID`
|
|
60
60
|
is empty, so that a retry does not add a second view.
|
|
61
|
+
|
|
62
|
+
## A pasted link to a file with "Unstructured rows"
|
|
63
|
+
|
|
64
|
+
`mammoth project needs-attention --project PROJECT_ID` lists it as a
|
|
65
|
+
`needs_input` row with `action: "unstructured_rows"` and the `dataset_id`.
|
|
66
|
+
The Monitor panel lists this as **Unstructured rows** ("header and data rows
|
|
67
|
+
need mapping"): some lines of an uploaded file did not fit the dataset's
|
|
68
|
+
columns and were set aside, so the dataset waits for a person. Turn the pasted
|
|
69
|
+
address into ids first; it makes no request:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
mammoth link 'https://app.mammoth.io/workspaces/1/projects/2/data/folders/3?selectedResourceId=4'
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
The folder and `selected_resource_id` in a link are resource ids, not dataset
|
|
76
|
+
ids: find the dataset with `mammoth dataset find NAME`. Then read the set-aside
|
|
77
|
+
lines and why each one does not fit (the first 100, with `row_count` the total):
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
mammoth dataset broken-rows list DATASET_ID --project PROJECT_ID
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Then fix them, with the user's confirmation. Take a line in after correcting
|
|
84
|
+
it so its column count matches, or discard it (discarded lines do not come
|
|
85
|
+
back; say so first). `batch_id` and `line_num` come from the list:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
mammoth dataset broken-rows resolve DATASET_ID --project PROJECT_ID \
|
|
89
|
+
--input '{"op": "remove", "batch_id": 7, "rows": [{"line_num": 4, "line": ""}]}'
|
|
90
|
+
mammoth job wait JOB_ID
|
|
91
|
+
mammoth dataset broken-rows list DATASET_ID --project PROJECT_ID # row_count 0 = done
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
`op: "add"` takes the corrected `line` of each row in instead. The same step is
|
|
95
|
+
**Review & Fix** in the app. Do not tell the user to open the Monitor item's
|
|
96
|
+
link.
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"""Bespoke `auth` command family: login, status, logout.
|
|
2
2
|
|
|
3
|
-
Authentication needs an API token (``mm_...``, sent as ``Authorization:
|
|
4
|
-
Bearer``)
|
|
5
|
-
|
|
3
|
+
Authentication needs only an API token (``mm_...``, sent as ``Authorization:
|
|
4
|
+
Bearer``), plus an optional server prefix (default ``app``). The token names its
|
|
5
|
+
own workspace, which login learns from the server. There is no environment
|
|
6
|
+
credential path. These commands never accept a secret as an
|
|
6
7
|
ordinary command-line value: it comes from a hidden TTY prompt or a
|
|
7
8
|
permission-checked JSON/YAML login document read through ``--input``.
|
|
8
9
|
"""
|
|
@@ -18,18 +19,14 @@ from typing import Any, cast
|
|
|
18
19
|
import typer
|
|
19
20
|
from pydantic import ValidationError
|
|
20
21
|
|
|
21
|
-
from mammoth_cli.context import credentials, profiles
|
|
22
|
+
from mammoth_cli.context import credentials, profiles, resolver
|
|
22
23
|
from mammoth_cli.context.endpoint import resolve_base_url
|
|
23
|
-
from mammoth_cli.context.resolver import
|
|
24
|
-
ResolvedAuth,
|
|
25
|
-
resolve_auth,
|
|
26
|
-
)
|
|
24
|
+
from mammoth_cli.context.resolver import ResolvedAuth, resolve_auth
|
|
27
25
|
from mammoth_cli.contracts.auth import LoginRequest
|
|
28
26
|
from mammoth_cli.errors.envelope import (
|
|
29
27
|
CODE_AUTHENTICATION_FAILED,
|
|
30
28
|
CODE_CONFIRMATION_DECLINED,
|
|
31
29
|
CODE_CONFIRMATION_REQUIRED,
|
|
32
|
-
CODE_INVALID_WORKSPACE_ID,
|
|
33
30
|
EXIT_USAGE,
|
|
34
31
|
CliError,
|
|
35
32
|
)
|
|
@@ -128,7 +125,7 @@ def _validate_login_document(document: dict[str, Any]) -> LoginRequest:
|
|
|
128
125
|
message="The login request document failed validation.",
|
|
129
126
|
exit_status=EXIT_USAGE,
|
|
130
127
|
hint=(
|
|
131
|
-
'Expected {"api_token": "mm_..."
|
|
128
|
+
'Expected {"api_token": "mm_..."} with an optional '
|
|
132
129
|
'"server_prefix". API key + secret pairs are no longer accepted; create '
|
|
133
130
|
"a token in Workspace settings -> API Tokens."
|
|
134
131
|
),
|
|
@@ -217,6 +214,59 @@ def _prompt_blockers(invocation: Invocation) -> list[str]:
|
|
|
217
214
|
return reasons
|
|
218
215
|
|
|
219
216
|
|
|
217
|
+
def _verify_login(invocation: Invocation, *, base_url: str, api_token: str) -> int:
|
|
218
|
+
"""Learn the token's workspace from the server and run the connection check.
|
|
219
|
+
|
|
220
|
+
Nothing is saved here; a failure leaves existing profile state unchanged.
|
|
221
|
+
|
|
222
|
+
Returns:
|
|
223
|
+
The workspace id the server reports for the token.
|
|
224
|
+
|
|
225
|
+
Raises:
|
|
226
|
+
CliError: ``authentication_failed`` (with the endpoint and a masked
|
|
227
|
+
receipt of the token) when the server rejects it; any other mapped
|
|
228
|
+
transport error as is.
|
|
229
|
+
"""
|
|
230
|
+
try:
|
|
231
|
+
workspace_id = resolver.resolve_token_workspace(base_url, api_token, invocation.timeout)
|
|
232
|
+
service = service_factory.build_service(
|
|
233
|
+
ResolvedAuth(
|
|
234
|
+
api_key=None,
|
|
235
|
+
api_secret=None,
|
|
236
|
+
workspace_id=workspace_id,
|
|
237
|
+
base_url=base_url,
|
|
238
|
+
api_token=api_token,
|
|
239
|
+
),
|
|
240
|
+
timeout=invocation.timeout,
|
|
241
|
+
)
|
|
242
|
+
try:
|
|
243
|
+
service.check_connection()
|
|
244
|
+
finally:
|
|
245
|
+
service.close()
|
|
246
|
+
except CliError as exc:
|
|
247
|
+
if exc.code == CODE_AUTHENTICATION_FAILED:
|
|
248
|
+
# Say exactly what was tried, without the secret: the endpoint and
|
|
249
|
+
# a masked receipt of the token. Credentials are per environment,
|
|
250
|
+
# and a release token typed at a production login is the common
|
|
251
|
+
# cause of an otherwise opaque 401.
|
|
252
|
+
exc.details = {
|
|
253
|
+
**exc.details,
|
|
254
|
+
"endpoint_base_url": base_url,
|
|
255
|
+
# A receipt only (length and last four characters). The output
|
|
256
|
+
# layer redacts any key that looks like a credential, so this
|
|
257
|
+
# is named for what it is: a description, not the value.
|
|
258
|
+
"credential_receipt": {"type": "api token", "shape": _masked_receipt(api_token)},
|
|
259
|
+
}
|
|
260
|
+
exc.hint = (
|
|
261
|
+
f"{base_url} rejected this token. Credentials are per environment: "
|
|
262
|
+
"a token issued on one Mammoth server does not authenticate on "
|
|
263
|
+
"another. Check the token and that --server-prefix matches where "
|
|
264
|
+
"it was issued."
|
|
265
|
+
)
|
|
266
|
+
raise
|
|
267
|
+
return workspace_id
|
|
268
|
+
|
|
269
|
+
|
|
220
270
|
def _run_login(
|
|
221
271
|
invocation: Invocation,
|
|
222
272
|
*,
|
|
@@ -234,7 +284,6 @@ def _run_login(
|
|
|
234
284
|
|
|
235
285
|
blockers = _prompt_blockers(invocation)
|
|
236
286
|
|
|
237
|
-
effective_workspace: int | None
|
|
238
287
|
if invocation.input_file is not None:
|
|
239
288
|
# The permission check is deliberately separate from parsing so a
|
|
240
289
|
# secret-bearing file is rejected before any bytes are read. The
|
|
@@ -246,15 +295,12 @@ def _run_login(
|
|
|
246
295
|
request = _validate_login_document(document)
|
|
247
296
|
api_token = request.api_token.strip()
|
|
248
297
|
_check_token_shape(api_token)
|
|
249
|
-
effective_workspace = request.workspace_id
|
|
250
298
|
effective_prefix = server_prefix if server_prefix is not None else request.server_prefix
|
|
251
299
|
elif not blockers:
|
|
252
|
-
# Two flows, nothing else: a terminal prompts for
|
|
253
|
-
#
|
|
254
|
-
# is asked last, after the credential.
|
|
300
|
+
# Two flows, nothing else: a terminal prompts for the token, and
|
|
301
|
+
# non-interactive uses --input.
|
|
255
302
|
api_token = _prompt_secret("API token")
|
|
256
303
|
_check_token_shape(api_token)
|
|
257
|
-
effective_workspace = typer.prompt("Workspace id", type=int)
|
|
258
304
|
effective_prefix = server_prefix
|
|
259
305
|
else:
|
|
260
306
|
raise CliError(
|
|
@@ -269,49 +315,8 @@ def _run_login(
|
|
|
269
315
|
),
|
|
270
316
|
)
|
|
271
317
|
|
|
272
|
-
if effective_workspace is None or effective_workspace <= 0:
|
|
273
|
-
raise CliError(
|
|
274
|
-
code=CODE_INVALID_WORKSPACE_ID,
|
|
275
|
-
message="A positive --workspace id is required.",
|
|
276
|
-
exit_status=EXIT_USAGE,
|
|
277
|
-
)
|
|
278
318
|
resolved_base_url = resolve_base_url(effective_prefix)
|
|
279
|
-
|
|
280
|
-
resolved_auth = ResolvedAuth(
|
|
281
|
-
api_key=None,
|
|
282
|
-
api_secret=None,
|
|
283
|
-
workspace_id=effective_workspace,
|
|
284
|
-
base_url=resolved_base_url,
|
|
285
|
-
api_token=api_token,
|
|
286
|
-
)
|
|
287
|
-
service = service_factory.build_service(resolved_auth, timeout=invocation.timeout)
|
|
288
|
-
try:
|
|
289
|
-
service.check_connection()
|
|
290
|
-
except CliError as exc:
|
|
291
|
-
if exc.code == CODE_AUTHENTICATION_FAILED:
|
|
292
|
-
# Say exactly what was tried, without the secret: the endpoint,
|
|
293
|
-
# the workspace, and a masked receipt of the key. Credentials are
|
|
294
|
-
# per environment, and a release key typed at a production login
|
|
295
|
-
# is the common cause of an otherwise opaque 401.
|
|
296
|
-
exc.details = {
|
|
297
|
-
**exc.details,
|
|
298
|
-
"endpoint_base_url": resolved_base_url,
|
|
299
|
-
"workspace_id": effective_workspace,
|
|
300
|
-
# A receipt only (length and last four characters). The output
|
|
301
|
-
# layer redacts any key that looks like a credential, so this
|
|
302
|
-
# is named for what it is: a description, not the value.
|
|
303
|
-
"credential_receipt": {"type": "api token", "shape": _masked_receipt(api_token)},
|
|
304
|
-
}
|
|
305
|
-
exc.hint = (
|
|
306
|
-
f"{resolved_base_url} rejected this token for workspace "
|
|
307
|
-
f"{effective_workspace}. Credentials are per environment and per workspace: "
|
|
308
|
-
"a token issued on one Mammoth server or workspace does not authenticate on "
|
|
309
|
-
"another. Check the token, the workspace id, and that --server-prefix "
|
|
310
|
-
"matches where it was issued."
|
|
311
|
-
)
|
|
312
|
-
raise
|
|
313
|
-
finally:
|
|
314
|
-
service.close()
|
|
319
|
+
effective_workspace = _verify_login(invocation, base_url=resolved_base_url, api_token=api_token)
|
|
315
320
|
|
|
316
321
|
profile_name = invocation.profile or profiles.DEFAULT_PROFILE_NAME
|
|
317
322
|
profiles.validate_profile_name(profile_name)
|
|
@@ -366,8 +371,8 @@ def auth_login(
|
|
|
366
371
|
"""Log in and store one profile's credentials.
|
|
367
372
|
|
|
368
373
|
Prompts for the API token (mm_..., from Workspace settings -> API Tokens)
|
|
369
|
-
|
|
370
|
-
``--input FILE`` with {"api_token":
|
|
374
|
+
in a terminal; the token names its workspace. For non-interactive use
|
|
375
|
+
(agents, CI), pass ``--input FILE`` with {"api_token": ...} instead.
|
|
371
376
|
Performs a lightweight connection check before saving anything; a failed
|
|
372
377
|
check leaves existing profile state unchanged.
|
|
373
378
|
"""
|
|
@@ -149,3 +149,49 @@ def browse_workspace(invocation: Invocation) -> HandlerResult:
|
|
|
149
149
|
with open_service(invocation) as (service, auth):
|
|
150
150
|
data = service.call(_symbol(invocation), **kwargs)
|
|
151
151
|
return data, _meta(invocation, auth.workspace_id, resolved_project(invocation))
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def browse_resources(invocation: Invocation) -> HandlerResult:
|
|
155
|
+
"""List one project's resources a cursor page at a time (resources v2)."""
|
|
156
|
+
project_id = require_project(invocation)
|
|
157
|
+
document = invocation.load_input() or {}
|
|
158
|
+
kwargs: dict[str, Any] = {"project_id": project_id}
|
|
159
|
+
_forward_optional(
|
|
160
|
+
document,
|
|
161
|
+
kwargs,
|
|
162
|
+
(
|
|
163
|
+
"parent_type",
|
|
164
|
+
"parent_id",
|
|
165
|
+
"resource_type",
|
|
166
|
+
"search",
|
|
167
|
+
"cursor",
|
|
168
|
+
"limit",
|
|
169
|
+
"sort",
|
|
170
|
+
"fields",
|
|
171
|
+
),
|
|
172
|
+
)
|
|
173
|
+
with open_service(invocation) as (service, auth):
|
|
174
|
+
data = service.call(_symbol(invocation), **kwargs)
|
|
175
|
+
return data, _meta(invocation, auth.workspace_id, project_id)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def browse_resource(invocation: Invocation) -> HandlerResult:
|
|
179
|
+
"""Get one resource of the active project: type, then id, as positionals."""
|
|
180
|
+
project_id = require_project(invocation)
|
|
181
|
+
resource_type = invocation.positional("resource_type")
|
|
182
|
+
object_id = invocation.positional("object_id")
|
|
183
|
+
if not resource_type or object_id is None:
|
|
184
|
+
raise CliError(
|
|
185
|
+
code=CODE_MISSING_ARGUMENT,
|
|
186
|
+
message="This command requires a resource type and a resource id.",
|
|
187
|
+
exit_status=EXIT_USAGE,
|
|
188
|
+
hint="Pass the type, then the id: mammoth browse resource dataset 123.",
|
|
189
|
+
)
|
|
190
|
+
with open_service(invocation) as (service, auth):
|
|
191
|
+
data = service.call(
|
|
192
|
+
_symbol(invocation),
|
|
193
|
+
resource_type=str(resource_type),
|
|
194
|
+
object_id=int(object_id),
|
|
195
|
+
project_id=project_id,
|
|
196
|
+
)
|
|
197
|
+
return data, _meta(invocation, auth.workspace_id, project_id)
|
|
@@ -37,6 +37,7 @@ from mammoth_cli.services.listing import (
|
|
|
37
37
|
fit_budget,
|
|
38
38
|
name_hit,
|
|
39
39
|
search_page,
|
|
40
|
+
source_of,
|
|
40
41
|
)
|
|
41
42
|
|
|
42
43
|
HandlerResult = tuple[Any, dict[str, Any]]
|
|
@@ -142,16 +143,9 @@ def _require_string_positional(invocation: Invocation, name: str) -> str:
|
|
|
142
143
|
return str(invocation.extra_args[0])
|
|
143
144
|
|
|
144
145
|
|
|
145
|
-
# The projects endpoint accepts at most limit=100 and exposes no offset, so a
|
|
146
|
-
# cross-project search can see at most 100 projects; the result says when the
|
|
147
|
-
# list was cut there.
|
|
148
|
-
_MAX_PROJECTS_SEARCHED = 100
|
|
149
|
-
|
|
150
|
-
|
|
151
146
|
def _visible_projects(service: Any) -> list[dict[str, Any]]:
|
|
152
|
-
"""
|
|
153
|
-
|
|
154
|
-
return list(listing.get("projects", [])) if isinstance(listing, dict) else []
|
|
147
|
+
"""Every project the credential is a member of, across all pages."""
|
|
148
|
+
return list(service.list_all_projects())
|
|
155
149
|
|
|
156
150
|
|
|
157
151
|
def _find_in_projects(
|
|
@@ -163,7 +157,11 @@ def _find_in_projects(
|
|
|
163
157
|
project_id = project.get("id")
|
|
164
158
|
if project_id is None:
|
|
165
159
|
continue
|
|
166
|
-
response = service.call(
|
|
160
|
+
response = service.call(
|
|
161
|
+
"mammoth.api.datasets.DatasetsAPI.list_all",
|
|
162
|
+
project_id=project_id,
|
|
163
|
+
fields=DATASET_ROW_FIELDS,
|
|
164
|
+
)
|
|
167
165
|
datasets = response.get("datasets", []) if isinstance(response, dict) else []
|
|
168
166
|
for dataset in datasets:
|
|
169
167
|
name = dataset.get("name") if isinstance(dataset, dict) else None
|
|
@@ -173,6 +171,7 @@ def _find_in_projects(
|
|
|
173
171
|
"project_id": project_id,
|
|
174
172
|
"project_name": project.get("name"),
|
|
175
173
|
**name_hit(dataset),
|
|
174
|
+
"source": source_of(dataset),
|
|
176
175
|
}
|
|
177
176
|
)
|
|
178
177
|
return matches
|
|
@@ -231,7 +230,6 @@ def dataset_find(invocation: Invocation) -> HandlerResult:
|
|
|
231
230
|
result: dict[str, Any] = {
|
|
232
231
|
"matches": matches,
|
|
233
232
|
"projects_searched": len(projects),
|
|
234
|
-
"projects_truncated": len(projects) >= _MAX_PROJECTS_SEARCHED,
|
|
235
233
|
}
|
|
236
234
|
if note := ambiguity_note(len(matches), name_substring):
|
|
237
235
|
result["note"] = note
|
|
@@ -454,6 +452,33 @@ def dataset_broken_rows(invocation: Invocation) -> HandlerResult:
|
|
|
454
452
|
return _read_dataset(invocation)
|
|
455
453
|
|
|
456
454
|
|
|
455
|
+
def dataset_broken_rows_resolve(invocation: Invocation) -> HandlerResult:
|
|
456
|
+
"""Add corrected set-aside lines to a dataset, or discard them. Prompt or ``--yes``.
|
|
457
|
+
|
|
458
|
+
``--input`` carries ``op`` (``add`` or ``remove``), ``batch_id`` and ``rows``
|
|
459
|
+
(``{"line_num", "line"}`` each, from ``dataset broken-rows list``). Returns a
|
|
460
|
+
job to wait on.
|
|
461
|
+
"""
|
|
462
|
+
project_id = require_project(invocation)
|
|
463
|
+
dataset_id = _require_int_positional(invocation, "dataset id")
|
|
464
|
+
document = invocation.load_input()
|
|
465
|
+
kwargs: dict[str, Any] = {
|
|
466
|
+
"dataset_id": dataset_id,
|
|
467
|
+
"op": _require_field(document, "op"),
|
|
468
|
+
"batch_id": _require_field(document, "batch_id"),
|
|
469
|
+
"rows": _require_field(document, "rows"),
|
|
470
|
+
"project_id": project_id,
|
|
471
|
+
}
|
|
472
|
+
enforce_confirmation(
|
|
473
|
+
invocation,
|
|
474
|
+
policy=POLICY_PROMPT_OR_YES,
|
|
475
|
+
action=f"{kwargs['op']} set-aside lines of dataset {dataset_id}",
|
|
476
|
+
)
|
|
477
|
+
with open_service(invocation) as (service, auth):
|
|
478
|
+
data = service.call(_symbol(invocation), **kwargs)
|
|
479
|
+
return data, _meta(invocation, auth.workspace_id, project_id)
|
|
480
|
+
|
|
481
|
+
|
|
457
482
|
def _read_dataset(invocation: Invocation) -> HandlerResult:
|
|
458
483
|
"""Call this command's SDK read with the DATASET_ID positional."""
|
|
459
484
|
project_id = require_project(invocation)
|