mammoth-cli 2.0.39__tar.gz → 2.0.41__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 (224) hide show
  1. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/PKG-INFO +2 -2
  2. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +18 -9
  4. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +1 -1
  5. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +1 -1
  6. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +2 -2
  7. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +33 -33
  8. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +1 -1
  9. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +36 -1
  10. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +7 -3
  11. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/dashboard.py +73 -1
  12. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/file.py +15 -0
  13. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/schema.py +1 -1
  14. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/view.py +106 -0
  15. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/view_ops.py +94 -7
  16. mammoth_cli-2.0.41/mammoth_cli/services/dashboard_pages.py +136 -0
  17. mammoth_cli-2.0.41/mammoth_cli/services/dashboard_review.py +284 -0
  18. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/pyproject.toml +2 -2
  19. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/view.yaml +3 -2
  20. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/.gitignore +0 -0
  21. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/LICENSE +0 -0
  22. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/README.md +0 -0
  23. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/__main__.py +0 -0
  24. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/app.py +0 -0
  25. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  26. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
  27. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  28. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  29. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  30. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  31. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  32. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  33. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  34. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  35. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  36. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  37. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  38. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  39. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  40. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  41. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  42. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  43. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
  44. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  45. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  46. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  47. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  48. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  49. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  50. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  51. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  52. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  53. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  54. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
  55. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  56. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  57. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  58. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  59. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  60. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  61. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  62. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  63. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  64. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  65. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  66. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  67. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  68. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  69. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  70. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  71. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  72. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  73. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  74. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  75. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
  76. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  77. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  78. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  79. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  80. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  81. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  82. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  83. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  84. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  85. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
  86. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/__init__.py +0 -0
  87. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/activity.py +0 -0
  88. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/addon.py +0 -0
  89. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/agent.py +0 -0
  90. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/ai.py +0 -0
  91. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/annotation.py +0 -0
  92. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/auth.py +0 -0
  93. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/automation.py +0 -0
  94. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/batch.py +0 -0
  95. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/billing.py +0 -0
  96. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/browse.py +0 -0
  97. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/capability.py +0 -0
  98. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/client_app.py +0 -0
  99. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/completion.py +0 -0
  100. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/config.py +0 -0
  101. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/connector.py +0 -0
  102. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/context.py +0 -0
  103. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/data_app.py +0 -0
  104. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/dataset.py +0 -0
  105. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/doctor.py +0 -0
  106. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/external_key.py +0 -0
  107. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/folder.py +0 -0
  108. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/job.py +0 -0
  109. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/notification.py +0 -0
  110. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/parameter.py +0 -0
  111. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/project.py +0 -0
  112. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/registry.py +0 -0
  113. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/report.py +0 -0
  114. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/schedule.py +0 -0
  115. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/skill.py +0 -0
  116. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/snippet.py +0 -0
  117. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/support.py +0 -0
  118. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/template.py +0 -0
  119. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/trash.py +0 -0
  120. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/upgrade.py +0 -0
  121. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/user.py +0 -0
  122. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/webhook.py +0 -0
  123. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/workflow.py +0 -0
  124. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/commands/workspace.py +0 -0
  125. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/context/__init__.py +0 -0
  126. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/context/credentials.py +0 -0
  127. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/context/endpoint.py +0 -0
  128. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/context/profiles.py +0 -0
  129. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/context/resolver.py +0 -0
  130. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/contracts/__init__.py +0 -0
  131. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/contracts/auth.py +0 -0
  132. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/errors/__init__.py +0 -0
  133. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/errors/envelope.py +0 -0
  134. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/manifest/__init__.py +0 -0
  135. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/manifest/loader.py +0 -0
  136. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/messages/__init__.py +0 -0
  137. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/output/__init__.py +0 -0
  138. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/output/envelope.py +0 -0
  139. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/output/normalize.py +0 -0
  140. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/output/policy.py +0 -0
  141. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/output/progress.py +0 -0
  142. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/output/render.py +0 -0
  143. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/py.typed +0 -0
  144. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/runtime/__init__.py +0 -0
  145. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/runtime/confirm.py +0 -0
  146. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/runtime/dryrun.py +0 -0
  147. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/runtime/executor.py +0 -0
  148. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/runtime/input_loader.py +0 -0
  149. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/runtime/invocation.py +0 -0
  150. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/runtime/options.py +0 -0
  151. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/runtime/parents.py +0 -0
  152. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/runtime/runlog.py +0 -0
  153. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/runtime/session.py +0 -0
  154. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/runtime/strict.py +0 -0
  155. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/runtime/updates.py +0 -0
  156. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/runtime/validate.py +0 -0
  157. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/services/__init__.py +0 -0
  158. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/services/argspec.py +0 -0
  159. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/services/coerce.py +0 -0
  160. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/services/command_contract.py +0 -0
  161. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/services/conditions.py +0 -0
  162. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/services/data_quality.py +0 -0
  163. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/services/dispatch.py +0 -0
  164. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/services/factory.py +0 -0
  165. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/services/input_fields.py +0 -0
  166. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/services/mapping.py +0 -0
  167. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/services/openapi_types.py +0 -0
  168. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/services/positionals.py +0 -0
  169. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/services/protocol.py +0 -0
  170. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/services/sdk_service.py +0 -0
  171. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/services/testing.py +0 -0
  172. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/services/type_system.py +0 -0
  173. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/skills/__init__.py +0 -0
  174. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/skills/installer.py +0 -0
  175. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/skills/steering.py +0 -0
  176. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/mammoth_cli/testing.py +0 -0
  177. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/activity.yaml +0 -0
  178. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/addon.yaml +0 -0
  179. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/agent.yaml +0 -0
  180. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/ai.yaml +0 -0
  181. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/annotation.yaml +0 -0
  182. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/auth.yaml +0 -0
  183. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/automation.yaml +0 -0
  184. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/batch.yaml +0 -0
  185. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/billing.yaml +0 -0
  186. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/browse.yaml +0 -0
  187. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/capability.yaml +0 -0
  188. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/client-app.yaml +0 -0
  189. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/completion.yaml +0 -0
  190. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/config.yaml +0 -0
  191. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/connector.yaml +0 -0
  192. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/context.yaml +0 -0
  193. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/dashboard.yaml +0 -0
  194. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/data-app.yaml +0 -0
  195. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/dataset.yaml +0 -0
  196. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/doctor.yaml +0 -0
  197. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/external-key.yaml +0 -0
  198. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/file.yaml +0 -0
  199. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/folder.yaml +0 -0
  200. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/job.yaml +0 -0
  201. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/log.yaml +0 -0
  202. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/notification.yaml +0 -0
  203. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/parameter.yaml +0 -0
  204. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/project.yaml +0 -0
  205. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/report.yaml +0 -0
  206. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/schedule.yaml +0 -0
  207. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/schema.yaml +0 -0
  208. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/skill.yaml +0 -0
  209. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/snippet.yaml +0 -0
  210. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/support.yaml +0 -0
  211. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/template.yaml +0 -0
  212. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/trash.yaml +0 -0
  213. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/upgrade.yaml +0 -0
  214. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/user.yaml +0 -0
  215. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/version.yaml +0 -0
  216. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/webhook.yaml +0 -0
  217. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/workflow.yaml +0 -0
  218. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/commands/workspace.yaml +0 -0
  219. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/openapi-operations.yaml +0 -0
  220. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/schema-v1.json +0 -0
  221. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/sdk-catalog.source.yaml +0 -0
  222. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/manifests/sdk-methods.yaml +0 -0
  223. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/spec/openapi/metadata.json +0 -0
  224. {mammoth_cli-2.0.39 → mammoth_cli-2.0.41}/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.39
3
+ Version: 2.0.41
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.17
20
+ Requires-Dist: mammoth-io<0.8,>=0.7.18
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.39"
9
+ __version__ = "2.0.41"
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.39
3
+ version: 2.0.41
4
4
  description: "Use Mammoth Analytics from a terminal: install or authenticate the CLI, discover its live command contract, and safely manage projects, data, views, pipelines (join, merge, pivot, filter, clean), dashboards, exports, and handoffs."
5
5
  ---
6
6
 
@@ -93,10 +93,11 @@ report a real gap with the command you tried.
93
93
  Users often upload related files without saying how they relate ("make a
94
94
  dashboard from t_a and t_b"). Work it out from the data before you build:
95
95
 
96
- 1. Upload every file, then read every view in Mammoth (not the local
97
- files): `view get VIEW_ID` (columns, types, row count) and `view data get
98
- VIEW_ID`. The data read lists `column_warnings`: numbers or dates stored
99
- as text, and blanks, each with the fix.
96
+ 1. Upload every file. Each upload result carries a `view` preview of what
97
+ Mammoth made of the file (`view_id`, column types, sample rows,
98
+ `column_warnings`, and `before_dashboard`). Read every view in Mammoth, not
99
+ the local files: `view data get VIEW_ID` for each one. The warnings list
100
+ numbers or dates stored as text, and blanks, each with the fix.
100
101
  2. Find the keys. A column in one view whose values appear in a column of
101
102
  the other (`customer_id` and `id`, `order_ref` and `order_no`) is a
102
103
  foreign key; the view with many rows per key is the main one.
@@ -104,14 +105,22 @@ dashboard from t_a and t_b"). Work it out from the data before you build:
104
105
  case and padding (`text`), no blanks (`set-values`, `filter`).
105
106
  4. Act on every `column_warnings` entry for a column the deliverable uses:
106
107
  run its `fix` (`convert-type` to `NUMERIC` or `DATE`; the values that are
107
- not numbers become empty), then decide on blanks (fill, filter, or keep and
108
- say so). A text `price` cannot be summed on a dashboard.
108
+ not numbers become empty). A text `price` cannot be summed on a dashboard.
109
+ Then decide on each `blank_values` entry: fill, filter, or keep. Write one
110
+ line for each in your report (the column, the count, what you did and
111
+ why). A blank that you saw but did not mention is a miss.
109
112
  5. `view transform join` the lookup view into the main view (`LEFT`). The
110
113
  result's `join_check` gives `match_rate`, `unmatched_rows` and
111
114
  `unmatched_keys`; put them in your report, and stop to compare the keys
112
115
  if more than a few rows found no match.
113
- 6. Build the dashboard from the joined view
114
- ([dashboards](references/recipes/dashboards.md)).
116
+ 6. If the data has money, add it before you make the dashboard: `revenue`
117
+ (`math`, `qty * price`, `new_column`), the `fix` in `before_dashboard`.
118
+ A dashboard sees only the columns the view had when it was made.
119
+ 7. Build the dashboard from the joined view
120
+ ([dashboards](references/recipes/dashboards.md)) and chart the sum of
121
+ revenue. Do not sum a unit price. `create-blank`, `canvas save` and
122
+ `pages add` return `deliverable_check`: fix each warning, or say in the
123
+ report why not.
115
124
 
116
125
  For the defaults that most pipelines use (new column or overwrite, `LEFT`
117
126
  joins, date steps), see
@@ -110,7 +110,7 @@ Checkpoint Alert are the `view data-check` and `view checkpoint` families.
110
110
  | Turn wide columns into label/value rows | Unpivot | `unnest` |
111
111
  | Read fields out of a JSON column | Extract JSON | `json-extract` |
112
112
  | Classify, tag or summarise rows with AI | Generative AI | `ai` |
113
- | One SQL query over the view | AI SQL Query | `add-sql` (replaces the view's columns), `generate-sql` (from plain words) |
113
+ | One SQL query over the view | AI SQL Query | `add-sql` (replaces the view's columns), `generate-sql` (writes the query from plain words; apply it with `add-sql`) |
114
114
  | Copy rows into another dataset, refreshed with the pipeline | Send to Dataset | `view export dataset` (not a `view transform`) |
115
115
 
116
116
  `join` or `lookup`: `join` adds the chosen columns from every matching row
@@ -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.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.
143
+ Evidence collected on CLI releases 1.1.5 through 2.0.40; 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.
@@ -11,7 +11,7 @@ Status meanings:
11
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
12
  - Commands not listed under a family are untried.
13
13
 
14
- The typed `view transform *` commands all submit through `view.task.add`; its matrix row names the transformations that ran end to end and were read back (filter, fill-missing, join, pivot, set-values with a condition, text, bulk-replace, convert-type, discard-duplicates). A transformation not named there has the same untried status as any other command.
14
+ The typed `view transform *` commands all submit through `view.task.add` (`rename-columns` and `sort` through `view.update`); its matrix row names the transformations that ran end to end and were read back against a known answer: `add-column`, `add-sql`, `ai`, `bulk-replace`, `combine-columns`, `convert-type`, `copy-columns`, `crosstab`, `date-diff`, `delete-columns`, `discard-duplicates`, `extract-date`, `fill-missing`, `filter`, `generate-sql`, `increment-date`, `join`, `json-extract`, `limit-rows`, `lookup`, `math`, `pivot`, `rename-columns`, `replace`, `set-values`, `small-large`, `sort`, `split`, `substring`, `text`, `unnest`, `window`. A transformation not named there has the same untried status as any other command.
15
15
 
16
16
  ## Coverage by family
17
17
 
@@ -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.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.
121
+ Evidence collected on CLI releases 1.1.5 through 2.0.40; 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.
@@ -762,7 +762,7 @@ Example: `mammoth view task add 123 --input '{"task_spec": {"DATAVIEW_ID": 123,
762
762
 
763
763
  Result: `ViewTaskAddResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
764
764
 
765
- Status on release: ran once on CLI 2.0.18 — golden-data check golden-20260919 (CLI 2.0.18): typed transforms bulk-replace, convert-type, discard-duplicates, filter, join, pivot, set-values, text each run once on an owned fixture on release and read back with view data get against a known answer (values…
765
+ Status on release: ran once on CLI 2.0.40 — golden-data check golden-20260919 (CLI 2.0.18): typed transforms bulk-replace, convert-type, discard-duplicates, filter, join, pivot, set-values, text each run once on an owned fixture on release and read back with view data get against a known answer (values…
766
766
 
767
767
  ### `view.task.delete`
768
768
 
@@ -822,7 +822,7 @@ Example: `mammoth view transform add-column 123 --input '{"name": "Revenue repor
822
822
 
823
823
  Result: `ViewTransformAddColumnResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
824
824
 
825
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
825
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
826
826
 
827
827
  ### `view.transform.add-sql`
828
828
 
@@ -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: 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.
835
+ Status on release: ran once on CLI 2.0.40 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
 
@@ -842,7 +842,7 @@ Example: `mammoth view transform ai 123 --input '{"prompt": "Summarize revenue b
842
842
 
843
843
  Result: `ViewTransformAiResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
844
844
 
845
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
845
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
846
846
 
847
847
  ### `view.transform.bulk-replace`
848
848
 
@@ -852,7 +852,7 @@ Example: `mammoth view transform bulk-replace 123 --input '{"columns": ["Status"
852
852
 
853
853
  Result: `ViewTransformBulkReplaceResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
854
854
 
855
- 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.
855
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
856
856
 
857
857
  ### `view.transform.combine-columns`
858
858
 
@@ -862,7 +862,7 @@ Example: `mammoth view transform combine-columns 123 --input '{"sources": ["Stat
862
862
 
863
863
  Result: `ViewTransformCombineColumnsResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
864
864
 
865
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
865
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
866
866
 
867
867
  ### `view.transform.convert-type`
868
868
 
@@ -872,7 +872,7 @@ Example: `mammoth view transform convert-type 123 --input '{"conversions": [{"co
872
872
 
873
873
  Result: `ViewTransformConvertTypeResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
874
874
 
875
- 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.
875
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
876
876
 
877
877
  ### `view.transform.copy-columns`
878
878
 
@@ -882,7 +882,7 @@ Example: `mammoth view transform copy-columns 123 --input '{"copies": [{"source"
882
882
 
883
883
  Result: `ViewTransformCopyColumnsResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
884
884
 
885
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
885
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
886
886
 
887
887
  ### `view.transform.crosstab`
888
888
 
@@ -892,7 +892,7 @@ Example: `mammoth view transform crosstab 123 --input '{"rows": ["sample"], "piv
892
892
 
893
893
  Result: `ViewTransformCrosstabResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
894
894
 
895
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
895
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
896
896
 
897
897
  ### `view.transform.date-diff`
898
898
 
@@ -902,7 +902,7 @@ Example: `mammoth view transform date-diff 123 --input '{"component": "YEAR", "s
902
902
 
903
903
  Result: `ViewTransformDateDiffResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
904
904
 
905
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
905
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
906
906
 
907
907
  ### `view.transform.delete-columns`
908
908
 
@@ -912,7 +912,7 @@ Example: `mammoth view transform delete-columns 123 --input '{"columns": ["Statu
912
912
 
913
913
  Result: `ViewTransformDeleteColumnsResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
914
914
 
915
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
915
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
916
916
 
917
917
  ### `view.transform.discard-duplicates`
918
918
 
@@ -922,7 +922,7 @@ Example: `mammoth view transform discard-duplicates 123 --input '{"dataset_id":
922
922
 
923
923
  Result: `ViewTransformDiscardDuplicatesResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
924
924
 
925
- 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.
925
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
926
926
 
927
927
  ### `view.transform.extract-date`
928
928
 
@@ -932,7 +932,7 @@ Example: `mammoth view transform extract-date 123 --input '{"column": "Status",
932
932
 
933
933
  Result: `ViewTransformExtractDateResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
934
934
 
935
- 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.
935
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
936
936
 
937
937
  ### `view.transform.fill-missing`
938
938
 
@@ -942,7 +942,7 @@ Example: `mammoth view transform fill-missing 123 --input '{"column": "Status",
942
942
 
943
943
  Result: `ViewTransformFillMissingResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
944
944
 
945
- 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.
945
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
946
946
 
947
947
  ### `view.transform.filter`
948
948
 
@@ -952,7 +952,7 @@ Example: `mammoth view transform filter 123 --input '{"condition": {"column": "S
952
952
 
953
953
  Result: `ViewTransformFilterResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
954
954
 
955
- 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.
955
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
956
956
 
957
957
  ### `view.transform.generate-sql`
958
958
 
@@ -962,7 +962,7 @@ Example: `mammoth view transform generate-sql 123 --input '{"intent": "Summarize
962
962
 
963
963
  Result: `ViewTransformGenerateSqlResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
964
964
 
965
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
965
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
966
966
 
967
967
  ### `view.transform.increment-date`
968
968
 
@@ -972,7 +972,7 @@ Example: `mammoth view transform increment-date 123 --input '{"column": "Status"
972
972
 
973
973
  Result: `ViewTransformIncrementDateResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
974
974
 
975
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
975
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
976
976
 
977
977
  ### `view.transform.join`
978
978
 
@@ -982,7 +982,7 @@ Example: `mammoth view transform join 123 --input '{"foreign_view": 1, "join_typ
982
982
 
983
983
  Result: `ViewTransformJoinResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
984
984
 
985
- 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.
985
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
986
986
 
987
987
  ### `view.transform.json-extract`
988
988
 
@@ -992,7 +992,7 @@ Example: `mammoth view transform json-extract 123 --input '{"column": "Status",
992
992
 
993
993
  Result: `ViewTransformJsonExtractResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
994
994
 
995
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
995
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
996
996
 
997
997
  ### `view.transform.limit-rows`
998
998
 
@@ -1002,7 +1002,7 @@ Example: `mammoth view transform limit-rows 123 --input '{"n": 1, "dataset_id":
1002
1002
 
1003
1003
  Result: `ViewTransformLimitRowsResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
1004
1004
 
1005
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
1005
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
1006
1006
 
1007
1007
  ### `view.transform.lookup`
1008
1008
 
@@ -1012,7 +1012,7 @@ Example: `mammoth view transform lookup 123 --input '{"source": "Status", "looku
1012
1012
 
1013
1013
  Result: `ViewTransformLookupResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
1014
1014
 
1015
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
1015
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
1016
1016
 
1017
1017
  ### `view.transform.math`
1018
1018
 
@@ -1022,7 +1022,7 @@ Example: `mammoth view transform math 123 --input '{"expression": "price * quant
1022
1022
 
1023
1023
  Result: `ViewTransformMathResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
1024
1024
 
1025
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
1025
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
1026
1026
 
1027
1027
  ### `view.transform.pivot`
1028
1028
 
@@ -1032,7 +1032,7 @@ Example: `mammoth view transform pivot 123 --input '{"group_by": ["sample"], "ag
1032
1032
 
1033
1033
  Result: `ViewTransformPivotResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
1034
1034
 
1035
- 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.
1035
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
1036
1036
 
1037
1037
  ### `view.transform.rename-columns`
1038
1038
 
@@ -1042,7 +1042,7 @@ Example: `mammoth view transform rename-columns 123 --input '{"renames": {"cust_
1042
1042
 
1043
1043
  Result: `ViewTransformRenameColumnsResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
1044
1044
 
1045
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
1045
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
1046
1046
 
1047
1047
  ### `view.transform.replace`
1048
1048
 
@@ -1052,7 +1052,7 @@ Example: `mammoth view transform replace 123 --input '{"columns": ["Status"], "f
1052
1052
 
1053
1053
  Result: `ViewTransformReplaceResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
1054
1054
 
1055
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
1055
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
1056
1056
 
1057
1057
  ### `view.transform.set-values`
1058
1058
 
@@ -1062,7 +1062,7 @@ Example: `mammoth view transform set-values 123 --input '{"values": [{"value": "
1062
1062
 
1063
1063
  Result: `ViewTransformSetValuesResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
1064
1064
 
1065
- 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.
1065
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
1066
1066
 
1067
1067
  ### `view.transform.small-large`
1068
1068
 
@@ -1072,7 +1072,7 @@ Example: `mammoth view transform small-large 123 --input '{"function": "SMALL",
1072
1072
 
1073
1073
  Result: `ViewTransformSmallLargeResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
1074
1074
 
1075
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
1075
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
1076
1076
 
1077
1077
  ### `view.transform.sort`
1078
1078
 
@@ -1082,7 +1082,7 @@ Example: `mammoth view transform sort 123 --input '{"order_by": [["Revenue", "DE
1082
1082
 
1083
1083
  Result: `ViewTransformSortResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
1084
1084
 
1085
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
1085
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
1086
1086
 
1087
1087
  ### `view.transform.split`
1088
1088
 
@@ -1092,7 +1092,7 @@ Example: `mammoth view transform split 123 --input '{"column": "Status", "delimi
1092
1092
 
1093
1093
  Result: `ViewTransformSplitResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
1094
1094
 
1095
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
1095
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
1096
1096
 
1097
1097
  ### `view.transform.substring`
1098
1098
 
@@ -1102,7 +1102,7 @@ Example: `mammoth view transform substring 123 --input '{"column": "Status", "da
1102
1102
 
1103
1103
  Result: `ViewTransformSubstringResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
1104
1104
 
1105
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
1105
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
1106
1106
 
1107
1107
  ### `view.transform.text`
1108
1108
 
@@ -1112,7 +1112,7 @@ Example: `mammoth view transform text 123 --input '{"columns": ["Status"], "data
1112
1112
 
1113
1113
  Result: `ViewTransformTextResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
1114
1114
 
1115
- 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.
1115
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
1116
1116
 
1117
1117
  ### `view.transform.unnest`
1118
1118
 
@@ -1122,7 +1122,7 @@ Example: `mammoth view transform unnest 123 --input '{"columns": ["Status"], "da
1122
1122
 
1123
1123
  Result: `ViewTransformUnnestResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
1124
1124
 
1125
- Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
1125
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
1126
1126
 
1127
1127
  ### `view.transform.window`
1128
1128
 
@@ -1132,7 +1132,7 @@ Example: `mammoth view transform window 123 --input '{"function": "ROW_NUMBER",
1132
1132
 
1133
1133
  Result: `ViewTransformWindowResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
1134
1134
 
1135
- 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.
1135
+ Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
1136
1136
 
1137
1137
  ### `view.trash`
1138
1138
 
@@ -43,7 +43,7 @@ anything else fails with `invalid_condition` before any request is sent.
43
43
  | `view transform filter` | `filter_type` | `SHOW` (keep matches, default), `REMOVE` |
44
44
  | `view transform text` | `case` | `UPPER`, `LOWER`, `TITLE`; `trim`: true/false |
45
45
  | `view transform convert-type` | `conversions[].to` | `TEXT`, `NUMERIC`, `DATE` |
46
- | `view transform fill-missing` | `direction` | `LAST_VALUE` (forward fill), `FIRST_VALUE` |
46
+ | `view transform fill-missing` | `direction` | `FIRST_VALUE` (forward fill: previous row), `LAST_VALUE` (back-fill: next row) |
47
47
  | `view transform join` | `join_type` | `INNER`, `LEFT`, `RIGHT`, `OUTER` |
48
48
  | `view transform set-values` | `column_type` (new column) | `TEXT`, `NUMERIC`, `DATE` |
49
49
 
@@ -65,7 +65,42 @@ correct aggregation for a "distinct people" card under a date filter);
65
65
  ID --input '{"body": {"params": {"pages": [{"title": ..., "focus": {...},
66
66
  "charts": [...]}]}}}'` adds a page, but that route runs through the LLM
67
67
  guard and may drop a unit it cannot evidence (it says so in `data.message`);
68
- `canvas save` keeps what you wrote.
68
+ `canvas save` keeps what you wrote. When the route refuses a chart (for
69
+ example a `pie` that the data does not support), `data.chart_check.refused`
70
+ names it. A new page that got no charts is removed, and
71
+ `data.chart_check.removed_pages` lists it. Add a chart of a different kind
72
+ (`hbar`, `line`, `table`) for that page.
73
+
74
+ ## Put the money on the board
75
+
76
+ If the data has money (a price, an amount, revenue or cost), the dashboard
77
+ must show it. A board that shows only counts or quantities has left out the
78
+ number the user most likely wants.
79
+
80
+ - A money column must be `NUMERIC` first. `view data get` flags a money
81
+ column that is stored as text in `column_warnings`.
82
+ - A unit price is not revenue. Do not sum a price. If the data has a
83
+ quantity and a unit price, add a revenue column before you build the
84
+ board, then chart the sum of that column:
85
+
86
+ ```bash
87
+ mammoth view transform math VIEW_ID --project PROJECT_ID \
88
+ --input '{"dataset_id":DATASET_ID,"expression":"qty * price","new_column":"revenue"}'
89
+ ```
90
+
91
+ - Add every column the board needs before `create-blank`. A dashboard sees
92
+ only the columns the view had when the dashboard was made: `pages add`
93
+ refuses a later column ("isn't a measure in this data"). If you added it
94
+ after, make a new dashboard and delete the old one if you made it for this
95
+ task. The upload result's `before_dashboard` names the column to add.
96
+ - Put revenue in a KPI (`focus.kpis`, `agg` `sum`, `unit.prefix` for the
97
+ currency) and in one or more charts (revenue by product, by segment, by
98
+ month). Rows with an empty price give an empty revenue. Say how many there
99
+ are in your report.
100
+ - `create-blank`, `canvas save` and `pages add` return `deliverable_check`:
101
+ `money_not_shown` (with the `math` command in `fix`), `unit_price_summed`,
102
+ and one `blank_values` entry for each column on the board that has blanks.
103
+ Fix each warning, or say in your report why you kept it.
69
104
 
70
105
  **Read the bindings back, then the numbers.** `dashboard canvas get` returns
71
106
  `data.meta.figures` — `"p1:kpi:2": {"descriptors": {"value": "<id>"}}` per
@@ -21,9 +21,10 @@ Prefer typed operations such as convert-type, fill-missing, replace, join,
21
21
  lookup, filter and math only when the live schema
22
22
  lists them. Pick the operation by what it does, not by its name:
23
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`
24
+ - `fill-missing` copies an adjacent row's value into blanks, in the
25
+ `order_by` order. `direction` `FIRST_VALUE` takes the previous row's value
26
+ (forward fill, the usual choice); `LAST_VALUE` takes the next row's value
27
+ (back-fill). It cannot write a literal. To fill blanks with a constant (for example `0`), use `set-values`
27
28
  on the existing column with an `IS_EMPTY` condition:
28
29
 
29
30
  ```bash
@@ -97,6 +98,9 @@ as defaults, and let the user's request override them:
97
98
  first. Check the result on a few rows.
98
99
  - Convert several columns to the same type in one `convert-type` call (one
99
100
  `conversions` entry for each column), not one call for each column.
101
+ Upload already types numbers and ISO dates, so read the types (`view get`)
102
+ first and convert only the columns that are wrong. The CLI skips a column
103
+ that already has the type (`skipped` in the result).
100
104
  - Remove duplicates near the end, after the cleanup and joins, so the check
101
105
  uses the final columns.
102
106
  - `filter` also takes a plain-language `prompt` instead of a `condition`.
@@ -16,6 +16,8 @@ from typing import Any
16
16
  from mammoth.models.dashboards import AddPagesSpec
17
17
  from pydantic import ValidationError
18
18
 
19
+ from mammoth_cli.commands.view import view_profiles
20
+ from mammoth_cli.context import profiles
19
21
  from mammoth_cli.errors.envelope import (
20
22
  CODE_INVALID_ARGUMENT,
21
23
  CODE_MISSING_ARGUMENT,
@@ -25,6 +27,7 @@ from mammoth_cli.errors.envelope import (
25
27
  CliError,
26
28
  )
27
29
  from mammoth_cli.manifest.loader import command_by_id
30
+ from mammoth_cli.runtime import parents
28
31
  from mammoth_cli.runtime.confirm import (
29
32
  POLICY_CONFIRM_TARGET,
30
33
  POLICY_NONE,
@@ -33,9 +36,16 @@ from mammoth_cli.runtime.confirm import (
33
36
  enforce_confirmation,
34
37
  )
35
38
  from mammoth_cli.runtime.invocation import Invocation
36
- from mammoth_cli.runtime.session import open_service, require_project
39
+ from mammoth_cli.runtime.session import open_service, require_project, resolved_project
37
40
  from mammoth_cli.services.argspec import arg_spec
38
41
  from mammoth_cli.services.command_contract import bind_command_inputs
42
+ from mammoth_cli.services.dashboard_pages import check_added_pages
43
+ from mammoth_cli.services.dashboard_review import (
44
+ CANVAS_GET,
45
+ NEW_COLUMN_NOTE,
46
+ has_profiles,
47
+ review,
48
+ )
39
49
  from mammoth_cli.services.positionals import resolve_positionals
40
50
 
41
51
  HandlerResult = tuple[Any, dict[str, Any]]
@@ -671,9 +681,71 @@ def generated_dashboard(invocation: Invocation) -> HandlerResult:
671
681
  with open_service(invocation) as (service, auth):
672
682
  data = service.call(_symbol(invocation), **kwargs)
673
683
  data = _resolve_job(service, invocation, data)
684
+ if invocation.command_id == "dashboard.pages.add" and "body" in kwargs:
685
+ requested = kwargs["body"].get("params", {}).get("pages", [])
686
+ data = check_added_pages(service, positionals["dashboard_id"], requested, data)
687
+ if invocation.command_id in _REVIEWED_COMMANDS:
688
+ data = _with_deliverable_check(invocation, service, auth, positionals, data)
674
689
  return data, _meta(invocation, auth.workspace_id)
675
690
 
676
691
 
692
+ #: Authoring steps whose result carries ``deliverable_check``.
693
+ _REVIEWED_COMMANDS = frozenset(
694
+ {"dashboard.create-blank", "dashboard.canvas.save", "dashboard.pages.add"}
695
+ )
696
+
697
+
698
+ def _with_deliverable_check(
699
+ invocation: Invocation, service: Any, auth: Any, positionals: dict[str, Any], data: Any
700
+ ) -> Any:
701
+ """Add ``deliverable_check`` (money shown? blanks decided?) to an authoring result.
702
+
703
+ One canvas read; advice only, so a failed read leaves the result as it was.
704
+ """
705
+ if hasattr(data, "model_dump"):
706
+ data = data.model_dump(mode="json")
707
+ if not isinstance(data, dict):
708
+ return data
709
+ dashboard_id = positionals.get("dashboard_id") or data.get("id")
710
+ if not isinstance(dashboard_id, int):
711
+ return data
712
+ try:
713
+ canvas_doc = service.call(CANVAS_GET, dashboard_id=dashboard_id)
714
+ if hasattr(canvas_doc, "model_dump"):
715
+ canvas_doc = canvas_doc.model_dump(mode="json")
716
+ source = (canvas_doc.get("canvas") or {}).get("dataset") or {}
717
+ view_id = source.get("dataview_id")
718
+ profile = invocation.profile or profiles.get_selected()
719
+ dataset_id = (
720
+ parents.lookup(profile, auth.workspace_id, view_id)
721
+ if isinstance(view_id, int)
722
+ else None
723
+ )
724
+ fallback = None
725
+ if not has_profiles(canvas_doc) and isinstance(view_id, int) and dataset_id is not None:
726
+ fallback = view_profiles(service, dataset_id, view_id, resolved_project(invocation))
727
+ warnings = review(canvas_doc, dataset_id, fallback)
728
+ except Exception: # noqa: BLE001 -- advice must never fail the authoring step
729
+ return data
730
+ if warnings:
731
+ data = {
732
+ **data,
733
+ "deliverable_check": {
734
+ "warnings": warnings,
735
+ "note": (
736
+ "Fix these before you report the dashboard as done, or say in your "
737
+ "report why not."
738
+ + (
739
+ " " + NEW_COLUMN_NOTE
740
+ if any("fix" in warning for warning in warnings)
741
+ else ""
742
+ )
743
+ ),
744
+ },
745
+ }
746
+ return data
747
+
748
+
677
749
  def dashboard_assess_twb(invocation: Invocation) -> HandlerResult:
678
750
  """Assess a local Tableau workbook through the SDK multipart seam."""
679
751
  file_path = _require_str_positional(invocation, "file")
@@ -15,6 +15,8 @@ from collections.abc import Callable
15
15
  from pathlib import Path
16
16
  from typing import Any
17
17
 
18
+ from mammoth_cli.commands.view import upload_preview
19
+ from mammoth_cli.context import profiles
18
20
  from mammoth_cli.errors.envelope import (
19
21
  CODE_INVALID_ARGUMENT,
20
22
  CODE_MISSING_ARGUMENT,
@@ -24,6 +26,7 @@ from mammoth_cli.errors.envelope import (
24
26
  CliError,
25
27
  )
26
28
  from mammoth_cli.manifest.loader import command_by_id
29
+ from mammoth_cli.runtime import parents
27
30
  from mammoth_cli.runtime.confirm import (
28
31
  POLICY_CONFIRM_TARGET,
29
32
  POLICY_PROMPT_OR_YES,
@@ -226,6 +229,18 @@ def file_upload(invocation: Invocation) -> HandlerResult:
226
229
  # ambiguous date column lands in ``need_action`` with no view. Report
227
230
  # the status the platform holds for each dataset, not an assumed one.
228
231
  result = _upload_result(data, lambda dataset_id: _dataset_status(service, dataset_id))
232
+ project_id = resolved_project(invocation)
233
+ for entry in result["datasets"]:
234
+ if entry.get("status") != "ready":
235
+ continue
236
+ preview = upload_preview(service, int(entry["id"]), project_id)
237
+ if preview is not None:
238
+ entry["view"] = preview
239
+ parents.remember(
240
+ invocation.profile or profiles.get_selected(),
241
+ auth.workspace_id,
242
+ {preview["view_id"]: int(entry["id"])},
243
+ )
229
244
  return result, _meta(invocation, auth.workspace_id, resolved_project(invocation))
230
245
 
231
246