mammoth-cli 2.2.92__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.92 → mammoth_cli-2.2.93}/PKG-INFO +2 -2
  2. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +1 -1
  4. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +1 -1
  5. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +2 -2
  6. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +30 -0
  7. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +8 -0
  8. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/dataset.py +42 -0
  9. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/help_summaries.json +3 -0
  10. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/registry.py +5 -0
  11. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/schema.py +59 -5
  12. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/view.py +115 -18
  13. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_ops.py +11 -1
  14. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/errors/envelope.py +4 -1
  15. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/executor.py +29 -0
  16. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/strict.py +17 -0
  17. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/command_contract.py +2 -1
  18. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/conditions.py +17 -0
  19. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/input_fields.py +10 -1
  20. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/positionals.py +3 -1
  21. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/pyproject.toml +2 -2
  22. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/dataset.yaml +1 -1
  23. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/view.yaml +158 -1
  24. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/edits-target.source.yaml +2 -0
  25. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/sdk-catalog.source.yaml +24 -0
  26. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/sdk-methods.yaml +53 -1
  27. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/.gitignore +0 -0
  28. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/LICENSE +0 -0
  29. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/README.md +0 -0
  30. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/__main__.py +0 -0
  31. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/app.py +0 -0
  32. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
  33. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  34. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
  35. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  36. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  37. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  38. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  39. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  40. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  41. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  42. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  43. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  44. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  45. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
  46. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capabilities.md +0 -0
  47. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  48. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  49. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/collection.md +0 -0
  50. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  51. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  52. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  53. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  54. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-embed.md +0 -0
  55. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-published.md +0 -0
  56. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
  57. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +0 -0
  58. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-template.md +0 -0
  59. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
  60. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  61. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  62. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  63. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  64. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  65. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  66. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/how.md +0 -0
  67. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  68. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/link.md +0 -0
  69. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  70. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  71. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  72. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
  73. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  74. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/resolve.md +0 -0
  75. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  76. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  77. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  78. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  79. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  80. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  81. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/token.md +0 -0
  82. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  83. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  84. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  85. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  86. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
  87. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  88. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  89. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  90. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  91. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
  92. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  93. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  94. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  95. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  96. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/build-an-agent.md +0 -0
  97. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  98. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
  99. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/database-import.md +0 -0
  100. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
  101. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  102. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/file-import.md +0 -0
  103. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  104. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  105. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  106. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/rest-api-import.md +0 -0
  107. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
  108. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  109. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  110. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  111. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  112. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  113. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
  114. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/__init__.py +0 -0
  115. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/_lazy.py +0 -0
  116. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/activity.py +0 -0
  117. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/addon.py +0 -0
  118. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/agent.py +0 -0
  119. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/ai.py +0 -0
  120. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/annotation.py +0 -0
  121. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/auth.py +0 -0
  122. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/automation.py +0 -0
  123. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/batch.py +0 -0
  124. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/billing.py +0 -0
  125. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/browse.py +0 -0
  126. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/calc.py +0 -0
  127. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/capabilities.py +0 -0
  128. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/capability.py +0 -0
  129. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/client_app.py +0 -0
  130. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/completion.py +0 -0
  131. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/config.py +0 -0
  132. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/connector.py +0 -0
  133. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/context.py +0 -0
  134. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/dashboard.py +0 -0
  135. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/data_app.py +0 -0
  136. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/doctor.py +0 -0
  137. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/external_key.py +0 -0
  138. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/file.py +0 -0
  139. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/folder.py +0 -0
  140. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/how.py +0 -0
  141. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/job.py +0 -0
  142. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/link.py +0 -0
  143. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/notification.py +0 -0
  144. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/parameter.py +0 -0
  145. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/project.py +0 -0
  146. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/report.py +0 -0
  147. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/resolve.py +0 -0
  148. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/schedule.py +0 -0
  149. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/skill.py +0 -0
  150. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/snippet.py +0 -0
  151. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/support.py +0 -0
  152. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/template.py +0 -0
  153. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/trash.py +0 -0
  154. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/upgrade.py +0 -0
  155. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/user.py +0 -0
  156. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_drivers.py +0 -0
  157. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_explore.py +0 -0
  158. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_forecast.py +0 -0
  159. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/view_profile.py +0 -0
  160. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/webhook.py +0 -0
  161. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/workflow.py +0 -0
  162. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/commands/workspace.py +0 -0
  163. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/context/__init__.py +0 -0
  164. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/context/credentials.py +0 -0
  165. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/context/endpoint.py +0 -0
  166. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/context/keyring_backend.py +0 -0
  167. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/context/oauth.py +0 -0
  168. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/context/profiles.py +0 -0
  169. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/context/resolver.py +0 -0
  170. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/contracts/__init__.py +0 -0
  171. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/contracts/auth.py +0 -0
  172. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/discovery/__init__.py +0 -0
  173. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/discovery/limitations.json +0 -0
  174. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/discovery/next_commands.json +0 -0
  175. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/discovery/recipes.json +0 -0
  176. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/embed.py +0 -0
  177. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/errors/__init__.py +0 -0
  178. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/manifest/__init__.py +0 -0
  179. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/manifest/loader.py +0 -0
  180. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/messages/__init__.py +0 -0
  181. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/output/__init__.py +0 -0
  182. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/output/envelope.py +0 -0
  183. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/output/normalize.py +0 -0
  184. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/output/policy.py +0 -0
  185. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/output/progress.py +0 -0
  186. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/output/render.py +0 -0
  187. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/py.typed +0 -0
  188. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/__init__.py +0 -0
  189. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/compact.py +0 -0
  190. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/confirm.py +0 -0
  191. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/dataset_health.py +0 -0
  192. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/dryrun.py +0 -0
  193. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/dryrun_targets.py +0 -0
  194. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/embedded.py +0 -0
  195. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/input_loader.py +0 -0
  196. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/intent_only.py +0 -0
  197. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/invocation.py +0 -0
  198. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/labels.py +0 -0
  199. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/locked_files.py +0 -0
  200. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/new_data.py +0 -0
  201. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/next_commands.py +0 -0
  202. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/opens.py +0 -0
  203. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/options.py +0 -0
  204. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/parents.py +0 -0
  205. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/runlog.py +0 -0
  206. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/session.py +0 -0
  207. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/shared.py +0 -0
  208. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/state.py +0 -0
  209. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/token_scope.py +0 -0
  210. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/updates.py +0 -0
  211. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/validate.py +0 -0
  212. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/runtime/verify.py +0 -0
  213. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/__init__.py +0 -0
  214. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/append_blank_columns.py +0 -0
  215. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/argspec.py +0 -0
  216. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/board_values.py +0 -0
  217. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/coerce.py +0 -0
  218. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/column_type_guard.py +0 -0
  219. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/conditional_format.py +0 -0
  220. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/dashboard_figures.py +0 -0
  221. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/dashboard_filters.py +0 -0
  222. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/dashboard_pages.py +0 -0
  223. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/dashboard_review.py +0 -0
  224. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/data_profile.py +0 -0
  225. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/data_quality.py +0 -0
  226. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/delete_check.py +0 -0
  227. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/dispatch.py +0 -0
  228. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/explore_card_edit.py +0 -0
  229. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/explore_cards.py +0 -0
  230. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/explore_to_figure.py +0 -0
  231. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/explore_to_image.py +0 -0
  232. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/factory.py +0 -0
  233. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/field_enums.py +0 -0
  234. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/folder_ids.py +0 -0
  235. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/job_outcome.py +0 -0
  236. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/listing.py +0 -0
  237. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/local_files.py +0 -0
  238. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/local_time.py +0 -0
  239. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/mapping.py +0 -0
  240. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/openapi_types.py +0 -0
  241. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/paging.py +0 -0
  242. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/period_analysis.py +0 -0
  243. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/poll.py +0 -0
  244. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/protocol.py +0 -0
  245. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/read_memo.py +0 -0
  246. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/read_queries.py +0 -0
  247. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/schema_diff.py +0 -0
  248. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/sdk_service.py +0 -0
  249. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/sql_check.py +0 -0
  250. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/stored_stats.py +0 -0
  251. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/suggest.py +0 -0
  252. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/testing.py +0 -0
  253. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/text_dates.py +0 -0
  254. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/type_system.py +0 -0
  255. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/view_analysis.py +0 -0
  256. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/view_variants.py +0 -0
  257. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/services/write_impact.py +0 -0
  258. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/skills/__init__.py +0 -0
  259. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/skills/installer.py +0 -0
  260. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/skills/steering.py +0 -0
  261. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/mammoth_cli/testing.py +0 -0
  262. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/activity.yaml +0 -0
  263. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/addon.yaml +0 -0
  264. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/agent.yaml +0 -0
  265. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/ai.yaml +0 -0
  266. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/annotation.yaml +0 -0
  267. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/auth.yaml +0 -0
  268. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/automation.yaml +0 -0
  269. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/batch.yaml +0 -0
  270. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/billing.yaml +0 -0
  271. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/browse.yaml +0 -0
  272. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/calc.yaml +0 -0
  273. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/capabilities.yaml +0 -0
  274. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/capability.yaml +0 -0
  275. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/client-app.yaml +0 -0
  276. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/collection.yaml +0 -0
  277. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/completion.yaml +0 -0
  278. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/config.yaml +0 -0
  279. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/connector.yaml +0 -0
  280. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/context.yaml +0 -0
  281. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/dashboard.yaml +0 -0
  282. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/data-app.yaml +0 -0
  283. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/doctor.yaml +0 -0
  284. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/external-key.yaml +0 -0
  285. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/file.yaml +0 -0
  286. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/folder.yaml +0 -0
  287. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/how.yaml +0 -0
  288. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/job.yaml +0 -0
  289. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/link.yaml +0 -0
  290. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/log.yaml +0 -0
  291. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/notification.yaml +0 -0
  292. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/parameter.yaml +0 -0
  293. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/project.yaml +0 -0
  294. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/report.yaml +0 -0
  295. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/resolve.yaml +0 -0
  296. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/schedule.yaml +0 -0
  297. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/schema.yaml +0 -0
  298. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/skill.yaml +0 -0
  299. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/snippet.yaml +0 -0
  300. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/support.yaml +0 -0
  301. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/template.yaml +0 -0
  302. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/token.yaml +0 -0
  303. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/trash.yaml +0 -0
  304. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/upgrade.yaml +0 -0
  305. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/user.yaml +0 -0
  306. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/version.yaml +0 -0
  307. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/webhook.yaml +0 -0
  308. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/workflow.yaml +0 -0
  309. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/commands/workspace.yaml +0 -0
  310. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/openapi-operations.yaml +0 -0
  311. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/manifests/schema-v1.json +0 -0
  312. {mammoth_cli-2.2.92 → mammoth_cli-2.2.93}/spec/openapi/metadata.json +0 -0
  313. {mammoth_cli-2.2.92 → 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.92
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.92"
9
+ __version__ = "2.2.93"
10
10
 
11
11
  # The versioned machine output envelope contract.
12
12
  SCHEMA_VERSION = 1
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: mammoth-cli
3
- version: 2.2.92
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`.
@@ -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
 
@@ -1077,6 +1077,45 @@ def _validate_paging(document: dict[str, Any]) -> None:
1077
1077
  )
1078
1078
 
1079
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
+
1080
1119
  def dataset_batch_data(invocation: Invocation) -> HandlerResult:
1081
1120
  """Fetch data for a specific dataset batch."""
1082
1121
  project_id = require_project(invocation)
@@ -1091,6 +1130,9 @@ def dataset_batch_data(invocation: Invocation) -> HandlerResult:
1091
1130
  }
1092
1131
  _forward_optional(document, kwargs, ("columns", "limit", "offset", "timeout", "poll_interval"))
1093
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)
1094
1136
  data = service.call(_symbol(invocation), **kwargs)
1095
1137
  return data, _meta(invocation, auth.workspace_id, project_id)
1096
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.",
@@ -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]]:
@@ -1446,6 +1446,7 @@ def view_data_get(invocation: Invocation) -> HandlerResult:
1446
1446
  )
1447
1447
  page_size = _DATA_PAGE_ROWS if whole_view else kwargs["limit"]
1448
1448
  data = _trim_rows(data, limit, page_size)
1449
+ data = keep_columns(data, document.get("columns"))
1449
1450
  if document.get("sequence") is None:
1450
1451
  # The view's row count is its latest step's; a read at an earlier step differs.
1451
1452
  data = _with_paging_total(data, meta)
@@ -1467,6 +1468,34 @@ def _page_offset(value: Any) -> int:
1467
1468
  return offset
1468
1469
 
1469
1470
 
1471
+ def keep_columns(data: Any, columns: list[str] | None) -> Any:
1472
+ """Keep only ``columns`` (display names) in a data page's rows and column header.
1473
+
1474
+ A name the page does not have is refused with the names it does have, so a typo
1475
+ never reads as an empty column.
1476
+ """
1477
+ if columns is None or not isinstance(data, dict):
1478
+ return data
1479
+ rows = data.get(_ROWS_KEY)
1480
+ if not isinstance(rows, list):
1481
+ return data
1482
+ first = rows[0] if rows else None
1483
+ available = list(first) if isinstance(first, dict) else list(data.get(_COLUMNS_KEY) or [])
1484
+ missing = [name for name in columns if name not in available]
1485
+ if missing:
1486
+ raise CliError(
1487
+ code="unknown_column",
1488
+ message=f"Column(s) not in the view: {', '.join(missing)}.",
1489
+ exit_status=EXIT_USAGE,
1490
+ hint="Use column display names from this view.",
1491
+ details={"columns": missing, "available": available},
1492
+ )
1493
+ kept = {**data, _ROWS_KEY: DataRows([{c: row[c] for c in columns} for row in rows])}
1494
+ if isinstance(data.get(_COLUMNS_KEY), list):
1495
+ kept[_COLUMNS_KEY] = list(columns)
1496
+ return kept
1497
+
1498
+
1470
1499
  def _with_cli_paging(
1471
1500
  data: Any,
1472
1501
  invocation: Invocation,
@@ -2816,6 +2845,47 @@ def view_conditional_format_create(invocation: Invocation) -> HandlerResult:
2816
2845
  project_id = require_project(invocation)
2817
2846
  dataview_id = _require_int_positional_at(invocation, 0, "view id")
2818
2847
  document = invocation.load_input() or {}
2848
+ has_typed = _cf_check_document(document)
2849
+ with open_service(invocation) as (service, auth):
2850
+ dataset_id = _resolve_dataset_id(service, invocation, dataview_id, document)
2851
+ rules = _cf_rules_for_document(
2852
+ service, document, has_typed, (dataset_id, dataview_id, project_id)
2853
+ )
2854
+ data = _create_cf_rules(service, invocation, rules, (dataset_id, dataview_id, project_id))
2855
+ return data, _meta(invocation, auth.workspace_id, project_id)
2856
+
2857
+
2858
+ def view_conditional_format_replace(invocation: Invocation) -> HandlerResult:
2859
+ """Replace every conditional-format rule on a view with new ones in one call.
2860
+
2861
+ Takes the input of ``view conditional-format create`` (typed fields or a raw ``rule``);
2862
+ the old rules are deleted and the new ones created. Prompt or ``--yes``.
2863
+ """
2864
+ project_id = require_project(invocation)
2865
+ dataview_id = _require_int_positional_at(invocation, 0, "view id")
2866
+ document = invocation.load_input() or {}
2867
+ has_typed = _cf_check_document(document)
2868
+ with open_service(invocation) as (service, auth):
2869
+ dataset_id = _resolve_dataset_id(service, invocation, dataview_id, document)
2870
+ scope = (dataset_id, dataview_id, project_id)
2871
+ rules = _cf_rules_for_document(service, document, has_typed, scope)
2872
+ enforce_confirmation(
2873
+ invocation,
2874
+ policy=POLICY_PROMPT_OR_YES,
2875
+ action=f"replace all conditional-format rules on view {dataview_id}",
2876
+ )
2877
+ data = service.call(
2878
+ _symbol(invocation),
2879
+ dataset_id=dataset_id,
2880
+ dataview_id=dataview_id,
2881
+ rules=rules,
2882
+ project_id=project_id,
2883
+ )
2884
+ return data, _meta(invocation, auth.workspace_id, project_id)
2885
+
2886
+
2887
+ def _cf_check_document(document: dict[str, Any]) -> bool:
2888
+ """Whether the input uses the typed fields; refuses mixing them with ``rule`` or neither."""
2819
2889
  has_typed = any(field in document for field in cf_rules.TYPED_FIELDS)
2820
2890
  if "rule" in document and has_typed:
2821
2891
  raise CliError(
@@ -2825,17 +2895,20 @@ def view_conditional_format_create(invocation: Invocation) -> HandlerResult:
2825
2895
  )
2826
2896
  if "rule" not in document and not has_typed:
2827
2897
  _require_field(document, "rule")
2828
- with open_service(invocation) as (service, auth):
2829
- dataset_id = _resolve_dataset_id(service, invocation, dataview_id, document)
2830
- if has_typed:
2831
- metadata = _dataview_metadata(service, dataset_id, dataview_id, project_id)
2832
- column_map, column_types = _column_maps(metadata)
2833
- rules = cf_rules.build_rules(document, column_map, column_types)
2834
- else:
2835
- cf_rules.validate_rule(document["rule"])
2836
- rules = [document["rule"]]
2837
- data = _create_cf_rules(service, invocation, rules, (dataset_id, dataview_id, project_id))
2838
- return data, _meta(invocation, auth.workspace_id, project_id)
2898
+ return has_typed
2899
+
2900
+
2901
+ def _cf_rules_for_document(
2902
+ service: Any, document: dict[str, Any], has_typed: bool, scope: tuple[Any, ...]
2903
+ ) -> list[dict[str, Any]]:
2904
+ """The rule bodies an input document stands for (typed fields build one rule per column)."""
2905
+ dataset_id, dataview_id, project_id = scope
2906
+ if has_typed:
2907
+ metadata = _dataview_metadata(service, dataset_id, dataview_id, project_id)
2908
+ column_map, column_types = _column_maps(metadata)
2909
+ return cf_rules.build_rules(document, column_map, column_types)
2910
+ cf_rules.validate_rule(document["rule"])
2911
+ return [document["rule"]]
2839
2912
 
2840
2913
 
2841
2914
  def _cf_sequence(rule: Any) -> int:
@@ -3992,18 +4065,42 @@ def view_export_csv(invocation: Invocation) -> HandlerResult:
3992
4065
  signed download URL is returned instead so the host can hand it to its
3993
4066
  user. ``output_path`` is refused in that case.
3994
4067
  """
4068
+ return _download_dataview(
4069
+ invocation, "mammoth.api.exports.ExportsAPI.to_csv_url", ("output_path", "timeout")
4070
+ )
4071
+
4072
+
4073
+ def view_export_download(invocation: Invocation) -> HandlerResult:
4074
+ """Download a dataview to a local file as csv, xlsx, json, ndjson, xml, yaml or parquet.
4075
+
4076
+ Same as ``view export csv`` otherwise: ``--input '{"format": "xlsx", "output_path":
4077
+ "out.xlsx"}'``; the default name carries the format's extension; an existing file is not
4078
+ replaced unless ``--overwrite``; embedded, the signed download URL is returned instead.
4079
+ """
4080
+ return _download_dataview(
4081
+ invocation,
4082
+ "mammoth.api.exports.ExportsAPI.to_file_url",
4083
+ ("output_path", "file_type", "timeout"),
4084
+ )
4085
+
4086
+
4087
+ def _download_dataview(
4088
+ invocation: Invocation, embedded_symbol: str, fields: tuple[str, ...]
4089
+ ) -> HandlerResult:
4090
+ """Shared body of ``view export csv`` and ``view export download``."""
3995
4091
  dataview_id = _require_int_positional_at(invocation, 0, "dataview id")
3996
4092
  document = invocation.load_input() or {}
3997
4093
  if embedded.active():
3998
- return _view_export_csv_embedded(invocation, dataview_id, document)
4094
+ return _view_export_csv_embedded(invocation, dataview_id, document, embedded_symbol)
3999
4095
  kwargs: dict[str, Any] = {"dataview_id": dataview_id}
4000
- _forward_optional(document, kwargs, ("output_path", "timeout", "dataset_id"))
4096
+ _forward_optional(document, kwargs, (*fields, "dataset_id"))
4001
4097
  with open_service(invocation) as (service, auth):
4002
4098
  _require_exact_parent(service, invocation, dataview_id, kwargs)
4003
4099
  # The SDK's own default name needs the parent dataset, which is known here.
4004
4100
  target = kwargs.get("output_path")
4005
4101
  if target is None and kwargs.get(_DATASET_ID_FIELD) is not None:
4006
- target = f"dataview_{kwargs[_DATASET_ID_FIELD]}_{dataview_id}_export.csv"
4102
+ extension = str(kwargs.get("file_type") or "csv").strip().lower().lstrip(".")
4103
+ target = f"dataview_{kwargs[_DATASET_ID_FIELD]}_{dataview_id}_export.{extension}"
4007
4104
  if target is not None:
4008
4105
  refuse_existing_file(invocation, target)
4009
4106
  data = service.call(_symbol(invocation), **kwargs)
@@ -4013,9 +4110,9 @@ def view_export_csv(invocation: Invocation) -> HandlerResult:
4013
4110
 
4014
4111
 
4015
4112
  def _view_export_csv_embedded(
4016
- invocation: Invocation, dataview_id: int, document: dict[str, Any]
4113
+ invocation: Invocation, dataview_id: int, document: dict[str, Any], symbol: str
4017
4114
  ) -> HandlerResult:
4018
- """``view.export.csv`` for an embedded call: never writes a local file."""
4115
+ """A download for an embedded call: never writes a local file."""
4019
4116
  if "output_path" in document:
4020
4117
  raise CliError(
4021
4118
  code=CODE_UNSUPPORTED_CONTRACT,
@@ -4024,9 +4121,9 @@ def _view_export_csv_embedded(
4024
4121
  hint="Drop output_path -- an embedded call returns a download_url instead.",
4025
4122
  )
4026
4123
  kwargs: dict[str, Any] = {"dataview_id": dataview_id}
4027
- _forward_optional(document, kwargs, ("timeout", "dataset_id"))
4124
+ _forward_optional(document, kwargs, ("file_type", "timeout", "dataset_id"))
4028
4125
  with open_service(invocation) as (service, auth):
4029
- data = service.call("mammoth.api.exports.ExportsAPI.to_csv_url", **kwargs)
4126
+ data = service.call(symbol, **kwargs)
4030
4127
  return {"download_url": data["url"]}, _meta(invocation, auth.workspace_id, None)
4031
4128
 
4032
4129
 
@@ -2134,6 +2134,16 @@ def view_transform_rename_columns(invocation: Invocation) -> HandlerResult:
2134
2134
  return _dispatch_view(invocation, view_id, "rename_columns", **kwargs)
2135
2135
 
2136
2136
 
2137
+ def view_column_format_set(invocation: Invocation) -> HandlerResult:
2138
+ """Set how columns display (date or number format; a view display setting, not a task)."""
2139
+ view_id = _view_id(invocation)
2140
+ document = invocation.load_input()
2141
+ _require_field(document, "formats")
2142
+ assert document is not None
2143
+ kwargs = _bind_transform_inputs(invocation, document)
2144
+ return _dispatch_view(invocation, view_id, "set_column_format", **kwargs)
2145
+
2146
+
2137
2147
  def view_transform_sort(invocation: Invocation) -> HandlerResult:
2138
2148
  """Set the view's row order (a display setting, not a task). ``order_by`` is required.
2139
2149
 
@@ -2175,7 +2185,7 @@ def view_transform_math(invocation: Invocation) -> HandlerResult:
2175
2185
  def _math_into_column(
2176
2186
  invocation: Invocation, view_id: int, document: dict[str, Any], **dispatch: Any
2177
2187
  ) -> HandlerResult:
2178
- """The math write for a ``view transform math`` input ``document``, with its blank-input note."""
2188
+ """The math write for a ``view transform math`` input ``document``, with its blank note."""
2179
2189
  kwargs = _bind_transform_inputs(invocation, document, "view.transform.math")
2180
2190
  blanks: dict[str, int] = {}
2181
2191
 
@@ -297,7 +297,10 @@ def missing_project_error() -> CliError:
297
297
  code="project_required",
298
298
  message="No project is set for this command.",
299
299
  exit_status=EXIT_USAGE,
300
- hint="Pass --project PROJECT_ID.",
300
+ hint=(
301
+ "This environment has no default project. Run `mammoth project list`, then "
302
+ "repeat the command with --project PROJECT_ID."
303
+ ),
301
304
  recovery_commands=["mammoth project list", "mammoth dataset find SUBSTRING"],
302
305
  )
303
306
  return CliError(
@@ -128,6 +128,34 @@ def _validate_output(output: str) -> None:
128
128
  )
129
129
 
130
130
 
131
+ #: Error codes that mean "the --input document was wrong": the envelope then
132
+ #: carries the command's input contract so the next call needs no ``schema get``.
133
+ _INPUT_REJECTION_CODES = frozenset(
134
+ {
135
+ "unknown_input_field",
136
+ "invalid_input_field_type",
137
+ "missing_field",
138
+ "invalid_input",
139
+ "invalid_input_document",
140
+ "invalid_arguments",
141
+ "invalid_condition",
142
+ "invalid_condition_value",
143
+ "invalid_rule",
144
+ }
145
+ )
146
+
147
+
148
+ def _attach_input_contract(error: CliError, command_id: str) -> None:
149
+ """Add ``details["input_contract"]`` to an input-validation error, once."""
150
+ if error.code not in _INPUT_REJECTION_CODES or "input_contract" in error.details:
151
+ return
152
+ from mammoth_cli.commands.schema import input_contract
153
+
154
+ contract = input_contract(command_id)
155
+ if contract is not None:
156
+ error.details["input_contract"] = contract
157
+
158
+
131
159
  def _with_pin_checked(error: CliError, invocation: Invocation | None) -> CliError:
132
160
  """Make a 403's "project-limited token" hint true for this token (one lookup, 403 only)."""
133
161
  if invocation is None:
@@ -297,6 +325,7 @@ def run(
297
325
  run_log = _open_run_log(command_id, invocation)
298
326
 
299
327
  def fail(error: CliError, cause: BaseException | None = None) -> None:
328
+ _attach_input_contract(error, command_id)
300
329
  if run_log is not None:
301
330
  error.log_ref = run_log.ref
302
331
  run_log.finish(error.exit_status, error_code=error.code, exception=cause)