mammoth-cli 2.0.28__tar.gz → 2.0.29__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 (219) hide show
  1. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/PKG-INFO +1 -1
  2. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +1 -1
  4. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +1 -1
  5. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +1 -1
  6. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +8 -8
  7. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +1 -1
  8. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +1 -1
  9. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +5 -5
  10. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +2 -2
  11. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +48 -0
  12. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +12 -0
  13. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/runtime/input_loader.py +13 -0
  14. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/services/input_fields.py +37 -0
  15. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/pyproject.toml +1 -1
  16. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/dashboard.yaml +6 -7
  17. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/view.yaml +1 -1
  18. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/.gitignore +0 -0
  19. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/LICENSE +0 -0
  20. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/README.md +0 -0
  21. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/__main__.py +0 -0
  22. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/app.py +0 -0
  23. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  24. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
  25. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  26. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  27. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  28. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  29. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  30. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  31. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  32. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  33. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  34. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  35. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  36. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  37. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  38. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  39. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  40. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  41. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  42. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  43. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  44. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  45. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  46. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  47. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  48. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  49. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
  50. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  51. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  52. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  53. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  54. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  55. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  56. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  57. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  58. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  59. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  60. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  61. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  62. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  63. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  64. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  65. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  66. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  67. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  68. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  69. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  70. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
  71. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  72. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  73. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  74. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  75. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  76. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  77. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  78. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  79. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  80. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
  81. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/__init__.py +0 -0
  82. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/activity.py +0 -0
  83. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/addon.py +0 -0
  84. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/agent.py +0 -0
  85. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/ai.py +0 -0
  86. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/annotation.py +0 -0
  87. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/auth.py +0 -0
  88. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/automation.py +0 -0
  89. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/batch.py +0 -0
  90. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/billing.py +0 -0
  91. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/browse.py +0 -0
  92. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/capability.py +0 -0
  93. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/client_app.py +0 -0
  94. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/completion.py +0 -0
  95. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/config.py +0 -0
  96. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/connector.py +0 -0
  97. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/context.py +0 -0
  98. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/dashboard.py +0 -0
  99. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/data_app.py +0 -0
  100. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/dataset.py +0 -0
  101. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/doctor.py +0 -0
  102. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/external_key.py +0 -0
  103. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/file.py +0 -0
  104. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/folder.py +0 -0
  105. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/job.py +0 -0
  106. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/notification.py +0 -0
  107. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/parameter.py +0 -0
  108. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/project.py +0 -0
  109. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/registry.py +0 -0
  110. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/report.py +0 -0
  111. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/schedule.py +0 -0
  112. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/schema.py +0 -0
  113. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/skill.py +0 -0
  114. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/snippet.py +0 -0
  115. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/support.py +0 -0
  116. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/template.py +0 -0
  117. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/trash.py +0 -0
  118. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/upgrade.py +0 -0
  119. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/user.py +0 -0
  120. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/view.py +0 -0
  121. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/view_ops.py +0 -0
  122. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/webhook.py +0 -0
  123. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/workflow.py +0 -0
  124. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/commands/workspace.py +0 -0
  125. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/context/__init__.py +0 -0
  126. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/context/credentials.py +0 -0
  127. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/context/endpoint.py +0 -0
  128. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/context/profiles.py +0 -0
  129. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/context/resolver.py +0 -0
  130. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/contracts/__init__.py +0 -0
  131. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/contracts/auth.py +0 -0
  132. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/errors/__init__.py +0 -0
  133. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/errors/envelope.py +0 -0
  134. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/manifest/__init__.py +0 -0
  135. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/manifest/loader.py +0 -0
  136. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/messages/__init__.py +0 -0
  137. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/output/__init__.py +0 -0
  138. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/output/envelope.py +0 -0
  139. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/output/normalize.py +0 -0
  140. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/output/policy.py +0 -0
  141. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/output/progress.py +0 -0
  142. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/output/render.py +0 -0
  143. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/py.typed +0 -0
  144. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/runtime/__init__.py +0 -0
  145. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/runtime/confirm.py +0 -0
  146. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/runtime/executor.py +0 -0
  147. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/runtime/invocation.py +0 -0
  148. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/runtime/options.py +0 -0
  149. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/runtime/parents.py +0 -0
  150. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/runtime/runlog.py +0 -0
  151. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/runtime/session.py +0 -0
  152. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/runtime/strict.py +0 -0
  153. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/runtime/updates.py +0 -0
  154. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/runtime/validate.py +0 -0
  155. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/services/__init__.py +0 -0
  156. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/services/argspec.py +0 -0
  157. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/services/coerce.py +0 -0
  158. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/services/command_contract.py +0 -0
  159. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/services/conditions.py +0 -0
  160. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/services/dispatch.py +0 -0
  161. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/services/factory.py +0 -0
  162. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/services/mapping.py +0 -0
  163. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/services/openapi_types.py +0 -0
  164. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/services/positionals.py +0 -0
  165. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/services/protocol.py +0 -0
  166. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/services/sdk_service.py +0 -0
  167. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/services/testing.py +0 -0
  168. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/services/type_system.py +0 -0
  169. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/skills/__init__.py +0 -0
  170. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/skills/installer.py +0 -0
  171. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/skills/steering.py +0 -0
  172. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/mammoth_cli/testing.py +0 -0
  173. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/activity.yaml +0 -0
  174. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/addon.yaml +0 -0
  175. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/agent.yaml +0 -0
  176. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/ai.yaml +0 -0
  177. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/annotation.yaml +0 -0
  178. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/auth.yaml +0 -0
  179. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/automation.yaml +0 -0
  180. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/batch.yaml +0 -0
  181. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/billing.yaml +0 -0
  182. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/browse.yaml +0 -0
  183. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/capability.yaml +0 -0
  184. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/client-app.yaml +0 -0
  185. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/completion.yaml +0 -0
  186. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/config.yaml +0 -0
  187. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/connector.yaml +0 -0
  188. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/context.yaml +0 -0
  189. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/data-app.yaml +0 -0
  190. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/dataset.yaml +0 -0
  191. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/doctor.yaml +0 -0
  192. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/external-key.yaml +0 -0
  193. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/file.yaml +0 -0
  194. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/folder.yaml +0 -0
  195. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/job.yaml +0 -0
  196. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/log.yaml +0 -0
  197. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/notification.yaml +0 -0
  198. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/parameter.yaml +0 -0
  199. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/project.yaml +0 -0
  200. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/report.yaml +0 -0
  201. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/schedule.yaml +0 -0
  202. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/schema.yaml +0 -0
  203. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/skill.yaml +0 -0
  204. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/snippet.yaml +0 -0
  205. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/support.yaml +0 -0
  206. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/template.yaml +0 -0
  207. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/trash.yaml +0 -0
  208. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/upgrade.yaml +0 -0
  209. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/user.yaml +0 -0
  210. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/version.yaml +0 -0
  211. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/webhook.yaml +0 -0
  212. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/workflow.yaml +0 -0
  213. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/commands/workspace.yaml +0 -0
  214. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/openapi-operations.yaml +0 -0
  215. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/schema-v1.json +0 -0
  216. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/sdk-catalog.source.yaml +0 -0
  217. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/manifests/sdk-methods.yaml +0 -0
  218. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/spec/openapi/metadata.json +0 -0
  219. {mammoth_cli-2.0.28 → mammoth_cli-2.0.29}/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.28
3
+ Version: 2.0.29
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
@@ -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.28"
9
+ __version__ = "2.0.29"
10
10
 
11
11
  # The versioned machine output envelope contract.
12
12
  SCHEMA_VERSION = 1
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: mammoth-cli
3
- version: 2.0.28
3
+ version: 2.0.29
4
4
  description: "Use Mammoth Analytics from a terminal: install or authenticate the CLI, discover its live command contract, and safely manage projects, data, views, pipelines, dashboards, exports, and handoffs."
5
5
  ---
6
6
 
@@ -140,4 +140,4 @@ Ran once: `workflow.create`, `workflow.delete`, `workflow.get`, `workflow.graph`
140
140
 
141
141
  Ran once: `workspace.app-usage`, `workspace.get`, `workspace.list`, `workspace.segment.list`, `workspace.segment.update`, `workspace.storage-breakdown`, `workspace.user.list`
142
142
 
143
- Evidence collected on CLI releases 1.1.5 through 2.0.27; each row's release is recorded in `docs/release-capability-matrix.json` (`evidence_version`). A row that ran on an older release has not been re-run since unless its note says so. Details: `docs/capability-evidence/` in the repository.
143
+ Evidence collected on CLI releases 1.1.5 through 2.0.28; each row's release is recorded in `docs/release-capability-matrix.json` (`evidence_version`). A row that ran on an older release has not been re-run since unless its note says so. Details: `docs/capability-evidence/` in the repository.
@@ -118,4 +118,4 @@ Ran once: `view.active-user.list`, `view.active-user.mark`, `view.ai.generate-da
118
118
  | `view.data-check.update` | observed blocker | backend_error: PATCH with the schema's documented {op: command, path: enable/disable, value: null} shape returns HTTP 500 empty body (CLI outcome_unknown, exit 7) while the mutatio |
119
119
  | `view.export.publish-db-update` | CLI defect fixed, untried since | 2.0.16 (example value is the documented {"odbc_type": "postgres"} object (a bare string is rejected)) |
120
120
 
121
- Evidence collected on CLI releases 1.1.5 through 2.0.27; each row's release is recorded in `docs/release-capability-matrix.json` (`evidence_version`). A row that ran on an older release has not been re-run since unless its note says so. Details: `docs/capability-evidence/` in the repository.
121
+ Evidence collected on CLI releases 1.1.5 through 2.0.28; each row's release is recorded in `docs/release-capability-matrix.json` (`evidence_version`). A row that ran on an older release has not been re-run since unless its note says so. Details: `docs/capability-evidence/` in the repository.
@@ -70,7 +70,7 @@ Example: `mammoth dashboard canvas get 123`. Placeholders are illustrative; reso
70
70
 
71
71
  Result: `DashboardCanvasGetResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
72
72
 
73
- Status on release: ran once on CLI 2.0.12 — Published PyPI CLI 1.1.11 / SDK 0.7.1 draft canvas read succeeded for retained dashboard 48. One dashboard only; not Full. Also: Dashboard sweep 2026-09-18: exit 0 on release with CLI 2.0.12; result keys: canvas, dashboard_id, meta, plan, specs. returned canv…
73
+ Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Read back the authored canvas, plan.hints.kpis and meta.figures (figure key -> descriptor id) after each bake; used as the binding check the ILG brief requires. Single invocation only.
74
74
 
75
75
  ### `dashboard.canvas.restore`
76
76
 
@@ -90,7 +90,7 @@ Example: `mammoth dashboard canvas save 123 --input '{"body": {"params": {"canva
90
90
 
91
91
  Result: `DashboardCanvasSaveResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
92
92
 
93
- Status on release: ran once on CLI 2.0.14 — dashboard re-verification 2026-09-18: exit 0 on release with CLI 2.0.14. CLI defect fixed, confirmed: dashboard canvas get -> save round-trip completed cleanly, sequence advanced 1->2, response {"bake_job_id":296,"changed_tiles":0,"recomposed":false,"seeded_p…
93
+ Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Authored a canvas from a blank one: page-level focus.kpis (sum with unit.prefix GBP, and a countDistinct card), added bar (measure+measure2), hbar, line on a derived ratio measure (canvas.derived),…
94
94
 
95
95
  ### `dashboard.chat.edit`
96
96
 
@@ -178,7 +178,7 @@ Example: `mammoth dashboard create-blank --input '{"params": {"dataview_id": 1}}
178
178
 
179
179
  Result: `DashboardCreateBlankResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
180
180
 
181
- Status on release: ran once on CLI 2.0.21 — ergonomics sweep 2026-09-19: exit 0 on release with CLI 2.0.21. Created dashboard 62 (sequence 1). Single invocation only.
181
+ Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Two blank v3 dashboards bound to owned views (ids 63, 64). Single invocation only.
182
182
 
183
183
  ### `dashboard.data.draft`
184
184
 
@@ -214,11 +214,11 @@ Status on release: ran once on CLI 2.0.21 — ergonomics sweep 2026-09-19: exit
214
214
 
215
215
  Run: `mammoth dashboard descriptor-data`. Exact input fields: `mammoth schema get dashboard.descriptor-data`.
216
216
 
217
- Example: `mammoth dashboard descriptor-data 123 --input '{"body": {"params": {"descriptor_ids": ["resource-123"]}}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
217
+ Example: `mammoth dashboard descriptor-data 123 --input '{"body": {"params": {"descriptor_ids": ["ef28f9bcc263c0f7"], "filter_state": {"Month": ["2025-01-01", "2025-03-31"]}}}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
218
218
 
219
219
  Result: `DashboardDescriptorDataResult`; mutation `benign_mutation`, confirmation `none`, wait policy `always_wait`.
220
220
 
221
- Status on release: ran once on CLI 2.0.12 — Dashboard sweep 2026-09-18: exit 0 on release with CLI 2.0.12; result keys: completed, expected, results. endpoint works on v3 engine; returned structured per-id error (404 unknown descriptor id) for a fabricated descriptor id since no real descriptor id was…
221
+ Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Evaluated baked descriptors by id with filter_state {Month: [start, end]}: countDistinct card = 111 unfiltered and 64 under a Q1 range (the fixture key; a summed per-cell count would read 83), sums…
222
222
 
223
223
  ### `dashboard.duplicate`
224
224
 
@@ -258,7 +258,7 @@ Example: `mammoth dashboard get 123`. Placeholders are illustrative; resolve IDs
258
258
 
259
259
  Result: `DashboardGetResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
260
260
 
261
- Status on release: ran once on CLI 2.0.12 — Published PyPI CLI 1.1.11 read-only dashboard get on retained dashboard48 returned a bounded structural object; one retained scope does not establish Full support. Also: Dashboard sweep 2026-09-18: exit 0 on release with CLI 2.0.12; result keys: auto_publish,…
261
+ Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. auto_sync for the bound view showed last_synced_at after the upstream data change. Single invocation only.
262
262
 
263
263
  ### `dashboard.get-by-url`
264
264
 
@@ -324,11 +324,11 @@ Status on release: ran once on CLI 2.0.12 — Dashboard sweep 2026-09-18: exit 0
324
324
 
325
325
  Run: `mammoth dashboard pages add`. Exact input fields: `mammoth schema get dashboard.pages.add`.
326
326
 
327
- Example: `mammoth dashboard pages add 123 --input '{"body": {"params": {"pages": [{}]}}}'`. Illustrative only: append `--yes --confirm <EXACT_TARGET>` after observing the target.
327
+ Example: `mammoth dashboard pages add 123 --input '{"body": {"params": {"pages": [{"title": "By region", "focus": {"measure": "Revenue", "dim": "Region", "kpis": [{"field": "Revenue", "agg": "sum", "label": "Revenue"}]}, "charts": [{"kind": "hbar", "title": "Revenue by region", "dim": "Region", "measure": "Revenue", "agg": "sum"}]}]}}}'`. Illustrative only: append `--yes --confirm <EXACT_TARGET>` after observing the target.
328
328
 
329
329
  Result: `DashboardPagesAddResult`; mutation `high_impact`, confirmation `confirm_target`, wait policy `returns_job`.
330
330
 
331
- Status on release: ran once on CLI 2.0.12 — Dashboard sweep 2026-09-18: exit 0 on release with CLI 2.0.12; result keys: added_page_ids, bake_job_id, message, sequence. added page p2 to D=52 after supplying --yes --confirm 52 (first attempt without confirmation correctly returned confirmation_required,…
331
+ Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Needs --yes --confirm DASHBOARD_ID. body.params.pages[] takes PageAdd objects (title, focus{kpis}, charts[]); the route runs through the LLM guard and dropped unit.prefix on a money card ('nothing…
332
332
 
333
333
  ### `dashboard.pdf-artifact`
334
334
 
@@ -130,7 +130,7 @@ Example: `mammoth dataset list`. Placeholders are illustrative; resolve IDs and
130
130
 
131
131
  Result: `DatasetListResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
132
132
 
133
- Status on release: ran once on CLI 2.0.18 — fixture-lifecycle sweep 2026-09-19: exit 0 on release with CLI 2.0.18. Empty result on this fixture. Confirmed all 3 owned datasets (85,86,87) gone before deleting the project. Single invocation only.
133
+ Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Listed the datasets the sends created in the target project. Single invocation only.
134
134
 
135
135
  ### `dataset.rename`
136
136
 
@@ -82,7 +82,7 @@ Example: `mammoth file upload ./sales.csv`. Placeholders are illustrative; resol
82
82
 
83
83
  Result: `FileUploadResult`; mutation `benign_mutation`, confirmation `none`, wait policy `start_or_wait`.
84
84
 
85
- Status on release: ran once on CLI 2.0.21 — ergonomics sweep 2026-09-19: exit 0 on release with CLI 2.0.21. Uploaded smoke.csv -> dataset 94 ready; dataview 116 (3 rows). Second call with --input {"append_to_ds_id": 94} returned dataset 95 ready and view 116 row_count went 3 -> 6: append path works (th…
85
+ Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Three CSV uploads into a new source project; dates typed DATE without file-settings changes. Single invocation only.
86
86
 
87
87
  ### `file.upload-folder`
88
88
 
@@ -220,7 +220,7 @@ Example: `mammoth view data get 123 123`. Placeholders are illustrative; resolve
220
220
 
221
221
  Result: `ViewDataGetResult`; mutation `read`, confirmation `none`, wait policy `always_wait`.
222
222
 
223
- Status on release: ran once on CLI 2.0.21 — ergonomics sweep 2026-09-19: exit 0 on release with CLI 2.0.21. Default trim: rows_returned 3, rows_total_in_page 3, truncated false; with limit 2: rows_returned 2, truncated true. Single invocation only.
223
+ Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Paged reads (limit up to 500) used for every value check; envelope data.data rows keyed by display name. Single invocation only.
224
224
 
225
225
  ### `view.data.query`
226
226
 
@@ -466,7 +466,7 @@ Example: `mammoth view export list 123 123`. Placeholders are illustrative; reso
466
466
 
467
467
  Result: `ViewExportListResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
468
468
 
469
- Status on release: ran once on CLI an earlier release — Published PyPI CLI 1.1.11 read-only export-list call on retained view46/dataset29 returned a bounded empty page with unexpected offset50; no export was executed and Full support is not claimed.
469
+ Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Listed both internal_dataset exports with target_properties (DS_NAME, COLUMN_MAPPING, project fields). Single invocation only.
470
470
 
471
471
  ### `view.export.managed-s3`
472
472
 
@@ -702,7 +702,7 @@ Example: `mammoth view pipeline items 123`. Placeholders are illustrative; resol
702
702
 
703
703
  Result: `ViewPipelineItemsResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
704
704
 
705
- Status on release: ran once on CLI 1.1.11 — Published PyPI CLI 1.1.11 pipeline-items read on retained view46/dataset29 returned one bounded item; prior owned-view evidence is retained and no Full claim is made.
705
+ Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. fields=__full listed both export steps with sequence/status/execution times; the pre-existing step's timestamps did not move when a second send was appended. Single invocation only.
706
706
 
707
707
  ### `view.pipeline.items-all`
708
708
 
@@ -772,7 +772,7 @@ Example: `mammoth view task delete 123 123`. Illustrative only: append `--yes` a
772
772
 
773
773
  Result: `ViewTaskDeleteResult`; mutation `destructive`, confirmation `prompt_or_yes`, wait policy `always_wait`.
774
774
 
775
- Status on release: ran once on CLI 2.0.14 — write sweep 2026-09-18: exit 0 on release with CLI 2.0.14. Task 24 (created via view transform convert-type) deleted -> {future_id:347,status:processing,type_of_modification:discard_rule}. Verified via view task list 73: tasks:[] afterward. Single invocation…
775
+ Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Removed a SQL task that had run on the wrong intermediate shape; view returned to the previous columns and row count. Single invocation only.
776
776
 
777
777
  ### `view.task.get`
778
778
 
@@ -832,7 +832,7 @@ Example: `mammoth view transform add-sql 123 --input '{"query": "SELECT region,
832
832
 
833
833
  Result: `ViewTransformAddSqlResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
834
834
 
835
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
835
+ Status on release: ran once on CLI 2.0.18 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
836
836
 
837
837
  ### `view.transform.ai`
838
838
 
@@ -10,8 +10,8 @@ mammoth view transform filter 1039 --project 180 \
10
10
  --input '{"condition": {"and": [{"column": "Order Status", "operator": "EQ", "value": "Open"}, {"column": "Customer Age", "operator": "GT", "value": 30}]}}'
11
11
  ```
12
12
 
13
- - `--input FILE` reads a JSON or YAML file; the format is inferred from the
14
- extension.
13
+ - `--input FILE` (or `--input @FILE`) reads a JSON or YAML file; the format
14
+ is inferred from the extension.
15
15
  - `--input -` reads stdin; then `--input-format json|yaml` is required.
16
16
  - The top level must be a mapping. A bad path, format, or shape fails with exit
17
17
  code 2 and a stable error code.
@@ -34,6 +34,54 @@ Page/widget schemas vary by release. Read each schema, use returned IDs, and
34
34
  verify the binding plus draft/published data after every mutation. A
35
35
  creation response alone is not proof of a usable published view.
36
36
 
37
+ ## Authoring a board from a blank canvas
38
+
39
+ `create-blank` gives one empty page. Author it by reading the canvas,
40
+ editing the **active page** (`pages[0]`; a root-level `focus` is stored but
41
+ never baked when pages exist) and writing the whole object back:
42
+
43
+ ```bash
44
+ mammoth dashboard create-blank --yes --input '{"params": {"dataview_id": VIEW_ID, "title": "Overview"}}'
45
+ mammoth dashboard canvas get DASHBOARD_ID > canvas.json # data.canvas is the object to edit
46
+ # pages[0].focus = {"measure": "Sales Actual", "dim": "Location",
47
+ # "kpis": [{"field": "Sales Actual", "agg": "sum", "label": "Sales", "unit": {"prefix": "£"}, "decimals": 0},
48
+ # {"field": "Employee Ref", "agg": "countDistinct", "label": "Distinct staff"}]}
49
+ # pages[0].added = [{"kind": "bar", "title": "Actual vs Budget by Month", "measure": "Sales Actual", "measure2": "Sales Budget",
50
+ # "agg": "sum", "date_bucket": {"field": "Month", "unit": "month"}},
51
+ # {"kind": "hbar", "title": "Sales by Location", "dim": "Location", "measure": "Sales Actual", "agg": "sum", "sort": "desc"},
52
+ # {"kind": "line", "title": "Occupancy rate", "measure": "occupancy_rate", "date_bucket": {"field": "Month", "unit": "month"}},
53
+ # {"kind": "table", "title": "Detail", "columns": ["Location", "Month", "Places"], "sort_by": "Month", "limit": 100}]
54
+ # derived = [{"id": "occupancy_rate", "label": "Occupancy rate", "numerator": "Occupied", "denominator": "Places"}]
55
+ # filters = [{"field": "Month", "control": "range", "label": "Month"}, {"field": "Location", "control": "multi"}]
56
+ mammoth dashboard canvas save DASHBOARD_ID --input '{"body": {"params": {"canvas": <edited data.canvas>}}}'
57
+ mammoth job wait BAKE_JOB_ID # data.bake_job_id from the save
58
+ ```
59
+
60
+ Rules the backend enforces (each returns the pydantic path on failure):
61
+ `added[].measure` is a column name — a ratio lives in `canvas.derived[]` and
62
+ is referenced by id; `focus.kpis[].agg` accepts `countDistinct` (the only
63
+ correct aggregation for a "distinct people" card under a date filter);
64
+ `unit.prefix` goes on money cards only. `dashboard pages add --yes --confirm
65
+ ID --input '{"body": {"params": {"pages": [{"title": ..., "focus": {...},
66
+ "charts": [...]}]}}}'` adds a page, but that route runs through the LLM
67
+ guard and may drop a unit it cannot evidence (it says so in `data.message`);
68
+ `canvas save` keeps what you wrote.
69
+
70
+ **Read the bindings back, then the numbers.** `dashboard canvas get` returns
71
+ `data.meta.figures` — `"p1:kpi:2": {"descriptors": {"value": "<id>"}}` per
72
+ card and tile — and `data.plan.hints.kpis` with the agg per card. Evaluate
73
+ ids with a filter:
74
+
75
+ ```bash
76
+ mammoth dashboard descriptor-data DASHBOARD_ID --input '{"body": {"params": {
77
+ "descriptor_ids": ["<id>", "<id>"],
78
+ "filter_state": {"Month": ["2025-01-01", "2025-03-31"]}}}}'
79
+ # -> data.results.<id>.value (scalar) or .data (rows); filter fields must be declared canvas filters
80
+ ```
81
+
82
+ A card that reads the same with and without the filter, or a distinct count
83
+ that equals a row count, is a wrong binding, not a data fact.
84
+
37
85
  ## Canvas, widget data and PDF
38
86
 
39
87
  Never save an invented canvas. Read it, change it, write it back:
@@ -142,6 +142,18 @@ Prefer `pivot` over `add-sql` for a grouped summary when `capabilities.md`
142
142
  lists it as run on release; `add-sql` replaces every column of the view, so
143
143
  never run it on a deliverable view.
144
144
 
145
+ `add-sql` facts from release: the only table is `"view:VIEW_ID"` (the view
146
+ itself; a second view in FROM/JOIN is `5GENR010 only one table allowed` —
147
+ join with `view transform join` afterwards); `CASE`, `DATE_TRUNC('month',
148
+ col)`, `GROUP BY`, `COUNT(DISTINCT col)` and `UNION ALL` over the same view
149
+ work; result columns must be NUMERIC, TEXT or TIMESTAMPTZ (`CAST(x AS DATE)`
150
+ is rejected; `CAST(x || '-01' AS TIMESTAMPTZ)` turns a `YYYY-MM` text month
151
+ into a date column). A location canonicaliser plus month bucketing plus
152
+ per-cell aggregation is one `add-sql` per fact; a mixed-grain table (summary
153
+ rows plus one row per entity with NULL measures, for a `countDistinct` card)
154
+ is one `UNION ALL`. The worked run is
155
+ `docs/capability-evidence/ilg-sim-20260919/SUMMARY.md`.
156
+
145
157
  Reject malformed fields with the structured error envelope and stop rather than
146
158
  guessing names. Verify exact display names, join multiplicity, math values and
147
159
  remote task/pipeline readback. Draft submit is not proof all tasks persisted:
@@ -157,6 +157,18 @@ def _read_bytes(input_file: str) -> bytes:
157
157
  ) from exc
158
158
 
159
159
 
160
+ def _strip_at_prefix(input_file: str) -> str:
161
+ """Accept the ``@path`` file convention of curl and gh.
162
+
163
+ A value that starts with ``@`` and names an existing file is read from
164
+ that file; anything else (inline JSON, ``-``, a plain path) is returned
165
+ unchanged so an error still quotes what the caller typed.
166
+ """
167
+ if len(input_file) > 1 and input_file.startswith("@") and Path(input_file[1:]).is_file():
168
+ return input_file[1:]
169
+ return input_file
170
+
171
+
160
172
  def _read_text(input_file: str) -> str:
161
173
  """Read and strictly decode one input payload.
162
174
 
@@ -348,6 +360,7 @@ def load_input_document(input_file: str | None, input_format: str | None) -> dic
348
360
  """
349
361
  if input_file is None:
350
362
  return None
363
+ input_file = _strip_at_prefix(input_file)
351
364
  fmt = _resolve_format(input_file, input_format)
352
365
  document = _parse(_read_text(input_file), fmt)
353
366
  if not isinstance(document, dict):
@@ -288,6 +288,43 @@ _EXAMPLE_INPUT_HINTS: dict[str, dict[str, Any]] = {
288
288
  },
289
289
  # The web app posts {condition, limit: null}; an empty body is 4GENR007.
290
290
  "view.derivative.data": {"body": {"limit": None}},
291
+ # pages[] takes PageAdd objects; the bare {} the schema suggests adds an
292
+ # empty page. focus.kpis and charts use the canvas vocabulary.
293
+ "dashboard.pages.add": {
294
+ "body": {
295
+ "params": {
296
+ "pages": [
297
+ {
298
+ "title": "By region",
299
+ "focus": {
300
+ "measure": "Revenue",
301
+ "dim": "Region",
302
+ "kpis": [{"field": "Revenue", "agg": "sum", "label": "Revenue"}],
303
+ },
304
+ "charts": [
305
+ {
306
+ "kind": "hbar",
307
+ "title": "Revenue by region",
308
+ "dim": "Region",
309
+ "measure": "Revenue",
310
+ "agg": "sum",
311
+ }
312
+ ],
313
+ }
314
+ ]
315
+ }
316
+ }
317
+ },
318
+ # Ids come from dashboard canvas get -> data.meta.figures; filter_state
319
+ # keys are declared canvas filters (range control: [start, end]).
320
+ "dashboard.descriptor-data": {
321
+ "body": {
322
+ "params": {
323
+ "descriptor_ids": ["ef28f9bcc263c0f7"],
324
+ "filter_state": {"Month": ["2025-01-01", "2025-03-31"]},
325
+ }
326
+ }
327
+ },
291
328
  # The backend accepts NUMERIC, TEXT or DATE (4PARM008 otherwise).
292
329
  "parameter.create": {"param_type": "TEXT", "value": "Q3"},
293
330
  # The backend requires a placement ("Data check position must be given");
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mammoth-cli"
3
- version = "2.0.28"
3
+ version = "2.0.29"
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"
@@ -358,7 +358,7 @@ commands:
358
358
  - CT-DASHBOARD-CANVAS-SAVE-ERROR
359
359
  draft_test: null
360
360
  undo_test: null
361
- known_restrictions: null
361
+ known_restrictions: 'Read the canvas with dashboard canvas get, edit, write back; a canvas with pages[] bakes the ACTIVE page (pages[i].focus / pages[i].added), a root-level focus is stored but produces no descriptors. focus.kpis entries are {field, agg, label, unit, decimals, filters}; agg countDistinct persists and bakes (ILG simulation 2026-09-19). added[].measure is a column name; a ratio goes in canvas.derived[] as {id, numerator, denominator} and is referenced by id from measure or a KPI field. Validation errors return the pydantic path (e.g. pages.0.added.2.measure). The response carries bake_job_id: job wait it, then dashboard canvas get for meta.figures (figure key -> descriptor id) and dashboard descriptor-data to evaluate. This raw route does not pass the LLM unit guard that pages add / chat edit apply.'
362
362
  reviewed_by: primary
363
363
  - command_id: dashboard.chat.edit
364
364
  command_path: dashboard chat edit
@@ -701,7 +701,7 @@ commands:
701
701
  - CT-DASHBOARD-CREATE-BLANK-ERROR
702
702
  draft_test: null
703
703
  undo_test: null
704
- known_restrictions: null
704
+ known_restrictions: 'Input is {"params": {"dataview_id": VIEW_ID, "title": ...}} with --yes; returns {id, sequence}. The blank canvas has one page (p1) and no figures: author it with dashboard canvas get -> edit -> dashboard canvas save or dashboard pages add. One dataview per dashboard.'
705
705
  reviewed_by: primary
706
706
  - command_id: dashboard.data.draft
707
707
  command_path: dashboard data draft
@@ -854,8 +854,7 @@ commands:
854
854
  required_fixture_guard: null
855
855
  secret_fields: []
856
856
  human_example: mammoth dashboard descriptor-data DASHBOARD_ID --help
857
- agent_example: 'mammoth dashboard descriptor-data 123 --input ''{"body": {"params": {"descriptor_ids":
858
- ["resource-123"]}}}'''
857
+ agent_example: 'mammoth dashboard descriptor-data 123 --input ''{"body": {"params": {"descriptor_ids": ["ef28f9bcc263c0f7"], "filter_state": {"Month": ["2025-01-01", "2025-03-31"]}}}}'''
859
858
  unit_tests:
860
859
  - UT-DASHBOARD-DESCRIPTOR-DATA
861
860
  contract_tests:
@@ -864,7 +863,7 @@ commands:
864
863
  - CT-DASHBOARD-DESCRIPTOR-DATA-ERROR
865
864
  draft_test: null
866
865
  undo_test: null
867
- known_restrictions: null
866
+ known_restrictions: 'Evaluates baked descriptors by id. Ids come from dashboard canvas get data.meta.figures[<page>:<kpi|add>:<n>].descriptors.value (rows for a table figure) and data.meta.filters. body.params.filter_state is {"<filter field>": value} against the canvas''''s declared filters: a range control takes [start, end] (dates as YYYY-MM-DD), categorical controls a list of values; an undeclared field is rejected. Results are {descriptor_id: {status, value | data}}. Used to prove a countDistinct card under a Month range (ILG simulation 2026-09-19).'
868
867
  reviewed_by: primary
869
868
  - command_id: dashboard.duplicate
870
869
  command_path: dashboard duplicate
@@ -1290,7 +1289,7 @@ commands:
1290
1289
  required_fixture_guard: null
1291
1290
  secret_fields: []
1292
1291
  human_example: mammoth dashboard pages add DASHBOARD_ID --help
1293
- agent_example: 'mammoth dashboard pages add 123 --input ''{"body": {"params": {"pages": [{}]}}}'''
1292
+ agent_example: 'mammoth dashboard pages add 123 --input ''{"body": {"params": {"pages": [{"title": "By region", "focus": {"measure": "Revenue", "dim": "Region", "kpis": [{"field": "Revenue", "agg": "sum", "label": "Revenue"}]}, "charts": [{"kind": "hbar", "title": "Revenue by region", "dim": "Region", "measure": "Revenue", "agg": "sum"}]}]}}}'''
1294
1293
  unit_tests:
1295
1294
  - UT-DASHBOARD-PAGES-ADD
1296
1295
  contract_tests:
@@ -1299,7 +1298,7 @@ commands:
1299
1298
  - CT-DASHBOARD-PAGES-ADD-ERROR
1300
1299
  draft_test: null
1301
1300
  undo_test: null
1302
- known_restrictions: null
1301
+ known_restrictions: 'Requires --yes --confirm DASHBOARD_ID. body.params.pages is a list of PageAdd objects: {title, focus: {measure, dim, kpis: [...]}, charts: [{kind, title, dim, measure, agg}]}; the schema example''''s {} entry is not a usable page. The route runs through the LLM control guard: in the ILG simulation it dropped unit.prefix on a money card ("nothing in this data says which currency") that dashboard canvas save had kept, and reports that in data.message.'
1303
1302
  reviewed_by: primary
1304
1303
  - command_id: dashboard.pdf-artifact
1305
1304
  command_path: dashboard pdf-artifact
@@ -3708,7 +3708,7 @@ commands:
3708
3708
  - CT-VIEW-TRANSFORM-ADD-SQL-ERROR
3709
3709
  draft_test: LT-VIEW-TRANSFORM-ADD-SQL-DRAFT
3710
3710
  undo_test: LT-VIEW-TRANSFORM-ADD-SQL-UNDO
3711
- known_restrictions: null
3711
+ known_restrictions: 'Single-view SQL: the only table is "view:VIEW_ID" (the view the task is added to); a second view in FROM or JOIN is rejected (5GENR010 "only one table allowed"), use view transform join for that. UNION ALL over the same view, CASE, DATE_TRUNC, GROUP BY and COUNT(DISTINCT ...) run on release. Result columns must be NUMERIC, TEXT or TIMESTAMPTZ: CAST(x AS DATE) is rejected (5GENR010 "Invalid column type DATE"); CAST(x AS TIMESTAMPTZ) or DATE_TRUNC land as a DATE column. The task replaces every column of the view; run it on a copy (view export dataset) when the source columns are still needed. Read the result back with view data get. Evidence: docs/capability-evidence/ilg-sim-20260919.'
3712
3712
  reviewed_by: primary
3713
3713
  - command_id: view.transform.ai
3714
3714
  command_path: view transform ai
File without changes
File without changes
File without changes