mammoth-cli 2.0.86__tar.gz → 2.0.88__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 (248) hide show
  1. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/PKG-INFO +2 -2
  2. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +5 -4
  4. mammoth_cli-2.0.88/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +103 -0
  5. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +30 -100
  6. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +20 -0
  7. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +3 -1
  8. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +1 -1
  9. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +10 -0
  10. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +1 -1
  11. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +66 -2
  12. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/dashboard.py +100 -1
  13. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/dataset.py +63 -1
  14. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/job.py +21 -1
  15. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/project.py +36 -10
  16. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/registry.py +7 -0
  17. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/schema.py +34 -4
  18. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/view.py +476 -64
  19. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/view_ops.py +8 -1
  20. mammoth_cli-2.0.88/mammoth_cli/commands/view_profile.py +548 -0
  21. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/output/envelope.py +6 -0
  22. mammoth_cli-2.0.88/mammoth_cli/runtime/dataset_health.py +112 -0
  23. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/runtime/dryrun.py +4 -2
  24. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/runtime/executor.py +7 -1
  25. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/runtime/invocation.py +10 -3
  26. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/runtime/state.py +70 -3
  27. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/runtime/verify.py +31 -4
  28. mammoth_cli-2.0.88/mammoth_cli/services/board_values.py +244 -0
  29. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/services/command_contract.py +50 -0
  30. mammoth_cli-2.0.88/mammoth_cli/services/dashboard_filters.py +81 -0
  31. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/services/dashboard_review.py +22 -7
  32. mammoth_cli-2.0.88/mammoth_cli/services/data_profile.py +289 -0
  33. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/services/input_fields.py +6 -0
  34. mammoth_cli-2.0.88/mammoth_cli/services/listing.py +271 -0
  35. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/services/positionals.py +17 -2
  36. mammoth_cli-2.0.88/mammoth_cli/services/read_queries.py +465 -0
  37. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/services/sdk_service.py +4 -4
  38. mammoth_cli-2.0.88/mammoth_cli/services/stored_stats.py +103 -0
  39. mammoth_cli-2.0.88/mammoth_cli/services/text_dates.py +303 -0
  40. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/pyproject.toml +2 -2
  41. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/addon.yaml +6 -0
  42. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/agent.yaml +3 -0
  43. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/ai.yaml +3 -0
  44. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/annotation.yaml +4 -0
  45. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/auth.yaml +2 -0
  46. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/automation.yaml +5 -0
  47. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/batch.yaml +5 -0
  48. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/billing.yaml +12 -0
  49. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/client-app.yaml +3 -0
  50. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/completion.yaml +1 -0
  51. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/config.yaml +1 -0
  52. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/connector.yaml +10 -0
  53. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/context.yaml +2 -0
  54. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/dashboard.yaml +205 -3
  55. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/data-app.yaml +6 -0
  56. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/dataset.yaml +104 -1
  57. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/external-key.yaml +3 -2
  58. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/file.yaml +7 -0
  59. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/folder.yaml +6 -0
  60. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/notification.yaml +4 -0
  61. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/parameter.yaml +10 -0
  62. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/project.yaml +21 -2
  63. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/schedule.yaml +3 -0
  64. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/skill.yaml +4 -0
  65. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/snippet.yaml +5 -0
  66. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/support.yaml +32 -0
  67. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/template.yaml +3 -0
  68. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/trash.yaml +2 -0
  69. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/upgrade.yaml +1 -0
  70. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/user.yaml +6 -0
  71. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/view.yaml +170 -3
  72. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/webhook.yaml +5 -0
  73. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/workflow.yaml +10 -0
  74. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/workspace.yaml +14 -1
  75. mammoth_cli-2.0.88/spec/manifests/edits-target.source.yaml +236 -0
  76. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/openapi-operations.yaml +39 -0
  77. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/schema-v1.json +5 -0
  78. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/sdk-catalog.source.yaml +14 -0
  79. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/sdk-methods.yaml +41 -5
  80. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/openapi/metadata.json +4 -4
  81. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/openapi/openapi.json +1 -1
  82. mammoth_cli-2.0.86/mammoth_cli/runtime/dataset_health.py +0 -62
  83. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/.gitignore +0 -0
  84. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/LICENSE +0 -0
  85. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/README.md +0 -0
  86. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/__main__.py +0 -0
  87. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/app.py +0 -0
  88. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +0 -0
  89. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
  90. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  91. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
  92. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
  93. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  94. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  95. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  96. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  97. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  98. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  99. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  100. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  101. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  102. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  103. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
  104. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  105. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  106. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  107. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  108. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  109. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  110. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
  111. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  112. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  113. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  114. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  115. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  116. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  117. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  118. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  119. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  120. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  121. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  122. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  123. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  124. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  125. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  126. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  127. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  128. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  129. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  130. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
  131. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  132. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  133. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  134. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
  135. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  136. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  137. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  138. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  139. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  140. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
  141. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  142. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  143. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  144. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  145. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
  146. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
  147. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  148. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  149. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  150. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  151. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  152. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
  153. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/__init__.py +0 -0
  154. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/activity.py +0 -0
  155. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/addon.py +0 -0
  156. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/agent.py +0 -0
  157. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/ai.py +0 -0
  158. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/annotation.py +0 -0
  159. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/auth.py +0 -0
  160. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/automation.py +0 -0
  161. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/batch.py +0 -0
  162. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/billing.py +0 -0
  163. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/browse.py +0 -0
  164. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/calc.py +0 -0
  165. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/capability.py +0 -0
  166. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/client_app.py +0 -0
  167. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/completion.py +0 -0
  168. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/config.py +0 -0
  169. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/connector.py +0 -0
  170. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/context.py +0 -0
  171. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/data_app.py +0 -0
  172. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/doctor.py +0 -0
  173. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/external_key.py +0 -0
  174. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/file.py +0 -0
  175. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/folder.py +0 -0
  176. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/notification.py +0 -0
  177. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/parameter.py +0 -0
  178. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/report.py +0 -0
  179. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/schedule.py +0 -0
  180. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/skill.py +0 -0
  181. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/snippet.py +0 -0
  182. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/support.py +0 -0
  183. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/template.py +0 -0
  184. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/trash.py +0 -0
  185. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/upgrade.py +0 -0
  186. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/user.py +0 -0
  187. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/webhook.py +0 -0
  188. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/workflow.py +0 -0
  189. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/commands/workspace.py +0 -0
  190. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/context/__init__.py +0 -0
  191. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/context/credentials.py +0 -0
  192. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/context/endpoint.py +0 -0
  193. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/context/profiles.py +0 -0
  194. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/context/resolver.py +0 -0
  195. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/contracts/__init__.py +0 -0
  196. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/contracts/auth.py +0 -0
  197. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/embed.py +0 -0
  198. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/errors/__init__.py +0 -0
  199. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/errors/envelope.py +0 -0
  200. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/manifest/__init__.py +0 -0
  201. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/manifest/loader.py +0 -0
  202. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/messages/__init__.py +0 -0
  203. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/output/__init__.py +0 -0
  204. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/output/normalize.py +0 -0
  205. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/output/policy.py +0 -0
  206. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/output/progress.py +0 -0
  207. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/output/render.py +0 -0
  208. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/py.typed +0 -0
  209. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/runtime/__init__.py +0 -0
  210. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/runtime/confirm.py +0 -0
  211. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/runtime/dryrun_targets.py +0 -0
  212. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/runtime/embedded.py +0 -0
  213. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/runtime/input_loader.py +0 -0
  214. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/runtime/new_data.py +0 -0
  215. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/runtime/options.py +0 -0
  216. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/runtime/parents.py +0 -0
  217. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/runtime/runlog.py +0 -0
  218. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/runtime/session.py +0 -0
  219. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/runtime/strict.py +0 -0
  220. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/runtime/updates.py +0 -0
  221. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/runtime/validate.py +0 -0
  222. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/services/__init__.py +0 -0
  223. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/services/argspec.py +0 -0
  224. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/services/coerce.py +0 -0
  225. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/services/conditions.py +0 -0
  226. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/services/dashboard_pages.py +0 -0
  227. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/services/data_quality.py +0 -0
  228. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/services/dispatch.py +0 -0
  229. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/services/factory.py +0 -0
  230. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/services/mapping.py +0 -0
  231. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/services/openapi_types.py +0 -0
  232. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/services/protocol.py +0 -0
  233. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/services/testing.py +0 -0
  234. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/services/type_system.py +0 -0
  235. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/skills/__init__.py +0 -0
  236. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/skills/installer.py +0 -0
  237. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/skills/steering.py +0 -0
  238. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/mammoth_cli/testing.py +0 -0
  239. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/activity.yaml +0 -0
  240. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/browse.yaml +0 -0
  241. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/calc.yaml +0 -0
  242. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/capability.yaml +0 -0
  243. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/doctor.yaml +0 -0
  244. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/job.yaml +0 -0
  245. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/log.yaml +0 -0
  246. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/report.yaml +0 -0
  247. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/schema.yaml +0 -0
  248. {mammoth_cli-2.0.86 → mammoth_cli-2.0.88}/spec/manifests/commands/version.yaml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mammoth-cli
3
- Version: 2.0.86
3
+ Version: 2.0.88
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.40
20
+ Requires-Dist: mammoth-io<0.8,>=0.7.41
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.0.86"
9
+ __version__ = "2.0.88"
10
10
 
11
11
  # The versioned machine output envelope contract.
12
12
  SCHEMA_VERSION = 1
@@ -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 573; 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 579; 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
 
@@ -22,9 +22,10 @@ Load only the applicable domain file:
22
22
  - [connector](commands/connector.md) — 22 published commands
23
23
  - [context](commands/context.md) — 3 published commands
24
24
  - [dashboard-qa](commands/dashboard-qa.md) — 13 published commands
25
- - [dashboard](commands/dashboard.md) — 100 published commands
25
+ - [dashboard-style](commands/dashboard-style.md) — 10 published commands
26
+ - [dashboard](commands/dashboard.md) — 93 published commands
26
27
  - [data-app](commands/data-app.md) — 12 published commands
27
- - [dataset](commands/dataset.md) — 18 published commands
28
+ - [dataset](commands/dataset.md) — 20 published commands
28
29
  - [doctor](commands/doctor.md) — 1 published commands
29
30
  - [external-key](commands/external-key.md) — 4 published commands
30
31
  - [file](commands/file.md) — 9 published commands
@@ -46,7 +47,7 @@ Load only the applicable domain file:
46
47
  - [user](commands/user.md) — 8 published commands
47
48
  - [version](commands/version.md) — 1 published commands
48
49
  - [view-transform](commands/view-transform.md) — 32 published commands
49
- - [view](commands/view.md) — 89 published commands
50
+ - [view](commands/view.md) — 90 published commands
50
51
  - [webhook](commands/webhook.md) — 7 published commands
51
52
  - [workflow](commands/workflow.md) — 16 published commands
52
53
  - [workspace](commands/workspace.md) — 20 published commands
@@ -0,0 +1,103 @@
1
+ # `dashboard-style` commands
2
+
3
+ Every command returns the standard JSON envelope. On nonzero exit, read the error envelope and its `recovery_commands`; do not guess request fields. "Status on release" is joined from `docs/release-capability-matrix.json`: *ran once* means one bounded live run succeeded on the named CLI release, *untried* means nobody has run it, *not supported* means the backend refuses it. When this file disagrees with [capabilities](../capabilities.md) or a recipe, they win. Envelope shapes: [machine output](../machine-output.md).
4
+
5
+ ### `dashboard.style.custom.create`
6
+
7
+ Run: `mammoth dashboard style custom create`. Exact input fields: `mammoth schema get dashboard.style.custom.create`.
8
+
9
+ Example: `mammoth dashboard style custom create --input '{"body": {"params": {"signals": {}}}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
10
+
11
+ Result: `DashboardStyleCustomCreateResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
12
+
13
+ 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: style. created custom style id=1 with full unredacted colors/font/viz (no tokens field passed) Single invocation only; no error-path or variant coverage.
14
+
15
+ ### `dashboard.style.custom.delete`
16
+
17
+ Run: `mammoth dashboard style custom delete`. Exact input fields: `mammoth schema get dashboard.style.custom.delete`.
18
+
19
+ Example: `mammoth dashboard style custom delete resource-123`. Illustrative only: append `--yes` after observing an owned target.
20
+
21
+ Result: `DashboardStyleCustomDeleteResult`; mutation `destructive`, confirmation `prompt_or_yes`, wait policy `not_async`.
22
+
23
+ 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: ok. deleted custom style 1 Single invocation only; no error-path or variant coverage.
24
+
25
+ ### `dashboard.style.custom.list`
26
+
27
+ Run: `mammoth dashboard style custom list`. Exact input fields: `mammoth schema get dashboard.style.custom.list`.
28
+
29
+ Example: `mammoth dashboard style custom list`. Placeholders are illustrative; resolve IDs and input from observed reads.
30
+
31
+ Result: `DashboardStyleCustomListResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
32
+
33
+ Status on release: ran once on CLI 2.0.12 — Bounded release read succeeded with pinned CLI 1.1.9 in workspace 4; empty custom-style list observed. No Full claim: no non-empty fixture. Also: Dashboard sweep 2026-09-18: exit 0 on release with CLI 2.0.12; result keys: styles. empty custom styles list Sing…
34
+
35
+ ### `dashboard.style.custom.update`
36
+
37
+ Run: `mammoth dashboard style custom update`. Exact input fields: `mammoth schema get dashboard.style.custom.update`.
38
+
39
+ Example: `mammoth dashboard style custom update resource-123 --input '{"body": {"params": {"signals": {}}}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
40
+
41
+ Result: `DashboardStyleCustomUpdateResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
42
+
43
+ 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: style. renamed custom style 1 Single invocation only; no error-path or variant coverage.
44
+
45
+ ### `dashboard.style.default.get`
46
+
47
+ Run: `mammoth dashboard style default get`. Exact input fields: `mammoth schema get dashboard.style.default.get`.
48
+
49
+ Example: `mammoth dashboard style default get`. Placeholders are illustrative; resolve IDs and input from observed reads.
50
+
51
+ Result: `DashboardStyleDefaultGetResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
52
+
53
+ Status on release: ran once on CLI 2.0.14 — dashboard re-verification 2026-09-18: exit 0 on release with CLI 2.0.14. CLI defect fixed, confirmed: returned a real matched body {"styleId":"stone"} instead of raising ValidationError on an unmatched 2xx. Single invocation only.
54
+
55
+ ### `dashboard.style.default.set`
56
+
57
+ Run: `mammoth dashboard style default set`. Exact input fields: `mammoth schema get dashboard.style.default.set`.
58
+
59
+ Example: `mammoth dashboard style default set --input '{"body": {"params": {"styleId": "sample"}}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
60
+
61
+ Result: `DashboardStyleDefaultSetResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
62
+
63
+ Status on release: ran once on CLI 2.0.14 — dashboard re-verification 2026-09-18: exit 0 on release with CLI 2.0.14. Set styleId to the exact value read from style default get ("stone"), i.e. a verified no-op restore. Result {"styleId":"stone"}; re-ran style default get afterward and confirmed it still…
64
+
65
+ ### `dashboard.style.derive`
66
+
67
+ Run: `mammoth dashboard style derive`. Exact input fields: `mammoth schema get dashboard.style.derive`.
68
+
69
+ Example: `mammoth dashboard style derive --input '{"body": {"params": {"signals": {}}}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
70
+
71
+ Result: `DashboardStyleDeriveResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
72
+
73
+ Status on release: ran once on CLI 2.0.14 — dashboard re-verification 2026-09-18: exit 0 on release with CLI 2.0.14. CLI defect fixed, confirmed: returned a full real styleTokens object (colors, font, viz palette, radius, shadow, etc.) with no '***REDACTED***' placeholders anywhere in the body. Single…
74
+
75
+ ### `dashboard.style.extract-brand`
76
+
77
+ Run: `mammoth dashboard style extract-brand`. Exact input fields: `mammoth schema get dashboard.style.extract-brand`.
78
+
79
+ Example: `mammoth dashboard style extract-brand --input '{"body": {"params": {"url": "https://example.com/data.csv"}}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
80
+
81
+ Result: `DashboardStyleExtractBrandResult`; mutation `benign_mutation`, confirmation `none`, wait policy `always_wait`.
82
+
83
+ 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: screenshot, signals. captured screenshot + extracted brand signals (accents/font/ground/primary), no redaction here Single invocation only; no error-path or variant coverage.
84
+
85
+ ### `dashboard.style.preset.list`
86
+
87
+ Run: `mammoth dashboard style preset list`. Exact input fields: `mammoth schema get dashboard.style.preset.list`.
88
+
89
+ Example: `mammoth dashboard style preset list`. Placeholders are illustrative; resolve IDs and input from observed reads.
90
+
91
+ Result: `DashboardStylePresetListResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
92
+
93
+ Status on release: ran once on CLI 2.0.12 — Bounded release read succeeded with pinned CLI 1.1.9 in workspace 4; 10 stock presets returned. No Full claim: custom preset fixture not observed. Also: Dashboard sweep 2026-09-18: exit 0 on release with CLI 2.0.12; result keys: presets. returns built-in styl…
94
+
95
+ ### `dashboard.style.token.list`
96
+
97
+ Run: `mammoth dashboard style token list`. Exact input fields: `mammoth schema get dashboard.style.token.list`.
98
+
99
+ Example: `mammoth dashboard style token list resource-123`. Placeholders are illustrative; resolve IDs and input from observed reads.
100
+
101
+ Result: `DashboardStyleTokenListResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
102
+
103
+ Status on release: ran once on CLI 1.1.11 — Published PyPI CLI 1.1.11 / SDK 0.7.1 read of observed preset stone returned a redacted token payload. Bounded to one preset and redacted semantics; not Full. Dashboard sweep 2026-09-18 on release observed cli_error: HTTP 200 but result is tokens='***REDACTED…
@@ -342,6 +342,36 @@ Result: `DashboardFigureIntentResult`; mutation `benign_mutation`, confirmation
342
342
 
343
343
  Status on release: ran once on CLI 2.0.14 — dashboard re-verification 2026-09-18: exit 0 on release with CLI 2.0.14. CLI defect fixed, confirmed: returned a full matched structured body ({"added":{...},"kind":"bar","spec":{...},"intentApplied":true,...}) instead of raising ValidationError on an unmatch…
344
344
 
345
+ ### `dashboard.filter.add`
346
+
347
+ Run: `mammoth dashboard filter add`. Exact input fields: `mammoth schema get dashboard.filter.add`.
348
+
349
+ Example: `mammoth dashboard filter add 123 --input '{"field": "sample"}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
350
+
351
+ Result: `DashboardFilterResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
352
+
353
+ Status on release: untried; no live run recorded.
354
+
355
+ ### `dashboard.filter.list`
356
+
357
+ Run: `mammoth dashboard filter list`. Exact input fields: `mammoth schema get dashboard.filter.list`.
358
+
359
+ Example: `mammoth dashboard filter list 123`. Placeholders are illustrative; resolve IDs and input from observed reads.
360
+
361
+ Result: `DashboardFilterResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
362
+
363
+ Status on release: untried; no live run recorded.
364
+
365
+ ### `dashboard.filter.remove`
366
+
367
+ Run: `mammoth dashboard filter remove`. Exact input fields: `mammoth schema get dashboard.filter.remove`.
368
+
369
+ Example: `mammoth dashboard filter remove 123 --input '{"field": "sample"}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
370
+
371
+ Result: `DashboardFilterResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
372
+
373
+ Status on release: untried; no live run recorded.
374
+
345
375
  ### `dashboard.get`
346
376
 
347
377
  Run: `mammoth dashboard get`. Exact input fields: `mammoth schema get dashboard.get`.
@@ -650,106 +680,6 @@ Result: `DashboardSourceListResult`; mutation `read`, confirmation `none`, wait
650
680
 
651
681
  Status on release: observed blocker — blocker; still broken, not one of the 11 CLI-fixed commands. Re-check before relying on it.
652
682
 
653
- ### `dashboard.style.custom.create`
654
-
655
- Run: `mammoth dashboard style custom create`. Exact input fields: `mammoth schema get dashboard.style.custom.create`.
656
-
657
- Example: `mammoth dashboard style custom create --input '{"body": {"params": {"signals": {}}}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
658
-
659
- Result: `DashboardStyleCustomCreateResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
660
-
661
- 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: style. created custom style id=1 with full unredacted colors/font/viz (no tokens field passed) Single invocation only; no error-path or variant coverage.
662
-
663
- ### `dashboard.style.custom.delete`
664
-
665
- Run: `mammoth dashboard style custom delete`. Exact input fields: `mammoth schema get dashboard.style.custom.delete`.
666
-
667
- Example: `mammoth dashboard style custom delete resource-123`. Illustrative only: append `--yes` after observing an owned target.
668
-
669
- Result: `DashboardStyleCustomDeleteResult`; mutation `destructive`, confirmation `prompt_or_yes`, wait policy `not_async`.
670
-
671
- 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: ok. deleted custom style 1 Single invocation only; no error-path or variant coverage.
672
-
673
- ### `dashboard.style.custom.list`
674
-
675
- Run: `mammoth dashboard style custom list`. Exact input fields: `mammoth schema get dashboard.style.custom.list`.
676
-
677
- Example: `mammoth dashboard style custom list`. Placeholders are illustrative; resolve IDs and input from observed reads.
678
-
679
- Result: `DashboardStyleCustomListResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
680
-
681
- Status on release: ran once on CLI 2.0.12 — Bounded release read succeeded with pinned CLI 1.1.9 in workspace 4; empty custom-style list observed. No Full claim: no non-empty fixture. Also: Dashboard sweep 2026-09-18: exit 0 on release with CLI 2.0.12; result keys: styles. empty custom styles list Sing…
682
-
683
- ### `dashboard.style.custom.update`
684
-
685
- Run: `mammoth dashboard style custom update`. Exact input fields: `mammoth schema get dashboard.style.custom.update`.
686
-
687
- Example: `mammoth dashboard style custom update resource-123 --input '{"body": {"params": {"signals": {}}}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
688
-
689
- Result: `DashboardStyleCustomUpdateResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
690
-
691
- 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: style. renamed custom style 1 Single invocation only; no error-path or variant coverage.
692
-
693
- ### `dashboard.style.default.get`
694
-
695
- Run: `mammoth dashboard style default get`. Exact input fields: `mammoth schema get dashboard.style.default.get`.
696
-
697
- Example: `mammoth dashboard style default get`. Placeholders are illustrative; resolve IDs and input from observed reads.
698
-
699
- Result: `DashboardStyleDefaultGetResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
700
-
701
- Status on release: ran once on CLI 2.0.14 — dashboard re-verification 2026-09-18: exit 0 on release with CLI 2.0.14. CLI defect fixed, confirmed: returned a real matched body {"styleId":"stone"} instead of raising ValidationError on an unmatched 2xx. Single invocation only.
702
-
703
- ### `dashboard.style.default.set`
704
-
705
- Run: `mammoth dashboard style default set`. Exact input fields: `mammoth schema get dashboard.style.default.set`.
706
-
707
- Example: `mammoth dashboard style default set --input '{"body": {"params": {"styleId": "sample"}}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
708
-
709
- Result: `DashboardStyleDefaultSetResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
710
-
711
- Status on release: ran once on CLI 2.0.14 — dashboard re-verification 2026-09-18: exit 0 on release with CLI 2.0.14. Set styleId to the exact value read from style default get ("stone"), i.e. a verified no-op restore. Result {"styleId":"stone"}; re-ran style default get afterward and confirmed it still…
712
-
713
- ### `dashboard.style.derive`
714
-
715
- Run: `mammoth dashboard style derive`. Exact input fields: `mammoth schema get dashboard.style.derive`.
716
-
717
- Example: `mammoth dashboard style derive --input '{"body": {"params": {"signals": {}}}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
718
-
719
- Result: `DashboardStyleDeriveResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
720
-
721
- Status on release: ran once on CLI 2.0.14 — dashboard re-verification 2026-09-18: exit 0 on release with CLI 2.0.14. CLI defect fixed, confirmed: returned a full real styleTokens object (colors, font, viz palette, radius, shadow, etc.) with no '***REDACTED***' placeholders anywhere in the body. Single…
722
-
723
- ### `dashboard.style.extract-brand`
724
-
725
- Run: `mammoth dashboard style extract-brand`. Exact input fields: `mammoth schema get dashboard.style.extract-brand`.
726
-
727
- Example: `mammoth dashboard style extract-brand --input '{"body": {"params": {"url": "https://example.com/data.csv"}}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
728
-
729
- Result: `DashboardStyleExtractBrandResult`; mutation `benign_mutation`, confirmation `none`, wait policy `always_wait`.
730
-
731
- 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: screenshot, signals. captured screenshot + extracted brand signals (accents/font/ground/primary), no redaction here Single invocation only; no error-path or variant coverage.
732
-
733
- ### `dashboard.style.preset.list`
734
-
735
- Run: `mammoth dashboard style preset list`. Exact input fields: `mammoth schema get dashboard.style.preset.list`.
736
-
737
- Example: `mammoth dashboard style preset list`. Placeholders are illustrative; resolve IDs and input from observed reads.
738
-
739
- Result: `DashboardStylePresetListResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
740
-
741
- Status on release: ran once on CLI 2.0.12 — Bounded release read succeeded with pinned CLI 1.1.9 in workspace 4; 10 stock presets returned. No Full claim: custom preset fixture not observed. Also: Dashboard sweep 2026-09-18: exit 0 on release with CLI 2.0.12; result keys: presets. returns built-in styl…
742
-
743
- ### `dashboard.style.token.list`
744
-
745
- Run: `mammoth dashboard style token list`. Exact input fields: `mammoth schema get dashboard.style.token.list`.
746
-
747
- Example: `mammoth dashboard style token list resource-123`. Placeholders are illustrative; resolve IDs and input from observed reads.
748
-
749
- Result: `DashboardStyleTokenListResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
750
-
751
- Status on release: ran once on CLI 1.1.11 — Published PyPI CLI 1.1.11 / SDK 0.7.1 read of observed preset stone returned a redacted token payload. Bounded to one preset and redacted semantics; not Full. Dashboard sweep 2026-09-18 on release observed cli_error: HTTP 200 but result is tokens='***REDACTED…
752
-
753
683
  ### `dashboard.suggestion.list`
754
684
 
755
685
  Run: `mammoth dashboard suggestion list`. Exact input fields: `mammoth schema get dashboard.suggestion.list`.
@@ -132,6 +132,26 @@ Result: `DatasetGetResult`; mutation `read`, confirmation `none`, wait policy `n
132
132
 
133
133
  Status on release: ran once on CLI 2.0.18 — golden-data check 2026-09-19: exit 0 on release with CLI 2.0.18. Single invocation only.
134
134
 
135
+ ### `dataset.interpretation.confirm`
136
+
137
+ Run: `mammoth dataset interpretation confirm`. Exact input fields: `mammoth schema get dataset.interpretation.confirm`.
138
+
139
+ Example: `mammoth dataset interpretation confirm 123`. Placeholders are illustrative; resolve IDs and input from observed reads.
140
+
141
+ Result: `DatasetInterpretationConfirmResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
142
+
143
+ Status on release: untried; no live run recorded.
144
+
145
+ ### `dataset.interpretation.preview`
146
+
147
+ Run: `mammoth dataset interpretation preview`. Exact input fields: `mammoth schema get dataset.interpretation.preview`.
148
+
149
+ Example: `mammoth dataset interpretation preview 123`. Placeholders are illustrative; resolve IDs and input from observed reads.
150
+
151
+ Result: `DatasetInterpretationPreviewResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
152
+
153
+ Status on release: untried; no live run recorded.
154
+
135
155
  ### `dataset.list`
136
156
 
137
157
  Run: `mammoth dataset list`. Exact input fields: `mammoth schema get dataset.list`.
@@ -6,7 +6,9 @@ Every command returns the standard JSON envelope. On nonzero exit, read the erro
6
6
 
7
7
  Run: `mammoth external-key create`. Exact input fields: `mammoth schema get external-key.create`.
8
8
 
9
- Example: `mammoth external-key create --input '{"key_type": "open_ai", "key_name": "Revenue report", "secure_key": "sample"}'`. Illustrative only: append `--yes --confirm <EXACT_TARGET>` after observing the target.
9
+ Example: `mammoth external-key create --input /private/path/request.json`. Illustrative only: append `--yes --confirm <EXACT_TARGET>` after observing the target.
10
+
11
+ Secret fields: pass the body as `--input FILE` (mode 0600); never inline.
10
12
 
11
13
  Result: `ExternalKeyCreateResult`; mutation `high_impact`, confirmation `confirm_target`, wait policy `not_async`.
12
14
 
@@ -26,7 +26,7 @@ Status on release: ran once on CLI 2.0.15 — re-verification 2026-09-18: exit 0
26
26
 
27
27
  Run: `mammoth project check`. Exact input fields: `mammoth schema get project.check`.
28
28
 
29
- Example: `mammoth project check 123`. Placeholders are illustrative; resolve IDs and input from observed reads.
29
+ Example: `mammoth project check 123 456`. Placeholders are illustrative; resolve IDs and input from observed reads.
30
30
 
31
31
  Result: `ProjectCheckResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
32
32
 
@@ -252,6 +252,16 @@ Result: `ViewDataGetResult`; mutation `read`, confirmation `none`, wait policy `
252
252
 
253
253
  Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Paged reads (limit up to 500) used for every value check; envelope data.data rows keyed by display name. Single invocation only.
254
254
 
255
+ ### `view.data.profile`
256
+
257
+ Run: `mammoth view data profile`. Exact input fields: `mammoth schema get view.data.profile`.
258
+
259
+ Example: `mammoth view data profile 123 --input '{"target": "Churn"}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
260
+
261
+ Result: `ViewDataProfileResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
262
+
263
+ Status on release: untried; no live run recorded.
264
+
255
265
  ### `view.data.query`
256
266
 
257
267
  Run: `mammoth view data query`. Exact input fields: `mammoth schema get view.data.query`.
@@ -138,7 +138,7 @@ Status on release: untried; no live run recorded.
138
138
 
139
139
  Run: `mammoth workspace user add`. Exact input fields: `mammoth schema get workspace.user.add`.
140
140
 
141
- Example: `mammoth workspace user add --yes --input '{"email_ids": ["analyst@example.com"]}'`. Illustrative only: append `--yes` after observing an owned target.
141
+ Example: `mammoth workspace user add --input '{"email_ids": ["analyst@example.com"]}' --yes`. Illustrative only: append `--yes` after observing an owned target.
142
142
 
143
143
  Result: `WorkspaceUserAddResult`; mutation `benign_mutation`, confirmation `yes_always`, wait policy `not_async`.
144
144
 
@@ -3,8 +3,11 @@
3
3
  `dashboard create` (the legacy AI-generation engine) does not exist as a
4
4
  command: it has no handler in current apiv2 (always 404s; historically HTTP
5
5
  409 `4DASH012 DASHBOARD_LEGACY_CREATION_RETIRED`). Build a board from one
6
- sentence with `v3 generate`, and change it with `chat edit`; author a canvas by
7
- hand (`create-blank`, `canvas save`, `pages add`) only when asked to.
6
+ sentence with `v3 generate`, and change it with `chat edit`. Author or edit the
7
+ canvas yourself (`create-blank`, `canvas get` then `canvas save`, `pages add`)
8
+ for what a sentence cannot say exactly: units, hiding a built-in tile or
9
+ insight, an exact layout. `dashboard filter add` puts a filter control on a
10
+ board (below).
8
11
  `dashboard source list` is an observed blocker on release (see
9
12
  capabilities); verify the view binding with `dashboard get DASHBOARD_ID`
10
13
  (`data.sources`) instead.
@@ -19,6 +22,11 @@ mammoth dashboard get DASHBOARD_ID
19
22
  `chat edit` returns `changed` and a one-line `message`. Quote one number from
20
23
  the board before you report it done.
21
24
 
25
+ Before you say anything about a board that already exists (what a chart shows,
26
+ its numbers, the period it covers), run `dashboard get DASHBOARD_ID`: its
27
+ `values` carry every KPI card's and tile's number and the `period` it counts.
28
+ Answer from those, never from an earlier turn.
29
+
22
30
  Discover page/widget/publish routes and verify the binding, draft/published
23
31
  data and terminal jobs. Use only returned IDs and schema confirmation policy;
24
32
  do not invent dashboard JSON or opaque task specs.
@@ -77,6 +85,62 @@ names it. A new page that got no charts is removed, and
77
85
  `data.chart_check.removed_pages` lists it. Add a chart of a different kind
78
86
  (`hbar`, `line`, `table`) for that page.
79
87
 
88
+ ## "Per region", "per month", "for each X": one board and a filter control
89
+
90
+ A request for a board "per <dimension>" (per region, per month, per rep, by
91
+ status) is ONE board with a **filter control** on that column: the viewer picks
92
+ the value. Do not build a copy of the board for each value. Build the board
93
+ once, then add the control:
94
+
95
+ ```bash
96
+ mammoth dashboard filter add DASHBOARD_ID --input '{"field": "Region"}'
97
+ mammoth dashboard filter list DASHBOARD_ID
98
+ mammoth dashboard filter remove DASHBOARD_ID --input '{"field": "Region"}'
99
+ ```
100
+
101
+ `field` is a column of the board's data. `control` is optional: leave it out
102
+ and the column's type picks one (a category gets a selection list, a number or
103
+ a date gets a range). Set it to choose: `dropdown`, `chips`, `multi` or
104
+ `search` for a category, `range` for a number or a date, `motion` for a date
105
+ that plays over time. `label` is the text the viewer sees, and `default` (a
106
+ list of values) is what is selected when the board opens:
107
+ `--input '{"field": "Region", "control": "dropdown", "label": "Region", "default": ["North"]}'`.
108
+ A second `add` on the same column replaces the first. The command refuses a
109
+ column the board does not have (and names the columns it has) and a control
110
+ the column's type cannot take. Its result carries the declared `filters` and a
111
+ `bake_job_id`; `dashboard filter list` reads them back. Say "per month" the same
112
+ way: a filter on the date column with `range`, or `dashboard chat edit` for a
113
+ chart that groups by month (`date_bucket`).
114
+
115
+ Build only the board you were asked for. If the user wants the board for one
116
+ region only, that is the control's `default`, not a second board.
117
+
118
+ ## Hide a built-in tile or insight
119
+
120
+ A board's built-in parts (Key insights, the KPI strip, the breakdown, trend and
121
+ table tiles) re-derive from the data, so they cannot be deleted; the product's
122
+ "Remove" hides them: it adds the tile's key to `hidden` on the page. Do the
123
+ same with `canvas save`: read the canvas, add the key to the page's `hidden`,
124
+ write it back.
125
+
126
+ ```bash
127
+ mammoth dashboard canvas get DASHBOARD_ID > canvas.json # data.canvas is the object to edit
128
+ # pages[0].hidden = ["summary"] Key insights tile
129
+ # ["kpis"] the whole KPI strip
130
+ # ["breakdown", "mix", "secondary", "trend", "table"] the other built-in tiles
131
+ # canvas.hidden (no pages) is the same list on a canvas without pages
132
+ mammoth dashboard canvas save DASHBOARD_ID --input '{"body": {"params": {"canvas": <edited data.canvas>}}}'
133
+ mammoth job wait BAKE_JOB_ID # data.bake_job_id from the save
134
+ ```
135
+
136
+ `hidden` sits on the page you mean (`pages[i]`, the page the tile is on), not
137
+ on the canvas root, when the canvas has `pages`. Keep the keys already in the
138
+ list. A single KPI card is removed by taking its entry out of
139
+ `pages[i].focus.kpis`. To hide one insight rather than the whole tile, put its
140
+ tag in `insights.hide` (tags: `leader`, `momentum`, `gap`, `laggard`,
141
+ `concentration`, `secondary`, `peak`, `quality`, `spread`). Read the board back
142
+ with `dashboard canvas get` and check the key is in `hidden`.
143
+
80
144
  ## Put the money on the board
81
145
 
82
146
  If the data has money (a price, an amount, revenue or cost), the dashboard
@@ -10,6 +10,7 @@ SDK method named by the command's reviewed manifest ``sdk_symbol``.
10
10
 
11
11
  from __future__ import annotations
12
12
 
13
+ from collections.abc import Callable
13
14
  from pathlib import Path
14
15
  from typing import Any, Literal, cast
15
16
 
@@ -39,7 +40,14 @@ from mammoth_cli.runtime.confirm import (
39
40
  from mammoth_cli.runtime.invocation import Invocation
40
41
  from mammoth_cli.runtime.session import open_service, require_project, resolved_project
41
42
  from mammoth_cli.services.argspec import arg_spec
43
+ from mammoth_cli.services.board_values import board_values, dashboard_link
42
44
  from mammoth_cli.services.command_contract import bind_command_inputs
45
+ from mammoth_cli.services.dashboard_filters import (
46
+ check_filter,
47
+ declared,
48
+ with_filter,
49
+ without_filter,
50
+ )
43
51
  from mammoth_cli.services.dashboard_pages import check_added_pages
44
52
  from mammoth_cli.services.dashboard_review import (
45
53
  CANVAS_GET,
@@ -368,10 +376,16 @@ def dashboard_tags_merge(invocation: Invocation) -> HandlerResult:
368
376
 
369
377
 
370
378
  def dashboard_get(invocation: Invocation) -> HandlerResult:
371
- """Get one dashboard by id."""
379
+ """Get one dashboard by id, with each KPI card's and tile's number and period.
380
+
381
+ A question about an existing board is answered from what it shows, so the
382
+ read carries the numbers, not only the definitions (UQA-RT10-02).
383
+ """
372
384
  dashboard_id = _require_int_positional(invocation, "dashboard id")
373
385
  with open_service(invocation) as (service, auth):
374
386
  data = service.call(_symbol(invocation), dashboard_id=dashboard_id)
387
+ if not invocation.readback:
388
+ data = _with_board_values(service, auth, {"dashboard_id": dashboard_id}, data)
375
389
  return data, _meta(invocation, auth.workspace_id)
376
390
 
377
391
 
@@ -670,9 +684,38 @@ def generated_dashboard(invocation: Invocation) -> HandlerResult:
670
684
  data = check_added_pages(service, positionals["dashboard_id"], requested, data)
671
685
  if invocation.command_id in _REVIEWED_COMMANDS:
672
686
  data = _with_deliverable_check(invocation, service, auth, positionals, data)
687
+ if invocation.command_id in _VALUED_COMMANDS:
688
+ data = _with_board_values(service, auth, positionals, data)
673
689
  return data, _meta(invocation, auth.workspace_id)
674
690
 
675
691
 
692
+ #: Board-building steps whose result carries the evaluated card/tile numbers.
693
+ _VALUED_COMMANDS = frozenset({"dashboard.v3.generate", "dashboard.chat.edit"})
694
+
695
+
696
+ def _with_board_values(service: Any, auth: Any, positionals: dict[str, Any], data: Any) -> Any:
697
+ """Add ``dashboard_link`` and each KPI card's and tile's evaluated number.
698
+
699
+ The result of a build/edit is definitions; the agent must see the numbers
700
+ it is about to report (a rate that reads 21.9% where the data says 14.9%).
701
+ """
702
+ data = _dump_model(data)
703
+ if not isinstance(data, dict):
704
+ return data
705
+ dashboard_id = positionals.get("dashboard_id") or data.get("id") or data.get("dashboard_id")
706
+ if not isinstance(dashboard_id, int):
707
+ return {**data, "values": {"unavailable": "the result names no dashboard id"}}
708
+ return {
709
+ **data,
710
+ "dashboard_link": dashboard_link(auth.base_url, auth.workspace_id, dashboard_id),
711
+ "values": board_values(service, dashboard_id),
712
+ }
713
+
714
+
715
+ def _dump_model(value: Any) -> Any:
716
+ return value.model_dump(mode="json") if hasattr(value, "model_dump") else value
717
+
718
+
676
719
  #: Authoring steps whose result carries ``deliverable_check``.
677
720
  _REVIEWED_COMMANDS = frozenset(
678
721
  {"dashboard.create-blank", "dashboard.canvas.save", "dashboard.pages.add"}
@@ -741,6 +784,62 @@ def _with_deliverable_check(
741
784
  return data
742
785
 
743
786
 
787
+ _CANVAS_SAVE = "mammoth.api.dashboards.DashboardsAPI.canvas_save"
788
+ _FILTER_KEYS = ("field", "control", "label", "default")
789
+
790
+
791
+ def _edit_filters(
792
+ invocation: Invocation, edit: Callable[[dict[str, Any]], dict[str, Any]]
793
+ ) -> HandlerResult:
794
+ """Read the draft canvas, apply ``edit`` to the read, save it, and return the filters."""
795
+ dashboard_id = _require_int_positional(invocation, "dashboard id")
796
+ with open_service(invocation) as (service, auth):
797
+ current = _dump_model(service.call(CANVAS_GET, dashboard_id=dashboard_id))
798
+ canvas = edit(current)
799
+ saved = _dump_model(
800
+ service.call(
801
+ _CANVAS_SAVE,
802
+ dashboard_id=dashboard_id,
803
+ body={"params": {"canvas": canvas, "base_sequence": current["meta"]["sequence"]}},
804
+ )
805
+ )
806
+ result = {
807
+ "dashboard_id": dashboard_id,
808
+ "filters": declared(canvas),
809
+ "sequence": saved.get("sequence"),
810
+ "bake_job_id": saved.get("bake_job_id"),
811
+ }
812
+ return result, _meta(invocation, auth.workspace_id)
813
+
814
+
815
+ def dashboard_filter_add(invocation: Invocation) -> HandlerResult:
816
+ """Add (or replace) the filter control on one column of a board."""
817
+ document = _bound_document(invocation)
818
+ _require_field(document, "field")
819
+ entry = {key: document[key] for key in _FILTER_KEYS if document.get(key) is not None}
820
+
821
+ def edit(current: dict[str, Any]) -> dict[str, Any]:
822
+ check_filter(current, entry)
823
+ return with_filter(current["canvas"], entry)
824
+
825
+ return _edit_filters(invocation, edit)
826
+
827
+
828
+ def dashboard_filter_remove(invocation: Invocation) -> HandlerResult:
829
+ """Remove the filter control on one column of a board."""
830
+ field = str(_require_field(_bound_document(invocation), "field"))
831
+ return _edit_filters(invocation, lambda current: without_filter(current["canvas"], field))
832
+
833
+
834
+ def dashboard_filter_list(invocation: Invocation) -> HandlerResult:
835
+ """List the filter controls a board declares."""
836
+ dashboard_id = _require_int_positional(invocation, "dashboard id")
837
+ with open_service(invocation) as (service, auth):
838
+ current = _dump_model(service.call(CANVAS_GET, dashboard_id=dashboard_id))
839
+ result = {"dashboard_id": dashboard_id, "filters": declared(current["canvas"])}
840
+ return result, _meta(invocation, auth.workspace_id)
841
+
842
+
744
843
  def dashboard_assess_twb(invocation: Invocation) -> HandlerResult:
745
844
  """Assess a local Tableau workbook through the SDK multipart seam."""
746
845
  file_path = _require_str_positional(invocation, "file")