mammoth-cli 2.0.84__tar.gz → 2.0.86__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 (237) hide show
  1. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/PKG-INFO +2 -2
  2. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/app.py +23 -2
  4. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +5 -0
  5. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/job.py +35 -6
  6. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/view.py +2 -1
  7. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/embed.py +20 -1
  8. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/errors/envelope.py +121 -0
  9. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/runtime/dryrun.py +8 -1
  10. mammoth_cli-2.0.86/mammoth_cli/runtime/dryrun_targets.py +575 -0
  11. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/runtime/executor.py +12 -3
  12. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/runtime/invocation.py +4 -3
  13. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/runtime/session.py +8 -0
  14. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/runtime/state.py +1 -0
  15. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/runtime/strict.py +2 -1
  16. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/services/command_contract.py +3 -0
  17. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/services/mapping.py +88 -2
  18. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/services/sdk_service.py +5 -2
  19. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/pyproject.toml +2 -2
  20. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/.gitignore +0 -0
  21. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/LICENSE +0 -0
  22. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/README.md +0 -0
  23. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/__main__.py +0 -0
  24. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +0 -0
  25. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
  26. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  27. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
  28. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
  29. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
  30. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  31. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  32. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  33. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  34. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  35. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  36. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  37. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  38. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  39. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  40. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
  41. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  42. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  43. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  44. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  45. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  46. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  47. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
  48. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
  49. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  50. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  51. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  52. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  53. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  54. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  55. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  56. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  57. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  58. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  59. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
  60. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  61. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  62. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  63. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  64. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  65. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  66. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  67. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  68. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  69. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  70. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  71. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
  72. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +0 -0
  73. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  74. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  75. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  76. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  77. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
  78. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  79. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  80. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  81. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  82. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
  83. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
  84. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  85. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  86. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  87. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  88. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
  89. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
  90. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  91. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  92. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  93. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  94. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  95. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
  96. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/__init__.py +0 -0
  97. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/activity.py +0 -0
  98. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/addon.py +0 -0
  99. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/agent.py +0 -0
  100. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/ai.py +0 -0
  101. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/annotation.py +0 -0
  102. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/auth.py +0 -0
  103. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/automation.py +0 -0
  104. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/batch.py +0 -0
  105. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/billing.py +0 -0
  106. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/browse.py +0 -0
  107. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/calc.py +0 -0
  108. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/capability.py +0 -0
  109. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/client_app.py +0 -0
  110. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/completion.py +0 -0
  111. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/config.py +0 -0
  112. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/connector.py +0 -0
  113. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/context.py +0 -0
  114. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/dashboard.py +0 -0
  115. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/data_app.py +0 -0
  116. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/dataset.py +0 -0
  117. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/doctor.py +0 -0
  118. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/external_key.py +0 -0
  119. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/file.py +0 -0
  120. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/folder.py +0 -0
  121. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/notification.py +0 -0
  122. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/parameter.py +0 -0
  123. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/project.py +0 -0
  124. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/registry.py +0 -0
  125. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/report.py +0 -0
  126. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/schedule.py +0 -0
  127. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/schema.py +0 -0
  128. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/skill.py +0 -0
  129. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/snippet.py +0 -0
  130. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/support.py +0 -0
  131. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/template.py +0 -0
  132. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/trash.py +0 -0
  133. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/upgrade.py +0 -0
  134. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/user.py +0 -0
  135. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/view_ops.py +0 -0
  136. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/webhook.py +0 -0
  137. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/workflow.py +0 -0
  138. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/commands/workspace.py +0 -0
  139. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/context/__init__.py +0 -0
  140. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/context/credentials.py +0 -0
  141. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/context/endpoint.py +0 -0
  142. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/context/profiles.py +0 -0
  143. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/context/resolver.py +0 -0
  144. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/contracts/__init__.py +0 -0
  145. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/contracts/auth.py +0 -0
  146. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/errors/__init__.py +0 -0
  147. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/manifest/__init__.py +0 -0
  148. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/manifest/loader.py +0 -0
  149. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/messages/__init__.py +0 -0
  150. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/output/__init__.py +0 -0
  151. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/output/envelope.py +0 -0
  152. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/output/normalize.py +0 -0
  153. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/output/policy.py +0 -0
  154. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/output/progress.py +0 -0
  155. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/output/render.py +0 -0
  156. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/py.typed +0 -0
  157. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/runtime/__init__.py +0 -0
  158. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/runtime/confirm.py +0 -0
  159. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/runtime/dataset_health.py +0 -0
  160. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/runtime/embedded.py +0 -0
  161. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/runtime/input_loader.py +0 -0
  162. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/runtime/new_data.py +0 -0
  163. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/runtime/options.py +0 -0
  164. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/runtime/parents.py +0 -0
  165. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/runtime/runlog.py +0 -0
  166. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/runtime/updates.py +0 -0
  167. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/runtime/validate.py +0 -0
  168. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/runtime/verify.py +0 -0
  169. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/services/__init__.py +0 -0
  170. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/services/argspec.py +0 -0
  171. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/services/coerce.py +0 -0
  172. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/services/conditions.py +0 -0
  173. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/services/dashboard_pages.py +0 -0
  174. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/services/dashboard_review.py +0 -0
  175. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/services/data_quality.py +0 -0
  176. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/services/dispatch.py +0 -0
  177. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/services/factory.py +0 -0
  178. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/services/input_fields.py +0 -0
  179. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/services/openapi_types.py +0 -0
  180. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/services/positionals.py +0 -0
  181. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/services/protocol.py +0 -0
  182. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/services/testing.py +0 -0
  183. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/services/type_system.py +0 -0
  184. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/skills/__init__.py +0 -0
  185. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/skills/installer.py +0 -0
  186. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/skills/steering.py +0 -0
  187. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/mammoth_cli/testing.py +0 -0
  188. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/activity.yaml +0 -0
  189. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/addon.yaml +0 -0
  190. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/agent.yaml +0 -0
  191. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/ai.yaml +0 -0
  192. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/annotation.yaml +0 -0
  193. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/auth.yaml +0 -0
  194. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/automation.yaml +0 -0
  195. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/batch.yaml +0 -0
  196. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/billing.yaml +0 -0
  197. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/browse.yaml +0 -0
  198. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/calc.yaml +0 -0
  199. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/capability.yaml +0 -0
  200. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/client-app.yaml +0 -0
  201. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/completion.yaml +0 -0
  202. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/config.yaml +0 -0
  203. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/connector.yaml +0 -0
  204. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/context.yaml +0 -0
  205. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/dashboard.yaml +0 -0
  206. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/data-app.yaml +0 -0
  207. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/dataset.yaml +0 -0
  208. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/doctor.yaml +0 -0
  209. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/external-key.yaml +0 -0
  210. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/file.yaml +0 -0
  211. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/folder.yaml +0 -0
  212. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/job.yaml +0 -0
  213. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/log.yaml +0 -0
  214. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/notification.yaml +0 -0
  215. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/parameter.yaml +0 -0
  216. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/project.yaml +0 -0
  217. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/report.yaml +0 -0
  218. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/schedule.yaml +0 -0
  219. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/schema.yaml +0 -0
  220. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/skill.yaml +0 -0
  221. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/snippet.yaml +0 -0
  222. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/support.yaml +0 -0
  223. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/template.yaml +0 -0
  224. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/trash.yaml +0 -0
  225. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/upgrade.yaml +0 -0
  226. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/user.yaml +0 -0
  227. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/version.yaml +0 -0
  228. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/view.yaml +0 -0
  229. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/webhook.yaml +0 -0
  230. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/workflow.yaml +0 -0
  231. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/commands/workspace.yaml +0 -0
  232. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/openapi-operations.yaml +0 -0
  233. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/schema-v1.json +0 -0
  234. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/sdk-catalog.source.yaml +0 -0
  235. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/manifests/sdk-methods.yaml +0 -0
  236. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/spec/openapi/metadata.json +0 -0
  237. {mammoth_cli-2.0.84 → mammoth_cli-2.0.86}/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.84
3
+ Version: 2.0.86
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.38
20
+ Requires-Dist: mammoth-io<0.8,>=0.7.40
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.84"
9
+ __version__ = "2.0.86"
10
10
 
11
11
  # The versioned machine output envelope contract.
12
12
  SCHEMA_VERSION = 1
@@ -579,6 +579,24 @@ def _shared_option_params() -> list[inspect.Parameter]:
579
579
  ),
580
580
  ],
581
581
  ),
582
+ opt(
583
+ "return_running",
584
+ False,
585
+ Annotated[
586
+ bool,
587
+ typer.Option(
588
+ "--return-running",
589
+ help=(
590
+ "When a job or pipeline wait runs out, exit 0 with "
591
+ "{status: running, job_id or dataview_id, resume} instead of a "
592
+ "timeout error; resume with 'mammoth job wait JOB_ID' "
593
+ "(reports success, failure or still running; waits at most "
594
+ "15 minutes by default)."
595
+ ),
596
+ rich_help_panel="Context and timeouts",
597
+ ),
598
+ ],
599
+ ),
582
600
  opt(
583
601
  "pipeline_timeout",
584
602
  None,
@@ -867,12 +885,15 @@ def _dry_run(handler: Handler, invocation: Invocation) -> tuple[Any, dict[str, A
867
885
  gated SDK call at all (a pure read path); its result is returned as is.
868
886
  """
869
887
  from mammoth_cli.runtime.dryrun import DryRunStop
870
- from mammoth_cli.runtime.session import resolved_project
888
+ from mammoth_cli.runtime.dryrun_targets import resolve_targets
889
+ from mammoth_cli.runtime.session import open_service, resolved_project
871
890
 
872
891
  try:
873
892
  return handler(invocation)
874
893
  except DryRunStop as stop:
875
- return stop.record, {
894
+ with open_service(invocation) as (service, _auth):
895
+ targets = resolve_targets(service, invocation.command_id, stop.record["would_call"])
896
+ return {**stop.record, "targets": targets}, {
876
897
  "profile": invocation.profile,
877
898
  "project_id": resolved_project(invocation),
878
899
  }
@@ -24,6 +24,11 @@ or wait that job — inspect it rather than submitting the original mutation.
24
24
  The `--job-timeout` /
25
25
  `--pipeline-timeout` options bound the wait.
26
26
 
27
+ With `--return-running` a wait that runs out exits 0 with `{status: running, job_id, resume}`
28
+ (`dataview_id` for a pipeline wait). `mammoth job wait JOB_ID` resumes: it returns
29
+ `{status: success, job_id, result}`, a `job_failed` error with the reason, or the running handle
30
+ again, and waits at most 15 minutes by default.
31
+
27
32
  A transport failure during a mutation without a confirmed job/resource handle
28
33
  is `outcome_unknown`. Re-read the exact target and scope before replaying it;
29
34
  the operation may already have committed.
@@ -30,6 +30,7 @@ from mammoth_cli.runtime.session import open_service
30
30
  HandlerResult = tuple[Any, dict[str, Any]]
31
31
 
32
32
  _WAIT_OPTIONAL = ("timeout", "poll_interval")
33
+ _DASHBOARD_WAIT_SYMBOL = "mammoth.api.dashboards.DashboardsAPI.wait_for_job_by_url"
33
34
 
34
35
 
35
36
  def _symbol(invocation: Invocation) -> str:
@@ -127,20 +128,48 @@ def job_get_many(invocation: Invocation) -> HandlerResult:
127
128
  return data, _meta(invocation, auth.workspace_id)
128
129
 
129
130
 
130
- def job_wait(invocation: Invocation) -> HandlerResult:
131
- """Block until one job completes, or raise on failure/timeout.
131
+ def _wait_call(
132
+ invocation: Invocation, document: dict[str, Any], kwargs: dict[str, Any]
133
+ ) -> tuple[str, dict[str, Any]]:
134
+ """The SDK symbol and arguments for one job wait.
135
+
136
+ A ``dashboard_url`` field switches to the URL-scoped wait: jobs dispatched
137
+ by published-dashboard routes are unreadable through ``GET /jobs/{id}``.
138
+ """
139
+ if "dashboard_url" not in document:
140
+ return _symbol(invocation), kwargs
141
+ return _DASHBOARD_WAIT_SYMBOL, {**kwargs, "url": document["dashboard_url"]}
142
+
132
143
 
133
- The job id is a positional argument; optional ``timeout`` and
134
- ``poll_interval`` fields are forwarded from the ``--input`` document when
135
- present.
144
+ def _wait_result(job_id: int, job: Any) -> dict[str, Any]:
145
+ """The ``job wait`` success payload: the job's response, plus what the job was."""
146
+ data: dict[str, Any] = {"status": "success", "job_id": job_id}
147
+ if isinstance(job, dict):
148
+ data.update({key: job[key] for key in ("operation", "path") if job.get(key) is not None})
149
+ data["result"] = job.get("response", job)
150
+ else:
151
+ data["result"] = job
152
+ return data
153
+
154
+
155
+ def job_wait(invocation: Invocation) -> HandlerResult:
156
+ """Wait for one job and report success, failure, or still running (15 min default).
157
+
158
+ The job id is a positional argument; optional ``timeout``, ``poll_interval``
159
+ and ``dashboard_url`` (a published dashboard's URL slug) fields are read from
160
+ the ``--input`` document. Success returns ``{status, job_id, result}``; a
161
+ failed job is a ``job_failed`` error with its reason; a wait that runs out is
162
+ a ``timeout`` error, or with ``--return-running`` ``{status: running, job_id,
163
+ resume}``.
136
164
  """
137
165
  job_id = _require_int_positional(invocation, "job id")
138
166
  document = invocation.load_input() or {}
139
167
  kwargs: dict[str, Any] = {"job_id": job_id}
140
168
  _forward_optional(document, kwargs, _WAIT_OPTIONAL)
169
+ symbol, kwargs = _wait_call(invocation, document, kwargs)
141
170
  try:
142
171
  with open_service(invocation) as (service, auth):
143
- data = service.call(_symbol(invocation), **kwargs)
172
+ data = _wait_result(job_id, service.call(symbol, **kwargs))
144
173
  except KeyboardInterrupt as exc:
145
174
  # Keep the explicit handle even when the polling implementation raises
146
175
  # a bare SIGINT. A caller can inspect/resume it without replaying the
@@ -2591,7 +2591,8 @@ def view_export_specialized(invocation: Invocation) -> HandlerResult:
2591
2591
  code="unknown_input_field",
2592
2592
  message=(
2593
2593
  f"Unknown input field(s) for '{invocation.command_id.replace('.', ' ')}': "
2594
- f"{', '.join(unknown)}."
2594
+ f"{', '.join(unknown)}. "
2595
+ f"Accepted fields: {', '.join(sorted(allowed - {_DATASET_ID_FIELD}))}."
2595
2596
  ),
2596
2597
  exit_status=EXIT_USAGE,
2597
2598
  hint=f"Accepted fields: {', '.join(sorted(allowed - {_DATASET_ID_FIELD}))}.",
@@ -41,6 +41,8 @@ def invoke(
41
41
  project_id: int | None = None,
42
42
  timeout: float | None = None,
43
43
  pipeline_timeout: float | None = None,
44
+ job_timeout: float | None = None,
45
+ return_running: bool = False,
44
46
  ) -> dict[str, Any]:
45
47
  """Run ``mammoth <args>`` as ``login`` and return its envelope.
46
48
 
@@ -54,12 +56,23 @@ def invoke(
54
56
  ``args`` already sets one.
55
57
  pipeline_timeout: Pipeline wait timeout in seconds, sent as
56
58
  ``--pipeline-timeout`` unless ``args`` already sets one.
59
+ job_timeout: Job wait timeout in seconds, sent as ``--job-timeout``
60
+ unless ``args`` already sets one.
61
+ return_running: Send ``--return-running`` so a wait that runs out
62
+ returns a ``status: running`` handle instead of a timeout error.
57
63
 
58
64
  Returns:
59
65
  The success envelope (``data`` + ``meta``) or the error envelope
60
66
  (``error``). A CLI error is returned, never raised.
61
67
  """
62
- argv = _argv(args, project_id=project_id, timeout=timeout, pipeline_timeout=pipeline_timeout)
68
+ argv = _argv(
69
+ args,
70
+ project_id=project_id,
71
+ timeout=timeout,
72
+ pipeline_timeout=pipeline_timeout,
73
+ job_timeout=job_timeout,
74
+ return_running=return_running,
75
+ )
63
76
  call = embedded.EmbeddedCall(login=login)
64
77
  token = embedded.enter(call)
65
78
  try:
@@ -77,6 +90,8 @@ def _argv(
77
90
  project_id: int | None,
78
91
  timeout: float | None,
79
92
  pipeline_timeout: float | None,
93
+ job_timeout: float | None,
94
+ return_running: bool,
80
95
  ) -> list[str]:
81
96
  """``args`` plus the options an embedded call always runs with."""
82
97
  argv = list(args)
@@ -86,6 +101,10 @@ def _argv(
86
101
  argv += ["--timeout", str(timeout)]
87
102
  if pipeline_timeout is not None and not _has_option(argv, "--pipeline-timeout"):
88
103
  argv += ["--pipeline-timeout", str(pipeline_timeout)]
104
+ if job_timeout is not None and not _has_option(argv, "--job-timeout"):
105
+ argv += ["--job-timeout", str(job_timeout)]
106
+ if return_running and not _has_option(argv, "--return-running"):
107
+ argv.append("--return-running")
89
108
  # Last, so they win over any output or input option in ``args``.
90
109
  return [*argv, "--output", "json", "--no-input"]
91
110
 
@@ -52,6 +52,126 @@ CODE_JOB_FAILED = "job_failed"
52
52
  CODE_INTERRUPTED = "interrupted"
53
53
  CODE_UNSUPPORTED_CONTRACT = "unsupported_contract"
54
54
 
55
+ # User-safe, one-line summaries shown to the customer instead of the model-facing
56
+ # ``message``/``hint``. Plain language only: no command names, ids, field names
57
+ # or jargon. Exactly one entry per error code the CLI can raise;
58
+ # ``tests/unit/test_error_summaries.py`` fails if a raised code has none.
59
+ _S_BAD_REQUEST = "The assistant's request wasn't valid, so it is trying a different way."
60
+ _S_BAD_INPUT = "Some of the information provided couldn't be used."
61
+ _S_SIGN_IN = "The assistant isn't signed in to Mammoth."
62
+ _S_INTERNAL = "The assistant hit an internal problem with this step."
63
+ _S_NOT_FOUND = "Something the assistant looked for couldn't be found."
64
+ _S_MISSING_INFO = "The assistant's request was missing some information."
65
+ _S_SETUP = "A setting needed for this step isn't set up correctly."
66
+ _S_UNAVAILABLE = "This step isn't available right now."
67
+
68
+ ERROR_SUMMARIES: dict[str, str] = {
69
+ "aborted": "This step was stopped before it finished.",
70
+ "ambiguous_resource_identity": (
71
+ "More than one item matched, so the assistant needs to be more specific."
72
+ ),
73
+ "api_error": "Mammoth couldn't complete this step.",
74
+ "append_schema_mismatch": "The new data doesn't line up with the existing columns.",
75
+ "append_schema_unreadable": "The columns of the existing data couldn't be read.",
76
+ "authentication_failed": "Mammoth didn't accept the sign-in for this step.",
77
+ "authorization_required": "You don't have permission to do this.",
78
+ "capability_not_found": "The assistant tried something Mammoth doesn't support.",
79
+ "confirmation_declined": "This step was not confirmed, so nothing was changed.",
80
+ "confirmation_required": "This step needs your confirmation before it can go ahead.",
81
+ "confirmation_target_mismatch": (
82
+ "The confirmation was for a different item, so nothing was changed."
83
+ ),
84
+ "conflict": "This conflicts with the current state of your data, so nothing was changed.",
85
+ "dry_run_targets_unresolvable": (
86
+ "The assistant couldn't tell exactly which items this would change, so nothing was changed."
87
+ ),
88
+ "download_failed": "A download didn't complete.",
89
+ "duplicate_input_key": _S_BAD_INPUT,
90
+ "empty_search_query": "The search was empty.",
91
+ "export_already_exists": "An export with that name already exists.",
92
+ "incomplete_environment_auth": _S_SIGN_IN,
93
+ "input_file_not_found": _S_NOT_FOUND,
94
+ "input_format_required": _S_BAD_INPUT,
95
+ "input_not_found": _S_NOT_FOUND,
96
+ "input_too_deep": _S_BAD_INPUT,
97
+ "input_too_large": "The information provided was too large.",
98
+ "input_unreadable": _S_BAD_INPUT,
99
+ "insecure_credential_file": _S_SETUP,
100
+ "insecure_input_file": _S_BAD_INPUT,
101
+ "internal_column_name": "That column is internal to Mammoth and can't be used.",
102
+ "internal_error": _S_INTERNAL,
103
+ "interrupted": "This step was interrupted before it finished.",
104
+ "invalid_argument": _S_BAD_REQUEST,
105
+ "invalid_argument_combination": _S_BAD_REQUEST,
106
+ "invalid_arguments": _S_BAD_REQUEST,
107
+ "invalid_condition": "A filter condition wasn't valid.",
108
+ "invalid_condition_value": "A filter condition used a value that isn't valid.",
109
+ "invalid_config_value": _S_SETUP,
110
+ "invalid_credentials": "The sign-in details weren't accepted.",
111
+ "invalid_input_document": _S_BAD_INPUT,
112
+ "invalid_input_encoding": _S_BAD_INPUT,
113
+ "invalid_input_field_type": _S_BAD_INPUT,
114
+ "invalid_input_format": _S_BAD_INPUT,
115
+ "invalid_login_document": "The sign-in details weren't valid.",
116
+ "invalid_option_value": _S_BAD_REQUEST,
117
+ "invalid_output_mode": _S_BAD_REQUEST,
118
+ "invalid_profile_name": _S_SETUP,
119
+ "invalid_project_id": "The project couldn't be identified.",
120
+ "invalid_resource_context": _S_BAD_REQUEST,
121
+ "invalid_server_prefix": _S_SETUP,
122
+ "invalid_storage_mode": _S_SETUP,
123
+ "invalid_workspace_id": "The workspace couldn't be identified.",
124
+ "job_failed": "A background task didn't finish successfully.",
125
+ "keyring_unavailable": _S_SETUP,
126
+ "keyring_unresponsive": _S_SETUP,
127
+ "login_input_required": _S_SIGN_IN,
128
+ "missing_argument": _S_MISSING_INFO,
129
+ "missing_field": _S_MISSING_INFO,
130
+ "no_output": "This step didn't return anything.",
131
+ "nonfinite_input_number": _S_BAD_INPUT,
132
+ "not_authenticated": _S_SIGN_IN,
133
+ "not_implemented": _S_UNAVAILABLE,
134
+ "outcome_unknown": "It isn't clear whether this step went through. Check before trying again.",
135
+ "pipeline_changed": "The pipeline was changed by someone else while this step ran.",
136
+ "pipeline_reference_error": "A step in the pipeline refers to something that no longer exists.",
137
+ "profile_not_found": _S_SETUP,
138
+ "profile_write_failed": _S_SETUP,
139
+ "project_required": "No project has been chosen for this step.",
140
+ "pypi_response_invalid": "An update check didn't return a usable answer.",
141
+ "pypi_unreachable": "An update check couldn't connect.",
142
+ "resource_identity_required": "The assistant needs to say which item it means.",
143
+ "resource_not_found": _S_NOT_FOUND,
144
+ "retryable_error": "Mammoth was temporarily unavailable. Trying again may work.",
145
+ "schema_not_found": _S_NOT_FOUND,
146
+ "sdk_symbol_unresolved": _S_INTERNAL,
147
+ "skill_conflict": _S_SETUP,
148
+ "task_runtime_error": "A background task hit an error while running.",
149
+ "timeout": "This step took too long. It may still be running.",
150
+ "too_many_goals": _S_BAD_REQUEST,
151
+ "unexpected_argument": _S_BAD_REQUEST,
152
+ "unknown_agent": _S_SETUP,
153
+ "unknown_column": "A column the assistant referred to doesn't exist.",
154
+ "unknown_config_key": _S_SETUP,
155
+ "unknown_input_field": _S_BAD_REQUEST,
156
+ "unknown_option": _S_BAD_REQUEST,
157
+ "unknown_scope": _S_SETUP,
158
+ "unsupported_contract": _S_UNAVAILABLE,
159
+ "unsupported_profile_base_url": _S_SETUP,
160
+ "unsupported_shell": _S_UNAVAILABLE,
161
+ "upgrade_failed": "The update didn't complete.",
162
+ "usage_error": _S_BAD_REQUEST,
163
+ "view_in_draft": "This view is still a draft and can't be used yet.",
164
+ }
165
+
166
+ #: Shown for a code with no entry (a runtime backstop only; the exhaustiveness
167
+ #: test keeps every raised code out of this path).
168
+ DEFAULT_ERROR_SUMMARY = "Something went wrong with this step."
169
+
170
+
171
+ def user_summary(code: str) -> str:
172
+ """The user-safe one-line summary for an error code."""
173
+ return ERROR_SUMMARIES.get(code, DEFAULT_ERROR_SUMMARY)
174
+
55
175
 
56
176
  @dataclass
57
177
  class CliError(Exception):
@@ -77,6 +197,7 @@ class CliError(Exception):
77
197
  def to_envelope(self) -> dict[str, Any]:
78
198
  error: dict[str, Any] = {
79
199
  "code": self.code,
200
+ "summary": user_summary(self.code),
80
201
  "message": self.message,
81
202
  "hint": self.hint,
82
203
  "details": self.details,
@@ -30,6 +30,11 @@ from mammoth_cli.manifest.loader import command_by_id, load_commands
30
30
  Gate = Callable[..., None]
31
31
 
32
32
  NOTE_OWN = "No request was sent for this operation; the reads needed to resolve it did run."
33
+ DATAVIEW_GET = "mammoth.api.dataviews.DataviewsAPI.get"
34
+ #: The manifest ``mutation_class`` that marks a command as irreversible: the
35
+ #: only class whose commands the manifest describes as permanent (no undo).
36
+ IRREVERSIBLE_CLASS = "destructive"
37
+
33
38
  NOTE_UNDECLARED = (
34
39
  "Stopped before an SDK call the command's manifest does not declare; "
35
40
  "nothing was sent for it."
@@ -92,7 +97,8 @@ def make_gate(command_id: str) -> Gate:
92
97
  # A CLI-composed command (project ensure, ...) is backed by a CLI function
93
98
  # and reaches the SDK through whichever writes it needs; those are its own.
94
99
  composed = own_symbol.startswith("mammoth_cli.")
95
- reads = _read_symbols()
100
+ # The target-name read is a read whichever command asked for it.
101
+ reads = _read_symbols() | {DATAVIEW_GET}
96
102
  view_reads = _read_view_methods()
97
103
 
98
104
  def stop(symbol: str, arguments: dict[str, Any], *, own: bool, **scope: Any) -> None:
@@ -101,6 +107,7 @@ def make_gate(command_id: str) -> Gate:
101
107
  "dry_run": True,
102
108
  "command": command_id.replace(".", " "),
103
109
  "mutation_class": mutation_class,
110
+ "irreversible": mutation_class == IRREVERSIBLE_CLASS,
104
111
  "would_call": {
105
112
  "sdk_symbol": symbol,
106
113
  **{key: value for key, value in scope.items() if value is not None},