mammoth-cli 2.2.79__tar.gz → 2.2.80__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 (288) hide show
  1. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/PKG-INFO +5 -3
  2. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/README.md +4 -2
  3. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/__init__.py +1 -1
  4. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/app.py +7 -1
  5. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +3 -5
  6. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +10 -5
  7. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/auth.py +14 -4
  8. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/doctor.py +37 -0
  9. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/project.py +3 -0
  10. mammoth_cli-2.2.80/mammoth_cli/runtime/token_scope.py +52 -0
  11. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/dashboard_review.py +10 -4
  12. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/skills/steering.py +4 -3
  13. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/pyproject.toml +1 -1
  14. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/.gitignore +0 -0
  15. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/LICENSE +0 -0
  16. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/__main__.py +0 -0
  17. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
  18. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
  19. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
  20. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
  21. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  22. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  23. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  24. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  25. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  26. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  27. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  28. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  29. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  30. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  31. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
  32. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  33. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  34. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/collection.md +0 -0
  35. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  36. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  37. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  38. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  39. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
  40. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +0 -0
  41. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-template.md +0 -0
  42. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
  43. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  44. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  45. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  46. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  47. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  48. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  49. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  50. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/link.md +0 -0
  51. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  52. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  53. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  54. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
  55. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  56. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/resolve.md +0 -0
  57. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  58. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  59. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  60. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  61. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  62. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  63. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/token.md +0 -0
  64. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  65. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  66. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  67. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  68. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
  69. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +0 -0
  70. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  71. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  72. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  73. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  74. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
  75. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  76. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  77. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  78. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  79. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/build-an-agent.md +0 -0
  80. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  81. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
  82. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/database-import.md +0 -0
  83. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
  84. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  85. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/file-import.md +0 -0
  86. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  87. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  88. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  89. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/rest-api-import.md +0 -0
  90. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
  91. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
  92. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  93. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  94. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  95. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  96. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  97. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
  98. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/__init__.py +0 -0
  99. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/_lazy.py +0 -0
  100. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/activity.py +0 -0
  101. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/addon.py +0 -0
  102. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/agent.py +0 -0
  103. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/ai.py +0 -0
  104. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/annotation.py +0 -0
  105. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/automation.py +0 -0
  106. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/batch.py +0 -0
  107. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/billing.py +0 -0
  108. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/browse.py +0 -0
  109. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/calc.py +0 -0
  110. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/capability.py +0 -0
  111. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/client_app.py +0 -0
  112. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/completion.py +0 -0
  113. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/config.py +0 -0
  114. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/connector.py +0 -0
  115. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/context.py +0 -0
  116. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/dashboard.py +0 -0
  117. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/data_app.py +0 -0
  118. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/dataset.py +0 -0
  119. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/external_key.py +0 -0
  120. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/file.py +0 -0
  121. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/folder.py +0 -0
  122. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/help_summaries.json +0 -0
  123. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/job.py +0 -0
  124. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/link.py +0 -0
  125. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/notification.py +0 -0
  126. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/parameter.py +0 -0
  127. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/registry.py +0 -0
  128. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/report.py +0 -0
  129. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/resolve.py +0 -0
  130. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/schedule.py +0 -0
  131. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/schema.py +0 -0
  132. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/skill.py +0 -0
  133. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/snippet.py +0 -0
  134. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/support.py +0 -0
  135. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/template.py +0 -0
  136. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/trash.py +0 -0
  137. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/upgrade.py +0 -0
  138. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/user.py +0 -0
  139. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/view.py +0 -0
  140. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/view_drivers.py +0 -0
  141. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/view_explore.py +0 -0
  142. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/view_forecast.py +0 -0
  143. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/view_ops.py +0 -0
  144. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/view_profile.py +0 -0
  145. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/webhook.py +0 -0
  146. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/workflow.py +0 -0
  147. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/commands/workspace.py +0 -0
  148. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/context/__init__.py +0 -0
  149. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/context/credentials.py +0 -0
  150. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/context/endpoint.py +0 -0
  151. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/context/keyring_backend.py +0 -0
  152. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/context/oauth.py +0 -0
  153. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/context/profiles.py +0 -0
  154. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/context/resolver.py +0 -0
  155. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/contracts/__init__.py +0 -0
  156. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/contracts/auth.py +0 -0
  157. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/embed.py +0 -0
  158. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/errors/__init__.py +0 -0
  159. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/errors/envelope.py +0 -0
  160. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/manifest/__init__.py +0 -0
  161. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/manifest/loader.py +0 -0
  162. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/messages/__init__.py +0 -0
  163. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/output/__init__.py +0 -0
  164. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/output/envelope.py +0 -0
  165. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/output/normalize.py +0 -0
  166. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/output/policy.py +0 -0
  167. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/output/progress.py +0 -0
  168. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/output/render.py +0 -0
  169. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/py.typed +0 -0
  170. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/__init__.py +0 -0
  171. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/confirm.py +0 -0
  172. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/dataset_health.py +0 -0
  173. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/dryrun.py +0 -0
  174. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/dryrun_targets.py +0 -0
  175. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/embedded.py +0 -0
  176. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/executor.py +0 -0
  177. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/input_loader.py +0 -0
  178. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/intent_only.py +0 -0
  179. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/invocation.py +0 -0
  180. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/locked_files.py +0 -0
  181. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/new_data.py +0 -0
  182. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/opens.py +0 -0
  183. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/options.py +0 -0
  184. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/parents.py +0 -0
  185. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/runlog.py +0 -0
  186. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/session.py +0 -0
  187. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/state.py +0 -0
  188. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/strict.py +0 -0
  189. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/updates.py +0 -0
  190. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/validate.py +0 -0
  191. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/runtime/verify.py +0 -0
  192. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/__init__.py +0 -0
  193. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/append_blank_columns.py +0 -0
  194. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/argspec.py +0 -0
  195. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/board_values.py +0 -0
  196. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/coerce.py +0 -0
  197. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/command_contract.py +0 -0
  198. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/conditional_format.py +0 -0
  199. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/conditions.py +0 -0
  200. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/dashboard_filters.py +0 -0
  201. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/dashboard_pages.py +0 -0
  202. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/data_profile.py +0 -0
  203. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/data_quality.py +0 -0
  204. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/dispatch.py +0 -0
  205. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/explore_card_edit.py +0 -0
  206. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/explore_cards.py +0 -0
  207. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/explore_to_figure.py +0 -0
  208. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/explore_to_image.py +0 -0
  209. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/factory.py +0 -0
  210. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/folder_ids.py +0 -0
  211. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/input_fields.py +0 -0
  212. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/job_outcome.py +0 -0
  213. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/listing.py +0 -0
  214. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/local_time.py +0 -0
  215. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/mapping.py +0 -0
  216. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/openapi_types.py +0 -0
  217. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/period_analysis.py +0 -0
  218. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/positionals.py +0 -0
  219. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/protocol.py +0 -0
  220. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/read_queries.py +0 -0
  221. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/schema_diff.py +0 -0
  222. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/sdk_service.py +0 -0
  223. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/sql_check.py +0 -0
  224. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/stored_stats.py +0 -0
  225. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/testing.py +0 -0
  226. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/text_dates.py +0 -0
  227. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/type_system.py +0 -0
  228. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/view_analysis.py +0 -0
  229. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/view_variants.py +0 -0
  230. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/services/write_impact.py +0 -0
  231. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/skills/__init__.py +0 -0
  232. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/skills/installer.py +0 -0
  233. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/mammoth_cli/testing.py +0 -0
  234. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/activity.yaml +0 -0
  235. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/addon.yaml +0 -0
  236. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/agent.yaml +0 -0
  237. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/ai.yaml +0 -0
  238. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/annotation.yaml +0 -0
  239. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/auth.yaml +0 -0
  240. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/automation.yaml +0 -0
  241. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/batch.yaml +0 -0
  242. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/billing.yaml +0 -0
  243. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/browse.yaml +0 -0
  244. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/calc.yaml +0 -0
  245. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/capability.yaml +0 -0
  246. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/client-app.yaml +0 -0
  247. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/collection.yaml +0 -0
  248. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/completion.yaml +0 -0
  249. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/config.yaml +0 -0
  250. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/connector.yaml +0 -0
  251. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/context.yaml +0 -0
  252. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/dashboard.yaml +0 -0
  253. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/data-app.yaml +0 -0
  254. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/dataset.yaml +0 -0
  255. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/doctor.yaml +0 -0
  256. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/external-key.yaml +0 -0
  257. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/file.yaml +0 -0
  258. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/folder.yaml +0 -0
  259. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/job.yaml +0 -0
  260. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/link.yaml +0 -0
  261. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/log.yaml +0 -0
  262. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/notification.yaml +0 -0
  263. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/parameter.yaml +0 -0
  264. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/project.yaml +0 -0
  265. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/report.yaml +0 -0
  266. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/resolve.yaml +0 -0
  267. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/schedule.yaml +0 -0
  268. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/schema.yaml +0 -0
  269. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/skill.yaml +0 -0
  270. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/snippet.yaml +0 -0
  271. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/support.yaml +0 -0
  272. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/template.yaml +0 -0
  273. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/token.yaml +0 -0
  274. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/trash.yaml +0 -0
  275. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/upgrade.yaml +0 -0
  276. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/user.yaml +0 -0
  277. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/version.yaml +0 -0
  278. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/view.yaml +0 -0
  279. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/webhook.yaml +0 -0
  280. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/workflow.yaml +0 -0
  281. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/commands/workspace.yaml +0 -0
  282. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/edits-target.source.yaml +0 -0
  283. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/openapi-operations.yaml +0 -0
  284. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/schema-v1.json +0 -0
  285. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/sdk-catalog.source.yaml +0 -0
  286. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/manifests/sdk-methods.yaml +0 -0
  287. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/spec/openapi/metadata.json +0 -0
  288. {mammoth_cli-2.2.79 → mammoth_cli-2.2.80}/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.79
3
+ Version: 2.2.80
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
@@ -213,8 +213,10 @@ Onboard me first:
213
213
  `recommendation`, print exactly this and wait until I say done: "In the
214
214
  Mammoth web app open Workspace settings → API Tokens → Create token (no
215
215
  project, so I can create projects), copy the token (it starts with mm_ and
216
- is shown once), then run in your own terminal: mammoth auth login" —
217
- never ask for, read, or pass the token yourself, and never run auth login.
216
+ is shown once), then run in your own terminal: mammoth auth login". Or run
217
+ `mammoth auth login --device` yourself, show me the link and code it prints and wait
218
+ for it to finish — never ask for, read, or pass the token yourself, and never run any
219
+ other auth login method.
218
220
  3. Require `mammoth doctor` to pass, then run `mammoth skill show` and
219
221
  follow the guide it prints.
220
222
  Work inside `mammoth project ensure 'PROJECT NAME'` unless I name a project;
@@ -184,8 +184,10 @@ Onboard me first:
184
184
  `recommendation`, print exactly this and wait until I say done: "In the
185
185
  Mammoth web app open Workspace settings → API Tokens → Create token (no
186
186
  project, so I can create projects), copy the token (it starts with mm_ and
187
- is shown once), then run in your own terminal: mammoth auth login" —
188
- never ask for, read, or pass the token yourself, and never run auth login.
187
+ is shown once), then run in your own terminal: mammoth auth login". Or run
188
+ `mammoth auth login --device` yourself, show me the link and code it prints and wait
189
+ for it to finish — never ask for, read, or pass the token yourself, and never run any
190
+ other auth login method.
189
191
  3. Require `mammoth doctor` to pass, then run `mammoth skill show` and
190
192
  follow the guide it prints.
191
193
  Work inside `mammoth project ensure 'PROJECT NAME'` unless I name a project;
@@ -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.79"
9
+ __version__ = "2.2.80"
10
10
 
11
11
  # The versioned machine output envelope contract.
12
12
  SCHEMA_VERSION = 1
@@ -1307,6 +1307,11 @@ _HELP_NOTES = {
1307
1307
  ),
1308
1308
  }
1309
1309
 
1310
+ #: Commands whose ``--input`` fields apply to one path only; the label says which.
1311
+ _INPUT_FIELDS_LABEL = {
1312
+ "auth.login": "Input fields (--method token only; --device and --method oauth take none)",
1313
+ }
1314
+
1310
1315
 
1311
1316
  def _command_help(command_id: str, record: dict[str, Any] | None) -> str | None:
1312
1317
  """Build a command's user-facing ``--help`` summary.
@@ -1335,7 +1340,8 @@ def _command_help(command_id: str, record: dict[str, Any] | None) -> str | None:
1335
1340
  parts.append(f"Example: {example}")
1336
1341
  fields = _help_input_fields(command_id)
1337
1342
  if fields:
1338
- parts.append(f"Input fields: {fields}")
1343
+ label = _INPUT_FIELDS_LABEL.get(command_id, "Input fields")
1344
+ parts.append(f"{label}: {fields}")
1339
1345
  return "\n\n".join(parts) or None
1340
1346
 
1341
1347
 
@@ -32,11 +32,9 @@ mammoth project ensure 'PROJECT NAME' # active project
32
32
  Never proceed if `doctor` fails.
33
33
  On a 502, 504 or timeout, `mammoth doctor --input '{"wait": 300}'`
34
34
  re-probes that long; continue once it passes. Production is the `app` endpoint; use `release` only
35
- when named, and check `meta.profile`/`auth status` `endpoint` match. If no profile has credentials, tell the operator to run
36
- `mammoth auth login` in their own terminal (`--profile NAME` unless
37
- `default`; [auth](references/auth.md) says where the token comes from) and
38
- wait; never ask for the token in chat, read one from a file/env var, or run
39
- `auth login` yourself. If an envelope carries `meta.update_available`, run its `command` first.
35
+ when named, and check `meta.profile`/`auth status` `endpoint` match. If no profile has credentials, run `mammoth auth login --device` (`--profile NAME`), show the user its
36
+ link and code and wait for it to exit ([auth](references/auth.md)). Run no other login
37
+ method, and never ask for the token in chat or read one from a file/env var. If an envelope carries `meta.update_available`, run its `command` first.
40
38
 
41
39
  Piped stdout is compact JSON with prompts off; if not piped, `export
42
40
  MAMMOTH_OUTPUT=json MAMMOTH_NO_INPUT=1` once.
@@ -19,8 +19,10 @@ created without a project.
19
19
  reports `credential: oauth` and `expires_at`. A refresh that fails exits 4 with `login_expired`:
20
20
  tell the operator to run `mammoth auth login` again. `--no-browser` prints the URL. `--device` is the sign-in for a
21
21
  machine with no browser: it prints a short code and a URL for the operator to approve on another
22
- device, then polls. Browser and device sign-in are for the operator's own terminal; an agent never
23
- runs them. A key made with `token create` expires after 30 days: `cli_key_expired` means run
22
+ device, then polls. An agent may run `mammoth auth login --device` (and only that): it prints the
23
+ link and code on stderr, the agent shows both to the user, and the command exits once the user has
24
+ approved on their device. Browser sign-in (`--method oauth`) and token login are for the operator's
25
+ own terminal; an agent never runs them. A key made with `token create` expires after 30 days: `cli_key_expired` means run
24
26
  `mammoth auth login` again. `auth logout` also revokes the
25
27
  connection on the server, and warns (still clearing local state) if it cannot.
26
28
 
@@ -66,9 +68,12 @@ human operator:
66
68
  2. Wait for the operator to confirm, then re-run
67
69
  `mammoth auth status --profile PROFILE` and
68
70
  `mammoth doctor --profile PROFILE`.
69
- 3. Do not ask the operator to paste the token into chat. Do not run
70
- `auth login` yourself, with or without `--input`, unless the operator has
71
- explicitly given you a protected `0600` credential file path to use.
71
+ 3. Do not ask the operator to paste the token into chat. The one login an agent
72
+ may run itself is `mammoth auth login --device`: it prints a link and a short
73
+ code on stderr; show both to the operator, wait for the command to exit, then
74
+ re-run `auth status`. Do not run any other `auth login` (browser, `--method token`,
75
+ `--input`), unless the operator has explicitly given you a protected `0600`
76
+ credential file path to use.
72
77
 
73
78
  The only supported configuration is the API token and an optional one-label server prefix (default `app`). There is no base-url
74
79
  override.
@@ -38,6 +38,7 @@ from mammoth_cli.runtime import executor
38
38
  from mammoth_cli.runtime import options as go
39
39
  from mammoth_cli.runtime.input_loader import load_input_document
40
40
  from mammoth_cli.runtime.invocation import Invocation
41
+ from mammoth_cli.runtime.token_scope import pinned_project
41
42
  from mammoth_cli.services import factory as service_factory
42
43
 
43
44
  _STORAGE_MODES = ("auto", "keyring", "file")
@@ -360,7 +361,11 @@ def _no_choice(label: str = "choice") -> CliError:
360
361
  code="login_input_required",
361
362
  message=f"No {label} was entered.",
362
363
  exit_status=EXIT_USAGE,
363
- hint="Pass --method oauth|device|token, or --input FILE for a non-interactive login.",
364
+ hint=(
365
+ "Pass --device (a code approved on another device), --method oauth --no-browser "
366
+ "(a sign-in URL), or --input FILE for a non-interactive login."
367
+ ),
368
+ recovery_commands=["mammoth auth login --device"],
364
369
  )
365
370
 
366
371
 
@@ -501,14 +506,17 @@ def _run_login(
501
506
  else:
502
507
  raise CliError(
503
508
  code="login_input_required",
504
- message="Non-interactive login requires --input.",
509
+ message="Non-interactive login needs --device, --method oauth --no-browser or --input.",
505
510
  exit_status=EXIT_USAGE,
506
511
  hint=(
507
512
  "Interactive prompting is off because "
508
513
  + "; ".join(blockers)
509
- + ". Pass --input FILE|- (with --input-format for stdin), "
514
+ + ". Pass --device to get a link and code the user approves on any other device, "
515
+ "or --method oauth --no-browser to get a sign-in URL, "
516
+ "or --input FILE|- (with --input-format for stdin) with an API token, "
510
517
  "or run in an interactive terminal."
511
518
  ),
519
+ recovery_commands=["mammoth auth login --device"],
512
520
  )
513
521
 
514
522
  resolved_base_url = resolve_base_url(effective_prefix)
@@ -671,6 +679,7 @@ def _run_status(invocation: Invocation, *, check: bool) -> tuple[dict[str, Any],
671
679
  try:
672
680
  service.check_connection()
673
681
  data["connected"] = True
682
+ data["token_project"] = pinned_project(service)
674
683
  finally:
675
684
  service.close()
676
685
  data["checked"] = True
@@ -695,7 +704,8 @@ def auth_status(
695
704
  ) -> None:
696
705
  """Report local authentication state for one profile.
697
706
 
698
- Makes no network call unless `--check` is given.
707
+ Makes no network call unless `--check` is given. With `--check` it also reports
708
+ `token_project`: the project id the token is limited to, or null when it is not limited.
699
709
  """
700
710
  invocation = go.make_invocation(
701
711
  "auth.status",
@@ -25,6 +25,8 @@ from mammoth_cli.errors.envelope import CliError
25
25
  from mammoth_cli.runtime import embedded, runlog, updates
26
26
  from mammoth_cli.runtime.invocation import Invocation
27
27
  from mammoth_cli.runtime.session import open_service, resolved_project
28
+ from mammoth_cli.runtime.token_scope import pinned_project
29
+ from mammoth_cli.services.protocol import MammothService
28
30
 
29
31
  HandlerResult = tuple[Any, dict[str, Any]]
30
32
 
@@ -137,6 +139,38 @@ def _visible_projects(service: Any) -> list[dict[str, Any]]:
137
139
  return [p for p in service.list_all_projects() if isinstance(p, dict)]
138
140
 
139
141
 
142
+ def _token_scope(service: MammothService) -> CliError | int | None:
143
+ """The project the token is limited to, or the error that kept doctor from learning it."""
144
+ try:
145
+ return pinned_project(service)
146
+ except CliError as error:
147
+ return error
148
+
149
+
150
+ def _scope_check(scope: CliError | int | None, selected_project: int | None) -> dict[str, Any]:
151
+ """Report the project the token is limited to; a limited token must work in that project."""
152
+ if isinstance(scope, CliError):
153
+ return {
154
+ **_check(
155
+ "token_scope", False, f"could not read the token's project scope: {scope.message}"
156
+ ),
157
+ "pinned_project_id": None,
158
+ }
159
+ if scope is None:
160
+ return {
161
+ **_check("token_scope", True, "token is not limited to a project"),
162
+ "pinned_project_id": None,
163
+ }
164
+ if selected_project not in (None, scope):
165
+ detail = (
166
+ f"token is limited to project {scope} but project {selected_project} is selected; "
167
+ f"use --project {scope}"
168
+ )
169
+ return {**_check("token_scope", False, detail), "pinned_project_id": scope}
170
+ detail = f"token is limited to project {scope}; it cannot create or open other projects"
171
+ return {**_check("token_scope", True, detail), "pinned_project_id": scope}
172
+
173
+
140
174
  def _nearest_existing(path: Path) -> Path:
141
175
  """Return ``path`` or its closest existing ancestor.
142
176
 
@@ -283,6 +317,7 @@ def doctor(invocation: Invocation) -> HandlerResult:
283
317
  connection_ok = False
284
318
  connection_detail = "not attempted"
285
319
  projects: list[dict[str, Any]] | None = None
320
+ scope: CliError | int | None = None
286
321
  wait_seconds = _wait_seconds(invocation)
287
322
  if auth_ok:
288
323
  started = time.monotonic()
@@ -293,6 +328,7 @@ def doctor(invocation: Invocation) -> HandlerResult:
293
328
  with open_service(invocation) as (service, _auth):
294
329
  service.check_connection()
295
330
  projects = _visible_projects(service)
331
+ scope = _token_scope(service)
296
332
  break
297
333
  except CliError as error:
298
334
  # A 502/504 or timeout during an outage: with ``wait``,
@@ -324,6 +360,7 @@ def doctor(invocation: Invocation) -> HandlerResult:
324
360
  # access is claimed by nobody here: the first write reports it.
325
361
  selected_project = resolved_project(invocation)
326
362
  if projects is not None:
363
+ checks.append(_scope_check(scope, selected_project))
327
364
  visible_ids = [p.get("id") for p in projects]
328
365
  checks.append(
329
366
  {
@@ -37,6 +37,7 @@ from mammoth_cli.runtime.confirm import (
37
37
  )
38
38
  from mammoth_cli.runtime.invocation import Invocation
39
39
  from mammoth_cli.runtime.session import open_service, resolved_project
40
+ from mammoth_cli.runtime.token_scope import require_unpinned_token
40
41
  from mammoth_cli.services import job_outcome
41
42
 
42
43
  HandlerResult = tuple[Any, dict[str, Any]]
@@ -292,6 +293,7 @@ def project_create(invocation: Invocation) -> HandlerResult:
292
293
  if field in document:
293
294
  kwargs[field] = document[field]
294
295
  with open_service(invocation) as (service, auth):
296
+ require_unpinned_token(service, "create a project")
295
297
  data = service.call(_symbol(invocation), **kwargs)
296
298
  _require_project_access(service, data)
297
299
  return data, _meta(invocation, auth.workspace_id, resolved_project(invocation))
@@ -404,6 +406,7 @@ def project_ensure(invocation: Invocation) -> HandlerResult:
404
406
  }
405
407
  data["active"] = _make_active_project(invocation, data["project_id"])
406
408
  return data, _meta(invocation, auth.workspace_id, chosen.get("id"))
409
+ require_unpinned_token(service, f"create the project {name!r}")
407
410
  created = service.call(_ENSURE_CREATE_SYMBOL, name=name)
408
411
  record = created.get("project", created) if isinstance(created, dict) else {}
409
412
  project_id = record.get("id") if isinstance(record, dict) else None
@@ -0,0 +1,52 @@
1
+ """The project, if any, a credential is pinned to.
2
+
3
+ A token created for one project is refused (HTTP 403 ``authorization_required``)
4
+ in every other project. The server says which project that is in
5
+ ``GET /workspaces/current`` (field ``project``); this module reads it so a
6
+ command can refuse before it creates something the token cannot open.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from mammoth_cli.errors.envelope import CODE_AUTHORIZATION_REQUIRED, EXIT_AUTH, CliError
12
+ from mammoth_cli.services.protocol import MammothService
13
+
14
+ _CURRENT_SYMBOL = "mammoth.api.workspace.WorkspaceAPI.current"
15
+
16
+
17
+ def pinned_project(service: MammothService) -> int | None:
18
+ """The project id this credential is limited to, or None when it is not limited."""
19
+ current = service.call(_CURRENT_SYMBOL)
20
+ project = current.get("project") if isinstance(current, dict) else current.project
21
+ return project if isinstance(project, int) and project > 0 else None
22
+
23
+
24
+ def require_unpinned_token(service: MammothService, action: str) -> None:
25
+ """Refuse ``action`` when the server says the token is limited to one project."""
26
+ refuse_pinned_project(pinned_project(service), action)
27
+
28
+
29
+ def refuse_pinned_project(project_id: int | None, action: str) -> None:
30
+ """Refuse ``action`` for a token limited to ``project_id``; None means not limited.
31
+
32
+ Raises:
33
+ CliError: ``authorization_required`` naming the project the token is
34
+ limited to, before anything is created.
35
+ """
36
+ if project_id is None:
37
+ return
38
+ raise CliError(
39
+ code=CODE_AUTHORIZATION_REQUIRED,
40
+ message=(
41
+ f"This token is limited to project {project_id}, so it cannot {action}: "
42
+ "a project it creates would be closed to it."
43
+ ),
44
+ exit_status=EXIT_AUTH,
45
+ hint=(
46
+ f"Work in project {project_id} (pass --project {project_id}), or ask the operator "
47
+ "for a token created without a project."
48
+ ),
49
+ details={"pinned_project_id": project_id},
50
+ authorization_required=True,
51
+ recovery_commands=[f"mammoth project get {project_id}"],
52
+ )
@@ -37,6 +37,7 @@ _MONEY = re.compile(
37
37
  r"price|amount|revenue|sales|cost|spend|fee|income|profit|margin|total|value|gmv|arr|mrr",
38
38
  re.IGNORECASE,
39
39
  )
40
+ _REVENUE = re.compile(r"revenue|sales|amount|gmv|income|total", re.IGNORECASE)
40
41
  _UNIT = re.compile(r"price|rate|unit|per[_ ]", re.IGNORECASE)
41
42
  _QUANTITY = re.compile(r"^(qty|quantity|units?|count|volume|pieces|items?)\b", re.IGNORECASE)
42
43
  _RATE_TITLE = re.compile(r"\brate\b|%|on[- ]time|share of", re.IGNORECASE)
@@ -237,18 +238,23 @@ def review(
237
238
  warnings.append(record)
238
239
  summed = sorted({name for name, agg in aggs if name in unit_prices and agg == "sum"})
239
240
  if summed:
241
+ revenue = next((name for name in money if _REVENUE.search(name)), None)
240
242
  record = {
241
243
  "issue": "unit_price_summed",
242
244
  "detail": (
243
245
  f"A chart sums the unit price {summed[0]}; that total means nothing. "
244
246
  + (
245
- f"Chart the sum of revenue = {quantities[0]} * {summed[0]} instead."
246
- if quantities
247
- else "Use avg, or chart revenue instead."
247
+ f"The view already has {revenue}: chart the sum of {revenue} instead."
248
+ if revenue
249
+ else (
250
+ f"Chart the sum of revenue = {quantities[0]} * {summed[0]} instead."
251
+ if quantities
252
+ else "Use avg, or chart revenue instead."
253
+ )
248
254
  )
249
255
  ),
250
256
  }
251
- if quantities:
257
+ if quantities and not revenue:
252
258
  record["fix"] = _math_fix(view_ref, dataset_id, quantities[0], summed[0])
253
259
  warnings.append(record)
254
260
  shown = measures | dims
@@ -31,9 +31,10 @@ transform --help`). Before the first Mammoth command in a session run
31
31
  `mammoth doctor` (it must pass), then `mammoth skill show` and follow that
32
32
  guide. If `mammoth` is missing, install it with `pip install mammoth-cli`
33
33
  (or `uv tool install mammoth-cli`, then `uv tool update-shell` so it is on
34
- PATH). If `mammoth auth status` shows no credentials, tell the operator the
35
- exact `mammoth auth login` command to run in their own terminal
36
- and wait; never ask for, read, or pass a key or secret.
34
+ PATH). If `mammoth auth status` shows no credentials, run
35
+ `mammoth auth login --device`, show the user the link and code it prints, and wait
36
+ for it to finish; never run any other login method, and never ask for, read, or
37
+ pass a key or secret.
37
38
  Piped output is compact JSON. Take ids only from reads; run `mammoth schema get
38
39
  COMMAND_ID` before a command you have not used (`schema get A,B,C` reads
39
40
  several in one call); destructive commands need
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mammoth-cli"
3
- version = "2.2.79"
3
+ version = "2.2.80"
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"
File without changes
File without changes