mammoth-cli 2.0.5__tar.gz → 2.0.7__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 (209) hide show
  1. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/PKG-INFO +12 -10
  2. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/README.md +11 -9
  3. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/__init__.py +1 -1
  4. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +16 -11
  5. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +42 -19
  6. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +4 -9
  7. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +5 -4
  8. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +15 -20
  9. mammoth_cli-2.0.7/mammoth_cli/commands/doctor.py +210 -0
  10. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/schema.py +8 -1
  11. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/pyproject.toml +1 -1
  12. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/sdk-methods.yaml +2 -2
  13. mammoth_cli-2.0.5/mammoth_cli/commands/doctor.py +0 -115
  14. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/.gitignore +0 -0
  15. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/LICENSE +0 -0
  16. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/__main__.py +0 -0
  17. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/app.py +0 -0
  18. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
  19. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  20. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  21. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  22. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  23. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  24. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  25. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  26. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  27. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  28. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  29. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  30. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  31. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  32. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  33. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  34. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  35. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
  36. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  37. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  38. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  39. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  40. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  41. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  42. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  43. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  44. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  45. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
  46. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  47. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  48. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  49. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  50. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  51. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  52. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  53. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  54. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  55. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  56. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  57. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +0 -0
  58. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  59. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  60. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  61. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
  62. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  63. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  64. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  65. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  66. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
  67. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  68. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  69. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  70. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
  71. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  72. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  73. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  74. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  75. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/__init__.py +0 -0
  76. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/activity.py +0 -0
  77. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/addon.py +0 -0
  78. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/agent.py +0 -0
  79. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/ai.py +0 -0
  80. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/annotation.py +0 -0
  81. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/auth.py +0 -0
  82. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/automation.py +0 -0
  83. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/batch.py +0 -0
  84. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/billing.py +0 -0
  85. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/browse.py +0 -0
  86. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/capability.py +0 -0
  87. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/client_app.py +0 -0
  88. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/completion.py +0 -0
  89. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/config.py +0 -0
  90. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/connector.py +0 -0
  91. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/context.py +0 -0
  92. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/dashboard.py +0 -0
  93. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/data_app.py +0 -0
  94. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/dataset.py +0 -0
  95. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/external_key.py +0 -0
  96. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/file.py +0 -0
  97. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/folder.py +0 -0
  98. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/job.py +0 -0
  99. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/notification.py +0 -0
  100. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/parameter.py +0 -0
  101. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/project.py +0 -0
  102. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/registry.py +0 -0
  103. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/report.py +0 -0
  104. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/schedule.py +0 -0
  105. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/skill.py +0 -0
  106. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/snippet.py +0 -0
  107. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/support.py +0 -0
  108. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/template.py +0 -0
  109. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/trash.py +0 -0
  110. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/upgrade.py +0 -0
  111. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/user.py +0 -0
  112. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/view.py +0 -0
  113. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/view_ops.py +0 -0
  114. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/webhook.py +0 -0
  115. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/workflow.py +0 -0
  116. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/commands/workspace.py +0 -0
  117. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/context/__init__.py +0 -0
  118. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/context/credentials.py +0 -0
  119. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/context/endpoint.py +0 -0
  120. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/context/profiles.py +0 -0
  121. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/context/resolver.py +0 -0
  122. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/contracts/__init__.py +0 -0
  123. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/contracts/auth.py +0 -0
  124. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/errors/__init__.py +0 -0
  125. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/errors/envelope.py +0 -0
  126. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/manifest/__init__.py +0 -0
  127. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/manifest/loader.py +0 -0
  128. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/messages/__init__.py +0 -0
  129. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/output/__init__.py +0 -0
  130. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/output/envelope.py +0 -0
  131. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/output/normalize.py +0 -0
  132. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/output/policy.py +0 -0
  133. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/output/progress.py +0 -0
  134. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/output/render.py +0 -0
  135. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/py.typed +0 -0
  136. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/runtime/__init__.py +0 -0
  137. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/runtime/confirm.py +0 -0
  138. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/runtime/executor.py +0 -0
  139. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/runtime/input_loader.py +0 -0
  140. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/runtime/invocation.py +0 -0
  141. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/runtime/options.py +0 -0
  142. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/runtime/session.py +0 -0
  143. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/runtime/strict.py +0 -0
  144. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/runtime/validate.py +0 -0
  145. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/__init__.py +0 -0
  146. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/argspec.py +0 -0
  147. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/coerce.py +0 -0
  148. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/command_contract.py +0 -0
  149. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/conditions.py +0 -0
  150. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/dispatch.py +0 -0
  151. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/factory.py +0 -0
  152. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/input_fields.py +0 -0
  153. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/mapping.py +0 -0
  154. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/openapi_types.py +0 -0
  155. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/positionals.py +0 -0
  156. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/protocol.py +0 -0
  157. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/sdk_service.py +0 -0
  158. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/testing.py +0 -0
  159. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/services/type_system.py +0 -0
  160. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/skills/__init__.py +0 -0
  161. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/skills/installer.py +0 -0
  162. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/mammoth_cli/testing.py +0 -0
  163. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/activity.yaml +0 -0
  164. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/addon.yaml +0 -0
  165. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/agent.yaml +0 -0
  166. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/ai.yaml +0 -0
  167. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/annotation.yaml +0 -0
  168. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/auth.yaml +0 -0
  169. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/automation.yaml +0 -0
  170. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/batch.yaml +0 -0
  171. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/billing.yaml +0 -0
  172. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/browse.yaml +0 -0
  173. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/capability.yaml +0 -0
  174. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/client-app.yaml +0 -0
  175. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/completion.yaml +0 -0
  176. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/config.yaml +0 -0
  177. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/connector.yaml +0 -0
  178. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/context.yaml +0 -0
  179. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/dashboard.yaml +0 -0
  180. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/data-app.yaml +0 -0
  181. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/dataset.yaml +0 -0
  182. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/doctor.yaml +0 -0
  183. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/external-key.yaml +0 -0
  184. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/file.yaml +0 -0
  185. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/folder.yaml +0 -0
  186. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/job.yaml +0 -0
  187. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/notification.yaml +0 -0
  188. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/parameter.yaml +0 -0
  189. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/project.yaml +0 -0
  190. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/report.yaml +0 -0
  191. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/schedule.yaml +0 -0
  192. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/schema.yaml +0 -0
  193. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/skill.yaml +0 -0
  194. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/snippet.yaml +0 -0
  195. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/support.yaml +0 -0
  196. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/template.yaml +0 -0
  197. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/trash.yaml +0 -0
  198. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/upgrade.yaml +0 -0
  199. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/user.yaml +0 -0
  200. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/version.yaml +0 -0
  201. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/view.yaml +0 -0
  202. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/webhook.yaml +0 -0
  203. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/workflow.yaml +0 -0
  204. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/commands/workspace.yaml +0 -0
  205. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/openapi-operations.yaml +0 -0
  206. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/schema-v1.json +0 -0
  207. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/manifests/sdk-catalog.source.yaml +0 -0
  208. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/openapi/metadata.json +0 -0
  209. {mammoth_cli-2.0.5 → mammoth_cli-2.0.7}/spec/openapi/openapi.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mammoth-cli
3
- Version: 2.0.5
3
+ Version: 2.0.7
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
@@ -74,18 +74,19 @@ installation path.
74
74
 
75
75
  ## First run: authenticate, check, then discover
76
76
 
77
- Authentication is the first operational step. In an evaluated or isolated run
78
- with a controller-provided credential broker/sidecar, use that broker's
79
- readiness check; do not inspect saved profiles, run login, or run doctor, and
80
- stop if the broker is absent. In an ordinary shell, check the selected profile;
77
+ Authentication is the first operational step. Check the selected profile;
81
78
  this is a local presence check, not a live access test. If the profile or
82
- stored credentials are absent, log in before running `doctor` or any data command:
79
+ stored credentials are absent, log in before running `doctor` or any data
80
+ command. An agent does this by asking the operator to run the login below in
81
+ their own terminal; the CLI never reads credentials from environment variables:
83
82
 
84
83
  ```bash
85
84
  mammoth skill list --output json --no-input
86
85
  mammoth skill path --output json --no-input
87
86
  # Read the installed SKILL.md before operating.
88
87
  mammoth auth status --output json --no-input
88
+ # Compare the reported endpoint with the intended target before doctor.
89
+ # Use app for production; use release only when explicitly intended.
89
90
  # Human terminal only, if profile or stored credentials are absent:
90
91
  mammoth auth login
91
92
  # Then verify configuration, credentials, endpoint, and connectivity:
@@ -106,12 +107,13 @@ mammoth auth login --input /private/path/credentials.json --storage file \
106
107
  --output json --no-input
107
108
  ```
108
109
 
109
- On Windows, use the approved OS keyring or credential broker instead; do not
110
- use a file fallback unless its ACL hardening is approved, and stop if neither
111
- is available.
110
+ On Windows, use the approved OS keyring instead; do not use a file fallback
111
+ unless its ACL hardening is approved, and stop if it is not available.
112
112
 
113
113
  The default server prefix is `app`; pass `--server-prefix release` only when
114
- the release endpoint is explicitly intended. See
114
+ the release endpoint is explicitly intended. Compare the endpoint reported by
115
+ `auth status` with the intended target before running `doctor`; if it does not
116
+ match, stop and switch to a separate correctly configured profile. See
115
117
  [Authentication](https://github.com/EdgeMetric/mammothsdk/blob/main/mammoth-cli/docs/authentication.md)
116
118
  for the required JSON fields and profile behavior. After `doctor` succeeds,
117
119
  resolve the exact workspace, project, dataset, and view from read results
@@ -46,18 +46,19 @@ installation path.
46
46
 
47
47
  ## First run: authenticate, check, then discover
48
48
 
49
- Authentication is the first operational step. In an evaluated or isolated run
50
- with a controller-provided credential broker/sidecar, use that broker's
51
- readiness check; do not inspect saved profiles, run login, or run doctor, and
52
- stop if the broker is absent. In an ordinary shell, check the selected profile;
49
+ Authentication is the first operational step. Check the selected profile;
53
50
  this is a local presence check, not a live access test. If the profile or
54
- stored credentials are absent, log in before running `doctor` or any data command:
51
+ stored credentials are absent, log in before running `doctor` or any data
52
+ command. An agent does this by asking the operator to run the login below in
53
+ their own terminal; the CLI never reads credentials from environment variables:
55
54
 
56
55
  ```bash
57
56
  mammoth skill list --output json --no-input
58
57
  mammoth skill path --output json --no-input
59
58
  # Read the installed SKILL.md before operating.
60
59
  mammoth auth status --output json --no-input
60
+ # Compare the reported endpoint with the intended target before doctor.
61
+ # Use app for production; use release only when explicitly intended.
61
62
  # Human terminal only, if profile or stored credentials are absent:
62
63
  mammoth auth login
63
64
  # Then verify configuration, credentials, endpoint, and connectivity:
@@ -78,12 +79,13 @@ mammoth auth login --input /private/path/credentials.json --storage file \
78
79
  --output json --no-input
79
80
  ```
80
81
 
81
- On Windows, use the approved OS keyring or credential broker instead; do not
82
- use a file fallback unless its ACL hardening is approved, and stop if neither
83
- is available.
82
+ On Windows, use the approved OS keyring instead; do not use a file fallback
83
+ unless its ACL hardening is approved, and stop if it is not available.
84
84
 
85
85
  The default server prefix is `app`; pass `--server-prefix release` only when
86
- the release endpoint is explicitly intended. See
86
+ the release endpoint is explicitly intended. Compare the endpoint reported by
87
+ `auth status` with the intended target before running `doctor`; if it does not
88
+ match, stop and switch to a separate correctly configured profile. See
87
89
  [Authentication](https://github.com/EdgeMetric/mammothsdk/blob/main/mammoth-cli/docs/authentication.md)
88
90
  for the required JSON fields and profile behavior. After `doctor` succeeds,
89
91
  resolve the exact workspace, project, dataset, and view from read results
@@ -6,7 +6,7 @@ not implement a second HTTP client and does not call private SDK members.
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
- __version__ = "2.0.5"
9
+ __version__ = "2.0.7"
10
10
 
11
11
  # The versioned machine output envelope contract.
12
12
  SCHEMA_VERSION = 1
@@ -9,17 +9,22 @@ Use this skill for Mammoth shell work, not for Python SDK integration. Complete
9
9
  the authentication preflight below before using the installed command contract;
10
10
  never guess routes or payloads:
11
11
 
12
- Before any remote read or write, establish authentication. Ordinary operator
13
- runs check the selected profile with `mammoth auth status --output json --no-input`;
14
- if the profile is missing or `has_credentials` is false, stop and complete the
15
- secure login flow in [authentication](references/auth.md). Then run
16
- `mammoth doctor --profile PROFILE --output json --no-input` and require a
17
- successful result before discovering resources or operating on them. A failed
18
- status, login, or doctor check is a precondition failure—not a reason to try
19
- the business command anyway. In evaluated or isolated runs, skip all saved
20
- profile checks and login commands: use only the controller-provided credential
21
- broker/sidecar check, never mount or read a saved profile, and stop if that
22
- broker is absent.
12
+ Before any remote read or write, establish authentication. For ordinary
13
+ operator runs, determine the intended environment from the task: production
14
+ defaults to the `app` endpoint; use `release` only when explicitly named.
15
+ Check the selected profile with `mammoth auth status --output json --no-input`
16
+ and compare its reported `endpoint` to that target before running doctor. If
17
+ the profile is missing, credentials are absent, or the endpoint does not match,
18
+ stop and follow [authentication](references/auth.md); never silently reuse or
19
+ rewrite a profile from another environment. Then run `mammoth doctor
20
+ --profile PROFILE --output json --no-input` and require success before
21
+ discovering resources or operating on them. A failed status, login, or doctor
22
+ check is a precondition failure—not a reason to try the business command
23
+ anyway. If no matching profile has credentials, the operator must run
24
+ `mammoth auth login` themselves in their own terminal: tell them the exact
25
+ command, wait, then re-check `auth status`. Never ask for the key or secret
26
+ in chat, never read them from environment variables or files you were not
27
+ given, and never run `auth login` on the operator's behalf.
23
28
 
24
29
  ```bash
25
30
  mammoth schema find "TASK OR RESOURCE" --output json --no-input
@@ -7,15 +7,43 @@ prefix (default `app`, resolving to `https://app.mammoth.io/api/v2`).
7
7
  1. Explicit login handed to the current command (secure prompt or `--input`).
8
8
  2. The selected or `--profile` profile's saved credentials.
9
9
 
10
+ There is no third source. The CLI and SDK do not read credentials from
11
+ environment variables, and an agent must not search the environment, shell
12
+ history, or unrelated files for them.
13
+
14
+ ## How an agent obtains credentials
15
+
16
+ An agent never receives the key or secret. When `auth status` reports a
17
+ missing profile or `has_credentials=false`, stop and hand the login to the
18
+ human operator:
19
+
20
+ 1. Tell the operator the exact command to run in **their own** terminal, with
21
+ the profile name and the intended server prefix:
22
+
23
+ ```bash
24
+ mammoth auth login --profile PROFILE --server-prefix app
25
+ ```
26
+
27
+ The command prompts for the key and secret with hidden input, then the
28
+ workspace id, so no secret enters chat, argv, or history.
29
+ 2. Wait for the operator to confirm, then re-run
30
+ `mammoth auth status --profile PROFILE --output json --no-input` and
31
+ `mammoth doctor --profile PROFILE --output json --no-input`.
32
+ 3. Do not ask the operator to paste the key or secret into chat. Do not run
33
+ `auth login` yourself, with or without `--input`, unless the operator has
34
+ explicitly given you a protected `0600` credential file path to use.
35
+
10
36
  The only supported configuration is the API key, API secret, workspace id, and
11
37
  an optional one-label server prefix (default `app`). There is no base-url
12
38
  override.
13
39
 
14
40
  ## Cold-start sequence
15
41
 
16
- For an ordinary operator, before any remote command, inspect authentication and
17
- then verify the connection. These checks are mandatory even when a profile may
18
- already exist:
42
+ For an ordinary operator, identify the intended environment before any remote
43
+ command. Production means the `app` endpoint by default; use `release` only
44
+ when the task explicitly requests the release environment. Inspect
45
+ authentication and then verify the connection. These checks are mandatory even
46
+ when a profile may already exist:
19
47
 
20
48
  ```bash
21
49
  mammoth auth status --profile PROFILE --output json --no-input
@@ -30,21 +58,21 @@ mammoth auth status --profile PROFILE --output json --no-input
30
58
  ```
31
59
 
32
60
  `auth status` is a local profile/credential-presence check; it does not prove
33
- that credentials are valid remotely. After the profile is present, verify the
34
- live connection:
61
+ that credentials are valid remotely. Compare its reported `endpoint` with the
62
+ intended environment before proceeding. A profile for another endpoint is a
63
+ scope mismatch: stop and select or authenticate the explicitly intended
64
+ profile; do not silently reuse, rewrite, or promote it. After the profile is
65
+ present and its endpoint matches, verify the live connection:
35
66
 
36
67
  ```bash
37
68
  mammoth doctor --profile PROFILE --output json --no-input
38
69
  ```
39
70
 
40
71
  Do not continue to schema discovery or business operations after an
41
- authentication or doctor failure. The `app` server prefix is the default;
42
- release or other environment credentials do not imply authorization for `app`.
43
-
44
- For an evaluated or isolated agent, do not run these profile commands: use the
45
- controller-provided credential broker/sidecar check instead. Never mount or
46
- read a saved profile. If no broker is provided, stop before authenticated
47
- actions.
72
+ authentication or doctor failure. The `app` server prefix is the production
73
+ default; release or other environment credentials do not imply authorization
74
+ for `app`, and a release profile is not appropriate unless the task explicitly
75
+ targets release.
48
76
 
49
77
  ## Commands
50
78
  ```bash
@@ -66,8 +94,8 @@ logs. For headless POSIX work, create the JSON file outside the repository, set
66
94
  its permissions to `0600`, and pass only its path. With a protected POSIX file,
67
95
  specify `--storage file` explicitly; `--storage auto` can require an available
68
96
  OS keyring and is not a reliable headless fallback. On Windows, do not use the
69
- file backend as a secret store; use the OS keyring, a controller broker, or
70
- stop and obtain a supported secure store. Remove any input file after the
97
+ file backend as a secret store; use the OS keyring or stop and obtain a
98
+ supported secure store. Remove any input file after the
71
99
  profile is stored.
72
100
 
73
101
  `creds.json` is a `0600` JSON file: `{"api_key": "...", "api_secret": "...",
@@ -77,8 +105,3 @@ also pipe it with `--input - --input-format json`.
77
105
  Secrets live in the OS keyring (or an explicitly selected `0600` file
78
106
  fallback). They are never printed, logged, or included in any envelope. Never
79
107
  pass a secret as a plain argument; use the hidden prompt or `--input`.
80
-
81
- For evaluated or isolated agents, authentication remains controller-owned: use
82
- the provided credential broker/sidecar instead of `auth login` and never mount
83
- or read a saved profile. If no broker is provided, stop before authenticated
84
- actions and report the precondition failure.
@@ -4,11 +4,10 @@ Use a nonsecret JSON checkpoint when another agent or session must continue.
4
4
  This is a record, not a resume subcommand. The receiving agent chooses
5
5
  its own plan only after fresh reads.
6
6
 
7
- For evaluated/isolated agents, authentication remains controller-owned: use
8
- the provided broker/sidecar and never mount or read a saved profile. If that
9
- broker is absent, stop before authenticated actions. Ordinary operator
10
- handoffs may reference the authorized profile name, but must not copy its path
11
- or contents into the checkpoint.
7
+ A handoff may reference the authorized profile name, but must not copy its
8
+ path or contents into the checkpoint. The receiving agent re-checks
9
+ `auth status` and `doctor`; if credentials are missing on its host, the
10
+ operator logs in from their own terminal as described in [auth](auth.md).
12
11
 
13
12
  ## Required record
14
13
 
@@ -49,9 +48,5 @@ mammoth view get VIEW_ID --project PROJECT_ID --output json --no-input
49
48
  mammoth job get JOB_ID --output json --no-input
50
49
  ```
51
50
 
52
- The commands above are ordinary operator examples; an evaluated/isolated agent
53
- must use the controller broker/sidecar instead of `--profile` and must stop if
54
- that broker is absent.
55
-
56
51
  The required fields and receiving procedure above are self-contained for a
57
52
  cold-start agent; no repository checkout or unshipped document is required.
@@ -3,7 +3,8 @@
3
3
  Use `mammoth auth status`, `mammoth doctor`, `mammoth project list`, and
4
4
  `mammoth schema get project.list` with `--output json --no-input`. Require
5
5
  successful `data` and observed workspace/project metadata. Never put secrets in
6
- argv; evaluated agents use the controller broker and never mount profiles.
6
+ argv. If credentials are missing, the operator logs in from their own terminal;
7
+ see [auth](../auth.md).
7
8
 
8
9
  ```bash
9
10
  mammoth context project use PROJECT_ID --profile PROFILE --output json --no-input
@@ -13,8 +14,8 @@ The successful envelope should identify the selected profile/workspace/project
13
14
  in `data` or `meta`; retain only nonsecret IDs. A deliberately invalid or
14
15
  expired profile should return the structured auth error (exit 4), which is a
15
16
  stop-and-recover condition, not permission to retry mutations. Never inline
16
- tokens or secrets in argv, logs, or evidence. Interactive login may receive
17
- protected credential JSON through stdin or a 0600 input file; evaluated agents
18
- must use the controller broker and never expose a profile to their shell.
17
+ tokens or secrets in argv, logs, or evidence. Headless login may receive
18
+ protected credential JSON through stdin or a 0600 input file only when the
19
+ operator explicitly supplies that file.
19
20
 
20
21
  Exit 4 is auth/authorization; preserve the structured error and stop safely.
@@ -5,12 +5,6 @@ task and has no repository or prior chat context. The user supplies the intent,
5
5
  authorized scope, and (when needed) a protected profile. Never put credentials
6
6
  or secrets in an argument, prompt, transcript, or checkpoint.
7
7
 
8
- For an evaluated or isolated agent, follow the controller-provided credential
9
- broker/sidecar instead of using a saved profile. Never mount or read the saved
10
- profile in that shell. If the broker/sidecar is not provided, stop before any
11
- authenticated action. The profile workflow below remains for ordinary,
12
- non-evaluated operator use.
13
-
14
8
  1. Check whether `mammoth` is available. If it is absent, install the CLI and
15
9
  bundled skill with the supported host installer:
16
10
 
@@ -27,31 +21,32 @@ non-evaluated operator use.
27
21
  install is required for the agent host, run `mammoth skill install
28
22
  --output json --no-input` and verify ownership with `mammoth skill list
29
23
  --output json --no-input`.
30
- 3. Establish authentication before any remote read or write. In an evaluated
31
- or isolated run, do not inspect a saved profile and do not run `auth login`:
32
- use the controller-provided credential broker/sidecar check. If it is not
33
- provided, stop before authenticated actions. The remaining instructions in
34
- this step are for ordinary operator runs only. First inspect the selected
35
- profile without attempting business work:
24
+ 3. Establish authentication before any remote read or write. Determine the
25
+ intended environment from the task first: production defaults to the `app` endpoint;
26
+ use `release` only when the task explicitly names release. Then inspect the
27
+ selected profile without attempting business work:
36
28
 
37
29
  ```bash
38
30
  mammoth auth status --output json --no-input
39
31
  ```
40
32
 
41
- If the status says the profile or credentials are missing, follow
42
- [authentication](auth.md) to log in using a hidden interactive prompt or a
43
- protected input file. Never invent a profile, put credentials in chat, or
44
- put secrets in argv. After login (or when an existing profile is present),
45
- run the connectivity and configuration check and require success:
33
+ Compare the status response's `endpoint` with the intended environment. If
34
+ the profile or credentials are missing, or the endpoint is for another
35
+ environment, stop and follow [authentication](auth.md): tell the operator
36
+ the exact `mammoth auth login --profile PROFILE --server-prefix app`
37
+ command to run in their own terminal, wait for them, then re-check status.
38
+ The CLI does not read credentials from environment variables; do not look
39
+ for them there. Never silently reuse or rewrite a mismatched profile,
40
+ invent a profile, ask for credentials in chat, or put secrets in argv.
41
+ After the operator has logged in (or when an existing, matching profile is
42
+ present), run the connectivity and configuration check and require success:
46
43
 
47
44
  ```bash
48
45
  mammoth doctor --profile PROFILE --output json --no-input
49
46
  ```
50
47
 
51
48
  Do not print, echo, or copy secret-bearing inputs. A failed status, login,
52
- or doctor check stops the task before discovery and business commands. A
53
- broker check is the equivalent precondition in evaluated mode; do not add a
54
- profile or `--profile` flag to broker-invoked commands.
49
+ or doctor check stops the task before discovery and business commands.
55
50
  4. Discover instead of guessing. Run `mammoth schema list/find/get --output
56
51
  json --no-input` for local CLI routes; `mammoth capability list --output
57
52
  json --no-input` is an API-binding inventory and can omit typed/local
@@ -0,0 +1,210 @@
1
+ """The ``doctor`` command: a read-only environment and connectivity check.
2
+
3
+ An agent or operator runs ``mammoth doctor`` to confirm, in one deterministic
4
+ envelope, that the CLI can find credentials, resolve an endpoint, and reach the
5
+ Mammoth API. Every check reports a boolean ``ok`` plus a short detail; no secret
6
+ value is ever included. The command never mutates anything and never prompts.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import os
12
+ import platform
13
+ import re
14
+ import shlex
15
+ import sys
16
+ from typing import Any
17
+ from urllib.parse import urlsplit
18
+
19
+ from mammoth_cli import __version__
20
+ from mammoth_cli.context import credentials, profiles
21
+ from mammoth_cli.context.resolver import resolve_auth
22
+ from mammoth_cli.errors.envelope import CliError
23
+ from mammoth_cli.runtime.invocation import Invocation
24
+ from mammoth_cli.runtime.session import open_service, resolved_project
25
+
26
+ HandlerResult = tuple[Any, dict[str, Any]]
27
+
28
+
29
+ def _check(name: str, ok: bool, detail: str) -> dict[str, Any]:
30
+ return {"name": name, "ok": ok, "detail": detail}
31
+
32
+
33
+ def _safe_connection_diagnostics(error: CliError, *, debug: bool) -> dict[str, Any]:
34
+ """Return the small, allowlisted diagnostic surface exposed by doctor.
35
+
36
+ ``CliError.details`` may contain response bodies or backend-specific
37
+ values because it is also used by the general error envelope. Doctor is
38
+ deliberately stricter: it emits only stable transport metadata and never
39
+ copies exception text or a response body into its result.
40
+ """
41
+ raw = error.details if isinstance(error.details, dict) else {}
42
+ status = raw.get("status_code")
43
+ if isinstance(status, bool) or not isinstance(status, int):
44
+ status = None
45
+ exception_type = raw.get("exception_type")
46
+ if not isinstance(exception_type, str) or exception_type not in {
47
+ "ConnectTimeout",
48
+ "ReadTimeout",
49
+ "Timeout",
50
+ "ConnectionError",
51
+ "ProxyError",
52
+ "SSLError",
53
+ }:
54
+ exception_type = None
55
+ retry_after = raw.get("retry_after")
56
+ if isinstance(retry_after, str):
57
+ if len(retry_after) > 10 or not retry_after.isascii() or not retry_after.isdigit():
58
+ retry_after = None
59
+ elif (
60
+ not isinstance(retry_after, int)
61
+ or isinstance(retry_after, bool)
62
+ or retry_after < 0
63
+ ):
64
+ retry_after = None
65
+ request_id = error.request_id or raw.get("request_id")
66
+ if not isinstance(request_id, str) or len(request_id) > 128 or not re.fullmatch(
67
+ r"[A-Za-z0-9._:-]+", request_id
68
+ ):
69
+ request_id = None
70
+
71
+ if status in {429, 503}:
72
+ reason = f"http_{status}"
73
+ detail = f"HTTP {status} response; retry the read"
74
+ elif exception_type in {"ConnectTimeout", "ReadTimeout", "Timeout"}:
75
+ reason = "transport_timeout"
76
+ detail = "transport timeout; retry the read"
77
+ elif exception_type in {"ConnectionError", "ProxyError", "SSLError"}:
78
+ reason = "transport_connection_error"
79
+ detail = "transport connection error; retry the read"
80
+ else:
81
+ reason = error.code
82
+ detail = f"connection check failed: {error.code}"
83
+
84
+ result: dict[str, Any] = {"error_code": error.code, "reason": reason, "detail": detail}
85
+ for name, value in (
86
+ ("status_code", status),
87
+ ("exception_type", exception_type),
88
+ ("retry_after", retry_after),
89
+ ("request_id", request_id),
90
+ ):
91
+ if value is not None:
92
+ result[name] = value
93
+
94
+ if debug:
95
+ method = raw.get("method")
96
+ if isinstance(method, str) and method.upper() in {"GET", "HEAD", "OPTIONS"}:
97
+ result["method"] = method.upper()
98
+ endpoint = raw.get("endpoint")
99
+ if isinstance(endpoint, str) and len(endpoint) <= 300:
100
+ parsed = urlsplit(endpoint)
101
+ if (
102
+ not parsed.query
103
+ and not parsed.fragment
104
+ and not parsed.username
105
+ and not parsed.password
106
+ ):
107
+ result["endpoint"] = parsed.path or endpoint
108
+ phase = raw.get("phase")
109
+ if isinstance(phase, str) and phase in {"request", "response", "decode", "authentication"}:
110
+ result["phase"] = phase
111
+ return result
112
+
113
+
114
+ def doctor(invocation: Invocation) -> HandlerResult:
115
+ """Run environment and connectivity diagnostics.
116
+
117
+ Args:
118
+ invocation: The current command's resolved global options.
119
+
120
+ Returns:
121
+ ``(data, meta_extra)`` where ``data`` holds the Python/CLI versions, the
122
+ active profile, and an ordered list of check results with an overall
123
+ ``ok`` flag.
124
+ """
125
+ profile_name = invocation.profile or profiles.get_selected()
126
+ checks: list[dict[str, Any]] = []
127
+
128
+ config_directory = profiles.config_dir()
129
+ writable_target = config_directory if config_directory.exists() else config_directory.parent
130
+ config_ok = os.access(writable_target, os.W_OK | os.X_OK)
131
+ checks.append(
132
+ _check(
133
+ "config_directory",
134
+ config_ok,
135
+ (
136
+ f"{config_directory} is writable"
137
+ if config_ok
138
+ else f"cannot write configuration below {writable_target}"
139
+ ),
140
+ )
141
+ )
142
+
143
+ record = profiles.get_profile(profile_name)
144
+ checks.append(
145
+ _check(
146
+ "profile",
147
+ record is not None,
148
+ f"profile '{profile_name}' found" if record else f"no profile '{profile_name}'",
149
+ )
150
+ )
151
+ checks.append(
152
+ _check(
153
+ "credentials",
154
+ credentials.has_credentials(profile_name),
155
+ "credentials present" if credentials.has_credentials(profile_name) else "none stored",
156
+ )
157
+ )
158
+
159
+ endpoint_detail = "unresolved"
160
+ auth_ok = False
161
+ try:
162
+ auth = resolve_auth(invocation)
163
+ endpoint_detail = auth.base_url
164
+ auth_ok = True
165
+ except CliError as error:
166
+ endpoint_detail = error.code
167
+ checks.append(_check("endpoint", auth_ok, endpoint_detail))
168
+
169
+ connection_ok = False
170
+ connection_detail = "not attempted"
171
+ if auth_ok:
172
+ try:
173
+ with open_service(invocation) as (service, _auth):
174
+ service.check_connection()
175
+ connection_ok = True
176
+ connection_detail = "authenticated request succeeded"
177
+ except CliError as error:
178
+ diagnostics = _safe_connection_diagnostics(error, debug=invocation.debug)
179
+ connection_detail = diagnostics.pop("detail")
180
+ connection_check = _check("connection", connection_ok, connection_detail)
181
+ connection_check.update(diagnostics)
182
+ checks.append(connection_check)
183
+ else:
184
+ checks.append(_check("connection", connection_ok, connection_detail))
185
+ if not auth_ok:
186
+ checks.append(_check("connection", connection_ok, connection_detail))
187
+
188
+ recommendations: list[str] = []
189
+ if record is None or not credentials.has_credentials(profile_name):
190
+ login_profile = f" --profile {shlex.quote(profile_name)}" if profile_name else ""
191
+ recommendations.append(f"mammoth auth login{login_profile}")
192
+ elif resolved_project(invocation) is None:
193
+ recommendations.append("mammoth context project use PROJECT_ID")
194
+ if not connection_ok and auth_ok and not invocation.debug:
195
+ debug_profile = f" --profile {shlex.quote(profile_name)}" if profile_name else ""
196
+ recommendations.append(
197
+ f"mammoth doctor --debug{debug_profile} --output json --no-input"
198
+ )
199
+
200
+ data = {
201
+ "cli_version": __version__,
202
+ "python_version": platform.python_version(),
203
+ "python_executable": sys.executable,
204
+ "profile": profile_name,
205
+ "project_id": resolved_project(invocation),
206
+ "checks": checks,
207
+ "recommendations": recommendations,
208
+ "ok": all(c["ok"] for c in checks),
209
+ }
210
+ return data, {"profile": profile_name, "project_id": resolved_project(invocation)}
@@ -35,6 +35,10 @@ from mammoth_cli.services.positionals import PositionalSpec, resolve_positionals
35
35
  from mammoth_cli.services.type_system import is_opaque_mapping, json_schema, sample_value
36
36
 
37
37
  _OUTPUT_JSON_NO_INPUT = ("--output", "json", "--no-input")
38
+ # A command whose request carries a secret never gets an inline JSON example:
39
+ # the published example points at a protected owner-only file instead, so no
40
+ # generated or copied command line ever puts a credential in argv.
41
+ _PROTECTED_INPUT_PATH = "/private/path/request.json"
38
42
  _OPAQUE_EXPERT_COMMANDS = frozenset({"view.task.add", "view.task.preview", "view.task.update"})
39
43
  _TYPED_TRANSFORM_ALTERNATIVES = [
40
44
  "view.transform.filter",
@@ -565,7 +569,10 @@ def runnable_example(
565
569
  # cannot express supplies the missing accepted field here, so the
566
570
  # documented example is actually runnable rather than just well-formed.
567
571
  document.update(hints)
568
- tokens.extend(["--input", json.dumps(document)])
572
+ if set(record.get("secret_fields") or ()).intersection(document):
573
+ tokens.extend(["--input", _PROTECTED_INPUT_PATH])
574
+ else:
575
+ tokens.extend(["--input", json.dumps(document)])
569
576
  tokens.extend(_OUTPUT_JSON_NO_INPUT)
570
577
  if record["command_id"] in {"project.user.update", "data-app.share"}:
571
578
  # These published high-impact examples must satisfy the same policy
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mammoth-cli"
3
- version = "2.0.5"
3
+ version = "2.0.7"
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"
@@ -4386,7 +4386,7 @@ methods:
4386
4386
  reviewed_by: primary
4387
4387
  - sdk_symbol: mammoth.api.jobs.JobsAPI.get_job
4388
4388
  implementation_origin: mammoth.api.jobs.JobsAPI.get_job
4389
- signature: 'get_job(self, job_id: ''int'', timeout: ''int'' = 300) -> ''dict[str, Any]'''
4389
+ signature: 'get_job(self, job_id: ''int'', timeout: ''float | None'' = None) -> ''dict[str, Any]'''
4390
4390
  openapi_operation_ids: []
4391
4391
  canonical_command: job.get
4392
4392
  alias_of: null
@@ -4398,7 +4398,7 @@ methods:
4398
4398
  reviewed_by: primary
4399
4399
  - sdk_symbol: mammoth.api.jobs.JobsAPI.get_jobs
4400
4400
  implementation_origin: mammoth.api.jobs.JobsAPI.get_jobs
4401
- signature: 'get_jobs(self, job_ids: ''list[int] | str'') -> ''dict[str, Any]'''
4401
+ signature: 'get_jobs(self, job_ids: ''list[int] | str'', timeout: ''float | None'' = None) -> ''dict[str, Any]'''
4402
4402
  openapi_operation_ids: []
4403
4403
  canonical_command: job.get-many
4404
4404
  alias_of: null