redeploy 0.2.48__tar.gz → 0.2.51__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 (210) hide show
  1. {redeploy-0.2.48 → redeploy-0.2.51}/PKG-INFO +229 -6
  2. {redeploy-0.2.48 → redeploy-0.2.51}/README.md +226 -5
  3. {redeploy-0.2.48 → redeploy-0.2.51}/pyproject.toml +3 -1
  4. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/__init__.py +1 -1
  5. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/blueprint/extractor.py +25 -2
  6. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/__init__.py +4 -0
  7. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/bump_fix.py +126 -23
  8. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/hardware.py +10 -34
  9. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/import_.py +8 -2
  10. redeploy-0.2.51/redeploy/cli/commands/mcp_cmd.py +54 -0
  11. redeploy-0.2.51/redeploy/cli/commands/prompt_cmd.py +238 -0
  12. redeploy-0.2.51/redeploy/detect/hardware.py +83 -0
  13. redeploy-0.2.51/redeploy/detect/hardware_rules.py +56 -0
  14. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/iac/__init__.py +7 -2
  15. redeploy-0.2.51/redeploy/iac/config_hints.py +289 -0
  16. redeploy-0.2.51/redeploy/iac/registry.py +107 -0
  17. redeploy-0.2.51/redeploy/integrations/op3_bridge.py +207 -0
  18. redeploy-0.2.51/redeploy/mcp_server.py +314 -0
  19. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/models.py +0 -3
  20. redeploy-0.2.51/redeploy/schema.py +242 -0
  21. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy.egg-info/PKG-INFO +229 -6
  22. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy.egg-info/SOURCES.txt +12 -1
  23. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy.egg-info/entry_points.txt +1 -0
  24. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy.egg-info/requires.txt +3 -0
  25. redeploy-0.2.51/tests/test_blueprint_sources.py +186 -0
  26. redeploy-0.2.51/tests/test_blueprint_sources_compose.py +153 -0
  27. redeploy-0.2.51/tests/test_cli_query.py +79 -0
  28. redeploy-0.2.51/tests/test_iac_config_hints.py +129 -0
  29. redeploy-0.2.51/tests/test_prompt_llm.py +269 -0
  30. redeploy-0.2.51/tests/test_steps_kiosk.py +93 -0
  31. redeploy-0.2.48/redeploy/detect/hardware.py +0 -353
  32. redeploy-0.2.48/redeploy/detect/hardware_rules.py +0 -489
  33. redeploy-0.2.48/redeploy/iac/registry.py +0 -37
  34. redeploy-0.2.48/redeploy/integrations/op3_bridge.py +0 -196
  35. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/apply/__init__.py +0 -0
  36. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/apply/exceptions.py +0 -0
  37. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/apply/executor.py +0 -0
  38. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/apply/handlers.py +0 -0
  39. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/apply/progress.py +0 -0
  40. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/apply/rollback.py +0 -0
  41. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/apply/state.py +0 -0
  42. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/apply/state_apply.py +0 -0
  43. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/apply/utils/__init__.py +0 -0
  44. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/apply/utils/run_container_build.py +0 -0
  45. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/audit.py +0 -0
  46. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/blueprint/__init__.py +0 -0
  47. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/blueprint/generators/__init__.py +0 -0
  48. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/blueprint/generators/docker_compose.py +0 -0
  49. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/blueprint/generators/migration.py +0 -0
  50. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/blueprint/sources/__init__.py +0 -0
  51. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/blueprint/sources/compose.py +0 -0
  52. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/blueprint/sources/hardware.py +0 -0
  53. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/blueprint/sources/infra.py +0 -0
  54. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/blueprint/sources/migration.py +0 -0
  55. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/__init__.py +0 -0
  56. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/audit.py +0 -0
  57. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/blueprint.py +0 -0
  58. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/detect.py +0 -0
  59. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/device_map.py +0 -0
  60. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/device_map_renderers.py +0 -0
  61. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/devices.py +0 -0
  62. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/diagnose.py +0 -0
  63. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/diff.py +0 -0
  64. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/exec_.py +0 -0
  65. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/export.py +0 -0
  66. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/init.py +0 -0
  67. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/inspect.py +0 -0
  68. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/patterns.py +0 -0
  69. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/plan_apply.py +0 -0
  70. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/plugin.py +0 -0
  71. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/probe.py +0 -0
  72. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/push.py +0 -0
  73. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/state.py +0 -0
  74. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/status.py +0 -0
  75. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/target.py +0 -0
  76. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/version/__init__.py +0 -0
  77. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/version/commands.py +0 -0
  78. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/version/helpers.py +0 -0
  79. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/version/monorepo.py +0 -0
  80. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/version/release.py +0 -0
  81. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/version/scanner.py +0 -0
  82. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/commands/workflow.py +0 -0
  83. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/core.py +0 -0
  84. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/display.py +0 -0
  85. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli/query.py +0 -0
  86. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/cli.py +0 -0
  87. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/config_apply/__init__.py +0 -0
  88. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/config_apply/applier.py +0 -0
  89. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/config_apply/loader.py +0 -0
  90. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/data_sync.py +0 -0
  91. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/detect/__init__.py +0 -0
  92. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/detect/builtin/__init__.py +0 -0
  93. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/detect/detector.py +0 -0
  94. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/detect/probes.py +0 -0
  95. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/detect/remote.py +0 -0
  96. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/detect/templates.py +0 -0
  97. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/detect/workflow.py +0 -0
  98. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/discovery.py +0 -0
  99. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/dsl/__init__.py +0 -0
  100. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/dsl/loader.py +0 -0
  101. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/dsl/parser.py +0 -0
  102. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/dsl_python/__init__.py +0 -0
  103. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/dsl_python/context.py +0 -0
  104. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/dsl_python/decorators.py +0 -0
  105. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/dsl_python/docker_steps.py +0 -0
  106. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/dsl_python/exceptions.py +0 -0
  107. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/dsl_python/runner.py +0 -0
  108. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/dsl_python/steps.py +0 -0
  109. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/fleet.py +0 -0
  110. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/hardware/__init__.py +0 -0
  111. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/hardware/config_txt.py +0 -0
  112. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/hardware/data/__init__.py +0 -0
  113. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/hardware/data/hyperpixel.py +0 -0
  114. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/hardware/data/official.py +0 -0
  115. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/hardware/data/waveshare.py +0 -0
  116. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/hardware/fixes.py +0 -0
  117. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/hardware/kiosk/__init__.py +0 -0
  118. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/hardware/kiosk/autostart.py +0 -0
  119. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/hardware/kiosk/browsers.py +0 -0
  120. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/hardware/kiosk/compositors.py +0 -0
  121. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/hardware/kiosk/output_profiles.py +0 -0
  122. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/hardware/panels.py +0 -0
  123. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/hardware/raspi_config.py +0 -0
  124. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/heal.py +0 -0
  125. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/iac/base.py +0 -0
  126. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/iac/docker_compose.py +0 -0
  127. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/iac/parsers/__init__.py +0 -0
  128. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/iac/parsers/compose.py +0 -0
  129. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/integrations/__init__.py +0 -0
  130. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/markpact/__init__.py +0 -0
  131. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/markpact/compiler.py +0 -0
  132. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/markpact/models.py +0 -0
  133. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/markpact/parser.py +0 -0
  134. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/observe.py +0 -0
  135. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/parse.py +0 -0
  136. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/patterns.py +0 -0
  137. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/plan/__init__.py +0 -0
  138. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/plan/planner.py +0 -0
  139. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/plugins/__init__.py +0 -0
  140. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/plugins/builtin/__init__.py +0 -0
  141. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/plugins/builtin/browser_reload.py +0 -0
  142. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/plugins/builtin/hardware_diagnostic.py +0 -0
  143. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/plugins/builtin/notify.py +0 -0
  144. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/plugins/builtin/process_control.py +0 -0
  145. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/plugins/builtin/systemd_reload.py +0 -0
  146. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/spec_loader.py +0 -0
  147. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/ssh.py +0 -0
  148. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/steps/__init__.py +0 -0
  149. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/steps/builtins.py +0 -0
  150. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/steps/kiosk.py +0 -0
  151. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/__init__.py +0 -0
  152. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_audit.py +0 -0
  153. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_cli.py +0 -0
  154. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_data_sync.py +0 -0
  155. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_discovery.py +0 -0
  156. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_dsl.py +0 -0
  157. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_examples.py +0 -0
  158. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_executor.py +0 -0
  159. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_fleet.py +0 -0
  160. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_git_integration.py +0 -0
  161. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_iac.py +0 -0
  162. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_manifest.py +0 -0
  163. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_markpact_compiler.py +0 -0
  164. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_markpact_parser.py +0 -0
  165. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_models.py +0 -0
  166. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_observe.py +0 -0
  167. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_parse.py +0 -0
  168. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_patterns.py +0 -0
  169. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_planner_edge.py +0 -0
  170. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_plugins.py +0 -0
  171. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_probes.py +0 -0
  172. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_public_api.py +0 -0
  173. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_resume.py +0 -0
  174. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_spec_loader.py +0 -0
  175. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_ssh.py +0 -0
  176. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_templates.py +0 -0
  177. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_verify.py +0 -0
  178. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_version.py +0 -0
  179. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_version_changelog.py +0 -0
  180. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_version_cli.py +0 -0
  181. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_version_manifest.py +0 -0
  182. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_version_sources.py +0 -0
  183. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/tests/test_workflow.py +0 -0
  184. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/verify.py +0 -0
  185. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/version/__init__.py +0 -0
  186. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/version/bump.py +0 -0
  187. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/version/changelog.py +0 -0
  188. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/version/commits.py +0 -0
  189. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/version/diff.py +0 -0
  190. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/version/git_integration.py +0 -0
  191. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/version/git_transaction.py +0 -0
  192. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/version/manifest.py +0 -0
  193. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/version/sources/__init__.py +0 -0
  194. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/version/sources/base.py +0 -0
  195. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/version/sources/json_.py +0 -0
  196. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/version/sources/plain.py +0 -0
  197. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/version/sources/regex.py +0 -0
  198. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/version/sources/toml_.py +0 -0
  199. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/version/sources/yaml_.py +0 -0
  200. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/version/transaction.py +0 -0
  201. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy/version.py +0 -0
  202. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy.egg-info/dependency_links.txt +0 -0
  203. {redeploy-0.2.48 → redeploy-0.2.51}/redeploy.egg-info/top_level.txt +0 -0
  204. {redeploy-0.2.48 → redeploy-0.2.51}/setup.cfg +0 -0
  205. {redeploy-0.2.48 → redeploy-0.2.51}/tests/test_hardware_config.py +0 -0
  206. {redeploy-0.2.48 → redeploy-0.2.51}/tests/test_hardware_kiosk.py +0 -0
  207. {redeploy-0.2.48 → redeploy-0.2.51}/tests/test_hardware_rules.py +0 -0
  208. {redeploy-0.2.48 → redeploy-0.2.51}/tests/test_iac.py +0 -0
  209. {redeploy-0.2.48 → redeploy-0.2.51}/tests/test_parse.py +0 -0
  210. {redeploy-0.2.48 → redeploy-0.2.51}/tests/test_redeploy.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: redeploy
3
- Version: 0.2.48
3
+ Version: 0.2.51
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.48-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.4h-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.51-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-25.0h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
35
37
 
36
- - 🤖 **LLM usage:** $7.5000 (69 commits)
37
- - 👤 **Human dev:** ~$2440 (24.4h @ $100/h, 30min dedup)
38
+ - 🤖 **LLM usage:** $7.5000 (71 commits)
39
+ - 👤 **Human dev:** ~$2496 (25.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.48-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.51-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,20 @@ 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
+
667
687
  ## Examples
668
688
 
669
689
  | Directory | Scenario | Strategy |
@@ -683,10 +703,213 @@ redeploy run examples/01-vps-version-bump/migration.yaml --plan-only
683
703
  redeploy run examples/04-rpi-kiosk/migration.yaml --plan-only
684
704
  ```
685
705
 
706
+ ## Self-healing deploy — `redeploy fix`
707
+
708
+ `redeploy fix` is the recommended day-to-day deploy command. It:
709
+ 1. bumps the patch version in `VERSION` + spec header
710
+ 2. applies the migration spec with `--heal` enabled
711
+ 3. if a step fails, calls an LLM (via LiteLLM / OpenRouter) to suggest a fix and retries automatically
712
+
713
+ ```bash
714
+ # Self-healing deploy: bump version → run → LLM retry on failure
715
+ redeploy fix .
716
+ redeploy fix redeploy/pi109/migration.md
717
+
718
+ # With a problem hint for the LLM
719
+ redeploy fix . --hint "service not starting after update"
720
+ redeploy fix . --hint "brak ikon SVG w menu"
721
+
722
+ # Preview only (no apply)
723
+ redeploy fix . --dry-run
724
+
725
+ # Bump minor version instead of patch
726
+ redeploy fix . --minor
727
+
728
+ # Bump major version
729
+ redeploy fix . --major
730
+ redeploy fix . --retries 5
731
+
732
+ # Skip version bump
733
+ redeploy fix . --no-bump
734
+ ```
735
+
736
+ Spec discovery from `.`:
737
+ - `./migration.md` or `./migration.yaml` — direct match
738
+ - `./redeploy/<target>/migration.md` — project pattern (lists targets, asks if multiple)
739
+ - Recursive fallback anywhere under the directory
740
+
741
+ `redeploy fix` automatically discovers migration specs — running from project root
742
+ with multiple targets prompts interactively.
743
+
744
+ ### Version management — `redeploy bump`
745
+
746
+ ```bash
747
+ # Bump patch (default): 1.0.31 → 1.0.32
748
+ redeploy bump .
749
+ redeploy bump redeploy/pi109/migration.md
750
+
751
+ # Bump minor: 1.0.31 → 1.1.0
752
+ redeploy bump . --minor
753
+
754
+ # Bump major: 1.0.31 → 2.0.0
755
+ redeploy bump . --major
756
+ ```
757
+
758
+ Updates `VERSION` file and all version references in the migration spec
759
+ (`version:`, `name: "... vX.Y.Z"`, `description: "... vX.Y.Z"`).
760
+
761
+ ### LLM self-healing on `redeploy run`
762
+
763
+ `redeploy run` also supports `--heal` mode (enabled by default):
764
+
765
+ ```bash
766
+ # Run with LLM self-healing (default)
767
+ redeploy run migration.yaml
768
+
769
+ # Disable healing
770
+ redeploy run migration.yaml --no-heal
771
+
772
+ # Pass problem description to LLM
773
+ redeploy run migration.yaml --fix "nginx port conflict"
774
+
775
+ # Max heal retries
776
+ redeploy run migration.yaml --max-heal-retries 5
777
+ ```
778
+
779
+ LLM reads the failed step output, runs SSH diagnostics, and patches the spec YAML.
780
+ Repairs are logged to `REPAIR_LOG.md` next to the spec.
781
+
782
+ Requires `OPENROUTER_API_KEY` (or `OPENAI_API_KEY`) in `.env` or `~/.redeploy/.env`.
783
+ Model defaults to `openrouter/qwen/qwen3-coder-next` (override with `LLM_MODEL=...`).
784
+
785
+ ---
786
+
787
+ ## Natural language interface — `redeploy prompt`
788
+
789
+ ```bash
790
+ # Map a natural language instruction to a redeploy command
791
+ redeploy prompt "deploy c2004 to pi109"
792
+ redeploy prompt "pokaż plan deployu na pi109"
793
+ redeploy prompt "bump version and redeploy" --yes
794
+ redeploy prompt "what specs are available?" --schema-only
795
+
796
+ # Force dry-run on generated command
797
+ redeploy prompt "run the pi109 migration" --dry-run
798
+
799
+ # Skip confirmation
800
+ redeploy prompt "fix the frontend service" --yes
801
+
802
+ # Preview the workspace schema sent to the LLM
803
+ redeploy prompt "..." --show-schema
804
+ ```
805
+
806
+ The LLM receives a workspace schema (discovered specs, version, git branch, command catalogue)
807
+ and maps the instruction to a concrete `redeploy` invocation.
808
+
809
+ Language is auto-detected — Polish, English, or any language the model supports.
810
+
811
+ ---
812
+
813
+ ## MCP server — `redeploy mcp`
814
+
815
+ redeploy exposes an [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server,
816
+ letting AI assistants (Claude Desktop, VS Code Copilot, custom agents) call redeploy operations
817
+ as structured tools.
818
+
819
+ ### Start
820
+
821
+ ```bash
822
+ # stdio — for Claude Desktop / VS Code local integration
823
+ redeploy mcp
824
+
825
+ # HTTP SSE — for remote/shared access
826
+ redeploy mcp --transport sse --port 8811
827
+
828
+ # Streamable HTTP
829
+ redeploy mcp --transport http --port 8811
830
+
831
+ # Standalone binary (no CLI wrapper)
832
+ redeploy-mcp --transport sse
833
+ ```
834
+
835
+ ### Available MCP tools
836
+
837
+ | Tool | Description |
838
+ |------|-------------|
839
+ | `schema` | Discover workspace: specs, version, git branch, command catalogue |
840
+ | `list_specs` | List all migration specs found in a directory |
841
+ | `plan_spec` | Preview a spec (dry-run) — safe, no changes |
842
+ | `run_spec` | Apply a migration spec |
843
+ | `fix_spec` | Self-healing deploy: bump → apply → LLM retry |
844
+ | `bump_version` | Bump patch/minor/major version |
845
+ | `diagnose` | SSH diagnostics on a remote host |
846
+ | `exec_ssh` | Run an ad-hoc command on a remote host |
847
+ | `nlp_command` | Translate NLP instruction → redeploy command |
848
+
849
+ ### MCP resources
850
+
851
+ | URI | Description |
852
+ |-----|-------------|
853
+ | `redeploy://workspace` | Current workspace schema as JSON |
854
+ | `redeploy://spec/{path}` | Raw content of a migration spec file |
855
+
856
+ ### Claude Desktop integration
857
+
858
+ Add to `~/.config/claude/claude_desktop_config.json`:
859
+
860
+ ```json
861
+ {
862
+ "mcpServers": {
863
+ "redeploy": {
864
+ "command": "redeploy",
865
+ "args": ["mcp"]
866
+ }
867
+ }
868
+ }
869
+ ```
870
+
871
+ ### VS Code Copilot integration
872
+
873
+ Add to `.vscode/mcp.json` in your workspace:
874
+
875
+ ```json
876
+ {
877
+ "servers": {
878
+ "redeploy": {
879
+ "type": "stdio",
880
+ "command": "redeploy",
881
+ "args": ["mcp"]
882
+ }
883
+ }
884
+ }
885
+ ```
886
+
887
+ Or for an SSE server already running on a remote machine:
888
+
889
+ ```json
890
+ {
891
+ "servers": {
892
+ "redeploy-remote": {
893
+ "type": "sse",
894
+ "url": "http://192.168.188.109:8811/sse"
895
+ }
896
+ }
897
+ }
898
+ ```
899
+
900
+ ### Install with MCP dependencies
901
+
902
+ ```bash
903
+ pip install "redeploy[mcp]"
904
+ ```
905
+
906
+ ---
907
+
686
908
  ## Hardware diagnostics commands
687
909
 
688
910
  ### `redeploy hardware HOST [options]`
689
911
 
912
+
690
913
  Probe and diagnose hardware on a remote host (DSI display, DRM connectors, backlight, I2C, config.txt, Wayland compositor).
691
914
 
692
915
  | 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.48-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.4h-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.51-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-25.0h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
8
8
 
9
- - 🤖 **LLM usage:** $7.5000 (69 commits)
10
- - 👤 **Human dev:** ~$2440 (24.4h @ $100/h, 30min dedup)
9
+ - 🤖 **LLM usage:** $7.5000 (71 commits)
10
+ - 👤 **Human dev:** ~$2496 (25.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.48-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.51-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,20 @@ 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
+
640
658
  ## Examples
641
659
 
642
660
  | Directory | Scenario | Strategy |
@@ -656,10 +674,213 @@ redeploy run examples/01-vps-version-bump/migration.yaml --plan-only
656
674
  redeploy run examples/04-rpi-kiosk/migration.yaml --plan-only
657
675
  ```
658
676
 
677
+ ## Self-healing deploy — `redeploy fix`
678
+
679
+ `redeploy fix` is the recommended day-to-day deploy command. It:
680
+ 1. bumps the patch version in `VERSION` + spec header
681
+ 2. applies the migration spec with `--heal` enabled
682
+ 3. if a step fails, calls an LLM (via LiteLLM / OpenRouter) to suggest a fix and retries automatically
683
+
684
+ ```bash
685
+ # Self-healing deploy: bump version → run → LLM retry on failure
686
+ redeploy fix .
687
+ redeploy fix redeploy/pi109/migration.md
688
+
689
+ # With a problem hint for the LLM
690
+ redeploy fix . --hint "service not starting after update"
691
+ redeploy fix . --hint "brak ikon SVG w menu"
692
+
693
+ # Preview only (no apply)
694
+ redeploy fix . --dry-run
695
+
696
+ # Bump minor version instead of patch
697
+ redeploy fix . --minor
698
+
699
+ # Bump major version
700
+ redeploy fix . --major
701
+ redeploy fix . --retries 5
702
+
703
+ # Skip version bump
704
+ redeploy fix . --no-bump
705
+ ```
706
+
707
+ Spec discovery from `.`:
708
+ - `./migration.md` or `./migration.yaml` — direct match
709
+ - `./redeploy/<target>/migration.md` — project pattern (lists targets, asks if multiple)
710
+ - Recursive fallback anywhere under the directory
711
+
712
+ `redeploy fix` automatically discovers migration specs — running from project root
713
+ with multiple targets prompts interactively.
714
+
715
+ ### Version management — `redeploy bump`
716
+
717
+ ```bash
718
+ # Bump patch (default): 1.0.31 → 1.0.32
719
+ redeploy bump .
720
+ redeploy bump redeploy/pi109/migration.md
721
+
722
+ # Bump minor: 1.0.31 → 1.1.0
723
+ redeploy bump . --minor
724
+
725
+ # Bump major: 1.0.31 → 2.0.0
726
+ redeploy bump . --major
727
+ ```
728
+
729
+ Updates `VERSION` file and all version references in the migration spec
730
+ (`version:`, `name: "... vX.Y.Z"`, `description: "... vX.Y.Z"`).
731
+
732
+ ### LLM self-healing on `redeploy run`
733
+
734
+ `redeploy run` also supports `--heal` mode (enabled by default):
735
+
736
+ ```bash
737
+ # Run with LLM self-healing (default)
738
+ redeploy run migration.yaml
739
+
740
+ # Disable healing
741
+ redeploy run migration.yaml --no-heal
742
+
743
+ # Pass problem description to LLM
744
+ redeploy run migration.yaml --fix "nginx port conflict"
745
+
746
+ # Max heal retries
747
+ redeploy run migration.yaml --max-heal-retries 5
748
+ ```
749
+
750
+ LLM reads the failed step output, runs SSH diagnostics, and patches the spec YAML.
751
+ Repairs are logged to `REPAIR_LOG.md` next to the spec.
752
+
753
+ Requires `OPENROUTER_API_KEY` (or `OPENAI_API_KEY`) in `.env` or `~/.redeploy/.env`.
754
+ Model defaults to `openrouter/qwen/qwen3-coder-next` (override with `LLM_MODEL=...`).
755
+
756
+ ---
757
+
758
+ ## Natural language interface — `redeploy prompt`
759
+
760
+ ```bash
761
+ # Map a natural language instruction to a redeploy command
762
+ redeploy prompt "deploy c2004 to pi109"
763
+ redeploy prompt "pokaż plan deployu na pi109"
764
+ redeploy prompt "bump version and redeploy" --yes
765
+ redeploy prompt "what specs are available?" --schema-only
766
+
767
+ # Force dry-run on generated command
768
+ redeploy prompt "run the pi109 migration" --dry-run
769
+
770
+ # Skip confirmation
771
+ redeploy prompt "fix the frontend service" --yes
772
+
773
+ # Preview the workspace schema sent to the LLM
774
+ redeploy prompt "..." --show-schema
775
+ ```
776
+
777
+ The LLM receives a workspace schema (discovered specs, version, git branch, command catalogue)
778
+ and maps the instruction to a concrete `redeploy` invocation.
779
+
780
+ Language is auto-detected — Polish, English, or any language the model supports.
781
+
782
+ ---
783
+
784
+ ## MCP server — `redeploy mcp`
785
+
786
+ redeploy exposes an [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server,
787
+ letting AI assistants (Claude Desktop, VS Code Copilot, custom agents) call redeploy operations
788
+ as structured tools.
789
+
790
+ ### Start
791
+
792
+ ```bash
793
+ # stdio — for Claude Desktop / VS Code local integration
794
+ redeploy mcp
795
+
796
+ # HTTP SSE — for remote/shared access
797
+ redeploy mcp --transport sse --port 8811
798
+
799
+ # Streamable HTTP
800
+ redeploy mcp --transport http --port 8811
801
+
802
+ # Standalone binary (no CLI wrapper)
803
+ redeploy-mcp --transport sse
804
+ ```
805
+
806
+ ### Available MCP tools
807
+
808
+ | Tool | Description |
809
+ |------|-------------|
810
+ | `schema` | Discover workspace: specs, version, git branch, command catalogue |
811
+ | `list_specs` | List all migration specs found in a directory |
812
+ | `plan_spec` | Preview a spec (dry-run) — safe, no changes |
813
+ | `run_spec` | Apply a migration spec |
814
+ | `fix_spec` | Self-healing deploy: bump → apply → LLM retry |
815
+ | `bump_version` | Bump patch/minor/major version |
816
+ | `diagnose` | SSH diagnostics on a remote host |
817
+ | `exec_ssh` | Run an ad-hoc command on a remote host |
818
+ | `nlp_command` | Translate NLP instruction → redeploy command |
819
+
820
+ ### MCP resources
821
+
822
+ | URI | Description |
823
+ |-----|-------------|
824
+ | `redeploy://workspace` | Current workspace schema as JSON |
825
+ | `redeploy://spec/{path}` | Raw content of a migration spec file |
826
+
827
+ ### Claude Desktop integration
828
+
829
+ Add to `~/.config/claude/claude_desktop_config.json`:
830
+
831
+ ```json
832
+ {
833
+ "mcpServers": {
834
+ "redeploy": {
835
+ "command": "redeploy",
836
+ "args": ["mcp"]
837
+ }
838
+ }
839
+ }
840
+ ```
841
+
842
+ ### VS Code Copilot integration
843
+
844
+ Add to `.vscode/mcp.json` in your workspace:
845
+
846
+ ```json
847
+ {
848
+ "servers": {
849
+ "redeploy": {
850
+ "type": "stdio",
851
+ "command": "redeploy",
852
+ "args": ["mcp"]
853
+ }
854
+ }
855
+ }
856
+ ```
857
+
858
+ Or for an SSE server already running on a remote machine:
859
+
860
+ ```json
861
+ {
862
+ "servers": {
863
+ "redeploy-remote": {
864
+ "type": "sse",
865
+ "url": "http://192.168.188.109:8811/sse"
866
+ }
867
+ }
868
+ }
869
+ ```
870
+
871
+ ### Install with MCP dependencies
872
+
873
+ ```bash
874
+ pip install "redeploy[mcp]"
875
+ ```
876
+
877
+ ---
878
+
659
879
  ## Hardware diagnostics commands
660
880
 
661
881
  ### `redeploy hardware HOST [options]`
662
882
 
883
+
663
884
  Probe and diagnose hardware on a remote host (DSI display, DRM connectors, backlight, I2C, config.txt, Wayland compositor).
664
885
 
665
886
  | Option | Description |
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "redeploy"
7
- version = "0.2.48"
7
+ version = "0.2.51"
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,7 +7,7 @@ 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.48"
10
+ __version__ = "0.2.51"
11
11
 
12
12
  # ── Core models ───────────────────────────────────────────────────────────────
13
13
  from .models import ( # noqa: F401
@@ -60,8 +60,31 @@ def extract_blueprint(
60
60
  SSH target used when ``detect_live=True``.
61
61
  """
62
62
  if detect_live and host and not infra:
63
- from ..detect import Detector
64
- infra = infra or Detector(host).run()
63
+ from ..integrations.op3_bridge import should_use_op3
64
+ if should_use_op3():
65
+ from ..integrations.op3_bridge import (
66
+ make_scanner,
67
+ make_ssh_context,
68
+ snapshot_to_device_map,
69
+ )
70
+ scanner = make_scanner(
71
+ [
72
+ "physical.display",
73
+ "os.kernel",
74
+ "os.config",
75
+ "runtime.container",
76
+ "service.containers",
77
+ "endpoint.http",
78
+ "business.health",
79
+ ]
80
+ )
81
+ ctx = make_ssh_context(target=host)
82
+ snapshot = scanner.scan(host, ctx.execute)
83
+ device_map = snapshot_to_device_map(snapshot, host=host, tags=tags)
84
+ infra = device_map.infra
85
+ else:
86
+ from ..detect import Detector
87
+ infra = infra or Detector(host).run()
65
88
 
66
89
  from .sources.compose import merge_compose_files
67
90
  from .sources.hardware import build_hw_requirements
@@ -55,6 +55,8 @@ from .commands.blueprint import blueprint_cmd
55
55
  from .commands.init import init
56
56
  from .commands.status import status
57
57
  from .commands.bump_fix import bump_cmd, fix_cmd
58
+ from .commands.prompt_cmd import prompt_cmd
59
+ from .commands.mcp_cmd import mcp_cmd
58
60
 
59
61
  # Register commands
60
62
  cli.add_command(audit)
@@ -89,6 +91,8 @@ cli.add_command(version_cmd)
89
91
  cli.add_command(workflow_cmd)
90
92
  cli.add_command(bump_cmd, name="bump")
91
93
  cli.add_command(fix_cmd, name="fix")
94
+ cli.add_command(prompt_cmd, name="prompt")
95
+ cli.add_command(mcp_cmd, name="mcp")
92
96
 
93
97
 
94
98
  # Backward compatibility: _resolve_device for tests