mammoth-cli 2.3.0__tar.gz → 2.3.1__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.3.0 → mammoth_cli-2.3.1}/PKG-INFO +1 -1
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/__init__.py +1 -1
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +1 -1
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/how.py +214 -44
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/schema/find.py +13 -8
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/discovery/recipes.json +594 -18
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/trace.py +1 -1
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/pyproject.toml +1 -1
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/.gitignore +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/LICENSE +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/README.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/__main__.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/app/__init__.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/app/help_text.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/app/options.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/app/tree.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/app/usage.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capabilities.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/collection.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-embed.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-published.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-template.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/history.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/how.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/link.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/recipe.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/resolve.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/run.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/token.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/database-import.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/file-import.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/rest-api-import.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/__init__.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/_lazy.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/activity.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/addon.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/agent.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/ai.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/annotation.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/auth.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/automation.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/batch.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/billing.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/browse.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/calc.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/capabilities.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/capability.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/client_app.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/completion.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/config.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/connector.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/context.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/dashboard/__init__.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/dashboard/_common.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/dashboard/generated.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/dashboard/workbook.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/dataset/__init__.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/dataset/_common.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/dataset/create.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/dataset/find.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/doctor.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/external_key.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/file.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/folder.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/help_summaries.json +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/history.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/job.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/link.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/notification.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/parameter.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/project.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/recipe.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/registry.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/report.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/resolve.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/run.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/schedule.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/schema/__init__.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/schema/examples.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/skill.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/snippet.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/support.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/support_template.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/template.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/trash.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/upgrade.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/user.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/__init__.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/_common.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/aggregate.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/checks.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/column_checks.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/columns.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/data_read.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/derivatives.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/explore.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/export.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/export_dataset.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/export_specialized.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/formatting.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/join_check.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/lifecycle.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/listing.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/pipeline.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/settle.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/upload.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view_drivers.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view_explore.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view_forecast.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view_ops/__init__.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view_ops/batch.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view_ops/crud.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view_ops/draft.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view_ops/transforms.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view_profile.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/webhook.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/workflow.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/workspace.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/context/__init__.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/context/credentials.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/context/endpoint.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/context/keyring_backend.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/context/oauth.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/context/oauth_loopback.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/context/profiles.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/context/resolver.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/contracts/__init__.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/contracts/auth.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/discovery/__init__.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/discovery/limitations.json +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/discovery/next_commands.json +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/discovery/purposes.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/embed.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/errors/__init__.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/errors/envelope.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/manifest/__init__.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/manifest/loader.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/messages/__init__.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/output/__init__.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/output/emit.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/output/envelope.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/output/normalize.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/output/policy.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/output/progress.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/output/render.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/py.typed +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/__init__.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/bindings.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/compact.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/confirm.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/dataset_health.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/dispatch.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/dryrun.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/dryrun_targets.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/embed_pool.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/embed_scope.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/embedded.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/etag_store.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/executor.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/idempotency_servers.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/input_loader.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/intent_only.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/invocation.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/journal.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/labels.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/leaf.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/linecapture.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/local_paths.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/locked_files.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/new_data.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/next_commands.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/opens.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/options.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/parents.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/reveal.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/runlog.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/session.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/shared.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/state.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/strict.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/switches.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/token_scope.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/updates.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/validate.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/verify.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/view_dataset_cache.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/__init__.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/append_blank_columns.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/argspec.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/board_values.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/coerce.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/column_type_guard.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/command_contract.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/conditional_format.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/conditions.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/dashboard_figures.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/dashboard_filters.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/dashboard_pages.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/dashboard_review.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/data_profile.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/data_quality.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/delete_check.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/dispatch.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/explore_card_edit.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/explore_cards.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/explore_to_figure.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/explore_to_image.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/factory.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/field_enums.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/folder_ids.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/held_change.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/input_fields.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/job_outcome.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/listing.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/local_files.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/local_time.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/mapping.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/openapi_types.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/paging.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/period_analysis.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/poll.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/positional_overrides.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/positional_spec.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/positionals.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/protocol.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/read_memo.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/read_queries.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/schema_diff.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/sdk_service.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/sql_check.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/stored_stats.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/suggest.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/testing.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/text_dates.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/type_system.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/view_analysis.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/view_variants.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/write_impact.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/skills/__init__.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/skills/installer.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/skills/steering.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/testing.py +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/activity.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/addon.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/agent.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/ai.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/annotation.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/auth.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/automation.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/batch.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/billing.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/browse.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/calc.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/capabilities.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/capability.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/client-app.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/collection.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/completion.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/config.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/connector.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/context.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/dashboard.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/dataset.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/doctor.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/external-key.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/file.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/folder.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/history.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/how.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/job.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/link.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/log.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/notification.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/parameter.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/project.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/recipe.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/report.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/resolve.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/run.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/schedule.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/schema.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/skill.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/snippet.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/support.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/template.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/token.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/trash.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/upgrade.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/user.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/version.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/view.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/webhook.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/workflow.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/workspace.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands.generated.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/compiled/commands.json +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/compiled/openapi-operations.json +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/compiled/output-schemas.json +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/compiled/sdk-methods.json +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/edits-target.source.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/openapi-operations.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/output-schemas.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/schema-v1.json +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/sdk-catalog.source.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/sdk-methods.yaml +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/server-status.json +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/openapi/metadata.json +0 -0
- {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/openapi/openapi.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: mammoth-cli
|
|
3
|
-
version: 2.3.
|
|
3
|
+
version: 2.3.1
|
|
4
4
|
description: "Use Mammoth Analytics from a terminal: install or authenticate the CLI, discover its live command contract, and safely manage projects, data, views, pipelines (join, merge, pivot, filter, clean), dashboards, exports, and handoffs."
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -60,6 +60,17 @@ _NOT_HERE_HINT = (
|
|
|
60
60
|
"The recipe for this goal needs the user's machine (a local file or the run history), "
|
|
61
61
|
"which the app does not have. Use the app's own tools for that part."
|
|
62
62
|
)
|
|
63
|
+
_TIED_HINT = (
|
|
64
|
+
"More than one recipe fits this goal equally well, and running the wrong one changes "
|
|
65
|
+
"data. Pick one from 'alternatives' (mammoth how \"...\" shows its steps), or say more "
|
|
66
|
+
"about what the goal changes."
|
|
67
|
+
)
|
|
68
|
+
_UNRESOLVED_HINT = (
|
|
69
|
+
"Part of this goal fits more than one recipe equally well, and running the wrong one "
|
|
70
|
+
"changes data, so nothing is matched. 'unresolved' names each such part with its "
|
|
71
|
+
"recipes; 'recipes' are the parts that are clear. Say which recipe the unclear part "
|
|
72
|
+
"means, or run the parts one by one with mammoth how."
|
|
73
|
+
)
|
|
63
74
|
_NOTHING_HINT = (
|
|
64
75
|
"No recipe and no command matched this goal. Try other words, or run "
|
|
65
76
|
"'mammoth schema list' for every command."
|
|
@@ -78,44 +89,129 @@ def _recipe_vocabulary(recipe_id: str) -> frozenset[str]:
|
|
|
78
89
|
def _term_forms(term: str, compounds: frozenset[str]) -> frozenset[str]:
|
|
79
90
|
from mammoth_cli.commands.schema.find import _token_aliases
|
|
80
91
|
|
|
92
|
+
return _token_aliases(term) | frozenset(_HOW_SYNONYMS.get(term, ())) | _stems(term) | compounds
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _stems(term: str) -> frozenset[str]:
|
|
81
96
|
# "refreshes", "joined", "building": the recipe words are the plain forms.
|
|
82
97
|
stems = {term[: -len(end)] for end in ("es", "s", "ed", "ing") if term.endswith(end)}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
98
|
+
return frozenset(stem for stem in stems if len(stem) >= 3)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def _intent_met(recipe: dict[str, Any], action: list[_Form], rest: list[_Form]) -> bool:
|
|
102
|
+
"""Whether the goal says what the recipe does, not only words it shares with it.
|
|
103
|
+
|
|
104
|
+
A recipe declares ``intent``: groups of words, the action first and then its object.
|
|
105
|
+
Each group needs one goal word (or a stem or synonym of one). Generic words
|
|
106
|
+
("column", "view", "convert") sit in the vocabulary of many recipes, so overlap on
|
|
107
|
+
them proves nothing. A recipe marked ``bare_ok`` is also met by its action word alone
|
|
108
|
+
("undo", "pivot this"): a goal with no other word names no other object. ``action``
|
|
109
|
+
is checked against the first group and ``rest`` against the others; they differ for
|
|
110
|
+
one clause of a longer goal, which may name its object elsewhere ("upload sales.csv,
|
|
111
|
+
then make a dashboard").
|
|
112
|
+
"""
|
|
113
|
+
first, *others = recipe["intent"]
|
|
114
|
+
if recipe.get("bare_ok") and not _names_object(first, action):
|
|
115
|
+
return any(form & frozenset(first) for _, form in action)
|
|
116
|
+
return any(form & frozenset(first) and _distinct(others, rest, {word}) for word, form in action)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def _names_object(first: list[str], forms: list[_Form]) -> bool:
|
|
120
|
+
"""Whether the goal has a content word besides the recipe's action words."""
|
|
121
|
+
from mammoth_cli.commands.schema.find import _DISCOVERY_STOPWORDS
|
|
122
|
+
|
|
123
|
+
return any(not form & (frozenset(first) | _DISCOVERY_STOPWORDS) for _, form in forms)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _distinct(groups: list[list[str]], forms: list[_Form], used: set[str]) -> bool:
|
|
127
|
+
"""Whether each group can be met by a different goal word.
|
|
128
|
+
|
|
129
|
+
Words are told apart by the word itself: the same word read in a clause and in the whole
|
|
130
|
+
goal has different compounds, so its form sets differ, but it is still one word.
|
|
131
|
+
|
|
132
|
+
One word that a synonym turns into two ("weekly" is also "refresh") must not meet the
|
|
133
|
+
action and the object of a recipe by itself.
|
|
134
|
+
"""
|
|
135
|
+
if not groups:
|
|
136
|
+
return True
|
|
137
|
+
head, *tail = groups
|
|
138
|
+
return any(
|
|
139
|
+
word not in used and form & frozenset(head) and _distinct(tail, forms, used | {word})
|
|
140
|
+
for word, form in forms
|
|
86
141
|
)
|
|
87
142
|
|
|
88
143
|
|
|
144
|
+
def _rejected(
|
|
145
|
+
recipe: dict[str, Any], terms: tuple[str, ...], compounds: dict[str, frozenset[str]]
|
|
146
|
+
) -> bool:
|
|
147
|
+
"""Whether the goal has a word for the opposite job ("merge" for a split)."""
|
|
148
|
+
reject = frozenset(recipe.get("reject", ()))
|
|
149
|
+
return any(form & reject for _, form in _forms(terms, compounds))
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
#: A goal word and its forms.
|
|
153
|
+
_Form = tuple[str, frozenset[str]]
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def _forms(terms: tuple[str, ...], compounds: dict[str, frozenset[str]]) -> list[_Form]:
|
|
157
|
+
"""Each word with its stems and compounds, but not the ``how`` synonyms or the
|
|
158
|
+
``schema find`` aliases: those widen a word ("download" also means "csv", "weekly" also
|
|
159
|
+
means "refresh"), which is right for finding a recipe and wrong for deciding what the
|
|
160
|
+
user asked to have done to their data. Intent groups list the words they accept."""
|
|
161
|
+
return [(term, frozenset({term, *compounds.get(term, ())}) | _stems(term)) for term in terms]
|
|
162
|
+
|
|
163
|
+
|
|
89
164
|
#: Where a goal with several parts splits: "join X and Y, then build a dashboard".
|
|
90
165
|
_CLAUSE_SPLIT = re.compile(r"\s*(?:;|,|\band then\b|\bthen\b|\band\b|\bthat\b|\bwhich\b)\s*")
|
|
91
166
|
|
|
92
167
|
|
|
93
|
-
def
|
|
94
|
-
"""The
|
|
168
|
+
def _clause_fits(clause: str, prefer: str | None = None, goal: str = "") -> list[dict[str, Any]]:
|
|
169
|
+
"""The recipe a clause of a longer goal clearly asks for, or the recipes tied for it.
|
|
170
|
+
|
|
171
|
+
One recipe is a clear ask; two or more fit the clause equally; none is an empty list.
|
|
95
172
|
|
|
96
173
|
Two or more of its words match the recipe, or, in a clause of one or two
|
|
97
174
|
words, one word the recipe itself uses ("join orders", "refresh daily").
|
|
98
175
|
"""
|
|
99
|
-
from mammoth_cli.commands.schema.find import
|
|
176
|
+
from mammoth_cli.commands.schema.find import (
|
|
177
|
+
_adjacent_compound_forms,
|
|
178
|
+
_ordered_tokens,
|
|
179
|
+
_query_tokens,
|
|
180
|
+
)
|
|
100
181
|
|
|
101
|
-
terms = _query_tokens(clause) or
|
|
182
|
+
terms = _query_tokens(clause) or _ordered_tokens(clause)
|
|
102
183
|
if not terms:
|
|
103
|
-
return
|
|
184
|
+
return []
|
|
104
185
|
compounds = _adjacent_compound_forms(terms)
|
|
105
|
-
|
|
186
|
+
whole = _query_tokens(goal) or _ordered_tokens(goal)
|
|
187
|
+
whole_compounds = _adjacent_compound_forms(whole)
|
|
188
|
+
# Intent reads every word, the small ones too ("by", "per"), as in _rank.
|
|
189
|
+
clause_words, whole_words = _ordered_tokens(clause), _ordered_tokens(goal)
|
|
190
|
+
clause_forms = _forms(clause_words, _adjacent_compound_forms(clause_words))
|
|
191
|
+
whole_forms = _forms(whole_words, _adjacent_compound_forms(whole_words))
|
|
192
|
+
fits: list[tuple[tuple[int, int, int, int], dict[str, Any]]] = []
|
|
106
193
|
for order, recipe in enumerate(load_recipes()):
|
|
194
|
+
# The recipe that fits the whole goal is judged on all of it: "upload a csv" alone
|
|
195
|
+
# does not say "clean", and a "merge" anywhere in the goal rules out a split.
|
|
196
|
+
if _rejected(recipe, whole, whole_compounds) or not _intent_met(
|
|
197
|
+
recipe, clause_forms if recipe["id"] != prefer else whole_forms, whole_forms
|
|
198
|
+
):
|
|
199
|
+
continue
|
|
107
200
|
vocabulary = _recipe_vocabulary(recipe["id"])
|
|
108
201
|
hits = [t for t in terms if _term_forms(t, compounds.get(t, frozenset())) & vocabulary]
|
|
109
202
|
literal = sum(1 for term in hits if term in vocabulary)
|
|
110
203
|
if not (len(hits) >= 2 or (len(terms) <= 2 and literal >= 1)):
|
|
111
204
|
continue
|
|
112
205
|
# The recipe that fits the whole goal wins any clause it also fits.
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
return
|
|
206
|
+
fits.append(((int(recipe["id"] == prefer), len(hits), literal, -order), recipe))
|
|
207
|
+
fits.sort(key=lambda fit: fit[0], reverse=True)
|
|
208
|
+
# Recipes that fit equally well: file order must not pick one.
|
|
209
|
+
return [recipe for key, recipe in fits if key[:3] == fits[0][0][:3]]
|
|
117
210
|
|
|
118
211
|
|
|
212
|
+
#: How well a recipe fits a goal: share of words matched, whole-phrase match, literal words.
|
|
213
|
+
_Key = tuple[float, int, int]
|
|
214
|
+
|
|
119
215
|
#: Where each recipe sits in a pipeline; a composed goal runs them in this order.
|
|
120
216
|
_STAGE = {
|
|
121
217
|
"append-rows": 0,
|
|
@@ -153,44 +249,73 @@ _STAGE = {
|
|
|
153
249
|
}
|
|
154
250
|
|
|
155
251
|
|
|
156
|
-
def _compose(
|
|
157
|
-
|
|
252
|
+
def _compose(
|
|
253
|
+
goal: str, prefer: str | None = None
|
|
254
|
+
) -> tuple[list[tuple[str, dict[str, Any]]], list[tuple[str, list[dict[str, Any]]]]]:
|
|
255
|
+
"""Each clause of a several-part goal with its recipe, in pipeline order, no repeats.
|
|
256
|
+
|
|
257
|
+
Also the clauses that fit two or more recipes equally, each with those recipes: a
|
|
258
|
+
clause the goal does not settle is reported, not dropped.
|
|
259
|
+
"""
|
|
158
260
|
clauses = [part.strip() for part in _CLAUSE_SPLIT.split(goal) if part.strip()]
|
|
159
261
|
if len(clauses) < 2:
|
|
160
|
-
return [] # one part: the whole-goal match decides
|
|
262
|
+
return [], [] # one part: the whole-goal match decides
|
|
161
263
|
found: list[tuple[str, dict[str, Any]]] = []
|
|
264
|
+
unresolved: list[tuple[str, list[dict[str, Any]]]] = []
|
|
162
265
|
for clause in clauses:
|
|
163
|
-
|
|
164
|
-
if
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
266
|
+
fits = [r for r in _clause_fits(clause, prefer, goal) if not recipe_hidden_embedded(r)]
|
|
267
|
+
if len(fits) > 1:
|
|
268
|
+
unresolved.append((clause, fits))
|
|
269
|
+
elif fits and all(fits[0]["id"] != seen["id"] for _, seen in found):
|
|
270
|
+
found.append((clause, fits[0]))
|
|
271
|
+
return sorted(found, key=lambda item: _STAGE.get(item[1]["id"], 3)), unresolved
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def _rank(goal: str) -> list[tuple[_Key, dict[str, Any]]]:
|
|
275
|
+
"""Recipes that fit ``goal``, best first, each with the key it was ranked by."""
|
|
276
|
+
from mammoth_cli.commands.schema.find import (
|
|
277
|
+
_adjacent_compound_forms,
|
|
278
|
+
_ordered_tokens,
|
|
279
|
+
_query_tokens,
|
|
280
|
+
)
|
|
172
281
|
|
|
173
|
-
terms = _query_tokens(goal) or
|
|
282
|
+
terms = _query_tokens(goal) or _ordered_tokens(goal)
|
|
174
283
|
if not terms:
|
|
175
284
|
return []
|
|
176
285
|
compounds = _adjacent_compound_forms(terms)
|
|
177
286
|
folded = " ".join(goal.casefold().split())
|
|
287
|
+
# Intent also reads the small words the search drops ("by", "per"): they say what is grouped.
|
|
288
|
+
every_word = _ordered_tokens(goal)
|
|
289
|
+
forms = _forms(every_word, _adjacent_compound_forms(every_word))
|
|
178
290
|
ranked: list[tuple[float, int, int, int, dict[str, Any]]] = []
|
|
179
291
|
for order, recipe in enumerate(load_recipes()):
|
|
292
|
+
if _rejected(recipe, every_word, {}) or not _intent_met(recipe, forms, forms):
|
|
293
|
+
continue
|
|
180
294
|
vocabulary = _recipe_vocabulary(recipe["id"])
|
|
181
295
|
matched = sum(
|
|
182
296
|
1 for term in terms if _term_forms(term, compounds.get(term, frozenset())) & vocabulary
|
|
183
297
|
)
|
|
184
|
-
#
|
|
185
|
-
# (
|
|
186
|
-
|
|
298
|
+
# The goal states the recipe's intent (above); two of its words in the recipe's
|
|
299
|
+
# vocabulary then suffice (one, for a one-word goal), since the rest are the
|
|
300
|
+
# caller's own data words ("Salesforce", "customer id").
|
|
301
|
+
if matched < min(2, len(terms)):
|
|
187
302
|
continue
|
|
188
303
|
# A word the recipe itself uses outranks one reached only through a synonym.
|
|
189
304
|
literal = sum(1 for term in terms if term in vocabulary)
|
|
190
305
|
phrase = int(any(folded == goal_text.casefold() for goal_text in recipe["goals"]))
|
|
191
306
|
ranked.append((matched / len(terms), phrase, literal, -order, recipe))
|
|
192
307
|
ranked.sort(key=lambda item: (item[0], item[1], item[2], item[3]), reverse=True)
|
|
193
|
-
return [(literal, recipe) for
|
|
308
|
+
return [((fit, phrase, literal), recipe) for fit, phrase, literal, _, recipe in ranked]
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
def _tied(ranked: list[tuple[_Key, dict[str, Any]]]) -> list[tuple[_Key, dict[str, Any]]]:
|
|
312
|
+
"""The leading recipes that fit exactly as well as the best one; only file order separates them.
|
|
313
|
+
|
|
314
|
+
Two or more of them means the goal does not say which recipe is meant. A recipe run
|
|
315
|
+
changes data, so the caller must choose rather than take the first.
|
|
316
|
+
"""
|
|
317
|
+
tied = [item for item in ranked if item[0] == ranked[0][0]]
|
|
318
|
+
return tied if len(tied) > 1 else []
|
|
194
319
|
|
|
195
320
|
|
|
196
321
|
def runnable_for(goal: str, limit: int = 2) -> list[dict[str, Any]]:
|
|
@@ -203,6 +328,17 @@ def runnable_for(goal: str, limit: int = 2) -> list[dict[str, Any]]:
|
|
|
203
328
|
Returns:
|
|
204
329
|
Each recipe's id, title and ``run_command``.
|
|
205
330
|
"""
|
|
331
|
+
# Recipes that fit equally well are all returned: the caller chooses between them, so
|
|
332
|
+
# the limit never cuts inside a tie group.
|
|
333
|
+
fits = [
|
|
334
|
+
(key, recipe)
|
|
335
|
+
for key, recipe in _rank(goal)
|
|
336
|
+
if recipe.get("run") and not recipe_hidden_embedded(recipe)
|
|
337
|
+
]
|
|
338
|
+
keys = [key for key, _ in fits]
|
|
339
|
+
cut = limit
|
|
340
|
+
while cut < len(fits) and keys[cut] == keys[cut - 1]:
|
|
341
|
+
cut += 1
|
|
206
342
|
return [
|
|
207
343
|
{
|
|
208
344
|
"id": recipe["id"],
|
|
@@ -210,9 +346,8 @@ def runnable_for(goal: str, limit: int = 2) -> list[dict[str, Any]]:
|
|
|
210
346
|
"run_command": run_command(recipe),
|
|
211
347
|
"full_detail_command": f"mammoth how \"{recipe['goals'][0]}\"",
|
|
212
348
|
}
|
|
213
|
-
for _, recipe in
|
|
214
|
-
|
|
215
|
-
][:limit]
|
|
349
|
+
for _, recipe in fits[:cut]
|
|
350
|
+
]
|
|
216
351
|
|
|
217
352
|
|
|
218
353
|
def _context(invocation: Invocation) -> dict[str, Any]:
|
|
@@ -312,11 +447,11 @@ def how(invocation: Invocation) -> HandlerResult:
|
|
|
312
447
|
# weaker recipe that only shares a word with it; the parts it can do still are.
|
|
313
448
|
best_unavailable = bool(ranked) and recipe_hidden_embedded(ranked[0][1])
|
|
314
449
|
ranked = [item for item in ranked if not recipe_hidden_embedded(item[1])]
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
450
|
+
tied = _tied(ranked)
|
|
451
|
+
composed, unresolved = _compose(goal, ranked[0][1]["id"] if ranked and not tied else None)
|
|
452
|
+
if unresolved:
|
|
453
|
+
# A part of the goal fits several recipes equally: the whole goal is not run on a guess.
|
|
454
|
+
return _unresolved_result(goal, composed, unresolved, context), {}
|
|
320
455
|
if len(composed) >= 2 or (composed and not ranked):
|
|
321
456
|
# A goal with several parts gets every part's steps, not only the best one's.
|
|
322
457
|
return _composed_result(goal, composed, context), {}
|
|
@@ -327,9 +462,19 @@ def how(invocation: Invocation) -> HandlerResult:
|
|
|
327
462
|
"context": context,
|
|
328
463
|
"steps": [],
|
|
329
464
|
"notes": [],
|
|
330
|
-
"alternatives": _alternatives(ranked),
|
|
465
|
+
"alternatives": _alternatives([r for _, r in ranked]),
|
|
331
466
|
"hint": _NOT_HERE_HINT,
|
|
332
467
|
}, {}
|
|
468
|
+
if tied:
|
|
469
|
+
return {
|
|
470
|
+
"goal": goal,
|
|
471
|
+
"matched": False,
|
|
472
|
+
"context": context,
|
|
473
|
+
"steps": [],
|
|
474
|
+
"notes": [],
|
|
475
|
+
"alternatives": _alternatives([r for _, r in tied]),
|
|
476
|
+
"hint": _TIED_HINT,
|
|
477
|
+
}, {}
|
|
333
478
|
if not ranked:
|
|
334
479
|
steps = _fallback_steps(goal, context)
|
|
335
480
|
return {
|
|
@@ -349,7 +494,7 @@ def how(invocation: Invocation) -> HandlerResult:
|
|
|
349
494
|
"context": context,
|
|
350
495
|
"steps": _recipe_steps(best, context),
|
|
351
496
|
"notes": list(best.get("notes", [])),
|
|
352
|
-
"alternatives": _alternatives(ranked[1:]),
|
|
497
|
+
"alternatives": _alternatives([r for _, r in ranked[1:]]),
|
|
353
498
|
}
|
|
354
499
|
if best.get("run"):
|
|
355
500
|
# The steps as one command: an agent runs it instead of chaining them by hand.
|
|
@@ -358,11 +503,11 @@ def how(invocation: Invocation) -> HandlerResult:
|
|
|
358
503
|
return result, {}
|
|
359
504
|
|
|
360
505
|
|
|
361
|
-
def _alternatives(
|
|
362
|
-
"""The first few recipes
|
|
506
|
+
def _alternatives(recipes: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
|
507
|
+
"""The first few ``recipes``, each with the ``how`` command that shows it.
|
|
363
508
|
|
|
364
509
|
Args:
|
|
365
|
-
|
|
510
|
+
recipes: Recipes, best first.
|
|
366
511
|
|
|
367
512
|
Returns:
|
|
368
513
|
At most ``_MAX_ALTERNATIVES`` records of id, title and command.
|
|
@@ -373,7 +518,7 @@ def _alternatives(ranked: list[tuple[int, dict[str, Any]]]) -> list[dict[str, An
|
|
|
373
518
|
"title": recipe["title"],
|
|
374
519
|
"command": f'mammoth how "{recipe["goals"][0]}"',
|
|
375
520
|
}
|
|
376
|
-
for
|
|
521
|
+
for recipe in recipes[:_MAX_ALTERNATIVES]
|
|
377
522
|
]
|
|
378
523
|
|
|
379
524
|
|
|
@@ -383,6 +528,31 @@ _SETUP_COMMANDS = frozenset(
|
|
|
383
528
|
)
|
|
384
529
|
|
|
385
530
|
|
|
531
|
+
def _unresolved_result(
|
|
532
|
+
goal: str,
|
|
533
|
+
composed: list[tuple[str, dict[str, Any]]],
|
|
534
|
+
unresolved: list[tuple[str, list[dict[str, Any]]]],
|
|
535
|
+
context: dict[str, Any],
|
|
536
|
+
) -> dict[str, Any]:
|
|
537
|
+
"""No match, with the clear parts of a several-part goal and the parts that are tied."""
|
|
538
|
+
return {
|
|
539
|
+
"goal": goal,
|
|
540
|
+
"matched": False,
|
|
541
|
+
"recipes": [
|
|
542
|
+
{"id": recipe["id"], "title": recipe["title"], "doc": recipe["doc"], "for": clause}
|
|
543
|
+
for clause, recipe in composed
|
|
544
|
+
],
|
|
545
|
+
"unresolved": [
|
|
546
|
+
{"for": clause, "alternatives": _alternatives(fits)} for clause, fits in unresolved
|
|
547
|
+
],
|
|
548
|
+
"context": context,
|
|
549
|
+
"steps": [],
|
|
550
|
+
"notes": [],
|
|
551
|
+
"alternatives": _alternatives([r for _, fits in unresolved for r in fits]),
|
|
552
|
+
"hint": _UNRESOLVED_HINT,
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
|
|
386
556
|
def _composed_result(
|
|
387
557
|
goal: str, composed: list[tuple[str, dict[str, Any]]], context: dict[str, Any]
|
|
388
558
|
) -> dict[str, Any]:
|
|
@@ -212,26 +212,31 @@ _NO_MATCH_HINT_NO_SUGGESTIONS = (
|
|
|
212
212
|
_TOKEN_RE = re.compile(r"[a-z0-9]+(?:-[a-z0-9]+)*")
|
|
213
213
|
|
|
214
214
|
|
|
215
|
-
def
|
|
216
|
-
"""
|
|
215
|
+
def _ordered_tokens(value: str) -> tuple[str, ...]:
|
|
216
|
+
"""The words of ``value`` in the order written, each once.
|
|
217
217
|
|
|
218
218
|
A hyphenated word is kept whole and also split into its parts, so that
|
|
219
219
|
``date`` finds ``extract-date`` and ``date-diff`` as well as ``convert-type``'s
|
|
220
|
-
example text.
|
|
220
|
+
example text. The order is the text's, not a hash's: adjacent words make compounds.
|
|
221
221
|
"""
|
|
222
|
-
tokens:
|
|
222
|
+
tokens: dict[str, None] = {}
|
|
223
223
|
for token in _TOKEN_RE.findall(value.casefold()):
|
|
224
|
-
tokens
|
|
224
|
+
tokens[token] = None
|
|
225
225
|
if "-" in token:
|
|
226
|
-
tokens.update(token.split("-"))
|
|
227
|
-
return
|
|
226
|
+
tokens.update(dict.fromkeys(token.split("-")))
|
|
227
|
+
return tuple(tokens)
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def _tokens(value: str) -> frozenset[str]:
|
|
231
|
+
"""Tokenize search text consistently across platforms and Python runs."""
|
|
232
|
+
return frozenset(_ordered_tokens(value))
|
|
228
233
|
|
|
229
234
|
|
|
230
235
|
def _query_tokens(query: str) -> tuple[str, ...]:
|
|
231
236
|
# Bare numbers ("top 10") are values, not intent words.
|
|
232
237
|
return tuple(
|
|
233
238
|
token
|
|
234
|
-
for token in
|
|
239
|
+
for token in _ordered_tokens(query)
|
|
235
240
|
if token not in _DISCOVERY_STOPWORDS and not token.isdigit()
|
|
236
241
|
)
|
|
237
242
|
|