mammoth-cli 2.2.48__tar.gz → 2.2.49__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 (268) hide show
  1. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/PKG-INFO +2 -2
  2. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +3 -3
  4. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +10 -0
  5. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +30 -0
  6. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/dashboard.py +34 -0
  7. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/registry.py +4 -0
  8. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/schema.py +14 -0
  9. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/view.py +34 -0
  10. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/view_ops.py +69 -0
  11. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/errors/envelope.py +1 -0
  12. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/command_contract.py +19 -0
  13. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/input_fields.py +12 -0
  14. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/positionals.py +10 -0
  15. mammoth_cli-2.2.49/mammoth_cli/services/view_variants.py +164 -0
  16. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/pyproject.toml +2 -2
  17. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/dashboard.yaml +52 -0
  18. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/view.yaml +147 -0
  19. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/edits-target.source.yaml +2 -0
  20. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/sdk-catalog.source.yaml +21 -0
  21. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/sdk-methods.yaml +37 -1
  22. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/.gitignore +0 -0
  23. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/LICENSE +0 -0
  24. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/README.md +0 -0
  25. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/__main__.py +0 -0
  26. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/app.py +0 -0
  27. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +0 -0
  28. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
  29. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  30. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
  31. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
  32. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  33. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  34. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  35. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  36. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  37. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  38. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  39. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  40. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  41. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  42. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
  43. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  44. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  45. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  46. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  47. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  48. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  49. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
  50. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +0 -0
  51. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-template.md +0 -0
  52. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  53. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  54. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  55. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  56. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  57. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  58. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  59. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/link.md +0 -0
  60. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  61. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  62. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  63. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
  64. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  65. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/resolve.md +0 -0
  66. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  67. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  68. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  69. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  70. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  71. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  72. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/token.md +0 -0
  73. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  74. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  75. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  76. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  77. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
  78. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  79. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  80. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  81. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  82. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
  83. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  84. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  85. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  86. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  87. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  88. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
  89. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/database-import.md +0 -0
  90. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
  91. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  92. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  93. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  94. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  95. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
  96. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
  97. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  98. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  99. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  100. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  101. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  102. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
  103. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/__init__.py +0 -0
  104. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/activity.py +0 -0
  105. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/addon.py +0 -0
  106. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/agent.py +0 -0
  107. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/ai.py +0 -0
  108. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/annotation.py +0 -0
  109. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/auth.py +0 -0
  110. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/automation.py +0 -0
  111. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/batch.py +0 -0
  112. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/billing.py +0 -0
  113. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/browse.py +0 -0
  114. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/calc.py +0 -0
  115. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/capability.py +0 -0
  116. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/client_app.py +0 -0
  117. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/completion.py +0 -0
  118. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/config.py +0 -0
  119. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/connector.py +0 -0
  120. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/context.py +0 -0
  121. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/data_app.py +0 -0
  122. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/dataset.py +0 -0
  123. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/doctor.py +0 -0
  124. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/external_key.py +0 -0
  125. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/file.py +0 -0
  126. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/folder.py +0 -0
  127. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/job.py +0 -0
  128. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/link.py +0 -0
  129. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/notification.py +0 -0
  130. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/parameter.py +0 -0
  131. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/project.py +0 -0
  132. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/report.py +0 -0
  133. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/resolve.py +0 -0
  134. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/schedule.py +0 -0
  135. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/skill.py +0 -0
  136. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/snippet.py +0 -0
  137. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/support.py +0 -0
  138. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/template.py +0 -0
  139. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/trash.py +0 -0
  140. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/upgrade.py +0 -0
  141. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/user.py +0 -0
  142. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/view_profile.py +0 -0
  143. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/webhook.py +0 -0
  144. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/workflow.py +0 -0
  145. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/commands/workspace.py +0 -0
  146. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/context/__init__.py +0 -0
  147. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/context/credentials.py +0 -0
  148. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/context/endpoint.py +0 -0
  149. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/context/oauth.py +0 -0
  150. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/context/profiles.py +0 -0
  151. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/context/resolver.py +0 -0
  152. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/contracts/__init__.py +0 -0
  153. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/contracts/auth.py +0 -0
  154. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/embed.py +0 -0
  155. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/errors/__init__.py +0 -0
  156. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/manifest/__init__.py +0 -0
  157. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/manifest/loader.py +0 -0
  158. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/messages/__init__.py +0 -0
  159. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/output/__init__.py +0 -0
  160. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/output/envelope.py +0 -0
  161. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/output/normalize.py +0 -0
  162. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/output/policy.py +0 -0
  163. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/output/progress.py +0 -0
  164. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/output/render.py +0 -0
  165. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/py.typed +0 -0
  166. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/__init__.py +0 -0
  167. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/confirm.py +0 -0
  168. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/dataset_health.py +0 -0
  169. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/dryrun.py +0 -0
  170. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/dryrun_targets.py +0 -0
  171. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/embedded.py +0 -0
  172. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/executor.py +0 -0
  173. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/input_loader.py +0 -0
  174. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/intent_only.py +0 -0
  175. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/invocation.py +0 -0
  176. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/locked_files.py +0 -0
  177. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/new_data.py +0 -0
  178. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/options.py +0 -0
  179. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/parents.py +0 -0
  180. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/runlog.py +0 -0
  181. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/session.py +0 -0
  182. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/state.py +0 -0
  183. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/strict.py +0 -0
  184. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/updates.py +0 -0
  185. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/validate.py +0 -0
  186. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/runtime/verify.py +0 -0
  187. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/__init__.py +0 -0
  188. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/append_blank_columns.py +0 -0
  189. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/argspec.py +0 -0
  190. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/board_values.py +0 -0
  191. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/coerce.py +0 -0
  192. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/conditional_format.py +0 -0
  193. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/conditions.py +0 -0
  194. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/dashboard_filters.py +0 -0
  195. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/dashboard_pages.py +0 -0
  196. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/dashboard_review.py +0 -0
  197. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/data_profile.py +0 -0
  198. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/data_quality.py +0 -0
  199. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/dispatch.py +0 -0
  200. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/factory.py +0 -0
  201. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/job_outcome.py +0 -0
  202. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/listing.py +0 -0
  203. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/local_time.py +0 -0
  204. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/mapping.py +0 -0
  205. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/openapi_types.py +0 -0
  206. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/protocol.py +0 -0
  207. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/read_queries.py +0 -0
  208. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/sdk_service.py +0 -0
  209. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/sql_check.py +0 -0
  210. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/stored_stats.py +0 -0
  211. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/testing.py +0 -0
  212. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/text_dates.py +0 -0
  213. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/type_system.py +0 -0
  214. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/view_analysis.py +0 -0
  215. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/services/write_impact.py +0 -0
  216. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/skills/__init__.py +0 -0
  217. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/skills/installer.py +0 -0
  218. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/skills/steering.py +0 -0
  219. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/mammoth_cli/testing.py +0 -0
  220. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/activity.yaml +0 -0
  221. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/addon.yaml +0 -0
  222. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/agent.yaml +0 -0
  223. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/ai.yaml +0 -0
  224. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/annotation.yaml +0 -0
  225. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/auth.yaml +0 -0
  226. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/automation.yaml +0 -0
  227. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/batch.yaml +0 -0
  228. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/billing.yaml +0 -0
  229. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/browse.yaml +0 -0
  230. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/calc.yaml +0 -0
  231. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/capability.yaml +0 -0
  232. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/client-app.yaml +0 -0
  233. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/completion.yaml +0 -0
  234. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/config.yaml +0 -0
  235. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/connector.yaml +0 -0
  236. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/context.yaml +0 -0
  237. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/data-app.yaml +0 -0
  238. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/dataset.yaml +0 -0
  239. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/doctor.yaml +0 -0
  240. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/external-key.yaml +0 -0
  241. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/file.yaml +0 -0
  242. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/folder.yaml +0 -0
  243. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/job.yaml +0 -0
  244. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/link.yaml +0 -0
  245. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/log.yaml +0 -0
  246. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/notification.yaml +0 -0
  247. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/parameter.yaml +0 -0
  248. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/project.yaml +0 -0
  249. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/report.yaml +0 -0
  250. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/resolve.yaml +0 -0
  251. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/schedule.yaml +0 -0
  252. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/schema.yaml +0 -0
  253. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/skill.yaml +0 -0
  254. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/snippet.yaml +0 -0
  255. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/support.yaml +0 -0
  256. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/template.yaml +0 -0
  257. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/token.yaml +0 -0
  258. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/trash.yaml +0 -0
  259. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/upgrade.yaml +0 -0
  260. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/user.yaml +0 -0
  261. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/version.yaml +0 -0
  262. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/webhook.yaml +0 -0
  263. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/workflow.yaml +0 -0
  264. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/commands/workspace.yaml +0 -0
  265. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/openapi-operations.yaml +0 -0
  266. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/manifests/schema-v1.json +0 -0
  267. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/spec/openapi/metadata.json +0 -0
  268. {mammoth_cli-2.2.48 → mammoth_cli-2.2.49}/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.48
3
+ Version: 2.2.49
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
@@ -17,7 +17,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
17
17
  Requires-Python: <3.15,>=3.12
18
18
  Requires-Dist: jsonschema>=4.20
19
19
  Requires-Dist: keyring<26,>=25.7
20
- Requires-Dist: mammoth-io<0.9,>=0.8.26
20
+ Requires-Dist: mammoth-io<0.9,>=0.8.27
21
21
  Requires-Dist: platformdirs<5,>=4.10
22
22
  Requires-Dist: pydantic<3,>=2.12.5
23
23
  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.48"
9
+ __version__ = "2.2.49"
10
10
 
11
11
  # The versioned machine output envelope contract.
12
12
  SCHEMA_VERSION = 1
@@ -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 656; 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 660; 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
 
@@ -24,7 +24,7 @@ Load only the applicable domain file:
24
24
  - [dashboard-qa](commands/dashboard-qa.md) — 14 published commands
25
25
  - [dashboard-template](commands/dashboard-template.md) — 12 published commands
26
26
  - [dashboard-style](commands/dashboard-style.md) — 10 published commands
27
- - [dashboard](commands/dashboard.md) — 98 published commands
27
+ - [dashboard](commands/dashboard.md) — 99 published commands
28
28
  - [data-app](commands/data-app.md) — 12 published commands
29
29
  - [dataset](commands/dataset.md) — 22 published commands
30
30
  - [doctor](commands/doctor.md) — 1 published commands
@@ -51,7 +51,7 @@ Load only the applicable domain file:
51
51
  - [user](commands/user.md) — 8 published commands
52
52
  - [version](commands/version.md) — 1 published commands
53
53
  - [view-transform](commands/view-transform.md) — 32 published commands
54
- - [view](commands/view.md) — 94 published commands
54
+ - [view](commands/view.md) — 97 published commands
55
55
  - [webhook](commands/webhook.md) — 7 published commands
56
56
  - [workflow](commands/workflow.md) — 16 published commands
57
57
  - [workspace](commands/workspace.md) — 26 published commands
@@ -422,6 +422,16 @@ Result: `DashboardFigureIntentResult`; mutation `benign_mutation`, confirmation
422
422
 
423
423
  Status on release: ran once on CLI 2.0.14 — dashboard re-verification 2026-09-18: exit 0 on release with CLI 2.0.14. CLI defect fixed, confirmed: returned a full matched structured body ({"added":{...},"kind":"bar","spec":{...},"intentApplied":true,...}) instead of raising ValidationError on an unmatch…
424
424
 
425
+ ### `dashboard.figure.add`
426
+
427
+ Run: `mammoth dashboard figure add`. Exact input fields: `mammoth schema get dashboard.figure.add`.
428
+
429
+ Example: `mammoth dashboard figure add 123 --input '{"dataview_id": 1, "figure": {"kind": "hbar", "title": "Revenue by region", "dim": "Region", "measure": "Revenue", "agg": "sum"}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
430
+
431
+ Result: `DashboardFigureAddResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
432
+
433
+ Status on release: untried; no live run recorded.
434
+
425
435
  ### `dashboard.filter.add`
426
436
 
427
437
  Run: `mammoth dashboard filter add`. Exact input fields: `mammoth schema get dashboard.filter.add`.
@@ -412,6 +412,26 @@ Result: `ViewDraftSubmitResult`; mutation `reversible_pipeline`, confirmation `n
412
412
 
413
413
  Status on release: untried; no live run recorded.
414
414
 
415
+ ### `view.explore-panel.get`
416
+
417
+ Run: `mammoth view explore-panel get`. Exact input fields: `mammoth schema get view.explore-panel.get`.
418
+
419
+ Example: `mammoth view explore-panel get 123`. Placeholders are illustrative; resolve IDs and input from observed reads.
420
+
421
+ Result: `ViewExplorePanelGetResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
422
+
423
+ Status on release: untried; no live run recorded.
424
+
425
+ ### `view.explore-panel.set`
426
+
427
+ Run: `mammoth view explore-panel set`. Exact input fields: `mammoth schema get view.explore-panel.set`.
428
+
429
+ Example: `mammoth view explore-panel set 123 --input '{"panel": {"open": true, "items": [{"column": "column_1", "renderType": "chart"}]}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
430
+
431
+ Result: `ViewExplorePanelSetResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
432
+
433
+ Status on release: untried; no live run recorded.
434
+
415
435
  ### `view.export.azure-blob`
416
436
 
417
437
  Run: `mammoth view export azure-blob`. Exact input fields: `mammoth schema get view.export.azure-blob`.
@@ -914,6 +934,16 @@ Result: `ViewUpdateResult`; mutation `benign_mutation`, confirmation `none`, wai
914
934
 
915
935
  Status on release: untried; no live run recorded.
916
936
 
937
+ ### `view.variants.create`
938
+
939
+ Run: `mammoth view variants create`. Exact input fields: `mammoth schema get view.variants.create`.
940
+
941
+ Example: `mammoth view variants create 123 --input '{"from_view": 456, "column": "Region", "values": ["East", "West"]}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
942
+
943
+ Result: `ViewVariantsCreateResult`; mutation `benign_mutation`, confirmation `none`, wait policy `always_wait`.
944
+
945
+ Status on release: untried; no live run recorded.
946
+
917
947
  ### `view.version.apply`
918
948
 
919
949
  Run: `mammoth view version apply`. Exact input fields: `mammoth schema get view.version.apply`.
@@ -608,6 +608,40 @@ def dashboard_share(invocation: Invocation) -> HandlerResult:
608
608
  return data, _meta(invocation, auth.workspace_id)
609
609
 
610
610
 
611
+ def _figure_page_kwargs(page: Any) -> dict[str, Any]:
612
+ """Map the endpoint's ``page`` ({"id"} or {"new_title"}) onto the SDK's page arguments."""
613
+ if not isinstance(page, dict) or set(page) not in ({"id"}, {"new_title"}):
614
+ raise CliError(
615
+ code=CODE_INVALID_ARGUMENT,
616
+ message='The \'page\' input field must be {"id": ...} or {"new_title": ...}.',
617
+ exit_status=EXIT_USAGE,
618
+ )
619
+ if "id" in page:
620
+ return {"page_id": page["id"]}
621
+ return {"page_new_title": page["new_title"]}
622
+
623
+
624
+ def dashboard_figure_add(invocation: Invocation) -> HandlerResult:
625
+ """Add one figure to a dashboard. The input is the endpoint's own shape.
626
+
627
+ ``dataview_id`` and ``figure`` are required; ``banded`` and ``page`` (``{"id": ...}``
628
+ or ``{"new_title": ...}``) are optional. The result carries ``bake_job_id``.
629
+ """
630
+ dashboard_id = _require_int_positional(invocation, "dashboard id")
631
+ document = _bound_document(invocation)
632
+ kwargs: dict[str, Any] = {
633
+ "dashboard_id": dashboard_id,
634
+ "dataview_id": _require_field(document, "dataview_id"),
635
+ "figure": _require_field(document, "figure"),
636
+ }
637
+ _forward_optional(document, kwargs, ("banded",))
638
+ if document.get("page") is not None:
639
+ kwargs.update(_figure_page_kwargs(document["page"]))
640
+ with open_service(invocation) as (service, auth):
641
+ data = service.call(_symbol(invocation), **kwargs)
642
+ return data, _meta(invocation, auth.workspace_id)
643
+
644
+
611
645
  def dashboard_cancel_generation(invocation: Invocation) -> HandlerResult:
612
646
  """Cancel an in-progress dashboard generation."""
613
647
  dashboard_id = _require_int_positional(invocation, "dashboard id")
@@ -483,6 +483,7 @@ HANDLERS: dict[str, Handler] = {
483
483
  "dashboard.tags.merge": dashboard_cmd.dashboard_tags_merge,
484
484
  "dashboard.published-data-by-url": dashboard_cmd.dashboard_published_data_by_url,
485
485
  "dashboard.restore": dashboard_cmd.dashboard_restore,
486
+ "dashboard.figure.add": dashboard_cmd.dashboard_figure_add,
486
487
  "dashboard.share": dashboard_cmd.dashboard_share,
487
488
  "dashboard.source.list": dashboard_cmd.dashboard_source_list,
488
489
  "dashboard.trash": dashboard_cmd.dashboard_trash,
@@ -777,6 +778,8 @@ HANDLERS: dict[str, Handler] = {
777
778
  "view.optimize": view_cmd.view_optimize,
778
779
  "view.compare": view_cmd.view_compare,
779
780
  "view.update": view_cmd.view_update,
781
+ "view.explore-panel.get": view_cmd.view_explore_panel_get,
782
+ "view.explore-panel.set": view_cmd.view_explore_panel_set,
780
783
  "view.data.get": view_cmd.view_data_get,
781
784
  "view.data.query": view_cmd.view_data_query,
782
785
  "view.data.aggregate": view_cmd.view_data_aggregate_rounded,
@@ -852,6 +855,7 @@ HANDLERS: dict[str, Handler] = {
852
855
  "view.export.tableau": view_cmd.view_export_specialized,
853
856
  # view family (View-object: create/get/delete, draft, transforms)
854
857
  "view.create": view_ops_cmd.view_create,
858
+ "view.variants.create": view_ops_cmd.view_variants_create,
855
859
  "view.get": view_ops_cmd.view_get,
856
860
  "view.delete": view_ops_cmd.view_delete,
857
861
  "view.draft.enter": view_ops_cmd.view_draft_enter,
@@ -46,8 +46,17 @@ _PROTECTED_INPUT_PATH = "/private/path/request.json"
46
46
  # second id, an optional-but-central input field, or two views to compare.
47
47
  _FIXED_EXAMPLES: dict[str, tuple[tuple[str, ...], dict[str, Any]]] = {
48
48
  "view.optimize": (("123",), {}),
49
+ "view.explore-panel.get": (("123",), {}),
50
+ "view.explore-panel.set": (
51
+ ("123",),
52
+ {"panel": {"open": True, "items": [{"column": "column_1", "renderType": "chart"}]}},
53
+ ),
49
54
  "project.check": (("123", "456"), {}),
50
55
  "view.data.profile": (("123",), {"target": "Churn"}),
56
+ "view.variants.create": (
57
+ ("123",),
58
+ {"from_view": 456, "column": "Region", "values": ["East", "West"]},
59
+ ),
51
60
  "workflow.canvas": (
52
61
  ("12",),
53
62
  {
@@ -97,6 +106,11 @@ _GROUP_DISCOVERY_PURPOSES = {
97
106
 
98
107
  _COMMAND_DISCOVERY_PURPOSES = {
99
108
  "view.update": "rename change name to a new name title relabel",
109
+ "view.explore-panel.get": "explore cards saved panel the data editor explore side panel read",
110
+ "view.explore-panel.set": "save replace explore cards panel items chart a column in the editor",
111
+ "dashboard.figure.add": (
112
+ "append an explore card figure tile to a dashboard from a payload, no chat turn"
113
+ ),
100
114
  "file.upload": (
101
115
  "upload import CSV spreadsheet XLSX source data append add rows union stack "
102
116
  "a file into an existing dataset excel workbook tabs sheets drop in"
@@ -1115,6 +1115,40 @@ def view_update(invocation: Invocation) -> HandlerResult:
1115
1115
  return data, _meta(invocation, auth.workspace_id, project_id)
1116
1116
 
1117
1117
 
1118
+ def view_explore_panel_get(invocation: Invocation) -> HandlerResult:
1119
+ """Read the Explore panel the caller saved on a view (empty when none is saved)."""
1120
+ project_id = require_project(invocation)
1121
+ dataview_id = _require_int_positional_at(invocation, 0, "view id")
1122
+ document = invocation.load_input() or {}
1123
+ with open_service(invocation) as (service, auth):
1124
+ dataset_id = _resolve_dataset_id(service, invocation, dataview_id, document)
1125
+ data = service.call(
1126
+ _symbol(invocation),
1127
+ dataset_id=dataset_id,
1128
+ dataview_id=dataview_id,
1129
+ project_id=project_id,
1130
+ )
1131
+ return data, _meta(invocation, auth.workspace_id, project_id)
1132
+
1133
+
1134
+ def view_explore_panel_set(invocation: Invocation) -> HandlerResult:
1135
+ """Replace the caller's saved Explore panel with the ``panel`` input field."""
1136
+ project_id = require_project(invocation)
1137
+ dataview_id = _require_int_positional_at(invocation, 0, "view id")
1138
+ document = invocation.load_input() or {}
1139
+ panel = _require_field(document, "panel")
1140
+ with open_service(invocation) as (service, auth):
1141
+ dataset_id = _verified_dataset_id(service, invocation, dataview_id, document)
1142
+ data = service.call(
1143
+ _symbol(invocation),
1144
+ dataset_id=dataset_id,
1145
+ dataview_id=dataview_id,
1146
+ panel=panel,
1147
+ project_id=project_id,
1148
+ )
1149
+ return data, _meta(invocation, auth.workspace_id, project_id)
1150
+
1151
+
1118
1152
  def _untyped_patch_error(invocation: Invocation) -> CliError:
1119
1153
  """The refusal for a view patch that is not the typed rename."""
1120
1154
  return CliError(
@@ -32,6 +32,7 @@ from mammoth_cli.commands.view import (
32
32
  BRIEF_VIEW_FIELDS,
33
33
  UNFINISHED_STATE,
34
34
  _dataview_metadata,
35
+ _display_name_map,
35
36
  _require_discovery_allowed,
36
37
  apply_column_renames,
37
38
  brief_view_record,
@@ -66,6 +67,15 @@ from mammoth_cli.services.command_contract import bind_command_inputs
66
67
  from mammoth_cli.services.conditions import CONDITION_KWARG, compile_condition
67
68
  from mammoth_cli.services.input_fields import TASK_COUNT_FIELD
68
69
  from mammoth_cli.services.sql_check import check_sql_binds
70
+ from mammoth_cli.services.view_variants import (
71
+ VariantPlan,
72
+ created_entry,
73
+ name_template_of,
74
+ partial_failure,
75
+ plan_variants,
76
+ require_known_column,
77
+ variants_result,
78
+ )
69
79
  from mammoth_cli.services.write_impact import (
70
80
  ImpactRead,
71
81
  Measure,
@@ -772,6 +782,65 @@ def _require_clone_from_same_dataset(service: Any, clone_from: int, dataset_id:
772
782
  )
773
783
 
774
784
 
785
+ _VIEW_CREATE_SYMBOL = "mammoth.client.ViewsResource.create"
786
+
787
+
788
+ def view_variants_create(invocation: Invocation) -> HandlerResult:
789
+ """Create one view per value of a column: each a clone of ``from_view`` filtered to it.
790
+
791
+ Composes ``view create`` (``clone_from``) and ``view transform filter``. All
792
+ checks that need no write run first; the first failing write stops the run
793
+ and the error names every view already created.
794
+ """
795
+ dataset_id = _require_int_positional(invocation, "dataset id")
796
+ raw = invocation.load_input()
797
+ for field in ("from_view", "column", "values"):
798
+ _require_field(raw, field)
799
+ document = bind_command_inputs(invocation.command_id, raw)
800
+ from_view = int(document["from_view"])
801
+ column = str(document["column"])
802
+ with open_service(invocation) as (service, auth):
803
+ _require_clone_from_same_dataset(service, from_view, dataset_id)
804
+ source = service.call(_DATAVIEW_GET_SYMBOL, dataset_id=dataset_id, dataview_id=from_view)
805
+ names = set(_display_name_map(service, dataset_id, from_view, None).values())
806
+ require_known_column(from_view, column, names)
807
+ plans = plan_variants(
808
+ str(source.get("name", "")) if isinstance(source, dict) else "",
809
+ column,
810
+ document["values"],
811
+ name_template_of(document),
812
+ )
813
+ created = _create_variants(service, dataset_id, from_view, plans)
814
+ result = variants_result(dataset_id, from_view, column, created)
815
+ return result, _meta(invocation, auth.workspace_id)
816
+
817
+
818
+ def _create_variants(
819
+ service: Any, dataset_id: int, from_view: int, plans: list[VariantPlan]
820
+ ) -> list[dict[str, Any]]:
821
+ """Create and filter each variant in order; the first failure stops with a full report."""
822
+ created: list[dict[str, Any]] = []
823
+ for position, plan in enumerate(plans):
824
+ new_id: int | None = None
825
+ try:
826
+ view = _view_payload(
827
+ service.call(
828
+ _VIEW_CREATE_SYMBOL, dataset_id=dataset_id, name=plan.name, clone_from=from_view
829
+ )
830
+ )
831
+ new_id = int(view["id"])
832
+ data = service.call_view(
833
+ new_id, "filter_rows", dataset_id=dataset_id, condition=plan.condition
834
+ )
835
+ reject_pipeline_reference_errors(service, new_id, dataset_id, data)
836
+ except CliError as exc:
837
+ raise partial_failure(
838
+ plan, exc, created, plans[position + 1 :], new_id, dataset_id
839
+ ) from exc
840
+ created.append(created_entry(plan, view))
841
+ return created
842
+
843
+
775
844
  _DASHBOARDS_LIST_SYMBOL = "mammoth.api.dashboards.DashboardsAPI.list"
776
845
 
777
846
 
@@ -153,6 +153,7 @@ ERROR_SUMMARIES: dict[str, str] = {
153
153
  "missing_field": _S_MISSING_INFO,
154
154
  "network_error": "Mammoth couldn't be reached over the network.",
155
155
  "no_op": "There is nothing to change, so this step isn't needed.",
156
+ "variants_partial_failure": "Some of the variant views were created and one failed.",
156
157
  "no_output": "This step didn't return anything.",
157
158
  "nonfinite_input_number": _S_BAD_INPUT,
158
159
  "not_authenticated": _S_SIGN_IN,
@@ -350,6 +350,15 @@ _VIEW_DATA_PROFILE_FIELDS = (
350
350
  FieldSpec("limit", required=False, annotation=int, default=50),
351
351
  )
352
352
 
353
+ # view.variants.create is a CLI composite over view create (clone_from) and
354
+ # view transform filter; its document fields are authored here.
355
+ _VIEW_VARIANTS_CREATE_FIELDS = (
356
+ FieldSpec("from_view", required=True, annotation=int),
357
+ FieldSpec("column", required=True, annotation=str),
358
+ FieldSpec("values", required=True, annotation=list[str | int | float]),
359
+ FieldSpec("name_template", required=False, annotation=str | None, default=None),
360
+ )
361
+
353
362
  # view.conditional-format.create: ``rule`` (raw body) stays accepted; the typed fields build one
354
363
  # rule per column (per-cell threshold) or one row rule (see
355
364
  # mammoth_cli.services.conditional_format). ``rule`` is therefore optional here -- the handler
@@ -723,6 +732,14 @@ _S7_ADDITIONAL_INPUT_FIELDS: dict[str, tuple[FieldSpec, ...]] = {
723
732
  # The typed rename: the handler builds the one ``replace`` on ``name``; the
724
733
  # SDK's free-form ``patch_data`` is handler-owned and never offered.
725
734
  "view.update": (FieldSpec("name", required=True, annotation=str),),
735
+ # The endpoint's own params: ``page`` is {"id"} or {"new_title"}; the handler maps
736
+ # it onto the SDK's page_id / page_new_title.
737
+ "dashboard.figure.add": (
738
+ FieldSpec("dataview_id", required=True, annotation=int),
739
+ FieldSpec("figure", required=True, annotation=dict[str, Any]),
740
+ FieldSpec("banded", required=False, annotation=dict[str, Any] | None, default=None),
741
+ FieldSpec("page", required=False, annotation=dict[str, Any] | None, default=None),
742
+ ),
726
743
  "user.preference.update": (
727
744
  # PreferencesPatchRequest: replace ops on dotted paths rooted at
728
745
  # GLOBAL or WORKSPACE_PREFERENCES.
@@ -795,6 +812,8 @@ def resolve_command_contract(command_id: str) -> ResolvedCommandContract | None:
795
812
  special_fields = _VIEW_DATA_COMPARE_FIELDS
796
813
  elif command_id == "view.data.profile":
797
814
  special_fields = _VIEW_DATA_PROFILE_FIELDS
815
+ elif command_id == "view.variants.create":
816
+ special_fields = _VIEW_VARIANTS_CREATE_FIELDS
798
817
  elif command_id == "dashboard.filter.add":
799
818
  special_fields = _DASHBOARD_FILTER_ADD_FIELDS
800
819
  elif command_id == "dashboard.filter.remove":
@@ -48,6 +48,8 @@ _HANDLER_OWNED_FIELDS: dict[str, frozenset[str]] = {
48
48
  "view.data.aggregate": frozenset({"sort"}),
49
49
  # ``view update`` offers only the typed rename; the handler builds the patch.
50
50
  "view.update": frozenset({"patch_data"}),
51
+ # The endpoint names the target page as ``page``; the handler maps it onto these two.
52
+ "dashboard.figure.add": frozenset({"page_id", "page_new_title"}),
51
53
  }
52
54
 
53
55
  # CLI-only commands whose complete request is carried by positionals/context.
@@ -79,6 +81,16 @@ _EXAMPLE_INPUT_HINTS: dict[str, dict[str, Any]] = {
79
81
  # View display settings: real column names read better than sample keys.
80
82
  "view.transform.rename-columns": {"renames": {"cust_id": "Customer ID"}},
81
83
  "view.update": {"name": "Revenue report"},
84
+ "dashboard.figure.add": {
85
+ "dataview_id": 1,
86
+ "figure": {
87
+ "kind": "hbar",
88
+ "title": "Revenue by region",
89
+ "dim": "Region",
90
+ "measure": "Revenue",
91
+ "agg": "sum",
92
+ },
93
+ },
82
94
  "view.transform.sort": {"order_by": [["Revenue", "DESC"]]},
83
95
  # The backend requires integer resource ids ("resource_ids must be
84
96
  # comma-separated integers"); the SDK annotation is a plain list[str].
@@ -165,6 +165,10 @@ POSITIONAL_OVERRIDES: dict[str, tuple[PositionalSpec, ...]] = {
165
165
  example_value="card.png",
166
166
  ),
167
167
  ),
168
+ # The figure's source view is the ``dataview_id`` input field, never a second positional.
169
+ "dashboard.figure.add": (
170
+ PositionalSpec(name="dashboard_id", type=int, required=True, help="ID of the dashboard."),
171
+ ),
168
172
  "dashboard.gallery.get": (
169
173
  PositionalSpec(name="slug", type=str, required=True, help="Template slug."),
170
174
  ),
@@ -810,6 +814,8 @@ POSITIONAL_OVERRIDES: dict[str, tuple[PositionalSpec, ...]] = {
810
814
  "view.impact",
811
815
  "view.optimize",
812
816
  "view.update",
817
+ "view.explore-panel.get",
818
+ "view.explore-panel.set",
813
819
  "view.conditional-format.create",
814
820
  "view.conditional-format.delete-all",
815
821
  "view.conditional-format.list",
@@ -1234,6 +1240,10 @@ _EXACT_PARENT_HELP_OVERRIDES: dict[str, str] = {
1234
1240
  "view.optimize": (
1235
1241
  "Optional parent dataset ID. Leave it out and the CLI looks up the view's dataset. A value that is not the view's dataset is refused before the write."
1236
1242
  ),
1243
+ "view.explore-panel.set": (
1244
+ "Optional parent dataset ID. Leave it out and the CLI looks up the view's dataset. "
1245
+ "A value that is not the view's dataset is refused before the write."
1246
+ ),
1237
1247
  "view.export.dataset": (
1238
1248
  "Exact parent dataset ID of the SOURCE view being exported -- not the "
1239
1249
  "destination. Required for this command: pass it here or as the "
@@ -0,0 +1,164 @@
1
+ """Plan and report ``view variants create``: one view per value of one column.
2
+
3
+ The handler composes two existing SDK calls per value (create a view cloned
4
+ from the source view, then filter it to the value). This module owns the parts
5
+ that need no server: the per-value plan and the result, including the loud
6
+ partial-failure error that names every view already created.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from dataclasses import dataclass
12
+ from typing import Any
13
+
14
+ from mammoth.models.pipeline import Operator
15
+
16
+ from mammoth_cli.errors.envelope import (
17
+ CODE_INVALID_ARGUMENTS,
18
+ EXIT_API,
19
+ EXIT_USAGE,
20
+ CliError,
21
+ )
22
+
23
+ DEFAULT_NAME_TEMPLATE = "{view} - {value}"
24
+ CODE_VARIANTS_PARTIAL = "variants_partial_failure"
25
+ MAX_VARIANTS = 50
26
+
27
+ type VariantValue = str | int | float
28
+
29
+
30
+ @dataclass(frozen=True)
31
+ class VariantPlan:
32
+ """One variant to create: its view name and the filter that defines it."""
33
+
34
+ value: VariantValue
35
+ name: str
36
+ condition: dict[str, Any]
37
+
38
+
39
+ def plan_variants(
40
+ source_name: str, column: str, values: list[VariantValue], name_template: str
41
+ ) -> list[VariantPlan]:
42
+ """Return one plan per value, refusing input that could not make distinct views."""
43
+ if not values:
44
+ raise _invalid("values must name at least one value.")
45
+ if len(values) > MAX_VARIANTS:
46
+ raise _invalid(f"values holds {len(values)} entries; the limit is {MAX_VARIANTS} per call.")
47
+ if len({str(value) for value in values}) != len(values):
48
+ raise _invalid("values must not repeat a value; each value makes one view.")
49
+ plans = [
50
+ VariantPlan(
51
+ value=value,
52
+ name=_render_name(name_template, source_name, value),
53
+ condition={"column": column, "operator": Operator.EQ.value, "value": value},
54
+ )
55
+ for value in values
56
+ ]
57
+ if len({plan.name for plan in plans}) != len(plans):
58
+ raise _invalid(
59
+ "name_template gives two variants the same name.",
60
+ hint="Include {value} in name_template.",
61
+ )
62
+ return plans
63
+
64
+
65
+ def name_template_of(document: dict[str, Any]) -> str:
66
+ """The document's name template; absent, null or empty means the default."""
67
+ return str(document.get("name_template") or DEFAULT_NAME_TEMPLATE)
68
+
69
+
70
+ def require_known_column(view_id: int, column: str, names: set[str]) -> None:
71
+ """Refuse a column the source view lacks; an unreadable column list is an error too."""
72
+ if not names:
73
+ raise CliError(
74
+ code=CODE_INVALID_ARGUMENTS,
75
+ message=f"Could not read the columns of view {view_id}, so '{column}' was not checked.",
76
+ exit_status=EXIT_API,
77
+ hint=f"Run `mammoth view get {view_id}` and retry; no view was created.",
78
+ details={"view_id": view_id, "column": column},
79
+ )
80
+ if column not in names:
81
+ raise CliError(
82
+ code=CODE_INVALID_ARGUMENTS,
83
+ message=f"View {view_id} has no column '{column}'.",
84
+ exit_status=EXIT_USAGE,
85
+ hint="Use one of: " + ", ".join(sorted(names)) + ".",
86
+ details={"view_id": view_id, "column": column, "columns": sorted(names)},
87
+ )
88
+
89
+
90
+ def _render_name(template: str, source_name: str, value: VariantValue) -> str:
91
+ try:
92
+ return template.format(view=source_name, value=value)
93
+ except (KeyError, IndexError, ValueError) as exc:
94
+ raise _invalid(
95
+ f"name_template {template!r} is not valid.",
96
+ hint="Use only {view} and {value}, for example '{view} - {value}'.",
97
+ ) from exc
98
+
99
+
100
+ def _invalid(message: str, hint: str | None = None) -> CliError:
101
+ return CliError(code=CODE_INVALID_ARGUMENTS, message=message, exit_status=EXIT_USAGE, hint=hint)
102
+
103
+
104
+ def created_entry(plan: VariantPlan, view: dict[str, Any]) -> dict[str, Any]:
105
+ """The result row for a variant that was created and filtered."""
106
+ return {"value": plan.value, "view_id": view.get("id"), "name": plan.name}
107
+
108
+
109
+ def variants_result(
110
+ dataset_id: int, from_view: int, column: str, created: list[dict[str, Any]]
111
+ ) -> dict[str, Any]:
112
+ """The result of a fully created set."""
113
+ return {
114
+ "dataset_id": dataset_id,
115
+ "from_view": from_view,
116
+ "column": column,
117
+ "view_ids": [entry["view_id"] for entry in created],
118
+ "variants": created,
119
+ }
120
+
121
+
122
+ def partial_failure(
123
+ failed: VariantPlan,
124
+ cause: CliError,
125
+ created: list[dict[str, Any]],
126
+ not_attempted: list[VariantPlan],
127
+ orphan_view_id: int | None,
128
+ dataset_id: int,
129
+ ) -> CliError:
130
+ """The error that stops the run: which variants exist, which failed, which never ran.
131
+
132
+ ``orphan_view_id`` is the view that was created for ``failed`` but never got
133
+ its filter (so it holds the unfiltered source rows); the caller deletes or
134
+ fixes it, so it is named, never dropped.
135
+ """
136
+ made = [entry["view_id"] for entry in created]
137
+ skipped = [plan.value for plan in not_attempted]
138
+ recovery = (
139
+ [f"mammoth view delete {orphan_view_id} {dataset_id}"] if orphan_view_id is not None else []
140
+ )
141
+ return CliError(
142
+ code=CODE_VARIANTS_PARTIAL,
143
+ message=(
144
+ f"Variant {failed.value!r} failed ({cause.message}); {len(created)} view(s) were "
145
+ f"created before it: {made}. Not attempted: {skipped}."
146
+ ),
147
+ exit_status=EXIT_API,
148
+ hint=(
149
+ "Rerun with only the failed and not-attempted values. "
150
+ + (
151
+ f"View {orphan_view_id} was created for {failed.value!r} but is not filtered; "
152
+ "delete it before the rerun."
153
+ if orphan_view_id is not None
154
+ else "No half-made view was left behind."
155
+ )
156
+ ),
157
+ details={
158
+ "created": created,
159
+ "failed": {"value": failed.value, "code": cause.code, "message": cause.message},
160
+ "not_attempted": skipped,
161
+ "unfiltered_view_id": orphan_view_id,
162
+ },
163
+ recovery_commands=recovery,
164
+ )
@@ -1,13 +1,13 @@
1
1
  [project]
2
2
  name = "mammoth-cli"
3
- version = "2.2.48"
3
+ version = "2.2.49"
4
4
  description = "Command-line interface for the Mammoth Analytics platform"
5
5
  authors = [{name = "Mammoth Analytics", email = "support@mammoth.io"}]
6
6
  readme = "README.md"
7
7
  license = "LicenseRef-Proprietary"
8
8
  requires-python = ">=3.12,<3.15"
9
9
  dependencies = [
10
- "mammoth-io (>=0.8.26,<0.9)",
10
+ "mammoth-io (>=0.8.27,<0.9)",
11
11
  "typer (>=0.27,<0.28)",
12
12
  "rich (>=15,<16)",
13
13
  "platformdirs (>=4.10,<5)",