mammoth-cli 2.2.91__tar.gz → 2.2.93__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 (313) hide show
  1. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/PKG-INFO +2 -2
  2. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/app.py +26 -1
  4. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +1 -1
  5. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +1 -1
  6. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +2 -2
  7. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +30 -0
  8. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +4 -2
  9. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +8 -0
  10. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/browse.py +40 -3
  11. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/dashboard.py +31 -1
  12. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/dataset.py +87 -4
  13. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/help_summaries.json +4 -1
  14. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/registry.py +5 -0
  15. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/schema.py +59 -5
  16. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/view.py +115 -18
  17. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_ops.py +148 -23
  18. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/errors/envelope.py +7 -1
  19. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/dataset_health.py +4 -3
  20. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/executor.py +29 -0
  21. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/input_loader.py +42 -4
  22. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/shared.py +1 -3
  23. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/state.py +11 -7
  24. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/strict.py +62 -0
  25. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/validate.py +11 -2
  26. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/coerce.py +48 -4
  27. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/command_contract.py +2 -1
  28. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/conditions.py +17 -0
  29. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/delete_check.py +4 -2
  30. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/field_enums.py +9 -1
  31. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/input_fields.py +10 -1
  32. mammoth_cli-2.2.93/mammoth_cli/services/poll.py +22 -0
  33. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/positionals.py +3 -1
  34. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/sdk_service.py +32 -2
  35. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/pyproject.toml +2 -2
  36. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/dataset.yaml +1 -1
  37. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/view.yaml +168 -7
  38. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/edits-target.source.yaml +2 -0
  39. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/sdk-catalog.source.yaml +24 -0
  40. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/sdk-methods.yaml +53 -1
  41. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/.gitignore +0 -0
  42. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/LICENSE +0 -0
  43. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/README.md +0 -0
  44. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/__main__.py +0 -0
  45. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
  46. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  47. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
  48. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  49. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  50. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  51. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  52. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  53. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  54. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  55. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  56. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  57. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  58. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
  59. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capabilities.md +0 -0
  60. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  61. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  62. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/collection.md +0 -0
  63. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  64. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  65. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  66. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  67. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-embed.md +0 -0
  68. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-published.md +0 -0
  69. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
  70. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +0 -0
  71. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-template.md +0 -0
  72. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
  73. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  74. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  75. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  76. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  77. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  78. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  79. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/how.md +0 -0
  80. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  81. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/link.md +0 -0
  82. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  83. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  84. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  85. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
  86. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  87. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/resolve.md +0 -0
  88. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  89. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  90. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  91. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  92. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  93. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  94. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/token.md +0 -0
  95. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  96. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  97. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  98. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  99. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
  100. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  101. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  102. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  103. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  104. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
  105. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  106. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  107. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  108. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/build-an-agent.md +0 -0
  109. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  110. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
  111. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/database-import.md +0 -0
  112. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
  113. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  114. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/file-import.md +0 -0
  115. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  116. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  117. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  118. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/rest-api-import.md +0 -0
  119. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
  120. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  121. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  122. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  123. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  124. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  125. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
  126. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/__init__.py +0 -0
  127. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/_lazy.py +0 -0
  128. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/activity.py +0 -0
  129. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/addon.py +0 -0
  130. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/agent.py +0 -0
  131. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/ai.py +0 -0
  132. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/annotation.py +0 -0
  133. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/auth.py +0 -0
  134. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/automation.py +0 -0
  135. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/batch.py +0 -0
  136. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/billing.py +0 -0
  137. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/calc.py +0 -0
  138. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/capabilities.py +0 -0
  139. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/capability.py +0 -0
  140. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/client_app.py +0 -0
  141. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/completion.py +0 -0
  142. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/config.py +0 -0
  143. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/connector.py +0 -0
  144. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/context.py +0 -0
  145. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/data_app.py +0 -0
  146. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/doctor.py +0 -0
  147. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/external_key.py +0 -0
  148. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/file.py +0 -0
  149. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/folder.py +0 -0
  150. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/how.py +0 -0
  151. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/job.py +0 -0
  152. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/link.py +0 -0
  153. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/notification.py +0 -0
  154. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/parameter.py +0 -0
  155. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/project.py +0 -0
  156. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/report.py +0 -0
  157. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/resolve.py +0 -0
  158. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/schedule.py +0 -0
  159. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/skill.py +0 -0
  160. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/snippet.py +0 -0
  161. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/support.py +0 -0
  162. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/template.py +0 -0
  163. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/trash.py +0 -0
  164. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/upgrade.py +0 -0
  165. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/user.py +0 -0
  166. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_drivers.py +0 -0
  167. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_explore.py +0 -0
  168. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_forecast.py +0 -0
  169. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_profile.py +0 -0
  170. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/webhook.py +0 -0
  171. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/workflow.py +0 -0
  172. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/commands/workspace.py +0 -0
  173. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/context/__init__.py +0 -0
  174. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/context/credentials.py +0 -0
  175. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/context/endpoint.py +0 -0
  176. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/context/keyring_backend.py +0 -0
  177. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/context/oauth.py +0 -0
  178. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/context/profiles.py +0 -0
  179. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/context/resolver.py +0 -0
  180. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/contracts/__init__.py +0 -0
  181. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/contracts/auth.py +0 -0
  182. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/discovery/__init__.py +0 -0
  183. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/discovery/limitations.json +0 -0
  184. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/discovery/next_commands.json +0 -0
  185. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/discovery/recipes.json +0 -0
  186. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/embed.py +0 -0
  187. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/errors/__init__.py +0 -0
  188. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/manifest/__init__.py +0 -0
  189. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/manifest/loader.py +0 -0
  190. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/messages/__init__.py +0 -0
  191. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/output/__init__.py +0 -0
  192. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/output/envelope.py +0 -0
  193. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/output/normalize.py +0 -0
  194. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/output/policy.py +0 -0
  195. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/output/progress.py +0 -0
  196. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/output/render.py +0 -0
  197. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/py.typed +0 -0
  198. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/__init__.py +0 -0
  199. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/compact.py +0 -0
  200. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/confirm.py +0 -0
  201. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/dryrun.py +0 -0
  202. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/dryrun_targets.py +0 -0
  203. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/embedded.py +0 -0
  204. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/intent_only.py +0 -0
  205. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/invocation.py +0 -0
  206. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/labels.py +0 -0
  207. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/locked_files.py +0 -0
  208. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/new_data.py +0 -0
  209. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/next_commands.py +0 -0
  210. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/opens.py +0 -0
  211. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/options.py +0 -0
  212. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/parents.py +0 -0
  213. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/runlog.py +0 -0
  214. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/session.py +0 -0
  215. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/token_scope.py +0 -0
  216. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/updates.py +0 -0
  217. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/runtime/verify.py +0 -0
  218. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/__init__.py +0 -0
  219. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/append_blank_columns.py +0 -0
  220. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/argspec.py +0 -0
  221. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/board_values.py +0 -0
  222. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/column_type_guard.py +0 -0
  223. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/conditional_format.py +0 -0
  224. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/dashboard_figures.py +0 -0
  225. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/dashboard_filters.py +0 -0
  226. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/dashboard_pages.py +0 -0
  227. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/dashboard_review.py +0 -0
  228. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/data_profile.py +0 -0
  229. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/data_quality.py +0 -0
  230. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/dispatch.py +0 -0
  231. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/explore_card_edit.py +0 -0
  232. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/explore_cards.py +0 -0
  233. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/explore_to_figure.py +0 -0
  234. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/explore_to_image.py +0 -0
  235. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/factory.py +0 -0
  236. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/folder_ids.py +0 -0
  237. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/job_outcome.py +0 -0
  238. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/listing.py +0 -0
  239. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/local_files.py +0 -0
  240. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/local_time.py +0 -0
  241. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/mapping.py +0 -0
  242. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/openapi_types.py +0 -0
  243. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/paging.py +0 -0
  244. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/period_analysis.py +0 -0
  245. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/protocol.py +0 -0
  246. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/read_memo.py +0 -0
  247. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/read_queries.py +0 -0
  248. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/schema_diff.py +0 -0
  249. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/sql_check.py +0 -0
  250. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/stored_stats.py +0 -0
  251. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/suggest.py +0 -0
  252. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/testing.py +0 -0
  253. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/text_dates.py +0 -0
  254. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/type_system.py +0 -0
  255. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/view_analysis.py +0 -0
  256. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/view_variants.py +0 -0
  257. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/services/write_impact.py +0 -0
  258. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/skills/__init__.py +0 -0
  259. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/skills/installer.py +0 -0
  260. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/skills/steering.py +0 -0
  261. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/mammoth_cli/testing.py +0 -0
  262. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/activity.yaml +0 -0
  263. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/addon.yaml +0 -0
  264. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/agent.yaml +0 -0
  265. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/ai.yaml +0 -0
  266. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/annotation.yaml +0 -0
  267. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/auth.yaml +0 -0
  268. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/automation.yaml +0 -0
  269. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/batch.yaml +0 -0
  270. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/billing.yaml +0 -0
  271. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/browse.yaml +0 -0
  272. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/calc.yaml +0 -0
  273. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/capabilities.yaml +0 -0
  274. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/capability.yaml +0 -0
  275. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/client-app.yaml +0 -0
  276. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/collection.yaml +0 -0
  277. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/completion.yaml +0 -0
  278. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/config.yaml +0 -0
  279. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/connector.yaml +0 -0
  280. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/context.yaml +0 -0
  281. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/dashboard.yaml +0 -0
  282. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/data-app.yaml +0 -0
  283. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/doctor.yaml +0 -0
  284. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/external-key.yaml +0 -0
  285. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/file.yaml +0 -0
  286. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/folder.yaml +0 -0
  287. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/how.yaml +0 -0
  288. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/job.yaml +0 -0
  289. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/link.yaml +0 -0
  290. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/log.yaml +0 -0
  291. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/notification.yaml +0 -0
  292. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/parameter.yaml +0 -0
  293. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/project.yaml +0 -0
  294. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/report.yaml +0 -0
  295. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/resolve.yaml +0 -0
  296. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/schedule.yaml +0 -0
  297. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/schema.yaml +0 -0
  298. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/skill.yaml +0 -0
  299. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/snippet.yaml +0 -0
  300. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/support.yaml +0 -0
  301. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/template.yaml +0 -0
  302. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/token.yaml +0 -0
  303. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/trash.yaml +0 -0
  304. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/upgrade.yaml +0 -0
  305. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/user.yaml +0 -0
  306. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/version.yaml +0 -0
  307. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/webhook.yaml +0 -0
  308. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/workflow.yaml +0 -0
  309. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/commands/workspace.yaml +0 -0
  310. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/openapi-operations.yaml +0 -0
  311. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/manifests/schema-v1.json +0 -0
  312. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/spec/openapi/metadata.json +0 -0
  313. {mammoth_cli-2.2.91 → mammoth_cli-2.2.93}/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.91
3
+ Version: 2.2.93
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
@@ -18,7 +18,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
18
18
  Requires-Python: <3.15,>=3.12
19
19
  Requires-Dist: jsonschema>=4.20
20
20
  Requires-Dist: keyring<26,>=25.7
21
- Requires-Dist: mammoth-io<0.9,>=0.8.45
21
+ Requires-Dist: mammoth-io<0.9,>=0.8.46
22
22
  Requires-Dist: platformdirs<5,>=4.10
23
23
  Requires-Dist: pydantic<3,>=2.12.5
24
24
  Requires-Dist: pyyaml<7,>=6
@@ -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.91"
9
+ __version__ = "2.2.93"
10
10
 
11
11
  # The versioned machine output envelope contract.
12
12
  SCHEMA_VERSION = 1
@@ -428,6 +428,29 @@ def _global_option_flags() -> tuple[frozenset[str], frozenset[str]]:
428
428
  return frozenset(every), frozenset(valued)
429
429
 
430
430
 
431
+ def missing_argument_hint(tokens: Sequence[str]) -> str:
432
+ """The command's usage line and runnable example, for a ``missing_argument`` error.
433
+
434
+ The command is the longest run of leading words that names one; with none, the
435
+ generic pointer to the schema.
436
+ """
437
+ generic = "Check the command schema with 'mammoth schema get'."
438
+ path_to_command, _ = _command_tree()
439
+ words = [token for token in tokens if not token.startswith("-")]
440
+ for length in range(len(words), 0, -1):
441
+ command_id = path_to_command.get(tuple(words[:length]))
442
+ if command_id is None:
443
+ continue
444
+ slots = " ".join(
445
+ spec.metavar if spec.required else f"[{spec.metavar}]"
446
+ for spec in resolve_positionals(command_id)
447
+ )
448
+ usage = " ".join(part for part in ("mammoth", *words[:length], slots) if part)
449
+ example = (command_by_id(command_id) or {}).get("agent_example")
450
+ return f"Usage: {usage}." + (f" Example: {example}" if example else "")
451
+ return generic
452
+
453
+
431
454
  def _corrected_command(tokens: Sequence[str]) -> str | None:
432
455
  """Rebuild an invocation with leading global options moved after the command.
433
456
 
@@ -747,7 +770,7 @@ class _EnvelopeGroup(TyperGroup):
747
770
  code="missing_argument",
748
771
  message=error_message,
749
772
  exit_status=EXIT_USAGE,
750
- hint="Check the command schema with 'mammoth schema get'.",
773
+ hint=missing_argument_hint(tokens),
751
774
  )
752
775
  elif isinstance(error, _typer_click_exceptions.NoSuchOption):
753
776
  option = getattr(error, "option_name", None) or "unknown"
@@ -779,6 +802,8 @@ class _EnvelopeGroup(TyperGroup):
779
802
  executor.emit_error(report, machine=True)
780
803
  elif report is None:
781
804
  error.show()
805
+ if is_missing_parameter:
806
+ typer.echo(missing_argument_hint(tokens), err=True)
782
807
  else:
783
808
  # A no-subcommand error arrives with the help text already on
784
809
  # screen, so repeating "run --help" below it would be noise.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: mammoth-cli
3
- version: 2.2.91
3
+ version: 2.2.93
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
 
@@ -1,7 +1,7 @@
1
1
  # What is proven on release
2
2
 
3
3
  Generated from `docs/release-capability-matrix.json`; do not edit by hand.
4
- The CLI publishes 782 commands. 516 of them bind one of the 545 API operations in the matrix; the remainder are local commands (`schema`, `auth`, `doctor`, `log`, ...) or typed variants that share an operation (`view transform *` commands submit through `view.task.add`, except `rename-columns` and `sort`, which set view display properties through `view.update`). 262 bound commands ran once successfully on release, 1 are not supported there, and the rest are untried. Untried is not broken: discover the contract with `mammoth schema get COMMAND_ID`, run it, and treat the structured error envelope as the answer. Use an untried command normally: confirm a write with the user first, check its result with a read afterwards, and never refuse a command only because it is untried.
4
+ The CLI publishes 785 commands. 516 of them bind one of the 545 API operations in the matrix; the remainder are local commands (`schema`, `auth`, `doctor`, `log`, ...) or typed variants that share an operation (`view transform *` commands submit through `view.task.add`, except `rename-columns` and `sort`, which set view display properties through `view.update`). 262 bound commands ran once successfully on release, 1 are not supported there, and the rest are untried. Untried is not broken: discover the contract with `mammoth schema get COMMAND_ID`, run it, and treat the structured error envelope as the answer. Use an untried command normally: confirm a write with the user first, check its result with a read afterwards, and never refuse a command only because it is untried.
5
5
 
6
6
  Status meanings:
7
7
 
@@ -1,6 +1,6 @@
1
1
  # Published CLI command catalog
2
2
 
3
- This generated catalog is a lookup table for every command in the published CLI manifest, currently 782; each entry carries its release status line. It is a command-contract index, not an assertion that every backend/OpenAPI operation has a CLI binding. For an exact local CLI contract, run `mammoth schema get COMMAND_ID`; `mammoth capability list` is an API-binding inventory and can omit typed/local CLI routes. For focused workflows, read the [recipes index](recipes/index.md). Sensitive structured input must come from a private file or pipe; never put secrets in literal argv.
3
+ This generated catalog is a lookup table for every command in the published CLI manifest, currently 785; each entry carries its release status line. It is a command-contract index, not an assertion that every backend/OpenAPI operation has a CLI binding. For an exact local CLI contract, run `mammoth schema get COMMAND_ID`; `mammoth capability list` is an API-binding inventory and can omit typed/local CLI routes. For focused workflows, read the [recipes index](recipes/index.md). Sensitive structured input must come from a private file or pipe; never put secrets in literal argv.
4
4
 
5
5
  Load only the applicable domain file:
6
6
 
@@ -56,7 +56,7 @@ Load only the applicable domain file:
56
56
  - [user](commands/user.md) — 8 published commands
57
57
  - [version](commands/version.md) — 1 published commands
58
58
  - [view-transform](commands/view-transform.md) — 35 published commands
59
- - [view](commands/view.md) — 106 published commands
59
+ - [view](commands/view.md) — 109 published commands
60
60
  - [webhook](commands/webhook.md) — 7 published commands
61
61
  - [workflow](commands/workflow.md) — 23 published commands
62
62
  - [workspace](commands/workspace.md) — 33 published commands
@@ -122,6 +122,16 @@ Result: `ViewCheckpointUpdateResult`; mutation `benign_mutation`, confirmation `
122
122
 
123
123
  Status on release: ran once on CLI 2.0.18 — fixture-lifecycle sweep 2026-09-19: exit 0 on release with CLI 2.0.18. First attempt sending a full AddCheckpointSpec body (matching create's shape) failed with invalid_input_field_type; update actually needs body.patches[] (CheckpointPatches/CheckPointPatch…
124
124
 
125
+ ### `view.column.format.set`
126
+
127
+ Run: `mammoth view column format set`. Exact input fields: `mammoth schema get view.column.format.set`.
128
+
129
+ Example: `mammoth view column format set 123 --input '{"formats": {"Admitted": {"date_format": "%d-%b-%Y"}, "Revenue": {"decimal_spec": 2}}, "dataset_id": 456}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
130
+
131
+ Result: `ViewColumnFormatSetResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
132
+
133
+ Status on release: untried; no live run recorded.
134
+
125
135
  ### `view.compare`
126
136
 
127
137
  Run: `mammoth view compare`. Exact input fields: `mammoth schema get view.compare`.
@@ -162,6 +172,16 @@ Result: `ViewConditionalFormatListResult`; mutation `read`, confirmation `none`,
162
172
 
163
173
  Status on release: ran once on CLI 2.0.17 — re-verification 2026-09-18 (2.0.16 fixes): exit 0 on release with CLI 2.0.17. With SDK 0.7.9 the one existing rule is returned as [{rule_id, cf_type, FORMAT, CONDITION, ...}]; with SDK 0.7.8 the same call returned [] (mapping keyed by rule id was discarded).…
164
174
 
175
+ ### `view.conditional-format.replace`
176
+
177
+ Run: `mammoth view conditional-format replace`. Exact input fields: `mammoth schema get view.conditional-format.replace`.
178
+
179
+ Example: `mammoth view conditional-format replace 123 456 --input '{"columns": ["Q1", "Q2", "Q3"], "operator": "<", "value": 55, "color": "red"}' --yes`. Illustrative only: append `--yes` after observing an owned target.
180
+
181
+ Result: `ViewConditionalFormatReplaceResult`; mutation `destructive`, confirmation `prompt_or_yes`, wait policy `not_async`.
182
+
183
+ Status on release: untried; no live run recorded.
184
+
165
185
  ### `view.conditional-format.update`
166
186
 
167
187
  Run: `mammoth view conditional-format update`. Exact input fields: `mammoth schema get view.conditional-format.update`.
@@ -546,6 +566,16 @@ Result: `ViewExportDeleteResult`; mutation `external_effect`, confirmation `yes_
546
566
 
547
567
  Status on release: ran once on CLI 2.0.14 — write sweep 2026-09-18: exit 0 on release with CLI 2.0.14. Deleted export 2 -> {future_id:null,status:deleted,trigger_id:2}. Single invocation only.
548
568
 
569
+ ### `view.export.download`
570
+
571
+ Run: `mammoth view export download`. Exact input fields: `mammoth schema get view.export.download`.
572
+
573
+ Example: `mammoth view export download 123`. Placeholders are illustrative; resolve IDs and input from observed reads.
574
+
575
+ Result: `ViewExportDownloadResult`; mutation `benign_mutation`, confirmation `none`, wait policy `always_wait`.
576
+
577
+ Status on release: untried; no live run recorded.
578
+
549
579
  ### `view.export.elasticsearch`
550
580
 
551
581
  Run: `mammoth view export elasticsearch`. Exact input fields: `mammoth schema get view.export.elasticsearch`.
@@ -98,8 +98,10 @@ When several transforms go on the same view in a row (for example filter, sort,
98
98
  limit-rows), send them in one `view transform batch VIEW_ID --input '{"steps": [{"op":
99
99
  "filter", "input": {...}}, ...]}'` instead of one command each: the pipeline runs once and
100
100
  one verified outcome comes back (`row_check`, and `tasks` with each new task's status).
101
- Each `input` is what that `view transform` command takes. A step cannot use a column an
102
- earlier step of the batch creates: run those steps first. If a task fails, the batch's tasks
101
+ Each `input` is what that `view transform` command takes. A step can use the columns an
102
+ earlier step adds (`split`, `copy-columns`, or the `new_column` of `substring`, `extract-date`,
103
+ `increment-date`). `split`, `unnest` and `pivot` can be
104
+ batch steps too; `unnest` and `pivot` replace the view's columns, so they go last (and no `sort` step before them). If a task fails, the batch's tasks
103
105
  are removed and the error names `steps[i]`.
104
106
 
105
107
  Prefer a typed `view transform <operation>` command. Its schema is the
@@ -86,6 +86,14 @@ A TEXT column that writes numbers with a decimal comma (`1.234,5`) converts with
86
86
  defaults to the other mark). `view data profile` lists such a column under
87
87
  `summary.mixed_number_format` when its values mix notations.
88
88
 
89
+ A TEXT column of dates converts with `"to":"DATE"` and, on the same `conversions` entry,
90
+ `"input_formats":["DD/MM/YYYY","YYYY-MM-DD"]` (every layout the column mixes),
91
+ `"output_format":"DD-Mon-YYYY"` (how it displays) and
92
+ `"input_format_preference":"uk"` or `"us"` (which way `03/04/2024` reads). Formats are
93
+ Postgres date patterns.
94
+ `view column format set` changes only how a DATE or number column
95
+ shows, never its values.
96
+
89
97
  In a math `expression`, write a multi-word display name bare (`Quantity * Unit
90
98
  Price`) or quoted (`Quantity * \"Unit Price\"` inside the JSON string).
91
99
 
@@ -17,6 +17,7 @@ from mammoth_cli.errors.envelope import (
17
17
  CODE_INVALID_ARGUMENT,
18
18
  CODE_MISSING_ARGUMENT,
19
19
  CODE_MISSING_FIELD,
20
+ CODE_RESOURCE_NOT_FOUND,
20
21
  CODE_SDK_SYMBOL_UNRESOLVED,
21
22
  EXIT_USAGE,
22
23
  CliError,
@@ -28,6 +29,31 @@ from mammoth_cli.services.folder_ids import FolderIds
28
29
 
29
30
  HandlerResult = tuple[Any, dict[str, Any]]
30
31
 
32
+ #: The route's resource types are datasource, dataview, label, file_object, report and webhook;
33
+ #: these are the names a caller reaches for instead.
34
+ _RESOURCE_TYPE_ALIASES = {"dataset": "datasource", "folder": "label"}
35
+
36
+
37
+ def canonical_resource_type(value: str) -> str:
38
+ """``value`` (one type, or several joined by commas) with each alias as the route's name."""
39
+ return ",".join(
40
+ _RESOURCE_TYPE_ALIASES.get(part.strip(), part.strip()) for part in value.split(",")
41
+ )
42
+
43
+
44
+ def ancestors_needs_a_folder(error: CliError) -> CliError:
45
+ """``error`` (the 404 for an id that is no folder) as a message saying what to pass."""
46
+ return CliError(
47
+ code=error.code,
48
+ message="browse ancestors needs a FOLDER id; this id is not a folder.",
49
+ exit_status=error.exit_status,
50
+ hint=(
51
+ "A dataset or view has no ancestors of its own: run `mammoth browse resource "
52
+ "dataset ID` (or `dataview ID`) and pass the parent_resource_id it returns."
53
+ ),
54
+ details=error.details,
55
+ )
56
+
31
57
 
32
58
  def _symbol(invocation: Invocation) -> str:
33
59
  """Return the reviewed backing SDK symbol for this command."""
@@ -213,7 +239,8 @@ def browse_resource(invocation: Invocation) -> HandlerResult:
213
239
  )
214
240
  with open_service(invocation) as (service, auth):
215
241
  folders = FolderIds(service)
216
- if str(resource_type) == "label":
242
+ resource_type = canonical_resource_type(str(resource_type))
243
+ if resource_type == "label":
217
244
  object_id = folders.label(project_id, int(object_id))
218
245
  data = service.call(
219
246
  _symbol(invocation),
@@ -230,7 +257,14 @@ def browse_ancestors(invocation: Invocation) -> HandlerResult:
230
257
  project_id = require_project(invocation)
231
258
  resource_id = _require_int_positional(invocation, "resource id")
232
259
  with open_service(invocation) as (service, auth):
233
- found = service.call(_symbol(invocation), resource_id=resource_id, project_id=project_id)
260
+ try:
261
+ found = service.call(
262
+ _symbol(invocation), resource_id=resource_id, project_id=project_id
263
+ )
264
+ except CliError as exc:
265
+ if exc.code != CODE_RESOURCE_NOT_FOUND:
266
+ raise
267
+ raise ancestors_needs_a_folder(exc) from exc
234
268
  data = FolderIds(service).open_data(found, project_id)
235
269
  return data, _meta(invocation, auth.workspace_id, project_id)
236
270
 
@@ -238,7 +272,8 @@ def browse_ancestors(invocation: Invocation) -> HandlerResult:
238
272
  def browse_search(invocation: Invocation) -> HandlerResult:
239
273
  """Search resources across every project of the workspace (resources v2).
240
274
 
241
- ``resource_type`` ``dataset`` means the route's ``datasource``. Each dataset hit
275
+ ``resource_type`` ``dataset`` means the route's ``datasource``, ``folder`` its ``label``.
276
+ Each dataset hit
242
277
  carries ``dataset_id`` and each view hit ``view_id``: pass those, never the tree ``id``.
243
278
  """
244
279
  document = invocation.load_input() or {}
@@ -246,6 +281,8 @@ def browse_search(invocation: Invocation) -> HandlerResult:
246
281
  _forward_optional(
247
282
  document, kwargs, ("search", "resource_type", "cursor", "limit", "sort", "fields")
248
283
  )
284
+ if isinstance(kwargs.get("resource_type"), str):
285
+ kwargs["resource_type"] = canonical_resource_type(kwargs["resource_type"])
249
286
  with open_service(invocation) as (service, auth):
250
287
  data = FolderIds(service).open_data(service.call(_symbol(invocation), **kwargs), None)
251
288
  return _with_object_ids(data), _meta(invocation, auth.workspace_id, None)
@@ -618,10 +618,13 @@ def dashboard_share(invocation: Invocation) -> HandlerResult:
618
618
  assert document is not None
619
619
  _forward_optional(document, kwargs, ("users",))
620
620
  with open_service(invocation) as (service, auth):
621
+ was_published = _was_published(service, dashboard_id)
622
+ if not was_published:
623
+ refuse_viewer_share_before_publish(dashboard_id, type_of_auth, kwargs.get("users"))
621
624
  unpublished = (
622
625
  " (not published yet: sharing alone does not publish it; run dashboard action "
623
626
  'with {"action":"publish-presentation"} to publish)'
624
- if not _was_published(service, dashboard_id)
627
+ if not was_published
625
628
  else ""
626
629
  )
627
630
  enforce_confirmation(
@@ -638,6 +641,33 @@ def dashboard_share(invocation: Invocation) -> HandlerResult:
638
641
  return data, _meta(invocation, auth.workspace_id)
639
642
 
640
643
 
644
+ def refuse_viewer_share_before_publish(
645
+ dashboard_id: int, type_of_auth: str, users: list[dict[str, Any]] | None
646
+ ) -> None:
647
+ """Refuse, as the server does, a ``mammoth`` share that gives viewer access before a publish.
648
+
649
+ The server (``_apply_mammoth_recipients``) refuses the whole request when any user is
650
+ shared as a viewer (the default role) and the board has no published version.
651
+ """
652
+ if type_of_auth != "mammoth":
653
+ return
654
+ for user in users or []:
655
+ shared = user.get("shared", True)
656
+ shared = shared.lower() in ("true", "1", "yes", "on") if isinstance(shared, str) else shared
657
+ if shared and user.get("role") != "dashboard_editor":
658
+ raise CliError(
659
+ code="dashboard_not_published",
660
+ message=f"Dashboard {dashboard_id} is not published; viewers cannot be invited.",
661
+ exit_status=EXIT_USAGE,
662
+ hint=(
663
+ "Publish it first: mammoth dashboard action "
664
+ f'{dashboard_id} --input \'{{"action": "publish-presentation"}}\' --yes, '
665
+ "then share. Or share only users with role dashboard_editor."
666
+ ),
667
+ details={"dashboard_id": dashboard_id},
668
+ )
669
+
670
+
641
671
  def _share_readback(service: Any, dashboard_id: int) -> dict[str, Any]:
642
672
  """The board's share state as ``dashboard get`` reports it after a share."""
643
673
  board = _dump_model(service.call(_DASHBOARD_GET, dashboard_id=dashboard_id))
@@ -35,7 +35,7 @@ from mammoth_cli.runtime.confirm import (
35
35
  )
36
36
  from mammoth_cli.runtime.invocation import Invocation
37
37
  from mammoth_cli.runtime.new_data import with_file_upload_path
38
- from mammoth_cli.runtime.session import open_service, require_project
38
+ from mammoth_cli.runtime.session import open_service, require_project, resolved_project
39
39
  from mammoth_cli.services.delete_check import ensure_deleted, find_dependents
40
40
  from mammoth_cli.services.field_enums import DATA_PULL_FILE_VALUES, allowed_values_text
41
41
  from mammoth_cli.services.listing import (
@@ -761,17 +761,22 @@ def dataset_list(invocation: Invocation) -> HandlerResult:
761
761
  datasets" never needs paging: read ``total`` with the first page's newest names.
762
762
  For a list of names (e.g. "which files can I see?") pass ``names: true``: ONE call
763
763
  returns up to 500 bare ``{id, name}`` rows, newest first, with ``total`` and ``more``.
764
+ With no project set it returns ``{project_id, project_name, id, name}`` rows from every
765
+ project the caller can open, from one workspace search (the newest 500 at most).
764
766
  ``full: true`` returns the raw ``{id, name}`` list instead. ``name`` keeps only datasets
765
767
  whose name contains it (case-insensitive) across every page, as short rows without
766
768
  column lists; ``limit``/``offset`` then page over the matches.
767
769
  """
768
- project_id = require_project(invocation)
769
770
  document = invocation.load_input() or {}
771
+ name = document.get("name")
772
+ wants_names = document.get("names") and not (isinstance(name, str) and name.strip())
773
+ if wants_names and resolved_project(invocation) is None:
774
+ return _dataset_names_everywhere(invocation)
775
+ project_id = require_project(invocation)
770
776
  _validate_paging(document)
771
777
  kwargs: dict[str, Any] = {"project_id": project_id}
772
778
  _forward_optional(document, kwargs, ("limit", "offset", "sort"))
773
- name = document.get("name")
774
- if document.get("names") and not (isinstance(name, str) and name.strip()):
779
+ if wants_names:
775
780
  return _dataset_names(invocation, project_id, document)
776
781
  if isinstance(name, str) and name.strip():
777
782
  return _dataset_name_search(invocation, project_id, name.strip(), document)
@@ -817,6 +822,42 @@ def _dataset_names(
817
822
  return result, _meta(invocation, auth.workspace_id, project_id)
818
823
 
819
824
 
825
+ def _dataset_names_everywhere(invocation: Invocation) -> HandlerResult:
826
+ """``dataset list`` with ``names`` and no project: the names of every reachable project.
827
+
828
+ One workspace search (100 hits a page, the route's cap) lists the datasets of the
829
+ projects the caller can open, under the same access rules as ``project list``; one
830
+ ``project list`` read supplies the project names. Capped at ``_SEARCH_PAGES`` pages.
831
+ """
832
+ with open_service(invocation) as (service, auth):
833
+ hits, cut = search_hits(service, "datasource", "", fields="minimal")
834
+ names = {p.get("id"): p.get("name") for p in _visible_projects(service)}
835
+ rows = [
836
+ {
837
+ "project_id": hit["project_id"],
838
+ "project_name": names[hit["project_id"]],
839
+ "id": hit["object_id"],
840
+ "name": hit.get("name"),
841
+ }
842
+ for hit in hits
843
+ if hit.get("project_id") in names
844
+ ]
845
+ kept, _cut = fit_budget(rows[:NAMES_MAX_ROWS], budget=NAMES_DATA_BUDGET)
846
+ result: dict[str, Any] = {
847
+ "datasets": kept,
848
+ "shown": len(kept),
849
+ "total": len(rows),
850
+ "projects": len({row["project_id"] for row in rows}),
851
+ }
852
+ if cut or len(kept) < len(rows):
853
+ result["more"] = True
854
+ result["note"] = (
855
+ f"Only the newest {len(kept)} names were read; pass --project to list one "
856
+ "project's names, or name to find one."
857
+ )
858
+ return result, _meta(invocation, auth.workspace_id, None)
859
+
860
+
820
861
  def _dataset_total(service: Any, project_id: int, page: dict[str, Any], offset: int) -> int:
821
862
  """The project's whole dataset count. The list route sends none, so a page that
822
863
  is the last one counts itself; otherwise the ids are read once, here, in one call."""
@@ -1036,6 +1077,45 @@ def _validate_paging(document: dict[str, Any]) -> None:
1036
1077
  )
1037
1078
 
1038
1079
 
1080
+ def _batch_column_ids(
1081
+ service: Any, dataset_id: int, project_id: int, columns: str | list[str]
1082
+ ) -> str:
1083
+ """The comma-separated column ids the batch-data route wants, from names or ids."""
1084
+ response = service.call(_DATASET_GET_SYMBOL, dataset_id=dataset_id, project_id=project_id)
1085
+ dataset = response.get("dataset", response) if isinstance(response, dict) else {}
1086
+ schema = dataset.get("data_schema") if isinstance(dataset, dict) else None
1087
+ return resolve_batch_columns(schema, dataset_id, columns)
1088
+
1089
+
1090
+ def resolve_batch_columns(schema: Any, dataset_id: int, columns: str | list[str]) -> str:
1091
+ """Column ids, comma-separated, for names or ids in ``columns`` (a list or one string).
1092
+
1093
+ The batch-data route refuses display names with a bare "invalid columns"; the dataset
1094
+ schema maps each ``c_name`` to its ``c_id``. An id passes through; a name the schema
1095
+ lacks is refused with the names it has.
1096
+ """
1097
+ if not isinstance(schema, list):
1098
+ raise CliError(
1099
+ code=CODE_API_ERROR,
1100
+ message=f"Could not read dataset {dataset_id}'s columns to resolve 'columns'.",
1101
+ exit_status=EXIT_API,
1102
+ )
1103
+ wanted = [n.strip() for n in columns.split(",")] if isinstance(columns, str) else columns
1104
+ ids = {c["c_id"] for c in schema if isinstance(c, dict) and "c_id" in c}
1105
+ by_name = {c["c_name"]: c["c_id"] for c in schema if isinstance(c, dict) and "c_name" in c}
1106
+ resolved = [name if name in ids else by_name.get(name) for name in wanted]
1107
+ missing = [name for name, found in zip(wanted, resolved, strict=True) if found is None]
1108
+ if missing:
1109
+ raise CliError(
1110
+ code="unknown_column",
1111
+ message=f"Column(s) not in dataset {dataset_id}: {', '.join(missing)}.",
1112
+ exit_status=EXIT_USAGE,
1113
+ hint="Use column names or ids from `mammoth dataset get`.",
1114
+ details={"columns": missing, "available": sorted(by_name)},
1115
+ )
1116
+ return ",".join(str(found) for found in resolved)
1117
+
1118
+
1039
1119
  def dataset_batch_data(invocation: Invocation) -> HandlerResult:
1040
1120
  """Fetch data for a specific dataset batch."""
1041
1121
  project_id = require_project(invocation)
@@ -1050,6 +1130,9 @@ def dataset_batch_data(invocation: Invocation) -> HandlerResult:
1050
1130
  }
1051
1131
  _forward_optional(document, kwargs, ("columns", "limit", "offset", "timeout", "poll_interval"))
1052
1132
  with open_service(invocation) as (service, auth):
1133
+ if kwargs.get("columns"):
1134
+ columns = kwargs["columns"]
1135
+ kwargs["columns"] = _batch_column_ids(service, dataset_id, project_id, columns)
1053
1136
  data = service.call(_symbol(invocation), **kwargs)
1054
1137
  return data, _meta(invocation, auth.workspace_id, project_id)
1055
1138
 
@@ -583,10 +583,12 @@
583
583
  "view.checkpoint.get": "Get one checkpoint by id.",
584
584
  "view.checkpoint.list": "List checkpoints on a dataview, with optional filters from '--input'.",
585
585
  "view.checkpoint.update": "Update one checkpoint by id. 'body' is required.",
586
+ "view.column.format.set": "Set how columns display (date or number format; a view display setting, not a task).",
586
587
  "view.compare": "Compare dataviews pairwise: rows, column differences and checksums (read-only).",
587
588
  "view.conditional-format.create": "Colour cells in many columns by one threshold in a single command (columns + operator + value + color): each cell is judged by its own value. applies_to=row colours whole rows when any/all of the columns match.",
588
589
  "view.conditional-format.delete-all": "Delete a conditional-format rule on a dataview. Prompt or '--yes'.",
589
590
  "view.conditional-format.list": "List conditional-format rules on a dataview.",
591
+ "view.conditional-format.replace": "Replace every conditional-format rule on a view with new ones in one call.",
590
592
  "view.conditional-format.update": "Update a conditional-format rule on a dataview. 'rule' is required.",
591
593
  "view.create": "Create a view from a dataset. Dataset id is positional; name/clone_from optional.",
592
594
  "view.data-check.create": "Create a data check on a dataview. 'body' is required.",
@@ -625,6 +627,7 @@
625
627
  "view.export.csv": "Export a dataview to a local CSV file.",
626
628
  "view.export.dataset": "Run one of the SDK's typed 'View.export' destination helpers.",
627
629
  "view.export.delete": "Delete one export by id. Always requires '--yes'.",
630
+ "view.export.download": "Download a dataview to a local file as csv, xlsx, json, ndjson, xml, yaml or parquet.",
628
631
  "view.export.elasticsearch": "Run one of the SDK's typed 'View.export' destination helpers.",
629
632
  "view.export.email": "Run one of the SDK's typed 'View.export' destination helpers.",
630
633
  "view.export.ftp": "Run one of the SDK's typed 'View.export' destination helpers.",
@@ -689,7 +692,7 @@
689
692
  "view.transform.increment-date": "Increment a date column. 'column'/'delta' required.",
690
693
  "view.transform.join": "Join another view. 'foreign_view'/'join_type'/'on'/'select' required.",
691
694
  "view.transform.json-extract": "Extract fields from a JSON column. 'column' is required.",
692
- "view.transform.limit-rows": "Limit the row count. 'n' is required.",
695
+ "view.transform.limit-rows": "Limit the row count. 'n' (or its alias 'limit') is required.",
693
696
  "view.transform.lookup": "Look up values from another view. 'source'/'lookup_view_id'/'key'/",
694
697
  "view.transform.math": "Evaluate a math expression into a column. 'expression' is required.",
695
698
  "view.transform.pivot": "Pivot with aggregations. 'group_by'/'aggregations' required.",
@@ -885,6 +885,9 @@ _TARGETS: dict[str, str] = {
885
885
  "mammoth_cli.commands.view:view_conditional_format_delete_all"
886
886
  ),
887
887
  "view.conditional-format.list": "mammoth_cli.commands.view:view_conditional_format_list",
888
+ "view.conditional-format.replace": (
889
+ "mammoth_cli.commands.view:view_conditional_format_replace"
890
+ ),
888
891
  "view.conditional-format.update": "mammoth_cli.commands.view:view_conditional_format_update",
889
892
  "view.checkpoint.create": "mammoth_cli.commands.view:view_checkpoint_create",
890
893
  "view.checkpoint.delete": "mammoth_cli.commands.view:view_checkpoint_delete",
@@ -924,6 +927,7 @@ _TARGETS: dict[str, str] = {
924
927
  "view.task.update": "mammoth_cli.commands.view:view_task_update",
925
928
  "view.export.create": "mammoth_cli.commands.view:view_export_create",
926
929
  "view.export.csv": "mammoth_cli.commands.view:view_export_csv",
930
+ "view.export.download": "mammoth_cli.commands.view:view_export_download",
927
931
  "view.export.delete": "mammoth_cli.commands.view:view_export_delete",
928
932
  "view.export.get": "mammoth_cli.commands.view:view_export_get",
929
933
  "view.export.list": "mammoth_cli.commands.view:view_export_list",
@@ -1005,6 +1009,7 @@ _TARGETS: dict[str, str] = {
1005
1009
  "view.transform.generate-sql": "mammoth_cli.commands.view_ops:view_transform_generate_sql",
1006
1010
  "view.transform.increment-date": "mammoth_cli.commands.view_ops:view_transform_increment_date",
1007
1011
  "view.transform.join": "mammoth_cli.commands.view_ops:view_transform_join",
1012
+ "view.column.format.set": "mammoth_cli.commands.view_ops:view_column_format_set",
1008
1013
  "view.transform.json-extract": "mammoth_cli.commands.view_ops:view_transform_json_extract",
1009
1014
  "view.transform.limit-rows": "mammoth_cli.commands.view_ops:view_transform_limit_rows",
1010
1015
  "view.transform.lookup": "mammoth_cli.commands.view_ops:view_transform_lookup",
@@ -224,6 +224,10 @@ _COMMAND_DISCOVERY_PURPOSES = {
224
224
  "file.delete": "delete remove uploaded source file csv",
225
225
  "file.list": "list show uploaded source files csv",
226
226
  "view.export.csv": "export download local CSV file artifact",
227
+ "view.export.download": (
228
+ "export download local file artifact xlsx excel json ndjson xml yaml parquet "
229
+ "file type format"
230
+ ),
227
231
  "view.export.dataset": (
228
232
  "send copy branch out create save the result rows into a new project from an "
229
233
  "existing append appending union stack monthly rows across datasets views "
@@ -431,6 +435,15 @@ _COMMAND_DISCOVERY_PURPOSES = {
431
435
  "view.transform.rename-columns": (
432
436
  "rename column columns header headers relabel change column name names title"
433
437
  ),
438
+ "view.column.format.set": (
439
+ "format display column date format number format decimals decimal places currency "
440
+ "symbol percent percentage thousands separator show dates as how values look grid "
441
+ "date display"
442
+ ),
443
+ "view.conditional-format.replace": (
444
+ "replace redo reset change all conditional formatting rules highlight colour color "
445
+ "existing rules in one call"
446
+ ),
434
447
  "view.transform.replace": "find replace substitute text value in columns",
435
448
  "view.transform.set-values": (
436
449
  "set values assign overwrite blank empty default where condition label "
@@ -952,7 +965,8 @@ IN_PLACE_RECIPE = (
952
965
  "EDITS THE GIVEN VIEW IN PLACE: this adds a step to the view and changes that view "
953
966
  "and its dataset's output. To make a NEW dataset and leave the source untouched: "
954
967
  "`mammoth view create SOURCE_DATASET_ID` (working view), do the steps on that working "
955
- "view, then `mammoth view export dataset WORKING_VIEW_ID` (add dataset_name only if the user named it)."
968
+ "view, then `mammoth view export dataset WORKING_VIEW_ID` "
969
+ "(add dataset_name only if the user named it)."
956
970
  )
957
971
  _IN_PLACE_KEYWORDS = (
958
972
  "new dataset create make in place edits given view working view source untouched"
@@ -1183,17 +1197,53 @@ def _accepted_fields(record: dict[str, Any]) -> list[dict[str, Any]] | None:
1183
1197
  ]
1184
1198
 
1185
1199
 
1200
+ _INLINE_SCHEMA_MAX_CHARS = 3000
1201
+ #: A restrictions note (where a nested input shape often lives) is inlined up to this long.
1202
+ _INLINE_NOTES_MAX_CHARS = 700
1203
+
1204
+
1186
1205
  def _compact_accepted_fields(record: dict[str, Any]) -> list[dict[str, Any]] | None:
1187
- """``_accepted_fields`` without the per-field JSON Schema.
1206
+ """``_accepted_fields`` with a nested JSON Schema only where the type name is not enough.
1188
1207
 
1189
1208
  A find result inlines this for its top matches: enough to compose a call
1190
- (name, type, required, enum) without the nested-schema detail ``schema
1191
- get`` returns.
1209
+ (name, type, required, enum) without a follow-up ``schema get``. A
1210
+ non-scalar field (e.g. convert-type's ``conversions``) also carries its
1211
+ JSON Schema, unless that would be larger than ``_INLINE_SCHEMA_MAX_CHARS``.
1192
1212
  """
1193
1213
  fields = _accepted_fields(record)
1194
1214
  if fields is None:
1195
1215
  return None
1196
- return [{key: field[key] for key in ("name", "type", "required", "enum")} for field in fields]
1216
+ compact: list[dict[str, Any]] = []
1217
+ for field in fields:
1218
+ item = {key: field[key] for key in ("name", "type", "required", "enum")}
1219
+ schema = field.get("schema")
1220
+ if (
1221
+ schema is not None
1222
+ and not _is_scalar_field_schema(schema)
1223
+ and len(json.dumps(schema, default=str)) <= _INLINE_SCHEMA_MAX_CHARS
1224
+ ):
1225
+ item["schema"] = schema
1226
+ compact.append(item)
1227
+ return compact
1228
+
1229
+
1230
+ def input_contract(command_id: str) -> dict[str, Any] | None:
1231
+ """The input shape a rejected call should have used: fields (with nested shapes) and an example.
1232
+
1233
+ Attached to input-validation errors so the caller can correct the call
1234
+ without a ``schema get`` round trip. ``None`` for a command with no
1235
+ manifest record or no accepted fields.
1236
+ """
1237
+ record = command_by_id(command_id)
1238
+ if record is None:
1239
+ return None
1240
+ fields = _compact_accepted_fields(record)
1241
+ if fields is None:
1242
+ return None
1243
+ contract: dict[str, Any] = {"command_id": command_id, "accepted_fields": fields}
1244
+ if record.get("agent_example"):
1245
+ contract["agent_example"] = record["agent_example"]
1246
+ return contract
1197
1247
 
1198
1248
 
1199
1249
  def _externally_supplied_fields(command_id: str) -> frozenset[str]:
@@ -2215,6 +2265,10 @@ def _inline_call_detail(entries: list[dict[str, Any]]) -> None:
2215
2265
  entry["accepted_fields"] = fields
2216
2266
  if record.get("agent_example"):
2217
2267
  entry["agent_example"] = record["agent_example"]
2268
+ notes = record.get("known_restrictions")
2269
+ if isinstance(notes, str) and notes:
2270
+ cut = notes[:_INLINE_NOTES_MAX_CHARS]
2271
+ entry["known_restrictions"] = cut + ("..." if len(notes) > len(cut) else "")
2218
2272
 
2219
2273
 
2220
2274
  def _inline_picks(page: list[dict[str, Any]], offset: int) -> list[dict[str, Any]]: