redeploy 0.2.38__tar.gz → 0.2.40__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 (171) hide show
  1. {redeploy-0.2.38 → redeploy-0.2.40}/PKG-INFO +6 -6
  2. {redeploy-0.2.38 → redeploy-0.2.40}/README.md +5 -5
  3. {redeploy-0.2.38 → redeploy-0.2.40}/pyproject.toml +1 -1
  4. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/__init__.py +1 -1
  5. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/blueprint.py +2 -2
  6. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/device_map.py +1 -1
  7. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/diagnose.py +1 -1
  8. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/diff.py +1 -1
  9. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/export.py +1 -1
  10. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/hardware.py +16 -5
  11. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy.egg-info/PKG-INFO +6 -6
  12. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/apply/__init__.py +0 -0
  13. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/apply/exceptions.py +0 -0
  14. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/apply/executor.py +0 -0
  15. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/apply/handlers.py +0 -0
  16. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/apply/progress.py +0 -0
  17. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/apply/rollback.py +0 -0
  18. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/apply/state.py +0 -0
  19. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/apply/utils/__init__.py +0 -0
  20. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/apply/utils/run_container_build.py +0 -0
  21. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/audit.py +0 -0
  22. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/blueprint/__init__.py +0 -0
  23. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/blueprint/extractor.py +0 -0
  24. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/blueprint/generators/__init__.py +0 -0
  25. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/blueprint/generators/docker_compose.py +0 -0
  26. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/blueprint/generators/migration.py +0 -0
  27. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/__init__.py +0 -0
  28. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/__init__.py +0 -0
  29. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/audit.py +0 -0
  30. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/detect.py +0 -0
  31. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/devices.py +0 -0
  32. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/exec_.py +0 -0
  33. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/import_.py +0 -0
  34. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/init.py +0 -0
  35. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/inspect.py +0 -0
  36. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/patterns.py +0 -0
  37. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/plan_apply.py +0 -0
  38. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/plugin.py +0 -0
  39. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/probe.py +0 -0
  40. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/state.py +0 -0
  41. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/status.py +0 -0
  42. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/target.py +0 -0
  43. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/version/__init__.py +0 -0
  44. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/version/commands.py +0 -0
  45. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/version/helpers.py +0 -0
  46. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/version/monorepo.py +0 -0
  47. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/version/release.py +0 -0
  48. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/version/scanner.py +0 -0
  49. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/commands/workflow.py +0 -0
  50. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/core.py +0 -0
  51. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli/display.py +0 -0
  52. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/cli.py +0 -0
  53. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/data_sync.py +0 -0
  54. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/detect/__init__.py +0 -0
  55. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/detect/builtin/__init__.py +0 -0
  56. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/detect/detector.py +0 -0
  57. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/detect/hardware.py +0 -0
  58. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/detect/hardware_rules.py +0 -0
  59. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/detect/probes.py +0 -0
  60. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/detect/remote.py +0 -0
  61. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/detect/templates.py +0 -0
  62. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/detect/workflow.py +0 -0
  63. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/discovery.py +0 -0
  64. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/dsl/__init__.py +0 -0
  65. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/dsl/loader.py +0 -0
  66. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/dsl/parser.py +0 -0
  67. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/dsl_python/__init__.py +0 -0
  68. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/dsl_python/context.py +0 -0
  69. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/dsl_python/decorators.py +0 -0
  70. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/dsl_python/docker_steps.py +0 -0
  71. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/dsl_python/exceptions.py +0 -0
  72. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/dsl_python/runner.py +0 -0
  73. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/dsl_python/steps.py +0 -0
  74. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/fleet.py +0 -0
  75. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/hardware/__init__.py +0 -0
  76. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/hardware/config_txt.py +0 -0
  77. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/hardware/data/__init__.py +0 -0
  78. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/hardware/data/hyperpixel.py +0 -0
  79. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/hardware/data/official.py +0 -0
  80. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/hardware/data/waveshare.py +0 -0
  81. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/hardware/fixes.py +0 -0
  82. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/hardware/panels.py +0 -0
  83. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/hardware/raspi_config.py +0 -0
  84. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/iac/__init__.py +0 -0
  85. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/iac/base.py +0 -0
  86. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/iac/docker_compose.py +0 -0
  87. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/iac/parsers/__init__.py +0 -0
  88. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/iac/parsers/compose.py +0 -0
  89. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/iac/registry.py +0 -0
  90. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/markpact/__init__.py +0 -0
  91. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/markpact/compiler.py +0 -0
  92. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/markpact/models.py +0 -0
  93. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/markpact/parser.py +0 -0
  94. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/models.py +0 -0
  95. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/observe.py +0 -0
  96. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/parse.py +0 -0
  97. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/patterns.py +0 -0
  98. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/plan/__init__.py +0 -0
  99. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/plan/planner.py +0 -0
  100. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/plugins/__init__.py +0 -0
  101. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/plugins/builtin/__init__.py +0 -0
  102. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/plugins/builtin/browser_reload.py +0 -0
  103. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/plugins/builtin/hardware_diagnostic.py +0 -0
  104. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/plugins/builtin/notify.py +0 -0
  105. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/plugins/builtin/process_control.py +0 -0
  106. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/plugins/builtin/systemd_reload.py +0 -0
  107. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/spec_loader.py +0 -0
  108. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/ssh.py +0 -0
  109. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/steps.py +0 -0
  110. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/__init__.py +0 -0
  111. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_audit.py +0 -0
  112. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_cli.py +0 -0
  113. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_data_sync.py +0 -0
  114. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_discovery.py +0 -0
  115. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_dsl.py +0 -0
  116. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_examples.py +0 -0
  117. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_executor.py +0 -0
  118. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_fleet.py +0 -0
  119. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_git_integration.py +0 -0
  120. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_iac.py +0 -0
  121. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_manifest.py +0 -0
  122. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_markpact_compiler.py +0 -0
  123. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_markpact_parser.py +0 -0
  124. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_models.py +0 -0
  125. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_observe.py +0 -0
  126. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_parse.py +0 -0
  127. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_patterns.py +0 -0
  128. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_planner_edge.py +0 -0
  129. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_plugins.py +0 -0
  130. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_probes.py +0 -0
  131. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_public_api.py +0 -0
  132. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_resume.py +0 -0
  133. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_spec_loader.py +0 -0
  134. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_ssh.py +0 -0
  135. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_templates.py +0 -0
  136. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_verify.py +0 -0
  137. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_version.py +0 -0
  138. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_version_changelog.py +0 -0
  139. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_version_cli.py +0 -0
  140. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_version_manifest.py +0 -0
  141. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_version_sources.py +0 -0
  142. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/tests/test_workflow.py +0 -0
  143. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/verify.py +0 -0
  144. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/version/__init__.py +0 -0
  145. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/version/bump.py +0 -0
  146. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/version/changelog.py +0 -0
  147. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/version/commits.py +0 -0
  148. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/version/diff.py +0 -0
  149. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/version/git_integration.py +0 -0
  150. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/version/git_transaction.py +0 -0
  151. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/version/manifest.py +0 -0
  152. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/version/sources/__init__.py +0 -0
  153. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/version/sources/base.py +0 -0
  154. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/version/sources/json_.py +0 -0
  155. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/version/sources/plain.py +0 -0
  156. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/version/sources/regex.py +0 -0
  157. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/version/sources/toml_.py +0 -0
  158. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/version/sources/yaml_.py +0 -0
  159. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/version/transaction.py +0 -0
  160. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy/version.py +0 -0
  161. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy.egg-info/SOURCES.txt +0 -0
  162. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy.egg-info/dependency_links.txt +0 -0
  163. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy.egg-info/entry_points.txt +0 -0
  164. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy.egg-info/requires.txt +0 -0
  165. {redeploy-0.2.38 → redeploy-0.2.40}/redeploy.egg-info/top_level.txt +0 -0
  166. {redeploy-0.2.38 → redeploy-0.2.40}/setup.cfg +0 -0
  167. {redeploy-0.2.38 → redeploy-0.2.40}/tests/test_hardware_config.py +0 -0
  168. {redeploy-0.2.38 → redeploy-0.2.40}/tests/test_hardware_rules.py +0 -0
  169. {redeploy-0.2.38 → redeploy-0.2.40}/tests/test_iac.py +0 -0
  170. {redeploy-0.2.38 → redeploy-0.2.40}/tests/test_parse.py +0 -0
  171. {redeploy-0.2.38 → redeploy-0.2.40}/tests/test_redeploy.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: redeploy
3
- Version: 0.2.38
3
+ Version: 0.2.40
4
4
  Summary: Infrastructure migration toolkit: detect → plan → apply
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -27,17 +27,17 @@ Requires-Dist: pfix>=0.1.60; extra == "dev"
27
27
 
28
28
  ## AI Cost Tracking
29
29
 
30
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.38-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
31
- ![AI Cost](https://img.shields.io/badge/AI%20Cost-$7.50-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-19.4h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
30
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.40-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
31
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$7.50-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-19.7h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
32
32
 
33
- - 🤖 **LLM usage:** $7.5000 (59 commits)
34
- - 👤 **Human dev:** ~$1944 (19.4h @ $100/h, 30min dedup)
33
+ - 🤖 **LLM usage:** $7.5000 (61 commits)
34
+ - 👤 **Human dev:** ~$1974 (19.7h @ $100/h, 30min dedup)
35
35
 
36
36
  Generated on 2026-04-21 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
37
37
 
38
38
  ---
39
39
 
40
- ![PyPI](https://img.shields.io/badge/pypi-redeploy-blue) ![Version](https://img.shields.io/badge/version-0.2.38-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
40
+ ![PyPI](https://img.shields.io/badge/pypi-redeploy-blue) ![Version](https://img.shields.io/badge/version-0.2.40-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
41
41
 
42
42
  Infrastructure migration and device deploy toolkit — VPS, Raspberry Pi kiosk, Podman Quadlet, k3s.
43
43
 
@@ -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.38-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-19.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.40-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-19.7h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
8
8
 
9
- - 🤖 **LLM usage:** $7.5000 (59 commits)
10
- - 👤 **Human dev:** ~$1944 (19.4h @ $100/h, 30min dedup)
9
+ - 🤖 **LLM usage:** $7.5000 (61 commits)
10
+ - 👤 **Human dev:** ~$1974 (19.7h @ $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.38-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.40-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
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "redeploy"
7
- version = "0.2.38"
7
+ version = "0.2.40"
8
8
  description = "Infrastructure migration toolkit: detect → plan → apply"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -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.38"
10
+ __version__ = "0.2.40"
11
11
 
12
12
  # ── Core models ───────────────────────────────────────────────────────────────
13
13
  from .models import ( # noqa: F401
@@ -53,7 +53,7 @@ def blueprint_cmd():
53
53
  @click.option("--save", is_flag=True, help="Save to ~/.config/redeploy/blueprints/")
54
54
  @click.option("--out", "out_path", default=None, type=click.Path(),
55
55
  help="Save to specific file instead")
56
- @click.option("--format", "fmt", default="rich", type=click.Choice(["rich", "yaml", "json"]))
56
+ @click.option("--format", "fmt", default="yaml", type=click.Choice(["rich", "yaml", "json"]))
57
57
  @click.option("--tag", "tags", multiple=True)
58
58
  def capture(host, name, compose_files, migration_file, device_map_file,
59
59
  live, save, out_path, fmt, tags):
@@ -180,7 +180,7 @@ def deploy(blueprint_file, target_host, out_path, remote_dir, no_transfer,
180
180
 
181
181
  @blueprint_cmd.command("show")
182
182
  @click.argument("blueprint_file", type=click.Path(exists=True))
183
- @click.option("--format", "fmt", default="rich", type=click.Choice(["rich", "yaml", "json"]))
183
+ @click.option("--format", "fmt", default="yaml", type=click.Choice(["rich", "yaml", "json"]))
184
184
  def show(blueprint_file, fmt):
185
185
  """Display a saved DeviceBlueprint."""
186
186
  from ...models import DeviceBlueprint
@@ -41,7 +41,7 @@ from rich.table import Table
41
41
  @click.option("--out", "out_path", default=None, type=click.Path(), help="Save to specific file")
42
42
  @click.option(
43
43
  "--format", "output_fmt",
44
- default="rich",
44
+ default="yaml",
45
45
  type=click.Choice(["rich", "yaml", "json"]),
46
46
  help="Output format",
47
47
  )
@@ -14,7 +14,7 @@ from rich.table import Table
14
14
  @click.option("--host", default=None, help="Override target host (default: spec.target.host)")
15
15
  @click.option("--ssh-key", default=None, type=click.Path(), help="Path to SSH private key")
16
16
  @click.option(
17
- "--format", "output_fmt", default="rich", type=click.Choice(["rich", "yaml", "json"]), help="Report format"
17
+ "--format", "output_fmt", default="yaml", type=click.Choice(["rich", "yaml", "json"]), help="Report format"
18
18
  )
19
19
  @click.option("--exit-on-fail", is_flag=True, help="Exit with non-zero status if any check fails")
20
20
  @click.pass_context
@@ -20,7 +20,7 @@ from rich.console import Console
20
20
  help="Right side: IaC file/directory or SSH host"
21
21
  )
22
22
  @click.option(
23
- "--format", "out_format", default="text",
23
+ "--format", "out_format", default="json",
24
24
  type=click.Choice(["text", "json"]), show_default=True
25
25
  )
26
26
  def diff(ci_file, host, from_src, to_src, out_format):
@@ -10,7 +10,7 @@ from rich.console import Console
10
10
 
11
11
  @click.command("export")
12
12
  @click.option(
13
- "--format", "fmt", default="css", type=click.Choice(["css", "yaml"]),
13
+ "--format", "fmt", default="yaml", type=click.Choice(["css", "yaml"]),
14
14
  help="Output format (css or yaml)"
15
15
  )
16
16
  @click.option(
@@ -197,14 +197,25 @@ def _apply_fix(console, p, hw, apply_fix_component, panel_id=None):
197
197
  if panel:
198
198
  console.print(f" Panel: {panel.name}")
199
199
 
200
- # Execute steps via Executor (simplified version)
201
- from ...apply.executor import Executor
200
+ # Execute steps via handlers directly
201
+ from ...apply.handlers import run_ssh, run_ensure_config_line, run_raspi_config, run_wait
202
+ from ...models import StepAction
203
+
204
+ _handler_map = {
205
+ StepAction.SSH_CMD: lambda s: run_ssh(s, p),
206
+ StepAction.ENSURE_CONFIG_LINE: lambda s: run_ensure_config_line(s, p),
207
+ StepAction.RASPI_CONFIG: lambda s: run_raspi_config(s, p),
208
+ StepAction.WAIT: lambda s: run_wait(s),
209
+ }
202
210
 
203
- executor = Executor(probe=p, console=console, dry_run=False)
204
211
  for step in steps:
205
212
  console.print(f"[cyan]→ {step.description}[/cyan]")
213
+ handler = _handler_map.get(step.action)
214
+ if handler is None:
215
+ console.print(f"[yellow] ? skip (no handler for {step.action})[/yellow]")
216
+ continue
206
217
  try:
207
- executor._run_single_step(step)
218
+ handler(step)
208
219
  console.print(f"[green] ✓ done[/green]")
209
220
  except Exception as exc:
210
221
  console.print(f"[red] ✗ failed: {exc}[/red]")
@@ -215,7 +226,7 @@ def _apply_fix(console, p, hw, apply_fix_component, panel_id=None):
215
226
  @click.argument("host", required=False, default=None)
216
227
  @click.option(
217
228
  "--format", "output_fmt",
218
- default="rich",
229
+ default="yaml",
219
230
  type=click.Choice(["rich", "yaml", "json"]),
220
231
  help="Output format",
221
232
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: redeploy
3
- Version: 0.2.38
3
+ Version: 0.2.40
4
4
  Summary: Infrastructure migration toolkit: detect → plan → apply
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -27,17 +27,17 @@ Requires-Dist: pfix>=0.1.60; extra == "dev"
27
27
 
28
28
  ## AI Cost Tracking
29
29
 
30
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.38-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
31
- ![AI Cost](https://img.shields.io/badge/AI%20Cost-$7.50-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-19.4h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
30
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.40-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
31
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$7.50-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-19.7h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
32
32
 
33
- - 🤖 **LLM usage:** $7.5000 (59 commits)
34
- - 👤 **Human dev:** ~$1944 (19.4h @ $100/h, 30min dedup)
33
+ - 🤖 **LLM usage:** $7.5000 (61 commits)
34
+ - 👤 **Human dev:** ~$1974 (19.7h @ $100/h, 30min dedup)
35
35
 
36
36
  Generated on 2026-04-21 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
37
37
 
38
38
  ---
39
39
 
40
- ![PyPI](https://img.shields.io/badge/pypi-redeploy-blue) ![Version](https://img.shields.io/badge/version-0.2.38-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
40
+ ![PyPI](https://img.shields.io/badge/pypi-redeploy-blue) ![Version](https://img.shields.io/badge/version-0.2.40-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
41
41
 
42
42
  Infrastructure migration and device deploy toolkit — VPS, Raspberry Pi kiosk, Podman Quadlet, k3s.
43
43
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes