remo-cli 4.0.0__tar.gz → 4.0.1__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 (635) hide show
  1. remo_cli-4.0.1/.release-please-manifest.json +3 -0
  2. {remo_cli-4.0.0 → remo_cli-4.0.1}/CHANGELOG.md +8 -0
  3. {remo_cli-4.0.0 → remo_cli-4.0.1}/PKG-INFO +1 -1
  4. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/TerminalCard.css +11 -4
  5. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/TerminalCard.test.tsx +57 -0
  6. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/TerminalCard.tsx +112 -3
  7. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/theme/terminalThemes.test.ts +51 -0
  8. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/theme/terminalThemes.ts +11 -2
  9. {remo_cli-4.0.0 → remo_cli-4.0.1}/pyproject.toml +1 -1
  10. {remo_cli-4.0.0 → remo_cli-4.0.1}/uv.lock +1 -1
  11. remo_cli-4.0.0/.release-please-manifest.json +0 -3
  12. {remo_cli-4.0.0 → remo_cli-4.0.1}/.claude/skills/release/SKILL.md +0 -0
  13. {remo_cli-4.0.0 → remo_cli-4.0.1}/.claude/skills/speckit-analyze/SKILL.md +0 -0
  14. {remo_cli-4.0.0 → remo_cli-4.0.1}/.claude/skills/speckit-checklist/SKILL.md +0 -0
  15. {remo_cli-4.0.0 → remo_cli-4.0.1}/.claude/skills/speckit-clarify/SKILL.md +0 -0
  16. {remo_cli-4.0.0 → remo_cli-4.0.1}/.claude/skills/speckit-constitution/SKILL.md +0 -0
  17. {remo_cli-4.0.0 → remo_cli-4.0.1}/.claude/skills/speckit-converge/SKILL.md +0 -0
  18. {remo_cli-4.0.0 → remo_cli-4.0.1}/.claude/skills/speckit-git-commit/SKILL.md +0 -0
  19. {remo_cli-4.0.0 → remo_cli-4.0.1}/.claude/skills/speckit-git-feature/SKILL.md +0 -0
  20. {remo_cli-4.0.0 → remo_cli-4.0.1}/.claude/skills/speckit-git-initialize/SKILL.md +0 -0
  21. {remo_cli-4.0.0 → remo_cli-4.0.1}/.claude/skills/speckit-git-remote/SKILL.md +0 -0
  22. {remo_cli-4.0.0 → remo_cli-4.0.1}/.claude/skills/speckit-git-validate/SKILL.md +0 -0
  23. {remo_cli-4.0.0 → remo_cli-4.0.1}/.claude/skills/speckit-implement/SKILL.md +0 -0
  24. {remo_cli-4.0.0 → remo_cli-4.0.1}/.claude/skills/speckit-plan/SKILL.md +0 -0
  25. {remo_cli-4.0.0 → remo_cli-4.0.1}/.claude/skills/speckit-specify/SKILL.md +0 -0
  26. {remo_cli-4.0.0 → remo_cli-4.0.1}/.claude/skills/speckit-tasks/SKILL.md +0 -0
  27. {remo_cli-4.0.0 → remo_cli-4.0.1}/.claude/skills/speckit-taskstoissues/SKILL.md +0 -0
  28. {remo_cli-4.0.0 → remo_cli-4.0.1}/.devcontainer/devcontainer.json +0 -0
  29. {remo_cli-4.0.0 → remo_cli-4.0.1}/.dockerignore +0 -0
  30. {remo_cli-4.0.0 → remo_cli-4.0.1}/.github/CODEOWNERS +0 -0
  31. {remo_cli-4.0.0 → remo_cli-4.0.1}/.github/dependabot.yml +0 -0
  32. {remo_cli-4.0.0 → remo_cli-4.0.1}/.github/workflows/ci.yml +0 -0
  33. {remo_cli-4.0.0 → remo_cli-4.0.1}/.github/workflows/codeql.yml +0 -0
  34. {remo_cli-4.0.0 → remo_cli-4.0.1}/.github/workflows/dependency-review.yml +0 -0
  35. {remo_cli-4.0.0 → remo_cli-4.0.1}/.github/workflows/dev-build.yml +0 -0
  36. {remo_cli-4.0.0 → remo_cli-4.0.1}/.github/workflows/provision.yml +0 -0
  37. {remo_cli-4.0.0 → remo_cli-4.0.1}/.github/workflows/release-please.yml +0 -0
  38. {remo_cli-4.0.0 → remo_cli-4.0.1}/.github/workflows/release.yml +0 -0
  39. {remo_cli-4.0.0 → remo_cli-4.0.1}/.github/workflows/smoke-test-cleanup.yml +0 -0
  40. {remo_cli-4.0.0 → remo_cli-4.0.1}/.github/workflows/smoke-test.yml +0 -0
  41. {remo_cli-4.0.0 → remo_cli-4.0.1}/.github/workflows/teardown.yml +0 -0
  42. {remo_cli-4.0.0 → remo_cli-4.0.1}/.gitignore +0 -0
  43. {remo_cli-4.0.0 → remo_cli-4.0.1}/.maverick/checkpoints/feature/implementation_complete.json +0 -0
  44. {remo_cli-4.0.0 → remo_cli-4.0.1}/.maverick/checkpoints/feature/phase_${{ index }}_complete.json +0 -0
  45. {remo_cli-4.0.0 → remo_cli-4.0.1}/.maverick/checkpoints/feature/validation_complete.json +0 -0
  46. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/extensions/.registry +0 -0
  47. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/extensions/git/README.md +0 -0
  48. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/extensions/git/commands/speckit.git.commit.md +0 -0
  49. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/extensions/git/commands/speckit.git.feature.md +0 -0
  50. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/extensions/git/commands/speckit.git.initialize.md +0 -0
  51. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/extensions/git/commands/speckit.git.remote.md +0 -0
  52. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/extensions/git/commands/speckit.git.validate.md +0 -0
  53. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/extensions/git/config-template.yml +0 -0
  54. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/extensions/git/extension.yml +0 -0
  55. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/extensions/git/git-config.yml +0 -0
  56. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/extensions/git/scripts/bash/auto-commit.sh +0 -0
  57. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/extensions/git/scripts/bash/create-new-feature.sh +0 -0
  58. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/extensions/git/scripts/bash/git-common.sh +0 -0
  59. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  60. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  61. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/extensions/git/scripts/powershell/create-new-feature.ps1 +0 -0
  62. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  63. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  64. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/extensions.yml +0 -0
  65. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/feature.json +0 -0
  66. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/init-options.json +0 -0
  67. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/integration.json +0 -0
  68. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/integrations/claude.manifest.json +0 -0
  69. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/integrations/speckit.manifest.json +0 -0
  70. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/memory/constitution.md +0 -0
  71. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/scripts/bash/check-prerequisites.sh +0 -0
  72. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/scripts/bash/common.sh +0 -0
  73. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/scripts/bash/create-new-feature.sh +0 -0
  74. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/scripts/bash/setup-plan.sh +0 -0
  75. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/scripts/bash/setup-tasks.sh +0 -0
  76. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/scripts/bash/update-agent-context.sh +0 -0
  77. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/templates/agent-file-template.md +0 -0
  78. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/templates/checklist-template.md +0 -0
  79. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/templates/constitution-template.md +0 -0
  80. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/templates/plan-template.md +0 -0
  81. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/templates/spec-template.md +0 -0
  82. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/templates/tasks-template.md +0 -0
  83. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/workflows/speckit/workflow.yml +0 -0
  84. {remo_cli-4.0.0 → remo_cli-4.0.1}/.specify/workflows/workflow-registry.json +0 -0
  85. {remo_cli-4.0.0 → remo_cli-4.0.1}/AGENTS.md +0 -0
  86. {remo_cli-4.0.0 → remo_cli-4.0.1}/CLAUDE.md +0 -0
  87. {remo_cli-4.0.0 → remo_cli-4.0.1}/CONTRIBUTING.md +0 -0
  88. {remo_cli-4.0.0 → remo_cli-4.0.1}/Dockerfile +0 -0
  89. {remo_cli-4.0.0 → remo_cli-4.0.1}/LICENSE +0 -0
  90. {remo_cli-4.0.0 → remo_cli-4.0.1}/README.md +0 -0
  91. {remo_cli-4.0.0 → remo_cli-4.0.1}/SECURITY.md +0 -0
  92. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/.ansible-lint +0 -0
  93. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/README.md +0 -0
  94. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/ansible.cfg +0 -0
  95. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/aws_configure.yml +0 -0
  96. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/aws_resize.yml +0 -0
  97. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/aws_site.yml +0 -0
  98. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/aws_teardown.yml +0 -0
  99. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/group_vars/all.yml +0 -0
  100. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/group_vars/incus_containers.yml +0 -0
  101. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/group_vars/proxmox_containers.yml +0 -0
  102. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/hetzner_configure.yml +0 -0
  103. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/hetzner_provision.yml +0 -0
  104. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/hetzner_resize.yml +0 -0
  105. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/hetzner_site.yml +0 -0
  106. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/hetzner_teardown.yml +0 -0
  107. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/incus_bootstrap.yml +0 -0
  108. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/incus_configure.yml +0 -0
  109. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/incus_provision.yml +0 -0
  110. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/incus_resize.yml +0 -0
  111. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/incus_site.yml +0 -0
  112. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/incus_teardown.yml +0 -0
  113. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/inventory/hosts.yml +0 -0
  114. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/inventory/incus_containers.yml +0 -0
  115. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/proxmox_bootstrap.yml +0 -0
  116. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/proxmox_configure.yml +0 -0
  117. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/proxmox_provision.yml +0 -0
  118. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/proxmox_resize.yml +0 -0
  119. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/proxmox_site.yml +0 -0
  120. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/proxmox_teardown.yml +0 -0
  121. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/requirements.yml +0 -0
  122. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/aws_server/defaults/main.yml +0 -0
  123. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/aws_server/tasks/ebs.yml +0 -0
  124. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/aws_server/tasks/ec2.yml +0 -0
  125. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/aws_server/tasks/main.yml +0 -0
  126. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/aws_server/tasks/patch_manager.yml +0 -0
  127. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/aws_server/tasks/preflight.yml +0 -0
  128. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/aws_server/tasks/security_group.yml +0 -0
  129. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/deacon/defaults/main.yml +0 -0
  130. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/deacon/tasks/main.yml +0 -0
  131. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/devcontainers/tasks/main.yml +0 -0
  132. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/docker/handlers/main.yml +0 -0
  133. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/docker/tasks/main.yml +0 -0
  134. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/fzf/tasks/main.yml +0 -0
  135. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/github_cli/tasks/main.yml +0 -0
  136. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/hetzner_server/defaults/main.yml +0 -0
  137. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/hetzner_server/tasks/main.yml +0 -0
  138. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/incus_bootstrap/defaults/main.yml +0 -0
  139. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/incus_bootstrap/handlers/main.yml +0 -0
  140. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/incus_bootstrap/tasks/main.yml +0 -0
  141. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/incus_container/defaults/main.yml +0 -0
  142. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/incus_container/handlers/main.yml +0 -0
  143. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/incus_container/meta/main.yml +0 -0
  144. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/incus_container/tasks/main.yml +0 -0
  145. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/incus_container/tasks/preflight.yml +0 -0
  146. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/incus_container_teardown/defaults/main.yml +0 -0
  147. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/incus_container_teardown/meta/main.yml +0 -0
  148. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/incus_container_teardown/tasks/main.yml +0 -0
  149. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/nodejs/defaults/main.yml +0 -0
  150. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/nodejs/files/nodesource-repo.gpg.key +0 -0
  151. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/nodejs/tasks/main.yml +0 -0
  152. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/proxmox_bootstrap/defaults/main.yml +0 -0
  153. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/proxmox_bootstrap/meta/main.yml +0 -0
  154. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/proxmox_bootstrap/tasks/main.yml +0 -0
  155. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/proxmox_container/defaults/main.yml +0 -0
  156. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/proxmox_container/handlers/main.yml +0 -0
  157. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/proxmox_container/meta/main.yml +0 -0
  158. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/proxmox_container/tasks/main.yml +0 -0
  159. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/proxmox_container/tasks/preflight.yml +0 -0
  160. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/proxmox_container_teardown/defaults/main.yml +0 -0
  161. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/proxmox_container_teardown/meta/main.yml +0 -0
  162. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/proxmox_container_teardown/tasks/main.yml +0 -0
  163. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/user_setup/defaults/main.yml +0 -0
  164. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/user_setup/tasks/main.yml +0 -0
  165. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/user_setup/templates/devshell.sh.j2 +0 -0
  166. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/user_setup/templates/project-launch.sh.j2 +0 -0
  167. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/user_setup/templates/project-menu.sh.j2 +0 -0
  168. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/user_setup/templates/remo-host.sh.j2 +0 -0
  169. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/zellij/defaults/main.yml +0 -0
  170. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/zellij/tasks/main.yml +0 -0
  171. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/zellij/templates/config.kdl.j2 +0 -0
  172. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/roles/zellij/templates/layouts/minimal.kdl.j2 +0 -0
  173. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/tasks/configure_dev_tools.yml +0 -0
  174. {remo_cli-4.0.0 → remo_cli-4.0.1}/ansible/tasks/repair_apt_sources.yml +0 -0
  175. {remo_cli-4.0.0 → remo_cli-4.0.1}/docker/Dockerfile +0 -0
  176. {remo_cli-4.0.0 → remo_cli-4.0.1}/docker/compose.example.yml +0 -0
  177. {remo_cli-4.0.0 → remo_cli-4.0.1}/docker/entrypoint.sh +0 -0
  178. {remo_cli-4.0.0 → remo_cli-4.0.1}/docs/aws.md +0 -0
  179. {remo_cli-4.0.0 → remo_cli-4.0.1}/docs/feature-history.md +0 -0
  180. {remo_cli-4.0.0 → remo_cli-4.0.1}/docs/hetzner.md +0 -0
  181. {remo_cli-4.0.0 → remo_cli-4.0.1}/docs/incus.md +0 -0
  182. {remo_cli-4.0.0 → remo_cli-4.0.1}/docs/install.sh +0 -0
  183. {remo_cli-4.0.0 → remo_cli-4.0.1}/docs/maintaining-claude-md.md +0 -0
  184. {remo_cli-4.0.0 → remo_cli-4.0.1}/docs/maintaining-generated-types.md +0 -0
  185. {remo_cli-4.0.0 → remo_cli-4.0.1}/docs/providers.md +0 -0
  186. {remo_cli-4.0.0 → remo_cli-4.0.1}/docs/proxmox.md +0 -0
  187. {remo_cli-4.0.0 → remo_cli-4.0.1}/docs/remo-web-speckit-input.md +0 -0
  188. {remo_cli-4.0.0 → remo_cli-4.0.1}/docs/remo-web.html +0 -0
  189. {remo_cli-4.0.0 → remo_cli-4.0.1}/docs/web-session-interface.md +0 -0
  190. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/index.html +0 -0
  191. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/package-lock.json +0 -0
  192. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/package.json +0 -0
  193. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/scripts/check-types-fresh.mjs +0 -0
  194. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/scripts/generate-frame-types.mjs +0 -0
  195. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/scripts/generate-schema-types.mjs +0 -0
  196. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/api/client.test.ts +0 -0
  197. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/api/client.ts +0 -0
  198. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/api/generated/README.md +0 -0
  199. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/api/generated/openapi.json +0 -0
  200. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/api/generated/schema.d.ts +0 -0
  201. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/api/generated/terminal-frames.d.ts +0 -0
  202. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/api/generated/terminal-frames.json +0 -0
  203. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/api/generated.test.ts +0 -0
  204. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/AppRoot.tsx +0 -0
  205. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/AppShell.css +0 -0
  206. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/AppShell.tsx +0 -0
  207. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/AwaitingAdoption.css +0 -0
  208. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/AwaitingAdoption.tsx +0 -0
  209. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/OfflineOverlay.css +0 -0
  210. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/OfflineOverlay.tsx +0 -0
  211. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/PairToSync.css +0 -0
  212. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/PairToSync.tsx +0 -0
  213. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/SessionRail.css +0 -0
  214. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/SessionRail.tsx +0 -0
  215. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/SettingsPage.css +0 -0
  216. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/SettingsPage.tsx +0 -0
  217. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/ShortcutsModal.css +0 -0
  218. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/ShortcutsModal.tsx +0 -0
  219. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/TopBar.css +0 -0
  220. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/TopBar.tsx +0 -0
  221. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/WorkspacePane.css +0 -0
  222. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/WorkspacePane.tsx +0 -0
  223. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/providerMeta.test.ts +0 -0
  224. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/providerMeta.ts +0 -0
  225. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/railModel.test.ts +0 -0
  226. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/components/railModel.ts +0 -0
  227. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/lib/clipboard.ts +0 -0
  228. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/lib/fullscreen.ts +0 -0
  229. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/main.tsx +0 -0
  230. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/state/discovery.test.ts +0 -0
  231. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/state/discovery.ts +0 -0
  232. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/state/fonts.ts +0 -0
  233. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/state/health.test.ts +0 -0
  234. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/state/health.ts +0 -0
  235. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/state/latency.test.ts +0 -0
  236. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/state/latency.ts +0 -0
  237. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/state/settings.test.ts +0 -0
  238. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/state/settings.ts +0 -0
  239. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/state/useConsoleKeyboard.ts +0 -0
  240. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/state/workspace.test.ts +0 -0
  241. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/state/workspace.ts +0 -0
  242. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/terminal/.gitkeep +0 -0
  243. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/terminal/RendererAdapter.ts +0 -0
  244. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/terminal/TerminalConnection.test.ts +0 -0
  245. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/terminal/TerminalConnection.ts +0 -0
  246. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/terminal/XtermRenderer.ts +0 -0
  247. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/terminal/defaultRenderer.ts +0 -0
  248. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/terminal/keymap.test.ts +0 -0
  249. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/terminal/keymap.ts +0 -0
  250. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/test/setup.ts +0 -0
  251. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/theme/fonts.ts +0 -0
  252. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/src/theme/tokens.css +0 -0
  253. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/tsconfig.json +0 -0
  254. {remo_cli-4.0.0 → remo_cli-4.0.1}/frontend/vite.config.ts +0 -0
  255. {remo_cli-4.0.0 → remo_cli-4.0.1}/install.sh +0 -0
  256. {remo_cli-4.0.0 → remo_cli-4.0.1}/maverick.yaml +0 -0
  257. {remo_cli-4.0.0 → remo_cli-4.0.1}/playwright.config.ts +0 -0
  258. {remo_cli-4.0.0 → remo_cli-4.0.1}/project-menu.sh +0 -0
  259. {remo_cli-4.0.0 → remo_cli-4.0.1}/release-please-config.json +0 -0
  260. {remo_cli-4.0.0 → remo_cli-4.0.1}/remo +0 -0
  261. {remo_cli-4.0.0 → remo_cli-4.0.1}/remo.svg +0 -0
  262. {remo_cli-4.0.0 → remo_cli-4.0.1}/run.sh +0 -0
  263. {remo_cli-4.0.0 → remo_cli-4.0.1}/scripts/export_openapi.py +0 -0
  264. {remo_cli-4.0.0 → remo_cli-4.0.1}/scripts/setup-aws-oidc.sh +0 -0
  265. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/001-bootstrap-incus-host/checklists/requirements.md +0 -0
  266. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/001-bootstrap-incus-host/checklists/validation.md +0 -0
  267. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/001-bootstrap-incus-host/contracts/playbook-interface.yaml +0 -0
  268. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/001-bootstrap-incus-host/contracts/role-interface.yaml +0 -0
  269. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/001-bootstrap-incus-host/data-model.md +0 -0
  270. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/001-bootstrap-incus-host/plan.md +0 -0
  271. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/001-bootstrap-incus-host/quickstart.md +0 -0
  272. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/001-bootstrap-incus-host/research.md +0 -0
  273. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/001-bootstrap-incus-host/spec.md +0 -0
  274. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/001-bootstrap-incus-host/tasks.md +0 -0
  275. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/002-incus-container-support/checklists/requirements.md +0 -0
  276. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/002-incus-container-support/contracts/playbook-interface.yaml +0 -0
  277. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/002-incus-container-support/contracts/role-interface.yaml +0 -0
  278. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/002-incus-container-support/data-model.md +0 -0
  279. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/002-incus-container-support/plan.md +0 -0
  280. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/002-incus-container-support/quickstart.md +0 -0
  281. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/002-incus-container-support/research.md +0 -0
  282. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/002-incus-container-support/spec.md +0 -0
  283. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/002-incus-container-support/tasks.md +0 -0
  284. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/003-python-cli-rewrite/checklists/requirements.md +0 -0
  285. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/003-python-cli-rewrite/data-model.md +0 -0
  286. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/003-python-cli-rewrite/plan.md +0 -0
  287. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/003-python-cli-rewrite/quickstart.md +0 -0
  288. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/003-python-cli-rewrite/research.md +0 -0
  289. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/003-python-cli-rewrite/spec.md +0 -0
  290. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/003-python-cli-rewrite/tasks.md +0 -0
  291. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/004-proxmox-container-support/spec.md +0 -0
  292. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/005-provider-snapshots/checklists/requirements.md +0 -0
  293. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/005-provider-snapshots/contracts/cli-surface.md +0 -0
  294. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/005-provider-snapshots/data-model.md +0 -0
  295. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/005-provider-snapshots/plan.md +0 -0
  296. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/005-provider-snapshots/quickstart.md +0 -0
  297. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/005-provider-snapshots/research.md +0 -0
  298. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/005-provider-snapshots/spec.md +0 -0
  299. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/005-provider-snapshots/tasks.md +0 -0
  300. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/010-web-session-interface/checklists/requirements.md +0 -0
  301. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/010-web-session-interface/contracts/remo-host-protocol.md +0 -0
  302. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/010-web-session-interface/contracts/rest-api.md +0 -0
  303. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/010-web-session-interface/contracts/terminal-websocket.md +0 -0
  304. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/010-web-session-interface/data-model.md +0 -0
  305. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/010-web-session-interface/plan.md +0 -0
  306. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/010-web-session-interface/quickstart.md +0 -0
  307. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/010-web-session-interface/research.md +0 -0
  308. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/010-web-session-interface/spec.md +0 -0
  309. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/010-web-session-interface/tasks.md +0 -0
  310. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/011-web-adopt/checklists/requirements.md +0 -0
  311. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/011-web-adopt/contracts/cli-web-adopt.md +0 -0
  312. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/011-web-adopt/contracts/setup-api.md +0 -0
  313. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/011-web-adopt/data-model.md +0 -0
  314. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/011-web-adopt/plan.md +0 -0
  315. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/011-web-adopt/quickstart-results.md +0 -0
  316. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/011-web-adopt/quickstart.md +0 -0
  317. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/011-web-adopt/research.md +0 -0
  318. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/011-web-adopt/spec.md +0 -0
  319. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/011-web-adopt/tasks.md +0 -0
  320. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/012-web-adopt-pairing/contracts/cli-web-adopt.md +0 -0
  321. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/012-web-adopt-pairing/contracts/pairing-api.md +0 -0
  322. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/012-web-adopt-pairing/contracts/setup-api.md +0 -0
  323. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/012-web-adopt-pairing/data-model.md +0 -0
  324. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/012-web-adopt-pairing/plan.md +0 -0
  325. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/012-web-adopt-pairing/quickstart.md +0 -0
  326. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/012-web-adopt-pairing/research.md +0 -0
  327. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/012-web-adopt-pairing/spec.md +0 -0
  328. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/012-web-adopt-pairing/tasks.md +0 -0
  329. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/013-managed-instance-tags/contracts/cli-sync.md +0 -0
  330. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/013-managed-instance-tags/contracts/marker-commands.md +0 -0
  331. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/013-managed-instance-tags/data-model.md +0 -0
  332. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/013-managed-instance-tags/plan.md +0 -0
  333. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/013-managed-instance-tags/quickstart.md +0 -0
  334. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/013-managed-instance-tags/research.md +0 -0
  335. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/013-managed-instance-tags/spec.md +0 -0
  336. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/013-managed-instance-tags/tasks.md +0 -0
  337. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/014-register-ssh-host/contracts/add-command.md +0 -0
  338. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/014-register-ssh-host/contracts/remove-command.md +0 -0
  339. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/014-register-ssh-host/data-model.md +0 -0
  340. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/014-register-ssh-host/plan.md +0 -0
  341. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/014-register-ssh-host/quickstart.md +0 -0
  342. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/014-register-ssh-host/research.md +0 -0
  343. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/014-register-ssh-host/spec.md +0 -0
  344. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/014-register-ssh-host/tasks.md +0 -0
  345. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/015-registry-v2/checklists/requirements.md +0 -0
  346. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/015-registry-v2/contracts/mirror-payload-v2.md +0 -0
  347. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/015-registry-v2/contracts/registry-accessor-api.md +0 -0
  348. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/015-registry-v2/contracts/registry-file-v2.md +0 -0
  349. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/015-registry-v2/data-model.md +0 -0
  350. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/015-registry-v2/plan.md +0 -0
  351. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/015-registry-v2/quickstart.md +0 -0
  352. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/015-registry-v2/research.md +0 -0
  353. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/015-registry-v2/spec.md +0 -0
  354. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/015-registry-v2/tasks.md +0 -0
  355. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/016-sync-reconcile/checklists/requirements.md +0 -0
  356. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/016-sync-reconcile/contracts/cli-sync.md +0 -0
  357. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/016-sync-reconcile/contracts/provider-probe.md +0 -0
  358. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/016-sync-reconcile/data-model.md +0 -0
  359. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/016-sync-reconcile/plan.md +0 -0
  360. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/016-sync-reconcile/quickstart.md +0 -0
  361. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/016-sync-reconcile/research.md +0 -0
  362. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/016-sync-reconcile/spec.md +0 -0
  363. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/016-sync-reconcile/tasks.md +0 -0
  364. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/017-web-adopt-simplify/checklists/requirements.md +0 -0
  365. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/017-web-adopt-simplify/contracts/cli-web-push.md +0 -0
  366. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/017-web-adopt-simplify/contracts/cli-web-status.md +0 -0
  367. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/017-web-adopt-simplify/contracts/revocation.md +0 -0
  368. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/017-web-adopt-simplify/contracts/setup-status-marker.md +0 -0
  369. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/017-web-adopt-simplify/data-model.md +0 -0
  370. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/017-web-adopt-simplify/plan.md +0 -0
  371. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/017-web-adopt-simplify/quickstart.md +0 -0
  372. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/017-web-adopt-simplify/research.md +0 -0
  373. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/017-web-adopt-simplify/spec.md +0 -0
  374. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/017-web-adopt-simplify/tasks.md +0 -0
  375. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/018-provider-abstraction/baseline-notes.md +0 -0
  376. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/018-provider-abstraction/checklists/requirements.md +0 -0
  377. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/018-provider-abstraction/contracts/cli-surface.md +0 -0
  378. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/018-provider-abstraction/contracts/errors.md +0 -0
  379. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/018-provider-abstraction/contracts/lifecycle-templates.md +0 -0
  380. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/018-provider-abstraction/contracts/provider-protocol.md +0 -0
  381. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/018-provider-abstraction/contracts/sync-merge.md +0 -0
  382. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/018-provider-abstraction/data-model.md +0 -0
  383. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/018-provider-abstraction/plan.md +0 -0
  384. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/018-provider-abstraction/quickstart.md +0 -0
  385. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/018-provider-abstraction/research.md +0 -0
  386. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/018-provider-abstraction/spec.md +0 -0
  387. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/018-provider-abstraction/tasks.md +0 -0
  388. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/019-hygiene-deps-docs/checklists/requirements.md +0 -0
  389. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/019-hygiene-deps-docs/contracts/cli-surface-delta.md +0 -0
  390. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/019-hygiene-deps-docs/contracts/docs-structure-check.md +0 -0
  391. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/019-hygiene-deps-docs/data-model.md +0 -0
  392. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/019-hygiene-deps-docs/plan.md +0 -0
  393. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/019-hygiene-deps-docs/quickstart.md +0 -0
  394. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/019-hygiene-deps-docs/research.md +0 -0
  395. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/019-hygiene-deps-docs/spec.md +0 -0
  396. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/019-hygiene-deps-docs/tasks.md +0 -0
  397. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/020-openapi-type-generation/checklists/requirements.md +0 -0
  398. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/020-openapi-type-generation/contracts/drift-checks.md +0 -0
  399. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/020-openapi-type-generation/contracts/terminal-frames-v1.md +0 -0
  400. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/020-openapi-type-generation/data-model.md +0 -0
  401. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/020-openapi-type-generation/plan.md +0 -0
  402. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/020-openapi-type-generation/quickstart.md +0 -0
  403. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/020-openapi-type-generation/research.md +0 -0
  404. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/020-openapi-type-generation/spec.md +0 -0
  405. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/020-openapi-type-generation/tasks.md +0 -0
  406. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/021-cli-plane-separation/contracts/cli-surface.md +0 -0
  407. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/021-cli-plane-separation/contracts/descriptor-schema.md +0 -0
  408. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/021-cli-plane-separation/data-model.md +0 -0
  409. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/021-cli-plane-separation/plan.md +0 -0
  410. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/021-cli-plane-separation/quickstart.md +0 -0
  411. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/021-cli-plane-separation/research.md +0 -0
  412. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/021-cli-plane-separation/spec.md +0 -0
  413. {remo_cli-4.0.0 → remo_cli-4.0.1}/specs/021-cli-plane-separation/tasks.md +0 -0
  414. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/__init__.py +0 -0
  415. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/__main__.py +0 -0
  416. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/cli/__init__.py +0 -0
  417. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/cli/added.py +0 -0
  418. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/cli/cp.py +0 -0
  419. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/cli/main.py +0 -0
  420. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/cli/providers/__init__.py +0 -0
  421. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/cli/providers/factory.py +0 -0
  422. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/cli/shell.py +0 -0
  423. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/cli/web.py +0 -0
  424. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/__init__.py +0 -0
  425. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/ansible_runner.py +0 -0
  426. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/completion.py +0 -0
  427. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/config.py +0 -0
  428. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/errors.py +0 -0
  429. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/known_hosts.py +0 -0
  430. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/lifecycle.py +0 -0
  431. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/output.py +0 -0
  432. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/picker.py +0 -0
  433. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/provider_protocol.py +0 -0
  434. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/provider_registry.py +0 -0
  435. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/reconcile.py +0 -0
  436. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/registry.py +0 -0
  437. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/remo_host_client.py +0 -0
  438. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/rsync.py +0 -0
  439. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/snapshot.py +0 -0
  440. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/ssh.py +0 -0
  441. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/validation.py +0 -0
  442. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/version.py +0 -0
  443. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/web_adopt.py +0 -0
  444. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/core/web_drift.py +0 -0
  445. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/models/__init__.py +0 -0
  446. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/models/capability.py +0 -0
  447. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/models/discovery.py +0 -0
  448. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/models/host.py +0 -0
  449. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/models/session_target.py +0 -0
  450. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/models/snapshot.py +0 -0
  451. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/providers/__init__.py +0 -0
  452. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/providers/added.py +0 -0
  453. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/providers/aws.py +0 -0
  454. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/providers/aws_descriptor.py +0 -0
  455. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/providers/builtin.py +0 -0
  456. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/providers/hetzner.py +0 -0
  457. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/providers/hetzner_descriptor.py +0 -0
  458. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/providers/incus.py +0 -0
  459. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/providers/incus_descriptor.py +0 -0
  460. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/providers/proxmox.py +0 -0
  461. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/providers/proxmox_descriptor.py +0 -0
  462. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/__init__.py +0 -0
  463. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/api/__init__.py +0 -0
  464. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/api/hosts.py +0 -0
  465. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/api/pairing.py +0 -0
  466. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/api/setup.py +0 -0
  467. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/api/terminals.py +0 -0
  468. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/app.py +0 -0
  469. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/check.py +0 -0
  470. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/config.py +0 -0
  471. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/discovery.py +0 -0
  472. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/frames.py +0 -0
  473. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/health.py +0 -0
  474. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/logging_config.py +0 -0
  475. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/models.py +0 -0
  476. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/operator_auth.py +0 -0
  477. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/pairing.py +0 -0
  478. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/ssh_master.py +0 -0
  479. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/state.py +0 -0
  480. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/terminal.py +0 -0
  481. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/terminal_registry.py +0 -0
  482. {remo_cli-4.0.0 → remo_cli-4.0.1}/src/remo_cli/web/tokens.py +0 -0
  483. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/__init__.py +0 -0
  484. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/ansible/__init__.py +0 -0
  485. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/ansible/test_apt_sources_repair.py +0 -0
  486. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/ansible/test_authorized_keys_bootstrap.py +0 -0
  487. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/ansible/test_remo_host_idempotency.py +0 -0
  488. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/conftest.py +0 -0
  489. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/e2e/fixtures.ts +0 -0
  490. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/e2e/keyboard-routing.spec.ts +0 -0
  491. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/e2e/mobile.spec.ts +0 -0
  492. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/e2e/reconnect.spec.ts +0 -0
  493. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/e2e/terminal-shell-io.spec.ts +0 -0
  494. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/e2e/terminal-tui-compatibility.spec.ts +0 -0
  495. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/e2e/workspace-layout.spec.ts +0 -0
  496. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/image/__init__.py +0 -0
  497. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/image/test_docker_image.py +0 -0
  498. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/integration/__init__.py +0 -0
  499. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/integration/_nine_terminal_fixture.py +0 -0
  500. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/integration/fish_completion.sh +0 -0
  501. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/integration/orbstack-cloud-init.yml +0 -0
  502. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/integration/orbstack.sh +0 -0
  503. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/integration/test_nine_terminals.py +0 -0
  504. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/integration/test_nine_terminals_soak.py +0 -0
  505. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/integration/test_registry_concurrency.py +0 -0
  506. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/integration/test_remo_host_e2e.py +0 -0
  507. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/integration/test_security_rejections.py +0 -0
  508. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/integration/test_setup_payload_versions.py +0 -0
  509. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/integration/test_sync_reconcile.py +0 -0
  510. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/integration/test_terminal_attach.py +0 -0
  511. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/integration/test_web_adopt_e2e.py +0 -0
  512. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/integration/test_web_cli_parity.py +0 -0
  513. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/perf/__init__.py +0 -0
  514. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/perf/test_latency.py +0 -0
  515. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/perf/test_registry_perf.py +0 -0
  516. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/__init__.py +0 -0
  517. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/cli/__init__.py +0 -0
  518. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/cli/providers/test_aws_snapshot.py +0 -0
  519. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/cli/providers/test_hetzner_snapshot.py +0 -0
  520. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/cli/providers/test_incus_snapshot.py +0 -0
  521. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/cli/providers/test_incus_sync_all.py +0 -0
  522. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/cli/providers/test_proxmox_snapshot.py +0 -0
  523. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/cli/providers/test_proxmox_sync_all.py +0 -0
  524. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/cli/surface_baseline.py +0 -0
  525. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/cli/test_add_cmd.py +0 -0
  526. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/cli/test_cli_uniformity.py +0 -0
  527. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/cli/test_cp.py +0 -0
  528. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/cli/test_main.py +0 -0
  529. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/cli/test_remove_cmd.py +0 -0
  530. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/cli/test_shell.py +0 -0
  531. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/cli/test_shell_added.py +0 -0
  532. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/cli/test_startup_imports.py +0 -0
  533. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/cli/test_surface_preservation.py +0 -0
  534. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/cli/test_web_adopt_cmd.py +0 -0
  535. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/__init__.py +0 -0
  536. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_ansible_runner.py +0 -0
  537. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_completion.py +0 -0
  538. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_config.py +0 -0
  539. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_errors.py +0 -0
  540. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_known_hosts.py +0 -0
  541. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_lifecycle.py +0 -0
  542. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_migration_tagging_notice.py +0 -0
  543. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_output.py +0 -0
  544. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_picker.py +0 -0
  545. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_provider_registry.py +0 -0
  546. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_reconcile.py +0 -0
  547. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_registry_format.py +0 -0
  548. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_registry_locking.py +0 -0
  549. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_registry_migration.py +0 -0
  550. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_remo_host_client.py +0 -0
  551. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_rsync.py +0 -0
  552. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_snapshot.py +0 -0
  553. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_ssh.py +0 -0
  554. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_ssh_added.py +0 -0
  555. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_ssh_controlpath.py +0 -0
  556. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_ssh_identity_opts.py +0 -0
  557. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_validation.py +0 -0
  558. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_version.py +0 -0
  559. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_web_adopt_authorize.py +0 -0
  560. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_web_adopt_code.py +0 -0
  561. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_web_adopt_payload.py +0 -0
  562. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_web_adopt_trust.py +0 -0
  563. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_web_drift.py +0 -0
  564. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_web_push.py +0 -0
  565. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/core/test_web_push_self_heal.py +0 -0
  566. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/models/__init__.py +0 -0
  567. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/models/test_capability.py +0 -0
  568. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/models/test_discovery.py +0 -0
  569. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/models/test_session_target.py +0 -0
  570. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/__init__.py +0 -0
  571. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/fake_provider.py +0 -0
  572. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_added_add.py +0 -0
  573. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_added_provider_guard.py +0 -0
  574. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_added_update_remove.py +0 -0
  575. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_added_verify.py +0 -0
  576. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_aws_provider_protocol.py +0 -0
  577. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_aws_snapshot.py +0 -0
  578. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_aws_sync.py +0 -0
  579. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_aws_upgrade_resize.py +0 -0
  580. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_hetzner_entry_adapters.py +0 -0
  581. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_hetzner_http.py +0 -0
  582. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_hetzner_label.py +0 -0
  583. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_hetzner_resize.py +0 -0
  584. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_hetzner_snapshot.py +0 -0
  585. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_hetzner_sync.py +0 -0
  586. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_host_user_consistency.py +0 -0
  587. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_incus_entry_adapters.py +0 -0
  588. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_incus_marker.py +0 -0
  589. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_incus_resize.py +0 -0
  590. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_incus_snapshot.py +0 -0
  591. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_incus_sync.py +0 -0
  592. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_missing_sdk.py +0 -0
  593. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_provider_conformance.py +0 -0
  594. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_provider_registry_entries.py +0 -0
  595. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_proxmox_devcontainer_runtime.py +0 -0
  596. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_proxmox_marker.py +0 -0
  597. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_proxmox_provider_protocol.py +0 -0
  598. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_proxmox_resize.py +0 -0
  599. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_proxmox_snapshot.py +0 -0
  600. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/providers/test_proxmox_sync.py +0 -0
  601. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/test_ansible_templates.py +0 -0
  602. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/test_architecture.py +0 -0
  603. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/test_docs_structure.py +0 -0
  604. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/test_host_model.py +0 -0
  605. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/test_host_ssh_type.py +0 -0
  606. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/test_lockfile_version.py +0 -0
  607. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/test_schema_drift.py +0 -0
  608. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/__init__.py +0 -0
  609. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/_pairing_support.py +0 -0
  610. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/conftest.py +0 -0
  611. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/fixtures/hosts_response.json +0 -0
  612. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/fixtures/sessions_response.json +0 -0
  613. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_backpressure.py +0 -0
  614. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_check.py +0 -0
  615. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_csp.py +0 -0
  616. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_discovery.py +0 -0
  617. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_discovery_refresh_force.py +0 -0
  618. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_frames.py +0 -0
  619. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_health_states.py +0 -0
  620. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_hosts_mapping.py +0 -0
  621. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_lazy_import.py +0 -0
  622. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_log_redaction.py +0 -0
  623. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_mint_gating.py +0 -0
  624. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_operator_auth.py +0 -0
  625. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_pairing.py +0 -0
  626. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_pairing_origin.py +0 -0
  627. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_payload_equivalence.py +0 -0
  628. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_registry_readonly.py +0 -0
  629. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_setup_api.py +0 -0
  630. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_setup_auth.py +0 -0
  631. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_setup_dormancy.py +0 -0
  632. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_state.py +0 -0
  633. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_terminal_resize.py +0 -0
  634. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_terminals_api.py +0 -0
  635. {remo_cli-4.0.0 → remo_cli-4.0.1}/tests/unit/web/test_tokens.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "4.0.1"
3
+ }
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## [4.0.1](https://github.com/get2knowio/remo/compare/v4.0.0...v4.0.1) (2026-08-03)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **web:** let the terminal-theme menu scroll instead of being clipped ([#134](https://github.com/get2knowio/remo/issues/134)) ([ffb34e7](https://github.com/get2knowio/remo/commit/ffb34e72cc9d1744130130934538d38af217ec73))
9
+ * **web:** make Remo Light's white family visible — `white` and `brightWhite` were 1.27:1 and 1.09:1 against the background, hiding dim and bold text ([#134](https://github.com/get2knowio/remo/issues/134)) ([c5bc07a](https://github.com/get2knowio/remo/commit/c5bc07a7))
10
+
3
11
  ## [4.0.0](https://github.com/get2knowio/remo/compare/v3.1.0...v4.0.0) (2026-08-03)
4
12
 
5
13
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: remo-cli
3
- Version: 4.0.0
3
+ Version: 4.0.1
4
4
  Summary: Remote development environment CLI
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -228,16 +228,23 @@
228
228
  border-color: var(--accent-strong);
229
229
  }
230
230
 
231
+ /* Positioned against the viewport from JS (themeMenuPosition) — `position`,
232
+ * `top`/`bottom`, `left` and `max-height` all arrive as inline styles. It has
233
+ * to escape `.terminal-card`'s `overflow: hidden`, which used to clip the list
234
+ * inside a short grid tile with no way to scroll to the rest. */
231
235
  .tc-theme-menu {
232
- position: absolute;
233
- top: calc(100% + 6px);
234
- right: 0;
235
- z-index: 20;
236
+ position: fixed;
237
+ z-index: 60;
236
238
  min-width: 216px;
239
+ max-width: calc(100vw - 16px);
237
240
  padding: 5px;
238
241
  display: flex;
239
242
  flex-direction: column;
240
243
  gap: 2px;
244
+ overflow-y: auto;
245
+ /* Stop at the menu's own edges instead of scrolling the page behind it —
246
+ * the whole reported symptom was a swipe here moving the whole console. */
247
+ overscroll-behavior: contain;
241
248
  background: var(--bg-elev);
242
249
  border: 1px solid var(--border-strong);
243
250
  border-radius: 10px;
@@ -7,6 +7,7 @@ import { act, render, screen } from "@testing-library/react";
7
7
  import { DndContext } from "@dnd-kit/core";
8
8
  import { beforeEach, describe, expect, it, vi } from "vitest";
9
9
  import type { SessionTarget } from "../api/client";
10
+ import { themeMenuPosition } from "./TerminalCard";
10
11
  import type { RendererAdapter } from "../terminal/RendererAdapter";
11
12
 
12
13
  const adapters: RendererAdapter[] = [];
@@ -196,3 +197,59 @@ describe("TerminalCard terminal theme", () => {
196
197
  expect(screen.queryByRole("menu")).not.toBeInTheDocument();
197
198
  });
198
199
  });
200
+
201
+ // The reported bug: in a 2x2 grid on a small display the theme list was cut off
202
+ // at the card's edge (`.terminal-card` sets `overflow: hidden`) and swiping it
203
+ // scrolled the whole page instead. The menu is now placed against the viewport
204
+ // with a computed max-height, which is what gives it something to scroll.
205
+ describe("themeMenuPosition", () => {
206
+ const VIEWPORT = { width: 1024, height: 768 };
207
+
208
+ it("opens below the swatch when there is room, right-aligned to it", () => {
209
+ const pos = themeMenuPosition({ top: 100, bottom: 126, right: 500 }, VIEWPORT);
210
+ expect(pos.placement).toBe("below");
211
+ expect(pos.style).toMatchObject({ position: "fixed", top: 132, left: 500 - 216 });
212
+ });
213
+
214
+ it("caps the height to the space available, so the list scrolls instead of overflowing", () => {
215
+ // Room below is 768 - 560 - 6 - 8 = 194: enough to stay below, but well
216
+ // short of the ~300px the nine-entry list wants. That gap is the scroll.
217
+ const pos = themeMenuPosition({ top: 534, bottom: 560, right: 500 }, VIEWPORT);
218
+ expect(pos.placement).toBe("below");
219
+ expect(pos.style.maxHeight).toBe(194);
220
+ });
221
+
222
+ it("floors the height so a cramped anchor still shows a usable list", () => {
223
+ // Below is only 154 here, and above (560) is roomier — so it flips, rather
224
+ // than rendering a sliver.
225
+ const pos = themeMenuPosition({ top: 574, bottom: 600, right: 500 }, VIEWPORT);
226
+ expect(pos.placement).toBe("above");
227
+ expect(pos.style.maxHeight).toBe(560);
228
+ });
229
+
230
+ it("flips above the swatch when below is too cramped and above is roomier", () => {
231
+ const pos = themeMenuPosition({ top: 700, bottom: 726, right: 500 }, VIEWPORT);
232
+ expect(pos.placement).toBe("above");
233
+ // Anchored by its bottom edge, so it grows upward without needing its height.
234
+ expect(pos.style.bottom).toBe(768 - 700 + 6);
235
+ expect(pos.style.top).toBeUndefined();
236
+ });
237
+
238
+ it("never places the menu off the right edge", () => {
239
+ const pos = themeMenuPosition({ top: 40, bottom: 66, right: 1020 }, VIEWPORT);
240
+ expect(pos.style.left).toBe(1024 - 216 - 8);
241
+ });
242
+
243
+ it("never places the menu off the left edge on a narrow screen", () => {
244
+ const pos = themeMenuPosition({ top: 40, bottom: 66, right: 120 }, { width: 380, height: 800 });
245
+ expect(pos.style.left).toBe(8);
246
+ });
247
+
248
+ // A card mid-teardown (or jsdom, which reports zeroes) must not produce a
249
+ // negative max-height and an unusable sliver of a menu.
250
+ it("stays usable for a degenerate anchor", () => {
251
+ const pos = themeMenuPosition({ top: 0, bottom: 0, right: 0 }, { width: 0, height: 0 });
252
+ expect(pos.style.maxHeight as number).toBeGreaterThan(0);
253
+ expect(pos.style.left as number).toBeGreaterThanOrEqual(0);
254
+ });
255
+ });
@@ -9,7 +9,14 @@
9
9
  // single↔grid only re-renders the header chrome and never remounts the
10
10
  // terminal surface (which would tear down the live connection).
11
11
 
12
- import { useCallback, useEffect, useRef, useState, type CSSProperties } from "react";
12
+ import {
13
+ useCallback,
14
+ useEffect,
15
+ useLayoutEffect,
16
+ useRef,
17
+ useState,
18
+ type CSSProperties,
19
+ } from "react";
13
20
  import { useDraggable, useDroppable } from "@dnd-kit/core";
14
21
  import type { SessionTarget, TypedError } from "../api/client";
15
22
  import { providerMeta } from "./providerMeta";
@@ -84,6 +91,71 @@ interface TerminalCardProps {
84
91
  onStarted?: () => void;
85
92
  }
86
93
 
94
+ /** Where the terminal-theme popup goes, as viewport-relative inline styles. */
95
+ export interface ThemeMenuPosition {
96
+ style: CSSProperties;
97
+ /** Which side of the swatch the menu opened on (asserted in tests). */
98
+ placement: "below" | "above";
99
+ }
100
+
101
+ /** Gap between the swatch and the menu, and the minimum breathing room kept
102
+ * against the viewport edges. */
103
+ const THEME_MENU_GAP = 6;
104
+ const THEME_MENU_MARGIN = 8;
105
+ /** Matches the menu's min-width in TerminalCard.css. */
106
+ const THEME_MENU_WIDTH = 216;
107
+ /** Below this, "below the swatch" is too cramped to be worth using. */
108
+ const THEME_MENU_MIN_USABLE = 160;
109
+
110
+ /**
111
+ * Place the theme popup against the VIEWPORT rather than the card.
112
+ *
113
+ * A grid tile on a small screen (a 2x2 layout on an iPad, say) is routinely
114
+ * shorter than the nine-entry theme list, and `.terminal-card` sets
115
+ * `overflow: hidden` — so an absolutely-positioned menu was silently clipped at
116
+ * the card's edge with no way to reach the rest. Fixed positioning escapes that
117
+ * clip, and the computed `maxHeight` is what gives the menu something to scroll
118
+ * (paired with `overscroll-behavior: contain` in CSS, so the scroll stops at the
119
+ * menu instead of running the page).
120
+ *
121
+ * Opens downward by default, flipping above the swatch when there is more room
122
+ * there, and clamps horizontally so the menu can never sit off-screen.
123
+ */
124
+ export function themeMenuPosition(
125
+ anchor: { top: number; bottom: number; right: number },
126
+ viewport: { width: number; height: number } = {
127
+ width: window.innerWidth,
128
+ height: window.innerHeight,
129
+ },
130
+ ): ThemeMenuPosition {
131
+ const roomBelow = viewport.height - anchor.bottom - THEME_MENU_GAP - THEME_MENU_MARGIN;
132
+ const roomAbove = anchor.top - THEME_MENU_GAP - THEME_MENU_MARGIN;
133
+ const placement: "below" | "above" =
134
+ roomBelow < THEME_MENU_MIN_USABLE && roomAbove > roomBelow ? "above" : "below";
135
+
136
+ // Right-align to the swatch, then clamp both edges into the viewport.
137
+ const left = Math.max(
138
+ THEME_MENU_MARGIN,
139
+ Math.min(anchor.right - THEME_MENU_WIDTH, viewport.width - THEME_MENU_WIDTH - THEME_MENU_MARGIN),
140
+ );
141
+ // Never negative: a zero-height anchor (jsdom, or a card mid-teardown) would
142
+ // otherwise ask for a negative max-height and render an unusable sliver.
143
+ const maxHeight = Math.max(THEME_MENU_MIN_USABLE, placement === "above" ? roomAbove : roomBelow);
144
+
145
+ return {
146
+ placement,
147
+ style:
148
+ placement === "above"
149
+ ? {
150
+ position: "fixed",
151
+ bottom: viewport.height - anchor.top + THEME_MENU_GAP,
152
+ left,
153
+ maxHeight,
154
+ }
155
+ : { position: "fixed", top: anchor.bottom + THEME_MENU_GAP, left, maxHeight },
156
+ };
157
+ }
158
+
87
159
  function effectiveFont(settings: SettingsState, mode: TerminalCardMode): TerminalFontOptions {
88
160
  const base = terminalFontOptions(settings);
89
161
  if (mode === "grid" && settings.gridFit) {
@@ -142,6 +214,9 @@ export function TerminalCard({
142
214
  const [copied, setCopied] = useState(false);
143
215
  const [themeMenuOpen, setThemeMenuOpen] = useState(false);
144
216
  const themeMenuRef = useRef<HTMLDivElement | null>(null);
217
+ const themeButtonRef = useRef<HTMLButtonElement | null>(null);
218
+ // Viewport-relative placement for the theme popup; null until measured.
219
+ const [themeMenuPos, setThemeMenuPos] = useState<ThemeMenuPosition | null>(null);
145
220
 
146
221
  // dnd-kit reorder: the tile is both a draggable (handle = header grip, below)
147
222
  // and a droppable (swap target). Disabled outside a reorderable grid. We use
@@ -336,6 +411,39 @@ export function TerminalCard({
336
411
  }
337
412
  }, [isFocused, isVisible]);
338
413
 
414
+ // Measure the popup's placement before paint, and keep it anchored while it
415
+ // is open. A grid tile can be far smaller than the list, so the menu is
416
+ // positioned against the VIEWPORT (see ThemeMenuPosition) rather than the
417
+ // card, which clips its overflow.
418
+ useLayoutEffect(() => {
419
+ if (!themeMenuOpen) {
420
+ setThemeMenuPos(null);
421
+ return undefined;
422
+ }
423
+ const measure = (): void => {
424
+ const button = themeButtonRef.current;
425
+ if (button) {
426
+ setThemeMenuPos(themeMenuPosition(button.getBoundingClientRect()));
427
+ }
428
+ };
429
+ measure();
430
+ // A rotate/resize moves the anchor; so does scrolling the pane under it.
431
+ // Scrolling INSIDE the menu must not re-anchor (it would fight the user),
432
+ // and element scrolls only reach window listeners in the capture phase.
433
+ const onScroll = (e: Event): void => {
434
+ if (themeMenuRef.current?.contains(e.target as Node)) {
435
+ return;
436
+ }
437
+ measure();
438
+ };
439
+ window.addEventListener("resize", measure);
440
+ window.addEventListener("scroll", onScroll, true);
441
+ return () => {
442
+ window.removeEventListener("resize", measure);
443
+ window.removeEventListener("scroll", onScroll, true);
444
+ };
445
+ }, [themeMenuOpen]);
446
+
339
447
  // Dismiss the theme popup on Escape or a click anywhere outside it.
340
448
  useEffect(() => {
341
449
  if (!themeMenuOpen) {
@@ -501,6 +609,7 @@ export function TerminalCard({
501
609
  <div className="tc-theme" ref={themeMenuRef}>
502
610
  <button
503
611
  type="button"
612
+ ref={themeButtonRef}
504
613
  className="tc-btn tc-btn--swatch"
505
614
  data-testid={`terminal-theme-${target.id}`}
506
615
  title={`Terminal theme: ${theme.label}${hasThemeOverride ? "" : " (default)"}`}
@@ -515,8 +624,8 @@ export function TerminalCard({
515
624
  >
516
625
  A
517
626
  </button>
518
- {themeMenuOpen && (
519
- <div className="tc-theme-menu" role="menu">
627
+ {themeMenuOpen && themeMenuPos && (
628
+ <div className="tc-theme-menu" role="menu" style={themeMenuPos.style}>
520
629
  <button
521
630
  type="button"
522
631
  className={`tc-theme-item${hasThemeOverride ? "" : " tc-theme-item--on"}`}
@@ -14,6 +14,19 @@ import {
14
14
 
15
15
  const HEX = /^#[0-9a-fA-F]{6}$/;
16
16
 
17
+ /** WCAG relative luminance, then the standard contrast ratio. */
18
+ function luminance(hex: string): number {
19
+ const channels = [1, 3, 5]
20
+ .map((i) => parseInt(hex.slice(i, i + 2), 16) / 255)
21
+ .map((c) => (c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4)));
22
+ return 0.2126 * channels[0] + 0.7152 * channels[1] + 0.0722 * channels[2];
23
+ }
24
+
25
+ function contrast(a: string, b: string): number {
26
+ const [hi, lo] = [luminance(a), luminance(b)].sort((x, y) => y - x);
27
+ return (hi + 0.05) / (lo + 0.05);
28
+ }
29
+
17
30
  // The 22 ITheme fields every palette must set. Listed literally rather than
18
31
  // derived from a sample theme, so a field dropped from every palette at once
19
32
  // still fails here.
@@ -63,6 +76,44 @@ describe("terminal themes", () => {
63
76
  expect(autoTerminalTheme(false).variant).toBe("light");
64
77
  });
65
78
 
79
+ // Every colour the Remo pair can PRINT must be legible on its own
80
+ // background. This is the regression guard for a real report: Remo Light
81
+ // shipped `white` at #d5d8db and `brightWhite` at #fbfcfd — 1.27:1 and
82
+ // 1.09:1 — so Claude Code's "Cooked for 9s" and "(shift+tab to cycle)" hints
83
+ // were invisible, and bold made it worse, since xterm draws bold with the
84
+ // BRIGHT colour.
85
+ //
86
+ // Scoped to the two themes we author: the third-party ports are faithful
87
+ // copies and several of them would fail this (Gruvbox Light sets colour 0 to
88
+ // its own background), which is theirs to define, not ours to "fix".
89
+ //
90
+ // `black` is exempt: sitting near the background is what colour 0 is FOR in a
91
+ // dark theme, and apps use it as a background fill far more than as text.
92
+ describe.each([
93
+ ["remo-dark", "#040608"],
94
+ ["remo-light", "#eff2f6"],
95
+ ])("%s stays legible on its own background", (id, bg) => {
96
+ const theme = TERMINAL_THEMES.find((t) => t.id === id)!;
97
+ const printable = Object.entries(theme.colors).filter(
98
+ ([slot]) =>
99
+ !["background", "cursorAccent", "selectionBackground", "selectionForeground", "black"].includes(
100
+ slot,
101
+ ),
102
+ );
103
+
104
+ it.each(printable)("%s (%s) clears 3:1", (slot, hex) => {
105
+ expect(contrast(hex, bg), `${id}.${slot} ${hex} on ${bg}`).toBeGreaterThanOrEqual(3);
106
+ });
107
+
108
+ it("keeps bold white stronger than normal white, not weaker", () => {
109
+ // Bold is drawn with brightWhite; if it were the paler of the two, bold
110
+ // text would recede exactly where it should stand out.
111
+ expect(contrast(theme.colors.brightWhite, bg)).toBeGreaterThan(
112
+ contrast(theme.colors.white, bg),
113
+ );
114
+ });
115
+ });
116
+
66
117
  // The palette is a hand-derived snapshot of theme/tokens.css (it cannot
67
118
  // reference the tokens live), so pin the anchors that make it "matching":
68
119
  // the terminal background IS --bg-term, and the foreground IS --text.
@@ -127,6 +127,15 @@ export const TERMINAL_THEMES: TerminalTheme[] = [
127
127
  variant: "light",
128
128
  // On a light background the "bright" half goes DARKER, not lighter — the
129
129
  // same inversion Solarized Light uses, so bold text stays legible.
130
+ //
131
+ // That inversion has to include the WHITE pair, which is the trap Solarized
132
+ // Light and Catppuccin Latte both fall into: a literal white `white` sits at
133
+ // ~1.1:1 on a light background and simply is not there. Terminal apps print
134
+ // colour 7/15 as TEXT constantly (Claude Code's "Cooked for 9s" and
135
+ // "(shift+tab to cycle)" hints among them), so here they are the two darkest
136
+ // neutrals — 6.3:1 and 13:1 — with brightWhite the stronger of the pair, so
137
+ // bold still reads as emphasis. Reported from a live session; the contrast
138
+ // floor is asserted in terminalThemes.test.ts.
130
139
  colors: {
131
140
  background: "#eff2f6",
132
141
  foreground: "#242930",
@@ -141,7 +150,7 @@ export const TERMINAL_THEMES: TerminalTheme[] = [
141
150
  blue: "#007bb2",
142
151
  magenta: "#ad36a7",
143
152
  cyan: "#008389",
144
- white: "#d5d8db",
153
+ white: "#535960",
145
154
  brightBlack: "#6c727a",
146
155
  brightRed: "#a9000c",
147
156
  brightGreen: "#007026",
@@ -149,7 +158,7 @@ export const TERMINAL_THEMES: TerminalTheme[] = [
149
158
  brightBlue: "#0064a1",
150
159
  brightMagenta: "#950891",
151
160
  brightCyan: "#006b71",
152
- brightWhite: "#fbfcfd",
161
+ brightWhite: "#242930",
153
162
  },
154
163
  },
155
164
  // --- Curated third-party schemes -----------------------------------------
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "remo-cli"
7
- version = "4.0.0"
7
+ version = "4.0.1"
8
8
  description = "Remote development environment CLI"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -1038,7 +1038,7 @@ wheels = [
1038
1038
 
1039
1039
  [[package]]
1040
1040
  name = "remo-cli"
1041
- version = "4.0.0"
1041
+ version = "4.0.1"
1042
1042
  source = { editable = "." }
1043
1043
  dependencies = [
1044
1044
  { name = "ansible-core" },
@@ -1,3 +0,0 @@
1
- {
2
- ".": "4.0.0"
3
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes