mammoth-cli 2.0.39__tar.gz → 2.0.40__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 (223) hide show
  1. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/PKG-INFO +2 -2
  2. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +8 -4
  4. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +1 -1
  5. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +1 -1
  6. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +2 -2
  7. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +33 -33
  8. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +1 -1
  9. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +27 -1
  10. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +7 -3
  11. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/dashboard.py +4 -0
  12. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/schema.py +1 -1
  13. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/view_ops.py +83 -4
  14. mammoth_cli-2.0.40/mammoth_cli/services/dashboard_pages.py +136 -0
  15. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/pyproject.toml +2 -2
  16. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/view.yaml +3 -2
  17. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/.gitignore +0 -0
  18. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/LICENSE +0 -0
  19. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/README.md +0 -0
  20. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/__main__.py +0 -0
  21. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/app.py +0 -0
  22. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  23. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
  24. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  25. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  26. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  27. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  28. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  29. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  30. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  31. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  32. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  33. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  34. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  35. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  36. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  37. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  38. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  39. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  40. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
  41. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  42. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  43. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  44. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  45. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  46. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  47. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  48. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  49. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  50. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  51. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
  52. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  53. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  54. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  55. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  56. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  57. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  58. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  59. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  60. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  61. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  62. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  63. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  64. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  65. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  66. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  67. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  68. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  69. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  70. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  71. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  72. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
  73. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  74. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  75. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  76. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  77. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  78. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  79. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  80. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  81. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  82. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
  83. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/__init__.py +0 -0
  84. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/activity.py +0 -0
  85. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/addon.py +0 -0
  86. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/agent.py +0 -0
  87. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/ai.py +0 -0
  88. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/annotation.py +0 -0
  89. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/auth.py +0 -0
  90. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/automation.py +0 -0
  91. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/batch.py +0 -0
  92. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/billing.py +0 -0
  93. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/browse.py +0 -0
  94. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/capability.py +0 -0
  95. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/client_app.py +0 -0
  96. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/completion.py +0 -0
  97. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/config.py +0 -0
  98. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/connector.py +0 -0
  99. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/context.py +0 -0
  100. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/data_app.py +0 -0
  101. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/dataset.py +0 -0
  102. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/doctor.py +0 -0
  103. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/external_key.py +0 -0
  104. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/file.py +0 -0
  105. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/folder.py +0 -0
  106. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/job.py +0 -0
  107. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/notification.py +0 -0
  108. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/parameter.py +0 -0
  109. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/project.py +0 -0
  110. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/registry.py +0 -0
  111. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/report.py +0 -0
  112. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/schedule.py +0 -0
  113. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/skill.py +0 -0
  114. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/snippet.py +0 -0
  115. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/support.py +0 -0
  116. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/template.py +0 -0
  117. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/trash.py +0 -0
  118. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/upgrade.py +0 -0
  119. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/user.py +0 -0
  120. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/view.py +0 -0
  121. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/webhook.py +0 -0
  122. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/workflow.py +0 -0
  123. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/commands/workspace.py +0 -0
  124. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/context/__init__.py +0 -0
  125. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/context/credentials.py +0 -0
  126. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/context/endpoint.py +0 -0
  127. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/context/profiles.py +0 -0
  128. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/context/resolver.py +0 -0
  129. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/contracts/__init__.py +0 -0
  130. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/contracts/auth.py +0 -0
  131. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/errors/__init__.py +0 -0
  132. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/errors/envelope.py +0 -0
  133. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/manifest/__init__.py +0 -0
  134. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/manifest/loader.py +0 -0
  135. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/messages/__init__.py +0 -0
  136. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/output/__init__.py +0 -0
  137. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/output/envelope.py +0 -0
  138. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/output/normalize.py +0 -0
  139. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/output/policy.py +0 -0
  140. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/output/progress.py +0 -0
  141. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/output/render.py +0 -0
  142. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/py.typed +0 -0
  143. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/runtime/__init__.py +0 -0
  144. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/runtime/confirm.py +0 -0
  145. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/runtime/dryrun.py +0 -0
  146. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/runtime/executor.py +0 -0
  147. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/runtime/input_loader.py +0 -0
  148. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/runtime/invocation.py +0 -0
  149. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/runtime/options.py +0 -0
  150. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/runtime/parents.py +0 -0
  151. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/runtime/runlog.py +0 -0
  152. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/runtime/session.py +0 -0
  153. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/runtime/strict.py +0 -0
  154. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/runtime/updates.py +0 -0
  155. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/runtime/validate.py +0 -0
  156. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/services/__init__.py +0 -0
  157. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/services/argspec.py +0 -0
  158. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/services/coerce.py +0 -0
  159. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/services/command_contract.py +0 -0
  160. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/services/conditions.py +0 -0
  161. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/services/data_quality.py +0 -0
  162. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/services/dispatch.py +0 -0
  163. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/services/factory.py +0 -0
  164. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/services/input_fields.py +0 -0
  165. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/services/mapping.py +0 -0
  166. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/services/openapi_types.py +0 -0
  167. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/services/positionals.py +0 -0
  168. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/services/protocol.py +0 -0
  169. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/services/sdk_service.py +0 -0
  170. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/services/testing.py +0 -0
  171. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/services/type_system.py +0 -0
  172. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/skills/__init__.py +0 -0
  173. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/skills/installer.py +0 -0
  174. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/skills/steering.py +0 -0
  175. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/mammoth_cli/testing.py +0 -0
  176. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/activity.yaml +0 -0
  177. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/addon.yaml +0 -0
  178. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/agent.yaml +0 -0
  179. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/ai.yaml +0 -0
  180. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/annotation.yaml +0 -0
  181. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/auth.yaml +0 -0
  182. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/automation.yaml +0 -0
  183. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/batch.yaml +0 -0
  184. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/billing.yaml +0 -0
  185. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/browse.yaml +0 -0
  186. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/capability.yaml +0 -0
  187. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/client-app.yaml +0 -0
  188. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/completion.yaml +0 -0
  189. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/config.yaml +0 -0
  190. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/connector.yaml +0 -0
  191. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/context.yaml +0 -0
  192. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/dashboard.yaml +0 -0
  193. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/data-app.yaml +0 -0
  194. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/dataset.yaml +0 -0
  195. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/doctor.yaml +0 -0
  196. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/external-key.yaml +0 -0
  197. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/file.yaml +0 -0
  198. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/folder.yaml +0 -0
  199. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/job.yaml +0 -0
  200. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/log.yaml +0 -0
  201. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/notification.yaml +0 -0
  202. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/parameter.yaml +0 -0
  203. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/project.yaml +0 -0
  204. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/report.yaml +0 -0
  205. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/schedule.yaml +0 -0
  206. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/schema.yaml +0 -0
  207. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/skill.yaml +0 -0
  208. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/snippet.yaml +0 -0
  209. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/support.yaml +0 -0
  210. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/template.yaml +0 -0
  211. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/trash.yaml +0 -0
  212. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/upgrade.yaml +0 -0
  213. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/user.yaml +0 -0
  214. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/version.yaml +0 -0
  215. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/webhook.yaml +0 -0
  216. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/workflow.yaml +0 -0
  217. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/commands/workspace.yaml +0 -0
  218. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/openapi-operations.yaml +0 -0
  219. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/schema-v1.json +0 -0
  220. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/sdk-catalog.source.yaml +0 -0
  221. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/manifests/sdk-methods.yaml +0 -0
  222. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/spec/openapi/metadata.json +0 -0
  223. {mammoth_cli-2.0.39 → mammoth_cli-2.0.40}/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.40
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.40"
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.40
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
 
@@ -104,14 +104,18 @@ dashboard from t_a and t_b"). Work it out from the data before you build:
104
104
  case and padding (`text`), no blanks (`set-values`, `filter`).
105
105
  4. Act on every `column_warnings` entry for a column the deliverable uses:
106
106
  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.
107
+ not numbers become empty). A text `price` cannot be summed on a dashboard.
108
+ Then decide on each `blank_values` entry: fill, filter, or keep. Write one
109
+ line for each in your report (the column, the count, what you did and
110
+ why). A blank that you saw but did not mention is a miss.
109
111
  5. `view transform join` the lookup view into the main view (`LEFT`). The
110
112
  result's `join_check` gives `match_rate`, `unmatched_rows` and
111
113
  `unmatched_keys`; put them in your report, and stop to compare the keys
112
114
  if more than a few rows found no match.
113
115
  6. Build the dashboard from the joined view
114
- ([dashboards](references/recipes/dashboards.md)).
116
+ ([dashboards](references/recipes/dashboards.md)). If the data has money,
117
+ show it: add `revenue` (`math`, `qty * price`, `new_column`) and chart
118
+ its sum. Do not sum a unit price.
115
119
 
116
120
  For the defaults that most pipelines use (new column or overwrite, `LEFT`
117
121
  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,33 @@ 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
+ - Put revenue in a KPI (`focus.kpis`, `agg` `sum`, `unit.prefix` for the
92
+ currency) and in one or more charts (revenue by product, by segment, by
93
+ month). Rows with an empty price give an empty revenue. Say how many there
94
+ are in your report.
69
95
 
70
96
  **Read the bindings back, then the numbers.** `dashboard canvas get` returns
71
97
  `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`.
@@ -36,6 +36,7 @@ from mammoth_cli.runtime.invocation import Invocation
36
36
  from mammoth_cli.runtime.session import open_service, require_project
37
37
  from mammoth_cli.services.argspec import arg_spec
38
38
  from mammoth_cli.services.command_contract import bind_command_inputs
39
+ from mammoth_cli.services.dashboard_pages import check_added_pages
39
40
  from mammoth_cli.services.positionals import resolve_positionals
40
41
 
41
42
  HandlerResult = tuple[Any, dict[str, Any]]
@@ -671,6 +672,9 @@ def generated_dashboard(invocation: Invocation) -> HandlerResult:
671
672
  with open_service(invocation) as (service, auth):
672
673
  data = service.call(_symbol(invocation), **kwargs)
673
674
  data = _resolve_job(service, invocation, data)
675
+ if invocation.command_id == "dashboard.pages.add" and "body" in kwargs:
676
+ requested = kwargs["body"].get("params", {}).get("pages", [])
677
+ data = check_added_pages(service, positionals["dashboard_id"], requested, data)
674
678
  return data, _meta(invocation, auth.workspace_id)
675
679
 
676
680
 
@@ -109,7 +109,7 @@ _COMMAND_DISCOVERY_PURPOSES = {
109
109
  "filter rows keep drop exclude remove delete rows where condition subset"
110
110
  ),
111
111
  "view.transform.generate-sql": (
112
- "generate sql from natural language intent question and run it as a task"
112
+ "generate write sql query from natural language intent question"
113
113
  ),
114
114
  "view.transform.increment-date": "add subtract days months years to a date column shift",
115
115
  "view.transform.join": (
@@ -19,11 +19,13 @@ enum-typed fields are forwarded as the plain string given on ``--input``.
19
19
 
20
20
  from __future__ import annotations
21
21
 
22
+ import json
22
23
  from collections.abc import Callable
23
24
  from typing import Any
24
25
 
25
26
  from mammoth_cli.commands.view import (
26
27
  BRIEF_VIEW_FIELDS,
28
+ _dataview_metadata,
27
29
  _require_discovery_allowed,
28
30
  apply_column_renames,
29
31
  brief_view_record,
@@ -241,13 +243,16 @@ def _dispatch_view(
241
243
  *,
242
244
  before: Callable[[Any, int], Any] | None = None,
243
245
  after: Callable[[Any, int, Any, Any], Any] | None = None,
246
+ prepare: Callable[[Any, int, dict[str, Any]], Any] | None = None,
244
247
  **kwargs: Any,
245
248
  ) -> HandlerResult:
246
249
  """Open the service, dispatch a View method call, and build the envelope.
247
250
 
248
251
  ``before(service, dataset_id)`` runs ahead of the call and its value is
249
252
  handed to ``after(service, dataset_id, state, data)``, which returns the
250
- result to emit. Both need the exact parent; without one they are skipped.
253
+ result to emit. ``prepare(service, dataset_id, kwargs)`` may edit the call
254
+ arguments in place; when it returns a value, that value is emitted and no
255
+ call is made. All three need the exact parent; without one they are skipped.
251
256
  """
252
257
  # ``dataset_id`` is invocation-local resource context. It is not a View
253
258
  # transform argument, but passing it through lets the service fetch the
@@ -268,6 +273,10 @@ def _dispatch_view(
268
273
  if dataset_id is None:
269
274
  dataset_id = parents.lookup(_profile_name(invocation), auth.workspace_id, view_id)
270
275
  require_expected_task_count(service, view_id, dataset_id, document)
276
+ if prepare is not None and dataset_id is not None:
277
+ early = prepare(service, int(dataset_id), kwargs)
278
+ if early is not None:
279
+ return early, _meta(invocation, auth.workspace_id)
271
280
  state = before(service, int(dataset_id)) if before and dataset_id is not None else None
272
281
  try:
273
282
  if dataset_id is None:
@@ -419,7 +428,13 @@ def reject_pipeline_reference_errors(
419
428
  "response": data,
420
429
  },
421
430
  recovery_commands=[
422
- f"mammoth view task delete {view_id} {task_id} --yes" for task_id in task_ids
431
+ f"mammoth view task delete {view_id} {task_id} --yes"
432
+ + (
433
+ f" --input '{{\"dataset_id\": {kwargs['dataset_id']}}}'"
434
+ if "dataset_id" in kwargs
435
+ else ""
436
+ )
437
+ for task_id in task_ids
423
438
  ]
424
439
  or [f'mammoth view pipeline items {view_id} --input \'{{"fields": "__full"}}\''],
425
440
  )
@@ -679,7 +694,56 @@ def view_transform_convert_type(invocation: Invocation) -> HandlerResult:
679
694
  _require_field(document, "conversions")
680
695
  assert document is not None
681
696
  kwargs = _bind_transform_inputs(invocation, document)
682
- return _dispatch_view(invocation, view_id, "convert_type", **kwargs)
697
+ project_id = invocation.project
698
+
699
+ def drop_same_type(service: Any, dataset_id: int, call: dict[str, Any]) -> Any:
700
+ # Converting a column to the type it already has puts the pipeline in
701
+ # ref_error ("type mismatch") and every read of the view fails until
702
+ # the task is removed (release, 2026-09-25). Uploads type numbers and
703
+ # ISO dates on their own, so this is easy to hit: skip those entries.
704
+ conversions = call.get("conversions")
705
+ if not isinstance(conversions, list):
706
+ return None
707
+ current = {
708
+ column.get("display_name"): str(column.get("type") or "").upper()
709
+ for column in _dataview_metadata(service, dataset_id, view_id, project_id)
710
+ if isinstance(column, dict)
711
+ }
712
+ kept, skipped = [], []
713
+ for entry in conversions:
714
+ name = entry.get("column") if isinstance(entry, dict) else None
715
+ target = str(entry.get("to") or "").upper() if isinstance(entry, dict) else ""
716
+ if name is not None and target and current.get(name) == target:
717
+ skipped.append({"column": name, "type": target})
718
+ else:
719
+ kept.append(entry)
720
+ if not skipped:
721
+ return None
722
+ if not kept:
723
+ return {
724
+ "status": "no_change",
725
+ "skipped": skipped,
726
+ "note": "Every column already has the requested type; no task was added.",
727
+ }
728
+ call["conversions"] = kept
729
+ skipped_record.extend(skipped)
730
+ return None
731
+
732
+ skipped_record: list[dict[str, Any]] = []
733
+
734
+ def note_skipped(service: Any, dataset_id: int, state: Any, data: Any) -> Any:
735
+ if skipped_record and isinstance(data, dict):
736
+ data = {**data, "skipped": skipped_record}
737
+ return data
738
+
739
+ return _dispatch_view(
740
+ invocation,
741
+ view_id,
742
+ "convert_type",
743
+ prepare=drop_same_type,
744
+ after=note_skipped,
745
+ **kwargs,
746
+ )
683
747
 
684
748
 
685
749
  def view_transform_copy_columns(invocation: Invocation) -> HandlerResult:
@@ -775,7 +839,22 @@ def view_transform_generate_sql(invocation: Invocation) -> HandlerResult:
775
839
  _require_field(document, "intent")
776
840
  assert document is not None
777
841
  kwargs = _bind_transform_inputs(invocation, document)
778
- return _dispatch_view(invocation, view_id, "generate_sql", **kwargs)
842
+
843
+ def describe(service: Any, dataset_id: int, state: Any, data: Any) -> Any:
844
+ # The route writes and validates a query but adds no task (release,
845
+ # 2026-09-25); a bare string read as "done" by an agent that expected
846
+ # the view to change. Say so, and give the command that applies it.
847
+ if not isinstance(data, str):
848
+ return data
849
+ spec = json.dumps({"dataset_id": dataset_id, "query": data})
850
+ return {
851
+ "sql": data,
852
+ "applied": False,
853
+ "note": "The view is unchanged. Run 'apply' to add the query as a SQL task.",
854
+ "apply": f"mammoth view transform add-sql {view_id} --input '{spec}'",
855
+ }
856
+
857
+ return _dispatch_view(invocation, view_id, "generate_sql", after=describe, **kwargs)
779
858
 
780
859
 
781
860
  def view_transform_increment_date(invocation: Invocation) -> HandlerResult: