mammoth-cli 2.0.54__tar.gz → 2.0.56__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 (229) hide show
  1. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/.gitignore +1 -0
  2. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/PKG-INFO +2 -2
  3. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/__init__.py +1 -1
  4. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +1 -1
  5. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +2 -2
  6. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +80 -0
  7. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +33 -0
  8. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/registry.py +8 -0
  9. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/schema.py +8 -2
  10. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/view.py +75 -22
  11. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/pyproject.toml +2 -2
  12. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/dashboard.yaml +327 -0
  13. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/sdk-catalog.source.yaml +72 -0
  14. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/sdk-methods.yaml +109 -0
  15. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/LICENSE +0 -0
  16. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/README.md +0 -0
  17. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/__main__.py +0 -0
  18. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/app.py +0 -0
  19. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
  20. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  21. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
  22. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
  23. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  24. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  25. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  26. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  27. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  28. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  29. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  30. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  31. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  32. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  33. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  34. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  35. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  36. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  37. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  38. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  39. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
  40. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  41. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  42. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  43. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  44. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  45. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  46. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  47. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  48. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  49. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  50. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
  51. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  52. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  53. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  54. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  55. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  56. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  57. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  58. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  59. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  60. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  61. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  62. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
  63. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +0 -0
  64. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  65. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  66. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  67. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  68. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
  69. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  70. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  71. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  72. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  73. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  74. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
  75. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  76. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  77. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  78. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  79. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
  80. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
  81. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  82. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  83. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  84. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  85. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  86. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
  87. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/__init__.py +0 -0
  88. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/activity.py +0 -0
  89. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/addon.py +0 -0
  90. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/agent.py +0 -0
  91. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/ai.py +0 -0
  92. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/annotation.py +0 -0
  93. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/auth.py +0 -0
  94. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/automation.py +0 -0
  95. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/batch.py +0 -0
  96. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/billing.py +0 -0
  97. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/browse.py +0 -0
  98. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/capability.py +0 -0
  99. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/client_app.py +0 -0
  100. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/completion.py +0 -0
  101. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/config.py +0 -0
  102. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/connector.py +0 -0
  103. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/context.py +0 -0
  104. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/dashboard.py +0 -0
  105. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/data_app.py +0 -0
  106. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/dataset.py +0 -0
  107. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/doctor.py +0 -0
  108. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/external_key.py +0 -0
  109. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/file.py +0 -0
  110. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/folder.py +0 -0
  111. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/job.py +0 -0
  112. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/notification.py +0 -0
  113. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/parameter.py +0 -0
  114. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/project.py +0 -0
  115. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/report.py +0 -0
  116. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/schedule.py +0 -0
  117. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/skill.py +0 -0
  118. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/snippet.py +0 -0
  119. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/support.py +0 -0
  120. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/template.py +0 -0
  121. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/trash.py +0 -0
  122. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/upgrade.py +0 -0
  123. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/user.py +0 -0
  124. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/view_ops.py +0 -0
  125. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/webhook.py +0 -0
  126. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/workflow.py +0 -0
  127. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/commands/workspace.py +0 -0
  128. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/context/__init__.py +0 -0
  129. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/context/credentials.py +0 -0
  130. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/context/endpoint.py +0 -0
  131. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/context/profiles.py +0 -0
  132. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/context/resolver.py +0 -0
  133. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/contracts/__init__.py +0 -0
  134. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/contracts/auth.py +0 -0
  135. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/embed.py +0 -0
  136. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/errors/__init__.py +0 -0
  137. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/errors/envelope.py +0 -0
  138. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/manifest/__init__.py +0 -0
  139. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/manifest/loader.py +0 -0
  140. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/messages/__init__.py +0 -0
  141. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/output/__init__.py +0 -0
  142. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/output/envelope.py +0 -0
  143. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/output/normalize.py +0 -0
  144. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/output/policy.py +0 -0
  145. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/output/progress.py +0 -0
  146. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/output/render.py +0 -0
  147. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/py.typed +0 -0
  148. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/runtime/__init__.py +0 -0
  149. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/runtime/confirm.py +0 -0
  150. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/runtime/dryrun.py +0 -0
  151. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/runtime/embedded.py +0 -0
  152. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/runtime/executor.py +0 -0
  153. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/runtime/input_loader.py +0 -0
  154. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/runtime/invocation.py +0 -0
  155. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/runtime/options.py +0 -0
  156. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/runtime/parents.py +0 -0
  157. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/runtime/runlog.py +0 -0
  158. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/runtime/session.py +0 -0
  159. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/runtime/strict.py +0 -0
  160. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/runtime/updates.py +0 -0
  161. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/runtime/validate.py +0 -0
  162. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/services/__init__.py +0 -0
  163. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/services/argspec.py +0 -0
  164. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/services/coerce.py +0 -0
  165. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/services/command_contract.py +0 -0
  166. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/services/conditions.py +0 -0
  167. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/services/dashboard_pages.py +0 -0
  168. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/services/dashboard_review.py +0 -0
  169. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/services/data_quality.py +0 -0
  170. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/services/dispatch.py +0 -0
  171. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/services/factory.py +0 -0
  172. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/services/input_fields.py +0 -0
  173. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/services/mapping.py +0 -0
  174. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/services/openapi_types.py +0 -0
  175. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/services/positionals.py +0 -0
  176. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/services/protocol.py +0 -0
  177. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/services/sdk_service.py +0 -0
  178. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/services/testing.py +0 -0
  179. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/services/type_system.py +0 -0
  180. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/skills/__init__.py +0 -0
  181. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/skills/installer.py +0 -0
  182. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/skills/steering.py +0 -0
  183. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/mammoth_cli/testing.py +0 -0
  184. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/activity.yaml +0 -0
  185. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/addon.yaml +0 -0
  186. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/agent.yaml +0 -0
  187. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/ai.yaml +0 -0
  188. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/annotation.yaml +0 -0
  189. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/auth.yaml +0 -0
  190. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/automation.yaml +0 -0
  191. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/batch.yaml +0 -0
  192. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/billing.yaml +0 -0
  193. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/browse.yaml +0 -0
  194. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/capability.yaml +0 -0
  195. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/client-app.yaml +0 -0
  196. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/completion.yaml +0 -0
  197. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/config.yaml +0 -0
  198. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/connector.yaml +0 -0
  199. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/context.yaml +0 -0
  200. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/data-app.yaml +0 -0
  201. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/dataset.yaml +0 -0
  202. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/doctor.yaml +0 -0
  203. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/external-key.yaml +0 -0
  204. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/file.yaml +0 -0
  205. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/folder.yaml +0 -0
  206. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/job.yaml +0 -0
  207. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/log.yaml +0 -0
  208. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/notification.yaml +0 -0
  209. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/parameter.yaml +0 -0
  210. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/project.yaml +0 -0
  211. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/report.yaml +0 -0
  212. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/schedule.yaml +0 -0
  213. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/schema.yaml +0 -0
  214. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/skill.yaml +0 -0
  215. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/snippet.yaml +0 -0
  216. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/support.yaml +0 -0
  217. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/template.yaml +0 -0
  218. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/trash.yaml +0 -0
  219. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/upgrade.yaml +0 -0
  220. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/user.yaml +0 -0
  221. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/version.yaml +0 -0
  222. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/view.yaml +0 -0
  223. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/webhook.yaml +0 -0
  224. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/workflow.yaml +0 -0
  225. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/commands/workspace.yaml +0 -0
  226. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/openapi-operations.yaml +0 -0
  227. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/manifests/schema-v1.json +0 -0
  228. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/openapi/metadata.json +0 -0
  229. {mammoth_cli-2.0.54 → mammoth_cli-2.0.56}/spec/openapi/openapi.json +0 -0
@@ -11,3 +11,4 @@ build/
11
11
  .ruff_cache/
12
12
  __pycache__/
13
13
  .coverage
14
+ release-assets/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mammoth-cli
3
- Version: 2.0.54
3
+ Version: 2.0.56
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.25
20
+ Requires-Dist: mammoth-io<0.8,>=0.7.26
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.54"
9
+ __version__ = "2.0.56"
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.54
3
+ version: 2.0.56
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
 
@@ -1,6 +1,6 @@
1
1
  # Published CLI command catalog
2
2
 
3
- This generated catalog is a lookup table for every command in the published CLI manifest, currently 557; each entry carries its release status line. It is a command-contract index, not an assertion that every backend/OpenAPI operation has a CLI binding. For an exact local CLI contract, run `mammoth schema get COMMAND_ID`; `mammoth capability list` is an API-binding inventory and can omit typed/local CLI routes. For focused workflows, read the [recipes index](recipes/index.md). Sensitive structured input must come from a private file or pipe; never put secrets in literal argv.
3
+ This generated catalog is a lookup table for every command in the published CLI manifest, currently 565; each entry carries its release status line. It is a command-contract index, not an assertion that every backend/OpenAPI operation has a CLI binding. For an exact local CLI contract, run `mammoth schema get COMMAND_ID`; `mammoth capability list` is an API-binding inventory and can omit typed/local CLI routes. For focused workflows, read the [recipes index](recipes/index.md). Sensitive structured input must come from a private file or pipe; never put secrets in literal argv.
4
4
 
5
5
  Load only the applicable domain file:
6
6
 
@@ -21,7 +21,7 @@ Load only the applicable domain file:
21
21
  - [connector](commands/connector.md) — 22 published commands
22
22
  - [context](commands/context.md) — 3 published commands
23
23
  - [dashboard-qa](commands/dashboard-qa.md) — 13 published commands
24
- - [dashboard](commands/dashboard.md) — 90 published commands
24
+ - [dashboard](commands/dashboard.md) — 98 published commands
25
25
  - [data-app](commands/data-app.md) — 12 published commands
26
26
  - [dataset](commands/dataset.md) — 17 published commands
27
27
  - [doctor](commands/doctor.md) — 1 published commands
@@ -222,6 +222,86 @@ Result: `DashboardDuplicateResult`; mutation `benign_mutation`, confirmation `no
222
222
 
223
223
  Status on release: ran once on CLI 2.0.12 — Dashboard sweep 2026-09-18: exit 0 on release with CLI 2.0.12; result keys: id. duplicated D=52 -> D2=54 Single invocation only; no error-path or variant coverage.
224
224
 
225
+ ### `dashboard.embed.config.get`
226
+
227
+ Run: `mammoth dashboard embed config get`. Exact input fields: `mammoth schema get dashboard.embed.config.get`.
228
+
229
+ Example: `mammoth dashboard embed config get 123`. Placeholders are illustrative; resolve IDs and input from observed reads.
230
+
231
+ Result: `DashboardEmbedConfigGetResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
232
+
233
+ Status on release: untried; no live run recorded.
234
+
235
+ ### `dashboard.embed.config.set`
236
+
237
+ Run: `mammoth dashboard embed config set`. Exact input fields: `mammoth schema get dashboard.embed.config.set`.
238
+
239
+ Example: `mammoth dashboard embed config set 123 --yes --confirm 123`. Illustrative only: append `--yes --confirm <EXACT_TARGET>` after observing the target.
240
+
241
+ Result: `DashboardEmbedConfigSetResult`; mutation `high_impact`, confirmation `confirm_target`, wait policy `not_async`.
242
+
243
+ Status on release: untried; no live run recorded.
244
+
245
+ ### `dashboard.embed.key.rotate`
246
+
247
+ Run: `mammoth dashboard embed key rotate`. Exact input fields: `mammoth schema get dashboard.embed.key.rotate`.
248
+
249
+ Example: `mammoth dashboard embed key rotate 123 --yes --confirm 123`. Illustrative only: append `--yes --confirm <EXACT_TARGET>` after observing the target.
250
+
251
+ Result: `DashboardEmbedKeyRotateResult`; mutation `high_impact`, confirmation `confirm_target`, wait policy `not_async`.
252
+
253
+ Status on release: untried; no live run recorded.
254
+
255
+ ### `dashboard.embed.lifetime.set`
256
+
257
+ Run: `mammoth dashboard embed lifetime set`. Exact input fields: `mammoth schema get dashboard.embed.lifetime.set`.
258
+
259
+ Example: `mammoth dashboard embed lifetime set 123 --input '{"token_ttl": 1}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
260
+
261
+ Result: `DashboardEmbedLifetimeSetResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
262
+
263
+ Status on release: untried; no live run recorded.
264
+
265
+ ### `dashboard.embed.origin.revoke`
266
+
267
+ Run: `mammoth dashboard embed origin revoke`. Exact input fields: `mammoth schema get dashboard.embed.origin.revoke`.
268
+
269
+ Example: `mammoth dashboard embed origin revoke 123 --input '{"origin": "sample"}' --yes --confirm 123`. Illustrative only: append `--yes --confirm <EXACT_TARGET>` after observing the target.
270
+
271
+ Result: `DashboardEmbedOriginRevokeResult`; mutation `high_impact`, confirmation `confirm_target`, wait policy `not_async`.
272
+
273
+ Status on release: untried; no live run recorded.
274
+
275
+ ### `dashboard.embed.preview-token.create`
276
+
277
+ Run: `mammoth dashboard embed preview-token create`. Exact input fields: `mammoth schema get dashboard.embed.preview-token.create`.
278
+
279
+ Example: `mammoth dashboard embed preview-token create 123`. Placeholders are illustrative; resolve IDs and input from observed reads.
280
+
281
+ Result: `DashboardEmbedPreviewTokenCreateResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
282
+
283
+ Status on release: untried; no live run recorded.
284
+
285
+ ### `dashboard.embed.secret.rotate`
286
+
287
+ Run: `mammoth dashboard embed secret rotate`. Exact input fields: `mammoth schema get dashboard.embed.secret.rotate`.
288
+
289
+ Example: `mammoth dashboard embed secret rotate 123 --yes --confirm 123`. Illustrative only: append `--yes --confirm <EXACT_TARGET>` after observing the target.
290
+
291
+ Result: `DashboardEmbedSecretRotateResult`; mutation `high_impact`, confirmation `confirm_target`, wait policy `not_async`.
292
+
293
+ Status on release: untried; no live run recorded.
294
+
295
+ ### `dashboard.embed.usage.get`
296
+
297
+ Run: `mammoth dashboard embed usage get`. Exact input fields: `mammoth schema get dashboard.embed.usage.get`.
298
+
299
+ Example: `mammoth dashboard embed usage get 123`. Placeholders are illustrative; resolve IDs and input from observed reads.
300
+
301
+ Result: `DashboardEmbedUsageGetResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
302
+
303
+ Status on release: untried; no live run recorded.
304
+
225
305
  ### `dashboard.exemplar.extract`
226
306
 
227
307
  Run: `mammoth dashboard exemplar extract`. Exact input fields: `mammoth schema get dashboard.exemplar.extract`.
@@ -155,3 +155,36 @@ before that they return 404 `DASHBOARD_NOT_FOUND`. Legacy widget routes
155
155
  `video export` needs a motion-story dashboard. Revert the share
156
156
  (`type_of_auth: "mammoth"`) before trashing a temporary dashboard.
157
157
 
158
+ ## Embedding a board on a third-party page
159
+
160
+ `dashboard embed config get DASHBOARD_ID` reads the board's embed settings
161
+ (mode, origin allowlist, the `embed_url`/`sdk_url` a snippet needs); the first
162
+ read on a non-public board without a key auto-mints one, so there is always a
163
+ key to copy. `dashboard embed config set DASHBOARD_ID --yes --confirm
164
+ DASHBOARD_ID --input '{"allow_any_origin": false, "allowed_origins":
165
+ ["https://intranet.example.com"]}'` restricts which sites may frame it —
166
+ `allow_any_origin` defaults to true (any site). `mode: "signed"` requires a
167
+ host-signed token instead of the board's key, and only applies while the
168
+ board has no public link. `config set` is a `confirm_target` command, like
169
+ `dashboard archive`: it can expose the board outside Mammoth (enabling
170
+ embedding or widening the allowlist) or break every live embed on that board
171
+ (disabling it or narrowing the allowlist).
172
+
173
+ `dashboard embed key rotate DASHBOARD_ID --yes --confirm DASHBOARD_ID`
174
+ replaces the board's embed key (the old key keeps working for 24h unless
175
+ `keep_previous: false` is passed) — also `confirm_target`. `dashboard embed
176
+ origin revoke DASHBOARD_ID --yes --confirm DASHBOARD_ID --input
177
+ '{"origin": "https://old.example.com"}'` removes one origin from the
178
+ allowlist without touching the rest — also `confirm_target`: it immediately
179
+ breaks the embed on that origin's site. `dashboard embed usage get
180
+ DASHBOARD_ID` reports per-origin render counts and health from the embed
181
+ registry. `dashboard embed preview-token create DASHBOARD_ID` mints a
182
+ short-lived signed token for testing a row-level-security-scoped embed
183
+ before publishing.
184
+
185
+ Two settings are workspace-scoped, not board-scoped: `dashboard embed secret
186
+ rotate WORKSPACE_ID --yes --confirm WORKSPACE_ID` (also `confirm_target`;
187
+ returns the plaintext signing secret once, never on a read) and `dashboard
188
+ embed lifetime set WORKSPACE_ID --input '{"token_ttl": 900}'` (60-3600
189
+ seconds, how long a minted embed viewer session lives).
190
+
@@ -376,6 +376,14 @@ HANDLERS: dict[str, Handler] = {
376
376
  "dashboard.assess-twb": dashboard_cmd.dashboard_assess_twb,
377
377
  "dashboard.assess-pbix": dashboard_cmd.dashboard_assess_pbix,
378
378
  "dashboard.import-workbook": dashboard_cmd.dashboard_import_workbook,
379
+ "dashboard.embed.config.get": dashboard_cmd.generated_dashboard,
380
+ "dashboard.embed.config.set": dashboard_cmd.generated_dashboard,
381
+ "dashboard.embed.key.rotate": dashboard_cmd.generated_dashboard,
382
+ "dashboard.embed.usage.get": dashboard_cmd.generated_dashboard,
383
+ "dashboard.embed.origin.revoke": dashboard_cmd.generated_dashboard,
384
+ "dashboard.embed.preview-token.create": dashboard_cmd.generated_dashboard,
385
+ "dashboard.embed.secret.rotate": dashboard_cmd.generated_dashboard,
386
+ "dashboard.embed.lifetime.set": dashboard_cmd.generated_dashboard,
379
387
  # workflow family
380
388
  "workflow.block.add": workflow_cmd.workflow_block_add,
381
389
  "workflow.block.auth": workflow_cmd.workflow_block_auth,
@@ -893,8 +893,14 @@ def runnable_example(
893
893
  # their manifests advertise; otherwise discovery emits a command that
894
894
  # deterministically fails before dispatch.
895
895
  tokens.append("--yes")
896
- if record["command_id"] == "project.resource-dependencies.update":
897
- # This command has a confirm_target policy. Keep its generated
896
+ if record["command_id"] in {
897
+ "project.resource-dependencies.update",
898
+ "dashboard.embed.key.rotate",
899
+ "dashboard.embed.secret.rotate",
900
+ "dashboard.embed.config.set",
901
+ "dashboard.embed.origin.revoke",
902
+ }:
903
+ # These commands have a confirm_target policy. Keep their generated
898
904
  # example executable in non-interactive mode instead of advertising a
899
905
  # request that the safety guard will reject.
900
906
  tokens.extend(["--yes", "--confirm", str(_sample_positional_value(positionals[0]))])
@@ -24,6 +24,7 @@ import inspect
24
24
  from datetime import UTC, datetime
25
25
  from typing import Any
26
26
 
27
+ from mammoth.models.exports import ExportStatus
27
28
  from mammoth.view import ViewExport
28
29
 
29
30
  from mammoth_cli.context import profiles
@@ -2300,9 +2301,35 @@ def view_export_specialized(invocation: Invocation) -> HandlerResult:
2300
2301
  ),
2301
2302
  details={"dataset_id": dataset_id, "target_ds_id": int(target_ds_id)},
2302
2303
  )
2303
- rows_before = None
2304
- if target_ds_id is not None and kwargs.get("save_as_mode") == "APPEND_TO_DS":
2305
- rows_before = _dataset_row_count(service, int(target_ds_id), result_project_id)
2304
+ if target_ds_id is not None:
2305
+ # Each `view export dataset` call creates its own PERSISTENT
2306
+ # export trigger on this view, which re-runs on every pipeline
2307
+ # run; REPLACE_IN_DS/APPEND_TO_DS only ever touch that trigger's
2308
+ # OWN rows. A second export from this view into the same target
2309
+ # is therefore a second writer, not a refresh of the first --
2310
+ # the fix is to rerun the pipeline, not to export again.
2311
+ existing_export = _existing_internal_dataset_export(
2312
+ service, dataview_id, dataset_id, int(target_ds_id)
2313
+ )
2314
+ if existing_export is not None:
2315
+ raise CliError(
2316
+ code="export_already_exists",
2317
+ message=(
2318
+ f"View {dataview_id} already exports into dataset "
2319
+ f"{int(target_ds_id)} (export {existing_export.id}). This export "
2320
+ "re-runs on every pipeline run, and REPLACE_IN_DS replaces only "
2321
+ "its own rows -- a second export into the same target duplicates "
2322
+ "rows instead of refreshing them."
2323
+ ),
2324
+ exit_status=EXIT_USAGE,
2325
+ hint="Refresh the target by rerunning the pipeline, not by exporting again.",
2326
+ recovery_commands=[f"mammoth view pipeline rerun {dataview_id}"],
2327
+ details={
2328
+ "dataview_id": dataview_id,
2329
+ "target_ds_id": int(target_ds_id),
2330
+ "export_id": existing_export.id,
2331
+ },
2332
+ )
2306
2333
  data = service.call_view(dataview_id, method, dataset_id=dataset_id, **kwargs)
2307
2334
  if is_dataset_route and isinstance(data, int):
2308
2335
  # The SDK returns the bare id of the dataset written to; name it, and
@@ -2316,6 +2343,10 @@ def view_export_specialized(invocation: Invocation) -> HandlerResult:
2316
2343
  "dataset_id": data,
2317
2344
  "project_id": result_project_id,
2318
2345
  "source_view_id": dataview_id,
2346
+ # Every internal-dataset export is a pipeline trigger, not a
2347
+ # one-shot copy: it re-runs (and re-writes its own rows) every
2348
+ # time this view's pipeline runs.
2349
+ "refreshes_on_pipeline_run": True,
2319
2350
  }
2320
2351
  view_info = _dataset_view_info(service, data["dataset_id"], result_project_id)
2321
2352
  if view_info is not None:
@@ -2325,30 +2356,52 @@ def view_export_specialized(invocation: Invocation) -> HandlerResult:
2325
2356
  data["next"] = f"mammoth view list {data['dataset_id']}" + (
2326
2357
  f" --project {result_project_id}" if target_project is not None else ""
2327
2358
  )
2328
- rows_after = view_info["row_count"] if view_info is not None else None
2329
- if rows_after is not None:
2330
- data["rows_after"] = rows_after
2331
- if rows_before is not None:
2332
- data["rows_before"] = rows_before
2359
+ # rows_after is only trustworthy for a brand-new dataset: nothing
2360
+ # else could have written to it yet. Writing into an EXISTING
2361
+ # target_ds_id races the target view's own metadata refresh --
2362
+ # this same read has returned a stale row count right after a
2363
+ # confirmed write -- so it is omitted rather than reported wrong.
2364
+ if target_ds_id is None:
2365
+ rows_after = view_info["row_count"] if view_info is not None else None
2366
+ if rows_after is not None:
2367
+ data["rows_after"] = rows_after
2333
2368
  return data, _meta(invocation, auth.workspace_id, project_id)
2334
2369
 
2335
2370
 
2336
- def _dataset_row_count(service: Any, dataset_id: int, project_id: int | None) -> int | None:
2337
- """Best-effort row count for a dataset, read from its first view.
2371
+ _EXPORTS_LIST_SYMBOL = "mammoth.api.exports.ExportsAPI.list"
2372
+ _INTERNAL_DATASET_HANDLER_TYPE = "internal_dataset"
2373
+
2338
2374
 
2339
- Row counts are exposed per-view, not per-dataset; this reads the first
2340
- dataview's ``row_count`` (mirrors ``upload_preview``). ``None`` on any
2341
- failure rather than failing the export result.
2375
+ def _existing_internal_dataset_export(
2376
+ service: Any, dataview_id: int, dataset_id: int | None, target_ds_id: int
2377
+ ) -> Any | None:
2378
+ """This dataview's ``internal_dataset`` export already writing into
2379
+ ``target_ds_id``, if one exists (the most recent by id, when more than
2380
+ one somehow matches). ``None`` on no match.
2381
+
2382
+ ``TARGET_DS_ID`` is compared as ``int``: the wire value can come back as
2383
+ a string, which would otherwise never match (mirrors the same int/str
2384
+ fix already applied to the SDK's own write-confirmation poll). A
2385
+ soft-deleted export (``status == ExportStatus.DELETED``) is never a
2386
+ match: the backend soft-deletes triggers rather than removing the row,
2387
+ and the list endpoint does not filter on status, so a deleted export
2388
+ would otherwise block every later export into that target forever.
2342
2389
  """
2343
- try:
2344
- listing = service.call(_DATAVIEW_LIST_SYMBOL, dataset_id=dataset_id, project_id=project_id)
2345
- views = listing.get("dataviews") if isinstance(listing, dict) else None
2346
- if not isinstance(views, list) or not views or not isinstance(views[0], dict):
2347
- return None
2348
- row_count = views[0].get("row_count")
2349
- return int(row_count) if row_count is not None else None
2350
- except Exception: # noqa: BLE001 -- row count is advisory, never fails the export
2351
- return None
2390
+ listing = service.call(
2391
+ _EXPORTS_LIST_SYMBOL,
2392
+ dataview_id=dataview_id,
2393
+ dataset_id=dataset_id,
2394
+ handler_type=_INTERNAL_DATASET_HANDLER_TYPE,
2395
+ )
2396
+ exports = getattr(listing, "exports", None) or []
2397
+ matches = [
2398
+ export
2399
+ for export in exports
2400
+ if export.status is not ExportStatus.DELETED
2401
+ and (target := (export.target_properties or {}).get("TARGET_DS_ID")) is not None
2402
+ and int(target) == target_ds_id
2403
+ ]
2404
+ return max(matches, key=lambda export: export.id or 0) if matches else None
2352
2405
 
2353
2406
 
2354
2407
  def _dataset_view_info(
@@ -1,13 +1,13 @@
1
1
  [project]
2
2
  name = "mammoth-cli"
3
- version = "2.0.54"
3
+ version = "2.0.56"
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.7.25,<0.8)",
10
+ "mammoth-io (>=0.7.26,<0.8)",
11
11
  "typer (>=0.27,<0.28)",
12
12
  "rich (>=15,<16)",
13
13
  "platformdirs (>=4.10,<5)",