mammoth-cli 2.2.62__tar.gz → 2.2.64__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 (276) hide show
  1. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/PKG-INFO +1 -1
  2. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/app.py +1 -1
  4. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/connector.py +16 -19
  5. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/dataset.py +131 -16
  6. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/resolve.py +14 -4
  7. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/command_contract.py +2 -0
  8. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/pyproject.toml +1 -1
  9. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/dataset.yaml +1 -1
  10. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/.gitignore +0 -0
  11. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/LICENSE +0 -0
  12. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/README.md +0 -0
  13. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/__main__.py +0 -0
  14. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +0 -0
  15. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
  16. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  17. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
  18. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
  19. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
  20. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  21. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  22. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  23. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  24. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  25. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  26. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  27. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  28. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  29. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  30. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
  31. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  32. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  33. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  34. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  35. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  36. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  37. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
  38. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +0 -0
  39. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-template.md +0 -0
  40. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
  41. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  42. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  43. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  44. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  45. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  46. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  47. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  48. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/link.md +0 -0
  49. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  50. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  51. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  52. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
  53. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  54. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/resolve.md +0 -0
  55. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  56. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  57. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  58. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  59. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  60. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  61. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/token.md +0 -0
  62. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  63. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  64. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  65. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  66. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
  67. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +0 -0
  68. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  69. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  70. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  71. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  72. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
  73. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  74. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  75. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  76. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  77. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/build-an-agent.md +0 -0
  78. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  79. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
  80. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/database-import.md +0 -0
  81. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
  82. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  83. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/file-import.md +0 -0
  84. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  85. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  86. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  87. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
  88. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
  89. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  90. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  91. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  92. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  93. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  94. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
  95. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/__init__.py +0 -0
  96. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/_lazy.py +0 -0
  97. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/activity.py +0 -0
  98. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/addon.py +0 -0
  99. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/agent.py +0 -0
  100. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/ai.py +0 -0
  101. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/annotation.py +0 -0
  102. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/auth.py +0 -0
  103. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/automation.py +0 -0
  104. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/batch.py +0 -0
  105. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/billing.py +0 -0
  106. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/browse.py +0 -0
  107. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/calc.py +0 -0
  108. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/capability.py +0 -0
  109. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/client_app.py +0 -0
  110. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/completion.py +0 -0
  111. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/config.py +0 -0
  112. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/context.py +0 -0
  113. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/dashboard.py +0 -0
  114. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/data_app.py +0 -0
  115. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/doctor.py +0 -0
  116. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/external_key.py +0 -0
  117. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/file.py +0 -0
  118. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/folder.py +0 -0
  119. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/help_summaries.json +0 -0
  120. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/job.py +0 -0
  121. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/link.py +0 -0
  122. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/notification.py +0 -0
  123. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/parameter.py +0 -0
  124. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/project.py +0 -0
  125. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/registry.py +0 -0
  126. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/report.py +0 -0
  127. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/schedule.py +0 -0
  128. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/schema.py +0 -0
  129. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/skill.py +0 -0
  130. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/snippet.py +0 -0
  131. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/support.py +0 -0
  132. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/template.py +0 -0
  133. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/trash.py +0 -0
  134. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/upgrade.py +0 -0
  135. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/user.py +0 -0
  136. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/view.py +0 -0
  137. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/view_ops.py +0 -0
  138. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/view_profile.py +0 -0
  139. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/webhook.py +0 -0
  140. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/workflow.py +0 -0
  141. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/commands/workspace.py +0 -0
  142. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/context/__init__.py +0 -0
  143. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/context/credentials.py +0 -0
  144. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/context/endpoint.py +0 -0
  145. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/context/keyring_backend.py +0 -0
  146. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/context/oauth.py +0 -0
  147. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/context/profiles.py +0 -0
  148. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/context/resolver.py +0 -0
  149. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/contracts/__init__.py +0 -0
  150. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/contracts/auth.py +0 -0
  151. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/embed.py +0 -0
  152. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/errors/__init__.py +0 -0
  153. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/errors/envelope.py +0 -0
  154. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/manifest/__init__.py +0 -0
  155. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/manifest/loader.py +0 -0
  156. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/messages/__init__.py +0 -0
  157. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/output/__init__.py +0 -0
  158. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/output/envelope.py +0 -0
  159. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/output/normalize.py +0 -0
  160. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/output/policy.py +0 -0
  161. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/output/progress.py +0 -0
  162. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/output/render.py +0 -0
  163. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/py.typed +0 -0
  164. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/__init__.py +0 -0
  165. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/confirm.py +0 -0
  166. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/dataset_health.py +0 -0
  167. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/dryrun.py +0 -0
  168. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/dryrun_targets.py +0 -0
  169. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/embedded.py +0 -0
  170. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/executor.py +0 -0
  171. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/input_loader.py +0 -0
  172. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/intent_only.py +0 -0
  173. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/invocation.py +0 -0
  174. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/locked_files.py +0 -0
  175. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/new_data.py +0 -0
  176. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/opens.py +0 -0
  177. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/options.py +0 -0
  178. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/parents.py +0 -0
  179. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/runlog.py +0 -0
  180. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/session.py +0 -0
  181. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/state.py +0 -0
  182. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/strict.py +0 -0
  183. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/updates.py +0 -0
  184. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/validate.py +0 -0
  185. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/runtime/verify.py +0 -0
  186. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/__init__.py +0 -0
  187. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/append_blank_columns.py +0 -0
  188. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/argspec.py +0 -0
  189. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/board_values.py +0 -0
  190. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/coerce.py +0 -0
  191. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/conditional_format.py +0 -0
  192. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/conditions.py +0 -0
  193. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/dashboard_filters.py +0 -0
  194. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/dashboard_pages.py +0 -0
  195. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/dashboard_review.py +0 -0
  196. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/data_profile.py +0 -0
  197. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/data_quality.py +0 -0
  198. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/dispatch.py +0 -0
  199. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/explore_cards.py +0 -0
  200. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/factory.py +0 -0
  201. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/folder_ids.py +0 -0
  202. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/input_fields.py +0 -0
  203. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/job_outcome.py +0 -0
  204. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/listing.py +0 -0
  205. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/local_time.py +0 -0
  206. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/mapping.py +0 -0
  207. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/openapi_types.py +0 -0
  208. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/positionals.py +0 -0
  209. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/protocol.py +0 -0
  210. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/read_queries.py +0 -0
  211. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/sdk_service.py +0 -0
  212. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/sql_check.py +0 -0
  213. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/stored_stats.py +0 -0
  214. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/testing.py +0 -0
  215. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/text_dates.py +0 -0
  216. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/type_system.py +0 -0
  217. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/view_analysis.py +0 -0
  218. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/view_variants.py +0 -0
  219. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/services/write_impact.py +0 -0
  220. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/skills/__init__.py +0 -0
  221. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/skills/installer.py +0 -0
  222. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/skills/steering.py +0 -0
  223. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/mammoth_cli/testing.py +0 -0
  224. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/activity.yaml +0 -0
  225. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/addon.yaml +0 -0
  226. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/agent.yaml +0 -0
  227. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/ai.yaml +0 -0
  228. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/annotation.yaml +0 -0
  229. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/auth.yaml +0 -0
  230. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/automation.yaml +0 -0
  231. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/batch.yaml +0 -0
  232. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/billing.yaml +0 -0
  233. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/browse.yaml +0 -0
  234. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/calc.yaml +0 -0
  235. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/capability.yaml +0 -0
  236. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/client-app.yaml +0 -0
  237. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/completion.yaml +0 -0
  238. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/config.yaml +0 -0
  239. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/connector.yaml +0 -0
  240. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/context.yaml +0 -0
  241. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/dashboard.yaml +0 -0
  242. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/data-app.yaml +0 -0
  243. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/doctor.yaml +0 -0
  244. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/external-key.yaml +0 -0
  245. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/file.yaml +0 -0
  246. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/folder.yaml +0 -0
  247. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/job.yaml +0 -0
  248. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/link.yaml +0 -0
  249. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/log.yaml +0 -0
  250. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/notification.yaml +0 -0
  251. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/parameter.yaml +0 -0
  252. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/project.yaml +0 -0
  253. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/report.yaml +0 -0
  254. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/resolve.yaml +0 -0
  255. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/schedule.yaml +0 -0
  256. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/schema.yaml +0 -0
  257. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/skill.yaml +0 -0
  258. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/snippet.yaml +0 -0
  259. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/support.yaml +0 -0
  260. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/template.yaml +0 -0
  261. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/token.yaml +0 -0
  262. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/trash.yaml +0 -0
  263. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/upgrade.yaml +0 -0
  264. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/user.yaml +0 -0
  265. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/version.yaml +0 -0
  266. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/view.yaml +0 -0
  267. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/webhook.yaml +0 -0
  268. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/workflow.yaml +0 -0
  269. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/commands/workspace.yaml +0 -0
  270. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/edits-target.source.yaml +0 -0
  271. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/openapi-operations.yaml +0 -0
  272. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/schema-v1.json +0 -0
  273. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/sdk-catalog.source.yaml +0 -0
  274. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/manifests/sdk-methods.yaml +0 -0
  275. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/openapi/metadata.json +0 -0
  276. {mammoth_cli-2.2.62 → mammoth_cli-2.2.64}/spec/openapi/openapi.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mammoth-cli
3
- Version: 2.2.62
3
+ Version: 2.2.64
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.2.62"
9
+ __version__ = "2.2.64"
10
10
 
11
11
  # The versioned machine output envelope contract.
12
12
  SCHEMA_VERSION = 1
@@ -1343,7 +1343,7 @@ _ROOT_LEAF_HELP: dict[str, str] = {
1343
1343
  ),
1344
1344
  "resolve": (
1345
1345
  "Say what NAME refers to: a dataset, a view or a project, with ids and projects."
1346
- "\n\nExample: mammoth resolve uqa-w29-ren"
1346
+ "\n\nExample: mammoth resolve uqa-w29-ren\n\nInput fields: all_projects (bool)"
1347
1347
  ),
1348
1348
  "upgrade": (
1349
1349
  "Upgrade the mammoth CLI to the latest (or a specified) version from PyPI."
@@ -145,26 +145,23 @@ def connector_get(invocation: Invocation) -> HandlerResult:
145
145
  return data, _meta(invocation, auth.workspace_id, resolved_project(invocation))
146
146
 
147
147
 
148
- #: ``availability`` a premium connector gets when it is not yet added to the
149
- #: workspace -- distinct from an ordinary connector nobody has added yet.
150
- _PREMIUM_NOT_ENABLED = "premium_not_enabled"
148
+ #: ``availability`` a connector gets when the server says this workspace's plan
149
+ #: does not include it.
150
+ _NOT_IN_PLAN = "not_in_plan"
151
151
 
152
152
 
153
- _PREMIUM_NOT_ENABLED_NOTE = (
154
- "Premium connector, not enabled in this workspace: Mammoth sales must enable"
155
- " it before it can be connected. Tell the user so and offer to contact sales."
156
- )
153
+ _NOT_IN_PLAN_NOTE = "Not included in this workspace's plan. Mammoth sales can enable it."
157
154
 
158
155
 
159
- def _with_premium_availability(data: Any) -> Any:
160
- """Mark each premium, not-yet-added connector with why it cannot be connected.
156
+ def _with_plan_availability(data: Any) -> Any:
157
+ """Mark each connector the server reports unavailable to this workspace.
161
158
 
162
- ``is_premium``/``is_added`` alone said a connector could not be connected
163
- but never why: a premium connector must be enabled by Mammoth sales
164
- before this workspace can use it, unlike an ordinary connector nobody has
165
- added yet. Without this, an agent that reads ``connector list`` can route
166
- a user to sales but never explain why (T2-WPP-W7). ``ConnectorsAPI.list``
167
- returns a list, which stays a list.
159
+ The server's ``is_available`` is the same plan check that gates creating a
160
+ connection. ``is_premium``/``is_added`` cannot stand in for it: ``is_added``
161
+ only says a legacy integration row exists, so a premium connector the plan
162
+ does include read as "not enabled". A response without ``is_available`` (an
163
+ older server) is left unmarked. ``ConnectorsAPI.list`` returns a list, which
164
+ stays a list.
168
165
  """
169
166
  if not isinstance(data, list):
170
167
  return data
@@ -172,10 +169,10 @@ def _with_premium_availability(data: Any) -> Any:
172
169
  (
173
170
  {
174
171
  **item,
175
- "availability": _PREMIUM_NOT_ENABLED,
176
- "availability_note": _PREMIUM_NOT_ENABLED_NOTE,
172
+ "availability": _NOT_IN_PLAN,
173
+ "availability_note": _NOT_IN_PLAN_NOTE,
177
174
  }
178
- if isinstance(item, dict) and item.get("is_premium") and not item.get("is_added")
175
+ if isinstance(item, dict) and item.get("is_available") is False
179
176
  else item
180
177
  )
181
178
  for item in data
@@ -187,7 +184,7 @@ def connector_list(invocation: Invocation) -> HandlerResult:
187
184
  with open_service(invocation) as (service, auth):
188
185
  data = service.call(_symbol(invocation))
189
186
  return (
190
- _with_premium_availability(data),
187
+ _with_plan_availability(data),
191
188
  _meta(invocation, auth.workspace_id, resolved_project(invocation)),
192
189
  )
193
190
 
@@ -10,14 +10,17 @@ seam to the public SDK method named by the command's reviewed manifest
10
10
 
11
11
  from __future__ import annotations
12
12
 
13
+ from collections.abc import Callable
13
14
  from typing import Any, Protocol
14
15
 
15
16
  from mammoth_cli.errors.envelope import (
16
17
  CODE_INVALID_ARGUMENT,
18
+ CODE_JOB_FAILED,
17
19
  CODE_MISSING_ARGUMENT,
18
20
  CODE_MISSING_FIELD,
19
21
  CODE_SDK_SYMBOL_UNRESOLVED,
20
22
  CODE_UNSUPPORTED_CONTRACT,
23
+ EXIT_API,
21
24
  EXIT_USAGE,
22
25
  CliError,
23
26
  )
@@ -358,6 +361,44 @@ def _tag_scope(matches: list[dict[str, Any]], project_id: int) -> list[dict[str,
358
361
  return [{**m, "in_project": m.get("project_id") == project_id} for m in matches]
359
362
 
360
363
 
364
+ def all_projects_requested(invocation: Invocation) -> bool:
365
+ """Whether ``--input '{"all_projects": true}'`` asks for matches outside the project."""
366
+ value = (invocation.load_input() or {}).get("all_projects", False)
367
+ if not isinstance(value, bool):
368
+ raise CliError(
369
+ code=CODE_INVALID_ARGUMENT,
370
+ message="all_projects must be true or false.",
371
+ exit_status=EXIT_USAGE,
372
+ )
373
+ return value
374
+
375
+
376
+ def narrow_to_project(
377
+ rows: list[dict[str, Any]], is_exact: Callable[[dict[str, Any]], bool]
378
+ ) -> tuple[list[dict[str, Any]], int]:
379
+ """``(rows, dropped)``: only the project's own rows when one of them is an exact match.
380
+
381
+ The name already is in the project the call runs under, so the same name in
382
+ every other project is noise that reads as an ambiguity to ask the user about.
383
+ Rows must carry ``in_project``. With no exact match in the project, all rows
384
+ stay: the name may live elsewhere. ``dropped`` counts the rows left out.
385
+ """
386
+ own = [r for r in rows if r.get("in_project")]
387
+ if not any(is_exact(r) for r in own):
388
+ return rows, 0
389
+ return own, len(rows) - len(own)
390
+
391
+
392
+ def elsewhere_note(dropped: int) -> str:
393
+ """Says how many matches in other projects were left out, and how to list them."""
394
+ if not dropped:
395
+ return ""
396
+ return (
397
+ f"{dropped} more match(es) in other projects are not listed: "
398
+ """--input '{"all_projects": true}' lists them."""
399
+ )
400
+
401
+
361
402
  def _find_scoped(
362
403
  service: Any,
363
404
  needle: str,
@@ -384,11 +425,14 @@ def dataset_find(invocation: Invocation) -> HandlerResult:
384
425
  carrying its ``project_id`` and ``project_name``: the in-product agent runs
385
426
  every call under the project the user last opened, which is often not the one
386
427
  the named dataset is in, so it states where the name is instead of asking the
387
- user to switch. Does not require an active project.
428
+ user to switch. When the project holds an exact match, only the project's own
429
+ matches are returned and ``elsewhere`` counts the rest; ``--input
430
+ '{"all_projects": true}'`` returns them all. Does not require an active project.
388
431
  """
389
432
  name_substring = _require_string_positional(invocation, "name substring")
390
433
  needle = name_substring.lower()
391
434
  skipped: list[dict[str, Any]] = []
435
+ dropped = 0
392
436
  with open_service(invocation) as (service, auth):
393
437
  visible = _visible_projects(service)
394
438
  cut = False
@@ -396,6 +440,10 @@ def dataset_find(invocation: Invocation) -> HandlerResult:
396
440
  matches, projects, cut = _find_scoped(
397
441
  service, needle, visible, invocation.project, skipped
398
442
  )
443
+ if not all_projects_requested(invocation):
444
+ matches, dropped = narrow_to_project(
445
+ matches, lambda m: str(m.get("name", "")).lower() == needle
446
+ )
399
447
  else:
400
448
  projects = visible
401
449
  holding, cut = _projects_holding(service, needle, visible)
@@ -412,6 +460,9 @@ def dataset_find(invocation: Invocation) -> HandlerResult:
412
460
  if skipped:
413
461
  result["projects_skipped"] = skipped
414
462
  notes = [ambiguity_note(len(matches), name_substring)]
463
+ if dropped:
464
+ result["elsewhere"] = dropped
465
+ notes.append(elsewhere_note(dropped))
415
466
  if cut:
416
467
  result["truncated"] = True
417
468
  notes.append(search_cut_note("datasets"))
@@ -828,6 +879,7 @@ def dataset_create(invocation: Invocation) -> HandlerResult:
828
879
  # A clone can land in another project (``dataset_spec.target_project_id``): the
829
880
  # name check and the result's scope are that project's, not the active one's.
830
881
  landing_project_id = _clone_target_project(ds_creation_type, dataset_spec) or project_id
882
+ _default_data_pull_file(ds_creation_type, dataset_spec)
831
883
  kwargs: dict[str, Any] = {
832
884
  "dataset_spec": dataset_spec,
833
885
  "ds_creation_type": ds_creation_type,
@@ -878,29 +930,92 @@ def _require_clone_views(ds_creation_type: object, dataset_spec: object) -> None
878
930
  )
879
931
 
880
932
 
933
+ #: The server's ``data_pull_file`` values for a cloud file import; the first is the app default.
934
+ _DATA_PULL_FILE_VALUES = ("Pull same file", "Pull next file based on name pattern")
935
+
936
+
937
+ def _default_data_pull_file(ds_creation_type: object, dataset_spec: object) -> None:
938
+ """Default a cloud file import's ``data_pull_file`` to "Pull same file", as the web app does.
939
+
940
+ Raises:
941
+ CliError: ``invalid_argument`` listing the allowed values when it is not one of them.
942
+ """
943
+ if ds_creation_type != "cloud" or not isinstance(dataset_spec, dict):
944
+ return
945
+ properties = dataset_spec.get("query_properties")
946
+ if not isinstance(properties, dict) or not properties.get("file_path"):
947
+ return
948
+ pull = properties.setdefault("data_pull_file", _DATA_PULL_FILE_VALUES[0])
949
+ if pull not in _DATA_PULL_FILE_VALUES:
950
+ raise CliError(
951
+ code=CODE_INVALID_ARGUMENT,
952
+ message="query_properties.data_pull_file must be one of "
953
+ f"{list(_DATA_PULL_FILE_VALUES)}, got {pull!r}.",
954
+ exit_status=EXIT_USAGE,
955
+ )
956
+
957
+
881
958
  def _created_dataset(handle: Any, settled: Any) -> dict[str, Any]:
882
959
  """Shape a create job (handle + settled result) into a labeled result.
883
960
 
884
- ``wait_if_job`` returns the completed job's inner response, where the new
885
- dataset id lives under ``ds_id``. Falls back to the raw job handle when the
886
- server returned something unrecognized, so no information is lost.
961
+ What each creation type settles with: weburl, clone and a single cloud file or
962
+ database import carry the new dataset id (``ds_id``, ``dataset_id`` or
963
+ ``datasource_id``); a cloud import deferred to a later start carries
964
+ ``datasource_config_id`` and reports ``scheduled``; a bulk cloud file import
965
+ carries ``files_found``/``created``/``failed`` and is returned as the server
966
+ sent it; a sketch is not a job and answers with the dataset itself. A job that
967
+ settled with none of these made nothing, so it raises with the server's reason
968
+ rather than report success.
969
+
970
+ Raises:
971
+ CliError: ``job_failed`` when the settled job made no dataset.
887
972
  """
888
- job_id = handle.get("job_id") if isinstance(handle, dict) else None
973
+ if not isinstance(handle, dict) or "job_id" not in handle:
974
+ return settled if isinstance(settled, dict) else {"job_id": None}
975
+ job_id = handle["job_id"]
889
976
  ds_id = None
977
+ config_id = None
890
978
  if isinstance(settled, dict):
891
- ds_id = settled.get("ds_id") or settled.get("dataset_id")
892
- nested = settled.get("response")
893
- if ds_id is None and isinstance(nested, dict):
894
- ds_id = nested.get("ds_id") or nested.get("dataset_id")
979
+ for source in (settled, settled.get("response")):
980
+ if not isinstance(source, dict):
981
+ continue
982
+ ds_id = ds_id or _first_id(source, _DATASET_ID_KEYS)
983
+ config_id = config_id or source.get("datasource_config_id")
895
984
  job_id = settled.get("job_id", job_id)
985
+ if ds_id is None and config_id is not None:
986
+ return {"status": "scheduled", "datasource_config_id": config_id, "job_id": job_id}
987
+ if ds_id is None and isinstance(settled, dict) and "files_found" in settled:
988
+ return settled
896
989
  if ds_id is None:
897
- # No recognizable dataset id: surface the settled payload untouched
898
- # rather than claim a readiness we cannot confirm.
899
- return settled if isinstance(settled, dict) else {"job_id": job_id}
900
- result: dict[str, Any] = {"status": "ready", "dataset_id": ds_id}
901
- if job_id is not None:
902
- result["job_id"] = job_id
903
- return result
990
+ reason = _job_reason(settled)
991
+ raise CliError(
992
+ code=CODE_JOB_FAILED,
993
+ message="The dataset was not created"
994
+ + (f": {reason}" if reason else f" (job {job_id} finished without a dataset id)."),
995
+ exit_status=EXIT_API,
996
+ )
997
+ return {"status": "ready", "dataset_id": ds_id, "job_id": job_id}
998
+
999
+
1000
+ #: Keys a settled create job may carry its dataset id under.
1001
+ _DATASET_ID_KEYS = ("ds_id", "dataset_id", "datasource_id")
1002
+
1003
+
1004
+ def _first_id(source: dict[str, Any], keys: tuple[str, ...]) -> Any:
1005
+ """The first non-empty value of ``keys`` in ``source``, or None."""
1006
+ return next((source[key] for key in keys if source.get(key)), None)
1007
+
1008
+
1009
+ def _job_reason(settled: Any) -> str | None:
1010
+ """The failure reason a settled job carries (``failure_reason``, ``message``, ``error``)."""
1011
+ if not isinstance(settled, dict):
1012
+ return None
1013
+ nested = settled.get("response")
1014
+ for source in (settled, nested if isinstance(nested, dict) else {}):
1015
+ for key in ("failure_reason", "message", "error"):
1016
+ if source.get(key):
1017
+ return str(source[key])
1018
+ return None
904
1019
 
905
1020
 
906
1021
  #: Pages (of 100) read to predict a final name; past it the answer is "a suffix may be added".
@@ -14,6 +14,9 @@ from typing import Any
14
14
  from mammoth_cli.commands.dataset import (
15
15
  _require_string_positional,
16
16
  _visible_projects,
17
+ all_projects_requested,
18
+ elsewhere_note,
19
+ narrow_to_project,
17
20
  search_cut_note,
18
21
  search_hits,
19
22
  )
@@ -99,10 +102,11 @@ def kinds_note(name: str, rows: list[dict[str, Any]]) -> str:
99
102
  def resolve(invocation: Invocation) -> HandlerResult:
100
103
  """Say what NAME refers to: a dataset, a view or a project, with ids and projects.
101
104
 
102
- Read-only. NAME is a case-insensitive substring and the only argument; the
103
- command has no options besides the global ``--project``, which only marks
104
- each match ``in_project`` (matches elsewhere are always returned). Searches
105
- every project the credential can see. Does not require an active project.
105
+ Read-only. NAME is a case-insensitive substring. Searches every project the
106
+ credential can see and marks each match ``in_project`` under ``--project``.
107
+ When the project holds an exact match, only the project's own matches are
108
+ returned and ``elsewhere`` counts the rest; ``--input '{"all_projects": true}'``
109
+ returns them all. Does not require an active project.
106
110
  """
107
111
  name = _require_string_positional(invocation, "name")
108
112
  cut = False
@@ -118,7 +122,13 @@ def resolve(invocation: Invocation) -> HandlerResult:
118
122
  "project_id": invocation.project,
119
123
  }
120
124
  rows = resolve_matches(name, projects, hits, invocation.project)
125
+ dropped = 0
126
+ if invocation.project is not None and not all_projects_requested(invocation):
127
+ rows, dropped = narrow_to_project(rows, lambda r: r["exact"])
121
128
  result: dict[str, Any] = {"name": name, "matches": rows, "note": kinds_note(name, rows)}
129
+ if dropped:
130
+ result["elsewhere"] = dropped
131
+ result["note"] += " " + elsewhere_note(dropped)
122
132
  if cut:
123
133
  result["truncated"] = True
124
134
  result["note"] += " " + search_cut_note("datasets or views")
@@ -250,6 +250,8 @@ _PILOT_ADAPTER_INPUTS: dict[str, frozenset[str]] = {
250
250
  _LOCAL_CONTRACT_FIELDS: dict[str, tuple[FieldSpec, ...]] = {
251
251
  "project.ensure": (FieldSpec("name", required=False, annotation=str),),
252
252
  "doctor": (FieldSpec("wait", required=False, annotation=int, default=0),),
253
+ "resolve": (FieldSpec("all_projects", required=False, annotation=bool, default=False),),
254
+ "dataset.find": (FieldSpec("all_projects", required=False, annotation=bool, default=False),),
253
255
  "schema.get": (FieldSpec("full", required=False, annotation=bool, default=False),),
254
256
  "schema.list": (
255
257
  FieldSpec("family", required=False, annotation=str | None, default=None),
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mammoth-cli"
3
- version = "2.2.62"
3
+ version = "2.2.64"
4
4
  description = "Command-line interface for the Mammoth Analytics platform"
5
5
  authors = [{name = "Mammoth Analytics", email = "support@mammoth.io"}]
6
6
  readme = "README.md"
@@ -247,7 +247,7 @@ commands:
247
247
  - CT-DATASET-CREATE-ERROR
248
248
  draft_test: null
249
249
  undo_test: null
250
- known_restrictions: 'ds_creation_type is freeform and dataset_spec is arbitrary, so variants beyond the documented path are not qualified. Retained live evidence supports ds_creation_type=weburl with dataset_spec.url; the CLI command waits for the raw SDK job and returned ready for five OWID URL imports. Re-read returned dataset/view IDs and delete only IDs created by this task. A weburl dataset is a one-time copy that keeps no source details to refresh from, so automation''s run_data_retrieval task cannot refresh it (only a cloud-connected dataset can be refreshed); say so rather than scheduling a refresh for it. The result''s name is the dataset''s real name; when the requested name was taken the server adds a suffix, and requested_name and note say so. Use name, not the name you asked for. To copy a dataset as a new independent one: {"ds_creation_type": "clone", "dataset_spec": {"ds_name": NEW_NAME, "source_ds_id": ID, "clone_dataview_ids": [DEFAULT_VIEW_ID], "exclude_data": false}}, DEFAULT_VIEW_ID being the id in dataset''s `default_view` from view list (other views only when asked); an empty clone_dataview_ids is refused here because it makes a blank view. A clone waits and returns the new dataset_id; never use view export dataset for a plain copy, which leaves a live export on the source. A weburl import names the dataset after the downloaded file: follow it with dataset rename to the name the user picked. To import a file from an SFTP server (or another file connector) as a new dataset: connector connection create sftp, then {"ds_creation_type": "cloud", "dataset_spec": {"connector_key": "sftp", "connection_key": KEY, "query_properties": {"ds_name": NAME, "file_path": PATH_ON_SERVER}}}; the recipe is recipes/file-import.md.'
250
+ known_restrictions: 'ds_creation_type is freeform and dataset_spec is arbitrary, so variants beyond the documented path are not qualified. Retained live evidence supports ds_creation_type=weburl with dataset_spec.url; the CLI command waits for the raw SDK job and returned ready for five OWID URL imports. Re-read returned dataset/view IDs and delete only IDs created by this task. A weburl dataset is a one-time copy that keeps no source details to refresh from, so automation''s run_data_retrieval task cannot refresh it (only a cloud-connected dataset can be refreshed); say so rather than scheduling a refresh for it. The result''s name is the dataset''s real name; when the requested name was taken the server adds a suffix, and requested_name and note say so. Use name, not the name you asked for. To copy a dataset as a new independent one: {"ds_creation_type": "clone", "dataset_spec": {"ds_name": NEW_NAME, "source_ds_id": ID, "clone_dataview_ids": [DEFAULT_VIEW_ID], "exclude_data": false}}, DEFAULT_VIEW_ID being the id in dataset''s `default_view` from view list (other views only when asked); an empty clone_dataview_ids is refused here because it makes a blank view. A clone waits and returns the new dataset_id; never use view export dataset for a plain copy, which leaves a live export on the source. A weburl import names the dataset after the downloaded file: follow it with dataset rename to the name the user picked. To import a file from an SFTP server (or another file connector) as a new dataset: connector connection create sftp, then {"ds_creation_type": "cloud", "dataset_spec": {"connector_key": "sftp", "connection_key": KEY, "query_properties": {"ds_name": NAME, "file_path": PATH_ON_SERVER, "data_pull_file": "Pull same file"}}}. data_pull_file is a string and may be left out, which means "Pull same file" (what the web app does); its only other value is "Pull next file based on name pattern", which also needs folder_path and name_pattern. A pull that finds no file at the path fails the create with the server''s reason; the recipe is recipes/file-import.md.'
251
251
  reviewed_by: primary
252
252
  - command_id: dataset.create-from-pdf
253
253
  command_path: dataset create-from-pdf
File without changes
File without changes
File without changes