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.
Files changed (380) hide show
  1. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/PKG-INFO +1 -1
  2. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +1 -1
  4. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/how.py +214 -44
  5. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/schema/find.py +13 -8
  6. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/discovery/recipes.json +594 -18
  7. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/trace.py +1 -1
  8. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/pyproject.toml +1 -1
  9. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/.gitignore +0 -0
  10. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/LICENSE +0 -0
  11. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/README.md +0 -0
  12. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/__main__.py +0 -0
  13. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/app/__init__.py +0 -0
  14. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/app/help_text.py +0 -0
  15. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/app/options.py +0 -0
  16. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/app/tree.py +0 -0
  17. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/app/usage.py +0 -0
  18. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
  19. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  20. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
  21. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
  22. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
  23. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  24. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  25. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  26. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  27. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  28. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  29. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  30. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  31. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  32. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  33. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
  34. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capabilities.md +0 -0
  35. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  36. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  37. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/collection.md +0 -0
  38. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  39. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  40. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  41. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  42. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-embed.md +0 -0
  43. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-published.md +0 -0
  44. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
  45. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +0 -0
  46. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-template.md +0 -0
  47. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
  48. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  49. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  50. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  51. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  52. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  53. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/history.md +0 -0
  54. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/how.md +0 -0
  55. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  56. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/link.md +0 -0
  57. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  58. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  59. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  60. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
  61. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/recipe.md +0 -0
  62. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  63. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/resolve.md +0 -0
  64. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/run.md +0 -0
  65. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  66. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  67. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  68. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  69. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  70. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  71. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/token.md +0 -0
  72. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  73. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  74. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  75. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  76. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
  77. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +0 -0
  78. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  79. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  80. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  81. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  82. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
  83. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  84. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  85. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  86. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  87. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  88. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
  89. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/database-import.md +0 -0
  90. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
  91. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  92. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/file-import.md +0 -0
  93. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  94. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  95. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  96. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/rest-api-import.md +0 -0
  97. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
  98. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
  99. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  100. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  101. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  102. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  103. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  104. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
  105. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/__init__.py +0 -0
  106. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/_lazy.py +0 -0
  107. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/activity.py +0 -0
  108. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/addon.py +0 -0
  109. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/agent.py +0 -0
  110. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/ai.py +0 -0
  111. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/annotation.py +0 -0
  112. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/auth.py +0 -0
  113. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/automation.py +0 -0
  114. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/batch.py +0 -0
  115. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/billing.py +0 -0
  116. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/browse.py +0 -0
  117. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/calc.py +0 -0
  118. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/capabilities.py +0 -0
  119. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/capability.py +0 -0
  120. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/client_app.py +0 -0
  121. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/completion.py +0 -0
  122. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/config.py +0 -0
  123. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/connector.py +0 -0
  124. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/context.py +0 -0
  125. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/dashboard/__init__.py +0 -0
  126. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/dashboard/_common.py +0 -0
  127. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/dashboard/generated.py +0 -0
  128. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/dashboard/workbook.py +0 -0
  129. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/dataset/__init__.py +0 -0
  130. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/dataset/_common.py +0 -0
  131. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/dataset/create.py +0 -0
  132. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/dataset/find.py +0 -0
  133. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/doctor.py +0 -0
  134. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/external_key.py +0 -0
  135. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/file.py +0 -0
  136. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/folder.py +0 -0
  137. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/help_summaries.json +0 -0
  138. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/history.py +0 -0
  139. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/job.py +0 -0
  140. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/link.py +0 -0
  141. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/notification.py +0 -0
  142. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/parameter.py +0 -0
  143. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/project.py +0 -0
  144. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/recipe.py +0 -0
  145. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/registry.py +0 -0
  146. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/report.py +0 -0
  147. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/resolve.py +0 -0
  148. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/run.py +0 -0
  149. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/schedule.py +0 -0
  150. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/schema/__init__.py +0 -0
  151. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/schema/examples.py +0 -0
  152. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/skill.py +0 -0
  153. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/snippet.py +0 -0
  154. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/support.py +0 -0
  155. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/support_template.py +0 -0
  156. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/template.py +0 -0
  157. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/trash.py +0 -0
  158. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/upgrade.py +0 -0
  159. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/user.py +0 -0
  160. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/__init__.py +0 -0
  161. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/_common.py +0 -0
  162. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/aggregate.py +0 -0
  163. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/checks.py +0 -0
  164. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/column_checks.py +0 -0
  165. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/columns.py +0 -0
  166. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/data_read.py +0 -0
  167. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/derivatives.py +0 -0
  168. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/explore.py +0 -0
  169. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/export.py +0 -0
  170. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/export_dataset.py +0 -0
  171. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/export_specialized.py +0 -0
  172. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/formatting.py +0 -0
  173. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/join_check.py +0 -0
  174. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/lifecycle.py +0 -0
  175. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/listing.py +0 -0
  176. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/pipeline.py +0 -0
  177. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/settle.py +0 -0
  178. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view/upload.py +0 -0
  179. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view_drivers.py +0 -0
  180. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view_explore.py +0 -0
  181. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view_forecast.py +0 -0
  182. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view_ops/__init__.py +0 -0
  183. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view_ops/batch.py +0 -0
  184. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view_ops/crud.py +0 -0
  185. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view_ops/draft.py +0 -0
  186. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view_ops/transforms.py +0 -0
  187. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/view_profile.py +0 -0
  188. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/webhook.py +0 -0
  189. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/workflow.py +0 -0
  190. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/commands/workspace.py +0 -0
  191. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/context/__init__.py +0 -0
  192. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/context/credentials.py +0 -0
  193. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/context/endpoint.py +0 -0
  194. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/context/keyring_backend.py +0 -0
  195. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/context/oauth.py +0 -0
  196. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/context/oauth_loopback.py +0 -0
  197. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/context/profiles.py +0 -0
  198. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/context/resolver.py +0 -0
  199. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/contracts/__init__.py +0 -0
  200. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/contracts/auth.py +0 -0
  201. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/discovery/__init__.py +0 -0
  202. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/discovery/limitations.json +0 -0
  203. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/discovery/next_commands.json +0 -0
  204. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/discovery/purposes.py +0 -0
  205. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/embed.py +0 -0
  206. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/errors/__init__.py +0 -0
  207. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/errors/envelope.py +0 -0
  208. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/manifest/__init__.py +0 -0
  209. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/manifest/loader.py +0 -0
  210. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/messages/__init__.py +0 -0
  211. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/output/__init__.py +0 -0
  212. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/output/emit.py +0 -0
  213. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/output/envelope.py +0 -0
  214. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/output/normalize.py +0 -0
  215. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/output/policy.py +0 -0
  216. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/output/progress.py +0 -0
  217. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/output/render.py +0 -0
  218. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/py.typed +0 -0
  219. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/__init__.py +0 -0
  220. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/bindings.py +0 -0
  221. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/compact.py +0 -0
  222. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/confirm.py +0 -0
  223. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/dataset_health.py +0 -0
  224. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/dispatch.py +0 -0
  225. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/dryrun.py +0 -0
  226. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/dryrun_targets.py +0 -0
  227. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/embed_pool.py +0 -0
  228. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/embed_scope.py +0 -0
  229. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/embedded.py +0 -0
  230. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/etag_store.py +0 -0
  231. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/executor.py +0 -0
  232. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/idempotency_servers.py +0 -0
  233. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/input_loader.py +0 -0
  234. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/intent_only.py +0 -0
  235. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/invocation.py +0 -0
  236. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/journal.py +0 -0
  237. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/labels.py +0 -0
  238. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/leaf.py +0 -0
  239. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/linecapture.py +0 -0
  240. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/local_paths.py +0 -0
  241. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/locked_files.py +0 -0
  242. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/new_data.py +0 -0
  243. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/next_commands.py +0 -0
  244. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/opens.py +0 -0
  245. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/options.py +0 -0
  246. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/parents.py +0 -0
  247. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/reveal.py +0 -0
  248. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/runlog.py +0 -0
  249. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/session.py +0 -0
  250. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/shared.py +0 -0
  251. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/state.py +0 -0
  252. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/strict.py +0 -0
  253. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/switches.py +0 -0
  254. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/token_scope.py +0 -0
  255. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/updates.py +0 -0
  256. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/validate.py +0 -0
  257. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/verify.py +0 -0
  258. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/runtime/view_dataset_cache.py +0 -0
  259. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/__init__.py +0 -0
  260. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/append_blank_columns.py +0 -0
  261. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/argspec.py +0 -0
  262. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/board_values.py +0 -0
  263. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/coerce.py +0 -0
  264. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/column_type_guard.py +0 -0
  265. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/command_contract.py +0 -0
  266. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/conditional_format.py +0 -0
  267. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/conditions.py +0 -0
  268. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/dashboard_figures.py +0 -0
  269. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/dashboard_filters.py +0 -0
  270. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/dashboard_pages.py +0 -0
  271. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/dashboard_review.py +0 -0
  272. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/data_profile.py +0 -0
  273. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/data_quality.py +0 -0
  274. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/delete_check.py +0 -0
  275. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/dispatch.py +0 -0
  276. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/explore_card_edit.py +0 -0
  277. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/explore_cards.py +0 -0
  278. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/explore_to_figure.py +0 -0
  279. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/explore_to_image.py +0 -0
  280. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/factory.py +0 -0
  281. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/field_enums.py +0 -0
  282. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/folder_ids.py +0 -0
  283. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/held_change.py +0 -0
  284. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/input_fields.py +0 -0
  285. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/job_outcome.py +0 -0
  286. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/listing.py +0 -0
  287. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/local_files.py +0 -0
  288. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/local_time.py +0 -0
  289. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/mapping.py +0 -0
  290. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/openapi_types.py +0 -0
  291. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/paging.py +0 -0
  292. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/period_analysis.py +0 -0
  293. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/poll.py +0 -0
  294. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/positional_overrides.py +0 -0
  295. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/positional_spec.py +0 -0
  296. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/positionals.py +0 -0
  297. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/protocol.py +0 -0
  298. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/read_memo.py +0 -0
  299. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/read_queries.py +0 -0
  300. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/schema_diff.py +0 -0
  301. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/sdk_service.py +0 -0
  302. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/sql_check.py +0 -0
  303. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/stored_stats.py +0 -0
  304. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/suggest.py +0 -0
  305. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/testing.py +0 -0
  306. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/text_dates.py +0 -0
  307. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/type_system.py +0 -0
  308. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/view_analysis.py +0 -0
  309. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/view_variants.py +0 -0
  310. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/services/write_impact.py +0 -0
  311. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/skills/__init__.py +0 -0
  312. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/skills/installer.py +0 -0
  313. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/skills/steering.py +0 -0
  314. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/mammoth_cli/testing.py +0 -0
  315. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/activity.yaml +0 -0
  316. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/addon.yaml +0 -0
  317. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/agent.yaml +0 -0
  318. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/ai.yaml +0 -0
  319. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/annotation.yaml +0 -0
  320. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/auth.yaml +0 -0
  321. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/automation.yaml +0 -0
  322. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/batch.yaml +0 -0
  323. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/billing.yaml +0 -0
  324. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/browse.yaml +0 -0
  325. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/calc.yaml +0 -0
  326. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/capabilities.yaml +0 -0
  327. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/capability.yaml +0 -0
  328. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/client-app.yaml +0 -0
  329. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/collection.yaml +0 -0
  330. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/completion.yaml +0 -0
  331. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/config.yaml +0 -0
  332. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/connector.yaml +0 -0
  333. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/context.yaml +0 -0
  334. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/dashboard.yaml +0 -0
  335. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/dataset.yaml +0 -0
  336. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/doctor.yaml +0 -0
  337. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/external-key.yaml +0 -0
  338. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/file.yaml +0 -0
  339. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/folder.yaml +0 -0
  340. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/history.yaml +0 -0
  341. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/how.yaml +0 -0
  342. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/job.yaml +0 -0
  343. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/link.yaml +0 -0
  344. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/log.yaml +0 -0
  345. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/notification.yaml +0 -0
  346. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/parameter.yaml +0 -0
  347. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/project.yaml +0 -0
  348. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/recipe.yaml +0 -0
  349. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/report.yaml +0 -0
  350. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/resolve.yaml +0 -0
  351. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/run.yaml +0 -0
  352. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/schedule.yaml +0 -0
  353. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/schema.yaml +0 -0
  354. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/skill.yaml +0 -0
  355. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/snippet.yaml +0 -0
  356. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/support.yaml +0 -0
  357. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/template.yaml +0 -0
  358. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/token.yaml +0 -0
  359. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/trash.yaml +0 -0
  360. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/upgrade.yaml +0 -0
  361. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/user.yaml +0 -0
  362. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/version.yaml +0 -0
  363. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/view.yaml +0 -0
  364. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/webhook.yaml +0 -0
  365. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/workflow.yaml +0 -0
  366. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands/workspace.yaml +0 -0
  367. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/commands.generated.yaml +0 -0
  368. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/compiled/commands.json +0 -0
  369. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/compiled/openapi-operations.json +0 -0
  370. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/compiled/output-schemas.json +0 -0
  371. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/compiled/sdk-methods.json +0 -0
  372. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/edits-target.source.yaml +0 -0
  373. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/openapi-operations.yaml +0 -0
  374. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/output-schemas.yaml +0 -0
  375. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/schema-v1.json +0 -0
  376. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/sdk-catalog.source.yaml +0 -0
  377. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/sdk-methods.yaml +0 -0
  378. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/manifests/server-status.json +0 -0
  379. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/openapi/metadata.json +0 -0
  380. {mammoth_cli-2.3.0 → mammoth_cli-2.3.1}/spec/openapi/openapi.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mammoth-cli
3
- Version: 2.3.0
3
+ Version: 2.3.1
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
@@ -6,7 +6,7 @@ not implement a second HTTP client and does not call private SDK members.
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
- __version__ = "2.3.0"
9
+ __version__ = "2.3.1"
10
10
 
11
11
  # The versioned machine output envelope contract.
12
12
  SCHEMA_VERSION = 1
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: mammoth-cli
3
- version: 2.3.0
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
- stems = {stem for stem in stems if len(stem) >= 3}
84
- return (
85
- _token_aliases(term) | frozenset(_HOW_SYNONYMS.get(term, ())) | frozenset(stems) | compounds
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 _clause_recipe(clause: str, prefer: str | None = None) -> dict[str, Any] | None:
94
- """The one recipe a clause of a longer goal clearly asks for, or None.
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 _adjacent_compound_forms, _query_tokens, _tokens
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 tuple(_tokens(clause))
182
+ terms = _query_tokens(clause) or _ordered_tokens(clause)
102
183
  if not terms:
103
- return None
184
+ return []
104
185
  compounds = _adjacent_compound_forms(terms)
105
- best: tuple[int, int, int, int, dict[str, Any]] | None = None
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
- candidate = (int(recipe["id"] == prefer), len(hits), literal, -order, recipe)
114
- if best is None or candidate[:4] > best[:4]:
115
- best = candidate
116
- return best[4] if best else None
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(goal: str, prefer: str | None = None) -> list[tuple[str, dict[str, Any]]]:
157
- """Each clause of a several-part goal with its recipe, in pipeline order, no repeats."""
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
- recipe = _clause_recipe(clause, prefer)
164
- if recipe is not None and all(recipe["id"] != seen["id"] for _, seen in found):
165
- found.append((clause, recipe))
166
- return sorted(found, key=lambda item: _STAGE.get(item[1]["id"], 3))
167
-
168
-
169
- def _rank(goal: str) -> list[tuple[int, dict[str, Any]]]:
170
- """Recipes that fit ``goal``, best first, each with how many goal words it matched."""
171
- from mammoth_cli.commands.schema.find import _adjacent_compound_forms, _query_tokens, _tokens
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 tuple(_tokens(goal))
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
- # More than half the words, or half of them when that is at least two
185
- # (the rest are usually the caller's own data words: "customer id").
186
- if not (matched * 2 > len(terms) or (matched * 2 == len(terms) and matched >= 2)):
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 _, _, literal, _, recipe in ranked]
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 _rank(goal)
214
- if recipe.get("run") and not recipe_hidden_embedded(recipe)
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
- composed = [
316
- part
317
- for part in _compose(goal, ranked[0][1]["id"] if ranked else None)
318
- if not recipe_hidden_embedded(part[1])
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(ranked: list[tuple[int, dict[str, Any]]]) -> list[dict[str, Any]]:
362
- """The first few recipes of ``ranked``, each with the ``how`` command that shows it.
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
- ranked: Recipes from :func:`_rank`, best first.
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 _, recipe in ranked[:_MAX_ALTERNATIVES]
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 _tokens(value: str) -> frozenset[str]:
216
- """Tokenize search text consistently across platforms and Python runs.
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: set[str] = set()
222
+ tokens: dict[str, None] = {}
223
223
  for token in _TOKEN_RE.findall(value.casefold()):
224
- tokens.add(token)
224
+ tokens[token] = None
225
225
  if "-" in token:
226
- tokens.update(token.split("-"))
227
- return frozenset(tokens)
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 _tokens(query)
239
+ for token in _ordered_tokens(query)
235
240
  if token not in _DISCOVERY_STOPWORDS and not token.isdigit()
236
241
  )
237
242