mammoth-cli 2.2.2__tar.gz → 2.2.3__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 (249) hide show
  1. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/PKG-INFO +2 -2
  2. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +3 -3
  4. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +10 -0
  5. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +50 -0
  6. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +6 -0
  7. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/dataset.py +3 -3
  8. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/project.py +14 -2
  9. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/registry.py +6 -0
  10. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/schema.py +3 -0
  11. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/workspace.py +53 -1
  12. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/dryrun_targets.py +26 -3
  13. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/runlog.py +25 -5
  14. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/command_contract.py +1 -0
  15. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/listing.py +4 -0
  16. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/positionals.py +3 -0
  17. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/protocol.py +4 -2
  18. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/sdk_service.py +23 -7
  19. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/testing.py +4 -2
  20. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/pyproject.toml +2 -2
  21. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/project.yaml +43 -0
  22. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/workspace.yaml +192 -2
  23. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/edits-target.source.yaml +3 -0
  24. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/sdk-catalog.source.yaml +42 -0
  25. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/sdk-methods.yaml +75 -3
  26. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/.gitignore +0 -0
  27. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/LICENSE +0 -0
  28. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/README.md +0 -0
  29. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/__main__.py +0 -0
  30. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/app.py +0 -0
  31. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +0 -0
  32. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
  33. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  34. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
  35. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
  36. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  37. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  38. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  39. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  40. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  41. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  42. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  43. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  44. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  45. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  46. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
  47. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  48. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  49. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  50. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  51. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  52. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  53. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
  54. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +0 -0
  55. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
  56. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  57. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  58. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  59. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  60. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  61. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  62. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  63. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  64. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  65. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  66. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  67. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  68. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  69. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  70. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  71. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  72. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  73. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  74. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  75. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  76. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  77. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
  78. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +0 -0
  79. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  80. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  81. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  82. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
  83. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  84. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  85. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  86. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  87. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
  88. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
  89. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  90. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  91. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  92. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  93. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
  94. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
  95. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  96. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  97. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  98. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  99. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  100. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
  101. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/__init__.py +0 -0
  102. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/activity.py +0 -0
  103. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/addon.py +0 -0
  104. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/agent.py +0 -0
  105. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/ai.py +0 -0
  106. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/annotation.py +0 -0
  107. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/auth.py +0 -0
  108. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/automation.py +0 -0
  109. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/batch.py +0 -0
  110. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/billing.py +0 -0
  111. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/browse.py +0 -0
  112. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/calc.py +0 -0
  113. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/capability.py +0 -0
  114. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/client_app.py +0 -0
  115. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/completion.py +0 -0
  116. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/config.py +0 -0
  117. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/connector.py +0 -0
  118. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/context.py +0 -0
  119. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/dashboard.py +0 -0
  120. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/data_app.py +0 -0
  121. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/doctor.py +0 -0
  122. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/external_key.py +0 -0
  123. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/file.py +0 -0
  124. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/folder.py +0 -0
  125. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/job.py +0 -0
  126. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/notification.py +0 -0
  127. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/parameter.py +0 -0
  128. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/report.py +0 -0
  129. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/schedule.py +0 -0
  130. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/skill.py +0 -0
  131. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/snippet.py +0 -0
  132. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/support.py +0 -0
  133. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/template.py +0 -0
  134. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/trash.py +0 -0
  135. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/upgrade.py +0 -0
  136. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/user.py +0 -0
  137. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/view.py +0 -0
  138. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/view_ops.py +0 -0
  139. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/view_profile.py +0 -0
  140. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/webhook.py +0 -0
  141. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/commands/workflow.py +0 -0
  142. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/context/__init__.py +0 -0
  143. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/context/credentials.py +0 -0
  144. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/context/endpoint.py +0 -0
  145. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/context/profiles.py +0 -0
  146. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/context/resolver.py +0 -0
  147. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/contracts/__init__.py +0 -0
  148. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/contracts/auth.py +0 -0
  149. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/embed.py +0 -0
  150. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/errors/__init__.py +0 -0
  151. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/errors/envelope.py +0 -0
  152. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/manifest/__init__.py +0 -0
  153. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/manifest/loader.py +0 -0
  154. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/messages/__init__.py +0 -0
  155. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/output/__init__.py +0 -0
  156. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/output/envelope.py +0 -0
  157. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/output/normalize.py +0 -0
  158. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/output/policy.py +0 -0
  159. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/output/progress.py +0 -0
  160. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/output/render.py +0 -0
  161. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/py.typed +0 -0
  162. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/__init__.py +0 -0
  163. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/confirm.py +0 -0
  164. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/dataset_health.py +0 -0
  165. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/dryrun.py +0 -0
  166. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/embedded.py +0 -0
  167. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/executor.py +0 -0
  168. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/input_loader.py +0 -0
  169. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/intent_only.py +0 -0
  170. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/invocation.py +0 -0
  171. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/new_data.py +0 -0
  172. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/options.py +0 -0
  173. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/parents.py +0 -0
  174. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/session.py +0 -0
  175. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/state.py +0 -0
  176. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/strict.py +0 -0
  177. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/updates.py +0 -0
  178. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/validate.py +0 -0
  179. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/runtime/verify.py +0 -0
  180. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/__init__.py +0 -0
  181. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/argspec.py +0 -0
  182. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/board_values.py +0 -0
  183. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/coerce.py +0 -0
  184. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/conditions.py +0 -0
  185. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/dashboard_filters.py +0 -0
  186. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/dashboard_pages.py +0 -0
  187. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/dashboard_review.py +0 -0
  188. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/data_profile.py +0 -0
  189. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/data_quality.py +0 -0
  190. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/dispatch.py +0 -0
  191. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/factory.py +0 -0
  192. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/input_fields.py +0 -0
  193. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/mapping.py +0 -0
  194. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/openapi_types.py +0 -0
  195. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/read_queries.py +0 -0
  196. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/stored_stats.py +0 -0
  197. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/text_dates.py +0 -0
  198. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/type_system.py +0 -0
  199. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/services/write_impact.py +0 -0
  200. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/skills/__init__.py +0 -0
  201. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/skills/installer.py +0 -0
  202. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/skills/steering.py +0 -0
  203. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/mammoth_cli/testing.py +0 -0
  204. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/activity.yaml +0 -0
  205. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/addon.yaml +0 -0
  206. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/agent.yaml +0 -0
  207. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/ai.yaml +0 -0
  208. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/annotation.yaml +0 -0
  209. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/auth.yaml +0 -0
  210. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/automation.yaml +0 -0
  211. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/batch.yaml +0 -0
  212. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/billing.yaml +0 -0
  213. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/browse.yaml +0 -0
  214. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/calc.yaml +0 -0
  215. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/capability.yaml +0 -0
  216. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/client-app.yaml +0 -0
  217. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/completion.yaml +0 -0
  218. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/config.yaml +0 -0
  219. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/connector.yaml +0 -0
  220. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/context.yaml +0 -0
  221. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/dashboard.yaml +0 -0
  222. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/data-app.yaml +0 -0
  223. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/dataset.yaml +0 -0
  224. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/doctor.yaml +0 -0
  225. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/external-key.yaml +0 -0
  226. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/file.yaml +0 -0
  227. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/folder.yaml +0 -0
  228. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/job.yaml +0 -0
  229. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/log.yaml +0 -0
  230. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/notification.yaml +0 -0
  231. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/parameter.yaml +0 -0
  232. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/report.yaml +0 -0
  233. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/schedule.yaml +0 -0
  234. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/schema.yaml +0 -0
  235. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/skill.yaml +0 -0
  236. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/snippet.yaml +0 -0
  237. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/support.yaml +0 -0
  238. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/template.yaml +0 -0
  239. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/trash.yaml +0 -0
  240. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/upgrade.yaml +0 -0
  241. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/user.yaml +0 -0
  242. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/version.yaml +0 -0
  243. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/view.yaml +0 -0
  244. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/webhook.yaml +0 -0
  245. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/commands/workflow.yaml +0 -0
  246. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/openapi-operations.yaml +0 -0
  247. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/manifests/schema-v1.json +0 -0
  248. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/openapi/metadata.json +0 -0
  249. {mammoth_cli-2.2.2 → mammoth_cli-2.2.3}/spec/openapi/openapi.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mammoth-cli
3
- Version: 2.2.2
3
+ Version: 2.2.3
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.9,>=0.8.4
20
+ Requires-Dist: mammoth-io<0.9,>=0.8.5
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.2.2"
9
+ __version__ = "2.2.3"
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 589; 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 595; 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
 
@@ -34,7 +34,7 @@ Load only the applicable domain file:
34
34
  - [log](commands/log.md) — 2 published commands
35
35
  - [notification](commands/notification.md) — 5 published commands
36
36
  - [parameter](commands/parameter.md) — 14 published commands
37
- - [project](commands/project.md) — 23 published commands
37
+ - [project](commands/project.md) — 24 published commands
38
38
  - [report](commands/report.md) — 1 published commands
39
39
  - [schedule](commands/schedule.md) — 5 published commands
40
40
  - [schema](commands/schema.md) — 3 published commands
@@ -50,4 +50,4 @@ Load only the applicable domain file:
50
50
  - [view](commands/view.md) — 90 published commands
51
51
  - [webhook](commands/webhook.md) — 7 published commands
52
52
  - [workflow](commands/workflow.md) — 16 published commands
53
- - [workspace](commands/workspace.md) — 20 published commands
53
+ - [workspace](commands/workspace.md) — 25 published commands
@@ -132,6 +132,16 @@ Result: `ProjectMemoryRemoveResult`; mutation `benign_mutation`, confirmation `n
132
132
 
133
133
  Status on release: untried; no live run recorded.
134
134
 
135
+ ### `project.needs-attention`
136
+
137
+ Run: `mammoth project needs-attention`. Exact input fields: `mammoth schema get project.needs-attention`.
138
+
139
+ Example: `mammoth project needs-attention 123`. Placeholders are illustrative; resolve IDs and input from observed reads.
140
+
141
+ Result: `ProjectNeedsAttentionResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
142
+
143
+ Status on release: untried; no live run recorded.
144
+
135
145
  ### `project.pending-changes`
136
146
 
137
147
  Run: `mammoth project pending-changes`. Exact input fields: `mammoth schema get project.pending-changes`.
@@ -64,6 +64,56 @@ Result: `WorkspaceGetResult`; mutation `read`, confirmation `none`, wait policy
64
64
 
65
65
  Status on release: ran once on CLI 2.0.18 — fixture-lifecycle sweep 2026-09-19: exit 0 on release with CLI 2.0.18. Returned workspace 4 (API Tests) profile. Single invocation only.
66
66
 
67
+ ### `workspace.invite.delete`
68
+
69
+ Run: `mammoth workspace invite delete`. Exact input fields: `mammoth schema get workspace.invite.delete`.
70
+
71
+ Example: `mammoth workspace invite delete --input '{"invite_ids": [1]}'`. Illustrative only: append `--yes` after observing an owned target.
72
+
73
+ Result: `WorkspaceInviteDeleteResult`; mutation `destructive`, confirmation `prompt_or_yes`, wait policy `not_async`.
74
+
75
+ Status on release: untried; no live run recorded.
76
+
77
+ ### `workspace.invite.list`
78
+
79
+ Run: `mammoth workspace invite list`. Exact input fields: `mammoth schema get workspace.invite.list`.
80
+
81
+ Example: `mammoth workspace invite list`. Placeholders are illustrative; resolve IDs and input from observed reads.
82
+
83
+ Result: `WorkspaceInviteListResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
84
+
85
+ Status on release: untried; no live run recorded.
86
+
87
+ ### `workspace.invite.resend`
88
+
89
+ Run: `mammoth workspace invite resend`. Exact input fields: `mammoth schema get workspace.invite.resend`.
90
+
91
+ Example: `mammoth workspace invite resend --input '{"invite_ids": [1]}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
92
+
93
+ Result: `WorkspaceInviteResendResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
94
+
95
+ Status on release: untried; no live run recorded.
96
+
97
+ ### `workspace.invite.revoke`
98
+
99
+ Run: `mammoth workspace invite revoke`. Exact input fields: `mammoth schema get workspace.invite.revoke`.
100
+
101
+ Example: `mammoth workspace invite revoke --input '{"invite_ids": [1]}'`. Illustrative only: append `--yes` after observing an owned target.
102
+
103
+ Result: `WorkspaceInviteRevokeResult`; mutation `destructive`, confirmation `prompt_or_yes`, wait policy `not_async`.
104
+
105
+ Status on release: untried; no live run recorded.
106
+
107
+ ### `workspace.invite.update-role`
108
+
109
+ Run: `mammoth workspace invite update-role`. Exact input fields: `mammoth schema get workspace.invite.update-role`.
110
+
111
+ Example: `mammoth workspace invite update-role --input '{"invite_id": 1, "role": "sample"}'`. Illustrative only: append `--yes` after observing an owned target.
112
+
113
+ Result: `WorkspaceInviteUpdateRoleResult`; mutation `high_impact`, confirmation `yes_always`, wait policy `not_async`.
114
+
115
+ Status on release: untried; no live run recorded.
116
+
67
117
  ### `workspace.list`
68
118
 
69
119
  Run: `mammoth workspace list`. Exact input fields: `mammoth schema get workspace.list`.
@@ -129,6 +129,12 @@ Response shapes are not uniform; never reuse one `jq` path across commands.
129
129
  command returns its object directly under `data`. Inspect the first response
130
130
  before extracting a field.
131
131
 
132
+ `project list` shows only the projects the user is a member of, the same as the
133
+ Mammoth UI. A workspace owner or admin can read other projects but not open
134
+ them, so never report them as access denied. Pass `include_non_members: true`
135
+ only when the user asks about projects they are not in; each row then carries
136
+ `member`.
137
+
132
138
  ## Exports
133
139
 
134
140
  First inspect `view.export.list/get` for existing configuration and the exact
@@ -31,7 +31,7 @@ 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
33
  from mammoth_cli.services.listing import (
34
- DATASET_LIST_FIELDS,
34
+ DATASET_ROW_FIELDS,
35
35
  ambiguity_note,
36
36
  dataset_summary,
37
37
  fit_budget,
@@ -258,7 +258,7 @@ def dataset_list(invocation: Invocation) -> HandlerResult:
258
258
  return _dataset_name_search(invocation, project_id, name.strip(), document)
259
259
  compact = not document.get("full")
260
260
  if compact:
261
- kwargs["fields"] = DATASET_LIST_FIELDS
261
+ kwargs["fields"] = DATASET_ROW_FIELDS
262
262
  with open_service(invocation) as (service, auth):
263
263
  data = service.call(_symbol(invocation), **kwargs)
264
264
  if compact:
@@ -279,7 +279,7 @@ def _dataset_name_search(
279
279
  "mammoth.api.datasets.DatasetsAPI.list_all",
280
280
  project_id=project_id,
281
281
  sort=document.get("sort", "(created_at:desc)"),
282
- fields=DATASET_LIST_FIELDS,
282
+ fields=DATASET_ROW_FIELDS,
283
283
  )
284
284
  records = data.get("datasets", []) if isinstance(data, dict) else []
285
285
  page = search_page(records, name, int(document.get("offset", 0)), document.get("limit"))
@@ -115,7 +115,11 @@ def _forward_optional(
115
115
 
116
116
 
117
117
  def project_list(invocation: Invocation) -> HandlerResult:
118
- """List projects in the active workspace, one page at a time.
118
+ """List the caller's member projects in the active workspace, one page at a time.
119
+
120
+ These are the projects the Mammoth UI shows. ``include_non_members: true``
121
+ adds the other workspace projects (workspace owners and admins can read
122
+ them but not open them); every row then carries ``member``.
119
123
 
120
124
  ``offset`` forwards for pagination past the server's 100-row page, the
121
125
  same as ``dataset list``; a short page's ``next`` in the response is
@@ -124,7 +128,7 @@ def project_list(invocation: Invocation) -> HandlerResult:
124
128
  """
125
129
  document = invocation.load_input() or {}
126
130
  kwargs: dict[str, Any] = {"limit": int(document.get("limit", 100))}
127
- _forward_optional(document, kwargs, ("offset",))
131
+ _forward_optional(document, kwargs, ("offset", "include_non_members"))
128
132
  with open_service(invocation) as (service, auth):
129
133
  data = service.call(_symbol(invocation), **kwargs)
130
134
  return data, _meta(invocation, auth.workspace_id, resolved_project(invocation))
@@ -146,6 +150,14 @@ def project_pending_changes(invocation: Invocation) -> HandlerResult:
146
150
  return data, _meta(invocation, auth.workspace_id, project_id)
147
151
 
148
152
 
153
+ def project_needs_attention(invocation: Invocation) -> HandlerResult:
154
+ """List the Monitor "Needs Attention" rows with the dataset behind each view."""
155
+ project_id = _project_id(invocation)
156
+ with open_service(invocation) as (service, auth):
157
+ data = service.call(_symbol(invocation), project_id=project_id)
158
+ return data, _meta(invocation, auth.workspace_id, project_id)
159
+
160
+
149
161
  def project_memory_list(invocation: Invocation) -> HandlerResult:
150
162
  """List the caller's saved agent preferences for a project."""
151
163
  project_id = _project_id(invocation)
@@ -253,6 +253,7 @@ HANDLERS: dict[str, Handler] = {
253
253
  "project.list": project_cmd.project_list,
254
254
  "project.get": project_cmd.project_get,
255
255
  "project.check": project_cmd.project_check,
256
+ "project.needs-attention": project_cmd.project_needs_attention,
256
257
  "project.pending-changes": project_cmd.project_pending_changes,
257
258
  "project.memory.list": project_cmd.project_memory_list,
258
259
  "project.memory.add": project_cmd.project_memory_add,
@@ -293,6 +294,11 @@ HANDLERS: dict[str, Handler] = {
293
294
  "workspace.delete": workspace_cmd.workspace_delete,
294
295
  "workspace.get": workspace_cmd.workspace_get,
295
296
  "workspace.list": workspace_cmd.workspace_list,
297
+ "workspace.invite.delete": workspace_cmd.workspace_invite_delete,
298
+ "workspace.invite.list": workspace_cmd.workspace_invite_list,
299
+ "workspace.invite.resend": workspace_cmd.workspace_invite_resend,
300
+ "workspace.invite.revoke": workspace_cmd.workspace_invite_revoke,
301
+ "workspace.invite.update-role": workspace_cmd.workspace_invite_update_role,
296
302
  "workspace.llm-task": workspace_cmd.workspace_llm_task,
297
303
  "workspace.reactivate": workspace_cmd.workspace_reactivate,
298
304
  "workspace.segment.list": workspace_cmd.workspace_segment_list,
@@ -341,6 +341,9 @@ _COMMAND_DISCOVERY_PURPOSES = {
341
341
  "project.pending-changes": (
342
342
  "source changes new rows not taken in yet pending updates waiting to apply"
343
343
  ),
344
+ "project.needs-attention": (
345
+ "monitor needs attention error failing pipeline views delete datasets behind list"
346
+ ),
344
347
  "project.resource-status": "stuck stale failing broken error status anything wrong health",
345
348
  "connector.ai.chat": (
346
349
  "connect our own internal custom api build a connector for an unsupported source"
@@ -308,7 +308,7 @@ def workspace_user_list(invocation: Invocation) -> HandlerResult:
308
308
  """
309
309
  document = invocation.load_input() or {}
310
310
  kwargs: dict[str, Any] = {"fields": _USER_LIST_FIELDS}
311
- _forward_optional(document, kwargs, ("fields",))
311
+ _forward_optional(document, kwargs, ("fields", "project_id"))
312
312
  with open_service(invocation) as (service, auth):
313
313
  data = service.call(_symbol(invocation), **kwargs)
314
314
  return data, _meta(invocation, auth.workspace_id)
@@ -372,3 +372,55 @@ def workspace_user_update_batch(invocation: Invocation) -> HandlerResult:
372
372
  with open_service(invocation) as (service, auth):
373
373
  data = service.call(_symbol(invocation), patches=patches)
374
374
  return data, _meta(invocation, auth.workspace_id)
375
+
376
+
377
+ def workspace_invite_list(invocation: Invocation) -> HandlerResult:
378
+ """List pending invites with their invite ids; ``project_id`` narrows to one project."""
379
+ document = invocation.load_input() or {}
380
+ kwargs: dict[str, Any] = {}
381
+ _forward_optional(document, kwargs, ("project_id",))
382
+ with open_service(invocation) as (service, auth):
383
+ data = service.call(_symbol(invocation), **kwargs)
384
+ return data, _meta(invocation, auth.workspace_id)
385
+
386
+
387
+ def _invite_ids_call(invocation: Invocation) -> HandlerResult:
388
+ document = invocation.load_input()
389
+ invite_ids = _require_field(document, "invite_ids")
390
+ with open_service(invocation) as (service, auth):
391
+ data = service.call(_symbol(invocation), invite_ids=invite_ids)
392
+ return data, _meta(invocation, auth.workspace_id)
393
+
394
+
395
+ def workspace_invite_resend(invocation: Invocation) -> HandlerResult:
396
+ """Send the invitation email again. ``invite_ids`` from ``--input``."""
397
+ return _invite_ids_call(invocation)
398
+
399
+
400
+ def workspace_invite_revoke(invocation: Invocation) -> HandlerResult:
401
+ """Revoke pending invites. Prompt or ``--yes`` required."""
402
+ enforce_confirmation(
403
+ invocation, policy=POLICY_PROMPT_OR_YES, action="revoke pending workspace invites"
404
+ )
405
+ return _invite_ids_call(invocation)
406
+
407
+
408
+ def workspace_invite_delete(invocation: Invocation) -> HandlerResult:
409
+ """Delete pending invites and free their seats. Prompt or ``--yes`` required."""
410
+ enforce_confirmation(
411
+ invocation, policy=POLICY_PROMPT_OR_YES, action="delete pending workspace invites"
412
+ )
413
+ return _invite_ids_call(invocation)
414
+
415
+
416
+ def workspace_invite_update_role(invocation: Invocation) -> HandlerResult:
417
+ """Change the role a pending invite grants. ``--yes`` required."""
418
+ document = invocation.load_input()
419
+ invite_id = _require_field(document, "invite_id")
420
+ role = _require_field(document, "role")
421
+ enforce_confirmation(
422
+ invocation, policy=POLICY_YES_ALWAYS, action=f"change the role of invite {invite_id}"
423
+ )
424
+ with open_service(invocation) as (service, auth):
425
+ data = service.call(_symbol(invocation), invite_id=invite_id, role=role)
426
+ return data, _meta(invocation, auth.workspace_id)
@@ -132,6 +132,16 @@ class Sub:
132
132
 
133
133
  _VIEW_FWD = ("dataset_id", "dataview_id", "project_id")
134
134
 
135
+ #: A pending workspace invite, named by its email from ``workspace invite list``.
136
+ _INVITE_SUB = Sub(
137
+ "invite",
138
+ "invite_ids",
139
+ source="workspace.invite.list",
140
+ container="invites",
141
+ label_paths=("email",),
142
+ name_fmt="invite for {label}",
143
+ )
144
+
135
145
  #: Command -> the sub-resources it changes. Shapes verified live on koyal:
136
146
  #: task ``params.SEQUENCE_NUMBER``/``params.TASK_KEY``; version ``name``;
137
147
  #: agent session ``title``; parameter group ``name``; tag ``name``; context
@@ -303,6 +313,8 @@ SUBS: dict[str, tuple[Sub, ...]] = {
303
313
  name_fmt="{label} › access to {parent}",
304
314
  ),
305
315
  ),
316
+ "workspace.invite.delete": (_INVITE_SUB,),
317
+ "workspace.invite.revoke": (_INVITE_SUB,),
306
318
  "notification.delete": (Sub("notification", "notification_id"),),
307
319
  "notification.delete-batch": (Sub("notification", "ids"),),
308
320
  }
@@ -526,6 +538,16 @@ def _target_spec(command_id: str, would_call: Mapping[str, Any]) -> tuple[str, s
526
538
  return None
527
539
 
528
540
 
541
+ def _remove_batch_invites(
542
+ service: MammothService, command_id: str, arguments: Mapping[str, Any]
543
+ ) -> list[dict[str, Any]]:
544
+ """The pending invites a ``user remove-batch`` call deletes, named by email."""
545
+ invite_ids = _ids(arguments.get("invite_ids"))
546
+ if not invite_ids:
547
+ return []
548
+ return _sub_targets(service, command_id, _INVITE_SUB, {"invite_ids": invite_ids})
549
+
550
+
529
551
  def resolve_targets(
530
552
  service: MammothService, command_id: str, would_call: Mapping[str, Any]
531
553
  ) -> list[dict[str, Any]]:
@@ -559,8 +581,9 @@ def resolve_targets(
559
581
  return []
560
582
  kind, id_arg = spec
561
583
  ids = _ids(arguments.get(id_arg, would_call.get(id_arg)))
562
- if arguments.get("invite_ids"):
563
- raise unresolvable_error(command_id, "pending invites have no read that names them")
584
+ invites = _remove_batch_invites(service, command_id, arguments)
585
+ if not ids and invites:
586
+ return invites
564
587
  if not ids:
565
588
  raise unresolvable_error(
566
589
  command_id, f"the call carries no explicit '{id_arg}' ids (it may target every {kind})"
@@ -572,7 +595,7 @@ def resolve_targets(
572
595
  parent = {**arguments}
573
596
  if "dataset_id" not in parent and would_call.get("dataset_id") is not None:
574
597
  parent["dataset_id"] = would_call["dataset_id"]
575
- return [_read_name(service, kind, item, parent) for item in ids]
598
+ return [_read_name(service, kind, item, parent) for item in ids] + invites
576
599
 
577
600
 
578
601
  #: Deletes whose dry run also lists what depends on the resource: command ->
@@ -30,6 +30,7 @@ import json
30
30
  import logging
31
31
  import os
32
32
  import sys
33
+ import threading
33
34
  import time
34
35
  import uuid
35
36
  from dataclasses import dataclass, field
@@ -45,6 +46,12 @@ LOG_DIR_ENV = "MAMMOTH_LOG_DIR"
45
46
  RETENTION_DAYS = 7
46
47
  MAX_FILE_BYTES = 20 * 1024 * 1024
47
48
  _LOGGER_NAMES = ("mammoth", "mammoth_cli")
49
+ #: Invocations overlap in an embedded host (one thread each). Logger levels are
50
+ #: process-wide, so they are saved by the first attach and restored by the last
51
+ #: detach; a per-invocation restore silenced the others' ``mammoth.http`` lines.
52
+ _LEVEL_LOCK = threading.Lock()
53
+ _ATTACHED = 0
54
+ _SAVED_LEVELS: dict[str, int] = {}
48
55
  _INPUT_OPTION = "--input"
49
56
  _REDACTED_INPUT = "<redacted --input>"
50
57
 
@@ -234,12 +241,19 @@ class RunLog:
234
241
  def attach(self, *, debug: bool) -> None:
235
242
  if self._disabled:
236
243
  return
244
+ global _ATTACHED
237
245
  level = logging.DEBUG if debug else logging.INFO
246
+ with _LEVEL_LOCK:
247
+ if _ATTACHED == 0:
248
+ _SAVED_LEVELS.update({n: logging.getLogger(n).level for n in _LOGGER_NAMES})
249
+ _ATTACHED += 1
250
+ self._previous_levels.update(_SAVED_LEVELS)
251
+ for name in _LOGGER_NAMES:
252
+ logger = logging.getLogger(name)
253
+ if logger.level == logging.NOTSET or logger.level > level:
254
+ logger.setLevel(level)
238
255
  for name in _LOGGER_NAMES:
239
256
  logger = logging.getLogger(name)
240
- self._previous_levels[name] = logger.level
241
- if logger.level == logging.NOTSET or logger.level > level:
242
- logger.setLevel(level)
243
257
  handlers: list[logging.Handler] = [_JsonlHandler(self)]
244
258
  if debug:
245
259
  handlers.append(_StderrHandler(level=level))
@@ -250,8 +264,14 @@ class RunLog:
250
264
  def detach(self) -> None:
251
265
  for logger, handler in self._handlers:
252
266
  logger.removeHandler(handler)
253
- for name, level in self._previous_levels.items():
254
- logging.getLogger(name).setLevel(level)
267
+ global _ATTACHED
268
+ if self._previous_levels:
269
+ with _LEVEL_LOCK:
270
+ _ATTACHED -= 1
271
+ if _ATTACHED == 0:
272
+ for name, level in _SAVED_LEVELS.items():
273
+ logging.getLogger(name).setLevel(level)
274
+ self._previous_levels.clear()
255
275
  self._handlers.clear()
256
276
 
257
277
 
@@ -482,6 +482,7 @@ S2_COMMANDS = frozenset(
482
482
  "project.memory.add",
483
483
  "project.memory.list",
484
484
  "project.memory.remove",
485
+ "project.needs-attention",
485
486
  "project.pending-changes",
486
487
  "project.publish-credentials",
487
488
  "project.resource-dependencies",
@@ -26,6 +26,10 @@ DATASET_LIST_FIELDS = (
26
26
  "id,name,created_at,updated_at,status,stats,sources,data_schema,additional_info"
27
27
  )
28
28
 
29
+ #: ``fields`` for ``dataset list`` rows: only what the server computes cheaply. ``stats``
30
+ #: (row count: DuckDB) and ``data_schema`` stay on ``dataset get``.
31
+ DATASET_ROW_FIELDS = "id,name,created_at,updated_at,status,sources,additional_info"
32
+
29
33
  _MAX_COLUMNS = 4
30
34
  #: Columns whose stored sample values a view summary shows, and values per column.
31
35
  _SAMPLE_COLUMNS = 6
@@ -130,6 +130,8 @@ POSITIONAL_OVERRIDES: dict[str, tuple[PositionalSpec, ...]] = {
130
130
  # The chat session is the global ``--session`` option, never a positional or
131
131
  # an --input field; only the action or run being addressed is positional.
132
132
  "agent.action.list": (),
133
+ # The invite is named in ``--input`` (``invite_id``), never positionally.
134
+ "workspace.invite.update-role": (),
133
135
  "agent.run.status": (),
134
136
  "agent.run.list": (),
135
137
  "agent.action.delete": (
@@ -301,6 +303,7 @@ POSITIONAL_OVERRIDES: dict[str, tuple[PositionalSpec, ...]] = {
301
303
  help="Check only this dataset's first view; no other dataset or dashboard is read.",
302
304
  ),
303
305
  ),
306
+ "project.needs-attention": _optional_project_id(),
304
307
  "project.pending-changes": _optional_project_id(),
305
308
  "project.memory.list": _optional_project_id(),
306
309
  "project.memory.add": _optional_project_id(),
@@ -64,7 +64,9 @@ class MammothService(Protocol):
64
64
  """
65
65
  ...
66
66
 
67
- def list_projects(self, limit: int = 100, offset: int = 0) -> dict[str, Any]:
67
+ def list_projects(
68
+ self, limit: int = 100, offset: int = 0, include_non_members: bool = False
69
+ ) -> dict[str, Any]:
68
70
  """List projects in the current workspace.
69
71
 
70
72
  Args:
@@ -76,7 +78,7 @@ class MammothService(Protocol):
76
78
  """
77
79
  ...
78
80
 
79
- def list_all_projects(self) -> list[dict[str, Any]]:
81
+ def list_all_projects(self, include_non_members: bool = False) -> list[dict[str, Any]]:
80
82
  """Every project in the workspace, across the route's pages.
81
83
 
82
84
  Returns:
@@ -792,8 +792,10 @@ class SdkMammothService:
792
792
  except Exception as exc:
793
793
  raise map_sdk_exception(exc) from exc
794
794
 
795
- def list_projects(self, limit: int = 100, offset: int = 0) -> dict[str, Any]:
796
- """List projects in the current workspace.
795
+ def list_projects(
796
+ self, limit: int = 100, offset: int = 0, include_non_members: bool = False
797
+ ) -> dict[str, Any]:
798
+ """List projects in the current workspace (member projects unless widened).
797
799
 
798
800
  The projects route caps ``limit`` at 100 and pages with a server-side
799
801
  ``offset``; a larger ``limit`` is served by walking the pages.
@@ -801,6 +803,8 @@ class SdkMammothService:
801
803
  Args:
802
804
  limit: Maximum number of results.
803
805
  offset: Number of leading results to skip.
806
+ include_non_members: Also list projects the caller is not a member
807
+ of; each row then carries ``member``.
804
808
 
805
809
  Returns:
806
810
  The raw project-list response, with ``projects`` holding at most
@@ -811,9 +815,15 @@ class SdkMammothService:
811
815
  """
812
816
  try:
813
817
  if limit <= _PROJECT_PAGE_SIZE:
814
- response = self._run(self._client.projects.list(limit=limit, offset=offset))
818
+ response = self._run(
819
+ self._client.projects.list(
820
+ limit=limit, offset=offset, include_non_members=include_non_members
821
+ )
822
+ )
815
823
  return {**response, "projects": list(response.get("projects", []))}
816
- everything = self._run(self._client.projects.list_all())
824
+ everything = self._run(
825
+ self._client.projects.list_all(include_non_members=include_non_members)
826
+ )
817
827
  except Exception as exc:
818
828
  raise map_sdk_exception(exc) from exc
819
829
  return {
@@ -823,14 +833,20 @@ class SdkMammothService:
823
833
  "next": "",
824
834
  }
825
835
 
826
- def list_all_projects(self) -> list[dict[str, Any]]:
827
- """Every project in the workspace, across the route's 100-row pages.
836
+ def list_all_projects(self, include_non_members: bool = False) -> list[dict[str, Any]]:
837
+ """Every member project in the workspace, across the route's 100-row pages.
838
+
839
+ Args:
840
+ include_non_members: Also list projects the caller is not a member
841
+ of; each row then carries ``member``.
828
842
 
829
843
  Raises:
830
844
  CliError: Mapped from any SDK exception.
831
845
  """
832
846
  try:
833
- return list(self._run(self._client.projects.list_all()))
847
+ return list(
848
+ self._run(self._client.projects.list_all(include_non_members=include_non_members))
849
+ )
834
850
  except Exception as exc:
835
851
  raise map_sdk_exception(exc) from exc
836
852
 
@@ -120,12 +120,14 @@ class FakeMammothService:
120
120
  )
121
121
  return {"projects": self.projects[:1]}
122
122
 
123
- def list_projects(self, limit: int = 100, offset: int = 0) -> dict[str, Any]:
123
+ def list_projects(
124
+ self, limit: int = 100, offset: int = 0, include_non_members: bool = False
125
+ ) -> dict[str, Any]:
124
126
  """Return the in-memory project list, sliced by offset/limit."""
125
127
  self.calls.append("list_projects")
126
128
  return {"projects": self.projects[offset : offset + limit]}
127
129
 
128
- def list_all_projects(self) -> list[dict[str, Any]]:
130
+ def list_all_projects(self, include_non_members: bool = False) -> list[dict[str, Any]]:
129
131
  """Return the whole in-memory project list."""
130
132
  self.calls.append("list_all_projects")
131
133
  return list(self.projects)
@@ -1,13 +1,13 @@
1
1
  [project]
2
2
  name = "mammoth-cli"
3
- version = "2.2.2"
3
+ version = "2.2.3"
4
4
  description = "Command-line interface for the Mammoth Analytics platform"
5
5
  authors = [{name = "Mammoth Analytics", email = "support@mammoth.io"}]
6
6
  readme = "README.md"
7
7
  license = "LicenseRef-Proprietary"
8
8
  requires-python = ">=3.12,<3.15"
9
9
  dependencies = [
10
- "mammoth-io (>=0.8.4,<0.9)",
10
+ "mammoth-io (>=0.8.5,<0.9)",
11
11
  "typer (>=0.27,<0.28)",
12
12
  "rich (>=15,<16)",
13
13
  "platformdirs (>=4.10,<5)",
@@ -546,6 +546,49 @@ commands:
546
546
  ids:
547
547
  project_id: positional.0
548
548
  kind: object
549
+ - command_id: project.needs-attention
550
+ command_path: project needs-attention
551
+ disposition: command
552
+ alias_of: null
553
+ operation_ids: []
554
+ positionals:
555
+ - name: project_id
556
+ type: int
557
+ required: false
558
+ metavar: PROJECT_ID
559
+ falls_back_to_field: null
560
+ help: ID of the project to act on; defaults to the active project.
561
+ options: []
562
+ sdk_symbol: mammoth.api.projects.ProjectsAPI.needs_attention
563
+ sdk_conversion: Call mammoth.api.projects.ProjectsAPI.needs_attention with validated request fields.
564
+ request_model: ProjectNeedsAttentionRequest
565
+ result_model: ProjectNeedsAttentionResult
566
+ mutation_class: read
567
+ confirmation: none
568
+ wait_policy: not_async
569
+ pagination_policy: none
570
+ acceptance_evidence: live_read_only
571
+ live_test: LT-PROJECT-NEEDS-ATTENTION
572
+ live_exemption_reason: null
573
+ contract_fixture: null
574
+ required_fixture_guard: null
575
+ secret_fields: []
576
+ human_example: mammoth project needs-attention --help
577
+ agent_example: mammoth project needs-attention 123
578
+ unit_tests:
579
+ - UT-PROJECT-NEEDS-ATTENTION
580
+ contract_tests:
581
+ - CT-PROJECT-NEEDS-ATTENTION-HUMAN
582
+ - CT-PROJECT-NEEDS-ATTENTION-JSON
583
+ - CT-PROJECT-NEEDS-ATTENTION-ERROR
584
+ draft_test: null
585
+ undo_test: null
586
+ known_restrictions: 'The rows of the Monitor Needs Attention tab for one project (the app has no workspace-wide list): pipeline_error, pending_pipeline, pending_data, checkpoint (needs approval), data_check (failed), each with view_id and the owning dataset_id; datasets lists each affected dataset once with its view_ids. Dataset-level action-needed items and pending retentions are not returned by the API and are not included. To delete the datasets behind the views, take dataset_id from datasets and run dataset delete or dataset bulk-delete (confirm first).'
587
+ reviewed_by: primary
588
+ readback:
589
+ command: project.needs-attention
590
+ ids: {}
591
+ kind: object
549
592
  - command_id: project.pending-changes
550
593
  command_path: project pending-changes
551
594
  disposition: command