remo-cli 4.3.0__tar.gz → 4.3.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/ci.yml +5 -5
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/dev-build.yml +1 -1
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/provision.yml +1 -1
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/release-please.yml +13 -3
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/release.yml +2 -2
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/smoke-test.yml +3 -3
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/teardown.yml +1 -1
- remo_cli-4.3.2/.release-please-manifest.json +3 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/CHANGELOG.md +14 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/PKG-INFO +17 -1
- {remo_cli-4.3.0 → remo_cli-4.3.2}/README.md +16 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/user_setup/tasks/main.yml +14 -0
- remo_cli-4.3.2/docs/examples/orbstack-cloud-init.yaml +120 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/package-lock.json +24 -24
- {remo_cli-4.3.0 → remo_cli-4.3.2}/pyproject.toml +1 -1
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/ssh.py +18 -1
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/models/host.py +16 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/check.py +4 -1
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/config.py +25 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/discovery.py +11 -5
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/terminal.py +4 -1
- remo_cli-4.3.2/tests/ansible/test_user_setup_docker_group.py +88 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_ssh_identity_opts.py +66 -0
- remo_cli-4.3.2/tests/unit/test_docs_examples.py +80 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/test_host_ssh_type.py +19 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_discovery.py +33 -1
- remo_cli-4.3.2/tests/unit/web/test_service_identity_selection.py +95 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/uv.lock +51 -54
- remo_cli-4.3.0/.release-please-manifest.json +0 -3
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/release/SKILL.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-analyze/SKILL.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-checklist/SKILL.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-clarify/SKILL.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-constitution/SKILL.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-converge/SKILL.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-git-commit/SKILL.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-git-feature/SKILL.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-git-initialize/SKILL.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-git-remote/SKILL.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-git-validate/SKILL.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-implement/SKILL.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-plan/SKILL.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-specify/SKILL.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-tasks/SKILL.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.claude/skills/speckit-taskstoissues/SKILL.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.devcontainer/devcontainer.json +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.dockerignore +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/CODEOWNERS +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/dependabot.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/codeql.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/dependency-review.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.github/workflows/smoke-test-cleanup.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.gitignore +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.maverick/checkpoints/feature/implementation_complete.json +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.maverick/checkpoints/feature/phase_${{ index }}_complete.json +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.maverick/checkpoints/feature/validation_complete.json +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/.registry +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/README.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/commands/speckit.git.commit.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/commands/speckit.git.feature.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/commands/speckit.git.initialize.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/commands/speckit.git.remote.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/commands/speckit.git.validate.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/config-template.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/extension.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/git-config.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/scripts/bash/auto-commit.sh +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/scripts/bash/create-new-feature.sh +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/scripts/bash/git-common.sh +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/scripts/bash/initialize-repo.sh +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/scripts/powershell/create-new-feature.ps1 +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/scripts/powershell/git-common.ps1 +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/extensions.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/feature.json +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/init-options.json +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/integration.json +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/integrations/claude.manifest.json +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/integrations/speckit.manifest.json +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/memory/constitution.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/scripts/bash/check-prerequisites.sh +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/scripts/bash/common.sh +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/scripts/bash/create-new-feature.sh +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/scripts/bash/setup-plan.sh +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/scripts/bash/setup-tasks.sh +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/scripts/bash/update-agent-context.sh +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/templates/agent-file-template.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/templates/checklist-template.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/templates/constitution-template.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/templates/plan-template.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/templates/spec-template.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/templates/tasks-template.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/workflows/speckit/workflow.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/.specify/workflows/workflow-registry.json +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/AGENTS.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/CLAUDE.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/CONTRIBUTING.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/Dockerfile +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/LICENSE +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/SECURITY.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/.ansible-lint +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/README.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/ansible.cfg +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/aws_configure.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/aws_resize.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/aws_site.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/aws_teardown.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/group_vars/all.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/group_vars/incus_containers.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/group_vars/proxmox_containers.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/hetzner_configure.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/hetzner_provision.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/hetzner_resize.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/hetzner_site.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/hetzner_teardown.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/incus_bootstrap.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/incus_configure.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/incus_provision.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/incus_resize.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/incus_site.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/incus_teardown.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/inventory/hosts.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/inventory/incus_containers.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/proxmox_bootstrap.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/proxmox_configure.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/proxmox_provision.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/proxmox_resize.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/proxmox_site.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/proxmox_teardown.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/requirements.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/aws_server/defaults/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/aws_server/tasks/ebs.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/aws_server/tasks/ec2.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/aws_server/tasks/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/aws_server/tasks/patch_manager.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/aws_server/tasks/preflight.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/aws_server/tasks/security_group.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/deacon/defaults/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/deacon/tasks/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/devcontainers/tasks/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/docker/handlers/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/docker/tasks/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/fzf/tasks/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/github_cli/tasks/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/hetzner_server/defaults/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/hetzner_server/tasks/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_bootstrap/defaults/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_bootstrap/handlers/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_bootstrap/tasks/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_container/defaults/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_container/handlers/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_container/meta/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_container/tasks/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_container/tasks/preflight.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_container_teardown/defaults/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_container_teardown/meta/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/incus_container_teardown/tasks/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/nodejs/defaults/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/nodejs/files/nodesource-repo.gpg.key +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/nodejs/tasks/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_bootstrap/defaults/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_bootstrap/meta/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_bootstrap/tasks/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_container/defaults/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_container/handlers/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_container/meta/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_container/tasks/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_container/tasks/preflight.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_container_teardown/defaults/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_container_teardown/meta/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/proxmox_container_teardown/tasks/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/user_setup/defaults/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/user_setup/templates/devshell.sh.j2 +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/user_setup/templates/project-launch.sh.j2 +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/user_setup/templates/project-menu.sh.j2 +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/user_setup/templates/remo-host.sh.j2 +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/zellij/defaults/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/zellij/tasks/main.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/zellij/templates/config.kdl.j2 +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/roles/zellij/templates/layouts/minimal.kdl.j2 +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/ssh_configure.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/tasks/configure_dev_tools.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/ansible/tasks/repair_apt_sources.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/docker/Dockerfile +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/docker/compose.example.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/docker/entrypoint.sh +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/aws.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/feature-history.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/hetzner.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/incus.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/install.sh +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/maintaining-claude-md.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/maintaining-generated-types.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/providers.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/proxmox.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/remo-web-speckit-input.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/remo-web.html +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/docs/web-session-interface.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/index.html +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/package.json +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/scripts/check-types-fresh.mjs +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/scripts/generate-frame-types.mjs +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/scripts/generate-schema-types.mjs +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/api/client.test.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/api/client.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/api/generated/README.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/api/generated/openapi.json +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/api/generated/schema.d.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/api/generated/terminal-frames.d.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/api/generated/terminal-frames.json +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/api/generated.test.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/AppRoot.tsx +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/AppShell.css +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/AppShell.tsx +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/AwaitingAdoption.css +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/AwaitingAdoption.tsx +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/OfflineOverlay.css +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/OfflineOverlay.tsx +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/PairToSync.css +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/PairToSync.tsx +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/SessionRail.css +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/SessionRail.tsx +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/SettingsPage.css +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/SettingsPage.tsx +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/ShortcutsModal.css +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/ShortcutsModal.tsx +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/TerminalCard.css +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/TerminalCard.test.tsx +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/TerminalCard.tsx +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/TopBar.css +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/TopBar.tsx +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/WorkspacePane.css +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/WorkspacePane.test.tsx +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/WorkspacePane.tsx +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/masterLayout.test.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/masterLayout.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/providerMeta.test.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/providerMeta.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/railModel.test.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/components/railModel.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/lib/clipboard.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/lib/fullscreen.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/main.tsx +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/discovery.test.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/discovery.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/fonts.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/health.test.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/health.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/latency.test.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/latency.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/settings.test.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/settings.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/useConsoleKeyboard.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/workspace.test.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/state/workspace.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/terminal/.gitkeep +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/terminal/RendererAdapter.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/terminal/TerminalConnection.test.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/terminal/TerminalConnection.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/terminal/XtermRenderer.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/terminal/defaultRenderer.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/terminal/keymap.test.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/terminal/keymap.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/test/setup.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/theme/fonts.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/theme/terminalThemes.test.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/theme/terminalThemes.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/src/theme/tokens.css +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/tsconfig.json +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/frontend/vite.config.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/install.sh +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/maverick.yaml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/playwright.config.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/project-menu.sh +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/release-please-config.json +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/remo +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/remo.svg +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/run.sh +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/scripts/export_openapi.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/scripts/palette-check.sh +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/scripts/setup-aws-oidc.sh +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/checklists/requirements.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/checklists/validation.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/contracts/playbook-interface.yaml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/contracts/role-interface.yaml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/data-model.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/plan.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/quickstart.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/research.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/spec.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/001-bootstrap-incus-host/tasks.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/002-incus-container-support/checklists/requirements.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/002-incus-container-support/contracts/playbook-interface.yaml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/002-incus-container-support/contracts/role-interface.yaml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/002-incus-container-support/data-model.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/002-incus-container-support/plan.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/002-incus-container-support/quickstart.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/002-incus-container-support/research.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/002-incus-container-support/spec.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/002-incus-container-support/tasks.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/003-python-cli-rewrite/checklists/requirements.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/003-python-cli-rewrite/data-model.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/003-python-cli-rewrite/plan.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/003-python-cli-rewrite/quickstart.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/003-python-cli-rewrite/research.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/003-python-cli-rewrite/spec.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/003-python-cli-rewrite/tasks.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/004-proxmox-container-support/spec.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/005-provider-snapshots/checklists/requirements.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/005-provider-snapshots/contracts/cli-surface.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/005-provider-snapshots/data-model.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/005-provider-snapshots/plan.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/005-provider-snapshots/quickstart.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/005-provider-snapshots/research.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/005-provider-snapshots/spec.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/005-provider-snapshots/tasks.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/checklists/requirements.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/contracts/remo-host-protocol.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/contracts/rest-api.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/contracts/terminal-websocket.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/data-model.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/plan.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/quickstart.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/research.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/spec.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/010-web-session-interface/tasks.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/checklists/requirements.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/contracts/cli-web-adopt.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/contracts/setup-api.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/data-model.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/plan.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/quickstart-results.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/quickstart.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/research.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/spec.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/011-web-adopt/tasks.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/012-web-adopt-pairing/contracts/cli-web-adopt.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/012-web-adopt-pairing/contracts/pairing-api.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/012-web-adopt-pairing/contracts/setup-api.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/012-web-adopt-pairing/data-model.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/012-web-adopt-pairing/plan.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/012-web-adopt-pairing/quickstart.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/012-web-adopt-pairing/research.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/012-web-adopt-pairing/spec.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/012-web-adopt-pairing/tasks.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/013-managed-instance-tags/contracts/cli-sync.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/013-managed-instance-tags/contracts/marker-commands.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/013-managed-instance-tags/data-model.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/013-managed-instance-tags/plan.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/013-managed-instance-tags/quickstart.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/013-managed-instance-tags/research.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/013-managed-instance-tags/spec.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/013-managed-instance-tags/tasks.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/014-register-ssh-host/contracts/add-command.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/014-register-ssh-host/contracts/remove-command.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/014-register-ssh-host/data-model.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/014-register-ssh-host/plan.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/014-register-ssh-host/quickstart.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/014-register-ssh-host/research.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/014-register-ssh-host/spec.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/014-register-ssh-host/tasks.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/checklists/requirements.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/contracts/mirror-payload-v2.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/contracts/registry-accessor-api.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/contracts/registry-file-v2.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/data-model.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/plan.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/quickstart.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/research.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/spec.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/015-registry-v2/tasks.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/016-sync-reconcile/checklists/requirements.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/016-sync-reconcile/contracts/cli-sync.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/016-sync-reconcile/contracts/provider-probe.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/016-sync-reconcile/data-model.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/016-sync-reconcile/plan.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/016-sync-reconcile/quickstart.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/016-sync-reconcile/research.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/016-sync-reconcile/spec.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/016-sync-reconcile/tasks.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/checklists/requirements.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/contracts/cli-web-push.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/contracts/cli-web-status.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/contracts/revocation.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/contracts/setup-status-marker.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/data-model.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/plan.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/quickstart.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/research.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/spec.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/017-web-adopt-simplify/tasks.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/baseline-notes.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/checklists/requirements.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/contracts/cli-surface.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/contracts/errors.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/contracts/lifecycle-templates.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/contracts/provider-protocol.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/contracts/sync-merge.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/data-model.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/plan.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/quickstart.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/research.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/spec.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/018-provider-abstraction/tasks.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/019-hygiene-deps-docs/checklists/requirements.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/019-hygiene-deps-docs/contracts/cli-surface-delta.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/019-hygiene-deps-docs/contracts/docs-structure-check.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/019-hygiene-deps-docs/data-model.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/019-hygiene-deps-docs/plan.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/019-hygiene-deps-docs/quickstart.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/019-hygiene-deps-docs/research.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/019-hygiene-deps-docs/spec.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/019-hygiene-deps-docs/tasks.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/020-openapi-type-generation/checklists/requirements.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/020-openapi-type-generation/contracts/drift-checks.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/020-openapi-type-generation/contracts/terminal-frames-v1.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/020-openapi-type-generation/data-model.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/020-openapi-type-generation/plan.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/020-openapi-type-generation/quickstart.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/020-openapi-type-generation/research.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/020-openapi-type-generation/spec.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/020-openapi-type-generation/tasks.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/021-cli-plane-separation/contracts/cli-surface.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/021-cli-plane-separation/contracts/descriptor-schema.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/021-cli-plane-separation/data-model.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/021-cli-plane-separation/plan.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/021-cli-plane-separation/quickstart.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/021-cli-plane-separation/research.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/021-cli-plane-separation/spec.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/specs/021-cli-plane-separation/tasks.md +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/__init__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/__main__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/cli/__init__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/cli/added.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/cli/cp.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/cli/main.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/cli/providers/__init__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/cli/providers/factory.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/cli/shell.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/cli/web.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/__init__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/ansible_runner.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/completion.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/config.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/errors.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/known_hosts.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/lifecycle.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/output.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/picker.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/provider_protocol.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/provider_registry.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/reconcile.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/registry.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/remo_host_client.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/rsync.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/snapshot.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/validation.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/version.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/web_adopt.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/core/web_drift.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/models/__init__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/models/capability.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/models/discovery.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/models/session_target.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/models/snapshot.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/__init__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/added.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/aws.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/aws_descriptor.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/builtin.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/hetzner.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/hetzner_descriptor.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/incus.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/incus_descriptor.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/proxmox.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/providers/proxmox_descriptor.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/__init__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/api/__init__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/api/hosts.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/api/pairing.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/api/setup.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/api/terminals.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/app.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/frames.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/health.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/logging_config.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/models.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/operator_auth.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/pairing.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/ssh_master.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/state.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/terminal_registry.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/src/remo_cli/web/tokens.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/__init__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/ansible/__init__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/ansible/test_apt_sources_repair.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/ansible/test_authorized_keys_bootstrap.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/ansible/test_remo_host_idempotency.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/ansible/test_ssh_configure_connection.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/conftest.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/e2e/fixtures.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/e2e/keyboard-routing.spec.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/e2e/mobile.spec.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/e2e/reconnect.spec.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/e2e/terminal-shell-io.spec.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/e2e/terminal-tui-compatibility.spec.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/e2e/workspace-layout.spec.ts +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/image/__init__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/image/test_docker_image.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/__init__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/_nine_terminal_fixture.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/fish_completion.sh +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/orbstack-cloud-init.yml +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/orbstack.sh +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_nine_terminals.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_nine_terminals_soak.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_registry_concurrency.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_remo_host_e2e.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_security_rejections.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_setup_payload_versions.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_sync_reconcile.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_terminal_attach.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_web_adopt_e2e.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/integration/test_web_cli_parity.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/perf/__init__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/perf/test_latency.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/perf/test_registry_perf.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/__init__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/__init__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/providers/test_aws_snapshot.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/providers/test_hetzner_snapshot.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/providers/test_incus_snapshot.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/providers/test_incus_sync_all.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/providers/test_proxmox_snapshot.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/providers/test_proxmox_sync_all.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/surface_baseline.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_add_cmd.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_cli_uniformity.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_configure_cmd.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_cp.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_main.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_remove_cmd.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_shell.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_shell_added.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_startup_imports.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_surface_preservation.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/cli/test_web_adopt_cmd.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/__init__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_ansible_runner.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_completion.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_config.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_errors.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_known_hosts.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_lifecycle.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_migration_tagging_notice.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_output.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_picker.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_provider_registry.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_reconcile.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_registry_format.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_registry_locking.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_registry_migration.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_remo_host_client.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_rsync.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_snapshot.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_ssh.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_ssh_added.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_ssh_controlpath.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_validation.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_version.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_web_adopt_authorize.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_web_adopt_code.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_web_adopt_payload.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_web_adopt_trust.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_web_drift.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_web_push.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/core/test_web_push_self_heal.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/models/__init__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/models/test_capability.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/models/test_discovery.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/models/test_session_target.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/__init__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/fake_provider.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_added_add.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_added_configure.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_added_provider_guard.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_added_update_remove.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_added_verify.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_aws_provider_protocol.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_aws_snapshot.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_aws_sync.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_aws_upgrade_resize.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_hetzner_entry_adapters.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_hetzner_http.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_hetzner_label.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_hetzner_resize.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_hetzner_snapshot.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_hetzner_sync.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_host_user_consistency.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_incus_entry_adapters.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_incus_marker.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_incus_resize.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_incus_snapshot.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_incus_sync.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_missing_sdk.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_provider_conformance.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_provider_registry_entries.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_proxmox_devcontainer_runtime.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_proxmox_marker.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_proxmox_provider_protocol.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_proxmox_resize.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_proxmox_snapshot.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/providers/test_proxmox_sync.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/test_ansible_templates.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/test_architecture.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/test_docs_structure.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/test_host_model.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/test_lockfile_version.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/test_schema_drift.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/__init__.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/_pairing_support.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/conftest.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/fixtures/hosts_response.json +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/fixtures/sessions_response.json +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_backpressure.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_check.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_csp.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_discovery_refresh_force.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_frames.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_health_states.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_hosts_mapping.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_lazy_import.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_log_redaction.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_mint_gating.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_operator_auth.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_pairing.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_pairing_origin.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_payload_equivalence.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_registry_readonly.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_setup_api.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_setup_auth.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_setup_dormancy.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_state.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_terminal_resize.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_terminals_api.py +0 -0
- {remo_cli-4.3.0 → remo_cli-4.3.2}/tests/unit/web/test_tokens.py +0 -0
|
@@ -17,7 +17,7 @@ jobs:
|
|
|
17
17
|
steps:
|
|
18
18
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
19
19
|
|
|
20
|
-
- uses: astral-sh/setup-uv@
|
|
20
|
+
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
|
|
21
21
|
|
|
22
22
|
- name: Set up Python ${{ matrix.python-version }}
|
|
23
23
|
run: uv python install ${{ matrix.python-version }}
|
|
@@ -48,7 +48,7 @@ jobs:
|
|
|
48
48
|
|
|
49
49
|
- uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4
|
|
50
50
|
|
|
51
|
-
- uses: astral-sh/setup-uv@
|
|
51
|
+
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
|
|
52
52
|
|
|
53
53
|
- name: Install dependencies
|
|
54
54
|
run: uv sync --all-extras
|
|
@@ -70,7 +70,7 @@ jobs:
|
|
|
70
70
|
steps:
|
|
71
71
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
72
72
|
|
|
73
|
-
- uses: astral-sh/setup-uv@
|
|
73
|
+
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
|
|
74
74
|
|
|
75
75
|
- name: Build wheel
|
|
76
76
|
run: uv build --wheel
|
|
@@ -98,7 +98,7 @@ jobs:
|
|
|
98
98
|
steps:
|
|
99
99
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
100
100
|
|
|
101
|
-
- uses: astral-sh/setup-uv@
|
|
101
|
+
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
|
|
102
102
|
|
|
103
103
|
- name: Install fish
|
|
104
104
|
run: |
|
|
@@ -124,7 +124,7 @@ jobs:
|
|
|
124
124
|
steps:
|
|
125
125
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
126
126
|
|
|
127
|
-
- uses: astral-sh/setup-uv@
|
|
127
|
+
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
|
|
128
128
|
|
|
129
129
|
- name: Install dependencies
|
|
130
130
|
run: uv sync --all-extras
|
|
@@ -19,7 +19,7 @@ jobs:
|
|
|
19
19
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
20
20
|
|
|
21
21
|
- name: Install uv
|
|
22
|
-
uses: astral-sh/setup-uv@
|
|
22
|
+
uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
|
|
23
23
|
|
|
24
24
|
- name: Install Ansible and dependencies
|
|
25
25
|
run: |
|
|
@@ -42,7 +42,7 @@ jobs:
|
|
|
42
42
|
app-id: ${{ vars.RELEASE_PLEASE_APP_ID }}
|
|
43
43
|
private-key: ${{ secrets.RELEASE_PLEASE_APP_KEY }}
|
|
44
44
|
|
|
45
|
-
- uses: googleapis/release-please-action@
|
|
45
|
+
- uses: googleapis/release-please-action@v5
|
|
46
46
|
id: release
|
|
47
47
|
with:
|
|
48
48
|
# Token precedence:
|
|
@@ -68,16 +68,26 @@ jobs:
|
|
|
68
68
|
# but this job runs immediately after that refresh on every push to main,
|
|
69
69
|
# so the commit is simply re-made. `tests/unit/test_lockfile_version.py`
|
|
70
70
|
# is the backstop that keeps a drifted lockfile from merging at all.
|
|
71
|
-
- uses: astral-sh/setup-uv@
|
|
71
|
+
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
|
|
72
72
|
if: ${{ steps.release.outputs.pr }}
|
|
73
73
|
|
|
74
|
+
# `pr` is passed through as raw JSON and parsed in the shell rather than
|
|
75
|
+
# with `fromJSON(...)` here. A step's `env:` expressions are evaluated even
|
|
76
|
+
# when its `if:` is false, and on the push that MERGES a release there are
|
|
77
|
+
# no new commits, so release-please emits no PR and `outputs.pr` is the
|
|
78
|
+
# empty string — `fromJSON('')` then fails the whole job with "Error
|
|
79
|
+
# reading JToken from JsonReader", after the tag and publish have already
|
|
80
|
+
# succeeded. That made this workflow red after every single release and
|
|
81
|
+
# would have masked a real failure. The neighbouring setup-uv step, which
|
|
82
|
+
# has the same `if:` but no `env:`, skipped correctly throughout.
|
|
74
83
|
- name: Sync uv.lock onto the release PR
|
|
75
84
|
if: ${{ steps.release.outputs.pr }}
|
|
76
85
|
env:
|
|
77
|
-
|
|
86
|
+
RELEASE_PR: ${{ steps.release.outputs.pr }}
|
|
78
87
|
GH_TOKEN: ${{ steps.app-token.outputs.token || secrets.RELEASE_PLEASE_TOKEN || secrets.GITHUB_TOKEN }}
|
|
79
88
|
run: |
|
|
80
89
|
set -euo pipefail
|
|
90
|
+
RELEASE_BRANCH="$(jq -er '.headBranchName' <<<"$RELEASE_PR")"
|
|
81
91
|
git clone --branch "$RELEASE_BRANCH" --depth 1 \
|
|
82
92
|
"https://x-access-token:${GH_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" release-pr
|
|
83
93
|
cd release-pr
|
|
@@ -15,7 +15,7 @@ jobs:
|
|
|
15
15
|
steps:
|
|
16
16
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
17
17
|
|
|
18
|
-
- uses: astral-sh/setup-uv@
|
|
18
|
+
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
|
|
19
19
|
|
|
20
20
|
- name: Set up Python ${{ matrix.python-version }}
|
|
21
21
|
run: uv python install ${{ matrix.python-version }}
|
|
@@ -155,7 +155,7 @@ jobs:
|
|
|
155
155
|
steps:
|
|
156
156
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
157
157
|
|
|
158
|
-
- uses: astral-sh/setup-uv@
|
|
158
|
+
- uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
|
|
159
159
|
|
|
160
160
|
- name: Build package
|
|
161
161
|
run: uv build
|
|
@@ -52,7 +52,7 @@ jobs:
|
|
|
52
52
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
53
53
|
|
|
54
54
|
- name: Install uv
|
|
55
|
-
uses: astral-sh/setup-uv@
|
|
55
|
+
uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
|
|
56
56
|
|
|
57
57
|
- name: Install remo
|
|
58
58
|
run: uv sync
|
|
@@ -219,7 +219,7 @@ jobs:
|
|
|
219
219
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
220
220
|
|
|
221
221
|
- name: Install uv
|
|
222
|
-
uses: astral-sh/setup-uv@
|
|
222
|
+
uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
|
|
223
223
|
|
|
224
224
|
- name: Install remo
|
|
225
225
|
run: uv sync
|
|
@@ -338,7 +338,7 @@ jobs:
|
|
|
338
338
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
339
339
|
|
|
340
340
|
- name: Install uv
|
|
341
|
-
uses: astral-sh/setup-uv@
|
|
341
|
+
uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
|
|
342
342
|
|
|
343
343
|
- name: Install remo
|
|
344
344
|
run: uv sync
|
|
@@ -19,7 +19,7 @@ jobs:
|
|
|
19
19
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
20
20
|
|
|
21
21
|
- name: Install uv
|
|
22
|
-
uses: astral-sh/setup-uv@
|
|
22
|
+
uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
|
|
23
23
|
|
|
24
24
|
- name: Install Ansible and dependencies
|
|
25
25
|
run: |
|
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [4.3.2](https://github.com/get2knowio/remo/compare/v4.3.1...v4.3.2) (2026-08-05)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **ci:** stop release-please failing on every release ([#147](https://github.com/get2knowio/remo/issues/147)) ([1e78e8d](https://github.com/get2knowio/remo/commit/1e78e8dc65f36c8f8f143a7e9eb77dbd5749b69f))
|
|
9
|
+
|
|
10
|
+
## [4.3.1](https://github.com/get2knowio/remo/compare/v4.3.0...v4.3.1) (2026-08-05)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* three defects found while building `remo configure` ([#144](https://github.com/get2knowio/remo/issues/144)) ([608a914](https://github.com/get2knowio/remo/commit/608a9146560b9e1bf0e45811ce76a0c517dafa45))
|
|
16
|
+
|
|
3
17
|
## [4.3.0](https://github.com/get2knowio/remo/compare/v4.2.0...v4.3.0) (2026-08-05)
|
|
4
18
|
|
|
5
19
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: remo-cli
|
|
3
|
-
Version: 4.3.
|
|
3
|
+
Version: 4.3.2
|
|
4
4
|
Summary: Remote development environment CLI
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
License-File: LICENSE
|
|
@@ -327,6 +327,22 @@ remo configure mybox --skip docker # everything except Docker
|
|
|
327
327
|
remo web push # authorize the web service on it
|
|
328
328
|
```
|
|
329
329
|
|
|
330
|
+
#### Example: an OrbStack VM
|
|
331
|
+
|
|
332
|
+
[`docs/examples/orbstack-cloud-init.yaml`](docs/examples/orbstack-cloud-init.yaml)
|
|
333
|
+
prepares an [OrbStack](https://orbstack.dev) VM on a Mac so `remo add` and
|
|
334
|
+
`remo configure` work first time:
|
|
335
|
+
|
|
336
|
+
```bash
|
|
337
|
+
orb create ubuntu remo-mbp -c docs/examples/orbstack-cloud-init.yaml
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
It installs only what Ansible needs to connect and hand over — `remo configure`
|
|
341
|
+
does the rest. It deliberately creates no user: OrbStack already makes one named
|
|
342
|
+
after your macOS account holding UID 1000, and registering *that* user is what
|
|
343
|
+
puts `remo-host` in the home directory the web service logs into, while skipping
|
|
344
|
+
`user_setup`'s UID-1000 reassignment entirely.
|
|
345
|
+
|
|
330
346
|
`remo remove NAME [--yes]` deregisters an added host by deleting **only** the
|
|
331
347
|
local registry entry — it makes no connection to and no change on the remote
|
|
332
348
|
environment (unlike a provider `destroy`, which tears down infrastructure). It
|
|
@@ -301,6 +301,22 @@ remo configure mybox --skip docker # everything except Docker
|
|
|
301
301
|
remo web push # authorize the web service on it
|
|
302
302
|
```
|
|
303
303
|
|
|
304
|
+
#### Example: an OrbStack VM
|
|
305
|
+
|
|
306
|
+
[`docs/examples/orbstack-cloud-init.yaml`](docs/examples/orbstack-cloud-init.yaml)
|
|
307
|
+
prepares an [OrbStack](https://orbstack.dev) VM on a Mac so `remo add` and
|
|
308
|
+
`remo configure` work first time:
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
orb create ubuntu remo-mbp -c docs/examples/orbstack-cloud-init.yaml
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
It installs only what Ansible needs to connect and hand over — `remo configure`
|
|
315
|
+
does the rest. It deliberately creates no user: OrbStack already makes one named
|
|
316
|
+
after your macOS account holding UID 1000, and registering *that* user is what
|
|
317
|
+
puts `remo-host` in the home directory the web service logs into, while skipping
|
|
318
|
+
`user_setup`'s UID-1000 reassignment entirely.
|
|
319
|
+
|
|
304
320
|
`remo remove NAME [--yes]` deregisters an added host by deleting **only** the
|
|
305
321
|
local registry entry — it makes no connection to and no change on the remote
|
|
306
322
|
environment (unlike a provider `destroy`, which tears down infrastructure). It
|
|
@@ -243,11 +243,25 @@
|
|
|
243
243
|
- user_setup_cloud_keys.content | default('') | length > 0
|
|
244
244
|
# --- end cloud-injected key bootstrap --------------------------------------
|
|
245
245
|
|
|
246
|
+
# The docker group only exists if the `docker` role ran. Skipping that role
|
|
247
|
+
# (`--skip docker`, or `configure_docker=false`) previously made the next task
|
|
248
|
+
# fail outright with "Group docker does not exist", taking the whole configure
|
|
249
|
+
# down after it had already changed the host — so `--skip docker` was, in
|
|
250
|
+
# effect, not a supported option on any provider. Gate on the group rather than
|
|
251
|
+
# on `configure_docker` so a host where Docker was installed by other means
|
|
252
|
+
# (or by an earlier run) still gets the membership.
|
|
253
|
+
- name: Check whether a docker group exists
|
|
254
|
+
ansible.builtin.command: getent group docker
|
|
255
|
+
register: user_setup_docker_group
|
|
256
|
+
changed_when: false
|
|
257
|
+
failed_when: false
|
|
258
|
+
|
|
246
259
|
- name: Add remo user to docker group
|
|
247
260
|
ansible.builtin.user:
|
|
248
261
|
name: "{{ remo_user }}"
|
|
249
262
|
groups: docker
|
|
250
263
|
append: true
|
|
264
|
+
when: user_setup_docker_group.rc | default(1) == 0
|
|
251
265
|
|
|
252
266
|
- name: Configure passwordless sudo for remo user
|
|
253
267
|
ansible.builtin.lineinfile:
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#cloud-config
|
|
2
|
+
#
|
|
3
|
+
# OrbStack VM prepared for `remo add` + `remo configure` (remo >= 4.3.0).
|
|
4
|
+
#
|
|
5
|
+
# orb create ubuntu remo-mbp -c orbstack-remo-cloud-init.yaml
|
|
6
|
+
#
|
|
7
|
+
# Deliberately minimal: this installs ONLY what Ansible needs in order to
|
|
8
|
+
# connect and take over. Docker, Node.js, zellij, fzf, the GitHub CLI, the
|
|
9
|
+
# devcontainers CLI and remo-host are all installed by `remo configure`, which
|
|
10
|
+
# is idempotent — duplicating any of that here would only drift.
|
|
11
|
+
#
|
|
12
|
+
# It also does NOT create a user. OrbStack already creates one named after your
|
|
13
|
+
# macOS account, holding UID 1000 with passwordless sudo. `remo configure`
|
|
14
|
+
# binds its workspace account to whichever user you register, so registering
|
|
15
|
+
# that existing user means:
|
|
16
|
+
# * remo-host lands in the home directory discovery actually logs into, and
|
|
17
|
+
# * user_setup's UID-1000 reassignment (which rewrites /etc/passwd and drops
|
|
18
|
+
# the live SSH session) is skipped entirely, because the holder of UID 1000
|
|
19
|
+
# is already the account being configured.
|
|
20
|
+
# Creating a separate `remo` user here would forfeit both.
|
|
21
|
+
|
|
22
|
+
# ---------------------------------------------------------------------------
|
|
23
|
+
# EDIT THIS: the public key of the workstation that will run `remo`.
|
|
24
|
+
# ---------------------------------------------------------------------------
|
|
25
|
+
# If remo runs on this same Mac, that is ~/.ssh/id_ed25519.pub.
|
|
26
|
+
# Leave the placeholder in place and cloud-init keeps password auth enabled
|
|
27
|
+
# rather than locking you out (see the guard in runcmd).
|
|
28
|
+
ssh_authorized_keys:
|
|
29
|
+
- ssh-ed25519 AAAA_REPLACE_WITH_YOUR_PUBLIC_KEY workstation
|
|
30
|
+
|
|
31
|
+
package_update: true
|
|
32
|
+
packages:
|
|
33
|
+
# Ansible needs a Python 3 interpreter on the target. ssh_configure.yml
|
|
34
|
+
# probes for it with `raw` and fails with an actionable message if absent,
|
|
35
|
+
# but there is no reason to make you see that message.
|
|
36
|
+
- python3
|
|
37
|
+
# hwclock. `community.general.timezone` — the first task in remo's shared
|
|
38
|
+
# role list — hard-fails with 'Failed to find required executable "hwclock"'
|
|
39
|
+
# without it, and on Ubuntu 24.04 it lives in util-linux-extra, which minimal
|
|
40
|
+
# images do not install. Found the hard way while testing this feature.
|
|
41
|
+
- util-linux-extra
|
|
42
|
+
- openssh-server
|
|
43
|
+
# remo's configure play installs rsync itself, but having it up front means
|
|
44
|
+
# `remo cp` works the moment the host is registered.
|
|
45
|
+
- rsync
|
|
46
|
+
|
|
47
|
+
# ---------------------------------------------------------------------------
|
|
48
|
+
# SSH port
|
|
49
|
+
# ---------------------------------------------------------------------------
|
|
50
|
+
# 22 is right when remo runs on this Mac: the VM gets its own IP that macOS can
|
|
51
|
+
# reach directly, so nothing needs forwarding.
|
|
52
|
+
#
|
|
53
|
+
# Change it if you are reaching this VM from somewhere else (e.g. your homelab
|
|
54
|
+
# box) via a forwarded port — remo stores the port per host and threads it
|
|
55
|
+
# through `remo shell`, `remo configure` and `remo web push`. Register it with
|
|
56
|
+
# remo add mbp <user>@<host>:<port>
|
|
57
|
+
# Note this is NOT OrbStack's own SSH (127.0.0.1:32222, Mac-local only); this
|
|
58
|
+
# is a normal sshd inside the VM, which is what remo drives.
|
|
59
|
+
write_files:
|
|
60
|
+
- path: /etc/ssh/sshd_config.d/10-remo.conf
|
|
61
|
+
permissions: '0644'
|
|
62
|
+
content: |
|
|
63
|
+
# Managed by cloud-init for remo. Ubuntu's sshd_config Includes this dir.
|
|
64
|
+
Port 22
|
|
65
|
+
PubkeyAuthentication yes
|
|
66
|
+
|
|
67
|
+
runcmd:
|
|
68
|
+
# Put the key on the UID-1000 account explicitly. `ssh_authorized_keys` above
|
|
69
|
+
# targets cloud-init's notion of the default user, which is not guaranteed to
|
|
70
|
+
# be the user OrbStack created — this makes it deterministic either way.
|
|
71
|
+
- |
|
|
72
|
+
set -eu
|
|
73
|
+
KEY='ssh-ed25519 AAAA_REPLACE_WITH_YOUR_PUBLIC_KEY workstation'
|
|
74
|
+
USER_1000="$(getent passwd 1000 | cut -d: -f1)"
|
|
75
|
+
if [ -z "$USER_1000" ]; then
|
|
76
|
+
echo "remo-cloud-init: no UID 1000 account; skipping key install" >&2
|
|
77
|
+
exit 0
|
|
78
|
+
fi
|
|
79
|
+
HOME_1000="$(getent passwd 1000 | cut -d: -f6)"
|
|
80
|
+
install -d -m 700 -o "$USER_1000" -g "$USER_1000" "$HOME_1000/.ssh"
|
|
81
|
+
touch "$HOME_1000/.ssh/authorized_keys"
|
|
82
|
+
case "$KEY" in
|
|
83
|
+
*REPLACE_WITH_YOUR_PUBLIC_KEY*)
|
|
84
|
+
# Refuse to harden SSH when no real key was supplied — disabling
|
|
85
|
+
# password auth here would leave the VM unreachable over SSH.
|
|
86
|
+
echo "remo-cloud-init: placeholder key not replaced; leaving password auth as-is" >&2
|
|
87
|
+
;;
|
|
88
|
+
*)
|
|
89
|
+
grep -qxF "$KEY" "$HOME_1000/.ssh/authorized_keys" \
|
|
90
|
+
|| echo "$KEY" >> "$HOME_1000/.ssh/authorized_keys"
|
|
91
|
+
echo 'PasswordAuthentication no' > /etc/ssh/sshd_config.d/20-remo-hardening.conf
|
|
92
|
+
;;
|
|
93
|
+
esac
|
|
94
|
+
chown -R "$USER_1000:$USER_1000" "$HOME_1000/.ssh"
|
|
95
|
+
chmod 600 "$HOME_1000/.ssh/authorized_keys"
|
|
96
|
+
|
|
97
|
+
# Passwordless sudo: OrbStack already grants it, but an explicit drop-in
|
|
98
|
+
# makes this file work on a plain cloud image too. remo needs it — the
|
|
99
|
+
# configure play installs packages and system services, and probes for it
|
|
100
|
+
# up front rather than failing halfway through.
|
|
101
|
+
- |
|
|
102
|
+
set -eu
|
|
103
|
+
USER_1000="$(getent passwd 1000 | cut -d: -f1)"
|
|
104
|
+
[ -n "$USER_1000" ] || exit 0
|
|
105
|
+
echo "$USER_1000 ALL=(ALL) NOPASSWD:ALL" > "/etc/sudoers.d/90-remo-$USER_1000"
|
|
106
|
+
chmod 440 "/etc/sudoers.d/90-remo-$USER_1000"
|
|
107
|
+
|
|
108
|
+
- systemctl enable --now ssh
|
|
109
|
+
- systemctl restart ssh
|
|
110
|
+
|
|
111
|
+
final_message: |
|
|
112
|
+
remo-ready after $UPTIME seconds.
|
|
113
|
+
|
|
114
|
+
From the workstation running remo:
|
|
115
|
+
remo add mbp <user>@<this-vm-ip> --verify # add :PORT if you changed it
|
|
116
|
+
remo configure mbp
|
|
117
|
+
remo web push # if you use the web console
|
|
118
|
+
|
|
119
|
+
Do not pass `--skip docker` to configure: the shared role list adds the user
|
|
120
|
+
to the docker group, which only exists if the docker role ran.
|
|
@@ -1177,9 +1177,9 @@
|
|
|
1177
1177
|
"license": "MIT"
|
|
1178
1178
|
},
|
|
1179
1179
|
"node_modules/@redocly/openapi-core": {
|
|
1180
|
-
"version": "1.34.
|
|
1181
|
-
"resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.
|
|
1182
|
-
"integrity": "sha512-
|
|
1180
|
+
"version": "1.34.18",
|
|
1181
|
+
"resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.18.tgz",
|
|
1182
|
+
"integrity": "sha512-UyKIm0wTPw5BcY7Z2PkbK1Ma260um96LSBWXHrdSMe+ZV0EPMyDfAcUcjjm3qEiGST9OK/1TriekdPCZkn4Q3A==",
|
|
1183
1183
|
"dev": true,
|
|
1184
1184
|
"license": "MIT",
|
|
1185
1185
|
"dependencies": {
|
|
@@ -1188,7 +1188,7 @@
|
|
|
1188
1188
|
"colorette": "1.4.0",
|
|
1189
1189
|
"https-proxy-agent": "7.0.6",
|
|
1190
1190
|
"js-levenshtein": "1.1.6",
|
|
1191
|
-
"js-yaml": "4.
|
|
1191
|
+
"js-yaml": "4.3.0",
|
|
1192
1192
|
"minimatch": "5.1.9",
|
|
1193
1193
|
"pluralize": "8.0.0",
|
|
1194
1194
|
"yaml-ast-parser": "0.0.43"
|
|
@@ -1206,9 +1206,9 @@
|
|
|
1206
1206
|
"license": "MIT"
|
|
1207
1207
|
},
|
|
1208
1208
|
"node_modules/@redocly/openapi-core/node_modules/brace-expansion": {
|
|
1209
|
-
"version": "2.1.
|
|
1210
|
-
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.
|
|
1211
|
-
"integrity": "sha512-
|
|
1209
|
+
"version": "2.1.4",
|
|
1210
|
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz",
|
|
1211
|
+
"integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==",
|
|
1212
1212
|
"dev": true,
|
|
1213
1213
|
"license": "MIT",
|
|
1214
1214
|
"dependencies": {
|
|
@@ -2106,16 +2106,16 @@
|
|
|
2106
2106
|
}
|
|
2107
2107
|
},
|
|
2108
2108
|
"node_modules/brace-expansion": {
|
|
2109
|
-
"version": "5.0.
|
|
2110
|
-
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.
|
|
2111
|
-
"integrity": "sha512-
|
|
2109
|
+
"version": "5.0.9",
|
|
2110
|
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz",
|
|
2111
|
+
"integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==",
|
|
2112
2112
|
"dev": true,
|
|
2113
2113
|
"license": "MIT",
|
|
2114
2114
|
"dependencies": {
|
|
2115
2115
|
"balanced-match": "^4.0.2"
|
|
2116
2116
|
},
|
|
2117
2117
|
"engines": {
|
|
2118
|
-
"node": "
|
|
2118
|
+
"node": "20 || >=22"
|
|
2119
2119
|
}
|
|
2120
2120
|
},
|
|
2121
2121
|
"node_modules/browserslist": {
|
|
@@ -2604,9 +2604,9 @@
|
|
|
2604
2604
|
"license": "MIT"
|
|
2605
2605
|
},
|
|
2606
2606
|
"node_modules/glob/node_modules/brace-expansion": {
|
|
2607
|
-
"version": "2.1.
|
|
2608
|
-
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.
|
|
2609
|
-
"integrity": "sha512-
|
|
2607
|
+
"version": "2.1.4",
|
|
2608
|
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz",
|
|
2609
|
+
"integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==",
|
|
2610
2610
|
"dev": true,
|
|
2611
2611
|
"license": "MIT",
|
|
2612
2612
|
"dependencies": {
|
|
@@ -2813,9 +2813,9 @@
|
|
|
2813
2813
|
"license": "MIT"
|
|
2814
2814
|
},
|
|
2815
2815
|
"node_modules/js-yaml": {
|
|
2816
|
-
"version": "4.
|
|
2817
|
-
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.
|
|
2818
|
-
"integrity": "sha512-
|
|
2816
|
+
"version": "4.3.0",
|
|
2817
|
+
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz",
|
|
2818
|
+
"integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==",
|
|
2819
2819
|
"dev": true,
|
|
2820
2820
|
"funding": [
|
|
2821
2821
|
{
|
|
@@ -3274,9 +3274,9 @@
|
|
|
3274
3274
|
}
|
|
3275
3275
|
},
|
|
3276
3276
|
"node_modules/postcss": {
|
|
3277
|
-
"version": "8.5.
|
|
3278
|
-
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.
|
|
3279
|
-
"integrity": "sha512-
|
|
3277
|
+
"version": "8.5.25",
|
|
3278
|
+
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz",
|
|
3279
|
+
"integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==",
|
|
3280
3280
|
"dev": true,
|
|
3281
3281
|
"funding": [
|
|
3282
3282
|
{
|
|
@@ -3294,7 +3294,7 @@
|
|
|
3294
3294
|
],
|
|
3295
3295
|
"license": "MIT",
|
|
3296
3296
|
"dependencies": {
|
|
3297
|
-
"nanoid": "^3.3.
|
|
3297
|
+
"nanoid": "^3.3.16",
|
|
3298
3298
|
"picocolors": "^1.1.1",
|
|
3299
3299
|
"source-map-js": "^1.2.1"
|
|
3300
3300
|
},
|
|
@@ -3823,9 +3823,9 @@
|
|
|
3823
3823
|
}
|
|
3824
3824
|
},
|
|
3825
3825
|
"node_modules/undici": {
|
|
3826
|
-
"version": "7.
|
|
3827
|
-
"resolved": "https://registry.npmjs.org/undici/-/undici-7.
|
|
3828
|
-
"integrity": "sha512-
|
|
3826
|
+
"version": "7.29.0",
|
|
3827
|
+
"resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz",
|
|
3828
|
+
"integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==",
|
|
3829
3829
|
"dev": true,
|
|
3830
3830
|
"license": "MIT",
|
|
3831
3831
|
"engines": {
|
|
@@ -76,6 +76,7 @@ def build_ssh_opts(
|
|
|
76
76
|
control_dir: str | None = None,
|
|
77
77
|
identity_file: str | None = None,
|
|
78
78
|
known_hosts_file: str | None = None,
|
|
79
|
+
use_registry_identity: bool = True,
|
|
79
80
|
) -> tuple[list[str], str]:
|
|
80
81
|
"""Build SSH option flags and target string for the given host.
|
|
81
82
|
|
|
@@ -98,6 +99,15 @@ def build_ssh_opts(
|
|
|
98
99
|
to ambient ``~/.ssh`` identities or agent keys (adopted-mode web
|
|
99
100
|
service identity, R6). ``None`` (the default) emits nothing, leaving
|
|
100
101
|
the argv byte-identical to before this parameter existed.
|
|
102
|
+
use_registry_identity:
|
|
103
|
+
When ``True`` (the default) and *identity_file* is ``None``, fall back
|
|
104
|
+
to an added host's stored ``ssh_identity``. Set ``False`` when the
|
|
105
|
+
caller cannot assume that path resolves in *its* filesystem — the
|
|
106
|
+
registry records a **workstation** path, so the web service running in
|
|
107
|
+
a container may not have it. Emitting it anyway is not a harmless
|
|
108
|
+
no-op: it comes with ``IdentitiesOnly=yes``, which suppresses every
|
|
109
|
+
key that *would* have worked, turning a missing file into a guaranteed
|
|
110
|
+
auth failure.
|
|
101
111
|
known_hosts_file:
|
|
102
112
|
When set, emit ``-o UserKnownHostsFile=<path>``. ``None`` (the
|
|
103
113
|
default) emits nothing. For SSM hosts the access-mode block's
|
|
@@ -152,7 +162,9 @@ def build_ssh_opts(
|
|
|
152
162
|
# wins; otherwise an added (ssh-type) host's stored identity is used
|
|
153
163
|
# (``ssh_identity`` is None for every other type, so their argv is unchanged).
|
|
154
164
|
# ------------------------------------------------------------------
|
|
155
|
-
effective_identity = identity_file
|
|
165
|
+
effective_identity = identity_file
|
|
166
|
+
if effective_identity is None and use_registry_identity:
|
|
167
|
+
effective_identity = host.ssh_identity
|
|
156
168
|
if effective_identity is not None:
|
|
157
169
|
ssh_opts += [
|
|
158
170
|
"-o", f"IdentityFile={effective_identity}",
|
|
@@ -180,6 +192,7 @@ def build_ssh_base_cmd(
|
|
|
180
192
|
control_dir: str | None = None,
|
|
181
193
|
identity_file: str | None = None,
|
|
182
194
|
known_hosts_file: str | None = None,
|
|
195
|
+
use_registry_identity: bool = True,
|
|
183
196
|
extra_opts: list[str] | None = None,
|
|
184
197
|
) -> list[str]:
|
|
185
198
|
"""Build the full ``ssh`` argv for connecting to *host*.
|
|
@@ -213,6 +226,9 @@ def build_ssh_base_cmd(
|
|
|
213
226
|
Forwarded to :func:`build_ssh_opts` — emits ``-o
|
|
214
227
|
UserKnownHostsFile=<path>`` when set; ``None`` (the default) leaves
|
|
215
228
|
the argv unchanged.
|
|
229
|
+
use_registry_identity:
|
|
230
|
+
Forwarded to :func:`build_ssh_opts`. Leave ``True`` on the CLI, whose
|
|
231
|
+
filesystem is the one the registry path was recorded against.
|
|
216
232
|
extra_opts:
|
|
217
233
|
Extra argv elements inserted after *ssh_opts* but before the
|
|
218
234
|
``-tt``/target elements — e.g. ``["-L", "8080:localhost:8080"]``
|
|
@@ -233,6 +249,7 @@ def build_ssh_base_cmd(
|
|
|
233
249
|
control_dir=control_dir,
|
|
234
250
|
identity_file=identity_file,
|
|
235
251
|
known_hosts_file=known_hosts_file,
|
|
252
|
+
use_registry_identity=use_registry_identity,
|
|
236
253
|
)
|
|
237
254
|
|
|
238
255
|
cmd: list[str] = ["ssh"] + ssh_opts
|
|
@@ -126,6 +126,22 @@ class KnownHost:
|
|
|
126
126
|
return self.region
|
|
127
127
|
return None
|
|
128
128
|
|
|
129
|
+
@property
|
|
130
|
+
def display_region(self) -> str:
|
|
131
|
+
"""``region`` when it really is a region, ``""`` when the slot is reused.
|
|
132
|
+
|
|
133
|
+
For an added (``ssh``-type) host the slot holds the operator's *private
|
|
134
|
+
key path*, so anything that surfaces ``region`` as a label — the web
|
|
135
|
+
service's discovery snapshot, which the console renders as a badge —
|
|
136
|
+
was publishing that path to every viewer of the console. Blanking it
|
|
137
|
+
here fixes it for every consumer at once rather than at one call site.
|
|
138
|
+
|
|
139
|
+
Proxmox reuses the same slot for the node login, which is mislabeled as
|
|
140
|
+
a "region" but is neither secret nor new; it is left alone deliberately
|
|
141
|
+
so this fix does not silently change what Proxmox users see.
|
|
142
|
+
"""
|
|
143
|
+
return "" if self.type == "ssh" else (self.region or "")
|
|
144
|
+
|
|
129
145
|
# ------------------------------------------------------------------
|
|
130
146
|
# Display
|
|
131
147
|
# ------------------------------------------------------------------
|
|
@@ -273,7 +273,10 @@ def _instance_check(host: KnownHost, settings: WebSettings) -> CheckResult:
|
|
|
273
273
|
ssh_argv_prefix = build_ssh_base_cmd(
|
|
274
274
|
host,
|
|
275
275
|
control_dir=settings.ssh_control_dir,
|
|
276
|
-
identity_file=settings.
|
|
276
|
+
identity_file=settings.ssh_identity_for(host),
|
|
277
|
+
# The service must not inherit a WORKSTATION key path from the
|
|
278
|
+
# registry; ssh_identity_for() decides, and only when usable here.
|
|
279
|
+
use_registry_identity=False,
|
|
277
280
|
known_hosts_file=settings.ssh_known_hosts_file,
|
|
278
281
|
)
|
|
279
282
|
|
|
@@ -7,6 +7,7 @@ from dataclasses import dataclass, field
|
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
|
|
9
9
|
from remo_cli.core.config import get_remo_home_readonly
|
|
10
|
+
from remo_cli.models.host import KnownHost
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
class WebConfigError(ValueError):
|
|
@@ -225,6 +226,30 @@ class WebSettings:
|
|
|
225
226
|
return str(self.service_private_key_path)
|
|
226
227
|
return None
|
|
227
228
|
|
|
229
|
+
def ssh_identity_for(self, host: KnownHost) -> str | None:
|
|
230
|
+
"""The identity *this service* should use to reach *host*.
|
|
231
|
+
|
|
232
|
+
In adopted mode that is always the service's own key — the one
|
|
233
|
+
``remo web push`` authorized. Otherwise (mounted/unconfigured/broken)
|
|
234
|
+
fall back to an added host's registry identity, but **only when the
|
|
235
|
+
path resolves here**.
|
|
236
|
+
|
|
237
|
+
That guard is the fix for a real failure: the registry records a
|
|
238
|
+
*workstation* path (``/home/you/.ssh/key``), which a containerized
|
|
239
|
+
service generally does not have. Passing it anyway is not a harmless
|
|
240
|
+
no-op — :func:`~remo_cli.core.ssh.build_ssh_opts` pairs an identity
|
|
241
|
+
with ``IdentitiesOnly=yes``, which suppresses every key that *would*
|
|
242
|
+
have worked, so a missing file turns into a guaranteed auth failure.
|
|
243
|
+
Falling back to the mounted ``~/.ssh`` is both safer and what the
|
|
244
|
+
operator expects in mounted mode.
|
|
245
|
+
"""
|
|
246
|
+
if self._service_identity_active():
|
|
247
|
+
return str(self.service_private_key_path)
|
|
248
|
+
identity = host.ssh_identity
|
|
249
|
+
if identity and Path(identity).expanduser().is_file():
|
|
250
|
+
return identity
|
|
251
|
+
return None
|
|
252
|
+
|
|
228
253
|
@property
|
|
229
254
|
def ssh_known_hosts_file(self) -> str | None:
|
|
230
255
|
if self._service_identity_active():
|