remo-cli 4.3.0__tar.gz → 4.3.2__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 (647) hide show
  1. {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/ci.yml +5 -5
  2. {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/dev-build.yml +1 -1
  3. {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/provision.yml +1 -1
  4. {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/release-please.yml +13 -3
  5. {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/release.yml +2 -2
  6. {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/smoke-test.yml +3 -3
  7. {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/teardown.yml +1 -1
  8. remo_cli-4.3.2/.release-please-manifest.json +3 -0
  9. {remo_cli-4.3.0 → remo_cli-4.3.2}/CHANGELOG.md +14 -0
  10. {remo_cli-4.3.0 → remo_cli-4.3.2}/PKG-INFO +17 -1
  11. {remo_cli-4.3.0 → remo_cli-4.3.2}/README.md +16 -0
  12. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/user_setup/tasks/main.yml +14 -0
  13. remo_cli-4.3.2/docs/examples/orbstack-cloud-init.yaml +120 -0
  14. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/package-lock.json +24 -24
  15. {remo_cli-4.3.0 → remo_cli-4.3.2}/pyproject.toml +1 -1
  16. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/ssh.py +18 -1
  17. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/models/host.py +16 -0
  18. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/check.py +4 -1
  19. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/config.py +25 -0
  20. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/discovery.py +11 -5
  21. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/terminal.py +4 -1
  22. remo_cli-4.3.2/tests/ansible/test_user_setup_docker_group.py +88 -0
  23. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_ssh_identity_opts.py +66 -0
  24. remo_cli-4.3.2/tests/unit/test_docs_examples.py +80 -0
  25. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/test_host_ssh_type.py +19 -0
  26. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_discovery.py +33 -1
  27. remo_cli-4.3.2/tests/unit/web/test_service_identity_selection.py +95 -0
  28. {remo_cli-4.3.0 → remo_cli-4.3.2}/uv.lock +51 -54
  29. remo_cli-4.3.0/.release-please-manifest.json +0 -3
  30. {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/release/SKILL.md +0 -0
  31. {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-analyze/SKILL.md +0 -0
  32. {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-checklist/SKILL.md +0 -0
  33. {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-clarify/SKILL.md +0 -0
  34. {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-constitution/SKILL.md +0 -0
  35. {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-converge/SKILL.md +0 -0
  36. {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-git-commit/SKILL.md +0 -0
  37. {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-git-feature/SKILL.md +0 -0
  38. {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-git-initialize/SKILL.md +0 -0
  39. {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-git-remote/SKILL.md +0 -0
  40. {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-git-validate/SKILL.md +0 -0
  41. {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-implement/SKILL.md +0 -0
  42. {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-plan/SKILL.md +0 -0
  43. {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-specify/SKILL.md +0 -0
  44. {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-tasks/SKILL.md +0 -0
  45. {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-taskstoissues/SKILL.md +0 -0
  46. {remo_cli-4.3.0 → remo_cli-4.3.2}/.devcontainer/devcontainer.json +0 -0
  47. {remo_cli-4.3.0 → remo_cli-4.3.2}/.dockerignore +0 -0
  48. {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/CODEOWNERS +0 -0
  49. {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/dependabot.yml +0 -0
  50. {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/codeql.yml +0 -0
  51. {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/dependency-review.yml +0 -0
  52. {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/smoke-test-cleanup.yml +0 -0
  53. {remo_cli-4.3.0 → remo_cli-4.3.2}/.gitignore +0 -0
  54. {remo_cli-4.3.0 → remo_cli-4.3.2}/.maverick/checkpoints/feature/implementation_complete.json +0 -0
  55. {remo_cli-4.3.0 → remo_cli-4.3.2}/.maverick/checkpoints/feature/phase_${{ index }}_complete.json +0 -0
  56. {remo_cli-4.3.0 → remo_cli-4.3.2}/.maverick/checkpoints/feature/validation_complete.json +0 -0
  57. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/.registry +0 -0
  58. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/README.md +0 -0
  59. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/commands/speckit.git.commit.md +0 -0
  60. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/commands/speckit.git.feature.md +0 -0
  61. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/commands/speckit.git.initialize.md +0 -0
  62. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/commands/speckit.git.remote.md +0 -0
  63. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/commands/speckit.git.validate.md +0 -0
  64. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/config-template.yml +0 -0
  65. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/extension.yml +0 -0
  66. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/git-config.yml +0 -0
  67. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/scripts/bash/auto-commit.sh +0 -0
  68. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/scripts/bash/create-new-feature.sh +0 -0
  69. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/scripts/bash/git-common.sh +0 -0
  70. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  71. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  72. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/scripts/powershell/create-new-feature.ps1 +0 -0
  73. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  74. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  75. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions.yml +0 -0
  76. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/feature.json +0 -0
  77. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/init-options.json +0 -0
  78. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/integration.json +0 -0
  79. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/integrations/claude.manifest.json +0 -0
  80. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/integrations/speckit.manifest.json +0 -0
  81. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/memory/constitution.md +0 -0
  82. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/scripts/bash/check-prerequisites.sh +0 -0
  83. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/scripts/bash/common.sh +0 -0
  84. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/scripts/bash/create-new-feature.sh +0 -0
  85. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/scripts/bash/setup-plan.sh +0 -0
  86. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/scripts/bash/setup-tasks.sh +0 -0
  87. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/scripts/bash/update-agent-context.sh +0 -0
  88. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/templates/agent-file-template.md +0 -0
  89. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/templates/checklist-template.md +0 -0
  90. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/templates/constitution-template.md +0 -0
  91. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/templates/plan-template.md +0 -0
  92. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/templates/spec-template.md +0 -0
  93. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/templates/tasks-template.md +0 -0
  94. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/workflows/speckit/workflow.yml +0 -0
  95. {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/workflows/workflow-registry.json +0 -0
  96. {remo_cli-4.3.0 → remo_cli-4.3.2}/AGENTS.md +0 -0
  97. {remo_cli-4.3.0 → remo_cli-4.3.2}/CLAUDE.md +0 -0
  98. {remo_cli-4.3.0 → remo_cli-4.3.2}/CONTRIBUTING.md +0 -0
  99. {remo_cli-4.3.0 → remo_cli-4.3.2}/Dockerfile +0 -0
  100. {remo_cli-4.3.0 → remo_cli-4.3.2}/LICENSE +0 -0
  101. {remo_cli-4.3.0 → remo_cli-4.3.2}/SECURITY.md +0 -0
  102. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/.ansible-lint +0 -0
  103. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/README.md +0 -0
  104. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/ansible.cfg +0 -0
  105. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/aws_configure.yml +0 -0
  106. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/aws_resize.yml +0 -0
  107. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/aws_site.yml +0 -0
  108. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/aws_teardown.yml +0 -0
  109. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/group_vars/all.yml +0 -0
  110. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/group_vars/incus_containers.yml +0 -0
  111. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/group_vars/proxmox_containers.yml +0 -0
  112. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/hetzner_configure.yml +0 -0
  113. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/hetzner_provision.yml +0 -0
  114. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/hetzner_resize.yml +0 -0
  115. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/hetzner_site.yml +0 -0
  116. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/hetzner_teardown.yml +0 -0
  117. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/incus_bootstrap.yml +0 -0
  118. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/incus_configure.yml +0 -0
  119. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/incus_provision.yml +0 -0
  120. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/incus_resize.yml +0 -0
  121. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/incus_site.yml +0 -0
  122. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/incus_teardown.yml +0 -0
  123. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/inventory/hosts.yml +0 -0
  124. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/inventory/incus_containers.yml +0 -0
  125. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/proxmox_bootstrap.yml +0 -0
  126. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/proxmox_configure.yml +0 -0
  127. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/proxmox_provision.yml +0 -0
  128. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/proxmox_resize.yml +0 -0
  129. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/proxmox_site.yml +0 -0
  130. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/proxmox_teardown.yml +0 -0
  131. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/requirements.yml +0 -0
  132. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/aws_server/defaults/main.yml +0 -0
  133. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/aws_server/tasks/ebs.yml +0 -0
  134. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/aws_server/tasks/ec2.yml +0 -0
  135. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/aws_server/tasks/main.yml +0 -0
  136. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/aws_server/tasks/patch_manager.yml +0 -0
  137. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/aws_server/tasks/preflight.yml +0 -0
  138. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/aws_server/tasks/security_group.yml +0 -0
  139. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/deacon/defaults/main.yml +0 -0
  140. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/deacon/tasks/main.yml +0 -0
  141. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/devcontainers/tasks/main.yml +0 -0
  142. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/docker/handlers/main.yml +0 -0
  143. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/docker/tasks/main.yml +0 -0
  144. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/fzf/tasks/main.yml +0 -0
  145. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/github_cli/tasks/main.yml +0 -0
  146. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/hetzner_server/defaults/main.yml +0 -0
  147. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/hetzner_server/tasks/main.yml +0 -0
  148. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_bootstrap/defaults/main.yml +0 -0
  149. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_bootstrap/handlers/main.yml +0 -0
  150. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_bootstrap/tasks/main.yml +0 -0
  151. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_container/defaults/main.yml +0 -0
  152. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_container/handlers/main.yml +0 -0
  153. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_container/meta/main.yml +0 -0
  154. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_container/tasks/main.yml +0 -0
  155. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_container/tasks/preflight.yml +0 -0
  156. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_container_teardown/defaults/main.yml +0 -0
  157. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_container_teardown/meta/main.yml +0 -0
  158. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_container_teardown/tasks/main.yml +0 -0
  159. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/nodejs/defaults/main.yml +0 -0
  160. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/nodejs/files/nodesource-repo.gpg.key +0 -0
  161. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/nodejs/tasks/main.yml +0 -0
  162. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_bootstrap/defaults/main.yml +0 -0
  163. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_bootstrap/meta/main.yml +0 -0
  164. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_bootstrap/tasks/main.yml +0 -0
  165. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_container/defaults/main.yml +0 -0
  166. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_container/handlers/main.yml +0 -0
  167. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_container/meta/main.yml +0 -0
  168. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_container/tasks/main.yml +0 -0
  169. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_container/tasks/preflight.yml +0 -0
  170. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_container_teardown/defaults/main.yml +0 -0
  171. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_container_teardown/meta/main.yml +0 -0
  172. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_container_teardown/tasks/main.yml +0 -0
  173. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/user_setup/defaults/main.yml +0 -0
  174. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/user_setup/templates/devshell.sh.j2 +0 -0
  175. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/user_setup/templates/project-launch.sh.j2 +0 -0
  176. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/user_setup/templates/project-menu.sh.j2 +0 -0
  177. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/user_setup/templates/remo-host.sh.j2 +0 -0
  178. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/zellij/defaults/main.yml +0 -0
  179. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/zellij/tasks/main.yml +0 -0
  180. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/zellij/templates/config.kdl.j2 +0 -0
  181. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/zellij/templates/layouts/minimal.kdl.j2 +0 -0
  182. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/ssh_configure.yml +0 -0
  183. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/tasks/configure_dev_tools.yml +0 -0
  184. {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/tasks/repair_apt_sources.yml +0 -0
  185. {remo_cli-4.3.0 → remo_cli-4.3.2}/docker/Dockerfile +0 -0
  186. {remo_cli-4.3.0 → remo_cli-4.3.2}/docker/compose.example.yml +0 -0
  187. {remo_cli-4.3.0 → remo_cli-4.3.2}/docker/entrypoint.sh +0 -0
  188. {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/aws.md +0 -0
  189. {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/feature-history.md +0 -0
  190. {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/hetzner.md +0 -0
  191. {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/incus.md +0 -0
  192. {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/install.sh +0 -0
  193. {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/maintaining-claude-md.md +0 -0
  194. {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/maintaining-generated-types.md +0 -0
  195. {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/providers.md +0 -0
  196. {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/proxmox.md +0 -0
  197. {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/remo-web-speckit-input.md +0 -0
  198. {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/remo-web.html +0 -0
  199. {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/web-session-interface.md +0 -0
  200. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/index.html +0 -0
  201. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/package.json +0 -0
  202. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/scripts/check-types-fresh.mjs +0 -0
  203. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/scripts/generate-frame-types.mjs +0 -0
  204. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/scripts/generate-schema-types.mjs +0 -0
  205. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/api/client.test.ts +0 -0
  206. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/api/client.ts +0 -0
  207. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/api/generated/README.md +0 -0
  208. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/api/generated/openapi.json +0 -0
  209. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/api/generated/schema.d.ts +0 -0
  210. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/api/generated/terminal-frames.d.ts +0 -0
  211. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/api/generated/terminal-frames.json +0 -0
  212. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/api/generated.test.ts +0 -0
  213. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/AppRoot.tsx +0 -0
  214. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/AppShell.css +0 -0
  215. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/AppShell.tsx +0 -0
  216. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/AwaitingAdoption.css +0 -0
  217. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/AwaitingAdoption.tsx +0 -0
  218. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/OfflineOverlay.css +0 -0
  219. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/OfflineOverlay.tsx +0 -0
  220. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/PairToSync.css +0 -0
  221. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/PairToSync.tsx +0 -0
  222. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/SessionRail.css +0 -0
  223. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/SessionRail.tsx +0 -0
  224. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/SettingsPage.css +0 -0
  225. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/SettingsPage.tsx +0 -0
  226. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/ShortcutsModal.css +0 -0
  227. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/ShortcutsModal.tsx +0 -0
  228. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/TerminalCard.css +0 -0
  229. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/TerminalCard.test.tsx +0 -0
  230. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/TerminalCard.tsx +0 -0
  231. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/TopBar.css +0 -0
  232. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/TopBar.tsx +0 -0
  233. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/WorkspacePane.css +0 -0
  234. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/WorkspacePane.test.tsx +0 -0
  235. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/WorkspacePane.tsx +0 -0
  236. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/masterLayout.test.ts +0 -0
  237. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/masterLayout.ts +0 -0
  238. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/providerMeta.test.ts +0 -0
  239. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/providerMeta.ts +0 -0
  240. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/railModel.test.ts +0 -0
  241. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/railModel.ts +0 -0
  242. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/lib/clipboard.ts +0 -0
  243. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/lib/fullscreen.ts +0 -0
  244. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/main.tsx +0 -0
  245. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/discovery.test.ts +0 -0
  246. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/discovery.ts +0 -0
  247. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/fonts.ts +0 -0
  248. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/health.test.ts +0 -0
  249. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/health.ts +0 -0
  250. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/latency.test.ts +0 -0
  251. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/latency.ts +0 -0
  252. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/settings.test.ts +0 -0
  253. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/settings.ts +0 -0
  254. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/useConsoleKeyboard.ts +0 -0
  255. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/workspace.test.ts +0 -0
  256. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/workspace.ts +0 -0
  257. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/terminal/.gitkeep +0 -0
  258. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/terminal/RendererAdapter.ts +0 -0
  259. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/terminal/TerminalConnection.test.ts +0 -0
  260. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/terminal/TerminalConnection.ts +0 -0
  261. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/terminal/XtermRenderer.ts +0 -0
  262. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/terminal/defaultRenderer.ts +0 -0
  263. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/terminal/keymap.test.ts +0 -0
  264. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/terminal/keymap.ts +0 -0
  265. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/test/setup.ts +0 -0
  266. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/theme/fonts.ts +0 -0
  267. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/theme/terminalThemes.test.ts +0 -0
  268. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/theme/terminalThemes.ts +0 -0
  269. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/theme/tokens.css +0 -0
  270. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/tsconfig.json +0 -0
  271. {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/vite.config.ts +0 -0
  272. {remo_cli-4.3.0 → remo_cli-4.3.2}/install.sh +0 -0
  273. {remo_cli-4.3.0 → remo_cli-4.3.2}/maverick.yaml +0 -0
  274. {remo_cli-4.3.0 → remo_cli-4.3.2}/playwright.config.ts +0 -0
  275. {remo_cli-4.3.0 → remo_cli-4.3.2}/project-menu.sh +0 -0
  276. {remo_cli-4.3.0 → remo_cli-4.3.2}/release-please-config.json +0 -0
  277. {remo_cli-4.3.0 → remo_cli-4.3.2}/remo +0 -0
  278. {remo_cli-4.3.0 → remo_cli-4.3.2}/remo.svg +0 -0
  279. {remo_cli-4.3.0 → remo_cli-4.3.2}/run.sh +0 -0
  280. {remo_cli-4.3.0 → remo_cli-4.3.2}/scripts/export_openapi.py +0 -0
  281. {remo_cli-4.3.0 → remo_cli-4.3.2}/scripts/palette-check.sh +0 -0
  282. {remo_cli-4.3.0 → remo_cli-4.3.2}/scripts/setup-aws-oidc.sh +0 -0
  283. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/checklists/requirements.md +0 -0
  284. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/checklists/validation.md +0 -0
  285. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/contracts/playbook-interface.yaml +0 -0
  286. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/contracts/role-interface.yaml +0 -0
  287. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/data-model.md +0 -0
  288. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/plan.md +0 -0
  289. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/quickstart.md +0 -0
  290. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/research.md +0 -0
  291. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/spec.md +0 -0
  292. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/tasks.md +0 -0
  293. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/002-incus-container-support/checklists/requirements.md +0 -0
  294. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/002-incus-container-support/contracts/playbook-interface.yaml +0 -0
  295. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/002-incus-container-support/contracts/role-interface.yaml +0 -0
  296. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/002-incus-container-support/data-model.md +0 -0
  297. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/002-incus-container-support/plan.md +0 -0
  298. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/002-incus-container-support/quickstart.md +0 -0
  299. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/002-incus-container-support/research.md +0 -0
  300. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/002-incus-container-support/spec.md +0 -0
  301. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/002-incus-container-support/tasks.md +0 -0
  302. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/003-python-cli-rewrite/checklists/requirements.md +0 -0
  303. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/003-python-cli-rewrite/data-model.md +0 -0
  304. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/003-python-cli-rewrite/plan.md +0 -0
  305. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/003-python-cli-rewrite/quickstart.md +0 -0
  306. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/003-python-cli-rewrite/research.md +0 -0
  307. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/003-python-cli-rewrite/spec.md +0 -0
  308. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/003-python-cli-rewrite/tasks.md +0 -0
  309. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/004-proxmox-container-support/spec.md +0 -0
  310. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/005-provider-snapshots/checklists/requirements.md +0 -0
  311. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/005-provider-snapshots/contracts/cli-surface.md +0 -0
  312. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/005-provider-snapshots/data-model.md +0 -0
  313. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/005-provider-snapshots/plan.md +0 -0
  314. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/005-provider-snapshots/quickstart.md +0 -0
  315. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/005-provider-snapshots/research.md +0 -0
  316. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/005-provider-snapshots/spec.md +0 -0
  317. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/005-provider-snapshots/tasks.md +0 -0
  318. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/checklists/requirements.md +0 -0
  319. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/contracts/remo-host-protocol.md +0 -0
  320. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/contracts/rest-api.md +0 -0
  321. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/contracts/terminal-websocket.md +0 -0
  322. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/data-model.md +0 -0
  323. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/plan.md +0 -0
  324. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/quickstart.md +0 -0
  325. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/research.md +0 -0
  326. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/spec.md +0 -0
  327. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/tasks.md +0 -0
  328. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/checklists/requirements.md +0 -0
  329. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/contracts/cli-web-adopt.md +0 -0
  330. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/contracts/setup-api.md +0 -0
  331. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/data-model.md +0 -0
  332. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/plan.md +0 -0
  333. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/quickstart-results.md +0 -0
  334. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/quickstart.md +0 -0
  335. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/research.md +0 -0
  336. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/spec.md +0 -0
  337. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/tasks.md +0 -0
  338. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/012-web-adopt-pairing/contracts/cli-web-adopt.md +0 -0
  339. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/012-web-adopt-pairing/contracts/pairing-api.md +0 -0
  340. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/012-web-adopt-pairing/contracts/setup-api.md +0 -0
  341. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/012-web-adopt-pairing/data-model.md +0 -0
  342. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/012-web-adopt-pairing/plan.md +0 -0
  343. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/012-web-adopt-pairing/quickstart.md +0 -0
  344. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/012-web-adopt-pairing/research.md +0 -0
  345. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/012-web-adopt-pairing/spec.md +0 -0
  346. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/012-web-adopt-pairing/tasks.md +0 -0
  347. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/013-managed-instance-tags/contracts/cli-sync.md +0 -0
  348. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/013-managed-instance-tags/contracts/marker-commands.md +0 -0
  349. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/013-managed-instance-tags/data-model.md +0 -0
  350. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/013-managed-instance-tags/plan.md +0 -0
  351. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/013-managed-instance-tags/quickstart.md +0 -0
  352. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/013-managed-instance-tags/research.md +0 -0
  353. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/013-managed-instance-tags/spec.md +0 -0
  354. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/013-managed-instance-tags/tasks.md +0 -0
  355. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/014-register-ssh-host/contracts/add-command.md +0 -0
  356. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/014-register-ssh-host/contracts/remove-command.md +0 -0
  357. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/014-register-ssh-host/data-model.md +0 -0
  358. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/014-register-ssh-host/plan.md +0 -0
  359. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/014-register-ssh-host/quickstart.md +0 -0
  360. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/014-register-ssh-host/research.md +0 -0
  361. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/014-register-ssh-host/spec.md +0 -0
  362. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/014-register-ssh-host/tasks.md +0 -0
  363. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/checklists/requirements.md +0 -0
  364. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/contracts/mirror-payload-v2.md +0 -0
  365. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/contracts/registry-accessor-api.md +0 -0
  366. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/contracts/registry-file-v2.md +0 -0
  367. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/data-model.md +0 -0
  368. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/plan.md +0 -0
  369. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/quickstart.md +0 -0
  370. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/research.md +0 -0
  371. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/spec.md +0 -0
  372. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/tasks.md +0 -0
  373. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/016-sync-reconcile/checklists/requirements.md +0 -0
  374. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/016-sync-reconcile/contracts/cli-sync.md +0 -0
  375. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/016-sync-reconcile/contracts/provider-probe.md +0 -0
  376. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/016-sync-reconcile/data-model.md +0 -0
  377. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/016-sync-reconcile/plan.md +0 -0
  378. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/016-sync-reconcile/quickstart.md +0 -0
  379. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/016-sync-reconcile/research.md +0 -0
  380. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/016-sync-reconcile/spec.md +0 -0
  381. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/016-sync-reconcile/tasks.md +0 -0
  382. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/checklists/requirements.md +0 -0
  383. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/contracts/cli-web-push.md +0 -0
  384. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/contracts/cli-web-status.md +0 -0
  385. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/contracts/revocation.md +0 -0
  386. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/contracts/setup-status-marker.md +0 -0
  387. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/data-model.md +0 -0
  388. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/plan.md +0 -0
  389. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/quickstart.md +0 -0
  390. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/research.md +0 -0
  391. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/spec.md +0 -0
  392. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/tasks.md +0 -0
  393. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/baseline-notes.md +0 -0
  394. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/checklists/requirements.md +0 -0
  395. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/contracts/cli-surface.md +0 -0
  396. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/contracts/errors.md +0 -0
  397. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/contracts/lifecycle-templates.md +0 -0
  398. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/contracts/provider-protocol.md +0 -0
  399. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/contracts/sync-merge.md +0 -0
  400. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/data-model.md +0 -0
  401. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/plan.md +0 -0
  402. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/quickstart.md +0 -0
  403. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/research.md +0 -0
  404. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/spec.md +0 -0
  405. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/tasks.md +0 -0
  406. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/019-hygiene-deps-docs/checklists/requirements.md +0 -0
  407. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/019-hygiene-deps-docs/contracts/cli-surface-delta.md +0 -0
  408. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/019-hygiene-deps-docs/contracts/docs-structure-check.md +0 -0
  409. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/019-hygiene-deps-docs/data-model.md +0 -0
  410. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/019-hygiene-deps-docs/plan.md +0 -0
  411. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/019-hygiene-deps-docs/quickstart.md +0 -0
  412. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/019-hygiene-deps-docs/research.md +0 -0
  413. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/019-hygiene-deps-docs/spec.md +0 -0
  414. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/019-hygiene-deps-docs/tasks.md +0 -0
  415. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/020-openapi-type-generation/checklists/requirements.md +0 -0
  416. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/020-openapi-type-generation/contracts/drift-checks.md +0 -0
  417. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/020-openapi-type-generation/contracts/terminal-frames-v1.md +0 -0
  418. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/020-openapi-type-generation/data-model.md +0 -0
  419. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/020-openapi-type-generation/plan.md +0 -0
  420. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/020-openapi-type-generation/quickstart.md +0 -0
  421. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/020-openapi-type-generation/research.md +0 -0
  422. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/020-openapi-type-generation/spec.md +0 -0
  423. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/020-openapi-type-generation/tasks.md +0 -0
  424. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/021-cli-plane-separation/contracts/cli-surface.md +0 -0
  425. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/021-cli-plane-separation/contracts/descriptor-schema.md +0 -0
  426. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/021-cli-plane-separation/data-model.md +0 -0
  427. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/021-cli-plane-separation/plan.md +0 -0
  428. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/021-cli-plane-separation/quickstart.md +0 -0
  429. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/021-cli-plane-separation/research.md +0 -0
  430. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/021-cli-plane-separation/spec.md +0 -0
  431. {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/021-cli-plane-separation/tasks.md +0 -0
  432. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/__init__.py +0 -0
  433. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/__main__.py +0 -0
  434. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/cli/__init__.py +0 -0
  435. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/cli/added.py +0 -0
  436. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/cli/cp.py +0 -0
  437. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/cli/main.py +0 -0
  438. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/cli/providers/__init__.py +0 -0
  439. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/cli/providers/factory.py +0 -0
  440. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/cli/shell.py +0 -0
  441. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/cli/web.py +0 -0
  442. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/__init__.py +0 -0
  443. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/ansible_runner.py +0 -0
  444. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/completion.py +0 -0
  445. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/config.py +0 -0
  446. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/errors.py +0 -0
  447. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/known_hosts.py +0 -0
  448. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/lifecycle.py +0 -0
  449. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/output.py +0 -0
  450. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/picker.py +0 -0
  451. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/provider_protocol.py +0 -0
  452. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/provider_registry.py +0 -0
  453. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/reconcile.py +0 -0
  454. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/registry.py +0 -0
  455. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/remo_host_client.py +0 -0
  456. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/rsync.py +0 -0
  457. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/snapshot.py +0 -0
  458. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/validation.py +0 -0
  459. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/version.py +0 -0
  460. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/web_adopt.py +0 -0
  461. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/web_drift.py +0 -0
  462. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/models/__init__.py +0 -0
  463. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/models/capability.py +0 -0
  464. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/models/discovery.py +0 -0
  465. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/models/session_target.py +0 -0
  466. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/models/snapshot.py +0 -0
  467. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/__init__.py +0 -0
  468. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/added.py +0 -0
  469. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/aws.py +0 -0
  470. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/aws_descriptor.py +0 -0
  471. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/builtin.py +0 -0
  472. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/hetzner.py +0 -0
  473. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/hetzner_descriptor.py +0 -0
  474. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/incus.py +0 -0
  475. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/incus_descriptor.py +0 -0
  476. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/proxmox.py +0 -0
  477. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/proxmox_descriptor.py +0 -0
  478. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/__init__.py +0 -0
  479. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/api/__init__.py +0 -0
  480. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/api/hosts.py +0 -0
  481. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/api/pairing.py +0 -0
  482. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/api/setup.py +0 -0
  483. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/api/terminals.py +0 -0
  484. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/app.py +0 -0
  485. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/frames.py +0 -0
  486. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/health.py +0 -0
  487. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/logging_config.py +0 -0
  488. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/models.py +0 -0
  489. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/operator_auth.py +0 -0
  490. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/pairing.py +0 -0
  491. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/ssh_master.py +0 -0
  492. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/state.py +0 -0
  493. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/terminal_registry.py +0 -0
  494. {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/tokens.py +0 -0
  495. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/__init__.py +0 -0
  496. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/ansible/__init__.py +0 -0
  497. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/ansible/test_apt_sources_repair.py +0 -0
  498. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/ansible/test_authorized_keys_bootstrap.py +0 -0
  499. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/ansible/test_remo_host_idempotency.py +0 -0
  500. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/ansible/test_ssh_configure_connection.py +0 -0
  501. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/conftest.py +0 -0
  502. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/e2e/fixtures.ts +0 -0
  503. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/e2e/keyboard-routing.spec.ts +0 -0
  504. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/e2e/mobile.spec.ts +0 -0
  505. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/e2e/reconnect.spec.ts +0 -0
  506. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/e2e/terminal-shell-io.spec.ts +0 -0
  507. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/e2e/terminal-tui-compatibility.spec.ts +0 -0
  508. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/e2e/workspace-layout.spec.ts +0 -0
  509. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/image/__init__.py +0 -0
  510. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/image/test_docker_image.py +0 -0
  511. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/__init__.py +0 -0
  512. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/_nine_terminal_fixture.py +0 -0
  513. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/fish_completion.sh +0 -0
  514. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/orbstack-cloud-init.yml +0 -0
  515. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/orbstack.sh +0 -0
  516. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_nine_terminals.py +0 -0
  517. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_nine_terminals_soak.py +0 -0
  518. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_registry_concurrency.py +0 -0
  519. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_remo_host_e2e.py +0 -0
  520. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_security_rejections.py +0 -0
  521. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_setup_payload_versions.py +0 -0
  522. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_sync_reconcile.py +0 -0
  523. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_terminal_attach.py +0 -0
  524. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_web_adopt_e2e.py +0 -0
  525. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_web_cli_parity.py +0 -0
  526. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/perf/__init__.py +0 -0
  527. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/perf/test_latency.py +0 -0
  528. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/perf/test_registry_perf.py +0 -0
  529. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/__init__.py +0 -0
  530. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/__init__.py +0 -0
  531. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/providers/test_aws_snapshot.py +0 -0
  532. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/providers/test_hetzner_snapshot.py +0 -0
  533. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/providers/test_incus_snapshot.py +0 -0
  534. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/providers/test_incus_sync_all.py +0 -0
  535. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/providers/test_proxmox_snapshot.py +0 -0
  536. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/providers/test_proxmox_sync_all.py +0 -0
  537. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/surface_baseline.py +0 -0
  538. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_add_cmd.py +0 -0
  539. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_cli_uniformity.py +0 -0
  540. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_configure_cmd.py +0 -0
  541. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_cp.py +0 -0
  542. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_main.py +0 -0
  543. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_remove_cmd.py +0 -0
  544. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_shell.py +0 -0
  545. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_shell_added.py +0 -0
  546. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_startup_imports.py +0 -0
  547. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_surface_preservation.py +0 -0
  548. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_web_adopt_cmd.py +0 -0
  549. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/__init__.py +0 -0
  550. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_ansible_runner.py +0 -0
  551. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_completion.py +0 -0
  552. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_config.py +0 -0
  553. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_errors.py +0 -0
  554. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_known_hosts.py +0 -0
  555. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_lifecycle.py +0 -0
  556. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_migration_tagging_notice.py +0 -0
  557. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_output.py +0 -0
  558. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_picker.py +0 -0
  559. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_provider_registry.py +0 -0
  560. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_reconcile.py +0 -0
  561. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_registry_format.py +0 -0
  562. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_registry_locking.py +0 -0
  563. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_registry_migration.py +0 -0
  564. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_remo_host_client.py +0 -0
  565. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_rsync.py +0 -0
  566. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_snapshot.py +0 -0
  567. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_ssh.py +0 -0
  568. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_ssh_added.py +0 -0
  569. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_ssh_controlpath.py +0 -0
  570. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_validation.py +0 -0
  571. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_version.py +0 -0
  572. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_web_adopt_authorize.py +0 -0
  573. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_web_adopt_code.py +0 -0
  574. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_web_adopt_payload.py +0 -0
  575. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_web_adopt_trust.py +0 -0
  576. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_web_drift.py +0 -0
  577. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_web_push.py +0 -0
  578. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_web_push_self_heal.py +0 -0
  579. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/models/__init__.py +0 -0
  580. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/models/test_capability.py +0 -0
  581. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/models/test_discovery.py +0 -0
  582. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/models/test_session_target.py +0 -0
  583. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/__init__.py +0 -0
  584. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/fake_provider.py +0 -0
  585. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_added_add.py +0 -0
  586. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_added_configure.py +0 -0
  587. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_added_provider_guard.py +0 -0
  588. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_added_update_remove.py +0 -0
  589. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_added_verify.py +0 -0
  590. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_aws_provider_protocol.py +0 -0
  591. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_aws_snapshot.py +0 -0
  592. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_aws_sync.py +0 -0
  593. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_aws_upgrade_resize.py +0 -0
  594. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_hetzner_entry_adapters.py +0 -0
  595. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_hetzner_http.py +0 -0
  596. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_hetzner_label.py +0 -0
  597. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_hetzner_resize.py +0 -0
  598. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_hetzner_snapshot.py +0 -0
  599. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_hetzner_sync.py +0 -0
  600. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_host_user_consistency.py +0 -0
  601. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_incus_entry_adapters.py +0 -0
  602. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_incus_marker.py +0 -0
  603. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_incus_resize.py +0 -0
  604. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_incus_snapshot.py +0 -0
  605. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_incus_sync.py +0 -0
  606. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_missing_sdk.py +0 -0
  607. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_provider_conformance.py +0 -0
  608. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_provider_registry_entries.py +0 -0
  609. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_proxmox_devcontainer_runtime.py +0 -0
  610. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_proxmox_marker.py +0 -0
  611. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_proxmox_provider_protocol.py +0 -0
  612. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_proxmox_resize.py +0 -0
  613. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_proxmox_snapshot.py +0 -0
  614. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_proxmox_sync.py +0 -0
  615. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/test_ansible_templates.py +0 -0
  616. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/test_architecture.py +0 -0
  617. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/test_docs_structure.py +0 -0
  618. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/test_host_model.py +0 -0
  619. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/test_lockfile_version.py +0 -0
  620. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/test_schema_drift.py +0 -0
  621. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/__init__.py +0 -0
  622. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/_pairing_support.py +0 -0
  623. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/conftest.py +0 -0
  624. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/fixtures/hosts_response.json +0 -0
  625. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/fixtures/sessions_response.json +0 -0
  626. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_backpressure.py +0 -0
  627. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_check.py +0 -0
  628. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_csp.py +0 -0
  629. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_discovery_refresh_force.py +0 -0
  630. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_frames.py +0 -0
  631. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_health_states.py +0 -0
  632. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_hosts_mapping.py +0 -0
  633. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_lazy_import.py +0 -0
  634. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_log_redaction.py +0 -0
  635. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_mint_gating.py +0 -0
  636. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_operator_auth.py +0 -0
  637. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_pairing.py +0 -0
  638. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_pairing_origin.py +0 -0
  639. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_payload_equivalence.py +0 -0
  640. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_registry_readonly.py +0 -0
  641. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_setup_api.py +0 -0
  642. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_setup_auth.py +0 -0
  643. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_setup_dormancy.py +0 -0
  644. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_state.py +0 -0
  645. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_terminal_resize.py +0 -0
  646. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_terminals_api.py +0 -0
  647. {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_tokens.py +0 -0
@@ -17,7 +17,7 @@ jobs:
17
17
  steps:
18
18
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
19
19
 
20
- - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
20
+ - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
21
21
 
22
22
  - name: Set up Python ${{ matrix.python-version }}
23
23
  run: uv python install ${{ matrix.python-version }}
@@ -48,7 +48,7 @@ jobs:
48
48
 
49
49
  - uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4
50
50
 
51
- - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
51
+ - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
52
52
 
53
53
  - name: Install dependencies
54
54
  run: uv sync --all-extras
@@ -70,7 +70,7 @@ jobs:
70
70
  steps:
71
71
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
72
72
 
73
- - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
73
+ - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
74
74
 
75
75
  - name: Build wheel
76
76
  run: uv build --wheel
@@ -98,7 +98,7 @@ jobs:
98
98
  steps:
99
99
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
100
100
 
101
- - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
101
+ - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
102
102
 
103
103
  - name: Install fish
104
104
  run: |
@@ -124,7 +124,7 @@ jobs:
124
124
  steps:
125
125
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
126
126
 
127
- - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
127
+ - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
128
128
 
129
129
  - name: Install dependencies
130
130
  run: uv sync --all-extras
@@ -34,7 +34,7 @@ jobs:
34
34
  with:
35
35
  fetch-depth: 0
36
36
 
37
- - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
37
+ - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
38
38
 
39
39
  - name: Compute dev version
40
40
  id: ver
@@ -19,7 +19,7 @@ jobs:
19
19
  uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
20
20
 
21
21
  - name: Install uv
22
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
22
+ uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
23
23
 
24
24
  - name: Install Ansible and dependencies
25
25
  run: |
@@ -42,7 +42,7 @@ jobs:
42
42
  app-id: ${{ vars.RELEASE_PLEASE_APP_ID }}
43
43
  private-key: ${{ secrets.RELEASE_PLEASE_APP_KEY }}
44
44
 
45
- - uses: googleapis/release-please-action@v4
45
+ - uses: googleapis/release-please-action@v5
46
46
  id: release
47
47
  with:
48
48
  # Token precedence:
@@ -68,16 +68,26 @@ jobs:
68
68
  # but this job runs immediately after that refresh on every push to main,
69
69
  # so the commit is simply re-made. `tests/unit/test_lockfile_version.py`
70
70
  # is the backstop that keeps a drifted lockfile from merging at all.
71
- - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
71
+ - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
72
72
  if: ${{ steps.release.outputs.pr }}
73
73
 
74
+ # `pr` is passed through as raw JSON and parsed in the shell rather than
75
+ # with `fromJSON(...)` here. A step's `env:` expressions are evaluated even
76
+ # when its `if:` is false, and on the push that MERGES a release there are
77
+ # no new commits, so release-please emits no PR and `outputs.pr` is the
78
+ # empty string — `fromJSON('')` then fails the whole job with "Error
79
+ # reading JToken from JsonReader", after the tag and publish have already
80
+ # succeeded. That made this workflow red after every single release and
81
+ # would have masked a real failure. The neighbouring setup-uv step, which
82
+ # has the same `if:` but no `env:`, skipped correctly throughout.
74
83
  - name: Sync uv.lock onto the release PR
75
84
  if: ${{ steps.release.outputs.pr }}
76
85
  env:
77
- RELEASE_BRANCH: ${{ fromJSON(steps.release.outputs.pr).headBranchName }}
86
+ RELEASE_PR: ${{ steps.release.outputs.pr }}
78
87
  GH_TOKEN: ${{ steps.app-token.outputs.token || secrets.RELEASE_PLEASE_TOKEN || secrets.GITHUB_TOKEN }}
79
88
  run: |
80
89
  set -euo pipefail
90
+ RELEASE_BRANCH="$(jq -er '.headBranchName' <<<"$RELEASE_PR")"
81
91
  git clone --branch "$RELEASE_BRANCH" --depth 1 \
82
92
  "https://x-access-token:${GH_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" release-pr
83
93
  cd release-pr
@@ -15,7 +15,7 @@ jobs:
15
15
  steps:
16
16
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
17
17
 
18
- - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
18
+ - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
19
19
 
20
20
  - name: Set up Python ${{ matrix.python-version }}
21
21
  run: uv python install ${{ matrix.python-version }}
@@ -155,7 +155,7 @@ jobs:
155
155
  steps:
156
156
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
157
157
 
158
- - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
158
+ - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
159
159
 
160
160
  - name: Build package
161
161
  run: uv build
@@ -52,7 +52,7 @@ jobs:
52
52
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
53
53
 
54
54
  - name: Install uv
55
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
55
+ uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
56
56
 
57
57
  - name: Install remo
58
58
  run: uv sync
@@ -219,7 +219,7 @@ jobs:
219
219
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
220
220
 
221
221
  - name: Install uv
222
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
222
+ uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
223
223
 
224
224
  - name: Install remo
225
225
  run: uv sync
@@ -338,7 +338,7 @@ jobs:
338
338
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
339
339
 
340
340
  - name: Install uv
341
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
341
+ uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
342
342
 
343
343
  - name: Install remo
344
344
  run: uv sync
@@ -19,7 +19,7 @@ jobs:
19
19
  uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
20
20
 
21
21
  - name: Install uv
22
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
22
+ uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
23
23
 
24
24
  - name: Install Ansible and dependencies
25
25
  run: |
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "4.3.2"
3
+ }
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [4.3.2](https://github.com/get2knowio/remo/compare/v4.3.1...v4.3.2) (2026-08-05)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **ci:** stop release-please failing on every release ([#147](https://github.com/get2knowio/remo/issues/147)) ([1e78e8d](https://github.com/get2knowio/remo/commit/1e78e8dc65f36c8f8f143a7e9eb77dbd5749b69f))
9
+
10
+ ## [4.3.1](https://github.com/get2knowio/remo/compare/v4.3.0...v4.3.1) (2026-08-05)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * three defects found while building `remo configure` ([#144](https://github.com/get2knowio/remo/issues/144)) ([608a914](https://github.com/get2knowio/remo/commit/608a9146560b9e1bf0e45811ce76a0c517dafa45))
16
+
3
17
  ## [4.3.0](https://github.com/get2knowio/remo/compare/v4.2.0...v4.3.0) (2026-08-05)
4
18
 
5
19
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: remo-cli
3
- Version: 4.3.0
3
+ Version: 4.3.2
4
4
  Summary: Remote development environment CLI
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -327,6 +327,22 @@ remo configure mybox --skip docker # everything except Docker
327
327
  remo web push # authorize the web service on it
328
328
  ```
329
329
 
330
+ #### Example: an OrbStack VM
331
+
332
+ [`docs/examples/orbstack-cloud-init.yaml`](docs/examples/orbstack-cloud-init.yaml)
333
+ prepares an [OrbStack](https://orbstack.dev) VM on a Mac so `remo add` and
334
+ `remo configure` work first time:
335
+
336
+ ```bash
337
+ orb create ubuntu remo-mbp -c docs/examples/orbstack-cloud-init.yaml
338
+ ```
339
+
340
+ It installs only what Ansible needs to connect and hand over — `remo configure`
341
+ does the rest. It deliberately creates no user: OrbStack already makes one named
342
+ after your macOS account holding UID 1000, and registering *that* user is what
343
+ puts `remo-host` in the home directory the web service logs into, while skipping
344
+ `user_setup`'s UID-1000 reassignment entirely.
345
+
330
346
  `remo remove NAME [--yes]` deregisters an added host by deleting **only** the
331
347
  local registry entry — it makes no connection to and no change on the remote
332
348
  environment (unlike a provider `destroy`, which tears down infrastructure). It
@@ -301,6 +301,22 @@ remo configure mybox --skip docker # everything except Docker
301
301
  remo web push # authorize the web service on it
302
302
  ```
303
303
 
304
+ #### Example: an OrbStack VM
305
+
306
+ [`docs/examples/orbstack-cloud-init.yaml`](docs/examples/orbstack-cloud-init.yaml)
307
+ prepares an [OrbStack](https://orbstack.dev) VM on a Mac so `remo add` and
308
+ `remo configure` work first time:
309
+
310
+ ```bash
311
+ orb create ubuntu remo-mbp -c docs/examples/orbstack-cloud-init.yaml
312
+ ```
313
+
314
+ It installs only what Ansible needs to connect and hand over — `remo configure`
315
+ does the rest. It deliberately creates no user: OrbStack already makes one named
316
+ after your macOS account holding UID 1000, and registering *that* user is what
317
+ puts `remo-host` in the home directory the web service logs into, while skipping
318
+ `user_setup`'s UID-1000 reassignment entirely.
319
+
304
320
  `remo remove NAME [--yes]` deregisters an added host by deleting **only** the
305
321
  local registry entry — it makes no connection to and no change on the remote
306
322
  environment (unlike a provider `destroy`, which tears down infrastructure). It
@@ -243,11 +243,25 @@
243
243
  - user_setup_cloud_keys.content | default('') | length > 0
244
244
  # --- end cloud-injected key bootstrap --------------------------------------
245
245
 
246
+ # The docker group only exists if the `docker` role ran. Skipping that role
247
+ # (`--skip docker`, or `configure_docker=false`) previously made the next task
248
+ # fail outright with "Group docker does not exist", taking the whole configure
249
+ # down after it had already changed the host — so `--skip docker` was, in
250
+ # effect, not a supported option on any provider. Gate on the group rather than
251
+ # on `configure_docker` so a host where Docker was installed by other means
252
+ # (or by an earlier run) still gets the membership.
253
+ - name: Check whether a docker group exists
254
+ ansible.builtin.command: getent group docker
255
+ register: user_setup_docker_group
256
+ changed_when: false
257
+ failed_when: false
258
+
246
259
  - name: Add remo user to docker group
247
260
  ansible.builtin.user:
248
261
  name: "{{ remo_user }}"
249
262
  groups: docker
250
263
  append: true
264
+ when: user_setup_docker_group.rc | default(1) == 0
251
265
 
252
266
  - name: Configure passwordless sudo for remo user
253
267
  ansible.builtin.lineinfile:
@@ -0,0 +1,120 @@
1
+ #cloud-config
2
+ #
3
+ # OrbStack VM prepared for `remo add` + `remo configure` (remo >= 4.3.0).
4
+ #
5
+ # orb create ubuntu remo-mbp -c orbstack-remo-cloud-init.yaml
6
+ #
7
+ # Deliberately minimal: this installs ONLY what Ansible needs in order to
8
+ # connect and take over. Docker, Node.js, zellij, fzf, the GitHub CLI, the
9
+ # devcontainers CLI and remo-host are all installed by `remo configure`, which
10
+ # is idempotent — duplicating any of that here would only drift.
11
+ #
12
+ # It also does NOT create a user. OrbStack already creates one named after your
13
+ # macOS account, holding UID 1000 with passwordless sudo. `remo configure`
14
+ # binds its workspace account to whichever user you register, so registering
15
+ # that existing user means:
16
+ # * remo-host lands in the home directory discovery actually logs into, and
17
+ # * user_setup's UID-1000 reassignment (which rewrites /etc/passwd and drops
18
+ # the live SSH session) is skipped entirely, because the holder of UID 1000
19
+ # is already the account being configured.
20
+ # Creating a separate `remo` user here would forfeit both.
21
+
22
+ # ---------------------------------------------------------------------------
23
+ # EDIT THIS: the public key of the workstation that will run `remo`.
24
+ # ---------------------------------------------------------------------------
25
+ # If remo runs on this same Mac, that is ~/.ssh/id_ed25519.pub.
26
+ # Leave the placeholder in place and cloud-init keeps password auth enabled
27
+ # rather than locking you out (see the guard in runcmd).
28
+ ssh_authorized_keys:
29
+ - ssh-ed25519 AAAA_REPLACE_WITH_YOUR_PUBLIC_KEY workstation
30
+
31
+ package_update: true
32
+ packages:
33
+ # Ansible needs a Python 3 interpreter on the target. ssh_configure.yml
34
+ # probes for it with `raw` and fails with an actionable message if absent,
35
+ # but there is no reason to make you see that message.
36
+ - python3
37
+ # hwclock. `community.general.timezone` — the first task in remo's shared
38
+ # role list — hard-fails with 'Failed to find required executable "hwclock"'
39
+ # without it, and on Ubuntu 24.04 it lives in util-linux-extra, which minimal
40
+ # images do not install. Found the hard way while testing this feature.
41
+ - util-linux-extra
42
+ - openssh-server
43
+ # remo's configure play installs rsync itself, but having it up front means
44
+ # `remo cp` works the moment the host is registered.
45
+ - rsync
46
+
47
+ # ---------------------------------------------------------------------------
48
+ # SSH port
49
+ # ---------------------------------------------------------------------------
50
+ # 22 is right when remo runs on this Mac: the VM gets its own IP that macOS can
51
+ # reach directly, so nothing needs forwarding.
52
+ #
53
+ # Change it if you are reaching this VM from somewhere else (e.g. your homelab
54
+ # box) via a forwarded port — remo stores the port per host and threads it
55
+ # through `remo shell`, `remo configure` and `remo web push`. Register it with
56
+ # remo add mbp <user>@<host>:<port>
57
+ # Note this is NOT OrbStack's own SSH (127.0.0.1:32222, Mac-local only); this
58
+ # is a normal sshd inside the VM, which is what remo drives.
59
+ write_files:
60
+ - path: /etc/ssh/sshd_config.d/10-remo.conf
61
+ permissions: '0644'
62
+ content: |
63
+ # Managed by cloud-init for remo. Ubuntu's sshd_config Includes this dir.
64
+ Port 22
65
+ PubkeyAuthentication yes
66
+
67
+ runcmd:
68
+ # Put the key on the UID-1000 account explicitly. `ssh_authorized_keys` above
69
+ # targets cloud-init's notion of the default user, which is not guaranteed to
70
+ # be the user OrbStack created — this makes it deterministic either way.
71
+ - |
72
+ set -eu
73
+ KEY='ssh-ed25519 AAAA_REPLACE_WITH_YOUR_PUBLIC_KEY workstation'
74
+ USER_1000="$(getent passwd 1000 | cut -d: -f1)"
75
+ if [ -z "$USER_1000" ]; then
76
+ echo "remo-cloud-init: no UID 1000 account; skipping key install" >&2
77
+ exit 0
78
+ fi
79
+ HOME_1000="$(getent passwd 1000 | cut -d: -f6)"
80
+ install -d -m 700 -o "$USER_1000" -g "$USER_1000" "$HOME_1000/.ssh"
81
+ touch "$HOME_1000/.ssh/authorized_keys"
82
+ case "$KEY" in
83
+ *REPLACE_WITH_YOUR_PUBLIC_KEY*)
84
+ # Refuse to harden SSH when no real key was supplied — disabling
85
+ # password auth here would leave the VM unreachable over SSH.
86
+ echo "remo-cloud-init: placeholder key not replaced; leaving password auth as-is" >&2
87
+ ;;
88
+ *)
89
+ grep -qxF "$KEY" "$HOME_1000/.ssh/authorized_keys" \
90
+ || echo "$KEY" >> "$HOME_1000/.ssh/authorized_keys"
91
+ echo 'PasswordAuthentication no' > /etc/ssh/sshd_config.d/20-remo-hardening.conf
92
+ ;;
93
+ esac
94
+ chown -R "$USER_1000:$USER_1000" "$HOME_1000/.ssh"
95
+ chmod 600 "$HOME_1000/.ssh/authorized_keys"
96
+
97
+ # Passwordless sudo: OrbStack already grants it, but an explicit drop-in
98
+ # makes this file work on a plain cloud image too. remo needs it — the
99
+ # configure play installs packages and system services, and probes for it
100
+ # up front rather than failing halfway through.
101
+ - |
102
+ set -eu
103
+ USER_1000="$(getent passwd 1000 | cut -d: -f1)"
104
+ [ -n "$USER_1000" ] || exit 0
105
+ echo "$USER_1000 ALL=(ALL) NOPASSWD:ALL" > "/etc/sudoers.d/90-remo-$USER_1000"
106
+ chmod 440 "/etc/sudoers.d/90-remo-$USER_1000"
107
+
108
+ - systemctl enable --now ssh
109
+ - systemctl restart ssh
110
+
111
+ final_message: |
112
+ remo-ready after $UPTIME seconds.
113
+
114
+ From the workstation running remo:
115
+ remo add mbp <user>@<this-vm-ip> --verify # add :PORT if you changed it
116
+ remo configure mbp
117
+ remo web push # if you use the web console
118
+
119
+ Do not pass `--skip docker` to configure: the shared role list adds the user
120
+ to the docker group, which only exists if the docker role ran.
@@ -1177,9 +1177,9 @@
1177
1177
  "license": "MIT"
1178
1178
  },
1179
1179
  "node_modules/@redocly/openapi-core": {
1180
- "version": "1.34.17",
1181
- "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.17.tgz",
1182
- "integrity": "sha512-wsV2keCt6B806XpSdezbWZ9aFJYf14YVh+XQf0ESt7M90yqVuxH9//PxvtC70sgj9OCkRM3nRaLfu4MsGQZRig==",
1180
+ "version": "1.34.18",
1181
+ "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.18.tgz",
1182
+ "integrity": "sha512-UyKIm0wTPw5BcY7Z2PkbK1Ma260um96LSBWXHrdSMe+ZV0EPMyDfAcUcjjm3qEiGST9OK/1TriekdPCZkn4Q3A==",
1183
1183
  "dev": true,
1184
1184
  "license": "MIT",
1185
1185
  "dependencies": {
@@ -1188,7 +1188,7 @@
1188
1188
  "colorette": "1.4.0",
1189
1189
  "https-proxy-agent": "7.0.6",
1190
1190
  "js-levenshtein": "1.1.6",
1191
- "js-yaml": "4.2.0",
1191
+ "js-yaml": "4.3.0",
1192
1192
  "minimatch": "5.1.9",
1193
1193
  "pluralize": "8.0.0",
1194
1194
  "yaml-ast-parser": "0.0.43"
@@ -1206,9 +1206,9 @@
1206
1206
  "license": "MIT"
1207
1207
  },
1208
1208
  "node_modules/@redocly/openapi-core/node_modules/brace-expansion": {
1209
- "version": "2.1.2",
1210
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz",
1211
- "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==",
1209
+ "version": "2.1.4",
1210
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz",
1211
+ "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==",
1212
1212
  "dev": true,
1213
1213
  "license": "MIT",
1214
1214
  "dependencies": {
@@ -2106,16 +2106,16 @@
2106
2106
  }
2107
2107
  },
2108
2108
  "node_modules/brace-expansion": {
2109
- "version": "5.0.7",
2110
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz",
2111
- "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==",
2109
+ "version": "5.0.9",
2110
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz",
2111
+ "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==",
2112
2112
  "dev": true,
2113
2113
  "license": "MIT",
2114
2114
  "dependencies": {
2115
2115
  "balanced-match": "^4.0.2"
2116
2116
  },
2117
2117
  "engines": {
2118
- "node": "18 || 20 || >=22"
2118
+ "node": "20 || >=22"
2119
2119
  }
2120
2120
  },
2121
2121
  "node_modules/browserslist": {
@@ -2604,9 +2604,9 @@
2604
2604
  "license": "MIT"
2605
2605
  },
2606
2606
  "node_modules/glob/node_modules/brace-expansion": {
2607
- "version": "2.1.2",
2608
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz",
2609
- "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==",
2607
+ "version": "2.1.4",
2608
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz",
2609
+ "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==",
2610
2610
  "dev": true,
2611
2611
  "license": "MIT",
2612
2612
  "dependencies": {
@@ -2813,9 +2813,9 @@
2813
2813
  "license": "MIT"
2814
2814
  },
2815
2815
  "node_modules/js-yaml": {
2816
- "version": "4.2.0",
2817
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz",
2818
- "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==",
2816
+ "version": "4.3.0",
2817
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz",
2818
+ "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==",
2819
2819
  "dev": true,
2820
2820
  "funding": [
2821
2821
  {
@@ -3274,9 +3274,9 @@
3274
3274
  }
3275
3275
  },
3276
3276
  "node_modules/postcss": {
3277
- "version": "8.5.19",
3278
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.19.tgz",
3279
- "integrity": "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==",
3277
+ "version": "8.5.25",
3278
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz",
3279
+ "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==",
3280
3280
  "dev": true,
3281
3281
  "funding": [
3282
3282
  {
@@ -3294,7 +3294,7 @@
3294
3294
  ],
3295
3295
  "license": "MIT",
3296
3296
  "dependencies": {
3297
- "nanoid": "^3.3.12",
3297
+ "nanoid": "^3.3.16",
3298
3298
  "picocolors": "^1.1.1",
3299
3299
  "source-map-js": "^1.2.1"
3300
3300
  },
@@ -3823,9 +3823,9 @@
3823
3823
  }
3824
3824
  },
3825
3825
  "node_modules/undici": {
3826
- "version": "7.28.0",
3827
- "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz",
3828
- "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==",
3826
+ "version": "7.29.0",
3827
+ "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz",
3828
+ "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==",
3829
3829
  "dev": true,
3830
3830
  "license": "MIT",
3831
3831
  "engines": {
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "remo-cli"
7
- version = "4.3.0"
7
+ version = "4.3.2"
8
8
  description = "Remote development environment CLI"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -76,6 +76,7 @@ def build_ssh_opts(
76
76
  control_dir: str | None = None,
77
77
  identity_file: str | None = None,
78
78
  known_hosts_file: str | None = None,
79
+ use_registry_identity: bool = True,
79
80
  ) -> tuple[list[str], str]:
80
81
  """Build SSH option flags and target string for the given host.
81
82
 
@@ -98,6 +99,15 @@ def build_ssh_opts(
98
99
  to ambient ``~/.ssh`` identities or agent keys (adopted-mode web
99
100
  service identity, R6). ``None`` (the default) emits nothing, leaving
100
101
  the argv byte-identical to before this parameter existed.
102
+ use_registry_identity:
103
+ When ``True`` (the default) and *identity_file* is ``None``, fall back
104
+ to an added host's stored ``ssh_identity``. Set ``False`` when the
105
+ caller cannot assume that path resolves in *its* filesystem — the
106
+ registry records a **workstation** path, so the web service running in
107
+ a container may not have it. Emitting it anyway is not a harmless
108
+ no-op: it comes with ``IdentitiesOnly=yes``, which suppresses every
109
+ key that *would* have worked, turning a missing file into a guaranteed
110
+ auth failure.
101
111
  known_hosts_file:
102
112
  When set, emit ``-o UserKnownHostsFile=<path>``. ``None`` (the
103
113
  default) emits nothing. For SSM hosts the access-mode block's
@@ -152,7 +162,9 @@ def build_ssh_opts(
152
162
  # wins; otherwise an added (ssh-type) host's stored identity is used
153
163
  # (``ssh_identity`` is None for every other type, so their argv is unchanged).
154
164
  # ------------------------------------------------------------------
155
- effective_identity = identity_file if identity_file is not None else host.ssh_identity
165
+ effective_identity = identity_file
166
+ if effective_identity is None and use_registry_identity:
167
+ effective_identity = host.ssh_identity
156
168
  if effective_identity is not None:
157
169
  ssh_opts += [
158
170
  "-o", f"IdentityFile={effective_identity}",
@@ -180,6 +192,7 @@ def build_ssh_base_cmd(
180
192
  control_dir: str | None = None,
181
193
  identity_file: str | None = None,
182
194
  known_hosts_file: str | None = None,
195
+ use_registry_identity: bool = True,
183
196
  extra_opts: list[str] | None = None,
184
197
  ) -> list[str]:
185
198
  """Build the full ``ssh`` argv for connecting to *host*.
@@ -213,6 +226,9 @@ def build_ssh_base_cmd(
213
226
  Forwarded to :func:`build_ssh_opts` — emits ``-o
214
227
  UserKnownHostsFile=<path>`` when set; ``None`` (the default) leaves
215
228
  the argv unchanged.
229
+ use_registry_identity:
230
+ Forwarded to :func:`build_ssh_opts`. Leave ``True`` on the CLI, whose
231
+ filesystem is the one the registry path was recorded against.
216
232
  extra_opts:
217
233
  Extra argv elements inserted after *ssh_opts* but before the
218
234
  ``-tt``/target elements — e.g. ``["-L", "8080:localhost:8080"]``
@@ -233,6 +249,7 @@ def build_ssh_base_cmd(
233
249
  control_dir=control_dir,
234
250
  identity_file=identity_file,
235
251
  known_hosts_file=known_hosts_file,
252
+ use_registry_identity=use_registry_identity,
236
253
  )
237
254
 
238
255
  cmd: list[str] = ["ssh"] + ssh_opts
@@ -126,6 +126,22 @@ class KnownHost:
126
126
  return self.region
127
127
  return None
128
128
 
129
+ @property
130
+ def display_region(self) -> str:
131
+ """``region`` when it really is a region, ``""`` when the slot is reused.
132
+
133
+ For an added (``ssh``-type) host the slot holds the operator's *private
134
+ key path*, so anything that surfaces ``region`` as a label — the web
135
+ service's discovery snapshot, which the console renders as a badge —
136
+ was publishing that path to every viewer of the console. Blanking it
137
+ here fixes it for every consumer at once rather than at one call site.
138
+
139
+ Proxmox reuses the same slot for the node login, which is mislabeled as
140
+ a "region" but is neither secret nor new; it is left alone deliberately
141
+ so this fix does not silently change what Proxmox users see.
142
+ """
143
+ return "" if self.type == "ssh" else (self.region or "")
144
+
129
145
  # ------------------------------------------------------------------
130
146
  # Display
131
147
  # ------------------------------------------------------------------
@@ -273,7 +273,10 @@ def _instance_check(host: KnownHost, settings: WebSettings) -> CheckResult:
273
273
  ssh_argv_prefix = build_ssh_base_cmd(
274
274
  host,
275
275
  control_dir=settings.ssh_control_dir,
276
- identity_file=settings.ssh_identity_file,
276
+ identity_file=settings.ssh_identity_for(host),
277
+ # The service must not inherit a WORKSTATION key path from the
278
+ # registry; ssh_identity_for() decides, and only when usable here.
279
+ use_registry_identity=False,
277
280
  known_hosts_file=settings.ssh_known_hosts_file,
278
281
  )
279
282
 
@@ -7,6 +7,7 @@ from dataclasses import dataclass, field
7
7
  from pathlib import Path
8
8
 
9
9
  from remo_cli.core.config import get_remo_home_readonly
10
+ from remo_cli.models.host import KnownHost
10
11
 
11
12
 
12
13
  class WebConfigError(ValueError):
@@ -225,6 +226,30 @@ class WebSettings:
225
226
  return str(self.service_private_key_path)
226
227
  return None
227
228
 
229
+ def ssh_identity_for(self, host: KnownHost) -> str | None:
230
+ """The identity *this service* should use to reach *host*.
231
+
232
+ In adopted mode that is always the service's own key — the one
233
+ ``remo web push`` authorized. Otherwise (mounted/unconfigured/broken)
234
+ fall back to an added host's registry identity, but **only when the
235
+ path resolves here**.
236
+
237
+ That guard is the fix for a real failure: the registry records a
238
+ *workstation* path (``/home/you/.ssh/key``), which a containerized
239
+ service generally does not have. Passing it anyway is not a harmless
240
+ no-op — :func:`~remo_cli.core.ssh.build_ssh_opts` pairs an identity
241
+ with ``IdentitiesOnly=yes``, which suppresses every key that *would*
242
+ have worked, so a missing file turns into a guaranteed auth failure.
243
+ Falling back to the mounted ``~/.ssh`` is both safer and what the
244
+ operator expects in mounted mode.
245
+ """
246
+ if self._service_identity_active():
247
+ return str(self.service_private_key_path)
248
+ identity = host.ssh_identity
249
+ if identity and Path(identity).expanduser().is_file():
250
+ return identity
251
+ return None
252
+
228
253
  @property
229
254
  def ssh_known_hosts_file(self) -> str | None:
230
255
  if self._service_identity_active():