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.
- remo_cli-4.3.6/.release-please-manifest.json +3 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/AGENTS.md +1 -1
- {remo_cli-4.3.4 → remo_cli-4.3.6}/CHANGELOG.md +14 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/CLAUDE.md +1 -1
- {remo_cli-4.3.4 → remo_cli-4.3.6}/PKG-INFO +8 -1
- {remo_cli-4.3.4 → remo_cli-4.3.6}/README.md +7 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/web-session-interface.md +9 -1
- remo_cli-4.3.6/frontend/src/terminal/XtermRenderer.test.ts +45 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/terminal/XtermRenderer.ts +18 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/pyproject.toml +1 -1
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/cli/shell.py +67 -23
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_shell.py +43 -14
- remo_cli-4.3.6/tests/unit/cli/test_shell_added.py +149 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/uv.lock +1 -1
- remo_cli-4.3.4/.release-please-manifest.json +0 -3
- remo_cli-4.3.4/tests/unit/cli/test_shell_added.py +0 -76
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/release/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-analyze/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-checklist/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-clarify/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-constitution/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-converge/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-git-commit/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-git-feature/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-git-initialize/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-git-remote/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-git-validate/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-implement/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-plan/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-specify/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-tasks/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.claude/skills/speckit-taskstoissues/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.devcontainer/devcontainer.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.dockerignore +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/CODEOWNERS +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/codeql/codeql-config.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/dependabot.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/ci.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/codeql.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/dependency-review.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/dev-build.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/provision.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/release-please.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/release.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/smoke-test-cleanup.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/smoke-test.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.github/workflows/teardown.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.gitignore +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.maverick/checkpoints/feature/implementation_complete.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.maverick/checkpoints/feature/phase_${{ index }}_complete.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.maverick/checkpoints/feature/validation_complete.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/.registry +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/README.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/commands/speckit.git.commit.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/commands/speckit.git.feature.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/commands/speckit.git.initialize.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/commands/speckit.git.remote.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/commands/speckit.git.validate.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/config-template.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/extension.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/git-config.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/scripts/bash/auto-commit.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/scripts/bash/create-new-feature.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/scripts/bash/git-common.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/scripts/bash/initialize-repo.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/scripts/powershell/create-new-feature.ps1 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/scripts/powershell/git-common.ps1 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/extensions.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/feature.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/init-options.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/integration.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/integrations/claude.manifest.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/integrations/speckit.manifest.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/memory/constitution.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/scripts/bash/check-prerequisites.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/scripts/bash/common.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/scripts/bash/create-new-feature.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/scripts/bash/setup-plan.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/scripts/bash/setup-tasks.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/scripts/bash/update-agent-context.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/templates/agent-file-template.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/templates/checklist-template.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/templates/constitution-template.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/templates/plan-template.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/templates/spec-template.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/templates/tasks-template.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/workflows/speckit/workflow.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/.specify/workflows/workflow-registry.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/CONTRIBUTING.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/Dockerfile +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/LICENSE +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/SECURITY.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/.ansible-lint +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/README.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/ansible.cfg +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/aws_configure.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/aws_resize.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/aws_site.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/aws_teardown.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/group_vars/all.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/group_vars/incus_containers.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/group_vars/proxmox_containers.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/hetzner_configure.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/hetzner_provision.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/hetzner_resize.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/hetzner_site.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/hetzner_teardown.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/incus_bootstrap.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/incus_configure.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/incus_provision.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/incus_resize.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/incus_site.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/incus_teardown.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/inventory/hosts.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/inventory/incus_containers.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/proxmox_bootstrap.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/proxmox_configure.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/proxmox_provision.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/proxmox_resize.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/proxmox_site.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/proxmox_teardown.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/requirements.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/aws_server/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/aws_server/tasks/ebs.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/aws_server/tasks/ec2.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/aws_server/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/aws_server/tasks/patch_manager.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/aws_server/tasks/preflight.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/aws_server/tasks/security_group.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/deacon/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/deacon/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/devcontainers/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/docker/handlers/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/docker/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/fzf/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/github_cli/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/hetzner_server/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/hetzner_server/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_bootstrap/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_bootstrap/handlers/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_bootstrap/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_container/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_container/handlers/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_container/meta/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_container/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_container/tasks/preflight.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_container_teardown/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_container_teardown/meta/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/incus_container_teardown/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/nested_docker/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/nested_docker/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/nested_docker/templates/devcontainer-shim.sh.j2 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/nodejs/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/nodejs/files/nodesource-repo.gpg.key +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/nodejs/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_bootstrap/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_bootstrap/meta/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_bootstrap/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_container/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_container/handlers/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_container/meta/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_container/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_container/tasks/preflight.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_container_teardown/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_container_teardown/meta/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/proxmox_container_teardown/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/user_setup/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/user_setup/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/user_setup/templates/devshell.sh.j2 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/user_setup/templates/project-launch.sh.j2 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/user_setup/templates/project-menu.sh.j2 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/user_setup/templates/remo-host.sh.j2 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/zellij/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/zellij/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/zellij/templates/config.kdl.j2 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/roles/zellij/templates/layouts/minimal.kdl.j2 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/ssh_configure.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/tasks/configure_dev_tools.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/ansible/tasks/repair_apt_sources.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/docker/Dockerfile +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/docker/compose.example.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/docker/entrypoint.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/aws.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/examples/orbstack-cloud-init-tailscale.yaml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/examples/orbstack-cloud-init.yaml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/feature-history.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/hetzner.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/incus.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/maintaining-claude-md.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/maintaining-generated-types.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/nested-overlayfs.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/providers.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/proxmox.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/remo-web-speckit-input.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/docs/remo-web.html +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/index.html +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/package-lock.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/package.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/playwright.config.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/playwright.geometry.config.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/scripts/check-types-fresh.mjs +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/scripts/generate-frame-types.mjs +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/scripts/generate-schema-types.mjs +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/api/client.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/api/client.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/api/generated/README.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/api/generated/openapi.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/api/generated/schema.d.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/api/generated/terminal-frames.d.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/api/generated/terminal-frames.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/api/generated.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/AppRoot.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/AppShell.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/AppShell.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/AwaitingAdoption.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/AwaitingAdoption.test.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/AwaitingAdoption.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/OfflineOverlay.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/OfflineOverlay.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/PairToSync.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/PairToSync.test.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/PairToSync.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/SessionRail.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/SessionRail.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/SettingsPage.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/SettingsPage.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/ShortcutsModal.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/ShortcutsModal.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/TerminalCard.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/TerminalCard.test.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/TerminalCard.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/TopBar.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/TopBar.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/WorkspacePane.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/WorkspacePane.test.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/WorkspacePane.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/masterLayout.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/masterLayout.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/providerMeta.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/providerMeta.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/railModel.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/components/railModel.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/lib/clipboard.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/lib/fullscreen.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/main.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/discovery.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/discovery.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/fonts.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/health.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/health.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/latency.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/latency.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/settings.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/settings.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/useConsoleKeyboard.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/workspace.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/state/workspace.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/terminal/.gitkeep +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/terminal/RendererAdapter.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/terminal/TerminalConnection.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/terminal/TerminalConnection.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/terminal/defaultRenderer.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/terminal/fitLoop.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/terminal/keymap.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/terminal/keymap.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/test/setup.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/theme/fonts.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/theme/terminalThemes.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/theme/terminalThemes.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/src/theme/tokens.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/e2e/fixtures.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/e2e/keyboard-routing.spec.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/e2e/mobile.spec.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/e2e/reconnect.spec.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/e2e/terminal-shell-io.spec.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/e2e/terminal-tui-compatibility.spec.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/e2e/workspace-layout.spec.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/geometry/global.d.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/geometry/harness/index.html +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/geometry/harness/main.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tests/geometry/terminal-fit.spec.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/tsconfig.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/frontend/vite.config.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/install.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/maverick.yaml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/project-menu.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/release-please-config.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/remo +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/remo.svg +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/run.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/scripts/export_openapi.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/scripts/palette-check.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/scripts/setup-aws-oidc.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/checklists/validation.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/contracts/playbook-interface.yaml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/contracts/role-interface.yaml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/001-bootstrap-incus-host/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/002-incus-container-support/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/002-incus-container-support/contracts/playbook-interface.yaml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/002-incus-container-support/contracts/role-interface.yaml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/002-incus-container-support/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/002-incus-container-support/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/002-incus-container-support/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/002-incus-container-support/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/002-incus-container-support/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/002-incus-container-support/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/003-python-cli-rewrite/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/003-python-cli-rewrite/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/003-python-cli-rewrite/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/003-python-cli-rewrite/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/003-python-cli-rewrite/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/003-python-cli-rewrite/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/003-python-cli-rewrite/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/004-proxmox-container-support/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/005-provider-snapshots/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/005-provider-snapshots/contracts/cli-surface.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/005-provider-snapshots/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/005-provider-snapshots/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/005-provider-snapshots/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/005-provider-snapshots/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/005-provider-snapshots/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/005-provider-snapshots/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/contracts/remo-host-protocol.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/contracts/rest-api.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/contracts/terminal-websocket.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/010-web-session-interface/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/contracts/cli-web-adopt.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/contracts/setup-api.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/quickstart-results.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/011-web-adopt/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/012-web-adopt-pairing/contracts/cli-web-adopt.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/012-web-adopt-pairing/contracts/pairing-api.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/012-web-adopt-pairing/contracts/setup-api.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/012-web-adopt-pairing/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/012-web-adopt-pairing/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/012-web-adopt-pairing/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/012-web-adopt-pairing/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/012-web-adopt-pairing/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/012-web-adopt-pairing/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/013-managed-instance-tags/contracts/cli-sync.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/013-managed-instance-tags/contracts/marker-commands.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/013-managed-instance-tags/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/013-managed-instance-tags/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/013-managed-instance-tags/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/013-managed-instance-tags/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/013-managed-instance-tags/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/013-managed-instance-tags/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/014-register-ssh-host/contracts/add-command.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/014-register-ssh-host/contracts/remove-command.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/014-register-ssh-host/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/014-register-ssh-host/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/014-register-ssh-host/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/014-register-ssh-host/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/014-register-ssh-host/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/014-register-ssh-host/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/contracts/mirror-payload-v2.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/contracts/registry-accessor-api.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/contracts/registry-file-v2.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/015-registry-v2/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/016-sync-reconcile/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/016-sync-reconcile/contracts/cli-sync.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/016-sync-reconcile/contracts/provider-probe.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/016-sync-reconcile/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/016-sync-reconcile/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/016-sync-reconcile/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/016-sync-reconcile/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/016-sync-reconcile/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/016-sync-reconcile/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/contracts/cli-web-push.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/contracts/cli-web-status.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/contracts/revocation.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/contracts/setup-status-marker.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/017-web-adopt-simplify/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/baseline-notes.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/contracts/cli-surface.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/contracts/errors.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/contracts/lifecycle-templates.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/contracts/provider-protocol.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/contracts/sync-merge.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/018-provider-abstraction/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/019-hygiene-deps-docs/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/019-hygiene-deps-docs/contracts/cli-surface-delta.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/019-hygiene-deps-docs/contracts/docs-structure-check.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/019-hygiene-deps-docs/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/019-hygiene-deps-docs/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/019-hygiene-deps-docs/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/019-hygiene-deps-docs/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/019-hygiene-deps-docs/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/019-hygiene-deps-docs/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/020-openapi-type-generation/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/020-openapi-type-generation/contracts/drift-checks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/020-openapi-type-generation/contracts/terminal-frames-v1.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/020-openapi-type-generation/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/020-openapi-type-generation/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/020-openapi-type-generation/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/020-openapi-type-generation/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/020-openapi-type-generation/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/020-openapi-type-generation/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/021-cli-plane-separation/contracts/cli-surface.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/021-cli-plane-separation/contracts/descriptor-schema.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/021-cli-plane-separation/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/021-cli-plane-separation/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/021-cli-plane-separation/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/021-cli-plane-separation/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/021-cli-plane-separation/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/specs/021-cli-plane-separation/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/__main__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/cli/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/cli/added.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/cli/cp.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/cli/main.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/cli/providers/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/cli/providers/factory.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/cli/web.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/ansible_runner.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/completion.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/config.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/errors.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/known_hosts.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/lifecycle.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/output.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/picker.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/provider_protocol.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/provider_registry.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/reconcile.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/registry.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/remo_host_client.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/rsync.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/ssh.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/validation.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/version.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/web_adopt.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/core/web_drift.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/models/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/models/capability.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/models/discovery.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/models/host.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/models/session_target.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/models/snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/added.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/aws.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/aws_descriptor.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/builtin.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/hetzner.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/hetzner_descriptor.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/incus.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/incus_descriptor.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/proxmox.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/providers/proxmox_descriptor.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/api/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/api/hosts.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/api/pairing.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/api/setup.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/api/terminals.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/app.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/check.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/config.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/discovery.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/frames.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/health.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/logging_config.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/models.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/operator_auth.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/pairing.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/ssh_master.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/state.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/terminal.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/terminal_registry.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/src/remo_cli/web/tokens.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/ansible/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/ansible/test_apt_sources_repair.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/ansible/test_authorized_keys_bootstrap.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/ansible/test_remo_host_idempotency.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/ansible/test_ssh_configure_connection.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/ansible/test_user_setup_docker_group.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/conftest.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/image/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/image/test_docker_image.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/_nine_terminal_fixture.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/fish_completion.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/orbstack-cloud-init.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/orbstack.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_nine_terminals.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_nine_terminals_soak.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_registry_concurrency.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_remo_host_e2e.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_security_rejections.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_setup_payload_versions.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_sync_reconcile.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_terminal_attach.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_web_adopt_e2e.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/integration/test_web_cli_parity.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/perf/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/perf/test_latency.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/perf/test_registry_perf.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/providers/test_aws_snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/providers/test_hetzner_snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/providers/test_incus_snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/providers/test_incus_sync_all.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/providers/test_proxmox_snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/providers/test_proxmox_sync_all.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/surface_baseline.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_add_cmd.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_cli_uniformity.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_configure_cmd.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_cp.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_main.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_remove_cmd.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_startup_imports.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_surface_preservation.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/cli/test_web_adopt_cmd.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_ansible_runner.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_completion.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_config.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_errors.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_known_hosts.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_lifecycle.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_migration_tagging_notice.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_output.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_picker.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_provider_registry.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_reconcile.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_registry_format.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_registry_locking.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_registry_migration.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_remo_host_client.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_rsync.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_ssh.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_ssh_added.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_ssh_controlpath.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_ssh_identity_opts.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_validation.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_version.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_web_adopt_authorize.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_web_adopt_code.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_web_adopt_payload.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_web_adopt_trust.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_web_drift.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_web_push.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/core/test_web_push_self_heal.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/models/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/models/test_capability.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/models/test_discovery.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/models/test_session_target.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/fake_provider.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_added_add.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_added_configure.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_added_provider_guard.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_added_update_remove.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_added_verify.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_aws_provider_protocol.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_aws_snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_aws_sync.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_aws_upgrade_resize.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_hetzner_entry_adapters.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_hetzner_http.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_hetzner_label.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_hetzner_resize.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_hetzner_snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_hetzner_sync.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_host_user_consistency.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_incus_entry_adapters.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_incus_marker.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_incus_resize.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_incus_snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_incus_sync.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_missing_sdk.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_provider_conformance.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_provider_registry_entries.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_proxmox_devcontainer_runtime.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_proxmox_marker.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_proxmox_provider_protocol.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_proxmox_resize.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_proxmox_snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/providers/test_proxmox_sync.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_ansible_templates.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_architecture.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_dependabot_config.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_devcontainer_shim.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_docs_examples.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_docs_structure.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_host_model.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_host_ssh_type.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_lockfile_version.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_schema_drift.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/test_workflow_action_pins.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/_pairing_support.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/conftest.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/fixtures/hosts_response.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/fixtures/sessions_response.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_backpressure.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_check.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_csp.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_discovery.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_discovery_refresh_force.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_frames.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_health_states.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_hosts_mapping.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_lazy_import.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_log_redaction.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_mint_gating.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_operator_auth.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_pairing.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_pairing_origin.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_payload_equivalence.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_registry_readonly.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_service_identity_selection.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_setup_api.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_setup_auth.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_setup_dormancy.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_state.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_terminal_resize.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_terminals_api.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.6}/tests/unit/web/test_tokens.py +0 -0
|
@@ -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 —
|
|
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 —
|
|
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.
|
|
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.
|
|
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);
|
|
@@ -104,12 +104,18 @@ def shell(
|
|
|
104
104
|
|
|
105
105
|
# Pre-shell remote version check.
|
|
106
106
|
#
|
|
107
|
-
#
|
|
108
|
-
#
|
|
109
|
-
#
|
|
110
|
-
#
|
|
111
|
-
#
|
|
112
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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
|
|
214
|
-
"""
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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()
|