redeploy 0.2.60__tar.gz → 0.2.61__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.
- {redeploy-0.2.60 → redeploy-0.2.61}/PKG-INFO +5 -5
- {redeploy-0.2.60 → redeploy-0.2.61}/README.md +4 -4
- {redeploy-0.2.60 → redeploy-0.2.61}/pyproject.toml +1 -1
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/__init__.py +1 -1
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/prompt_cmd.py +4 -1
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/heal/runner.py +13 -1
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_heal.py +43 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy.egg-info/PKG-INFO +5 -5
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/apply/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/apply/exceptions.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/apply/executor.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/apply/handlers.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/apply/progress.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/apply/rollback.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/apply/state.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/apply/state_apply.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/apply/utils/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/apply/utils/run_container_build.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/audit.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/blueprint/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/blueprint/extractor.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/blueprint/generators/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/blueprint/generators/docker_compose.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/blueprint/generators/migration.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/blueprint/sources/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/blueprint/sources/compose.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/blueprint/sources/hardware.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/blueprint/sources/infra.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/blueprint/sources/migration.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/audit.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/blueprint.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/bump_fix.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/detect.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/device_map.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/device_map_renderers.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/devices.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/diagnose.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/diff.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/exec_.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/export.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/hardware.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/import_.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/init.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/inspect.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/mcp_cmd.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/patterns.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/plan_apply.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/plugin.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/probe.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/push.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/state.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/status.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/target.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/version/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/version/commands.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/version/helpers.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/version/monorepo.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/version/release.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/version/scanner.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/version/utils/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/version/utils/changelog_config.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/version/utils/git_config.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/commands/workflow.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/core.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/display.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli/query.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/cli.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/config_apply/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/config_apply/applier.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/config_apply/loader.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/data_sync.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/detect/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/detect/builtin/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/detect/detector.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/detect/hardware.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/detect/hardware_rules.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/detect/probes.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/detect/remote.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/detect/templates.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/detect/workflow.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/discovery.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/dsl/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/dsl/loader.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/dsl/parser.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/dsl_python/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/dsl_python/context.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/dsl_python/decorators.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/dsl_python/docker_steps.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/dsl_python/exceptions.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/dsl_python/runner.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/dsl_python/steps.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/fleet.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/hardware/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/hardware/config_txt.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/hardware/data/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/hardware/data/hyperpixel.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/hardware/data/official.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/hardware/data/waveshare.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/hardware/fixes.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/hardware/kiosk/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/hardware/kiosk/autostart.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/hardware/kiosk/browsers.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/hardware/kiosk/compositors.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/hardware/kiosk/output_profiles.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/hardware/panels.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/hardware/raspi_config.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/heal/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/heal/decider.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/heal/hint_provider.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/heal/log_writer.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/heal/loop_detector.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/heal.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/iac/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/iac/base.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/iac/config_hints.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/iac/docker_compose.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/iac/parsers/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/iac/parsers/compose.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/iac/registry.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/integrations/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/integrations/op3_bridge.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/markpact/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/markpact/compiler.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/markpact/models.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/markpact/parser.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/mcp_server.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/models/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/models/blueprint.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/models/devices.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/models/enums.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/models/hardware.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/models/infra.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/models/manifest.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/models/persisted.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/models/pipeline.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/models/plan.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/models/spec.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/observe.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/parse.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/patterns.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/plan/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/plan/planner.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/plugins/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/plugins/builtin/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/plugins/builtin/browser_reload.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/plugins/builtin/hardware_diagnostic.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/plugins/builtin/notify.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/plugins/builtin/process_control.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/plugins/builtin/systemd_reload.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/schema.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/spec_loader.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/ssh.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/steps/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/steps/builtins.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/steps/kiosk.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_audit.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_cli.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_data_sync.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_discovery.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_dsl.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_examples.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_executor.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_fleet.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_git_integration.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_heal_decider.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_hooks.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_iac.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_iac_compose_contract.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_iac_docker_compose_contract.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_manifest.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_markpact_compiler.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_markpact_parser.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_models.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_observe.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_parse.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_patterns.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_planner_edge.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_plugins.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_probes.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_public_api.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_resume.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_spec_loader.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_ssh.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_templates.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_verify.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_version.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_version_changelog.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_version_cli.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_version_manifest.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_version_sources.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/tests/test_workflow.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/verify.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/version/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/version/bump.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/version/changelog.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/version/commits.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/version/diff.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/version/git_integration.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/version/git_transaction.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/version/manifest.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/version/sources/__init__.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/version/sources/base.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/version/sources/json_.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/version/sources/plain.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/version/sources/regex.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/version/sources/toml_.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/version/sources/yaml_.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/version/transaction.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy/version.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy.egg-info/SOURCES.txt +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy.egg-info/dependency_links.txt +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy.egg-info/entry_points.txt +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy.egg-info/requires.txt +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/redeploy.egg-info/top_level.txt +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/setup.cfg +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/tests/test_blueprint_sources.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/tests/test_blueprint_sources_compose.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/tests/test_cli_query.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/tests/test_example_argocd_flux_plugin.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/tests/test_example_gitops_ci_plugin.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/tests/test_example_helm_kustomize_plugin.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/tests/test_hardware_config.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/tests/test_hardware_kiosk.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/tests/test_hardware_rules.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/tests/test_heal_decider.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/tests/test_heal_loop_detector.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/tests/test_iac.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/tests/test_iac_config_hints.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/tests/test_iac_plugin_loading.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/tests/test_import_plugin_template.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/tests/test_parse.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/tests/test_prompt_llm.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/tests/test_redeploy.py +0 -0
- {redeploy-0.2.60 → redeploy-0.2.61}/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.
|
|
3
|
+
Version: 0.2.61
|
|
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
|
-
    
|
|
36
36
|
  
|
|
37
37
|
|
|
38
|
-
- 🤖 **LLM usage:** $7.5000 (
|
|
39
|
-
- 👤 **Human dev:** ~$
|
|
38
|
+
- 🤖 **LLM usage:** $7.5000 (81 commits)
|
|
39
|
+
- 👤 **Human dev:** ~$2911 (29.1h @ $100/h, 30min dedup)
|
|
40
40
|
|
|
41
41
|
Generated on 2026-04-21 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
|
|
42
42
|
|
|
43
43
|
---
|
|
44
44
|
|
|
45
|
-
    
|
|
46
46
|
|
|
47
47
|
Infrastructure migration and device deploy toolkit — VPS, Raspberry Pi kiosk, Podman Quadlet, k3s.
|
|
48
48
|
|
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
|
|
4
4
|
## AI Cost Tracking
|
|
5
5
|
|
|
6
|
-
    
|
|
7
7
|
  
|
|
8
8
|
|
|
9
|
-
- 🤖 **LLM usage:** $7.5000 (
|
|
10
|
-
- 👤 **Human dev:** ~$
|
|
9
|
+
- 🤖 **LLM usage:** $7.5000 (81 commits)
|
|
10
|
+
- 👤 **Human dev:** ~$2911 (29.1h @ $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
|
-
    
|
|
17
17
|
|
|
18
18
|
Infrastructure migration and device deploy toolkit — VPS, Raspberry Pi kiosk, Podman Quadlet, k3s.
|
|
19
19
|
|
|
@@ -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.
|
|
10
|
+
__version__ = "0.2.61"
|
|
11
11
|
|
|
12
12
|
# ── Core models ───────────────────────────────────────────────────────────────
|
|
13
13
|
from .models import ( # noqa: F401
|
|
@@ -113,7 +113,10 @@ def _call_llm(schema: dict, user_prompt: str) -> str:
|
|
|
113
113
|
kwargs["api_key"] = api_key
|
|
114
114
|
|
|
115
115
|
resp = litellm.completion(**kwargs)
|
|
116
|
-
|
|
116
|
+
content = resp.choices[0].message.content
|
|
117
|
+
if content is None:
|
|
118
|
+
raise ValueError("LLM returned None content")
|
|
119
|
+
return content.strip()
|
|
117
120
|
|
|
118
121
|
|
|
119
122
|
def _parse_llm_response(raw: str) -> dict:
|
|
@@ -145,12 +145,24 @@ class HealRunner:
|
|
|
145
145
|
" [dim]LLM proposal:[/dim]\n"
|
|
146
146
|
+ "\n".join(f" {l}" for l in llm_response.splitlines()[:12])
|
|
147
147
|
)
|
|
148
|
+
before_patch = self.spec_path.read_text()
|
|
148
149
|
fixed = apply_fix_to_spec(self.spec_path, failed_step, llm_response)
|
|
149
150
|
if fixed:
|
|
150
151
|
desc_m = re.search(r'description:\s*"([^"]+)"', llm_response)
|
|
151
152
|
summary = desc_m.group(1) if desc_m else llm_response[:60].replace("\n", " ")
|
|
152
153
|
self.console.print(f" [green]patched spec:[/green] `{failed_step}`")
|
|
153
|
-
|
|
154
|
+
try:
|
|
155
|
+
self._reload_migration()
|
|
156
|
+
except Exception as exc:
|
|
157
|
+
# LLM patch changed the file but produced an invalid spec.
|
|
158
|
+
# Restore previous content and continue heal flow safely.
|
|
159
|
+
self.spec_path.write_text(before_patch)
|
|
160
|
+
fixed = False
|
|
161
|
+
summary = f"invalid patch: {exc.__class__.__name__}"
|
|
162
|
+
self.console.print(
|
|
163
|
+
" [yellow]LLM fix invalid for current runtime; "
|
|
164
|
+
"reverted spec patch[/yellow]"
|
|
165
|
+
)
|
|
154
166
|
else:
|
|
155
167
|
self.console.print(" [yellow]LLM fix not applicable[/yellow]")
|
|
156
168
|
else:
|
|
@@ -81,3 +81,46 @@ def test_heal_runner_stops_on_repeating_hint_pattern(monkeypatch, tmp_path):
|
|
|
81
81
|
assert runner.run() is False
|
|
82
82
|
assert len(ask_calls) == 2
|
|
83
83
|
assert make_executor_calls == [False, True]
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def test_heal_runner_reverts_invalid_llm_patch_without_crash(monkeypatch, tmp_path):
|
|
87
|
+
from redeploy.heal import HealRunner
|
|
88
|
+
|
|
89
|
+
spec_path = tmp_path / "spec.md"
|
|
90
|
+
original = "steps:\n - id: start_services\n action: ssh_cmd\n"
|
|
91
|
+
spec_path.write_text(original)
|
|
92
|
+
|
|
93
|
+
class _FakeExecutor:
|
|
94
|
+
def run(self):
|
|
95
|
+
return False
|
|
96
|
+
|
|
97
|
+
def summary(self):
|
|
98
|
+
return "Step failed: [start_services] exit=1: boom"
|
|
99
|
+
|
|
100
|
+
monkeypatch.setattr("redeploy.heal.runner.parse_failed_step", lambda *_a, **_k: ("start_services", "boom"))
|
|
101
|
+
monkeypatch.setattr("redeploy.heal.runner.collect_diagnostics", lambda *_a, **_k: "ERROR: same")
|
|
102
|
+
monkeypatch.setattr(
|
|
103
|
+
"redeploy.heal.runner.ask_llm",
|
|
104
|
+
lambda *_a, **_k: "```yaml\n- id: start_services\n action: local_cmd\n description: \"broken\"\n```",
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
def _fake_apply_fix(path, *_args, **_kwargs):
|
|
108
|
+
path.write_text("steps:\n - id: start_services\n action: local_cmd\n")
|
|
109
|
+
return True
|
|
110
|
+
|
|
111
|
+
monkeypatch.setattr("redeploy.heal.runner.apply_fix_to_spec", _fake_apply_fix)
|
|
112
|
+
monkeypatch.setattr("redeploy.heal.runner.write_repair_log", lambda *_a, **_k: None)
|
|
113
|
+
monkeypatch.setattr(HealRunner, "_make_executor", lambda *_a, **_k: _FakeExecutor())
|
|
114
|
+
monkeypatch.setattr(HealRunner, "_reload_migration", lambda *_a, **_k: (_ for _ in ()).throw(ValueError("invalid action")))
|
|
115
|
+
|
|
116
|
+
runner = HealRunner(
|
|
117
|
+
migration=object(),
|
|
118
|
+
spec_path=spec_path,
|
|
119
|
+
host="pi@test",
|
|
120
|
+
max_retries=1,
|
|
121
|
+
dry_run=True,
|
|
122
|
+
version="0.0.0",
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
assert runner.run() is False
|
|
126
|
+
assert spec_path.read_text() == original
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: redeploy
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.61
|
|
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
|
-
    
|
|
36
36
|
  
|
|
37
37
|
|
|
38
|
-
- 🤖 **LLM usage:** $7.5000 (
|
|
39
|
-
- 👤 **Human dev:** ~$
|
|
38
|
+
- 🤖 **LLM usage:** $7.5000 (81 commits)
|
|
39
|
+
- 👤 **Human dev:** ~$2911 (29.1h @ $100/h, 30min dedup)
|
|
40
40
|
|
|
41
41
|
Generated on 2026-04-21 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
|
|
42
42
|
|
|
43
43
|
---
|
|
44
44
|
|
|
45
|
-
    
|
|
46
46
|
|
|
47
47
|
Infrastructure migration and device deploy toolkit — VPS, Raspberry Pi kiosk, Podman Quadlet, k3s.
|
|
48
48
|
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|