remo-cli 1.0.1__tar.gz → 1.0.3__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-1.0.1 → remo_cli-1.0.3}/PKG-INFO +1 -1
- {remo_cli-1.0.1 → remo_cli-1.0.3}/pyproject.toml +1 -1
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/cli/main.py +18 -1
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/cli/shell.py +13 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/unit/cli/test_main.py +39 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/unit/cli/test_shell.py +18 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/uv.lock +1 -1
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.claude/commands/speckit.analyze.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.claude/commands/speckit.checklist.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.claude/commands/speckit.clarify.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.claude/commands/speckit.constitution.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.claude/commands/speckit.implement.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.claude/commands/speckit.plan.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.claude/commands/speckit.specify.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.claude/commands/speckit.tasks.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.claude/commands/speckit.taskstoissues.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.devcontainer/devcontainer.json +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.dockerignore +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.github/dependabot.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.github/workflows/ci.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.github/workflows/provision.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.github/workflows/release.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.github/workflows/smoke-test-cleanup.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.github/workflows/smoke-test.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.github/workflows/teardown.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.gitignore +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.maverick/checkpoints/feature/implementation_complete.json +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.maverick/checkpoints/feature/phase_${{ index }}_complete.json +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.maverick/checkpoints/feature/validation_complete.json +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.specify/memory/constitution.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.specify/scripts/bash/check-prerequisites.sh +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.specify/scripts/bash/common.sh +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.specify/scripts/bash/create-new-feature.sh +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.specify/scripts/bash/setup-plan.sh +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.specify/scripts/bash/update-agent-context.sh +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.specify/templates/agent-file-template.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.specify/templates/checklist-template.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.specify/templates/plan-template.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.specify/templates/spec-template.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/.specify/templates/tasks-template.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/CLAUDE.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/CONTRIBUTING.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/Dockerfile +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/LICENSE +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/README.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/.ansible-lint +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/README.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/ansible.cfg +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/aws_configure.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/aws_resize.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/aws_site.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/aws_teardown.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/group_vars/all.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/group_vars/incus_containers.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/group_vars/proxmox_containers.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/hetzner_configure.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/hetzner_provision.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/hetzner_resize.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/hetzner_site.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/hetzner_teardown.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/incus_bootstrap.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/incus_configure.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/incus_provision.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/incus_resize.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/incus_site.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/incus_teardown.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/inventory/hosts.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/inventory/incus_containers.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/proxmox_bootstrap.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/proxmox_configure.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/proxmox_provision.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/proxmox_resize.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/proxmox_site.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/proxmox_teardown.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/requirements.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/aws_server/defaults/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/aws_server/tasks/ebs.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/aws_server/tasks/ec2.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/aws_server/tasks/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/aws_server/tasks/patch_manager.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/aws_server/tasks/preflight.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/aws_server/tasks/security_group.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/devcontainers/tasks/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/docker/handlers/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/docker/tasks/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/fzf/tasks/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/github_cli/tasks/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/hetzner_server/defaults/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/hetzner_server/tasks/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/incus_bootstrap/defaults/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/incus_bootstrap/handlers/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/incus_bootstrap/tasks/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/incus_container/defaults/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/incus_container/handlers/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/incus_container/meta/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/incus_container/tasks/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/incus_container/tasks/preflight.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/incus_container_teardown/defaults/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/incus_container_teardown/meta/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/incus_container_teardown/tasks/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/nodejs/defaults/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/nodejs/tasks/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/proxmox_bootstrap/defaults/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/proxmox_bootstrap/meta/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/proxmox_bootstrap/tasks/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/proxmox_container/defaults/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/proxmox_container/handlers/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/proxmox_container/meta/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/proxmox_container/tasks/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/proxmox_container/tasks/preflight.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/proxmox_container_teardown/defaults/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/proxmox_container_teardown/meta/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/proxmox_container_teardown/tasks/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/user_setup/defaults/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/user_setup/tasks/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/user_setup/templates/devshell.sh.j2 +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/user_setup/templates/project-menu.sh.j2 +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/zellij/defaults/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/zellij/tasks/main.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/zellij/templates/config.kdl.j2 +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/zellij/templates/layouts/minimal.kdl.j2 +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/tasks/configure_dev_tools.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/docs/aws.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/docs/hetzner.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/docs/incus.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/docs/install.sh +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/docs/proxmox.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/install.sh +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/maverick.yaml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/project-menu.sh +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/remo +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/run.sh +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/scripts/setup-aws-oidc.sh +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/checklists/requirements.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/checklists/validation.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/contracts/playbook-interface.yaml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/contracts/role-interface.yaml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/data-model.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/plan.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/quickstart.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/research.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/spec.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/tasks.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/002-incus-container-support/checklists/requirements.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/002-incus-container-support/contracts/playbook-interface.yaml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/002-incus-container-support/contracts/role-interface.yaml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/002-incus-container-support/data-model.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/002-incus-container-support/plan.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/002-incus-container-support/quickstart.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/002-incus-container-support/research.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/002-incus-container-support/spec.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/002-incus-container-support/tasks.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/003-python-cli-rewrite/checklists/requirements.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/003-python-cli-rewrite/data-model.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/003-python-cli-rewrite/plan.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/003-python-cli-rewrite/quickstart.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/003-python-cli-rewrite/research.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/003-python-cli-rewrite/spec.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/003-python-cli-rewrite/tasks.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/specs/004-proxmox-container-support/spec.md +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/__init__.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/__main__.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/cli/__init__.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/cli/cp.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/cli/providers/__init__.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/cli/providers/aws.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/cli/providers/hetzner.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/cli/providers/incus.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/cli/providers/proxmox.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/core/__init__.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/core/ansible_runner.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/core/completion.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/core/config.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/core/known_hosts.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/core/output.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/core/picker.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/core/rsync.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/core/ssh.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/core/validation.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/core/version.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/models/__init__.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/models/host.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/providers/__init__.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/providers/aws.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/providers/hetzner.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/providers/incus.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/src/remo_cli/providers/proxmox.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/__init__.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/conftest.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/integration/__init__.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/integration/orbstack-cloud-init.yml +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/integration/orbstack.sh +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/unit/__init__.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/unit/cli/__init__.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/unit/cli/test_cp.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/unit/core/__init__.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/unit/core/test_ansible_runner.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/unit/core/test_config.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/unit/core/test_known_hosts.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/unit/core/test_output.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/unit/core/test_picker.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/unit/core/test_rsync.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/unit/core/test_ssh.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/unit/core/test_validation.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/unit/core/test_version.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/unit/providers/__init__.py +0 -0
- {remo_cli-1.0.1 → remo_cli-1.0.3}/tests/unit/test_host_model.py +0 -0
|
@@ -53,7 +53,24 @@ def completion(shell: str) -> None:
|
|
|
53
53
|
|
|
54
54
|
ctx = click.get_current_context()
|
|
55
55
|
instance = completer_cls(ctx.find_root().command, {}, "remo", "_REMO_COMPLETE")
|
|
56
|
-
|
|
56
|
+
source = instance.source()
|
|
57
|
+
|
|
58
|
+
if shell == "fish":
|
|
59
|
+
# Click's completion handler emits a bare newline when there are no
|
|
60
|
+
# matches (e.g., `remo upd<TAB>` — no such command). Some fish versions
|
|
61
|
+
# then iterate the for-loop once with an empty $completion, and
|
|
62
|
+
# `string split "," ""` errors out. Guard the loop body so empty
|
|
63
|
+
# candidates are skipped.
|
|
64
|
+
source = source.replace(
|
|
65
|
+
"for completion in $response;\n set -l metadata",
|
|
66
|
+
"for completion in $response;\n"
|
|
67
|
+
" if test -z \"$completion\";\n"
|
|
68
|
+
" continue;\n"
|
|
69
|
+
" end;\n"
|
|
70
|
+
" set -l metadata",
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
click.echo(source)
|
|
57
74
|
|
|
58
75
|
|
|
59
76
|
def _register_commands() -> None:
|
|
@@ -93,3 +93,16 @@ def _run_provider_update(host) -> None: # noqa: ANN001
|
|
|
93
93
|
# Incus name in known_hosts is "host/container" — extract just the container name
|
|
94
94
|
container_name = host.name.split("/", maxsplit=1)[-1] if "/" in host.name else host.name
|
|
95
95
|
incus_update(name=container_name)
|
|
96
|
+
elif host.type == "proxmox":
|
|
97
|
+
from remo_cli.providers.proxmox import update as proxmox_update # noqa: PLC0415
|
|
98
|
+
# Proxmox name in known_hosts is "node/container".
|
|
99
|
+
# The proxmox SSH user is stored in the region slot (see providers.proxmox.create).
|
|
100
|
+
proxmox_host, _, container_name = host.name.partition("/")
|
|
101
|
+
if not container_name:
|
|
102
|
+
container_name = host.name
|
|
103
|
+
proxmox_host = ""
|
|
104
|
+
proxmox_update(
|
|
105
|
+
name=container_name,
|
|
106
|
+
host=proxmox_host,
|
|
107
|
+
user=host.region or "",
|
|
108
|
+
)
|
|
@@ -170,3 +170,42 @@ class TestIncusGroup:
|
|
|
170
170
|
expected = ["create", "destroy", "update", "list", "sync", "bootstrap"]
|
|
171
171
|
for name in expected:
|
|
172
172
|
assert name in result.output, f"Incus subcommand '{name}' missing from help output"
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
# ---------------------------------------------------------------------------
|
|
176
|
+
# remo completion <shell>
|
|
177
|
+
# ---------------------------------------------------------------------------
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class TestCompletionCommand:
|
|
181
|
+
"""Verify ``remo completion <shell>`` emits a usable activation script."""
|
|
182
|
+
|
|
183
|
+
def test_fish_completion_emits_script(self):
|
|
184
|
+
result = _invoke("completion", "fish")
|
|
185
|
+
assert result.exit_code == 0
|
|
186
|
+
assert "function _remo_completion" in result.output
|
|
187
|
+
|
|
188
|
+
def test_fish_completion_skips_empty_candidates(self):
|
|
189
|
+
"""Click emits a bare newline when no completions match (e.g.,
|
|
190
|
+
`remo upd<TAB>`). Some fish versions iterate the for-loop once with
|
|
191
|
+
an empty $completion, which then breaks `string split "," ""`. The
|
|
192
|
+
emitted script must guard against this.
|
|
193
|
+
"""
|
|
194
|
+
result = _invoke("completion", "fish")
|
|
195
|
+
assert result.exit_code == 0
|
|
196
|
+
assert 'if test -z "$completion"' in result.output
|
|
197
|
+
# Sanity: the guard sits *inside* the for-loop, before string split
|
|
198
|
+
loop_idx = result.output.index("for completion in $response;")
|
|
199
|
+
guard_idx = result.output.index('if test -z "$completion"')
|
|
200
|
+
split_idx = result.output.index('set -l metadata (string split')
|
|
201
|
+
assert loop_idx < guard_idx < split_idx
|
|
202
|
+
|
|
203
|
+
def test_bash_completion_emits_script(self):
|
|
204
|
+
result = _invoke("completion", "bash")
|
|
205
|
+
assert result.exit_code == 0
|
|
206
|
+
assert "_remo_completion" in result.output
|
|
207
|
+
|
|
208
|
+
def test_zsh_completion_emits_script(self):
|
|
209
|
+
result = _invoke("completion", "zsh")
|
|
210
|
+
assert result.exit_code == 0
|
|
211
|
+
assert "_remo_completion" in result.output
|
|
@@ -158,3 +158,21 @@ class TestRunProviderUpdate:
|
|
|
158
158
|
_run_provider_update(host)
|
|
159
159
|
|
|
160
160
|
mock_update.assert_called_once_with(name="devcontainer")
|
|
161
|
+
|
|
162
|
+
def test_proxmox_update_extracts_node_and_container(self, mocker):
|
|
163
|
+
from remo_cli.cli.shell import _run_provider_update
|
|
164
|
+
|
|
165
|
+
host = KnownHost(
|
|
166
|
+
type="proxmox",
|
|
167
|
+
name="lab1/dev1",
|
|
168
|
+
host="192.168.1.46",
|
|
169
|
+
user="remo",
|
|
170
|
+
instance_id="100",
|
|
171
|
+
access_mode="direct",
|
|
172
|
+
region="root",
|
|
173
|
+
)
|
|
174
|
+
mock_update = mocker.patch("remo_cli.providers.proxmox.update", return_value=0)
|
|
175
|
+
|
|
176
|
+
_run_provider_update(host)
|
|
177
|
+
|
|
178
|
+
mock_update.assert_called_once_with(name="dev1", host="lab1", user="root")
|
|
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
|
{remo_cli-1.0.1 → remo_cli-1.0.3}/.maverick/checkpoints/feature/implementation_complete.json
RENAMED
|
File without changes
|
{remo_cli-1.0.1 → remo_cli-1.0.3}/.maverick/checkpoints/feature/phase_${{ index }}_complete.json
RENAMED
|
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
|
|
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
|
|
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
|
{remo_cli-1.0.1 → remo_cli-1.0.3}/ansible/roles/proxmox_container_teardown/defaults/main.yml
RENAMED
|
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
|
{remo_cli-1.0.1 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/contracts/playbook-interface.yaml
RENAMED
|
File without changes
|
{remo_cli-1.0.1 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/contracts/role-interface.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{remo_cli-1.0.1 → remo_cli-1.0.3}/specs/002-incus-container-support/checklists/requirements.md
RENAMED
|
File without changes
|
|
File without changes
|
{remo_cli-1.0.1 → remo_cli-1.0.3}/specs/002-incus-container-support/contracts/role-interface.yaml
RENAMED
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|