redeploy 0.2.13__tar.gz → 0.2.14__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 (109) hide show
  1. {redeploy-0.2.13 → redeploy-0.2.14}/PKG-INFO +6 -6
  2. {redeploy-0.2.13 → redeploy-0.2.14}/README.md +5 -5
  3. {redeploy-0.2.13 → redeploy-0.2.14}/pyproject.toml +1 -1
  4. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/__init__.py +1 -1
  5. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/apply/executor.py +2 -1
  6. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_cli.py +4 -4
  7. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_executor.py +7 -0
  8. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_spec_loader.py +4 -4
  9. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy.egg-info/PKG-INFO +6 -6
  10. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/apply/__init__.py +0 -0
  11. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/cli.py +0 -0
  12. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/data_sync.py +0 -0
  13. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/detect/__init__.py +0 -0
  14. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/detect/detector.py +0 -0
  15. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/detect/probes.py +0 -0
  16. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/detect/remote.py +0 -0
  17. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/detect/templates.py +0 -0
  18. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/detect/workflow.py +0 -0
  19. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/discovery.py +0 -0
  20. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/dsl/__init__.py +0 -0
  21. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/dsl/loader.py +0 -0
  22. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/dsl/parser.py +0 -0
  23. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/dsl_python/__init__.py +0 -0
  24. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/dsl_python/context.py +0 -0
  25. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/dsl_python/decorators.py +0 -0
  26. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/dsl_python/docker_steps.py +0 -0
  27. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/dsl_python/exceptions.py +0 -0
  28. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/dsl_python/runner.py +0 -0
  29. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/dsl_python/steps.py +0 -0
  30. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/fleet.py +0 -0
  31. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/iac/__init__.py +0 -0
  32. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/iac/base.py +0 -0
  33. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/iac/docker_compose.py +0 -0
  34. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/iac/parsers/__init__.py +0 -0
  35. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/iac/parsers/compose.py +0 -0
  36. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/iac/registry.py +0 -0
  37. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/markpact/__init__.py +0 -0
  38. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/markpact/compiler.py +0 -0
  39. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/markpact/models.py +0 -0
  40. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/markpact/parser.py +0 -0
  41. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/models.py +0 -0
  42. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/observe.py +0 -0
  43. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/parse.py +0 -0
  44. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/patterns.py +0 -0
  45. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/plan/__init__.py +0 -0
  46. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/plan/planner.py +0 -0
  47. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/plugins/__init__.py +0 -0
  48. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/plugins/builtin/__init__.py +0 -0
  49. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/plugins/builtin/browser_reload.py +0 -0
  50. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/plugins/builtin/notify.py +0 -0
  51. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/plugins/builtin/systemd_reload.py +0 -0
  52. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/spec_loader.py +0 -0
  53. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/ssh.py +0 -0
  54. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/steps.py +0 -0
  55. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/__init__.py +0 -0
  56. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_data_sync.py +0 -0
  57. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_discovery.py +0 -0
  58. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_dsl.py +0 -0
  59. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_examples.py +0 -0
  60. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_fleet.py +0 -0
  61. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_git_integration.py +0 -0
  62. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_iac.py +0 -0
  63. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_manifest.py +0 -0
  64. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_markpact_compiler.py +0 -0
  65. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_markpact_parser.py +0 -0
  66. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_models.py +0 -0
  67. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_observe.py +0 -0
  68. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_parse.py +0 -0
  69. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_patterns.py +0 -0
  70. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_planner_edge.py +0 -0
  71. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_plugins.py +0 -0
  72. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_probes.py +0 -0
  73. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_public_api.py +0 -0
  74. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_ssh.py +0 -0
  75. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_templates.py +0 -0
  76. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_verify.py +0 -0
  77. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_version.py +0 -0
  78. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_version_changelog.py +0 -0
  79. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_version_cli.py +0 -0
  80. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_version_manifest.py +0 -0
  81. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_version_sources.py +0 -0
  82. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/tests/test_workflow.py +0 -0
  83. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/verify.py +0 -0
  84. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/version/__init__.py +0 -0
  85. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/version/bump.py +0 -0
  86. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/version/changelog.py +0 -0
  87. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/version/commits.py +0 -0
  88. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/version/diff.py +0 -0
  89. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/version/git_integration.py +0 -0
  90. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/version/git_transaction.py +0 -0
  91. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/version/manifest.py +0 -0
  92. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/version/sources/__init__.py +0 -0
  93. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/version/sources/base.py +0 -0
  94. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/version/sources/json_.py +0 -0
  95. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/version/sources/plain.py +0 -0
  96. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/version/sources/regex.py +0 -0
  97. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/version/sources/toml_.py +0 -0
  98. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/version/sources/yaml_.py +0 -0
  99. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/version/transaction.py +0 -0
  100. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy/version.py +0 -0
  101. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy.egg-info/SOURCES.txt +0 -0
  102. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy.egg-info/dependency_links.txt +0 -0
  103. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy.egg-info/entry_points.txt +0 -0
  104. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy.egg-info/requires.txt +0 -0
  105. {redeploy-0.2.13 → redeploy-0.2.14}/redeploy.egg-info/top_level.txt +0 -0
  106. {redeploy-0.2.13 → redeploy-0.2.14}/setup.cfg +0 -0
  107. {redeploy-0.2.13 → redeploy-0.2.14}/tests/test_iac.py +0 -0
  108. {redeploy-0.2.13 → redeploy-0.2.14}/tests/test_parse.py +0 -0
  109. {redeploy-0.2.13 → redeploy-0.2.14}/tests/test_redeploy.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: redeploy
3
- Version: 0.2.13
3
+ Version: 0.2.14
4
4
  Summary: Infrastructure migration toolkit: detect → plan → apply
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -27,17 +27,17 @@ Requires-Dist: pfix>=0.1.60; extra == "dev"
27
27
 
28
28
  ## AI Cost Tracking
29
29
 
30
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.13-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
31
- ![AI Cost](https://img.shields.io/badge/AI%20Cost-$4.80-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-9.3h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
30
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.14-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
31
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$4.95-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-9.5h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
32
32
 
33
- - 🤖 **LLM usage:** $4.8000 (32 commits)
34
- - 👤 **Human dev:** ~$925 (9.3h @ $100/h, 30min dedup)
33
+ - 🤖 **LLM usage:** $4.9500 (33 commits)
34
+ - 👤 **Human dev:** ~$951 (9.5h @ $100/h, 30min dedup)
35
35
 
36
36
  Generated on 2026-04-20 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
37
37
 
38
38
  ---
39
39
 
40
- ![PyPI](https://img.shields.io/badge/pypi-redeploy-blue) ![Version](https://img.shields.io/badge/version-0.2.13-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
40
+ ![PyPI](https://img.shields.io/badge/pypi-redeploy-blue) ![Version](https://img.shields.io/badge/version-0.2.14-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
41
41
 
42
42
  Infrastructure migration and device deploy toolkit — VPS, Raspberry Pi kiosk, Podman Quadlet, k3s.
43
43
 
@@ -3,17 +3,17 @@
3
3
 
4
4
  ## AI Cost Tracking
5
5
 
6
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.13-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-$4.80-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-9.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.14-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-$4.95-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-9.5h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
8
8
 
9
- - 🤖 **LLM usage:** $4.8000 (32 commits)
10
- - 👤 **Human dev:** ~$925 (9.3h @ $100/h, 30min dedup)
9
+ - 🤖 **LLM usage:** $4.9500 (33 commits)
10
+ - 👤 **Human dev:** ~$951 (9.5h @ $100/h, 30min dedup)
11
11
 
12
12
  Generated on 2026-04-20 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.13-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.14-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
17
17
 
18
18
  Infrastructure migration and device deploy toolkit — VPS, Raspberry Pi kiosk, Podman Quadlet, k3s.
19
19
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "redeploy"
7
- version = "0.2.13"
7
+ version = "0.2.14"
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.13"
10
+ __version__ = "0.2.14"
11
11
 
12
12
  # ── Core models ───────────────────────────────────────────────────────────────
13
13
  from .models import ( # noqa: F401
@@ -232,7 +232,8 @@ class Executor:
232
232
  cmd = step.command
233
233
  if not cmd:
234
234
  raise StepError(step, "No command specified")
235
- r = self.probe.run(cmd, timeout=300)
235
+ timeout = step.timeout or 300
236
+ r = self.probe.run(cmd, timeout=timeout)
236
237
  step.result = r.out[:500]
237
238
  if not r.ok:
238
239
  raise StepError(step, f"exit={r.exit_code}: {r.stderr[:200]}")
@@ -37,7 +37,7 @@ def _migration_markdown_supported() -> str:
37
37
  """\
38
38
  # Markdown migration
39
39
 
40
- ```markpact:config yaml
40
+ ```yaml markpact:config
41
41
  name: markdown migration
42
42
  description: migration loaded from markpact markdown
43
43
  source:
@@ -53,7 +53,7 @@ target:
53
53
  remote_dir: ~/myapp
54
54
  ```
55
55
 
56
- ```markpact:steps yaml
56
+ ```yaml markpact:steps
57
57
  extra_steps:
58
58
  - id: sync_env
59
59
  src: .env
@@ -68,7 +68,7 @@ def _migration_markdown_with_unsupported_block() -> str:
68
68
  """\
69
69
  # Markdown migration
70
70
 
71
- ```markpact:config yaml
71
+ ```yaml markpact:config
72
72
  name: markdown migration
73
73
  source:
74
74
  strategy: docker_full
@@ -83,7 +83,7 @@ target:
83
83
  remote_dir: ~/myapp
84
84
  ```
85
85
 
86
- ```markpact:python
86
+ ```python markpact:python
87
87
  print("unsupported in phase 1")
88
88
  ```
89
89
  """
@@ -192,6 +192,13 @@ class TestRunSsh:
192
192
  exc.run()
193
193
  assert step.result == "result_value"
194
194
 
195
+ def test_uses_step_timeout(self):
196
+ step = _make_step("ssh_timeout", command="echo long", timeout=1234)
197
+ plan = _make_plan([step])
198
+ exc = _executor(plan)
199
+ exc.run()
200
+ assert exc.probe.run.call_args.kwargs["timeout"] == 1234
201
+
195
202
 
196
203
  # ── _run_scp ──────────────────────────────────────────────────────────────────
197
204
 
@@ -29,7 +29,7 @@ def _migration_markdown() -> str:
29
29
  """\
30
30
  # Markdown migration
31
31
 
32
- ```markpact:config yaml
32
+ ```yaml markpact:config
33
33
  name: loader markdown test
34
34
  source:
35
35
  strategy: docker_full
@@ -44,7 +44,7 @@ target:
44
44
  remote_dir: ~/myapp
45
45
  ```
46
46
 
47
- ```markpact:steps yaml
47
+ ```yaml markpact:steps
48
48
  extra_steps:
49
49
  - id: wait_startup
50
50
  seconds: 5
@@ -79,7 +79,7 @@ def test_load_migration_spec_rejects_unsupported_markdown_block(tmp_path):
79
79
  textwrap.dedent("""\
80
80
  # Markdown migration
81
81
 
82
- ```markpact:config yaml
82
+ ```yaml markpact:config
83
83
  name: broken markdown test
84
84
  source:
85
85
  strategy: docker_full
@@ -92,7 +92,7 @@ def test_load_migration_spec_rejects_unsupported_markdown_block(tmp_path):
92
92
  remote_dir: ~/myapp
93
93
  ```
94
94
 
95
- ```markpact:python
95
+ ```python markpact:python
96
96
  print("unsupported")
97
97
  ```
98
98
  """),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: redeploy
3
- Version: 0.2.13
3
+ Version: 0.2.14
4
4
  Summary: Infrastructure migration toolkit: detect → plan → apply
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -27,17 +27,17 @@ Requires-Dist: pfix>=0.1.60; extra == "dev"
27
27
 
28
28
  ## AI Cost Tracking
29
29
 
30
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.13-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
31
- ![AI Cost](https://img.shields.io/badge/AI%20Cost-$4.80-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-9.3h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
30
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.2.14-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
31
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$4.95-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-9.5h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
32
32
 
33
- - 🤖 **LLM usage:** $4.8000 (32 commits)
34
- - 👤 **Human dev:** ~$925 (9.3h @ $100/h, 30min dedup)
33
+ - 🤖 **LLM usage:** $4.9500 (33 commits)
34
+ - 👤 **Human dev:** ~$951 (9.5h @ $100/h, 30min dedup)
35
35
 
36
36
  Generated on 2026-04-20 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
37
37
 
38
38
  ---
39
39
 
40
- ![PyPI](https://img.shields.io/badge/pypi-redeploy-blue) ![Version](https://img.shields.io/badge/version-0.2.13-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
40
+ ![PyPI](https://img.shields.io/badge/pypi-redeploy-blue) ![Version](https://img.shields.io/badge/version-0.2.14-blue) ![Python](https://img.shields.io/badge/python-3.10+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
41
41
 
42
42
  Infrastructure migration and device deploy toolkit — VPS, Raspberry Pi kiosk, Podman Quadlet, k3s.
43
43
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes