mammoth-cli 2.0.38__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.38 → mammoth_cli-2.0.40}/PKG-INFO +2 -2
  2. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +25 -9
  4. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +1 -1
  5. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +1 -1
  6. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +2 -2
  7. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +33 -33
  8. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +1 -1
  9. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +27 -1
  10. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +5 -2
  11. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +42 -3
  12. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +4 -2
  13. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/dashboard.py +4 -0
  14. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/schema.py +1 -1
  15. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/view.py +175 -14
  16. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/view_ops.py +112 -6
  17. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/runtime/strict.py +14 -1
  18. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/services/command_contract.py +4 -1
  19. mammoth_cli-2.0.40/mammoth_cli/services/dashboard_pages.py +136 -0
  20. mammoth_cli-2.0.40/mammoth_cli/services/data_quality.py +136 -0
  21. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/pyproject.toml +2 -2
  22. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/view.yaml +3 -2
  23. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/.gitignore +0 -0
  24. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/LICENSE +0 -0
  25. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/README.md +0 -0
  26. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/__main__.py +0 -0
  27. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/app.py +0 -0
  28. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  29. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
  30. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  31. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  32. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  33. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  34. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  35. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  36. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  37. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  38. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  39. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  40. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  41. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  42. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  43. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  44. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  45. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  46. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
  47. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  48. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  49. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  50. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  51. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  52. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  53. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  54. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  55. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  56. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  57. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
  58. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  59. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  60. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  61. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  62. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  63. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  64. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  65. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  66. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  67. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  68. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  69. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  70. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  71. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  72. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  73. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  74. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  75. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  76. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  77. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  78. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  79. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  80. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  81. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  82. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  83. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  84. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  85. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  86. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  87. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/__init__.py +0 -0
  88. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/activity.py +0 -0
  89. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/addon.py +0 -0
  90. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/agent.py +0 -0
  91. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/ai.py +0 -0
  92. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/annotation.py +0 -0
  93. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/auth.py +0 -0
  94. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/automation.py +0 -0
  95. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/batch.py +0 -0
  96. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/billing.py +0 -0
  97. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/browse.py +0 -0
  98. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/capability.py +0 -0
  99. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/client_app.py +0 -0
  100. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/completion.py +0 -0
  101. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/config.py +0 -0
  102. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/connector.py +0 -0
  103. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/context.py +0 -0
  104. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/data_app.py +0 -0
  105. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/dataset.py +0 -0
  106. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/doctor.py +0 -0
  107. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/external_key.py +0 -0
  108. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/file.py +0 -0
  109. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/folder.py +0 -0
  110. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/job.py +0 -0
  111. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/notification.py +0 -0
  112. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/parameter.py +0 -0
  113. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/project.py +0 -0
  114. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/registry.py +0 -0
  115. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/report.py +0 -0
  116. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/schedule.py +0 -0
  117. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/skill.py +0 -0
  118. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/snippet.py +0 -0
  119. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/support.py +0 -0
  120. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/template.py +0 -0
  121. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/trash.py +0 -0
  122. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/upgrade.py +0 -0
  123. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/user.py +0 -0
  124. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/webhook.py +0 -0
  125. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/workflow.py +0 -0
  126. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/commands/workspace.py +0 -0
  127. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/context/__init__.py +0 -0
  128. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/context/credentials.py +0 -0
  129. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/context/endpoint.py +0 -0
  130. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/context/profiles.py +0 -0
  131. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/context/resolver.py +0 -0
  132. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/contracts/__init__.py +0 -0
  133. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/contracts/auth.py +0 -0
  134. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/errors/__init__.py +0 -0
  135. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/errors/envelope.py +0 -0
  136. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/manifest/__init__.py +0 -0
  137. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/manifest/loader.py +0 -0
  138. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/messages/__init__.py +0 -0
  139. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/output/__init__.py +0 -0
  140. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/output/envelope.py +0 -0
  141. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/output/normalize.py +0 -0
  142. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/output/policy.py +0 -0
  143. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/output/progress.py +0 -0
  144. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/output/render.py +0 -0
  145. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/py.typed +0 -0
  146. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/runtime/__init__.py +0 -0
  147. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/runtime/confirm.py +0 -0
  148. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/runtime/dryrun.py +0 -0
  149. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/runtime/executor.py +0 -0
  150. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/runtime/input_loader.py +0 -0
  151. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/runtime/invocation.py +0 -0
  152. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/runtime/options.py +0 -0
  153. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/runtime/parents.py +0 -0
  154. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/runtime/runlog.py +0 -0
  155. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/runtime/session.py +0 -0
  156. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/runtime/updates.py +0 -0
  157. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/runtime/validate.py +0 -0
  158. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/services/__init__.py +0 -0
  159. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/services/argspec.py +0 -0
  160. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/services/coerce.py +0 -0
  161. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/services/conditions.py +0 -0
  162. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/services/dispatch.py +0 -0
  163. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/services/factory.py +0 -0
  164. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/services/input_fields.py +0 -0
  165. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/services/mapping.py +0 -0
  166. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/services/openapi_types.py +0 -0
  167. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/services/positionals.py +0 -0
  168. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/services/protocol.py +0 -0
  169. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/services/sdk_service.py +0 -0
  170. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/services/testing.py +0 -0
  171. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/services/type_system.py +0 -0
  172. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/skills/__init__.py +0 -0
  173. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/skills/installer.py +0 -0
  174. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/skills/steering.py +0 -0
  175. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/mammoth_cli/testing.py +0 -0
  176. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/activity.yaml +0 -0
  177. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/addon.yaml +0 -0
  178. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/agent.yaml +0 -0
  179. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/ai.yaml +0 -0
  180. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/annotation.yaml +0 -0
  181. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/auth.yaml +0 -0
  182. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/automation.yaml +0 -0
  183. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/batch.yaml +0 -0
  184. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/billing.yaml +0 -0
  185. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/browse.yaml +0 -0
  186. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/capability.yaml +0 -0
  187. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/client-app.yaml +0 -0
  188. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/completion.yaml +0 -0
  189. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/config.yaml +0 -0
  190. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/connector.yaml +0 -0
  191. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/context.yaml +0 -0
  192. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/dashboard.yaml +0 -0
  193. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/data-app.yaml +0 -0
  194. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/dataset.yaml +0 -0
  195. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/doctor.yaml +0 -0
  196. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/external-key.yaml +0 -0
  197. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/file.yaml +0 -0
  198. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/folder.yaml +0 -0
  199. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/job.yaml +0 -0
  200. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/log.yaml +0 -0
  201. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/notification.yaml +0 -0
  202. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/parameter.yaml +0 -0
  203. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/project.yaml +0 -0
  204. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/report.yaml +0 -0
  205. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/schedule.yaml +0 -0
  206. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/schema.yaml +0 -0
  207. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/skill.yaml +0 -0
  208. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/snippet.yaml +0 -0
  209. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/support.yaml +0 -0
  210. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/template.yaml +0 -0
  211. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/trash.yaml +0 -0
  212. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/upgrade.yaml +0 -0
  213. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/user.yaml +0 -0
  214. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/version.yaml +0 -0
  215. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/webhook.yaml +0 -0
  216. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/workflow.yaml +0 -0
  217. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/commands/workspace.yaml +0 -0
  218. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/openapi-operations.yaml +0 -0
  219. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/schema-v1.json +0 -0
  220. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/sdk-catalog.source.yaml +0 -0
  221. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/manifests/sdk-methods.yaml +0 -0
  222. {mammoth_cli-2.0.38 → mammoth_cli-2.0.40}/spec/openapi/metadata.json +0 -0
  223. {mammoth_cli-2.0.38 → 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.38
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.38"
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.38
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
 
@@ -93,21 +93,33 @@ 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. Read every view first: `view get VIEW_ID` (columns, types, row count) and
97
- `view data get VIEW_ID --input '{"limit": 20}'`.
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.
98
100
  2. Find the keys. A column in one view whose values appear in a column of
99
101
  the other (`customer_id` and `id`, `order_ref` and `order_no`) is a
100
102
  foreign key; the view with many rows per key is the main one.
101
103
  3. Make the keys match before the join: same type (`convert-type`), same
102
104
  case and padding (`text`), no blanks (`set-values`, `filter`).
103
- 4. Fix what the deliverable needs: numbers stored as text (`convert-type`
104
- to `NUMERIC`), dates stored as text (`convert-type` to `DATE`), blanks.
105
- 5. `view transform join` the lookup view into the main view (`LEFT`), then
106
- read back and check the match rate
107
- ([worked example](references/recipes/end-to-end.md), step 5).
105
+ 4. Act on every `column_warnings` entry for a column the deliverable uses:
106
+ run its `fix` (`convert-type` to `NUMERIC` or `DATE`; the values that are
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.
111
+ 5. `view transform join` the lookup view into the main view (`LEFT`). The
112
+ result's `join_check` gives `match_rate`, `unmatched_rows` and
113
+ `unmatched_keys`; put them in your report, and stop to compare the keys
114
+ if more than a few rows found no match.
108
115
  6. Build the dashboard from the joined view
109
- ([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.
110
119
 
120
+ For the defaults that most pipelines use (new column or overwrite, `LEFT`
121
+ joins, date steps), see
122
+ [transforms](references/recipes/transforms.md#what-most-pipelines-look-like).
111
123
  Say what you inferred (which columns you joined on, what you converted) in
112
124
  your report. If no column links the files, ask before you combine them.
113
125
 
@@ -149,6 +161,10 @@ your report. If no column links the files, ask before you combine them.
149
161
  target column *before* the change so the after-read has a comparison.
150
162
  - A uniform result (every amount 0, every region "Unknown", most join rows
151
163
  unmatched) means the previous step went wrong; stop and re-inspect it.
164
+ - `column_warnings` on a data read and `join_check` on a join are findings,
165
+ not decoration: fix each one the deliverable depends on, or say in the
166
+ report why you kept it. `view data get` pages with `{"offset": 51,
167
+ "limit": 50}`.
152
168
  - A timeout, exit 7 or interruption does not prove failure; reconcile an
153
169
  `outcome_unknown` (`job get`, `view task list`) before replaying.
154
170
  - Run the [report checklist](references/report-checklist.md) before stating
@@ -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
@@ -22,6 +22,8 @@ mammoth view list CUSTOMERS_DS --project PROJECT_ID # -> CUSTOMERS_VIEW
22
22
  # 2. look before you change: column names, types, row_count, a sample
23
23
  mammoth view get ORDERS_VIEW ORDERS_DS --project PROJECT_ID
24
24
  mammoth view data get ORDERS_VIEW ORDERS_DS --project PROJECT_ID
25
+ # data.column_warnings: text columns of numbers/dates (with the convert-type fix) and blanks;
26
+ # plan step 3 from them
25
27
 
26
28
  # 3. clean orders (each call waits for its job; read back after each value change)
27
29
  mammoth view transform discard-duplicates ORDERS_VIEW --project PROJECT_ID \
@@ -43,9 +45,10 @@ mammoth view get ORDERS_VIEW ORDERS_DS --project PROJECT_ID # row_count before
43
45
  # 5. join, then check the match rate before building on it
44
46
  mammoth view transform join ORDERS_VIEW --project PROJECT_ID \
45
47
  --input '{"dataset_id": ORDERS_DS, "foreign_view": CUSTOMERS_VIEW, "foreign_dataset_id": CUSTOMERS_DS, "join_type": "LEFT", "on": [{"left": "customer_id", "right": "customer_id"}], "select": ["region"]}'
46
- mammoth view data get ORDERS_VIEW ORDERS_DS --project PROJECT_ID
47
- # if region is empty/"Unknown" on most rows, the key does not match: compare the two key columns' values
48
+ # data.join_check: rows_before/rows_after, match_rate, unmatched_rows, unmatched_keys; report them
49
+ # if many rows are unmatched, the key does not match: compare the two key columns' values
48
50
  # (type, padding, case) with view data get on both views; do not summarise unmatched data
51
+ # rows_after > rows_before: a key repeats in the other view (use lookup for one value per key)
49
52
 
50
53
  # 6. deliverable first: export the cleaned, joined rows before any step that replaces them
51
54
  mammoth view export csv ORDERS_VIEW --project PROJECT_ID \
@@ -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
@@ -73,6 +74,44 @@ mammoth schema get view.transform.join
73
74
  mammoth view transform join VIEW_ID --project PROJECT_ID --input INPUT_JSON
74
75
  ```
75
76
 
77
+ ## What most pipelines look like
78
+
79
+ These patterns come from how Mammoth pipelines are usually built. Use them
80
+ as defaults, and let the user's request override them:
81
+
82
+ - Keep it short. Most pipelines have one to three steps and touch a few
83
+ columns. Add only the steps the deliverable needs.
84
+ - New column or overwrite? `set-values`, `math` and `lookup` take
85
+ `new_column` (add a column) or `existing_column` (replace the values in
86
+ place), never both. Overwriting is as common as adding. If the user said
87
+ "fix", "clean" or "change" a column, use `existing_column`. If they said
88
+ "add", "calculate" or "flag", use `new_column`. If it is not clear, ask.
89
+ - Joins are nearly always `LEFT` on one key column. Use `INNER`, `RIGHT`,
90
+ `OUTER` or a key of two or more columns only when the user asks for it or
91
+ the data needs it, and say why in your report.
92
+ - Check the key before a join or lookup. Most keys go in without a prep
93
+ step, so a type, case or padding difference shows up as unmatched rows. Read
94
+ both key columns first (`view data get`) and act on `join_check`.
95
+ - Date steps (`increment-date`, `extract-date`, and `text` on date columns)
96
+ fail more often than other steps. Before a date step, confirm that the
97
+ column type is `DATE` (`view get`); if it is `TEXT`, run `convert-type`
98
+ first. Check the result on a few rows.
99
+ - Convert several columns to the same type in one `convert-type` call (one
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).
104
+ - Remove duplicates near the end, after the cleanup and joins, so the check
105
+ uses the final columns.
106
+ - `filter` also takes a plain-language `prompt` instead of a `condition`.
107
+ Use a `condition` when the rule is exact (a column, an operator, a value).
108
+ Use `prompt` only when the user described the rule in words and no exact
109
+ condition expresses it, then check the kept rows.
110
+ - "Top N" means the largest values first. Use the smallest values first only
111
+ when the user says "bottom", "lowest" or "smallest".
112
+ - The last step of a pipeline is not a signal that it is finished. Say that
113
+ the work is done only after you verify the deliverable.
114
+
76
115
  ## Aggregate or summarise
77
116
 
78
117
  For a grouped summary (totals per region, counts per status) use the typed
@@ -9,11 +9,13 @@ or secrets in an argument, prompt, transcript, or checkpoint.
9
9
  from PyPI into a fresh environment and verify it:
10
10
 
11
11
  ```bash
12
- python3 -m venv .mammoth && .mammoth/bin/python -m pip install --upgrade mammoth-cli
12
+ python3 -m venv .mammoth && .mammoth/bin/python -m pip install --no-cache-dir --upgrade mammoth-cli
13
13
  .mammoth/bin/mammoth --version # or: uv tool install mammoth-cli
14
14
  ```
15
15
 
16
- Pin `mammoth-cli==X.Y.Z` when the task names an approved release. Use the
16
+ Pin `mammoth-cli==X.Y.Z` when the task names an approved release, and
17
+ check that `mammoth --version` prints it (a pip cache can serve an older
18
+ release for a few minutes after a new one is published). Use the
17
19
  host installer script (`installers/mammoth-install.sh` in the repository)
18
20
  only when the operator names it; do not pipe a remote script to a shell on
19
21
  your own initiative. The SDK (`mammoth-io`) comes with the CLI. If a later
@@ -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": (