redeploy 0.2.49__tar.gz → 0.2.52__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 (217) hide show
  1. {redeploy-0.2.49 → redeploy-0.2.52}/PKG-INFO +266 -6
  2. {redeploy-0.2.49 → redeploy-0.2.52}/README.md +263 -5
  3. {redeploy-0.2.49 → redeploy-0.2.52}/pyproject.toml +3 -1
  4. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/__init__.py +5 -1
  5. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/apply/executor.py +88 -2
  6. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/blueprint/extractor.py +25 -2
  7. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/__init__.py +4 -0
  8. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/bump_fix.py +115 -17
  9. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/detect.py +20 -1
  10. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/hardware.py +10 -34
  11. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/import_.py +111 -4
  12. redeploy-0.2.52/redeploy/cli/commands/mcp_cmd.py +54 -0
  13. redeploy-0.2.52/redeploy/cli/commands/prompt_cmd.py +264 -0
  14. redeploy-0.2.52/redeploy/detect/hardware.py +83 -0
  15. redeploy-0.2.52/redeploy/detect/hardware_rules.py +56 -0
  16. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/heal.py +37 -0
  17. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/iac/__init__.py +7 -2
  18. redeploy-0.2.52/redeploy/iac/config_hints.py +289 -0
  19. redeploy-0.2.52/redeploy/iac/registry.py +107 -0
  20. redeploy-0.2.52/redeploy/integrations/op3_bridge.py +250 -0
  21. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/markpact/compiler.py +6 -1
  22. redeploy-0.2.52/redeploy/mcp_server.py +314 -0
  23. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/models.py +102 -5
  24. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/plan/planner.py +1 -0
  25. redeploy-0.2.52/redeploy/schema.py +309 -0
  26. redeploy-0.2.52/redeploy/tests/test_heal.py +26 -0
  27. redeploy-0.2.52/redeploy/tests/test_hooks.py +123 -0
  28. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy.egg-info/PKG-INFO +266 -6
  29. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy.egg-info/SOURCES.txt +19 -1
  30. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy.egg-info/entry_points.txt +1 -0
  31. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy.egg-info/requires.txt +3 -0
  32. redeploy-0.2.52/tests/test_blueprint_sources.py +186 -0
  33. redeploy-0.2.52/tests/test_blueprint_sources_compose.py +153 -0
  34. redeploy-0.2.52/tests/test_cli_query.py +79 -0
  35. redeploy-0.2.52/tests/test_example_argocd_flux_plugin.py +82 -0
  36. redeploy-0.2.52/tests/test_example_gitops_ci_plugin.py +74 -0
  37. redeploy-0.2.52/tests/test_example_helm_kustomize_plugin.py +72 -0
  38. redeploy-0.2.52/tests/test_iac_config_hints.py +129 -0
  39. redeploy-0.2.52/tests/test_iac_plugin_loading.py +79 -0
  40. redeploy-0.2.52/tests/test_import_plugin_template.py +55 -0
  41. redeploy-0.2.52/tests/test_prompt_llm.py +362 -0
  42. redeploy-0.2.52/tests/test_steps_kiosk.py +93 -0
  43. redeploy-0.2.49/redeploy/detect/hardware.py +0 -353
  44. redeploy-0.2.49/redeploy/detect/hardware_rules.py +0 -489
  45. redeploy-0.2.49/redeploy/iac/registry.py +0 -37
  46. redeploy-0.2.49/redeploy/integrations/op3_bridge.py +0 -196
  47. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/apply/__init__.py +0 -0
  48. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/apply/exceptions.py +0 -0
  49. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/apply/handlers.py +0 -0
  50. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/apply/progress.py +0 -0
  51. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/apply/rollback.py +0 -0
  52. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/apply/state.py +0 -0
  53. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/apply/state_apply.py +0 -0
  54. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/apply/utils/__init__.py +0 -0
  55. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/apply/utils/run_container_build.py +0 -0
  56. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/audit.py +0 -0
  57. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/blueprint/__init__.py +0 -0
  58. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/blueprint/generators/__init__.py +0 -0
  59. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/blueprint/generators/docker_compose.py +0 -0
  60. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/blueprint/generators/migration.py +0 -0
  61. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/blueprint/sources/__init__.py +0 -0
  62. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/blueprint/sources/compose.py +0 -0
  63. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/blueprint/sources/hardware.py +0 -0
  64. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/blueprint/sources/infra.py +0 -0
  65. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/blueprint/sources/migration.py +0 -0
  66. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/__init__.py +0 -0
  67. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/audit.py +0 -0
  68. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/blueprint.py +0 -0
  69. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/device_map.py +0 -0
  70. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/device_map_renderers.py +0 -0
  71. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/devices.py +0 -0
  72. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/diagnose.py +0 -0
  73. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/diff.py +0 -0
  74. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/exec_.py +0 -0
  75. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/export.py +0 -0
  76. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/init.py +0 -0
  77. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/inspect.py +0 -0
  78. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/patterns.py +0 -0
  79. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/plan_apply.py +0 -0
  80. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/plugin.py +0 -0
  81. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/probe.py +0 -0
  82. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/push.py +0 -0
  83. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/state.py +0 -0
  84. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/status.py +0 -0
  85. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/target.py +0 -0
  86. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/version/__init__.py +0 -0
  87. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/version/commands.py +0 -0
  88. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/version/helpers.py +0 -0
  89. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/version/monorepo.py +0 -0
  90. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/version/release.py +0 -0
  91. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/version/scanner.py +0 -0
  92. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/commands/workflow.py +0 -0
  93. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/core.py +0 -0
  94. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/display.py +0 -0
  95. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli/query.py +0 -0
  96. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/cli.py +0 -0
  97. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/config_apply/__init__.py +0 -0
  98. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/config_apply/applier.py +0 -0
  99. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/config_apply/loader.py +0 -0
  100. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/data_sync.py +0 -0
  101. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/detect/__init__.py +0 -0
  102. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/detect/builtin/__init__.py +0 -0
  103. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/detect/detector.py +0 -0
  104. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/detect/probes.py +0 -0
  105. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/detect/remote.py +0 -0
  106. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/detect/templates.py +0 -0
  107. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/detect/workflow.py +0 -0
  108. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/discovery.py +0 -0
  109. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/dsl/__init__.py +0 -0
  110. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/dsl/loader.py +0 -0
  111. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/dsl/parser.py +0 -0
  112. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/dsl_python/__init__.py +0 -0
  113. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/dsl_python/context.py +0 -0
  114. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/dsl_python/decorators.py +0 -0
  115. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/dsl_python/docker_steps.py +0 -0
  116. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/dsl_python/exceptions.py +0 -0
  117. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/dsl_python/runner.py +0 -0
  118. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/dsl_python/steps.py +0 -0
  119. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/fleet.py +0 -0
  120. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/hardware/__init__.py +0 -0
  121. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/hardware/config_txt.py +0 -0
  122. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/hardware/data/__init__.py +0 -0
  123. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/hardware/data/hyperpixel.py +0 -0
  124. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/hardware/data/official.py +0 -0
  125. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/hardware/data/waveshare.py +0 -0
  126. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/hardware/fixes.py +0 -0
  127. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/hardware/kiosk/__init__.py +0 -0
  128. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/hardware/kiosk/autostart.py +0 -0
  129. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/hardware/kiosk/browsers.py +0 -0
  130. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/hardware/kiosk/compositors.py +0 -0
  131. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/hardware/kiosk/output_profiles.py +0 -0
  132. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/hardware/panels.py +0 -0
  133. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/hardware/raspi_config.py +0 -0
  134. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/iac/base.py +0 -0
  135. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/iac/docker_compose.py +0 -0
  136. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/iac/parsers/__init__.py +0 -0
  137. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/iac/parsers/compose.py +0 -0
  138. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/integrations/__init__.py +0 -0
  139. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/markpact/__init__.py +0 -0
  140. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/markpact/models.py +0 -0
  141. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/markpact/parser.py +0 -0
  142. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/observe.py +0 -0
  143. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/parse.py +0 -0
  144. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/patterns.py +0 -0
  145. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/plan/__init__.py +0 -0
  146. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/plugins/__init__.py +0 -0
  147. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/plugins/builtin/__init__.py +0 -0
  148. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/plugins/builtin/browser_reload.py +0 -0
  149. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/plugins/builtin/hardware_diagnostic.py +0 -0
  150. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/plugins/builtin/notify.py +0 -0
  151. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/plugins/builtin/process_control.py +0 -0
  152. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/plugins/builtin/systemd_reload.py +0 -0
  153. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/spec_loader.py +0 -0
  154. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/ssh.py +0 -0
  155. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/steps/__init__.py +0 -0
  156. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/steps/builtins.py +0 -0
  157. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/steps/kiosk.py +0 -0
  158. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/__init__.py +0 -0
  159. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_audit.py +0 -0
  160. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_cli.py +0 -0
  161. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_data_sync.py +0 -0
  162. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_discovery.py +0 -0
  163. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_dsl.py +0 -0
  164. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_examples.py +0 -0
  165. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_executor.py +0 -0
  166. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_fleet.py +0 -0
  167. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_git_integration.py +0 -0
  168. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_iac.py +0 -0
  169. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_manifest.py +0 -0
  170. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_markpact_compiler.py +0 -0
  171. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_markpact_parser.py +0 -0
  172. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_models.py +0 -0
  173. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_observe.py +0 -0
  174. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_parse.py +0 -0
  175. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_patterns.py +0 -0
  176. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_planner_edge.py +0 -0
  177. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_plugins.py +0 -0
  178. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_probes.py +0 -0
  179. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_public_api.py +0 -0
  180. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_resume.py +0 -0
  181. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_spec_loader.py +0 -0
  182. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_ssh.py +0 -0
  183. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_templates.py +0 -0
  184. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_verify.py +0 -0
  185. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_version.py +0 -0
  186. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_version_changelog.py +0 -0
  187. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_version_cli.py +0 -0
  188. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_version_manifest.py +0 -0
  189. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_version_sources.py +0 -0
  190. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/tests/test_workflow.py +0 -0
  191. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/verify.py +0 -0
  192. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/version/__init__.py +0 -0
  193. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/version/bump.py +0 -0
  194. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/version/changelog.py +0 -0
  195. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/version/commits.py +0 -0
  196. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/version/diff.py +0 -0
  197. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/version/git_integration.py +0 -0
  198. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/version/git_transaction.py +0 -0
  199. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/version/manifest.py +0 -0
  200. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/version/sources/__init__.py +0 -0
  201. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/version/sources/base.py +0 -0
  202. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/version/sources/json_.py +0 -0
  203. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/version/sources/plain.py +0 -0
  204. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/version/sources/regex.py +0 -0
  205. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/version/sources/toml_.py +0 -0
  206. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/version/sources/yaml_.py +0 -0
  207. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/version/transaction.py +0 -0
  208. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy/version.py +0 -0
  209. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy.egg-info/dependency_links.txt +0 -0
  210. {redeploy-0.2.49 → redeploy-0.2.52}/redeploy.egg-info/top_level.txt +0 -0
  211. {redeploy-0.2.49 → redeploy-0.2.52}/setup.cfg +0 -0
  212. {redeploy-0.2.49 → redeploy-0.2.52}/tests/test_hardware_config.py +0 -0
  213. {redeploy-0.2.49 → redeploy-0.2.52}/tests/test_hardware_kiosk.py +0 -0
  214. {redeploy-0.2.49 → redeploy-0.2.52}/tests/test_hardware_rules.py +0 -0
  215. {redeploy-0.2.49 → redeploy-0.2.52}/tests/test_iac.py +0 -0
  216. {redeploy-0.2.49 → redeploy-0.2.52}/tests/test_parse.py +0 -0
  217. {redeploy-0.2.49 → redeploy-0.2.52}/tests/test_redeploy.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: redeploy
3
- Version: 0.2.49
3
+ Version: 0.2.52
4
4
  Summary: Infrastructure migration toolkit: detect → plan → apply
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -24,23 +24,25 @@ Requires-Dist: costs>=0.1.20; extra == "dev"
24
24
  Requires-Dist: pfix>=0.1.60; extra == "dev"
25
25
  Provides-Extra: op3
26
26
  Requires-Dist: op3>=0.1.8; extra == "op3"
27
+ Provides-Extra: mcp
28
+ Requires-Dist: mcp>=1.0; extra == "mcp"
27
29
 
28
30
  # redeploy
29
31
 
30
32
 
31
33
  ## AI Cost Tracking
32
34
 
33
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.49-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
34
- ![AI Cost](https://img.shields.io/badge/AI%20Cost-$7.50-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-24.9h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
35
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.52-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
36
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$7.50-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-27.0h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
35
37
 
36
- - 🤖 **LLM usage:** $7.5000 (70 commits)
37
- - 👤 **Human dev:** ~$2486 (24.9h @ $100/h, 30min dedup)
38
+ - 🤖 **LLM usage:** $7.5000 (72 commits)
39
+ - 👤 **Human dev:** ~$2695 (27.0h @ $100/h, 30min dedup)
38
40
 
39
41
  Generated on 2026-04-21 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
40
42
 
41
43
  ---
42
44
 
43
- ![PyPI](https://img.shields.io/badge/pypi-redeploy-blue) ![Version](https://img.shields.io/badge/version-0.2.49-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
45
+ ![PyPI](https://img.shields.io/badge/pypi-redeploy-blue) ![Version](https://img.shields.io/badge/version-0.2.52-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
44
46
 
45
47
  Infrastructure migration and device deploy toolkit — VPS, Raspberry Pi kiosk, Podman Quadlet, k3s.
46
48
 
@@ -49,6 +51,10 @@ redeploy detect → live probe host (what is there now)
49
51
  redeploy plan → migration-plan.yaml (what to do)
50
52
  redeploy apply → execute plan (do it)
51
53
  redeploy run → detect + plan + apply (all at once from spec)
54
+ redeploy fix → bump + run + LLM heal (smart self-healing deploy)
55
+ redeploy bump → bump version in spec (patch/minor/major)
56
+ redeploy prompt → NLP → command via LLM (natural language interface)
57
+ redeploy mcp → start MCP server (Claude Desktop / VS Code / remote API)
52
58
  redeploy scan → find devices on LAN (device registry)
53
59
  redeploy target → deploy to named device (fleet)
54
60
  ```
@@ -664,6 +670,57 @@ doql `DEPLOY.target` → redeploy `strategy` mapping:
664
670
  | `kiosk-appliance` | `native_kiosk` |
665
671
  | `kubernetes` | `k3s` |
666
672
 
673
+ IaC/CI config coverage (via `redeploy import`, used by doql/redeploy workflows):
674
+ - Docker Compose + Dockerfile
675
+ - nginx configs (`nginx.conf`, `*.conf`)
676
+ - Kubernetes manifests (`apiVersion` + `kind` YAML)
677
+ - Terraform (`*.tf`, `*.tfvars`)
678
+ - TOML (`pyproject.toml`, app/tool TOML)
679
+ - Vite config (`vite.config.ts/js/mjs/cjs`)
680
+ - CI/CD: GitHub Actions, GitLab CI, Jenkinsfile
681
+
682
+ Parser plugin extension:
683
+ - Python entry points: `redeploy.iac.parsers`
684
+ - Project-local parsers: `./redeploy_iac_parsers/*.py`
685
+ - User-global parsers: `~/.redeploy/iac_parsers/*.py`
686
+
687
+ Built-in template generator:
688
+ - `redeploy import --list-plugin-templates`
689
+ - `redeploy import --plugin-template helm-kustomize`
690
+ - `redeploy import --plugin-template argocd-flux --plugin-dir redeploy_iac_parsers`
691
+
692
+ Example external plugin (Helm + Ansible):
693
+ - Source template: `examples/redeploy_iac_parsers/helm_ansible.py`
694
+ - Quick start:
695
+ 1. `mkdir -p redeploy_iac_parsers`
696
+ 2. `cp examples/redeploy_iac_parsers/helm_ansible.py redeploy_iac_parsers/`
697
+ 3. `redeploy import path/to/Chart.yaml`
698
+ 4. `redeploy import path/to/playbook.yml`
699
+
700
+ Example external plugin (Helm templates + Kustomize):
701
+ - Source template: `examples/redeploy_iac_parsers/helm_kustomize.py`
702
+ - Quick start:
703
+ 1. `mkdir -p redeploy_iac_parsers`
704
+ 2. `cp examples/redeploy_iac_parsers/helm_kustomize.py redeploy_iac_parsers/`
705
+ 3. `redeploy import path/to/chart/templates/deployment.yaml`
706
+ 4. `redeploy import path/to/kustomization.yaml`
707
+
708
+ Example external plugin (ArgoCD Application + Flux Kustomization):
709
+ - Source template: `examples/redeploy_iac_parsers/argocd_flux.py`
710
+ - Quick start:
711
+ 1. `mkdir -p redeploy_iac_parsers`
712
+ 2. `cp examples/redeploy_iac_parsers/argocd_flux.py redeploy_iac_parsers/`
713
+ 3. `redeploy import path/to/argocd-application.yaml`
714
+ 4. `redeploy import path/to/flux-kustomization.yaml`
715
+
716
+ Example external plugin (GitOps CI for ArgoCD/Flux):
717
+ - Source template: `examples/redeploy_iac_parsers/gitops_ci.py`
718
+ - Quick start:
719
+ 1. `mkdir -p redeploy_iac_parsers`
720
+ 2. `cp examples/redeploy_iac_parsers/gitops_ci.py redeploy_iac_parsers/`
721
+ 3. `redeploy import .github/workflows/deploy-gitops.yml`
722
+ 4. `redeploy import .gitlab-ci.yml`
723
+
667
724
  ## Examples
668
725
 
669
726
  | Directory | Scenario | Strategy |
@@ -683,10 +740,213 @@ redeploy run examples/01-vps-version-bump/migration.yaml --plan-only
683
740
  redeploy run examples/04-rpi-kiosk/migration.yaml --plan-only
684
741
  ```
685
742
 
743
+ ## Self-healing deploy — `redeploy fix`
744
+
745
+ `redeploy fix` is the recommended day-to-day deploy command. It:
746
+ 1. bumps the patch version in `VERSION` + spec header
747
+ 2. applies the migration spec with `--heal` enabled
748
+ 3. if a step fails, calls an LLM (via LiteLLM / OpenRouter) to suggest a fix and retries automatically
749
+
750
+ ```bash
751
+ # Self-healing deploy: bump version → run → LLM retry on failure
752
+ redeploy fix .
753
+ redeploy fix redeploy/pi109/migration.md
754
+
755
+ # With a problem hint for the LLM
756
+ redeploy fix . --hint "service not starting after update"
757
+ redeploy fix . --hint "brak ikon SVG w menu"
758
+
759
+ # Preview only (no apply)
760
+ redeploy fix . --dry-run
761
+
762
+ # Bump minor version instead of patch
763
+ redeploy fix . --minor
764
+
765
+ # Bump major version
766
+ redeploy fix . --major
767
+ redeploy fix . --retries 5
768
+
769
+ # Skip version bump
770
+ redeploy fix . --no-bump
771
+ ```
772
+
773
+ Spec discovery from `.`:
774
+ - `./migration.md` or `./migration.yaml` — direct match
775
+ - `./redeploy/<target>/migration.md` — project pattern (lists targets, asks if multiple)
776
+ - Recursive fallback anywhere under the directory
777
+
778
+ `redeploy fix` automatically discovers migration specs — running from project root
779
+ with multiple targets prompts interactively.
780
+
781
+ ### Version management — `redeploy bump`
782
+
783
+ ```bash
784
+ # Bump patch (default): 1.0.31 → 1.0.32
785
+ redeploy bump .
786
+ redeploy bump redeploy/pi109/migration.md
787
+
788
+ # Bump minor: 1.0.31 → 1.1.0
789
+ redeploy bump . --minor
790
+
791
+ # Bump major: 1.0.31 → 2.0.0
792
+ redeploy bump . --major
793
+ ```
794
+
795
+ Updates `VERSION` file and all version references in the migration spec
796
+ (`version:`, `name: "... vX.Y.Z"`, `description: "... vX.Y.Z"`).
797
+
798
+ ### LLM self-healing on `redeploy run`
799
+
800
+ `redeploy run` also supports `--heal` mode (enabled by default):
801
+
802
+ ```bash
803
+ # Run with LLM self-healing (default)
804
+ redeploy run migration.yaml
805
+
806
+ # Disable healing
807
+ redeploy run migration.yaml --no-heal
808
+
809
+ # Pass problem description to LLM
810
+ redeploy run migration.yaml --fix "nginx port conflict"
811
+
812
+ # Max heal retries
813
+ redeploy run migration.yaml --max-heal-retries 5
814
+ ```
815
+
816
+ LLM reads the failed step output, runs SSH diagnostics, and patches the spec YAML.
817
+ Repairs are logged to `REPAIR_LOG.md` next to the spec.
818
+
819
+ Requires `OPENROUTER_API_KEY` (or `OPENAI_API_KEY`) in `.env` or `~/.redeploy/.env`.
820
+ Model defaults to `openrouter/qwen/qwen3-coder-next` (override with `LLM_MODEL=...`).
821
+
822
+ ---
823
+
824
+ ## Natural language interface — `redeploy prompt`
825
+
826
+ ```bash
827
+ # Map a natural language instruction to a redeploy command
828
+ redeploy prompt "deploy c2004 to pi109"
829
+ redeploy prompt "pokaż plan deployu na pi109"
830
+ redeploy prompt "bump version and redeploy" --yes
831
+ redeploy prompt "what specs are available?" --schema-only
832
+
833
+ # Force dry-run on generated command
834
+ redeploy prompt "run the pi109 migration" --dry-run
835
+
836
+ # Skip confirmation
837
+ redeploy prompt "fix the frontend service" --yes
838
+
839
+ # Preview the workspace schema sent to the LLM
840
+ redeploy prompt "..." --show-schema
841
+ ```
842
+
843
+ The LLM receives a workspace schema (discovered specs, version, git branch, command catalogue)
844
+ and maps the instruction to a concrete `redeploy` invocation.
845
+
846
+ Language is auto-detected — Polish, English, or any language the model supports.
847
+
848
+ ---
849
+
850
+ ## MCP server — `redeploy mcp`
851
+
852
+ redeploy exposes an [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server,
853
+ letting AI assistants (Claude Desktop, VS Code Copilot, custom agents) call redeploy operations
854
+ as structured tools.
855
+
856
+ ### Start
857
+
858
+ ```bash
859
+ # stdio — for Claude Desktop / VS Code local integration
860
+ redeploy mcp
861
+
862
+ # HTTP SSE — for remote/shared access
863
+ redeploy mcp --transport sse --port 8811
864
+
865
+ # Streamable HTTP
866
+ redeploy mcp --transport http --port 8811
867
+
868
+ # Standalone binary (no CLI wrapper)
869
+ redeploy-mcp --transport sse
870
+ ```
871
+
872
+ ### Available MCP tools
873
+
874
+ | Tool | Description |
875
+ |------|-------------|
876
+ | `schema` | Discover workspace: specs, version, git branch, command catalogue |
877
+ | `list_specs` | List all migration specs found in a directory |
878
+ | `plan_spec` | Preview a spec (dry-run) — safe, no changes |
879
+ | `run_spec` | Apply a migration spec |
880
+ | `fix_spec` | Self-healing deploy: bump → apply → LLM retry |
881
+ | `bump_version` | Bump patch/minor/major version |
882
+ | `diagnose` | SSH diagnostics on a remote host |
883
+ | `exec_ssh` | Run an ad-hoc command on a remote host |
884
+ | `nlp_command` | Translate NLP instruction → redeploy command |
885
+
886
+ ### MCP resources
887
+
888
+ | URI | Description |
889
+ |-----|-------------|
890
+ | `redeploy://workspace` | Current workspace schema as JSON |
891
+ | `redeploy://spec/{path}` | Raw content of a migration spec file |
892
+
893
+ ### Claude Desktop integration
894
+
895
+ Add to `~/.config/claude/claude_desktop_config.json`:
896
+
897
+ ```json
898
+ {
899
+ "mcpServers": {
900
+ "redeploy": {
901
+ "command": "redeploy",
902
+ "args": ["mcp"]
903
+ }
904
+ }
905
+ }
906
+ ```
907
+
908
+ ### VS Code Copilot integration
909
+
910
+ Add to `.vscode/mcp.json` in your workspace:
911
+
912
+ ```json
913
+ {
914
+ "servers": {
915
+ "redeploy": {
916
+ "type": "stdio",
917
+ "command": "redeploy",
918
+ "args": ["mcp"]
919
+ }
920
+ }
921
+ }
922
+ ```
923
+
924
+ Or for an SSE server already running on a remote machine:
925
+
926
+ ```json
927
+ {
928
+ "servers": {
929
+ "redeploy-remote": {
930
+ "type": "sse",
931
+ "url": "http://192.168.188.109:8811/sse"
932
+ }
933
+ }
934
+ }
935
+ ```
936
+
937
+ ### Install with MCP dependencies
938
+
939
+ ```bash
940
+ pip install "redeploy[mcp]"
941
+ ```
942
+
943
+ ---
944
+
686
945
  ## Hardware diagnostics commands
687
946
 
688
947
  ### `redeploy hardware HOST [options]`
689
948
 
949
+
690
950
  Probe and diagnose hardware on a remote host (DSI display, DRM connectors, backlight, I2C, config.txt, Wayland compositor).
691
951
 
692
952
  | Option | Description |
@@ -3,17 +3,17 @@
3
3
 
4
4
  ## AI Cost Tracking
5
5
 
6
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.49-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
7
- ![AI Cost](https://img.shields.io/badge/AI%20Cost-$7.50-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-24.9h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
6
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.52-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
7
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$7.50-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-27.0h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
8
8
 
9
- - 🤖 **LLM usage:** $7.5000 (70 commits)
10
- - 👤 **Human dev:** ~$2486 (24.9h @ $100/h, 30min dedup)
9
+ - 🤖 **LLM usage:** $7.5000 (72 commits)
10
+ - 👤 **Human dev:** ~$2695 (27.0h @ $100/h, 30min dedup)
11
11
 
12
12
  Generated on 2026-04-21 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
13
13
 
14
14
  ---
15
15
 
16
- ![PyPI](https://img.shields.io/badge/pypi-redeploy-blue) ![Version](https://img.shields.io/badge/version-0.2.49-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
16
+ ![PyPI](https://img.shields.io/badge/pypi-redeploy-blue) ![Version](https://img.shields.io/badge/version-0.2.52-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
17
17
 
18
18
  Infrastructure migration and device deploy toolkit — VPS, Raspberry Pi kiosk, Podman Quadlet, k3s.
19
19
 
@@ -22,6 +22,10 @@ redeploy detect → live probe host (what is there now)
22
22
  redeploy plan → migration-plan.yaml (what to do)
23
23
  redeploy apply → execute plan (do it)
24
24
  redeploy run → detect + plan + apply (all at once from spec)
25
+ redeploy fix → bump + run + LLM heal (smart self-healing deploy)
26
+ redeploy bump → bump version in spec (patch/minor/major)
27
+ redeploy prompt → NLP → command via LLM (natural language interface)
28
+ redeploy mcp → start MCP server (Claude Desktop / VS Code / remote API)
25
29
  redeploy scan → find devices on LAN (device registry)
26
30
  redeploy target → deploy to named device (fleet)
27
31
  ```
@@ -637,6 +641,57 @@ doql `DEPLOY.target` → redeploy `strategy` mapping:
637
641
  | `kiosk-appliance` | `native_kiosk` |
638
642
  | `kubernetes` | `k3s` |
639
643
 
644
+ IaC/CI config coverage (via `redeploy import`, used by doql/redeploy workflows):
645
+ - Docker Compose + Dockerfile
646
+ - nginx configs (`nginx.conf`, `*.conf`)
647
+ - Kubernetes manifests (`apiVersion` + `kind` YAML)
648
+ - Terraform (`*.tf`, `*.tfvars`)
649
+ - TOML (`pyproject.toml`, app/tool TOML)
650
+ - Vite config (`vite.config.ts/js/mjs/cjs`)
651
+ - CI/CD: GitHub Actions, GitLab CI, Jenkinsfile
652
+
653
+ Parser plugin extension:
654
+ - Python entry points: `redeploy.iac.parsers`
655
+ - Project-local parsers: `./redeploy_iac_parsers/*.py`
656
+ - User-global parsers: `~/.redeploy/iac_parsers/*.py`
657
+
658
+ Built-in template generator:
659
+ - `redeploy import --list-plugin-templates`
660
+ - `redeploy import --plugin-template helm-kustomize`
661
+ - `redeploy import --plugin-template argocd-flux --plugin-dir redeploy_iac_parsers`
662
+
663
+ Example external plugin (Helm + Ansible):
664
+ - Source template: `examples/redeploy_iac_parsers/helm_ansible.py`
665
+ - Quick start:
666
+ 1. `mkdir -p redeploy_iac_parsers`
667
+ 2. `cp examples/redeploy_iac_parsers/helm_ansible.py redeploy_iac_parsers/`
668
+ 3. `redeploy import path/to/Chart.yaml`
669
+ 4. `redeploy import path/to/playbook.yml`
670
+
671
+ Example external plugin (Helm templates + Kustomize):
672
+ - Source template: `examples/redeploy_iac_parsers/helm_kustomize.py`
673
+ - Quick start:
674
+ 1. `mkdir -p redeploy_iac_parsers`
675
+ 2. `cp examples/redeploy_iac_parsers/helm_kustomize.py redeploy_iac_parsers/`
676
+ 3. `redeploy import path/to/chart/templates/deployment.yaml`
677
+ 4. `redeploy import path/to/kustomization.yaml`
678
+
679
+ Example external plugin (ArgoCD Application + Flux Kustomization):
680
+ - Source template: `examples/redeploy_iac_parsers/argocd_flux.py`
681
+ - Quick start:
682
+ 1. `mkdir -p redeploy_iac_parsers`
683
+ 2. `cp examples/redeploy_iac_parsers/argocd_flux.py redeploy_iac_parsers/`
684
+ 3. `redeploy import path/to/argocd-application.yaml`
685
+ 4. `redeploy import path/to/flux-kustomization.yaml`
686
+
687
+ Example external plugin (GitOps CI for ArgoCD/Flux):
688
+ - Source template: `examples/redeploy_iac_parsers/gitops_ci.py`
689
+ - Quick start:
690
+ 1. `mkdir -p redeploy_iac_parsers`
691
+ 2. `cp examples/redeploy_iac_parsers/gitops_ci.py redeploy_iac_parsers/`
692
+ 3. `redeploy import .github/workflows/deploy-gitops.yml`
693
+ 4. `redeploy import .gitlab-ci.yml`
694
+
640
695
  ## Examples
641
696
 
642
697
  | Directory | Scenario | Strategy |
@@ -656,10 +711,213 @@ redeploy run examples/01-vps-version-bump/migration.yaml --plan-only
656
711
  redeploy run examples/04-rpi-kiosk/migration.yaml --plan-only
657
712
  ```
658
713
 
714
+ ## Self-healing deploy — `redeploy fix`
715
+
716
+ `redeploy fix` is the recommended day-to-day deploy command. It:
717
+ 1. bumps the patch version in `VERSION` + spec header
718
+ 2. applies the migration spec with `--heal` enabled
719
+ 3. if a step fails, calls an LLM (via LiteLLM / OpenRouter) to suggest a fix and retries automatically
720
+
721
+ ```bash
722
+ # Self-healing deploy: bump version → run → LLM retry on failure
723
+ redeploy fix .
724
+ redeploy fix redeploy/pi109/migration.md
725
+
726
+ # With a problem hint for the LLM
727
+ redeploy fix . --hint "service not starting after update"
728
+ redeploy fix . --hint "brak ikon SVG w menu"
729
+
730
+ # Preview only (no apply)
731
+ redeploy fix . --dry-run
732
+
733
+ # Bump minor version instead of patch
734
+ redeploy fix . --minor
735
+
736
+ # Bump major version
737
+ redeploy fix . --major
738
+ redeploy fix . --retries 5
739
+
740
+ # Skip version bump
741
+ redeploy fix . --no-bump
742
+ ```
743
+
744
+ Spec discovery from `.`:
745
+ - `./migration.md` or `./migration.yaml` — direct match
746
+ - `./redeploy/<target>/migration.md` — project pattern (lists targets, asks if multiple)
747
+ - Recursive fallback anywhere under the directory
748
+
749
+ `redeploy fix` automatically discovers migration specs — running from project root
750
+ with multiple targets prompts interactively.
751
+
752
+ ### Version management — `redeploy bump`
753
+
754
+ ```bash
755
+ # Bump patch (default): 1.0.31 → 1.0.32
756
+ redeploy bump .
757
+ redeploy bump redeploy/pi109/migration.md
758
+
759
+ # Bump minor: 1.0.31 → 1.1.0
760
+ redeploy bump . --minor
761
+
762
+ # Bump major: 1.0.31 → 2.0.0
763
+ redeploy bump . --major
764
+ ```
765
+
766
+ Updates `VERSION` file and all version references in the migration spec
767
+ (`version:`, `name: "... vX.Y.Z"`, `description: "... vX.Y.Z"`).
768
+
769
+ ### LLM self-healing on `redeploy run`
770
+
771
+ `redeploy run` also supports `--heal` mode (enabled by default):
772
+
773
+ ```bash
774
+ # Run with LLM self-healing (default)
775
+ redeploy run migration.yaml
776
+
777
+ # Disable healing
778
+ redeploy run migration.yaml --no-heal
779
+
780
+ # Pass problem description to LLM
781
+ redeploy run migration.yaml --fix "nginx port conflict"
782
+
783
+ # Max heal retries
784
+ redeploy run migration.yaml --max-heal-retries 5
785
+ ```
786
+
787
+ LLM reads the failed step output, runs SSH diagnostics, and patches the spec YAML.
788
+ Repairs are logged to `REPAIR_LOG.md` next to the spec.
789
+
790
+ Requires `OPENROUTER_API_KEY` (or `OPENAI_API_KEY`) in `.env` or `~/.redeploy/.env`.
791
+ Model defaults to `openrouter/qwen/qwen3-coder-next` (override with `LLM_MODEL=...`).
792
+
793
+ ---
794
+
795
+ ## Natural language interface — `redeploy prompt`
796
+
797
+ ```bash
798
+ # Map a natural language instruction to a redeploy command
799
+ redeploy prompt "deploy c2004 to pi109"
800
+ redeploy prompt "pokaż plan deployu na pi109"
801
+ redeploy prompt "bump version and redeploy" --yes
802
+ redeploy prompt "what specs are available?" --schema-only
803
+
804
+ # Force dry-run on generated command
805
+ redeploy prompt "run the pi109 migration" --dry-run
806
+
807
+ # Skip confirmation
808
+ redeploy prompt "fix the frontend service" --yes
809
+
810
+ # Preview the workspace schema sent to the LLM
811
+ redeploy prompt "..." --show-schema
812
+ ```
813
+
814
+ The LLM receives a workspace schema (discovered specs, version, git branch, command catalogue)
815
+ and maps the instruction to a concrete `redeploy` invocation.
816
+
817
+ Language is auto-detected — Polish, English, or any language the model supports.
818
+
819
+ ---
820
+
821
+ ## MCP server — `redeploy mcp`
822
+
823
+ redeploy exposes an [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server,
824
+ letting AI assistants (Claude Desktop, VS Code Copilot, custom agents) call redeploy operations
825
+ as structured tools.
826
+
827
+ ### Start
828
+
829
+ ```bash
830
+ # stdio — for Claude Desktop / VS Code local integration
831
+ redeploy mcp
832
+
833
+ # HTTP SSE — for remote/shared access
834
+ redeploy mcp --transport sse --port 8811
835
+
836
+ # Streamable HTTP
837
+ redeploy mcp --transport http --port 8811
838
+
839
+ # Standalone binary (no CLI wrapper)
840
+ redeploy-mcp --transport sse
841
+ ```
842
+
843
+ ### Available MCP tools
844
+
845
+ | Tool | Description |
846
+ |------|-------------|
847
+ | `schema` | Discover workspace: specs, version, git branch, command catalogue |
848
+ | `list_specs` | List all migration specs found in a directory |
849
+ | `plan_spec` | Preview a spec (dry-run) — safe, no changes |
850
+ | `run_spec` | Apply a migration spec |
851
+ | `fix_spec` | Self-healing deploy: bump → apply → LLM retry |
852
+ | `bump_version` | Bump patch/minor/major version |
853
+ | `diagnose` | SSH diagnostics on a remote host |
854
+ | `exec_ssh` | Run an ad-hoc command on a remote host |
855
+ | `nlp_command` | Translate NLP instruction → redeploy command |
856
+
857
+ ### MCP resources
858
+
859
+ | URI | Description |
860
+ |-----|-------------|
861
+ | `redeploy://workspace` | Current workspace schema as JSON |
862
+ | `redeploy://spec/{path}` | Raw content of a migration spec file |
863
+
864
+ ### Claude Desktop integration
865
+
866
+ Add to `~/.config/claude/claude_desktop_config.json`:
867
+
868
+ ```json
869
+ {
870
+ "mcpServers": {
871
+ "redeploy": {
872
+ "command": "redeploy",
873
+ "args": ["mcp"]
874
+ }
875
+ }
876
+ }
877
+ ```
878
+
879
+ ### VS Code Copilot integration
880
+
881
+ Add to `.vscode/mcp.json` in your workspace:
882
+
883
+ ```json
884
+ {
885
+ "servers": {
886
+ "redeploy": {
887
+ "type": "stdio",
888
+ "command": "redeploy",
889
+ "args": ["mcp"]
890
+ }
891
+ }
892
+ }
893
+ ```
894
+
895
+ Or for an SSE server already running on a remote machine:
896
+
897
+ ```json
898
+ {
899
+ "servers": {
900
+ "redeploy-remote": {
901
+ "type": "sse",
902
+ "url": "http://192.168.188.109:8811/sse"
903
+ }
904
+ }
905
+ }
906
+ ```
907
+
908
+ ### Install with MCP dependencies
909
+
910
+ ```bash
911
+ pip install "redeploy[mcp]"
912
+ ```
913
+
914
+ ---
915
+
659
916
  ## Hardware diagnostics commands
660
917
 
661
918
  ### `redeploy hardware HOST [options]`
662
919
 
920
+
663
921
  Probe and diagnose hardware on a remote host (DSI display, DRM connectors, backlight, I2C, config.txt, Wayland compositor).
664
922
 
665
923
  | Option | Description |
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "redeploy"
7
- version = "0.2.49"
7
+ version = "0.2.52"
8
8
  description = "Infrastructure migration toolkit: detect → plan → apply"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -25,6 +25,7 @@ dependencies = [
25
25
 
26
26
  [project.scripts]
27
27
  redeploy = "redeploy.cli:cli"
28
+ redeploy-mcp = "redeploy.mcp_server:serve"
28
29
 
29
30
  [project.optional-dependencies]
30
31
  dev = ["pytest>=8.0", "ruff>=0.4",
@@ -33,6 +34,7 @@ dev = ["pytest>=8.0", "ruff>=0.4",
33
34
  "pfix>=0.1.60",
34
35
  ]
35
36
  op3 = ["op3>=0.1.8"]
37
+ mcp = ["mcp>=1.0"]
36
38
 
37
39
  [tool.ruff]
38
40
  line-length = 100
@@ -7,17 +7,19 @@ Public API (stable from 0.2.0, semver guaranteed)::
7
7
 
8
8
  Everything not listed in ``__all__`` is internal and may change without notice.
9
9
  """
10
- __version__ = "0.2.49"
10
+ __version__ = "0.2.52"
11
11
 
12
12
  # ── Core models ───────────────────────────────────────────────────────────────
13
13
  from .models import ( # noqa: F401
14
14
  ConflictSeverity,
15
15
  DeployStrategy,
16
+ Hook,
16
17
  InfraSpec,
17
18
  InfraState,
18
19
  MigrationPlan,
19
20
  MigrationSpec,
20
21
  MigrationStep,
22
+ PipelinePhase,
21
23
  StepAction,
22
24
  StepStatus,
23
25
  TargetConfig,
@@ -91,11 +93,13 @@ __all__ = [
91
93
  # models
92
94
  "ConflictSeverity",
93
95
  "DeployStrategy",
96
+ "Hook",
94
97
  "InfraSpec",
95
98
  "InfraState",
96
99
  "MigrationPlan",
97
100
  "MigrationSpec",
98
101
  "MigrationStep",
102
+ "PipelinePhase",
99
103
  "StepAction",
100
104
  "StepStatus",
101
105
  "TargetConfig",