redeploy 0.2.72__tar.gz → 0.2.74__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 (256) hide show
  1. {redeploy-0.2.72/redeploy.egg-info → redeploy-0.2.74}/PKG-INFO +40 -7
  2. redeploy-0.2.72/PKG-INFO → redeploy-0.2.74/README.md +38 -35
  3. {redeploy-0.2.72 → redeploy-0.2.74}/pyproject.toml +3 -1
  4. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/__init__.py +1 -1
  5. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/plan_apply.py +2 -2
  6. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/heal/runner.py +4 -0
  7. redeploy-0.2.72/README.md → redeploy-0.2.74/redeploy.egg-info/PKG-INFO +68 -6
  8. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_hardware_rules.py +3 -1
  9. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/analyze/__init__.py +0 -0
  10. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/analyze/checkers/__init__.py +0 -0
  11. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/analyze/preflight_schema.py +0 -0
  12. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/analyze/spec_analyzer.py +0 -0
  13. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/apply/__init__.py +0 -0
  14. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/apply/exceptions.py +0 -0
  15. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/apply/executor.py +0 -0
  16. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/apply/handlers.py +0 -0
  17. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/apply/progress.py +0 -0
  18. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/apply/rollback.py +0 -0
  19. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/apply/state.py +0 -0
  20. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/apply/state_apply.py +0 -0
  21. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/apply/utils/__init__.py +0 -0
  22. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/apply/utils/run_container_build.py +0 -0
  23. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/audit.py +0 -0
  24. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/blueprint/__init__.py +0 -0
  25. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/blueprint/extractor.py +0 -0
  26. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/blueprint/generators/__init__.py +0 -0
  27. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/blueprint/generators/docker_compose.py +0 -0
  28. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/blueprint/generators/migration.py +0 -0
  29. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/blueprint/sources/__init__.py +0 -0
  30. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/blueprint/sources/compose.py +0 -0
  31. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/blueprint/sources/hardware.py +0 -0
  32. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/blueprint/sources/infra.py +0 -0
  33. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/blueprint/sources/migration.py +0 -0
  34. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/__init__.py +0 -0
  35. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/__init__.py +0 -0
  36. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/audit.py +0 -0
  37. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/blueprint.py +0 -0
  38. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/bump_fix.py +0 -0
  39. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/detect.py +0 -0
  40. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/device_map.py +0 -0
  41. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/device_map_renderers.py +0 -0
  42. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/devices.py +0 -0
  43. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/diagnose.py +0 -0
  44. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/diff.py +0 -0
  45. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/exec_.py +0 -0
  46. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/export.py +0 -0
  47. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/gh_workflow.py +0 -0
  48. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/hardware.py +0 -0
  49. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/import_.py +0 -0
  50. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/init.py +0 -0
  51. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/inspect.py +0 -0
  52. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/lint.py +0 -0
  53. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/mcp_cmd.py +0 -0
  54. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/patterns.py +0 -0
  55. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/plugin.py +0 -0
  56. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/probe.py +0 -0
  57. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/prompt_cmd.py +0 -0
  58. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/push.py +0 -0
  59. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/state.py +0 -0
  60. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/status.py +0 -0
  61. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/target.py +0 -0
  62. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/version/__init__.py +0 -0
  63. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/version/commands.py +0 -0
  64. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/version/helpers.py +0 -0
  65. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/version/monorepo.py +0 -0
  66. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/version/release.py +0 -0
  67. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/version/scanner.py +0 -0
  68. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/version/utils/__init__.py +0 -0
  69. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/version/utils/changelog_config.py +0 -0
  70. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/version/utils/git_config.py +0 -0
  71. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/commands/workflow.py +0 -0
  72. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/core.py +0 -0
  73. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/display.py +0 -0
  74. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli/query.py +0 -0
  75. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/cli.py +0 -0
  76. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/config_apply/__init__.py +0 -0
  77. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/config_apply/applier.py +0 -0
  78. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/config_apply/handlers/__init__.py +0 -0
  79. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/config_apply/handlers/display.py +0 -0
  80. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/config_apply/loader.py +0 -0
  81. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/data_sync.py +0 -0
  82. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/detect/__init__.py +0 -0
  83. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/detect/builtin/__init__.py +0 -0
  84. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/detect/detector.py +0 -0
  85. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/detect/hardware.py +0 -0
  86. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/detect/hardware_rules.py +0 -0
  87. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/detect/probes.py +0 -0
  88. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/detect/remote.py +0 -0
  89. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/detect/templates.py +0 -0
  90. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/detect/workflow.py +0 -0
  91. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/discovery.py +0 -0
  92. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/dsl/__init__.py +0 -0
  93. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/dsl/loader.py +0 -0
  94. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/dsl/parser.py +0 -0
  95. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/dsl_python/__init__.py +0 -0
  96. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/dsl_python/context.py +0 -0
  97. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/dsl_python/decorators.py +0 -0
  98. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/dsl_python/docker_steps.py +0 -0
  99. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/dsl_python/exceptions.py +0 -0
  100. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/dsl_python/runner.py +0 -0
  101. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/dsl_python/steps.py +0 -0
  102. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/fleet.py +0 -0
  103. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/hardware/__init__.py +0 -0
  104. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/hardware/config_txt.py +0 -0
  105. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/hardware/data/__init__.py +0 -0
  106. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/hardware/data/hyperpixel.py +0 -0
  107. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/hardware/data/official.py +0 -0
  108. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/hardware/data/waveshare.py +0 -0
  109. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/hardware/fixes.py +0 -0
  110. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/hardware/kiosk/__init__.py +0 -0
  111. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/hardware/kiosk/autostart.py +0 -0
  112. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/hardware/kiosk/browsers.py +0 -0
  113. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/hardware/kiosk/compositors.py +0 -0
  114. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/hardware/kiosk/output_profiles.py +0 -0
  115. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/hardware/panels.py +0 -0
  116. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/hardware/raspi_config.py +0 -0
  117. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/heal/__init__.py +0 -0
  118. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/heal/decider.py +0 -0
  119. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/heal/hint_provider.py +0 -0
  120. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/heal/log_writer.py +0 -0
  121. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/heal/loop_detector.py +0 -0
  122. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/heal.py +0 -0
  123. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/iac/__init__.py +0 -0
  124. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/iac/base.py +0 -0
  125. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/iac/config_hints.py +0 -0
  126. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/iac/docker_compose.py +0 -0
  127. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/iac/parsers/__init__.py +0 -0
  128. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/iac/parsers/compose.py +0 -0
  129. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/iac/registry.py +0 -0
  130. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/integrations/__init__.py +0 -0
  131. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/integrations/op3_bridge.py +0 -0
  132. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/markpact/__init__.py +0 -0
  133. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/markpact/compiler.py +0 -0
  134. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/markpact/models.py +0 -0
  135. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/markpact/parser.py +0 -0
  136. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/mcp_server.py +0 -0
  137. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/models/__init__.py +0 -0
  138. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/models/blueprint.py +0 -0
  139. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/models/devices.py +0 -0
  140. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/models/enums.py +0 -0
  141. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/models/hardware.py +0 -0
  142. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/models/infra.py +0 -0
  143. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/models/manifest.py +0 -0
  144. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/models/persisted.py +0 -0
  145. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/models/pipeline.py +0 -0
  146. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/models/plan.py +0 -0
  147. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/models/spec.py +0 -0
  148. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/observe.py +0 -0
  149. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/parse.py +0 -0
  150. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/patterns.py +0 -0
  151. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/plan/__init__.py +0 -0
  152. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/plan/planner.py +0 -0
  153. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/plugins/__init__.py +0 -0
  154. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/plugins/builtin/__init__.py +0 -0
  155. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/plugins/builtin/browser_reload.py +0 -0
  156. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/plugins/builtin/hardware_diagnostic.py +0 -0
  157. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/plugins/builtin/notify.py +0 -0
  158. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/plugins/builtin/process_control.py +0 -0
  159. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/plugins/builtin/systemd_reload.py +0 -0
  160. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/schema.py +0 -0
  161. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/spec_loader.py +0 -0
  162. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/ssh.py +0 -0
  163. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/steps/__init__.py +0 -0
  164. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/steps/docker.py +0 -0
  165. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/steps/generic.py +0 -0
  166. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/steps/hardware.py +0 -0
  167. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/steps/k3s.py +0 -0
  168. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/steps/kiosk.py +0 -0
  169. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/steps/podman.py +0 -0
  170. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/steps/process.py +0 -0
  171. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/steps/scm.py +0 -0
  172. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/steps/transfer.py +0 -0
  173. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/__init__.py +0 -0
  174. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_analyze.py +0 -0
  175. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_audit.py +0 -0
  176. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_cli.py +0 -0
  177. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_data_sync.py +0 -0
  178. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_discovery.py +0 -0
  179. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_dsl.py +0 -0
  180. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_examples.py +0 -0
  181. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_executor.py +0 -0
  182. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_fleet.py +0 -0
  183. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_git_integration.py +0 -0
  184. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_heal.py +0 -0
  185. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_heal_decider.py +0 -0
  186. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_hooks.py +0 -0
  187. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_iac.py +0 -0
  188. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_iac_compose_contract.py +0 -0
  189. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_iac_docker_compose_contract.py +0 -0
  190. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_manifest.py +0 -0
  191. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_markpact_compiler.py +0 -0
  192. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_markpact_parser.py +0 -0
  193. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_models.py +0 -0
  194. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_observe.py +0 -0
  195. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_parse.py +0 -0
  196. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_patterns.py +0 -0
  197. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_planner_edge.py +0 -0
  198. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_plugins.py +0 -0
  199. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_probes.py +0 -0
  200. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_public_api.py +0 -0
  201. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_resume.py +0 -0
  202. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_security_hardening.py +0 -0
  203. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_spec_loader.py +0 -0
  204. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_ssh.py +0 -0
  205. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_steps_registry.py +0 -0
  206. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_templates.py +0 -0
  207. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_verify.py +0 -0
  208. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_version.py +0 -0
  209. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_version_changelog.py +0 -0
  210. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_version_cli.py +0 -0
  211. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_version_manifest.py +0 -0
  212. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_version_sources.py +0 -0
  213. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/tests/test_workflow.py +0 -0
  214. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/verify.py +0 -0
  215. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/version/__init__.py +0 -0
  216. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/version/bump.py +0 -0
  217. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/version/changelog.py +0 -0
  218. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/version/commits.py +0 -0
  219. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/version/diff.py +0 -0
  220. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/version/git_integration.py +0 -0
  221. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/version/git_transaction.py +0 -0
  222. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/version/manifest.py +0 -0
  223. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/version/sources/__init__.py +0 -0
  224. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/version/sources/base.py +0 -0
  225. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/version/sources/json_.py +0 -0
  226. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/version/sources/plain.py +0 -0
  227. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/version/sources/regex.py +0 -0
  228. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/version/sources/toml_.py +0 -0
  229. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/version/sources/yaml_.py +0 -0
  230. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/version/transaction.py +0 -0
  231. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy/version.py +0 -0
  232. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy.egg-info/SOURCES.txt +0 -0
  233. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy.egg-info/dependency_links.txt +0 -0
  234. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy.egg-info/entry_points.txt +0 -0
  235. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy.egg-info/requires.txt +0 -0
  236. {redeploy-0.2.72 → redeploy-0.2.74}/redeploy.egg-info/top_level.txt +0 -0
  237. {redeploy-0.2.72 → redeploy-0.2.74}/setup.cfg +0 -0
  238. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_blueprint_sources.py +0 -0
  239. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_blueprint_sources_compose.py +0 -0
  240. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_cli_gh_workflow.py +0 -0
  241. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_cli_query.py +0 -0
  242. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_example_argocd_flux_plugin.py +0 -0
  243. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_example_gitops_ci_plugin.py +0 -0
  244. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_example_helm_kustomize_plugin.py +0 -0
  245. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_hardware_config.py +0 -0
  246. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_hardware_kiosk.py +0 -0
  247. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_heal_decider.py +0 -0
  248. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_heal_loop_detector.py +0 -0
  249. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_iac.py +0 -0
  250. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_iac_config_hints.py +0 -0
  251. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_iac_plugin_loading.py +0 -0
  252. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_import_plugin_template.py +0 -0
  253. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_parse.py +0 -0
  254. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_prompt_llm.py +0 -0
  255. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_redeploy.py +0 -0
  256. {redeploy-0.2.72 → redeploy-0.2.74}/tests/test_steps_kiosk.py +0 -0
@@ -1,7 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: redeploy
3
- Version: 0.2.72
3
+ Version: 0.2.74
4
4
  Summary: Infrastructure migration toolkit: detect → plan → apply
5
+ License: Apache-2.0
5
6
  Requires-Python: >=3.11
6
7
  Description-Content-Type: text/markdown
7
8
  Requires-Dist: pydantic>=2.0
@@ -32,17 +33,17 @@ Requires-Dist: mcp>=1.0; extra == "mcp"
32
33
 
33
34
  ## AI Cost Tracking
34
35
 
35
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.72-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-38.5h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
36
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.74-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
37
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$7.50-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-40.0h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
37
38
 
38
- - 🤖 **LLM usage:** $7.5000 (93 commits)
39
- - 👤 **Human dev:** ~$3848 (38.5h @ $100/h, 30min dedup)
39
+ - 🤖 **LLM usage:** $7.5000 (95 commits)
40
+ - 👤 **Human dev:** ~$3998 (40.0h @ $100/h, 30min dedup)
40
41
 
41
- Generated on 2026-04-24 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
42
+ Generated on 2026-04-30 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
42
43
 
43
44
  ---
44
45
 
45
- ![PyPI](https://img.shields.io/badge/pypi-redeploy-blue) ![Version](https://img.shields.io/badge/version-0.2.72-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
46
+ ![PyPI](https://img.shields.io/badge/pypi-redeploy-blue) ![Version](https://img.shields.io/badge/version-0.2.74-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
46
47
 
47
48
  Infrastructure migration and device deploy toolkit — VPS, Raspberry Pi kiosk, Podman Quadlet, k3s.
48
49
 
@@ -1109,6 +1110,38 @@ redeploy blueprint show blueprint.yaml --apply-config blueprint.yaml
1109
1110
  redeploy blueprint show blueprint.yaml --query "hardware.drm_outputs[0].transform"
1110
1111
  ```
1111
1112
 
1113
+ ## Dependencies
1114
+
1115
+ Core runtime dependencies:
1116
+
1117
+ | Package | Purpose |
1118
+ |---------|---------|
1119
+ | `pydantic>=2.0` | Data validation and settings |
1120
+ | `pyyaml>=6.0` | YAML parsing/serialization |
1121
+ | `markdown-it-py>=3.0` | Markdown parsing (markpact specs) |
1122
+ | `click>=8.0` | CLI framework |
1123
+ | `loguru>=0.7` | Structured logging |
1124
+ | `paramiko>=3.0` | SSH client |
1125
+ | `httpx>=0.25` | HTTP client |
1126
+ | `rich>=13.0` | Terminal UI |
1127
+ | `jmespath>=1.0` | JSON/YAML query expressions |
1128
+ | `goal>=2.1.0` | Goal tracking |
1129
+ | `costs>=0.1.20` | AI cost tracking |
1130
+ | `pfix>=0.1.60` | Self-healing Python |
1131
+
1132
+ Optional dependencies:
1133
+
1134
+ | Package | Purpose |
1135
+ |---------|---------|
1136
+ | `op3>=0.1.8` | OP3 support |
1137
+ | `mcp>=1.0` | MCP server mode |
1138
+
1139
+ ### Internal Modules
1140
+
1141
+ - **`markpact`** — Markdown-native deployment spec format (markpact:config, markpact:steps)
1142
+ - **`goal`** — Migration goal tracking and validation
1143
+ - **`costs`** — AI cost tracking and reporting
1144
+
1112
1145
  ## License
1113
1146
 
1114
1147
  Licensed under Apache-2.0.
@@ -1,48 +1,19 @@
1
- Metadata-Version: 2.4
2
- Name: redeploy
3
- Version: 0.2.72
4
- Summary: Infrastructure migration toolkit: detect → plan → apply
5
- Requires-Python: >=3.11
6
- Description-Content-Type: text/markdown
7
- Requires-Dist: pydantic>=2.0
8
- Requires-Dist: pyyaml>=6.0
9
- Requires-Dist: markdown-it-py>=3.0
10
- Requires-Dist: click>=8.0
11
- Requires-Dist: loguru>=0.7
12
- Requires-Dist: paramiko>=3.0
13
- Requires-Dist: httpx>=0.25
14
- Requires-Dist: rich>=13.0
15
- Requires-Dist: jmespath>=1.0
16
- Requires-Dist: goal>=2.1.0
17
- Requires-Dist: costs>=0.1.20
18
- Requires-Dist: pfix>=0.1.60
19
- Provides-Extra: dev
20
- Requires-Dist: pytest>=8.0; extra == "dev"
21
- Requires-Dist: ruff>=0.4; extra == "dev"
22
- Requires-Dist: goal>=2.1.0; extra == "dev"
23
- Requires-Dist: costs>=0.1.20; extra == "dev"
24
- Requires-Dist: pfix>=0.1.60; extra == "dev"
25
- Provides-Extra: op3
26
- Requires-Dist: op3>=0.1.8; extra == "op3"
27
- Provides-Extra: mcp
28
- Requires-Dist: mcp>=1.0; extra == "mcp"
29
-
30
1
  # redeploy
31
2
 
32
3
 
33
4
  ## AI Cost Tracking
34
5
 
35
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.72-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-38.5h-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.74-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-40.0h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
37
8
 
38
- - 🤖 **LLM usage:** $7.5000 (93 commits)
39
- - 👤 **Human dev:** ~$3848 (38.5h @ $100/h, 30min dedup)
9
+ - 🤖 **LLM usage:** $7.5000 (95 commits)
10
+ - 👤 **Human dev:** ~$3998 (40.0h @ $100/h, 30min dedup)
40
11
 
41
- Generated on 2026-04-24 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
12
+ Generated on 2026-04-30 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
42
13
 
43
14
  ---
44
15
 
45
- ![PyPI](https://img.shields.io/badge/pypi-redeploy-blue) ![Version](https://img.shields.io/badge/version-0.2.72-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.74-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
46
17
 
47
18
  Infrastructure migration and device deploy toolkit — VPS, Raspberry Pi kiosk, Podman Quadlet, k3s.
48
19
 
@@ -1109,6 +1080,38 @@ redeploy blueprint show blueprint.yaml --apply-config blueprint.yaml
1109
1080
  redeploy blueprint show blueprint.yaml --query "hardware.drm_outputs[0].transform"
1110
1081
  ```
1111
1082
 
1083
+ ## Dependencies
1084
+
1085
+ Core runtime dependencies:
1086
+
1087
+ | Package | Purpose |
1088
+ |---------|---------|
1089
+ | `pydantic>=2.0` | Data validation and settings |
1090
+ | `pyyaml>=6.0` | YAML parsing/serialization |
1091
+ | `markdown-it-py>=3.0` | Markdown parsing (markpact specs) |
1092
+ | `click>=8.0` | CLI framework |
1093
+ | `loguru>=0.7` | Structured logging |
1094
+ | `paramiko>=3.0` | SSH client |
1095
+ | `httpx>=0.25` | HTTP client |
1096
+ | `rich>=13.0` | Terminal UI |
1097
+ | `jmespath>=1.0` | JSON/YAML query expressions |
1098
+ | `goal>=2.1.0` | Goal tracking |
1099
+ | `costs>=0.1.20` | AI cost tracking |
1100
+ | `pfix>=0.1.60` | Self-healing Python |
1101
+
1102
+ Optional dependencies:
1103
+
1104
+ | Package | Purpose |
1105
+ |---------|---------|
1106
+ | `op3>=0.1.8` | OP3 support |
1107
+ | `mcp>=1.0` | MCP server mode |
1108
+
1109
+ ### Internal Modules
1110
+
1111
+ - **`markpact`** — Markdown-native deployment spec format (markpact:config, markpact:steps)
1112
+ - **`goal`** — Migration goal tracking and validation
1113
+ - **`costs`** — AI cost tracking and reporting
1114
+
1112
1115
  ## License
1113
1116
 
1114
1117
  Licensed under Apache-2.0.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "redeploy"
7
- version = "0.2.72"
7
+ version = "0.2.74"
8
8
  description = "Infrastructure migration toolkit: detect → plan → apply"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -36,6 +36,8 @@ dev = ["pytest>=8.0", "ruff>=0.4",
36
36
  op3 = ["op3>=0.1.8"]
37
37
  mcp = ["mcp>=1.0"]
38
38
 
39
+ [project.license]
40
+ text = "Apache-2.0"
39
41
  [tool.ruff]
40
42
  line-length = 100
41
43
 
@@ -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.72"
10
+ __version__ = "0.2.74"
11
11
 
12
12
  # ── Core models ───────────────────────────────────────────────────────────────
13
13
  from .models import ( # noqa: F401
@@ -268,8 +268,8 @@ def migrate(ctx, host, app, domain, target, strategy, target_version,
268
268
  )
269
269
  @click.option("--no-state", is_flag=True, help="Disable checkpoint persistence for this run.")
270
270
  @click.option(
271
- "--heal/--no-heal", default=True,
272
- help="Self-healing: on failure, collect diagnostics and ask LLM to fix the spec, then retry (default: on)."
271
+ "--heal/--no-heal", default=False,
272
+ help="Self-healing: on failure, collect diagnostics and ask LLM to fix the spec, then retry (default: off)."
273
273
  )
274
274
  @click.option(
275
275
  "--fix", "fix_hint", default=None, metavar="TEXT",
@@ -140,6 +140,10 @@ class HealRunner:
140
140
  )
141
141
  spec_text = self.spec_path.read_text()
142
142
  log_dir = self.spec_path.parent / ".redeploy" / "logs"
143
+ repair_log_path = self.spec_path.parent / "REPAIR_LOG.md"
144
+ self.console.print(
145
+ f" [dim]logs: {repair_log_path} | LLM logs: {log_dir}[/dim]"
146
+ )
143
147
  llm_response = ask_llm(
144
148
  failed_step, step_output, diag, spec_text,
145
149
  fix_hint=self.fix_hint, log_dir=log_dir,
@@ -1,19 +1,49 @@
1
+ Metadata-Version: 2.4
2
+ Name: redeploy
3
+ Version: 0.2.74
4
+ Summary: Infrastructure migration toolkit: detect → plan → apply
5
+ License: Apache-2.0
6
+ Requires-Python: >=3.11
7
+ Description-Content-Type: text/markdown
8
+ Requires-Dist: pydantic>=2.0
9
+ Requires-Dist: pyyaml>=6.0
10
+ Requires-Dist: markdown-it-py>=3.0
11
+ Requires-Dist: click>=8.0
12
+ Requires-Dist: loguru>=0.7
13
+ Requires-Dist: paramiko>=3.0
14
+ Requires-Dist: httpx>=0.25
15
+ Requires-Dist: rich>=13.0
16
+ Requires-Dist: jmespath>=1.0
17
+ Requires-Dist: goal>=2.1.0
18
+ Requires-Dist: costs>=0.1.20
19
+ Requires-Dist: pfix>=0.1.60
20
+ Provides-Extra: dev
21
+ Requires-Dist: pytest>=8.0; extra == "dev"
22
+ Requires-Dist: ruff>=0.4; extra == "dev"
23
+ Requires-Dist: goal>=2.1.0; extra == "dev"
24
+ Requires-Dist: costs>=0.1.20; extra == "dev"
25
+ Requires-Dist: pfix>=0.1.60; extra == "dev"
26
+ Provides-Extra: op3
27
+ Requires-Dist: op3>=0.1.8; extra == "op3"
28
+ Provides-Extra: mcp
29
+ Requires-Dist: mcp>=1.0; extra == "mcp"
30
+
1
31
  # redeploy
2
32
 
3
33
 
4
34
  ## AI Cost Tracking
5
35
 
6
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.72-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-38.5h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
36
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.74-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
37
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$7.50-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-40.0h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
8
38
 
9
- - 🤖 **LLM usage:** $7.5000 (93 commits)
10
- - 👤 **Human dev:** ~$3848 (38.5h @ $100/h, 30min dedup)
39
+ - 🤖 **LLM usage:** $7.5000 (95 commits)
40
+ - 👤 **Human dev:** ~$3998 (40.0h @ $100/h, 30min dedup)
11
41
 
12
- Generated on 2026-04-24 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
42
+ Generated on 2026-04-30 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
13
43
 
14
44
  ---
15
45
 
16
- ![PyPI](https://img.shields.io/badge/pypi-redeploy-blue) ![Version](https://img.shields.io/badge/version-0.2.72-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
46
+ ![PyPI](https://img.shields.io/badge/pypi-redeploy-blue) ![Version](https://img.shields.io/badge/version-0.2.74-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
17
47
 
18
48
  Infrastructure migration and device deploy toolkit — VPS, Raspberry Pi kiosk, Podman Quadlet, k3s.
19
49
 
@@ -1080,6 +1110,38 @@ redeploy blueprint show blueprint.yaml --apply-config blueprint.yaml
1080
1110
  redeploy blueprint show blueprint.yaml --query "hardware.drm_outputs[0].transform"
1081
1111
  ```
1082
1112
 
1113
+ ## Dependencies
1114
+
1115
+ Core runtime dependencies:
1116
+
1117
+ | Package | Purpose |
1118
+ |---------|---------|
1119
+ | `pydantic>=2.0` | Data validation and settings |
1120
+ | `pyyaml>=6.0` | YAML parsing/serialization |
1121
+ | `markdown-it-py>=3.0` | Markdown parsing (markpact specs) |
1122
+ | `click>=8.0` | CLI framework |
1123
+ | `loguru>=0.7` | Structured logging |
1124
+ | `paramiko>=3.0` | SSH client |
1125
+ | `httpx>=0.25` | HTTP client |
1126
+ | `rich>=13.0` | Terminal UI |
1127
+ | `jmespath>=1.0` | JSON/YAML query expressions |
1128
+ | `goal>=2.1.0` | Goal tracking |
1129
+ | `costs>=0.1.20` | AI cost tracking |
1130
+ | `pfix>=0.1.60` | Self-healing Python |
1131
+
1132
+ Optional dependencies:
1133
+
1134
+ | Package | Purpose |
1135
+ |---------|---------|
1136
+ | `op3>=0.1.8` | OP3 support |
1137
+ | `mcp>=1.0` | MCP server mode |
1138
+
1139
+ ### Internal Modules
1140
+
1141
+ - **`markpact`** — Markdown-native deployment spec format (markpact:config, markpact:steps)
1142
+ - **`goal`** — Migration goal tracking and validation
1143
+ - **`costs`** — AI cost tracking and reporting
1144
+
1083
1145
  ## License
1084
1146
 
1085
1147
  Licensed under Apache-2.0.
@@ -1,7 +1,9 @@
1
1
  """Unit tests for redeploy.detect.hardware_rules."""
2
2
  import pytest
3
3
  from redeploy.models import BacklightInfo, DrmOutput, HardwareInfo, I2CBusInfo
4
- from redeploy.detect.hardware_rules import analyze
4
+ from redeploy.detect.hardware_rules import analyze, _OP3_AVAILABLE
5
+
6
+ pytestmark = pytest.mark.skipif(not _OP3_AVAILABLE, reason="op3 not installed")
5
7
 
6
8
 
7
9
  def _hw(**kwargs) -> HardwareInfo:
File without changes
File without changes
File without changes