mammoth-cli 2.2.53__tar.gz → 2.2.55__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 (274) hide show
  1. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/PKG-INFO +2 -2
  2. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/__main__.py +11 -2
  4. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/app.py +264 -38
  5. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +3 -3
  6. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +20 -0
  7. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +13 -1
  8. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +14 -0
  9. mammoth_cli-2.2.55/mammoth_cli/commands/__init__.py +31 -0
  10. mammoth_cli-2.2.55/mammoth_cli/commands/_lazy.py +38 -0
  11. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/auth.py +68 -16
  12. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/client_app.py +34 -0
  13. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/dashboard.py +2 -1
  14. mammoth_cli-2.2.55/mammoth_cli/commands/help_summaries.json +659 -0
  15. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/project.py +20 -1
  16. mammoth_cli-2.2.55/mammoth_cli/commands/registry.py +911 -0
  17. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/schema.py +25 -7
  18. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/upgrade.py +13 -8
  19. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/view.py +79 -14
  20. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/view_ops.py +290 -6
  21. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/context/credentials.py +19 -4
  22. mammoth_cli-2.2.55/mammoth_cli/context/keyring_backend.py +86 -0
  23. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/context/oauth.py +7 -2
  24. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/context/resolver.py +3 -3
  25. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/errors/envelope.py +12 -0
  26. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/manifest/loader.py +49 -11
  27. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/confirm.py +7 -1
  28. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/executor.py +13 -2
  29. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/updates.py +37 -0
  30. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/verify.py +2 -0
  31. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/argspec.py +26 -1
  32. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/coerce.py +7 -5
  33. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/command_contract.py +50 -27
  34. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/conditions.py +40 -21
  35. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/dispatch.py +13 -0
  36. mammoth_cli-2.2.55/mammoth_cli/services/explore_cards.py +92 -0
  37. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/input_fields.py +1 -0
  38. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/mapping.py +8 -1
  39. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/positionals.py +1 -0
  40. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/sdk_service.py +2 -1
  41. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/type_system.py +14 -10
  42. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/pyproject.toml +8 -4
  43. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/view.yaml +149 -13
  44. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/edits-target.source.yaml +2 -0
  45. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/sdk-catalog.source.yaml +8 -0
  46. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/sdk-methods.yaml +12 -0
  47. mammoth_cli-2.2.53/mammoth_cli/commands/__init__.py +0 -31
  48. mammoth_cli-2.2.53/mammoth_cli/commands/registry.py +0 -909
  49. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/.gitignore +0 -0
  50. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/LICENSE +0 -0
  51. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/README.md +0 -0
  52. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +0 -0
  53. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
  54. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  55. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
  56. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
  57. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  58. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  59. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  60. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  61. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  62. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  63. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  64. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  65. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
  66. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  67. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
  68. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  69. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  70. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  71. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  72. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
  73. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  74. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
  75. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +0 -0
  76. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-template.md +0 -0
  77. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
  78. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  79. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  80. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  81. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  82. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  83. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  84. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  85. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/link.md +0 -0
  86. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  87. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  88. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  89. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
  90. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  91. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/resolve.md +0 -0
  92. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  93. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  94. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  95. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  96. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  97. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  98. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/token.md +0 -0
  99. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  100. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  101. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  102. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  103. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  104. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  105. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  106. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  107. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
  108. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
  109. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  110. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  111. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  112. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  113. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
  114. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/database-import.md +0 -0
  115. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
  116. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  117. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  118. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  119. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
  120. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
  121. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  122. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  123. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  124. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  125. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  126. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
  127. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/activity.py +0 -0
  128. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/addon.py +0 -0
  129. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/agent.py +0 -0
  130. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/ai.py +0 -0
  131. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/annotation.py +0 -0
  132. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/automation.py +0 -0
  133. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/batch.py +0 -0
  134. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/billing.py +0 -0
  135. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/browse.py +0 -0
  136. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/calc.py +0 -0
  137. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/capability.py +0 -0
  138. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/completion.py +0 -0
  139. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/config.py +0 -0
  140. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/connector.py +0 -0
  141. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/context.py +0 -0
  142. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/data_app.py +0 -0
  143. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/dataset.py +0 -0
  144. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/doctor.py +0 -0
  145. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/external_key.py +0 -0
  146. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/file.py +0 -0
  147. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/folder.py +0 -0
  148. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/job.py +0 -0
  149. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/link.py +0 -0
  150. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/notification.py +0 -0
  151. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/parameter.py +0 -0
  152. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/report.py +0 -0
  153. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/resolve.py +0 -0
  154. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/schedule.py +0 -0
  155. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/skill.py +0 -0
  156. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/snippet.py +0 -0
  157. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/support.py +0 -0
  158. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/template.py +0 -0
  159. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/trash.py +0 -0
  160. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/user.py +0 -0
  161. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/view_profile.py +0 -0
  162. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/webhook.py +0 -0
  163. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/workflow.py +0 -0
  164. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/commands/workspace.py +0 -0
  165. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/context/__init__.py +0 -0
  166. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/context/endpoint.py +0 -0
  167. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/context/profiles.py +0 -0
  168. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/contracts/__init__.py +0 -0
  169. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/contracts/auth.py +0 -0
  170. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/embed.py +0 -0
  171. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/errors/__init__.py +0 -0
  172. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/manifest/__init__.py +0 -0
  173. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/messages/__init__.py +0 -0
  174. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/output/__init__.py +0 -0
  175. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/output/envelope.py +0 -0
  176. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/output/normalize.py +0 -0
  177. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/output/policy.py +0 -0
  178. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/output/progress.py +0 -0
  179. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/output/render.py +0 -0
  180. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/py.typed +0 -0
  181. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/__init__.py +0 -0
  182. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/dataset_health.py +0 -0
  183. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/dryrun.py +0 -0
  184. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/dryrun_targets.py +0 -0
  185. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/embedded.py +0 -0
  186. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/input_loader.py +0 -0
  187. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/intent_only.py +0 -0
  188. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/invocation.py +0 -0
  189. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/locked_files.py +0 -0
  190. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/new_data.py +0 -0
  191. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/options.py +0 -0
  192. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/parents.py +0 -0
  193. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/runlog.py +0 -0
  194. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/session.py +0 -0
  195. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/state.py +0 -0
  196. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/strict.py +0 -0
  197. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/runtime/validate.py +0 -0
  198. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/__init__.py +0 -0
  199. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/append_blank_columns.py +0 -0
  200. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/board_values.py +0 -0
  201. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/conditional_format.py +0 -0
  202. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/dashboard_filters.py +0 -0
  203. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/dashboard_pages.py +0 -0
  204. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/dashboard_review.py +0 -0
  205. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/data_profile.py +0 -0
  206. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/data_quality.py +0 -0
  207. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/factory.py +0 -0
  208. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/job_outcome.py +0 -0
  209. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/listing.py +0 -0
  210. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/local_time.py +0 -0
  211. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/openapi_types.py +0 -0
  212. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/protocol.py +0 -0
  213. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/read_queries.py +0 -0
  214. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/sql_check.py +0 -0
  215. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/stored_stats.py +0 -0
  216. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/testing.py +0 -0
  217. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/text_dates.py +0 -0
  218. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/view_analysis.py +0 -0
  219. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/view_variants.py +0 -0
  220. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/services/write_impact.py +0 -0
  221. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/skills/__init__.py +0 -0
  222. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/skills/installer.py +0 -0
  223. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/skills/steering.py +0 -0
  224. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/mammoth_cli/testing.py +0 -0
  225. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/activity.yaml +0 -0
  226. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/addon.yaml +0 -0
  227. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/agent.yaml +0 -0
  228. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/ai.yaml +0 -0
  229. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/annotation.yaml +0 -0
  230. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/auth.yaml +0 -0
  231. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/automation.yaml +0 -0
  232. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/batch.yaml +0 -0
  233. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/billing.yaml +0 -0
  234. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/browse.yaml +0 -0
  235. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/calc.yaml +0 -0
  236. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/capability.yaml +0 -0
  237. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/client-app.yaml +0 -0
  238. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/completion.yaml +0 -0
  239. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/config.yaml +0 -0
  240. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/connector.yaml +0 -0
  241. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/context.yaml +0 -0
  242. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/dashboard.yaml +0 -0
  243. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/data-app.yaml +0 -0
  244. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/dataset.yaml +0 -0
  245. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/doctor.yaml +0 -0
  246. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/external-key.yaml +0 -0
  247. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/file.yaml +0 -0
  248. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/folder.yaml +0 -0
  249. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/job.yaml +0 -0
  250. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/link.yaml +0 -0
  251. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/log.yaml +0 -0
  252. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/notification.yaml +0 -0
  253. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/parameter.yaml +0 -0
  254. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/project.yaml +0 -0
  255. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/report.yaml +0 -0
  256. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/resolve.yaml +0 -0
  257. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/schedule.yaml +0 -0
  258. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/schema.yaml +0 -0
  259. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/skill.yaml +0 -0
  260. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/snippet.yaml +0 -0
  261. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/support.yaml +0 -0
  262. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/template.yaml +0 -0
  263. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/token.yaml +0 -0
  264. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/trash.yaml +0 -0
  265. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/upgrade.yaml +0 -0
  266. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/user.yaml +0 -0
  267. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/version.yaml +0 -0
  268. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/webhook.yaml +0 -0
  269. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/workflow.yaml +0 -0
  270. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/commands/workspace.yaml +0 -0
  271. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/openapi-operations.yaml +0 -0
  272. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/manifests/schema-v1.json +0 -0
  273. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/spec/openapi/metadata.json +0 -0
  274. {mammoth_cli-2.2.53 → mammoth_cli-2.2.55}/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.53
3
+ Version: 2.2.55
4
4
  Summary: Command-line interface for the Mammoth Analytics platform
5
5
  Project-URL: homepage, https://mammoth.io
6
6
  Project-URL: repository, https://github.com/EdgeMetric/mammothsdk
@@ -17,7 +17,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
17
17
  Requires-Python: <3.15,>=3.12
18
18
  Requires-Dist: jsonschema>=4.20
19
19
  Requires-Dist: keyring<26,>=25.7
20
- Requires-Dist: mammoth-io<0.9,>=0.8.27
20
+ Requires-Dist: mammoth-io<0.9,>=0.8.29
21
21
  Requires-Dist: platformdirs<5,>=4.10
22
22
  Requires-Dist: pydantic<3,>=2.12.5
23
23
  Requires-Dist: pyyaml<7,>=6
@@ -6,7 +6,7 @@ not implement a second HTTP client and does not call private SDK members.
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
- __version__ = "2.2.53"
9
+ __version__ = "2.2.55"
10
10
 
11
11
  # The versioned machine output envelope contract.
12
12
  SCHEMA_VERSION = 1
@@ -8,10 +8,9 @@ launch symbol that does not change when the application wiring moves.
8
8
 
9
9
  from __future__ import annotations
10
10
 
11
+ import sys
11
12
  from typing import Any
12
13
 
13
- from mammoth_cli.app import app
14
-
15
14
 
16
15
  def main() -> Any:
17
16
  """Run the Mammoth CLI application.
@@ -20,6 +19,16 @@ def main() -> Any:
20
19
  The value returned by the Typer application, which the runtime uses as
21
20
  the process exit code.
22
21
  """
22
+ if sys.argv[1:] == ["--version"]:
23
+ # The answer needs none of the command tree; skip building it.
24
+ from mammoth_cli import __version__
25
+
26
+ sys.stdout.write(f"{__version__}\n")
27
+ return 0
28
+ from mammoth_cli.app import app
29
+ from mammoth_cli.context import keyring_backend
30
+
31
+ keyring_backend.enable()
23
32
  return app()
24
33
 
25
34
 
@@ -15,23 +15,25 @@ positionals and options are added per family as each handler is implemented.
15
15
  from __future__ import annotations
16
16
 
17
17
  import inspect
18
+ import json
18
19
  import re
19
20
  import sys
20
21
  from collections.abc import Callable, Sequence
21
22
  from dataclasses import replace
23
+ from difflib import get_close_matches
22
24
  from functools import cache
23
- from typing import Annotated, Any
25
+ from pathlib import Path
26
+ from typing import TYPE_CHECKING, Annotated, Any, cast
24
27
 
25
28
  import typer
26
29
  from typer._click import exceptions as _typer_click_exceptions
27
30
  from typer._click.core import Command as _ClickCommand
28
- from typer.core import TyperGroup
31
+ from typer._click.core import Parameter as _ClickParameter
32
+ from typer.core import TyperCommand, TyperGroup
29
33
 
30
34
  from mammoth_cli import __version__
31
35
  from mammoth_cli.commands import BESPOKE
32
- from mammoth_cli.commands.registry import HANDLERS, Handler
33
- from mammoth_cli.commands.schema import IN_PLACE_RECIPE, edits_view_in_place
34
- from mammoth_cli.context import profiles
36
+ from mammoth_cli.commands.registry import HANDLERS
35
37
  from mammoth_cli.errors.envelope import EXIT_USAGE, CliError, not_implemented_error
36
38
  from mammoth_cli.manifest.loader import command_by_id, load_commands
37
39
  from mammoth_cli.output.policy import (
@@ -42,17 +44,12 @@ from mammoth_cli.output.policy import (
42
44
  VALID_OUTPUTS,
43
45
  resolve_output,
44
46
  )
45
- from mammoth_cli.runtime import executor, validate
46
- from mammoth_cli.runtime.dataset_health import with_dataset_health
47
- from mammoth_cli.runtime.intent_only import refuse_hand_crafted_write
48
- from mammoth_cli.runtime.invocation import Invocation
49
- from mammoth_cli.runtime.locked_files import with_locked_files
50
- from mammoth_cli.runtime.new_data import with_new_data_path
51
- from mammoth_cli.runtime.state import with_state
52
- from mammoth_cli.runtime.strict import validate_extra_args
53
- from mammoth_cli.runtime.verify import with_verify
54
47
  from mammoth_cli.services.positionals import PositionalSpec, resolve_positionals
55
48
 
49
+ if TYPE_CHECKING:
50
+ from mammoth_cli.commands.registry import Handler
51
+ from mammoth_cli.runtime.invocation import Invocation
52
+
56
53
  OUTPUT_MODES = VALID_OUTPUTS
57
54
 
58
55
  # Root help is the first piece of discovery most people (and agents) see. The
@@ -369,7 +366,7 @@ class _EnvelopeGroup(TyperGroup):
369
366
  loaded: dict[str, Any] = self.__dict__.setdefault("_eager_commands", {})
370
367
  for name in _LAZY_GROUP_NAMES:
371
368
  if name not in loaded:
372
- loaded[name] = _load_top_level_group(name)
369
+ loaded[name] = _load_lazy_root(name)
373
370
  return loaded
374
371
 
375
372
  @commands.setter
@@ -378,14 +375,42 @@ class _EnvelopeGroup(TyperGroup):
378
375
 
379
376
  def list_commands(self, ctx: Any) -> list[str]:
380
377
  eager = self.__dict__.get("_eager_commands", {})
381
- return [*eager, *(name for name in _LAZY_GROUP_NAMES if name not in eager)]
378
+ # Top-level leaves list ahead of groups, the order they were registered in.
379
+ lazy = sorted(_LAZY_GROUP_NAMES, key=lambda name: name not in _LAZY_LEAF_IDS)
380
+ return [*eager, *(name for name in lazy if name not in eager)]
382
381
 
383
382
  def get_command(self, ctx: Any, cmd_name: str) -> Any:
384
383
  eager: dict[str, Any] = self.__dict__.setdefault("_eager_commands", {})
385
384
  if cmd_name not in eager and cmd_name in _LAZY_GROUP_NAMES:
386
- eager[cmd_name] = _load_top_level_group(cmd_name)
385
+ if self.__dict__.get("_listing_help"):
386
+ if cmd_name in _LAZY_LEAF_IDS:
387
+ return _root_leaf_stub(cmd_name)
388
+ return _group_stub(cmd_name)
389
+ eager[cmd_name] = _load_lazy_root(cmd_name)
387
390
  return eager.get(cmd_name)
388
391
 
392
+ def resolve_command(self, ctx: Any, args: list[str]) -> Any:
393
+ # Typer's override suggests close names from ``self.commands``, which
394
+ # builds every group; the names alone are all a suggestion needs.
395
+ try:
396
+ return self._click_resolve_command(ctx, args)
397
+ except _typer_click_exceptions.UsageError as error:
398
+ if self.suggest_commands and args:
399
+ matches = get_close_matches(args[0], self.list_commands(ctx))
400
+ if matches:
401
+ suggestions = ", ".join(f"{m!r}" for m in matches)
402
+ error.message = f"{error.message.rstrip('.')}. Did you mean {suggestions}?"
403
+ raise
404
+
405
+ def format_help(self, ctx: Any, formatter: Any) -> None:
406
+ # Root ``--help`` only needs each group's name, panel and one-line
407
+ # description; building all ~550 commands to print them cost seconds.
408
+ self.__dict__["_listing_help"] = True
409
+ try:
410
+ super().format_help(ctx, formatter)
411
+ finally:
412
+ self.__dict__["_listing_help"] = False
413
+
389
414
  def main(self, *args: Any, **kwargs: Any) -> Any:
390
415
  if not kwargs.get("standalone_mode", True):
391
416
  return super().main(*args, **kwargs)
@@ -447,11 +472,16 @@ class _EnvelopeGroup(TyperGroup):
447
472
  )
448
473
  elif isinstance(error, _typer_click_exceptions.NoSuchOption):
449
474
  option = getattr(error, "option_name", None) or "unknown"
475
+ close = getattr(error, "possibilities", None) or []
450
476
  report = CliError(
451
477
  code="unknown_option",
452
478
  message=f"Unknown option '{option}'.",
453
479
  exit_status=EXIT_USAGE,
454
- hint="Check the command schema with 'mammoth schema get'.",
480
+ hint=(
481
+ f"Did you mean {' or '.join(sorted(close))}?"
482
+ if close
483
+ else "Check the command schema with 'mammoth schema get'."
484
+ ),
455
485
  details={"option": option},
456
486
  )
457
487
  elif isinstance(error, _typer_click_exceptions.BadParameter):
@@ -496,6 +526,8 @@ class _EnvelopeGroup(TyperGroup):
496
526
  exit_status=EXIT_USAGE,
497
527
  hint="Check the command schema with 'mammoth schema get'.",
498
528
  )
529
+ from mammoth_cli.runtime import executor
530
+
499
531
  executor.emit_error(report, machine=True)
500
532
  elif report is None:
501
533
  error.show()
@@ -820,6 +852,8 @@ def _build_leaf(command_id: str, *, is_group_callback: bool = False) -> Callable
820
852
  positional_names = tuple(spec.name for spec in positionals)
821
853
 
822
854
  def leaf(**params: Any) -> None:
855
+ from mammoth_cli.runtime.invocation import Invocation
856
+
823
857
  ctx: typer.Context = params.pop("ctx")
824
858
  if is_group_callback and ctx.invoked_subcommand is not None:
825
859
  return
@@ -853,6 +887,14 @@ def _execute(invocation: Invocation) -> None:
853
887
  # Freeze the fallback profile before opening a service. A recovery command
854
888
  # must inspect the same account that submitted/observed a job, rather than
855
889
  # resolving the mutable selected-profile pointer after an interrupt.
890
+ from mammoth_cli.context import profiles
891
+ from mammoth_cli.runtime import executor, validate
892
+ from mammoth_cli.runtime.dataset_health import with_dataset_health
893
+ from mammoth_cli.runtime.intent_only import refuse_hand_crafted_write
894
+ from mammoth_cli.runtime.locked_files import with_locked_files
895
+ from mammoth_cli.runtime.new_data import with_new_data_path
896
+ from mammoth_cli.runtime.strict import validate_extra_args
897
+
856
898
  if invocation.profile is None:
857
899
  invocation = replace(invocation, profile=profiles.get_selected())
858
900
 
@@ -908,6 +950,9 @@ def _apply_verify(invocation: Invocation, data: Any) -> Any:
908
950
  command's manifest ``readback``/``no_readback`` declaration -- see
909
951
  :mod:`mammoth_cli.runtime.state`).
910
952
  """
953
+ from mammoth_cli.runtime.state import with_state
954
+ from mammoth_cli.runtime.verify import with_verify
955
+
911
956
  record = command_by_id(invocation.command_id) or {}
912
957
  if record.get("mutation_class") == "read" or not record.get("sdk_symbol"):
913
958
  return data
@@ -943,6 +988,32 @@ def _dry_run(handler: Handler, invocation: Invocation) -> tuple[Any, dict[str, A
943
988
  return report, {"profile": invocation.profile, "project_id": resolved_project(invocation)}
944
989
 
945
990
 
991
+ def live_command_summary(command_id: str) -> str | None:
992
+ """The backing handler's docstring first line, the lead of a command's help.
993
+
994
+ Reading it imports the handler's module, so a group listing takes it from
995
+ the generated index (:func:`_indexed_summary`) instead.
996
+ """
997
+ handler = HANDLERS.get(command_id) or BESPOKE.get(command_id)
998
+ doc = inspect.getdoc(handler) if handler is not None else None
999
+ if not doc:
1000
+ return None
1001
+ # First non-empty line, with RST inline-code backticks flattened to plain
1002
+ # quotes so the help reads as prose rather than reStructuredText.
1003
+ return doc.strip().splitlines()[0].strip().replace("``", "'") or None
1004
+
1005
+
1006
+ @cache
1007
+ def _summary_index() -> dict[str, str]:
1008
+ """Every command's help summary, generated by ``scripts/gen_help_summaries.py``."""
1009
+ path = Path(__file__).parent / "commands" / "help_summaries.json"
1010
+ return cast(dict[str, str], json.loads(path.read_text(encoding="utf-8")))
1011
+
1012
+
1013
+ def _indexed_summary(command_id: str) -> str | None:
1014
+ return _summary_index().get(command_id)
1015
+
1016
+
946
1017
  def _command_help(command_id: str, record: dict[str, Any] | None) -> str | None:
947
1018
  """Build a command's user-facing ``--help`` summary.
948
1019
 
@@ -955,15 +1026,12 @@ def _command_help(command_id: str, record: dict[str, Any] | None) -> str | None:
955
1026
  every required positional and ``--input`` field. ``known_restrictions``
956
1027
  remains available to machines through ``schema get``.
957
1028
  """
1029
+ from mammoth_cli.commands.schema import IN_PLACE_RECIPE, edits_view_in_place
1030
+
958
1031
  parts: list[str] = []
959
- handler = HANDLERS.get(command_id) or BESPOKE.get(command_id)
960
- doc = inspect.getdoc(handler) if handler is not None else None
961
- if doc:
962
- # First non-empty line, with RST inline-code backticks flattened to plain
963
- # quotes so the help reads as prose rather than reStructuredText.
964
- summary = doc.strip().splitlines()[0].strip().replace("``", "'")
965
- if summary:
966
- parts.append(summary)
1032
+ summary = live_command_summary(command_id)
1033
+ if summary:
1034
+ parts.append(summary)
967
1035
  if record is not None and edits_view_in_place(record):
968
1036
  parts.append(IN_PLACE_RECIPE)
969
1037
  example = (record or {}).get("agent_example")
@@ -1032,6 +1100,15 @@ def _command_tree() -> tuple[dict[tuple[str, ...], str], frozenset[tuple[str, ..
1032
1100
  return path_to_command, frozenset(prefixes & path_to_command.keys())
1033
1101
 
1034
1102
 
1103
+ def _leaf_context_settings(command_id: str) -> dict[str, bool]:
1104
+ """Click settings for one command: a bespoke command declares every option it
1105
+ accepts, so Click itself rejects an unknown one; a generic leaf collects its
1106
+ trailing tokens and validates them in :func:`validate_extra_args`."""
1107
+ if command_id in BESPOKE:
1108
+ return {}
1109
+ return {"allow_extra_args": True, "ignore_unknown_options": True}
1110
+
1111
+
1035
1112
  def _group_typer(tokens: tuple[str, ...], command_id: str | None) -> typer.Typer:
1036
1113
  if command_id is not None:
1037
1114
  # This node is both a group and an invocable command.
@@ -1050,6 +1127,86 @@ def _group_typer(tokens: tuple[str, ...], command_id: str | None) -> typer.Typer
1050
1127
  )
1051
1128
 
1052
1129
 
1130
+ def _lazy_help_command(command_id: str) -> type[TyperCommand]:
1131
+ """A command class whose help is read from the handler only when printed.
1132
+
1133
+ Building a group registers every command in it; reading each help text up
1134
+ front imports every handler module of the group, though a run uses one.
1135
+ """
1136
+
1137
+ class LazyHelpCommand(TyperCommand):
1138
+ @property
1139
+ def help(self) -> str | None:
1140
+ return _command_help(command_id, command_by_id(command_id))
1141
+
1142
+ @help.setter
1143
+ def help(self, value: str | None) -> None:
1144
+ """Ignore the registration-time placeholder; the handler is the source."""
1145
+
1146
+ @property
1147
+ def short_help(self) -> str | None:
1148
+ """The group listing prints only the first paragraph, which is the summary."""
1149
+ return _indexed_summary(command_id)
1150
+
1151
+ @short_help.setter
1152
+ def short_help(self, value: str | None) -> None:
1153
+ """Ignore the registration-time value; the handler is the source."""
1154
+
1155
+ return LazyHelpCommand
1156
+
1157
+
1158
+ def _unbuilt_leaf() -> None:
1159
+ """Registration placeholder: a lazy leaf takes its real callback from the built command."""
1160
+
1161
+
1162
+ def _lazy_leaf_command(command_id: str) -> type[TyperCommand]:
1163
+ """A generic leaf whose parameters and callback are built when first read.
1164
+
1165
+ Building a leaf derives its positionals from the SDK signature, which
1166
+ imports the SDK model modules. A group's ``--help`` lists names and help
1167
+ only, so it never reads them; a run reads them for the one command used.
1168
+ """
1169
+
1170
+ class LazyLeafCommand(_lazy_help_command(command_id)): # type: ignore[misc]
1171
+ _built: _ClickCommand | None = None
1172
+
1173
+ def _real(self) -> _ClickCommand:
1174
+ if self._built is None:
1175
+ from typer.models import CommandInfo
1176
+
1177
+ info = CommandInfo(
1178
+ name=self.name,
1179
+ callback=_build_leaf(command_id),
1180
+ help=_command_help(command_id, command_by_id(command_id)),
1181
+ rich_help_panel=self.rich_help_panel,
1182
+ context_settings=_leaf_context_settings(command_id),
1183
+ )
1184
+ self._built = typer.main.get_command_from_info(
1185
+ info,
1186
+ pretty_exceptions_short=_LAZY_SETTINGS["pretty_exceptions_short"],
1187
+ rich_markup_mode=self.rich_markup_mode,
1188
+ )
1189
+ return self._built
1190
+
1191
+ @property
1192
+ def params(self) -> list[_ClickParameter]:
1193
+ return self._real().params
1194
+
1195
+ @params.setter
1196
+ def params(self, value: list[_ClickParameter]) -> None:
1197
+ """Ignore the registration-time parameters; the built command owns them."""
1198
+
1199
+ @property
1200
+ def callback(self) -> Any:
1201
+ return self._real().callback
1202
+
1203
+ @callback.setter
1204
+ def callback(self, value: Any) -> None:
1205
+ """Ignore the registration-time placeholder callback."""
1206
+
1207
+ return LazyLeafCommand
1208
+
1209
+
1053
1210
  def _populate(base: tuple[str, ...], group: typer.Typer) -> None:
1054
1211
  """Register every command below ``base`` (exclusive) on ``group``."""
1055
1212
  path_to_command, containers = _command_tree()
@@ -1082,14 +1239,14 @@ def _populate(base: tuple[str, ...], group: typer.Typer) -> None:
1082
1239
  for tokens, command_id in sorted(below.items()):
1083
1240
  if tokens in containers:
1084
1241
  continue
1085
- record = command_by_id(command_id)
1086
- callback = BESPOKE.get(command_id) or _build_leaf(command_id)
1242
+ bespoke = BESPOKE.get(command_id)
1087
1243
  _group_for(tokens[:-1]).command(
1088
1244
  name=tokens[-1],
1089
- help=_command_help(command_id, record),
1245
+ cls=_lazy_help_command(command_id) if bespoke else _lazy_leaf_command(command_id),
1246
+ help="",
1090
1247
  rich_help_panel=_ROOT_HELP_PANELS.get(tokens[0]) if len(tokens) == 1 else None,
1091
- context_settings={"allow_extra_args": True, "ignore_unknown_options": True},
1092
- )(callback)
1248
+ context_settings=_leaf_context_settings(command_id),
1249
+ )(bespoke or _unbuilt_leaf)
1093
1250
 
1094
1251
 
1095
1252
  @cache
@@ -1121,6 +1278,77 @@ def _load_top_level_group(name: str) -> Any:
1121
1278
  return typer.main.get_group_from_info(info, **_LAZY_SETTINGS)
1122
1279
 
1123
1280
 
1281
+ # Root ``--help`` prints each top-level leaf's help; reading it from the handler
1282
+ # would import the handler's module (and its SDK dependencies). A test pins this
1283
+ # table to :func:`_command_help` so it cannot drift.
1284
+ _ROOT_LEAF_HELP: dict[str, str] = {
1285
+ "calc": (
1286
+ "Evaluate one arithmetic expression exactly."
1287
+ "\n\nExample: mammoth calc '2063664 - 1917815'"
1288
+ ),
1289
+ "doctor": (
1290
+ "Run environment and connectivity diagnostics."
1291
+ "\n\nExample: mammoth doctor\n\nInput fields: wait (int)"
1292
+ ),
1293
+ "link": (
1294
+ "Read the workspace, project, folder, dataset and view ids out of a pasted app URL."
1295
+ "\n\nExample: mammoth link https://app.mammoth.io/workspaces/1/projects/2/data/datasets"
1296
+ ),
1297
+ "resolve": (
1298
+ "Say what NAME refers to: a dataset, a view or a project, with ids and projects."
1299
+ "\n\nExample: mammoth resolve uqa-w29-ren"
1300
+ ),
1301
+ "upgrade": (
1302
+ "Upgrade the mammoth CLI to the latest (or a specified) version from PyPI."
1303
+ "\n\nExample: mammoth upgrade"
1304
+ ),
1305
+ "version": "Example: mammoth version",
1306
+ }
1307
+ _LAZY_LEAF_IDS: dict[str, str] = {}
1308
+
1309
+
1310
+ def _load_root_leaf(name: str) -> Any:
1311
+ from typer.models import CommandInfo
1312
+
1313
+ command_id = _LAZY_LEAF_IDS[name]
1314
+ info = CommandInfo(
1315
+ name=name,
1316
+ callback=BESPOKE.get(command_id) or _build_leaf(command_id),
1317
+ help=_command_help(command_id, command_by_id(command_id)),
1318
+ rich_help_panel=_ROOT_HELP_PANELS.get(name),
1319
+ context_settings=_leaf_context_settings(command_id),
1320
+ )
1321
+ return typer.main.get_command_from_info(
1322
+ info,
1323
+ pretty_exceptions_short=_LAZY_SETTINGS["pretty_exceptions_short"],
1324
+ rich_markup_mode=_LAZY_SETTINGS["rich_markup_mode"],
1325
+ )
1326
+
1327
+
1328
+ def _root_leaf_stub(name: str) -> Any:
1329
+ """A placeholder leaf carrying only what the root ``--help`` listing prints."""
1330
+ return TyperCommand(
1331
+ name=name,
1332
+ help=_ROOT_LEAF_HELP[name],
1333
+ rich_help_panel=_ROOT_HELP_PANELS.get(name),
1334
+ rich_markup_mode=_LAZY_SETTINGS["rich_markup_mode"],
1335
+ )
1336
+
1337
+
1338
+ def _load_lazy_root(name: str) -> Any:
1339
+ return _load_root_leaf(name) if name in _LAZY_LEAF_IDS else _load_top_level_group(name)
1340
+
1341
+
1342
+ def _group_stub(name: str) -> Any:
1343
+ """A placeholder group carrying only what the root ``--help`` listing prints."""
1344
+ return TyperGroup(
1345
+ name=name,
1346
+ help=_GROUP_DESCRIPTIONS.get(name, f"Commands for {name}."),
1347
+ rich_help_panel=_ROOT_HELP_PANELS.get(name),
1348
+ rich_markup_mode=_LAZY_SETTINGS["rich_markup_mode"],
1349
+ )
1350
+
1351
+
1124
1352
  def build_app() -> typer.Typer:
1125
1353
  """Construct the Typer command tree from the command manifests.
1126
1354
 
@@ -1155,13 +1383,8 @@ def build_app() -> typer.Typer:
1155
1383
  if (name,) in containers or (name,) not in path_to_command:
1156
1384
  lazy.append(name)
1157
1385
  continue
1158
- command_id = path_to_command[(name,)]
1159
- root.command(
1160
- name=name,
1161
- help=_command_help(command_id, command_by_id(command_id)),
1162
- rich_help_panel=_ROOT_HELP_PANELS.get(name),
1163
- context_settings={"allow_extra_args": True, "ignore_unknown_options": True},
1164
- )(BESPOKE.get(command_id) or _build_leaf(command_id))
1386
+ _LAZY_LEAF_IDS[name] = path_to_command[(name,)]
1387
+ lazy.append(name)
1165
1388
  _LAZY_GROUP_NAMES[:] = lazy
1166
1389
  _LAZY_SETTINGS.update(
1167
1390
  pretty_exceptions_short=root.pretty_exceptions_short,
@@ -1196,6 +1419,9 @@ def registered_command_paths() -> set[str]:
1196
1419
 
1197
1420
  walk(app, ())
1198
1421
  for name in _LAZY_GROUP_NAMES:
1422
+ if name in _LAZY_LEAF_IDS:
1423
+ paths.add(name)
1424
+ continue
1199
1425
  sub = _top_level_typer(name)
1200
1426
  if sub.registered_callback is not None:
1201
1427
  paths.add(name)
@@ -1,6 +1,6 @@
1
1
  # Published CLI command catalog
2
2
 
3
- This generated catalog is a lookup table for every command in the published CLI manifest, currently 660; each entry carries its release status line. It is a command-contract index, not an assertion that every backend/OpenAPI operation has a CLI binding. For an exact local CLI contract, run `mammoth schema get COMMAND_ID`; `mammoth capability list` is an API-binding inventory and can omit typed/local CLI routes. For focused workflows, read the [recipes index](recipes/index.md). Sensitive structured input must come from a private file or pipe; never put secrets in literal argv.
3
+ This generated catalog is a lookup table for every command in the published CLI manifest, currently 663; each entry carries its release status line. It is a command-contract index, not an assertion that every backend/OpenAPI operation has a CLI binding. For an exact local CLI contract, run `mammoth schema get COMMAND_ID`; `mammoth capability list` is an API-binding inventory and can omit typed/local CLI routes. For focused workflows, read the [recipes index](recipes/index.md). Sensitive structured input must come from a private file or pipe; never put secrets in literal argv.
4
4
 
5
5
  Load only the applicable domain file:
6
6
 
@@ -50,8 +50,8 @@ Load only the applicable domain file:
50
50
  - [upgrade](commands/upgrade.md) — 1 published commands
51
51
  - [user](commands/user.md) — 8 published commands
52
52
  - [version](commands/version.md) — 1 published commands
53
- - [view-transform](commands/view-transform.md) — 32 published commands
54
- - [view](commands/view.md) — 97 published commands
53
+ - [view-transform](commands/view-transform.md) — 34 published commands
54
+ - [view](commands/view.md) — 98 published commands
55
55
  - [webhook](commands/webhook.md) — 7 published commands
56
56
  - [workflow](commands/workflow.md) — 16 published commands
57
57
  - [workspace](commands/workspace.md) — 26 published commands
@@ -142,6 +142,16 @@ Result: `ViewTransformFilterResult`; mutation `reversible_pipeline`, confirmatio
142
142
 
143
143
  Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
144
144
 
145
+ ### `view.transform.first-name`
146
+
147
+ Run: `mammoth view transform first-name`. Exact input fields: `mammoth schema get view.transform.first-name`.
148
+
149
+ Example: `mammoth view transform first-name 123 --input '{"column": "Name", "new_column": "First name", "dataset_id": 456}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
150
+
151
+ Result: `ViewTransformFirstNameResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
152
+
153
+ Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
154
+
145
155
  ### `view.transform.generate-sql`
146
156
 
147
157
  Run: `mammoth view transform generate-sql`. Exact input fields: `mammoth schema get view.transform.generate-sql`.
@@ -312,6 +322,16 @@ Result: `ViewTransformUnnestResult`; mutation `reversible_pipeline`, confirmatio
312
322
 
313
323
  Status on release: ran once on CLI 2.0.40 through `view.task.add` and was read back with `view data get`; other inputs for this transform are untried.
314
324
 
325
+ ### `view.transform.update-column`
326
+
327
+ Run: `mammoth view transform update-column`. Exact input fields: `mammoth schema get view.transform.update-column`.
328
+
329
+ Example: `mammoth view transform update-column 123 --input '{"column": "Cost", "expression": "Cost + 5", "dataset_id": 456}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
330
+
331
+ Result: `ViewTransformUpdateColumnResult`; mutation `reversible_pipeline`, confirmation `none`, wait policy `always_wait`.
332
+
333
+ Status on release: untried; it submits through `view.task.add`, but this transform was not among those run.
334
+
315
335
  ### `view.transform.window`
316
336
 
317
337
  Run: `mammoth view transform window`. Exact input fields: `mammoth schema get view.transform.window`.
@@ -312,6 +312,8 @@ Result: `ViewDerivativeCreateResult`; mutation `benign_mutation`, confirmation `
312
312
 
313
313
  Status on release: ran once on CLI 2.0.24 — payload probe 2026-09-19: exit 0 on release with CLI 2.0.24. Created derivative id=6 on view 123 (project 52, dataset 104) with the column INTERNAL name as ARGUMENT; metric_status DONE on read-back. The same call with the display name reproduces the HTTP 500…
314
314
 
315
+ A METRIC shows as an explore-panel card via `display_properties`; the CLI defaults it to the metric card, and the result's `card` says whether one exists.
316
+
315
317
  ### `view.derivative.data`
316
318
 
317
319
  Run: `mammoth view derivative data`. Exact input fields: `mammoth schema get view.derivative.data`.
@@ -426,7 +428,7 @@ Status on release: untried; no live run recorded.
426
428
 
427
429
  Run: `mammoth view explore-panel set`. Exact input fields: `mammoth schema get view.explore-panel.set`.
428
430
 
429
- Example: `mammoth view explore-panel set 123 --input '{"panel": {"open": true, "items": [{"column": "column_1", "renderType": "chart"}]}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
431
+ Example: `mammoth view explore-panel set 123 --input '{"panel": {"columns": "all"}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
430
432
 
431
433
  Result: `ViewExplorePanelSetResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
432
434
 
@@ -548,6 +550,16 @@ Result: `ViewExportListResult`; mutation `read`, confirmation `none`, wait polic
548
550
 
549
551
  Status on release: ran once on CLI 2.0.28 — ILG simulation 2026-09-19: exit 0 on release with CLI 2.0.28. Listed both internal_dataset exports with target_properties (DS_NAME, COLUMN_MAPPING, project fields). Single invocation only.
550
552
 
553
+ ### `view.export.live-link`
554
+
555
+ Run: `mammoth view export live-link`. Exact input fields: `mammoth schema get view.export.live-link`.
556
+
557
+ Example: `mammoth view export live-link 123 123 --input '{"file_name": "report_share.csv"}'`. Illustrative only: append `--yes` after observing an owned target.
558
+
559
+ Result: `ViewExportLiveLinkResult`; mutation `external_effect`, confirmation `yes_always`, wait policy `always_wait`.
560
+
561
+ Status on release: untried; no live run recorded.
562
+
551
563
  ### `view.export.managed-s3`
552
564
 
553
565
  Run: `mammoth view export managed-s3`. Exact input fields: `mammoth schema get view.export.managed-s3`.
@@ -29,6 +29,20 @@ If `schema get view.export.csv` rejects requested fields, preserve the
29
29
  structured error and discover another declared export route rather than using
30
30
  raw HTTP.
31
31
 
32
+ ## Share a view as a live link
33
+
34
+ ```bash
35
+ mammoth view export live-link VIEW_ID DATASET_ID --project PROJECT_ID --yes
36
+ # -> {"url": "<the live link>"}
37
+ ```
38
+
39
+ An S3 export flagged `liveLink`: a public URL that serves the view's data and
40
+ stays current as the view's pipeline re-runs. Optional `--input` fields are
41
+ `file_name` (`<prefix>_<token>.csv`; the server replaces the token), `file_type`
42
+ (`csv`, `json`, `parquet`) and `include_hidden`. A plan without live links is
43
+ refused by the backend; its message comes back as the error. Hand the URL to the
44
+ user as returned; anyone holding it can read the data.
45
+
32
46
  ## Send a view into another project (parallel send, branch-out)
33
47
 
34
48
  `view export dataset` writes the view's rows into a Mammoth dataset **as a
@@ -0,0 +1,31 @@
1
+ """commands layer for the Mammoth CLI.
2
+
3
+ Assembles :data:`BESPOKE`: fully-typed Typer command callbacks that override
4
+ the generic manifest leaf for the command ids they implement. ``app.py``
5
+ imports this module and swaps in a bespoke callback wherever one exists,
6
+ registering it at the exact same manifest path and name as the generic leaf
7
+ it replaces.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from collections.abc import Callable
13
+
14
+ from mammoth_cli.commands._lazy import LazyTable
15
+
16
+ _TARGETS: dict[str, str] = {
17
+ "auth.login": "mammoth_cli.commands.auth:auth_login",
18
+ "auth.status": "mammoth_cli.commands.auth:auth_status",
19
+ "auth.logout": "mammoth_cli.commands.auth:auth_logout",
20
+ "config.get": "mammoth_cli.commands.config:config_get",
21
+ "config.set": "mammoth_cli.commands.config:config_set",
22
+ "config.list": "mammoth_cli.commands.config:config_list",
23
+ "config.path": "mammoth_cli.commands.config:config_path",
24
+ "context.project.status": "mammoth_cli.commands.context:context_project_status",
25
+ "context.project.use": "mammoth_cli.commands.context:context_project_use",
26
+ "context.project.clear": "mammoth_cli.commands.context:context_project_clear",
27
+ "upgrade": "mammoth_cli.commands.upgrade:upgrade_command",
28
+ }
29
+
30
+ #: Command id -> bespoke Typer callback, imported from its module on first use.
31
+ BESPOKE: LazyTable[Callable[..., None]] = LazyTable(_TARGETS)