nextmv 1.6.2__tar.gz → 1.6.3.dev0__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 (396) hide show
  1. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/CONTRIBUTING.md +3 -3
  2. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/PKG-INFO +1 -1
  3. nextmv-1.6.3.dev0/nextmv/__about__.py +1 -0
  4. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/app/push.py +28 -12
  5. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/instance/create.py +9 -6
  6. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/instance/update.py +6 -3
  7. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/managed_input/create.py +7 -4
  8. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/run/create.py +10 -8
  9. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/run/get.py +15 -5
  10. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/run/input.py +2 -2
  11. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/run/track.py +40 -28
  12. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/configuration/config.py +3 -0
  13. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/init.py +15 -21
  14. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/local/run/create.py +8 -6
  15. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/local/run/get.py +14 -4
  16. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/local/run/input.py +2 -2
  17. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/main.py +103 -10
  18. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/manifest/init.py +5 -2
  19. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/_helpers.py +3 -3
  20. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/message.py +41 -0
  21. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/application/_managed_input.py +3 -4
  22. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/application/_run.py +31 -32
  23. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/client.py +7 -7
  24. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/input.py +164 -111
  25. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/local/application.py +63 -58
  26. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/local/executor.py +15 -59
  27. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/local/registry.py +9 -9
  28. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/manifest.py +39 -6
  29. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/output.py +107 -75
  30. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/run.py +76 -35
  31. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_class-assign/main.py +2 -2
  32. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_demand-alloc/workflow/main.py +2 -2
  33. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_hello-world/main.py +2 -2
  34. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/cli/test_configuration.py +10 -6
  35. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/cli/test_main.py +4 -4
  36. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/cli/test_mcp.py +31 -112
  37. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/local/test_application.py +12 -12
  38. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/local/test_executor.py +8 -3
  39. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/local/test_registry.py +34 -34
  40. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/test_input.py +26 -26
  41. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/test_output.py +24 -24
  42. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/uv.lock +184 -174
  43. nextmv-1.6.2/nextmv/__about__.py +0 -1
  44. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/.gitignore +0 -0
  45. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/.python-version +0 -0
  46. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/LICENSE +0 -0
  47. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/README.md +0 -0
  48. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/__entrypoint__.py +0 -0
  49. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/__init__.py +0 -0
  50. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/_serialization.py +0 -0
  51. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/account.py +0 -0
  52. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/base_model.py +0 -0
  53. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/__init__.py +0 -0
  54. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/__init__.py +0 -0
  55. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/acceptance/__init__.py +0 -0
  56. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/acceptance/create.py +0 -0
  57. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/acceptance/delete.py +0 -0
  58. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/acceptance/get.py +0 -0
  59. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/acceptance/list.py +0 -0
  60. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/acceptance/update.py +0 -0
  61. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/account/__init__.py +0 -0
  62. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/account/create.py +0 -0
  63. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/account/delete.py +0 -0
  64. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/account/get.py +0 -0
  65. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/account/update.py +0 -0
  66. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/app/__init__.py +0 -0
  67. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/app/create.py +0 -0
  68. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/app/delete.py +0 -0
  69. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/app/exists.py +0 -0
  70. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/app/get.py +0 -0
  71. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/app/list.py +0 -0
  72. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/app/update.py +0 -0
  73. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/batch/__init__.py +0 -0
  74. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/batch/create.py +0 -0
  75. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/batch/delete.py +0 -0
  76. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/batch/get.py +0 -0
  77. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/batch/list.py +0 -0
  78. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/batch/metadata.py +0 -0
  79. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/batch/update.py +0 -0
  80. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/data/__init__.py +0 -0
  81. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/data/upload.py +0 -0
  82. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/ensemble/__init__.py +0 -0
  83. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/ensemble/create.py +0 -0
  84. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/ensemble/delete.py +0 -0
  85. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/ensemble/get.py +0 -0
  86. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/ensemble/list.py +0 -0
  87. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/ensemble/update.py +0 -0
  88. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/input_set/__init__.py +0 -0
  89. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/input_set/create.py +0 -0
  90. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/input_set/delete.py +0 -0
  91. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/input_set/get.py +0 -0
  92. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/input_set/list.py +0 -0
  93. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/input_set/update.py +0 -0
  94. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/instance/__init__.py +0 -0
  95. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/instance/delete.py +0 -0
  96. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/instance/exists.py +0 -0
  97. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/instance/get.py +0 -0
  98. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/instance/list.py +0 -0
  99. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/managed_input/__init__.py +0 -0
  100. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/managed_input/delete.py +0 -0
  101. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/managed_input/get.py +0 -0
  102. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/managed_input/list.py +0 -0
  103. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/managed_input/update.py +0 -0
  104. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/marketplace/__init__.py +0 -0
  105. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/marketplace/app/__init__.py +0 -0
  106. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/marketplace/app/create.py +0 -0
  107. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/marketplace/app/get.py +0 -0
  108. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/marketplace/app/list.py +0 -0
  109. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/marketplace/app/update.py +0 -0
  110. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/marketplace/subscription/__init__.py +0 -0
  111. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/marketplace/subscription/create.py +0 -0
  112. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/marketplace/subscription/delete.py +0 -0
  113. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/marketplace/subscription/get.py +0 -0
  114. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/marketplace/subscription/list.py +0 -0
  115. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/marketplace/version/__init__.py +0 -0
  116. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/marketplace/version/create.py +0 -0
  117. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/marketplace/version/get.py +0 -0
  118. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/marketplace/version/list.py +0 -0
  119. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/marketplace/version/update.py +0 -0
  120. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/run/__init__.py +0 -0
  121. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/run/cancel.py +0 -0
  122. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/run/delete.py +0 -0
  123. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/run/list.py +0 -0
  124. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/run/logs.py +0 -0
  125. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/run/metadata.py +0 -0
  126. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/scenario/__init__.py +0 -0
  127. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/scenario/create.py +0 -0
  128. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/scenario/delete.py +0 -0
  129. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/scenario/get.py +0 -0
  130. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/scenario/list.py +0 -0
  131. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/scenario/metadata.py +0 -0
  132. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/scenario/update.py +0 -0
  133. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/secrets/__init__.py +0 -0
  134. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/secrets/create.py +0 -0
  135. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/secrets/delete.py +0 -0
  136. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/secrets/get.py +0 -0
  137. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/secrets/list.py +0 -0
  138. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/secrets/update.py +0 -0
  139. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/shadow/__init__.py +0 -0
  140. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/shadow/create.py +0 -0
  141. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/shadow/delete.py +0 -0
  142. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/shadow/get.py +0 -0
  143. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/shadow/list.py +0 -0
  144. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/shadow/metadata.py +0 -0
  145. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/shadow/start.py +0 -0
  146. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/shadow/stop.py +0 -0
  147. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/shadow/update.py +0 -0
  148. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/sso/__init__.py +0 -0
  149. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/sso/create.py +0 -0
  150. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/sso/delete.py +0 -0
  151. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/sso/disable.py +0 -0
  152. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/sso/domain/__init__.py +0 -0
  153. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/sso/domain/delete.py +0 -0
  154. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/sso/enable.py +0 -0
  155. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/sso/get.py +0 -0
  156. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/sso/update.py +0 -0
  157. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/switchback/__init__.py +0 -0
  158. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/switchback/create.py +0 -0
  159. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/switchback/delete.py +0 -0
  160. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/switchback/get.py +0 -0
  161. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/switchback/list.py +0 -0
  162. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/switchback/metadata.py +0 -0
  163. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/switchback/start.py +0 -0
  164. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/switchback/stop.py +0 -0
  165. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/switchback/update.py +0 -0
  166. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/upload/__init__.py +0 -0
  167. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/upload/create.py +0 -0
  168. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/version/__init__.py +0 -0
  169. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/version/create.py +0 -0
  170. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/version/delete.py +0 -0
  171. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/version/exists.py +0 -0
  172. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/version/get.py +0 -0
  173. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/version/list.py +0 -0
  174. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/cloud/version/update.py +0 -0
  175. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/community/__init__.py +0 -0
  176. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/community/clone.py +0 -0
  177. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/community/list.py +0 -0
  178. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/configuration/__init__.py +0 -0
  179. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/configuration/create.py +0 -0
  180. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/configuration/delete.py +0 -0
  181. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/configuration/list.py +0 -0
  182. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/local/__init__.py +0 -0
  183. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/local/app/__init__.py +0 -0
  184. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/local/app/delete.py +0 -0
  185. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/local/app/get.py +0 -0
  186. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/local/app/list.py +0 -0
  187. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/local/app/register.py +0 -0
  188. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/local/app/registered.py +0 -0
  189. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/local/app/sync.py +0 -0
  190. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/local/app/update.py +0 -0
  191. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/local/run/__init__.py +0 -0
  192. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/local/run/list.py +0 -0
  193. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/local/run/logs.py +0 -0
  194. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/local/run/metadata.py +0 -0
  195. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/local/run/visuals.py +0 -0
  196. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/manifest/__init__.py +0 -0
  197. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/manifest/validate.py +0 -0
  198. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/__init__.py +0 -0
  199. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/serve.py +0 -0
  200. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/server.py +0 -0
  201. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/WORKFLOW.md +0 -0
  202. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/__init__.py +0 -0
  203. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/acceptance.py +0 -0
  204. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/account.py +0 -0
  205. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/app.py +0 -0
  206. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/batch.py +0 -0
  207. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/community.py +0 -0
  208. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/ensemble.py +0 -0
  209. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/guide.py +0 -0
  210. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/input_set.py +0 -0
  211. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/instance.py +0 -0
  212. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/local.py +0 -0
  213. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/managed_input.py +0 -0
  214. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/profile.py +0 -0
  215. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/run.py +0 -0
  216. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/scenario.py +0 -0
  217. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/secrets.py +0 -0
  218. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/shadow.py +0 -0
  219. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/sso.py +0 -0
  220. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/switchback.py +0 -0
  221. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/mcp/tools/version.py +0 -0
  222. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/options.py +0 -0
  223. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cli/version.py +0 -0
  224. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/__init__.py +0 -0
  225. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/acceptance_test.py +0 -0
  226. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/account.py +0 -0
  227. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/application/__init__.py +0 -0
  228. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/application/_acceptance.py +0 -0
  229. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/application/_batch_scenario.py +0 -0
  230. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/application/_ensemble.py +0 -0
  231. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/application/_input_set.py +0 -0
  232. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/application/_instance.py +0 -0
  233. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/application/_secrets.py +0 -0
  234. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/application/_shadow.py +0 -0
  235. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/application/_switchback.py +0 -0
  236. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/application/_utils.py +0 -0
  237. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/application/_version.py +0 -0
  238. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/assets.py +0 -0
  239. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/batch_experiment.py +0 -0
  240. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/community.py +0 -0
  241. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/ensemble.py +0 -0
  242. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/input_set.py +0 -0
  243. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/instance.py +0 -0
  244. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/integration.py +0 -0
  245. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/marketplace.py +0 -0
  246. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/package.py +0 -0
  247. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/scenario.py +0 -0
  248. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/secrets.py +0 -0
  249. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/shadow.py +0 -0
  250. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/sso.py +0 -0
  251. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/switchback.py +0 -0
  252. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/url.py +0 -0
  253. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/cloud/version.py +0 -0
  254. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/content_format.py +0 -0
  255. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/default_app/.gitignore +0 -0
  256. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/default_app/README.md +0 -0
  257. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/default_app/app.yaml +0 -0
  258. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/default_app/input.json +0 -0
  259. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/default_app/main.py +0 -0
  260. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/default_app/requirements.txt +0 -0
  261. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/default_app/src/__init__.py +0 -0
  262. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/default_app/src/visuals.py +0 -0
  263. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/deprecated.py +0 -0
  264. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/local/__init__.py +0 -0
  265. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/local/geojson_handler.py +0 -0
  266. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/local/local.py +0 -0
  267. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/local/plotly_handler.py +0 -0
  268. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/local/runner.py +0 -0
  269. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/logger.py +0 -0
  270. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/model.py +0 -0
  271. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/options.py +0 -0
  272. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/polling.py +0 -0
  273. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/safe.py +0 -0
  274. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/status.py +0 -0
  275. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/binary_json_app.yaml +0 -0
  276. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/binary_multi-file_app.yaml +0 -0
  277. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/go_json_app.yaml +0 -0
  278. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/go_json_hello-world/.gitignore +0 -0
  279. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/go_json_hello-world/README.md +0 -0
  280. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/go_json_hello-world/app.yaml +0 -0
  281. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/go_json_hello-world/go.mod +0 -0
  282. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/go_json_hello-world/input.json +0 -0
  283. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/go_json_hello-world/main.go +0 -0
  284. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/go_multi-file_app.yaml +0 -0
  285. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/go_multi-file_hello-world/.gitignore +0 -0
  286. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/go_multi-file_hello-world/README.md +0 -0
  287. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/go_multi-file_hello-world/app.yaml +0 -0
  288. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/go_multi-file_hello-world/go.mod +0 -0
  289. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/go_multi-file_hello-world/inputs/input.json +0 -0
  290. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/go_multi-file_hello-world/main.go +0 -0
  291. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/java_json_app.yaml +0 -0
  292. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/java_json_hello-world/.gitignore +0 -0
  293. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/java_json_hello-world/Main.java +0 -0
  294. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/java_json_hello-world/README.md +0 -0
  295. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/java_json_hello-world/app.yaml +0 -0
  296. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/java_json_hello-world/input.json +0 -0
  297. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/java_json_hello-world/pom.xml +0 -0
  298. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/java_multi-file_app.yaml +0 -0
  299. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/java_multi-file_hello-world/.gitignore +0 -0
  300. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/java_multi-file_hello-world/Main.java +0 -0
  301. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/java_multi-file_hello-world/README.md +0 -0
  302. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/java_multi-file_hello-world/app.yaml +0 -0
  303. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/java_multi-file_hello-world/inputs/input.json +0 -0
  304. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/java_multi-file_hello-world/pom.xml +0 -0
  305. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_app.yaml +0 -0
  306. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_class-assign/.gitignore +0 -0
  307. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_class-assign/README.md +0 -0
  308. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_class-assign/app.yaml +0 -0
  309. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_class-assign/input.json +0 -0
  310. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_class-assign/main.py +0 -0
  311. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_class-assign/requirements.txt +0 -0
  312. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_class-assign/visualizations.py +0 -0
  313. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_demand-alloc/.gitignore +0 -0
  314. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_demand-alloc/README.md +0 -0
  315. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_demand-alloc/allocation/README.md +0 -0
  316. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_demand-alloc/allocation/app.yaml +0 -0
  317. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_demand-alloc/allocation/input.json +0 -0
  318. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_demand-alloc/allocation/main.py +0 -0
  319. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_demand-alloc/allocation/requirements.txt +0 -0
  320. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_demand-alloc/allocation/visuals.py +0 -0
  321. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_demand-alloc/workflow/README.md +0 -0
  322. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_demand-alloc/workflow/app.yaml +0 -0
  323. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_demand-alloc/workflow/input.json +0 -0
  324. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_demand-alloc/workflow/main.py +0 -0
  325. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_demand-alloc/workflow/requirements.txt +0 -0
  326. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_demand-alloc/workflow/visuals.py +0 -0
  327. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_hello-world/.gitignore +0 -0
  328. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_hello-world/README.md +0 -0
  329. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_hello-world/app.yaml +0 -0
  330. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_hello-world/input.json +0 -0
  331. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_hello-world/main.py +0 -0
  332. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_json_hello-world/requirements.txt +0 -0
  333. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_app.yaml +0 -0
  334. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_class-assign/.gitignore +0 -0
  335. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_class-assign/README.md +0 -0
  336. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_class-assign/app.yaml +0 -0
  337. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_class-assign/inputs/input.json +0 -0
  338. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_class-assign/requirements.txt +0 -0
  339. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_class-assign/visualizations.py +0 -0
  340. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_demand-alloc/README.md +0 -0
  341. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_demand-alloc/allocation/README.md +0 -0
  342. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_demand-alloc/allocation/app.yaml +0 -0
  343. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_demand-alloc/allocation/input.json +0 -0
  344. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_demand-alloc/allocation/main.py +0 -0
  345. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_demand-alloc/allocation/requirements.txt +0 -0
  346. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_demand-alloc/allocation/visuals.py +0 -0
  347. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_demand-alloc/workflow/.gitignore +0 -0
  348. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_demand-alloc/workflow/README.md +0 -0
  349. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_demand-alloc/workflow/app.yaml +0 -0
  350. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_demand-alloc/workflow/inputs/input.json +0 -0
  351. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_demand-alloc/workflow/requirements.txt +0 -0
  352. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_demand-alloc/workflow/visuals.py +0 -0
  353. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_hello-world/.gitignore +0 -0
  354. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_hello-world/README.md +0 -0
  355. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_hello-world/app.yaml +0 -0
  356. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_hello-world/inputs/input.json +0 -0
  357. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/nextmv/templates/python_multi-file_hello-world/requirements.txt +0 -0
  358. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/pyproject.toml +0 -0
  359. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/__init__.py +0 -0
  360. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/cli/__init__.py +0 -0
  361. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/cli/test_version.py +0 -0
  362. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/cloud/__init__.py +0 -0
  363. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/cloud/app.yaml +0 -0
  364. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/cloud/test_client.py +0 -0
  365. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/cloud/test_instance.py +0 -0
  366. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/cloud/test_package.py +0 -0
  367. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/cloud/test_scenario.py +0 -0
  368. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/integration/__init__.py +0 -0
  369. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/integration/cloud/__init__.py +0 -0
  370. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/integration/cloud/test_integration_cloud.py +0 -0
  371. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/integration/cloud/test_integration_marketplace.py +0 -0
  372. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/local/__init__.py +0 -0
  373. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/local/test_runner.py +0 -0
  374. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/scripts/__init__.py +0 -0
  375. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/scripts/options1.py +0 -0
  376. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/scripts/options2.py +0 -0
  377. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/scripts/options3.py +0 -0
  378. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/scripts/options4.py +0 -0
  379. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/scripts/options5.py +0 -0
  380. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/scripts/options6.py +0 -0
  381. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/scripts/options7.py +0 -0
  382. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/test_base_model.py +0 -0
  383. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/test_entrypoint/__init__.py +0 -0
  384. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/test_entrypoint/test_entrypoint.py +0 -0
  385. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/test_inputs/test_data.csv +0 -0
  386. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/test_inputs/test_data.json +0 -0
  387. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/test_inputs/test_data.txt +0 -0
  388. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/test_logger.py +0 -0
  389. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/test_manifest.py +0 -0
  390. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/test_model.py +0 -0
  391. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/test_options.py +0 -0
  392. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/test_polling.py +0 -0
  393. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/test_run.py +0 -0
  394. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/test_safe.py +0 -0
  395. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/test_serialization.py +0 -0
  396. {nextmv-1.6.2 → nextmv-1.6.3.dev0}/tests/test_version.py +0 -0
@@ -331,15 +331,15 @@ guidelines:
331
331
  - When showing the values of an `Enum`, use the `enum_values` function in the
332
332
  `message.py` file which will give a nicely colored, comma-separated list of
333
333
  the enum values. Consider the following example, where we get the allowed
334
- values for the `InputFormat` class.
334
+ values for the `ContentFormat` class.
335
335
 
336
336
  ```python
337
337
  content_format: Annotated[
338
- InputFormat | None,
338
+ ContentFormat | None,
339
339
  typer.Option(
340
340
  "--content-format",
341
341
  "-c",
342
- help=f"The content format for the instance. Allowed values are: {enum_values(InputFormat)}.",
342
+ help=f"The content format for the instance. Allowed values are: {enum_values(ContentFormat)}.",
343
343
  metavar="CONTENT_FORMAT",
344
344
  rich_help_panel="Instance configuration",
345
345
  ),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nextmv
3
- Version: 1.6.2
3
+ Version: 1.6.3.dev0
4
4
  Summary: The all-purpose Python SDK for Nextmv
5
5
  Project-URL: Homepage, https://www.nextmv.io
6
6
  Project-URL: Documentation, https://nextmv-py.docs.nextmv.io/en/latest/nextmv/
@@ -0,0 +1 @@
1
+ __version__ = "v1.6.3.dev0"
@@ -198,7 +198,7 @@ def handle_push(
198
198
  update_instance_id: str | None,
199
199
  create_defined: bool,
200
200
  create_instance_id: str | None,
201
- ) -> None:
201
+ ) -> str:
202
202
  """
203
203
  Handle the core push flow: push the application, create a version, and link it to an instance.
204
204
 
@@ -226,6 +226,12 @@ def handle_push(
226
226
  Whether --create-instance-id was provided.
227
227
  create_instance_id : str | None
228
228
  The instance ID to create.
229
+
230
+ Returns
231
+ -------
232
+ str
233
+ The instance ID that was linked to the version, or an empty string if
234
+ no instance was linked.
229
235
  """
230
236
 
231
237
  # Do the normal push first.
@@ -247,7 +253,7 @@ def handle_push(
247
253
  now=now,
248
254
  )
249
255
  if not should_continue:
250
- return
256
+ return ""
251
257
 
252
258
  # If the override for updating an instance was used, we update the instance
253
259
  # and we are done.
@@ -260,7 +266,7 @@ def handle_push(
260
266
  instance_id=update_instance_id,
261
267
  )
262
268
 
263
- return
269
+ return update_instance_id
264
270
 
265
271
  # If the override for creating a new instance was used, we create the
266
272
  # instance and we are done.
@@ -274,16 +280,18 @@ def handle_push(
274
280
  now=now,
275
281
  )
276
282
 
277
- return
283
+ return create_instance_id
278
284
 
279
285
  # If no overrides are used, we handle instance prompting.
280
- _handle_instance_prompting(
286
+ instance_id = _handle_instance_prompting(
281
287
  cloud_app=cloud_app,
282
288
  app_id=app_id,
283
289
  version_id=version_id,
284
290
  now=now,
285
291
  )
286
292
 
293
+ return instance_id
294
+
287
295
 
288
296
  def _handle_version_creation(
289
297
  cloud_app: Application,
@@ -363,7 +371,7 @@ def _handle_instance_prompting(
363
371
  app_id: str,
364
372
  version_id: str,
365
373
  now: datetime,
366
- ) -> None:
374
+ ) -> str:
367
375
  """
368
376
  Handle interactive prompting for linking a version to an instance after a push.
369
377
 
@@ -379,7 +387,13 @@ def _handle_instance_prompting(
379
387
  version_id : str
380
388
  The version ID to link to an instance.
381
389
  now : datetime
382
- The current datetime, used for instance description if a new instance is created.
390
+ The current datetime, used for instance description if a new instance
391
+ is created.
392
+
393
+ Returns
394
+ -------
395
+ str
396
+ The instance ID that was linked to the version, or an empty string if no instance was linked.
383
397
  """
384
398
 
385
399
  # If this is not an interactive terminal, do not ask for instance linking,
@@ -387,7 +401,7 @@ def _handle_instance_prompting(
387
401
  if not sys.stdin.isatty():
388
402
  info("Non-interactive terminal detected. Skipping instance linking.")
389
403
 
390
- return
404
+ return ""
391
405
 
392
406
  # Prompt the user for an instance ID to link the new version to.
393
407
  instance_id = Prompt.ask(
@@ -397,7 +411,7 @@ def _handle_instance_prompting(
397
411
  )
398
412
  if instance_id == "":
399
413
  info("No instance ID provided. Skipping instance linking.")
400
- return
414
+ return ""
401
415
 
402
416
  # Based on whether the instance exists or not, ask the user if they want to
403
417
  # update or create it.
@@ -413,7 +427,7 @@ def _handle_instance_prompting(
413
427
 
414
428
  if not should_update:
415
429
  info(f"Will not update instance [magenta]{instance_id}[/magenta].")
416
- return
430
+ return ""
417
431
 
418
432
  _update_instance(
419
433
  cloud_app=cloud_app,
@@ -422,7 +436,7 @@ def _handle_instance_prompting(
422
436
  instance_id=instance_id,
423
437
  )
424
438
 
425
- return
439
+ return instance_id
426
440
 
427
441
  # If the instance does not exist, ask if we want to create it.
428
442
  should_create = confirmation(
@@ -433,7 +447,7 @@ def _handle_instance_prompting(
433
447
 
434
448
  if not should_create:
435
449
  info(f"Will not create instance [magenta]{instance_id}[/magenta].")
436
- return
450
+ return ""
437
451
 
438
452
  _create_instance(
439
453
  cloud_app=cloud_app,
@@ -443,6 +457,8 @@ def _handle_instance_prompting(
443
457
  now=now,
444
458
  )
445
459
 
460
+ return instance_id
461
+
446
462
 
447
463
  def _update_instance(
448
464
  cloud_app: Application,
@@ -7,9 +7,10 @@ from typing import Annotated
7
7
  import typer
8
8
 
9
9
  from nextmv.cli.configuration.config import build_cloud_app
10
- from nextmv.cli.message import enum_values, error, in_progress, print_json
10
+ from nextmv.cli.message import enum_values, error, in_progress, parse_content_format, print_json
11
11
  from nextmv.cli.options import AppIDOption, ProfileOption, VersionIDOption
12
12
  from nextmv.cloud.instance import InstanceConfiguration
13
+ from nextmv.content_format import ContentFormat
13
14
  from nextmv.input import InputFormat
14
15
  from nextmv.run import Format, FormatInput, RunQueuing
15
16
 
@@ -60,11 +61,11 @@ def create(
60
61
  ] = None,
61
62
  # Options for configuring the instance.
62
63
  content_format: Annotated[
63
- InputFormat | None,
64
+ InputFormat | None, # Keep deprecated type for backwards compatibility, translated in the code.
64
65
  typer.Option(
65
66
  "--content-format",
66
67
  "-c",
67
- help=f"The content format of the instance to create. Allowed values are: {enum_values(InputFormat)}.",
68
+ help=f"The content format of the instance to create. Allowed values are: {enum_values(ContentFormat)}.",
68
69
  metavar="CONTENT_FORMAT",
69
70
  rich_help_panel="Instance configuration",
70
71
  ),
@@ -162,6 +163,8 @@ def create(
162
163
  --instance-id prod --options max_duration=30 --options timeout=60[/dim]
163
164
  """
164
165
 
166
+ content_format = parse_content_format(content_format)
167
+
165
168
  cloud_app, _ = build_cloud_app(app_id=app_id, profile=profile)
166
169
  if exist_ok:
167
170
  in_progress(msg="Creating or getting instance...")
@@ -233,7 +236,7 @@ def build_options(options: list[str] | None) -> dict[str, str] | None:
233
236
  def build_config(
234
237
  priority: int,
235
238
  no_queuing: bool,
236
- content_format: InputFormat | None = None,
239
+ content_format: ContentFormat | None = None,
237
240
  execution_class: str | None = None,
238
241
  integration_id: str | None = None,
239
242
  options: dict | None = None,
@@ -248,7 +251,7 @@ def build_config(
248
251
  The priority of the instance.
249
252
  no_queuing : bool
250
253
  Whether to disable queuing for the instance.
251
- content_format : InputFormat | None
254
+ content_format : ContentFormat | None
252
255
  The content format for the instance, if applicable.
253
256
  execution_class : str | None
254
257
  The execution class to use for the instance, if applicable.
@@ -282,7 +285,7 @@ def build_config(
282
285
  if content_format is not None:
283
286
  config.format = Format(
284
287
  format_input=FormatInput(
285
- input_type=InputFormat(content_format),
288
+ input_type=content_format,
286
289
  ),
287
290
  )
288
291
 
@@ -9,8 +9,9 @@ import typer
9
9
 
10
10
  from nextmv.cli.cloud.instance.create import build_config, build_options
11
11
  from nextmv.cli.configuration.config import build_cloud_app
12
- from nextmv.cli.message import enum_values, error, in_progress, print_json, success
12
+ from nextmv.cli.message import enum_values, error, in_progress, parse_content_format, print_json, success
13
13
  from nextmv.cli.options import AppIDOption, InstanceIDOption, ProfileOption
14
+ from nextmv.content_format import ContentFormat
14
15
  from nextmv.input import InputFormat
15
16
 
16
17
  # Set up subcommand application.
@@ -66,11 +67,11 @@ def update(
66
67
  ] = None,
67
68
  # Options for updating the instance configuration.
68
69
  content_format: Annotated[
69
- InputFormat | None,
70
+ InputFormat | None, # Keep deprecated type for backwards compatibility, translated in the code.
70
71
  typer.Option(
71
72
  "--content-format",
72
73
  "-c",
73
- help=f"The content format for the instance. Allowed values are: {enum_values(InputFormat)}.",
74
+ help=f"The content format for the instance. Allowed values are: {enum_values(ContentFormat)}.",
74
75
  metavar="CONTENT_FORMAT",
75
76
  rich_help_panel="Instance configuration",
76
77
  ),
@@ -165,6 +166,8 @@ def update(
165
166
  --options max_duration=30 --options timeout=60[/dim]
166
167
  """
167
168
 
169
+ content_format = parse_content_format(content_format)
170
+
168
171
  # Check if any configuration options are provided
169
172
  has_config_options = any(
170
173
  [
@@ -7,8 +7,9 @@ from typing import Annotated
7
7
  import typer
8
8
 
9
9
  from nextmv.cli.configuration.config import build_cloud_app
10
- from nextmv.cli.message import enum_values, error, in_progress, print_json
10
+ from nextmv.cli.message import enum_values, error, in_progress, parse_content_format, print_json
11
11
  from nextmv.cli.options import AppIDOption, ProfileOption
12
+ from nextmv.content_format import ContentFormat
12
13
  from nextmv.input import InputFormat
13
14
  from nextmv.run import Format, FormatInput
14
15
 
@@ -20,12 +21,12 @@ app = typer.Typer()
20
21
  def create(
21
22
  app_id: AppIDOption,
22
23
  content_format: Annotated[
23
- InputFormat | None,
24
+ InputFormat | None, # Keep deprecated type for backwards compatibility, translated in the code.
24
25
  typer.Option(
25
26
  "--content-format",
26
27
  "-c",
27
28
  help=f"The content format for the managed input. "
28
- f"Allowed values are: {enum_values(InputFormat)}. Default is JSON.",
29
+ f"Allowed values are: {enum_values(ContentFormat)}. Default is [magenta]json[/magenta].",
29
30
  metavar="CONTENT_FORMAT",
30
31
  ),
31
32
  ] = None,
@@ -114,6 +115,8 @@ def create(
114
115
  --upload-id upl_123456789 --content-format csv[/dim]
115
116
  """
116
117
 
118
+ content_format = parse_content_format(content_format)
119
+
117
120
  if upload_id is None and run_id is None:
118
121
  error(
119
122
  "Either --upload-id or --run-id must be specified. "
@@ -128,7 +131,7 @@ def create(
128
131
  if content_format is not None:
129
132
  format_obj = Format(
130
133
  format_input=FormatInput(
131
- input_type=InputFormat(content_format),
134
+ input_type=content_format,
132
135
  ),
133
136
  )
134
137
 
@@ -13,9 +13,10 @@ import typer
13
13
  from nextmv.cli.cloud.run.get import handle_outputs
14
14
  from nextmv.cli.cloud.run.logs import handle_logs
15
15
  from nextmv.cli.configuration.config import build_cloud_app
16
- from nextmv.cli.message import enum_values, error, print_json, success
16
+ from nextmv.cli.message import enum_values, error, parse_content_format, print_json, success
17
17
  from nextmv.cli.options import AppIDOption, ProfileOption
18
18
  from nextmv.cloud.application import Application
19
+ from nextmv.content_format import ContentFormat
19
20
  from nextmv.input import InputFormat
20
21
  from nextmv.polling import default_polling_options
21
22
  from nextmv.run import Format, FormatInput, RunConfiguration, RunQueuing, RunType, RunTypeConfiguration
@@ -96,11 +97,11 @@ def create(
96
97
  ] = False,
97
98
  # Options for run configuration.
98
99
  content_format: Annotated[
99
- InputFormat | None,
100
+ InputFormat | None, # Keep deprecated type for backwards compatibility, translated in the code.
100
101
  typer.Option(
101
102
  "--content-format",
102
103
  "-c",
103
- help=f"The content format of the run to create. Allowed values are: {enum_values(InputFormat)}.",
104
+ help=f"The content format of the run to create. Allowed values are: {enum_values(ContentFormat)}.",
104
105
  metavar="CONTENT_FORMAT",
105
106
  rich_help_panel="Run configuration",
106
107
  ),
@@ -225,8 +226,7 @@ def create(
225
226
  When using the --input flag, the value can be one of the following:
226
227
 
227
228
  - [yellow]<FILE_PATH>[/yellow]: path to a [magenta]file[/magenta] containing
228
- the input data. Use with the [magenta]json[/magenta], and
229
- [magenta]text[/magenta] content formats.
229
+ the input data. Use with the [magenta]json[/magenta] content format.
230
230
  - [yellow]<DIR_PATH>[/yellow]: path to a [magenta]directory[/magenta]
231
231
  containing the input data files. Use with the
232
232
  [magenta]multi-file[/magenta] content format.
@@ -315,6 +315,8 @@ def create(
315
315
  $ [dim]nextmv cloud run create --app-id hare-app --managed-input-id carrot-input --output outputs[/dim]
316
316
  """
317
317
 
318
+ content_format = parse_content_format(content_format)
319
+
318
320
  # Validate that input is provided.
319
321
  stdin = sys.stdin.read().strip() if sys.stdin.isatty() is False else None
320
322
  if stdin is None and (input is None or input == "") and (managed_input_id is None or managed_input_id == ""):
@@ -387,7 +389,7 @@ def build_run_config(
387
389
  priority: int,
388
390
  no_queuing: bool,
389
391
  execution_class: str | None = None,
390
- content_format: InputFormat | None = None,
392
+ content_format: ContentFormat | None = None,
391
393
  secret_collection_id: str | None = None,
392
394
  integration_id: str | None = None,
393
395
  definition_id: str | None = None,
@@ -405,7 +407,7 @@ def build_run_config(
405
407
  Whether to disable queuing for the run.
406
408
  execution_class : str | None
407
409
  The execution class to use for the run, if applicable.
408
- content_format : InputFormat | None
410
+ content_format : ContentFormat | None
409
411
  The content format of the run to create, if applicable.
410
412
  secret_collection_id : str | None
411
413
  The secret collection ID to use for the run, if applicable.
@@ -434,7 +436,7 @@ def build_run_config(
434
436
  if content_format is not None:
435
437
  config.format = Format(
436
438
  format_input=FormatInput(
437
- input_type=InputFormat(content_format),
439
+ input_type=content_format,
438
440
  ),
439
441
  )
440
442
  if secret_collection_id is not None:
@@ -8,10 +8,10 @@ from typing import Annotated
8
8
  import typer
9
9
 
10
10
  from nextmv.cli.configuration.config import build_cloud_app
11
- from nextmv.cli.message import in_progress, print_json, success
11
+ from nextmv.cli.message import in_progress, info, print_json, success
12
12
  from nextmv.cli.options import AppIDOption, ProfileOption, RunIDOption
13
13
  from nextmv.cloud.application import Application
14
- from nextmv.output import OutputFormat
14
+ from nextmv.content_format import ContentFormat
15
15
  from nextmv.polling import PollingOptions, default_polling_options
16
16
 
17
17
  # Set up subcommand application.
@@ -158,8 +158,8 @@ def handle_outputs(
158
158
  # Build kwargs for the result retrieval.
159
159
  kwargs = {"run_id": run_id}
160
160
 
161
- # For MULTI_FILE and CSV_ARCHIVE, we need output_dir_path.
162
- if content_format not in {OutputFormat.JSON, OutputFormat.TEXT}:
161
+ # For MULTI_FILE, we need output_dir_path.
162
+ if content_format != ContentFormat.JSON:
163
163
  output_dir = f"{run_id}-output" if output is None or output == "" else output
164
164
  kwargs["output_dir_path"] = output_dir
165
165
 
@@ -174,8 +174,18 @@ def handle_outputs(
174
174
  run_result = cloud_app.run_result(**kwargs)
175
175
 
176
176
  # Handle the case where output is embedded directly in the result: json and text.
177
- if content_format in {OutputFormat.JSON, OutputFormat.TEXT}:
177
+ if content_format == ContentFormat.JSON:
178
178
  if output is None or output == "":
179
+ # To avoid overflowing the terminal with a huge output, we trim the assets.
180
+ res_output = run_result.output
181
+ if isinstance(res_output, dict) and "assets" in res_output.keys():
182
+ info(
183
+ "Removed [magenta]assets[/magenta] from output for cleaner display, "
184
+ "use --output to save the full output."
185
+ )
186
+ del res_output["assets"]
187
+ run_result.output = res_output
188
+
179
189
  print_json(run_result.to_dict())
180
190
  else:
181
191
  with open(output, "w") as f:
@@ -10,7 +10,7 @@ import typer
10
10
  from nextmv.cli.configuration.config import build_cloud_app
11
11
  from nextmv.cli.message import in_progress, print_json, success
12
12
  from nextmv.cli.options import AppIDOption, ProfileOption, RunIDOption
13
- from nextmv.output import OutputFormat
13
+ from nextmv.content_format import ContentFormat
14
14
 
15
15
  # Set up subcommand application.
16
16
  app = typer.Typer()
@@ -61,7 +61,7 @@ def input(
61
61
 
62
62
  # If the input is multi-file, we need to provide an `output_dir_path` to
63
63
  # save the files to.
64
- if run_info.metadata.format.format_input.input_type not in {OutputFormat.JSON, OutputFormat.TEXT}:
64
+ if run_info.metadata.format.format_input.input_type != ContentFormat.JSON:
65
65
  # If no output path is provided, use the run ID as the directory name.
66
66
  output = f"{run_id}-input" if output is None or output == "" else output
67
67
  cloud_app.run_input(run_id=run_id, output_dir_path=output)
@@ -11,8 +11,9 @@ import typer
11
11
 
12
12
  from nextmv.cli.cloud.run.create import build_run_config
13
13
  from nextmv.cli.configuration.config import build_cloud_app
14
- from nextmv.cli.message import enum_values, error, in_progress, print_json, warning
14
+ from nextmv.cli.message import enum_values, error, in_progress, parse_content_format, print_json, warning
15
15
  from nextmv.cli.options import AppIDOption, ProfileOption
16
+ from nextmv.content_format import ContentFormat
16
17
  from nextmv.input import InputFormat
17
18
  from nextmv.run import RunType, TrackedRun, TrackedRunStatus
18
19
 
@@ -53,11 +54,11 @@ def track(
53
54
  ),
54
55
  ] = None,
55
56
  content_format: Annotated[
56
- InputFormat | None,
57
+ InputFormat | None, # Keep deprecated type for backwards compatibility, translated in the code.
57
58
  typer.Option(
58
59
  "--content-format",
59
60
  "-c",
60
- help=f"The content format of the run to track. Allowed values are: {enum_values(InputFormat)}.",
61
+ help=f"The content format of the run to track. Allowed values are: {enum_values(ContentFormat)}.",
61
62
  metavar="CONTENT_FORMAT",
62
63
  rich_help_panel="Tracked run configuration",
63
64
  ),
@@ -155,18 +156,18 @@ def track(
155
156
  Please see the help of the --content-type option for details on valid
156
157
  content types.
157
158
 
158
- If the content type is [magenta]json[/magenta] or [magenta]text[/magenta],
159
- then input for the run can be given through [magenta]stdin[/magenta]. The
160
- --input option allows you to specify a file or directory path for the
161
- input, instead of using [magenta]stdin[/magenta]. In the case of
162
- [magenta]multi-file[/magenta] content type, the input must be given through
163
- a directory specified via the --input option.
159
+ If the content type is [magenta]json[/magenta], then input for the run can
160
+ be given through [magenta]stdin[/magenta]. The --input option allows you to
161
+ specify a file or directory path for the input, instead of using
162
+ [magenta]stdin[/magenta]. In the case of [magenta]multi-file[/magenta]
163
+ content type, the input must be given through a directory specified via the
164
+ --input option.
164
165
 
165
166
  The --output option allows you to specify a file or directory path for the
166
167
  output of the run. The behavior depends on the content type. If the content
167
- type is [magenta]json[/magenta] or [magenta]text[/magenta], then a file
168
- path must be provided. If the content type is
169
- [magenta]multi-file[/magenta], then a directory path must be provided.
168
+ type is [magenta]json[/magenta], then a file path must be provided. If the
169
+ content type is [magenta]multi-file[/magenta], then a directory path must
170
+ be provided.
170
171
 
171
172
  Run logs, assets, and metrics can be provided via files using the
172
173
  --logs, --assets, and --metrics options, respectively. Assets and
@@ -203,11 +204,6 @@ def track(
203
204
  $ [dim]nextmv cloud run track --app-id hare-app --status failed --input input.json \\
204
205
  --error-msg "Solver timed out"[/dim]
205
206
 
206
- - Track a [magenta]successful[/magenta] [magenta]text[/magenta] run with text content type,
207
- for an app with ID [magenta]hare-app[/magenta].
208
- $ [dim]nextmv cloud run track --app-id hare-app --status succeeded --input input.txt \\
209
- --output output.txt --content-type text[/dim]
210
-
211
207
  - Track a [magenta]successful[/magenta] [magenta]multi-file[/magenta] run from an
212
208
  [magenta]inputs[/magenta] directory with output to an
213
209
  [magenta]outputs[/magenta] directory, for an app with ID
@@ -230,6 +226,9 @@ def track(
230
226
 
231
227
  if statistics:
232
228
  warning("The --statistics option is deprecated, use --metrics instead.")
229
+
230
+ content_format = parse_content_format(content_format)
231
+
233
232
  # Validate that input is provided.
234
233
  stdin = sys.stdin.read().strip() if sys.stdin.isatty() is False else None
235
234
  if stdin is None and (input is None or input == ""):
@@ -284,7 +283,7 @@ def build_tracked_run_input(
284
283
  description: str | None,
285
284
  stdin: str | None,
286
285
  input: str | None,
287
- content_format: InputFormat,
286
+ content_format: ContentFormat,
288
287
  output: str,
289
288
  assets: str | None = None,
290
289
  logs: str | None = None,
@@ -314,8 +313,8 @@ def build_tracked_run_input(
314
313
  The input provided via stdin, if any.
315
314
  input : str | None
316
315
  The input file or directory path, if any.
317
- content_format : InputFormat
318
- The content format of the input (json or text).
316
+ content_format : ContentFormat
317
+ The content format of the input (json or multi-file).
319
318
  output : str
320
319
  The output file or directory path.
321
320
  assets : str | None
@@ -385,7 +384,7 @@ def resolve_input(
385
384
  tracked_run: TrackedRun,
386
385
  stdin: str | None,
387
386
  input: str | None,
388
- content_format: InputFormat,
387
+ content_format: ContentFormat,
389
388
  ) -> TrackedRun:
390
389
  """
391
390
  Resolves the input for the tracked run, either from stdin or from a
@@ -399,8 +398,8 @@ def resolve_input(
399
398
  The input provided via stdin, if any.
400
399
  input : str | None
401
400
  The input file or directory path, if any.
402
- content_format : InputFormat
403
- The content format of the input (json or text).
401
+ content_format : ContentFormat
402
+ The content format of the input (json or multi-file).
404
403
 
405
404
  Returns
406
405
  -------
@@ -411,7 +410,7 @@ def resolve_input(
411
410
  # Handle the case where stdin is provided as JSON for a JSON app.
412
411
  try:
413
412
  input_data = json.loads(stdin)
414
- if content_format != InputFormat.JSON:
413
+ if content_format != ContentFormat.JSON:
415
414
  error(
416
415
  "Input provided via [magenta]stdin[/magenta] is [magenta]json[/magenta], "
417
416
  f"but the specified content format is {content_format.value}. "
@@ -427,6 +426,11 @@ def resolve_input(
427
426
  "--content-format should be set to [magenta]text[/magenta]."
428
427
  )
429
428
 
429
+ warning(
430
+ "[magenta]text[/magenta] is being deprecated as a content format, "
431
+ "please use [magenta]multi-file[/magenta] instead."
432
+ )
433
+
430
434
  tracked_run.input = input_data
431
435
 
432
436
  return tracked_run
@@ -436,7 +440,7 @@ def resolve_input(
436
440
  input_path = Path(input)
437
441
 
438
442
  if input_path.is_file():
439
- if content_format == InputFormat.JSON:
443
+ if content_format == ContentFormat.JSON:
440
444
  try:
441
445
  with input_path.open("r") as f:
442
446
  input_data = json.load(f)
@@ -449,6 +453,10 @@ def resolve_input(
449
453
  error(f"Failed to parse input file [magenta]{input}[/magenta] as [magenta]json[/magenta]: {e}.")
450
454
 
451
455
  elif content_format == InputFormat.TEXT:
456
+ warning(
457
+ "[magenta]text[/magenta] is being deprecated as a content format, "
458
+ "please use [magenta]multi-file[/magenta] instead.",
459
+ )
452
460
  input_data = input_path.read_text()
453
461
  tracked_run.input = input_data
454
462
 
@@ -470,7 +478,7 @@ def resolve_input(
470
478
  def resolve_output(
471
479
  tracked_run: TrackedRun,
472
480
  output: str,
473
- content_format: InputFormat,
481
+ content_format: ContentFormat,
474
482
  ) -> TrackedRun:
475
483
  """
476
484
  Resolves the output for the tracked run.
@@ -481,7 +489,7 @@ def resolve_output(
481
489
  The tracked run to set the output for.
482
490
  output : str
483
491
  The output file or directory path.
484
- content_format : InputFormat
492
+ content_format : ContentFormat
485
493
  The content format of the output (json or text).
486
494
 
487
495
  Returns
@@ -492,7 +500,7 @@ def resolve_output(
492
500
 
493
501
  output_path = Path(output)
494
502
  if output_path.is_file():
495
- if content_format == InputFormat.JSON:
503
+ if content_format == ContentFormat.JSON:
496
504
  try:
497
505
  with output_path.open("r") as f:
498
506
  output_data = json.load(f)
@@ -507,6 +515,10 @@ def resolve_output(
507
515
  elif content_format == InputFormat.TEXT:
508
516
  output_data = output_path.read_text()
509
517
  tracked_run.output = output_data
518
+ warning(
519
+ "[magenta]text[/magenta] is being deprecated as a content format, "
520
+ "please use [magenta]multi-file[/magenta] instead.",
521
+ )
510
522
 
511
523
  return tracked_run
512
524
 
@@ -2,6 +2,7 @@
2
2
  This module contains configuration utilities for the Nextmv CLI.
3
3
  """
4
4
 
5
+ import platform
5
6
  from pathlib import Path
6
7
  from typing import Any
7
8
 
@@ -21,6 +22,8 @@ API_KEY_KEY = "apikey"
21
22
  ENDPOINT_KEY = "endpoint"
22
23
  DEFAULT_ENDPOINT = "api.cloud.nextmv.io"
23
24
  GO_CLI_PATH = CONFIG_DIR / "nextmv"
25
+ if platform.system() == "Windows":
26
+ GO_CLI_PATH = CONFIG_DIR / "nextmv.exe"
24
27
 
25
28
 
26
29
  def load_config() -> dict[str, Any]: