mammoth-cli 2.2.11__tar.gz → 2.2.13__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 (254) hide show
  1. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/PKG-INFO +2 -2
  2. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +4 -4
  4. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +2 -2
  5. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +9 -5
  6. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +1 -1
  7. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/schedule.py +12 -8
  8. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/schema.py +22 -3
  9. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/view.py +50 -12
  10. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/dryrun_targets.py +84 -1
  11. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/command_contract.py +3 -0
  12. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/data_quality.py +7 -9
  13. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/input_fields.py +3 -0
  14. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/listing.py +7 -3
  15. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/pyproject.toml +2 -2
  16. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/schedule.yaml +1 -1
  17. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/view.yaml +3 -3
  18. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/.gitignore +0 -0
  19. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/LICENSE +0 -0
  20. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/README.md +0 -0
  21. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/__main__.py +0 -0
  22. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/app.py +0 -0
  23. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +0 -0
  24. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
  25. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  26. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
  27. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
  28. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
  29. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  30. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  31. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  32. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  33. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  34. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  35. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  36. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  37. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  38. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  39. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
  40. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  41. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  42. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  43. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  44. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  45. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  46. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
  47. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +0 -0
  48. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-template.md +0 -0
  49. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
  50. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  51. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  52. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  53. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  54. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  55. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  56. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  57. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/link.md +0 -0
  58. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  59. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  60. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  61. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
  62. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  63. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  64. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  65. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  66. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  67. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  68. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  69. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  70. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  71. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  72. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  73. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
  74. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  75. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  76. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  77. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  78. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
  79. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  80. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  81. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  82. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  83. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  84. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
  85. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/database-import.md +0 -0
  86. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  87. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  88. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  89. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  90. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
  91. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  92. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  93. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  94. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  95. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
  96. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/__init__.py +0 -0
  97. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/activity.py +0 -0
  98. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/addon.py +0 -0
  99. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/agent.py +0 -0
  100. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/ai.py +0 -0
  101. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/annotation.py +0 -0
  102. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/auth.py +0 -0
  103. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/automation.py +0 -0
  104. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/batch.py +0 -0
  105. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/billing.py +0 -0
  106. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/browse.py +0 -0
  107. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/calc.py +0 -0
  108. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/capability.py +0 -0
  109. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/client_app.py +0 -0
  110. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/completion.py +0 -0
  111. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/config.py +0 -0
  112. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/connector.py +0 -0
  113. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/context.py +0 -0
  114. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/dashboard.py +0 -0
  115. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/data_app.py +0 -0
  116. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/dataset.py +0 -0
  117. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/doctor.py +0 -0
  118. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/external_key.py +0 -0
  119. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/file.py +0 -0
  120. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/folder.py +0 -0
  121. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/job.py +0 -0
  122. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/link.py +0 -0
  123. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/notification.py +0 -0
  124. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/parameter.py +0 -0
  125. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/project.py +0 -0
  126. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/registry.py +0 -0
  127. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/report.py +0 -0
  128. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/skill.py +0 -0
  129. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/snippet.py +0 -0
  130. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/support.py +0 -0
  131. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/template.py +0 -0
  132. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/trash.py +0 -0
  133. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/upgrade.py +0 -0
  134. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/user.py +0 -0
  135. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/view_ops.py +0 -0
  136. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/view_profile.py +0 -0
  137. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/webhook.py +0 -0
  138. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/workflow.py +0 -0
  139. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/commands/workspace.py +0 -0
  140. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/context/__init__.py +0 -0
  141. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/context/credentials.py +0 -0
  142. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/context/endpoint.py +0 -0
  143. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/context/profiles.py +0 -0
  144. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/context/resolver.py +0 -0
  145. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/contracts/__init__.py +0 -0
  146. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/contracts/auth.py +0 -0
  147. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/embed.py +0 -0
  148. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/errors/__init__.py +0 -0
  149. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/errors/envelope.py +0 -0
  150. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/manifest/__init__.py +0 -0
  151. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/manifest/loader.py +0 -0
  152. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/messages/__init__.py +0 -0
  153. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/output/__init__.py +0 -0
  154. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/output/envelope.py +0 -0
  155. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/output/normalize.py +0 -0
  156. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/output/policy.py +0 -0
  157. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/output/progress.py +0 -0
  158. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/output/render.py +0 -0
  159. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/py.typed +0 -0
  160. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/__init__.py +0 -0
  161. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/confirm.py +0 -0
  162. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/dataset_health.py +0 -0
  163. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/dryrun.py +0 -0
  164. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/embedded.py +0 -0
  165. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/executor.py +0 -0
  166. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/input_loader.py +0 -0
  167. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/intent_only.py +0 -0
  168. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/invocation.py +0 -0
  169. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/new_data.py +0 -0
  170. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/options.py +0 -0
  171. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/parents.py +0 -0
  172. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/runlog.py +0 -0
  173. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/session.py +0 -0
  174. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/state.py +0 -0
  175. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/strict.py +0 -0
  176. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/updates.py +0 -0
  177. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/validate.py +0 -0
  178. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/runtime/verify.py +0 -0
  179. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/__init__.py +0 -0
  180. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/argspec.py +0 -0
  181. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/board_values.py +0 -0
  182. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/coerce.py +0 -0
  183. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/conditions.py +0 -0
  184. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/dashboard_filters.py +0 -0
  185. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/dashboard_pages.py +0 -0
  186. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/dashboard_review.py +0 -0
  187. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/data_profile.py +0 -0
  188. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/dispatch.py +0 -0
  189. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/factory.py +0 -0
  190. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/mapping.py +0 -0
  191. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/openapi_types.py +0 -0
  192. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/positionals.py +0 -0
  193. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/protocol.py +0 -0
  194. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/read_queries.py +0 -0
  195. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/sdk_service.py +0 -0
  196. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/stored_stats.py +0 -0
  197. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/testing.py +0 -0
  198. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/text_dates.py +0 -0
  199. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/type_system.py +0 -0
  200. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/services/write_impact.py +0 -0
  201. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/skills/__init__.py +0 -0
  202. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/skills/installer.py +0 -0
  203. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/skills/steering.py +0 -0
  204. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/mammoth_cli/testing.py +0 -0
  205. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/activity.yaml +0 -0
  206. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/addon.yaml +0 -0
  207. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/agent.yaml +0 -0
  208. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/ai.yaml +0 -0
  209. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/annotation.yaml +0 -0
  210. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/auth.yaml +0 -0
  211. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/automation.yaml +0 -0
  212. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/batch.yaml +0 -0
  213. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/billing.yaml +0 -0
  214. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/browse.yaml +0 -0
  215. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/calc.yaml +0 -0
  216. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/capability.yaml +0 -0
  217. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/client-app.yaml +0 -0
  218. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/completion.yaml +0 -0
  219. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/config.yaml +0 -0
  220. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/connector.yaml +0 -0
  221. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/context.yaml +0 -0
  222. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/dashboard.yaml +0 -0
  223. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/data-app.yaml +0 -0
  224. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/dataset.yaml +0 -0
  225. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/doctor.yaml +0 -0
  226. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/external-key.yaml +0 -0
  227. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/file.yaml +0 -0
  228. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/folder.yaml +0 -0
  229. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/job.yaml +0 -0
  230. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/link.yaml +0 -0
  231. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/log.yaml +0 -0
  232. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/notification.yaml +0 -0
  233. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/parameter.yaml +0 -0
  234. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/project.yaml +0 -0
  235. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/report.yaml +0 -0
  236. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/schema.yaml +0 -0
  237. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/skill.yaml +0 -0
  238. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/snippet.yaml +0 -0
  239. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/support.yaml +0 -0
  240. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/template.yaml +0 -0
  241. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/trash.yaml +0 -0
  242. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/upgrade.yaml +0 -0
  243. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/user.yaml +0 -0
  244. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/version.yaml +0 -0
  245. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/webhook.yaml +0 -0
  246. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/workflow.yaml +0 -0
  247. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/commands/workspace.yaml +0 -0
  248. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/edits-target.source.yaml +0 -0
  249. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/openapi-operations.yaml +0 -0
  250. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/schema-v1.json +0 -0
  251. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/sdk-catalog.source.yaml +0 -0
  252. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/manifests/sdk-methods.yaml +0 -0
  253. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/openapi/metadata.json +0 -0
  254. {mammoth_cli-2.2.11 → mammoth_cli-2.2.13}/spec/openapi/openapi.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mammoth-cli
3
- Version: 2.2.11
3
+ Version: 2.2.13
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.9,>=0.8.12
20
+ Requires-Dist: mammoth-io<0.9,>=0.8.13
21
21
  Requires-Dist: platformdirs<5,>=4.10
22
22
  Requires-Dist: pydantic<3,>=2.12.5
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.2.11"
9
+ __version__ = "2.2.13"
10
10
 
11
11
  # The versioned machine output envelope contract.
12
12
  SCHEMA_VERSION = 1
@@ -160,7 +160,7 @@ Example: `mammoth view create 123`. Placeholders are illustrative; resolve IDs a
160
160
 
161
161
  Result: `ViewCreateResult`; mutation `benign_mutation`, confirmation `none`, wait policy `always_wait`.
162
162
 
163
- Status on release: ran once on CLI 2.0.18 — golden-data check 2026-09-19 (CLI 2.0.18): plain create on an owned dataset returned the new view's record (id, dataset_id; earlier releases printed '<unserializable View>'), and discard-duplicates then ran on it. clone_from is not usable on release: the clon…
163
+ Status on release: ran once on CLI 2.0.18 — golden-data check 2026-09-19 (CLI 2.0.18): plain create on an owned dataset returned the new view's record (id, dataset_id; earlier releases printed '<unserializable View>'), and discard-duplicates then ran on it. clone_from works on a backend with mvc e56f23…
164
164
 
165
165
  ### `view.data-check.create`
166
166
 
@@ -878,11 +878,11 @@ Status on release: ran once on CLI 2.0.14 — write sweep 2026-09-18: exit 0 on
878
878
 
879
879
  Run: `mammoth view update`. Exact input fields: `mammoth schema get view.update`.
880
880
 
881
- Example: `mammoth view update 123 123 --input '{"patch_data": [{"sample_key": "Status"}]}'`. Discovery only: this command is fail-closed and must not dispatch a request.
881
+ Example: `mammoth view update 123 123 --input '{"name": "Revenue report"}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
882
882
 
883
- Execution is unavailable for the current contract and returns `unsupported_contract`. Do not infer request fields or retry it; use only a separately typed alternative.
883
+ Result: `ViewUpdateResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
884
884
 
885
- Known restriction: BLOCKED[B09 DATAVIEW_INPUT_UNTYPED]: patch_data is an arbitrary dictionary; reserved, not registered.
885
+ Status on release: untried; no live run recorded.
886
886
 
887
887
  ### `view.version.apply`
888
888
 
@@ -56,8 +56,8 @@ mammoth view export csv ORDERS_VIEW --project PROJECT_ID \
56
56
  # check the file's header and row count against the last readback
57
57
 
58
58
  # 7. per-region summary as the LAST step on the same view (pivot replaces the view's columns in place;
59
- # do not use view create with clone_from for this: on release the clone job succeeds but the copy
60
- # answers every read with 4DTVW019 and its copied tasks never execute)
59
+ # to keep the uncollapsed view as well, copy it first with view create DATASET_ID --input '{"clone_from": VIEW_ID}'
60
+ # (same dataset only; the copy keeps the source's steps) and pivot the copy instead)
61
61
  mammoth view transform pivot ORDERS_VIEW --project PROJECT_ID \
62
62
  --input '{"dataset_id": ORDERS_DS, "group_by": ["region"], "aggregations": [{"column": "amount", "function": "SUM", "as_name": "total_amount"}, {"column": "order_id", "function": "COUNT", "as_name": "order_count"}]}'
63
63
  mammoth view data get ORDERS_VIEW ORDERS_DS --project PROJECT_ID
@@ -151,11 +151,15 @@ display name) with display-name columns; unquoted or placeholder table names
151
151
  select queries allowed". The result replaces the view's columns: never run it
152
152
  (or `pivot`) on a view whose rows are still needed; export those rows first
153
153
  (`view export csv`) and run the summary as the last step, and prefer `pivot`
154
- (proven on release) over a SQL task. Do not build the summary on a
155
- `view create ... "clone_from": VIEW_ID` copy: on release the clone job succeeds
156
- but the copy answers every read with `4DTVW019` and its copied tasks never
157
- execute. A plain `view create DATASET_ID` (no `clone_from`) gives a fresh view
158
- of the raw upload, without the pipeline:
154
+ (proven on release) over a SQL task. To keep the view's rows and still
155
+ summarise, copy it first with `view create DATASET_ID --input
156
+ '{"clone_from": VIEW_ID}'` (same dataset only) and run the summary on the
157
+ copy: the copy keeps the source's steps and runs them (koyal, 2026-10-02: the
158
+ cloned steps executed and the copy took a further filter). Only a backend
159
+ older than 2026-09-26 left the copy's tasks unrun, answering reads with
160
+ `4DTVW019`; see recovery.md. A plain `view create DATASET_ID` (no
161
+ `clone_from`) is not a copy: it gives a fresh view of the raw upload, without
162
+ the pipeline:
159
163
 
160
164
  A task must fit the column's type: `replace-values`, `bulk-replace` and the
161
165
  text operations take TEXT columns, `math` takes NUMERIC. Check `type` in the
@@ -30,7 +30,7 @@ these commands are not blanket permission to replay a mutation.
30
30
  | `resource_not_found` (exit 5) after `view get VIEW_ID` / `view data get VIEW_ID` without a parent | discovery could not find the view in the selected project | pass `--project PROJECT_ID` and the `DATASET_ID` positional from `view list` |
31
31
  | `{"data": "<unserializable View>"}` from `view get VIEW_ID` | CLI ≤ 2.0.17 only; fixed in 2.0.18 | upgrade, or rerun as `view get VIEW_ID DATASET_ID` |
32
32
  | `pipeline_reference_error` (exit 1) from a transform or `view task add`, `details.reference_errors[].reason` `type mismatch` / `not available` | the backend stored the task but cannot bind it to that column (find/replace and text operations take TEXT columns, math takes NUMERIC); the view is in `ref_error` and every read of it fails with `4DTVW019` until the task goes | run the printed `view task delete VIEW_ID TASK_ID --yes`, then convert-type the column or pick a transform for its type; CLI ≤ 2.0.24 reported this as success with `has_error: true` |
33
- | `4DTVW019 INVALID_RESPONSE_GENERATED` on every read of a view made with `view create ... "clone_from"` | backend: the clone is never processed (tasks stay `added`) | delete the copy; export the source view's rows, then run the summary in place as the last step; see recipes/end-to-end.md |
33
+ | `4DTVW019 INVALID_RESPONSE_GENERATED` on every read of a view made with `view create ... "clone_from"` | only a backend older than mvc `e56f2338b6` (2026-09-26) leaves the clone's copied tasks `added`, never run; on a current backend a same-dataset clone runs its copied tasks and reads normally (koyal view 4429: both tasks `executed`), so any other cause is the `ref_error` row above | `view task list VIEW_ID DATASET_ID`: tasks stuck at `added` mean an old backend, so delete the copy and rebuild the steps on a plain view; a task in `ref_error` means delete that task. A copy of a view should still be made with `clone_from` (same dataset only), which keeps the source's steps; see recipes/end-to-end.md |
34
34
  | `needs_view` in `file upload` result, or `status: ready` with `status_info.ready` "more than one plausible way to be read" and `view list` empty | all-text CSV: the platform ingests the rows but creates no view | run the `next_command` (`view create DATASET_ID`) once, then `view list DATASET_ID`; see recipes/need-action.md |
35
35
  | `need_action` in `file upload` result | the platform needs a parsing decision (e.g. ambiguous dates) | run the `next_command` it returns (`dataset file-settings get ID`), then `dataset file-settings update ID`; see recipes/need-action.md |
36
36
  | `confirmation_required` (exit 2) | destructive/high-impact command without `--yes` (and `--confirm TARGET` when policy is confirm_target) | re-run with the flag after you have read the target back by id |
@@ -22,6 +22,7 @@ from mammoth_cli.errors.envelope import (
22
22
  CODE_SDK_SYMBOL_UNRESOLVED,
23
23
  EXIT_USAGE,
24
24
  CliError,
25
+ not_available_error,
25
26
  )
26
27
  from mammoth_cli.manifest.loader import command_by_id
27
28
  from mammoth_cli.runtime.confirm import (
@@ -154,14 +155,17 @@ def _meta(invocation: Invocation, workspace_id: int, project_id: int) -> dict[st
154
155
 
155
156
 
156
157
  def schedule_list(invocation: Invocation) -> HandlerResult:
157
- """List schedules in the active project. ``limit``/``offset`` are optional."""
158
- project_id = require_project(invocation)
159
- document = _bound_document(invocation)
160
- kwargs: dict[str, Any] = {"project_id": project_id}
161
- _forward_optional(document, kwargs, ("limit", "offset"))
162
- with open_service(invocation) as (service, auth):
163
- data = service.call(_symbol(invocation), **kwargs)
164
- return data, _meta(invocation, auth.workspace_id, project_id)
158
+ """Retired: the server does not implement listing a project's schedules.
159
+
160
+ ``GET /workspaces/{id}/projects/{id}/schedules`` always answers ``5GENR011
161
+ NOT_IMPLEMENTED`` (the server raises it on purpose). The command stays so a
162
+ caller gets a clear answer instead of a bare backend error.
163
+ """
164
+ raise not_available_error(
165
+ "schedule list",
166
+ web_path="the web app, which opens a schedule from the dataset or automation that owns it",
167
+ instead="`schedule get SCHEDULE_ID` reads one schedule by an id you already have.",
168
+ )
165
169
 
166
170
 
167
171
  def schedule_get(invocation: Invocation) -> HandlerResult:
@@ -74,6 +74,7 @@ _GROUP_DISCOVERY_PURPOSES = {
74
74
  }
75
75
 
76
76
  _COMMAND_DISCOVERY_PURPOSES = {
77
+ "view.update": "rename change name to a new name title relabel",
77
78
  "file.upload": (
78
79
  "upload import CSV spreadsheet XLSX source data append add rows union stack "
79
80
  "a file into an existing dataset excel workbook tabs sheets drop in"
@@ -305,7 +306,7 @@ _COMMAND_DISCOVERY_PURPOSES = {
305
306
  "view.data.explore": (
306
307
  "explore trend trends trending over time per day week month quarter year by date "
307
308
  "distribution spread histogram top most common frequent values breakdown share "
308
- "percentage profile"
309
+ "percentage profile period year quarter month date range coverage figure"
309
310
  ),
310
311
  # "Give the West team their own copy they can change" / "duplicate this
311
312
  # dataset as an independent copy" / "clone it without changing the
@@ -323,7 +324,10 @@ _COMMAND_DISCOVERY_PURPOSES = {
323
324
  # value -- and neither can be dropped as a data word anyway, since
324
325
  # view.data.explore's own purpose text already uses both for its trend
325
326
  # feature.
326
- "view.data.aggregate": "group and sum totals by month week without changing the pipeline",
327
+ "view.data.aggregate": (
328
+ "group and sum totals by month week without changing the pipeline "
329
+ "sum total figure answer a question, read only"
330
+ ),
327
331
  # Goals stated as "what is in this data" / "why do customers churn": one
328
332
  # whole-view profile answers both, so the phrasing must reach it.
329
333
  "view.data.profile": (
@@ -1740,6 +1744,21 @@ def _inline_call_detail(entries: list[dict[str, Any]]) -> None:
1740
1744
  entry["agent_example"] = record["agent_example"]
1741
1745
 
1742
1746
 
1747
+ def _inline_picks(page: list[dict[str, Any]], offset: int) -> list[dict[str, Any]]:
1748
+ """The entries to inline: the top ones, plus read commands ranked below a write.
1749
+
1750
+ A read that answers the question is worth its fields even when a write such as
1751
+ ``view.transform.pivot`` outranks it; otherwise the caller needs a ``schema get``.
1752
+ """
1753
+ head = page[: max(0, _INLINE_DETAIL_COUNT - offset)]
1754
+ reads = [
1755
+ entry
1756
+ for entry in page[len(head) :]
1757
+ if (command_by_id(entry["command_id"]) or {}).get("mutation_class") == "read"
1758
+ ]
1759
+ return head + reads[:_INLINE_DETAIL_COUNT]
1760
+
1761
+
1743
1762
  #: How to drill down from a find: a family's full command list, or every family.
1744
1763
  _BROWSE_NEXT = (
1745
1764
  "mammoth schema list FAMILY lists every command in a family; mammoth schema list "
@@ -1902,7 +1921,7 @@ def find_schemas(
1902
1921
  )
1903
1922
  total_matches = len(ranked_matches)
1904
1923
  page = [match for _, match in ranked_matches[offset : offset + bounded_limit]]
1905
- _inline_call_detail(page[: max(0, _INLINE_DETAIL_COUNT - offset)])
1924
+ _inline_call_detail(_inline_picks(page, offset))
1906
1925
  has_more = offset + len(page) < total_matches
1907
1926
  continuation = (
1908
1927
  {
@@ -899,19 +899,45 @@ def view_impact(invocation: Invocation) -> HandlerResult:
899
899
 
900
900
 
901
901
  def view_update(invocation: Invocation) -> HandlerResult:
902
- """Reject free-form dataview patches until the API supplies typed variants."""
903
- raise CliError(
902
+ """Rename a view from the name input field; any other patch is refused.
903
+
904
+ The dataview patch route leaves op, path and value unconstrained, so the only
905
+ typed change offered is the rename (``replace`` on ``name``).
906
+ """
907
+ project_id = require_project(invocation)
908
+ dataview_id = _require_int_positional_at(invocation, 0, "view id")
909
+ document = invocation.load_input() or {}
910
+ name = document.get("name")
911
+ # ``dataview_id`` is the VIEW_ID positional, bound into the document by the contract.
912
+ allowed = {"name", _DATASET_ID_FIELD, "dataview_id"}
913
+ if set(document) - allowed or not isinstance(name, str) or not name.strip():
914
+ raise _untyped_patch_error(invocation)
915
+ with open_service(invocation) as (service, auth):
916
+ dataset_id = _resolve_dataset_id(service, invocation, dataview_id, document)
917
+ data = service.call(
918
+ _symbol(invocation),
919
+ dataset_id=dataset_id,
920
+ dataview_id=dataview_id,
921
+ patch_data=[{"op": "replace", "path": "name", "value": name.strip()}],
922
+ project_id=project_id,
923
+ )
924
+ return data, _meta(invocation, auth.workspace_id, project_id)
925
+
926
+
927
+ def _untyped_patch_error(invocation: Invocation) -> CliError:
928
+ """The refusal for a view patch that is not the typed rename."""
929
+ return CliError(
904
930
  code=CODE_UNSUPPORTED_CONTRACT,
905
931
  message="Raw dataview patch operations are not available through the CLI.",
906
932
  exit_status=EXIT_USAGE,
907
933
  hint=(
908
- "The OpenAPI operation leaves op, path, and value unconstrained. "
909
- "Use a separately typed view command when its schema covers the intended change."
934
+ "The OpenAPI operation leaves op, path, and value unconstrained. The typed "
935
+ 'change is the rename: view update VIEW_ID --input \'{"name": "New name"}\'.'
910
936
  ),
911
937
  details={
912
938
  "command_id": invocation.command_id,
913
939
  "blocker": "B09 DATAVIEW_INPUT_UNTYPED",
914
- "typed_alternatives": [],
940
+ "typed_alternatives": ['view update VIEW_ID --input \'{"name": "New name"}\''],
915
941
  },
916
942
  recovery_commands=[
917
943
  "mammoth schema find view",
@@ -1288,17 +1314,19 @@ def _relabel_and_check(
1288
1314
  ) -> Any:
1289
1315
  """Relabel a data page to display names and add ``column_warnings`` and ``duplicates``.
1290
1316
 
1317
+ Only read-only data reads call this, so a dates-as-text finding carries no convert fix.
1318
+
1291
1319
  The metadata read happens only when the page has rows and the caller has
1292
1320
  not read it already (one read serves both the names and the types).
1293
1321
  """
1294
1322
  rows = data.get(_ROWS_KEY) if isinstance(data, dict) else None
1295
1323
  if not isinstance(rows, list) or not rows:
1296
1324
  data = _relabel_columns(service, dataset_id, view_id, project_id, data, mapping)
1297
- return _with_column_warnings(data, types or {}, view_id, dataset_id)
1325
+ return _with_column_warnings(data, types or {}, view_id, dataset_id, read_only=True)
1298
1326
  if mapping is None or types is None:
1299
1327
  mapping, types = _column_profile(service, dataset_id, view_id, project_id)
1300
1328
  data = _relabel_columns(service, dataset_id, view_id, project_id, data, mapping)
1301
- data = _with_column_warnings(data, types, view_id, dataset_id)
1329
+ data = _with_column_warnings(data, types, view_id, dataset_id, read_only=True)
1302
1330
  return _with_duplicates_fact(data, view_id, dataset_id, whole_view)
1303
1331
 
1304
1332
 
@@ -1322,7 +1350,11 @@ COLUMN_CHECK_ISSUES = (
1322
1350
 
1323
1351
 
1324
1352
  def _with_column_warnings(
1325
- data: Any, types: dict[str, str], view_id: int, dataset_id: int | None = None
1353
+ data: Any,
1354
+ types: dict[str, str],
1355
+ view_id: int,
1356
+ dataset_id: int | None = None,
1357
+ read_only: bool = False,
1326
1358
  ) -> Any:
1327
1359
  """Add ``column_checks`` (always) and ``column_warnings`` (when found).
1328
1360
 
@@ -1332,13 +1364,19 @@ def _with_column_warnings(
1332
1364
  """
1333
1365
  if not isinstance(data, dict) or not isinstance(data.get(_ROWS_KEY, []), list):
1334
1366
  return data
1335
- checks, warnings = _check_columns(data.get(_ROWS_KEY) or [], types, view_id, dataset_id)
1367
+ checks, warnings = _check_columns(
1368
+ data.get(_ROWS_KEY) or [], types, view_id, dataset_id, read_only
1369
+ )
1336
1370
  out = {**data, "column_checks": checks}
1337
1371
  return {**out, "column_warnings": warnings} if warnings else out
1338
1372
 
1339
1373
 
1340
1374
  def _check_columns(
1341
- rows: list[Any], types: dict[str, str], view_id: int, dataset_id: int | None
1375
+ rows: list[Any],
1376
+ types: dict[str, str],
1377
+ view_id: int,
1378
+ dataset_id: int | None,
1379
+ read_only: bool = False,
1342
1380
  ) -> tuple[dict[str, Any], list[dict[str, Any]]]:
1343
1381
  """Run ``column_warnings`` and describe what was checked (never raises)."""
1344
1382
  checks: dict[str, Any] = {
@@ -1350,7 +1388,7 @@ def _check_columns(
1350
1388
  warnings: list[dict[str, Any]] = []
1351
1389
  if rows and types:
1352
1390
  try:
1353
- warnings = column_warnings(rows, types, view_id, dataset_id)
1391
+ warnings = column_warnings(rows, types, view_id, dataset_id, read_only)
1354
1392
  except Exception as exc: # noqa: BLE001 -- a presentation aid must not fail the read
1355
1393
  checks["checked"] = []
1356
1394
  checks["error"] = f"{type(exc).__name__}: {exc}"
@@ -1728,7 +1766,7 @@ def _run_aggregate_for_compare(
1728
1766
  ) -> tuple[list[dict[str, Any]], dict[str, Any]]:
1729
1767
  """Run ``view data aggregate``'s own handler against one view, for compare."""
1730
1768
  sub_invocation = dataclasses.replace(
1731
- invocation, command_id="view.data.aggregate", extra_args=[str(view_id)]
1769
+ invocation, command_id="view.data.aggregate", extra_args=[str(view_id)], positionals={}
1732
1770
  )
1733
1771
  data, meta = view_data_aggregate(sub_invocation)
1734
1772
  rows = data.get(_ROWS_KEY, [])
@@ -192,6 +192,17 @@ SUBS: dict[str, tuple[Sub, ...]] = {
192
192
  "view.draft.discard": (
193
193
  Sub("draft", "view_id", "view", "view_id", name_fmt="{parent} › unsaved draft changes"),
194
194
  ),
195
+ "agent.action.delete": (
196
+ Sub(
197
+ "agent action",
198
+ "action_id",
199
+ source="agent.action.list",
200
+ container="actions",
201
+ forward=("session_id",),
202
+ label_paths=("name", "kind"),
203
+ name_fmt="what agent action {action_id} made: {label}",
204
+ ),
205
+ ),
195
206
  "agent.session.delete": (
196
207
  Sub(
197
208
  "agent session",
@@ -251,6 +262,34 @@ SUBS: dict[str, tuple[Sub, ...]] = {
251
262
  label_paths=("title", "name", "label"),
252
263
  ),
253
264
  ),
265
+ "dashboard.template.thumbnail.clear": (
266
+ Sub(
267
+ "dashboard template picture",
268
+ "template_id",
269
+ source="dashboard.template.get",
270
+ label_paths=("title", "name", "label"),
271
+ name_fmt="picture of dashboard template {label}",
272
+ ),
273
+ ),
274
+ "support.template.discard": (
275
+ Sub(
276
+ "curated template",
277
+ "slug",
278
+ source="support.template.list",
279
+ container="templates",
280
+ id_field="slug",
281
+ label_paths=("title", "slug"),
282
+ ),
283
+ ),
284
+ "workflow.cleanup": (
285
+ Sub(
286
+ "ghost workflows",
287
+ "project_id",
288
+ "project",
289
+ "project_id",
290
+ name_fmt="ghost (orphaned skeleton) workflows in {parent}",
291
+ ),
292
+ ),
254
293
  "template.delete": (
255
294
  Sub("template", "template_id", source="template.get", label_paths=("name", "title")),
256
295
  ),
@@ -328,6 +367,7 @@ COMMAND_TARGETS: dict[str, tuple[str, str]] = {
328
367
  "dataset.delete": ("dataset", "dataset_id"),
329
368
  "dataset.bulk-delete": ("dataset", "dataset_ids"),
330
369
  "dataset.file-settings.undo": ("dataset", "dataset_id"),
370
+ "dataset.broken-rows.resolve": ("dataset", "dataset_id"),
331
371
  "view.delete": ("view", "view_id"),
332
372
  "view.bulk-delete": ("view", "dataview_ids"),
333
373
  "batch.delete": ("batch", "batch_id"),
@@ -352,6 +392,10 @@ COMMAND_TARGETS: dict[str, tuple[str, str]] = {
352
392
  }
353
393
 
354
394
 
395
+ #: Commands that make a new resource and change no existing one: nothing to name.
396
+ CREATES_ONLY: frozenset[str] = frozenset({"dataset.create", "dataset.create-from-pdf"})
397
+
398
+
355
399
  def unresolvable_error(command_id: str, reason: str) -> CliError:
356
400
  """The fail-loud error for a command whose targets cannot be named."""
357
401
  return CliError(
@@ -496,6 +540,16 @@ def _unresolved_name(kind: str, target_id: object, symbol: str, key: str) -> Cli
496
540
  )
497
541
 
498
542
 
543
+ def _container_items(listed: Any, container: str) -> list[Any]:
544
+ """The items of a list read: a bare list, a mapping, or a typed SDK model."""
545
+ if isinstance(listed, list):
546
+ return listed
547
+ held = (
548
+ listed.get(container) if isinstance(listed, Mapping) else getattr(listed, container, None)
549
+ )
550
+ return held if isinstance(held, list) else []
551
+
552
+
499
553
  def _sub_record(
500
554
  service: MammothService,
501
555
  sub: Sub,
@@ -516,7 +570,7 @@ def _sub_record(
516
570
  if symbol not in lists:
517
571
  lists[symbol] = service.call(symbol, **kwargs)
518
572
  listed = lists[symbol]
519
- items = listed if isinstance(listed, list) else (listed or {}).get(sub.container, [])
573
+ items = _container_items(listed, sub.container)
520
574
  found = next((i for i in items if str(_path(i, sub.id_field)) == str(target)), None)
521
575
  if found is None:
522
576
  raise _unresolved_name(sub.kind, target, symbol, sub.id_field)
@@ -568,6 +622,8 @@ def _target_spec(command_id: str, would_call: Mapping[str, Any]) -> tuple[str, s
568
622
  """
569
623
  if command_id in COMMAND_TARGETS:
570
624
  return COMMAND_TARGETS[command_id]
625
+ if command_id in CREATES_ONLY:
626
+ return None
571
627
  record = command_by_id(command_id) or {}
572
628
  if record.get("mutation_class") == "destructive":
573
629
  raise unresolvable_error(command_id, "no read command names this command's targets")
@@ -589,6 +645,31 @@ def _remove_batch_invites(
589
645
  return _sub_targets(service, command_id, _INVITE_SUB, {"invite_ids": invite_ids})
590
646
 
591
647
 
648
+ def _patched_dataset_ids(patch_data: Any) -> list[int]:
649
+ """The dataset ids a bulk patch renames: the keys of each operation's ``value``."""
650
+ operations = patch_data if isinstance(patch_data, list) else [patch_data]
651
+ found: list[int] = []
652
+ for operation in operations:
653
+ value = operation.get("value") if isinstance(operation, Mapping) else None
654
+ if isinstance(value, Mapping):
655
+ found.extend(int(key) for key in value if str(key).isdigit())
656
+ return list(dict.fromkeys(found))
657
+
658
+
659
+ def _bulk_update_targets(
660
+ service: MammothService, command_id: str, arguments: Mapping[str, Any]
661
+ ) -> list[dict[str, Any]]:
662
+ """Name the datasets a ``dataset bulk-update`` patch changes, from its own ``patch_data``."""
663
+ ids = _patched_dataset_ids(arguments.get("patch_data"))
664
+ if not ids:
665
+ raise unresolvable_error(
666
+ command_id,
667
+ "'patch_data' names no dataset; pass "
668
+ '{"op": "replace", "path": "name", "value": {"<dataset_id>": "<new name>"}}',
669
+ )
670
+ return _read_names(service, "dataset", ids, arguments)
671
+
672
+
592
673
  def resolve_targets(
593
674
  service: MammothService, command_id: str, would_call: Mapping[str, Any]
594
675
  ) -> list[dict[str, Any]]:
@@ -611,6 +692,8 @@ def resolve_targets(
611
692
  arguments = would_call.get("arguments") or {}
612
693
  if command_id == "user.avatar.delete":
613
694
  return _avatar_target(service)
695
+ if command_id == "dataset.bulk-update":
696
+ return _bulk_update_targets(service, command_id, arguments)
614
697
  if command_id in SUBS:
615
698
  scope = {k: v for k, v in would_call.items() if k in ("view_id", "dataset_id")}
616
699
  merged = {**scope, **arguments}
@@ -697,6 +697,9 @@ _S7_ADDITIONAL_INPUT_FIELDS: dict[str, tuple[FieldSpec, ...]] = {
697
697
  FieldSpec("activities", required=False, annotation=list[Any] | None, default=None),
698
698
  FieldSpec("user_ids", required=False, annotation=list[Any] | None, default=None),
699
699
  ),
700
+ # The typed rename: the handler builds the one ``replace`` on ``name``; the
701
+ # SDK's free-form ``patch_data`` is handler-owned and never offered.
702
+ "view.update": (FieldSpec("name", required=True, annotation=str),),
700
703
  "user.preference.update": (
701
704
  # PreferencesPatchRequest: replace ops on dotted paths rooted at
702
705
  # GLOBAL or WORKSPACE_PREFERENCES.
@@ -354,6 +354,7 @@ def column_warnings(
354
354
  column_types: Mapping[str, str],
355
355
  view_id: int | None = None,
356
356
  dataset_id: int | None = None,
357
+ read_only: bool = False,
357
358
  ) -> list[dict[str, Any]]:
358
359
  """Return warnings for text columns that hold numbers or dates, and for blanks.
359
360
 
@@ -363,6 +364,8 @@ def column_warnings(
363
364
  view_id: The view the rows came from, used in the suggested command.
364
365
  dataset_id: The view's dataset, used for the duplicate-rows fix
365
366
  command (a mutation, so it needs the exact parent, not discovery).
367
+ read_only: The rows came from a read-only data read; a ``dates_stored_as_text``
368
+ finding then carries no ``fix``, since a read answers from the text as it is.
366
369
 
367
370
  Returns:
368
371
  One record per finding: ``column``, ``issue``
@@ -414,15 +417,10 @@ def column_warnings(
414
417
  # there would be untrue.
415
418
  detail += " (the conversion makes them empty)"
416
419
  detail += "."
417
- warnings.append(
418
- {
419
- "column": column,
420
- "issue": issue,
421
- "detail": detail,
422
- "fix": _convert_hint(view_id, column, to),
423
- "rows_checked": checked,
424
- }
425
- )
420
+ finding: dict[str, Any] = {"column": column, "issue": issue, "detail": detail}
421
+ if not (read_only and kind == "dates"):
422
+ finding["fix"] = _convert_hint(view_id, column, to)
423
+ warnings.append({**finding, "rows_checked": checked})
426
424
  break
427
425
  variant_warning = _variant_spellings_warning(column, texts, view_id, checked)
428
426
  if variant_warning is not None:
@@ -46,6 +46,8 @@ _HANDLER_OWNED_FIELDS: dict[str, frozenset[str]] = {
46
46
  # ``sort`` is the backend's internal result-column pairs; the CLI takes
47
47
  # ``order_by`` (result labels) and maps it, so a raw ``sort`` would be dropped.
48
48
  "view.data.aggregate": frozenset({"sort"}),
49
+ # ``view update`` offers only the typed rename; the handler builds the patch.
50
+ "view.update": frozenset({"patch_data"}),
49
51
  }
50
52
 
51
53
  # CLI-only commands whose complete request is carried by positionals/context.
@@ -76,6 +78,7 @@ _EXAMPLE_INPUT_HINTS: dict[str, dict[str, Any]] = {
76
78
  },
77
79
  # View display settings: real column names read better than sample keys.
78
80
  "view.transform.rename-columns": {"renames": {"cust_id": "Customer ID"}},
81
+ "view.update": {"name": "Revenue report"},
79
82
  "view.transform.sort": {"order_by": [["Revenue", "DESC"]]},
80
83
  # The backend requires integer resource ids ("resource_ids must be
81
84
  # comma-separated integers"); the SDK annotation is a plain list[str].
@@ -158,7 +158,7 @@ def ambiguity_note(matched: int, needle: str) -> str | None:
158
158
  return None
159
159
  return (
160
160
  f"{matched} datasets match '{needle}' (a v2 or a copy can sit beside the one meant): "
161
- "pick by id from rows/cols/created, and name the dataset you read in your answer."
161
+ "if nothing in the request tells them apart, ask the user which one before reading any."
162
162
  )
163
163
 
164
164
 
@@ -352,14 +352,18 @@ def compact_view_list(
352
352
  Sizes and columns come from the records already fetched. Each kept view then
353
353
  gets ``sample_values`` from the backend's stored column stats via ``read_stats``
354
354
  (one stored-stats read per kept view, run concurrently; no query runs).
355
+ A list of one dataset's views names every column; several datasets cap it at a few.
355
356
  Returns ``{"dataviews", "shown"}`` plus
356
357
  ``first_dropped_dataset`` / ``views_omitted`` when something was cut, for the
357
358
  caller to turn into a way to the next page.
358
359
  """
359
360
  groups: dict[Any, list[tuple[dict[str, Any], dict[str, Any]]]] = {}
360
- for ds_id, group in _group_by_dataset(views).items():
361
+ by_dataset = _group_by_dataset(views)
362
+ # One dataset's views are listed to be read from: the whole column list saves a `view get`.
363
+ every_column = all_columns or len(by_dataset) == 1
364
+ for ds_id, group in by_dataset.items():
361
365
  groups[ds_id] = [
362
- (v, view_summary(v, datasets.get(ds_id), ds_id, all_columns)) for v in group
366
+ (v, view_summary(v, datasets.get(ds_id), ds_id, every_column)) for v in group
363
367
  ]
364
368
  chosen, dropped_dataset, omitted = _choose_views(groups)
365
369
  with ThreadPoolExecutor(max_workers=_STATS_WORKERS) as pool:
@@ -1,13 +1,13 @@
1
1
  [project]
2
2
  name = "mammoth-cli"
3
- version = "2.2.11"
3
+ version = "2.2.13"
4
4
  description = "Command-line interface for the Mammoth Analytics platform"
5
5
  authors = [{name = "Mammoth Analytics", email = "support@mammoth.io"}]
6
6
  readme = "README.md"
7
7
  license = "LicenseRef-Proprietary"
8
8
  requires-python = ">=3.12,<3.15"
9
9
  dependencies = [
10
- "mammoth-io (>=0.8.12,<0.9)",
10
+ "mammoth-io (>=0.8.13,<0.9)",
11
11
  "typer (>=0.27,<0.28)",
12
12
  "rich (>=15,<16)",
13
13
  "platformdirs (>=4.10,<5)",
@@ -158,7 +158,7 @@ commands:
158
158
  - CT-SCHEDULE-LIST-ERROR
159
159
  draft_test: null
160
160
  undo_test: null
161
- known_restrictions: 'B04 SERVER_VARIANCE: unconditionally unimplemented on every backend
161
+ known_restrictions: 'Retired: the command answers not_available and names the web app. B04 SERVER_VARIANCE: unconditionally unimplemented on every backend
162
162
  release tested, not intermittent -- GET .../schedules always returns HTTP 400 with error
163
163
  code 5GENR011 NOT_IMPLEMENTED (mvc-service apiv2/apiv2/schedules/controller.py
164
164
  ScheduleController.list_schedules always raises ClientError(not_implemented_error); its
@@ -5834,7 +5834,7 @@ commands:
5834
5834
  required_fixture_guard: null
5835
5835
  secret_fields: []
5836
5836
  human_example: mammoth view update VIEW_ID --help
5837
- agent_example: 'mammoth view update 123 123 --input ''{"patch_data": [{"sample_key": "Status"}]}'''
5837
+ agent_example: 'mammoth view update 123 123 --input ''{"name": "Revenue report"}'''
5838
5838
  unit_tests:
5839
5839
  - UT-VIEW-UPDATE
5840
5840
  contract_tests:
@@ -5843,8 +5843,8 @@ commands:
5843
5843
  - CT-VIEW-UPDATE-ERROR
5844
5844
  draft_test: null
5845
5845
  undo_test: null
5846
- known_restrictions: 'BLOCKED[B09 DATAVIEW_INPUT_UNTYPED]: patch_data is an arbitrary dictionary; reserved,
5847
- not registered.'
5846
+ known_restrictions: 'Only the typed rename is offered (--input {"name": ...}); any other patch is refused
5847
+ with B09 DATAVIEW_INPUT_UNTYPED because patch_data is an arbitrary dictionary.'
5848
5848
  reviewed_by: primary
5849
5849
  - command_id: view.version.apply
5850
5850
  command_path: view version apply
File without changes
File without changes
File without changes