redeploy 0.2.65__tar.gz → 0.2.66__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.65 → redeploy-0.2.66}/PKG-INFO +6 -6
- {redeploy-0.2.65 → redeploy-0.2.66}/README.md +5 -5
- {redeploy-0.2.65 → redeploy-0.2.66}/pyproject.toml +1 -1
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/__init__.py +1 -1
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/analyze/spec_analyzer.py +98 -4
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/apply/handlers.py +9 -1
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/plan_apply.py +60 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy.egg-info/PKG-INFO +6 -6
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/analyze/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/analyze/checkers/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/analyze/preflight_schema.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/apply/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/apply/exceptions.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/apply/executor.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/apply/progress.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/apply/rollback.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/apply/state.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/apply/state_apply.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/apply/utils/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/apply/utils/run_container_build.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/audit.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/blueprint/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/blueprint/extractor.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/blueprint/generators/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/blueprint/generators/docker_compose.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/blueprint/generators/migration.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/blueprint/sources/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/blueprint/sources/compose.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/blueprint/sources/hardware.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/blueprint/sources/infra.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/blueprint/sources/migration.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/audit.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/blueprint.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/bump_fix.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/detect.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/device_map.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/device_map_renderers.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/devices.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/diagnose.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/diff.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/exec_.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/export.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/hardware.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/import_.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/init.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/inspect.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/lint.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/mcp_cmd.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/patterns.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/plugin.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/probe.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/prompt_cmd.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/push.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/state.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/status.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/target.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/version/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/version/commands.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/version/helpers.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/version/monorepo.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/version/release.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/version/scanner.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/version/utils/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/version/utils/changelog_config.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/version/utils/git_config.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/commands/workflow.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/core.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/display.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli/query.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/cli.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/config_apply/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/config_apply/applier.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/config_apply/loader.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/data_sync.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/detect/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/detect/builtin/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/detect/detector.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/detect/hardware.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/detect/hardware_rules.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/detect/probes.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/detect/remote.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/detect/templates.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/detect/workflow.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/discovery.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/dsl/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/dsl/loader.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/dsl/parser.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/dsl_python/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/dsl_python/context.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/dsl_python/decorators.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/dsl_python/docker_steps.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/dsl_python/exceptions.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/dsl_python/runner.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/dsl_python/steps.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/fleet.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/hardware/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/hardware/config_txt.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/hardware/data/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/hardware/data/hyperpixel.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/hardware/data/official.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/hardware/data/waveshare.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/hardware/fixes.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/hardware/kiosk/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/hardware/kiosk/autostart.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/hardware/kiosk/browsers.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/hardware/kiosk/compositors.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/hardware/kiosk/output_profiles.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/hardware/panels.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/hardware/raspi_config.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/heal/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/heal/decider.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/heal/hint_provider.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/heal/log_writer.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/heal/loop_detector.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/heal/runner.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/heal.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/iac/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/iac/base.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/iac/config_hints.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/iac/docker_compose.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/iac/parsers/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/iac/parsers/compose.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/iac/registry.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/integrations/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/integrations/op3_bridge.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/markpact/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/markpact/compiler.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/markpact/models.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/markpact/parser.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/mcp_server.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/models/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/models/blueprint.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/models/devices.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/models/enums.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/models/hardware.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/models/infra.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/models/manifest.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/models/persisted.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/models/pipeline.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/models/plan.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/models/spec.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/observe.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/parse.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/patterns.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/plan/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/plan/planner.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/plugins/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/plugins/builtin/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/plugins/builtin/browser_reload.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/plugins/builtin/hardware_diagnostic.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/plugins/builtin/notify.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/plugins/builtin/process_control.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/plugins/builtin/systemd_reload.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/schema.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/spec_loader.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/ssh.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/steps/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/steps/builtins.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/steps/kiosk.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_analyze.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_audit.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_cli.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_data_sync.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_discovery.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_dsl.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_examples.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_executor.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_fleet.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_git_integration.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_heal.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_heal_decider.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_hooks.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_iac.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_iac_compose_contract.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_iac_docker_compose_contract.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_manifest.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_markpact_compiler.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_markpact_parser.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_models.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_observe.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_parse.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_patterns.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_planner_edge.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_plugins.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_probes.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_public_api.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_resume.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_spec_loader.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_ssh.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_templates.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_verify.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_version.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_version_changelog.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_version_cli.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_version_manifest.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_version_sources.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/tests/test_workflow.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/verify.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/version/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/version/bump.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/version/changelog.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/version/commits.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/version/diff.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/version/git_integration.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/version/git_transaction.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/version/manifest.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/version/sources/__init__.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/version/sources/base.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/version/sources/json_.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/version/sources/plain.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/version/sources/regex.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/version/sources/toml_.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/version/sources/yaml_.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/version/transaction.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy/version.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy.egg-info/SOURCES.txt +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy.egg-info/dependency_links.txt +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy.egg-info/entry_points.txt +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy.egg-info/requires.txt +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/redeploy.egg-info/top_level.txt +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/setup.cfg +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/tests/test_blueprint_sources.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/tests/test_blueprint_sources_compose.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/tests/test_cli_query.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/tests/test_example_argocd_flux_plugin.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/tests/test_example_gitops_ci_plugin.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/tests/test_example_helm_kustomize_plugin.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/tests/test_hardware_config.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/tests/test_hardware_kiosk.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/tests/test_hardware_rules.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/tests/test_heal_decider.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/tests/test_heal_loop_detector.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/tests/test_iac.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/tests/test_iac_config_hints.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/tests/test_iac_plugin_loading.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/tests/test_import_plugin_template.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/tests/test_parse.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/tests/test_prompt_llm.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/tests/test_redeploy.py +0 -0
- {redeploy-0.2.65 → redeploy-0.2.66}/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.66
|
|
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
|
+
  
|
|
37
37
|
|
|
38
|
-
- 🤖 **LLM usage:** $7.5000 (
|
|
39
|
-
- 👤 **Human dev:** ~$
|
|
38
|
+
- 🤖 **LLM usage:** $7.5000 (86 commits)
|
|
39
|
+
- 👤 **Human dev:** ~$3331 (33.3h @ $100/h, 30min dedup)
|
|
40
40
|
|
|
41
41
|
Generated on 2026-04-23 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
|
+
  
|
|
8
8
|
|
|
9
|
-
- 🤖 **LLM usage:** $7.5000 (
|
|
10
|
-
- 👤 **Human dev:** ~$
|
|
9
|
+
- 🤖 **LLM usage:** $7.5000 (86 commits)
|
|
10
|
+
- 👤 **Human dev:** ~$3331 (33.3h @ $100/h, 30min dedup)
|
|
11
11
|
|
|
12
12
|
Generated on 2026-04-23 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.66"
|
|
11
11
|
|
|
12
12
|
# ── Core models ───────────────────────────────────────────────────────────────
|
|
13
13
|
from .models import ( # noqa: F401
|
|
@@ -9,6 +9,7 @@ Scans compiled MigrationSpec + raw markpact blocks for:
|
|
|
9
9
|
"""
|
|
10
10
|
from __future__ import annotations
|
|
11
11
|
|
|
12
|
+
import fnmatch
|
|
12
13
|
import re
|
|
13
14
|
import shlex
|
|
14
15
|
import shutil
|
|
@@ -59,6 +60,91 @@ class AnalysisResult:
|
|
|
59
60
|
return [i for i in self.issues if i.severity == IssueSeverity.WARNING]
|
|
60
61
|
|
|
61
62
|
|
|
63
|
+
DEFAULT_REDEPLOYIGNORE = """# .redeployignore — files excluded from deployment sync
|
|
64
|
+
# Auto-generated by redeploy. Edit as needed.
|
|
65
|
+
|
|
66
|
+
# Python
|
|
67
|
+
__pycache__/
|
|
68
|
+
*.pyc
|
|
69
|
+
*.pyo
|
|
70
|
+
.venv/
|
|
71
|
+
env/
|
|
72
|
+
venv/
|
|
73
|
+
|
|
74
|
+
# IDE
|
|
75
|
+
.idea/
|
|
76
|
+
.vscode/
|
|
77
|
+
*.swp
|
|
78
|
+
*.swo
|
|
79
|
+
|
|
80
|
+
# OS
|
|
81
|
+
.DS_Store
|
|
82
|
+
Thumbs.db
|
|
83
|
+
|
|
84
|
+
# Build artifacts
|
|
85
|
+
dist/
|
|
86
|
+
build/
|
|
87
|
+
*.egg-info/
|
|
88
|
+
node_modules/
|
|
89
|
+
target/
|
|
90
|
+
|
|
91
|
+
# Version control (already handled by git, but explicit here)
|
|
92
|
+
.git/
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def ensure_redeployignore(base_dir: Path) -> None:
|
|
97
|
+
"""Create .redeployignore with sensible defaults if it doesn't exist."""
|
|
98
|
+
path = base_dir / ".redeployignore"
|
|
99
|
+
if not path.exists():
|
|
100
|
+
path.write_text(DEFAULT_REDEPLOYIGNORE)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class _IgnoreList:
|
|
104
|
+
"""Read .gitignore and .redeployignore patterns and test if paths are ignored."""
|
|
105
|
+
|
|
106
|
+
def __init__(self, base_dir: Path):
|
|
107
|
+
self.patterns: list[str] = []
|
|
108
|
+
self._load(base_dir / ".gitignore")
|
|
109
|
+
self._load(base_dir / ".redeployignore")
|
|
110
|
+
|
|
111
|
+
def _load(self, path: Path) -> None:
|
|
112
|
+
if not path.exists():
|
|
113
|
+
return
|
|
114
|
+
for line in path.read_text().splitlines():
|
|
115
|
+
line = line.strip()
|
|
116
|
+
if line and not line.startswith("#"):
|
|
117
|
+
self.patterns.append(line)
|
|
118
|
+
|
|
119
|
+
def is_ignored(self, rel_path: Path) -> bool:
|
|
120
|
+
"""Check if a path relative to base_dir matches any ignore pattern."""
|
|
121
|
+
parts = rel_path.parts
|
|
122
|
+
name = rel_path.name
|
|
123
|
+
|
|
124
|
+
for pattern in self.patterns:
|
|
125
|
+
pat = pattern.rstrip("/")
|
|
126
|
+
# Direct filename match
|
|
127
|
+
if fnmatch.fnmatch(name, pat):
|
|
128
|
+
return True
|
|
129
|
+
# Any path component match
|
|
130
|
+
for part in parts:
|
|
131
|
+
if fnmatch.fnmatch(part, pat):
|
|
132
|
+
return True
|
|
133
|
+
# Directory-depth patterns with slash
|
|
134
|
+
if "/" in pattern:
|
|
135
|
+
pat_parts = pat.split("/")
|
|
136
|
+
# Try matching at each possible depth
|
|
137
|
+
for start in range(len(parts) - len(pat_parts) + 1):
|
|
138
|
+
match = True
|
|
139
|
+
for i, pp in enumerate(pat_parts):
|
|
140
|
+
if not fnmatch.fnmatch(parts[start + i], pp):
|
|
141
|
+
match = False
|
|
142
|
+
break
|
|
143
|
+
if match:
|
|
144
|
+
return True
|
|
145
|
+
return False
|
|
146
|
+
|
|
147
|
+
|
|
62
148
|
class _Checker:
|
|
63
149
|
def check(self, spec: MigrationSpec, document: MarkpactDocument | None,
|
|
64
150
|
base_dir: Path, result: AnalysisResult) -> None:
|
|
@@ -69,13 +155,14 @@ class _PathChecker(_Checker):
|
|
|
69
155
|
"""Validate local file paths referenced by steps."""
|
|
70
156
|
|
|
71
157
|
def check(self, spec, document, base_dir, result):
|
|
158
|
+
ign = _IgnoreList(base_dir)
|
|
72
159
|
for step in spec.extra_steps:
|
|
73
|
-
self._check_field(step, "src", base_dir, result)
|
|
74
|
-
self._check_field(step, "dst", base_dir, result)
|
|
75
|
-
self._check_field(step, "config_file", base_dir, result)
|
|
160
|
+
self._check_field(step, "src", base_dir, result, ign)
|
|
161
|
+
self._check_field(step, "dst", base_dir, result, ign)
|
|
162
|
+
self._check_field(step, "config_file", base_dir, result, ign)
|
|
76
163
|
self._check_env_file(step, base_dir, result)
|
|
77
164
|
|
|
78
|
-
def _check_field(self, step: dict, field_name: str, base_dir: Path, result: AnalysisResult):
|
|
165
|
+
def _check_field(self, step: dict, field_name: str, base_dir: Path, result: AnalysisResult, ign: _IgnoreList):
|
|
79
166
|
val = step.get(field_name)
|
|
80
167
|
if not val:
|
|
81
168
|
return
|
|
@@ -87,6 +174,13 @@ class _PathChecker(_Checker):
|
|
|
87
174
|
return
|
|
88
175
|
path = self._resolve(val, base_dir)
|
|
89
176
|
if path and not path.exists():
|
|
177
|
+
# Skip if the missing path matches an ignore pattern
|
|
178
|
+
try:
|
|
179
|
+
rel = path.resolve().relative_to(base_dir.resolve())
|
|
180
|
+
if ign.is_ignored(rel):
|
|
181
|
+
return
|
|
182
|
+
except ValueError:
|
|
183
|
+
pass
|
|
90
184
|
result.add(
|
|
91
185
|
IssueSeverity.ERROR, "paths",
|
|
92
186
|
f"Step '{step.get('id')}' references missing {field_name}: {val}",
|
|
@@ -66,7 +66,15 @@ def run_rsync(step: MigrationStep, probe: RemoteProbe, plan: MigrationPlan) -> N
|
|
|
66
66
|
else:
|
|
67
67
|
_ensure_remote_parent_dir(probe, step.dst)
|
|
68
68
|
dst = f"{plan.host}:{step.dst}"
|
|
69
|
-
cmd = [
|
|
69
|
+
cmd = [
|
|
70
|
+
"rsync",
|
|
71
|
+
"-az",
|
|
72
|
+
"--delete",
|
|
73
|
+
"--filter",
|
|
74
|
+
":- .gitignore",
|
|
75
|
+
"--filter",
|
|
76
|
+
":- .redeployignore",
|
|
77
|
+
]
|
|
70
78
|
for exc in step.excludes:
|
|
71
79
|
cmd += ["--exclude", exc]
|
|
72
80
|
cmd += [step.src, dst]
|
|
@@ -313,6 +313,9 @@ def run(ctx, spec_file, dry_run, plan_only, do_detect, plan_out, output,
|
|
|
313
313
|
|
|
314
314
|
console = Console()
|
|
315
315
|
|
|
316
|
+
# Create deployment ignore policy on first run (project-aware template).
|
|
317
|
+
_ensure_redeployignore(Path.cwd(), console)
|
|
318
|
+
|
|
316
319
|
# Load project manifest (redeploy.yaml) if present
|
|
317
320
|
manifest = ProjectManifest.find_and_load(Path.cwd())
|
|
318
321
|
|
|
@@ -579,3 +582,60 @@ def _print_heal_banner(console, fix_hint: str | None) -> None:
|
|
|
579
582
|
console.print("\n[bold green]heal[/bold green] mode: [dim]on[/dim]")
|
|
580
583
|
if fix_hint:
|
|
581
584
|
console.print(f"[cyan]user hint:[/cyan] {fix_hint}")
|
|
585
|
+
|
|
586
|
+
|
|
587
|
+
def _ensure_redeployignore(project_root: Path, console) -> None:
|
|
588
|
+
"""Create `.redeployignore` on first run with project-aware defaults."""
|
|
589
|
+
target = project_root / ".redeployignore"
|
|
590
|
+
if target.exists():
|
|
591
|
+
return
|
|
592
|
+
|
|
593
|
+
lines: list[str] = [
|
|
594
|
+
"# Auto-generated by redeploy on first run.",
|
|
595
|
+
"# Patterns excluded from deployment sync (rsync).",
|
|
596
|
+
"# .gitignore is also respected automatically.",
|
|
597
|
+
"",
|
|
598
|
+
"# VCS / local env",
|
|
599
|
+
".git/",
|
|
600
|
+
".venv/",
|
|
601
|
+
"venv/",
|
|
602
|
+
".env",
|
|
603
|
+
".env.*",
|
|
604
|
+
"",
|
|
605
|
+
"# Python / Node caches",
|
|
606
|
+
"__pycache__/",
|
|
607
|
+
"*.py[cod]",
|
|
608
|
+
".pytest_cache/",
|
|
609
|
+
".mypy_cache/",
|
|
610
|
+
".ruff_cache/",
|
|
611
|
+
"node_modules/",
|
|
612
|
+
"",
|
|
613
|
+
"# Build / artifacts",
|
|
614
|
+
"dist/",
|
|
615
|
+
"build/",
|
|
616
|
+
"coverage/",
|
|
617
|
+
"*.log",
|
|
618
|
+
"",
|
|
619
|
+
"# Runtime logs (never sync)",
|
|
620
|
+
"logs/",
|
|
621
|
+
"**/logs/",
|
|
622
|
+
]
|
|
623
|
+
|
|
624
|
+
# Project-aware optional excludes: add only when directory exists.
|
|
625
|
+
candidates = [
|
|
626
|
+
"archive/",
|
|
627
|
+
"docs/",
|
|
628
|
+
"tests/",
|
|
629
|
+
"frontend/tests/",
|
|
630
|
+
".redeploy/state/",
|
|
631
|
+
".redeploy/logs/",
|
|
632
|
+
"db/logs/",
|
|
633
|
+
"db/backups/",
|
|
634
|
+
]
|
|
635
|
+
existing = [c for c in candidates if (project_root / c.rstrip("/")).exists()]
|
|
636
|
+
if existing:
|
|
637
|
+
lines += ["", "# Optional heavy/operational paths detected in this project"]
|
|
638
|
+
lines += existing
|
|
639
|
+
|
|
640
|
+
target.write_text("\n".join(lines) + "\n", encoding="utf-8")
|
|
641
|
+
console.print(f"[dim]generated {target.name} (first run)[/dim]")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: redeploy
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.66
|
|
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
|
+
  
|
|
37
37
|
|
|
38
|
-
- 🤖 **LLM usage:** $7.5000 (
|
|
39
|
-
- 👤 **Human dev:** ~$
|
|
38
|
+
- 🤖 **LLM usage:** $7.5000 (86 commits)
|
|
39
|
+
- 👤 **Human dev:** ~$3331 (33.3h @ $100/h, 30min dedup)
|
|
40
40
|
|
|
41
41
|
Generated on 2026-04-23 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
|