mammoth-cli 2.0.86__tar.gz → 2.0.87__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 (246) hide show
  1. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/PKG-INFO +2 -2
  2. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +3 -3
  4. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +20 -0
  5. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +3 -1
  6. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +1 -1
  7. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +10 -0
  8. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +1 -1
  9. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/dashboard.py +30 -0
  10. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/dataset.py +63 -1
  11. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/job.py +21 -1
  12. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/project.py +36 -10
  13. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/registry.py +4 -0
  14. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/schema.py +34 -4
  15. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/view.py +476 -64
  16. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/view_ops.py +8 -1
  17. mammoth_cli-2.0.87/mammoth_cli/commands/view_profile.py +533 -0
  18. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/output/envelope.py +6 -0
  19. mammoth_cli-2.0.87/mammoth_cli/runtime/dataset_health.py +112 -0
  20. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/runtime/dryrun.py +4 -2
  21. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/runtime/executor.py +7 -1
  22. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/runtime/invocation.py +7 -3
  23. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/runtime/state.py +69 -3
  24. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/runtime/verify.py +31 -4
  25. mammoth_cli-2.0.87/mammoth_cli/services/board_values.py +244 -0
  26. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/services/command_contract.py +28 -0
  27. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/services/dashboard_review.py +22 -7
  28. mammoth_cli-2.0.87/mammoth_cli/services/data_profile.py +254 -0
  29. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/services/input_fields.py +6 -0
  30. mammoth_cli-2.0.87/mammoth_cli/services/listing.py +271 -0
  31. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/services/positionals.py +17 -2
  32. mammoth_cli-2.0.87/mammoth_cli/services/read_queries.py +465 -0
  33. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/services/sdk_service.py +4 -4
  34. mammoth_cli-2.0.87/mammoth_cli/services/stored_stats.py +103 -0
  35. mammoth_cli-2.0.87/mammoth_cli/services/text_dates.py +303 -0
  36. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/pyproject.toml +2 -2
  37. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/addon.yaml +6 -0
  38. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/agent.yaml +3 -0
  39. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/ai.yaml +3 -0
  40. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/annotation.yaml +4 -0
  41. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/auth.yaml +2 -0
  42. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/automation.yaml +5 -0
  43. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/batch.yaml +5 -0
  44. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/billing.yaml +12 -0
  45. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/client-app.yaml +3 -0
  46. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/completion.yaml +1 -0
  47. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/config.yaml +1 -0
  48. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/connector.yaml +10 -0
  49. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/context.yaml +2 -0
  50. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/dashboard.yaml +78 -3
  51. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/data-app.yaml +6 -0
  52. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/dataset.yaml +104 -1
  53. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/external-key.yaml +3 -2
  54. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/file.yaml +7 -0
  55. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/folder.yaml +6 -0
  56. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/notification.yaml +4 -0
  57. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/parameter.yaml +10 -0
  58. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/project.yaml +21 -2
  59. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/schedule.yaml +3 -0
  60. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/skill.yaml +4 -0
  61. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/snippet.yaml +5 -0
  62. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/support.yaml +32 -0
  63. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/template.yaml +3 -0
  64. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/trash.yaml +2 -0
  65. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/upgrade.yaml +1 -0
  66. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/user.yaml +6 -0
  67. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/view.yaml +170 -3
  68. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/webhook.yaml +5 -0
  69. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/workflow.yaml +10 -0
  70. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/workspace.yaml +14 -1
  71. mammoth_cli-2.0.87/spec/manifests/edits-target.source.yaml +234 -0
  72. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/openapi-operations.yaml +39 -0
  73. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/schema-v1.json +5 -0
  74. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/sdk-catalog.source.yaml +14 -0
  75. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/sdk-methods.yaml +41 -5
  76. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/openapi/metadata.json +4 -4
  77. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/openapi/openapi.json +1 -1
  78. mammoth_cli-2.0.86/mammoth_cli/runtime/dataset_health.py +0 -62
  79. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/.gitignore +0 -0
  80. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/LICENSE +0 -0
  81. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/README.md +0 -0
  82. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/__main__.py +0 -0
  83. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/app.py +0 -0
  84. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +0 -0
  85. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
  86. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  87. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
  88. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
  89. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  90. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  91. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  92. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  93. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  94. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  95. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  96. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  97. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  98. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  99. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
  100. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  101. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  102. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  103. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  104. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  105. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  106. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
  107. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
  108. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  109. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  110. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  111. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  112. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  113. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  114. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  115. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  116. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  117. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  118. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  119. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  120. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  121. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  122. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  123. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  124. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  125. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  126. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  127. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
  128. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  129. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  130. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  131. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
  132. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  133. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  134. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  135. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  136. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  137. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
  138. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
  139. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  140. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  141. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  142. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  143. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
  144. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
  145. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  146. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  147. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  148. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  149. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  150. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
  151. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/__init__.py +0 -0
  152. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/activity.py +0 -0
  153. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/addon.py +0 -0
  154. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/agent.py +0 -0
  155. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/ai.py +0 -0
  156. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/annotation.py +0 -0
  157. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/auth.py +0 -0
  158. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/automation.py +0 -0
  159. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/batch.py +0 -0
  160. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/billing.py +0 -0
  161. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/browse.py +0 -0
  162. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/calc.py +0 -0
  163. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/capability.py +0 -0
  164. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/client_app.py +0 -0
  165. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/completion.py +0 -0
  166. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/config.py +0 -0
  167. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/connector.py +0 -0
  168. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/context.py +0 -0
  169. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/data_app.py +0 -0
  170. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/doctor.py +0 -0
  171. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/external_key.py +0 -0
  172. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/file.py +0 -0
  173. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/folder.py +0 -0
  174. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/notification.py +0 -0
  175. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/parameter.py +0 -0
  176. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/report.py +0 -0
  177. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/schedule.py +0 -0
  178. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/skill.py +0 -0
  179. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/snippet.py +0 -0
  180. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/support.py +0 -0
  181. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/template.py +0 -0
  182. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/trash.py +0 -0
  183. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/upgrade.py +0 -0
  184. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/user.py +0 -0
  185. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/webhook.py +0 -0
  186. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/workflow.py +0 -0
  187. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/commands/workspace.py +0 -0
  188. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/context/__init__.py +0 -0
  189. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/context/credentials.py +0 -0
  190. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/context/endpoint.py +0 -0
  191. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/context/profiles.py +0 -0
  192. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/context/resolver.py +0 -0
  193. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/contracts/__init__.py +0 -0
  194. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/contracts/auth.py +0 -0
  195. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/embed.py +0 -0
  196. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/errors/__init__.py +0 -0
  197. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/errors/envelope.py +0 -0
  198. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/manifest/__init__.py +0 -0
  199. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/manifest/loader.py +0 -0
  200. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/messages/__init__.py +0 -0
  201. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/output/__init__.py +0 -0
  202. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/output/normalize.py +0 -0
  203. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/output/policy.py +0 -0
  204. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/output/progress.py +0 -0
  205. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/output/render.py +0 -0
  206. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/py.typed +0 -0
  207. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/runtime/__init__.py +0 -0
  208. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/runtime/confirm.py +0 -0
  209. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/runtime/dryrun_targets.py +0 -0
  210. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/runtime/embedded.py +0 -0
  211. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/runtime/input_loader.py +0 -0
  212. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/runtime/new_data.py +0 -0
  213. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/runtime/options.py +0 -0
  214. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/runtime/parents.py +0 -0
  215. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/runtime/runlog.py +0 -0
  216. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/runtime/session.py +0 -0
  217. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/runtime/strict.py +0 -0
  218. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/runtime/updates.py +0 -0
  219. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/runtime/validate.py +0 -0
  220. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/services/__init__.py +0 -0
  221. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/services/argspec.py +0 -0
  222. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/services/coerce.py +0 -0
  223. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/services/conditions.py +0 -0
  224. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/services/dashboard_pages.py +0 -0
  225. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/services/data_quality.py +0 -0
  226. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/services/dispatch.py +0 -0
  227. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/services/factory.py +0 -0
  228. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/services/mapping.py +0 -0
  229. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/services/openapi_types.py +0 -0
  230. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/services/protocol.py +0 -0
  231. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/services/testing.py +0 -0
  232. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/services/type_system.py +0 -0
  233. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/skills/__init__.py +0 -0
  234. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/skills/installer.py +0 -0
  235. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/skills/steering.py +0 -0
  236. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/mammoth_cli/testing.py +0 -0
  237. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/activity.yaml +0 -0
  238. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/browse.yaml +0 -0
  239. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/calc.yaml +0 -0
  240. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/capability.yaml +0 -0
  241. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/doctor.yaml +0 -0
  242. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/job.yaml +0 -0
  243. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/log.yaml +0 -0
  244. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/report.yaml +0 -0
  245. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/spec/manifests/commands/schema.yaml +0 -0
  246. {mammoth_cli-2.0.86 → mammoth_cli-2.0.87}/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.87
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.87"
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 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.
4
4
 
5
5
  Load only the applicable domain file:
6
6
 
@@ -24,7 +24,7 @@ Load only the applicable domain file:
24
24
  - [dashboard-qa](commands/dashboard-qa.md) — 13 published commands
25
25
  - [dashboard](commands/dashboard.md) — 100 published commands
26
26
  - [data-app](commands/data-app.md) — 12 published commands
27
- - [dataset](commands/dataset.md) — 18 published commands
27
+ - [dataset](commands/dataset.md) — 20 published commands
28
28
  - [doctor](commands/doctor.md) — 1 published commands
29
29
  - [external-key](commands/external-key.md) — 4 published commands
30
30
  - [file](commands/file.md) — 9 published commands
@@ -46,7 +46,7 @@ Load only the applicable domain file:
46
46
  - [user](commands/user.md) — 8 published commands
47
47
  - [version](commands/version.md) — 1 published commands
48
48
  - [view-transform](commands/view-transform.md) — 32 published commands
49
- - [view](commands/view.md) — 89 published commands
49
+ - [view](commands/view.md) — 90 published commands
50
50
  - [webhook](commands/webhook.md) — 7 published commands
51
51
  - [workflow](commands/workflow.md) — 16 published commands
52
52
  - [workspace](commands/workspace.md) — 20 published commands
@@ -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
 
@@ -39,6 +39,7 @@ from mammoth_cli.runtime.confirm import (
39
39
  from mammoth_cli.runtime.invocation import Invocation
40
40
  from mammoth_cli.runtime.session import open_service, require_project, resolved_project
41
41
  from mammoth_cli.services.argspec import arg_spec
42
+ from mammoth_cli.services.board_values import board_values, dashboard_link
42
43
  from mammoth_cli.services.command_contract import bind_command_inputs
43
44
  from mammoth_cli.services.dashboard_pages import check_added_pages
44
45
  from mammoth_cli.services.dashboard_review import (
@@ -670,9 +671,38 @@ def generated_dashboard(invocation: Invocation) -> HandlerResult:
670
671
  data = check_added_pages(service, positionals["dashboard_id"], requested, data)
671
672
  if invocation.command_id in _REVIEWED_COMMANDS:
672
673
  data = _with_deliverable_check(invocation, service, auth, positionals, data)
674
+ if invocation.command_id in _VALUED_COMMANDS:
675
+ data = _with_board_values(service, auth, positionals, data)
673
676
  return data, _meta(invocation, auth.workspace_id)
674
677
 
675
678
 
679
+ #: Board-building steps whose result carries the evaluated card/tile numbers.
680
+ _VALUED_COMMANDS = frozenset({"dashboard.v3.generate", "dashboard.chat.edit"})
681
+
682
+
683
+ def _with_board_values(service: Any, auth: Any, positionals: dict[str, Any], data: Any) -> Any:
684
+ """Add ``dashboard_link`` and each KPI card's and tile's evaluated number.
685
+
686
+ The result of a build/edit is definitions; the agent must see the numbers
687
+ it is about to report (a rate that reads 21.9% where the data says 14.9%).
688
+ """
689
+ data = _dump_model(data)
690
+ if not isinstance(data, dict):
691
+ return data
692
+ dashboard_id = positionals.get("dashboard_id") or data.get("id") or data.get("dashboard_id")
693
+ if not isinstance(dashboard_id, int):
694
+ return {**data, "values": {"unavailable": "the result names no dashboard id"}}
695
+ return {
696
+ **data,
697
+ "dashboard_link": dashboard_link(auth.base_url, auth.workspace_id, dashboard_id),
698
+ "values": board_values(service, dashboard_id),
699
+ }
700
+
701
+
702
+ def _dump_model(value: Any) -> Any:
703
+ return value.model_dump(mode="json") if hasattr(value, "model_dump") else value
704
+
705
+
676
706
  #: Authoring steps whose result carries ``deliverable_check``.
677
707
  _REVIEWED_COMMANDS = frozenset(
678
708
  {"dashboard.create-blank", "dashboard.canvas.save", "dashboard.pages.add"}
@@ -30,6 +30,7 @@ from mammoth_cli.runtime.confirm import (
30
30
  from mammoth_cli.runtime.invocation import Invocation
31
31
  from mammoth_cli.runtime.new_data import with_file_upload_path
32
32
  from mammoth_cli.runtime.session import open_service, require_project
33
+ from mammoth_cli.services.listing import DATASET_LIST_FIELDS, dataset_summary, fit_budget
33
34
 
34
35
  HandlerResult = tuple[Any, dict[str, Any]]
35
36
 
@@ -192,16 +193,49 @@ def dataset_find(invocation: Invocation) -> HandlerResult:
192
193
 
193
194
 
194
195
  def dataset_list(invocation: Invocation) -> HandlerResult:
195
- """List datasets in the active project."""
196
+ """List datasets in the active project, newest first, each with what tells them apart.
197
+
198
+ Every item carries its size, created/updated time, how its data arrived, and
199
+ its column names and types (from the list route's stored ``stats``,
200
+ ``sources`` and ``data_schema``), cut to fit the agent tool output cap.
201
+ ``full: true`` returns the raw ``{id, name}`` list instead.
202
+ """
196
203
  project_id = require_project(invocation)
197
204
  document = invocation.load_input() or {}
198
205
  kwargs: dict[str, Any] = {"project_id": project_id}
199
206
  _forward_optional(document, kwargs, ("limit", "offset", "sort"))
207
+ compact = not document.get("full")
208
+ if compact:
209
+ kwargs["fields"] = DATASET_LIST_FIELDS
200
210
  with open_service(invocation) as (service, auth):
201
211
  data = service.call(_symbol(invocation), **kwargs)
212
+ if compact:
213
+ data = _compact_dataset_list(data, kwargs.get("offset", 0), kwargs.get("sort"))
202
214
  return data, _meta(invocation, auth.workspace_id, project_id)
203
215
 
204
216
 
217
+ def _compact_dataset_list(data: Any, offset: int, sort: str | None) -> Any:
218
+ """Summarise a dataset-list page and fit it to the tool output cap."""
219
+ datasets = data.get("datasets") if isinstance(data, dict) else None
220
+ if not isinstance(datasets, list):
221
+ return data
222
+ summaries = [dataset_summary(item) for item in datasets if isinstance(item, dict)]
223
+ kept, omitted = fit_budget(summaries)
224
+ result: dict[str, Any] = {
225
+ "datasets": kept,
226
+ "shown": len(kept),
227
+ "order": sort or "newest first (created_at desc)",
228
+ "note": (
229
+ "A dataset record holds no sample values; 'view list DATASET_ID' shows "
230
+ "stored sample_values per view."
231
+ ),
232
+ }
233
+ if omitted or data.get("next"):
234
+ result["more"] = True
235
+ result["next_offset"] = int(offset) + len(kept)
236
+ return result
237
+
238
+
205
239
  def _export_write_hint(data: dict[str, Any]) -> str | None:
206
240
  """Name the recurring export that writes into this dataset, if any.
207
241
 
@@ -395,6 +429,34 @@ def dataset_file_settings_undo(invocation: Invocation) -> HandlerResult:
395
429
  return data, _meta(invocation, auth.workspace_id, project_id)
396
430
 
397
431
 
432
+ _INTERPRETATION_FIELDS = ("user_instruction", "structure_map", "destination_dataset_id")
433
+
434
+
435
+ def dataset_interpretation(invocation: Invocation) -> HandlerResult:
436
+ """Preview or confirm how a file that can be read several ways is interpreted.
437
+
438
+ ``--input`` carries ``user_instruction`` (plain English, e.g. one of the
439
+ suggestions ``dataset get`` shows), a ``structure_map`` from an earlier
440
+ preview, or a ``destination_dataset_id``; at least one is required.
441
+ """
442
+ project_id = require_project(invocation)
443
+ dataset_id = _require_int_positional(invocation, "dataset id")
444
+ document = invocation.load_input() or {}
445
+ kwargs: dict[str, Any] = {"dataset_id": dataset_id, "project_id": project_id}
446
+ _forward_optional(document, kwargs, _INTERPRETATION_FIELDS)
447
+ if not any(field in kwargs for field in _INTERPRETATION_FIELDS):
448
+ raise CliError(
449
+ code=CODE_MISSING_ARGUMENT,
450
+ message="Say how to read the file: pass one of " + ", ".join(_INTERPRETATION_FIELDS),
451
+ exit_status=EXIT_USAGE,
452
+ hint="Use a suggestion from 'mammoth dataset get DATASET_ID' "
453
+ "(additional_info.interpretation.instruction_suggestions) as user_instruction.",
454
+ )
455
+ with open_service(invocation) as (service, auth):
456
+ data = service.call(_symbol(invocation), **kwargs)
457
+ return data, _meta(invocation, auth.workspace_id, project_id)
458
+
459
+
398
460
  def dataset_create(invocation: Invocation) -> HandlerResult:
399
461
  """Create a dataset from a spec and creation type (required ``--input`` fields)."""
400
462
  project_id = require_project(invocation)
@@ -26,6 +26,7 @@ from mammoth_cli.errors.envelope import (
26
26
  from mammoth_cli.manifest.loader import command_by_id
27
27
  from mammoth_cli.runtime.invocation import Invocation
28
28
  from mammoth_cli.runtime.session import open_service
29
+ from mammoth_cli.services.board_values import board_values, dashboard_link
29
30
 
30
31
  HandlerResult = tuple[Any, dict[str, Any]]
31
32
 
@@ -169,7 +170,7 @@ def job_wait(invocation: Invocation) -> HandlerResult:
169
170
  symbol, kwargs = _wait_call(invocation, document, kwargs)
170
171
  try:
171
172
  with open_service(invocation) as (service, auth):
172
- data = _wait_result(job_id, service.call(symbol, **kwargs))
173
+ data = _with_board(service, auth, _wait_result(job_id, service.call(symbol, **kwargs)))
173
174
  except KeyboardInterrupt as exc:
174
175
  # Keep the explicit handle even when the polling implementation raises
175
176
  # a bare SIGINT. A caller can inspect/resume it without replaying the
@@ -186,6 +187,25 @@ def job_wait(invocation: Invocation) -> HandlerResult:
186
187
  return data, _meta(invocation, auth.workspace_id)
187
188
 
188
189
 
190
+ #: Jobs that build a board. A build that outlived its own wait hands back a running
191
+ #: job; waiting on it here must report what the build would have: the board's link
192
+ #: and its evaluated numbers (UQA-RT2-05).
193
+ _BOARD_BUILD_OPERATIONS = frozenset({"generate_dashboard_v3"})
194
+
195
+
196
+ def _with_board(service: Any, auth: Any, data: dict[str, Any]) -> dict[str, Any]:
197
+ """Add ``dashboard_link`` and the board's evaluated numbers to a finished board build."""
198
+ result = data.get("result")
199
+ board = result.get("id") if isinstance(result, dict) else None
200
+ if data.get("operation") not in _BOARD_BUILD_OPERATIONS or not isinstance(board, int):
201
+ return data
202
+ return {
203
+ **data,
204
+ "dashboard_link": dashboard_link(auth.base_url, auth.workspace_id, board),
205
+ "values": board_values(service, board),
206
+ }
207
+
208
+
189
209
  def job_wait_many(invocation: Invocation) -> HandlerResult:
190
210
  """Block until several jobs complete, or raise on failure/timeout.
191
211
 
@@ -563,13 +563,37 @@ def _report_line(where: str, warning: dict[str, Any]) -> str:
563
563
  return f"{subject}: {warning.get('issue')}. {warning.get('detail', '')}".strip()
564
564
 
565
565
 
566
+ def _scoped_dataset_id(invocation: Invocation) -> int | None:
567
+ """The DATASET_ID that narrows ``project check`` to one dataset, or None."""
568
+ raw = invocation.positional("dataset_id")
569
+ if raw is None:
570
+ return None
571
+ try:
572
+ return int(raw)
573
+ except ValueError as exc:
574
+ raise CliError(
575
+ code=CODE_INVALID_ARGUMENT,
576
+ message=f"The dataset id argument '{raw}' is not an integer.",
577
+ exit_status=EXIT_USAGE,
578
+ ) from exc
579
+
580
+
581
+ def _datasets_to_check(service: Any, project_id: int, scoped: int | None) -> list[Any]:
582
+ """Every dataset of the project, or only the named one -- never a walk when scoped."""
583
+ if scoped is not None:
584
+ return [{"id": scoped, "name": f"dataset {scoped}"}]
585
+ listing = service.call(_DATASETS_LIST_SYMBOL, project_id=project_id)
586
+ return listing.get("datasets", []) if isinstance(listing, dict) else []
587
+
588
+
566
589
  def project_check(invocation: Invocation) -> HandlerResult:
567
590
  """List what a report on this project must still account for.
568
591
 
569
592
  Read-only local composite, run before reporting: for each dataset, the
570
593
  first view's ``column_warnings`` and ``before_dashboard``; for each
571
594
  dashboard, its ``deliverable_check``. ``to_report`` flattens them into
572
- one line per finding. Cold-agent evals (2.0.41) left one column's blanks
595
+ one line per finding. Given a DATASET_ID it reads only that dataset's first
596
+ view (no dataset list, no dashboards). Cold-agent evals (2.0.41) left one column's blanks
573
597
  undecided in every run, because the warning sat in an earlier result.
574
598
  """
575
599
  from mammoth_cli.commands.dashboard import _with_deliverable_check
@@ -579,9 +603,9 @@ def project_check(invocation: Invocation) -> HandlerResult:
579
603
  views: list[dict[str, Any]] = []
580
604
  dashboards: list[dict[str, Any]] = []
581
605
  to_report: list[str] = []
606
+ scoped_dataset = _scoped_dataset_id(invocation)
582
607
  with open_service(invocation) as (service, auth):
583
- listing = service.call(_DATASETS_LIST_SYMBOL, project_id=project_id)
584
- datasets = listing.get("datasets", []) if isinstance(listing, dict) else []
608
+ datasets = _datasets_to_check(service, project_id, scoped_dataset)
585
609
  for dataset in datasets:
586
610
  dataset_id = dataset.get("id") if isinstance(dataset, dict) else None
587
611
  if not isinstance(dataset_id, int):
@@ -615,7 +639,9 @@ def project_check(invocation: Invocation) -> HandlerResult:
615
639
  views.append(entry)
616
640
  where = f"view {preview['view_id']} ({dataset.get('name')})"
617
641
  to_report += [_report_line(where, w) for w in entry["column_warnings"]]
618
- boards = service.call(_DASHBOARDS_LIST_SYMBOL, project_id=project_id)
642
+ boards = (
643
+ [] if scoped_dataset else service.call(_DASHBOARDS_LIST_SYMBOL, project_id=project_id)
644
+ )
619
645
  for board in boards if isinstance(boards, list) else []:
620
646
  dashboard_id = board.get("id") if isinstance(board, dict) else None
621
647
  if not isinstance(dashboard_id, int):
@@ -634,11 +660,11 @@ def project_check(invocation: Invocation) -> HandlerResult:
634
660
  "project_id": project_id,
635
661
  "views": views,
636
662
  "dashboards": dashboards,
637
- "to_report": to_report,
638
- "note": (
639
- "Before you report: fix each finding, or give it one line in the report "
640
- "(what you did and why). A finding you do not mention is a miss."
641
- if to_report
642
- else "Nothing open in the views or dashboards."
663
+ **(
664
+ {"scope": {"dataset_id": scoped_dataset, "dashboards": "not checked"}}
665
+ if scoped_dataset
666
+ else {}
643
667
  ),
668
+ "to_report": to_report,
669
+ **({} if to_report else {"note": "Nothing open in the views or dashboards."}),
644
670
  }, meta
@@ -53,6 +53,7 @@ from mammoth_cli.commands import trash as trash_cmd
53
53
  from mammoth_cli.commands import user as user_cmd
54
54
  from mammoth_cli.commands import view as view_cmd
55
55
  from mammoth_cli.commands import view_ops as view_ops_cmd
56
+ from mammoth_cli.commands import view_profile as view_profile_cmd
56
57
  from mammoth_cli.commands import webhook as webhook_cmd
57
58
  from mammoth_cli.commands import workflow as workflow_cmd
58
59
  from mammoth_cli.commands import workspace as workspace_cmd
@@ -315,6 +316,8 @@ HANDLERS: dict[str, Handler] = {
315
316
  "dataset.file-settings.update": dataset_cmd.dataset_file_settings_update,
316
317
  "dataset.file-settings.undo": dataset_cmd.dataset_file_settings_undo,
317
318
  "dataset.broken-rows.list": dataset_cmd.dataset_broken_rows,
319
+ "dataset.interpretation.preview": dataset_cmd.dataset_interpretation,
320
+ "dataset.interpretation.confirm": dataset_cmd.dataset_interpretation,
318
321
  "dataset.create": dataset_cmd.dataset_create,
319
322
  "dataset.create-from-pdf": dataset_cmd.dataset_create_from_pdf,
320
323
  "dataset.rename": dataset_cmd.dataset_rename,
@@ -648,6 +651,7 @@ HANDLERS: dict[str, Handler] = {
648
651
  "view.data.aggregate": view_cmd.view_data_aggregate,
649
652
  "view.data.compare": view_cmd.view_data_compare,
650
653
  "view.data.explore": view_cmd.view_data_explore,
654
+ "view.data.profile": view_profile_cmd.view_data_profile,
651
655
  "view.exportable-config.get": view_cmd.view_exportable_config_get,
652
656
  "view.exportable-config.apply": view_cmd.view_exportable_config_apply,
653
657
  "view.conditional-format.create": view_cmd.view_conditional_format_create,
@@ -42,6 +42,19 @@ _OUTPUT_JSON_NO_INPUT: tuple[str, ...] = ()
42
42
  # the published example points at a protected owner-only file instead, so no
43
43
  # generated or copied command line ever puts a credential in argv.
44
44
  _PROTECTED_INPUT_PATH = "/private/path/request.json"
45
+ # Commands whose useful example the SDK signature cannot express: a distinct
46
+ # second id, an optional-but-central input field, or two views to compare.
47
+ _FIXED_EXAMPLES: dict[str, tuple[tuple[str, ...], dict[str, Any]]] = {
48
+ "project.check": (("123", "456"), {}),
49
+ "view.data.profile": (("123",), {"target": "Churn"}),
50
+ "view.data.compare": (
51
+ ("111", "222"),
52
+ {
53
+ "group_by": ["Campaign"],
54
+ "aggregations": [{"column": "Spend", "function": "SUM", "as_name": "Spend"}],
55
+ },
56
+ ),
57
+ }
45
58
  _OPAQUE_EXPERT_COMMANDS = frozenset({"view.task.add", "view.task.preview", "view.task.update"})
46
59
  _TYPED_TRANSFORM_ALTERNATIVES = [
47
60
  "view.transform.filter",
@@ -311,6 +324,14 @@ _COMMAND_DISCOVERY_PURPOSES = {
311
324
  # view.data.explore's own purpose text already uses both for its trend
312
325
  # feature.
313
326
  "view.data.aggregate": "group and sum totals by month week without changing the pipeline",
327
+ # Goals stated as "what is in this data" / "why do customers churn": one
328
+ # whole-view profile answers both, so the phrasing must reach it.
329
+ "view.data.profile": (
330
+ "profile explore what is in this data understand a dataset every column blanks missing "
331
+ "empty nulls distinct unique duplicates dirty inconsistent categories spelling variants "
332
+ "check look at overview summary statistics churn drivers drive driving feature "
333
+ "importance correlation which columns predict affect influence the target outcome"
334
+ ),
314
335
  # Goals users state in their own words, one entry per command the agent's
315
336
  # system prompt used to spell out by hand.
316
337
  "dashboard.suggestion.list": "ideas suggest suggestions what to show put on a board chart",
@@ -1055,6 +1076,17 @@ def runnable_example(
1055
1076
  *_OUTPUT_JSON_NO_INPUT,
1056
1077
  ]
1057
1078
  )
1079
+ if record["command_id"] in _FIXED_EXAMPLES:
1080
+ positional_samples, sample_input = _FIXED_EXAMPLES[record["command_id"]]
1081
+ return shlex.join(
1082
+ [
1083
+ "mammoth",
1084
+ *record["command_path"].split(),
1085
+ *positional_samples,
1086
+ *(["--input", json.dumps(sample_input)] if sample_input else []),
1087
+ *_OUTPUT_JSON_NO_INPUT,
1088
+ ]
1089
+ )
1058
1090
  if record["command_id"] == "batch.create-spec":
1059
1091
  return shlex.join(
1060
1092
  [
@@ -1215,7 +1247,7 @@ def runnable_example(
1215
1247
  else:
1216
1248
  tokens.extend(["--input", json.dumps(document)])
1217
1249
  tokens.extend(_OUTPUT_JSON_NO_INPUT)
1218
- if record["command_id"] in {"project.user.update", "data-app.share"}:
1250
+ if record["command_id"] in {"project.user.update", "data-app.share", "workspace.user.add"}:
1219
1251
  # These published high-impact examples must satisfy the same policy
1220
1252
  # their manifests advertise; otherwise discovery emits a command that
1221
1253
  # deterministically fails before dispatch.
@@ -1402,9 +1434,7 @@ def _schema_common(record: dict[str, Any]) -> dict[str, Any]:
1402
1434
  contract_level = (
1403
1435
  "opaque_expert"
1404
1436
  if record["command_id"] in _OPAQUE_EXPERT_COMMANDS
1405
- else "partially_typed"
1406
- if opaque_fields
1407
- else "typed"
1437
+ else "partially_typed" if opaque_fields else "typed"
1408
1438
  )
1409
1439
  return {
1410
1440
  "positionals": _positionals(record["command_id"]),