nextmv 1.2.3.dev2__tar.gz → 1.2.3.dev4__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 (350) hide show
  1. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/PKG-INFO +1 -1
  2. nextmv-1.2.3.dev4/nextmv/__about__.py +1 -0
  3. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/_helpers.py +18 -0
  4. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/local.py +53 -124
  5. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/run.py +41 -8
  6. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/cli/test_mcp.py +112 -0
  7. nextmv-1.2.3.dev2/nextmv/__about__.py +0 -1
  8. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/.gitignore +0 -0
  9. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/.python-version +0 -0
  10. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/CONTRIBUTING.md +0 -0
  11. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/LICENSE +0 -0
  12. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/README.md +0 -0
  13. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/__entrypoint__.py +0 -0
  14. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/__init__.py +0 -0
  15. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/_serialization.py +0 -0
  16. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/base_model.py +0 -0
  17. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/__init__.py +0 -0
  18. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/__init__.py +0 -0
  19. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/acceptance/__init__.py +0 -0
  20. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/acceptance/create.py +0 -0
  21. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/acceptance/delete.py +0 -0
  22. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/acceptance/get.py +0 -0
  23. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/acceptance/list.py +0 -0
  24. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/acceptance/update.py +0 -0
  25. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/account/__init__.py +0 -0
  26. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/account/create.py +0 -0
  27. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/account/delete.py +0 -0
  28. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/account/get.py +0 -0
  29. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/account/update.py +0 -0
  30. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/app/__init__.py +0 -0
  31. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/app/create.py +0 -0
  32. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/app/delete.py +0 -0
  33. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/app/exists.py +0 -0
  34. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/app/get.py +0 -0
  35. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/app/list.py +0 -0
  36. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/app/push.py +0 -0
  37. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/app/update.py +0 -0
  38. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/batch/__init__.py +0 -0
  39. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/batch/create.py +0 -0
  40. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/batch/delete.py +0 -0
  41. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/batch/get.py +0 -0
  42. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/batch/list.py +0 -0
  43. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/batch/metadata.py +0 -0
  44. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/batch/update.py +0 -0
  45. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/data/__init__.py +0 -0
  46. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/data/upload.py +0 -0
  47. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/ensemble/__init__.py +0 -0
  48. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/ensemble/create.py +0 -0
  49. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/ensemble/delete.py +0 -0
  50. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/ensemble/get.py +0 -0
  51. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/ensemble/list.py +0 -0
  52. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/ensemble/update.py +0 -0
  53. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/input_set/__init__.py +0 -0
  54. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/input_set/create.py +0 -0
  55. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/input_set/delete.py +0 -0
  56. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/input_set/get.py +0 -0
  57. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/input_set/list.py +0 -0
  58. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/input_set/update.py +0 -0
  59. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/instance/__init__.py +0 -0
  60. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/instance/create.py +0 -0
  61. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/instance/delete.py +0 -0
  62. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/instance/exists.py +0 -0
  63. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/instance/get.py +0 -0
  64. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/instance/list.py +0 -0
  65. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/instance/update.py +0 -0
  66. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/managed_input/__init__.py +0 -0
  67. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/managed_input/create.py +0 -0
  68. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/managed_input/delete.py +0 -0
  69. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/managed_input/get.py +0 -0
  70. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/managed_input/list.py +0 -0
  71. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/managed_input/update.py +0 -0
  72. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/marketplace/__init__.py +0 -0
  73. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/marketplace/app/__init__.py +0 -0
  74. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/marketplace/app/create.py +0 -0
  75. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/marketplace/app/get.py +0 -0
  76. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/marketplace/app/list.py +0 -0
  77. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/marketplace/app/update.py +0 -0
  78. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/marketplace/subscription/__init__.py +0 -0
  79. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/marketplace/subscription/create.py +0 -0
  80. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/marketplace/subscription/delete.py +0 -0
  81. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/marketplace/subscription/get.py +0 -0
  82. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/marketplace/subscription/list.py +0 -0
  83. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/marketplace/version/__init__.py +0 -0
  84. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/marketplace/version/create.py +0 -0
  85. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/marketplace/version/get.py +0 -0
  86. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/marketplace/version/list.py +0 -0
  87. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/marketplace/version/update.py +0 -0
  88. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/run/__init__.py +0 -0
  89. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/run/cancel.py +0 -0
  90. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/run/create.py +0 -0
  91. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/run/get.py +0 -0
  92. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/run/input.py +0 -0
  93. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/run/list.py +0 -0
  94. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/run/logs.py +0 -0
  95. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/run/metadata.py +0 -0
  96. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/run/track.py +0 -0
  97. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/scenario/__init__.py +0 -0
  98. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/scenario/create.py +0 -0
  99. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/scenario/delete.py +0 -0
  100. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/scenario/get.py +0 -0
  101. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/scenario/list.py +0 -0
  102. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/scenario/metadata.py +0 -0
  103. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/scenario/update.py +0 -0
  104. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/secrets/__init__.py +0 -0
  105. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/secrets/create.py +0 -0
  106. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/secrets/delete.py +0 -0
  107. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/secrets/get.py +0 -0
  108. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/secrets/list.py +0 -0
  109. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/secrets/update.py +0 -0
  110. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/shadow/__init__.py +0 -0
  111. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/shadow/create.py +0 -0
  112. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/shadow/delete.py +0 -0
  113. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/shadow/get.py +0 -0
  114. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/shadow/list.py +0 -0
  115. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/shadow/metadata.py +0 -0
  116. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/shadow/start.py +0 -0
  117. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/shadow/stop.py +0 -0
  118. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/shadow/update.py +0 -0
  119. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/sso/__init__.py +0 -0
  120. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/sso/create.py +0 -0
  121. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/sso/delete.py +0 -0
  122. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/sso/disable.py +0 -0
  123. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/sso/domain/__init__.py +0 -0
  124. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/sso/domain/delete.py +0 -0
  125. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/sso/enable.py +0 -0
  126. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/sso/get.py +0 -0
  127. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/sso/update.py +0 -0
  128. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/switchback/__init__.py +0 -0
  129. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/switchback/create.py +0 -0
  130. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/switchback/delete.py +0 -0
  131. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/switchback/get.py +0 -0
  132. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/switchback/list.py +0 -0
  133. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/switchback/metadata.py +0 -0
  134. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/switchback/start.py +0 -0
  135. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/switchback/stop.py +0 -0
  136. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/switchback/update.py +0 -0
  137. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/upload/__init__.py +0 -0
  138. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/upload/create.py +0 -0
  139. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/version/__init__.py +0 -0
  140. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/version/create.py +0 -0
  141. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/version/delete.py +0 -0
  142. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/version/exists.py +0 -0
  143. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/version/get.py +0 -0
  144. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/version/list.py +0 -0
  145. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/cloud/version/update.py +0 -0
  146. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/community/__init__.py +0 -0
  147. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/community/clone.py +0 -0
  148. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/community/list.py +0 -0
  149. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/configuration/__init__.py +0 -0
  150. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/configuration/config.py +0 -0
  151. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/configuration/create.py +0 -0
  152. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/configuration/delete.py +0 -0
  153. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/configuration/list.py +0 -0
  154. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/init.py +0 -0
  155. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/local/__init__.py +0 -0
  156. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/local/app/__init__.py +0 -0
  157. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/local/app/delete.py +0 -0
  158. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/local/app/get.py +0 -0
  159. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/local/app/list.py +0 -0
  160. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/local/app/register.py +0 -0
  161. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/local/app/registered.py +0 -0
  162. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/local/app/sync.py +0 -0
  163. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/local/app/update.py +0 -0
  164. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/local/run/__init__.py +0 -0
  165. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/local/run/create.py +0 -0
  166. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/local/run/get.py +0 -0
  167. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/local/run/input.py +0 -0
  168. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/local/run/list.py +0 -0
  169. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/local/run/logs.py +0 -0
  170. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/local/run/metadata.py +0 -0
  171. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/local/run/visuals.py +0 -0
  172. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/main.py +0 -0
  173. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/manifest/__init__.py +0 -0
  174. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/manifest/init.py +0 -0
  175. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/manifest/validate.py +0 -0
  176. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/__init__.py +0 -0
  177. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/serve.py +0 -0
  178. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/server.py +0 -0
  179. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/__init__.py +0 -0
  180. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/acceptance.py +0 -0
  181. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/account.py +0 -0
  182. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/app.py +0 -0
  183. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/batch.py +0 -0
  184. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/community.py +0 -0
  185. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/ensemble.py +0 -0
  186. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/input_set.py +0 -0
  187. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/instance.py +0 -0
  188. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/managed_input.py +0 -0
  189. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/profile.py +0 -0
  190. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/scenario.py +0 -0
  191. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/secrets.py +0 -0
  192. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/shadow.py +0 -0
  193. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/sso.py +0 -0
  194. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/switchback.py +0 -0
  195. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/mcp/tools/version.py +0 -0
  196. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/message.py +0 -0
  197. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/options.py +0 -0
  198. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cli/version.py +0 -0
  199. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/__init__.py +0 -0
  200. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/acceptance_test.py +0 -0
  201. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/account.py +0 -0
  202. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/application/__init__.py +0 -0
  203. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/application/_acceptance.py +0 -0
  204. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/application/_batch_scenario.py +0 -0
  205. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/application/_ensemble.py +0 -0
  206. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/application/_input_set.py +0 -0
  207. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/application/_instance.py +0 -0
  208. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/application/_managed_input.py +0 -0
  209. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/application/_run.py +0 -0
  210. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/application/_secrets.py +0 -0
  211. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/application/_shadow.py +0 -0
  212. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/application/_switchback.py +0 -0
  213. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/application/_utils.py +0 -0
  214. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/application/_version.py +0 -0
  215. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/assets.py +0 -0
  216. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/batch_experiment.py +0 -0
  217. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/client.py +0 -0
  218. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/community.py +0 -0
  219. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/ensemble.py +0 -0
  220. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/input_set.py +0 -0
  221. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/instance.py +0 -0
  222. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/integration.py +0 -0
  223. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/marketplace.py +0 -0
  224. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/package.py +0 -0
  225. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/scenario.py +0 -0
  226. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/secrets.py +0 -0
  227. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/shadow.py +0 -0
  228. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/sso.py +0 -0
  229. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/switchback.py +0 -0
  230. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/url.py +0 -0
  231. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/cloud/version.py +0 -0
  232. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/content_format.py +0 -0
  233. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/default_app/.gitignore +0 -0
  234. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/default_app/README.md +0 -0
  235. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/default_app/app.yaml +0 -0
  236. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/default_app/input.json +0 -0
  237. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/default_app/main.py +0 -0
  238. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/default_app/requirements.txt +0 -0
  239. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/default_app/src/__init__.py +0 -0
  240. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/default_app/src/visuals.py +0 -0
  241. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/deprecated.py +0 -0
  242. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/input.py +0 -0
  243. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/local/__init__.py +0 -0
  244. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/local/application.py +0 -0
  245. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/local/executor.py +0 -0
  246. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/local/geojson_handler.py +0 -0
  247. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/local/local.py +0 -0
  248. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/local/plotly_handler.py +0 -0
  249. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/local/registry.py +0 -0
  250. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/local/runner.py +0 -0
  251. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/logger.py +0 -0
  252. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/manifest.py +0 -0
  253. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/model.py +0 -0
  254. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/options.py +0 -0
  255. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/output.py +0 -0
  256. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/polling.py +0 -0
  257. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/run.py +0 -0
  258. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/safe.py +0 -0
  259. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/status.py +0 -0
  260. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/binary_json_app.yaml +0 -0
  261. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/binary_multi-file_app.yaml +0 -0
  262. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/go_json_app.yaml +0 -0
  263. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/go_json_template/.gitignore +0 -0
  264. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/go_json_template/README.md +0 -0
  265. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/go_json_template/app.yaml +0 -0
  266. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/go_json_template/go.mod +0 -0
  267. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/go_json_template/input.json +0 -0
  268. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/go_json_template/main.go +0 -0
  269. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/go_multi-file_app.yaml +0 -0
  270. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/go_multi-file_template/.gitignore +0 -0
  271. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/go_multi-file_template/README.md +0 -0
  272. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/go_multi-file_template/app.yaml +0 -0
  273. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/go_multi-file_template/go.mod +0 -0
  274. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/go_multi-file_template/inputs/input.json +0 -0
  275. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/go_multi-file_template/main.go +0 -0
  276. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/java_json_app.yaml +0 -0
  277. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/java_json_template/.gitignore +0 -0
  278. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/java_json_template/Main.java +0 -0
  279. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/java_json_template/README.md +0 -0
  280. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/java_json_template/app.yaml +0 -0
  281. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/java_json_template/input.json +0 -0
  282. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/java_json_template/pom.xml +0 -0
  283. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/java_multi-file_app.yaml +0 -0
  284. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/java_multi-file_template/.gitignore +0 -0
  285. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/java_multi-file_template/Main.java +0 -0
  286. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/java_multi-file_template/README.md +0 -0
  287. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/java_multi-file_template/app.yaml +0 -0
  288. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/java_multi-file_template/inputs/input.json +0 -0
  289. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/java_multi-file_template/pom.xml +0 -0
  290. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/python_json_app.yaml +0 -0
  291. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/python_json_template/.gitignore +0 -0
  292. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/python_json_template/README.md +0 -0
  293. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/python_json_template/app.yaml +0 -0
  294. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/python_json_template/input.json +0 -0
  295. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/python_json_template/main.py +0 -0
  296. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/python_json_template/requirements.txt +0 -0
  297. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/python_multi-file_app.yaml +0 -0
  298. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/python_multi-file_template/.gitignore +0 -0
  299. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/python_multi-file_template/README.md +0 -0
  300. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/python_multi-file_template/app.yaml +0 -0
  301. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/python_multi-file_template/inputs/input.json +0 -0
  302. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/python_multi-file_template/main.py +0 -0
  303. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/nextmv/templates/python_multi-file_template/requirements.txt +0 -0
  304. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/pyproject.toml +0 -0
  305. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/__init__.py +0 -0
  306. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/cli/__init__.py +0 -0
  307. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/cli/test_configuration.py +0 -0
  308. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/cli/test_main.py +0 -0
  309. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/cli/test_version.py +0 -0
  310. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/cloud/__init__.py +0 -0
  311. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/cloud/app.yaml +0 -0
  312. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/cloud/test_client.py +0 -0
  313. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/cloud/test_instance.py +0 -0
  314. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/cloud/test_package.py +0 -0
  315. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/cloud/test_scenario.py +0 -0
  316. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/integration/__init__.py +0 -0
  317. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/integration/cloud/__init__.py +0 -0
  318. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/integration/cloud/test_integration_cloud.py +0 -0
  319. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/integration/cloud/test_integration_marketplace.py +0 -0
  320. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/local/__init__.py +0 -0
  321. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/local/test_application.py +0 -0
  322. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/local/test_executor.py +0 -0
  323. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/local/test_registry.py +0 -0
  324. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/local/test_runner.py +0 -0
  325. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/scripts/__init__.py +0 -0
  326. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/scripts/options1.py +0 -0
  327. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/scripts/options2.py +0 -0
  328. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/scripts/options3.py +0 -0
  329. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/scripts/options4.py +0 -0
  330. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/scripts/options5.py +0 -0
  331. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/scripts/options6.py +0 -0
  332. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/scripts/options7.py +0 -0
  333. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/test_base_model.py +0 -0
  334. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/test_entrypoint/__init__.py +0 -0
  335. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/test_entrypoint/test_entrypoint.py +0 -0
  336. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/test_input.py +0 -0
  337. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/test_inputs/test_data.csv +0 -0
  338. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/test_inputs/test_data.json +0 -0
  339. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/test_inputs/test_data.txt +0 -0
  340. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/test_logger.py +0 -0
  341. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/test_manifest.py +0 -0
  342. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/test_model.py +0 -0
  343. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/test_options.py +0 -0
  344. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/test_output.py +0 -0
  345. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/test_polling.py +0 -0
  346. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/test_run.py +0 -0
  347. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/test_safe.py +0 -0
  348. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/test_serialization.py +0 -0
  349. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/tests/test_version.py +0 -0
  350. {nextmv-1.2.3.dev2 → nextmv-1.2.3.dev4}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nextmv
3
- Version: 1.2.3.dev2
3
+ Version: 1.2.3.dev4
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.2.3.dev4"
@@ -73,6 +73,24 @@ def _get_local_app(app_dir: str, app_id: str | None = None) -> local.Application
73
73
  return app
74
74
 
75
75
 
76
+ def _build_run_configuration(content_format: str | None):
77
+ """Build a RunConfiguration for the given content format string, or None."""
78
+
79
+ if content_format is None:
80
+ return None
81
+
82
+ from nextmv.input import InputFormat
83
+ from nextmv.run import Format, FormatInput, RunConfiguration
84
+
85
+ config = RunConfiguration()
86
+ config.format = Format(
87
+ format_input=FormatInput(
88
+ input_type=InputFormat(content_format),
89
+ ),
90
+ )
91
+ return config
92
+
93
+
76
94
  def _save_to_file(data: Any, prefix: str) -> str:
77
95
  """Serialize data to a temp JSON file and return a message with the path.
78
96
 
@@ -1,9 +1,6 @@
1
1
  """MCP tools for local application management."""
2
2
 
3
- import json
4
3
  import os
5
- import subprocess
6
- import tempfile
7
4
  from typing import Any
8
5
 
9
6
  from mcp.server.fastmcp import FastMCP
@@ -20,103 +17,6 @@ def _local_run_dir(app_dir: str, run_id: str) -> str:
20
17
  return os.path.join(app_dir, NEXTMV_DIR, RUNS_KEY, run_id)
21
18
 
22
19
 
23
- def _run_via_cli(
24
- app_dir: str,
25
- input_data: dict[str, Any],
26
- run_options: dict[str, str] | None = None,
27
- wait: bool = False,
28
- ) -> str:
29
- """Execute a local run via ``uv run nextmv local run create``.
30
-
31
- This invokes the Nextmv CLI through ``uv``, which ensures that
32
- the application's ``requirements.txt`` dependencies are installed
33
- and available at runtime (unlike calling the SDK directly with
34
- ``sys.executable``).
35
-
36
- Args:
37
- app_dir: Absolute path to the local application directory.
38
- input_data: The input data (JSON object) for the run.
39
- run_options: Optional solver options passed as ``--options key=value``.
40
- wait: If True, blocks until the run completes (``--wait``).
41
-
42
- Returns:
43
- The run ID (parsed from the CLI's JSON stdout output).
44
-
45
- Raises:
46
- RuntimeError: If the CLI process exits with a non-zero return code.
47
- """
48
-
49
- # Write input to a temp file so the CLI can read it via --input.
50
- fd, input_path = tempfile.mkstemp(suffix=".json", prefix="mcp_local_input_")
51
- try:
52
- with os.fdopen(fd, "w") as fh:
53
- json.dump(input_data, fh)
54
-
55
- cmd: list[str] = [
56
- "uv", "run", "nextmv",
57
- "local", "run", "create",
58
- "--app-src", os.path.abspath(app_dir),
59
- "--input", input_path,
60
- ]
61
-
62
- if run_options:
63
- for key, value in run_options.items():
64
- cmd.extend(["--options", f"{key}={value}"])
65
-
66
- if wait:
67
- cmd.append("--wait")
68
-
69
- result = subprocess.run(
70
- cmd,
71
- capture_output=True,
72
- text=True,
73
- check=False,
74
- env=os.environ,
75
- )
76
-
77
- if result.returncode != 0:
78
- stderr = result.stderr.strip()
79
- raise RuntimeError(
80
- f"nextmv local run create failed (exit {result.returncode}): {stderr}"
81
- )
82
-
83
- # The CLI prints JSON with a "run_id" key to stdout when not
84
- # waiting, or the full result when waiting.
85
- stdout = result.stdout.strip()
86
- try:
87
- parsed = json.loads(stdout)
88
- if isinstance(parsed, dict) and "run_id" in parsed:
89
- return parsed["run_id"]
90
- except json.JSONDecodeError:
91
- pass
92
-
93
- # When --wait is used the CLI may print the run_id via a
94
- # success message to stderr. Fall back to extracting the
95
- # run_id from the run directory listing.
96
- from nextmv.local.local import NEXTMV_DIR, RUNS_KEY
97
-
98
- runs_dir = os.path.join(
99
- os.path.abspath(app_dir), NEXTMV_DIR, RUNS_KEY,
100
- )
101
- if os.path.isdir(runs_dir):
102
- entries = sorted(
103
- os.listdir(runs_dir),
104
- key=lambda d: os.path.getmtime(
105
- os.path.join(runs_dir, d)
106
- ),
107
- )
108
- if entries:
109
- return entries[-1]
110
-
111
- raise RuntimeError(
112
- f"Could not determine run_id from CLI output: {stdout}"
113
- )
114
- finally:
115
- # Clean up the temp input file.
116
- if os.path.exists(input_path):
117
- os.unlink(input_path)
118
-
119
-
120
20
  def _local_run_input_impl(
121
21
  app_dir: str,
122
22
  run_id: str,
@@ -155,30 +55,47 @@ def _local_run_logs_impl(
155
55
 
156
56
  def local_run(
157
57
  app_dir: str,
158
- input: dict[str, Any],
58
+ input: dict[str, Any] | None = None,
59
+ input_dir_path: str | None = None,
60
+ content_format: str | None = None,
159
61
  run_options: dict[str, str] | None = None,
160
62
  ) -> str:
161
63
  """Run a local Nextmv application and wait for the result.
162
64
 
163
- Executes the application via ``uv run nextmv local run create
164
- --wait``, which handles dependency installation (e.g.
165
- requirements.txt) automatically. The result is stored in the
166
- local run directory at ``{app_dir}/.nextmv/runs/{run_id}/``.
167
- Use file-reading tools to inspect the result file.
65
+ Executes the application using the Nextmv SDK and polls until the
66
+ run completes. The result is stored in the local run directory at
67
+ ``{app_dir}/.nextmv/runs/{run_id}/``. Use file-reading tools to
68
+ inspect the result file.
69
+
70
+ For JSON apps, provide ``input`` as a JSON object. For multi-file
71
+ or CSV archive apps, provide ``input_dir_path`` pointing to a
72
+ directory of input files and set ``content_format`` accordingly
73
+ (e.g. ``"multi-file"`` or ``"csv-archive"``).
168
74
 
169
75
  Args:
170
76
  app_dir: Absolute path to the local application directory
171
77
  containing an app.yaml manifest.
172
- input: The input data (JSON object) for the optimization run.
78
+ input: The input data (JSON object) for the run. Used for
79
+ JSON apps. Ignored when ``input_dir_path`` is provided.
80
+ input_dir_path: Path to a directory containing input files.
81
+ Use for multi-file or CSV archive apps. When provided,
82
+ ``content_format`` must also be set.
83
+ content_format: Content format of the input. Required when
84
+ ``input_dir_path`` is set. Allowed values:
85
+ ``"multi-file"``, ``"csv-archive"``, ``"json"``.
173
86
  run_options: Optional solver options passed to the application,
174
87
  e.g. ``{"solve.duration": "10s"}``.
175
88
  """
176
89
 
177
- run_id = _run_via_cli(
178
- app_dir=app_dir,
179
- input_data=input,
180
- run_options=run_options,
181
- wait=True,
90
+ app = _helpers._get_local_app(app_dir=app_dir)
91
+ config = _helpers._build_run_configuration(content_format)
92
+ if input_dir_path is not None:
93
+ run_id = app.new_run(input_dir_path=input_dir_path, options=run_options, configuration=config)
94
+ else:
95
+ run_id = app.new_run(input=input, options=run_options, configuration=config)
96
+ app.run_result_with_polling(
97
+ run_id=run_id,
98
+ polling_options=default_polling_options(),
182
99
  )
183
100
  run_dir = _local_run_dir(app_dir, run_id)
184
101
  result_path = os.path.join(run_dir, f"{run_id}.json")
@@ -190,30 +107,42 @@ def local_run(
190
107
 
191
108
  def local_run_submit(
192
109
  app_dir: str,
193
- input: dict[str, Any],
110
+ input: dict[str, Any] | None = None,
111
+ input_dir_path: str | None = None,
112
+ content_format: str | None = None,
194
113
  run_options: dict[str, str] | None = None,
195
114
  ) -> str:
196
115
  """Submit a local run without waiting for completion.
197
116
 
198
- Executes the application via ``uv run nextmv local run create``
199
- (non-blocking). Returns the run ID immediately. Use
200
- ``local_run_poll_result`` or ``local_run_status`` to check on
201
- the run later.
117
+ Executes the application using the Nextmv SDK and returns the run
118
+ ID immediately. Use ``local_run_poll_result`` or
119
+ ``local_run_status`` to check on the run later.
120
+
121
+ For JSON apps, provide ``input`` as a JSON object. For multi-file
122
+ or CSV archive apps, provide ``input_dir_path`` pointing to a
123
+ directory of input files and set ``content_format`` accordingly
124
+ (e.g. ``"multi-file"`` or ``"csv-archive"``).
202
125
 
203
126
  Args:
204
127
  app_dir: Absolute path to the local application directory
205
128
  containing an app.yaml manifest.
206
- input: The input data (JSON object) for the run.
129
+ input: The input data (JSON object) for the run. Used for
130
+ JSON apps. Ignored when ``input_dir_path`` is provided.
131
+ input_dir_path: Path to a directory containing input files.
132
+ Use for multi-file or CSV archive apps. When provided,
133
+ ``content_format`` must also be set.
134
+ content_format: Content format of the input. Required when
135
+ ``input_dir_path`` is set. Allowed values:
136
+ ``"multi-file"``, ``"csv-archive"``, ``"json"``.
207
137
  run_options: Optional solver options passed to the application,
208
138
  e.g. ``{"solve.duration": "10s"}``.
209
139
  """
210
140
 
211
- return _run_via_cli(
212
- app_dir=app_dir,
213
- input_data=input,
214
- run_options=run_options,
215
- wait=False,
216
- )
141
+ app = _helpers._get_local_app(app_dir=app_dir)
142
+ config = _helpers._build_run_configuration(content_format)
143
+ if input_dir_path is not None:
144
+ return app.new_run(input_dir_path=input_dir_path, options=run_options, configuration=config)
145
+ return app.new_run(input=input, options=run_options, configuration=config)
217
146
 
218
147
 
219
148
  def local_run_status(
@@ -45,7 +45,9 @@ def register(mcp: FastMCP) -> None:
45
45
  @mcp.tool()
46
46
  def cloud_run(
47
47
  app_id: str,
48
- input: dict[str, Any],
48
+ input: dict[str, Any] | None = None,
49
+ input_dir_path: str | None = None,
50
+ content_format: str | None = None,
49
51
  instance_id: str | None = None,
50
52
  run_options: dict[str, str] | None = None,
51
53
  managed_input_id: str | None = None,
@@ -57,10 +59,22 @@ def register(mcp: FastMCP) -> None:
57
59
  statistics) to a local temp file. Use file-reading tools to
58
60
  inspect the contents.
59
61
 
62
+ For JSON apps, provide ``input`` as a JSON object. For
63
+ multi-file or CSV archive apps, provide ``input_dir_path``
64
+ pointing to a local directory of input files and set
65
+ ``content_format`` accordingly (e.g. ``"multi-file"``).
66
+
60
67
  Args:
61
68
  app_id: The application ID.
62
- input: The input data (JSON object) for the optimization
63
- run. Ignored when ``managed_input_id`` is provided.
69
+ input: The input data (JSON object) for the run. Used for
70
+ JSON apps. Ignored when ``input_dir_path`` or
71
+ ``managed_input_id`` is provided.
72
+ input_dir_path: Path to a local directory containing input
73
+ files. Use for multi-file or CSV archive apps. When
74
+ provided, ``content_format`` must also be set.
75
+ content_format: Content format of the input. Required when
76
+ ``input_dir_path`` is set. Allowed values:
77
+ ``"multi-file"``, ``"csv-archive"``, ``"json"``.
64
78
  instance_id: Instance to run against. Uses the application's
65
79
  default instance if omitted.
66
80
  run_options: Solver options passed to the application, e.g.
@@ -70,8 +84,11 @@ def register(mcp: FastMCP) -> None:
70
84
  """
71
85
 
72
86
  app = _helpers._get_app(app_id)
87
+ config = _helpers._build_run_configuration(content_format)
73
88
  result = app.new_run_with_result(
74
89
  input=input,
90
+ input_dir_path=input_dir_path,
91
+ configuration=config,
75
92
  instance_id=instance_id,
76
93
  run_options=run_options or {},
77
94
  polling_options=default_polling_options(),
@@ -82,7 +99,9 @@ def register(mcp: FastMCP) -> None:
82
99
  @mcp.tool()
83
100
  def cloud_run_submit(
84
101
  app_id: str,
85
- input: dict[str, Any],
102
+ input: dict[str, Any] | None = None,
103
+ input_dir_path: str | None = None,
104
+ content_format: str | None = None,
86
105
  instance_id: str | None = None,
87
106
  run_options: dict[str, str] | None = None,
88
107
  managed_input_id: str | None = None,
@@ -92,10 +111,22 @@ def register(mcp: FastMCP) -> None:
92
111
  Returns the run ID immediately. Use ``cloud_run_status`` or
93
112
  ``cloud_run_result`` to check on the run later.
94
113
 
114
+ For JSON apps, provide ``input`` as a JSON object. For
115
+ multi-file or CSV archive apps, provide ``input_dir_path``
116
+ pointing to a local directory of input files and set
117
+ ``content_format`` accordingly (e.g. ``"multi-file"``).
118
+
95
119
  Args:
96
120
  app_id: The application ID.
97
- input: The input data (JSON object) for the run. Ignored
98
- when ``managed_input_id`` is provided.
121
+ input: The input data (JSON object) for the run. Used for
122
+ JSON apps. Ignored when ``input_dir_path`` or
123
+ ``managed_input_id`` is provided.
124
+ input_dir_path: Path to a local directory containing input
125
+ files. Use for multi-file or CSV archive apps. When
126
+ provided, ``content_format`` must also be set.
127
+ content_format: Content format of the input. Required when
128
+ ``input_dir_path`` is set. Allowed values:
129
+ ``"multi-file"``, ``"csv-archive"``, ``"json"``.
99
130
  instance_id: Instance to run against. Uses the application's
100
131
  default instance if omitted.
101
132
  run_options: Solver options passed to the application, e.g.
@@ -105,13 +136,15 @@ def register(mcp: FastMCP) -> None:
105
136
  """
106
137
 
107
138
  app = _helpers._get_app(app_id)
108
- run_id = app.new_run(
139
+ config = _helpers._build_run_configuration(content_format)
140
+ return app.new_run(
109
141
  input=input,
142
+ input_dir_path=input_dir_path,
143
+ configuration=config,
110
144
  instance_id=instance_id,
111
145
  options=run_options or {},
112
146
  managed_input_id=managed_input_id,
113
147
  )
114
- return run_id
115
148
 
116
149
  @mcp.tool()
117
150
  def cloud_run_status(app_id: str, run_id: str) -> dict[str, Any]:
@@ -931,3 +931,115 @@ class TestBugFixes(unittest.TestCase):
931
931
  run_numbers = [r["run_number"] for r in runs]
932
932
  self.assertEqual(run_numbers, ["1", "2"])
933
933
 
934
+
935
+ class TestMultiFileRunSupport(unittest.TestCase):
936
+ """Tests for multi-file run support in local and cloud run tools."""
937
+
938
+ def test_build_run_configuration_none(self):
939
+ """_build_run_configuration returns None when content_format is None."""
940
+ from nextmv.cli.mcp.tools._helpers import _build_run_configuration
941
+
942
+ self.assertIsNone(_build_run_configuration(None))
943
+
944
+ def test_build_run_configuration_multi_file(self):
945
+ """_build_run_configuration builds a RunConfiguration for 'multi-file'."""
946
+ from nextmv.cli.mcp.tools._helpers import _build_run_configuration
947
+ from nextmv.input import InputFormat
948
+
949
+ config = _build_run_configuration("multi-file")
950
+ self.assertIsNotNone(config)
951
+ self.assertEqual(
952
+ config.format.format_input.input_type,
953
+ InputFormat.MULTI_FILE,
954
+ )
955
+
956
+ @patch("nextmv.cli.mcp.tools._helpers._get_local_app")
957
+ def test_local_run_submit_json_input(self, mock_get_local_app):
958
+ """local_run_submit passes input dict to new_run for JSON apps."""
959
+ from nextmv.cli.mcp.server import create_server
960
+
961
+ mock_app = MagicMock()
962
+ mock_app.new_run.return_value = "run-123"
963
+ mock_get_local_app.return_value = mock_app
964
+
965
+ server = create_server()
966
+ tool = server._tool_manager._tools["local_run_submit"]
967
+ asyncio.run(tool.run({
968
+ "app_dir": "/some/app",
969
+ "input": {"stops": []},
970
+ }))
971
+ mock_app.new_run.assert_called_once()
972
+ call_kwargs = mock_app.new_run.call_args[1]
973
+ self.assertEqual(call_kwargs["input"], {"stops": []})
974
+ self.assertIsNone(call_kwargs.get("input_dir_path"))
975
+ self.assertIsNone(call_kwargs.get("configuration"))
976
+
977
+ @patch("nextmv.cli.mcp.tools._helpers._get_local_app")
978
+ def test_local_run_submit_multifile_input(self, mock_get_local_app):
979
+ """local_run_submit passes input_dir_path + configuration for multi-file apps."""
980
+ from nextmv.cli.mcp.server import create_server
981
+ from nextmv.input import InputFormat
982
+
983
+ mock_app = MagicMock()
984
+ mock_app.new_run.return_value = "run-456"
985
+ mock_get_local_app.return_value = mock_app
986
+
987
+ server = create_server()
988
+ tool = server._tool_manager._tools["local_run_submit"]
989
+ asyncio.run(tool.run({
990
+ "app_dir": "/some/app",
991
+ "input_dir_path": "/some/input-dir",
992
+ "content_format": "multi-file",
993
+ }))
994
+ mock_app.new_run.assert_called_once()
995
+ call_kwargs = mock_app.new_run.call_args[1]
996
+ self.assertEqual(call_kwargs["input_dir_path"], "/some/input-dir")
997
+ config = call_kwargs.get("configuration")
998
+ self.assertIsNotNone(config)
999
+ self.assertEqual(config.format.format_input.input_type, InputFormat.MULTI_FILE)
1000
+
1001
+ @patch("nextmv.cli.mcp.tools._helpers._get_app")
1002
+ def test_cloud_run_submit_json_input(self, mock_get_app):
1003
+ """cloud_run_submit passes input dict to new_run for JSON apps."""
1004
+ from nextmv.cli.mcp.server import create_server
1005
+
1006
+ mock_app = MagicMock()
1007
+ mock_app.new_run.return_value = "run-789"
1008
+ mock_get_app.return_value = mock_app
1009
+
1010
+ server = create_server()
1011
+ tool = server._tool_manager._tools["cloud_run_submit"]
1012
+ asyncio.run(tool.run({
1013
+ "app_id": "my-app",
1014
+ "input": {"stops": []},
1015
+ }))
1016
+ mock_app.new_run.assert_called_once()
1017
+ call_kwargs = mock_app.new_run.call_args[1]
1018
+ self.assertEqual(call_kwargs["input"], {"stops": []})
1019
+ self.assertIsNone(call_kwargs.get("input_dir_path"))
1020
+ self.assertIsNone(call_kwargs.get("configuration"))
1021
+
1022
+ @patch("nextmv.cli.mcp.tools._helpers._get_app")
1023
+ def test_cloud_run_submit_multifile_input(self, mock_get_app):
1024
+ """cloud_run_submit passes input_dir_path + configuration for multi-file apps."""
1025
+ from nextmv.cli.mcp.server import create_server
1026
+ from nextmv.input import InputFormat
1027
+
1028
+ mock_app = MagicMock()
1029
+ mock_app.new_run.return_value = "run-mf-1"
1030
+ mock_get_app.return_value = mock_app
1031
+
1032
+ server = create_server()
1033
+ tool = server._tool_manager._tools["cloud_run_submit"]
1034
+ asyncio.run(tool.run({
1035
+ "app_id": "my-app",
1036
+ "input_dir_path": "/some/input-dir",
1037
+ "content_format": "multi-file",
1038
+ }))
1039
+ mock_app.new_run.assert_called_once()
1040
+ call_kwargs = mock_app.new_run.call_args[1]
1041
+ self.assertEqual(call_kwargs["input_dir_path"], "/some/input-dir")
1042
+ config = call_kwargs.get("configuration")
1043
+ self.assertIsNotNone(config)
1044
+ self.assertEqual(config.format.format_input.input_type, InputFormat.MULTI_FILE)
1045
+
@@ -1 +0,0 @@
1
- __version__ = "v1.2.3.dev2"
File without changes
File without changes
File without changes
File without changes
File without changes