mammoth-cli 2.0.87__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 (247) hide show
  1. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/PKG-INFO +1 -1
  2. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +3 -2
  4. mammoth_cli-2.0.88/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +103 -0
  5. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +30 -100
  6. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +66 -2
  7. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/dashboard.py +70 -1
  8. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/registry.py +3 -0
  9. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/view_profile.py +32 -17
  10. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/runtime/invocation.py +3 -0
  11. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/runtime/state.py +1 -0
  12. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/command_contract.py +22 -0
  13. mammoth_cli-2.0.88/mammoth_cli/services/dashboard_filters.py +81 -0
  14. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/data_profile.py +38 -3
  15. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/pyproject.toml +1 -1
  16. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/dashboard.yaml +128 -1
  17. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/edits-target.source.yaml +2 -0
  18. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/.gitignore +0 -0
  19. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/LICENSE +0 -0
  20. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/README.md +0 -0
  21. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/__main__.py +0 -0
  22. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/app.py +0 -0
  23. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +0 -0
  24. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
  25. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  26. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
  27. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
  28. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  29. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  30. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  31. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  32. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  33. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  34. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  35. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  36. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  37. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  38. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
  39. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  40. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  41. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  42. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  43. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  44. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  45. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
  46. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  47. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  48. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  49. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  50. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  51. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  52. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  53. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  54. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  55. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  56. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
  57. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  58. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  59. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  60. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  61. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  62. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  63. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  64. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  65. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  66. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  67. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  68. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
  69. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +0 -0
  70. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  71. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  72. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  73. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  74. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
  75. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  76. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  77. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  78. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  79. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  80. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
  81. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  82. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  83. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  84. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  85. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
  86. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
  87. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  88. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  89. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  90. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  91. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  92. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
  93. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/__init__.py +0 -0
  94. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/activity.py +0 -0
  95. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/addon.py +0 -0
  96. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/agent.py +0 -0
  97. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/ai.py +0 -0
  98. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/annotation.py +0 -0
  99. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/auth.py +0 -0
  100. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/automation.py +0 -0
  101. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/batch.py +0 -0
  102. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/billing.py +0 -0
  103. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/browse.py +0 -0
  104. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/calc.py +0 -0
  105. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/capability.py +0 -0
  106. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/client_app.py +0 -0
  107. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/completion.py +0 -0
  108. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/config.py +0 -0
  109. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/connector.py +0 -0
  110. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/context.py +0 -0
  111. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/data_app.py +0 -0
  112. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/dataset.py +0 -0
  113. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/doctor.py +0 -0
  114. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/external_key.py +0 -0
  115. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/file.py +0 -0
  116. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/folder.py +0 -0
  117. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/job.py +0 -0
  118. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/notification.py +0 -0
  119. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/parameter.py +0 -0
  120. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/project.py +0 -0
  121. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/report.py +0 -0
  122. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/schedule.py +0 -0
  123. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/schema.py +0 -0
  124. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/skill.py +0 -0
  125. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/snippet.py +0 -0
  126. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/support.py +0 -0
  127. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/template.py +0 -0
  128. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/trash.py +0 -0
  129. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/upgrade.py +0 -0
  130. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/user.py +0 -0
  131. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/view.py +0 -0
  132. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/view_ops.py +0 -0
  133. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/webhook.py +0 -0
  134. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/workflow.py +0 -0
  135. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/commands/workspace.py +0 -0
  136. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/context/__init__.py +0 -0
  137. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/context/credentials.py +0 -0
  138. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/context/endpoint.py +0 -0
  139. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/context/profiles.py +0 -0
  140. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/context/resolver.py +0 -0
  141. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/contracts/__init__.py +0 -0
  142. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/contracts/auth.py +0 -0
  143. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/embed.py +0 -0
  144. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/errors/__init__.py +0 -0
  145. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/errors/envelope.py +0 -0
  146. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/manifest/__init__.py +0 -0
  147. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/manifest/loader.py +0 -0
  148. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/messages/__init__.py +0 -0
  149. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/output/__init__.py +0 -0
  150. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/output/envelope.py +0 -0
  151. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/output/normalize.py +0 -0
  152. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/output/policy.py +0 -0
  153. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/output/progress.py +0 -0
  154. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/output/render.py +0 -0
  155. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/py.typed +0 -0
  156. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/runtime/__init__.py +0 -0
  157. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/runtime/confirm.py +0 -0
  158. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/runtime/dataset_health.py +0 -0
  159. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/runtime/dryrun.py +0 -0
  160. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/runtime/dryrun_targets.py +0 -0
  161. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/runtime/embedded.py +0 -0
  162. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/runtime/executor.py +0 -0
  163. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/runtime/input_loader.py +0 -0
  164. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/runtime/new_data.py +0 -0
  165. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/runtime/options.py +0 -0
  166. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/runtime/parents.py +0 -0
  167. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/runtime/runlog.py +0 -0
  168. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/runtime/session.py +0 -0
  169. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/runtime/strict.py +0 -0
  170. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/runtime/updates.py +0 -0
  171. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/runtime/validate.py +0 -0
  172. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/runtime/verify.py +0 -0
  173. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/__init__.py +0 -0
  174. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/argspec.py +0 -0
  175. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/board_values.py +0 -0
  176. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/coerce.py +0 -0
  177. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/conditions.py +0 -0
  178. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/dashboard_pages.py +0 -0
  179. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/dashboard_review.py +0 -0
  180. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/data_quality.py +0 -0
  181. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/dispatch.py +0 -0
  182. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/factory.py +0 -0
  183. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/input_fields.py +0 -0
  184. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/listing.py +0 -0
  185. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/mapping.py +0 -0
  186. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/openapi_types.py +0 -0
  187. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/positionals.py +0 -0
  188. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/protocol.py +0 -0
  189. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/read_queries.py +0 -0
  190. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/sdk_service.py +0 -0
  191. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/stored_stats.py +0 -0
  192. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/testing.py +0 -0
  193. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/text_dates.py +0 -0
  194. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/services/type_system.py +0 -0
  195. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/skills/__init__.py +0 -0
  196. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/skills/installer.py +0 -0
  197. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/skills/steering.py +0 -0
  198. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/mammoth_cli/testing.py +0 -0
  199. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/activity.yaml +0 -0
  200. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/addon.yaml +0 -0
  201. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/agent.yaml +0 -0
  202. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/ai.yaml +0 -0
  203. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/annotation.yaml +0 -0
  204. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/auth.yaml +0 -0
  205. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/automation.yaml +0 -0
  206. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/batch.yaml +0 -0
  207. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/billing.yaml +0 -0
  208. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/browse.yaml +0 -0
  209. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/calc.yaml +0 -0
  210. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/capability.yaml +0 -0
  211. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/client-app.yaml +0 -0
  212. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/completion.yaml +0 -0
  213. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/config.yaml +0 -0
  214. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/connector.yaml +0 -0
  215. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/context.yaml +0 -0
  216. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/data-app.yaml +0 -0
  217. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/dataset.yaml +0 -0
  218. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/doctor.yaml +0 -0
  219. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/external-key.yaml +0 -0
  220. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/file.yaml +0 -0
  221. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/folder.yaml +0 -0
  222. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/job.yaml +0 -0
  223. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/log.yaml +0 -0
  224. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/notification.yaml +0 -0
  225. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/parameter.yaml +0 -0
  226. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/project.yaml +0 -0
  227. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/report.yaml +0 -0
  228. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/schedule.yaml +0 -0
  229. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/schema.yaml +0 -0
  230. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/skill.yaml +0 -0
  231. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/snippet.yaml +0 -0
  232. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/support.yaml +0 -0
  233. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/template.yaml +0 -0
  234. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/trash.yaml +0 -0
  235. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/upgrade.yaml +0 -0
  236. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/user.yaml +0 -0
  237. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/version.yaml +0 -0
  238. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/view.yaml +0 -0
  239. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/webhook.yaml +0 -0
  240. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/workflow.yaml +0 -0
  241. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/commands/workspace.yaml +0 -0
  242. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/openapi-operations.yaml +0 -0
  243. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/schema-v1.json +0 -0
  244. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/sdk-catalog.source.yaml +0 -0
  245. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/manifests/sdk-methods.yaml +0 -0
  246. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/openapi/metadata.json +0 -0
  247. {mammoth_cli-2.0.87 → mammoth_cli-2.0.88}/spec/openapi/openapi.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mammoth-cli
3
- Version: 2.0.87
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
@@ -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.87"
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 576; 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,7 +22,8 @@ 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
28
  - [dataset](commands/dataset.md) — 20 published commands
28
29
  - [doctor](commands/doctor.md) — 1 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`.
@@ -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
 
@@ -41,6 +42,12 @@ from mammoth_cli.runtime.session import open_service, require_project, resolved_
41
42
  from mammoth_cli.services.argspec import arg_spec
42
43
  from mammoth_cli.services.board_values import board_values, dashboard_link
43
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
+ )
44
51
  from mammoth_cli.services.dashboard_pages import check_added_pages
45
52
  from mammoth_cli.services.dashboard_review import (
46
53
  CANVAS_GET,
@@ -369,10 +376,16 @@ def dashboard_tags_merge(invocation: Invocation) -> HandlerResult:
369
376
 
370
377
 
371
378
  def dashboard_get(invocation: Invocation) -> HandlerResult:
372
- """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
+ """
373
384
  dashboard_id = _require_int_positional(invocation, "dashboard id")
374
385
  with open_service(invocation) as (service, auth):
375
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)
376
389
  return data, _meta(invocation, auth.workspace_id)
377
390
 
378
391
 
@@ -771,6 +784,62 @@ def _with_deliverable_check(
771
784
  return data
772
785
 
773
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
+
774
843
  def dashboard_assess_twb(invocation: Invocation) -> HandlerResult:
775
844
  """Assess a local Tableau workbook through the SDK multipart seam."""
776
845
  file_path = _require_str_positional(invocation, "file")
@@ -404,6 +404,9 @@ HANDLERS: dict[str, Handler] = {
404
404
  "dashboard.data.published": dashboard_cmd.dashboard_data_published,
405
405
  "dashboard.delete": dashboard_cmd.dashboard_delete,
406
406
  "dashboard.get": dashboard_cmd.dashboard_get,
407
+ "dashboard.filter.add": dashboard_cmd.dashboard_filter_add,
408
+ "dashboard.filter.list": dashboard_cmd.dashboard_filter_list,
409
+ "dashboard.filter.remove": dashboard_cmd.dashboard_filter_remove,
407
410
  "dashboard.get-by-url": dashboard_cmd.dashboard_get_by_url,
408
411
  "dashboard.job-by-url": dashboard_cmd.dashboard_job_by_url,
409
412
  "dashboard.list": dashboard_cmd.dashboard_list,
@@ -361,32 +361,47 @@ def _paged_columns(details: dict[str, dict[str, Any]], limit: int) -> dict[str,
361
361
  def _variant_report(
362
362
  scope: _Scope, names: list[str], tables: dict[str, dict[Any, int] | None]
363
363
  ) -> list[dict[str, Any]]:
364
- """Per TEXT column, spellings of one value (Ltd/Limited, case, punctuation) and the fix."""
364
+ """Per TEXT column, spellings of one value (Ltd/Limited, case, punctuation) and the fix.
365
+
366
+ ``likely_groups`` are names that differ only by a legal form or a connector
367
+ (``TECNOLAB`` / ``TECNOLAB S.A.``): proposed, never merged without a yes.
368
+ """
365
369
  report: list[dict[str, Any]] = []
366
370
  for name in names:
367
371
  table = tables.get(name)
368
372
  if table is None or scope.types.get(name) != "TEXT":
369
373
  continue
370
- groups = dp.variant_groups({k: v for k, v in table.items() if isinstance(k, str)})
371
- if not groups:
374
+ texts = {k: v for k, v in table.items() if isinstance(k, str)}
375
+ groups, likely = dp.variant_groups(texts), dp.likely_groups(texts)
376
+ if not groups and not likely:
372
377
  continue
373
- shown = groups[:_MAX_VARIANT_GROUPS]
374
- body = {**dp.bulk_replace_input(name, shown), "dataset_id": scope.dataset_id}
375
- report.append(
376
- {
377
- "column": name,
378
- "groups_total": len(groups),
379
- "groups": shown,
380
- "bulk_replace": body,
381
- "command": (
382
- f"mammoth view transform bulk-replace {scope.view_id} "
383
- f"--input {shlex.quote(json.dumps(body))}"
384
- ),
385
- }
386
- )
378
+ entry: dict[str, Any] = {"column": name, **_merge_fix(scope, name, groups)}
379
+ if likely:
380
+ entry["likely_groups"] = {"note": _LIKELY_NOTE, **_merge_fix(scope, name, likely)}
381
+ report.append(entry)
387
382
  return report
388
383
 
389
384
 
385
+ _LIKELY_NOTE = (
386
+ "Same name apart from a legal form or a connector word; confirm with the user "
387
+ "before merging (SRL and SA can be two companies)."
388
+ )
389
+
390
+
391
+ def _merge_fix(scope: _Scope, column: str, groups: list[dict[str, Any]]) -> dict[str, Any]:
392
+ """The groups shown and the bulk-replace that merges them."""
393
+ shown = groups[:_MAX_VARIANT_GROUPS]
394
+ fix: dict[str, Any] = {"groups_total": len(groups), "groups": shown}
395
+ if not shown:
396
+ return fix
397
+ body = {**dp.bulk_replace_input(column, shown), "dataset_id": scope.dataset_id}
398
+ command = (
399
+ f"mammoth view transform bulk-replace {scope.view_id} "
400
+ f"--input {shlex.quote(json.dumps(body))}"
401
+ )
402
+ return {**fix, "bulk_replace": body, "command": command}
403
+
404
+
390
405
  # -- target vs column ----------------------------------------------------------------------
391
406
 
392
407
 
@@ -76,6 +76,9 @@ class Invocation:
76
76
  # handler so its verify and readback reads address the view directly
77
77
  # instead of walking every dataset to find it.
78
78
  known_dataset_id: int | None = field(default=None, repr=False, compare=False)
79
+ # Set on the read a write's ``state`` block issues: that read confirms the
80
+ # write, so a command's extra evaluation (a board's numbers) is skipped.
81
+ readback: bool = field(default=False, repr=False, compare=False)
79
82
  _prepared_input: object = field(
80
83
  default=_UNINITIALIZED_INPUT, init=False, repr=False, compare=False
81
84
  )
@@ -196,6 +196,7 @@ def _read_invocation(command_id: str, resolved_ids: dict[str, Any], base: Invoca
196
196
  no_input=True,
197
197
  positionals=positionals,
198
198
  extra_args=extra_args,
199
+ readback=True,
199
200
  )
200
201
  object.__setattr__(invocation, "_prepared_input", document or None)
201
202
  return invocation
@@ -351,6 +351,22 @@ _VIEW_DATA_PROFILE_FIELDS = (
351
351
  FieldSpec("limit", required=False, annotation=int, default=50),
352
352
  )
353
353
 
354
+ # dashboard.filter.add/remove are CLI composites over canvas get + canvas save
355
+ # (DashboardsAPI.canvas_save is named in the manifest as the SDK anchor); the
356
+ # canvas body is built by the handler, so the document carries only the filter.
357
+ _DASHBOARD_FILTER_ADD_FIELDS = (
358
+ FieldSpec("field", required=True, annotation=str),
359
+ FieldSpec(
360
+ "control",
361
+ required=False,
362
+ annotation=Literal["multi", "dropdown", "chips", "search", "range", "motion"] | None,
363
+ default=None,
364
+ ),
365
+ FieldSpec("label", required=False, annotation=str | None, default=None),
366
+ FieldSpec("default", required=False, annotation=list[str] | None, default=None),
367
+ )
368
+ _DASHBOARD_FILTER_REMOVE_FIELDS = (FieldSpec("field", required=True, annotation=str),)
369
+
354
370
  # The remaining S1 commands are intentionally closed zero-input commands. A
355
371
  # command may still receive ordinary positional/context values; those are
356
372
  # represented by ``positionals`` and never become structured-input keys.
@@ -725,6 +741,12 @@ def resolve_command_contract(command_id: str) -> ResolvedCommandContract | None:
725
741
  special_fields = _VIEW_DATA_COMPARE_FIELDS
726
742
  elif command_id == "view.data.profile":
727
743
  special_fields = _VIEW_DATA_PROFILE_FIELDS
744
+ elif command_id == "dashboard.filter.add":
745
+ special_fields = _DASHBOARD_FILTER_ADD_FIELDS
746
+ elif command_id == "dashboard.filter.remove":
747
+ special_fields = _DASHBOARD_FILTER_REMOVE_FIELDS
748
+ elif command_id == "dashboard.filter.list":
749
+ special_fields = ()
728
750
  local_fields = _LOCAL_CONTRACT_FIELDS.get(command_id, ()) if is_local else None
729
751
  fields = tuple(
730
752
  field