remo-cli 4.3.4__tar.gz → 4.3.5__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.5/.release-please-manifest.json +3 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/AGENTS.md +1 -1
- {remo_cli-4.3.4 → remo_cli-4.3.5}/CHANGELOG.md +7 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/CLAUDE.md +1 -1
- {remo_cli-4.3.4 → remo_cli-4.3.5}/PKG-INFO +8 -1
- {remo_cli-4.3.4 → remo_cli-4.3.5}/README.md +7 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/pyproject.toml +1 -1
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/cli/shell.py +67 -23
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/cli/test_shell.py +43 -14
- remo_cli-4.3.5/tests/unit/cli/test_shell_added.py +149 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/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.5}/.claude/skills/release/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.claude/skills/speckit-analyze/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.claude/skills/speckit-checklist/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.claude/skills/speckit-clarify/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.claude/skills/speckit-constitution/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.claude/skills/speckit-converge/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.claude/skills/speckit-git-commit/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.claude/skills/speckit-git-feature/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.claude/skills/speckit-git-initialize/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.claude/skills/speckit-git-remote/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.claude/skills/speckit-git-validate/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.claude/skills/speckit-implement/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.claude/skills/speckit-plan/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.claude/skills/speckit-specify/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.claude/skills/speckit-tasks/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.claude/skills/speckit-taskstoissues/SKILL.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.devcontainer/devcontainer.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.dockerignore +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.github/CODEOWNERS +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.github/codeql/codeql-config.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.github/dependabot.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.github/workflows/ci.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.github/workflows/codeql.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.github/workflows/dependency-review.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.github/workflows/dev-build.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.github/workflows/provision.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.github/workflows/release-please.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.github/workflows/release.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.github/workflows/smoke-test-cleanup.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.github/workflows/smoke-test.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.github/workflows/teardown.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.gitignore +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.maverick/checkpoints/feature/implementation_complete.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.maverick/checkpoints/feature/phase_${{ index }}_complete.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.maverick/checkpoints/feature/validation_complete.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/extensions/.registry +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/extensions/git/README.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/extensions/git/commands/speckit.git.commit.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/extensions/git/commands/speckit.git.feature.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/extensions/git/commands/speckit.git.initialize.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/extensions/git/commands/speckit.git.remote.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/extensions/git/commands/speckit.git.validate.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/extensions/git/config-template.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/extensions/git/extension.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/extensions/git/git-config.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/extensions/git/scripts/bash/auto-commit.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/extensions/git/scripts/bash/create-new-feature.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/extensions/git/scripts/bash/git-common.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/extensions/git/scripts/bash/initialize-repo.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/extensions/git/scripts/powershell/create-new-feature.ps1 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/extensions/git/scripts/powershell/git-common.ps1 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/extensions.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/feature.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/init-options.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/integration.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/integrations/claude.manifest.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/integrations/speckit.manifest.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/memory/constitution.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/scripts/bash/check-prerequisites.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/scripts/bash/common.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/scripts/bash/create-new-feature.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/scripts/bash/setup-plan.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/scripts/bash/setup-tasks.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/scripts/bash/update-agent-context.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/templates/agent-file-template.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/templates/checklist-template.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/templates/constitution-template.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/templates/plan-template.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/templates/spec-template.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/templates/tasks-template.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/workflows/speckit/workflow.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/.specify/workflows/workflow-registry.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/CONTRIBUTING.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/Dockerfile +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/LICENSE +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/SECURITY.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/.ansible-lint +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/README.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/ansible.cfg +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/aws_configure.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/aws_resize.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/aws_site.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/aws_teardown.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/group_vars/all.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/group_vars/incus_containers.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/group_vars/proxmox_containers.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/hetzner_configure.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/hetzner_provision.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/hetzner_resize.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/hetzner_site.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/hetzner_teardown.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/incus_bootstrap.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/incus_configure.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/incus_provision.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/incus_resize.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/incus_site.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/incus_teardown.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/inventory/hosts.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/inventory/incus_containers.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/proxmox_bootstrap.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/proxmox_configure.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/proxmox_provision.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/proxmox_resize.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/proxmox_site.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/proxmox_teardown.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/requirements.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/aws_server/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/aws_server/tasks/ebs.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/aws_server/tasks/ec2.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/aws_server/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/aws_server/tasks/patch_manager.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/aws_server/tasks/preflight.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/aws_server/tasks/security_group.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/deacon/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/deacon/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/devcontainers/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/docker/handlers/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/docker/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/fzf/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/github_cli/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/hetzner_server/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/hetzner_server/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/incus_bootstrap/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/incus_bootstrap/handlers/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/incus_bootstrap/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/incus_container/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/incus_container/handlers/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/incus_container/meta/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/incus_container/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/incus_container/tasks/preflight.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/incus_container_teardown/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/incus_container_teardown/meta/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/incus_container_teardown/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/nested_docker/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/nested_docker/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/nested_docker/templates/devcontainer-shim.sh.j2 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/nodejs/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/nodejs/files/nodesource-repo.gpg.key +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/nodejs/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/proxmox_bootstrap/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/proxmox_bootstrap/meta/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/proxmox_bootstrap/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/proxmox_container/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/proxmox_container/handlers/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/proxmox_container/meta/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/proxmox_container/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/proxmox_container/tasks/preflight.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/proxmox_container_teardown/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/proxmox_container_teardown/meta/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/proxmox_container_teardown/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/user_setup/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/user_setup/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/user_setup/templates/devshell.sh.j2 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/user_setup/templates/project-launch.sh.j2 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/user_setup/templates/project-menu.sh.j2 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/user_setup/templates/remo-host.sh.j2 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/zellij/defaults/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/zellij/tasks/main.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/zellij/templates/config.kdl.j2 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/roles/zellij/templates/layouts/minimal.kdl.j2 +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/ssh_configure.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/tasks/configure_dev_tools.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/ansible/tasks/repair_apt_sources.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/docker/Dockerfile +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/docker/compose.example.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/docker/entrypoint.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/docs/aws.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/docs/examples/orbstack-cloud-init-tailscale.yaml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/docs/examples/orbstack-cloud-init.yaml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/docs/feature-history.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/docs/hetzner.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/docs/incus.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/docs/maintaining-claude-md.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/docs/maintaining-generated-types.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/docs/nested-overlayfs.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/docs/providers.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/docs/proxmox.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/docs/remo-web-speckit-input.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/docs/remo-web.html +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/docs/web-session-interface.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/index.html +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/package-lock.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/package.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/playwright.config.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/playwright.geometry.config.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/scripts/check-types-fresh.mjs +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/scripts/generate-frame-types.mjs +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/scripts/generate-schema-types.mjs +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/api/client.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/api/client.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/api/generated/README.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/api/generated/openapi.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/api/generated/schema.d.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/api/generated/terminal-frames.d.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/api/generated/terminal-frames.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/api/generated.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/AppRoot.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/AppShell.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/AppShell.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/AwaitingAdoption.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/AwaitingAdoption.test.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/AwaitingAdoption.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/OfflineOverlay.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/OfflineOverlay.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/PairToSync.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/PairToSync.test.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/PairToSync.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/SessionRail.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/SessionRail.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/SettingsPage.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/SettingsPage.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/ShortcutsModal.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/ShortcutsModal.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/TerminalCard.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/TerminalCard.test.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/TerminalCard.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/TopBar.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/TopBar.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/WorkspacePane.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/WorkspacePane.test.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/WorkspacePane.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/masterLayout.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/masterLayout.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/providerMeta.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/providerMeta.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/railModel.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/components/railModel.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/lib/clipboard.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/lib/fullscreen.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/main.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/state/discovery.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/state/discovery.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/state/fonts.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/state/health.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/state/health.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/state/latency.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/state/latency.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/state/settings.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/state/settings.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/state/useConsoleKeyboard.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/state/workspace.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/state/workspace.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/terminal/.gitkeep +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/terminal/RendererAdapter.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/terminal/TerminalConnection.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/terminal/TerminalConnection.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/terminal/XtermRenderer.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/terminal/defaultRenderer.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/terminal/fitLoop.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/terminal/keymap.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/terminal/keymap.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/test/setup.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/theme/fonts.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/theme/terminalThemes.test.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/theme/terminalThemes.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/src/theme/tokens.css +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/tests/e2e/fixtures.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/tests/e2e/keyboard-routing.spec.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/tests/e2e/mobile.spec.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/tests/e2e/reconnect.spec.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/tests/e2e/terminal-shell-io.spec.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/tests/e2e/terminal-tui-compatibility.spec.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/tests/e2e/workspace-layout.spec.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/tests/geometry/global.d.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/tests/geometry/harness/index.html +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/tests/geometry/harness/main.tsx +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/tests/geometry/terminal-fit.spec.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/tsconfig.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/frontend/vite.config.ts +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/install.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/maverick.yaml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/project-menu.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/release-please-config.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/remo +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/remo.svg +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/run.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/scripts/export_openapi.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/scripts/palette-check.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/scripts/setup-aws-oidc.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/001-bootstrap-incus-host/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/001-bootstrap-incus-host/checklists/validation.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/001-bootstrap-incus-host/contracts/playbook-interface.yaml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/001-bootstrap-incus-host/contracts/role-interface.yaml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/001-bootstrap-incus-host/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/001-bootstrap-incus-host/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/001-bootstrap-incus-host/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/001-bootstrap-incus-host/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/001-bootstrap-incus-host/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/001-bootstrap-incus-host/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/002-incus-container-support/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/002-incus-container-support/contracts/playbook-interface.yaml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/002-incus-container-support/contracts/role-interface.yaml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/002-incus-container-support/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/002-incus-container-support/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/002-incus-container-support/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/002-incus-container-support/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/002-incus-container-support/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/002-incus-container-support/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/003-python-cli-rewrite/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/003-python-cli-rewrite/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/003-python-cli-rewrite/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/003-python-cli-rewrite/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/003-python-cli-rewrite/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/003-python-cli-rewrite/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/003-python-cli-rewrite/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/004-proxmox-container-support/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/005-provider-snapshots/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/005-provider-snapshots/contracts/cli-surface.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/005-provider-snapshots/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/005-provider-snapshots/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/005-provider-snapshots/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/005-provider-snapshots/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/005-provider-snapshots/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/005-provider-snapshots/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/010-web-session-interface/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/010-web-session-interface/contracts/remo-host-protocol.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/010-web-session-interface/contracts/rest-api.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/010-web-session-interface/contracts/terminal-websocket.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/010-web-session-interface/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/010-web-session-interface/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/010-web-session-interface/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/010-web-session-interface/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/010-web-session-interface/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/010-web-session-interface/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/011-web-adopt/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/011-web-adopt/contracts/cli-web-adopt.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/011-web-adopt/contracts/setup-api.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/011-web-adopt/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/011-web-adopt/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/011-web-adopt/quickstart-results.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/011-web-adopt/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/011-web-adopt/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/011-web-adopt/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/011-web-adopt/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/012-web-adopt-pairing/contracts/cli-web-adopt.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/012-web-adopt-pairing/contracts/pairing-api.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/012-web-adopt-pairing/contracts/setup-api.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/012-web-adopt-pairing/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/012-web-adopt-pairing/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/012-web-adopt-pairing/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/012-web-adopt-pairing/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/012-web-adopt-pairing/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/012-web-adopt-pairing/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/013-managed-instance-tags/contracts/cli-sync.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/013-managed-instance-tags/contracts/marker-commands.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/013-managed-instance-tags/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/013-managed-instance-tags/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/013-managed-instance-tags/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/013-managed-instance-tags/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/013-managed-instance-tags/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/013-managed-instance-tags/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/014-register-ssh-host/contracts/add-command.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/014-register-ssh-host/contracts/remove-command.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/014-register-ssh-host/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/014-register-ssh-host/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/014-register-ssh-host/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/014-register-ssh-host/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/014-register-ssh-host/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/014-register-ssh-host/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/015-registry-v2/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/015-registry-v2/contracts/mirror-payload-v2.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/015-registry-v2/contracts/registry-accessor-api.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/015-registry-v2/contracts/registry-file-v2.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/015-registry-v2/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/015-registry-v2/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/015-registry-v2/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/015-registry-v2/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/015-registry-v2/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/015-registry-v2/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/016-sync-reconcile/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/016-sync-reconcile/contracts/cli-sync.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/016-sync-reconcile/contracts/provider-probe.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/016-sync-reconcile/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/016-sync-reconcile/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/016-sync-reconcile/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/016-sync-reconcile/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/016-sync-reconcile/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/016-sync-reconcile/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/017-web-adopt-simplify/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/017-web-adopt-simplify/contracts/cli-web-push.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/017-web-adopt-simplify/contracts/cli-web-status.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/017-web-adopt-simplify/contracts/revocation.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/017-web-adopt-simplify/contracts/setup-status-marker.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/017-web-adopt-simplify/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/017-web-adopt-simplify/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/017-web-adopt-simplify/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/017-web-adopt-simplify/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/017-web-adopt-simplify/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/017-web-adopt-simplify/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/018-provider-abstraction/baseline-notes.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/018-provider-abstraction/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/018-provider-abstraction/contracts/cli-surface.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/018-provider-abstraction/contracts/errors.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/018-provider-abstraction/contracts/lifecycle-templates.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/018-provider-abstraction/contracts/provider-protocol.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/018-provider-abstraction/contracts/sync-merge.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/018-provider-abstraction/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/018-provider-abstraction/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/018-provider-abstraction/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/018-provider-abstraction/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/018-provider-abstraction/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/018-provider-abstraction/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/019-hygiene-deps-docs/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/019-hygiene-deps-docs/contracts/cli-surface-delta.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/019-hygiene-deps-docs/contracts/docs-structure-check.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/019-hygiene-deps-docs/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/019-hygiene-deps-docs/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/019-hygiene-deps-docs/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/019-hygiene-deps-docs/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/019-hygiene-deps-docs/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/019-hygiene-deps-docs/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/020-openapi-type-generation/checklists/requirements.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/020-openapi-type-generation/contracts/drift-checks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/020-openapi-type-generation/contracts/terminal-frames-v1.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/020-openapi-type-generation/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/020-openapi-type-generation/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/020-openapi-type-generation/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/020-openapi-type-generation/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/020-openapi-type-generation/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/020-openapi-type-generation/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/021-cli-plane-separation/contracts/cli-surface.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/021-cli-plane-separation/contracts/descriptor-schema.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/021-cli-plane-separation/data-model.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/021-cli-plane-separation/plan.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/021-cli-plane-separation/quickstart.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/021-cli-plane-separation/research.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/021-cli-plane-separation/spec.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/specs/021-cli-plane-separation/tasks.md +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/__main__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/cli/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/cli/added.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/cli/cp.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/cli/main.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/cli/providers/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/cli/providers/factory.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/cli/web.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/ansible_runner.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/completion.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/config.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/errors.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/known_hosts.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/lifecycle.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/output.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/picker.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/provider_protocol.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/provider_registry.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/reconcile.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/registry.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/remo_host_client.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/rsync.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/ssh.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/validation.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/version.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/web_adopt.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/core/web_drift.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/models/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/models/capability.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/models/discovery.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/models/host.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/models/session_target.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/models/snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/providers/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/providers/added.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/providers/aws.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/providers/aws_descriptor.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/providers/builtin.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/providers/hetzner.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/providers/hetzner_descriptor.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/providers/incus.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/providers/incus_descriptor.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/providers/proxmox.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/providers/proxmox_descriptor.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/api/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/api/hosts.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/api/pairing.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/api/setup.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/api/terminals.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/app.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/check.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/config.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/discovery.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/frames.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/health.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/logging_config.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/models.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/operator_auth.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/pairing.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/ssh_master.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/state.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/terminal.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/terminal_registry.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/src/remo_cli/web/tokens.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/ansible/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/ansible/test_apt_sources_repair.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/ansible/test_authorized_keys_bootstrap.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/ansible/test_remo_host_idempotency.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/ansible/test_ssh_configure_connection.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/ansible/test_user_setup_docker_group.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/conftest.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/image/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/image/test_docker_image.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/integration/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/integration/_nine_terminal_fixture.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/integration/fish_completion.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/integration/orbstack-cloud-init.yml +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/integration/orbstack.sh +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/integration/test_nine_terminals.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/integration/test_nine_terminals_soak.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/integration/test_registry_concurrency.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/integration/test_remo_host_e2e.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/integration/test_security_rejections.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/integration/test_setup_payload_versions.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/integration/test_sync_reconcile.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/integration/test_terminal_attach.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/integration/test_web_adopt_e2e.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/integration/test_web_cli_parity.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/perf/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/perf/test_latency.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/perf/test_registry_perf.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/cli/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/cli/providers/test_aws_snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/cli/providers/test_hetzner_snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/cli/providers/test_incus_snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/cli/providers/test_incus_sync_all.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/cli/providers/test_proxmox_snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/cli/providers/test_proxmox_sync_all.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/cli/surface_baseline.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/cli/test_add_cmd.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/cli/test_cli_uniformity.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/cli/test_configure_cmd.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/cli/test_cp.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/cli/test_main.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/cli/test_remove_cmd.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/cli/test_startup_imports.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/cli/test_surface_preservation.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/cli/test_web_adopt_cmd.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_ansible_runner.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_completion.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_config.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_errors.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_known_hosts.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_lifecycle.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_migration_tagging_notice.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_output.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_picker.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_provider_registry.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_reconcile.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_registry_format.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_registry_locking.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_registry_migration.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_remo_host_client.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_rsync.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_ssh.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_ssh_added.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_ssh_controlpath.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_ssh_identity_opts.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_validation.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_version.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_web_adopt_authorize.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_web_adopt_code.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_web_adopt_payload.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_web_adopt_trust.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_web_drift.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_web_push.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/core/test_web_push_self_heal.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/models/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/models/test_capability.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/models/test_discovery.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/models/test_session_target.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/fake_provider.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_added_add.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_added_configure.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_added_provider_guard.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_added_update_remove.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_added_verify.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_aws_provider_protocol.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_aws_snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_aws_sync.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_aws_upgrade_resize.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_hetzner_entry_adapters.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_hetzner_http.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_hetzner_label.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_hetzner_resize.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_hetzner_snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_hetzner_sync.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_host_user_consistency.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_incus_entry_adapters.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_incus_marker.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_incus_resize.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_incus_snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_incus_sync.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_missing_sdk.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_provider_conformance.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_provider_registry_entries.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_proxmox_devcontainer_runtime.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_proxmox_marker.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_proxmox_provider_protocol.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_proxmox_resize.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_proxmox_snapshot.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/providers/test_proxmox_sync.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/test_ansible_templates.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/test_architecture.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/test_dependabot_config.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/test_devcontainer_shim.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/test_docs_examples.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/test_docs_structure.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/test_host_model.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/test_host_ssh_type.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/test_lockfile_version.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/test_schema_drift.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/test_workflow_action_pins.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/__init__.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/_pairing_support.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/conftest.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/fixtures/hosts_response.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/fixtures/sessions_response.json +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_backpressure.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_check.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_csp.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_discovery.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_discovery_refresh_force.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_frames.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_health_states.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_hosts_mapping.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_lazy_import.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_log_redaction.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_mint_gating.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_operator_auth.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_pairing.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_pairing_origin.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_payload_equivalence.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_registry_readonly.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_service_identity_selection.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_setup_api.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_setup_auth.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_setup_dormancy.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_state.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_terminal_resize.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/tests/unit/web/test_terminals_api.py +0 -0
- {remo_cli-4.3.4 → remo_cli-4.3.5}/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,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [4.3.5](https://github.com/get2knowio/remo/compare/v4.3.4...v4.3.5) (2026-08-16)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **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))
|
|
9
|
+
|
|
3
10
|
## [4.3.4](https://github.com/get2knowio/remo/compare/v4.3.3...v4.3.4) (2026-08-15)
|
|
4
11
|
|
|
5
12
|
|
|
@@ -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.5
|
|
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)
|
|
@@ -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()
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
"""`remo shell` degradation for manually-added SSH hosts (feature 014, FR-011).
|
|
2
|
-
|
|
3
|
-
An added (type="ssh") host has no managed tooling, so the pre-connect
|
|
4
|
-
tools/version check must be skipped — no "Update tools?" prompt — and the
|
|
5
|
-
command drops straight into a plain login shell via shell_connect.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from __future__ import annotations
|
|
9
|
-
|
|
10
|
-
import pytest
|
|
11
|
-
from click.testing import CliRunner
|
|
12
|
-
|
|
13
|
-
from remo_cli.cli.shell import shell
|
|
14
|
-
from remo_cli.models.host import KnownHost
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
@pytest.fixture
|
|
18
|
-
def runner() -> CliRunner:
|
|
19
|
-
return CliRunner()
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def _ssh_host() -> KnownHost:
|
|
23
|
-
return KnownHost(
|
|
24
|
-
type="ssh",
|
|
25
|
-
name="mybox",
|
|
26
|
-
host="1.2.3.4",
|
|
27
|
-
user="remo",
|
|
28
|
-
instance_id="22",
|
|
29
|
-
access_mode="direct",
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
def _incus_host() -> KnownHost:
|
|
34
|
-
return KnownHost(type="incus", name="h/dev", host="10.0.0.5", user="remo")
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def test_ssh_host_skips_version_check(runner, mocker) -> None:
|
|
38
|
-
mocker.patch("remo_cli.core.ssh.resolve_remo_host", return_value=_ssh_host())
|
|
39
|
-
mocker.patch(
|
|
40
|
-
"remo_cli.providers.aws.auto_start_aws_if_stopped",
|
|
41
|
-
side_effect=lambda h: h,
|
|
42
|
-
)
|
|
43
|
-
mocker.patch(
|
|
44
|
-
"remo_cli.core.version.get_current_version", return_value="2.2.0"
|
|
45
|
-
)
|
|
46
|
-
check = mocker.patch("remo_cli.core.ssh.check_remote_version")
|
|
47
|
-
connect = mocker.patch("remo_cli.core.ssh.shell_connect")
|
|
48
|
-
|
|
49
|
-
result = runner.invoke(shell, ["mybox"])
|
|
50
|
-
|
|
51
|
-
assert result.exit_code == 0
|
|
52
|
-
check.assert_not_called() # FR-011: no version probe for an added host
|
|
53
|
-
connect.assert_called_once()
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def test_managed_host_still_runs_version_check(runner, mocker) -> None:
|
|
57
|
-
# Contrast: a provider host DOES get the version check (gate is type-specific).
|
|
58
|
-
mocker.patch("remo_cli.core.ssh.resolve_remo_host", return_value=_incus_host())
|
|
59
|
-
mocker.patch(
|
|
60
|
-
"remo_cli.providers.aws.auto_start_aws_if_stopped",
|
|
61
|
-
side_effect=lambda h: h,
|
|
62
|
-
)
|
|
63
|
-
mocker.patch(
|
|
64
|
-
"remo_cli.core.version.get_current_version", return_value="2.2.0"
|
|
65
|
-
)
|
|
66
|
-
check = mocker.patch(
|
|
67
|
-
"remo_cli.core.ssh.check_remote_version", return_value=("2.2.0", None)
|
|
68
|
-
)
|
|
69
|
-
mocker.patch("remo_cli.core.version.version_is_newer", return_value=False)
|
|
70
|
-
connect = mocker.patch("remo_cli.core.ssh.shell_connect")
|
|
71
|
-
|
|
72
|
-
result = runner.invoke(shell, ["dev"])
|
|
73
|
-
|
|
74
|
-
assert result.exit_code == 0
|
|
75
|
-
check.assert_called_once()
|
|
76
|
-
connect.assert_called_once()
|
|
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
|
|
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
|