remo-cli 4.3.4__tar.gz → 4.3.6__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 (665) hide show
  1. remo_cli-4.3.6/.release-please-manifest.json +3 -0
  2. {remo_cli-4.3.4 → remo_cli-4.3.6}/AGENTS.md +1 -1
  3. {remo_cli-4.3.4 → remo_cli-4.3.6}/CHANGELOG.md +14 -0
  4. {remo_cli-4.3.4 → remo_cli-4.3.6}/CLAUDE.md +1 -1
  5. {remo_cli-4.3.4 → remo_cli-4.3.6}/PKG-INFO +8 -1
  6. {remo_cli-4.3.4 → remo_cli-4.3.6}/README.md +7 -0
  7. {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/web-session-interface.md +9 -1
  8. remo_cli-4.3.6/frontend/src/terminal/XtermRenderer.test.ts +45 -0
  9. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/terminal/XtermRenderer.ts +18 -0
  10. {remo_cli-4.3.4 → remo_cli-4.3.6}/pyproject.toml +1 -1
  11. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/cli/shell.py +67 -23
  12. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_shell.py +43 -14
  13. remo_cli-4.3.6/tests/unit/cli/test_shell_added.py +149 -0
  14. {remo_cli-4.3.4 → remo_cli-4.3.6}/uv.lock +1 -1
  15. remo_cli-4.3.4/.release-please-manifest.json +0 -3
  16. remo_cli-4.3.4/tests/unit/cli/test_shell_added.py +0 -76
  17. {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/release/SKILL.md +0 -0
  18. {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-analyze/SKILL.md +0 -0
  19. {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-checklist/SKILL.md +0 -0
  20. {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-clarify/SKILL.md +0 -0
  21. {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-constitution/SKILL.md +0 -0
  22. {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-converge/SKILL.md +0 -0
  23. {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-git-commit/SKILL.md +0 -0
  24. {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-git-feature/SKILL.md +0 -0
  25. {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-git-initialize/SKILL.md +0 -0
  26. {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-git-remote/SKILL.md +0 -0
  27. {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-git-validate/SKILL.md +0 -0
  28. {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-implement/SKILL.md +0 -0
  29. {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-plan/SKILL.md +0 -0
  30. {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-specify/SKILL.md +0 -0
  31. {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-tasks/SKILL.md +0 -0
  32. {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-taskstoissues/SKILL.md +0 -0
  33. {remo_cli-4.3.4 → remo_cli-4.3.6}/.devcontainer/devcontainer.json +0 -0
  34. {remo_cli-4.3.4 → remo_cli-4.3.6}/.dockerignore +0 -0
  35. {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/CODEOWNERS +0 -0
  36. {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/codeql/codeql-config.yml +0 -0
  37. {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/dependabot.yml +0 -0
  38. {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/ci.yml +0 -0
  39. {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/codeql.yml +0 -0
  40. {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/dependency-review.yml +0 -0
  41. {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/dev-build.yml +0 -0
  42. {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/provision.yml +0 -0
  43. {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/release-please.yml +0 -0
  44. {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/release.yml +0 -0
  45. {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/smoke-test-cleanup.yml +0 -0
  46. {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/smoke-test.yml +0 -0
  47. {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/teardown.yml +0 -0
  48. {remo_cli-4.3.4 → remo_cli-4.3.6}/.gitignore +0 -0
  49. {remo_cli-4.3.4 → remo_cli-4.3.6}/.maverick/checkpoints/feature/implementation_complete.json +0 -0
  50. {remo_cli-4.3.4 → remo_cli-4.3.6}/.maverick/checkpoints/feature/phase_${{ index }}_complete.json +0 -0
  51. {remo_cli-4.3.4 → remo_cli-4.3.6}/.maverick/checkpoints/feature/validation_complete.json +0 -0
  52. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/.registry +0 -0
  53. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/README.md +0 -0
  54. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/commands/speckit.git.commit.md +0 -0
  55. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/commands/speckit.git.feature.md +0 -0
  56. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/commands/speckit.git.initialize.md +0 -0
  57. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/commands/speckit.git.remote.md +0 -0
  58. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/commands/speckit.git.validate.md +0 -0
  59. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/config-template.yml +0 -0
  60. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/extension.yml +0 -0
  61. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/git-config.yml +0 -0
  62. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/scripts/bash/auto-commit.sh +0 -0
  63. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/scripts/bash/create-new-feature.sh +0 -0
  64. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/scripts/bash/git-common.sh +0 -0
  65. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  66. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  67. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/scripts/powershell/create-new-feature.ps1 +0 -0
  68. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  69. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  70. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions.yml +0 -0
  71. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/feature.json +0 -0
  72. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/init-options.json +0 -0
  73. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/integration.json +0 -0
  74. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/integrations/claude.manifest.json +0 -0
  75. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/integrations/speckit.manifest.json +0 -0
  76. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/memory/constitution.md +0 -0
  77. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/scripts/bash/check-prerequisites.sh +0 -0
  78. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/scripts/bash/common.sh +0 -0
  79. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/scripts/bash/create-new-feature.sh +0 -0
  80. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/scripts/bash/setup-plan.sh +0 -0
  81. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/scripts/bash/setup-tasks.sh +0 -0
  82. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/scripts/bash/update-agent-context.sh +0 -0
  83. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/templates/agent-file-template.md +0 -0
  84. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/templates/checklist-template.md +0 -0
  85. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/templates/constitution-template.md +0 -0
  86. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/templates/plan-template.md +0 -0
  87. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/templates/spec-template.md +0 -0
  88. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/templates/tasks-template.md +0 -0
  89. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/workflows/speckit/workflow.yml +0 -0
  90. {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/workflows/workflow-registry.json +0 -0
  91. {remo_cli-4.3.4 → remo_cli-4.3.6}/CONTRIBUTING.md +0 -0
  92. {remo_cli-4.3.4 → remo_cli-4.3.6}/Dockerfile +0 -0
  93. {remo_cli-4.3.4 → remo_cli-4.3.6}/LICENSE +0 -0
  94. {remo_cli-4.3.4 → remo_cli-4.3.6}/SECURITY.md +0 -0
  95. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/.ansible-lint +0 -0
  96. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/README.md +0 -0
  97. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/ansible.cfg +0 -0
  98. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/aws_configure.yml +0 -0
  99. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/aws_resize.yml +0 -0
  100. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/aws_site.yml +0 -0
  101. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/aws_teardown.yml +0 -0
  102. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/group_vars/all.yml +0 -0
  103. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/group_vars/incus_containers.yml +0 -0
  104. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/group_vars/proxmox_containers.yml +0 -0
  105. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/hetzner_configure.yml +0 -0
  106. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/hetzner_provision.yml +0 -0
  107. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/hetzner_resize.yml +0 -0
  108. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/hetzner_site.yml +0 -0
  109. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/hetzner_teardown.yml +0 -0
  110. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/incus_bootstrap.yml +0 -0
  111. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/incus_configure.yml +0 -0
  112. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/incus_provision.yml +0 -0
  113. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/incus_resize.yml +0 -0
  114. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/incus_site.yml +0 -0
  115. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/incus_teardown.yml +0 -0
  116. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/inventory/hosts.yml +0 -0
  117. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/inventory/incus_containers.yml +0 -0
  118. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/proxmox_bootstrap.yml +0 -0
  119. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/proxmox_configure.yml +0 -0
  120. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/proxmox_provision.yml +0 -0
  121. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/proxmox_resize.yml +0 -0
  122. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/proxmox_site.yml +0 -0
  123. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/proxmox_teardown.yml +0 -0
  124. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/requirements.yml +0 -0
  125. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/aws_server/defaults/main.yml +0 -0
  126. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/aws_server/tasks/ebs.yml +0 -0
  127. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/aws_server/tasks/ec2.yml +0 -0
  128. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/aws_server/tasks/main.yml +0 -0
  129. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/aws_server/tasks/patch_manager.yml +0 -0
  130. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/aws_server/tasks/preflight.yml +0 -0
  131. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/aws_server/tasks/security_group.yml +0 -0
  132. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/deacon/defaults/main.yml +0 -0
  133. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/deacon/tasks/main.yml +0 -0
  134. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/devcontainers/tasks/main.yml +0 -0
  135. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/docker/handlers/main.yml +0 -0
  136. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/docker/tasks/main.yml +0 -0
  137. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/fzf/tasks/main.yml +0 -0
  138. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/github_cli/tasks/main.yml +0 -0
  139. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/hetzner_server/defaults/main.yml +0 -0
  140. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/hetzner_server/tasks/main.yml +0 -0
  141. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_bootstrap/defaults/main.yml +0 -0
  142. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_bootstrap/handlers/main.yml +0 -0
  143. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_bootstrap/tasks/main.yml +0 -0
  144. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_container/defaults/main.yml +0 -0
  145. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_container/handlers/main.yml +0 -0
  146. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_container/meta/main.yml +0 -0
  147. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_container/tasks/main.yml +0 -0
  148. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_container/tasks/preflight.yml +0 -0
  149. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_container_teardown/defaults/main.yml +0 -0
  150. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_container_teardown/meta/main.yml +0 -0
  151. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_container_teardown/tasks/main.yml +0 -0
  152. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/nested_docker/defaults/main.yml +0 -0
  153. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/nested_docker/tasks/main.yml +0 -0
  154. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/nested_docker/templates/devcontainer-shim.sh.j2 +0 -0
  155. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/nodejs/defaults/main.yml +0 -0
  156. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/nodejs/files/nodesource-repo.gpg.key +0 -0
  157. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/nodejs/tasks/main.yml +0 -0
  158. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_bootstrap/defaults/main.yml +0 -0
  159. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_bootstrap/meta/main.yml +0 -0
  160. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_bootstrap/tasks/main.yml +0 -0
  161. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_container/defaults/main.yml +0 -0
  162. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_container/handlers/main.yml +0 -0
  163. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_container/meta/main.yml +0 -0
  164. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_container/tasks/main.yml +0 -0
  165. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_container/tasks/preflight.yml +0 -0
  166. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_container_teardown/defaults/main.yml +0 -0
  167. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_container_teardown/meta/main.yml +0 -0
  168. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_container_teardown/tasks/main.yml +0 -0
  169. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/user_setup/defaults/main.yml +0 -0
  170. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/user_setup/tasks/main.yml +0 -0
  171. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/user_setup/templates/devshell.sh.j2 +0 -0
  172. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/user_setup/templates/project-launch.sh.j2 +0 -0
  173. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/user_setup/templates/project-menu.sh.j2 +0 -0
  174. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/user_setup/templates/remo-host.sh.j2 +0 -0
  175. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/zellij/defaults/main.yml +0 -0
  176. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/zellij/tasks/main.yml +0 -0
  177. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/zellij/templates/config.kdl.j2 +0 -0
  178. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/zellij/templates/layouts/minimal.kdl.j2 +0 -0
  179. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/ssh_configure.yml +0 -0
  180. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/tasks/configure_dev_tools.yml +0 -0
  181. {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/tasks/repair_apt_sources.yml +0 -0
  182. {remo_cli-4.3.4 → remo_cli-4.3.6}/docker/Dockerfile +0 -0
  183. {remo_cli-4.3.4 → remo_cli-4.3.6}/docker/compose.example.yml +0 -0
  184. {remo_cli-4.3.4 → remo_cli-4.3.6}/docker/entrypoint.sh +0 -0
  185. {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/aws.md +0 -0
  186. {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/examples/orbstack-cloud-init-tailscale.yaml +0 -0
  187. {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/examples/orbstack-cloud-init.yaml +0 -0
  188. {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/feature-history.md +0 -0
  189. {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/hetzner.md +0 -0
  190. {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/incus.md +0 -0
  191. {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/maintaining-claude-md.md +0 -0
  192. {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/maintaining-generated-types.md +0 -0
  193. {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/nested-overlayfs.md +0 -0
  194. {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/providers.md +0 -0
  195. {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/proxmox.md +0 -0
  196. {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/remo-web-speckit-input.md +0 -0
  197. {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/remo-web.html +0 -0
  198. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/index.html +0 -0
  199. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/package-lock.json +0 -0
  200. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/package.json +0 -0
  201. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/playwright.config.ts +0 -0
  202. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/playwright.geometry.config.ts +0 -0
  203. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/scripts/check-types-fresh.mjs +0 -0
  204. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/scripts/generate-frame-types.mjs +0 -0
  205. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/scripts/generate-schema-types.mjs +0 -0
  206. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/api/client.test.ts +0 -0
  207. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/api/client.ts +0 -0
  208. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/api/generated/README.md +0 -0
  209. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/api/generated/openapi.json +0 -0
  210. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/api/generated/schema.d.ts +0 -0
  211. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/api/generated/terminal-frames.d.ts +0 -0
  212. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/api/generated/terminal-frames.json +0 -0
  213. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/api/generated.test.ts +0 -0
  214. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/AppRoot.tsx +0 -0
  215. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/AppShell.css +0 -0
  216. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/AppShell.tsx +0 -0
  217. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/AwaitingAdoption.css +0 -0
  218. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/AwaitingAdoption.test.tsx +0 -0
  219. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/AwaitingAdoption.tsx +0 -0
  220. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/OfflineOverlay.css +0 -0
  221. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/OfflineOverlay.tsx +0 -0
  222. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/PairToSync.css +0 -0
  223. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/PairToSync.test.tsx +0 -0
  224. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/PairToSync.tsx +0 -0
  225. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/SessionRail.css +0 -0
  226. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/SessionRail.tsx +0 -0
  227. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/SettingsPage.css +0 -0
  228. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/SettingsPage.tsx +0 -0
  229. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/ShortcutsModal.css +0 -0
  230. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/ShortcutsModal.tsx +0 -0
  231. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/TerminalCard.css +0 -0
  232. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/TerminalCard.test.tsx +0 -0
  233. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/TerminalCard.tsx +0 -0
  234. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/TopBar.css +0 -0
  235. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/TopBar.tsx +0 -0
  236. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/WorkspacePane.css +0 -0
  237. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/WorkspacePane.test.tsx +0 -0
  238. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/WorkspacePane.tsx +0 -0
  239. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/masterLayout.test.ts +0 -0
  240. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/masterLayout.ts +0 -0
  241. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/providerMeta.test.ts +0 -0
  242. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/providerMeta.ts +0 -0
  243. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/railModel.test.ts +0 -0
  244. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/railModel.ts +0 -0
  245. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/lib/clipboard.ts +0 -0
  246. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/lib/fullscreen.ts +0 -0
  247. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/main.tsx +0 -0
  248. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/discovery.test.ts +0 -0
  249. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/discovery.ts +0 -0
  250. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/fonts.ts +0 -0
  251. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/health.test.ts +0 -0
  252. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/health.ts +0 -0
  253. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/latency.test.ts +0 -0
  254. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/latency.ts +0 -0
  255. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/settings.test.ts +0 -0
  256. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/settings.ts +0 -0
  257. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/useConsoleKeyboard.ts +0 -0
  258. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/workspace.test.ts +0 -0
  259. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/workspace.ts +0 -0
  260. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/terminal/.gitkeep +0 -0
  261. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/terminal/RendererAdapter.ts +0 -0
  262. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/terminal/TerminalConnection.test.ts +0 -0
  263. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/terminal/TerminalConnection.ts +0 -0
  264. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/terminal/defaultRenderer.ts +0 -0
  265. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/terminal/fitLoop.ts +0 -0
  266. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/terminal/keymap.test.ts +0 -0
  267. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/terminal/keymap.ts +0 -0
  268. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/test/setup.ts +0 -0
  269. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/theme/fonts.ts +0 -0
  270. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/theme/terminalThemes.test.ts +0 -0
  271. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/theme/terminalThemes.ts +0 -0
  272. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/theme/tokens.css +0 -0
  273. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/e2e/fixtures.ts +0 -0
  274. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/e2e/keyboard-routing.spec.ts +0 -0
  275. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/e2e/mobile.spec.ts +0 -0
  276. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/e2e/reconnect.spec.ts +0 -0
  277. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/e2e/terminal-shell-io.spec.ts +0 -0
  278. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/e2e/terminal-tui-compatibility.spec.ts +0 -0
  279. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/e2e/workspace-layout.spec.ts +0 -0
  280. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/geometry/global.d.ts +0 -0
  281. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/geometry/harness/index.html +0 -0
  282. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/geometry/harness/main.tsx +0 -0
  283. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/geometry/terminal-fit.spec.ts +0 -0
  284. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tsconfig.json +0 -0
  285. {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/vite.config.ts +0 -0
  286. {remo_cli-4.3.4 → remo_cli-4.3.6}/install.sh +0 -0
  287. {remo_cli-4.3.4 → remo_cli-4.3.6}/maverick.yaml +0 -0
  288. {remo_cli-4.3.4 → remo_cli-4.3.6}/project-menu.sh +0 -0
  289. {remo_cli-4.3.4 → remo_cli-4.3.6}/release-please-config.json +0 -0
  290. {remo_cli-4.3.4 → remo_cli-4.3.6}/remo +0 -0
  291. {remo_cli-4.3.4 → remo_cli-4.3.6}/remo.svg +0 -0
  292. {remo_cli-4.3.4 → remo_cli-4.3.6}/run.sh +0 -0
  293. {remo_cli-4.3.4 → remo_cli-4.3.6}/scripts/export_openapi.py +0 -0
  294. {remo_cli-4.3.4 → remo_cli-4.3.6}/scripts/palette-check.sh +0 -0
  295. {remo_cli-4.3.4 → remo_cli-4.3.6}/scripts/setup-aws-oidc.sh +0 -0
  296. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/checklists/requirements.md +0 -0
  297. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/checklists/validation.md +0 -0
  298. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/contracts/playbook-interface.yaml +0 -0
  299. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/contracts/role-interface.yaml +0 -0
  300. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/data-model.md +0 -0
  301. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/plan.md +0 -0
  302. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/quickstart.md +0 -0
  303. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/research.md +0 -0
  304. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/spec.md +0 -0
  305. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/tasks.md +0 -0
  306. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/002-incus-container-support/checklists/requirements.md +0 -0
  307. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/002-incus-container-support/contracts/playbook-interface.yaml +0 -0
  308. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/002-incus-container-support/contracts/role-interface.yaml +0 -0
  309. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/002-incus-container-support/data-model.md +0 -0
  310. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/002-incus-container-support/plan.md +0 -0
  311. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/002-incus-container-support/quickstart.md +0 -0
  312. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/002-incus-container-support/research.md +0 -0
  313. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/002-incus-container-support/spec.md +0 -0
  314. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/002-incus-container-support/tasks.md +0 -0
  315. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/003-python-cli-rewrite/checklists/requirements.md +0 -0
  316. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/003-python-cli-rewrite/data-model.md +0 -0
  317. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/003-python-cli-rewrite/plan.md +0 -0
  318. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/003-python-cli-rewrite/quickstart.md +0 -0
  319. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/003-python-cli-rewrite/research.md +0 -0
  320. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/003-python-cli-rewrite/spec.md +0 -0
  321. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/003-python-cli-rewrite/tasks.md +0 -0
  322. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/004-proxmox-container-support/spec.md +0 -0
  323. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/005-provider-snapshots/checklists/requirements.md +0 -0
  324. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/005-provider-snapshots/contracts/cli-surface.md +0 -0
  325. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/005-provider-snapshots/data-model.md +0 -0
  326. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/005-provider-snapshots/plan.md +0 -0
  327. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/005-provider-snapshots/quickstart.md +0 -0
  328. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/005-provider-snapshots/research.md +0 -0
  329. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/005-provider-snapshots/spec.md +0 -0
  330. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/005-provider-snapshots/tasks.md +0 -0
  331. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/checklists/requirements.md +0 -0
  332. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/contracts/remo-host-protocol.md +0 -0
  333. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/contracts/rest-api.md +0 -0
  334. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/contracts/terminal-websocket.md +0 -0
  335. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/data-model.md +0 -0
  336. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/plan.md +0 -0
  337. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/quickstart.md +0 -0
  338. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/research.md +0 -0
  339. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/spec.md +0 -0
  340. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/tasks.md +0 -0
  341. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/checklists/requirements.md +0 -0
  342. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/contracts/cli-web-adopt.md +0 -0
  343. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/contracts/setup-api.md +0 -0
  344. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/data-model.md +0 -0
  345. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/plan.md +0 -0
  346. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/quickstart-results.md +0 -0
  347. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/quickstart.md +0 -0
  348. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/research.md +0 -0
  349. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/spec.md +0 -0
  350. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/tasks.md +0 -0
  351. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/012-web-adopt-pairing/contracts/cli-web-adopt.md +0 -0
  352. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/012-web-adopt-pairing/contracts/pairing-api.md +0 -0
  353. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/012-web-adopt-pairing/contracts/setup-api.md +0 -0
  354. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/012-web-adopt-pairing/data-model.md +0 -0
  355. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/012-web-adopt-pairing/plan.md +0 -0
  356. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/012-web-adopt-pairing/quickstart.md +0 -0
  357. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/012-web-adopt-pairing/research.md +0 -0
  358. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/012-web-adopt-pairing/spec.md +0 -0
  359. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/012-web-adopt-pairing/tasks.md +0 -0
  360. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/013-managed-instance-tags/contracts/cli-sync.md +0 -0
  361. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/013-managed-instance-tags/contracts/marker-commands.md +0 -0
  362. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/013-managed-instance-tags/data-model.md +0 -0
  363. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/013-managed-instance-tags/plan.md +0 -0
  364. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/013-managed-instance-tags/quickstart.md +0 -0
  365. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/013-managed-instance-tags/research.md +0 -0
  366. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/013-managed-instance-tags/spec.md +0 -0
  367. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/013-managed-instance-tags/tasks.md +0 -0
  368. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/014-register-ssh-host/contracts/add-command.md +0 -0
  369. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/014-register-ssh-host/contracts/remove-command.md +0 -0
  370. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/014-register-ssh-host/data-model.md +0 -0
  371. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/014-register-ssh-host/plan.md +0 -0
  372. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/014-register-ssh-host/quickstart.md +0 -0
  373. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/014-register-ssh-host/research.md +0 -0
  374. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/014-register-ssh-host/spec.md +0 -0
  375. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/014-register-ssh-host/tasks.md +0 -0
  376. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/checklists/requirements.md +0 -0
  377. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/contracts/mirror-payload-v2.md +0 -0
  378. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/contracts/registry-accessor-api.md +0 -0
  379. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/contracts/registry-file-v2.md +0 -0
  380. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/data-model.md +0 -0
  381. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/plan.md +0 -0
  382. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/quickstart.md +0 -0
  383. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/research.md +0 -0
  384. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/spec.md +0 -0
  385. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/tasks.md +0 -0
  386. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/016-sync-reconcile/checklists/requirements.md +0 -0
  387. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/016-sync-reconcile/contracts/cli-sync.md +0 -0
  388. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/016-sync-reconcile/contracts/provider-probe.md +0 -0
  389. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/016-sync-reconcile/data-model.md +0 -0
  390. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/016-sync-reconcile/plan.md +0 -0
  391. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/016-sync-reconcile/quickstart.md +0 -0
  392. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/016-sync-reconcile/research.md +0 -0
  393. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/016-sync-reconcile/spec.md +0 -0
  394. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/016-sync-reconcile/tasks.md +0 -0
  395. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/checklists/requirements.md +0 -0
  396. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/contracts/cli-web-push.md +0 -0
  397. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/contracts/cli-web-status.md +0 -0
  398. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/contracts/revocation.md +0 -0
  399. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/contracts/setup-status-marker.md +0 -0
  400. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/data-model.md +0 -0
  401. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/plan.md +0 -0
  402. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/quickstart.md +0 -0
  403. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/research.md +0 -0
  404. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/spec.md +0 -0
  405. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/tasks.md +0 -0
  406. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/baseline-notes.md +0 -0
  407. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/checklists/requirements.md +0 -0
  408. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/contracts/cli-surface.md +0 -0
  409. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/contracts/errors.md +0 -0
  410. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/contracts/lifecycle-templates.md +0 -0
  411. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/contracts/provider-protocol.md +0 -0
  412. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/contracts/sync-merge.md +0 -0
  413. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/data-model.md +0 -0
  414. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/plan.md +0 -0
  415. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/quickstart.md +0 -0
  416. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/research.md +0 -0
  417. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/spec.md +0 -0
  418. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/tasks.md +0 -0
  419. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/019-hygiene-deps-docs/checklists/requirements.md +0 -0
  420. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/019-hygiene-deps-docs/contracts/cli-surface-delta.md +0 -0
  421. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/019-hygiene-deps-docs/contracts/docs-structure-check.md +0 -0
  422. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/019-hygiene-deps-docs/data-model.md +0 -0
  423. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/019-hygiene-deps-docs/plan.md +0 -0
  424. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/019-hygiene-deps-docs/quickstart.md +0 -0
  425. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/019-hygiene-deps-docs/research.md +0 -0
  426. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/019-hygiene-deps-docs/spec.md +0 -0
  427. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/019-hygiene-deps-docs/tasks.md +0 -0
  428. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/020-openapi-type-generation/checklists/requirements.md +0 -0
  429. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/020-openapi-type-generation/contracts/drift-checks.md +0 -0
  430. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/020-openapi-type-generation/contracts/terminal-frames-v1.md +0 -0
  431. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/020-openapi-type-generation/data-model.md +0 -0
  432. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/020-openapi-type-generation/plan.md +0 -0
  433. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/020-openapi-type-generation/quickstart.md +0 -0
  434. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/020-openapi-type-generation/research.md +0 -0
  435. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/020-openapi-type-generation/spec.md +0 -0
  436. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/020-openapi-type-generation/tasks.md +0 -0
  437. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/021-cli-plane-separation/contracts/cli-surface.md +0 -0
  438. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/021-cli-plane-separation/contracts/descriptor-schema.md +0 -0
  439. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/021-cli-plane-separation/data-model.md +0 -0
  440. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/021-cli-plane-separation/plan.md +0 -0
  441. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/021-cli-plane-separation/quickstart.md +0 -0
  442. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/021-cli-plane-separation/research.md +0 -0
  443. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/021-cli-plane-separation/spec.md +0 -0
  444. {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/021-cli-plane-separation/tasks.md +0 -0
  445. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/__init__.py +0 -0
  446. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/__main__.py +0 -0
  447. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/cli/__init__.py +0 -0
  448. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/cli/added.py +0 -0
  449. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/cli/cp.py +0 -0
  450. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/cli/main.py +0 -0
  451. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/cli/providers/__init__.py +0 -0
  452. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/cli/providers/factory.py +0 -0
  453. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/cli/web.py +0 -0
  454. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/__init__.py +0 -0
  455. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/ansible_runner.py +0 -0
  456. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/completion.py +0 -0
  457. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/config.py +0 -0
  458. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/errors.py +0 -0
  459. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/known_hosts.py +0 -0
  460. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/lifecycle.py +0 -0
  461. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/output.py +0 -0
  462. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/picker.py +0 -0
  463. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/provider_protocol.py +0 -0
  464. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/provider_registry.py +0 -0
  465. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/reconcile.py +0 -0
  466. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/registry.py +0 -0
  467. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/remo_host_client.py +0 -0
  468. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/rsync.py +0 -0
  469. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/snapshot.py +0 -0
  470. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/ssh.py +0 -0
  471. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/validation.py +0 -0
  472. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/version.py +0 -0
  473. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/web_adopt.py +0 -0
  474. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/web_drift.py +0 -0
  475. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/models/__init__.py +0 -0
  476. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/models/capability.py +0 -0
  477. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/models/discovery.py +0 -0
  478. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/models/host.py +0 -0
  479. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/models/session_target.py +0 -0
  480. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/models/snapshot.py +0 -0
  481. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/__init__.py +0 -0
  482. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/added.py +0 -0
  483. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/aws.py +0 -0
  484. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/aws_descriptor.py +0 -0
  485. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/builtin.py +0 -0
  486. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/hetzner.py +0 -0
  487. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/hetzner_descriptor.py +0 -0
  488. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/incus.py +0 -0
  489. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/incus_descriptor.py +0 -0
  490. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/proxmox.py +0 -0
  491. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/proxmox_descriptor.py +0 -0
  492. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/__init__.py +0 -0
  493. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/api/__init__.py +0 -0
  494. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/api/hosts.py +0 -0
  495. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/api/pairing.py +0 -0
  496. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/api/setup.py +0 -0
  497. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/api/terminals.py +0 -0
  498. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/app.py +0 -0
  499. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/check.py +0 -0
  500. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/config.py +0 -0
  501. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/discovery.py +0 -0
  502. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/frames.py +0 -0
  503. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/health.py +0 -0
  504. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/logging_config.py +0 -0
  505. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/models.py +0 -0
  506. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/operator_auth.py +0 -0
  507. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/pairing.py +0 -0
  508. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/ssh_master.py +0 -0
  509. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/state.py +0 -0
  510. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/terminal.py +0 -0
  511. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/terminal_registry.py +0 -0
  512. {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/tokens.py +0 -0
  513. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/__init__.py +0 -0
  514. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/ansible/__init__.py +0 -0
  515. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/ansible/test_apt_sources_repair.py +0 -0
  516. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/ansible/test_authorized_keys_bootstrap.py +0 -0
  517. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/ansible/test_remo_host_idempotency.py +0 -0
  518. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/ansible/test_ssh_configure_connection.py +0 -0
  519. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/ansible/test_user_setup_docker_group.py +0 -0
  520. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/conftest.py +0 -0
  521. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/image/__init__.py +0 -0
  522. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/image/test_docker_image.py +0 -0
  523. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/__init__.py +0 -0
  524. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/_nine_terminal_fixture.py +0 -0
  525. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/fish_completion.sh +0 -0
  526. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/orbstack-cloud-init.yml +0 -0
  527. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/orbstack.sh +0 -0
  528. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_nine_terminals.py +0 -0
  529. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_nine_terminals_soak.py +0 -0
  530. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_registry_concurrency.py +0 -0
  531. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_remo_host_e2e.py +0 -0
  532. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_security_rejections.py +0 -0
  533. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_setup_payload_versions.py +0 -0
  534. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_sync_reconcile.py +0 -0
  535. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_terminal_attach.py +0 -0
  536. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_web_adopt_e2e.py +0 -0
  537. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_web_cli_parity.py +0 -0
  538. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/perf/__init__.py +0 -0
  539. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/perf/test_latency.py +0 -0
  540. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/perf/test_registry_perf.py +0 -0
  541. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/__init__.py +0 -0
  542. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/__init__.py +0 -0
  543. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/providers/test_aws_snapshot.py +0 -0
  544. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/providers/test_hetzner_snapshot.py +0 -0
  545. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/providers/test_incus_snapshot.py +0 -0
  546. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/providers/test_incus_sync_all.py +0 -0
  547. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/providers/test_proxmox_snapshot.py +0 -0
  548. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/providers/test_proxmox_sync_all.py +0 -0
  549. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/surface_baseline.py +0 -0
  550. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_add_cmd.py +0 -0
  551. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_cli_uniformity.py +0 -0
  552. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_configure_cmd.py +0 -0
  553. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_cp.py +0 -0
  554. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_main.py +0 -0
  555. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_remove_cmd.py +0 -0
  556. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_startup_imports.py +0 -0
  557. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_surface_preservation.py +0 -0
  558. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_web_adopt_cmd.py +0 -0
  559. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/__init__.py +0 -0
  560. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_ansible_runner.py +0 -0
  561. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_completion.py +0 -0
  562. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_config.py +0 -0
  563. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_errors.py +0 -0
  564. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_known_hosts.py +0 -0
  565. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_lifecycle.py +0 -0
  566. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_migration_tagging_notice.py +0 -0
  567. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_output.py +0 -0
  568. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_picker.py +0 -0
  569. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_provider_registry.py +0 -0
  570. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_reconcile.py +0 -0
  571. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_registry_format.py +0 -0
  572. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_registry_locking.py +0 -0
  573. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_registry_migration.py +0 -0
  574. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_remo_host_client.py +0 -0
  575. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_rsync.py +0 -0
  576. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_snapshot.py +0 -0
  577. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_ssh.py +0 -0
  578. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_ssh_added.py +0 -0
  579. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_ssh_controlpath.py +0 -0
  580. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_ssh_identity_opts.py +0 -0
  581. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_validation.py +0 -0
  582. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_version.py +0 -0
  583. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_web_adopt_authorize.py +0 -0
  584. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_web_adopt_code.py +0 -0
  585. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_web_adopt_payload.py +0 -0
  586. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_web_adopt_trust.py +0 -0
  587. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_web_drift.py +0 -0
  588. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_web_push.py +0 -0
  589. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_web_push_self_heal.py +0 -0
  590. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/models/__init__.py +0 -0
  591. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/models/test_capability.py +0 -0
  592. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/models/test_discovery.py +0 -0
  593. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/models/test_session_target.py +0 -0
  594. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/__init__.py +0 -0
  595. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/fake_provider.py +0 -0
  596. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_added_add.py +0 -0
  597. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_added_configure.py +0 -0
  598. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_added_provider_guard.py +0 -0
  599. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_added_update_remove.py +0 -0
  600. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_added_verify.py +0 -0
  601. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_aws_provider_protocol.py +0 -0
  602. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_aws_snapshot.py +0 -0
  603. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_aws_sync.py +0 -0
  604. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_aws_upgrade_resize.py +0 -0
  605. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_hetzner_entry_adapters.py +0 -0
  606. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_hetzner_http.py +0 -0
  607. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_hetzner_label.py +0 -0
  608. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_hetzner_resize.py +0 -0
  609. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_hetzner_snapshot.py +0 -0
  610. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_hetzner_sync.py +0 -0
  611. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_host_user_consistency.py +0 -0
  612. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_incus_entry_adapters.py +0 -0
  613. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_incus_marker.py +0 -0
  614. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_incus_resize.py +0 -0
  615. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_incus_snapshot.py +0 -0
  616. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_incus_sync.py +0 -0
  617. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_missing_sdk.py +0 -0
  618. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_provider_conformance.py +0 -0
  619. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_provider_registry_entries.py +0 -0
  620. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_proxmox_devcontainer_runtime.py +0 -0
  621. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_proxmox_marker.py +0 -0
  622. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_proxmox_provider_protocol.py +0 -0
  623. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_proxmox_resize.py +0 -0
  624. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_proxmox_snapshot.py +0 -0
  625. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_proxmox_sync.py +0 -0
  626. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_ansible_templates.py +0 -0
  627. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_architecture.py +0 -0
  628. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_dependabot_config.py +0 -0
  629. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_devcontainer_shim.py +0 -0
  630. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_docs_examples.py +0 -0
  631. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_docs_structure.py +0 -0
  632. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_host_model.py +0 -0
  633. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_host_ssh_type.py +0 -0
  634. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_lockfile_version.py +0 -0
  635. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_schema_drift.py +0 -0
  636. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_workflow_action_pins.py +0 -0
  637. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/__init__.py +0 -0
  638. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/_pairing_support.py +0 -0
  639. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/conftest.py +0 -0
  640. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/fixtures/hosts_response.json +0 -0
  641. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/fixtures/sessions_response.json +0 -0
  642. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_backpressure.py +0 -0
  643. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_check.py +0 -0
  644. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_csp.py +0 -0
  645. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_discovery.py +0 -0
  646. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_discovery_refresh_force.py +0 -0
  647. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_frames.py +0 -0
  648. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_health_states.py +0 -0
  649. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_hosts_mapping.py +0 -0
  650. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_lazy_import.py +0 -0
  651. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_log_redaction.py +0 -0
  652. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_mint_gating.py +0 -0
  653. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_operator_auth.py +0 -0
  654. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_pairing.py +0 -0
  655. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_pairing_origin.py +0 -0
  656. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_payload_equivalence.py +0 -0
  657. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_registry_readonly.py +0 -0
  658. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_service_identity_selection.py +0 -0
  659. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_setup_api.py +0 -0
  660. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_setup_auth.py +0 -0
  661. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_setup_dormancy.py +0 -0
  662. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_state.py +0 -0
  663. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_terminal_resize.py +0 -0
  664. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_terminals_api.py +0 -0
  665. {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_tokens.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "4.3.6"
3
+ }
@@ -47,7 +47,7 @@ src/remo_cli/ # Python CLI package (src layout, hatchling build)
47
47
  ├── __main__.py # python -m remo_cli entry point
48
48
  ├── cli/ # Click command layer (parsing only, no business logic)
49
49
  │ ├── main.py # Root CLI group; mounts one group per remo_cli.core.provider_registry.all_descriptors()
50
- │ ├── shell.py # remo shell — registry-dispatched update_entry() (delegates to upgrade()); prompt names the exact `remo <type> upgrade <name>` it will run; unknown type/ssh handled explicitly (no silent no-op)
50
+ │ ├── shell.py # remo shell — pre-connect version check for EVERY host type; _run_tools_upgrade() dispatches to the provider's update_entry() (delegates to upgrade()) or, for type="ssh", providers/added.configure(); prompt names the exact `remo <type> upgrade <name>` / `remo configure <name>` it will run; unknown type raises (no silent no-op); an added host with no `~/.remo-version` marker connects silently (FR-011)
51
51
  │ ├── cp.py # remo cp
52
52
  │ ├── added.py # remo add / remo remove / remo configure — provider-neutral SSH host registration (014) and configure (022)
53
53
  │ ├── web.py # remo web {serve,check,push,status,adopt} — serve/check lazy-import remo_cli.web.* (NFR-008); push/status/adopt use core/web_adopt + core/web_drift only (adopt is a deprecated alias for push)
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [4.3.6](https://github.com/get2knowio/remo/compare/v4.3.5...v4.3.6) (2026-08-16)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **web:** let macOS users select terminal text while a TUI owns the mouse ([#181](https://github.com/get2knowio/remo/issues/181)) ([84285e8](https://github.com/get2knowio/remo/commit/84285e8aa4414b225bfe2f820d6fc2d1cdb70103))
9
+
10
+ ## [4.3.5](https://github.com/get2knowio/remo/compare/v4.3.4...v4.3.5) (2026-08-16)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * **cli:** check the tools version on added SSH hosts too ([#178](https://github.com/get2knowio/remo/issues/178)) ([#179](https://github.com/get2knowio/remo/issues/179)) ([1727b72](https://github.com/get2knowio/remo/commit/1727b724faef9b5b994640c41e80c3ebb550d240))
16
+
3
17
  ## [4.3.4](https://github.com/get2knowio/remo/compare/v4.3.3...v4.3.4) (2026-08-15)
4
18
 
5
19
 
@@ -47,7 +47,7 @@ src/remo_cli/ # Python CLI package (src layout, hatchling build)
47
47
  ├── __main__.py # python -m remo_cli entry point
48
48
  ├── cli/ # Click command layer (parsing only, no business logic)
49
49
  │ ├── main.py # Root CLI group; mounts one group per remo_cli.core.provider_registry.all_descriptors()
50
- │ ├── shell.py # remo shell — registry-dispatched update_entry() (delegates to upgrade()); prompt names the exact `remo <type> upgrade <name>` it will run; unknown type/ssh handled explicitly (no silent no-op)
50
+ │ ├── shell.py # remo shell — pre-connect version check for EVERY host type; _run_tools_upgrade() dispatches to the provider's update_entry() (delegates to upgrade()) or, for type="ssh", providers/added.configure(); prompt names the exact `remo <type> upgrade <name>` / `remo configure <name>` it will run; unknown type raises (no silent no-op); an added host with no `~/.remo-version` marker connects silently (FR-011)
51
51
  │ ├── cp.py # remo cp
52
52
  │ ├── added.py # remo add / remo remove / remo configure — provider-neutral SSH host registration (014) and configure (022)
53
53
  │ ├── web.py # remo web {serve,check,push,status,adopt} — serve/check lazy-import remo_cli.web.* (NFR-008); push/status/adopt use core/web_adopt + core/web_drift only (adopt is a deprecated alias for push)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: remo-cli
3
- Version: 4.3.4
3
+ Version: 4.3.6
4
4
  Summary: Remote development environment CLI
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -327,6 +327,13 @@ remo configure mybox --skip docker # everything except Docker
327
327
  remo web push # authorize the web service on it
328
328
  ```
329
329
 
330
+ Re-running it is how a configured host stays current — it refreshes
331
+ `project-menu`, `remo-host`, `project-launch` and the rest of the toolchain, and
332
+ applies system package updates. `remo shell` checks the version on connect and
333
+ offers to run it for you when the host is behind, exactly as it does for
334
+ provider hosts. A host you added but never configured is left alone: no marker,
335
+ no prompt, straight into a login shell.
336
+
330
337
  #### Example: an OrbStack VM
331
338
 
332
339
  [`docs/examples/orbstack-cloud-init.yaml`](docs/examples/orbstack-cloud-init.yaml)
@@ -301,6 +301,13 @@ remo configure mybox --skip docker # everything except Docker
301
301
  remo web push # authorize the web service on it
302
302
  ```
303
303
 
304
+ Re-running it is how a configured host stays current — it refreshes
305
+ `project-menu`, `remo-host`, `project-launch` and the rest of the toolchain, and
306
+ applies system package updates. `remo shell` checks the version on connect and
307
+ offers to run it for you when the host is behind, exactly as it does for
308
+ provider hosts. A host you added but never configured is left alone: no marker,
309
+ no prompt, straight into a login shell.
310
+
304
311
  #### Example: an OrbStack VM
305
312
 
306
313
  [`docs/examples/orbstack-cloud-init.yaml`](docs/examples/orbstack-cloud-init.yaml)
@@ -145,7 +145,15 @@ The SPA is a two-pane **web console**:
145
145
 
146
146
  **Clipboard & links.** Select text and press **⌘C** (macOS) / **Ctrl+Shift+C** (Linux/Windows), or click
147
147
  the **⧉ Copy** button that appears on selection, to copy to the system clipboard; bare **Ctrl+C** stays
148
- SIGINT. **Paste** with ⌘V / Ctrl+V. **http(s) URLs are clickable** and open in a new tab. Remote apps that
148
+ SIGINT. **Paste** with ⌘V / Ctrl+V.
149
+
150
+ > **Selecting while a full-screen app is running.** Claude Code, vim, htop and
151
+ > anything else that turns on mouse reporting receive your drags, so an ordinary
152
+ > drag selects nothing. Hold a modifier to select locally instead:
153
+ > **Option+drag** on macOS, **Shift+drag** on Linux/Windows. (The split is
154
+ > xterm's, not ours — Shift is not consulted on macOS at all.)
155
+
156
+ **http(s) URLs are clickable** and open in a new tab. Remote apps that
149
157
  emit **OSC 52** (e.g. Claude Code's copy-on-select) can write to the browser clipboard — best-effort: it
150
158
  must traverse Zellij and the browser must permit a gesture-less clipboard write. OSC 52 *reads* are denied
151
159
  (a remote app can never read your clipboard). Clipboard access needs a secure context (HTTPS or localhost).
@@ -0,0 +1,45 @@
1
+ // Construction-time xterm options that are load-bearing for behaviour we can't
2
+ // otherwise reach from a test.
3
+ //
4
+ // Why these are asserted against the constructed Terminal rather than exercised
5
+ // end-to-end: the behaviour they gate is platform-branched inside xterm, on a
6
+ // `isMac` it reads from `navigator.platform` at module load. Chromium on a Linux
7
+ // CI runner always takes the non-Mac branch, and Playwright's `userAgent`
8
+ // override does not change `navigator.platform` — so a browser test of the macOS
9
+ // path would silently exercise the Linux one and pass no matter what we set.
10
+ // Asserting the option is the honest bound of what is checkable here.
11
+
12
+ import { describe, expect, it } from "vitest";
13
+ import type { Terminal } from "@xterm/xterm";
14
+
15
+ import { XtermRenderer } from "./XtermRenderer";
16
+
17
+ /** The renderer owns its Terminal privately; tests read it deliberately. */
18
+ function terminalOf(renderer: XtermRenderer): Terminal {
19
+ return (renderer as unknown as { terminal: Terminal }).terminal;
20
+ }
21
+
22
+ describe("XtermRenderer terminal options", () => {
23
+ it("lets macOS users select text while a TUI owns the mouse", () => {
24
+ // xterm's escape hatch from application mouse reporting is asymmetric:
25
+ // isMac ? altKey && macOptionClickForcesSelection : shiftKey
26
+ // Shift is never consulted on macOS, and this option defaults to false, so
27
+ // leaving it unset means a Mac user inside Claude Code (or vim, or htop)
28
+ // cannot select — and therefore cannot copy — anything at all.
29
+ const renderer = new XtermRenderer();
30
+
31
+ expect(terminalOf(renderer).options.macOptionClickForcesSelection).toBe(true);
32
+
33
+ renderer.dispose();
34
+ });
35
+
36
+ it("enables proposed API so the ligatures addon can load", () => {
37
+ // @xterm/addon-ligatures registers a character joiner behind xterm's
38
+ // proposed-API guard and throws on load without this.
39
+ const renderer = new XtermRenderer();
40
+
41
+ expect(terminalOf(renderer).options.allowProposedApi).toBe(true);
42
+
43
+ renderer.dispose();
44
+ });
45
+ });
@@ -76,6 +76,24 @@ export class XtermRenderer implements RendererAdapter {
76
76
  // @xterm/addon-ligatures registers a character joiner, which lives behind
77
77
  // xterm's "proposed API" guard; without this the addon throws on load.
78
78
  allowProposedApi: true,
79
+ // Makes text selectable on macOS while a TUI owns the mouse.
80
+ //
81
+ // Once an application enables mouse reporting (Claude Code, vim, htop,
82
+ // ...), xterm forwards drags to it instead of selecting locally. Its
83
+ // escape hatch is asymmetric:
84
+ //
85
+ // shouldForceSelection(e) {
86
+ // return isMac ? e.altKey && macOptionClickForcesSelection
87
+ // : e.shiftKey;
88
+ // }
89
+ //
90
+ // Shift is not consulted on macOS at all, and this option defaults to
91
+ // false — so a Mac user inside any mouse-reporting TUI had NO way to
92
+ // select text, while Shift+drag worked fine on every other platform.
93
+ // Enabling it restores parity via Option+drag. The trade is that
94
+ // Option+click no longer reaches the application, which is not a chord
95
+ // terminal programs bind.
96
+ macOptionClickForcesSelection: true,
79
97
  });
80
98
  this.fitAddon = new FitAddon();
81
99
  this.terminal.loadAddon(this.fitAddon);
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "remo-cli"
7
- version = "4.3.4"
7
+ version = "4.3.6"
8
8
  description = "Remote development environment CLI"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -104,12 +104,18 @@ def shell(
104
104
 
105
105
  # Pre-shell remote version check.
106
106
  #
107
- # Skip entirely for manually-added SSH hosts (feature 014, type="ssh"):
108
- # they have no remo-managed tooling, so a missing `remo-host`/version marker
109
- # is "unknown/unmanaged", not a prompt to run a (nonexistent) provider
110
- # update. This lets `remo shell` drop straight into a plain login shell
111
- # (FR-011).
112
- if not no_update_check and host.type != "ssh":
107
+ # Applies to every host type, added SSH hosts included. Feature 014 skipped
108
+ # type="ssh" outright on the premise that such hosts "have no remo-managed
109
+ # tooling" — true then, false since 022 gave them `remo configure`, which
110
+ # runs the same shared `tasks/configure_dev_tools.yml` role list every
111
+ # provider upgrade runs and writes the very `~/.remo-version` marker this
112
+ # check reads. A configured added host is version-managed like any other,
113
+ # and skipping it meant an arbitrarily stale one was never surfaced.
114
+ #
115
+ # What survives from FR-011 is narrower and lives in the no-marker branch
116
+ # below: an added host that was never configured is a plain SSH box by the
117
+ # operator's choice, and still drops straight into a login shell.
118
+ if not no_update_check:
113
119
  local_version = get_current_version()
114
120
  if local_version != "unknown":
115
121
  remote_version, remote_err = check_remote_version(host)
@@ -125,6 +131,13 @@ def shell(
125
131
  f" {remote_err}\n"
126
132
  f" Skipping update check; proceeding with connection."
127
133
  )
134
+ elif remote_version is None and host.type == "ssh":
135
+ # An added host with no marker was never `remo configure`d.
136
+ # Prompting to configure a box the operator deliberately left
137
+ # unmanaged would nag on every single connect, so stay silent
138
+ # (FR-011). Once configured it has a marker and takes the
139
+ # ordinary comparison branches below.
140
+ pass
128
141
  elif remote_version is None:
129
142
  # No marker file on remote
130
143
  should_update = confirm(
@@ -151,7 +164,7 @@ def shell(
151
164
  from remo_cli.core.errors import ProviderError # noqa: PLC0415
152
165
 
153
166
  try:
154
- _run_provider_upgrade(host)
167
+ _run_tools_upgrade(host)
155
168
  except ProviderError as e:
156
169
  # The playbook log has already been dumped, but the SSH
157
170
  # connection (and any remote project picker) would scroll
@@ -174,7 +187,10 @@ def shell(
174
187
 
175
188
 
176
189
  def _upgrade_command_hint(host) -> str: # noqa: ANN001
177
- """Render the exact `remo <type> upgrade <name>` command for *host*.
190
+ """Render the exact command that accepting the prompt will run.
191
+
192
+ ``remo configure <name>`` for an added (type="ssh") host, and
193
+ `remo <type> upgrade <name>` for a provider one.
178
194
 
179
195
  Names the precise command the accepted prompt runs (SC-003) so the
180
196
  remedy is always executable and truthful.
@@ -194,24 +210,41 @@ def _upgrade_command_hint(host) -> str: # noqa: ANN001
194
210
  is_provider_type,
195
211
  )
196
212
 
197
- if is_provider_type(host.type):
198
- descriptor = get_descriptor(host.type)
199
- if descriptor.name_format is NameFormat.HOST_SCOPED and "/" in host.name:
200
- host_part, _, short_name = host.name.partition("/")
201
- cmd = f"remo {host.type} upgrade {short_name} --host {host_part}"
202
- for attr, json_key in descriptor.registry_fields:
203
- if json_key.endswith("_user"):
204
- user_value = getattr(host, attr, "")
205
- if user_value:
206
- flag = "--" + json_key.replace("_", "-")
207
- cmd += f" {flag} {user_value}"
208
- break
209
- return cmd
213
+ if host.type == "ssh":
214
+ # Added host: `remo configure` is its upgrade verb — the same shared
215
+ # role list, reached through ssh_configure.yml. There is no `remo ssh`
216
+ # command group, so the provider spelling below would name a command
217
+ # that cannot be run.
218
+ return f"remo configure {host.name}"
219
+
220
+ if not is_provider_type(host.type):
221
+ # Unrecognized registry type: keep the provider spelling so the message
222
+ # names the type that is actually wrong. _run_tools_upgrade() refuses
223
+ # it with a PreconditionError rather than running anything.
224
+ return f"remo {host.type} upgrade {host.name}"
225
+
226
+ descriptor = get_descriptor(host.type)
227
+ if descriptor.name_format is NameFormat.HOST_SCOPED and "/" in host.name:
228
+ host_part, _, short_name = host.name.partition("/")
229
+ cmd = f"remo {host.type} upgrade {short_name} --host {host_part}"
230
+ for attr, json_key in descriptor.registry_fields:
231
+ if json_key.endswith("_user"):
232
+ user_value = getattr(host, attr, "")
233
+ if user_value:
234
+ flag = "--" + json_key.replace("_", "-")
235
+ cmd += f" {flag} {user_value}"
236
+ break
237
+ return cmd
210
238
  return f"remo {host.type} upgrade {host.name}"
211
239
 
212
240
 
213
- def _run_provider_upgrade(host) -> None: # noqa: ANN001
214
- """Run the appropriate provider upgrade for the given host.
241
+ def _run_tools_upgrade(host) -> None: # noqa: ANN001
242
+ """Refresh remo's tooling on *host*, whichever kind of host it is.
243
+
244
+ Two paths onto the same shared ``tasks/configure_dev_tools.yml`` role list:
245
+ ``providers.added.configure()`` for an added (type="ssh") host, and the
246
+ provider's own ``update_entry()`` for a managed one. Must stay in step with
247
+ :func:`_upgrade_command_hint`, which promises the user exactly one of them.
215
248
 
216
249
  Raises :class:`~remo_cli.core.errors.ProviderError` on failure (including
217
250
  an unrecognized provider type — no more silent no-op).
@@ -222,6 +255,17 @@ def _run_provider_upgrade(host) -> None: # noqa: ANN001
222
255
 
223
256
  print_info(f"Upgrading instance '{host.name}'...")
224
257
 
258
+ if host.type == "ssh":
259
+ from remo_cli.providers import added # noqa: PLC0415
260
+
261
+ # assume_yes: the caller already confirmed the named `remo configure`
262
+ # command. configure()'s own prompt warns about apt-upgrade and
263
+ # passwordless sudo — consent the operator necessarily gave when this
264
+ # host was first configured, which is what put the marker there that
265
+ # brought us here. Provider upgrades don't re-prompt either.
266
+ added.configure(name=host.name, assume_yes=True)
267
+ return
268
+
225
269
  if not is_provider_type(host.type):
226
270
  raise PreconditionError(
227
271
  f"Unknown provider type '{host.type}' for '{host.name}'; cannot upgrade tools."
@@ -431,41 +431,42 @@ class TestBuildProjectLaunchRemoteCmd:
431
431
 
432
432
 
433
433
  class TestRunProviderUpgrade:
434
- """Tests for _run_provider_upgrade(): registry-dispatched via
435
- provider_registry + the Protocol's update_entry(entry) verb (018)."""
434
+ """Tests for _run_tools_upgrade(): registry-dispatched via
435
+ provider_registry + the Protocol's update_entry(entry) verb (018), plus the
436
+ added-host path onto providers.added.configure() (#178)."""
436
437
 
437
438
  def test_aws_update(self, mocker):
438
- from remo_cli.cli.shell import _run_provider_upgrade
439
+ from remo_cli.cli.shell import _run_tools_upgrade
439
440
 
440
441
  host = KnownHost(type="aws", name="devbox", host="1.2.3.4", user="remo")
441
442
  mock_update_entry = mocker.patch("remo_cli.providers.aws.update_entry")
442
443
 
443
- _run_provider_upgrade(host)
444
+ _run_tools_upgrade(host)
444
445
 
445
446
  mock_update_entry.assert_called_once_with(host)
446
447
 
447
448
  def test_hetzner_update(self, mocker):
448
- from remo_cli.cli.shell import _run_provider_upgrade
449
+ from remo_cli.cli.shell import _run_tools_upgrade
449
450
 
450
451
  host = KnownHost(type="hetzner", name="webserver", host="5.6.7.8", user="remo")
451
452
  mock_update_entry = mocker.patch("remo_cli.providers.hetzner.update_entry")
452
453
 
453
- _run_provider_upgrade(host)
454
+ _run_tools_upgrade(host)
454
455
 
455
456
  mock_update_entry.assert_called_once_with(host)
456
457
 
457
458
  def test_incus_update(self, mocker):
458
- from remo_cli.cli.shell import _run_provider_upgrade
459
+ from remo_cli.cli.shell import _run_tools_upgrade
459
460
 
460
461
  host = KnownHost(type="incus", name="myhost/devcontainer", host="192.168.1.50", user="remo")
461
462
  mock_update_entry = mocker.patch("remo_cli.providers.incus.update_entry")
462
463
 
463
- _run_provider_upgrade(host)
464
+ _run_tools_upgrade(host)
464
465
 
465
466
  mock_update_entry.assert_called_once_with(host)
466
467
 
467
468
  def test_proxmox_update(self, mocker):
468
- from remo_cli.cli.shell import _run_provider_upgrade
469
+ from remo_cli.cli.shell import _run_tools_upgrade
469
470
 
470
471
  host = KnownHost(
471
472
  type="proxmox",
@@ -478,21 +479,49 @@ class TestRunProviderUpgrade:
478
479
  )
479
480
  mock_update_entry = mocker.patch("remo_cli.providers.proxmox.update_entry")
480
481
 
481
- _run_provider_upgrade(host)
482
+ _run_tools_upgrade(host)
482
483
 
483
484
  mock_update_entry.assert_called_once_with(host)
484
485
 
485
486
  def test_unknown_type_raises_precondition_error_naming_the_type(self):
486
- from remo_cli.cli.shell import _run_provider_upgrade
487
+ from remo_cli.cli.shell import _run_tools_upgrade
487
488
  from remo_cli.core.errors import PreconditionError
488
489
 
489
490
  host = KnownHost(type="totally-unknown", name="foo", host="1.2.3.4", user="remo")
490
491
 
491
492
  with pytest.raises(PreconditionError, match="totally-unknown"):
492
- _run_provider_upgrade(host)
493
+ _run_tools_upgrade(host)
494
+
495
+ def test_added_ssh_host_dispatches_to_configure(self, mocker):
496
+ """An added host has no provider; `remo configure` is its upgrade verb.
497
+
498
+ Pinned because get_provider("ssh") would raise: the dispatch has to
499
+ branch before the registry lookup, not after it.
500
+ """
501
+ from remo_cli.cli.shell import _run_tools_upgrade
502
+
503
+ host = KnownHost(type="ssh", name="mybox", host="1.2.3.4", user="remo")
504
+ configure = mocker.patch("remo_cli.providers.added.configure")
505
+
506
+ _run_tools_upgrade(host)
507
+
508
+ configure.assert_called_once_with(name="mybox", assume_yes=True)
509
+
510
+ def test_added_ssh_host_configure_failure_propagates(self, mocker):
511
+ from remo_cli.cli.shell import _run_tools_upgrade
512
+ from remo_cli.core.errors import OperationFailedError
513
+
514
+ host = KnownHost(type="ssh", name="mybox", host="1.2.3.4", user="remo")
515
+ mocker.patch(
516
+ "remo_cli.providers.added.configure",
517
+ side_effect=OperationFailedError("playbook rc=2"),
518
+ )
519
+
520
+ with pytest.raises(OperationFailedError, match="rc=2"):
521
+ _run_tools_upgrade(host)
493
522
 
494
523
  def test_update_entry_failure_propagates_as_provider_error(self, mocker):
495
- from remo_cli.cli.shell import _run_provider_upgrade
524
+ from remo_cli.cli.shell import _run_tools_upgrade
496
525
  from remo_cli.core.errors import OperationFailedError
497
526
 
498
527
  host = KnownHost(type="aws", name="devbox", host="1.2.3.4", user="remo")
@@ -502,4 +531,4 @@ class TestRunProviderUpgrade:
502
531
  )
503
532
 
504
533
  with pytest.raises(OperationFailedError):
505
- _run_provider_upgrade(host)
534
+ _run_tools_upgrade(host)
@@ -0,0 +1,149 @@
1
+ """`remo shell` behaviour for manually-added SSH hosts (feature 014, FR-011).
2
+
3
+ The pre-connect version check applies to added (type="ssh") hosts, because 022
4
+ gave them `remo configure` — the same shared tasks/configure_dev_tools.yml role
5
+ list a provider upgrade runs, writing the same `~/.remo-version` marker. What
6
+ FR-011 protects is narrower than "skip the check": an added host that was never
7
+ configured has no marker, and must drop straight into a plain login shell rather
8
+ than nag on every connect. See #178.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import pytest
14
+ from click.testing import CliRunner
15
+
16
+ from remo_cli.cli.shell import shell
17
+ from remo_cli.models.host import KnownHost
18
+
19
+
20
+ @pytest.fixture
21
+ def runner() -> CliRunner:
22
+ return CliRunner()
23
+
24
+
25
+ def _ssh_host() -> KnownHost:
26
+ return KnownHost(
27
+ type="ssh",
28
+ name="mybox",
29
+ host="1.2.3.4",
30
+ user="remo",
31
+ instance_id="22",
32
+ access_mode="direct",
33
+ )
34
+
35
+
36
+ def _incus_host() -> KnownHost:
37
+ return KnownHost(type="incus", name="h/dev", host="10.0.0.5", user="remo")
38
+
39
+
40
+ def test_unconfigured_ssh_host_connects_without_prompting(runner, mocker) -> None:
41
+ """FR-011, restated as what it actually protects.
42
+
43
+ An added host with no ``~/.remo-version`` was never ``remo configure``d —
44
+ a plain SSH box by the operator's choice — so it drops straight into a login
45
+ shell. The probe itself DOES run now (it is how we learn there is no
46
+ marker); what must not happen is a prompt.
47
+
48
+ This replaces an earlier assertion that the probe was never issued at all,
49
+ which pinned #178: it made a configured-but-stale added host permanently
50
+ invisible to the check.
51
+ """
52
+ mocker.patch("remo_cli.core.ssh.resolve_remo_host", return_value=_ssh_host())
53
+ mocker.patch(
54
+ "remo_cli.providers.aws.auto_start_aws_if_stopped",
55
+ side_effect=lambda h: h,
56
+ )
57
+ mocker.patch(
58
+ "remo_cli.core.version.get_current_version", return_value="2.2.0"
59
+ )
60
+ check = mocker.patch(
61
+ "remo_cli.core.ssh.check_remote_version", return_value=(None, None)
62
+ )
63
+ upgrade = mocker.patch("remo_cli.cli.shell._run_tools_upgrade")
64
+ connect = mocker.patch("remo_cli.core.ssh.shell_connect")
65
+
66
+ result = runner.invoke(shell, ["mybox"], input="")
67
+
68
+ assert result.exit_code == 0
69
+ check.assert_called_once()
70
+ upgrade.assert_not_called()
71
+ assert "no version info" not in result.output
72
+ connect.assert_called_once()
73
+
74
+
75
+ def test_stale_configured_ssh_host_is_offered_remo_configure(runner, mocker) -> None:
76
+ """The #178 regression: a configured added host that is behind must be told.
77
+
78
+ `remo configure` runs the same shared tasks/configure_dev_tools.yml role
79
+ list a provider upgrade runs, so the prompt has to name it — `remo ssh
80
+ upgrade` is not a command that exists.
81
+ """
82
+ mocker.patch("remo_cli.core.ssh.resolve_remo_host", return_value=_ssh_host())
83
+ mocker.patch(
84
+ "remo_cli.providers.aws.auto_start_aws_if_stopped",
85
+ side_effect=lambda h: h,
86
+ )
87
+ mocker.patch(
88
+ "remo_cli.core.version.get_current_version", return_value="4.3.4"
89
+ )
90
+ mocker.patch(
91
+ "remo_cli.core.ssh.check_remote_version", return_value=("4.3.2", None)
92
+ )
93
+ upgrade = mocker.patch("remo_cli.cli.shell._run_tools_upgrade")
94
+ connect = mocker.patch("remo_cli.core.ssh.shell_connect")
95
+
96
+ result = runner.invoke(shell, ["mybox"], input="y\n")
97
+
98
+ assert result.exit_code == 0
99
+ assert "4.3.2" in result.output and "4.3.4" in result.output
100
+ assert "remo configure mybox" in result.output
101
+ assert "remo ssh upgrade" not in result.output
102
+ upgrade.assert_called_once()
103
+ connect.assert_called_once()
104
+
105
+
106
+ def test_ssh_host_ahead_of_client_warns_like_any_other(runner, mocker) -> None:
107
+ mocker.patch("remo_cli.core.ssh.resolve_remo_host", return_value=_ssh_host())
108
+ mocker.patch(
109
+ "remo_cli.providers.aws.auto_start_aws_if_stopped",
110
+ side_effect=lambda h: h,
111
+ )
112
+ mocker.patch(
113
+ "remo_cli.core.version.get_current_version", return_value="4.3.2"
114
+ )
115
+ mocker.patch(
116
+ "remo_cli.core.ssh.check_remote_version", return_value=("4.3.4", None)
117
+ )
118
+ upgrade = mocker.patch("remo_cli.cli.shell._run_tools_upgrade")
119
+ connect = mocker.patch("remo_cli.core.ssh.shell_connect")
120
+
121
+ result = runner.invoke(shell, ["mybox"])
122
+
123
+ assert result.exit_code == 0
124
+ assert "newer tools" in result.output
125
+ upgrade.assert_not_called()
126
+ connect.assert_called_once()
127
+
128
+
129
+ def test_managed_host_still_runs_version_check(runner, mocker) -> None:
130
+ # Contrast: a provider host DOES get the version check (gate is type-specific).
131
+ mocker.patch("remo_cli.core.ssh.resolve_remo_host", return_value=_incus_host())
132
+ mocker.patch(
133
+ "remo_cli.providers.aws.auto_start_aws_if_stopped",
134
+ side_effect=lambda h: h,
135
+ )
136
+ mocker.patch(
137
+ "remo_cli.core.version.get_current_version", return_value="2.2.0"
138
+ )
139
+ check = mocker.patch(
140
+ "remo_cli.core.ssh.check_remote_version", return_value=("2.2.0", None)
141
+ )
142
+ mocker.patch("remo_cli.core.version.version_is_newer", return_value=False)
143
+ connect = mocker.patch("remo_cli.core.ssh.shell_connect")
144
+
145
+ result = runner.invoke(shell, ["dev"])
146
+
147
+ assert result.exit_code == 0
148
+ check.assert_called_once()
149
+ connect.assert_called_once()
@@ -1035,7 +1035,7 @@ wheels = [
1035
1035
 
1036
1036
  [[package]]
1037
1037
  name = "remo-cli"
1038
- version = "4.3.4"
1038
+ version = "4.3.6"
1039
1039
  source = { editable = "." }
1040
1040
  dependencies = [
1041
1041
  { name = "ansible-core" },
@@ -1,3 +0,0 @@
1
- {
2
- ".": "4.3.4"
3
- }