mammoth-cli 2.0.12__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.12 → mammoth_cli-2.0.14}/PKG-INFO +2 -2
  2. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/app.py +34 -6
  4. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +3 -0
  5. mammoth_cli-2.0.14/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +220 -0
  6. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +4 -4
  7. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +1 -1
  8. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +25 -0
  9. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +4 -0
  10. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +15 -1
  11. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +3 -1
  12. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/dashboard.py +40 -8
  13. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/view.py +15 -3
  14. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/output/normalize.py +25 -4
  15. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/input_fields.py +17 -0
  16. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/mapping.py +31 -0
  17. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/positionals.py +8 -0
  18. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/pyproject.toml +2 -2
  19. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/dashboard.yaml +11 -9
  20. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/project.yaml +1 -2
  21. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/sdk-methods.yaml +2 -2
  22. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/.gitignore +0 -0
  23. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/LICENSE +0 -0
  24. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/README.md +0 -0
  25. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/__main__.py +0 -0
  26. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  27. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
  28. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  29. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  30. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  31. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  32. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  33. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  34. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  35. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  36. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  37. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  38. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  39. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  40. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  41. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  42. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  43. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  44. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  45. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  46. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  47. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  48. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  49. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  50. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  51. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  52. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  53. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  54. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  55. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  56. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  57. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  58. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  59. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  60. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  61. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  62. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  63. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  64. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +0 -0
  65. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  66. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  67. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  68. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  69. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
  70. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  71. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  72. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  73. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  74. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  75. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  76. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  77. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  78. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  79. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  80. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  81. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  82. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/__init__.py +0 -0
  83. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/activity.py +0 -0
  84. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/addon.py +0 -0
  85. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/agent.py +0 -0
  86. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/ai.py +0 -0
  87. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/annotation.py +0 -0
  88. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/auth.py +0 -0
  89. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/automation.py +0 -0
  90. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/batch.py +0 -0
  91. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/billing.py +0 -0
  92. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/browse.py +0 -0
  93. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/capability.py +0 -0
  94. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/client_app.py +0 -0
  95. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/completion.py +0 -0
  96. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/config.py +0 -0
  97. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/connector.py +0 -0
  98. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/context.py +0 -0
  99. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/data_app.py +0 -0
  100. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/dataset.py +0 -0
  101. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/doctor.py +0 -0
  102. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/external_key.py +0 -0
  103. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/file.py +0 -0
  104. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/folder.py +0 -0
  105. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/job.py +0 -0
  106. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/notification.py +0 -0
  107. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/parameter.py +0 -0
  108. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/project.py +0 -0
  109. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/registry.py +0 -0
  110. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/report.py +0 -0
  111. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/schedule.py +0 -0
  112. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/schema.py +0 -0
  113. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/skill.py +0 -0
  114. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/snippet.py +0 -0
  115. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/support.py +0 -0
  116. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/template.py +0 -0
  117. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/trash.py +0 -0
  118. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/upgrade.py +0 -0
  119. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/user.py +0 -0
  120. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/view_ops.py +0 -0
  121. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/webhook.py +0 -0
  122. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/workflow.py +0 -0
  123. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/commands/workspace.py +0 -0
  124. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/context/__init__.py +0 -0
  125. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/context/credentials.py +0 -0
  126. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/context/endpoint.py +0 -0
  127. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/context/profiles.py +0 -0
  128. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/context/resolver.py +0 -0
  129. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/contracts/__init__.py +0 -0
  130. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/contracts/auth.py +0 -0
  131. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/errors/__init__.py +0 -0
  132. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/errors/envelope.py +0 -0
  133. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/manifest/__init__.py +0 -0
  134. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/manifest/loader.py +0 -0
  135. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/messages/__init__.py +0 -0
  136. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/output/__init__.py +0 -0
  137. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/output/envelope.py +0 -0
  138. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/output/policy.py +0 -0
  139. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/output/progress.py +0 -0
  140. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/output/render.py +0 -0
  141. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/py.typed +0 -0
  142. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/runtime/__init__.py +0 -0
  143. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/runtime/confirm.py +0 -0
  144. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/runtime/executor.py +0 -0
  145. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/runtime/input_loader.py +0 -0
  146. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/runtime/invocation.py +0 -0
  147. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/runtime/options.py +0 -0
  148. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/runtime/session.py +0 -0
  149. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/runtime/strict.py +0 -0
  150. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/runtime/validate.py +0 -0
  151. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/__init__.py +0 -0
  152. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/argspec.py +0 -0
  153. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/coerce.py +0 -0
  154. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/command_contract.py +0 -0
  155. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/conditions.py +0 -0
  156. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/dispatch.py +0 -0
  157. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/factory.py +0 -0
  158. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/openapi_types.py +0 -0
  159. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/protocol.py +0 -0
  160. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/sdk_service.py +0 -0
  161. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/testing.py +0 -0
  162. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/services/type_system.py +0 -0
  163. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/skills/__init__.py +0 -0
  164. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/skills/installer.py +0 -0
  165. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/mammoth_cli/testing.py +0 -0
  166. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/activity.yaml +0 -0
  167. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/addon.yaml +0 -0
  168. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/agent.yaml +0 -0
  169. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/ai.yaml +0 -0
  170. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/annotation.yaml +0 -0
  171. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/auth.yaml +0 -0
  172. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/automation.yaml +0 -0
  173. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/batch.yaml +0 -0
  174. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/billing.yaml +0 -0
  175. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/browse.yaml +0 -0
  176. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/capability.yaml +0 -0
  177. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/client-app.yaml +0 -0
  178. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/completion.yaml +0 -0
  179. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/config.yaml +0 -0
  180. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/connector.yaml +0 -0
  181. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/context.yaml +0 -0
  182. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/data-app.yaml +0 -0
  183. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/dataset.yaml +0 -0
  184. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/doctor.yaml +0 -0
  185. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/external-key.yaml +0 -0
  186. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/file.yaml +0 -0
  187. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/folder.yaml +0 -0
  188. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/job.yaml +0 -0
  189. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/notification.yaml +0 -0
  190. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/parameter.yaml +0 -0
  191. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/report.yaml +0 -0
  192. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/schedule.yaml +0 -0
  193. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/schema.yaml +0 -0
  194. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/skill.yaml +0 -0
  195. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/snippet.yaml +0 -0
  196. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/support.yaml +0 -0
  197. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/template.yaml +0 -0
  198. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/trash.yaml +0 -0
  199. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/upgrade.yaml +0 -0
  200. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/user.yaml +0 -0
  201. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/version.yaml +0 -0
  202. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/view.yaml +0 -0
  203. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/webhook.yaml +0 -0
  204. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/workflow.yaml +0 -0
  205. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/commands/workspace.yaml +0 -0
  206. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/openapi-operations.yaml +0 -0
  207. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/schema-v1.json +0 -0
  208. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/manifests/sdk-catalog.source.yaml +0 -0
  209. {mammoth_cli-2.0.12 → mammoth_cli-2.0.14}/spec/openapi/metadata.json +0 -0
  210. {mammoth_cli-2.0.12 → 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.12
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.4
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.12"
9
+ __version__ = "2.0.14"
10
10
 
11
11
  # The versioned machine output envelope contract.
12
12
  SCHEMA_VERSION = 1
@@ -24,6 +24,7 @@ from typing import Annotated, Any
24
24
 
25
25
  import typer
26
26
  from typer._click import exceptions as _typer_click_exceptions
27
+ from typer._click.core import Command as _ClickCommand
27
28
  from typer.core import TyperGroup
28
29
 
29
30
  from mammoth_cli import __version__
@@ -297,6 +298,33 @@ def _usage_error_report(error: Any, tokens: Sequence[str]) -> CliError | None:
297
298
  )
298
299
 
299
300
 
301
+ class _LeafGroup(TyperGroup):
302
+ """Group for a node that is also an invocable command with positionals.
303
+
304
+ Click resolves the first bare token after a group as a subcommand name, so
305
+ ``mammoth project resource-dependencies 3`` failed with ``No such command
306
+ '3'`` even though the manifest (and every printed example) takes the
307
+ project id positionally. When the leading token is not a registered
308
+ subcommand, keep every token as an argument for the group callback instead;
309
+ genuine subcommands (``... resource-dependencies update 3``) are unaffected.
310
+ """
311
+
312
+ def parse_args(self, ctx: Any, args: list[str]) -> list[str]:
313
+ super().parse_args(ctx, args)
314
+ protected = list(getattr(ctx, "_protected_args", ()) or ())
315
+ if protected and protected[0] not in self.commands:
316
+ # Leaf invocation. A group parser stops at the first bare token, so
317
+ # options after the positional were left unparsed; parse again as a
318
+ # plain command with interspersed options, keeping the bare tokens
319
+ # as the callback's positional arguments.
320
+ ctx.allow_interspersed_args = True
321
+ ctx.args = _ClickCommand.parse_args(self, ctx, list(args))
322
+ # Click's own attribute for the pending subcommand token (Click
323
+ # >= 8.2 made it private); not an SDK member.
324
+ setattr(ctx, "_protected_args", []) # noqa: B010
325
+ return list(ctx.args)
326
+
327
+
300
328
  class _EnvelopeGroup(TyperGroup):
301
329
  """Root group that renders Click usage errors as the machine error envelope.
302
330
 
@@ -358,10 +386,10 @@ class _EnvelopeGroup(TyperGroup):
358
386
  # group-level classifier (schema get and nested commands rely on the
359
387
  # stable missing_argument envelope).
360
388
  error_message = error.format_message()
361
- is_missing_parameter = isinstance(
362
- error, _typer_click_exceptions.MissingParameter
363
- ) or error.__class__.__name__ == "MissingParameter" or bool(
364
- re.match(r"^Missing argument '[^']+'\.", error_message)
389
+ is_missing_parameter = (
390
+ isinstance(error, _typer_click_exceptions.MissingParameter)
391
+ or error.__class__.__name__ == "MissingParameter"
392
+ or bool(re.match(r"^Missing argument '[^']+'\.", error_message))
365
393
  )
366
394
  report = None if is_missing_parameter else _usage_error_report(error, tokens)
367
395
  if _output_mode_from_argv(argv) in MACHINE_OUTPUTS:
@@ -393,8 +421,7 @@ class _EnvelopeGroup(TyperGroup):
393
421
  (
394
422
  token.split("=", 1)[0]
395
423
  for token in tokens
396
- if token.startswith("--")
397
- and token.split("=", 1)[0] not in known
424
+ if token.startswith("--") and token.split("=", 1)[0] not in known
398
425
  ),
399
426
  None,
400
427
  )
@@ -829,6 +856,7 @@ def build_app() -> typer.Typer:
829
856
  if command_id is not None:
830
857
  # This node is both a group and an invocable command.
831
858
  sub = typer.Typer(
859
+ cls=_LeafGroup,
832
860
  no_args_is_help=False,
833
861
  invoke_without_command=True,
834
862
  context_settings={"allow_extra_args": True, "ignore_unknown_options": True},
@@ -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
 
@@ -84,7 +84,7 @@ Expected success: `ProjectPublishCredentialsResult` in the standard JSON envelop
84
84
 
85
85
  Run: `mammoth project resource-dependencies`. Exact input fields: `mammoth schema get project.resource-dependencies --output json --no-input`.
86
86
 
87
- Example: `mammoth project resource-dependencies 123 --input '{"resource_ids": ["resource-123"]}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
87
+ Example: `mammoth project resource-dependencies 123 --input '{"resource_ids": [456]}' --output json --no-input`. Runnable only after resolving schema-required IDs and input from observed reads.
88
88
 
89
89
  Expected success: `ProjectResourceDependenciesResult` in the standard JSON envelope; mutation `read`, 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.
90
90
 
@@ -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
 
@@ -1214,13 +1214,25 @@ def view_pipeline_items(invocation: Invocation) -> HandlerResult:
1214
1214
  def view_pipeline_items_all(invocation: Invocation) -> HandlerResult:
1215
1215
  """Read all pipeline items through bounded, exact-parent pagination."""
1216
1216
  dataview_id = _require_int_positional_at(invocation, 0, "dataview id")
1217
- document = invocation.load_input() or {}
1217
+ document = dict(invocation.load_input() or {})
1218
+ # The schema advertises an optional trailing DATASET_ID positional that
1219
+ # falls back to the input field; honour both, and reject a disagreement.
1220
+ positional_parent = _int_positional_at(invocation, 1, "dataset id")
1221
+ if positional_parent is not None:
1222
+ if document.get("dataset_id") not in (None, positional_parent):
1223
+ raise CliError(
1224
+ code="ambiguous_resource_identity",
1225
+ message="Conflicting dataset ids identify different parent resources.",
1226
+ exit_status=EXIT_USAGE,
1227
+ hint="Pass one exact dataset id matching the target view.",
1228
+ )
1229
+ document["dataset_id"] = positional_parent
1218
1230
  if "dataset_id" not in document:
1219
1231
  raise CliError(
1220
1232
  code=CODE_MISSING_FIELD,
1221
- message="This command requires the 'dataset_id' input field.",
1233
+ message="This command requires the exact parent dataset id.",
1222
1234
  exit_status=EXIT_USAGE,
1223
- hint="Pass the exact parent dataset_id via --input.",
1235
+ hint="Pass it as the trailing DATASET_ID positional or the 'dataset_id' input field.",
1224
1236
  )
1225
1237
  dataset_id = document["dataset_id"]
1226
1238
  if isinstance(dataset_id, bool) or not isinstance(dataset_id, int) or dataset_id <= 0:
@@ -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
 
@@ -39,6 +39,9 @@ _CLOSED_ZERO_INPUT_COMMANDS = frozenset({"config.get"})
39
39
  #: value here is a genuine, accepted --input field so the documented example both
40
40
  #: validates against the input schema and works when run.
41
41
  _EXAMPLE_INPUT_HINTS: dict[str, dict[str, Any]] = {
42
+ # The backend requires integer resource ids ("resource_ids must be
43
+ # comma-separated integers"); the SDK annotation is a plain list[str].
44
+ "project.resource-dependencies": {"resource_ids": [456]},
42
45
  "view.export.azure-blob": {
43
46
  "storage_account_name": "storage-account",
44
47
  "tenant_id": "tenant-id",
@@ -142,6 +145,20 @@ _EXAMPLE_INPUT_HINTS: dict[str, dict[str, Any]] = {
142
145
  # Blank dashboard creation requires a typed params envelope. Keep the
143
146
  # generated destructive example runnable with the explicit approval flag.
144
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
+ },
145
162
  }
146
163
 
147
164