mammoth-cli 2.0.13__tar.gz → 2.0.14__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 (210) hide show
  1. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/PKG-INFO +2 -2
  2. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +3 -0
  4. mammoth_cli-2.0.14/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +220 -0
  5. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +4 -4
  6. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +25 -0
  7. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +4 -0
  8. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +15 -1
  9. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +3 -1
  10. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/dashboard.py +40 -8
  11. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/output/normalize.py +25 -4
  12. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/services/input_fields.py +14 -0
  13. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/services/mapping.py +31 -0
  14. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/services/positionals.py +8 -0
  15. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/pyproject.toml +2 -2
  16. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/dashboard.yaml +11 -9
  17. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/sdk-methods.yaml +2 -2
  18. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/.gitignore +0 -0
  19. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/LICENSE +0 -0
  20. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/README.md +0 -0
  21. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/__main__.py +0 -0
  22. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/app.py +0 -0
  23. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  24. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
  25. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  26. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  27. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  28. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  29. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  30. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  31. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  32. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  33. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  34. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  35. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  36. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  37. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  38. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  39. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  40. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  41. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  42. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  43. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  44. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  45. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  46. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  47. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  48. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  49. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  50. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
  51. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  52. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  53. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  54. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  55. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  56. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  57. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  58. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  59. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  60. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  61. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  62. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +0 -0
  63. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  64. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  65. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  66. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  67. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
  68. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  69. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  70. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  71. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  72. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  73. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  74. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  75. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  76. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  77. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  78. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  79. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  80. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/__init__.py +0 -0
  81. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/activity.py +0 -0
  82. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/addon.py +0 -0
  83. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/agent.py +0 -0
  84. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/ai.py +0 -0
  85. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/annotation.py +0 -0
  86. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/auth.py +0 -0
  87. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/automation.py +0 -0
  88. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/batch.py +0 -0
  89. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/billing.py +0 -0
  90. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/browse.py +0 -0
  91. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/capability.py +0 -0
  92. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/client_app.py +0 -0
  93. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/completion.py +0 -0
  94. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/config.py +0 -0
  95. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/connector.py +0 -0
  96. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/context.py +0 -0
  97. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/data_app.py +0 -0
  98. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/dataset.py +0 -0
  99. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/doctor.py +0 -0
  100. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/external_key.py +0 -0
  101. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/file.py +0 -0
  102. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/folder.py +0 -0
  103. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/job.py +0 -0
  104. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/notification.py +0 -0
  105. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/parameter.py +0 -0
  106. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/project.py +0 -0
  107. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/registry.py +0 -0
  108. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/report.py +0 -0
  109. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/schedule.py +0 -0
  110. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/schema.py +0 -0
  111. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/skill.py +0 -0
  112. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/snippet.py +0 -0
  113. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/support.py +0 -0
  114. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/template.py +0 -0
  115. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/trash.py +0 -0
  116. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/upgrade.py +0 -0
  117. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/user.py +0 -0
  118. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/view.py +0 -0
  119. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/view_ops.py +0 -0
  120. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/webhook.py +0 -0
  121. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/workflow.py +0 -0
  122. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/commands/workspace.py +0 -0
  123. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/context/__init__.py +0 -0
  124. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/context/credentials.py +0 -0
  125. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/context/endpoint.py +0 -0
  126. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/context/profiles.py +0 -0
  127. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/context/resolver.py +0 -0
  128. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/contracts/__init__.py +0 -0
  129. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/contracts/auth.py +0 -0
  130. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/errors/__init__.py +0 -0
  131. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/errors/envelope.py +0 -0
  132. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/manifest/__init__.py +0 -0
  133. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/manifest/loader.py +0 -0
  134. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/messages/__init__.py +0 -0
  135. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/output/__init__.py +0 -0
  136. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/output/envelope.py +0 -0
  137. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/output/policy.py +0 -0
  138. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/output/progress.py +0 -0
  139. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/output/render.py +0 -0
  140. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/py.typed +0 -0
  141. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/runtime/__init__.py +0 -0
  142. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/runtime/confirm.py +0 -0
  143. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/runtime/executor.py +0 -0
  144. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/runtime/input_loader.py +0 -0
  145. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/runtime/invocation.py +0 -0
  146. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/runtime/options.py +0 -0
  147. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/runtime/session.py +0 -0
  148. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/runtime/strict.py +0 -0
  149. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/runtime/validate.py +0 -0
  150. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/services/__init__.py +0 -0
  151. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/services/argspec.py +0 -0
  152. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/services/coerce.py +0 -0
  153. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/services/command_contract.py +0 -0
  154. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/services/conditions.py +0 -0
  155. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/services/dispatch.py +0 -0
  156. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/services/factory.py +0 -0
  157. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/services/openapi_types.py +0 -0
  158. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/services/protocol.py +0 -0
  159. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/services/sdk_service.py +0 -0
  160. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/services/testing.py +0 -0
  161. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/services/type_system.py +0 -0
  162. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/skills/__init__.py +0 -0
  163. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/skills/installer.py +0 -0
  164. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/mammoth_cli/testing.py +0 -0
  165. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/activity.yaml +0 -0
  166. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/addon.yaml +0 -0
  167. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/agent.yaml +0 -0
  168. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/ai.yaml +0 -0
  169. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/annotation.yaml +0 -0
  170. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/auth.yaml +0 -0
  171. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/automation.yaml +0 -0
  172. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/batch.yaml +0 -0
  173. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/billing.yaml +0 -0
  174. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/browse.yaml +0 -0
  175. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/capability.yaml +0 -0
  176. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/client-app.yaml +0 -0
  177. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/completion.yaml +0 -0
  178. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/config.yaml +0 -0
  179. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/connector.yaml +0 -0
  180. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/context.yaml +0 -0
  181. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/data-app.yaml +0 -0
  182. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/dataset.yaml +0 -0
  183. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/doctor.yaml +0 -0
  184. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/external-key.yaml +0 -0
  185. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/file.yaml +0 -0
  186. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/folder.yaml +0 -0
  187. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/job.yaml +0 -0
  188. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/notification.yaml +0 -0
  189. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/parameter.yaml +0 -0
  190. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/project.yaml +0 -0
  191. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/report.yaml +0 -0
  192. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/schedule.yaml +0 -0
  193. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/schema.yaml +0 -0
  194. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/skill.yaml +0 -0
  195. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/snippet.yaml +0 -0
  196. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/support.yaml +0 -0
  197. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/template.yaml +0 -0
  198. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/trash.yaml +0 -0
  199. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/upgrade.yaml +0 -0
  200. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/user.yaml +0 -0
  201. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/version.yaml +0 -0
  202. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/view.yaml +0 -0
  203. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/webhook.yaml +0 -0
  204. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/workflow.yaml +0 -0
  205. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/commands/workspace.yaml +0 -0
  206. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/openapi-operations.yaml +0 -0
  207. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/schema-v1.json +0 -0
  208. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/manifests/sdk-catalog.source.yaml +0 -0
  209. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/openapi/metadata.json +0 -0
  210. {mammoth_cli-2.0.13 → mammoth_cli-2.0.14}/spec/openapi/openapi.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mammoth-cli
3
- Version: 2.0.13
3
+ Version: 2.0.14
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.8,>=0.7.5
20
+ Requires-Dist: mammoth-io<0.8,>=0.7.6
21
21
  Requires-Dist: platformdirs<5,>=4.10
22
22
  Requires-Dist: pydantic<3,>=2.13
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.0.13"
9
+ __version__ = "2.0.14"
10
10
 
11
11
  # The versioned machine output envelope contract.
12
12
  SCHEMA_VERSION = 1
@@ -65,6 +65,9 @@ the result.
65
65
  - **Import, resources, transforms, pipelines, dashboards, exports, or cleanup:**
66
66
  [recipes](references/recipes/index.md) and [operations](references/operations.md)
67
67
  - **A known command family or exact command:** [command catalog](references/command-index.md)
68
+ - **Whether a route is proven, known-blocked, or untried on release:**
69
+ [capabilities](references/capabilities.md) — read it before promising a
70
+ deliverable or reporting a failure as a backend fault
68
71
  - **Pause or transfer to another agent:** [handoff](references/handoff.md)
69
72
 
70
73
  ## Handoff checklist
@@ -0,0 +1,220 @@
1
+ # What is proven on release
2
+
3
+ Generated from `docs/release-capability-matrix.json`; do not edit by hand.
4
+ 455 API operations have a CLI command. 142 were exercised successfully on release, 2 are not supported there, and the rest are untried. Untried is not broken: discover the contract with `mammoth schema get COMMAND_ID --output json --no-input`, run it, and treat the structured error envelope as the answer.
5
+
6
+ Status meanings:
7
+
8
+ - **verified**: one bounded live run on release returned a success envelope (single path; variants and error paths are usually untested).
9
+ - **not supported**: the backend refuses the route on release; the note says why and what to use instead.
10
+ - **observed blocker**: the last run hit an error; the note quotes it. Re-check before relying on the route, and do not retry the same input.
11
+ - **CLI defect fixed, untried since**: the failure was on the CLI side and this release repairs it; nobody has re-run the route yet.
12
+ - Commands not listed under a family are untried.
13
+
14
+ The typed `view transform *` commands all submit through `view.task.add`; its row below carries the transformations proven end to end (filter, fill-missing, join, pivot with an exported summary). A transformation not named there has the same untried status as any other command.
15
+
16
+ ## Coverage by family
17
+
18
+ | Family | Commands | Verified | Not supported | Untried |
19
+ |---|---|---|---|---|
20
+ | `dashboard` | 104 | 66 | 2 | 36 |
21
+ | `view` | 62 | 22 | 0 | 40 |
22
+ | `support` | 45 | 0 | 0 | 45 |
23
+ | `billing` | 23 | 0 | 0 | 23 |
24
+ | `connector` | 22 | 2 | 0 | 20 |
25
+ | `workspace` | 19 | 6 | 0 | 13 |
26
+ | `project` | 17 | 5 | 0 | 12 |
27
+ | `workflow` | 16 | 5 | 0 | 11 |
28
+ | `dataset` | 15 | 9 | 0 | 6 |
29
+ | `parameter` | 14 | 2 | 0 | 12 |
30
+ | `data-app` | 12 | 1 | 0 | 11 |
31
+ | `folder` | 8 | 5 | 0 | 3 |
32
+ | `snippet` | 8 | 1 | 0 | 7 |
33
+ | `automation` | 7 | 1 | 0 | 6 |
34
+ | `user` | 7 | 2 | 0 | 5 |
35
+ | `webhook` | 7 | 0 | 0 | 7 |
36
+ | `addon` | 6 | 0 | 0 | 6 |
37
+ | `batch` | 6 | 2 | 0 | 4 |
38
+ | `file` | 6 | 3 | 0 | 3 |
39
+ | `agent` | 5 | 1 | 0 | 4 |
40
+ | `ai` | 5 | 0 | 0 | 5 |
41
+ | `annotation` | 5 | 1 | 0 | 4 |
42
+ | `client-app` | 5 | 0 | 0 | 5 |
43
+ | `notification` | 5 | 1 | 0 | 4 |
44
+ | `schedule` | 5 | 0 | 0 | 5 |
45
+ | `template` | 5 | 0 | 0 | 5 |
46
+ | `browse` | 4 | 2 | 0 | 2 |
47
+ | `external-key` | 4 | 0 | 0 | 4 |
48
+ | `trash` | 3 | 1 | 0 | 2 |
49
+ | `activity` | 2 | 1 | 0 | 1 |
50
+ | `job` | 2 | 2 | 0 | 0 |
51
+ | `report` | 1 | 1 | 0 | 0 |
52
+
53
+ ## `activity`
54
+
55
+ Verified: `activity.list`
56
+
57
+ | Command | State | Note |
58
+ |---|---|---|
59
+ | `activity.export` | observed blocker | server_error: see sweep report |
60
+
61
+ ## `agent`
62
+
63
+ Verified: `agent.session.list`
64
+
65
+ ## `ai`
66
+
67
+ | Command | State | Note |
68
+ |---|---|---|
69
+ | `ai.sql.generate` | observed blocker | validation_error: HTTP 400 Validation error |
70
+ | `ai.suggestion.list` | observed blocker | validation_error: HTTP 400 Validation error |
71
+
72
+ ## `annotation`
73
+
74
+ Verified: `annotation.list`
75
+
76
+ ## `automation`
77
+
78
+ Verified: `automation.list`
79
+
80
+ ## `batch`
81
+
82
+ Verified: `batch.get`, `batch.list`
83
+
84
+ ## `browse`
85
+
86
+ Verified: `browse.project`, `browse.workspace`
87
+
88
+ | Command | State | Note |
89
+ |---|---|---|
90
+ | `browse.folder` | observed blocker | cli_error: rejects folder id 0 although folder.root reports id 0 as the root |
91
+ | `browse.root` | observed blocker | server_error: see sweep report |
92
+
93
+ ## `connector`
94
+
95
+ Verified: `connector.active`, `connector.list`
96
+
97
+ | Command | State | Note |
98
+ |---|---|---|
99
+ | `connector.ai.session.list` | observed blocker | cli_error: backend returned HTTP 200 but the CLI raised api_error (envelope mismatch) |
100
+ | `connector.connection.list` | observed blocker | server_error: see sweep report |
101
+ | `connector.get` | observed blocker | validation_error: HTTP 400 'Invalid connector key' for a key returned by connector.list |
102
+
103
+ ## `dashboard`
104
+
105
+ Verified: `dashboard.analytics`, `dashboard.cancel-generation`, `dashboard.canvas.get`, `dashboard.canvas.restore`, `dashboard.chat.edit`, `dashboard.chat.history`, `dashboard.context.create`, `dashboard.context.delete`, `dashboard.context.extract`, `dashboard.context.list`, `dashboard.context.update`, `dashboard.create-blank`, `dashboard.delete`, `dashboard.descriptor-data`, `dashboard.duplicate`, `dashboard.exemplar.extract`, `dashboard.get`, `dashboard.get-by-url`, `dashboard.list`, `dashboard.page.plan`, `dashboard.pages.add`, `dashboard.qa.ask`, `dashboard.qa.comment.create`, `dashboard.qa.comment.delete`, `dashboard.qa.feedback`, `dashboard.qa.session.create`, `dashboard.qa.session.delete`, `dashboard.qa.session.fork`, `dashboard.qa.session.get`, `dashboard.qa.session.list`, `dashboard.qa.session.rename`, `dashboard.qa.session.set-visibility`, `dashboard.qa.settings.get`, `dashboard.qa.settings.set`, `dashboard.restore`, `dashboard.rls.assignment.list`, `dashboard.rls.assignment.set`, `dashboard.rls.column.list`, `dashboard.rls.value.list`, `dashboard.signature.create`, `dashboard.signature.delete`, `dashboard.signature.list`, `dashboard.signature.update`, `dashboard.style.custom.create`, `dashboard.style.custom.delete`, `dashboard.style.custom.list`, `dashboard.style.custom.update`, `dashboard.style.extract-brand`, `dashboard.style.preset.list`, `dashboard.style.token.list`, `dashboard.suggestion.list`, `dashboard.swap-data`, `dashboard.tags.delete`, `dashboard.tags.list`, `dashboard.tags.merge`, `dashboard.tags.rename`, `dashboard.tags.set`, `dashboard.template.fit`, `dashboard.template.list`, `dashboard.template.preview`, `dashboard.template.resolve-mapping`, `dashboard.templates.pending`, `dashboard.trash`, `dashboard.update`, `dashboard.v3.generate`, `dashboard.video-state`
106
+
107
+ | Command | State | Note |
108
+ |---|---|---|
109
+ | `dashboard.create` | not supported | Not supported on release: backend returns HTTP 409 4DASH012 DASHBOARD_LEGACY_CREATION_RETIRED (legacy dashboard creation retired). Use dashboard.create-blank or dashboard.v3.generate. Dashboard sweep 2026-09-18, CLI 2.0.12. |
110
+ | `dashboard.pdf.export` | not supported | Not supported from the CLI on release: backend HTTP 400 4GENR001 requires params.data to be the browser-hydrated DashboardData map and states it cannot rebuild it from stored descriptors (dashboard sweep and Haiku e2e, 2026-09-18). The route works only with a client render pass. |
111
+ | `dashboard.pdf-artifact` | observed blocker | blocked_missing_fixture: No real pdf export job_id obtainable (dashboard.pdf.export is itself blocked_missing_fixture) |
112
+ | `dashboard.published.canvas` | observed blocker | blocked_missing_fixture: HTTP 404 4DASH001 DASHBOARD_NOT_FOUND via url endpoint: D=52 was never actually published (was_published=false); the only publish mechanism is 'dashboard s |
113
+ | `dashboard.source.list` | observed blocker | server_error: HTTP 500 on GET /dashboards/sources; matches documented B04 SERVER_VARIANCE precondition |
114
+ | `dashboard.video.export` | observed blocker | validation_error: HTTP 400 4GENR001: 'publish the dashboard before exporting a video' -- clear, actionable message |
115
+ | `dashboard.widget-data` | observed blocker | blocked_missing_fixture: HTTP 409 4DASH004 DASHBOARD_WRONG_ENGINE: widget-data is a legacy-engine-only endpoint |
116
+ | `dashboard.archive` | CLI defect fixed, untried since | 2.0.14 accepts the non-object 200 body and reports the committed state |
117
+ | `dashboard.canvas.save` | CLI defect fixed, untried since | 2.0.14 no longer redacts style_tokens, so the canvas get -> save round-trip is intact |
118
+ | `dashboard.data.draft` | CLI defect fixed, untried since | 2.0.14 / SDK 0.7.6 send the WidgetDataSpec params envelope (widget_id) |
119
+ | `dashboard.data.published` | CLI defect fixed, untried since | 2.0.14 / SDK 0.7.6 send the WidgetDataSpec params envelope (widget_id) |
120
+ | `dashboard.figure-intent` | CLI defect fixed, untried since | SDK 0.7.6 returns an unmatched 2xx body instead of raising ValidationError |
121
+ | `dashboard.og-card` | CLI defect fixed, untried since | SDK 0.7.5 returns a described binary body |
122
+ | `dashboard.query` | CLI defect fixed, untried since | 2.0.14 example carries a descriptor with kind=scalar |
123
+ | `dashboard.style.default.get` | CLI defect fixed, untried since | SDK 0.7.6 returns an unmatched 2xx body instead of raising ValidationError |
124
+ | `dashboard.style.derive` | CLI defect fixed, untried since | 2.0.14 no longer redacts styleTokens |
125
+ | `dashboard.template.get` | CLI defect fixed, untried since | SDK 0.7.6 returns an unmatched 2xx body instead of raising ValidationError |
126
+
127
+ ## `data-app`
128
+
129
+ Verified: `data-app.list`
130
+
131
+ ## `dataset`
132
+
133
+ Verified: `dataset.batch-data`, `dataset.create`, `dataset.data`, `dataset.delete`, `dataset.file-settings.get`, `dataset.file-settings.update`, `dataset.get`, `dataset.list`, `dataset.trash`
134
+
135
+ ## `external-key`
136
+
137
+ | Command | State | Note |
138
+ |---|---|---|
139
+ | `external-key.list` | observed blocker | cli_error: not_authenticated although the same session authenticated elsewhere |
140
+
141
+ ## `file`
142
+
143
+ Verified: `file.get`, `file.list`, `file.upload`
144
+
145
+ ## `folder`
146
+
147
+ Verified: `folder.create`, `folder.delete`, `folder.get`, `folder.list`, `folder.update`
148
+
149
+ ## `job`
150
+
151
+ Verified: `job.get`, `job.get-many`
152
+
153
+ ## `notification`
154
+
155
+ Verified: `notification.list`
156
+
157
+ ## `parameter`
158
+
159
+ Verified: `parameter.group.list`, `parameter.list`
160
+
161
+ ## `project`
162
+
163
+ Verified: `project.checkpoint.list`, `project.data-check.list`, `project.list`, `project.pending-changes`, `project.resource-status`
164
+
165
+ | Command | State | Note |
166
+ |---|---|---|
167
+ | `project.publish-credentials` | observed blocker | cli_error: requires odbc_type, not discoverable read-only |
168
+ | `project.resource-dependencies` | observed blocker | cli_error: required resource_ids has no CLI flag |
169
+
170
+ ## `report`
171
+
172
+ Verified: `report.list`
173
+
174
+ ## `schedule`
175
+
176
+ | Command | State | Note |
177
+ |---|---|---|
178
+ | `schedule.list` | observed blocker | validation_error: HTTP 400 with message 'Not implemented' |
179
+
180
+ ## `snippet`
181
+
182
+ Verified: `snippet.list`
183
+
184
+ ## `template`
185
+
186
+ | Command | State | Note |
187
+ |---|---|---|
188
+ | `template.list` | observed blocker | cli_error: backend returned HTTP 200 but the CLI raised api_error (envelope mismatch) |
189
+
190
+ ## `trash`
191
+
192
+ Verified: `trash.list`
193
+
194
+ ## `user`
195
+
196
+ Verified: `user.get`, `user.preference.get`
197
+
198
+ ## `view`
199
+
200
+ Verified: `view.active-user.list`, `view.checkpoint.list`, `view.conditional-format.list`, `view.create`, `view.data-check.list`, `view.data.get`, `view.data.query`, `view.derivative.list`, `view.export.list`, `view.exportable-config.get`, `view.get`, `view.list`, `view.parameter-context`, `view.pipeline.get`, `view.pipeline.items`, `view.preview`, `view.task.add`, `view.task.get`, `view.task.list`, `view.version.get`, `view.version.list`
201
+
202
+ | Command | State | Note |
203
+ |---|---|---|
204
+ | `view.ai.generation-info` | observed blocker | validation_error: HTTP 400 with message 'Not implemented' |
205
+
206
+ ## `webhook`
207
+
208
+ | Command | State | Note |
209
+ |---|---|---|
210
+ | `webhook.list` | observed blocker | cli_error: api_error with no HTTP status recorded |
211
+
212
+ ## `workflow`
213
+
214
+ Verified: `workflow.graph`, `workflow.list`, `workflow.workspace-datasets`, `workflow.workspace-exports`, `workflow.workspace-sources`
215
+
216
+ ## `workspace`
217
+
218
+ Verified: `workspace.app-usage`, `workspace.get`, `workspace.list`, `workspace.segment.list`, `workspace.storage-breakdown`, `workspace.user.list`
219
+
220
+ Evidence version: CLI mammoth-cli 1.1.11; mammoth-io 0.7.1. Details: `docs/capability-evidence/` in the repository.
@@ -148,7 +148,7 @@ Expected success: `DashboardCreateBlankResult` in the standard JSON envelope; mu
148
148
 
149
149
  Run: `mammoth dashboard data draft`. Exact input fields: `mammoth schema get dashboard.data.draft --output json --no-input`.
150
150
 
151
- Example: `mammoth dashboard data draft 123 --input '{"sql": "SELECT region, SUM(revenue) FROM data GROUP BY region"}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
151
+ Example: `mammoth dashboard data draft 123 --input '{"widget_id": "550e8400-e29b-41d4-a716-446655440000"}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
152
152
 
153
153
  Expected success: `DashboardDataDraftResult` in the standard JSON envelope; mutation `read`, confirmation `none`, wait policy `always_wait`. On nonzero exit, inspect the JSON error envelope and its `recovery_commands`; do not guess request fields. See [representative envelopes](../machine-output.md) for concrete success/error shapes.
154
154
 
@@ -156,7 +156,7 @@ Expected success: `DashboardDataDraftResult` in the standard JSON envelope; muta
156
156
 
157
157
  Run: `mammoth dashboard data published`. Exact input fields: `mammoth schema get dashboard.data.published --output json --no-input`.
158
158
 
159
- Example: `mammoth dashboard data published 123 --input '{"sql": "SELECT region, SUM(revenue) FROM data GROUP BY region"}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
159
+ Example: `mammoth dashboard data published 123 --input '{"widget_id": "550e8400-e29b-41d4-a716-446655440000"}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
160
160
 
161
161
  Expected success: `DashboardDataPublishedResult` in the standard JSON envelope; mutation `read`, confirmation `none`, wait policy `always_wait`. On nonzero exit, inspect the JSON error envelope and its `recovery_commands`; do not guess request fields. See [representative envelopes](../machine-output.md) for concrete success/error shapes.
162
162
 
@@ -460,7 +460,7 @@ Expected success: `DashboardQaSettingsSetResult` in the standard JSON envelope;
460
460
 
461
461
  Run: `mammoth dashboard query`. Exact input fields: `mammoth schema get dashboard.query --output json --no-input`.
462
462
 
463
- Example: `mammoth dashboard query 123 --input '{"body": {"params": {"descriptor": {}}}}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
463
+ Example: `mammoth dashboard query 123 --input '{"body": {"params": {"descriptor": {"kind": "scalar", "agg": "count"}}}}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
464
464
 
465
465
  Expected success: `DashboardQueryResult` in the standard JSON envelope; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`. On nonzero exit, inspect the JSON error envelope and its `recovery_commands`; do not guess request fields. See [representative envelopes](../machine-output.md) for concrete success/error shapes.
466
466
 
@@ -788,7 +788,7 @@ Expected success: `DashboardTrashResult` in the standard JSON envelope; mutation
788
788
 
789
789
  Run: `mammoth dashboard update`. Exact input fields: `mammoth schema get dashboard.update --output json --no-input`.
790
790
 
791
- Example: `mammoth dashboard update 123 --input '{"patch": [{"op": "add", "path": "intent", "value": "sample"}]}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
791
+ Example: `mammoth dashboard update 123 --input '{"patch": [{"op": "replace", "path": "title", "value": "Renamed dashboard"}]}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
792
792
 
793
793
  Expected success: `DashboardUpdateResult` in the standard JSON envelope; mutation `benign_mutation`, confirmation `none`, wait policy `returns_job`. On nonzero exit, inspect the JSON error envelope and its `recovery_commands`; do not guess request fields. See [representative envelopes](../machine-output.md) for concrete success/error shapes.
794
794
 
@@ -32,3 +32,28 @@ mammoth schema find "dashboard" --output json --no-input
32
32
  Page/widget schemas vary by release. Read each schema, use returned IDs, and
33
33
  verify dashboard source plus draft/published data after every mutation. A
34
34
  creation response alone is not proof of a usable published view.
35
+
36
+ ## Canvas, widget data and PDF
37
+
38
+ Never save an invented canvas. Read it, change it, write it back:
39
+
40
+ ```bash
41
+ mammoth dashboard canvas get DASHBOARD_ID --output json --no-input # data.canvas incl. style_tokens
42
+ mammoth dashboard canvas save DASHBOARD_ID --input '{"body":{"params":{"canvas":CANVAS_FROM_GET}}}' --output json --no-input
43
+ ```
44
+
45
+ `canvas save` with `{"canvas": {}}` fails (`dataset` and other fields are
46
+ required); the object returned by `canvas get` is the only known-good shape.
47
+ Widget ids for `dashboard data draft` / `dashboard data published` come from
48
+ that canvas: `--input '{"widget_id": "WIDGET_UUID"}'` (optional
49
+ `global_filters` / `drilldown_filters` objects). `dashboard query` needs a
50
+ descriptor with a `kind` (`scalar`, `group`, `rate`, `detail`, `options`,
51
+ `range`); `{"kind":"scalar","agg":"count"}` is the smallest that runs.
52
+
53
+ `dashboard pdf export` and `dashboard video export` cannot be completed from
54
+ the CLI: the backend requires the browser-hydrated `DashboardData` map
55
+ (pre-rendered widget results) in `params.data` and refuses to rebuild it. Report
56
+ this as a known limitation instead of retrying with `{}`. `dashboard create`
57
+ (legacy engine) is retired on release (HTTP 409 `4DASH012`); use
58
+ `create-blank` or `v3 generate`.
59
+
@@ -16,6 +16,10 @@ mammoth view list DATASET_ID --project PROJECT_ID --output json --no-input
16
16
  mammoth view get VIEW_ID --project PROJECT_ID --output json --no-input
17
17
  ```
18
18
 
19
+ `file upload` takes the local path as its positional argument; there is no
20
+ `--source`/`--file` option. `dataset delete` is asynchronous: re-read
21
+ `dataset list` (the id disappears once the job completes) before reporting.
22
+
19
23
  Use display names from the exact view schema. For settings, folders and other
20
24
  families, use `schema find`/`schema get` first, then read back the exact parent
21
25
  and resource IDs. For example:
@@ -19,7 +19,21 @@ parent from `view list DATASET_ID` (you already know it after upload) or
19
19
 
20
20
  Prefer typed operations such as convert-type, fill-missing, replace, join,
21
21
  lookup, filter and math only when the live schema
22
- lists them. For each operation, a successful result should contain a returned
22
+ lists them. Pick the operation by what it does, not by its name:
23
+
24
+ - `fill-missing` copies the previous/next row's value into blanks
25
+ (`direction` = `LAST_VALUE` forward-fill or `FIRST_VALUE`). It cannot write a
26
+ literal. To fill blanks with a constant (for example `0`), use `set-values`
27
+ on the existing column with an `IS_EMPTY` condition:
28
+
29
+ ```bash
30
+ mammoth view transform set-values VIEW_ID --project PROJECT_ID \
31
+ --input '{"dataset_id":DATASET_ID,"existing_column":"revenue","values":[{"value":0}],"condition":{"column":"revenue","operator":"IS_EMPTY"}}' \
32
+ --output json --no-input
33
+ ```
34
+
35
+ - `filter` keeps matching rows by default (`filter_type: "SHOW"`); to drop
36
+ rows, say so: `{"condition":{"column":"units","operator":"LT","value":0},"filter_type":"REMOVE"}`. For each operation, a successful result should contain a returned
23
37
  task/job reference or updated view envelope; then verify with `view task list`,
24
38
  `view task get`, `view pipeline items`, or preview according to its schema.
25
39
 
@@ -50,7 +50,9 @@ or secrets in an argument, prompt, transcript, or checkpoint.
50
50
  4. Discover instead of guessing. Run `mammoth schema list/find/get --output
51
51
  json --no-input` for local CLI routes; `mammoth capability list --output
52
52
  json --no-input` is an API-binding inventory and can omit typed/local
53
- routes. Then resolve workspace/project/dataset/view
53
+ routes. Check [capabilities](capabilities.md) for whether a route is
54
+ proven, not supported, or untried on release before building a plan on
55
+ it. Then resolve workspace/project/dataset/view
54
56
  parents with reads. Use display names returned by the exact view schema.
55
57
  5. Translate the business intent into a plan the agent chooses. Submit only
56
58
  supported operations with explicit `--project` (and other returned parents),
@@ -365,24 +365,52 @@ def dashboard_analytics(invocation: Invocation) -> HandlerResult:
365
365
  return data, _meta(invocation, auth.workspace_id)
366
366
 
367
367
 
368
+ def _widget_data_kwargs(invocation: Invocation) -> dict[str, Any]:
369
+ """Bind the ``WidgetDataSpec`` fields the draft/published data routes take.
370
+
371
+ ``widget_id`` (the widget UUID) is required; ``global_filters`` and
372
+ ``drilldown_filters`` are optional ``{column: value}`` objects.
373
+ """
374
+ document = _bound_document(invocation)
375
+ widget_id = _require_field(document, "widget_id")
376
+ if not isinstance(widget_id, str) or not widget_id.strip():
377
+ raise CliError(
378
+ code=CODE_INVALID_ARGUMENT,
379
+ message="The 'widget_id' input field must be a non-empty widget UUID string.",
380
+ exit_status=EXIT_USAGE,
381
+ hint="Read widget ids from 'mammoth dashboard canvas get DASHBOARD_ID'.",
382
+ )
383
+ kwargs: dict[str, Any] = {"widget_id": widget_id}
384
+ for name in ("global_filters", "drilldown_filters"):
385
+ if name not in document:
386
+ continue
387
+ value = document[name]
388
+ if not isinstance(value, dict):
389
+ raise CliError(
390
+ code=CODE_INVALID_ARGUMENT,
391
+ message=f"The '{name}' input field must be an object of column -> value.",
392
+ exit_status=EXIT_USAGE,
393
+ )
394
+ kwargs[name] = value
395
+ return kwargs
396
+
397
+
368
398
  def dashboard_data_draft(invocation: Invocation) -> HandlerResult:
369
- """Run a SQL query against a dashboard's draft data. ``sql`` comes from ``--input``."""
399
+ """Read one widget's rows from a dashboard's draft state. Fields come from ``--input``."""
370
400
  dashboard_id = _require_int_positional(invocation, "dashboard id")
371
- document = _bound_document(invocation)
372
- sql = _require_field(document, "sql")
401
+ kwargs = _widget_data_kwargs(invocation)
373
402
  with open_service(invocation) as (service, auth):
374
- data = service.call(_symbol(invocation), dashboard_id=dashboard_id, sql=sql)
403
+ data = service.call(_symbol(invocation), dashboard_id=dashboard_id, **kwargs)
375
404
  data = _resolve_job(service, invocation, data)
376
405
  return data, _meta(invocation, auth.workspace_id)
377
406
 
378
407
 
379
408
  def dashboard_data_published(invocation: Invocation) -> HandlerResult:
380
- """Run a SQL query against a dashboard's published data. ``sql`` from ``--input``."""
409
+ """Read one widget's rows from a dashboard's published state. Fields from ``--input``."""
381
410
  dashboard_id = _require_int_positional(invocation, "dashboard id")
382
- document = _bound_document(invocation)
383
- sql = _require_field(document, "sql")
411
+ kwargs = _widget_data_kwargs(invocation)
384
412
  with open_service(invocation) as (service, auth):
385
- data = service.call(_symbol(invocation), dashboard_id=dashboard_id, sql=sql)
413
+ data = service.call(_symbol(invocation), dashboard_id=dashboard_id, **kwargs)
386
414
  data = _resolve_job(service, invocation, data)
387
415
  return data, _meta(invocation, auth.workspace_id)
388
416
 
@@ -561,6 +589,10 @@ def dashboard_archive(invocation: Invocation) -> HandlerResult:
561
589
  data = service.call(
562
590
  _symbol(invocation), dashboard_id=dashboard_id, archived=document["archived"]
563
591
  )
592
+ if not isinstance(data, dict):
593
+ # The route declares no response body; give the committed state a
594
+ # stable object shape instead of a bare scalar.
595
+ data = {"dashboard_id": dashboard_id, "archived": document["archived"], "response": data}
564
596
  return data, _meta(invocation, auth.workspace_id)
565
597
 
566
598
 
@@ -14,6 +14,7 @@ import decimal
14
14
  import enum
15
15
  import ipaddress
16
16
  import math
17
+ import re
17
18
  import uuid
18
19
  from collections.abc import Mapping
19
20
  from pathlib import Path
@@ -50,12 +51,33 @@ class _NormalizedJsonSchema(dict[str, Any]):
50
51
  """
51
52
 
52
53
 
54
+ _CAMEL_BOUNDARY = re.compile(r"(?<=[a-z0-9])(?=[A-Z])")
55
+ # Plural ``*_tokens`` keys that still name credentials rather than design data.
56
+ _CREDENTIAL_TOKEN_PREFIXES = ("access", "refresh", "auth", "api", "bearer", "session", "oauth")
57
+
58
+
53
59
  def _is_secret_key(key: str) -> bool:
54
- lowered = key.lower()
60
+ # ``styleTokens`` and ``style_tokens`` must be judged the same way.
61
+ lowered = _CAMEL_BOUNDARY.sub("_", key).lower()
55
62
  # ``token_count`` is ordinary result metadata (for example an LLM usage
56
63
  # counter), not a credential. Do not let the broad token guard erase it.
57
- if lowered in {"token_count", "next_token", "continuation_token", "design_tokens"}:
64
+ if lowered in {
65
+ "token_count",
66
+ "next_token",
67
+ "continuation_token",
68
+ "page_token",
69
+ "design_tokens",
70
+ }:
58
71
  return False
72
+ if "token" in lowered and not any(
73
+ hint in lowered for hint in _SECRET_KEY_HINTS if hint != "token"
74
+ ):
75
+ # Credential tokens are singular (``token``, ``access_token``). Plural
76
+ # ``tokens`` / ``style_tokens`` are dashboard design-system data, and
77
+ # erasing them breaks the canvas get -> save round-trip.
78
+ if lowered == "tokens" or lowered.endswith("_tokens"):
79
+ return lowered.startswith(_CREDENTIAL_TOKEN_PREFIXES)
80
+ return True
59
81
  return any(hint in lowered for hint in _SECRET_KEY_HINTS)
60
82
 
61
83
 
@@ -69,8 +91,7 @@ def _is_secret_value(value: Any) -> bool:
69
91
  """
70
92
  value_type = type(value)
71
93
  return value_type.__name__ in {"SecretStr", "SecretBytes"} or (
72
- "secret" in value_type.__name__.lower()
73
- and hasattr(value, "get_secret_value")
94
+ "secret" in value_type.__name__.lower() and hasattr(value, "get_secret_value")
74
95
  )
75
96
 
76
97
 
@@ -145,6 +145,20 @@ _EXAMPLE_INPUT_HINTS: dict[str, dict[str, Any]] = {
145
145
  # Blank dashboard creation requires a typed params envelope. Keep the
146
146
  # generated destructive example runnable with the explicit approval flag.
147
147
  "dashboard.create-blank": {"params": {"dataview_id": 1}},
148
+ # The draft/published data routes take a WidgetDataSpec keyed by the
149
+ # widget UUID (read it from ``dashboard canvas get``), not a SQL string.
150
+ "dashboard.data.draft": {"widget_id": "550e8400-e29b-41d4-a716-446655440000"},
151
+ "dashboard.data.published": {"widget_id": "550e8400-e29b-41d4-a716-446655440000"},
152
+ # ``descriptor`` is a baked/1 QueryDescriptor discriminated by ``kind``
153
+ # (group | scalar | rate | detail | options | range); an empty object is
154
+ # rejected. A scalar row count runs against any dashboard.
155
+ "dashboard.query": {"body": {"params": {"descriptor": {"kind": "scalar", "agg": "count"}}}},
156
+ # ``path`` is a bare field name (title | intent | theme | pages | filters),
157
+ # not a JSON pointer, and an ``intent`` value must be at least 10 chars; a
158
+ # title rename is the smallest patch that runs.
159
+ "dashboard.update": {
160
+ "patch": [{"op": "replace", "path": "title", "value": "Renamed dashboard"}]
161
+ },
148
162
  }
149
163
 
150
164
 
@@ -321,6 +321,37 @@ def map_sdk_exception(
321
321
  details=dict(getattr(exc, "details", {}) or {}),
322
322
  )
323
323
 
324
+ errors = getattr(exc, "errors", None)
325
+ if type(exc).__name__ == "ValidationError" and callable(errors):
326
+ # A pydantic validation failure: say which fields, not just the class
327
+ # name, or the operator cannot tell what was wrong with the call.
328
+ try:
329
+ raw_errors = errors(include_url=False, include_input=False)
330
+ except TypeError:
331
+ raw_errors = errors()
332
+ summary = [
333
+ {
334
+ "loc": ".".join(str(part) for part in item.get("loc", ())),
335
+ "type": item.get("type"),
336
+ "msg": item.get("msg"),
337
+ }
338
+ for item in list(raw_errors)[:10]
339
+ ]
340
+ return CliError(
341
+ code=CODE_API_ERROR,
342
+ message=(
343
+ f"The SDK could not validate {getattr(exc, 'title', 'the payload')} "
344
+ "against its model."
345
+ ),
346
+ exit_status=EXIT_API,
347
+ hint="Compare the listed fields with 'mammoth schema get COMMAND_ID'.",
348
+ details={
349
+ "exception_type": "ValidationError",
350
+ "model": getattr(exc, "title", None),
351
+ "validation_errors": summary,
352
+ },
353
+ )
354
+
324
355
  return CliError(
325
356
  code=CODE_API_ERROR,
326
357
  message="The Mammoth operation failed unexpectedly.",
@@ -157,6 +157,14 @@ POSITIONAL_OVERRIDES: dict[str, tuple[PositionalSpec, ...]] = {
157
157
  "dashboard.templates.use": (
158
158
  PositionalSpec(name="slug", type=str, required=True, help="Template slug."),
159
159
  ),
160
+ # The widget UUID is a WidgetDataSpec field, read from ``--input`` with the
161
+ # optional filters; only the dashboard is addressed positionally.
162
+ "dashboard.data.draft": (
163
+ PositionalSpec(name="dashboard_id", type=int, required=True, help="ID of the dashboard."),
164
+ ),
165
+ "dashboard.data.published": (
166
+ PositionalSpec(name="dashboard_id", type=int, required=True, help="ID of the dashboard."),
167
+ ),
160
168
  "dashboard.tags.merge": (
161
169
  PositionalSpec(name="tag_id", type=int, required=True, help="ID of the source tag."),
162
170
  ),
@@ -1,13 +1,13 @@
1
1
  [project]
2
2
  name = "mammoth-cli"
3
- version = "2.0.13"
3
+ version = "2.0.14"
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.7.5,<0.8)",
10
+ "mammoth-io (>=0.7.6,<0.8)",
11
11
  "typer (>=0.27,<0.28)",
12
12
  "rich (>=15,<16)",
13
13
  "platformdirs (>=4.10,<5)",
@@ -738,8 +738,8 @@ commands:
738
738
  required_fixture_guard: null
739
739
  secret_fields: []
740
740
  human_example: mammoth dashboard data draft DASHBOARD_ID --help
741
- agent_example: 'mammoth dashboard data draft 123 --input ''{"sql": "SELECT region, SUM(revenue) FROM
742
- data GROUP BY region"}'' --output json --no-input'
741
+ agent_example: 'mammoth dashboard data draft 123 --input ''{"widget_id": "550e8400-e29b-41d4-a716-446655440000"}''
742
+ --output json --no-input'
743
743
  unit_tests:
744
744
  - UT-DASHBOARD-DATA-DRAFT
745
745
  contract_tests:
@@ -779,8 +779,8 @@ commands:
779
779
  required_fixture_guard: null
780
780
  secret_fields: []
781
781
  human_example: mammoth dashboard data published DASHBOARD_ID --help
782
- agent_example: 'mammoth dashboard data published 123 --input ''{"sql": "SELECT region, SUM(revenue)
783
- FROM data GROUP BY region"}'' --output json --no-input'
782
+ agent_example: 'mammoth dashboard data published 123 --input ''{"widget_id": "550e8400-e29b-41d4-a716-446655440000"}''
783
+ --output json --no-input'
784
784
  unit_tests:
785
785
  - UT-DASHBOARD-DATA-PUBLISHED
786
786
  contract_tests:
@@ -1398,7 +1398,9 @@ commands:
1398
1398
  - CT-DASHBOARD-PDF-EXPORT-ERROR
1399
1399
  draft_test: null
1400
1400
  undo_test: null
1401
- known_restrictions: null
1401
+ known_restrictions: Backend requires params.data to be the browser-hydrated DashboardData map
1402
+ (pre-rendered widget results); the server stores only query descriptors and cannot rebuild
1403
+ it, so a PDF cannot be produced from the CLI alone.
1402
1404
  reviewed_by: primary
1403
1405
  - command_id: dashboard.published-data-by-url
1404
1406
  command_path: dashboard published-data-by-url
@@ -2415,8 +2417,8 @@ commands:
2415
2417
  required_fixture_guard: null
2416
2418
  secret_fields: []
2417
2419
  human_example: mammoth dashboard query DASHBOARD_ID --help
2418
- agent_example: 'mammoth dashboard query 123 --input ''{"body": {"params": {"descriptor": {}}}}'' --output
2419
- json --no-input'
2420
+ agent_example: 'mammoth dashboard query 123 --input ''{"body": {"params": {"descriptor": {"kind": "scalar",
2421
+ "agg": "count"}}}}'' --output json --no-input'
2420
2422
  unit_tests:
2421
2423
  - UT-DASHBOARD-QUERY
2422
2424
  contract_tests:
@@ -3999,8 +4001,8 @@ commands:
3999
4001
  required_fixture_guard: null
4000
4002
  secret_fields: []
4001
4003
  human_example: mammoth dashboard update DASHBOARD_ID --help
4002
- agent_example: 'mammoth dashboard update 123 --input ''{"patch": [{"op": "add", "path": "intent", "value":
4003
- "sample"}]}'' --output json --no-input'
4004
+ agent_example: 'mammoth dashboard update 123 --input ''{"patch": [{"op": "replace", "path": "title", "value":
4005
+ "Renamed dashboard"}]}'' --output json --no-input'
4004
4006
  unit_tests:
4005
4007
  - UT-DASHBOARD-UPDATE
4006
4008
  contract_tests: