redeploy 0.2.71__tar.gz → 0.2.73__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.71 → redeploy-0.2.73}/PKG-INFO +39 -7
  2. {redeploy-0.2.71 → redeploy-0.2.73}/README.md +38 -6
  3. {redeploy-0.2.71 → redeploy-0.2.73}/pyproject.toml +1 -1
  4. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/__init__.py +1 -1
  5. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/analyze/preflight_schema.py +9 -15
  6. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/analyze/spec_analyzer.py +2 -5
  7. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/exec_.py +3 -7
  8. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy.egg-info/PKG-INFO +39 -7
  9. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/analyze/__init__.py +0 -0
  10. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/analyze/checkers/__init__.py +0 -0
  11. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/apply/__init__.py +0 -0
  12. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/apply/exceptions.py +0 -0
  13. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/apply/executor.py +0 -0
  14. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/apply/handlers.py +0 -0
  15. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/apply/progress.py +0 -0
  16. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/apply/rollback.py +0 -0
  17. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/apply/state.py +0 -0
  18. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/apply/state_apply.py +0 -0
  19. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/apply/utils/__init__.py +0 -0
  20. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/apply/utils/run_container_build.py +0 -0
  21. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/audit.py +0 -0
  22. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/blueprint/__init__.py +0 -0
  23. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/blueprint/extractor.py +0 -0
  24. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/blueprint/generators/__init__.py +0 -0
  25. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/blueprint/generators/docker_compose.py +0 -0
  26. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/blueprint/generators/migration.py +0 -0
  27. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/blueprint/sources/__init__.py +0 -0
  28. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/blueprint/sources/compose.py +0 -0
  29. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/blueprint/sources/hardware.py +0 -0
  30. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/blueprint/sources/infra.py +0 -0
  31. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/blueprint/sources/migration.py +0 -0
  32. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/__init__.py +0 -0
  33. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/__init__.py +0 -0
  34. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/audit.py +0 -0
  35. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/blueprint.py +0 -0
  36. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/bump_fix.py +0 -0
  37. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/detect.py +0 -0
  38. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/device_map.py +0 -0
  39. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/device_map_renderers.py +0 -0
  40. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/devices.py +0 -0
  41. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/diagnose.py +0 -0
  42. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/diff.py +0 -0
  43. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/export.py +0 -0
  44. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/gh_workflow.py +0 -0
  45. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/hardware.py +0 -0
  46. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/import_.py +0 -0
  47. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/init.py +0 -0
  48. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/inspect.py +0 -0
  49. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/lint.py +0 -0
  50. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/mcp_cmd.py +0 -0
  51. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/patterns.py +0 -0
  52. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/plan_apply.py +0 -0
  53. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/plugin.py +0 -0
  54. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/probe.py +0 -0
  55. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/prompt_cmd.py +0 -0
  56. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/push.py +0 -0
  57. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/state.py +0 -0
  58. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/status.py +0 -0
  59. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/target.py +0 -0
  60. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/version/__init__.py +0 -0
  61. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/version/commands.py +0 -0
  62. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/version/helpers.py +0 -0
  63. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/version/monorepo.py +0 -0
  64. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/version/release.py +0 -0
  65. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/version/scanner.py +0 -0
  66. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/version/utils/__init__.py +0 -0
  67. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/version/utils/changelog_config.py +0 -0
  68. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/version/utils/git_config.py +0 -0
  69. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/commands/workflow.py +0 -0
  70. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/core.py +0 -0
  71. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/display.py +0 -0
  72. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli/query.py +0 -0
  73. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/cli.py +0 -0
  74. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/config_apply/__init__.py +0 -0
  75. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/config_apply/applier.py +0 -0
  76. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/config_apply/handlers/__init__.py +0 -0
  77. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/config_apply/handlers/display.py +0 -0
  78. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/config_apply/loader.py +0 -0
  79. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/data_sync.py +0 -0
  80. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/detect/__init__.py +0 -0
  81. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/detect/builtin/__init__.py +0 -0
  82. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/detect/detector.py +0 -0
  83. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/detect/hardware.py +0 -0
  84. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/detect/hardware_rules.py +0 -0
  85. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/detect/probes.py +0 -0
  86. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/detect/remote.py +0 -0
  87. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/detect/templates.py +0 -0
  88. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/detect/workflow.py +0 -0
  89. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/discovery.py +0 -0
  90. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/dsl/__init__.py +0 -0
  91. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/dsl/loader.py +0 -0
  92. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/dsl/parser.py +0 -0
  93. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/dsl_python/__init__.py +0 -0
  94. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/dsl_python/context.py +0 -0
  95. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/dsl_python/decorators.py +0 -0
  96. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/dsl_python/docker_steps.py +0 -0
  97. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/dsl_python/exceptions.py +0 -0
  98. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/dsl_python/runner.py +0 -0
  99. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/dsl_python/steps.py +0 -0
  100. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/fleet.py +0 -0
  101. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/hardware/__init__.py +0 -0
  102. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/hardware/config_txt.py +0 -0
  103. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/hardware/data/__init__.py +0 -0
  104. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/hardware/data/hyperpixel.py +0 -0
  105. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/hardware/data/official.py +0 -0
  106. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/hardware/data/waveshare.py +0 -0
  107. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/hardware/fixes.py +0 -0
  108. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/hardware/kiosk/__init__.py +0 -0
  109. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/hardware/kiosk/autostart.py +0 -0
  110. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/hardware/kiosk/browsers.py +0 -0
  111. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/hardware/kiosk/compositors.py +0 -0
  112. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/hardware/kiosk/output_profiles.py +0 -0
  113. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/hardware/panels.py +0 -0
  114. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/hardware/raspi_config.py +0 -0
  115. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/heal/__init__.py +0 -0
  116. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/heal/decider.py +0 -0
  117. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/heal/hint_provider.py +0 -0
  118. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/heal/log_writer.py +0 -0
  119. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/heal/loop_detector.py +0 -0
  120. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/heal/runner.py +0 -0
  121. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/heal.py +0 -0
  122. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/iac/__init__.py +0 -0
  123. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/iac/base.py +0 -0
  124. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/iac/config_hints.py +0 -0
  125. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/iac/docker_compose.py +0 -0
  126. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/iac/parsers/__init__.py +0 -0
  127. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/iac/parsers/compose.py +0 -0
  128. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/iac/registry.py +0 -0
  129. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/integrations/__init__.py +0 -0
  130. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/integrations/op3_bridge.py +0 -0
  131. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/markpact/__init__.py +0 -0
  132. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/markpact/compiler.py +0 -0
  133. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/markpact/models.py +0 -0
  134. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/markpact/parser.py +0 -0
  135. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/mcp_server.py +0 -0
  136. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/models/__init__.py +0 -0
  137. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/models/blueprint.py +0 -0
  138. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/models/devices.py +0 -0
  139. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/models/enums.py +0 -0
  140. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/models/hardware.py +0 -0
  141. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/models/infra.py +0 -0
  142. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/models/manifest.py +0 -0
  143. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/models/persisted.py +0 -0
  144. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/models/pipeline.py +0 -0
  145. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/models/plan.py +0 -0
  146. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/models/spec.py +0 -0
  147. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/observe.py +0 -0
  148. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/parse.py +0 -0
  149. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/patterns.py +0 -0
  150. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/plan/__init__.py +0 -0
  151. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/plan/planner.py +0 -0
  152. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/plugins/__init__.py +0 -0
  153. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/plugins/builtin/__init__.py +0 -0
  154. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/plugins/builtin/browser_reload.py +0 -0
  155. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/plugins/builtin/hardware_diagnostic.py +0 -0
  156. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/plugins/builtin/notify.py +0 -0
  157. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/plugins/builtin/process_control.py +0 -0
  158. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/plugins/builtin/systemd_reload.py +0 -0
  159. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/schema.py +0 -0
  160. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/spec_loader.py +0 -0
  161. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/ssh.py +0 -0
  162. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/steps/__init__.py +0 -0
  163. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/steps/docker.py +0 -0
  164. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/steps/generic.py +0 -0
  165. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/steps/hardware.py +0 -0
  166. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/steps/k3s.py +0 -0
  167. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/steps/kiosk.py +0 -0
  168. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/steps/podman.py +0 -0
  169. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/steps/process.py +0 -0
  170. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/steps/scm.py +0 -0
  171. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/steps/transfer.py +0 -0
  172. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/__init__.py +0 -0
  173. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_analyze.py +0 -0
  174. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_audit.py +0 -0
  175. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_cli.py +0 -0
  176. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_data_sync.py +0 -0
  177. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_discovery.py +0 -0
  178. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_dsl.py +0 -0
  179. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_examples.py +0 -0
  180. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_executor.py +0 -0
  181. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_fleet.py +0 -0
  182. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_git_integration.py +0 -0
  183. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_heal.py +0 -0
  184. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_heal_decider.py +0 -0
  185. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_hooks.py +0 -0
  186. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_iac.py +0 -0
  187. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_iac_compose_contract.py +0 -0
  188. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_iac_docker_compose_contract.py +0 -0
  189. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_manifest.py +0 -0
  190. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_markpact_compiler.py +0 -0
  191. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_markpact_parser.py +0 -0
  192. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_models.py +0 -0
  193. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_observe.py +0 -0
  194. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_parse.py +0 -0
  195. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_patterns.py +0 -0
  196. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_planner_edge.py +0 -0
  197. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_plugins.py +0 -0
  198. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_probes.py +0 -0
  199. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_public_api.py +0 -0
  200. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_resume.py +0 -0
  201. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_security_hardening.py +0 -0
  202. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_spec_loader.py +0 -0
  203. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_ssh.py +0 -0
  204. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_steps_registry.py +0 -0
  205. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_templates.py +0 -0
  206. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_verify.py +0 -0
  207. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_version.py +0 -0
  208. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_version_changelog.py +0 -0
  209. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_version_cli.py +0 -0
  210. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_version_manifest.py +0 -0
  211. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_version_sources.py +0 -0
  212. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/tests/test_workflow.py +0 -0
  213. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/verify.py +0 -0
  214. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/version/__init__.py +0 -0
  215. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/version/bump.py +0 -0
  216. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/version/changelog.py +0 -0
  217. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/version/commits.py +0 -0
  218. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/version/diff.py +0 -0
  219. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/version/git_integration.py +0 -0
  220. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/version/git_transaction.py +0 -0
  221. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/version/manifest.py +0 -0
  222. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/version/sources/__init__.py +0 -0
  223. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/version/sources/base.py +0 -0
  224. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/version/sources/json_.py +0 -0
  225. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/version/sources/plain.py +0 -0
  226. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/version/sources/regex.py +0 -0
  227. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/version/sources/toml_.py +0 -0
  228. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/version/sources/yaml_.py +0 -0
  229. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/version/transaction.py +0 -0
  230. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy/version.py +0 -0
  231. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy.egg-info/SOURCES.txt +0 -0
  232. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy.egg-info/dependency_links.txt +0 -0
  233. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy.egg-info/entry_points.txt +0 -0
  234. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy.egg-info/requires.txt +0 -0
  235. {redeploy-0.2.71 → redeploy-0.2.73}/redeploy.egg-info/top_level.txt +0 -0
  236. {redeploy-0.2.71 → redeploy-0.2.73}/setup.cfg +0 -0
  237. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_blueprint_sources.py +0 -0
  238. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_blueprint_sources_compose.py +0 -0
  239. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_cli_gh_workflow.py +0 -0
  240. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_cli_query.py +0 -0
  241. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_example_argocd_flux_plugin.py +0 -0
  242. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_example_gitops_ci_plugin.py +0 -0
  243. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_example_helm_kustomize_plugin.py +0 -0
  244. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_hardware_config.py +0 -0
  245. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_hardware_kiosk.py +0 -0
  246. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_hardware_rules.py +0 -0
  247. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_heal_decider.py +0 -0
  248. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_heal_loop_detector.py +0 -0
  249. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_iac.py +0 -0
  250. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_iac_config_hints.py +0 -0
  251. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_iac_plugin_loading.py +0 -0
  252. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_import_plugin_template.py +0 -0
  253. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_parse.py +0 -0
  254. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_prompt_llm.py +0 -0
  255. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_redeploy.py +0 -0
  256. {redeploy-0.2.71 → redeploy-0.2.73}/tests/test_steps_kiosk.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: redeploy
3
- Version: 0.2.71
3
+ Version: 0.2.73
4
4
  Summary: Infrastructure migration toolkit: detect → plan → apply
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -32,17 +32,17 @@ Requires-Dist: mcp>=1.0; extra == "mcp"
32
32
 
33
33
  ## AI Cost Tracking
34
34
 
35
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.71-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-37.3h-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.73-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-39.5h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
37
37
 
38
- - 🤖 **LLM usage:** $7.5000 (92 commits)
39
- - 👤 **Human dev:** ~$3734 (37.3h @ $100/h, 30min dedup)
38
+ - 🤖 **LLM usage:** $7.5000 (94 commits)
39
+ - 👤 **Human dev:** ~$3948 (39.5h @ $100/h, 30min dedup)
40
40
 
41
- Generated on 2026-04-23 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
41
+ Generated on 2026-04-24 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
42
42
 
43
43
  ---
44
44
 
45
- ![PyPI](https://img.shields.io/badge/pypi-redeploy-blue) ![Version](https://img.shields.io/badge/version-0.2.71-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.73-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
46
46
 
47
47
  Infrastructure migration and device deploy toolkit — VPS, Raspberry Pi kiosk, Podman Quadlet, k3s.
48
48
 
@@ -1109,6 +1109,38 @@ redeploy blueprint show blueprint.yaml --apply-config blueprint.yaml
1109
1109
  redeploy blueprint show blueprint.yaml --query "hardware.drm_outputs[0].transform"
1110
1110
  ```
1111
1111
 
1112
+ ## Dependencies
1113
+
1114
+ Core runtime dependencies:
1115
+
1116
+ | Package | Purpose |
1117
+ |---------|---------|
1118
+ | `pydantic>=2.0` | Data validation and settings |
1119
+ | `pyyaml>=6.0` | YAML parsing/serialization |
1120
+ | `markdown-it-py>=3.0` | Markdown parsing (markpact specs) |
1121
+ | `click>=8.0` | CLI framework |
1122
+ | `loguru>=0.7` | Structured logging |
1123
+ | `paramiko>=3.0` | SSH client |
1124
+ | `httpx>=0.25` | HTTP client |
1125
+ | `rich>=13.0` | Terminal UI |
1126
+ | `jmespath>=1.0` | JSON/YAML query expressions |
1127
+ | `goal>=2.1.0` | Goal tracking |
1128
+ | `costs>=0.1.20` | AI cost tracking |
1129
+ | `pfix>=0.1.60` | Self-healing Python |
1130
+
1131
+ Optional dependencies:
1132
+
1133
+ | Package | Purpose |
1134
+ |---------|---------|
1135
+ | `op3>=0.1.8` | OP3 support |
1136
+ | `mcp>=1.0` | MCP server mode |
1137
+
1138
+ ### Internal Modules
1139
+
1140
+ - **`markpact`** — Markdown-native deployment spec format (markpact:config, markpact:steps)
1141
+ - **`goal`** — Migration goal tracking and validation
1142
+ - **`costs`** — AI cost tracking and reporting
1143
+
1112
1144
  ## License
1113
1145
 
1114
1146
  Licensed under Apache-2.0.
@@ -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.71-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-37.3h-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.73-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-39.5h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
8
8
 
9
- - 🤖 **LLM usage:** $7.5000 (92 commits)
10
- - 👤 **Human dev:** ~$3734 (37.3h @ $100/h, 30min dedup)
9
+ - 🤖 **LLM usage:** $7.5000 (94 commits)
10
+ - 👤 **Human dev:** ~$3948 (39.5h @ $100/h, 30min dedup)
11
11
 
12
- Generated on 2026-04-23 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
12
+ Generated on 2026-04-24 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.71-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.73-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
 
@@ -1080,6 +1080,38 @@ redeploy blueprint show blueprint.yaml --apply-config blueprint.yaml
1080
1080
  redeploy blueprint show blueprint.yaml --query "hardware.drm_outputs[0].transform"
1081
1081
  ```
1082
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
+
1083
1115
  ## License
1084
1116
 
1085
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.71"
7
+ version = "0.2.73"
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.71"
10
+ __version__ = "0.2.73"
11
11
 
12
12
  # ── Core models ───────────────────────────────────────────────────────────────
13
13
  from .models import ( # noqa: F401
@@ -124,7 +124,7 @@ def save_preflight_schema(schema: dict[str, Any], output_path: Path) -> None:
124
124
 
125
125
 
126
126
  def _resolve_command_refs(spec, spec_path: Path, blockers: list[dict[str, Any]]) -> list[dict[str, Any]]:
127
- from ..markpact.parser import extract_script_by_ref, extract_script_from_markdown
127
+ from ..markpact.parser import resolve_script_ref
128
128
 
129
129
  out: list[dict[str, Any]] = []
130
130
  for step in spec.extra_steps:
@@ -156,14 +156,11 @@ def _resolve_command_refs(spec, spec_path: Path, blockers: list[dict[str, Any]])
156
156
  })
157
157
  continue
158
158
  text = ref_file.read_text(encoding="utf-8", errors="replace")
159
- by_ref = extract_script_by_ref(text, ref_id, language="bash")
160
- by_heading = extract_script_from_markdown(text, ref_id, language="bash")
161
- if by_ref is not None:
159
+ result = resolve_script_ref(text, ref_id, language="bash")
160
+ if result is not None:
162
161
  entry["resolved"] = True
163
- entry["mode"] = "markpact_ref"
164
- elif by_heading is not None:
165
- entry["resolved"] = True
166
- entry["mode"] = "heading"
162
+ _, lookup_method = result
163
+ entry["mode"] = "markpact_ref" if lookup_method == "markpact:ref" else "heading"
167
164
  else:
168
165
  blockers.append({
169
166
  "type": "missing_command_ref",
@@ -178,14 +175,11 @@ def _resolve_command_refs(spec, spec_path: Path, blockers: list[dict[str, Any]])
178
175
  entry["file"] = str(ref_file)
179
176
  entry["ref"] = cref
180
177
  text = ref_file.read_text(encoding="utf-8", errors="replace") if ref_file.exists() else ""
181
- by_ref = extract_script_by_ref(text, cref, language="bash")
182
- by_heading = extract_script_from_markdown(text, cref, language="bash")
183
- if by_ref is not None:
184
- entry["resolved"] = True
185
- entry["mode"] = "markpact_ref"
186
- elif by_heading is not None:
178
+ result = resolve_script_ref(text, cref, language="bash")
179
+ if result is not None:
187
180
  entry["resolved"] = True
188
- entry["mode"] = "heading"
181
+ _, lookup_method = result
182
+ entry["mode"] = "markpact_ref" if lookup_method == "markpact:ref" else "heading"
189
183
  else:
190
184
  blockers.append({
191
185
  "type": "missing_command_ref",
@@ -523,7 +523,7 @@ class _CommandRefChecker(_Checker):
523
523
  """Validate command_ref references for nested markdown/script dependencies."""
524
524
 
525
525
  def check(self, spec, document, base_dir, result):
526
- from ..markpact.parser import extract_script_by_ref, extract_script_from_markdown
526
+ from ..markpact.parser import resolve_script_ref
527
527
 
528
528
  in_doc_refs: set[str] = set()
529
529
  if document:
@@ -551,10 +551,7 @@ class _CommandRefChecker(_Checker):
551
551
  )
552
552
  continue
553
553
  text = file_path.read_text(encoding="utf-8", errors="replace")
554
- if not (
555
- extract_script_by_ref(text, ref_id, language="bash")
556
- or extract_script_from_markdown(text, ref_id, language="bash")
557
- ):
554
+ if resolve_script_ref(text, ref_id, language="bash") is None:
558
555
  result.add(
559
556
  IssueSeverity.ERROR,
560
557
  "command_ref",
@@ -34,7 +34,6 @@ def exec_cmd(ctx, ref, host, markdown_file, dry_run, timeout):
34
34
  redeploy exec '#install-deps' --host root@server.com --file deploy.md --dry-run
35
35
  redeploy exec 'kiosk-browser-configuration-script' --host pi@192.168.188.108 --file migration.md
36
36
  """
37
- from ...markpact.parser import extract_script_by_ref
38
37
  from ...apply.executor import Executor, MigrationPlan, MigrationStep, StepAction
39
38
 
40
39
  console = Console()
@@ -65,15 +64,14 @@ def exec_cmd(ctx, ref, host, markdown_file, dry_run, timeout):
65
64
  console.print(f"[dim]Reading {md_path}...[/dim]")
66
65
  md_content = md_path.read_text(encoding="utf-8")
67
66
 
68
- script = extract_script_by_ref(md_content, ref_id, language="bash")
69
- lookup_method = "markpact:ref"
70
-
71
- if script is None:
67
+ result = _extract_script_for_ref(md_content, ref_id)
68
+ if result is None:
72
69
  console.print(f"[red]✗ Could not find bash script with ref '#{ref_id}'[/red]")
73
70
  console.print("[dim] Make sure there's either:[/dim]")
74
71
  console.print("[dim] - A codeblock: ```bash markpact:ref {ref_id}[/dim]")
75
72
  console.print("[dim] - Or a ## section heading and ```bash codeblock[/dim]")
76
73
  sys.exit(1)
74
+ script, lookup_method = result
77
75
 
78
76
  console.print(f"[green]✓[/green] Found script ({len(script)} chars) via {lookup_method} '#{ref_id}'")
79
77
 
@@ -183,8 +181,6 @@ def exec_multi_cmd(ctx, refs, host, markdown_file, dry_run, timeout, parallel):
183
181
 
184
182
  def _extract_all_scripts(md_path, ref_list, console) -> list[tuple[str, str, str]]:
185
183
  """Extract all scripts from markdown by ref list."""
186
- from ...markpact.parser import extract_script_from_markdown, extract_script_by_ref
187
-
188
184
  md_content = md_path.read_text(encoding="utf-8")
189
185
  scripts: list[tuple[str, str, str]] = []
190
186
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: redeploy
3
- Version: 0.2.71
3
+ Version: 0.2.73
4
4
  Summary: Infrastructure migration toolkit: detect → plan → apply
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -32,17 +32,17 @@ Requires-Dist: mcp>=1.0; extra == "mcp"
32
32
 
33
33
  ## AI Cost Tracking
34
34
 
35
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.71-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-37.3h-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.73-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-39.5h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
37
37
 
38
- - 🤖 **LLM usage:** $7.5000 (92 commits)
39
- - 👤 **Human dev:** ~$3734 (37.3h @ $100/h, 30min dedup)
38
+ - 🤖 **LLM usage:** $7.5000 (94 commits)
39
+ - 👤 **Human dev:** ~$3948 (39.5h @ $100/h, 30min dedup)
40
40
 
41
- Generated on 2026-04-23 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
41
+ Generated on 2026-04-24 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
42
42
 
43
43
  ---
44
44
 
45
- ![PyPI](https://img.shields.io/badge/pypi-redeploy-blue) ![Version](https://img.shields.io/badge/version-0.2.71-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.73-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
46
46
 
47
47
  Infrastructure migration and device deploy toolkit — VPS, Raspberry Pi kiosk, Podman Quadlet, k3s.
48
48
 
@@ -1109,6 +1109,38 @@ redeploy blueprint show blueprint.yaml --apply-config blueprint.yaml
1109
1109
  redeploy blueprint show blueprint.yaml --query "hardware.drm_outputs[0].transform"
1110
1110
  ```
1111
1111
 
1112
+ ## Dependencies
1113
+
1114
+ Core runtime dependencies:
1115
+
1116
+ | Package | Purpose |
1117
+ |---------|---------|
1118
+ | `pydantic>=2.0` | Data validation and settings |
1119
+ | `pyyaml>=6.0` | YAML parsing/serialization |
1120
+ | `markdown-it-py>=3.0` | Markdown parsing (markpact specs) |
1121
+ | `click>=8.0` | CLI framework |
1122
+ | `loguru>=0.7` | Structured logging |
1123
+ | `paramiko>=3.0` | SSH client |
1124
+ | `httpx>=0.25` | HTTP client |
1125
+ | `rich>=13.0` | Terminal UI |
1126
+ | `jmespath>=1.0` | JSON/YAML query expressions |
1127
+ | `goal>=2.1.0` | Goal tracking |
1128
+ | `costs>=0.1.20` | AI cost tracking |
1129
+ | `pfix>=0.1.60` | Self-healing Python |
1130
+
1131
+ Optional dependencies:
1132
+
1133
+ | Package | Purpose |
1134
+ |---------|---------|
1135
+ | `op3>=0.1.8` | OP3 support |
1136
+ | `mcp>=1.0` | MCP server mode |
1137
+
1138
+ ### Internal Modules
1139
+
1140
+ - **`markpact`** — Markdown-native deployment spec format (markpact:config, markpact:steps)
1141
+ - **`goal`** — Migration goal tracking and validation
1142
+ - **`costs`** — AI cost tracking and reporting
1143
+
1112
1144
  ## License
1113
1145
 
1114
1146
  Licensed under Apache-2.0.
File without changes
File without changes
File without changes