mammoth-cli 2.0.5__tar.gz → 2.0.7__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.5 → mammoth_cli-2.0.7}/PKG-INFO +12 -10
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/README.md +11 -9
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/__init__.py +1 -1
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +16 -11
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +42 -19
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +4 -9
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +5 -4
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +15 -20
- mammoth_cli-2.0.7/mammoth_cli/commands/doctor.py +210 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/schema.py +8 -1
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/pyproject.toml +1 -1
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/sdk-methods.yaml +2 -2
- mammoth_cli-2.0.5/mammoth_cli/commands/doctor.py +0 -115
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/.gitignore +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/LICENSE +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/__main__.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/app.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/__init__.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/activity.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/addon.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/agent.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/ai.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/annotation.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/auth.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/automation.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/batch.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/billing.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/browse.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/capability.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/client_app.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/completion.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/config.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/connector.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/context.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/dashboard.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/data_app.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/dataset.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/external_key.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/file.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/folder.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/job.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/notification.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/parameter.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/project.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/registry.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/report.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/schedule.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/skill.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/snippet.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/support.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/template.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/trash.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/upgrade.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/user.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/view.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/view_ops.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/webhook.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/workflow.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/workspace.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/context/__init__.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/context/credentials.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/context/endpoint.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/context/profiles.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/context/resolver.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/contracts/__init__.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/contracts/auth.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/errors/__init__.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/errors/envelope.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/manifest/__init__.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/manifest/loader.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/messages/__init__.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/output/__init__.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/output/envelope.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/output/normalize.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/output/policy.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/output/progress.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/output/render.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/py.typed +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/runtime/__init__.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/runtime/confirm.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/runtime/executor.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/runtime/input_loader.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/runtime/invocation.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/runtime/options.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/runtime/session.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/runtime/strict.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/runtime/validate.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/__init__.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/argspec.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/coerce.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/command_contract.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/conditions.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/dispatch.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/factory.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/input_fields.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/mapping.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/openapi_types.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/positionals.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/protocol.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/sdk_service.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/testing.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/type_system.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/skills/__init__.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/skills/installer.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/testing.py +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/activity.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/addon.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/agent.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/ai.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/annotation.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/auth.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/automation.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/batch.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/billing.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/browse.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/capability.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/client-app.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/completion.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/config.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/connector.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/context.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/dashboard.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/data-app.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/dataset.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/doctor.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/external-key.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/file.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/folder.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/job.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/notification.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/parameter.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/project.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/report.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/schedule.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/schema.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/skill.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/snippet.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/support.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/template.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/trash.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/upgrade.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/user.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/version.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/view.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/webhook.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/workflow.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/workspace.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/openapi-operations.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/schema-v1.json +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/sdk-catalog.source.yaml +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/openapi/metadata.json +0 -0
- {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/openapi/openapi.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mammoth-cli
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.7
|
|
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
|
|
@@ -74,18 +74,19 @@ installation path.
|
|
|
74
74
|
|
|
75
75
|
## First run: authenticate, check, then discover
|
|
76
76
|
|
|
77
|
-
Authentication is the first operational step.
|
|
78
|
-
with a controller-provided credential broker/sidecar, use that broker's
|
|
79
|
-
readiness check; do not inspect saved profiles, run login, or run doctor, and
|
|
80
|
-
stop if the broker is absent. In an ordinary shell, check the selected profile;
|
|
77
|
+
Authentication is the first operational step. Check the selected profile;
|
|
81
78
|
this is a local presence check, not a live access test. If the profile or
|
|
82
|
-
stored credentials are absent, log in before running `doctor` or any data
|
|
79
|
+
stored credentials are absent, log in before running `doctor` or any data
|
|
80
|
+
command. An agent does this by asking the operator to run the login below in
|
|
81
|
+
their own terminal; the CLI never reads credentials from environment variables:
|
|
83
82
|
|
|
84
83
|
```bash
|
|
85
84
|
mammoth skill list --output json --no-input
|
|
86
85
|
mammoth skill path --output json --no-input
|
|
87
86
|
# Read the installed SKILL.md before operating.
|
|
88
87
|
mammoth auth status --output json --no-input
|
|
88
|
+
# Compare the reported endpoint with the intended target before doctor.
|
|
89
|
+
# Use app for production; use release only when explicitly intended.
|
|
89
90
|
# Human terminal only, if profile or stored credentials are absent:
|
|
90
91
|
mammoth auth login
|
|
91
92
|
# Then verify configuration, credentials, endpoint, and connectivity:
|
|
@@ -106,12 +107,13 @@ mammoth auth login --input /private/path/credentials.json --storage file \
|
|
|
106
107
|
--output json --no-input
|
|
107
108
|
```
|
|
108
109
|
|
|
109
|
-
On Windows, use the approved OS keyring
|
|
110
|
-
|
|
111
|
-
is available.
|
|
110
|
+
On Windows, use the approved OS keyring instead; do not use a file fallback
|
|
111
|
+
unless its ACL hardening is approved, and stop if it is not available.
|
|
112
112
|
|
|
113
113
|
The default server prefix is `app`; pass `--server-prefix release` only when
|
|
114
|
-
the release endpoint is explicitly intended.
|
|
114
|
+
the release endpoint is explicitly intended. Compare the endpoint reported by
|
|
115
|
+
`auth status` with the intended target before running `doctor`; if it does not
|
|
116
|
+
match, stop and switch to a separate correctly configured profile. See
|
|
115
117
|
[Authentication](https://github.com/EdgeMetric/mammothsdk/blob/main/mammoth-cli/docs/authentication.md)
|
|
116
118
|
for the required JSON fields and profile behavior. After `doctor` succeeds,
|
|
117
119
|
resolve the exact workspace, project, dataset, and view from read results
|
|
@@ -46,18 +46,19 @@ installation path.
|
|
|
46
46
|
|
|
47
47
|
## First run: authenticate, check, then discover
|
|
48
48
|
|
|
49
|
-
Authentication is the first operational step.
|
|
50
|
-
with a controller-provided credential broker/sidecar, use that broker's
|
|
51
|
-
readiness check; do not inspect saved profiles, run login, or run doctor, and
|
|
52
|
-
stop if the broker is absent. In an ordinary shell, check the selected profile;
|
|
49
|
+
Authentication is the first operational step. Check the selected profile;
|
|
53
50
|
this is a local presence check, not a live access test. If the profile or
|
|
54
|
-
stored credentials are absent, log in before running `doctor` or any data
|
|
51
|
+
stored credentials are absent, log in before running `doctor` or any data
|
|
52
|
+
command. An agent does this by asking the operator to run the login below in
|
|
53
|
+
their own terminal; the CLI never reads credentials from environment variables:
|
|
55
54
|
|
|
56
55
|
```bash
|
|
57
56
|
mammoth skill list --output json --no-input
|
|
58
57
|
mammoth skill path --output json --no-input
|
|
59
58
|
# Read the installed SKILL.md before operating.
|
|
60
59
|
mammoth auth status --output json --no-input
|
|
60
|
+
# Compare the reported endpoint with the intended target before doctor.
|
|
61
|
+
# Use app for production; use release only when explicitly intended.
|
|
61
62
|
# Human terminal only, if profile or stored credentials are absent:
|
|
62
63
|
mammoth auth login
|
|
63
64
|
# Then verify configuration, credentials, endpoint, and connectivity:
|
|
@@ -78,12 +79,13 @@ mammoth auth login --input /private/path/credentials.json --storage file \
|
|
|
78
79
|
--output json --no-input
|
|
79
80
|
```
|
|
80
81
|
|
|
81
|
-
On Windows, use the approved OS keyring
|
|
82
|
-
|
|
83
|
-
is available.
|
|
82
|
+
On Windows, use the approved OS keyring instead; do not use a file fallback
|
|
83
|
+
unless its ACL hardening is approved, and stop if it is not available.
|
|
84
84
|
|
|
85
85
|
The default server prefix is `app`; pass `--server-prefix release` only when
|
|
86
|
-
the release endpoint is explicitly intended.
|
|
86
|
+
the release endpoint is explicitly intended. Compare the endpoint reported by
|
|
87
|
+
`auth status` with the intended target before running `doctor`; if it does not
|
|
88
|
+
match, stop and switch to a separate correctly configured profile. See
|
|
87
89
|
[Authentication](https://github.com/EdgeMetric/mammothsdk/blob/main/mammoth-cli/docs/authentication.md)
|
|
88
90
|
for the required JSON fields and profile behavior. After `doctor` succeeds,
|
|
89
91
|
resolve the exact workspace, project, dataset, and view from read results
|
|
@@ -9,17 +9,22 @@ Use this skill for Mammoth shell work, not for Python SDK integration. Complete
|
|
|
9
9
|
the authentication preflight below before using the installed command contract;
|
|
10
10
|
never guess routes or payloads:
|
|
11
11
|
|
|
12
|
-
Before any remote read or write, establish authentication.
|
|
13
|
-
runs
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
profile
|
|
21
|
-
|
|
22
|
-
|
|
12
|
+
Before any remote read or write, establish authentication. For ordinary
|
|
13
|
+
operator runs, determine the intended environment from the task: production
|
|
14
|
+
defaults to the `app` endpoint; use `release` only when explicitly named.
|
|
15
|
+
Check the selected profile with `mammoth auth status --output json --no-input`
|
|
16
|
+
and compare its reported `endpoint` to that target before running doctor. If
|
|
17
|
+
the profile is missing, credentials are absent, or the endpoint does not match,
|
|
18
|
+
stop and follow [authentication](references/auth.md); never silently reuse or
|
|
19
|
+
rewrite a profile from another environment. Then run `mammoth doctor
|
|
20
|
+
--profile PROFILE --output json --no-input` and require success before
|
|
21
|
+
discovering resources or operating on them. A failed status, login, or doctor
|
|
22
|
+
check is a precondition failure—not a reason to try the business command
|
|
23
|
+
anyway. If no matching profile has credentials, the operator must run
|
|
24
|
+
`mammoth auth login` themselves in their own terminal: tell them the exact
|
|
25
|
+
command, wait, then re-check `auth status`. Never ask for the key or secret
|
|
26
|
+
in chat, never read them from environment variables or files you were not
|
|
27
|
+
given, and never run `auth login` on the operator's behalf.
|
|
23
28
|
|
|
24
29
|
```bash
|
|
25
30
|
mammoth schema find "TASK OR RESOURCE" --output json --no-input
|
{mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md
RENAMED
|
@@ -7,15 +7,43 @@ prefix (default `app`, resolving to `https://app.mammoth.io/api/v2`).
|
|
|
7
7
|
1. Explicit login handed to the current command (secure prompt or `--input`).
|
|
8
8
|
2. The selected or `--profile` profile's saved credentials.
|
|
9
9
|
|
|
10
|
+
There is no third source. The CLI and SDK do not read credentials from
|
|
11
|
+
environment variables, and an agent must not search the environment, shell
|
|
12
|
+
history, or unrelated files for them.
|
|
13
|
+
|
|
14
|
+
## How an agent obtains credentials
|
|
15
|
+
|
|
16
|
+
An agent never receives the key or secret. When `auth status` reports a
|
|
17
|
+
missing profile or `has_credentials=false`, stop and hand the login to the
|
|
18
|
+
human operator:
|
|
19
|
+
|
|
20
|
+
1. Tell the operator the exact command to run in **their own** terminal, with
|
|
21
|
+
the profile name and the intended server prefix:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
mammoth auth login --profile PROFILE --server-prefix app
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
The command prompts for the key and secret with hidden input, then the
|
|
28
|
+
workspace id, so no secret enters chat, argv, or history.
|
|
29
|
+
2. Wait for the operator to confirm, then re-run
|
|
30
|
+
`mammoth auth status --profile PROFILE --output json --no-input` and
|
|
31
|
+
`mammoth doctor --profile PROFILE --output json --no-input`.
|
|
32
|
+
3. Do not ask the operator to paste the key or secret into chat. Do not run
|
|
33
|
+
`auth login` yourself, with or without `--input`, unless the operator has
|
|
34
|
+
explicitly given you a protected `0600` credential file path to use.
|
|
35
|
+
|
|
10
36
|
The only supported configuration is the API key, API secret, workspace id, and
|
|
11
37
|
an optional one-label server prefix (default `app`). There is no base-url
|
|
12
38
|
override.
|
|
13
39
|
|
|
14
40
|
## Cold-start sequence
|
|
15
41
|
|
|
16
|
-
For an ordinary operator,
|
|
17
|
-
|
|
18
|
-
|
|
42
|
+
For an ordinary operator, identify the intended environment before any remote
|
|
43
|
+
command. Production means the `app` endpoint by default; use `release` only
|
|
44
|
+
when the task explicitly requests the release environment. Inspect
|
|
45
|
+
authentication and then verify the connection. These checks are mandatory even
|
|
46
|
+
when a profile may already exist:
|
|
19
47
|
|
|
20
48
|
```bash
|
|
21
49
|
mammoth auth status --profile PROFILE --output json --no-input
|
|
@@ -30,21 +58,21 @@ mammoth auth status --profile PROFILE --output json --no-input
|
|
|
30
58
|
```
|
|
31
59
|
|
|
32
60
|
`auth status` is a local profile/credential-presence check; it does not prove
|
|
33
|
-
that credentials are valid remotely.
|
|
34
|
-
|
|
61
|
+
that credentials are valid remotely. Compare its reported `endpoint` with the
|
|
62
|
+
intended environment before proceeding. A profile for another endpoint is a
|
|
63
|
+
scope mismatch: stop and select or authenticate the explicitly intended
|
|
64
|
+
profile; do not silently reuse, rewrite, or promote it. After the profile is
|
|
65
|
+
present and its endpoint matches, verify the live connection:
|
|
35
66
|
|
|
36
67
|
```bash
|
|
37
68
|
mammoth doctor --profile PROFILE --output json --no-input
|
|
38
69
|
```
|
|
39
70
|
|
|
40
71
|
Do not continue to schema discovery or business operations after an
|
|
41
|
-
authentication or doctor failure. The `app` server prefix is the
|
|
42
|
-
release or other environment credentials do not imply authorization
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
controller-provided credential broker/sidecar check instead. Never mount or
|
|
46
|
-
read a saved profile. If no broker is provided, stop before authenticated
|
|
47
|
-
actions.
|
|
72
|
+
authentication or doctor failure. The `app` server prefix is the production
|
|
73
|
+
default; release or other environment credentials do not imply authorization
|
|
74
|
+
for `app`, and a release profile is not appropriate unless the task explicitly
|
|
75
|
+
targets release.
|
|
48
76
|
|
|
49
77
|
## Commands
|
|
50
78
|
```bash
|
|
@@ -66,8 +94,8 @@ logs. For headless POSIX work, create the JSON file outside the repository, set
|
|
|
66
94
|
its permissions to `0600`, and pass only its path. With a protected POSIX file,
|
|
67
95
|
specify `--storage file` explicitly; `--storage auto` can require an available
|
|
68
96
|
OS keyring and is not a reliable headless fallback. On Windows, do not use the
|
|
69
|
-
file backend as a secret store; use the OS keyring
|
|
70
|
-
|
|
97
|
+
file backend as a secret store; use the OS keyring or stop and obtain a
|
|
98
|
+
supported secure store. Remove any input file after the
|
|
71
99
|
profile is stored.
|
|
72
100
|
|
|
73
101
|
`creds.json` is a `0600` JSON file: `{"api_key": "...", "api_secret": "...",
|
|
@@ -77,8 +105,3 @@ also pipe it with `--input - --input-format json`.
|
|
|
77
105
|
Secrets live in the OS keyring (or an explicitly selected `0600` file
|
|
78
106
|
fallback). They are never printed, logged, or included in any envelope. Never
|
|
79
107
|
pass a secret as a plain argument; use the hidden prompt or `--input`.
|
|
80
|
-
|
|
81
|
-
For evaluated or isolated agents, authentication remains controller-owned: use
|
|
82
|
-
the provided credential broker/sidecar instead of `auth login` and never mount
|
|
83
|
-
or read a saved profile. If no broker is provided, stop before authenticated
|
|
84
|
-
actions and report the precondition failure.
|
{mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md
RENAMED
|
@@ -4,11 +4,10 @@ Use a nonsecret JSON checkpoint when another agent or session must continue.
|
|
|
4
4
|
This is a record, not a resume subcommand. The receiving agent chooses
|
|
5
5
|
its own plan only after fresh reads.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
or contents into the checkpoint.
|
|
7
|
+
A handoff may reference the authorized profile name, but must not copy its
|
|
8
|
+
path or contents into the checkpoint. The receiving agent re-checks
|
|
9
|
+
`auth status` and `doctor`; if credentials are missing on its host, the
|
|
10
|
+
operator logs in from their own terminal as described in [auth](auth.md).
|
|
12
11
|
|
|
13
12
|
## Required record
|
|
14
13
|
|
|
@@ -49,9 +48,5 @@ mammoth view get VIEW_ID --project PROJECT_ID --output json --no-input
|
|
|
49
48
|
mammoth job get JOB_ID --output json --no-input
|
|
50
49
|
```
|
|
51
50
|
|
|
52
|
-
The commands above are ordinary operator examples; an evaluated/isolated agent
|
|
53
|
-
must use the controller broker/sidecar instead of `--profile` and must stop if
|
|
54
|
-
that broker is absent.
|
|
55
|
-
|
|
56
51
|
The required fields and receiving procedure above are self-contained for a
|
|
57
52
|
cold-start agent; no repository checkout or unshipped document is required.
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
Use `mammoth auth status`, `mammoth doctor`, `mammoth project list`, and
|
|
4
4
|
`mammoth schema get project.list` with `--output json --no-input`. Require
|
|
5
5
|
successful `data` and observed workspace/project metadata. Never put secrets in
|
|
6
|
-
argv
|
|
6
|
+
argv. If credentials are missing, the operator logs in from their own terminal;
|
|
7
|
+
see [auth](../auth.md).
|
|
7
8
|
|
|
8
9
|
```bash
|
|
9
10
|
mammoth context project use PROJECT_ID --profile PROFILE --output json --no-input
|
|
@@ -13,8 +14,8 @@ The successful envelope should identify the selected profile/workspace/project
|
|
|
13
14
|
in `data` or `meta`; retain only nonsecret IDs. A deliberately invalid or
|
|
14
15
|
expired profile should return the structured auth error (exit 4), which is a
|
|
15
16
|
stop-and-recover condition, not permission to retry mutations. Never inline
|
|
16
|
-
tokens or secrets in argv, logs, or evidence.
|
|
17
|
-
protected credential JSON through stdin or a 0600 input file
|
|
18
|
-
|
|
17
|
+
tokens or secrets in argv, logs, or evidence. Headless login may receive
|
|
18
|
+
protected credential JSON through stdin or a 0600 input file only when the
|
|
19
|
+
operator explicitly supplies that file.
|
|
19
20
|
|
|
20
21
|
Exit 4 is auth/authorization; preserve the structured error and stop safely.
|
|
@@ -5,12 +5,6 @@ task and has no repository or prior chat context. The user supplies the intent,
|
|
|
5
5
|
authorized scope, and (when needed) a protected profile. Never put credentials
|
|
6
6
|
or secrets in an argument, prompt, transcript, or checkpoint.
|
|
7
7
|
|
|
8
|
-
For an evaluated or isolated agent, follow the controller-provided credential
|
|
9
|
-
broker/sidecar instead of using a saved profile. Never mount or read the saved
|
|
10
|
-
profile in that shell. If the broker/sidecar is not provided, stop before any
|
|
11
|
-
authenticated action. The profile workflow below remains for ordinary,
|
|
12
|
-
non-evaluated operator use.
|
|
13
|
-
|
|
14
8
|
1. Check whether `mammoth` is available. If it is absent, install the CLI and
|
|
15
9
|
bundled skill with the supported host installer:
|
|
16
10
|
|
|
@@ -27,31 +21,32 @@ non-evaluated operator use.
|
|
|
27
21
|
install is required for the agent host, run `mammoth skill install
|
|
28
22
|
--output json --no-input` and verify ownership with `mammoth skill list
|
|
29
23
|
--output json --no-input`.
|
|
30
|
-
3. Establish authentication before any remote read or write.
|
|
31
|
-
|
|
32
|
-
use the
|
|
33
|
-
|
|
34
|
-
this step are for ordinary operator runs only. First inspect the selected
|
|
35
|
-
profile without attempting business work:
|
|
24
|
+
3. Establish authentication before any remote read or write. Determine the
|
|
25
|
+
intended environment from the task first: production defaults to the `app` endpoint;
|
|
26
|
+
use `release` only when the task explicitly names release. Then inspect the
|
|
27
|
+
selected profile without attempting business work:
|
|
36
28
|
|
|
37
29
|
```bash
|
|
38
30
|
mammoth auth status --output json --no-input
|
|
39
31
|
```
|
|
40
32
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
run
|
|
33
|
+
Compare the status response's `endpoint` with the intended environment. If
|
|
34
|
+
the profile or credentials are missing, or the endpoint is for another
|
|
35
|
+
environment, stop and follow [authentication](auth.md): tell the operator
|
|
36
|
+
the exact `mammoth auth login --profile PROFILE --server-prefix app`
|
|
37
|
+
command to run in their own terminal, wait for them, then re-check status.
|
|
38
|
+
The CLI does not read credentials from environment variables; do not look
|
|
39
|
+
for them there. Never silently reuse or rewrite a mismatched profile,
|
|
40
|
+
invent a profile, ask for credentials in chat, or put secrets in argv.
|
|
41
|
+
After the operator has logged in (or when an existing, matching profile is
|
|
42
|
+
present), run the connectivity and configuration check and require success:
|
|
46
43
|
|
|
47
44
|
```bash
|
|
48
45
|
mammoth doctor --profile PROFILE --output json --no-input
|
|
49
46
|
```
|
|
50
47
|
|
|
51
48
|
Do not print, echo, or copy secret-bearing inputs. A failed status, login,
|
|
52
|
-
or doctor check stops the task before discovery and business commands.
|
|
53
|
-
broker check is the equivalent precondition in evaluated mode; do not add a
|
|
54
|
-
profile or `--profile` flag to broker-invoked commands.
|
|
49
|
+
or doctor check stops the task before discovery and business commands.
|
|
55
50
|
4. Discover instead of guessing. Run `mammoth schema list/find/get --output
|
|
56
51
|
json --no-input` for local CLI routes; `mammoth capability list --output
|
|
57
52
|
json --no-input` is an API-binding inventory and can omit typed/local
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"""The ``doctor`` command: a read-only environment and connectivity check.
|
|
2
|
+
|
|
3
|
+
An agent or operator runs ``mammoth doctor`` to confirm, in one deterministic
|
|
4
|
+
envelope, that the CLI can find credentials, resolve an endpoint, and reach the
|
|
5
|
+
Mammoth API. Every check reports a boolean ``ok`` plus a short detail; no secret
|
|
6
|
+
value is ever included. The command never mutates anything and never prompts.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import os
|
|
12
|
+
import platform
|
|
13
|
+
import re
|
|
14
|
+
import shlex
|
|
15
|
+
import sys
|
|
16
|
+
from typing import Any
|
|
17
|
+
from urllib.parse import urlsplit
|
|
18
|
+
|
|
19
|
+
from mammoth_cli import __version__
|
|
20
|
+
from mammoth_cli.context import credentials, profiles
|
|
21
|
+
from mammoth_cli.context.resolver import resolve_auth
|
|
22
|
+
from mammoth_cli.errors.envelope import CliError
|
|
23
|
+
from mammoth_cli.runtime.invocation import Invocation
|
|
24
|
+
from mammoth_cli.runtime.session import open_service, resolved_project
|
|
25
|
+
|
|
26
|
+
HandlerResult = tuple[Any, dict[str, Any]]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _check(name: str, ok: bool, detail: str) -> dict[str, Any]:
|
|
30
|
+
return {"name": name, "ok": ok, "detail": detail}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _safe_connection_diagnostics(error: CliError, *, debug: bool) -> dict[str, Any]:
|
|
34
|
+
"""Return the small, allowlisted diagnostic surface exposed by doctor.
|
|
35
|
+
|
|
36
|
+
``CliError.details`` may contain response bodies or backend-specific
|
|
37
|
+
values because it is also used by the general error envelope. Doctor is
|
|
38
|
+
deliberately stricter: it emits only stable transport metadata and never
|
|
39
|
+
copies exception text or a response body into its result.
|
|
40
|
+
"""
|
|
41
|
+
raw = error.details if isinstance(error.details, dict) else {}
|
|
42
|
+
status = raw.get("status_code")
|
|
43
|
+
if isinstance(status, bool) or not isinstance(status, int):
|
|
44
|
+
status = None
|
|
45
|
+
exception_type = raw.get("exception_type")
|
|
46
|
+
if not isinstance(exception_type, str) or exception_type not in {
|
|
47
|
+
"ConnectTimeout",
|
|
48
|
+
"ReadTimeout",
|
|
49
|
+
"Timeout",
|
|
50
|
+
"ConnectionError",
|
|
51
|
+
"ProxyError",
|
|
52
|
+
"SSLError",
|
|
53
|
+
}:
|
|
54
|
+
exception_type = None
|
|
55
|
+
retry_after = raw.get("retry_after")
|
|
56
|
+
if isinstance(retry_after, str):
|
|
57
|
+
if len(retry_after) > 10 or not retry_after.isascii() or not retry_after.isdigit():
|
|
58
|
+
retry_after = None
|
|
59
|
+
elif (
|
|
60
|
+
not isinstance(retry_after, int)
|
|
61
|
+
or isinstance(retry_after, bool)
|
|
62
|
+
or retry_after < 0
|
|
63
|
+
):
|
|
64
|
+
retry_after = None
|
|
65
|
+
request_id = error.request_id or raw.get("request_id")
|
|
66
|
+
if not isinstance(request_id, str) or len(request_id) > 128 or not re.fullmatch(
|
|
67
|
+
r"[A-Za-z0-9._:-]+", request_id
|
|
68
|
+
):
|
|
69
|
+
request_id = None
|
|
70
|
+
|
|
71
|
+
if status in {429, 503}:
|
|
72
|
+
reason = f"http_{status}"
|
|
73
|
+
detail = f"HTTP {status} response; retry the read"
|
|
74
|
+
elif exception_type in {"ConnectTimeout", "ReadTimeout", "Timeout"}:
|
|
75
|
+
reason = "transport_timeout"
|
|
76
|
+
detail = "transport timeout; retry the read"
|
|
77
|
+
elif exception_type in {"ConnectionError", "ProxyError", "SSLError"}:
|
|
78
|
+
reason = "transport_connection_error"
|
|
79
|
+
detail = "transport connection error; retry the read"
|
|
80
|
+
else:
|
|
81
|
+
reason = error.code
|
|
82
|
+
detail = f"connection check failed: {error.code}"
|
|
83
|
+
|
|
84
|
+
result: dict[str, Any] = {"error_code": error.code, "reason": reason, "detail": detail}
|
|
85
|
+
for name, value in (
|
|
86
|
+
("status_code", status),
|
|
87
|
+
("exception_type", exception_type),
|
|
88
|
+
("retry_after", retry_after),
|
|
89
|
+
("request_id", request_id),
|
|
90
|
+
):
|
|
91
|
+
if value is not None:
|
|
92
|
+
result[name] = value
|
|
93
|
+
|
|
94
|
+
if debug:
|
|
95
|
+
method = raw.get("method")
|
|
96
|
+
if isinstance(method, str) and method.upper() in {"GET", "HEAD", "OPTIONS"}:
|
|
97
|
+
result["method"] = method.upper()
|
|
98
|
+
endpoint = raw.get("endpoint")
|
|
99
|
+
if isinstance(endpoint, str) and len(endpoint) <= 300:
|
|
100
|
+
parsed = urlsplit(endpoint)
|
|
101
|
+
if (
|
|
102
|
+
not parsed.query
|
|
103
|
+
and not parsed.fragment
|
|
104
|
+
and not parsed.username
|
|
105
|
+
and not parsed.password
|
|
106
|
+
):
|
|
107
|
+
result["endpoint"] = parsed.path or endpoint
|
|
108
|
+
phase = raw.get("phase")
|
|
109
|
+
if isinstance(phase, str) and phase in {"request", "response", "decode", "authentication"}:
|
|
110
|
+
result["phase"] = phase
|
|
111
|
+
return result
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def doctor(invocation: Invocation) -> HandlerResult:
|
|
115
|
+
"""Run environment and connectivity diagnostics.
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
invocation: The current command's resolved global options.
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
``(data, meta_extra)`` where ``data`` holds the Python/CLI versions, the
|
|
122
|
+
active profile, and an ordered list of check results with an overall
|
|
123
|
+
``ok`` flag.
|
|
124
|
+
"""
|
|
125
|
+
profile_name = invocation.profile or profiles.get_selected()
|
|
126
|
+
checks: list[dict[str, Any]] = []
|
|
127
|
+
|
|
128
|
+
config_directory = profiles.config_dir()
|
|
129
|
+
writable_target = config_directory if config_directory.exists() else config_directory.parent
|
|
130
|
+
config_ok = os.access(writable_target, os.W_OK | os.X_OK)
|
|
131
|
+
checks.append(
|
|
132
|
+
_check(
|
|
133
|
+
"config_directory",
|
|
134
|
+
config_ok,
|
|
135
|
+
(
|
|
136
|
+
f"{config_directory} is writable"
|
|
137
|
+
if config_ok
|
|
138
|
+
else f"cannot write configuration below {writable_target}"
|
|
139
|
+
),
|
|
140
|
+
)
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
record = profiles.get_profile(profile_name)
|
|
144
|
+
checks.append(
|
|
145
|
+
_check(
|
|
146
|
+
"profile",
|
|
147
|
+
record is not None,
|
|
148
|
+
f"profile '{profile_name}' found" if record else f"no profile '{profile_name}'",
|
|
149
|
+
)
|
|
150
|
+
)
|
|
151
|
+
checks.append(
|
|
152
|
+
_check(
|
|
153
|
+
"credentials",
|
|
154
|
+
credentials.has_credentials(profile_name),
|
|
155
|
+
"credentials present" if credentials.has_credentials(profile_name) else "none stored",
|
|
156
|
+
)
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
endpoint_detail = "unresolved"
|
|
160
|
+
auth_ok = False
|
|
161
|
+
try:
|
|
162
|
+
auth = resolve_auth(invocation)
|
|
163
|
+
endpoint_detail = auth.base_url
|
|
164
|
+
auth_ok = True
|
|
165
|
+
except CliError as error:
|
|
166
|
+
endpoint_detail = error.code
|
|
167
|
+
checks.append(_check("endpoint", auth_ok, endpoint_detail))
|
|
168
|
+
|
|
169
|
+
connection_ok = False
|
|
170
|
+
connection_detail = "not attempted"
|
|
171
|
+
if auth_ok:
|
|
172
|
+
try:
|
|
173
|
+
with open_service(invocation) as (service, _auth):
|
|
174
|
+
service.check_connection()
|
|
175
|
+
connection_ok = True
|
|
176
|
+
connection_detail = "authenticated request succeeded"
|
|
177
|
+
except CliError as error:
|
|
178
|
+
diagnostics = _safe_connection_diagnostics(error, debug=invocation.debug)
|
|
179
|
+
connection_detail = diagnostics.pop("detail")
|
|
180
|
+
connection_check = _check("connection", connection_ok, connection_detail)
|
|
181
|
+
connection_check.update(diagnostics)
|
|
182
|
+
checks.append(connection_check)
|
|
183
|
+
else:
|
|
184
|
+
checks.append(_check("connection", connection_ok, connection_detail))
|
|
185
|
+
if not auth_ok:
|
|
186
|
+
checks.append(_check("connection", connection_ok, connection_detail))
|
|
187
|
+
|
|
188
|
+
recommendations: list[str] = []
|
|
189
|
+
if record is None or not credentials.has_credentials(profile_name):
|
|
190
|
+
login_profile = f" --profile {shlex.quote(profile_name)}" if profile_name else ""
|
|
191
|
+
recommendations.append(f"mammoth auth login{login_profile}")
|
|
192
|
+
elif resolved_project(invocation) is None:
|
|
193
|
+
recommendations.append("mammoth context project use PROJECT_ID")
|
|
194
|
+
if not connection_ok and auth_ok and not invocation.debug:
|
|
195
|
+
debug_profile = f" --profile {shlex.quote(profile_name)}" if profile_name else ""
|
|
196
|
+
recommendations.append(
|
|
197
|
+
f"mammoth doctor --debug{debug_profile} --output json --no-input"
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
data = {
|
|
201
|
+
"cli_version": __version__,
|
|
202
|
+
"python_version": platform.python_version(),
|
|
203
|
+
"python_executable": sys.executable,
|
|
204
|
+
"profile": profile_name,
|
|
205
|
+
"project_id": resolved_project(invocation),
|
|
206
|
+
"checks": checks,
|
|
207
|
+
"recommendations": recommendations,
|
|
208
|
+
"ok": all(c["ok"] for c in checks),
|
|
209
|
+
}
|
|
210
|
+
return data, {"profile": profile_name, "project_id": resolved_project(invocation)}
|
|
@@ -35,6 +35,10 @@ from mammoth_cli.services.positionals import PositionalSpec, resolve_positionals
|
|
|
35
35
|
from mammoth_cli.services.type_system import is_opaque_mapping, json_schema, sample_value
|
|
36
36
|
|
|
37
37
|
_OUTPUT_JSON_NO_INPUT = ("--output", "json", "--no-input")
|
|
38
|
+
# A command whose request carries a secret never gets an inline JSON example:
|
|
39
|
+
# the published example points at a protected owner-only file instead, so no
|
|
40
|
+
# generated or copied command line ever puts a credential in argv.
|
|
41
|
+
_PROTECTED_INPUT_PATH = "/private/path/request.json"
|
|
38
42
|
_OPAQUE_EXPERT_COMMANDS = frozenset({"view.task.add", "view.task.preview", "view.task.update"})
|
|
39
43
|
_TYPED_TRANSFORM_ALTERNATIVES = [
|
|
40
44
|
"view.transform.filter",
|
|
@@ -565,7 +569,10 @@ def runnable_example(
|
|
|
565
569
|
# cannot express supplies the missing accepted field here, so the
|
|
566
570
|
# documented example is actually runnable rather than just well-formed.
|
|
567
571
|
document.update(hints)
|
|
568
|
-
|
|
572
|
+
if set(record.get("secret_fields") or ()).intersection(document):
|
|
573
|
+
tokens.extend(["--input", _PROTECTED_INPUT_PATH])
|
|
574
|
+
else:
|
|
575
|
+
tokens.extend(["--input", json.dumps(document)])
|
|
569
576
|
tokens.extend(_OUTPUT_JSON_NO_INPUT)
|
|
570
577
|
if record["command_id"] in {"project.user.update", "data-app.share"}:
|
|
571
578
|
# These published high-impact examples must satisfy the same policy
|
|
@@ -4386,7 +4386,7 @@ methods:
|
|
|
4386
4386
|
reviewed_by: primary
|
|
4387
4387
|
- sdk_symbol: mammoth.api.jobs.JobsAPI.get_job
|
|
4388
4388
|
implementation_origin: mammoth.api.jobs.JobsAPI.get_job
|
|
4389
|
-
signature: 'get_job(self, job_id: ''int'', timeout: ''
|
|
4389
|
+
signature: 'get_job(self, job_id: ''int'', timeout: ''float | None'' = None) -> ''dict[str, Any]'''
|
|
4390
4390
|
openapi_operation_ids: []
|
|
4391
4391
|
canonical_command: job.get
|
|
4392
4392
|
alias_of: null
|
|
@@ -4398,7 +4398,7 @@ methods:
|
|
|
4398
4398
|
reviewed_by: primary
|
|
4399
4399
|
- sdk_symbol: mammoth.api.jobs.JobsAPI.get_jobs
|
|
4400
4400
|
implementation_origin: mammoth.api.jobs.JobsAPI.get_jobs
|
|
4401
|
-
signature: 'get_jobs(self, job_ids: ''list[int] | str'') -> ''dict[str, Any]'''
|
|
4401
|
+
signature: 'get_jobs(self, job_ids: ''list[int] | str'', timeout: ''float | None'' = None) -> ''dict[str, Any]'''
|
|
4402
4402
|
openapi_operation_ids: []
|
|
4403
4403
|
canonical_command: job.get-many
|
|
4404
4404
|
alias_of: null
|