remo-cli 1.0.2__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.
Files changed (207) hide show
  1. {remo_cli-1.0.2 → remo_cli-1.0.3}/PKG-INFO +1 -1
  2. {remo_cli-1.0.2 → remo_cli-1.0.3}/pyproject.toml +1 -1
  3. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/cli/main.py +18 -1
  4. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/unit/cli/test_main.py +39 -0
  5. {remo_cli-1.0.2 → remo_cli-1.0.3}/uv.lock +1 -1
  6. {remo_cli-1.0.2 → remo_cli-1.0.3}/.claude/commands/speckit.analyze.md +0 -0
  7. {remo_cli-1.0.2 → remo_cli-1.0.3}/.claude/commands/speckit.checklist.md +0 -0
  8. {remo_cli-1.0.2 → remo_cli-1.0.3}/.claude/commands/speckit.clarify.md +0 -0
  9. {remo_cli-1.0.2 → remo_cli-1.0.3}/.claude/commands/speckit.constitution.md +0 -0
  10. {remo_cli-1.0.2 → remo_cli-1.0.3}/.claude/commands/speckit.implement.md +0 -0
  11. {remo_cli-1.0.2 → remo_cli-1.0.3}/.claude/commands/speckit.plan.md +0 -0
  12. {remo_cli-1.0.2 → remo_cli-1.0.3}/.claude/commands/speckit.specify.md +0 -0
  13. {remo_cli-1.0.2 → remo_cli-1.0.3}/.claude/commands/speckit.tasks.md +0 -0
  14. {remo_cli-1.0.2 → remo_cli-1.0.3}/.claude/commands/speckit.taskstoissues.md +0 -0
  15. {remo_cli-1.0.2 → remo_cli-1.0.3}/.devcontainer/devcontainer.json +0 -0
  16. {remo_cli-1.0.2 → remo_cli-1.0.3}/.dockerignore +0 -0
  17. {remo_cli-1.0.2 → remo_cli-1.0.3}/.github/dependabot.yml +0 -0
  18. {remo_cli-1.0.2 → remo_cli-1.0.3}/.github/workflows/ci.yml +0 -0
  19. {remo_cli-1.0.2 → remo_cli-1.0.3}/.github/workflows/provision.yml +0 -0
  20. {remo_cli-1.0.2 → remo_cli-1.0.3}/.github/workflows/release.yml +0 -0
  21. {remo_cli-1.0.2 → remo_cli-1.0.3}/.github/workflows/smoke-test-cleanup.yml +0 -0
  22. {remo_cli-1.0.2 → remo_cli-1.0.3}/.github/workflows/smoke-test.yml +0 -0
  23. {remo_cli-1.0.2 → remo_cli-1.0.3}/.github/workflows/teardown.yml +0 -0
  24. {remo_cli-1.0.2 → remo_cli-1.0.3}/.gitignore +0 -0
  25. {remo_cli-1.0.2 → remo_cli-1.0.3}/.maverick/checkpoints/feature/implementation_complete.json +0 -0
  26. {remo_cli-1.0.2 → remo_cli-1.0.3}/.maverick/checkpoints/feature/phase_${{ index }}_complete.json +0 -0
  27. {remo_cli-1.0.2 → remo_cli-1.0.3}/.maverick/checkpoints/feature/validation_complete.json +0 -0
  28. {remo_cli-1.0.2 → remo_cli-1.0.3}/.specify/memory/constitution.md +0 -0
  29. {remo_cli-1.0.2 → remo_cli-1.0.3}/.specify/scripts/bash/check-prerequisites.sh +0 -0
  30. {remo_cli-1.0.2 → remo_cli-1.0.3}/.specify/scripts/bash/common.sh +0 -0
  31. {remo_cli-1.0.2 → remo_cli-1.0.3}/.specify/scripts/bash/create-new-feature.sh +0 -0
  32. {remo_cli-1.0.2 → remo_cli-1.0.3}/.specify/scripts/bash/setup-plan.sh +0 -0
  33. {remo_cli-1.0.2 → remo_cli-1.0.3}/.specify/scripts/bash/update-agent-context.sh +0 -0
  34. {remo_cli-1.0.2 → remo_cli-1.0.3}/.specify/templates/agent-file-template.md +0 -0
  35. {remo_cli-1.0.2 → remo_cli-1.0.3}/.specify/templates/checklist-template.md +0 -0
  36. {remo_cli-1.0.2 → remo_cli-1.0.3}/.specify/templates/plan-template.md +0 -0
  37. {remo_cli-1.0.2 → remo_cli-1.0.3}/.specify/templates/spec-template.md +0 -0
  38. {remo_cli-1.0.2 → remo_cli-1.0.3}/.specify/templates/tasks-template.md +0 -0
  39. {remo_cli-1.0.2 → remo_cli-1.0.3}/CLAUDE.md +0 -0
  40. {remo_cli-1.0.2 → remo_cli-1.0.3}/CONTRIBUTING.md +0 -0
  41. {remo_cli-1.0.2 → remo_cli-1.0.3}/Dockerfile +0 -0
  42. {remo_cli-1.0.2 → remo_cli-1.0.3}/LICENSE +0 -0
  43. {remo_cli-1.0.2 → remo_cli-1.0.3}/README.md +0 -0
  44. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/.ansible-lint +0 -0
  45. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/README.md +0 -0
  46. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/ansible.cfg +0 -0
  47. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/aws_configure.yml +0 -0
  48. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/aws_resize.yml +0 -0
  49. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/aws_site.yml +0 -0
  50. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/aws_teardown.yml +0 -0
  51. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/group_vars/all.yml +0 -0
  52. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/group_vars/incus_containers.yml +0 -0
  53. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/group_vars/proxmox_containers.yml +0 -0
  54. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/hetzner_configure.yml +0 -0
  55. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/hetzner_provision.yml +0 -0
  56. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/hetzner_resize.yml +0 -0
  57. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/hetzner_site.yml +0 -0
  58. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/hetzner_teardown.yml +0 -0
  59. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/incus_bootstrap.yml +0 -0
  60. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/incus_configure.yml +0 -0
  61. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/incus_provision.yml +0 -0
  62. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/incus_resize.yml +0 -0
  63. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/incus_site.yml +0 -0
  64. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/incus_teardown.yml +0 -0
  65. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/inventory/hosts.yml +0 -0
  66. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/inventory/incus_containers.yml +0 -0
  67. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/proxmox_bootstrap.yml +0 -0
  68. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/proxmox_configure.yml +0 -0
  69. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/proxmox_provision.yml +0 -0
  70. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/proxmox_resize.yml +0 -0
  71. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/proxmox_site.yml +0 -0
  72. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/proxmox_teardown.yml +0 -0
  73. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/requirements.yml +0 -0
  74. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/aws_server/defaults/main.yml +0 -0
  75. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/aws_server/tasks/ebs.yml +0 -0
  76. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/aws_server/tasks/ec2.yml +0 -0
  77. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/aws_server/tasks/main.yml +0 -0
  78. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/aws_server/tasks/patch_manager.yml +0 -0
  79. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/aws_server/tasks/preflight.yml +0 -0
  80. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/aws_server/tasks/security_group.yml +0 -0
  81. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/devcontainers/tasks/main.yml +0 -0
  82. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/docker/handlers/main.yml +0 -0
  83. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/docker/tasks/main.yml +0 -0
  84. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/fzf/tasks/main.yml +0 -0
  85. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/github_cli/tasks/main.yml +0 -0
  86. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/hetzner_server/defaults/main.yml +0 -0
  87. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/hetzner_server/tasks/main.yml +0 -0
  88. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/incus_bootstrap/defaults/main.yml +0 -0
  89. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/incus_bootstrap/handlers/main.yml +0 -0
  90. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/incus_bootstrap/tasks/main.yml +0 -0
  91. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/incus_container/defaults/main.yml +0 -0
  92. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/incus_container/handlers/main.yml +0 -0
  93. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/incus_container/meta/main.yml +0 -0
  94. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/incus_container/tasks/main.yml +0 -0
  95. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/incus_container/tasks/preflight.yml +0 -0
  96. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/incus_container_teardown/defaults/main.yml +0 -0
  97. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/incus_container_teardown/meta/main.yml +0 -0
  98. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/incus_container_teardown/tasks/main.yml +0 -0
  99. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/nodejs/defaults/main.yml +0 -0
  100. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/nodejs/tasks/main.yml +0 -0
  101. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/proxmox_bootstrap/defaults/main.yml +0 -0
  102. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/proxmox_bootstrap/meta/main.yml +0 -0
  103. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/proxmox_bootstrap/tasks/main.yml +0 -0
  104. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/proxmox_container/defaults/main.yml +0 -0
  105. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/proxmox_container/handlers/main.yml +0 -0
  106. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/proxmox_container/meta/main.yml +0 -0
  107. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/proxmox_container/tasks/main.yml +0 -0
  108. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/proxmox_container/tasks/preflight.yml +0 -0
  109. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/proxmox_container_teardown/defaults/main.yml +0 -0
  110. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/proxmox_container_teardown/meta/main.yml +0 -0
  111. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/proxmox_container_teardown/tasks/main.yml +0 -0
  112. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/user_setup/defaults/main.yml +0 -0
  113. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/user_setup/tasks/main.yml +0 -0
  114. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/user_setup/templates/devshell.sh.j2 +0 -0
  115. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/user_setup/templates/project-menu.sh.j2 +0 -0
  116. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/zellij/defaults/main.yml +0 -0
  117. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/zellij/tasks/main.yml +0 -0
  118. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/zellij/templates/config.kdl.j2 +0 -0
  119. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/roles/zellij/templates/layouts/minimal.kdl.j2 +0 -0
  120. {remo_cli-1.0.2 → remo_cli-1.0.3}/ansible/tasks/configure_dev_tools.yml +0 -0
  121. {remo_cli-1.0.2 → remo_cli-1.0.3}/docs/aws.md +0 -0
  122. {remo_cli-1.0.2 → remo_cli-1.0.3}/docs/hetzner.md +0 -0
  123. {remo_cli-1.0.2 → remo_cli-1.0.3}/docs/incus.md +0 -0
  124. {remo_cli-1.0.2 → remo_cli-1.0.3}/docs/install.sh +0 -0
  125. {remo_cli-1.0.2 → remo_cli-1.0.3}/docs/proxmox.md +0 -0
  126. {remo_cli-1.0.2 → remo_cli-1.0.3}/install.sh +0 -0
  127. {remo_cli-1.0.2 → remo_cli-1.0.3}/maverick.yaml +0 -0
  128. {remo_cli-1.0.2 → remo_cli-1.0.3}/project-menu.sh +0 -0
  129. {remo_cli-1.0.2 → remo_cli-1.0.3}/remo +0 -0
  130. {remo_cli-1.0.2 → remo_cli-1.0.3}/run.sh +0 -0
  131. {remo_cli-1.0.2 → remo_cli-1.0.3}/scripts/setup-aws-oidc.sh +0 -0
  132. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/checklists/requirements.md +0 -0
  133. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/checklists/validation.md +0 -0
  134. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/contracts/playbook-interface.yaml +0 -0
  135. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/contracts/role-interface.yaml +0 -0
  136. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/data-model.md +0 -0
  137. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/plan.md +0 -0
  138. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/quickstart.md +0 -0
  139. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/research.md +0 -0
  140. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/spec.md +0 -0
  141. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/001-bootstrap-incus-host/tasks.md +0 -0
  142. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/002-incus-container-support/checklists/requirements.md +0 -0
  143. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/002-incus-container-support/contracts/playbook-interface.yaml +0 -0
  144. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/002-incus-container-support/contracts/role-interface.yaml +0 -0
  145. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/002-incus-container-support/data-model.md +0 -0
  146. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/002-incus-container-support/plan.md +0 -0
  147. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/002-incus-container-support/quickstart.md +0 -0
  148. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/002-incus-container-support/research.md +0 -0
  149. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/002-incus-container-support/spec.md +0 -0
  150. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/002-incus-container-support/tasks.md +0 -0
  151. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/003-python-cli-rewrite/checklists/requirements.md +0 -0
  152. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/003-python-cli-rewrite/data-model.md +0 -0
  153. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/003-python-cli-rewrite/plan.md +0 -0
  154. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/003-python-cli-rewrite/quickstart.md +0 -0
  155. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/003-python-cli-rewrite/research.md +0 -0
  156. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/003-python-cli-rewrite/spec.md +0 -0
  157. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/003-python-cli-rewrite/tasks.md +0 -0
  158. {remo_cli-1.0.2 → remo_cli-1.0.3}/specs/004-proxmox-container-support/spec.md +0 -0
  159. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/__init__.py +0 -0
  160. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/__main__.py +0 -0
  161. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/cli/__init__.py +0 -0
  162. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/cli/cp.py +0 -0
  163. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/cli/providers/__init__.py +0 -0
  164. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/cli/providers/aws.py +0 -0
  165. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/cli/providers/hetzner.py +0 -0
  166. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/cli/providers/incus.py +0 -0
  167. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/cli/providers/proxmox.py +0 -0
  168. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/cli/shell.py +0 -0
  169. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/core/__init__.py +0 -0
  170. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/core/ansible_runner.py +0 -0
  171. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/core/completion.py +0 -0
  172. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/core/config.py +0 -0
  173. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/core/known_hosts.py +0 -0
  174. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/core/output.py +0 -0
  175. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/core/picker.py +0 -0
  176. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/core/rsync.py +0 -0
  177. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/core/ssh.py +0 -0
  178. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/core/validation.py +0 -0
  179. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/core/version.py +0 -0
  180. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/models/__init__.py +0 -0
  181. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/models/host.py +0 -0
  182. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/providers/__init__.py +0 -0
  183. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/providers/aws.py +0 -0
  184. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/providers/hetzner.py +0 -0
  185. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/providers/incus.py +0 -0
  186. {remo_cli-1.0.2 → remo_cli-1.0.3}/src/remo_cli/providers/proxmox.py +0 -0
  187. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/__init__.py +0 -0
  188. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/conftest.py +0 -0
  189. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/integration/__init__.py +0 -0
  190. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/integration/orbstack-cloud-init.yml +0 -0
  191. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/integration/orbstack.sh +0 -0
  192. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/unit/__init__.py +0 -0
  193. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/unit/cli/__init__.py +0 -0
  194. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/unit/cli/test_cp.py +0 -0
  195. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/unit/cli/test_shell.py +0 -0
  196. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/unit/core/__init__.py +0 -0
  197. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/unit/core/test_ansible_runner.py +0 -0
  198. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/unit/core/test_config.py +0 -0
  199. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/unit/core/test_known_hosts.py +0 -0
  200. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/unit/core/test_output.py +0 -0
  201. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/unit/core/test_picker.py +0 -0
  202. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/unit/core/test_rsync.py +0 -0
  203. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/unit/core/test_ssh.py +0 -0
  204. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/unit/core/test_validation.py +0 -0
  205. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/unit/core/test_version.py +0 -0
  206. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/unit/providers/__init__.py +0 -0
  207. {remo_cli-1.0.2 → remo_cli-1.0.3}/tests/unit/test_host_model.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: remo-cli
3
- Version: 1.0.2
3
+ Version: 1.0.3
4
4
  Summary: Remote development environment CLI
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "remo-cli"
7
- version = "1.0.2"
7
+ version = "1.0.3"
8
8
  description = "Remote development environment CLI"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -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
- click.echo(instance.source())
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:
@@ -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
@@ -771,7 +771,7 @@ wheels = [
771
771
 
772
772
  [[package]]
773
773
  name = "remo-cli"
774
- version = "1.0.2"
774
+ version = "1.0.3"
775
775
  source = { editable = "." }
776
776
  dependencies = [
777
777
  { name = "ansible-core" },
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